@hotmeshio/long-tail 0.2.6 → 0.2.7

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 (279) hide show
  1. package/dashboard/dist/assets/AdminDashboard-45Ya2uzl.js +2 -0
  2. package/dashboard/dist/assets/{AdminDashboard-DThDjhN5.js.map → AdminDashboard-45Ya2uzl.js.map} +1 -1
  3. package/dashboard/dist/assets/AgentConfigPage-BOASC5vi.js +13 -0
  4. package/dashboard/dist/assets/AgentConfigPage-BOASC5vi.js.map +1 -0
  5. package/dashboard/dist/assets/AgentDetailPage-5M7JTcFz.js +4 -0
  6. package/dashboard/dist/assets/AgentDetailPage-5M7JTcFz.js.map +1 -0
  7. package/dashboard/dist/assets/AgentsPage--I4d5y9J.js +2 -0
  8. package/dashboard/dist/assets/{AgentsPage-pKfjHe4u.js.map → AgentsPage--I4d5y9J.js.map} +1 -1
  9. package/dashboard/dist/assets/AvailableEscalationsPage-CXUkRz18.js +2 -0
  10. package/dashboard/dist/assets/AvailableEscalationsPage-CXUkRz18.js.map +1 -0
  11. package/dashboard/dist/assets/BotPicker-DgbzCesR.js +2 -0
  12. package/dashboard/dist/assets/{BotPicker-Zxf7Npew.js.map → BotPicker-DgbzCesR.js.map} +1 -1
  13. package/dashboard/dist/assets/CapabilitiesPage-B2S8_Gsc.js +2 -0
  14. package/dashboard/dist/assets/{CapabilitiesPage-6zOJ12cB.js.map → CapabilitiesPage-B2S8_Gsc.js.map} +1 -1
  15. package/dashboard/dist/assets/CollapsibleSection-4Eo3b5ha.js +2 -0
  16. package/dashboard/dist/assets/{CollapsibleSection-DvBx4tmw.js.map → CollapsibleSection-4Eo3b5ha.js.map} +1 -1
  17. package/dashboard/dist/assets/ConfirmDeleteModal-Bac7RmDD.js +2 -0
  18. package/dashboard/dist/assets/{ConfirmDeleteModal-dOxidrSR.js.map → ConfirmDeleteModal-Bac7RmDD.js.map} +1 -1
  19. package/dashboard/dist/assets/CopyableId-BhwdwAJN.js +2 -0
  20. package/dashboard/dist/assets/{CopyableId-DmLF-RqZ.js.map → CopyableId-BhwdwAJN.js.map} +1 -1
  21. package/dashboard/dist/assets/CredentialsPage-CSEBaYx1.js +2 -0
  22. package/dashboard/dist/assets/{CredentialsPage-C5f-Bg-o.js.map → CredentialsPage-CSEBaYx1.js.map} +1 -1
  23. package/dashboard/dist/assets/CronLabel-DV2v2FlP.js +2 -0
  24. package/dashboard/dist/assets/{CronLabel-CAVTt5AG.js.map → CronLabel-DV2v2FlP.js.map} +1 -1
  25. package/dashboard/dist/assets/CustomDurationPicker-B_Oxq_nK.js +2 -0
  26. package/dashboard/dist/assets/{CustomDurationPicker-Bk7D38y7.js.map → CustomDurationPicker-B_Oxq_nK.js.map} +1 -1
  27. package/dashboard/dist/assets/DataTable-etck0Zmp.js +2 -0
  28. package/dashboard/dist/assets/{DataTable-D9yuBv0w.js.map → DataTable-etck0Zmp.js.map} +1 -1
  29. package/dashboard/dist/assets/DropZone-BDpzHWsI.js +2 -0
  30. package/dashboard/dist/assets/{DropZone-2mGyDo1P.js.map → DropZone-BDpzHWsI.js.map} +1 -1
  31. package/dashboard/dist/assets/ElapsedCell-D35Z-HSJ.js +2 -0
  32. package/dashboard/dist/assets/{ElapsedCell-BpJjG1s-.js.map → ElapsedCell-D35Z-HSJ.js.map} +1 -1
  33. package/dashboard/dist/assets/EmptyState-Bk3_P-b8.js +2 -0
  34. package/dashboard/dist/assets/{EmptyState-BcsfPq9T.js.map → EmptyState-Bk3_P-b8.js.map} +1 -1
  35. package/dashboard/dist/assets/EscalationsOverview-Bt6gGFW4.js +2 -0
  36. package/dashboard/dist/assets/{EscalationsOverview-DPNd1vjF.js.map → EscalationsOverview-Bt6gGFW4.js.map} +1 -1
  37. package/dashboard/dist/assets/EventTable-BMk93q8A.js +2 -0
  38. package/dashboard/dist/assets/{EventTable-BoP8KC3M.js.map → EventTable-BMk93q8A.js.map} +1 -1
  39. package/dashboard/dist/assets/EventTopicPill-9LcMnLF0.js +2 -0
  40. package/dashboard/dist/assets/{EventTopicPill-BUxxvpNg.js.map → EventTopicPill-9LcMnLF0.js.map} +1 -1
  41. package/dashboard/dist/assets/FilterBar-CZGTOMoo.js +2 -0
  42. package/dashboard/dist/assets/{FilterBar-Ck4K4rzu.js.map → FilterBar-CZGTOMoo.js.map} +1 -1
  43. package/dashboard/dist/assets/HomePage-Dtk7mgmf.js +2 -0
  44. package/dashboard/dist/assets/{HomePage-h8I5ZolJ.js.map → HomePage-Dtk7mgmf.js.map} +1 -1
  45. package/dashboard/dist/assets/ListToolbar-CJEzypCM.js +2 -0
  46. package/dashboard/dist/assets/{ListToolbar-BaYIIsAt.js.map → ListToolbar-CJEzypCM.js.map} +1 -1
  47. package/dashboard/dist/assets/McpOverview-ChUa4l3t.js +2 -0
  48. package/dashboard/dist/assets/{McpOverview-BhZ3lSO6.js.map → McpOverview-ChUa4l3t.js.map} +1 -1
  49. package/dashboard/dist/assets/McpQueryDetailPage-04CTIN0v.js +5 -0
  50. package/dashboard/dist/assets/{McpQueryDetailPage-DVgcKa61.js.map → McpQueryDetailPage-04CTIN0v.js.map} +1 -1
  51. package/dashboard/dist/assets/McpQueryPage-DFnHFdbr.js +2 -0
  52. package/dashboard/dist/assets/{McpQueryPage-CTWOBqKT.js.map → McpQueryPage-DFnHFdbr.js.map} +1 -1
  53. package/dashboard/dist/assets/McpRunDetailPage-B95c3bFw.js +2 -0
  54. package/dashboard/dist/assets/{McpRunDetailPage-CIpZJWRB.js.map → McpRunDetailPage-B95c3bFw.js.map} +1 -1
  55. package/dashboard/dist/assets/McpRunsPage-DS43YmLU.js +2 -0
  56. package/dashboard/dist/assets/{McpRunsPage-B3zpzPBf.js.map → McpRunsPage-DS43YmLU.js.map} +1 -1
  57. package/dashboard/dist/assets/Modal-EUrK2c_A.js +2 -0
  58. package/dashboard/dist/assets/{Modal-DEODGeqx.js.map → Modal-EUrK2c_A.js.map} +1 -1
  59. package/dashboard/dist/assets/OperatorDashboard-DBF_AbRH.js +2 -0
  60. package/dashboard/dist/assets/{OperatorDashboard-l2hVlIF3.js.map → OperatorDashboard-DBF_AbRH.js.map} +1 -1
  61. package/dashboard/dist/assets/PageHeader-BuUnJ5NY.js +2 -0
  62. package/dashboard/dist/assets/{PageHeader-DLjHNYHX.js.map → PageHeader-BuUnJ5NY.js.map} +1 -1
  63. package/dashboard/dist/assets/PageHeaderWithStats-cQKaJBAM.js +2 -0
  64. package/dashboard/dist/assets/{PageHeaderWithStats-Oljg3n4j.js.map → PageHeaderWithStats-cQKaJBAM.js.map} +1 -1
  65. package/dashboard/dist/assets/PriorityBadge-Bl0_pgex.js +2 -0
  66. package/dashboard/dist/assets/{PriorityBadge-DfQY9St9.js.map → PriorityBadge-Bl0_pgex.js.map} +1 -1
  67. package/dashboard/dist/assets/ProcessDetailPage-DgeXrHon.js +2 -0
  68. package/dashboard/dist/assets/{ProcessDetailPage-BJ1rhK9_.js.map → ProcessDetailPage-DgeXrHon.js.map} +1 -1
  69. package/dashboard/dist/assets/ProcessesListPage-BGiiH4dW.js +2 -0
  70. package/dashboard/dist/assets/{ProcessesListPage-IQKk_qkn.js.map → ProcessesListPage-BGiiH4dW.js.map} +1 -1
  71. package/dashboard/dist/assets/RolePill-DsYF2JN9.js +2 -0
  72. package/dashboard/dist/assets/{RolePill-Bp10-WfX.js.map → RolePill-DsYF2JN9.js.map} +1 -1
  73. package/dashboard/dist/assets/RolesPage-CQ7vPamb.js +2 -0
  74. package/dashboard/dist/assets/{RolesPage-Dwcirtze.js.map → RolesPage-CQ7vPamb.js.map} +1 -1
  75. package/dashboard/dist/assets/RowActions-DBpvm3Jy.js +2 -0
  76. package/dashboard/dist/assets/{RowActions-Dg-Fsm5O.js.map → RowActions-DBpvm3Jy.js.map} +1 -1
  77. package/dashboard/dist/assets/RunAsSelector-ZLKGTYP_.js +2 -0
  78. package/dashboard/dist/assets/{RunAsSelector-D4Fu8LVG.js.map → RunAsSelector-ZLKGTYP_.js.map} +1 -1
  79. package/dashboard/dist/assets/ServerName-B5-E7gZD.js +2 -0
  80. package/dashboard/dist/assets/{ServerName-C9lUCFYb.js.map → ServerName-B5-E7gZD.js.map} +1 -1
  81. package/dashboard/dist/assets/StatCard-B7ySTryP.js +2 -0
  82. package/dashboard/dist/assets/{StatCard-DlgF0CJC.js.map → StatCard-B7ySTryP.js.map} +1 -1
  83. package/dashboard/dist/assets/StatusBadge-DNXTk01O.js +2 -0
  84. package/dashboard/dist/assets/{StatusBadge-XQlNFwmH.js.map → StatusBadge-DNXTk01O.js.map} +1 -1
  85. package/dashboard/dist/assets/StepIndicator-ftNmaJsu.js +2 -0
  86. package/dashboard/dist/assets/{StepIndicator-CuUIGxKk.js.map → StepIndicator-ftNmaJsu.js.map} +1 -1
  87. package/dashboard/dist/assets/StickyPagination-CI5AyVVd.js +2 -0
  88. package/dashboard/dist/assets/{StickyPagination-F9FZsRy9.js.map → StickyPagination-CI5AyVVd.js.map} +1 -1
  89. package/dashboard/dist/assets/SwimlaneTimeline-BA4aFrHf.js +2 -0
  90. package/dashboard/dist/assets/{SwimlaneTimeline-DQqgvwmC.js.map → SwimlaneTimeline-BA4aFrHf.js.map} +1 -1
  91. package/dashboard/dist/assets/TagInput-DfbVwc27.js +2 -0
  92. package/dashboard/dist/assets/{TagInput-Dkljw_WI.js.map → TagInput-DfbVwc27.js.map} +1 -1
  93. package/dashboard/dist/assets/TaskDetailPage-A_kHjYRn.js +2 -0
  94. package/dashboard/dist/assets/TaskDetailPage-A_kHjYRn.js.map +1 -0
  95. package/dashboard/dist/assets/TaskQueuePill-Dtsa8CPO.js +2 -0
  96. package/dashboard/dist/assets/{TaskQueuePill-DPwm25Cc.js.map → TaskQueuePill-Dtsa8CPO.js.map} +1 -1
  97. package/dashboard/dist/assets/TasksListPage-Cw46VTuA.js +2 -0
  98. package/dashboard/dist/assets/{TasksListPage-CnJdTsoX.js.map → TasksListPage-Cw46VTuA.js.map} +1 -1
  99. package/dashboard/dist/assets/TimeAgo-Cx1kK1id.js +2 -0
  100. package/dashboard/dist/assets/{TimeAgo-C3A1r1Cv.js.map → TimeAgo-Cx1kK1id.js.map} +1 -1
  101. package/dashboard/dist/assets/TimestampCell-VDp4nVn6.js +2 -0
  102. package/dashboard/dist/assets/{TimestampCell-DPfLR6bZ.js.map → TimestampCell-VDp4nVn6.js.map} +1 -1
  103. package/dashboard/dist/assets/ToolPill-BNaTJhu8.js +2 -0
  104. package/dashboard/dist/assets/{ToolPill-D_DIWFJ5.js.map → ToolPill-BNaTJhu8.js.map} +1 -1
  105. package/dashboard/dist/assets/ToolTestPanel-BickLBjP.js +2 -0
  106. package/dashboard/dist/assets/{ToolTestPanel-CwZ9zkD-.js.map → ToolTestPanel-BickLBjP.js.map} +1 -1
  107. package/dashboard/dist/assets/UserName-DCdb6xnk.js +2 -0
  108. package/dashboard/dist/assets/{UserName-ClO0a6Ar.js.map → UserName-DCdb6xnk.js.map} +1 -1
  109. package/dashboard/dist/assets/WorkflowExecutionPage-BZfxY1iB.js +2 -0
  110. package/dashboard/dist/assets/{WorkflowExecutionPage-B-2aHAHK.js.map → WorkflowExecutionPage-BZfxY1iB.js.map} +1 -1
  111. package/dashboard/dist/assets/WorkflowPill-BzhfqGa-.js +2 -0
  112. package/dashboard/dist/assets/{WorkflowPill-BbgVTGgI.js.map → WorkflowPill-BzhfqGa-.js.map} +1 -1
  113. package/dashboard/dist/assets/WorkflowsDashboard-B7M8kPoH.js +2 -0
  114. package/dashboard/dist/assets/{WorkflowsDashboard-NtiQKl_i.js.map → WorkflowsDashboard-B7M8kPoH.js.map} +1 -1
  115. package/dashboard/dist/assets/WorkflowsOverview-1V8vQ-mo.js +2 -0
  116. package/dashboard/dist/assets/{WorkflowsOverview-BQip_pvL.js.map → WorkflowsOverview-1V8vQ-mo.js.map} +1 -1
  117. package/dashboard/dist/assets/YamlWorkflowsPage-BteCRoV5.js +2 -0
  118. package/dashboard/dist/assets/YamlWorkflowsPage-BteCRoV5.js.map +1 -0
  119. package/dashboard/dist/assets/{agents-5APoyRH8.js → agents-SXs4tMLb.js} +2 -2
  120. package/dashboard/dist/assets/{agents-5APoyRH8.js.map → agents-SXs4tMLb.js.map} +1 -1
  121. package/dashboard/dist/assets/{bots-BoDH-pS7.js → bots-Ci5aCzDK.js} +2 -2
  122. package/dashboard/dist/assets/{bots-BoDH-pS7.js.map → bots-Ci5aCzDK.js.map} +1 -1
  123. package/dashboard/dist/assets/{controlplane-D4NhQux3.js → controlplane-BiPTCZeL.js} +2 -2
  124. package/dashboard/dist/assets/{controlplane-D4NhQux3.js.map → controlplane-BiPTCZeL.js.map} +1 -1
  125. package/dashboard/dist/assets/escalation-D-zr9D9G.js +2 -0
  126. package/dashboard/dist/assets/{escalation-BD2wtAt2.js.map → escalation-D-zr9D9G.js.map} +1 -1
  127. package/dashboard/dist/assets/escalation-columns-Bpp7Sdbd.js +2 -0
  128. package/dashboard/dist/assets/{escalation-columns-DjHcNgjo.js.map → escalation-columns-Bpp7Sdbd.js.map} +1 -1
  129. package/dashboard/dist/assets/helpers-CQZkvg6D.js +2 -0
  130. package/dashboard/dist/assets/{helpers-D1ZPA4kI.js.map → helpers-CQZkvg6D.js.map} +1 -1
  131. package/dashboard/dist/assets/index-Bp5f2OWJ.js +2 -0
  132. package/dashboard/dist/assets/{index-D9qswqDQ.js.map → index-Bp5f2OWJ.js.map} +1 -1
  133. package/dashboard/dist/assets/index-C7FUIcaY.js +2 -0
  134. package/dashboard/dist/assets/{index-_5qNyf9o.js.map → index-C7FUIcaY.js.map} +1 -1
  135. package/dashboard/dist/assets/index-COiEQlp9.js +2 -0
  136. package/dashboard/dist/assets/{index-jp94-YlF.js.map → index-COiEQlp9.js.map} +1 -1
  137. package/dashboard/dist/assets/index-CSsOukxa.js +2 -0
  138. package/dashboard/dist/assets/{index-_dKxJhey.js.map → index-CSsOukxa.js.map} +1 -1
  139. package/dashboard/dist/assets/index-DOE7HCzb.js +6 -0
  140. package/dashboard/dist/assets/{index-B6vQeWwf.js.map → index-DOE7HCzb.js.map} +1 -1
  141. package/dashboard/dist/assets/index-DV0_tQW3.js +2 -0
  142. package/dashboard/dist/assets/{index-Zn5XforP.js.map → index-DV0_tQW3.js.map} +1 -1
  143. package/dashboard/dist/assets/index-Da8R5Fn_.js +281 -0
  144. package/dashboard/dist/assets/index-Da8R5Fn_.js.map +1 -0
  145. package/dashboard/dist/assets/index-DtbAmRkr.js +15 -0
  146. package/dashboard/dist/assets/{index-qdYsS9h2.js.map → index-DtbAmRkr.js.map} +1 -1
  147. package/dashboard/dist/assets/index-DzL5pT70.js +5 -0
  148. package/dashboard/dist/assets/index-DzL5pT70.js.map +1 -0
  149. package/dashboard/dist/assets/index-OTsFiHXP.js +2 -0
  150. package/dashboard/dist/assets/index-OTsFiHXP.js.map +1 -0
  151. package/dashboard/dist/assets/index-hfravTJF.js +2 -0
  152. package/dashboard/dist/assets/{index-BgJR7kwH.js.map → index-hfravTJF.js.map} +1 -1
  153. package/dashboard/dist/assets/index-q4T_i7zT.js +2 -0
  154. package/dashboard/dist/assets/{index-DC7f6rWu.js.map → index-q4T_i7zT.js.map} +1 -1
  155. package/dashboard/dist/assets/{knowledge-DsAU_TGL.js → knowledge-D8osen1O.js} +2 -2
  156. package/dashboard/dist/assets/{knowledge-DsAU_TGL.js.map → knowledge-D8osen1O.js.map} +1 -1
  157. package/dashboard/dist/assets/{mcp-CA3OeIyH.js → mcp-CUFhWTyT.js} +2 -2
  158. package/dashboard/dist/assets/{mcp-CA3OeIyH.js.map → mcp-CUFhWTyT.js.map} +1 -1
  159. package/dashboard/dist/assets/{mcp-query-BgmTDc7h.js → mcp-query-n1t4sNm7.js} +2 -2
  160. package/dashboard/dist/assets/{mcp-query-BgmTDc7h.js.map → mcp-query-n1t4sNm7.js.map} +1 -1
  161. package/dashboard/dist/assets/{mcp-runs-C-FK2SyD.js → mcp-runs-BkRnXbcq.js} +2 -2
  162. package/dashboard/dist/assets/{mcp-runs-C-FK2SyD.js.map → mcp-runs-BkRnXbcq.js.map} +1 -1
  163. package/dashboard/dist/assets/namespaces-CacF05ft.js +2 -0
  164. package/dashboard/dist/assets/{namespaces-B8KNk0Jb.js.map → namespaces-CacF05ft.js.map} +1 -1
  165. package/dashboard/dist/assets/{roles-BAPy1LU_.js → roles-CjLCgM_6.js} +2 -2
  166. package/dashboard/dist/assets/{roles-BAPy1LU_.js.map → roles-CjLCgM_6.js.map} +1 -1
  167. package/dashboard/dist/assets/{tasks-BHlTusW0.js → tasks-BLCzIHol.js} +2 -2
  168. package/dashboard/dist/assets/{tasks-BHlTusW0.js.map → tasks-BLCzIHol.js.map} +1 -1
  169. package/dashboard/dist/assets/{useEventHooks-DBMdj9vw.js → useEventHooks-AwwZnweF.js} +2 -2
  170. package/dashboard/dist/assets/{useEventHooks-DBMdj9vw.js.map → useEventHooks-AwwZnweF.js.map} +1 -1
  171. package/dashboard/dist/assets/{useExpandedRows-CkcEntB-.js → useExpandedRows-Cg9iq6Vy.js} +2 -2
  172. package/dashboard/dist/assets/{useExpandedRows-CkcEntB-.js.map → useExpandedRows-Cg9iq6Vy.js.map} +1 -1
  173. package/dashboard/dist/assets/{useFilterParams-DZCAaBC7.js → useFilterParams-CGRYFw_A.js} +2 -2
  174. package/dashboard/dist/assets/{useFilterParams-DZCAaBC7.js.map → useFilterParams-CGRYFw_A.js.map} +1 -1
  175. package/dashboard/dist/assets/{useYamlActivityEvents-BH_ynR_L.js → useYamlActivityEvents-9Zs0PXY6.js} +2 -2
  176. package/dashboard/dist/assets/{useYamlActivityEvents-BH_ynR_L.js.map → useYamlActivityEvents-9Zs0PXY6.js.map} +1 -1
  177. package/dashboard/dist/assets/{users-C9K2cMyb.js → users-BtLRzvZE.js} +2 -2
  178. package/dashboard/dist/assets/{users-C9K2cMyb.js.map → users-BtLRzvZE.js.map} +1 -1
  179. package/dashboard/dist/assets/{vendor-icons-E6836lXZ.js → vendor-icons-1qQ3NKfa.js} +2 -2
  180. package/dashboard/dist/assets/{vendor-icons-E6836lXZ.js.map → vendor-icons-1qQ3NKfa.js.map} +1 -1
  181. package/dashboard/dist/assets/vendor-query-DLp59M9_.js +35 -0
  182. package/dashboard/dist/assets/vendor-query-DLp59M9_.js.map +1 -0
  183. package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js +26 -0
  184. package/dashboard/dist/assets/vendor-react-Co3Y8ikm.js.map +1 -0
  185. package/dashboard/dist/assets/{workflows-B2rsLjoh.js → workflows-B9xdIsfM.js} +2 -2
  186. package/dashboard/dist/assets/{workflows-B2rsLjoh.js.map → workflows-B9xdIsfM.js.map} +1 -1
  187. package/dashboard/dist/assets/{yaml-workflows-BLiTvQM2.js → yaml-workflows-xOJxyEsQ.js} +2 -2
  188. package/dashboard/dist/assets/{yaml-workflows-BLiTvQM2.js.map → yaml-workflows-xOJxyEsQ.js.map} +1 -1
  189. package/dashboard/dist/index.html +4 -4
  190. package/package.json +2 -2
  191. package/dashboard/dist/assets/AdminDashboard-DThDjhN5.js +0 -2
  192. package/dashboard/dist/assets/AgentConfigPage-NgxblxBW.js +0 -13
  193. package/dashboard/dist/assets/AgentConfigPage-NgxblxBW.js.map +0 -1
  194. package/dashboard/dist/assets/AgentDetailPage-DMS46nYY.js +0 -4
  195. package/dashboard/dist/assets/AgentDetailPage-DMS46nYY.js.map +0 -1
  196. package/dashboard/dist/assets/AgentsPage-pKfjHe4u.js +0 -2
  197. package/dashboard/dist/assets/AvailableEscalationsPage-BFzHVnPh.js +0 -2
  198. package/dashboard/dist/assets/AvailableEscalationsPage-BFzHVnPh.js.map +0 -1
  199. package/dashboard/dist/assets/BotPicker-Zxf7Npew.js +0 -2
  200. package/dashboard/dist/assets/CapabilitiesPage-6zOJ12cB.js +0 -2
  201. package/dashboard/dist/assets/CollapsibleSection-DvBx4tmw.js +0 -2
  202. package/dashboard/dist/assets/ConfirmDeleteModal-dOxidrSR.js +0 -2
  203. package/dashboard/dist/assets/CopyableId-DmLF-RqZ.js +0 -2
  204. package/dashboard/dist/assets/CredentialsPage-C5f-Bg-o.js +0 -2
  205. package/dashboard/dist/assets/CronLabel-CAVTt5AG.js +0 -2
  206. package/dashboard/dist/assets/CustomDurationPicker-Bk7D38y7.js +0 -2
  207. package/dashboard/dist/assets/DataTable-D9yuBv0w.js +0 -2
  208. package/dashboard/dist/assets/DropZone-2mGyDo1P.js +0 -2
  209. package/dashboard/dist/assets/ElapsedCell-BpJjG1s-.js +0 -2
  210. package/dashboard/dist/assets/EmptyState-BcsfPq9T.js +0 -2
  211. package/dashboard/dist/assets/EscalationsOverview-DPNd1vjF.js +0 -2
  212. package/dashboard/dist/assets/EventTable-BoP8KC3M.js +0 -2
  213. package/dashboard/dist/assets/EventTopicPill-BUxxvpNg.js +0 -2
  214. package/dashboard/dist/assets/FilterBar-Ck4K4rzu.js +0 -2
  215. package/dashboard/dist/assets/HomePage-h8I5ZolJ.js +0 -2
  216. package/dashboard/dist/assets/ListToolbar-BaYIIsAt.js +0 -2
  217. package/dashboard/dist/assets/McpOverview-BhZ3lSO6.js +0 -2
  218. package/dashboard/dist/assets/McpQueryDetailPage-DVgcKa61.js +0 -5
  219. package/dashboard/dist/assets/McpQueryPage-CTWOBqKT.js +0 -2
  220. package/dashboard/dist/assets/McpRunDetailPage-CIpZJWRB.js +0 -2
  221. package/dashboard/dist/assets/McpRunsPage-B3zpzPBf.js +0 -2
  222. package/dashboard/dist/assets/Modal-DEODGeqx.js +0 -2
  223. package/dashboard/dist/assets/OperatorDashboard-l2hVlIF3.js +0 -2
  224. package/dashboard/dist/assets/PageHeader-DLjHNYHX.js +0 -2
  225. package/dashboard/dist/assets/PageHeaderWithStats-Oljg3n4j.js +0 -2
  226. package/dashboard/dist/assets/PriorityBadge-DfQY9St9.js +0 -2
  227. package/dashboard/dist/assets/ProcessDetailPage-BJ1rhK9_.js +0 -2
  228. package/dashboard/dist/assets/ProcessesListPage-IQKk_qkn.js +0 -2
  229. package/dashboard/dist/assets/RolePill-Bp10-WfX.js +0 -2
  230. package/dashboard/dist/assets/RolesPage-Dwcirtze.js +0 -2
  231. package/dashboard/dist/assets/RowActions-Dg-Fsm5O.js +0 -2
  232. package/dashboard/dist/assets/RunAsSelector-D4Fu8LVG.js +0 -2
  233. package/dashboard/dist/assets/ServerName-C9lUCFYb.js +0 -2
  234. package/dashboard/dist/assets/StatCard-DlgF0CJC.js +0 -2
  235. package/dashboard/dist/assets/StatusBadge-XQlNFwmH.js +0 -2
  236. package/dashboard/dist/assets/StepIndicator-CuUIGxKk.js +0 -2
  237. package/dashboard/dist/assets/StickyPagination-F9FZsRy9.js +0 -2
  238. package/dashboard/dist/assets/SwimlaneTimeline-DQqgvwmC.js +0 -2
  239. package/dashboard/dist/assets/TagInput-Dkljw_WI.js +0 -2
  240. package/dashboard/dist/assets/TaskDetailPage-AHBMSHAA.js +0 -2
  241. package/dashboard/dist/assets/TaskDetailPage-AHBMSHAA.js.map +0 -1
  242. package/dashboard/dist/assets/TaskQueuePill-DPwm25Cc.js +0 -2
  243. package/dashboard/dist/assets/TasksListPage-CnJdTsoX.js +0 -2
  244. package/dashboard/dist/assets/TimeAgo-C3A1r1Cv.js +0 -2
  245. package/dashboard/dist/assets/TimestampCell-DPfLR6bZ.js +0 -2
  246. package/dashboard/dist/assets/ToolPill-D_DIWFJ5.js +0 -2
  247. package/dashboard/dist/assets/ToolTestPanel-CwZ9zkD-.js +0 -2
  248. package/dashboard/dist/assets/UserName-ClO0a6Ar.js +0 -2
  249. package/dashboard/dist/assets/WorkflowExecutionPage-B-2aHAHK.js +0 -2
  250. package/dashboard/dist/assets/WorkflowPill-BbgVTGgI.js +0 -2
  251. package/dashboard/dist/assets/WorkflowsDashboard-NtiQKl_i.js +0 -2
  252. package/dashboard/dist/assets/WorkflowsOverview-BQip_pvL.js +0 -2
  253. package/dashboard/dist/assets/YamlWorkflowsPage-BWFCVQ8b.js +0 -2
  254. package/dashboard/dist/assets/YamlWorkflowsPage-BWFCVQ8b.js.map +0 -1
  255. package/dashboard/dist/assets/escalation-BD2wtAt2.js +0 -2
  256. package/dashboard/dist/assets/escalation-columns-DjHcNgjo.js +0 -2
  257. package/dashboard/dist/assets/helpers-D1ZPA4kI.js +0 -2
  258. package/dashboard/dist/assets/index-B-Z9TisY.js +0 -2
  259. package/dashboard/dist/assets/index-B-Z9TisY.js.map +0 -1
  260. package/dashboard/dist/assets/index-B6vQeWwf.js +0 -6
  261. package/dashboard/dist/assets/index-BD2vW8MG.js +0 -5
  262. package/dashboard/dist/assets/index-BD2vW8MG.js.map +0 -1
  263. package/dashboard/dist/assets/index-BgJR7kwH.js +0 -2
  264. package/dashboard/dist/assets/index-D9qswqDQ.js +0 -2
  265. package/dashboard/dist/assets/index-DC7f6rWu.js +0 -2
  266. package/dashboard/dist/assets/index-Zn5XforP.js +0 -2
  267. package/dashboard/dist/assets/index-_5qNyf9o.js +0 -2
  268. package/dashboard/dist/assets/index-_dKxJhey.js +0 -2
  269. package/dashboard/dist/assets/index-jp94-YlF.js +0 -2
  270. package/dashboard/dist/assets/index-oGYUhkFa.js +0 -63
  271. package/dashboard/dist/assets/index-oGYUhkFa.js.map +0 -1
  272. package/dashboard/dist/assets/index-qdYsS9h2.js +0 -15
  273. package/dashboard/dist/assets/namespaces-B8KNk0Jb.js +0 -2
  274. package/dashboard/dist/assets/settings-Da0QSQDH.js +0 -2
  275. package/dashboard/dist/assets/settings-Da0QSQDH.js.map +0 -1
  276. package/dashboard/dist/assets/vendor-query-B2UbickB.js +0 -18
  277. package/dashboard/dist/assets/vendor-query-B2UbickB.js.map +0 -1
  278. package/dashboard/dist/assets/vendor-react-CX88sFS5.js +0 -22
  279. package/dashboard/dist/assets/vendor-react-CX88sFS5.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"CredentialsPage-C5f-Bg-o.js","sources":["../../src/pages/settings/CredentialsPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { Unplug, Trash2, Plus, ChevronDown } from 'lucide-react';\nimport { useOAuthConnections, useDisconnectOAuth } from '../../api/oauth';\nimport { getToken } from '../../api/client';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { OAuthIcon } from '../../components/common/OAuthIcon';\nimport { TimeAgo } from '../../components/common/display/TimeAgo';\nimport { ConfirmDeleteModal } from '../../components/common/modal/ConfirmDeleteModal';\n\ninterface ConnectionToRevoke {\n provider: string;\n label: string;\n}\n\nconst PROVIDERS: Record<string, { name: string; helpText: string; placeholder: string; oauth?: boolean }> = {\n anthropic: {\n name: 'Anthropic',\n helpText: 'Run \"claude setup-token\" for an OAuth token, or use an API key from console.anthropic.com.',\n placeholder: 'sk-ant-oat01-... or sk-ant-api03-...',\n },\n openai: {\n name: 'OpenAI',\n helpText: 'Create an API key at platform.openai.com/api-keys.',\n placeholder: 'sk-...',\n },\n google: {\n name: 'Google',\n helpText: 'Connect your Google account for Gmail, Calendar, and Drive access.',\n placeholder: '',\n oauth: true,\n },\n};\n\nexport function CredentialsPage() {\n const { data, isLoading } = useOAuthConnections();\n const disconnect = useDisconnectOAuth();\n const [confirmRevoke, setConfirmRevoke] = useState<ConnectionToRevoke | null>(null);\n const [addOpen, setAddOpen] = useState(false);\n const [selectedProvider, setSelectedProvider] = useState('anthropic');\n\n const connections = data?.connections ?? [];\n\n const handleRevoke = () => {\n if (!confirmRevoke) return;\n disconnect.mutate(\n { provider: confirmRevoke.provider, label: confirmRevoke.label },\n { onSuccess: () => setConfirmRevoke(null) },\n );\n };\n\n const connectUrl = (provider: string) =>\n `/api/auth/oauth/connect/${provider}?token=${encodeURIComponent(getToken() || '')}&returnTo=/credentials`;\n\n return (\n <div>\n <PageHeader\n title=\"Credentials\"\n docsHash=\"#docs:dashboard.md:credentials\"\n actions={\n <button\n onClick={() => setAddOpen((o) => !o)}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n Add Credential\n </button>\n }\n />\n\n <p className=\"text-sm text-text-secondary mb-6\">\n Manage credentials used by tools when invoked on your behalf.\n Each credential is encrypted at rest and resolved automatically during tool execution.\n </p>\n\n {/* Add credential dropdown */}\n {addOpen && (\n <div className=\"mb-6 p-4 bg-surface-raised border border-surface-border rounded-md space-y-3\">\n <div className=\"flex items-center gap-3\">\n <label className=\"text-xs text-text-secondary font-medium\">Provider</label>\n <div className=\"relative\">\n <select\n value={selectedProvider}\n onChange={(e) => setSelectedProvider(e.target.value)}\n className=\"input text-xs pr-7 appearance-none\"\n >\n {Object.entries(PROVIDERS).map(([key, p]) => (\n <option key={key} value={key}>{p.name}</option>\n ))}\n </select>\n <ChevronDown className=\"absolute right-2 top-1/2 -translate-y-1/2 w-3 h-3 text-text-tertiary pointer-events-none\" />\n </div>\n </div>\n <p className=\"text-xs text-text-tertiary\">\n {PROVIDERS[selectedProvider]?.helpText}\n </p>\n <a\n href={connectUrl(selectedProvider)}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <OAuthIcon provider={selectedProvider} className=\"w-3.5 h-3.5\" />\n Connect {PROVIDERS[selectedProvider]?.name}\n </a>\n </div>\n )}\n\n {/* Credentials table */}\n {isLoading ? (\n <div className=\"animate-pulse space-y-3\">\n {[1, 2].map((i) => (\n <div key={i} className=\"h-16 bg-surface-sunken rounded\" />\n ))}\n </div>\n ) : connections.length === 0 ? (\n <div className=\"text-center py-16 text-text-tertiary\">\n <Unplug className=\"w-10 h-10 mx-auto mb-3 opacity-40\" />\n <p className=\"text-sm\">No credentials registered.</p>\n <p className=\"text-xs mt-1\">Add a credential to enable tool authentication.</p>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {connections.map((conn) => (\n <div\n key={`${conn.provider}-${conn.label}`}\n className=\"group/row flex items-center gap-4 px-4 py-3 bg-surface-raised border border-surface-border rounded-md\"\n >\n <OAuthIcon provider={conn.provider} className=\"w-6 h-6 shrink-0\" />\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-text-primary font-medium capitalize\">\n {conn.provider}\n </span>\n {conn.label !== 'default' && (\n <span className=\"text-[10px] px-1.5 py-0.5 bg-surface-sunken rounded text-text-tertiary\">\n {conn.label}\n </span>\n )}\n {conn.credential_type && (\n <span className=\"text-[10px] px-1.5 py-0.5 bg-accent-faint rounded text-accent\">\n {conn.credential_type}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-3 mt-0.5\">\n {conn.email && (\n <span className=\"text-xs text-text-tertiary\">{conn.email}</span>\n )}\n {conn.expires_at && (\n <span className=\"text-xs text-text-tertiary\">\n Expires <TimeAgo date={conn.expires_at} />\n </span>\n )}\n </div>\n </div>\n\n <button\n onClick={() => setConfirmRevoke({ provider: conn.provider, label: conn.label })}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-status-error\"\n title=\"Revoke credential\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n <ConfirmDeleteModal\n open={!!confirmRevoke}\n onClose={() => setConfirmRevoke(null)}\n onConfirm={handleRevoke}\n title=\"Revoke Credential\"\n description={\n <>\n Revoke the{' '}\n <span className=\"font-medium text-text-primary capitalize\">\n {confirmRevoke?.provider}\n </span>\n {confirmRevoke?.label !== 'default' && (\n <> ({confirmRevoke?.label})</>\n )}{' '}\n credential? Tools will no longer be able to use this credential.\n </>\n }\n isPending={disconnect.isPending}\n error={disconnect.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["PROVIDERS","CredentialsPage","data","isLoading","useOAuthConnections","disconnect","useDisconnectOAuth","confirmRevoke","setConfirmRevoke","useState","addOpen","setAddOpen","selectedProvider","setSelectedProvider","connections","handleRevoke","connectUrl","provider","getToken","jsx","PageHeader","jsxs","o","Plus","e","key","p","ChevronDown","_a","OAuthIcon","_b","i","Unplug","conn","TimeAgo","Trash2","ConfirmDeleteModal","Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"CredentialsPage-CSEBaYx1.js","sources":["../../src/pages/settings/CredentialsPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { Unplug, Trash2, Plus, ChevronDown } from 'lucide-react';\nimport { useOAuthConnections, useDisconnectOAuth } from '../../api/oauth';\nimport { getToken } from '../../api/client';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { OAuthIcon } from '../../components/common/OAuthIcon';\nimport { TimeAgo } from '../../components/common/display/TimeAgo';\nimport { ConfirmDeleteModal } from '../../components/common/modal/ConfirmDeleteModal';\n\ninterface ConnectionToRevoke {\n provider: string;\n label: string;\n}\n\nconst PROVIDERS: Record<string, { name: string; helpText: string; placeholder: string; oauth?: boolean }> = {\n anthropic: {\n name: 'Anthropic',\n helpText: 'Run \"claude setup-token\" for an OAuth token, or use an API key from console.anthropic.com.',\n placeholder: 'sk-ant-oat01-... or sk-ant-api03-...',\n },\n openai: {\n name: 'OpenAI',\n helpText: 'Create an API key at platform.openai.com/api-keys.',\n placeholder: 'sk-...',\n },\n google: {\n name: 'Google',\n helpText: 'Connect your Google account for Gmail, Calendar, and Drive access.',\n placeholder: '',\n oauth: true,\n },\n};\n\nexport function CredentialsPage() {\n const { data, isLoading } = useOAuthConnections();\n const disconnect = useDisconnectOAuth();\n const [confirmRevoke, setConfirmRevoke] = useState<ConnectionToRevoke | null>(null);\n const [addOpen, setAddOpen] = useState(false);\n const [selectedProvider, setSelectedProvider] = useState('anthropic');\n\n const connections = data?.connections ?? [];\n\n const handleRevoke = () => {\n if (!confirmRevoke) return;\n disconnect.mutate(\n { provider: confirmRevoke.provider, label: confirmRevoke.label },\n { onSuccess: () => setConfirmRevoke(null) },\n );\n };\n\n const connectUrl = (provider: string) =>\n `/api/auth/oauth/connect/${provider}?token=${encodeURIComponent(getToken() || '')}&returnTo=/credentials`;\n\n return (\n <div>\n <PageHeader\n title=\"Credentials\"\n docsHash=\"#docs:dashboard.md:credentials\"\n actions={\n <button\n onClick={() => setAddOpen((o) => !o)}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n Add Credential\n </button>\n }\n />\n\n <p className=\"text-sm text-text-secondary mb-6\">\n Manage credentials used by tools when invoked on your behalf.\n Each credential is encrypted at rest and resolved automatically during tool execution.\n </p>\n\n {/* Add credential dropdown */}\n {addOpen && (\n <div className=\"mb-6 p-4 bg-surface-raised border border-surface-border rounded-md space-y-3\">\n <div className=\"flex items-center gap-3\">\n <label className=\"text-xs text-text-secondary font-medium\">Provider</label>\n <div className=\"relative\">\n <select\n value={selectedProvider}\n onChange={(e) => setSelectedProvider(e.target.value)}\n className=\"input text-xs pr-7 appearance-none\"\n >\n {Object.entries(PROVIDERS).map(([key, p]) => (\n <option key={key} value={key}>{p.name}</option>\n ))}\n </select>\n <ChevronDown className=\"absolute right-2 top-1/2 -translate-y-1/2 w-3 h-3 text-text-tertiary pointer-events-none\" />\n </div>\n </div>\n <p className=\"text-xs text-text-tertiary\">\n {PROVIDERS[selectedProvider]?.helpText}\n </p>\n <a\n href={connectUrl(selectedProvider)}\n className=\"btn-primary text-xs inline-flex items-center gap-1.5\"\n >\n <OAuthIcon provider={selectedProvider} className=\"w-3.5 h-3.5\" />\n Connect {PROVIDERS[selectedProvider]?.name}\n </a>\n </div>\n )}\n\n {/* Credentials table */}\n {isLoading ? (\n <div className=\"animate-pulse space-y-3\">\n {[1, 2].map((i) => (\n <div key={i} className=\"h-16 bg-surface-sunken rounded\" />\n ))}\n </div>\n ) : connections.length === 0 ? (\n <div className=\"text-center py-16 text-text-tertiary\">\n <Unplug className=\"w-10 h-10 mx-auto mb-3 opacity-40\" />\n <p className=\"text-sm\">No credentials registered.</p>\n <p className=\"text-xs mt-1\">Add a credential to enable tool authentication.</p>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {connections.map((conn) => (\n <div\n key={`${conn.provider}-${conn.label}`}\n className=\"group/row flex items-center gap-4 px-4 py-3 bg-surface-raised border border-surface-border rounded-md\"\n >\n <OAuthIcon provider={conn.provider} className=\"w-6 h-6 shrink-0\" />\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-sm text-text-primary font-medium capitalize\">\n {conn.provider}\n </span>\n {conn.label !== 'default' && (\n <span className=\"text-[10px] px-1.5 py-0.5 bg-surface-sunken rounded text-text-tertiary\">\n {conn.label}\n </span>\n )}\n {conn.credential_type && (\n <span className=\"text-[10px] px-1.5 py-0.5 bg-accent-faint rounded text-accent\">\n {conn.credential_type}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-3 mt-0.5\">\n {conn.email && (\n <span className=\"text-xs text-text-tertiary\">{conn.email}</span>\n )}\n {conn.expires_at && (\n <span className=\"text-xs text-text-tertiary\">\n Expires <TimeAgo date={conn.expires_at} />\n </span>\n )}\n </div>\n </div>\n\n <button\n onClick={() => setConfirmRevoke({ provider: conn.provider, label: conn.label })}\n className=\"opacity-0 group-hover/row:opacity-100 transition-opacity text-text-tertiary hover:text-status-error\"\n title=\"Revoke credential\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n <ConfirmDeleteModal\n open={!!confirmRevoke}\n onClose={() => setConfirmRevoke(null)}\n onConfirm={handleRevoke}\n title=\"Revoke Credential\"\n description={\n <>\n Revoke the{' '}\n <span className=\"font-medium text-text-primary capitalize\">\n {confirmRevoke?.provider}\n </span>\n {confirmRevoke?.label !== 'default' && (\n <> ({confirmRevoke?.label})</>\n )}{' '}\n credential? Tools will no longer be able to use this credential.\n </>\n }\n isPending={disconnect.isPending}\n error={disconnect.error as Error | null}\n />\n </div>\n );\n}\n"],"names":["PROVIDERS","CredentialsPage","data","isLoading","useOAuthConnections","disconnect","useDisconnectOAuth","confirmRevoke","setConfirmRevoke","useState","addOpen","setAddOpen","selectedProvider","setSelectedProvider","connections","handleRevoke","connectUrl","provider","getToken","jsxDEV","PageHeader","o","Plus","e","key","p","ChevronDown","_a","OAuthIcon","_b","i","Unplug","conn","TimeAgo","Trash2","ConfirmDeleteModal","Fragment"],"mappings":"mYAcA,MAAMA,EAAsG,CAC1G,UAAW,CACT,KAAM,YACN,SAAU,6FACV,YAAa,sCAAA,EAEf,OAAQ,CACN,KAAM,SACN,SAAU,qDACV,YAAa,QAAA,EAEf,OAAQ,CACN,KAAM,SACN,SAAU,qEACV,YAAa,GACb,MAAO,EAAA,CAEX,EAEO,SAASC,GAAkB,SAChC,KAAM,CAAE,KAAAC,EAAM,UAAAC,CAAA,EAAcC,EAAA,EACtBC,EAAaC,EAAA,EACb,CAACC,EAAeC,CAAgB,EAAIC,EAAAA,SAAoC,IAAI,EAC5E,CAACC,EAASC,CAAU,EAAIF,EAAAA,SAAS,EAAK,EACtC,CAACG,EAAkBC,CAAmB,EAAIJ,EAAAA,SAAS,WAAW,EAE9DK,GAAcZ,GAAA,YAAAA,EAAM,cAAe,CAAA,EAEnCa,EAAe,IAAM,CACpBR,GACLF,EAAW,OACT,CAAE,SAAUE,EAAc,SAAU,MAAOA,EAAc,KAAA,EACzD,CAAE,UAAW,IAAMC,EAAiB,IAAI,CAAA,CAAE,CAE9C,EAEMQ,EAAcC,GAClB,2BAA2BA,CAAQ,UAAU,mBAAmBC,EAAA,GAAc,EAAE,CAAC,yBAEnF,gBACG,MAAA,CACC,SAAA,CAAAC,EAAAA,OAACC,EAAA,CACC,MAAM,cACN,SAAS,iCACT,QACED,EAAAA,OAAC,SAAA,CACC,QAAS,IAAMR,EAAYU,GAAM,CAACA,CAAC,EACnC,UAAU,uDAEV,SAAA,CAAAF,EAAAA,OAACG,EAAA,CAAK,UAAU,aAAA,EAAhB,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA8B,EAAE,gBAAA,CAAA,EAJlC,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAMA,EAVJ,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,EAcAH,SAAC,IAAA,CAAE,UAAU,mCAAmC,SAAA,sJAAA,EAAhD,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAGA,EAGCT,GACCS,EAAAA,OAAC,MAAA,CAAI,UAAU,+EACb,SAAA,CAAAA,EAAAA,OAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,SAAC,QAAA,CAAM,UAAU,0CAA0C,SAAA,UAAA,EAA3D,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAmE,EACnEA,EAAAA,OAAC,MAAA,CAAI,UAAU,WACb,SAAA,CAAAA,EAAAA,OAAC,SAAA,CACC,MAAOP,EACP,SAAWW,GAAMV,EAAoBU,EAAE,OAAO,KAAK,EACnD,UAAU,qCAET,gBAAO,QAAQvB,CAAS,EAAE,IAAI,CAAC,CAACwB,EAAKC,CAAC,aACpC,SAAA,CAAiB,MAAOD,EAAM,SAAAC,EAAE,MAApBD,EAAb,GAAA,CAAA,SAAA,wDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAsC,CACvC,CAAA,EAPH,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,EASAL,EAAAA,OAACO,EAAA,CAAY,UAAU,0FAAA,EAAvB,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAkH,CAAA,CAAA,EAVpH,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAWA,CAAA,CAAA,EAbF,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAcA,WACC,IAAA,CAAE,UAAU,6BACV,UAAAC,EAAA3B,EAAUY,CAAgB,IAA1B,YAAAe,EAA6B,UADhC,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,EACAR,EAAAA,OAAC,IAAA,CACC,KAAMH,EAAWJ,CAAgB,EACjC,UAAU,uDAEV,SAAA,CAAAO,SAACS,EAAA,CAAU,SAAUhB,EAAkB,UAAU,aAAA,EAAjD,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAA+D,EAAE,YACxDiB,EAAA7B,EAAUY,CAAgB,IAA1B,YAAAiB,EAA6B,IAAA,CAAA,EALxC,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAMA,CAAA,EAzBF,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IA0BA,EAID1B,EACCgB,EAAAA,OAAC,MAAA,CAAI,UAAU,0BACZ,UAAC,EAAG,CAAC,EAAE,IAAKW,GACXX,EAAAA,OAAC,MAAA,CAAY,UAAU,kCAAbW,EAAV,GAAA,CAAA,SAAA,wDAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAwD,CACzD,GAHH,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAIA,EACEhB,EAAY,SAAW,EACzBK,SAAC,MAAA,CAAI,UAAU,uCACb,SAAA,CAAAA,EAAAA,OAACY,EAAA,CAAO,UAAU,mCAAA,EAAlB,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAsD,EACtDZ,SAAC,IAAA,CAAE,UAAU,UAAU,SAAA,4BAAA,EAAvB,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAiD,EACjDA,SAAC,IAAA,CAAE,UAAU,eAAe,SAAA,iDAAA,EAA5B,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAA2E,CAAA,CAAA,EAH7E,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAIA,WAEC,MAAA,CAAI,UAAU,YACZ,SAAAL,EAAY,IAAKkB,GAChBb,EAAAA,OAAC,MAAA,CAEC,UAAU,wGAEV,SAAA,CAAAA,SAACS,EAAA,CAAU,SAAUI,EAAK,SAAU,UAAU,kBAAA,EAA9C,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAiE,EAEjEb,EAAAA,OAAC,MAAA,CAAI,UAAU,iBACb,SAAA,CAAAA,EAAAA,OAAC,MAAA,CAAI,UAAU,0BACb,SAAA,CAAAA,SAAC,OAAA,CAAK,UAAU,mDACb,SAAAa,EAAK,QAAA,EADR,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAEA,EACCA,EAAK,QAAU,WACdb,EAAAA,OAAC,QAAK,UAAU,yEACb,WAAK,KAAA,EADR,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAEA,EAEDa,EAAK,iBACJb,SAAC,QAAK,UAAU,gEACb,WAAK,iBADR,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAEA,CAAA,CAAA,EAZJ,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAcA,EACAA,EAAAA,OAAC,MAAA,CAAI,UAAU,iCACZ,SAAA,CAAAa,EAAK,OACJb,SAAC,OAAA,CAAK,UAAU,6BAA8B,WAAK,OAAnD,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAyD,EAE1Da,EAAK,YACJb,SAAC,OAAA,CAAK,UAAU,6BAA6B,SAAA,CAAA,WACnCA,EAAAA,OAACc,EAAA,CAAQ,KAAMD,EAAK,UAAA,EAApB,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAgC,CAAA,CAAA,EAD1C,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAEA,CAAA,CAAA,EAPJ,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IASA,CAAA,CAAA,EAzBF,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IA0BA,EAEAb,EAAAA,OAAC,SAAA,CACC,QAAS,IAAMX,EAAiB,CAAE,SAAUwB,EAAK,SAAU,MAAOA,EAAK,MAAO,EAC9E,UAAU,sGACV,MAAM,oBAEN,SAAAb,EAAAA,OAACe,EAAA,CAAO,UAAU,SAAA,EAAlB,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAA4B,CAAA,EAL9B,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAA,CAMA,CAAA,EAvCK,GAAGF,EAAK,QAAQ,IAAIA,EAAK,KAAK,GADrC,GAAA,CAAA,SAAA,wDAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAA,CA0CD,CAAA,EA5CH,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IA6CA,EAGFb,EAAAA,OAACgB,EAAA,CACC,KAAM,CAAC,CAAC5B,EACR,QAAS,IAAMC,EAAiB,IAAI,EACpC,UAAWO,EACX,MAAM,oBACN,YACEI,EAAAA,OAAAiB,WAAA,CAAE,SAAA,CAAA,aACW,IACXjB,SAAC,OAAA,CAAK,UAAU,2CACb,0BAAe,QAAA,EADlB,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAEA,GACCZ,GAAA,YAAAA,EAAe,SAAU,WACxBY,EAAAA,OAAAiB,EAAAA,SAAA,CAAE,SAAA,CAAA,KAAG7B,GAAA,YAAAA,EAAe,MAAM,GAAA,CAAA,EAA1B,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAA2B,EAC1B,IAAI,kEAAA,CAAA,EAPT,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IASA,EAEF,UAAWF,EAAW,UACtB,MAAOA,EAAW,KAAA,EAlBpB,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAAA,CAmBA,CAAA,EApIF,OAAA,GAAA,CAAA,SAAA,wDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAqIA,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{u as o,b as i,c as r}from"./vendor-query-DLp59M9_.js";import{b as n,j as a}from"./index-Da8R5Fn_.js";import{a1 as c}from"./vendor-icons-1qQ3NKfa.js";function b(e){return o({queryKey:["agent-subscriptions",e],queryFn:()=>n(`/agents/${e}/subscriptions`),enabled:!!e})}function y(){const e=i();return r({mutationFn:({agentId:t,...s})=>n(`/agents/${t}/subscriptions`,{method:"POST",body:JSON.stringify(s)}),onSuccess:(t,s)=>{e.invalidateQueries({queryKey:["agent-subscriptions",s.agentId]}),e.invalidateQueries({queryKey:["agents"]})}})}function d(){const e=i();return r({mutationFn:({agentId:t,subId:s,...u})=>n(`/agents/${t}/subscriptions/${s}`,{method:"PUT",body:JSON.stringify(u)}),onSuccess:(t,s)=>{e.invalidateQueries({queryKey:["agent-subscriptions",s.agentId]})}})}function f(){const e=i();return r({mutationFn:({agentId:t,subId:s})=>n(`/agents/${t}/subscriptions/${s}`,{method:"DELETE"}),onSuccess:(t,s)=>{e.invalidateQueries({queryKey:["agent-subscriptions",s.agentId]}),e.invalidateQueries({queryKey:["agents"]})}})}function g({cron:e}){return a.jsxDEV("span",{className:"inline-flex items-center gap-1 text-[11px] font-mono text-text-secondary",children:[a.jsxDEV(c,{className:"w-2.5 h-2.5 shrink-0 text-text-quaternary",strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/CronLabel.tsx",lineNumber:14,columnNumber:7},this),e]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/CronLabel.tsx",lineNumber:13,columnNumber:5},this)}export{g as C,y as a,d as b,f as c,b as u};
2
+ //# sourceMappingURL=CronLabel-DV2v2FlP.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CronLabel-CAVTt5AG.js","sources":["../../src/api/agent-subscriptions.ts","../../src/components/common/display/CronLabel.tsx"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\n\nexport interface AgentSubscription {\n id: string;\n agent_id: string;\n topic: string;\n filter?: Record<string, any>;\n reaction_type: 'durable' | 'pipeline' | 'mcp_query';\n workflow_type?: string;\n pipeline_id?: string;\n mcp_prompt?: string;\n input_mapping: Record<string, any>;\n execute_as?: string;\n enabled: boolean;\n created_at: string;\n updated_at: string;\n}\n\ninterface SubscriptionListResponse {\n subscriptions: AgentSubscription[];\n}\n\nexport function useAgentSubscriptions(agentId: string | null) {\n return useQuery<SubscriptionListResponse>({\n queryKey: ['agent-subscriptions', agentId],\n queryFn: () => apiFetch(`/agents/${agentId}/subscriptions`),\n enabled: !!agentId,\n });\n}\n\nexport function useCreateSubscription() {\n const queryClient = useQueryClient();\n return useMutation<AgentSubscription, Error, { agentId: string } & Partial<AgentSubscription>>({\n mutationFn: ({ agentId, ...body }) =>\n apiFetch(`/agents/${agentId}/subscriptions`, {\n method: 'POST',\n body: JSON.stringify(body),\n }),\n onSuccess: (_, vars) => {\n queryClient.invalidateQueries({ queryKey: ['agent-subscriptions', vars.agentId] });\n queryClient.invalidateQueries({ queryKey: ['agents'] });\n },\n });\n}\n\nexport function useUpdateSubscription() {\n const queryClient = useQueryClient();\n return useMutation<AgentSubscription, Error, { agentId: string; subId: string } & Partial<AgentSubscription>>({\n mutationFn: ({ agentId, subId, ...body }) =>\n apiFetch(`/agents/${agentId}/subscriptions/${subId}`, {\n method: 'PUT',\n body: JSON.stringify(body),\n }),\n onSuccess: (_, vars) => {\n queryClient.invalidateQueries({ queryKey: ['agent-subscriptions', vars.agentId] });\n },\n });\n}\n\nexport function useDeleteSubscription() {\n const queryClient = useQueryClient();\n return useMutation<{ deleted: boolean }, Error, { agentId: string; subId: string }>({\n mutationFn: ({ agentId, subId }) =>\n apiFetch(`/agents/${agentId}/subscriptions/${subId}`, { method: 'DELETE' }),\n onSuccess: (_, vars) => {\n queryClient.invalidateQueries({ queryKey: ['agent-subscriptions', vars.agentId] });\n queryClient.invalidateQueries({ queryKey: ['agents'] });\n },\n });\n}\n","import { Clock } from 'lucide-react';\n\ninterface CronLabelProps {\n cron: string;\n}\n\n/**\n * Universal cron expression display — Clock icon + monotype text.\n * Used everywhere a cron schedule is rendered.\n */\nexport function CronLabel({ cron }: CronLabelProps) {\n return (\n <span className=\"inline-flex items-center gap-1 text-[11px] font-mono text-text-secondary\">\n <Clock className=\"w-2.5 h-2.5 shrink-0 text-text-quaternary\" strokeWidth={1.5} />\n {cron}\n </span>\n );\n}\n"],"names":["useAgentSubscriptions","agentId","useQuery","apiFetch","useCreateSubscription","queryClient","useQueryClient","useMutation","body","_","vars","useUpdateSubscription","subId","useDeleteSubscription","CronLabel","cron","jsxs","jsx","Clock"],"mappings":"4JAuBO,SAASA,EAAsBC,EAAwB,CAC5D,OAAOC,EAAmC,CACxC,SAAU,CAAC,sBAAuBD,CAAO,EACzC,QAAS,IAAME,EAAS,WAAWF,CAAO,gBAAgB,EAC1D,QAAS,CAAC,CAACA,CAAA,CACZ,CACH,CAEO,SAASG,GAAwB,CACtC,MAAMC,EAAcC,EAAA,EACpB,OAAOC,EAAwF,CAC7F,WAAY,CAAC,CAAE,QAAAN,EAAS,GAAGO,KACzBL,EAAS,WAAWF,CAAO,iBAAkB,CAC3C,OAAQ,OACR,KAAM,KAAK,UAAUO,CAAI,CAAA,CAC1B,EACH,UAAW,CAACC,EAAGC,IAAS,CACtBL,EAAY,kBAAkB,CAAE,SAAU,CAAC,sBAAuBK,EAAK,OAAO,EAAG,EACjFL,EAAY,kBAAkB,CAAE,SAAU,CAAC,QAAQ,EAAG,CACxD,CAAA,CACD,CACH,CAEO,SAASM,GAAwB,CACtC,MAAMN,EAAcC,EAAA,EACpB,OAAOC,EAAuG,CAC5G,WAAY,CAAC,CAAE,QAAAN,EAAS,MAAAW,EAAO,GAAGJ,CAAA,IAChCL,EAAS,WAAWF,CAAO,kBAAkBW,CAAK,GAAI,CACpD,OAAQ,MACR,KAAM,KAAK,UAAUJ,CAAI,CAAA,CAC1B,EACH,UAAW,CAACC,EAAGC,IAAS,CACtBL,EAAY,kBAAkB,CAAE,SAAU,CAAC,sBAAuBK,EAAK,OAAO,EAAG,CACnF,CAAA,CACD,CACH,CAEO,SAASG,GAAwB,CACtC,MAAMR,EAAcC,EAAA,EACpB,OAAOC,EAA6E,CAClF,WAAY,CAAC,CAAE,QAAAN,EAAS,MAAAW,KACtBT,EAAS,WAAWF,CAAO,kBAAkBW,CAAK,GAAI,CAAE,OAAQ,SAAU,EAC5E,UAAW,CAACH,EAAGC,IAAS,CACtBL,EAAY,kBAAkB,CAAE,SAAU,CAAC,sBAAuBK,EAAK,OAAO,EAAG,EACjFL,EAAY,kBAAkB,CAAE,SAAU,CAAC,QAAQ,EAAG,CACxD,CAAA,CACD,CACH,CC5DO,SAASS,EAAU,CAAE,KAAAC,GAAwB,CAClD,OACEC,EAAAA,KAAC,OAAA,CAAK,UAAU,2EACd,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAM,UAAU,4CAA4C,YAAa,IAAK,EAC9EH,CAAA,EACH,CAEJ"}
1
+ {"version":3,"file":"CronLabel-DV2v2FlP.js","sources":["../../src/api/agent-subscriptions.ts","../../src/components/common/display/CronLabel.tsx"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from './client';\n\nexport interface AgentSubscription {\n id: string;\n agent_id: string;\n topic: string;\n filter?: Record<string, any>;\n reaction_type: 'durable' | 'pipeline' | 'mcp_query';\n workflow_type?: string;\n pipeline_id?: string;\n mcp_prompt?: string;\n input_mapping: Record<string, any>;\n execute_as?: string;\n enabled: boolean;\n created_at: string;\n updated_at: string;\n}\n\ninterface SubscriptionListResponse {\n subscriptions: AgentSubscription[];\n}\n\nexport function useAgentSubscriptions(agentId: string | null) {\n return useQuery<SubscriptionListResponse>({\n queryKey: ['agent-subscriptions', agentId],\n queryFn: () => apiFetch(`/agents/${agentId}/subscriptions`),\n enabled: !!agentId,\n });\n}\n\nexport function useCreateSubscription() {\n const queryClient = useQueryClient();\n return useMutation<AgentSubscription, Error, { agentId: string } & Partial<AgentSubscription>>({\n mutationFn: ({ agentId, ...body }) =>\n apiFetch(`/agents/${agentId}/subscriptions`, {\n method: 'POST',\n body: JSON.stringify(body),\n }),\n onSuccess: (_, vars) => {\n queryClient.invalidateQueries({ queryKey: ['agent-subscriptions', vars.agentId] });\n queryClient.invalidateQueries({ queryKey: ['agents'] });\n },\n });\n}\n\nexport function useUpdateSubscription() {\n const queryClient = useQueryClient();\n return useMutation<AgentSubscription, Error, { agentId: string; subId: string } & Partial<AgentSubscription>>({\n mutationFn: ({ agentId, subId, ...body }) =>\n apiFetch(`/agents/${agentId}/subscriptions/${subId}`, {\n method: 'PUT',\n body: JSON.stringify(body),\n }),\n onSuccess: (_, vars) => {\n queryClient.invalidateQueries({ queryKey: ['agent-subscriptions', vars.agentId] });\n },\n });\n}\n\nexport function useDeleteSubscription() {\n const queryClient = useQueryClient();\n return useMutation<{ deleted: boolean }, Error, { agentId: string; subId: string }>({\n mutationFn: ({ agentId, subId }) =>\n apiFetch(`/agents/${agentId}/subscriptions/${subId}`, { method: 'DELETE' }),\n onSuccess: (_, vars) => {\n queryClient.invalidateQueries({ queryKey: ['agent-subscriptions', vars.agentId] });\n queryClient.invalidateQueries({ queryKey: ['agents'] });\n },\n });\n}\n","import { Clock } from 'lucide-react';\n\ninterface CronLabelProps {\n cron: string;\n}\n\n/**\n * Universal cron expression display — Clock icon + monotype text.\n * Used everywhere a cron schedule is rendered.\n */\nexport function CronLabel({ cron }: CronLabelProps) {\n return (\n <span className=\"inline-flex items-center gap-1 text-[11px] font-mono text-text-secondary\">\n <Clock className=\"w-2.5 h-2.5 shrink-0 text-text-quaternary\" strokeWidth={1.5} />\n {cron}\n </span>\n );\n}\n"],"names":["useAgentSubscriptions","agentId","useQuery","apiFetch","useCreateSubscription","queryClient","useQueryClient","useMutation","body","_","vars","useUpdateSubscription","subId","useDeleteSubscription","CronLabel","cron","jsxDEV","Clock"],"mappings":"4JAuBO,SAASA,EAAsBC,EAAwB,CAC5D,OAAOC,EAAmC,CACxC,SAAU,CAAC,sBAAuBD,CAAO,EACzC,QAAS,IAAME,EAAS,WAAWF,CAAO,gBAAgB,EAC1D,QAAS,CAAC,CAACA,CAAA,CACZ,CACH,CAEO,SAASG,GAAwB,CACtC,MAAMC,EAAcC,EAAA,EACpB,OAAOC,EAAwF,CAC7F,WAAY,CAAC,CAAE,QAAAN,EAAS,GAAGO,KACzBL,EAAS,WAAWF,CAAO,iBAAkB,CAC3C,OAAQ,OACR,KAAM,KAAK,UAAUO,CAAI,CAAA,CAC1B,EACH,UAAW,CAACC,EAAGC,IAAS,CACtBL,EAAY,kBAAkB,CAAE,SAAU,CAAC,sBAAuBK,EAAK,OAAO,EAAG,EACjFL,EAAY,kBAAkB,CAAE,SAAU,CAAC,QAAQ,EAAG,CACxD,CAAA,CACD,CACH,CAEO,SAASM,GAAwB,CACtC,MAAMN,EAAcC,EAAA,EACpB,OAAOC,EAAuG,CAC5G,WAAY,CAAC,CAAE,QAAAN,EAAS,MAAAW,EAAO,GAAGJ,CAAA,IAChCL,EAAS,WAAWF,CAAO,kBAAkBW,CAAK,GAAI,CACpD,OAAQ,MACR,KAAM,KAAK,UAAUJ,CAAI,CAAA,CAC1B,EACH,UAAW,CAACC,EAAGC,IAAS,CACtBL,EAAY,kBAAkB,CAAE,SAAU,CAAC,sBAAuBK,EAAK,OAAO,EAAG,CACnF,CAAA,CACD,CACH,CAEO,SAASG,GAAwB,CACtC,MAAMR,EAAcC,EAAA,EACpB,OAAOC,EAA6E,CAClF,WAAY,CAAC,CAAE,QAAAN,EAAS,MAAAW,KACtBT,EAAS,WAAWF,CAAO,kBAAkBW,CAAK,GAAI,CAAE,OAAQ,SAAU,EAC5E,UAAW,CAACH,EAAGC,IAAS,CACtBL,EAAY,kBAAkB,CAAE,SAAU,CAAC,sBAAuBK,EAAK,OAAO,EAAG,EACjFL,EAAY,kBAAkB,CAAE,SAAU,CAAC,QAAQ,EAAG,CACxD,CAAA,CACD,CACH,CC5DO,SAASS,EAAU,CAAE,KAAAC,GAAwB,CAClD,OACEC,EAAAA,OAAC,OAAA,CAAK,UAAU,2EACd,SAAA,CAAAA,SAACC,EAAA,CAAM,UAAU,4CAA4C,YAAa,GAAA,EAA1E,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAA+E,EAC9EF,CAAA,CAAA,EAFH,OAAA,GAAA,CAAA,SAAA,6DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAGA,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{a as i}from"./vendor-query-DLp59M9_.js";import{u as d,j as n}from"./index-Da8R5Fn_.js";import{D as f,f as x}from"./constants-BHkpVaqx.js";function v(){const{data:e}=d();return i.useMemo(()=>{var o;return(((o=e==null?void 0:e.escalation)==null?void 0:o.claimDurations)??f).map(a=>({value:String(a),label:x(a)}))},[e])}const b=[{value:1,label:"minutes"},{value:60,label:"hours"}];function C({onChange:e,compact:r,autoFocus:o,"data-testid":a="custom-duration-input"}){const[u,l]=i.useState(""),[s,c]=i.useState(1);i.useEffect(()=>{const t=parseInt(u);e(t>0?t*s:0)},[u,s,e]);const m=r?"text-xs":"text-sm",p=r?"w-16":"w-20";return n.jsxDEV("div",{className:"flex items-center gap-2","data-testid":a,children:[n.jsxDEV("input",{type:"number",min:1,max:s===60?24:1440,value:u,onChange:t=>l(t.target.value),placeholder:s===60?"hrs":"min",className:`input ${m} ${p} text-center`,autoFocus:o,"data-testid":`${a}-quantity`},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/CustomDurationPicker.tsx",lineNumber:37,columnNumber:7},this),n.jsxDEV("select",{value:s,onChange:t=>c(parseInt(t.target.value)),className:`select ${m} py-1`,"data-testid":`${a}-unit`,children:b.map(t=>n.jsxDEV("option",{value:t.value,children:t.label},t.value,!1,{fileName:"/app/dashboard/src/components/common/form/CustomDurationPicker.tsx",lineNumber:55,columnNumber:11},this))},void 0,!1,{fileName:"/app/dashboard/src/components/common/form/CustomDurationPicker.tsx",lineNumber:48,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/form/CustomDurationPicker.tsx",lineNumber:36,columnNumber:5},this)}export{C,v as u};
2
+ //# sourceMappingURL=CustomDurationPicker-B_Oxq_nK.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CustomDurationPicker-Bk7D38y7.js","sources":["../../src/hooks/useClaimDurations.ts","../../src/components/common/form/CustomDurationPicker.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useSettings } from '../api/settings';\nimport { DEFAULT_CLAIM_DURATIONS, formatClaimDuration } from '../lib/constants';\n\nexport interface ClaimDurationOption {\n value: string;\n label: string;\n}\n\n/**\n * Returns claim duration presets from server settings (with fallback).\n * Options are formatted for use in selects and tab rows.\n */\nexport function useClaimDurations(): ClaimDurationOption[] {\n const { data: settings } = useSettings();\n\n return useMemo(() => {\n const minutes = settings?.escalation?.claimDurations ?? DEFAULT_CLAIM_DURATIONS;\n return minutes.map((m) => ({\n value: String(m),\n label: formatClaimDuration(m),\n }));\n }, [settings]);\n}\n","import { useState, useEffect } from 'react';\n\nconst UNITS = [\n { value: 1, label: 'minutes' },\n { value: 60, label: 'hours' },\n] as const;\n\ninterface CustomDurationPickerProps {\n /** Called with the computed duration in minutes whenever quantity or unit changes */\n onChange: (minutes: number) => void;\n /** Compact variant for inline use (e.g. action bars) */\n compact?: boolean;\n /** Auto-focus the quantity input */\n autoFocus?: boolean;\n 'data-testid'?: string;\n}\n\nexport function CustomDurationPicker({\n onChange,\n compact,\n autoFocus,\n 'data-testid': testId = 'custom-duration-input',\n}: CustomDurationPickerProps) {\n const [quantity, setQuantity] = useState('');\n const [multiplier, setMultiplier] = useState(1);\n\n useEffect(() => {\n const q = parseInt(quantity);\n onChange(q > 0 ? q * multiplier : 0);\n }, [quantity, multiplier, onChange]);\n\n const textSize = compact ? 'text-xs' : 'text-sm';\n const inputWidth = compact ? 'w-16' : 'w-20';\n\n return (\n <div className=\"flex items-center gap-2\" data-testid={testId}>\n <input\n type=\"number\"\n min={1}\n max={multiplier === 60 ? 24 : 1440}\n value={quantity}\n onChange={(e) => setQuantity(e.target.value)}\n placeholder={multiplier === 60 ? 'hrs' : 'min'}\n className={`input ${textSize} ${inputWidth} text-center`}\n autoFocus={autoFocus}\n data-testid={`${testId}-quantity`}\n />\n <select\n value={multiplier}\n onChange={(e) => setMultiplier(parseInt(e.target.value))}\n className={`select ${textSize} py-1`}\n data-testid={`${testId}-unit`}\n >\n {UNITS.map((u) => (\n <option key={u.value} value={u.value}>{u.label}</option>\n ))}\n </select>\n </div>\n );\n}\n"],"names":["useClaimDurations","settings","useSettings","useMemo","_a","DEFAULT_CLAIM_DURATIONS","m","formatClaimDuration","UNITS","CustomDurationPicker","onChange","compact","autoFocus","testId","quantity","setQuantity","useState","multiplier","setMultiplier","useEffect","q","textSize","inputWidth","jsxs","jsx","e","u"],"mappings":"oJAaO,SAASA,GAA2C,CACzD,KAAM,CAAE,KAAMC,CAAA,EAAaC,EAAA,EAE3B,OAAOC,EAAAA,QAAQ,IAAM,OAEnB,SADgBC,EAAAH,GAAA,YAAAA,EAAU,aAAV,YAAAG,EAAsB,iBAAkBC,GACzC,IAAKC,IAAO,CACzB,MAAO,OAAOA,CAAC,EACf,MAAOC,EAAoBD,CAAC,CAAA,EAC5B,CACJ,EAAG,CAACL,CAAQ,CAAC,CACf,CCrBA,MAAMO,EAAQ,CACZ,CAAE,MAAO,EAAG,MAAO,SAAA,EACnB,CAAE,MAAO,GAAI,MAAO,OAAA,CACtB,EAYO,SAASC,EAAqB,CACnC,SAAAC,EACA,QAAAC,EACA,UAAAC,EACA,cAAeC,EAAS,uBAC1B,EAA8B,CAC5B,KAAM,CAACC,EAAUC,CAAW,EAAIC,EAAAA,SAAS,EAAE,EACrC,CAACC,EAAYC,CAAa,EAAIF,EAAAA,SAAS,CAAC,EAE9CG,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAI,SAASN,CAAQ,EAC3BJ,EAASU,EAAI,EAAIA,EAAIH,EAAa,CAAC,CACrC,EAAG,CAACH,EAAUG,EAAYP,CAAQ,CAAC,EAEnC,MAAMW,EAAWV,EAAU,UAAY,UACjCW,EAAaX,EAAU,OAAS,OAEtC,OACEY,EAAAA,KAAC,MAAA,CAAI,UAAU,0BAA0B,cAAaV,EACpD,SAAA,CAAAW,EAAAA,IAAC,QAAA,CACC,KAAK,SACL,IAAK,EACL,IAAKP,IAAe,GAAK,GAAK,KAC9B,MAAOH,EACP,SAAWW,GAAMV,EAAYU,EAAE,OAAO,KAAK,EAC3C,YAAaR,IAAe,GAAK,MAAQ,MACzC,UAAW,SAASI,CAAQ,IAAIC,CAAU,eAC1C,UAAAV,EACA,cAAa,GAAGC,CAAM,WAAA,CAAA,EAExBW,EAAAA,IAAC,SAAA,CACC,MAAOP,EACP,SAAWQ,GAAMP,EAAc,SAASO,EAAE,OAAO,KAAK,CAAC,EACvD,UAAW,UAAUJ,CAAQ,QAC7B,cAAa,GAAGR,CAAM,QAErB,SAAAL,EAAM,IAAKkB,GACVF,EAAAA,IAAC,SAAA,CAAqB,MAAOE,EAAE,MAAQ,SAAAA,EAAE,KAAA,EAA5BA,EAAE,KAAgC,CAChD,CAAA,CAAA,CACH,EACF,CAEJ"}
1
+ {"version":3,"file":"CustomDurationPicker-B_Oxq_nK.js","sources":["../../src/hooks/useClaimDurations.ts","../../src/components/common/form/CustomDurationPicker.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useSettings } from '../api/settings';\nimport { DEFAULT_CLAIM_DURATIONS, formatClaimDuration } from '../lib/constants';\n\nexport interface ClaimDurationOption {\n value: string;\n label: string;\n}\n\n/**\n * Returns claim duration presets from server settings (with fallback).\n * Options are formatted for use in selects and tab rows.\n */\nexport function useClaimDurations(): ClaimDurationOption[] {\n const { data: settings } = useSettings();\n\n return useMemo(() => {\n const minutes = settings?.escalation?.claimDurations ?? DEFAULT_CLAIM_DURATIONS;\n return minutes.map((m) => ({\n value: String(m),\n label: formatClaimDuration(m),\n }));\n }, [settings]);\n}\n","import { useState, useEffect } from 'react';\n\nconst UNITS = [\n { value: 1, label: 'minutes' },\n { value: 60, label: 'hours' },\n] as const;\n\ninterface CustomDurationPickerProps {\n /** Called with the computed duration in minutes whenever quantity or unit changes */\n onChange: (minutes: number) => void;\n /** Compact variant for inline use (e.g. action bars) */\n compact?: boolean;\n /** Auto-focus the quantity input */\n autoFocus?: boolean;\n 'data-testid'?: string;\n}\n\nexport function CustomDurationPicker({\n onChange,\n compact,\n autoFocus,\n 'data-testid': testId = 'custom-duration-input',\n}: CustomDurationPickerProps) {\n const [quantity, setQuantity] = useState('');\n const [multiplier, setMultiplier] = useState(1);\n\n useEffect(() => {\n const q = parseInt(quantity);\n onChange(q > 0 ? q * multiplier : 0);\n }, [quantity, multiplier, onChange]);\n\n const textSize = compact ? 'text-xs' : 'text-sm';\n const inputWidth = compact ? 'w-16' : 'w-20';\n\n return (\n <div className=\"flex items-center gap-2\" data-testid={testId}>\n <input\n type=\"number\"\n min={1}\n max={multiplier === 60 ? 24 : 1440}\n value={quantity}\n onChange={(e) => setQuantity(e.target.value)}\n placeholder={multiplier === 60 ? 'hrs' : 'min'}\n className={`input ${textSize} ${inputWidth} text-center`}\n autoFocus={autoFocus}\n data-testid={`${testId}-quantity`}\n />\n <select\n value={multiplier}\n onChange={(e) => setMultiplier(parseInt(e.target.value))}\n className={`select ${textSize} py-1`}\n data-testid={`${testId}-unit`}\n >\n {UNITS.map((u) => (\n <option key={u.value} value={u.value}>{u.label}</option>\n ))}\n </select>\n </div>\n );\n}\n"],"names":["useClaimDurations","settings","useSettings","useMemo","_a","DEFAULT_CLAIM_DURATIONS","m","formatClaimDuration","UNITS","CustomDurationPicker","onChange","compact","autoFocus","testId","quantity","setQuantity","useState","multiplier","setMultiplier","useEffect","q","textSize","inputWidth","jsxDEV","e","u"],"mappings":"iJAaO,SAASA,GAA2C,CACzD,KAAM,CAAE,KAAMC,CAAA,EAAaC,EAAA,EAE3B,OAAOC,EAAAA,QAAQ,IAAM,OAEnB,SADgBC,EAAAH,GAAA,YAAAA,EAAU,aAAV,YAAAG,EAAsB,iBAAkBC,GACzC,IAAKC,IAAO,CACzB,MAAO,OAAOA,CAAC,EACf,MAAOC,EAAoBD,CAAC,CAAA,EAC5B,CACJ,EAAG,CAACL,CAAQ,CAAC,CACf,CCrBA,MAAMO,EAAQ,CACZ,CAAE,MAAO,EAAG,MAAO,SAAA,EACnB,CAAE,MAAO,GAAI,MAAO,OAAA,CACtB,EAYO,SAASC,EAAqB,CACnC,SAAAC,EACA,QAAAC,EACA,UAAAC,EACA,cAAeC,EAAS,uBAC1B,EAA8B,CAC5B,KAAM,CAACC,EAAUC,CAAW,EAAIC,EAAAA,SAAS,EAAE,EACrC,CAACC,EAAYC,CAAa,EAAIF,EAAAA,SAAS,CAAC,EAE9CG,EAAAA,UAAU,IAAM,CACd,MAAMC,EAAI,SAASN,CAAQ,EAC3BJ,EAASU,EAAI,EAAIA,EAAIH,EAAa,CAAC,CACrC,EAAG,CAACH,EAAUG,EAAYP,CAAQ,CAAC,EAEnC,MAAMW,EAAWV,EAAU,UAAY,UACjCW,EAAaX,EAAU,OAAS,OAEtC,OACEY,EAAAA,OAAC,MAAA,CAAI,UAAU,0BAA0B,cAAaV,EACpD,SAAA,CAAAU,EAAAA,OAAC,QAAA,CACC,KAAK,SACL,IAAK,EACL,IAAKN,IAAe,GAAK,GAAK,KAC9B,MAAOH,EACP,SAAWU,GAAMT,EAAYS,EAAE,OAAO,KAAK,EAC3C,YAAaP,IAAe,GAAK,MAAQ,MACzC,UAAW,SAASI,CAAQ,IAAIC,CAAU,eAC1C,UAAAV,EACA,cAAa,GAAGC,CAAM,WAAA,EATxB,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,EAWAU,EAAAA,OAAC,SAAA,CACC,MAAON,EACP,SAAWO,GAAMN,EAAc,SAASM,EAAE,OAAO,KAAK,CAAC,EACvD,UAAW,UAAUH,CAAQ,QAC7B,cAAa,GAAGR,CAAM,QAErB,SAAAL,EAAM,IAAKiB,GACVF,EAAAA,OAAC,SAAA,CAAqB,MAAOE,EAAE,MAAQ,SAAAA,EAAE,KAAA,EAA5BA,EAAE,MAAf,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA+C,CAChD,CAAA,EARH,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CASA,CAAA,EArBF,OAAA,GAAA,CAAA,SAAA,qEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAsBA,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./index-Da8R5Fn_.js";import{E as N}from"./EmptyState-Bk3_P-b8.js";function x({active:s,direction:r}){return e.jsxDEV("svg",{className:`w-3 h-3 shrink-0 transition-all duration-150 ${s?"text-accent opacity-100":"opacity-0 group-hover/sorthead:opacity-40 text-text-tertiary"} ${s&&r==="asc"?"rotate-180":""}`,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2.5,children:e.jsxDEV("path",{strokeLinecap:"round",strokeLinejoin:"round",d:"M19 9l-7 7-7-7"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:44,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:35,columnNumber:5},this)}function v({columns:s,data:r,keyFn:i,onRowClick:m,activeRowKey:c,rowClassName:d,isLoading:u,emptyMessage:b="No records found",sort:o,onSort:p,inline:h}){return u?e.jsxDEV("div",{className:"animate-pulse space-y-0",children:Array.from({length:5}).map((a,t)=>e.jsxDEV("div",{className:"h-14 border-b last:border-b-0 px-6 flex items-center",children:e.jsxDEV("div",{className:"h-3 bg-surface-sunken rounded w-full"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:67,columnNumber:13},this)},t,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:66,columnNumber:11},this))},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:64,columnNumber:7},this):r.length?e.jsxDEV("table",{className:"w-full",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"border-b",children:s.map(a=>{const t=a.sortable&&p,n=(o==null?void 0:o.sort_by)===a.key;return e.jsxDEV("th",{onClick:t?()=>p(a.key):void 0,className:`${h?"":"sticky top-[2.75rem] z-10 "}bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary whitespace-nowrap ${a.className??""} ${t?"cursor-pointer select-none group/sorthead hover:text-text-secondary transition-colors":""}`,children:e.jsxDEV("span",{className:"inline-flex items-center gap-1",children:[a.label,t&&e.jsxDEV(x,{active:n,direction:n?o.order:"desc"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:97,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:94,columnNumber:17},this)},a.key,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:87,columnNumber:15},this)})},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:81,columnNumber:9},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:80,columnNumber:7},this),e.jsxDEV("tbody",{children:r.map((a,t)=>{const n=c!=null&&i(a)===c;return e.jsxDEV("tr",{onClick:m?()=>m(a):void 0,className:`group/row border-b last:border-b-0 transition-colors duration-100 ${m?"cursor-pointer row-hover":""} ${n?"bg-accent/5 border-l-2 border-l-accent":""} ${d?d(a):""}`,children:s.map(l=>e.jsxDEV("td",{className:`px-6 py-2.5 text-sm ${l.className??""}`,children:l.render(a,t)},l.key,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:117,columnNumber:15},this))},i(a),!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:109,columnNumber:11},this)})},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:105,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:79,columnNumber:5},this):b?e.jsxDEV(N,{title:b},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/DataTable.tsx",lineNumber:75,columnNumber:27},this):null}export{v as D};
2
+ //# sourceMappingURL=DataTable-etck0Zmp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DataTable-D9yuBv0w.js","sources":["../../src/components/common/data/DataTable.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { EmptyState } from '../display/EmptyState';\nimport type { SortState } from '../../../hooks/useFilterParams';\n\nexport interface Column<T> {\n key: string;\n label: string | ReactNode;\n render: (row: T, index: number) => ReactNode;\n className?: string;\n /** If true, this column header is clickable and triggers onSort. */\n sortable?: boolean;\n}\n\ninterface DataTableProps<T> {\n columns: Column<T>[];\n data: T[];\n keyFn: (row: T) => string;\n onRowClick?: (row: T) => void;\n /** Highlight the row whose keyFn matches this value. */\n activeRowKey?: string | null;\n /** Optional per-row class name for custom styling (e.g., engine vs worker tint). */\n rowClassName?: (row: T) => string;\n isLoading?: boolean;\n emptyMessage?: string;\n /** Current sort state — pass to show active sort indicator. */\n sort?: SortState;\n /** Called when a sortable column header is clicked. */\n onSort?: (column: string) => void;\n /** Disable the sticky header (useful when nested inside collapsible sections). */\n inline?: boolean;\n}\n\nfunction SortIcon({ active, direction }: { active: boolean; direction: 'asc' | 'desc' }) {\n return (\n <svg\n className={`w-3 h-3 shrink-0 transition-all duration-150 ${\n active ? 'text-accent opacity-100' : 'opacity-0 group-hover/sorthead:opacity-40 text-text-tertiary'\n } ${active && direction === 'asc' ? 'rotate-180' : ''}`}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n );\n}\n\nexport function DataTable<T>({\n columns,\n data,\n keyFn,\n onRowClick,\n activeRowKey,\n rowClassName,\n isLoading,\n emptyMessage = 'No records found',\n sort,\n onSort,\n inline,\n}: DataTableProps<T>) {\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-0\">\n {Array.from({ length: 5 }).map((_, i) => (\n <div key={i} className=\"h-14 border-b last:border-b-0 px-6 flex items-center\">\n <div className=\"h-3 bg-surface-sunken rounded w-full\" />\n </div>\n ))}\n </div>\n );\n }\n\n if (!data.length) {\n return emptyMessage ? <EmptyState title={emptyMessage} /> : null;\n }\n\n return (\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b\">\n {columns.map((col) => {\n const isSortable = col.sortable && onSort;\n const isActive = sort?.sort_by === col.key;\n\n return (\n <th\n key={col.key}\n onClick={isSortable ? () => onSort(col.key) : undefined}\n className={`${inline ? '' : 'sticky top-[2.75rem] z-10 '}bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary whitespace-nowrap ${col.className ?? ''} ${\n isSortable ? 'cursor-pointer select-none group/sorthead hover:text-text-secondary transition-colors' : ''\n }`}\n >\n <span className=\"inline-flex items-center gap-1\">\n {col.label}\n {isSortable && (\n <SortIcon active={isActive} direction={isActive ? sort.order : 'desc'} />\n )}\n </span>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {data.map((row, index) => {\n const isActive = activeRowKey != null && keyFn(row) === activeRowKey;\n return (\n <tr\n key={keyFn(row)}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n className={`group/row border-b last:border-b-0 transition-colors duration-100 ${\n onRowClick ? 'cursor-pointer row-hover' : ''\n } ${isActive ? 'bg-accent/5 border-l-2 border-l-accent' : ''} ${rowClassName ? rowClassName(row) : ''}`}\n >\n {columns.map((col) => (\n <td\n key={col.key}\n className={`px-6 py-2.5 text-sm ${col.className ?? ''}`}\n >\n {col.render(row, index)}\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n"],"names":["SortIcon","active","direction","jsx","DataTable","columns","data","keyFn","onRowClick","activeRowKey","rowClassName","isLoading","emptyMessage","sort","onSort","inline","_","i","jsxs","col","isSortable","isActive","row","index","EmptyState"],"mappings":"4FAgCA,SAASA,EAAS,CAAE,OAAAC,EAAQ,UAAAC,GAA6D,CACvF,OACEC,EAAAA,IAAC,MAAA,CACC,UAAW,gDACTF,EAAS,0BAA4B,8DACvC,IAAIA,GAAUC,IAAc,MAAQ,aAAe,EAAE,GACrD,QAAQ,YACR,KAAK,OACL,OAAO,eACP,YAAa,IAEb,eAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,gBAAA,CAAiB,CAAA,CAAA,CAG5E,CAEO,SAASE,EAAa,CAC3B,QAAAC,EACA,KAAAC,EACA,MAAAC,EACA,WAAAC,EACA,aAAAC,EACA,aAAAC,EACA,UAAAC,EACA,aAAAC,EAAe,mBACf,KAAAC,EACA,OAAAC,EACA,OAAAC,CACF,EAAsB,CACpB,OAAIJ,EAEAR,EAAAA,IAAC,MAAA,CAAI,UAAU,0BACZ,SAAA,MAAM,KAAK,CAAE,OAAQ,CAAA,CAAG,EAAE,IAAI,CAACa,EAAGC,IACjCd,EAAAA,IAAC,MAAA,CAAY,UAAU,uDACrB,SAAAA,EAAAA,IAAC,MAAA,CAAI,UAAU,sCAAA,CAAuC,CAAA,EAD9Cc,CAEV,CACD,CAAA,CACH,EAICX,EAAK,OAKRY,EAAAA,KAAC,QAAA,CAAM,UAAU,SACf,SAAA,CAAAf,EAAAA,IAAC,QAAA,CACC,eAAC,KAAA,CAAG,UAAU,WACX,SAAAE,EAAQ,IAAKc,GAAQ,CACpB,MAAMC,EAAaD,EAAI,UAAYL,EAC7BO,GAAWR,GAAA,YAAAA,EAAM,WAAYM,EAAI,IAEvC,OACEhB,EAAAA,IAAC,KAAA,CAEC,QAASiB,EAAa,IAAMN,EAAOK,EAAI,GAAG,EAAI,OAC9C,UAAW,GAAGJ,EAAS,GAAK,4BAA4B,2HAA2HI,EAAI,WAAa,EAAE,IACpMC,EAAa,wFAA0F,EACzG,GAEA,SAAAF,EAAAA,KAAC,OAAA,CAAK,UAAU,iCACb,SAAA,CAAAC,EAAI,MACJC,SACEpB,EAAA,CAAS,OAAQqB,EAAU,UAAWA,EAAWR,EAAK,MAAQ,MAAA,CAAQ,CAAA,CAAA,CAE3E,CAAA,EAXKM,EAAI,GAAA,CAcf,CAAC,EACH,EACF,QACC,QAAA,CACE,SAAAb,EAAK,IAAI,CAACgB,EAAKC,IAAU,CACxB,MAAMF,EAAWZ,GAAgB,MAAQF,EAAMe,CAAG,IAAMb,EACxD,OACAN,EAAAA,IAAC,KAAA,CAEC,QAASK,EAAa,IAAMA,EAAWc,CAAG,EAAI,OAC9C,UAAW,qEACTd,EAAa,2BAA6B,EAC5C,IAAIa,EAAW,yCAA2C,EAAE,IAAIX,EAAeA,EAAaY,CAAG,EAAI,EAAE,GAEpG,SAAAjB,EAAQ,IAAKc,GACZhB,EAAAA,IAAC,KAAA,CAEC,UAAW,uBAAuBgB,EAAI,WAAa,EAAE,GAEpD,SAAAA,EAAI,OAAOG,EAAKC,CAAK,CAAA,EAHjBJ,EAAI,GAAA,CAKZ,CAAA,EAbIZ,EAAMe,CAAG,CAAA,CAgBlB,CAAC,CAAA,CACH,CAAA,EACF,EArDOV,EAAeT,EAAAA,IAACqB,EAAA,CAAW,MAAOZ,EAAc,EAAK,IAuDhE"}
1
+ {"version":3,"file":"DataTable-etck0Zmp.js","sources":["../../src/components/common/data/DataTable.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { EmptyState } from '../display/EmptyState';\nimport type { SortState } from '../../../hooks/useFilterParams';\n\nexport interface Column<T> {\n key: string;\n label: string | ReactNode;\n render: (row: T, index: number) => ReactNode;\n className?: string;\n /** If true, this column header is clickable and triggers onSort. */\n sortable?: boolean;\n}\n\ninterface DataTableProps<T> {\n columns: Column<T>[];\n data: T[];\n keyFn: (row: T) => string;\n onRowClick?: (row: T) => void;\n /** Highlight the row whose keyFn matches this value. */\n activeRowKey?: string | null;\n /** Optional per-row class name for custom styling (e.g., engine vs worker tint). */\n rowClassName?: (row: T) => string;\n isLoading?: boolean;\n emptyMessage?: string;\n /** Current sort state — pass to show active sort indicator. */\n sort?: SortState;\n /** Called when a sortable column header is clicked. */\n onSort?: (column: string) => void;\n /** Disable the sticky header (useful when nested inside collapsible sections). */\n inline?: boolean;\n}\n\nfunction SortIcon({ active, direction }: { active: boolean; direction: 'asc' | 'desc' }) {\n return (\n <svg\n className={`w-3 h-3 shrink-0 transition-all duration-150 ${\n active ? 'text-accent opacity-100' : 'opacity-0 group-hover/sorthead:opacity-40 text-text-tertiary'\n } ${active && direction === 'asc' ? 'rotate-180' : ''}`}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n );\n}\n\nexport function DataTable<T>({\n columns,\n data,\n keyFn,\n onRowClick,\n activeRowKey,\n rowClassName,\n isLoading,\n emptyMessage = 'No records found',\n sort,\n onSort,\n inline,\n}: DataTableProps<T>) {\n if (isLoading) {\n return (\n <div className=\"animate-pulse space-y-0\">\n {Array.from({ length: 5 }).map((_, i) => (\n <div key={i} className=\"h-14 border-b last:border-b-0 px-6 flex items-center\">\n <div className=\"h-3 bg-surface-sunken rounded w-full\" />\n </div>\n ))}\n </div>\n );\n }\n\n if (!data.length) {\n return emptyMessage ? <EmptyState title={emptyMessage} /> : null;\n }\n\n return (\n <table className=\"w-full\">\n <thead>\n <tr className=\"border-b\">\n {columns.map((col) => {\n const isSortable = col.sortable && onSort;\n const isActive = sort?.sort_by === col.key;\n\n return (\n <th\n key={col.key}\n onClick={isSortable ? () => onSort(col.key) : undefined}\n className={`${inline ? '' : 'sticky top-[2.75rem] z-10 '}bg-surface px-6 py-3 text-left text-[10px] font-semibold uppercase tracking-widest text-text-tertiary whitespace-nowrap ${col.className ?? ''} ${\n isSortable ? 'cursor-pointer select-none group/sorthead hover:text-text-secondary transition-colors' : ''\n }`}\n >\n <span className=\"inline-flex items-center gap-1\">\n {col.label}\n {isSortable && (\n <SortIcon active={isActive} direction={isActive ? sort.order : 'desc'} />\n )}\n </span>\n </th>\n );\n })}\n </tr>\n </thead>\n <tbody>\n {data.map((row, index) => {\n const isActive = activeRowKey != null && keyFn(row) === activeRowKey;\n return (\n <tr\n key={keyFn(row)}\n onClick={onRowClick ? () => onRowClick(row) : undefined}\n className={`group/row border-b last:border-b-0 transition-colors duration-100 ${\n onRowClick ? 'cursor-pointer row-hover' : ''\n } ${isActive ? 'bg-accent/5 border-l-2 border-l-accent' : ''} ${rowClassName ? rowClassName(row) : ''}`}\n >\n {columns.map((col) => (\n <td\n key={col.key}\n className={`px-6 py-2.5 text-sm ${col.className ?? ''}`}\n >\n {col.render(row, index)}\n </td>\n ))}\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n}\n"],"names":["SortIcon","active","direction","jsxDEV","DataTable","columns","data","keyFn","onRowClick","activeRowKey","rowClassName","isLoading","emptyMessage","sort","onSort","inline","_","i","col","isSortable","isActive","row","index","EmptyState"],"mappings":"qFAgCA,SAASA,EAAS,CAAE,OAAAC,EAAQ,UAAAC,GAA6D,CACvF,OACEC,EAAAA,OAAC,MAAA,CACC,UAAW,gDACTF,EAAS,0BAA4B,8DACvC,IAAIA,GAAUC,IAAc,MAAQ,aAAe,EAAE,GACrD,QAAQ,YACR,KAAK,OACL,OAAO,eACP,YAAa,IAEb,kBAAC,OAAA,CAAK,cAAc,QAAQ,eAAe,QAAQ,EAAE,kBAArD,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAsE,CAAA,EATxE,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CAYJ,CAEO,SAASE,EAAa,CAC3B,QAAAC,EACA,KAAAC,EACA,MAAAC,EACA,WAAAC,EACA,aAAAC,EACA,aAAAC,EACA,UAAAC,EACA,aAAAC,EAAe,mBACf,KAAAC,EACA,OAAAC,EACA,OAAAC,CACF,EAAsB,CACpB,OAAIJ,EAEAR,EAAAA,OAAC,OAAI,UAAU,0BACZ,eAAM,KAAK,CAAE,OAAQ,CAAA,CAAG,EAAE,IAAI,CAACa,EAAGC,IACjCd,EAAAA,OAAC,MAAA,CAAY,UAAU,uDACrB,SAAAA,SAAC,MAAA,CAAI,UAAU,sCAAA,EAAf,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAsD,GAD9Cc,EAAV,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,CACD,GALH,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAMA,EAICX,EAAK,OAKRH,EAAAA,OAAC,QAAA,CAAM,UAAU,SACf,SAAA,CAAAA,EAAAA,OAAC,QAAA,CACC,kBAAC,KAAA,CAAG,UAAU,WACX,SAAAE,EAAQ,IAAKa,GAAQ,CACpB,MAAMC,EAAaD,EAAI,UAAYJ,EAC7BM,GAAWP,GAAA,YAAAA,EAAM,WAAYK,EAAI,IAEvC,OACEf,EAAAA,OAAC,KAAA,CAEC,QAASgB,EAAa,IAAML,EAAOI,EAAI,GAAG,EAAI,OAC9C,UAAW,GAAGH,EAAS,GAAK,4BAA4B,2HAA2HG,EAAI,WAAa,EAAE,IACpMC,EAAa,wFAA0F,EACzG,GAEA,SAAAhB,EAAAA,OAAC,OAAA,CAAK,UAAU,iCACb,SAAA,CAAAe,EAAI,MACJC,YACEnB,EAAA,CAAS,OAAQoB,EAAU,UAAWA,EAAWP,EAAK,MAAQ,MAAA,EAA/D,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAuE,CAAA,CAAA,EAH3E,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAKA,CAAA,EAXKK,EAAI,IADX,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAeJ,CAAC,CAAA,EArBH,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAsBA,CAAA,EAvBF,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAwBA,WACC,QAAA,CACE,SAAAZ,EAAK,IAAI,CAACe,EAAKC,IAAU,CACxB,MAAMF,EAAWX,GAAgB,MAAQF,EAAMc,CAAG,IAAMZ,EACxD,OACAN,EAAAA,OAAC,KAAA,CAEC,QAASK,EAAa,IAAMA,EAAWa,CAAG,EAAI,OAC9C,UAAW,qEACTb,EAAa,2BAA6B,EAC5C,IAAIY,EAAW,yCAA2C,EAAE,IAAIV,EAAeA,EAAaW,CAAG,EAAI,EAAE,GAEpG,SAAAhB,EAAQ,IAAKa,GACZf,EAAAA,OAAC,KAAA,CAEC,UAAW,uBAAuBe,EAAI,WAAa,EAAE,GAEpD,SAAAA,EAAI,OAAOG,EAAKC,CAAK,CAAA,EAHjBJ,EAAI,IADX,GAAA,CAAA,SAAA,0DAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAA,CAMD,CAAA,EAbIX,EAAMc,CAAG,EADhB,GAAA,CAAA,SAAA,0DAAA,WAAA,IAAA,aAAA,EAAA,EAAA,IAAA,CAiBF,CAAC,CAAA,EArBH,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,IAAA,aAAA,CAAA,EAAA,IAsBA,CAAA,CAAA,EAhDF,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAiDA,EArDOT,EAAeT,EAAAA,OAACoB,EAAA,CAAW,MAAOX,CAAA,EAAnB,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAiC,EAAK,IAuDhE"}
@@ -0,0 +1,2 @@
1
+ import{j as l}from"./index-Da8R5Fn_.js";import{a as n}from"./vendor-query-DLp59M9_.js";import{av as b}from"./vendor-icons-1qQ3NKfa.js";function g(t,c){const p=c.split(",").map(e=>e.trim());for(const e of p)if(e.startsWith(".")&&t.name.toLowerCase().endsWith(e.toLowerCase())||e===t.type||e.endsWith("/*")&&t.type.startsWith(e.slice(0,-1)))return!0;return!1}function E({onDrop:t,children:c,label:p="Drop files here",accept:e,disabled:i}){const[u,m]=n.useState(!1),a=n.useRef(0),f=n.useCallback(r=>{r.preventDefault(),r.stopPropagation(),a.current++,i||m(!0)},[i]),d=n.useCallback(r=>{r.preventDefault(),r.stopPropagation(),a.current--,a.current<=0&&(a.current=0,m(!1))},[]),h=n.useCallback(r=>{r.preventDefault(),r.stopPropagation()},[]),x=n.useCallback(r=>{if(r.preventDefault(),r.stopPropagation(),a.current=0,m(!1),i)return;const s=Array.from(r.dataTransfer.files);if(console.debug("[DropZone] dropped files:",s.map(o=>({name:o.name,type:o.type,size:o.size}))),e){const o=s.filter(D=>g(D,e));console.debug("[DropZone] after accept filter:",o.length,"of",s.length),o.length?t(o):console.warn("[DropZone] no files matched accept pattern:",e)}else s.length&&t(s)},[t,e,i]);return l.jsxDEV("div",{className:"relative",onDragEnter:f,onDragLeave:d,onDragOver:h,onDrop:x,children:[c,u&&l.jsxDEV("div",{className:"fixed inset-0 z-50 flex flex-col items-center justify-center transition-opacity pointer-events-none",style:{background:"rgba(var(--color-surface-rgb, 255 255 255) / 0.85)"},children:l.jsxDEV("div",{className:"flex flex-col items-center gap-2 px-6 py-5 rounded-xl border border-dashed border-text-quaternary/40",children:[l.jsxDEV(b,{className:"w-8 h-8 text-text-tertiary"},void 0,!1,{fileName:"/app/dashboard/src/components/common/DropZone.tsx",lineNumber:82,columnNumber:13},this),l.jsxDEV("p",{className:"text-xs text-text-secondary",children:p},void 0,!1,{fileName:"/app/dashboard/src/components/common/DropZone.tsx",lineNumber:83,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/DropZone.tsx",lineNumber:81,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/DropZone.tsx",lineNumber:78,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/DropZone.tsx",lineNumber:69,columnNumber:5},this)}export{E as D};
2
+ //# sourceMappingURL=DropZone-BDpzHWsI.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DropZone-2mGyDo1P.js","sources":["../../src/components/common/DropZone.tsx"],"sourcesContent":["import { useState, useCallback, useRef, type DragEvent, type ReactNode } from 'react';\nimport { UploadCloud } from 'lucide-react';\n\ninterface DropZoneProps {\n onDrop: (files: File[]) => void;\n children: ReactNode;\n label?: string;\n accept?: string;\n disabled?: boolean;\n}\n\nfunction matchesAccept(file: File, accept: string): boolean {\n const patterns = accept.split(',').map(s => s.trim());\n for (const pattern of patterns) {\n if (pattern.startsWith('.') && file.name.toLowerCase().endsWith(pattern.toLowerCase())) return true;\n if (pattern === file.type) return true;\n if (pattern.endsWith('/*') && file.type.startsWith(pattern.slice(0, -1))) return true;\n }\n return false;\n}\n\nexport function DropZone({ onDrop, children, label = 'Drop files here', accept, disabled }: DropZoneProps) {\n const [dragOver, setDragOver] = useState(false);\n const dragCounter = useRef(0);\n\n const handleDragEnter = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounter.current++;\n if (!disabled) setDragOver(true);\n }, [disabled]);\n\n const handleDragLeave = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounter.current--;\n if (dragCounter.current <= 0) {\n dragCounter.current = 0;\n setDragOver(false);\n }\n }, []);\n\n const handleDragOver = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n const handleDrop = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounter.current = 0;\n setDragOver(false);\n if (disabled) return;\n\n const files = Array.from(e.dataTransfer.files);\n console.debug('[DropZone] dropped files:', files.map(f => ({ name: f.name, type: f.type, size: f.size })));\n\n if (accept) {\n const filtered = files.filter(f => matchesAccept(f, accept));\n console.debug('[DropZone] after accept filter:', filtered.length, 'of', files.length);\n if (filtered.length) onDrop(filtered);\n else console.warn('[DropZone] no files matched accept pattern:', accept);\n } else {\n if (files.length) onDrop(files);\n }\n }, [onDrop, accept, disabled]);\n\n return (\n <div\n className=\"relative\"\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n {children}\n {dragOver && (\n <div className=\"fixed inset-0 z-50 flex flex-col items-center justify-center transition-opacity pointer-events-none\"\n style={{ background: 'rgba(var(--color-surface-rgb, 255 255 255) / 0.85)' }}\n >\n <div className=\"flex flex-col items-center gap-2 px-6 py-5 rounded-xl border border-dashed border-text-quaternary/40\">\n <UploadCloud className=\"w-8 h-8 text-text-tertiary\" />\n <p className=\"text-xs text-text-secondary\">{label}</p>\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"names":["matchesAccept","file","accept","patterns","s","pattern","DropZone","onDrop","children","label","disabled","dragOver","setDragOver","useState","dragCounter","useRef","handleDragEnter","useCallback","e","handleDragLeave","handleDragOver","handleDrop","files","f","filtered","jsxs","jsx","UploadCloud"],"mappings":"sGAWA,SAASA,EAAcC,EAAYC,EAAyB,CAC1D,MAAMC,EAAWD,EAAO,MAAM,GAAG,EAAE,IAAIE,GAAKA,EAAE,MAAM,EACpD,UAAWC,KAAWF,EAGpB,GAFIE,EAAQ,WAAW,GAAG,GAAKJ,EAAK,KAAK,YAAA,EAAc,SAASI,EAAQ,YAAA,CAAa,GACjFA,IAAYJ,EAAK,MACjBI,EAAQ,SAAS,IAAI,GAAKJ,EAAK,KAAK,WAAWI,EAAQ,MAAM,EAAG,EAAE,CAAC,EAAG,MAAO,GAEnF,MAAO,EACT,CAEO,SAASC,EAAS,CAAE,OAAAC,EAAQ,SAAAC,EAAU,MAAAC,EAAQ,kBAAmB,OAAAP,EAAQ,SAAAQ,GAA2B,CACzG,KAAM,CAACC,EAAUC,CAAW,EAAIC,EAAAA,SAAS,EAAK,EACxCC,EAAcC,EAAAA,OAAO,CAAC,EAEtBC,EAAkBC,cAAaC,GAAiB,CACpDA,EAAE,eAAA,EACFA,EAAE,gBAAA,EACFJ,EAAY,UACPJ,GAAUE,EAAY,EAAI,CACjC,EAAG,CAACF,CAAQ,CAAC,EAEPS,EAAkBF,cAAaC,GAAiB,CACpDA,EAAE,eAAA,EACFA,EAAE,gBAAA,EACFJ,EAAY,UACRA,EAAY,SAAW,IACzBA,EAAY,QAAU,EACtBF,EAAY,EAAK,EAErB,EAAG,CAAA,CAAE,EAECQ,EAAiBH,cAAaC,GAAiB,CACnDA,EAAE,eAAA,EACFA,EAAE,gBAAA,CACJ,EAAG,CAAA,CAAE,EAECG,EAAaJ,cAAaC,GAAiB,CAK/C,GAJAA,EAAE,eAAA,EACFA,EAAE,gBAAA,EACFJ,EAAY,QAAU,EACtBF,EAAY,EAAK,EACbF,EAAU,OAEd,MAAMY,EAAQ,MAAM,KAAKJ,EAAE,aAAa,KAAK,EAG7C,GAFA,QAAQ,MAAM,4BAA6BI,EAAM,IAAIC,IAAM,CAAE,KAAMA,EAAE,KAAM,KAAMA,EAAE,KAAM,KAAMA,EAAE,IAAA,EAAO,CAAC,EAErGrB,EAAQ,CACV,MAAMsB,EAAWF,EAAM,UAAYtB,EAAcuB,EAAGrB,CAAM,CAAC,EAC3D,QAAQ,MAAM,kCAAmCsB,EAAS,OAAQ,KAAMF,EAAM,MAAM,EAChFE,EAAS,OAAQjB,EAAOiB,CAAQ,EAC/B,QAAQ,KAAK,8CAA+CtB,CAAM,CACzE,MACMoB,EAAM,QAAQf,EAAOe,CAAK,CAElC,EAAG,CAACf,EAAQL,EAAQQ,CAAQ,CAAC,EAE7B,OACEe,EAAAA,KAAC,MAAA,CACC,UAAU,WACV,YAAaT,EACb,YAAaG,EACb,WAAYC,EACZ,OAAQC,EAEP,SAAA,CAAAb,EACAG,GACCe,EAAAA,IAAC,MAAA,CAAI,UAAU,sGACb,MAAO,CAAE,WAAY,oDAAA,EAErB,SAAAD,EAAAA,KAAC,MAAA,CAAI,UAAU,uGACb,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAY,UAAU,4BAAA,CAA6B,EACpDD,EAAAA,IAAC,IAAA,CAAE,UAAU,8BAA+B,SAAAjB,CAAA,CAAM,CAAA,CAAA,CACpD,CAAA,CAAA,CACF,CAAA,CAAA,CAIR"}
1
+ {"version":3,"file":"DropZone-BDpzHWsI.js","sources":["../../src/components/common/DropZone.tsx"],"sourcesContent":["import { useState, useCallback, useRef, type DragEvent, type ReactNode } from 'react';\nimport { UploadCloud } from 'lucide-react';\n\ninterface DropZoneProps {\n onDrop: (files: File[]) => void;\n children: ReactNode;\n label?: string;\n accept?: string;\n disabled?: boolean;\n}\n\nfunction matchesAccept(file: File, accept: string): boolean {\n const patterns = accept.split(',').map(s => s.trim());\n for (const pattern of patterns) {\n if (pattern.startsWith('.') && file.name.toLowerCase().endsWith(pattern.toLowerCase())) return true;\n if (pattern === file.type) return true;\n if (pattern.endsWith('/*') && file.type.startsWith(pattern.slice(0, -1))) return true;\n }\n return false;\n}\n\nexport function DropZone({ onDrop, children, label = 'Drop files here', accept, disabled }: DropZoneProps) {\n const [dragOver, setDragOver] = useState(false);\n const dragCounter = useRef(0);\n\n const handleDragEnter = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounter.current++;\n if (!disabled) setDragOver(true);\n }, [disabled]);\n\n const handleDragLeave = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounter.current--;\n if (dragCounter.current <= 0) {\n dragCounter.current = 0;\n setDragOver(false);\n }\n }, []);\n\n const handleDragOver = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n }, []);\n\n const handleDrop = useCallback((e: DragEvent) => {\n e.preventDefault();\n e.stopPropagation();\n dragCounter.current = 0;\n setDragOver(false);\n if (disabled) return;\n\n const files = Array.from(e.dataTransfer.files);\n console.debug('[DropZone] dropped files:', files.map(f => ({ name: f.name, type: f.type, size: f.size })));\n\n if (accept) {\n const filtered = files.filter(f => matchesAccept(f, accept));\n console.debug('[DropZone] after accept filter:', filtered.length, 'of', files.length);\n if (filtered.length) onDrop(filtered);\n else console.warn('[DropZone] no files matched accept pattern:', accept);\n } else {\n if (files.length) onDrop(files);\n }\n }, [onDrop, accept, disabled]);\n\n return (\n <div\n className=\"relative\"\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n {children}\n {dragOver && (\n <div className=\"fixed inset-0 z-50 flex flex-col items-center justify-center transition-opacity pointer-events-none\"\n style={{ background: 'rgba(var(--color-surface-rgb, 255 255 255) / 0.85)' }}\n >\n <div className=\"flex flex-col items-center gap-2 px-6 py-5 rounded-xl border border-dashed border-text-quaternary/40\">\n <UploadCloud className=\"w-8 h-8 text-text-tertiary\" />\n <p className=\"text-xs text-text-secondary\">{label}</p>\n </div>\n </div>\n )}\n </div>\n );\n}\n"],"names":["matchesAccept","file","accept","patterns","s","pattern","DropZone","onDrop","children","label","disabled","dragOver","setDragOver","useState","dragCounter","useRef","handleDragEnter","useCallback","e","handleDragLeave","handleDragOver","handleDrop","files","f","filtered","jsxDEV","UploadCloud"],"mappings":"uIAWA,SAASA,EAAcC,EAAYC,EAAyB,CAC1D,MAAMC,EAAWD,EAAO,MAAM,GAAG,EAAE,IAAIE,GAAKA,EAAE,MAAM,EACpD,UAAWC,KAAWF,EAGpB,GAFIE,EAAQ,WAAW,GAAG,GAAKJ,EAAK,KAAK,YAAA,EAAc,SAASI,EAAQ,YAAA,CAAa,GACjFA,IAAYJ,EAAK,MACjBI,EAAQ,SAAS,IAAI,GAAKJ,EAAK,KAAK,WAAWI,EAAQ,MAAM,EAAG,EAAE,CAAC,EAAG,MAAO,GAEnF,MAAO,EACT,CAEO,SAASC,EAAS,CAAE,OAAAC,EAAQ,SAAAC,EAAU,MAAAC,EAAQ,kBAAmB,OAAAP,EAAQ,SAAAQ,GAA2B,CACzG,KAAM,CAACC,EAAUC,CAAW,EAAIC,EAAAA,SAAS,EAAK,EACxCC,EAAcC,EAAAA,OAAO,CAAC,EAEtBC,EAAkBC,cAAaC,GAAiB,CACpDA,EAAE,eAAA,EACFA,EAAE,gBAAA,EACFJ,EAAY,UACPJ,GAAUE,EAAY,EAAI,CACjC,EAAG,CAACF,CAAQ,CAAC,EAEPS,EAAkBF,cAAaC,GAAiB,CACpDA,EAAE,eAAA,EACFA,EAAE,gBAAA,EACFJ,EAAY,UACRA,EAAY,SAAW,IACzBA,EAAY,QAAU,EACtBF,EAAY,EAAK,EAErB,EAAG,CAAA,CAAE,EAECQ,EAAiBH,cAAaC,GAAiB,CACnDA,EAAE,eAAA,EACFA,EAAE,gBAAA,CACJ,EAAG,CAAA,CAAE,EAECG,EAAaJ,cAAaC,GAAiB,CAK/C,GAJAA,EAAE,eAAA,EACFA,EAAE,gBAAA,EACFJ,EAAY,QAAU,EACtBF,EAAY,EAAK,EACbF,EAAU,OAEd,MAAMY,EAAQ,MAAM,KAAKJ,EAAE,aAAa,KAAK,EAG7C,GAFA,QAAQ,MAAM,4BAA6BI,EAAM,IAAIC,IAAM,CAAE,KAAMA,EAAE,KAAM,KAAMA,EAAE,KAAM,KAAMA,EAAE,IAAA,EAAO,CAAC,EAErGrB,EAAQ,CACV,MAAMsB,EAAWF,EAAM,UAAYtB,EAAcuB,EAAGrB,CAAM,CAAC,EAC3D,QAAQ,MAAM,kCAAmCsB,EAAS,OAAQ,KAAMF,EAAM,MAAM,EAChFE,EAAS,OAAQjB,EAAOiB,CAAQ,EAC/B,QAAQ,KAAK,8CAA+CtB,CAAM,CACzE,MACMoB,EAAM,QAAQf,EAAOe,CAAK,CAElC,EAAG,CAACf,EAAQL,EAAQQ,CAAQ,CAAC,EAE7B,OACEe,EAAAA,OAAC,MAAA,CACC,UAAU,WACV,YAAaT,EACb,YAAaG,EACb,WAAYC,EACZ,OAAQC,EAEP,SAAA,CAAAb,EACAG,GACCc,EAAAA,OAAC,MAAA,CAAI,UAAU,sGACb,MAAO,CAAE,WAAY,oDAAA,EAErB,SAAAA,EAAAA,OAAC,MAAA,CAAI,UAAU,uGACb,SAAA,CAAAA,EAAAA,OAACC,EAAA,CAAY,UAAU,4BAAA,EAAvB,OAAA,GAAA,CAAA,SAAA,oDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAoD,EACpDD,SAAC,IAAA,CAAE,UAAU,8BAA+B,SAAAhB,CAAA,EAA5C,OAAA,GAAA,CAAA,SAAA,oDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAkD,CAAA,CAAA,EAFpD,OAAA,GAAA,CAAA,SAAA,oDAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAGA,CAAA,EANF,OAAA,GAAA,CAAA,SAAA,oDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CAOA,CAAA,EAhBJ,OAAA,GAAA,CAAA,SAAA,oDAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CAoBJ"}
@@ -0,0 +1,2 @@
1
+ import{A as d,j as l,y as x}from"./index-Da8R5Fn_.js";import{a}from"./vendor-query-DLp59M9_.js";function E({startDate:n,endDate:o,isLive:t}){const[r,m]=a.useState(Date.now);a.useEffect(()=>{if(!t)return;const u=setInterval(()=>m(Date.now()),1e3);return()=>clearInterval(u)},[t]);const c=new Date(n).getTime(),i=o?new Date(o).getTime():r,e=Math.max(0,i-c),s=d(e),p=a.useMemo(()=>[{label:"ms",value:String(e)},{label:"sec",value:`${(e/1e3).toFixed(3)}s`},{label:"text",value:s}],[e,s]);return l.jsxDEV(x,{options:p,children:l.jsxDEV("span",{className:`text-xs ${t?"text-status-active":"text-text-tertiary"}`,children:s},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/ElapsedCell.tsx",lineNumber:38,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/ElapsedCell.tsx",lineNumber:37,columnNumber:5},this)}export{E};
2
+ //# sourceMappingURL=ElapsedCell-D35Z-HSJ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ElapsedCell-BpJjG1s-.js","sources":["../../src/components/common/display/ElapsedCell.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { formatDurationCompact } from '../../../lib/format';\nimport { DateTooltip } from './DateTooltip';\n\ninterface ElapsedCellProps {\n startDate: string;\n endDate?: string | null;\n isLive?: boolean;\n}\n\n/**\n * Elapsed duration cell for data tables.\n * Shows compact duration with hover tooltip. Ticks every second when live.\n */\nexport function ElapsedCell({ startDate, endDate, isLive }: ElapsedCellProps) {\n const [now, setNow] = useState(Date.now);\n\n useEffect(() => {\n if (!isLive) return;\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, [isLive]);\n\n const start = new Date(startDate).getTime();\n const end = endDate ? new Date(endDate).getTime() : now;\n const ms = Math.max(0, end - start);\n\n const display = formatDurationCompact(ms);\n\n const options = useMemo(() => [\n { label: 'ms', value: String(ms) },\n { label: 'sec', value: `${(ms / 1000).toFixed(3)}s` },\n { label: 'text', value: display },\n ], [ms, display]);\n\n return (\n <DateTooltip options={options}>\n <span className={`text-xs ${isLive ? 'text-status-active' : 'text-text-tertiary'}`}>\n {display}\n </span>\n </DateTooltip>\n );\n}\n"],"names":["ElapsedCell","startDate","endDate","isLive","now","setNow","useState","useEffect","id","start","end","ms","display","formatDurationCompact","options","useMemo","jsx","DateTooltip"],"mappings":"qGAcO,SAASA,EAAY,CAAE,UAAAC,EAAW,QAAAC,EAAS,OAAAC,GAA4B,CAC5E,KAAM,CAACC,EAAKC,CAAM,EAAIC,EAAAA,SAAS,KAAK,GAAG,EAEvCC,EAAAA,UAAU,IAAM,CACd,GAAI,CAACJ,EAAQ,OACb,MAAMK,EAAK,YAAY,IAAMH,EAAO,KAAK,IAAA,CAAK,EAAG,GAAI,EACrD,MAAO,IAAM,cAAcG,CAAE,CAC/B,EAAG,CAACL,CAAM,CAAC,EAEX,MAAMM,EAAQ,IAAI,KAAKR,CAAS,EAAE,QAAA,EAC5BS,EAAMR,EAAU,IAAI,KAAKA,CAAO,EAAE,UAAYE,EAC9CO,EAAK,KAAK,IAAI,EAAGD,EAAMD,CAAK,EAE5BG,EAAUC,EAAsBF,CAAE,EAElCG,EAAUC,EAAAA,QAAQ,IAAM,CAC5B,CAAE,MAAO,KAAM,MAAO,OAAOJ,CAAE,CAAA,EAC/B,CAAE,MAAO,MAAO,MAAO,IAAIA,EAAK,KAAM,QAAQ,CAAC,CAAC,GAAA,EAChD,CAAE,MAAO,OAAQ,MAAOC,CAAA,CAAQ,EAC/B,CAACD,EAAIC,CAAO,CAAC,EAEhB,OACEI,EAAAA,IAACC,EAAA,CAAY,QAAAH,EACX,SAAAE,EAAAA,IAAC,OAAA,CAAK,UAAW,WAAWb,EAAS,qBAAuB,oBAAoB,GAC7E,SAAAS,CAAA,CACH,EACF,CAEJ"}
1
+ {"version":3,"file":"ElapsedCell-D35Z-HSJ.js","sources":["../../src/components/common/display/ElapsedCell.tsx"],"sourcesContent":["import { useState, useEffect, useMemo } from 'react';\nimport { formatDurationCompact } from '../../../lib/format';\nimport { DateTooltip } from './DateTooltip';\n\ninterface ElapsedCellProps {\n startDate: string;\n endDate?: string | null;\n isLive?: boolean;\n}\n\n/**\n * Elapsed duration cell for data tables.\n * Shows compact duration with hover tooltip. Ticks every second when live.\n */\nexport function ElapsedCell({ startDate, endDate, isLive }: ElapsedCellProps) {\n const [now, setNow] = useState(Date.now);\n\n useEffect(() => {\n if (!isLive) return;\n const id = setInterval(() => setNow(Date.now()), 1000);\n return () => clearInterval(id);\n }, [isLive]);\n\n const start = new Date(startDate).getTime();\n const end = endDate ? new Date(endDate).getTime() : now;\n const ms = Math.max(0, end - start);\n\n const display = formatDurationCompact(ms);\n\n const options = useMemo(() => [\n { label: 'ms', value: String(ms) },\n { label: 'sec', value: `${(ms / 1000).toFixed(3)}s` },\n { label: 'text', value: display },\n ], [ms, display]);\n\n return (\n <DateTooltip options={options}>\n <span className={`text-xs ${isLive ? 'text-status-active' : 'text-text-tertiary'}`}>\n {display}\n </span>\n </DateTooltip>\n );\n}\n"],"names":["ElapsedCell","startDate","endDate","isLive","now","setNow","useState","useEffect","id","start","end","ms","display","formatDurationCompact","options","useMemo","jsxDEV","DateTooltip"],"mappings":"gGAcO,SAASA,EAAY,CAAE,UAAAC,EAAW,QAAAC,EAAS,OAAAC,GAA4B,CAC5E,KAAM,CAACC,EAAKC,CAAM,EAAIC,EAAAA,SAAS,KAAK,GAAG,EAEvCC,EAAAA,UAAU,IAAM,CACd,GAAI,CAACJ,EAAQ,OACb,MAAMK,EAAK,YAAY,IAAMH,EAAO,KAAK,IAAA,CAAK,EAAG,GAAI,EACrD,MAAO,IAAM,cAAcG,CAAE,CAC/B,EAAG,CAACL,CAAM,CAAC,EAEX,MAAMM,EAAQ,IAAI,KAAKR,CAAS,EAAE,QAAA,EAC5BS,EAAMR,EAAU,IAAI,KAAKA,CAAO,EAAE,UAAYE,EAC9CO,EAAK,KAAK,IAAI,EAAGD,EAAMD,CAAK,EAE5BG,EAAUC,EAAsBF,CAAE,EAElCG,EAAUC,EAAAA,QAAQ,IAAM,CAC5B,CAAE,MAAO,KAAM,MAAO,OAAOJ,CAAE,CAAA,EAC/B,CAAE,MAAO,MAAO,MAAO,IAAIA,EAAK,KAAM,QAAQ,CAAC,CAAC,GAAA,EAChD,CAAE,MAAO,OAAQ,MAAOC,CAAA,CAAQ,EAC/B,CAACD,EAAIC,CAAO,CAAC,EAEhB,OACEI,EAAAA,OAACC,EAAA,CAAY,QAAAH,EACX,SAAAE,SAAC,OAAA,CAAK,UAAW,WAAWb,EAAS,qBAAuB,oBAAoB,GAC7E,SAAAS,CAAA,EADH,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,CAAA,EAHF,OAAA,GAAA,CAAA,SAAA,+DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAIA,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./index-Da8R5Fn_.js";function o({title:m="No data",description:t,icon:s}){return e.jsxDEV("div",{className:"flex flex-col items-center justify-center py-20",children:[s&&e.jsxDEV("div",{className:"w-12 h-12 rounded-full bg-accent/[0.06] flex items-center justify-center mb-4",children:e.jsxDEV(s,{className:"w-5 h-5 text-accent/50"},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/EmptyState.tsx",lineNumber:16,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/EmptyState.tsx",lineNumber:15,columnNumber:9},this),e.jsxDEV("p",{className:"text-sm text-text-secondary",children:m},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/EmptyState.tsx",lineNumber:19,columnNumber:7},this),t&&e.jsxDEV("p",{className:"text-xs text-text-tertiary mt-1",children:t},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/EmptyState.tsx",lineNumber:21,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/EmptyState.tsx",lineNumber:13,columnNumber:5},this)}export{o as E};
2
+ //# sourceMappingURL=EmptyState-Bk3_P-b8.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EmptyState-BcsfPq9T.js","sources":["../../src/components/common/display/EmptyState.tsx"],"sourcesContent":["import type { LucideIcon } from 'lucide-react';\n\nexport function EmptyState({\n title = 'No data',\n description,\n icon: Icon,\n}: {\n title?: string;\n description?: string;\n icon?: LucideIcon;\n}) {\n return (\n <div className=\"flex flex-col items-center justify-center py-20\">\n {Icon && (\n <div className=\"w-12 h-12 rounded-full bg-accent/[0.06] flex items-center justify-center mb-4\">\n <Icon className=\"w-5 h-5 text-accent/50\" />\n </div>\n )}\n <p className=\"text-sm text-text-secondary\">{title}</p>\n {description && (\n <p className=\"text-xs text-text-tertiary mt-1\">{description}</p>\n )}\n </div>\n );\n}\n"],"names":["EmptyState","title","description","Icon","jsxs","jsx"],"mappings":"+CAEO,SAASA,EAAW,CACzB,MAAAC,EAAQ,UACR,YAAAC,EACA,KAAMC,CACR,EAIG,CACD,OACEC,EAAAA,KAAC,MAAA,CAAI,UAAU,kDACZ,SAAA,CAAAD,GACCE,EAAAA,IAAC,OAAI,UAAU,gFACb,eAACF,EAAA,CAAK,UAAU,yBAAyB,CAAA,CAC3C,EAEFE,EAAAA,IAAC,IAAA,CAAE,UAAU,8BAA+B,SAAAJ,EAAM,EACjDC,GACCG,EAAAA,IAAC,IAAA,CAAE,UAAU,kCAAmC,SAAAH,CAAA,CAAY,CAAA,EAEhE,CAEJ"}
1
+ {"version":3,"file":"EmptyState-Bk3_P-b8.js","sources":["../../src/components/common/display/EmptyState.tsx"],"sourcesContent":["import type { LucideIcon } from 'lucide-react';\n\nexport function EmptyState({\n title = 'No data',\n description,\n icon: Icon,\n}: {\n title?: string;\n description?: string;\n icon?: LucideIcon;\n}) {\n return (\n <div className=\"flex flex-col items-center justify-center py-20\">\n {Icon && (\n <div className=\"w-12 h-12 rounded-full bg-accent/[0.06] flex items-center justify-center mb-4\">\n <Icon className=\"w-5 h-5 text-accent/50\" />\n </div>\n )}\n <p className=\"text-sm text-text-secondary\">{title}</p>\n {description && (\n <p className=\"text-xs text-text-tertiary mt-1\">{description}</p>\n )}\n </div>\n );\n}\n"],"names":["EmptyState","title","description","Icon","jsxDEV"],"mappings":"wCAEO,SAASA,EAAW,CACzB,MAAAC,EAAQ,UACR,YAAAC,EACA,KAAMC,CACR,EAIG,CACD,OACEC,EAAAA,OAAC,MAAA,CAAI,UAAU,kDACZ,SAAA,CAAAD,YACE,MAAA,CAAI,UAAU,gFACb,SAAAC,SAACD,EAAA,CAAK,UAAU,wBAAA,EAAhB,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAyC,CAAA,EAD3C,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAEA,EAEFC,SAAC,IAAA,CAAE,UAAU,8BAA+B,SAAAH,CAAA,EAA5C,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAkD,EACjDC,GACCE,EAAAA,OAAC,IAAA,CAAE,UAAU,kCAAmC,SAAAF,CAAA,EAAhD,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAA4D,CAAA,CAAA,EARhE,OAAA,GAAA,CAAA,SAAA,8DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAUA,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{i as u,j as e}from"./index-Da8R5Fn_.js";import{a as b}from"./vendor-query-DLp59M9_.js";import{e as v}from"./useEventHooks-AwwZnweF.js";import{P as N}from"./PageHeader-BuUnJ5NY.js";import{S as c}from"./StatCard-B7ySTryP.js";import{c as h}from"./vendor-react-Co3Y8ikm.js";import"./vendor-icons-1qQ3NKfa.js";const x=[{label:"1h",value:"1h"},{label:"24h",value:"24h"},{label:"7d",value:"7d"},{label:"30d",value:"30d"}];function i({value:o,colorClass:l,onClick:n}){return o===0?e.jsxDEV("span",{className:"text-text-tertiary",children:"0"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:31,columnNumber:12},this):e.jsxDEV("button",{onClick:n,className:`${l} hover:underline tabular-nums font-medium`,children:o},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:34,columnNumber:5},this)}function w(){var m,d;v();const o=h(),[l,n]=b.useState("24h"),{data:s}=u(l),r=a=>{const p=new URLSearchParams(a).toString();o(`/escalations/available${p?`?${p}`:""}`)},t="pb-2 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary";return e.jsxDEV("div",{children:[e.jsxDEV(N,{title:"Escalations",docsHash:"#docs:dashboard.md:escalations-overview"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:61,columnNumber:7},this),e.jsxDEV("div",{className:"flex items-center gap-1 mb-6",children:x.map(a=>e.jsxDEV("button",{onClick:()=>n(a.value),className:`px-3 py-1 text-xs rounded-full transition-colors ${l===a.value?"bg-accent text-text-inverse":"text-text-tertiary hover:text-text-primary hover:bg-surface-hover"}`,children:a.label},a.value,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:66,columnNumber:11},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:64,columnNumber:7},this),e.jsxDEV("div",{className:"grid grid-cols-4 gap-4 mb-8",children:[e.jsxDEV(c,{label:"Open",value:(s==null?void 0:s.pending)??"—",colorClass:"text-status-pending",onClick:()=>r()},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:82,columnNumber:9},this),e.jsxDEV(c,{label:"Claimed",value:(s==null?void 0:s.claimed)??"—",colorClass:"text-status-active",onClick:()=>r()},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:83,columnNumber:9},this),e.jsxDEV(c,{label:"Created",value:(s==null?void 0:s.created)??"—",onClick:()=>r()},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:84,columnNumber:9},this),e.jsxDEV(c,{label:"Resolved",value:(s==null?void 0:s.resolved)??"—",colorClass:"text-status-success",onClick:()=>r()},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:85,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:81,columnNumber:7},this),(((m=s==null?void 0:s.by_role)==null?void 0:m.length)??0)>0&&e.jsxDEV("div",{className:"mb-8",children:e.jsxDEV("table",{className:"w-full text-left",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"border-b border-surface-border",children:[e.jsxDEV("th",{className:t,children:"Role"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:94,columnNumber:17},this),e.jsxDEV("th",{className:`${t} text-right w-24`,children:"Pending"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:95,columnNumber:17},this),e.jsxDEV("th",{className:`${t} text-right w-24`,children:"Claimed"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:96,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:93,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:92,columnNumber:13},this),e.jsxDEV("tbody",{children:s.by_role.map(a=>e.jsxDEV("tr",{className:"border-b border-surface-border last:border-b-0",children:[e.jsxDEV("td",{className:"py-3 text-sm font-mono text-text-primary",children:e.jsxDEV("button",{onClick:()=>r({role:a.role}),className:"hover:text-accent hover:underline",children:a.role},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:103,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:102,columnNumber:19},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(i,{value:a.pending,colorClass:"text-status-pending",onClick:()=>r({role:a.role})},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:111,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:110,columnNumber:19},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(i,{value:a.claimed,colorClass:"text-status-active",onClick:()=>r({role:a.role})},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:118,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:117,columnNumber:19},this)]},a.role,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:101,columnNumber:17},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:99,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:91,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:90,columnNumber:9},this),(((d=s==null?void 0:s.by_type)==null?void 0:d.length)??0)>0&&e.jsxDEV("div",{children:e.jsxDEV("table",{className:"w-full text-left",children:[e.jsxDEV("thead",{children:e.jsxDEV("tr",{className:"border-b border-surface-border",children:[e.jsxDEV("th",{className:t,children:"Type"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:137,columnNumber:17},this),e.jsxDEV("th",{className:`${t} text-right w-24`,children:"Pending"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:138,columnNumber:17},this),e.jsxDEV("th",{className:`${t} text-right w-24`,children:"Claimed"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:139,columnNumber:17},this),e.jsxDEV("th",{className:`${t} text-right w-24`,children:"Resolved"},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:140,columnNumber:17},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:136,columnNumber:15},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:135,columnNumber:13},this),e.jsxDEV("tbody",{children:s.by_type.map(a=>e.jsxDEV("tr",{className:"border-b border-surface-border last:border-b-0",children:[e.jsxDEV("td",{className:"py-3 text-sm font-mono text-text-primary",children:e.jsxDEV("button",{onClick:()=>r({type:a.type}),className:"hover:text-accent hover:underline",children:a.type},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:147,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:146,columnNumber:19},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(i,{value:a.pending,colorClass:"text-status-pending",onClick:()=>r({type:a.type})},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:155,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:154,columnNumber:19},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(i,{value:a.claimed,colorClass:"text-status-active",onClick:()=>r({type:a.type})},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:162,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:161,columnNumber:19},this),e.jsxDEV("td",{className:"py-3 text-sm text-right",children:e.jsxDEV(i,{value:a.resolved,colorClass:"text-status-success",onClick:()=>r({type:a.type})},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:169,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:168,columnNumber:19},this)]},a.type,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:145,columnNumber:17},this))},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:143,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:134,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:133,columnNumber:9},this),s&&s.by_role.length===0&&s.by_type.length===0&&e.jsxDEV("div",{className:"py-16 text-center",children:e.jsxDEV("p",{className:"text-sm text-text-tertiary",children:["No escalation activity in the last ",l]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:185,columnNumber:11},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:184,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/operator/EscalationsOverview.tsx",lineNumber:60,columnNumber:5},this)}export{w as EscalationsOverview};
2
+ //# sourceMappingURL=EscalationsOverview-Bt6gGFW4.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EscalationsOverview-DPNd1vjF.js","sources":["../../src/pages/operator/EscalationsOverview.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useEscalationStats } from '../../api/escalations';\nimport { useEscalationStatsEvents } from '../../hooks/useEventHooks';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { StatCard } from '../../components/common/data/StatCard';\n\n// ── Duration filter ──────────────────────────────────────────────────────────\n\nconst DURATIONS = [\n { label: '1h', value: '1h' },\n { label: '24h', value: '24h' },\n { label: '7d', value: '7d' },\n { label: '30d', value: '30d' },\n] as const;\n\ntype DurationValue = (typeof DURATIONS)[number]['value'];\n\n// ── Clickable stat cell ──────────────────────────────────────────────────────\n\nfunction StatCell({\n value,\n colorClass,\n onClick,\n}: {\n value: number;\n colorClass: string;\n onClick: () => void;\n}) {\n if (value === 0) {\n return <span className=\"text-text-tertiary\">0</span>;\n }\n return (\n <button\n onClick={onClick}\n className={`${colorClass} hover:underline tabular-nums font-medium`}\n >\n {value}\n </button>\n );\n}\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function EscalationsOverview() {\n useEscalationStatsEvents();\n const navigate = useNavigate();\n const [duration, setDuration] = useState<DurationValue>('24h');\n\n const { data: stats } = useEscalationStats(duration);\n\n const goToList = (params?: Record<string, string>) => {\n const qs = new URLSearchParams(params).toString();\n navigate(`/escalations/available${qs ? `?${qs}` : ''}`);\n };\n\n const thCls = 'pb-2 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary';\n\n return (\n <div>\n <PageHeader title=\"Escalations\" docsHash=\"#docs:dashboard.md:escalations-overview\" />\n\n {/* Duration tabs */}\n <div className=\"flex items-center gap-1 mb-6\">\n {DURATIONS.map((d) => (\n <button\n key={d.value}\n onClick={() => setDuration(d.value)}\n className={`px-3 py-1 text-xs rounded-full transition-colors ${\n duration === d.value\n ? 'bg-accent text-text-inverse'\n : 'text-text-tertiary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n {d.label}\n </button>\n ))}\n </div>\n\n {/* Summary cards */}\n <div className=\"grid grid-cols-4 gap-4 mb-8\">\n <StatCard label=\"Open\" value={stats?.pending ?? '—'} colorClass=\"text-status-pending\" onClick={() => goToList()} />\n <StatCard label=\"Claimed\" value={stats?.claimed ?? '—'} colorClass=\"text-status-active\" onClick={() => goToList()} />\n <StatCard label=\"Created\" value={stats?.created ?? '—'} onClick={() => goToList()} />\n <StatCard label=\"Resolved\" value={stats?.resolved ?? '—'} colorClass=\"text-status-success\" onClick={() => goToList()} />\n </div>\n\n {/* By-role table */}\n {(stats?.by_role?.length ?? 0) > 0 && (\n <div className=\"mb-8\">\n <table className=\"w-full text-left\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Role</th>\n <th className={`${thCls} text-right w-24`}>Pending</th>\n <th className={`${thCls} text-right w-24`}>Claimed</th>\n </tr>\n </thead>\n <tbody>\n {stats!.by_role.map((row) => (\n <tr key={row.role} className=\"border-b border-surface-border last:border-b-0\">\n <td className=\"py-3 text-sm font-mono text-text-primary\">\n <button\n onClick={() => goToList({ role: row.role })}\n className=\"hover:text-accent hover:underline\"\n >\n {row.role}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.pending}\n colorClass=\"text-status-pending\"\n onClick={() => goToList({ role: row.role })}\n />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.claimed}\n colorClass=\"text-status-active\"\n onClick={() => goToList({ role: row.role })}\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n\n {/* By-type table */}\n {(stats?.by_type?.length ?? 0) > 0 && (\n <div>\n <table className=\"w-full text-left\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Type</th>\n <th className={`${thCls} text-right w-24`}>Pending</th>\n <th className={`${thCls} text-right w-24`}>Claimed</th>\n <th className={`${thCls} text-right w-24`}>Resolved</th>\n </tr>\n </thead>\n <tbody>\n {stats!.by_type.map((row) => (\n <tr key={row.type} className=\"border-b border-surface-border last:border-b-0\">\n <td className=\"py-3 text-sm font-mono text-text-primary\">\n <button\n onClick={() => goToList({ type: row.type })}\n className=\"hover:text-accent hover:underline\"\n >\n {row.type}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.pending}\n colorClass=\"text-status-pending\"\n onClick={() => goToList({ type: row.type })}\n />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.claimed}\n colorClass=\"text-status-active\"\n onClick={() => goToList({ type: row.type })}\n />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.resolved}\n colorClass=\"text-status-success\"\n onClick={() => goToList({ type: row.type })}\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n\n {/* Empty state */}\n {stats && stats.by_role.length === 0 && stats.by_type.length === 0 && (\n <div className=\"py-16 text-center\">\n <p className=\"text-sm text-text-tertiary\">\n No escalation activity in the last {duration}\n </p>\n </div>\n )}\n </div>\n );\n}\n"],"names":["DURATIONS","StatCell","value","colorClass","onClick","jsx","EscalationsOverview","useEscalationStatsEvents","navigate","useNavigate","duration","setDuration","useState","stats","useEscalationStats","goToList","params","qs","thCls","PageHeader","d","jsxs","StatCard","_a","row","_b"],"mappings":"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"}
1
+ {"version":3,"file":"EscalationsOverview-Bt6gGFW4.js","sources":["../../src/pages/operator/EscalationsOverview.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { useEscalationStats } from '../../api/escalations';\nimport { useEscalationStatsEvents } from '../../hooks/useEventHooks';\nimport { PageHeader } from '../../components/common/layout/PageHeader';\nimport { StatCard } from '../../components/common/data/StatCard';\n\n// ── Duration filter ──────────────────────────────────────────────────────────\n\nconst DURATIONS = [\n { label: '1h', value: '1h' },\n { label: '24h', value: '24h' },\n { label: '7d', value: '7d' },\n { label: '30d', value: '30d' },\n] as const;\n\ntype DurationValue = (typeof DURATIONS)[number]['value'];\n\n// ── Clickable stat cell ──────────────────────────────────────────────────────\n\nfunction StatCell({\n value,\n colorClass,\n onClick,\n}: {\n value: number;\n colorClass: string;\n onClick: () => void;\n}) {\n if (value === 0) {\n return <span className=\"text-text-tertiary\">0</span>;\n }\n return (\n <button\n onClick={onClick}\n className={`${colorClass} hover:underline tabular-nums font-medium`}\n >\n {value}\n </button>\n );\n}\n\n// ── Page ─────────────────────────────────────────────────────────────────────\n\nexport function EscalationsOverview() {\n useEscalationStatsEvents();\n const navigate = useNavigate();\n const [duration, setDuration] = useState<DurationValue>('24h');\n\n const { data: stats } = useEscalationStats(duration);\n\n const goToList = (params?: Record<string, string>) => {\n const qs = new URLSearchParams(params).toString();\n navigate(`/escalations/available${qs ? `?${qs}` : ''}`);\n };\n\n const thCls = 'pb-2 text-[10px] font-semibold uppercase tracking-widest text-text-tertiary';\n\n return (\n <div>\n <PageHeader title=\"Escalations\" docsHash=\"#docs:dashboard.md:escalations-overview\" />\n\n {/* Duration tabs */}\n <div className=\"flex items-center gap-1 mb-6\">\n {DURATIONS.map((d) => (\n <button\n key={d.value}\n onClick={() => setDuration(d.value)}\n className={`px-3 py-1 text-xs rounded-full transition-colors ${\n duration === d.value\n ? 'bg-accent text-text-inverse'\n : 'text-text-tertiary hover:text-text-primary hover:bg-surface-hover'\n }`}\n >\n {d.label}\n </button>\n ))}\n </div>\n\n {/* Summary cards */}\n <div className=\"grid grid-cols-4 gap-4 mb-8\">\n <StatCard label=\"Open\" value={stats?.pending ?? '—'} colorClass=\"text-status-pending\" onClick={() => goToList()} />\n <StatCard label=\"Claimed\" value={stats?.claimed ?? '—'} colorClass=\"text-status-active\" onClick={() => goToList()} />\n <StatCard label=\"Created\" value={stats?.created ?? '—'} onClick={() => goToList()} />\n <StatCard label=\"Resolved\" value={stats?.resolved ?? '—'} colorClass=\"text-status-success\" onClick={() => goToList()} />\n </div>\n\n {/* By-role table */}\n {(stats?.by_role?.length ?? 0) > 0 && (\n <div className=\"mb-8\">\n <table className=\"w-full text-left\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Role</th>\n <th className={`${thCls} text-right w-24`}>Pending</th>\n <th className={`${thCls} text-right w-24`}>Claimed</th>\n </tr>\n </thead>\n <tbody>\n {stats!.by_role.map((row) => (\n <tr key={row.role} className=\"border-b border-surface-border last:border-b-0\">\n <td className=\"py-3 text-sm font-mono text-text-primary\">\n <button\n onClick={() => goToList({ role: row.role })}\n className=\"hover:text-accent hover:underline\"\n >\n {row.role}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.pending}\n colorClass=\"text-status-pending\"\n onClick={() => goToList({ role: row.role })}\n />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.claimed}\n colorClass=\"text-status-active\"\n onClick={() => goToList({ role: row.role })}\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n\n {/* By-type table */}\n {(stats?.by_type?.length ?? 0) > 0 && (\n <div>\n <table className=\"w-full text-left\">\n <thead>\n <tr className=\"border-b border-surface-border\">\n <th className={thCls}>Type</th>\n <th className={`${thCls} text-right w-24`}>Pending</th>\n <th className={`${thCls} text-right w-24`}>Claimed</th>\n <th className={`${thCls} text-right w-24`}>Resolved</th>\n </tr>\n </thead>\n <tbody>\n {stats!.by_type.map((row) => (\n <tr key={row.type} className=\"border-b border-surface-border last:border-b-0\">\n <td className=\"py-3 text-sm font-mono text-text-primary\">\n <button\n onClick={() => goToList({ type: row.type })}\n className=\"hover:text-accent hover:underline\"\n >\n {row.type}\n </button>\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.pending}\n colorClass=\"text-status-pending\"\n onClick={() => goToList({ type: row.type })}\n />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.claimed}\n colorClass=\"text-status-active\"\n onClick={() => goToList({ type: row.type })}\n />\n </td>\n <td className=\"py-3 text-sm text-right\">\n <StatCell\n value={row.resolved}\n colorClass=\"text-status-success\"\n onClick={() => goToList({ type: row.type })}\n />\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n\n {/* Empty state */}\n {stats && stats.by_role.length === 0 && stats.by_type.length === 0 && (\n <div className=\"py-16 text-center\">\n <p className=\"text-sm text-text-tertiary\">\n No escalation activity in the last {duration}\n </p>\n </div>\n )}\n </div>\n );\n}\n"],"names":["DURATIONS","StatCell","value","colorClass","onClick","jsxDEV","EscalationsOverview","useEscalationStatsEvents","navigate","useNavigate","duration","setDuration","useState","stats","useEscalationStats","goToList","params","qs","thCls","PageHeader","d","StatCard","_a","row","_b"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{a as u}from"./vendor-query-DLp59M9_.js";import{j as t,f as j,C as V}from"./index-Da8R5Fn_.js";import{F as C,b as h}from"./FilterBar-CZGTOMoo.js";import{E as $}from"./SwimlaneTimeline-BA4aFrHf.js";const N="lt-collapsed-sections";function F(r){try{const a=localStorage.getItem(`${N}:${r}`);return a?new Set(JSON.parse(a)):new Set}catch{return new Set}}function O(r,a){localStorage.setItem(`${N}:${r}`,JSON.stringify([...a]))}function B(r){const[a,n]=u.useState(()=>F(r)),f=u.useCallback(i=>a.has(i),[a]),d=u.useCallback(i=>{n(m=>{const c=new Set(m);return c.has(i)?c.delete(i):c.add(i),O(r,c),c})},[r]);return{isCollapsed:f,toggle:d}}const P=new Set(["activity_task_scheduled","timer_started","child_workflow_execution_started","signal_wait_started"]),A=new Set(["activity_task_completed","activity_task_failed","timer_fired","child_workflow_execution_completed","child_workflow_execution_failed","workflow_execution_signaled"]);function L(r){const a=new Set;for(const n of r)A.has(n.event_type)&&n.attributes.timeline_key&&a.add(n.attributes.timeline_key);return a}function G({events:r,childTasks:a}){const[n,f]=u.useState(""),[d,i]=u.useState(""),[m,c]=u.useState("asc"),[b,p]=u.useState(new Set),v=[...new Set(r.map(e=>e.category))].sort(),g=[...new Set(r.map(e=>e.event_type))].sort(),k=L(r),E=e=>{if(e.duration_ms!==null||!P.has(e.event_type))return!1;const s=e.attributes.timeline_key;return!(s&&k.has(s))};let o=r;n&&(o=o.filter(e=>e.category===n)),d&&(o=o.filter(e=>e.event_type===d)),o=[...o].sort((e,s)=>m==="asc"?e.event_id-s.event_id:s.event_id-e.event_id);const _=e=>{switch(e){case"activity":return"bg-blue-500";case"signal":return"bg-emerald-500";case"timer":return"bg-status-warning";case"child_workflow":return"bg-violet-500";default:return"bg-text-tertiary"}},y=e=>{const s=e.event_type;if(e.attributes.activity_type)return`${s} — ${e.attributes.activity_type}`;if(e.attributes.signal_name)return`${s} — ${e.attributes.signal_name}`;if(e.attributes.child_workflow_id){const l=e.attributes.child_workflow_id,S=l.length>24?`${l.slice(0,24)}...`:l;return`${s} — ${S}`}return s},T=e=>{if(!(a!=null&&a.length))return;const s=e.attributes.activity_type;if(s)return a.find(l=>l.workflow_type===s)},w=e=>{p(s=>{const l=new Set(s);return l.has(e)?l.delete(e):l.add(e),l})},x=o.length>0&&o.every(e=>b.has(e.event_id)),D=()=>{p(x?new Set:new Set(o.map(e=>e.event_id)))};return t.jsxDEV("div",{children:[t.jsxDEV("div",{className:"px-6 py-4 border-b border-surface-border flex items-center justify-between flex-wrap gap-3",children:[t.jsxDEV("div",{className:"flex items-center gap-4",children:[t.jsxDEV("p",{className:"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary",children:["Events (",o.length,")"]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:135,columnNumber:11},this),o.length>0&&t.jsxDEV("button",{onClick:D,className:"text-[10px] text-accent hover:underline",children:x?"Collapse all":"Expand all"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:139,columnNumber:13},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:134,columnNumber:9},this),t.jsxDEV(C,{children:[t.jsxDEV(h,{label:"Category",value:n,onChange:f,options:v.map(e=>({value:e,label:e}))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:145,columnNumber:11},this),t.jsxDEV(h,{label:"Type",value:d,onChange:i,options:g.map(e=>({value:e,label:e}))},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:151,columnNumber:11},this),t.jsxDEV("button",{onClick:()=>c(e=>e==="asc"?"desc":"asc"),className:"btn-ghost text-xs",children:m==="asc"?"Oldest first":"Newest first"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:157,columnNumber:11},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:144,columnNumber:9},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:133,columnNumber:7},this),t.jsxDEV("div",{children:o.length===0?t.jsxDEV("div",{className:"px-6 py-8 text-center",children:t.jsxDEV("p",{className:"text-sm text-text-tertiary",children:"No events match the current filters"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:169,columnNumber:13},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:168,columnNumber:11},this):o.map(e=>{const s=b.has(e.event_id),l=E(e);return t.jsxDEV("div",{className:"border-b border-surface-border last:border-b-0",children:[t.jsxDEV("div",{className:"px-6 py-3 flex items-center gap-4 cursor-pointer hover:bg-surface-hover transition-colors duration-200",onClick:()=>w(e.event_id),children:[t.jsxDEV("span",{className:`text-[10px] text-text-tertiary transition-transform duration-300 ${s?"rotate-90":""}`,children:"▶"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:187,columnNumber:19},this),t.jsxDEV("span",{className:"text-xs font-mono text-text-tertiary w-8 shrink-0",children:e.event_id},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:193,columnNumber:19},this),t.jsxDEV("span",{className:`w-2 h-2 rounded-full shrink-0 ${_(e.category)}`},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:196,columnNumber:19},this),t.jsxDEV("span",{className:"text-sm text-text-primary flex-1 truncate",children:y(e)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:199,columnNumber:19},this),t.jsxDEV("span",{className:"text-xs font-mono text-text-tertiary shrink-0",children:l?t.jsxDEV("span",{className:"inline-flex items-center gap-1 text-status-warning",children:[t.jsxDEV("span",{className:"w-1.5 h-1.5 rounded-full bg-status-warning animate-pulse"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:205,columnNumber:25},this),"Pending"]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:204,columnNumber:23},this):e.duration_ms!==null?j(e.duration_ms):"--"},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:202,columnNumber:19},this),t.jsxDEV("time",{className:"text-[10px] font-mono text-text-tertiary shrink-0",children:new Date(e.event_time).toLocaleTimeString()},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:214,columnNumber:19},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:182,columnNumber:17},this),t.jsxDEV(V,{open:s&&!!e.attributes,children:t.jsxDEV("div",{className:"px-6 pb-4 pl-16",children:t.jsxDEV($,{event:e,childTask:T(e),pending:l,onClose:()=>w(e.event_id)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:222,columnNumber:21},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:221,columnNumber:19},this)},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:220,columnNumber:17},this)]},e.event_id,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:177,columnNumber:15},this)})},void 0,!1,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:166,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/pages/workflows/workflow-execution/EventTable.tsx",lineNumber:132,columnNumber:5},this)}export{G as E,B as u};
2
+ //# sourceMappingURL=EventTable-BMk93q8A.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EventTable-BoP8KC3M.js","sources":["../../src/hooks/useCollapsedSections.ts","../../src/pages/workflows/workflow-execution/EventTable.tsx"],"sourcesContent":["import { useState, useCallback } from 'react';\n\nconst STORAGE_KEY = 'lt-collapsed-sections';\n\nfunction load(pageKey: string): Set<string> {\n try {\n const raw = localStorage.getItem(`${STORAGE_KEY}:${pageKey}`);\n if (!raw) return new Set();\n return new Set(JSON.parse(raw));\n } catch {\n return new Set();\n }\n}\n\nfunction save(pageKey: string, set: Set<string>) {\n localStorage.setItem(`${STORAGE_KEY}:${pageKey}`, JSON.stringify([...set]));\n}\n\nexport function useCollapsedSections(pageKey: string) {\n const [collapsed, setCollapsed] = useState<Set<string>>(() => load(pageKey));\n\n const isCollapsed = useCallback(\n (section: string) => collapsed.has(section),\n [collapsed],\n );\n\n const toggle = useCallback(\n (section: string) => {\n setCollapsed((prev) => {\n const next = new Set(prev);\n if (next.has(section)) {\n next.delete(section);\n } else {\n next.add(section);\n }\n save(pageKey, next);\n return next;\n });\n },\n [pageKey],\n );\n\n return { isCollapsed, toggle };\n}\n","import { useState } from 'react';\nimport { FilterBar, FilterSelect } from '../../../components/common/data/FilterBar';\nimport { Collapsible } from '../../../components/common/layout/Collapsible';\nimport type { WorkflowExecutionEvent, LTTaskRecord } from '../../../api/types';\nimport { EventDetailPanel } from './EventDetailPanel';\nimport { formatDuration } from './utils';\n\ninterface EventTableProps {\n events: WorkflowExecutionEvent[];\n childTasks?: LTTaskRecord[];\n}\n\n/** Event types that represent the \"start\" phase of a paired operation */\nconst STARTED_TYPES = new Set([\n 'activity_task_scheduled',\n 'timer_started',\n 'child_workflow_execution_started',\n 'signal_wait_started',\n]);\n\n/** Completion event types that close a paired operation */\nconst COMPLETED_TYPES = new Set([\n 'activity_task_completed',\n 'activity_task_failed',\n 'timer_fired',\n 'child_workflow_execution_completed',\n 'child_workflow_execution_failed',\n 'workflow_execution_signaled',\n]);\n\n/**\n * Build a set of timeline_keys that have a matching completion event.\n * A \"scheduled\" event is only truly pending if no completion exists.\n */\nfunction buildCompletedKeys(events: WorkflowExecutionEvent[]): Set<string> {\n const keys = new Set<string>();\n for (const e of events) {\n if (COMPLETED_TYPES.has(e.event_type) && e.attributes.timeline_key) {\n keys.add(e.attributes.timeline_key);\n }\n }\n return keys;\n}\n\nexport function EventTable({ events, childTasks }: EventTableProps) {\n const [categoryFilter, setCategoryFilter] = useState('');\n const [typeFilter, setTypeFilter] = useState('');\n const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('asc');\n const [expandedEvents, setExpandedEvents] = useState<Set<number>>(new Set());\n\n const categories = [...new Set(events.map((e) => e.category))].sort();\n const eventTypes = [...new Set(events.map((e) => e.event_type))].sort();\n const completedKeys = buildCompletedKeys(events);\n\n /** True only when a \"started/scheduled\" event has no matching completion */\n const isPending = (evt: WorkflowExecutionEvent): boolean => {\n if (evt.duration_ms !== null) return false;\n if (!STARTED_TYPES.has(evt.event_type)) return false;\n const tlk = evt.attributes.timeline_key;\n if (tlk && completedKeys.has(tlk)) return false;\n return true;\n };\n\n let filtered = events;\n if (categoryFilter) filtered = filtered.filter((e) => e.category === categoryFilter);\n if (typeFilter) filtered = filtered.filter((e) => e.event_type === typeFilter);\n\n filtered = [...filtered].sort((a, b) =>\n sortOrder === 'asc' ? a.event_id - b.event_id : b.event_id - a.event_id,\n );\n\n const categoryDot = (category: string) => {\n switch (category) {\n case 'activity':\n return 'bg-blue-500';\n case 'signal':\n return 'bg-emerald-500';\n case 'timer':\n return 'bg-status-warning';\n case 'child_workflow':\n return 'bg-violet-500';\n default:\n return 'bg-text-tertiary';\n }\n };\n\n /** Build a descriptive label for an event row */\n const eventLabel = (evt: WorkflowExecutionEvent): string => {\n const base = evt.event_type;\n if (evt.attributes.activity_type) {\n return `${base} — ${evt.attributes.activity_type}`;\n }\n if (evt.attributes.signal_name) {\n return `${base} — ${evt.attributes.signal_name}`;\n }\n if (evt.attributes.child_workflow_id) {\n const id = evt.attributes.child_workflow_id;\n const truncated = id.length > 24 ? `${id.slice(0, 24)}...` : id;\n return `${base} — ${truncated}`;\n }\n return base;\n };\n\n /** Find a matching child task for an event's activity_type */\n const findChildTask = (evt: WorkflowExecutionEvent): LTTaskRecord | undefined => {\n if (!childTasks?.length) return undefined;\n const activityType = evt.attributes.activity_type;\n if (!activityType) return undefined;\n return childTasks.find((t) => t.workflow_type === activityType);\n };\n\n const toggleEvent = (id: number) => {\n setExpandedEvents((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n const allExpanded = filtered.length > 0 && filtered.every((e) => expandedEvents.has(e.event_id));\n\n const toggleAll = () => {\n if (allExpanded) {\n setExpandedEvents(new Set());\n } else {\n setExpandedEvents(new Set(filtered.map((e) => e.event_id)));\n }\n };\n\n return (\n <div>\n <div className=\"px-6 py-4 border-b border-surface-border flex items-center justify-between flex-wrap gap-3\">\n <div className=\"flex items-center gap-4\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Events ({filtered.length})\n </p>\n {filtered.length > 0 && (\n <button onClick={toggleAll} className=\"text-[10px] text-accent hover:underline\">\n {allExpanded ? 'Collapse all' : 'Expand all'}\n </button>\n )}\n </div>\n <FilterBar>\n <FilterSelect\n label=\"Category\"\n value={categoryFilter}\n onChange={setCategoryFilter}\n options={categories.map((c) => ({ value: c, label: c }))}\n />\n <FilterSelect\n label=\"Type\"\n value={typeFilter}\n onChange={setTypeFilter}\n options={eventTypes.map((t) => ({ value: t, label: t }))}\n />\n <button\n onClick={() => setSortOrder((s) => (s === 'asc' ? 'desc' : 'asc'))}\n className=\"btn-ghost text-xs\"\n >\n {sortOrder === 'asc' ? 'Oldest first' : 'Newest first'}\n </button>\n </FilterBar>\n </div>\n\n <div>\n {filtered.length === 0 ? (\n <div className=\"px-6 py-8 text-center\">\n <p className=\"text-sm text-text-tertiary\">No events match the current filters</p>\n </div>\n ) : (\n filtered.map((evt) => {\n const isExpanded = expandedEvents.has(evt.event_id);\n const pending = isPending(evt);\n\n return (\n <div\n key={evt.event_id}\n className=\"border-b border-surface-border last:border-b-0\"\n >\n {/* Row header */}\n <div\n className=\"px-6 py-3 flex items-center gap-4 cursor-pointer hover:bg-surface-hover transition-colors duration-200\"\n onClick={() => toggleEvent(evt.event_id)}\n >\n {/* Expand chevron */}\n <span\n className={`text-[10px] text-text-tertiary transition-transform duration-300 ${isExpanded ? 'rotate-90' : ''}`}\n >\n &#9654;\n </span>\n\n <span className=\"text-xs font-mono text-text-tertiary w-8 shrink-0\">\n {evt.event_id}\n </span>\n <span\n className={`w-2 h-2 rounded-full shrink-0 ${categoryDot(evt.category)}`}\n />\n <span className=\"text-sm text-text-primary flex-1 truncate\">\n {eventLabel(evt)}\n </span>\n <span className=\"text-xs font-mono text-text-tertiary shrink-0\">\n {pending ? (\n <span className=\"inline-flex items-center gap-1 text-status-warning\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-status-warning animate-pulse\" />\n Pending\n </span>\n ) : evt.duration_ms !== null ? (\n formatDuration(evt.duration_ms)\n ) : (\n '--'\n )}\n </span>\n <time className=\"text-[10px] font-mono text-text-tertiary shrink-0\">\n {new Date(evt.event_time).toLocaleTimeString()}\n </time>\n </div>\n\n {/* Inline detail panel — directly below the clicked row */}\n <Collapsible open={isExpanded && !!evt.attributes}>\n <div className=\"px-6 pb-4 pl-16\">\n <EventDetailPanel\n event={evt}\n childTask={findChildTask(evt)}\n pending={pending}\n onClose={() => toggleEvent(evt.event_id)}\n />\n </div>\n </Collapsible>\n </div>\n );\n })\n )}\n </div>\n </div>\n );\n}\n"],"names":["STORAGE_KEY","load","pageKey","raw","save","set","useCollapsedSections","collapsed","setCollapsed","useState","isCollapsed","useCallback","section","toggle","prev","next","STARTED_TYPES","COMPLETED_TYPES","buildCompletedKeys","events","keys","e","EventTable","childTasks","categoryFilter","setCategoryFilter","typeFilter","setTypeFilter","sortOrder","setSortOrder","expandedEvents","setExpandedEvents","categories","eventTypes","completedKeys","isPending","evt","tlk","filtered","a","b","categoryDot","category","eventLabel","base","id","truncated","findChildTask","activityType","t","toggleEvent","allExpanded","toggleAll","jsxs","jsx","FilterBar","FilterSelect","c","s","isExpanded","pending","formatDuration","Collapsible","EventDetailPanel"],"mappings":"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"}
1
+ {"version":3,"file":"EventTable-BMk93q8A.js","sources":["../../src/hooks/useCollapsedSections.ts","../../src/pages/workflows/workflow-execution/EventTable.tsx"],"sourcesContent":["import { useState, useCallback } from 'react';\n\nconst STORAGE_KEY = 'lt-collapsed-sections';\n\nfunction load(pageKey: string): Set<string> {\n try {\n const raw = localStorage.getItem(`${STORAGE_KEY}:${pageKey}`);\n if (!raw) return new Set();\n return new Set(JSON.parse(raw));\n } catch {\n return new Set();\n }\n}\n\nfunction save(pageKey: string, set: Set<string>) {\n localStorage.setItem(`${STORAGE_KEY}:${pageKey}`, JSON.stringify([...set]));\n}\n\nexport function useCollapsedSections(pageKey: string) {\n const [collapsed, setCollapsed] = useState<Set<string>>(() => load(pageKey));\n\n const isCollapsed = useCallback(\n (section: string) => collapsed.has(section),\n [collapsed],\n );\n\n const toggle = useCallback(\n (section: string) => {\n setCollapsed((prev) => {\n const next = new Set(prev);\n if (next.has(section)) {\n next.delete(section);\n } else {\n next.add(section);\n }\n save(pageKey, next);\n return next;\n });\n },\n [pageKey],\n );\n\n return { isCollapsed, toggle };\n}\n","import { useState } from 'react';\nimport { FilterBar, FilterSelect } from '../../../components/common/data/FilterBar';\nimport { Collapsible } from '../../../components/common/layout/Collapsible';\nimport type { WorkflowExecutionEvent, LTTaskRecord } from '../../../api/types';\nimport { EventDetailPanel } from './EventDetailPanel';\nimport { formatDuration } from './utils';\n\ninterface EventTableProps {\n events: WorkflowExecutionEvent[];\n childTasks?: LTTaskRecord[];\n}\n\n/** Event types that represent the \"start\" phase of a paired operation */\nconst STARTED_TYPES = new Set([\n 'activity_task_scheduled',\n 'timer_started',\n 'child_workflow_execution_started',\n 'signal_wait_started',\n]);\n\n/** Completion event types that close a paired operation */\nconst COMPLETED_TYPES = new Set([\n 'activity_task_completed',\n 'activity_task_failed',\n 'timer_fired',\n 'child_workflow_execution_completed',\n 'child_workflow_execution_failed',\n 'workflow_execution_signaled',\n]);\n\n/**\n * Build a set of timeline_keys that have a matching completion event.\n * A \"scheduled\" event is only truly pending if no completion exists.\n */\nfunction buildCompletedKeys(events: WorkflowExecutionEvent[]): Set<string> {\n const keys = new Set<string>();\n for (const e of events) {\n if (COMPLETED_TYPES.has(e.event_type) && e.attributes.timeline_key) {\n keys.add(e.attributes.timeline_key);\n }\n }\n return keys;\n}\n\nexport function EventTable({ events, childTasks }: EventTableProps) {\n const [categoryFilter, setCategoryFilter] = useState('');\n const [typeFilter, setTypeFilter] = useState('');\n const [sortOrder, setSortOrder] = useState<'asc' | 'desc'>('asc');\n const [expandedEvents, setExpandedEvents] = useState<Set<number>>(new Set());\n\n const categories = [...new Set(events.map((e) => e.category))].sort();\n const eventTypes = [...new Set(events.map((e) => e.event_type))].sort();\n const completedKeys = buildCompletedKeys(events);\n\n /** True only when a \"started/scheduled\" event has no matching completion */\n const isPending = (evt: WorkflowExecutionEvent): boolean => {\n if (evt.duration_ms !== null) return false;\n if (!STARTED_TYPES.has(evt.event_type)) return false;\n const tlk = evt.attributes.timeline_key;\n if (tlk && completedKeys.has(tlk)) return false;\n return true;\n };\n\n let filtered = events;\n if (categoryFilter) filtered = filtered.filter((e) => e.category === categoryFilter);\n if (typeFilter) filtered = filtered.filter((e) => e.event_type === typeFilter);\n\n filtered = [...filtered].sort((a, b) =>\n sortOrder === 'asc' ? a.event_id - b.event_id : b.event_id - a.event_id,\n );\n\n const categoryDot = (category: string) => {\n switch (category) {\n case 'activity':\n return 'bg-blue-500';\n case 'signal':\n return 'bg-emerald-500';\n case 'timer':\n return 'bg-status-warning';\n case 'child_workflow':\n return 'bg-violet-500';\n default:\n return 'bg-text-tertiary';\n }\n };\n\n /** Build a descriptive label for an event row */\n const eventLabel = (evt: WorkflowExecutionEvent): string => {\n const base = evt.event_type;\n if (evt.attributes.activity_type) {\n return `${base} — ${evt.attributes.activity_type}`;\n }\n if (evt.attributes.signal_name) {\n return `${base} — ${evt.attributes.signal_name}`;\n }\n if (evt.attributes.child_workflow_id) {\n const id = evt.attributes.child_workflow_id;\n const truncated = id.length > 24 ? `${id.slice(0, 24)}...` : id;\n return `${base} — ${truncated}`;\n }\n return base;\n };\n\n /** Find a matching child task for an event's activity_type */\n const findChildTask = (evt: WorkflowExecutionEvent): LTTaskRecord | undefined => {\n if (!childTasks?.length) return undefined;\n const activityType = evt.attributes.activity_type;\n if (!activityType) return undefined;\n return childTasks.find((t) => t.workflow_type === activityType);\n };\n\n const toggleEvent = (id: number) => {\n setExpandedEvents((prev) => {\n const next = new Set(prev);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n };\n\n const allExpanded = filtered.length > 0 && filtered.every((e) => expandedEvents.has(e.event_id));\n\n const toggleAll = () => {\n if (allExpanded) {\n setExpandedEvents(new Set());\n } else {\n setExpandedEvents(new Set(filtered.map((e) => e.event_id)));\n }\n };\n\n return (\n <div>\n <div className=\"px-6 py-4 border-b border-surface-border flex items-center justify-between flex-wrap gap-3\">\n <div className=\"flex items-center gap-4\">\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-text-tertiary\">\n Events ({filtered.length})\n </p>\n {filtered.length > 0 && (\n <button onClick={toggleAll} className=\"text-[10px] text-accent hover:underline\">\n {allExpanded ? 'Collapse all' : 'Expand all'}\n </button>\n )}\n </div>\n <FilterBar>\n <FilterSelect\n label=\"Category\"\n value={categoryFilter}\n onChange={setCategoryFilter}\n options={categories.map((c) => ({ value: c, label: c }))}\n />\n <FilterSelect\n label=\"Type\"\n value={typeFilter}\n onChange={setTypeFilter}\n options={eventTypes.map((t) => ({ value: t, label: t }))}\n />\n <button\n onClick={() => setSortOrder((s) => (s === 'asc' ? 'desc' : 'asc'))}\n className=\"btn-ghost text-xs\"\n >\n {sortOrder === 'asc' ? 'Oldest first' : 'Newest first'}\n </button>\n </FilterBar>\n </div>\n\n <div>\n {filtered.length === 0 ? (\n <div className=\"px-6 py-8 text-center\">\n <p className=\"text-sm text-text-tertiary\">No events match the current filters</p>\n </div>\n ) : (\n filtered.map((evt) => {\n const isExpanded = expandedEvents.has(evt.event_id);\n const pending = isPending(evt);\n\n return (\n <div\n key={evt.event_id}\n className=\"border-b border-surface-border last:border-b-0\"\n >\n {/* Row header */}\n <div\n className=\"px-6 py-3 flex items-center gap-4 cursor-pointer hover:bg-surface-hover transition-colors duration-200\"\n onClick={() => toggleEvent(evt.event_id)}\n >\n {/* Expand chevron */}\n <span\n className={`text-[10px] text-text-tertiary transition-transform duration-300 ${isExpanded ? 'rotate-90' : ''}`}\n >\n &#9654;\n </span>\n\n <span className=\"text-xs font-mono text-text-tertiary w-8 shrink-0\">\n {evt.event_id}\n </span>\n <span\n className={`w-2 h-2 rounded-full shrink-0 ${categoryDot(evt.category)}`}\n />\n <span className=\"text-sm text-text-primary flex-1 truncate\">\n {eventLabel(evt)}\n </span>\n <span className=\"text-xs font-mono text-text-tertiary shrink-0\">\n {pending ? (\n <span className=\"inline-flex items-center gap-1 text-status-warning\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-status-warning animate-pulse\" />\n Pending\n </span>\n ) : evt.duration_ms !== null ? (\n formatDuration(evt.duration_ms)\n ) : (\n '--'\n )}\n </span>\n <time className=\"text-[10px] font-mono text-text-tertiary shrink-0\">\n {new Date(evt.event_time).toLocaleTimeString()}\n </time>\n </div>\n\n {/* Inline detail panel — directly below the clicked row */}\n <Collapsible open={isExpanded && !!evt.attributes}>\n <div className=\"px-6 pb-4 pl-16\">\n <EventDetailPanel\n event={evt}\n childTask={findChildTask(evt)}\n pending={pending}\n onClose={() => toggleEvent(evt.event_id)}\n />\n </div>\n </Collapsible>\n </div>\n );\n })\n )}\n </div>\n </div>\n );\n}\n"],"names":["STORAGE_KEY","load","pageKey","raw","save","set","useCollapsedSections","collapsed","setCollapsed","useState","isCollapsed","useCallback","section","toggle","prev","next","STARTED_TYPES","COMPLETED_TYPES","buildCompletedKeys","events","keys","e","EventTable","childTasks","categoryFilter","setCategoryFilter","typeFilter","setTypeFilter","sortOrder","setSortOrder","expandedEvents","setExpandedEvents","categories","eventTypes","completedKeys","isPending","evt","tlk","filtered","a","b","categoryDot","category","eventLabel","base","id","truncated","findChildTask","activityType","t","toggleEvent","allExpanded","toggleAll","jsxDEV","FilterBar","FilterSelect","c","s","isExpanded","pending","formatDuration","Collapsible","EventDetailPanel"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./index-Da8R5Fn_.js";import{R as i}from"./vendor-icons-1qQ3NKfa.js";const a={task:"text-blue-400",workflow:"text-accent",escalation:"text-amber-400",activity:"text-cyan-400",knowledge:"text-violet-400",agent:"text-emerald-400",app:"text-rose-400",milestone:"text-violet-400"};function c({topic:t}){const o=t.split(".")[0],s=a[o]??"text-text-quaternary",n=t.split(".").slice(-2).join(".");return e.jsxDEV("span",{className:"inline-flex items-center gap-1 text-[11px] font-mono text-text-secondary",children:[e.jsxDEV(i,{className:`w-2.5 h-2.5 shrink-0 ${s}`,strokeWidth:1.5},void 0,!1,{fileName:"/app/dashboard/src/components/common/display/EventTopicPill.tsx",lineNumber:31,columnNumber:7},this),n]},void 0,!0,{fileName:"/app/dashboard/src/components/common/display/EventTopicPill.tsx",lineNumber:30,columnNumber:5},this)}export{c as E};
2
+ //# sourceMappingURL=EventTopicPill-9LcMnLF0.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"EventTopicPill-BUxxvpNg.js","sources":["../../src/components/common/display/EventTopicPill.tsx"],"sourcesContent":["import { Radio } from 'lucide-react';\n\n/**\n * Universal event topic display — Radio icon + monotype text.\n * Used everywhere an event subscription topic is rendered.\n * No border, no background — matches CronLabel's simplicity.\n */\n\nconst CATEGORY_COLORS: Record<string, string> = {\n task: 'text-blue-400',\n workflow: 'text-accent',\n escalation: 'text-amber-400',\n activity: 'text-cyan-400',\n knowledge: 'text-violet-400',\n agent: 'text-emerald-400',\n app: 'text-rose-400',\n milestone: 'text-violet-400',\n};\n\ninterface EventTopicPillProps {\n topic: string;\n}\n\nexport function EventTopicPill({ topic }: EventTopicPillProps) {\n const category = topic.split('.')[0];\n const iconColor = CATEGORY_COLORS[category] ?? 'text-text-quaternary';\n const shortTopic = topic.split('.').slice(-2).join('.');\n\n return (\n <span className=\"inline-flex items-center gap-1 text-[11px] font-mono text-text-secondary\">\n <Radio className={`w-2.5 h-2.5 shrink-0 ${iconColor}`} strokeWidth={1.5} />\n {shortTopic}\n </span>\n );\n}\n"],"names":["CATEGORY_COLORS","EventTopicPill","topic","category","iconColor","shortTopic","jsxs","jsx","Radio"],"mappings":"8FAQA,MAAMA,EAA0C,CAC9C,KAAY,gBACZ,SAAY,cACZ,WAAY,iBACZ,SAAY,gBACZ,UAAY,kBACZ,MAAY,mBACZ,IAAY,gBACZ,UAAY,iBACd,EAMO,SAASC,EAAe,CAAE,MAAAC,GAA8B,CAC7D,MAAMC,EAAWD,EAAM,MAAM,GAAG,EAAE,CAAC,EAC7BE,EAAYJ,EAAgBG,CAAQ,GAAK,uBACzCE,EAAaH,EAAM,MAAM,GAAG,EAAE,MAAM,EAAE,EAAE,KAAK,GAAG,EAEtD,OACEI,EAAAA,KAAC,OAAA,CAAK,UAAU,2EACd,SAAA,CAAAC,MAACC,GAAM,UAAW,wBAAwBJ,CAAS,GAAI,YAAa,IAAK,EACxEC,CAAA,EACH,CAEJ"}
1
+ {"version":3,"file":"EventTopicPill-9LcMnLF0.js","sources":["../../src/components/common/display/EventTopicPill.tsx"],"sourcesContent":["import { Radio } from 'lucide-react';\n\n/**\n * Universal event topic display — Radio icon + monotype text.\n * Used everywhere an event subscription topic is rendered.\n * No border, no background — matches CronLabel's simplicity.\n */\n\nconst CATEGORY_COLORS: Record<string, string> = {\n task: 'text-blue-400',\n workflow: 'text-accent',\n escalation: 'text-amber-400',\n activity: 'text-cyan-400',\n knowledge: 'text-violet-400',\n agent: 'text-emerald-400',\n app: 'text-rose-400',\n milestone: 'text-violet-400',\n};\n\ninterface EventTopicPillProps {\n topic: string;\n}\n\nexport function EventTopicPill({ topic }: EventTopicPillProps) {\n const category = topic.split('.')[0];\n const iconColor = CATEGORY_COLORS[category] ?? 'text-text-quaternary';\n const shortTopic = topic.split('.').slice(-2).join('.');\n\n return (\n <span className=\"inline-flex items-center gap-1 text-[11px] font-mono text-text-secondary\">\n <Radio className={`w-2.5 h-2.5 shrink-0 ${iconColor}`} strokeWidth={1.5} />\n {shortTopic}\n </span>\n );\n}\n"],"names":["CATEGORY_COLORS","EventTopicPill","topic","category","iconColor","shortTopic","jsxDEV","Radio"],"mappings":"uFAQA,MAAMA,EAA0C,CAC9C,KAAY,gBACZ,SAAY,cACZ,WAAY,iBACZ,SAAY,gBACZ,UAAY,kBACZ,MAAY,mBACZ,IAAY,gBACZ,UAAY,iBACd,EAMO,SAASC,EAAe,CAAE,MAAAC,GAA8B,CAC7D,MAAMC,EAAWD,EAAM,MAAM,GAAG,EAAE,CAAC,EAC7BE,EAAYJ,EAAgBG,CAAQ,GAAK,uBACzCE,EAAaH,EAAM,MAAM,GAAG,EAAE,MAAM,EAAE,EAAE,KAAK,GAAG,EAEtD,OACEI,EAAAA,OAAC,OAAA,CAAK,UAAU,2EACd,SAAA,CAAAA,EAAAA,OAACC,GAAM,UAAW,wBAAwBH,CAAS,GAAI,YAAa,KAApE,OAAA,GAAA,CAAA,SAAA,kEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAyE,EACxEC,CAAA,CAAA,EAFH,OAAA,GAAA,CAAA,SAAA,kEAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAGA,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./index-Da8R5Fn_.js";import{a as m}from"./vendor-query-DLp59M9_.js";function p({children:r,actions:t}){return e.jsxDEV("div",{className:"sticky top-0 z-20 bg-surface -mx-10 px-10 py-1.5 pb-4 border-b border-surface-border/50",children:e.jsxDEV("div",{className:"flex items-center gap-2 flex-wrap",children:[r,t&&e.jsxDEV("div",{className:"ml-auto flex items-center gap-2",children:t},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:13,columnNumber:21},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:11,columnNumber:7},this)},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:10,columnNumber:5},this)}function x({label:r,value:t,onChange:l,options:n,required:i,placeholder:s}){return e.jsxDEV("div",{className:"flex items-center gap-1.5",children:[e.jsxDEV("label",{className:"text-[10px] text-text-tertiary",children:r},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:32,columnNumber:7},this),e.jsxDEV("select",{value:t,onChange:a=>l(a.target.value),className:"select text-[11px] py-1 px-2",children:[!i&&e.jsxDEV("option",{value:"",children:s||"All"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:38,columnNumber:23},this),n.map(a=>e.jsxDEV("option",{value:a.value,children:a.label},a.value,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:40,columnNumber:11},this))]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:33,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:31,columnNumber:5},this)}function b({label:r,value:t,onChange:l,placeholder:n}){const[i,s]=m.useState(t),a=m.useRef(void 0);m.useEffect(()=>{s(t)},[t]);const c=o=>{s(o),clearTimeout(a.current),a.current=setTimeout(()=>l(o),300)};return m.useEffect(()=>()=>clearTimeout(a.current),[]),e.jsxDEV("div",{className:"flex items-center gap-1.5",children:[e.jsxDEV("label",{className:"text-[10px] text-text-tertiary whitespace-nowrap",children:r},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:74,columnNumber:7},this),e.jsxDEV("input",{type:"text",value:i,onChange:o=>c(o.target.value),placeholder:n,className:"input text-[11px] py-1 px-2 w-48 font-mono"},void 0,!1,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:75,columnNumber:7},this)]},void 0,!0,{fileName:"/app/dashboard/src/components/common/data/FilterBar.tsx",lineNumber:73,columnNumber:5},this)}export{p as F,b as a,x as b};
2
+ //# sourceMappingURL=FilterBar-CZGTOMoo.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FilterBar-Ck4K4rzu.js","sources":["../../src/components/common/data/FilterBar.tsx"],"sourcesContent":["import { useState, useEffect, useRef, type ReactNode } from 'react';\n\ninterface FilterBarProps {\n children: ReactNode;\n actions?: ReactNode;\n}\n\nexport function FilterBar({ children, actions }: FilterBarProps) {\n return (\n <div className=\"sticky top-0 z-20 bg-surface -mx-10 px-10 py-1.5 pb-4 border-b border-surface-border/50\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n {children}\n {actions && <div className=\"ml-auto flex items-center gap-2\">{actions}</div>}\n </div>\n </div>\n );\n}\n\ninterface FilterSelectProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n options: { value: string; label: string }[];\n /** When true, omit the default \"All\" option — a value is always required. */\n required?: boolean;\n placeholder?: string;\n}\n\nexport function FilterSelect({ label, value, onChange, options, required, placeholder }: FilterSelectProps) {\n return (\n <div className=\"flex items-center gap-1.5\">\n <label className=\"text-[10px] text-text-tertiary\">{label}</label>\n <select\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"select text-[11px] py-1 px-2\"\n >\n {!required && <option value=\"\">{placeholder || 'All'}</option>}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n );\n}\n\ninterface FilterInputProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n}\n\nexport function FilterInput({ label, value, onChange, placeholder }: FilterInputProps) {\n const [local, setLocal] = useState(value);\n const timerRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n // Sync from parent when the URL-driven value changes externally\n useEffect(() => { setLocal(value); }, [value]);\n\n const handleChange = (v: string) => {\n setLocal(v);\n clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => onChange(v), 300);\n };\n\n // Flush on unmount\n useEffect(() => () => clearTimeout(timerRef.current), []);\n\n return (\n <div className=\"flex items-center gap-1.5\">\n <label className=\"text-[10px] text-text-tertiary whitespace-nowrap\">{label}</label>\n <input\n type=\"text\"\n value={local}\n onChange={(e) => handleChange(e.target.value)}\n placeholder={placeholder}\n className=\"input text-[11px] py-1 px-2 w-48 font-mono\"\n />\n </div>\n );\n}\n"],"names":["FilterBar","children","actions","jsxs","jsx","FilterSelect","label","value","onChange","options","required","placeholder","e","opt","FilterInput","local","setLocal","useState","timerRef","useRef","useEffect","handleChange","v"],"mappings":"sDAOO,SAASA,EAAU,CAAE,SAAAC,EAAU,QAAAC,GAA2B,CAC/D,aACG,MAAA,CAAI,UAAU,0FACb,SAAAC,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACZ,SAAA,CAAAF,EACAC,GAAWE,EAAAA,IAAC,MAAA,CAAI,UAAU,kCAAmC,SAAAF,CAAA,CAAQ,CAAA,CAAA,CACxE,CAAA,CACF,CAEJ,CAYO,SAASG,EAAa,CAAE,MAAAC,EAAO,MAAAC,EAAO,SAAAC,EAAU,QAAAC,EAAS,SAAAC,EAAU,YAAAC,GAAkC,CAC1G,OACER,EAAAA,KAAC,MAAA,CAAI,UAAU,4BACb,SAAA,CAAAC,EAAAA,IAAC,QAAA,CAAM,UAAU,iCAAkC,SAAAE,EAAM,EACzDH,EAAAA,KAAC,SAAA,CACC,MAAAI,EACA,SAAWK,GAAMJ,EAASI,EAAE,OAAO,KAAK,EACxC,UAAU,+BAET,SAAA,CAAA,CAACF,GAAYN,MAAC,SAAA,CAAO,MAAM,GAAI,YAAe,MAAM,EACpDK,EAAQ,IAAKI,GACZT,EAAAA,IAAC,SAAA,CAAuB,MAAOS,EAAI,MAChC,SAAAA,EAAI,KAAA,EADMA,EAAI,KAEjB,CACD,CAAA,CAAA,CAAA,CACH,EACF,CAEJ,CASO,SAASC,EAAY,CAAE,MAAAR,EAAO,MAAAC,EAAO,SAAAC,EAAU,YAAAG,GAAiC,CACrF,KAAM,CAACI,EAAOC,CAAQ,EAAIC,EAAAA,SAASV,CAAK,EAClCW,EAAWC,EAAAA,OAAsC,MAAS,EAGhEC,EAAAA,UAAU,IAAM,CAAEJ,EAAST,CAAK,CAAG,EAAG,CAACA,CAAK,CAAC,EAE7C,MAAMc,EAAgBC,GAAc,CAClCN,EAASM,CAAC,EACV,aAAaJ,EAAS,OAAO,EAC7BA,EAAS,QAAU,WAAW,IAAMV,EAASc,CAAC,EAAG,GAAG,CACtD,EAGAF,OAAAA,EAAAA,UAAU,IAAM,IAAM,aAAaF,EAAS,OAAO,EAAG,CAAA,CAAE,EAGtDf,EAAAA,KAAC,MAAA,CAAI,UAAU,4BACb,SAAA,CAAAC,EAAAA,IAAC,QAAA,CAAM,UAAU,mDAAoD,SAAAE,EAAM,EAC3EF,EAAAA,IAAC,QAAA,CACC,KAAK,OACL,MAAOW,EACP,SAAWH,GAAMS,EAAaT,EAAE,OAAO,KAAK,EAC5C,YAAAD,EACA,UAAU,4CAAA,CAAA,CACZ,EACF,CAEJ"}
1
+ {"version":3,"file":"FilterBar-CZGTOMoo.js","sources":["../../src/components/common/data/FilterBar.tsx"],"sourcesContent":["import { useState, useEffect, useRef, type ReactNode } from 'react';\n\ninterface FilterBarProps {\n children: ReactNode;\n actions?: ReactNode;\n}\n\nexport function FilterBar({ children, actions }: FilterBarProps) {\n return (\n <div className=\"sticky top-0 z-20 bg-surface -mx-10 px-10 py-1.5 pb-4 border-b border-surface-border/50\">\n <div className=\"flex items-center gap-2 flex-wrap\">\n {children}\n {actions && <div className=\"ml-auto flex items-center gap-2\">{actions}</div>}\n </div>\n </div>\n );\n}\n\ninterface FilterSelectProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n options: { value: string; label: string }[];\n /** When true, omit the default \"All\" option — a value is always required. */\n required?: boolean;\n placeholder?: string;\n}\n\nexport function FilterSelect({ label, value, onChange, options, required, placeholder }: FilterSelectProps) {\n return (\n <div className=\"flex items-center gap-1.5\">\n <label className=\"text-[10px] text-text-tertiary\">{label}</label>\n <select\n value={value}\n onChange={(e) => onChange(e.target.value)}\n className=\"select text-[11px] py-1 px-2\"\n >\n {!required && <option value=\"\">{placeholder || 'All'}</option>}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n );\n}\n\ninterface FilterInputProps {\n label: string;\n value: string;\n onChange: (value: string) => void;\n placeholder?: string;\n}\n\nexport function FilterInput({ label, value, onChange, placeholder }: FilterInputProps) {\n const [local, setLocal] = useState(value);\n const timerRef = useRef<ReturnType<typeof setTimeout>>(undefined);\n\n // Sync from parent when the URL-driven value changes externally\n useEffect(() => { setLocal(value); }, [value]);\n\n const handleChange = (v: string) => {\n setLocal(v);\n clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => onChange(v), 300);\n };\n\n // Flush on unmount\n useEffect(() => () => clearTimeout(timerRef.current), []);\n\n return (\n <div className=\"flex items-center gap-1.5\">\n <label className=\"text-[10px] text-text-tertiary whitespace-nowrap\">{label}</label>\n <input\n type=\"text\"\n value={local}\n onChange={(e) => handleChange(e.target.value)}\n placeholder={placeholder}\n className=\"input text-[11px] py-1 px-2 w-48 font-mono\"\n />\n </div>\n );\n}\n"],"names":["FilterBar","children","actions","jsxDEV","FilterSelect","label","value","onChange","options","required","placeholder","e","opt","FilterInput","local","setLocal","useState","timerRef","useRef","useEffect","handleChange","v"],"mappings":"uFAOO,SAASA,EAAU,CAAE,SAAAC,EAAU,QAAAC,GAA2B,CAC/D,gBACG,MAAA,CAAI,UAAU,0FACb,SAAAC,EAAAA,OAAC,MAAA,CAAI,UAAU,oCACZ,SAAA,CAAAF,EACAC,GAAWC,EAAAA,OAAC,MAAA,CAAI,UAAU,kCAAmC,SAAAD,CAAA,EAAlD,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAA0D,CAAA,CAAA,EAFxE,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAGA,CAAA,EAJF,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAKA,CAEJ,CAYO,SAASE,EAAa,CAAE,MAAAC,EAAO,MAAAC,EAAO,SAAAC,EAAU,QAAAC,EAAS,SAAAC,EAAU,YAAAC,GAAkC,CAC1G,OACEP,EAAAA,OAAC,MAAA,CAAI,UAAU,4BACb,SAAA,CAAAA,SAAC,QAAA,CAAM,UAAU,iCAAkC,SAAAE,CAAA,EAAnD,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAyD,EACzDF,EAAAA,OAAC,SAAA,CACC,MAAAG,EACA,SAAWK,GAAMJ,EAASI,EAAE,OAAO,KAAK,EACxC,UAAU,+BAET,SAAA,CAAA,CAACF,GAAYN,EAAAA,OAAC,SAAA,CAAO,MAAM,GAAI,YAAe,OAAjC,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAAuC,EACpDK,EAAQ,IAAKI,GACZT,EAAAA,OAAC,SAAA,CAAuB,MAAOS,EAAI,MAChC,SAAAA,EAAI,KAAA,EADMA,EAAI,MAAjB,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,EAAA,EAAA,IAEA,CACD,CAAA,CAAA,EAVH,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CAWA,CAAA,EAbF,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAcA,CAEJ,CASO,SAASC,EAAY,CAAE,MAAAR,EAAO,MAAAC,EAAO,SAAAC,EAAU,YAAAG,GAAiC,CACrF,KAAM,CAACI,EAAOC,CAAQ,EAAIC,EAAAA,SAASV,CAAK,EAClCW,EAAWC,EAAAA,OAAsC,MAAS,EAGhEC,EAAAA,UAAU,IAAM,CAAEJ,EAAST,CAAK,CAAG,EAAG,CAACA,CAAK,CAAC,EAE7C,MAAMc,EAAgBC,GAAc,CAClCN,EAASM,CAAC,EACV,aAAaJ,EAAS,OAAO,EAC7BA,EAAS,QAAU,WAAW,IAAMV,EAASc,CAAC,EAAG,GAAG,CACtD,EAGAF,OAAAA,EAAAA,UAAU,IAAM,IAAM,aAAaF,EAAS,OAAO,EAAG,CAAA,CAAE,EAGtDd,EAAAA,OAAC,MAAA,CAAI,UAAU,4BACb,SAAA,CAAAA,SAAC,QAAA,CAAM,UAAU,mDAAoD,SAAAE,CAAA,EAArE,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAA2E,EAC3EF,EAAAA,OAAC,QAAA,CACC,KAAK,OACL,MAAOW,EACP,SAAWH,GAAMS,EAAaT,EAAE,OAAO,KAAK,EAC5C,YAAAD,EACA,UAAU,4CAAA,EALZ,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IAAA,CAMA,CAAA,EARF,OAAA,GAAA,CAAA,SAAA,0DAAA,WAAA,GAAA,aAAA,CAAA,EAAA,IASA,CAEJ"}