prefect 3.6.15__py3-none-any.whl → 3.6.16.dev3__py3-none-any.whl

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 (259) hide show
  1. prefect/__init__.py +20 -0
  2. prefect/_build_info.py +3 -3
  3. prefect/_internal/analytics/__init__.py +80 -0
  4. prefect/_internal/analytics/_config.py +2 -0
  5. prefect/_internal/analytics/ci_detection.py +39 -0
  6. prefect/_internal/analytics/client.py +132 -0
  7. prefect/_internal/analytics/device_id.py +55 -0
  8. prefect/_internal/analytics/emit.py +90 -0
  9. prefect/_internal/analytics/enabled.py +33 -0
  10. prefect/_internal/analytics/events.py +14 -0
  11. prefect/_internal/analytics/milestones.py +177 -0
  12. prefect/_internal/analytics/notice.py +60 -0
  13. prefect/_internal/analytics/service.py +238 -0
  14. prefect/analytics/__init__.py +67 -0
  15. prefect/deployments/runner.py +20 -0
  16. prefect/flow_engine.py +16 -0
  17. prefect/flows.py +8 -0
  18. prefect/logging/formatters.py +24 -1
  19. prefect/server/ui-v2/assets/{artifact-card-BBzQR-Cj.js → artifact-card-BclosG8t.js} +2 -2
  20. prefect/server/ui-v2/assets/{artifact-card-BBzQR-Cj.js.map → artifact-card-BclosG8t.js.map} +1 -1
  21. prefect/server/ui-v2/assets/artifact._id-C0r4BJr2.js +2 -0
  22. prefect/server/ui-v2/assets/artifact._id-C0r4BJr2.js.map +1 -0
  23. prefect/server/ui-v2/assets/{automation-wizard-EYSfXlQ7.js → automation-wizard-Bmgt6nn8.js} +2 -2
  24. prefect/server/ui-v2/assets/{automation-wizard-EYSfXlQ7.js.map → automation-wizard-Bmgt6nn8.js.map} +1 -1
  25. prefect/server/ui-v2/assets/automation._id-Ccke3KJz.js +2 -0
  26. prefect/server/ui-v2/assets/{automation._id-Dn7jABys.js.map → automation._id-Ccke3KJz.js.map} +1 -1
  27. prefect/server/ui-v2/assets/{automation_._id.edit-COrqswD3.js → automation_._id.edit-BlKPUTVf.js} +2 -2
  28. prefect/server/ui-v2/assets/{automation_._id.edit-COrqswD3.js.map → automation_._id.edit-BlKPUTVf.js.map} +1 -1
  29. prefect/server/ui-v2/assets/{automations-header-DN_dmMXW.js → automations-header-Df2zw3SC.js} +2 -2
  30. prefect/server/ui-v2/assets/{automations-header-DN_dmMXW.js.map → automations-header-Df2zw3SC.js.map} +1 -1
  31. prefect/server/ui-v2/assets/{base-job-template-form-section-De2ACYbw.js → base-job-template-form-section-oZD6U-RW.js} +2 -2
  32. prefect/server/ui-v2/assets/{base-job-template-form-section-De2ACYbw.js.map → base-job-template-form-section-oZD6U-RW.js.map} +1 -1
  33. prefect/server/ui-v2/assets/{block-type-details-Cklc7TkK.js → block-type-details-CYrdaLot.js} +2 -2
  34. prefect/server/ui-v2/assets/{block-type-details-Cklc7TkK.js.map → block-type-details-CYrdaLot.js.map} +1 -1
  35. prefect/server/ui-v2/assets/block-type-logo-CyAWq7mC.js +2 -0
  36. prefect/server/ui-v2/assets/block-type-logo-CyAWq7mC.js.map +1 -0
  37. prefect/server/ui-v2/assets/{block._id-tuz1Bcj2.js → block._id-CBgHrpTP.js} +2 -2
  38. prefect/server/ui-v2/assets/{block._id-tuz1Bcj2.js.map → block._id-CBgHrpTP.js.map} +1 -1
  39. prefect/server/ui-v2/assets/{block_._id.edit-CFEYhF5R.js → block_._id.edit-CW-kdi4O.js} +2 -2
  40. prefect/server/ui-v2/assets/{block_._id.edit-CFEYhF5R.js.map → block_._id.edit-CW-kdi4O.js.map} +1 -1
  41. prefect/server/ui-v2/assets/{catalog-CCPRo7nY.js → catalog-Brh0kn1I.js} +2 -2
  42. prefect/server/ui-v2/assets/{catalog-CCPRo7nY.js.map → catalog-Brh0kn1I.js.map} +1 -1
  43. prefect/server/ui-v2/assets/catalog_._slug-MCgzguIZ.js +2 -0
  44. prefect/server/ui-v2/assets/{catalog_._slug-Bl2J2oI3.js.map → catalog_._slug-MCgzguIZ.js.map} +1 -1
  45. prefect/server/ui-v2/assets/{catalog_._slug_.create-9UD_SxDN.js → catalog_._slug_.create-DBaeHi9Q.js} +2 -2
  46. prefect/server/ui-v2/assets/{catalog_._slug_.create-9UD_SxDN.js.map → catalog_._slug_.create-DBaeHi9Q.js.map} +1 -1
  47. prefect/server/ui-v2/assets/{collapsible-BVQTBG_U.js → collapsible-B_NJS0uJ.js} +2 -2
  48. prefect/server/ui-v2/assets/{collapsible-BVQTBG_U.js.map → collapsible-B_NJS0uJ.js.map} +1 -1
  49. prefect/server/ui-v2/assets/{concurrency-limit._id-CsgRxA0a.js → concurrency-limit._id-qzNUQzQa.js} +2 -2
  50. prefect/server/ui-v2/assets/{concurrency-limit._id-CsgRxA0a.js.map → concurrency-limit._id-qzNUQzQa.js.map} +1 -1
  51. prefect/server/ui-v2/assets/create-BwXG6EIb.js +2 -0
  52. prefect/server/ui-v2/assets/{create-D--LHaji.js.map → create-BwXG6EIb.js.map} +1 -1
  53. prefect/server/ui-v2/assets/{create-BycfZHGQ.js → create-MoiIE9Ms.js} +2 -2
  54. prefect/server/ui-v2/assets/{create-BycfZHGQ.js.map → create-MoiIE9Ms.js.map} +1 -1
  55. prefect/server/ui-v2/assets/data-table-CPkppyg6.js +2 -0
  56. prefect/server/ui-v2/assets/data-table-CPkppyg6.js.map +1 -0
  57. prefect/server/ui-v2/assets/delete-confirmation-dialog-CwDK_2QS.js +2 -0
  58. prefect/server/ui-v2/assets/{delete-confirmation-dialog-DHkm2p8m.js.map → delete-confirmation-dialog-CwDK_2QS.js.map} +1 -1
  59. prefect/server/ui-v2/assets/{deployment-action-header-D5GOooPm.js → deployment-action-header-Vp9YsCJO.js} +2 -2
  60. prefect/server/ui-v2/assets/{deployment-action-header-D5GOooPm.js.map → deployment-action-header-Vp9YsCJO.js.map} +1 -1
  61. prefect/server/ui-v2/assets/{deployment-form-wfg6HeAJ.js → deployment-form-CJcg_6DJ.js} +3 -3
  62. prefect/server/ui-v2/assets/{deployment-form-wfg6HeAJ.js.map → deployment-form-CJcg_6DJ.js.map} +1 -1
  63. prefect/server/ui-v2/assets/{deployment-links-6iugOgDh.js → deployment-links-CIkJIuHh.js} +2 -2
  64. prefect/server/ui-v2/assets/{deployment-links-6iugOgDh.js.map → deployment-links-CIkJIuHh.js.map} +1 -1
  65. prefect/server/ui-v2/assets/deployment._id-C6XrGMp_.js +2 -0
  66. prefect/server/ui-v2/assets/{deployment._id-Ci9zge5n.js.map → deployment._id-C6XrGMp_.js.map} +1 -1
  67. prefect/server/ui-v2/assets/{deployment._id-whsGcHdu.js → deployment._id-CWgTYmTG.js} +2 -2
  68. prefect/server/ui-v2/assets/{deployment._id-whsGcHdu.js.map → deployment._id-CWgTYmTG.js.map} +1 -1
  69. prefect/server/ui-v2/assets/deployment_._id.duplicate-Bg0s0ZJn.js +2 -0
  70. prefect/server/ui-v2/assets/{deployment_._id.duplicate-D9ZWkh8H.js.map → deployment_._id.duplicate-Bg0s0ZJn.js.map} +1 -1
  71. prefect/server/ui-v2/assets/deployment_._id.edit-CnoB0UeG.js +2 -0
  72. prefect/server/ui-v2/assets/{deployment_._id.edit-CS7sObzC.js.map → deployment_._id.edit-CnoB0UeG.js.map} +1 -1
  73. prefect/server/ui-v2/assets/{deployment_._id.run-g7SZuDFi.js → deployment_._id.run-BqPK6rTB.js} +2 -2
  74. prefect/server/ui-v2/assets/{deployment_._id.run-g7SZuDFi.js.map → deployment_._id.run-BqPK6rTB.js.map} +1 -1
  75. prefect/server/ui-v2/assets/{dropdown-menu-0atiOSFo.js → dropdown-menu-D7Gwbd15.js} +2 -2
  76. prefect/server/ui-v2/assets/{dropdown-menu-0atiOSFo.js.map → dropdown-menu-D7Gwbd15.js.map} +1 -1
  77. prefect/server/ui-v2/assets/{event-resource-display-DHiAb1Up.js → event-resource-display-CDRgVKd4.js} +2 -2
  78. prefect/server/ui-v2/assets/{event-resource-display-DHiAb1Up.js.map → event-resource-display-CDRgVKd4.js.map} +1 -1
  79. prefect/server/ui-v2/assets/event._eventDate._eventId-C73GMDkK.js +2 -0
  80. prefect/server/ui-v2/assets/{event._eventDate._eventId-D7Twzb22.js.map → event._eventDate._eventId-C73GMDkK.js.map} +1 -1
  81. prefect/server/ui-v2/assets/{flow-run-graph-BhzuSJLm.js → flow-run-graph-ckiE3mA9.js} +2 -2
  82. prefect/server/ui-v2/assets/{flow-run-graph-BhzuSJLm.js.map → flow-run-graph-ckiE3mA9.js.map} +1 -1
  83. prefect/server/ui-v2/assets/{flow-run._id-CqpH6bvx.js → flow-run._id-BukrNCAq.js} +2 -2
  84. prefect/server/ui-v2/assets/{flow-run._id-CqpH6bvx.js.map → flow-run._id-BukrNCAq.js.map} +1 -1
  85. prefect/server/ui-v2/assets/{flow-run._id-lIIQBD7H.js → flow-run._id-CtI5VZ2M.js} +2 -2
  86. prefect/server/ui-v2/assets/{flow-run._id-lIIQBD7H.js.map → flow-run._id-CtI5VZ2M.js.map} +1 -1
  87. prefect/server/ui-v2/assets/flow-run._id-s1UJuakA.js +4 -0
  88. prefect/server/ui-v2/assets/{flow-run._id-RLy2kBh0.js.map → flow-run._id-s1UJuakA.js.map} +1 -1
  89. prefect/server/ui-v2/assets/{flow-runs-pagination-BATUweRV.js → flow-runs-pagination-SLbYtvaR.js} +2 -2
  90. prefect/server/ui-v2/assets/{flow-runs-pagination-BATUweRV.js.map → flow-runs-pagination-SLbYtvaR.js.map} +1 -1
  91. prefect/server/ui-v2/assets/flow._id-CZ5P0v4N.js +2 -0
  92. prefect/server/ui-v2/assets/{flow._id-BdQGWPKP.js.map → flow._id-CZ5P0v4N.js.map} +1 -1
  93. prefect/server/ui-v2/assets/{form-DLrbC7rV.js → form-mws4law8.js} +2 -2
  94. prefect/server/ui-v2/assets/{form-DLrbC7rV.js.map → form-mws4law8.js.map} +1 -1
  95. prefect/server/ui-v2/assets/{header-BTAWyeXv.js → header-Bes1LmY7.js} +2 -2
  96. prefect/server/ui-v2/assets/{header-BTAWyeXv.js.map → header-Bes1LmY7.js.map} +1 -1
  97. prefect/server/ui-v2/assets/{header-ChFAx5uR.js → header-Bj_zBR-a.js} +2 -2
  98. prefect/server/ui-v2/assets/{header-ChFAx5uR.js.map → header-Bj_zBR-a.js.map} +1 -1
  99. prefect/server/ui-v2/assets/{header-CyQqOj1w.js → header-CPxTHSvz.js} +2 -2
  100. prefect/server/ui-v2/assets/{header-CyQqOj1w.js.map → header-CPxTHSvz.js.map} +1 -1
  101. prefect/server/ui-v2/assets/{index-m48E4KcG.js → index-B8vo2Lrg.js} +5 -5
  102. prefect/server/ui-v2/assets/{index-m48E4KcG.js.map → index-B8vo2Lrg.js.map} +1 -1
  103. prefect/server/ui-v2/assets/{index-D5RT-SAp.js → index-BBeh-3Nh.js} +2 -2
  104. prefect/server/ui-v2/assets/{index-D5RT-SAp.js.map → index-BBeh-3Nh.js.map} +1 -1
  105. prefect/server/ui-v2/assets/index-BLnEvHia.js +2 -0
  106. prefect/server/ui-v2/assets/{index-7i4X9TeK.js.map → index-BLnEvHia.js.map} +1 -1
  107. prefect/server/ui-v2/assets/index-BpKoubXu.js +2 -0
  108. prefect/server/ui-v2/assets/index-BpKoubXu.js.map +1 -0
  109. prefect/server/ui-v2/assets/index-By6YGqR3.js +2 -0
  110. prefect/server/ui-v2/assets/index-By6YGqR3.js.map +1 -0
  111. prefect/server/ui-v2/assets/index-CEi3BlKI.js +2 -0
  112. prefect/server/ui-v2/assets/index-CEi3BlKI.js.map +1 -0
  113. prefect/server/ui-v2/assets/{index-BaWDC4da.js → index-CS-zxv7Z.js} +2 -2
  114. prefect/server/ui-v2/assets/{index-BaWDC4da.js.map → index-CS-zxv7Z.js.map} +1 -1
  115. prefect/server/ui-v2/assets/{index-kP_I5Qfd.js → index-CToHKh4q.js} +2 -2
  116. prefect/server/ui-v2/assets/{index-kP_I5Qfd.js.map → index-CToHKh4q.js.map} +1 -1
  117. prefect/server/ui-v2/assets/{index-CKGj5lSu.js → index-CUVvZndW.js} +2 -2
  118. prefect/server/ui-v2/assets/{index-CKGj5lSu.js.map → index-CUVvZndW.js.map} +1 -1
  119. prefect/server/ui-v2/assets/{index-CxUfZRkN.js → index-CYVn-I3i.js} +2 -2
  120. prefect/server/ui-v2/assets/{index-CxUfZRkN.js.map → index-CYVn-I3i.js.map} +1 -1
  121. prefect/server/ui-v2/assets/{index-CnlN-VC_.js → index-Cun0JN4t.js} +2 -2
  122. prefect/server/ui-v2/assets/{index-CnlN-VC_.js.map → index-Cun0JN4t.js.map} +1 -1
  123. prefect/server/ui-v2/assets/{index-BwCLKpNb.js → index-D6ynV6U7.js} +2 -2
  124. prefect/server/ui-v2/assets/{index-BwCLKpNb.js.map → index-D6ynV6U7.js.map} +1 -1
  125. prefect/server/ui-v2/assets/{index-CHf6xi9j.js → index-DdNUJLRW.js} +2 -2
  126. prefect/server/ui-v2/assets/{index-CHf6xi9j.js.map → index-DdNUJLRW.js.map} +1 -1
  127. prefect/server/ui-v2/assets/{index-CQnWiUE5.js → index-DlHOXQhu.js} +2 -2
  128. prefect/server/ui-v2/assets/{index-CQnWiUE5.js.map → index-DlHOXQhu.js.map} +1 -1
  129. prefect/server/ui-v2/assets/{index-Eqdr6Ff7.js → index-DyVw8YE8.js} +2 -2
  130. prefect/server/ui-v2/assets/{index-Eqdr6Ff7.js.map → index-DyVw8YE8.js.map} +1 -1
  131. prefect/server/ui-v2/assets/{index-Btb_-PDp.js → index-DzRz7D2P.js} +2 -2
  132. prefect/server/ui-v2/assets/{index-Btb_-PDp.js.map → index-DzRz7D2P.js.map} +1 -1
  133. prefect/server/ui-v2/assets/{index-DQGif3jm.js → index-DzUcVNZg.js} +2 -2
  134. prefect/server/ui-v2/assets/{index-DQGif3jm.js.map → index-DzUcVNZg.js.map} +1 -1
  135. prefect/server/ui-v2/assets/{index-DNh9ZBy4.js → index-IBvMMs6S.js} +2 -2
  136. prefect/server/ui-v2/assets/{index-DNh9ZBy4.js.map → index-IBvMMs6S.js.map} +1 -1
  137. prefect/server/ui-v2/assets/index-_kpA__te.js +2 -0
  138. prefect/server/ui-v2/assets/{index-CiSFHkhI.js.map → index-_kpA__te.js.map} +1 -1
  139. prefect/server/ui-v2/assets/index-m9O-nIOl.css +1 -0
  140. prefect/server/ui-v2/assets/{index-lyQav_XM.js → index-wOvyf10b.js} +2 -2
  141. prefect/server/ui-v2/assets/{index-lyQav_XM.js.map → index-wOvyf10b.js.map} +1 -1
  142. prefect/server/ui-v2/assets/{json-input-Ba-BeBcw.js → json-input-Ce-HlRqa.js} +2 -2
  143. prefect/server/ui-v2/assets/{json-input-Ba-BeBcw.js.map → json-input-Ce-HlRqa.js.map} +1 -1
  144. prefect/server/ui-v2/assets/{key-value-DkSKn6jE.js → key-value-XHEZOtZX.js} +2 -2
  145. prefect/server/ui-v2/assets/{key-value-DkSKn6jE.js.map → key-value-XHEZOtZX.js.map} +1 -1
  146. prefect/server/ui-v2/assets/{key._key-Cjx57ymg.js → key._key-LpsMf3zD.js} +2 -2
  147. prefect/server/ui-v2/assets/{key._key-Cjx57ymg.js.map → key._key-LpsMf3zD.js.map} +1 -1
  148. prefect/server/ui-v2/assets/{lazy-markdown-Du2Xu3Yp.js → lazy-markdown-1Hz0xzca.js} +2 -2
  149. prefect/server/ui-v2/assets/{lazy-markdown-Du2Xu3Yp.js.map → lazy-markdown-1Hz0xzca.js.map} +1 -1
  150. prefect/server/ui-v2/assets/{login-DxMF9Jvj.js → login-D5uepl9L.js} +2 -2
  151. prefect/server/ui-v2/assets/{login-DxMF9Jvj.js.map → login-D5uepl9L.js.map} +1 -1
  152. prefect/server/ui-v2/assets/{markdown-input-DPi8zyRr.js → markdown-input-CG6M9zD0.js} +2 -2
  153. prefect/server/ui-v2/assets/{markdown-input-DPi8zyRr.js.map → markdown-input-CG6M9zD0.js.map} +1 -1
  154. prefect/server/ui-v2/assets/python-example-snippet-DRHcUlCX.js +3 -0
  155. prefect/server/ui-v2/assets/{python-example-snippet-DfCFYPN_.js.map → python-example-snippet-DRHcUlCX.js.map} +1 -1
  156. prefect/server/ui-v2/assets/{python-input-mr6GD840.js → python-input-BsUS8fw1.js} +2 -2
  157. prefect/server/ui-v2/assets/{python-input-mr6GD840.js.map → python-input-BsUS8fw1.js.map} +1 -1
  158. prefect/server/ui-v2/assets/{radio-group-Co3cN0Kv.js → radio-group-BUsmwdrt.js} +2 -2
  159. prefect/server/ui-v2/assets/{radio-group-Co3cN0Kv.js.map → radio-group-BUsmwdrt.js.map} +1 -1
  160. prefect/server/ui-v2/assets/{route-error-state-DnBaNT2T.js → route-error-state-BFBpiIhD.js} +2 -2
  161. prefect/server/ui-v2/assets/{route-error-state-DnBaNT2T.js.map → route-error-state-BFBpiIhD.js.map} +1 -1
  162. prefect/server/ui-v2/assets/{schema-form-CWDHSME9.js → schema-form-BwTmkvJk.js} +2 -2
  163. prefect/server/ui-v2/assets/schema-form-BwTmkvJk.js.map +1 -0
  164. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-BSWlW_aQ.js → schema-form-input-string-format-datetime-nrb3g-JJ.js} +4 -4
  165. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-BSWlW_aQ.js.map → schema-form-input-string-format-datetime-nrb3g-JJ.js.map} +1 -1
  166. prefect/server/ui-v2/assets/{settings-DU5y6tJE.js → settings-CUBtK5aW.js} +2 -2
  167. prefect/server/ui-v2/assets/{settings-DU5y6tJE.js.map → settings-CUBtK5aW.js.map} +1 -1
  168. prefect/server/ui-v2/assets/{sort-filter-DpuWNkQo.js → sort-filter-Cv8zAXMp.js} +2 -2
  169. prefect/server/ui-v2/assets/{sort-filter-DpuWNkQo.js.map → sort-filter-Cv8zAXMp.js.map} +1 -1
  170. prefect/server/ui-v2/assets/{table-bBL6C0ZK.js → table-BBNGfPra.js} +2 -2
  171. prefect/server/ui-v2/assets/{table-bBL6C0ZK.js.map → table-BBNGfPra.js.map} +1 -1
  172. prefect/server/ui-v2/assets/{tags-input-BLPMVWpZ.js → tags-input-DHrnkwjQ.js} +2 -2
  173. prefect/server/ui-v2/assets/{tags-input-BLPMVWpZ.js.map → tags-input-DHrnkwjQ.js.map} +1 -1
  174. prefect/server/ui-v2/assets/task-run-concurrency-limits-reset-dialog-Z8-yFZ2_.js +2 -0
  175. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-S69sih55.js.map → task-run-concurrency-limits-reset-dialog-Z8-yFZ2_.js.map} +1 -1
  176. prefect/server/ui-v2/assets/{task-run._id-Dl3Azs8t.js → task-run._id-BY58gqs2.js} +2 -2
  177. prefect/server/ui-v2/assets/{task-run._id-Dl3Azs8t.js.map → task-run._id-BY58gqs2.js.map} +1 -1
  178. prefect/server/ui-v2/assets/{task-run._id-B_tIDm4K.js → task-run._id-u73Jxfqw.js} +3 -3
  179. prefect/server/ui-v2/assets/{task-run._id-B_tIDm4K.js.map → task-run._id-u73Jxfqw.js.map} +1 -1
  180. prefect/server/ui-v2/assets/task-runs-pagination-DUy3147A.js +2 -0
  181. prefect/server/ui-v2/assets/{task-runs-pagination-VdR-LO4r.js.map → task-runs-pagination-DUy3147A.js.map} +1 -1
  182. prefect/server/ui-v2/assets/{textarea-B3_TtPRi.js → textarea-DUhh6-kq.js} +2 -2
  183. prefect/server/ui-v2/assets/{textarea-B3_TtPRi.js.map → textarea-DUhh6-kq.js.map} +1 -1
  184. prefect/server/ui-v2/assets/timezone-select-D4Q6VBtD.js +2 -0
  185. prefect/server/ui-v2/assets/{timezone-select-BuPYznge.js.map → timezone-select-D4Q6VBtD.js.map} +1 -1
  186. prefect/server/ui-v2/assets/{toggle-group-Cn07UIim.js → toggle-group-7WUJn2Tx.js} +2 -2
  187. prefect/server/ui-v2/assets/{toggle-group-Cn07UIim.js.map → toggle-group-7WUJn2Tx.js.map} +1 -1
  188. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-D4AD5Ndf.js +2 -0
  189. prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-DpdsLH4t.js.map → use-delete-automation-confirmation-dialog-D4AD5Ndf.js.map} +1 -1
  190. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-Cq5nGhzr.js → use-delete-block-document-confirmation-dialog-DnwWEGUY.js} +2 -2
  191. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-Cq5nGhzr.js.map → use-delete-block-document-confirmation-dialog-DnwWEGUY.js.map} +1 -1
  192. prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-DmQSWBTu.js → use-flow-runs-selected-rows-C-tehPRB.js} +2 -2
  193. prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-DmQSWBTu.js.map → use-flow-runs-selected-rows-C-tehPRB.js.map} +1 -1
  194. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DTwcWiqW.js → use-get-artifacts-flow-task-runs-DRWRrmrb.js} +2 -2
  195. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DTwcWiqW.js.map → use-get-artifacts-flow-task-runs-DRWRrmrb.js.map} +1 -1
  196. prefect/server/ui-v2/assets/{use-quick-run-CPempwLh.js → use-quick-run-B4Xj-YQQ.js} +2 -2
  197. prefect/server/ui-v2/assets/{use-quick-run-CPempwLh.js.map → use-quick-run-B4Xj-YQQ.js.map} +1 -1
  198. prefect/server/ui-v2/assets/use-state-favicon-au2TZdMV.js +2 -0
  199. prefect/server/ui-v2/assets/{use-state-favicon-M09DmrNy.js.map → use-state-favicon-au2TZdMV.js.map} +1 -1
  200. prefect/server/ui-v2/assets/{use-stepper-CDucnvzp.js → use-stepper-DyIb3vlq.js} +2 -2
  201. prefect/server/ui-v2/assets/{use-stepper-CDucnvzp.js.map → use-stepper-DyIb3vlq.js.map} +1 -1
  202. prefect/server/ui-v2/assets/{utilities-BRCNRcQl.js → utilities-D9Y2wo66.js} +2 -2
  203. prefect/server/ui-v2/assets/{utilities-BRCNRcQl.js.map → utilities-D9Y2wo66.js.map} +1 -1
  204. prefect/server/ui-v2/assets/vendor-recharts-BvvJP9Po.js +34 -0
  205. prefect/server/ui-v2/assets/vendor-recharts-BvvJP9Po.js.map +1 -0
  206. prefect/server/ui-v2/assets/{work-pool-filter-C2tpSS-w.js → work-pool-filter-CSOATj2D.js} +2 -2
  207. prefect/server/ui-v2/assets/{work-pool-filter-C2tpSS-w.js.map → work-pool-filter-CSOATj2D.js.map} +1 -1
  208. prefect/server/ui-v2/assets/work-pool-queue-toggle-Dh7B1zMo.js +2 -0
  209. prefect/server/ui-v2/assets/{work-pool-queue-toggle-BQ9b-Wxy.js.map → work-pool-queue-toggle-Dh7B1zMo.js.map} +1 -1
  210. prefect/server/ui-v2/assets/work-pool._workPoolName-B_NFWXKS.js +2 -0
  211. prefect/server/ui-v2/assets/{work-pool._workPoolName-C_LiL3SE.js.map → work-pool._workPoolName-B_NFWXKS.js.map} +1 -1
  212. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-DBHlrVVx.js → work-pool_._workPoolName.edit-Cyzn8g-S.js} +2 -2
  213. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-DBHlrVVx.js.map → work-pool_._workPoolName.edit-Cyzn8g-S.js.map} +1 -1
  214. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-DkITxJOP.js → work-pool_._workPoolName.queue._workQueueName-DQzqQWPT.js} +2 -2
  215. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-DkITxJOP.js.map → work-pool_._workPoolName.queue._workQueueName-DQzqQWPT.js.map} +1 -1
  216. prefect/server/ui-v2/assets/{work-queue-icon-text-D4BWBVDN.js → work-queue-icon-text-BOpcJ8YU.js} +2 -2
  217. prefect/server/ui-v2/assets/{work-queue-icon-text-D4BWBVDN.js.map → work-queue-icon-text-BOpcJ8YU.js.map} +1 -1
  218. prefect/server/ui-v2/index.html +3 -3
  219. {prefect-3.6.15.dist-info → prefect-3.6.16.dev3.dist-info}/METADATA +2 -1
  220. {prefect-3.6.15.dist-info → prefect-3.6.16.dev3.dist-info}/RECORD +223 -211
  221. prefect/server/ui-v2/assets/artifact._id-BFdf1WUA.js +0 -2
  222. prefect/server/ui-v2/assets/artifact._id-BFdf1WUA.js.map +0 -1
  223. prefect/server/ui-v2/assets/automation._id-Dn7jABys.js +0 -2
  224. prefect/server/ui-v2/assets/block-type-logo-Cbpfxded.js +0 -2
  225. prefect/server/ui-v2/assets/block-type-logo-Cbpfxded.js.map +0 -1
  226. prefect/server/ui-v2/assets/catalog_._slug-Bl2J2oI3.js +0 -2
  227. prefect/server/ui-v2/assets/create-D--LHaji.js +0 -2
  228. prefect/server/ui-v2/assets/data-table-rlbkLcrY.js +0 -2
  229. prefect/server/ui-v2/assets/data-table-rlbkLcrY.js.map +0 -1
  230. prefect/server/ui-v2/assets/delete-confirmation-dialog-DHkm2p8m.js +0 -2
  231. prefect/server/ui-v2/assets/deployment._id-Ci9zge5n.js +0 -2
  232. prefect/server/ui-v2/assets/deployment_._id.duplicate-D9ZWkh8H.js +0 -2
  233. prefect/server/ui-v2/assets/deployment_._id.edit-CS7sObzC.js +0 -2
  234. prefect/server/ui-v2/assets/event._eventDate._eventId-D7Twzb22.js +0 -2
  235. prefect/server/ui-v2/assets/flow-run._id-RLy2kBh0.js +0 -4
  236. prefect/server/ui-v2/assets/flow._id-BdQGWPKP.js +0 -2
  237. prefect/server/ui-v2/assets/index-7i4X9TeK.js +0 -2
  238. prefect/server/ui-v2/assets/index-BkiGTHwU.js +0 -2
  239. prefect/server/ui-v2/assets/index-BkiGTHwU.js.map +0 -1
  240. prefect/server/ui-v2/assets/index-COouj_0-.css +0 -1
  241. prefect/server/ui-v2/assets/index-CiSFHkhI.js +0 -2
  242. prefect/server/ui-v2/assets/index-DATPYZfT.js +0 -2
  243. prefect/server/ui-v2/assets/index-DATPYZfT.js.map +0 -1
  244. prefect/server/ui-v2/assets/index-VH4TnZ4e.js +0 -2
  245. prefect/server/ui-v2/assets/index-VH4TnZ4e.js.map +0 -1
  246. prefect/server/ui-v2/assets/python-example-snippet-DfCFYPN_.js +0 -3
  247. prefect/server/ui-v2/assets/schema-form-CWDHSME9.js.map +0 -1
  248. prefect/server/ui-v2/assets/task-run-concurrency-limits-reset-dialog-S69sih55.js +0 -2
  249. prefect/server/ui-v2/assets/task-runs-pagination-VdR-LO4r.js +0 -2
  250. prefect/server/ui-v2/assets/timezone-select-BuPYznge.js +0 -2
  251. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-DpdsLH4t.js +0 -2
  252. prefect/server/ui-v2/assets/use-state-favicon-M09DmrNy.js +0 -2
  253. prefect/server/ui-v2/assets/vendor-recharts-BAN776s_.js +0 -34
  254. prefect/server/ui-v2/assets/vendor-recharts-BAN776s_.js.map +0 -1
  255. prefect/server/ui-v2/assets/work-pool-queue-toggle-BQ9b-Wxy.js +0 -2
  256. prefect/server/ui-v2/assets/work-pool._workPoolName-C_LiL3SE.js +0 -2
  257. {prefect-3.6.15.dist-info → prefect-3.6.16.dev3.dist-info}/WHEEL +0 -0
  258. {prefect-3.6.15.dist-info → prefect-3.6.16.dev3.dist-info}/entry_points.txt +0 -0
  259. {prefect-3.6.15.dist-info → prefect-3.6.16.dev3.dist-info}/licenses/LICENSE +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"work-pool._workPoolName-C_LiL3SE.js","sources":["../../node_modules/lucide-react/dist/esm/icons/circle-question-mark.js","../../src/components/code-banner/code-banner.tsx","../../src/components/work-pools/work-pool-deployments-tab/work-pool-deployments-tab.tsx","../../src/components/work-pools/work-pool-status-badge/work-pool-status-badge.tsx","../../src/components/work-pools/work-pool-details/work-pool-details.tsx","../../src/components/work-pools/work-pool-flow-runs-tab/work-pool-flow-runs-tab.tsx","../../src/components/work-pools/work-pool-menu/components/delete-work-pool-dialog.tsx","../../src/components/work-pools/work-pool-menu/hooks/use-work-pool-menu.ts","../../src/components/work-pools/work-pool-menu/work-pool-menu.tsx","../../src/components/work-pools/work-pool-toggle/hooks/use-work-pool-toggle.ts","../../src/components/work-pools/work-pool-toggle/work-pool-toggle.tsx","../../src/components/work-pools/work-pool-page-header/work-pool-page-header.tsx","../../src/components/flow-runs/late-flow-runs-indicator/late-flow-runs-indicator.tsx","../../src/components/work-pools/work-pool-queues-table/components/queue-name-with-late-indicator.tsx","../../src/components/work-pools/work-pool-queues-table/components/work-pool-queues-table-columns.tsx","../../src/components/work-pools/work-pool-queues-table/components/work-pool-queues-table-empty-state.tsx","../../src/components/work-pools/work-pool-queues-table/components/work-pool-queues-table-toolbar.tsx","../../src/components/work-pools/work-pool-queues-table/work-pool-queues-table.tsx","../../src/components/workers/worker-status-badge/worker-status-badge.tsx","../../src/components/work-pools/workers-table/components/workers-table-columns.tsx","../../src/components/work-pools/workers-table/components/workers-table-empty-state.tsx","../../src/components/workers/worker-menu/components/delete-worker-dialog.tsx","../../src/components/workers/worker-menu/hooks/use-worker-menu.ts","../../src/components/workers/worker-menu/worker-menu.tsx","../../src/components/work-pools/workers-table/components/workers-table-row-actions.tsx","../../src/components/work-pools/workers-table/components/workers-table-toolbar.tsx","../../src/components/work-pools/workers-table/workers-table.tsx","../../src/routes/work-pools/work-pool.$workPoolName.tsx?tsr-split=component"],"sourcesContent":["/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\", key: \"1u773s\" }],\n [\"path\", { d: \"M12 17h.01\", key: \"p32p05\" }]\n];\nconst CircleQuestionMark = createLucideIcon(\"circle-question-mark\", __iconNode);\n\nexport { __iconNode, CircleQuestionMark as default };\n//# sourceMappingURL=circle-question-mark.js.map\n","import { Copy } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { toast } from \"sonner\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/utils\";\n\ntype CodeBannerProps = {\n\tcommand: string;\n\ttitle: string;\n\tsubtitle: string;\n\tclassName?: string;\n};\n\nexport const CodeBanner = ({\n\tcommand,\n\ttitle,\n\tsubtitle,\n\tclassName,\n}: CodeBannerProps) => {\n\tconst [copying, setCopying] = useState(false);\n\n\tconst handleCopy = async () => {\n\t\tif (copying) return;\n\n\t\tsetCopying(true);\n\t\ttry {\n\t\t\tawait navigator.clipboard.writeText(command);\n\t\t\ttoast.success(\"Command copied to clipboard\");\n\t\t} catch {\n\t\t\ttoast.error(\"Failed to copy command\");\n\t\t} finally {\n\t\t\tsetCopying(false);\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className={cn(\"space-y-4\", className)}>\n\t\t\t{/* Title and subtitle above terminal */}\n\t\t\t<div className=\"text-center\">\n\t\t\t\t<h3 className=\"text-lg font-semibold text-foreground mb-1\">{title}</h3>\n\t\t\t\t<p className=\"text-muted-foreground text-sm\">{subtitle}</p>\n\t\t\t</div>\n\n\t\t\t{/* Terminal window */}\n\t\t\t<div className=\"bg-muted border border-border rounded-lg shadow-sm overflow-hidden\">\n\t\t\t\t{/* macOS-style window header */}\n\t\t\t\t<div className=\"bg-muted/80 border-b border-border px-3 py-2 flex items-center space-x-2\">\n\t\t\t\t\t<div className=\"flex space-x-1\">\n\t\t\t\t\t\t<div className=\"w-3 h-3 bg-red-500 rounded-full\" />\n\t\t\t\t\t\t<div className=\"w-3 h-3 bg-yellow-500 rounded-full\" />\n\t\t\t\t\t\t<div className=\"w-3 h-3 bg-green-500 rounded-full\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\t\t\t\t\t\tonClick={handleCopy}\n\t\t\t\t\t\tdisabled={copying}\n\t\t\t\t\t\tclassName=\"ml-auto text-muted-foreground hover:text-foreground hover:bg-muted h-6 w-6 p-0\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Copy className=\"h-4 w-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Terminal content */}\n\t\t\t\t<div className=\"bg-gray-800 dark:bg-gray-900 px-4 py-2\">\n\t\t\t\t\t<p className=\"py-1\">\n\t\t\t\t\t\t<code className=\"font-mono text-sm text-gray-300 select-all\">\n\t\t\t\t\t\t\t{command}\n\t\t\t\t\t\t</code>\n\t\t\t\t\t\t<span className=\"ml-1 -mb-1 inline-block w-[7px] h-[18px] bg-gray-400 terminal-cursor\" />\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport type {\n\tColumnFiltersState,\n\tPaginationState,\n} from \"@tanstack/react-table\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport {\n\tbuildCountDeploymentsQuery,\n\tbuildPaginateDeploymentsQuery,\n\ttype DeploymentsPaginationFilter,\n} from \"@/api/deployments\";\nimport { buildListFlowsQuery } from \"@/api/flows\";\nimport type { components } from \"@/api/prefect\";\nimport { DeploymentsDataTable } from \"@/components/deployments/data-table\";\n\ntype WorkPoolDeploymentsTabProps = {\n\tworkPoolName: string;\n\tclassName?: string;\n};\n\nexport const WorkPoolDeploymentsTab = ({\n\tworkPoolName,\n\tclassName,\n}: WorkPoolDeploymentsTabProps) => {\n\tconst [pagination, setPagination] = useState<PaginationState>({\n\t\tpageIndex: 0,\n\t\tpageSize: 50,\n\t});\n\tconst [sort, setSort] =\n\t\tuseState<components[\"schemas\"][\"DeploymentSort\"]>(\"CREATED_DESC\");\n\tconst [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);\n\n\tconst filter: DeploymentsPaginationFilter = useMemo(\n\t\t() => ({\n\t\t\tpage: pagination.pageIndex + 1,\n\t\t\tlimit: pagination.pageSize,\n\t\t\tsort,\n\t\t\twork_pools: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tname: { any_: [workPoolName] },\n\t\t\t},\n\t\t\tdeployments: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tflow_or_deployment_name: {\n\t\t\t\t\tlike_:\n\t\t\t\t\t\t(columnFilters.find((f) => f.id === \"flowOrDeploymentName\")\n\t\t\t\t\t\t\t?.value as string) ?? \"\",\n\t\t\t\t},\n\t\t\t\ttags: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tall_:\n\t\t\t\t\t\t(columnFilters.find((f) => f.id === \"tags\")?.value as string[]) ??\n\t\t\t\t\t\t[],\n\t\t\t\t},\n\t\t\t},\n\t\t}),\n\t\t[workPoolName, pagination, sort, columnFilters],\n\t);\n\n\tconst countFilter = useMemo(\n\t\t() => ({\n\t\t\toffset: 0,\n\t\t\tsort: \"CREATED_DESC\" as const,\n\t\t\twork_pools: {\n\t\t\t\toperator: \"and_\" as const,\n\t\t\t\tname: { any_: [workPoolName] },\n\t\t\t},\n\t\t}),\n\t\t[workPoolName],\n\t);\n\n\tconst { data: paginatedData } = useQuery(\n\t\tbuildPaginateDeploymentsQuery(filter),\n\t);\n\n\tconst { data: totalCount } = useQuery(\n\t\tbuildCountDeploymentsQuery(countFilter),\n\t);\n\n\tconst flowIds = useMemo(\n\t\t() => [...new Set((paginatedData?.results ?? []).map((d) => d.flow_id))],\n\t\t[paginatedData?.results],\n\t);\n\n\tconst { data: flows } = useQuery(\n\t\tbuildListFlowsQuery(\n\t\t\t{\n\t\t\t\tflows: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tid: { any_: flowIds },\n\t\t\t\t},\n\t\t\t\toffset: 0,\n\t\t\t\tsort: \"NAME_ASC\",\n\t\t\t},\n\t\t\t{ enabled: flowIds.length > 0 },\n\t\t),\n\t);\n\n\tconst deploymentsWithFlows = useMemo(() => {\n\t\tif (!paginatedData?.results) return [];\n\t\tconst flowMap = new Map(flows?.map((flow) => [flow.id, flow]) ?? []);\n\t\treturn paginatedData.results.map((deployment) => ({\n\t\t\t...deployment,\n\t\t\tflow: flowMap.get(deployment.flow_id),\n\t\t}));\n\t}, [paginatedData?.results, flows]);\n\n\tconst handlePaginationChange = useCallback(\n\t\t(newPagination: PaginationState) => {\n\t\t\tsetPagination(newPagination);\n\t\t},\n\t\t[],\n\t);\n\n\tconst handleSortChange = useCallback(\n\t\t(newSort: components[\"schemas\"][\"DeploymentSort\"]) => {\n\t\t\tsetSort(newSort);\n\t\t},\n\t\t[],\n\t);\n\n\tconst handleColumnFiltersChange = useCallback(\n\t\t(newFilters: ColumnFiltersState) => {\n\t\t\tsetColumnFilters(newFilters);\n\t\t},\n\t\t[],\n\t);\n\n\t// Show loading only on initial load, not on sorting/pagination changes\n\tif (!paginatedData || totalCount === undefined) {\n\t\treturn (\n\t\t\t<div className={className}>\n\t\t\t\t<div className=\"text-muted-foreground text-center py-8\">\n\t\t\t\t\tLoading deployments...\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={className}>\n\t\t\t<DeploymentsDataTable\n\t\t\t\tdeployments={deploymentsWithFlows}\n\t\t\t\tcurrentDeploymentsCount={totalCount}\n\t\t\t\tpageCount={paginatedData.pages}\n\t\t\t\tpagination={pagination}\n\t\t\t\tsort={sort}\n\t\t\t\tcolumnFilters={columnFilters}\n\t\t\t\tonPaginationChange={handlePaginationChange}\n\t\t\t\tonSortChange={handleSortChange}\n\t\t\t\tonColumnFiltersChange={handleColumnFiltersChange}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","import { Pause } from \"lucide-react\";\nimport type { WorkPoolStatus } from \"@/api/work-pools\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { cn } from \"@/utils\";\n\ntype WorkPoolStatusBadgeProps = {\n\tstatus: WorkPoolStatus;\n\tclassName?: string;\n};\n\nconst getStatusLabel = (status: WorkPoolStatus): string => {\n\tswitch (status) {\n\t\tcase \"READY\":\n\t\t\treturn \"Ready\";\n\t\tcase \"PAUSED\":\n\t\t\treturn \"Paused\";\n\t\tcase \"NOT_READY\":\n\t\t\treturn \"Not Ready\";\n\t}\n};\n\nconst getStatusColor = (status: WorkPoolStatus): string => {\n\tswitch (status) {\n\t\tcase \"READY\":\n\t\t\treturn \"bg-green-500\";\n\t\tcase \"PAUSED\":\n\t\t\treturn \"bg-yellow-500\";\n\t\tcase \"NOT_READY\":\n\t\t\treturn \"bg-red-500\";\n\t}\n};\n\nexport const WorkPoolStatusBadge = ({\n\tstatus,\n\tclassName,\n}: WorkPoolStatusBadgeProps) => {\n\tconst label = getStatusLabel(status);\n\tconst colorClass = getStatusColor(status);\n\n\treturn (\n\t\t<Badge\n\t\t\tvariant=\"secondary\"\n\t\t\tclassName={cn(\"flex items-center space-x-1\", className)}\n\t\t>\n\t\t\t{status === \"PAUSED\" ? (\n\t\t\t\t<Pause className=\"h-2 w-2 text-muted-foreground\" />\n\t\t\t) : (\n\t\t\t\t<div className={cn(\"h-2 w-2 rounded-full\", colorClass)} />\n\t\t\t)}\n\t\t\t<span>{label}</span>\n\t\t</Badge>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useMemo } from \"react\";\n\nimport type { WorkPool } from \"@/api/work-pools\";\nimport { buildListWorkPoolWorkersQuery } from \"@/api/work-pools\";\nimport type { SchemaProperty } from \"@/components/schemas/schema-display\";\nimport { FormattedDate } from \"@/components/ui/formatted-date\";\nimport { Separator } from \"@/components/ui/separator\";\nimport { WorkPoolStatusBadge } from \"@/components/work-pools/work-pool-status-badge\";\nimport { cn, titleCase } from \"@/utils\";\n\ntype WorkPoolDetailsProps = {\n\tworkPool: WorkPool;\n\talternate?: boolean;\n\tclassName?: string;\n};\n\n// Helper components for field display\nconst None = () => <dd className=\"text-muted-foreground text-sm\">None</dd>;\nconst FieldLabel = ({ children }: { children: React.ReactNode }) => (\n\t<dt className=\"text-sm text-muted-foreground\">{children}</dt>\n);\nconst FieldValue = ({\n\tchildren,\n\tclassName,\n}: {\n\tchildren: React.ReactNode;\n\tclassName?: string;\n}) => <dd className={cn(\"text-sm\", className)}>{children}</dd>;\n\n// Basic Info Section Component\nfunction BasicInfoSection({ workPool }: { workPool: WorkPool }) {\n\tconst { data: workers = [], isLoading } = useQuery(\n\t\tbuildListWorkPoolWorkersQuery(workPool.name),\n\t);\n\n\tconst lastPolled = useMemo(() => {\n\t\tif (isLoading) return null;\n\t\tif (workers.length === 0) return null;\n\n\t\tconst heartbeats = workers\n\t\t\t.map((w) => w.last_heartbeat_time)\n\t\t\t.filter((time): time is string => Boolean(time))\n\t\t\t.sort((a, b) => new Date(b).getTime() - new Date(a).getTime());\n\n\t\treturn heartbeats[0] || null;\n\t}, [workers, isLoading]);\n\n\tconst fields = [\n\t\t{\n\t\t\tfield: \"Status\",\n\t\t\tComponentValue: () => (\n\t\t\t\t<dd>\n\t\t\t\t\t<WorkPoolStatusBadge status={workPool.status || \"NOT_READY\"} />\n\t\t\t\t</dd>\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\tfield: \"Description\",\n\t\t\tComponentValue: () =>\n\t\t\t\tworkPool.description ? (\n\t\t\t\t\t<FieldValue>{workPool.description}</FieldValue>\n\t\t\t\t) : null,\n\t\t},\n\t\t{\n\t\t\tfield: \"Type\",\n\t\t\tComponentValue: () =>\n\t\t\t\tworkPool.type ? (\n\t\t\t\t\t<FieldValue>{titleCase(workPool.type)}</FieldValue>\n\t\t\t\t) : (\n\t\t\t\t\t<None />\n\t\t\t\t),\n\t\t},\n\t\t{\n\t\t\tfield: \"Concurrency Limit\",\n\t\t\tComponentValue: () => (\n\t\t\t\t<FieldValue>\n\t\t\t\t\t{workPool.concurrency_limit\n\t\t\t\t\t\t? String(workPool.concurrency_limit)\n\t\t\t\t\t\t: \"Unlimited\"}\n\t\t\t\t</FieldValue>\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\tfield: \"Last Polled\",\n\t\t\tComponentValue: () =>\n\t\t\t\tlastPolled ? (\n\t\t\t\t\t<FieldValue>\n\t\t\t\t\t\t<FormattedDate date={lastPolled} />\n\t\t\t\t\t</FieldValue>\n\t\t\t\t) : workers.length === 0 ? null : (\n\t\t\t\t\t<FieldValue className=\"text-muted-foreground\">\n\t\t\t\t\t\tNo recent activity\n\t\t\t\t\t</FieldValue>\n\t\t\t\t),\n\t\t},\n\t\t{\n\t\t\tfield: \"Created\",\n\t\t\tComponentValue: () =>\n\t\t\t\tworkPool.created ? (\n\t\t\t\t\t<FieldValue>\n\t\t\t\t\t\t<FormattedDate date={workPool.created} />\n\t\t\t\t\t</FieldValue>\n\t\t\t\t) : (\n\t\t\t\t\t<None />\n\t\t\t\t),\n\t\t},\n\t\t{\n\t\t\tfield: \"Last Updated\",\n\t\t\tComponentValue: () =>\n\t\t\t\tworkPool.updated ? (\n\t\t\t\t\t<FieldValue>\n\t\t\t\t\t\t<FormattedDate date={workPool.updated} />\n\t\t\t\t\t</FieldValue>\n\t\t\t\t) : (\n\t\t\t\t\t<None />\n\t\t\t\t),\n\t\t},\n\t].filter(({ ComponentValue }) => ComponentValue() !== null);\n\n\tif (isLoading) {\n\t\treturn (\n\t\t\t<div className=\"text-muted-foreground text-sm\">\n\t\t\t\tLoading work pool details...\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div>\n\t\t\t<ul className=\"flex flex-col gap-3\">\n\t\t\t\t{fields.map(({ field, ComponentValue }) => (\n\t\t\t\t\t<li key={field}>\n\t\t\t\t\t\t<dl>\n\t\t\t\t\t\t\t<FieldLabel>{field}</FieldLabel>\n\t\t\t\t\t\t\t<ComponentValue />\n\t\t\t\t\t\t</dl>\n\t\t\t\t\t</li>\n\t\t\t\t))}\n\t\t\t</ul>\n\t\t</div>\n\t);\n}\n\n// Job Template Section Component\nfunction JobTemplateSection({ workPool }: { workPool: WorkPool }) {\n\t// Check if work pool has base job template\n\tconst baseJobTemplate = workPool.base_job_template;\n\n\tif (\n\t\t!baseJobTemplate?.variables ||\n\t\ttypeof baseJobTemplate.variables !== \"object\" ||\n\t\t!(\"properties\" in baseJobTemplate.variables) ||\n\t\t!baseJobTemplate.variables.properties\n\t) {\n\t\treturn null;\n\t}\n\n\tconst properties = baseJobTemplate.variables.properties as Record<\n\t\tstring,\n\t\tSchemaProperty\n\t>;\n\n\t// Helper function to format field names (from property title or key)\n\tconst formatFieldName = (key: string, property: SchemaProperty): string => {\n\t\treturn (\n\t\t\tproperty.title ||\n\t\t\tkey\n\t\t\t\t.split(\"_\")\n\t\t\t\t.map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n\t\t\t\t.join(\" \")\n\t\t);\n\t};\n\n\t// Helper function to format field values\n\tconst formatValue = (value: unknown): string => {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn \"None\";\n\t\t}\n\t\tif (typeof value === \"boolean\") {\n\t\t\treturn value.toString();\n\t\t}\n\t\tif (Array.isArray(value)) {\n\t\t\treturn value.length > 0 ? value.join(\", \") : \"None\";\n\t\t}\n\t\tif (typeof value === \"object\") {\n\t\t\treturn JSON.stringify(value);\n\t\t}\n\t\t// At this point, value is a primitive (string, number, bigint, symbol)\n\t\treturn String(value as string | number | bigint | symbol);\n\t};\n\n\treturn (\n\t\t<div>\n\t\t\t<h3 className=\"mb-4 text-md\">Base Job Configuration</h3>\n\t\t\t<ul className=\"flex flex-col gap-3\">\n\t\t\t\t{Object.entries(properties).map(([key, property]) => {\n\t\t\t\t\tconst value = property.default ?? null;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<li key={key} className=\"flex flex-col gap-1 text-sm\">\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground font-medium\">\n\t\t\t\t\t\t\t\t{formatFieldName(key, property)}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span className=\"break-words\">{formatValue(value)}</span>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</ul>\n\t\t</div>\n\t);\n}\n\nexport function WorkPoolDetails({\n\tworkPool,\n\talternate = false,\n\tclassName,\n}: WorkPoolDetailsProps) {\n\tconst spacing = alternate ? \"space-y-4\" : \"space-y-6\";\n\n\treturn (\n\t\t<div className={cn(spacing, className)}>\n\t\t\t<BasicInfoSection workPool={workPool} />\n\n\t\t\t{Boolean(\n\t\t\t\tworkPool.base_job_template?.variables &&\n\t\t\t\t\ttypeof workPool.base_job_template.variables === \"object\" &&\n\t\t\t\t\t\"properties\" in workPool.base_job_template.variables &&\n\t\t\t\t\tworkPool.base_job_template.variables.properties &&\n\t\t\t\t\tObject.keys(\n\t\t\t\t\t\tworkPool.base_job_template.variables.properties as Record<\n\t\t\t\t\t\t\tstring,\n\t\t\t\t\t\t\tunknown\n\t\t\t\t\t\t>,\n\t\t\t\t\t).length > 0,\n\t\t\t) && (\n\t\t\t\t<>\n\t\t\t\t\t<Separator />\n\t\t\t\t\t<JobTemplateSection workPool={workPool} />\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport {\n\tbuildCountFlowRunsQuery,\n\tbuildPaginateFlowRunsQuery,\n\ttype FlowRunsCountFilter,\n\ttype FlowRunsPaginateFilter,\n\ttype FlowRunWithFlow,\n} from \"@/api/flow-runs\";\nimport { buildListFlowsQuery, type Flow } from \"@/api/flows\";\nimport { FlowRunsList } from \"@/components/flow-runs/flow-runs-list\";\nimport { StateFilter } from \"@/components/flow-runs/flow-runs-list/flow-runs-filters/state-filter\";\nimport type { FlowRunState } from \"@/components/flow-runs/flow-runs-list/flow-runs-filters/state-filters.constants\";\nimport {\n\tFlowRunsPagination,\n\ttype PaginationState,\n} from \"@/components/flow-runs/flow-runs-list/flow-runs-pagination\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport useDebounce from \"@/hooks/use-debounce\";\n\ntype WorkPoolFlowRunsTabProps = {\n\tworkPoolName: string;\n\tclassName?: string;\n};\n\nexport const WorkPoolFlowRunsTab = ({\n\tworkPoolName,\n\tclassName,\n}: WorkPoolFlowRunsTabProps) => {\n\tconst [pagination, setPagination] = useState<PaginationState>({\n\t\tlimit: 10,\n\t\tpage: 1,\n\t});\n\tconst [searchTerm, setSearchTerm] = useState(\"\");\n\tconst [selectedStates, setSelectedStates] = useState<Set<FlowRunState>>(\n\t\tnew Set(),\n\t);\n\n\t// Debounce the search term to avoid too many API calls\n\tconst debouncedSearchTerm = useDebounce(searchTerm, 500);\n\n\tconst filter: FlowRunsPaginateFilter = useMemo(() => {\n\t\tconst baseFilter: FlowRunsPaginateFilter = {\n\t\t\tpage: pagination.page,\n\t\t\tlimit: pagination.limit,\n\t\t\tsort: \"START_TIME_DESC\",\n\t\t\twork_pools: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tname: { any_: [workPoolName] },\n\t\t\t},\n\t\t};\n\n\t\t// Add search filter if search term exists\n\t\tif (debouncedSearchTerm.trim()) {\n\t\t\tbaseFilter.flow_runs = {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tname: { like_: debouncedSearchTerm.trim() },\n\t\t\t};\n\t\t}\n\n\t\t// Add state filter if states are selected\n\t\tif (selectedStates.size > 0) {\n\t\t\tconst stateFilter = {\n\t\t\t\tstate: {\n\t\t\t\t\toperator: \"and_\" as const,\n\t\t\t\t\tname: { any_: Array.from(selectedStates) },\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tif (baseFilter.flow_runs) {\n\t\t\t\t// Merge with existing flow_runs filter\n\t\t\t\tbaseFilter.flow_runs = {\n\t\t\t\t\t...baseFilter.flow_runs,\n\t\t\t\t\t...stateFilter,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tbaseFilter.flow_runs = {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t...stateFilter,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn baseFilter;\n\t}, [workPoolName, pagination, debouncedSearchTerm, selectedStates]);\n\n\tconst countFilter: FlowRunsCountFilter = useMemo(() => {\n\t\tconst baseCountFilter: FlowRunsCountFilter = {\n\t\t\twork_pools: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tname: { any_: [workPoolName] },\n\t\t\t},\n\t\t};\n\n\t\t// Add search filter to count if search term exists\n\t\tif (debouncedSearchTerm.trim()) {\n\t\t\tbaseCountFilter.flow_runs = {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tname: { like_: debouncedSearchTerm.trim() },\n\t\t\t};\n\t\t}\n\n\t\t// Add state filter to count if states are selected\n\t\tif (selectedStates.size > 0) {\n\t\t\tconst stateFilter = {\n\t\t\t\tstate: {\n\t\t\t\t\toperator: \"and_\" as const,\n\t\t\t\t\tname: { any_: Array.from(selectedStates) },\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tif (baseCountFilter.flow_runs) {\n\t\t\t\t// Merge with existing flow_runs filter\n\t\t\t\tbaseCountFilter.flow_runs = {\n\t\t\t\t\t...baseCountFilter.flow_runs,\n\t\t\t\t\t...stateFilter,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tbaseCountFilter.flow_runs = {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t...stateFilter,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn baseCountFilter;\n\t}, [workPoolName, debouncedSearchTerm, selectedStates]);\n\n\t// Fetch paginated flow runs data\n\tconst { data: paginatedData } = useQuery(buildPaginateFlowRunsQuery(filter));\n\n\t// Fetch total count for pagination\n\tconst { data: totalCount } = useQuery(buildCountFlowRunsQuery(countFilter));\n\n\t// Get unique flow IDs for fetching flow details\n\tconst flowIds = useMemo(\n\t\t() => [\n\t\t\t...new Set(\n\t\t\t\t(paginatedData?.results ?? []).map((flowRun) => flowRun.flow_id),\n\t\t\t),\n\t\t],\n\t\t[paginatedData?.results],\n\t);\n\n\t// Fetch flow details\n\tconst { data: flows } = useQuery(\n\t\tbuildListFlowsQuery(\n\t\t\t{\n\t\t\t\tflows: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tid: { any_: flowIds },\n\t\t\t\t},\n\t\t\t\toffset: 0,\n\t\t\t\tsort: \"NAME_ASC\",\n\t\t\t},\n\t\t\t{ enabled: flowIds.length > 0 },\n\t\t),\n\t);\n\n\t// Combine flow runs with their corresponding flows\n\tconst flowRunsWithFlows = useMemo(() => {\n\t\tif (!paginatedData?.results) return [];\n\t\tconst flowMap = new Map(flows?.map((flow: Flow) => [flow.id, flow]) ?? []);\n\t\treturn paginatedData.results\n\t\t\t.map((flowRun) => {\n\t\t\t\tconst flow = flowMap.get(flowRun.flow_id);\n\t\t\t\tif (!flow) return null;\n\t\t\t\treturn {\n\t\t\t\t\t...flowRun,\n\t\t\t\t\tflow,\n\t\t\t\t};\n\t\t\t})\n\t\t\t.filter((flowRun) => flowRun !== null) as FlowRunWithFlow[];\n\t}, [paginatedData?.results, flows]);\n\n\tconst handleSearchChange = useCallback(\n\t\t(event: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tsetSearchTerm(event.target.value);\n\t\t\t// Reset to first page when searching\n\t\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t\t},\n\t\t[],\n\t);\n\n\tconst handlePaginationChange = useCallback(\n\t\t(newPagination: PaginationState) => {\n\t\t\tsetPagination(newPagination);\n\t\t},\n\t\t[],\n\t);\n\n\tconst handleStateFilterChange = useCallback(\n\t\t(newSelectedStates: Set<FlowRunState>) => {\n\t\t\tsetSelectedStates(newSelectedStates);\n\t\t\t// Reset to first page when filtering\n\t\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t\t},\n\t\t[],\n\t);\n\n\tconst handleClearFilters = useCallback(() => {\n\t\tsetSearchTerm(\"\");\n\t\tsetSelectedStates(new Set());\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t}, []);\n\n\t// Show loading only on initial load, not on pagination/filtering changes\n\tif (!paginatedData || totalCount === undefined) {\n\t\treturn (\n\t\t\t<div className={className}>\n\t\t\t\t<div className=\"text-muted-foreground text-center py-8\">\n\t\t\t\t\tLoading flow runs...\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={className}>\n\t\t\t{/* Search and Filter Controls */}\n\t\t\t<div className=\"flex flex-col sm:flex-row gap-4 mb-6\">\n\t\t\t\t<div className=\"flex-1\">\n\t\t\t\t\t<SearchInput\n\t\t\t\t\t\tplaceholder=\"Search flow runs by name...\"\n\t\t\t\t\t\tvalue={searchTerm}\n\t\t\t\t\t\tonChange={handleSearchChange}\n\t\t\t\t\t\tdebounceMs={500}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"w-full sm:w-64\">\n\t\t\t\t\t<StateFilter\n\t\t\t\t\t\tselectedFilters={selectedStates}\n\t\t\t\t\t\tonSelectFilter={handleStateFilterChange}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Flow Runs List */}\n\t\t\t<FlowRunsList\n\t\t\t\tflowRuns={flowRunsWithFlows}\n\t\t\t\tonClearFilters={\n\t\t\t\t\tflowRunsWithFlows.length === 0 ? handleClearFilters : undefined\n\t\t\t\t}\n\t\t\t/>\n\n\t\t\t{/* Pagination Controls */}\n\t\t\t{paginatedData.pages > 1 && (\n\t\t\t\t<div className=\"mt-6\">\n\t\t\t\t\t<FlowRunsPagination\n\t\t\t\t\t\tcount={totalCount}\n\t\t\t\t\t\tpages={paginatedData.pages}\n\t\t\t\t\t\tpagination={pagination}\n\t\t\t\t\t\tonChangePagination={handlePaginationChange}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { useNavigate } from \"@tanstack/react-router\";\nimport { toast } from \"sonner\";\nimport type { WorkPool } from \"@/api/work-pools\";\nimport { useDeleteWorkPool } from \"@/api/work-pools\";\nimport { DeleteConfirmationDialog } from \"@/components/ui/delete-confirmation-dialog\";\n\ntype DeleteWorkPoolDialogProps = {\n\tworkPool: WorkPool;\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n\tonDeleted?: () => void;\n};\n\nexport const DeleteWorkPoolDialog = ({\n\tworkPool,\n\topen,\n\tonOpenChange,\n\tonDeleted,\n}: DeleteWorkPoolDialogProps) => {\n\tconst navigate = useNavigate();\n\tconst { deleteWorkPool, isPending } = useDeleteWorkPool();\n\n\tconst handleDelete = () => {\n\t\tdeleteWorkPool(workPool.name, {\n\t\t\tonSuccess: () => {\n\t\t\t\ttoast.success(\"Work pool deleted successfully\");\n\t\t\t\tonDeleted?.();\n\t\t\t\tvoid navigate({ to: \"/work-pools\" });\n\t\t\t},\n\t\t\tonError: () => {\n\t\t\t\ttoast.error(\"Failed to delete work pool\");\n\t\t\t},\n\t\t});\n\t};\n\n\treturn (\n\t\t<DeleteConfirmationDialog\n\t\t\tisOpen={open}\n\t\t\ttitle=\"Delete Work Pool\"\n\t\t\tdescription={`Are you sure you want to delete the work pool \"${workPool.name}\"? This action cannot be undone.`}\n\t\t\tconfirmText={workPool.name}\n\t\t\tisLoading={isPending}\n\t\t\tloadingText=\"Deleting...\"\n\t\t\tonConfirm={handleDelete}\n\t\t\tonClose={() => onOpenChange(false)}\n\t\t/>\n\t);\n};\n","import { useNavigate } from \"@tanstack/react-router\";\nimport { Copy, Edit, MoreVertical, Trash2, Zap } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport type { WorkPool } from \"@/api/work-pools\";\n\nexport const useWorkPoolMenu = (workPool: WorkPool) => {\n\tconst navigate = useNavigate();\n\tconst [showDeleteDialog, setShowDeleteDialog] = useState(false);\n\n\tconst handleCopyId = () => {\n\t\tvoid navigator.clipboard.writeText(workPool.id);\n\t\ttoast.success(\"ID copied to clipboard\");\n\t};\n\n\tconst handleEdit = () => {\n\t\tvoid navigate({\n\t\t\tto: \"/work-pools/work-pool/$workPoolName/edit\",\n\t\t\tparams: { workPoolName: workPool.name },\n\t\t});\n\t};\n\n\tconst handleAutomate = () => {\n\t\t// TODO: Add search params when route supports it\n\t\tvoid navigate({\n\t\t\tto: \"/automations/create\",\n\t\t});\n\t};\n\n\tconst menuItems = [\n\t\t{\n\t\t\tlabel: \"Copy ID\",\n\t\t\ticon: Copy,\n\t\t\taction: handleCopyId,\n\t\t\tshow: true,\n\t\t},\n\t\t{\n\t\t\tlabel: \"Edit\",\n\t\t\ticon: Edit,\n\t\t\taction: handleEdit,\n\t\t\tshow: true, // TODO: Check workPool.can?.update when permissions are available\n\t\t},\n\t\t{\n\t\t\tlabel: \"Delete\",\n\t\t\ticon: Trash2,\n\t\t\taction: () => setShowDeleteDialog(true),\n\t\t\tshow: true, // TODO: Check workPool.can?.delete when permissions are available\n\t\t\tvariant: \"destructive\" as const,\n\t\t},\n\t\t{\n\t\t\tlabel: \"Automate\",\n\t\t\ticon: Zap,\n\t\t\taction: handleAutomate,\n\t\t\tshow: true,\n\t\t},\n\t].filter((item) => item.show);\n\n\treturn {\n\t\tmenuItems,\n\t\tshowDeleteDialog,\n\t\tsetShowDeleteDialog,\n\t\ttriggerIcon: MoreVertical,\n\t};\n};\n","import type { WorkPool } from \"@/api/work-pools\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { cn } from \"@/utils\";\nimport { DeleteWorkPoolDialog } from \"./components/delete-work-pool-dialog\";\nimport { useWorkPoolMenu } from \"./hooks/use-work-pool-menu\";\n\ntype WorkPoolMenuProps = {\n\tworkPool: WorkPool;\n\tonUpdate?: () => void;\n\tclassName?: string;\n};\n\nexport const WorkPoolMenu = ({\n\tworkPool,\n\tonUpdate,\n\tclassName,\n}: WorkPoolMenuProps) => {\n\tconst {\n\t\tmenuItems,\n\t\tshowDeleteDialog,\n\t\tsetShowDeleteDialog,\n\t\ttriggerIcon: TriggerIcon,\n\t} = useWorkPoolMenu(workPool);\n\n\treturn (\n\t\t<>\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tclassName={cn(\"size-8\", className)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className=\"sr-only\">Open menu</span>\n\t\t\t\t\t\t<TriggerIcon className=\"size-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t\t{menuItems.map((item) => {\n\t\t\t\t\t\tconst Icon = item.icon;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\t\t\tkey={item.label}\n\t\t\t\t\t\t\t\tonClick={item.action}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\titem.variant === \"destructive\" && \"text-destructive\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon className=\"mr-2 h-4 w-4\" />\n\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t\t<DeleteWorkPoolDialog\n\t\t\t\tworkPool={workPool}\n\t\t\t\topen={showDeleteDialog}\n\t\t\t\tonOpenChange={setShowDeleteDialog}\n\t\t\t\tonDeleted={onUpdate}\n\t\t\t/>\n\t\t</>\n\t);\n};\n","import { useCallback } from \"react\";\nimport { toast } from \"sonner\";\nimport type { WorkPool } from \"@/api/work-pools\";\nimport { usePauseWorkPool, useResumeWorkPool } from \"@/api/work-pools\";\n\nexport const useWorkPoolToggle = (\n\tworkPool: WorkPool,\n\tonUpdate?: () => void,\n) => {\n\tconst { pauseWorkPool, isPending: pausePending } = usePauseWorkPool();\n\tconst { resumeWorkPool, isPending: resumePending } = useResumeWorkPool();\n\n\tconst handleToggle = useCallback(\n\t\t(checked: boolean) => {\n\t\t\tif (checked) {\n\t\t\t\t// Switch is checked = work pool should be active (resume)\n\t\t\t\tresumeWorkPool(workPool.name, {\n\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\ttoast.success(\"Work pool resumed\");\n\t\t\t\t\t\tonUpdate?.();\n\t\t\t\t\t},\n\t\t\t\t\tonError: () => {\n\t\t\t\t\t\ttoast.error(\"Failed to resume work pool\");\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Switch is unchecked = work pool should be paused\n\t\t\t\tpauseWorkPool(workPool.name, {\n\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\ttoast.success(\"Work pool paused\");\n\t\t\t\t\t\tonUpdate?.();\n\t\t\t\t\t},\n\t\t\t\t\tonError: () => {\n\t\t\t\t\t\ttoast.error(\"Failed to pause work pool\");\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t[workPool.name, pauseWorkPool, resumeWorkPool, onUpdate],\n\t);\n\n\treturn {\n\t\thandleToggle,\n\t\tisLoading: pausePending || resumePending,\n\t};\n};\n","import type { WorkPool } from \"@/api/work-pools\";\nimport { Switch } from \"@/components/ui/switch\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { cn } from \"@/utils\";\nimport { useWorkPoolToggle } from \"./hooks/use-work-pool-toggle\";\n\ntype WorkPoolToggleProps = {\n\tworkPool: WorkPool;\n\tonUpdate?: () => void;\n\tclassName?: string;\n};\n\nexport const WorkPoolToggle = ({\n\tworkPool,\n\tonUpdate,\n\tclassName,\n}: WorkPoolToggleProps) => {\n\tconst { handleToggle, isLoading } = useWorkPoolToggle(workPool, onUpdate);\n\tconst isPaused = workPool.status === \"PAUSED\";\n\n\treturn (\n\t\t<Tooltip>\n\t\t\t<TooltipTrigger asChild>\n\t\t\t\t<div>\n\t\t\t\t\t<Switch\n\t\t\t\t\t\tchecked={!isPaused}\n\t\t\t\t\t\tonCheckedChange={handleToggle}\n\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\taria-label={isPaused ? \"Resume work pool\" : \"Pause work pool\"}\n\t\t\t\t\t\tclassName={cn(className)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</TooltipTrigger>\n\t\t\t<TooltipContent>\n\t\t\t\t<p>Pause or resume this work pool</p>\n\t\t\t</TooltipContent>\n\t\t</Tooltip>\n\t);\n};\n","import type { WorkPool } from \"@/api/work-pools\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n\tBreadcrumbPage,\n\tBreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { cn } from \"@/utils\";\nimport { WorkPoolMenu } from \"../work-pool-menu\";\nimport { WorkPoolToggle } from \"../work-pool-toggle\";\n\ntype WorkPoolPageHeaderProps = {\n\tworkPool: WorkPool;\n\tonUpdate?: () => void;\n\tclassName?: string;\n};\n\nexport const WorkPoolPageHeader = ({\n\tworkPool,\n\tonUpdate,\n\tclassName,\n}: WorkPoolPageHeaderProps) => {\n\treturn (\n\t\t<header\n\t\t\tclassName={cn(\n\t\t\t\t\"flex mb-4 flex-row items-center justify-between\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<Breadcrumb className={className}>\n\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t\t<BreadcrumbLink to=\"/work-pools\" className=\"text-xl font-semibold\">\n\t\t\t\t\t\t\tWork pools\n\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\t<BreadcrumbPage>{workPool.name}</BreadcrumbPage>\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t\t<div className=\"flex items-center space-x-2\">\n\t\t\t\t<WorkPoolToggle workPool={workPool} onUpdate={onUpdate} />\n\t\t\t\t<WorkPoolMenu workPool={workPool} onUpdate={onUpdate} />\n\t\t\t</div>\n\t\t</header>\n\t);\n};\n","import { Clock } from \"lucide-react\";\nimport type { ReactElement } from \"react\";\n\nimport { Badge } from \"@/components/ui/badge\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipProvider,\n\tTooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { cn } from \"@/utils\";\n\ntype LateFlowRunsIndicatorProps = {\n\tlateRunsCount: number;\n\tclassName?: string;\n};\n\nexport const LateFlowRunsIndicator = ({\n\tlateRunsCount,\n\tclassName,\n}: LateFlowRunsIndicatorProps): ReactElement | null => {\n\tif (lateRunsCount === 0) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<TooltipProvider>\n\t\t\t<Tooltip>\n\t\t\t\t<TooltipTrigger>\n\t\t\t\t\t<Badge\n\t\t\t\t\t\tvariant=\"warning\"\n\t\t\t\t\t\tclassName={cn(\"flex items-center space-x-1\", className)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Clock className=\"h-3 w-3\" />\n\t\t\t\t\t\t<span>{lateRunsCount}</span>\n\t\t\t\t\t</Badge>\n\t\t\t\t</TooltipTrigger>\n\t\t\t\t<TooltipContent>\n\t\t\t\t\t<div className=\"space-y-1\">\n\t\t\t\t\t\t<p className=\"font-semibold\">Late Flow Runs</p>\n\t\t\t\t\t\t<p className=\"text-sm\">\n\t\t\t\t\t\t\t{lateRunsCount} flow run{lateRunsCount === 1 ? \"\" : \"s\"} running\n\t\t\t\t\t\t\tlate\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t</TooltipContent>\n\t\t\t</Tooltip>\n\t\t</TooltipProvider>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { Link } from \"@tanstack/react-router\";\nimport { buildCountFlowRunsQuery } from \"@/api/flow-runs\";\nimport type { WorkPoolQueue } from \"@/api/work-pool-queues\";\nimport { LateFlowRunsIndicator } from \"@/components/flow-runs/late-flow-runs-indicator\";\n\ntype QueueNameWithLateIndicatorProps = {\n\tqueue: WorkPoolQueue;\n};\n\nexport const QueueNameWithLateIndicator = ({\n\tqueue,\n}: QueueNameWithLateIndicatorProps) => {\n\tconst { data: lateRunsCount = 0 } = useQuery(\n\t\tbuildCountFlowRunsQuery(\n\t\t\t{\n\t\t\t\twork_pools: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tname: { any_: [queue.work_pool_name || \"\"] },\n\t\t\t\t},\n\t\t\t\twork_pool_queues: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tname: { any_: [queue.name] },\n\t\t\t\t},\n\t\t\t\tflow_runs: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tstate: {\n\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\tname: { any_: [\"Late\"] },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t30000,\n\t\t),\n\t);\n\n\treturn (\n\t\t<div className=\"flex items-center space-x-2\">\n\t\t\t<Link\n\t\t\t\tto=\"/work-pools/work-pool/$workPoolName/queue/$workQueueName\"\n\t\t\t\tparams={{\n\t\t\t\t\tworkPoolName: queue.work_pool_name || \"\",\n\t\t\t\t\tworkQueueName: queue.name,\n\t\t\t\t}}\n\t\t\t\tclassName=\"font-medium text-blue-600 hover:text-blue-800\"\n\t\t\t>\n\t\t\t\t{queue.name}\n\t\t\t</Link>\n\t\t\t<LateFlowRunsIndicator lateRunsCount={lateRunsCount} />\n\t\t</div>\n\t);\n};\n","import { Link } from \"@tanstack/react-router\";\nimport type { ColumnDef } from \"@tanstack/react-table\";\nimport { HelpCircle } from \"lucide-react\";\nimport type { WorkPoolQueue } from \"@/api/work-pool-queues\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipProvider,\n\tTooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { WorkPoolQueueStatusBadge } from \"@/components/work-pools/work-pool-queue-status-badge\";\nimport { WorkPoolQueueMenu } from \"../../work-pool-queue-menu\";\nimport { WorkPoolQueueToggle } from \"../../work-pool-queue-toggle\";\nimport { QueueNameWithLateIndicator } from \"./queue-name-with-late-indicator\";\n\ntype WorkPoolQueuesTableColumnsOptions = {\n\tenableSelection?: boolean;\n\tenableLateIndicator?: boolean;\n};\n\nexport const createWorkPoolQueuesTableColumns = ({\n\tenableLateIndicator = false,\n}: WorkPoolQueuesTableColumnsOptions = {}): ColumnDef<WorkPoolQueue>[] => {\n\tconst columns: ColumnDef<WorkPoolQueue>[] = [];\n\t// Name column with conditional late indicator\n\tcolumns.push({\n\t\taccessorKey: \"name\",\n\t\theader: ({ column }) => (\n\t\t\t<Button\n\t\t\t\tvariant=\"ghost\"\n\t\t\t\tonClick={() => column.toggleSorting(column.getIsSorted() === \"asc\")}\n\t\t\t\tclassName=\"h-auto p-0 font-semibold\"\n\t\t\t>\n\t\t\t\tName\n\t\t\t</Button>\n\t\t),\n\t\tcell: ({ row }) => {\n\t\t\tconst queue = row.original;\n\n\t\t\tif (enableLateIndicator) {\n\t\t\t\treturn <QueueNameWithLateIndicator queue={queue} />;\n\t\t\t}\n\n\t\t\t// Basic name cell with link\n\t\t\treturn (\n\t\t\t\t<div className=\"flex items-center space-x-2\">\n\t\t\t\t\t<Link\n\t\t\t\t\t\tto=\"/work-pools/work-pool/$workPoolName/queue/$workQueueName\"\n\t\t\t\t\t\tparams={{\n\t\t\t\t\t\t\tworkPoolName: queue.work_pool_name || \"\",\n\t\t\t\t\t\t\tworkQueueName: queue.name,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName=\"font-medium text-blue-600 hover:text-blue-800\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{queue.name}\n\t\t\t\t\t</Link>\n\t\t\t\t</div>\n\t\t\t);\n\t\t},\n\t});\n\n\t// Concurrency limit column\n\tcolumns.push({\n\t\taccessorKey: \"concurrency_limit\",\n\t\theader: ({ column }) => (\n\t\t\t<Button\n\t\t\t\tvariant=\"ghost\"\n\t\t\t\tonClick={() => column.toggleSorting(column.getIsSorted() === \"asc\")}\n\t\t\t\tclassName=\"h-auto p-0 font-semibold\"\n\t\t\t>\n\t\t\t\tConcurrency Limit\n\t\t\t</Button>\n\t\t),\n\t\tcell: ({ row }) => {\n\t\t\tconst limit = row.original.concurrency_limit;\n\t\t\treturn limit !== null && limit !== undefined ? limit.toString() : \"∞\";\n\t\t},\n\t});\n\n\t// Priority column\n\tcolumns.push({\n\t\taccessorKey: \"priority\",\n\t\theader: ({ column }) => (\n\t\t\t<div className=\"flex items-center space-x-1\">\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tonClick={() => column.toggleSorting(column.getIsSorted() === \"asc\")}\n\t\t\t\t\tclassName=\"h-auto p-0 font-semibold\"\n\t\t\t\t>\n\t\t\t\t\tPriority\n\t\t\t\t</Button>\n\t\t\t\t<TooltipProvider>\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger>\n\t\t\t\t\t\t\t<HelpCircle className=\"h-4 w-4 text-muted-foreground\" />\n\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\t<p>Lower numbers have higher priority</p>\n\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t</TooltipProvider>\n\t\t\t</div>\n\t\t),\n\t\tcell: ({ row }) => row.original.priority,\n\t});\n\n\t// Status column\n\tcolumns.push({\n\t\taccessorKey: \"status\",\n\t\theader: \"Status\",\n\t\tcell: ({ row }) => (\n\t\t\t<WorkPoolQueueStatusBadge status={row.original.status || \"READY\"} />\n\t\t),\n\t});\n\n\t// Actions column\n\tcolumns.push({\n\t\tid: \"actions\",\n\t\theader: \"\",\n\t\tcell: ({ row }) => (\n\t\t\t<div className=\"flex items-center justify-end gap-2\">\n\t\t\t\t<WorkPoolQueueToggle queue={row.original} />\n\t\t\t\t<WorkPoolQueueMenu queue={row.original} />\n\t\t\t</div>\n\t\t),\n\t\tenableSorting: false,\n\t});\n\n\treturn columns;\n};\n\n// Basic version for backward compatibility\nexport const workPoolQueuesTableColumns: ColumnDef<WorkPoolQueue>[] =\n\tcreateWorkPoolQueuesTableColumns();\n","import { Plus, Search } from \"lucide-react\";\nimport { Button } from \"@/components/ui/button\";\n\ntype WorkPoolQueuesTableEmptyStateProps = {\n\thasSearchQuery: boolean;\n\tworkPoolName: string;\n};\n\nexport const WorkPoolQueuesTableEmptyState = ({\n\thasSearchQuery,\n\tworkPoolName,\n}: WorkPoolQueuesTableEmptyStateProps) => {\n\tif (hasSearchQuery) {\n\t\treturn (\n\t\t\t<div className=\"flex flex-col items-center justify-center py-12 text-center\">\n\t\t\t\t<Search className=\"h-12 w-12 text-muted-foreground mb-4\" />\n\t\t\t\t<h3 className=\"text-lg font-medium text-foreground mb-2\">\n\t\t\t\t\tNo queues found\n\t\t\t\t</h3>\n\t\t\t\t<p className=\"text-muted-foreground mb-4\">\n\t\t\t\t\tNo queues match your search criteria. Try adjusting your search.\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col items-center justify-center py-12 text-center\">\n\t\t\t<div className=\"h-12 w-12 rounded-full bg-muted flex items-center justify-center mb-4\">\n\t\t\t\t<Plus className=\"h-6 w-6 text-muted-foreground\" />\n\t\t\t</div>\n\t\t\t<h3 className=\"text-lg font-medium text-foreground mb-2\">\n\t\t\t\tNo queues yet\n\t\t\t</h3>\n\t\t\t<p className=\"text-muted-foreground mb-4 max-w-md\">\n\t\t\t\tThis work pool doesn&apos;t have any queues yet. Create your first queue\n\t\t\t\tto start organizing work.\n\t\t\t</p>\n\t\t\t<Button\n\t\t\t\tonClick={() => {\n\t\t\t\t\t// TODO: Navigate to create queue page when route exists\n\t\t\t\t\tconsole.log(\"Create queue for pool:\", workPoolName);\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<Plus className=\"h-4 w-4 mr-2\" />\n\t\t\t\tCreate Queue\n\t\t\t</Button>\n\t\t</div>\n\t);\n};\n","import { Plus, Search } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { cn } from \"@/utils\";\nimport { WorkPoolQueueCreateOrEditDialog } from \"../../work-pool-queue-create-dialog\";\n\ntype WorkPoolQueuesTableToolbarProps = {\n\tsearchQuery: string;\n\tonSearchChange: (query: string) => void;\n\tresultsCount: number;\n\ttotalCount: number;\n\tworkPoolName: string;\n\tclassName?: string;\n};\n\nexport const WorkPoolQueuesTableToolbar = ({\n\tsearchQuery,\n\tonSearchChange,\n\tresultsCount,\n\ttotalCount,\n\tworkPoolName,\n\tclassName,\n}: WorkPoolQueuesTableToolbarProps) => {\n\tconst [showCreateDialog, setShowCreateDialog] = useState(false);\n\tconst showClearFilters = searchQuery.length > 0;\n\n\treturn (\n\t\t<div className={cn(\"space-y-4\", className)}>\n\t\t\t{/* Main toolbar */}\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<div className=\"flex items-center space-x-2\">\n\t\t\t\t\t<div className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t{searchQuery\n\t\t\t\t\t\t\t? `${resultsCount} of ${totalCount} Work Queue${totalCount !== 1 ? \"s\" : \"\"}`\n\t\t\t\t\t\t\t: `${totalCount} Work Queue${totalCount !== 1 ? \"s\" : \"\"}`}\n\t\t\t\t\t</div>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\tonClick={() => setShowCreateDialog(true)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Plus className=\"h-4 w-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"flex items-center space-x-2\">\n\t\t\t\t\t{showClearFilters && (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\tonClick={() => onSearchChange(\"\")}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tClear filters\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t\t<Search className=\"absolute left-2 top-2.5 h-4 w-4 text-muted-foreground\" />\n\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\tplaceholder=\"Search\"\n\t\t\t\t\t\t\tvalue={searchQuery}\n\t\t\t\t\t\t\tonChange={(e) => onSearchChange(e.target.value)}\n\t\t\t\t\t\t\tclassName=\"pl-8 w-64\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<WorkPoolQueueCreateOrEditDialog\n\t\t\t\tworkPoolName={workPoolName}\n\t\t\t\topen={showCreateDialog}\n\t\t\t\tonOpenChange={setShowCreateDialog}\n\t\t\t\tonSubmit={() => setShowCreateDialog(false)}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","import type { OnChangeFn, SortingState } from \"@tanstack/react-table\";\nimport {\n\tgetCoreRowModel,\n\tgetSortedRowModel,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport { useCallback } from \"react\";\nimport type { WorkPoolQueue } from \"@/api/work-pool-queues\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { cn } from \"@/utils\";\nimport { createWorkPoolQueuesTableColumns } from \"./components/work-pool-queues-table-columns\";\nimport { WorkPoolQueuesTableEmptyState } from \"./components/work-pool-queues-table-empty-state\";\nimport { WorkPoolQueuesTableToolbar } from \"./components/work-pool-queues-table-toolbar\";\n\ntype WorkPoolQueuesTableProps = {\n\tqueues: WorkPoolQueue[];\n\tsearchQuery: string;\n\tsortState: SortingState;\n\ttotalCount: number;\n\tworkPoolName: string;\n\tclassName?: string;\n\tonSearchChange: (query: string) => void;\n\tonSortingChange: OnChangeFn<SortingState>;\n};\n\nexport const WorkPoolQueuesTable = ({\n\tqueues,\n\tsearchQuery,\n\tsortState,\n\ttotalCount,\n\tworkPoolName,\n\tclassName,\n\tonSearchChange,\n\tonSortingChange,\n}: WorkPoolQueuesTableProps) => {\n\tconst handleSortingChange: OnChangeFn<SortingState> = useCallback(\n\t\t(updater) => {\n\t\t\tlet newSorting = sortState;\n\t\t\tif (typeof updater === \"function\") {\n\t\t\t\tnewSorting = updater(sortState);\n\t\t\t} else {\n\t\t\t\tnewSorting = updater;\n\t\t\t}\n\t\t\tonSortingChange(newSorting);\n\t\t},\n\t\t[sortState, onSortingChange],\n\t);\n\n\t// Create columns with late indicator enabled\n\tconst columns = createWorkPoolQueuesTableColumns({\n\t\tenableLateIndicator: true,\n\t});\n\n\t// Enhanced table configuration\n\tconst table = useReactTable({\n\t\tdata: queues,\n\t\tcolumns,\n\t\t// Core features\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tgetSortedRowModel: getSortedRowModel(),\n\t\tstate: {\n\t\t\tsorting: sortState,\n\t\t},\n\t\tonSortingChange: handleSortingChange,\n\t\tinitialState: {\n\t\t\tsorting: [{ id: \"name\", desc: false }],\n\t\t},\n\t});\n\n\tconst resultsCount = queues.length;\n\n\treturn (\n\t\t<div className={cn(\"space-y-4\", className)}>\n\t\t\t<WorkPoolQueuesTableToolbar\n\t\t\t\tsearchQuery={searchQuery}\n\t\t\t\tonSearchChange={onSearchChange}\n\t\t\t\tresultsCount={resultsCount}\n\t\t\t\ttotalCount={totalCount}\n\t\t\t\tworkPoolName={workPoolName}\n\t\t\t/>\n\t\t\t{resultsCount === 0 ? (\n\t\t\t\t<WorkPoolQueuesTableEmptyState\n\t\t\t\t\thasSearchQuery={!!searchQuery}\n\t\t\t\t\tworkPoolName={workPoolName}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<DataTable table={table} />\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import type { components } from \"@/api/prefect\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { cn } from \"@/utils\";\n\ntype WorkerStatus = components[\"schemas\"][\"WorkerStatus\"];\n\ntype WorkerStatusBadgeProps = {\n\tstatus: WorkerStatus;\n\tclassName?: string;\n};\n\nconst statusConfig = {\n\tONLINE: {\n\t\tlabel: \"Online\",\n\t\tcolor: \"bg-green-500\",\n\t},\n\tOFFLINE: {\n\t\tlabel: \"Offline\",\n\t\tcolor: \"bg-red-500\",\n\t},\n} as const satisfies Record<WorkerStatus, { label: string; color: string }>;\n\nexport const WorkerStatusBadge = ({\n\tstatus,\n\tclassName,\n}: WorkerStatusBadgeProps) => {\n\tconst config = statusConfig[status];\n\n\treturn (\n\t\t<Badge\n\t\t\tvariant=\"secondary\"\n\t\t\tclassName={cn(\"flex items-center space-x-1\", className)}\n\t\t>\n\t\t\t<div className={cn(\"h-2 w-2 rounded-full\", config.color)} />\n\t\t\t<span>{config.label}</span>\n\t\t</Badge>\n\t);\n};\n","import type { ColumnDef } from \"@tanstack/react-table\";\nimport type { WorkPoolWorker } from \"@/api/work-pools\";\nimport { FormattedDate } from \"@/components/ui/formatted-date\";\nimport { WorkerStatusBadge } from \"@/components/workers/worker-status-badge\";\n\nexport const createWorkersTableColumns = (): ColumnDef<WorkPoolWorker>[] => [\n\t{\n\t\taccessorKey: \"name\",\n\t\theader: \"Name\",\n\t\tcell: ({ row }) => {\n\t\t\tconst worker = row.original;\n\t\t\t// TODO: Add worker detail route when available\n\t\t\treturn <span className=\"font-medium\">{worker.name}</span>;\n\t\t},\n\t},\n\t{\n\t\taccessorKey: \"last_heartbeat_time\",\n\t\theader: \"Last Seen\",\n\t\tcell: ({ row }) => {\n\t\t\tconst lastSeen = row.original.last_heartbeat_time;\n\t\t\treturn <FormattedDate date={lastSeen} format=\"relative\" showTooltip />;\n\t\t},\n\t},\n\t{\n\t\taccessorKey: \"status\",\n\t\theader: \"Status\",\n\t\tcell: ({ row }) => <WorkerStatusBadge status={row.original.status} />,\n\t},\n];\n\ntype WorkersTableColumnsWithActionsProps = {\n\tworkPoolName: string;\n\tActionsComponent: React.ComponentType<{\n\t\tworker: WorkPoolWorker;\n\t\tworkPoolName: string;\n\t}>;\n};\n\nexport const createWorkersTableColumnsWithActions = ({\n\tworkPoolName,\n\tActionsComponent,\n}: WorkersTableColumnsWithActionsProps): ColumnDef<WorkPoolWorker>[] => [\n\t...createWorkersTableColumns(),\n\t{\n\t\tid: \"actions\",\n\t\theader: \"\",\n\t\tcell: ({ row }) => (\n\t\t\t<ActionsComponent worker={row.original} workPoolName={workPoolName} />\n\t\t),\n\t\tenableSorting: false,\n\t\tsize: 50,\n\t\tmaxSize: 50,\n\t},\n];\n","import { CodeBanner } from \"@/components/code-banner\";\nimport {\n\tEmptyState,\n\tEmptyStateActions,\n\tEmptyStateDescription,\n\tEmptyStateIcon,\n\tEmptyStateTitle,\n} from \"@/components/ui/empty-state\";\nimport { cn } from \"@/utils\";\n\nexport type WorkersTableEmptyStateProps = {\n\thasSearchQuery: boolean;\n\tworkPoolName: string;\n\tclassName?: string;\n};\n\nexport const WorkersTableEmptyState = ({\n\thasSearchQuery,\n\tworkPoolName,\n\tclassName,\n}: WorkersTableEmptyStateProps) => {\n\tif (hasSearchQuery) {\n\t\treturn (\n\t\t\t<EmptyState>\n\t\t\t\t<EmptyStateIcon id=\"Search\" />\n\t\t\t\t<EmptyStateTitle>No workers found</EmptyStateTitle>\n\t\t\t\t<EmptyStateDescription>\n\t\t\t\t\tNo workers match your search criteria.\n\t\t\t\t</EmptyStateDescription>\n\t\t\t</EmptyState>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={cn(\"space-y-4\", className)}>\n\t\t\t<EmptyState>\n\t\t\t\t<EmptyStateIcon id=\"Bot\" />\n\t\t\t\t<EmptyStateTitle>No workers running</EmptyStateTitle>\n\t\t\t\t<EmptyStateDescription>\n\t\t\t\t\tNo workers are currently running for the &ldquo;{workPoolName}&rdquo;\n\t\t\t\t\twork pool.\n\t\t\t\t</EmptyStateDescription>\n\t\t\t\t<EmptyStateActions>\n\t\t\t\t\t<CodeBanner\n\t\t\t\t\t\tcommand={`prefect worker start --pool \"${workPoolName}\"`}\n\t\t\t\t\t\ttitle=\"Start a worker\"\n\t\t\t\t\t\tsubtitle=\"Run this command to start a worker for this pool\"\n\t\t\t\t\t/>\n\t\t\t\t</EmptyStateActions>\n\t\t\t</EmptyState>\n\t\t</div>\n\t);\n};\n","import { toast } from \"sonner\";\nimport type { WorkPoolWorker } from \"@/api/work-pools\";\nimport { useDeleteWorker } from \"@/api/work-pools\";\nimport { DeleteConfirmationDialog } from \"@/components/ui/delete-confirmation-dialog\";\n\ntype DeleteWorkerDialogProps = {\n\tworker: WorkPoolWorker;\n\tworkPoolName: string;\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n\tonDeleted?: () => void;\n};\n\nexport const DeleteWorkerDialog = ({\n\tworker,\n\tworkPoolName,\n\topen,\n\tonOpenChange,\n\tonDeleted,\n}: DeleteWorkerDialogProps) => {\n\tconst { deleteWorker, isPending } = useDeleteWorker();\n\n\tconst handleDelete = () => {\n\t\tdeleteWorker(\n\t\t\t{\n\t\t\t\tworkPoolName,\n\t\t\t\tworkerName: worker.name,\n\t\t\t},\n\t\t\t{\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\ttoast.success(\"Worker deleted successfully\");\n\t\t\t\t\tonDeleted?.();\n\t\t\t\t\tonOpenChange(false);\n\t\t\t\t},\n\t\t\t\tonError: () => {\n\t\t\t\t\ttoast.error(\"Failed to delete worker\");\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\treturn (\n\t\t<DeleteConfirmationDialog\n\t\t\tisOpen={open}\n\t\t\ttitle=\"Delete Worker\"\n\t\t\tdescription={`Are you sure you want to delete the worker \"${worker.name}\"? This action cannot be undone.`}\n\t\t\tconfirmText={worker.name}\n\t\t\tisLoading={isPending}\n\t\t\tloadingText=\"Deleting...\"\n\t\t\tonConfirm={handleDelete}\n\t\t\tonClose={() => onOpenChange(false)}\n\t\t/>\n\t);\n};\n","import { Copy, MoreHorizontal, Trash2 } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport type { WorkPoolWorker } from \"@/api/work-pools\";\n\nexport const useWorkerMenu = (worker: WorkPoolWorker) => {\n\tconst [showDeleteDialog, setShowDeleteDialog] = useState(false);\n\n\tconst handleCopyId = () => {\n\t\tvoid navigator.clipboard.writeText(worker.id);\n\t\ttoast.success(\"ID copied to clipboard\");\n\t};\n\n\tconst menuItems = [\n\t\t{\n\t\t\tlabel: \"Copy ID\",\n\t\t\ticon: Copy,\n\t\t\taction: handleCopyId,\n\t\t\tshow: true,\n\t\t},\n\t\t{\n\t\t\tlabel: \"Delete\",\n\t\t\ticon: Trash2,\n\t\t\taction: () => setShowDeleteDialog(true),\n\t\t\tshow: true, // Workers can typically be deleted by work pool managers\n\t\t\tvariant: \"destructive\" as const,\n\t\t},\n\t].filter((item) => item.show);\n\n\treturn {\n\t\tmenuItems,\n\t\tshowDeleteDialog,\n\t\tsetShowDeleteDialog,\n\t\ttriggerIcon: MoreHorizontal,\n\t};\n};\n","import type { WorkPoolWorker } from \"@/api/work-pools\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { cn } from \"@/utils\";\nimport { DeleteWorkerDialog } from \"./components/delete-worker-dialog\";\nimport { useWorkerMenu } from \"./hooks/use-worker-menu\";\n\ntype WorkerMenuProps = {\n\tworker: WorkPoolWorker;\n\tworkPoolName: string;\n\tonWorkerDeleted?: () => void;\n\tclassName?: string;\n};\n\nexport const WorkerMenu = ({\n\tworker,\n\tworkPoolName,\n\tonWorkerDeleted,\n\tclassName,\n}: WorkerMenuProps) => {\n\tconst {\n\t\tmenuItems,\n\t\tshowDeleteDialog,\n\t\tsetShowDeleteDialog,\n\t\ttriggerIcon: TriggerIcon,\n\t} = useWorkerMenu(worker);\n\n\treturn (\n\t\t<>\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tclassName={cn(\"h-8 w-8\", className)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className=\"sr-only\">Open menu</span>\n\t\t\t\t\t\t<TriggerIcon className=\"h-4 w-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t\t{menuItems.map((item) => {\n\t\t\t\t\t\tconst Icon = item.icon;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\t\t\tkey={item.label}\n\t\t\t\t\t\t\t\tonClick={item.action}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\titem.variant === \"destructive\" && \"text-destructive\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon className=\"mr-2 h-4 w-4\" />\n\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t\t<DeleteWorkerDialog\n\t\t\t\tworker={worker}\n\t\t\t\tworkPoolName={workPoolName}\n\t\t\t\topen={showDeleteDialog}\n\t\t\t\tonOpenChange={setShowDeleteDialog}\n\t\t\t\tonDeleted={onWorkerDeleted}\n\t\t\t/>\n\t\t</>\n\t);\n};\n","import type { WorkPoolWorker } from \"@/api/work-pools\";\nimport { WorkerMenu } from \"@/components/workers/worker-menu\";\n\nexport type WorkersTableRowActionsProps = {\n\tworker: WorkPoolWorker;\n\tworkPoolName: string;\n};\n\nexport const WorkersTableRowActions = ({\n\tworker,\n\tworkPoolName,\n}: WorkersTableRowActionsProps) => {\n\treturn <WorkerMenu worker={worker} workPoolName={workPoolName} />;\n};\n","import { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { cn } from \"@/utils\";\n\nexport type WorkersTableToolbarProps = {\n\tsearchQuery: string;\n\tonSearchChange: (query: string) => void;\n\tresultsCount: number;\n\ttotalCount: number;\n\tclassName?: string;\n};\n\nexport const WorkersTableToolbar = ({\n\tsearchQuery,\n\tonSearchChange,\n\tresultsCount,\n\ttotalCount,\n\tclassName,\n}: WorkersTableToolbarProps) => {\n\tconst showClearFilters = searchQuery.length > 0;\n\n\treturn (\n\t\t<div className={cn(\"flex items-center justify-between\", className)}>\n\t\t\t<div className=\"text-sm text-muted-foreground\">\n\t\t\t\t{searchQuery\n\t\t\t\t\t? `${resultsCount} of ${totalCount} workers`\n\t\t\t\t\t: `${totalCount} workers`}\n\t\t\t</div>\n\t\t\t<div className=\"flex items-center space-x-2\">\n\t\t\t\t{showClearFilters && (\n\t\t\t\t\t<Button variant=\"ghost\" size=\"sm\" onClick={() => onSearchChange(\"\")}>\n\t\t\t\t\t\tClear filters\n\t\t\t\t\t</Button>\n\t\t\t\t)}\n\t\t\t\t<Input\n\t\t\t\t\tplaceholder=\"Search workers...\"\n\t\t\t\t\tvalue={searchQuery}\n\t\t\t\t\tonChange={(e) => onSearchChange(e.target.value)}\n\t\t\t\t\tclassName=\"w-64\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import type {\n\tColumnFiltersState,\n\tOnChangeFn,\n\tPaginationState,\n} from \"@tanstack/react-table\";\nimport {\n\tgetCoreRowModel,\n\tgetPaginationRowModel,\n\tgetSortedRowModel,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport { useCallback, useMemo } from \"react\";\nimport type { WorkPoolWorker } from \"@/api/work-pools\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { cn } from \"@/utils\";\nimport { createWorkersTableColumnsWithActions } from \"./components/workers-table-columns\";\nimport { WorkersTableEmptyState } from \"./components/workers-table-empty-state\";\nimport { WorkersTableRowActions } from \"./components/workers-table-row-actions\";\nimport { WorkersTableToolbar } from \"./components/workers-table-toolbar\";\n\nexport type WorkersTableProps = {\n\tworkPoolName: string;\n\tworkers: WorkPoolWorker[];\n\tpagination: PaginationState;\n\tcolumnFilters: ColumnFiltersState;\n\tonPaginationChange: (pagination: PaginationState) => void;\n\tonColumnFiltersChange: (columnFilters: ColumnFiltersState) => void;\n\tclassName?: string;\n};\n\nexport const WorkersTable = ({\n\tworkPoolName,\n\tworkers,\n\tpagination,\n\tcolumnFilters,\n\tonPaginationChange,\n\tonColumnFiltersChange,\n\tclassName,\n}: WorkersTableProps) => {\n\tconst searchQuery = (columnFilters.find((filter) => filter.id === \"name\")\n\t\t?.value ?? \"\") as string;\n\n\tconst handleSearchChange = useCallback(\n\t\t(value: string) => {\n\t\t\tconst filters = columnFilters.filter((filter) => filter.id !== \"name\");\n\t\t\tonColumnFiltersChange(\n\t\t\t\tvalue ? [...filters, { id: \"name\", value }] : filters,\n\t\t\t);\n\t\t},\n\t\t[onColumnFiltersChange, columnFilters],\n\t);\n\n\tconst handlePaginationChange: OnChangeFn<PaginationState> = useCallback(\n\t\t(updater) => {\n\t\t\tlet newPagination = pagination;\n\t\t\tif (typeof updater === \"function\") {\n\t\t\t\tnewPagination = updater(pagination);\n\t\t\t} else {\n\t\t\t\tnewPagination = updater;\n\t\t\t}\n\t\t\tonPaginationChange(newPagination);\n\t\t},\n\t\t[pagination, onPaginationChange],\n\t);\n\n\tconst filteredWorkers = useMemo(() => {\n\t\tif (!searchQuery) return workers;\n\t\treturn workers.filter((worker) =>\n\t\t\tworker.name.toLowerCase().includes(searchQuery.toLowerCase()),\n\t\t);\n\t}, [workers, searchQuery]);\n\n\tconst columns = useMemo(\n\t\t() =>\n\t\t\tcreateWorkersTableColumnsWithActions({\n\t\t\t\tworkPoolName,\n\t\t\t\tActionsComponent: WorkersTableRowActions,\n\t\t\t}),\n\t\t[workPoolName],\n\t);\n\n\tconst table = useReactTable({\n\t\tdata: filteredWorkers,\n\t\tcolumns,\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tgetSortedRowModel: getSortedRowModel(),\n\t\tgetPaginationRowModel: getPaginationRowModel(),\n\t\tmanualPagination: false,\n\t\tstate: {\n\t\t\tpagination,\n\t\t},\n\t\tonPaginationChange: handlePaginationChange,\n\t\tinitialState: {\n\t\t\tsorting: [{ id: \"name\", desc: false }],\n\t\t},\n\t});\n\n\t// Show empty state when no workers at all or no search results\n\tconst showEmptyState =\n\t\tworkers.length === 0 || (searchQuery && filteredWorkers.length === 0);\n\n\tif (showEmptyState) {\n\t\treturn (\n\t\t\t<div className={cn(\"space-y-4\", className)}>\n\t\t\t\t<WorkersTableToolbar\n\t\t\t\t\tsearchQuery={searchQuery}\n\t\t\t\t\tonSearchChange={handleSearchChange}\n\t\t\t\t\tresultsCount={filteredWorkers.length}\n\t\t\t\t\ttotalCount={workers.length}\n\t\t\t\t/>\n\t\t\t\t<WorkersTableEmptyState\n\t\t\t\t\thasSearchQuery={searchQuery.length > 0}\n\t\t\t\t\tworkPoolName={workPoolName}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={cn(\"space-y-4\", className)}>\n\t\t\t<WorkersTableToolbar\n\t\t\t\tsearchQuery={searchQuery}\n\t\t\t\tonSearchChange={handleSearchChange}\n\t\t\t\tresultsCount={filteredWorkers.length}\n\t\t\t\ttotalCount={workers.length}\n\t\t\t/>\n\t\t\t<DataTable table={table} />\n\t\t</div>\n\t);\n};\n","import { useQueryClient, useSuspenseQuery } from \"@tanstack/react-query\";\nimport { createFileRoute, useNavigate } from \"@tanstack/react-router\";\nimport type {\n\tColumnFiltersState,\n\tPaginationState,\n\tSortingState,\n} from \"@tanstack/react-table\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { Suspense, useCallback, useMemo, useState } from \"react\";\nimport { z } from \"zod\";\nimport { buildPaginateDeploymentsQuery } from \"@/api/deployments\";\nimport {\n\tbuildCountFlowRunsQuery,\n\tbuildPaginateFlowRunsQuery,\n} from \"@/api/flow-runs\";\nimport { buildGetFlowRunsTaskRunsCountQuery } from \"@/api/task-runs\";\nimport { buildListWorkPoolQueuesQuery } from \"@/api/work-pool-queues\";\nimport { buildGetWorkPoolQuery } from \"@/api/work-pools\";\nimport {\n\tbuildListWorkPoolWorkersQuery,\n\tqueryKeyFactory as workPoolsQueryKeyFactory,\n} from \"@/api/work-pools/work-pools\";\nimport { CodeBanner } from \"@/components/code-banner\";\nimport {\n\tLayoutWell,\n\tLayoutWellContent,\n\tLayoutWellHeader,\n} from \"@/components/ui/layout-well\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport { WorkPoolDeploymentsTab } from \"@/components/work-pools/work-pool-deployments-tab\";\nimport { WorkPoolDetails } from \"@/components/work-pools/work-pool-details\";\nimport { WorkPoolFlowRunsTab } from \"@/components/work-pools/work-pool-flow-runs-tab\";\nimport { WorkPoolPageHeader } from \"@/components/work-pools/work-pool-page-header\";\nimport { WorkPoolQueuesTable } from \"@/components/work-pools/work-pool-queues-table\";\nimport { WorkersTable } from \"@/components/work-pools/workers-table\";\nimport { cn } from \"@/utils\";\n\nconst workPoolSearchParams = z.object({\n\ttab: z\n\t\t.enum([\"Details\", \"Runs\", \"Work Queues\", \"Workers\", \"Deployments\"])\n\t\t.default(\"Runs\"),\n});\n\ntype WorkPoolSearchParams = z.infer<typeof workPoolSearchParams>;\n\nexport const Route = createFileRoute(\"/work-pools/work-pool/$workPoolName\")({\n\tvalidateSearch: zodValidator(workPoolSearchParams),\n\tcomponent: RouteComponent,\n\tloader: async ({ params, context: { queryClient } }) => {\n\t\t// Critical data - must await\n\t\tconst workPool = await queryClient.ensureQueryData(\n\t\t\tbuildGetWorkPoolQuery(params.workPoolName),\n\t\t);\n\n\t\t// Prefetch tab data for better UX\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildListWorkPoolQueuesQuery(params.workPoolName),\n\t\t);\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildListWorkPoolWorkersQuery(params.workPoolName),\n\t\t);\n\n\t\t// Prefetch late runs count for each queue (non-blocking)\n\t\tvoid queryClient\n\t\t\t.ensureQueryData(buildListWorkPoolQueuesQuery(params.workPoolName))\n\t\t\t.then((queues) =>\n\t\t\t\tPromise.all(\n\t\t\t\t\tqueues.map((queue) =>\n\t\t\t\t\t\tqueryClient.prefetchQuery(\n\t\t\t\t\t\t\tbuildCountFlowRunsQuery(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\twork_pools: {\n\t\t\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\t\t\tname: { any_: [params.workPoolName] },\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\twork_pool_queues: {\n\t\t\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\t\t\tname: { any_: [queue.name] },\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tflow_runs: {\n\t\t\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\t\t\tstate: {\n\t\t\t\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\t\t\t\tname: { any_: [\"Late\"] },\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t30000,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t);\n\n\t\t// Prefetch paginated flow runs data\n\t\tvoid queryClient\n\t\t\t.ensureQueryData(\n\t\t\t\tbuildPaginateFlowRunsQuery({\n\t\t\t\t\tpage: 1,\n\t\t\t\t\tlimit: 10,\n\t\t\t\t\tsort: \"START_TIME_DESC\",\n\t\t\t\t\twork_pools: {\n\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\tname: { any_: [params.workPoolName] },\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.then((paginatedData) =>\n\t\t\t\tPromise.all(\n\t\t\t\t\t(paginatedData.results ?? []).map((flowRun) =>\n\t\t\t\t\t\tqueryClient.prefetchQuery(\n\t\t\t\t\t\t\tbuildGetFlowRunsTaskRunsCountQuery([flowRun.id]),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t);\n\n\t\t// Prefetch flow runs count for pagination\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildCountFlowRunsQuery({\n\t\t\t\twork_pools: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tname: { any_: [params.workPoolName] },\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildPaginateDeploymentsQuery({\n\t\t\t\tpage: 1,\n\t\t\t\tlimit: 50,\n\t\t\t\tsort: \"CREATED_DESC\",\n\t\t\t\twork_pools: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tname: { any_: [params.workPoolName] },\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\t\treturn { workPool };\n\t},\n\twrapInSuspense: true,\n});\n\n// Wrapper component for Work Pool Queues tab\nconst WorkPoolQueuesTabWrapper = ({\n\tworkPoolName,\n}: {\n\tworkPoolName: string;\n}) => {\n\tconst [searchQuery, setSearchQuery] = useState(\"\");\n\tconst [sortState, setSortState] = useState<SortingState>([]);\n\n\tconst { data: queues } = useSuspenseQuery(\n\t\tbuildListWorkPoolQueuesQuery(workPoolName),\n\t);\n\n\tconst filteredQueues = useMemo(() => {\n\t\tif (!searchQuery) return queues;\n\t\treturn queues.filter((queue) =>\n\t\t\tqueue.name.toLowerCase().includes(searchQuery.toLowerCase()),\n\t\t);\n\t}, [queues, searchQuery]);\n\n\treturn (\n\t\t<WorkPoolQueuesTable\n\t\t\tqueues={filteredQueues}\n\t\t\tsearchQuery={searchQuery}\n\t\t\tsortState={sortState}\n\t\t\ttotalCount={queues.length}\n\t\t\tworkPoolName={workPoolName}\n\t\t\tonSearchChange={setSearchQuery}\n\t\t\tonSortingChange={setSortState}\n\t\t/>\n\t);\n};\n\n// Wrapper component for Workers tab\nconst WorkersTabWrapper = ({ workPoolName }: { workPoolName: string }) => {\n\tconst [pagination, setPagination] = useState<PaginationState>({\n\t\tpageIndex: 0,\n\t\tpageSize: 10,\n\t});\n\tconst [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);\n\n\tconst { data: workers } = useSuspenseQuery(\n\t\tbuildListWorkPoolWorkersQuery(workPoolName),\n\t);\n\n\treturn (\n\t\t<WorkersTable\n\t\t\tworkPoolName={workPoolName}\n\t\t\tworkers={workers}\n\t\t\tpagination={pagination}\n\t\t\tcolumnFilters={columnFilters}\n\t\t\tonPaginationChange={setPagination}\n\t\t\tonColumnFiltersChange={setColumnFilters}\n\t\t/>\n\t);\n};\n\nfunction RouteComponent() {\n\tconst { workPoolName } = Route.useParams();\n\tconst { tab } = Route.useSearch();\n\tconst navigate = useNavigate({ from: Route.fullPath });\n\tconst queryClient = useQueryClient();\n\n\tconst { data: workPool } = useSuspenseQuery(\n\t\tbuildGetWorkPoolQuery(workPoolName),\n\t);\n\n\tconst showCodeBanner = workPool.status !== \"READY\";\n\tconst codeBannerCommand = `prefect worker start --pool \"${workPool.name}\"`;\n\n\tconst tabs = useMemo(\n\t\t() =>\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tid: \"Details\",\n\t\t\t\t\tlabel: \"Details\",\n\t\t\t\t\thidden: false,\n\t\t\t\t\thiddenOnDesktop: true, // Hide on xl screens and above\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"Runs\",\n\t\t\t\t\tlabel: \"Runs\",\n\t\t\t\t\thidden: false,\n\t\t\t\t\thiddenOnDesktop: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"Work Queues\",\n\t\t\t\t\tlabel: \"Work Queues\",\n\t\t\t\t\thidden: false,\n\t\t\t\t\thiddenOnDesktop: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"Workers\",\n\t\t\t\t\tlabel: \"Workers\",\n\t\t\t\t\thiddenOnDesktop: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"Deployments\",\n\t\t\t\t\tlabel: \"Deployments\",\n\t\t\t\t\thidden: false,\n\t\t\t\t\thiddenOnDesktop: false,\n\t\t\t\t},\n\t\t\t].filter((tab) => !tab.hidden),\n\t\t[],\n\t);\n\n\tconst handleTabChange = useCallback(\n\t\t(newTab: string) => {\n\t\t\tvoid navigate({\n\t\t\t\tsearch: { tab: newTab as WorkPoolSearchParams[\"tab\"] },\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\tconst handleWorkPoolUpdate = useCallback(() => {\n\t\t// Refresh work pool data\n\t\tvoid queryClient.invalidateQueries({\n\t\t\tqueryKey: workPoolsQueryKeyFactory.detailByName(workPoolName),\n\t\t});\n\t}, [queryClient, workPoolName]);\n\n\treturn (\n\t\t<LayoutWell>\n\t\t\t<LayoutWellContent>\n\t\t\t\t<LayoutWellHeader>\n\t\t\t\t\t<WorkPoolPageHeader\n\t\t\t\t\t\tworkPool={workPool}\n\t\t\t\t\t\tonUpdate={handleWorkPoolUpdate}\n\t\t\t\t\t/>\n\t\t\t\t\t{showCodeBanner && (\n\t\t\t\t\t\t<div className=\"w-full bg-muted/50 py-6 px-4 rounded-lg mb-6\">\n\t\t\t\t\t\t\t<div className=\"max-w-4xl mx-auto\">\n\t\t\t\t\t\t\t\t<CodeBanner\n\t\t\t\t\t\t\t\t\tcommand={codeBannerCommand}\n\t\t\t\t\t\t\t\t\ttitle=\"Your work pool is almost ready!\"\n\t\t\t\t\t\t\t\t\tsubtitle=\"Run this command to start.\"\n\t\t\t\t\t\t\t\t\tclassName=\"py-0\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</LayoutWellHeader>\n\n\t\t\t\t<div className=\"flex flex-col xl:flex-row xl:gap-8\">\n\t\t\t\t\t<div className=\"flex-1\">\n\t\t\t\t\t\t<Tabs value={tab} onValueChange={handleTabChange}>\n\t\t\t\t\t\t\t<TabsList className=\"flex w-full overflow-x-auto scrollbar-none\">\n\t\t\t\t\t\t\t\t{tabs.map((tabItem) => (\n\t\t\t\t\t\t\t\t\t<TabsTrigger\n\t\t\t\t\t\t\t\t\t\tkey={tabItem.id}\n\t\t\t\t\t\t\t\t\t\tvalue={tabItem.id}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\"whitespace-nowrap flex-shrink-0\",\n\t\t\t\t\t\t\t\t\t\t\ttabItem.hiddenOnDesktop ? \"xl:hidden\" : \"\",\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{tabItem.label}\n\t\t\t\t\t\t\t\t\t</TabsTrigger>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</TabsList>\n\n\t\t\t\t\t\t\t<TabsContent value=\"Details\" className=\"space-y-0\">\n\t\t\t\t\t\t\t\t<Suspense\n\t\t\t\t\t\t\t\t\tfallback={\n\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-6\">\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-4 w-48\" />\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-3 w-16\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-6 w-24\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-3 w-20\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-6 w-32\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-3 w-24\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-6 w-28\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-3 w-18\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-6 w-36\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-3\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-5 w-40\" />\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-32 w-full\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<WorkPoolDetails workPool={workPool} />\n\t\t\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t\t\t</TabsContent>\n\n\t\t\t\t\t\t\t<TabsContent value=\"Runs\">\n\t\t\t\t\t\t\t\t<Suspense\n\t\t\t\t\t\t\t\t\tfallback={\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-24 w-full\" />\n\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-24 w-full\" />\n\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-24 w-full\" />\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<WorkPoolFlowRunsTab workPoolName={workPoolName} />\n\t\t\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t\t\t</TabsContent>\n\n\t\t\t\t\t\t\t<TabsContent value=\"Work Queues\" className=\"space-y-0\">\n\t\t\t\t\t\t\t\t<Suspense\n\t\t\t\t\t\t\t\t\tfallback={\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t\t\t\t\t\t\t\t{/* Toolbar skeleton */}\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-6 w-24\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-6 w-8\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-6 w-64\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t{/* Table skeleton */}\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-34 w-full\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<WorkPoolQueuesTabWrapper workPoolName={workPoolName} />\n\t\t\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t\t\t</TabsContent>\n\n\t\t\t\t\t\t\t<TabsContent value=\"Workers\" className=\"space-y-0\">\n\t\t\t\t\t\t\t\t<Suspense\n\t\t\t\t\t\t\t\t\tfallback={\n\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t\t\t\t\t{/* Search skeleton */}\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-4 w-20\" />\n\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-9 w-64\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t{/* Table skeleton */}\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-34 w-full\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<WorkersTabWrapper workPoolName={workPoolName} />\n\t\t\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t\t\t</TabsContent>\n\n\t\t\t\t\t\t\t<TabsContent value=\"Deployments\" className=\"space-y-0\">\n\t\t\t\t\t\t\t\t<Suspense\n\t\t\t\t\t\t\t\t\tfallback={\n\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t\t\t\t\t{/* Search skeleton */}\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-4 w-20\" />\n\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-9 w-64\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t{/* Table skeleton */}\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-34 w-full\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<WorkPoolDeploymentsTab workPoolName={workPoolName} />\n\t\t\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t\t\t</TabsContent>\n\t\t\t\t\t\t</Tabs>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<aside className=\"w-full xl:w-80 xl:shrink-0 hidden xl:block\">\n\t\t\t\t\t\t<div className=\"sticky top-8\">\n\t\t\t\t\t\t\t<WorkPoolDetails workPool={workPool} alternate />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</aside>\n\t\t\t\t</div>\n\t\t\t</LayoutWellContent>\n\t\t</LayoutWell>\n\t);\n}\n"],"names":["__iconNode","CircleQuestionMark","createLucideIcon","CodeBanner","command","title","subtitle","className","copying","setCopying","useState","handleCopy","toast","cn","jsxs","jsx","Button","Copy","WorkPoolDeploymentsTab","workPoolName","pagination","setPagination","sort","setSort","columnFilters","setColumnFilters","filter","useMemo","countFilter","paginatedData","useQuery","buildPaginateDeploymentsQuery","totalCount","buildCountDeploymentsQuery","flowIds","d","flows","buildListFlowsQuery","deploymentsWithFlows","flowMap","flow","deployment","handlePaginationChange","useCallback","newPagination","handleSortChange","newSort","handleColumnFiltersChange","newFilters","DeploymentsDataTable","getStatusLabel","status","getStatusColor","WorkPoolStatusBadge","label","colorClass","Badge","Pause","None","FieldLabel","children","FieldValue","BasicInfoSection","workPool","workers","isLoading","buildListWorkPoolWorkersQuery","lastPolled","w","time","a","b","fields","titleCase","FormattedDate","ComponentValue","field","JobTemplateSection","baseJobTemplate","properties","formatFieldName","key","property","word","formatValue","value","WorkPoolDetails","alternate","spacing","Fragment","Separator","WorkPoolFlowRunsTab","searchTerm","setSearchTerm","selectedStates","setSelectedStates","debouncedSearchTerm","useDebounce","baseFilter","stateFilter","baseCountFilter","buildPaginateFlowRunsQuery","buildCountFlowRunsQuery","flowRun","flowRunsWithFlows","handleSearchChange","event","prev","handleStateFilterChange","newSelectedStates","handleClearFilters","SearchInput","StateFilter","FlowRunsList","FlowRunsPagination","DeleteWorkPoolDialog","open","onOpenChange","onDeleted","navigate","useNavigate","deleteWorkPool","isPending","useDeleteWorkPool","handleDelete","DeleteConfirmationDialog","useWorkPoolMenu","showDeleteDialog","setShowDeleteDialog","Edit","Trash2","Zap","item","MoreVertical","WorkPoolMenu","onUpdate","menuItems","TriggerIcon","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","Icon","DropdownMenuItem","useWorkPoolToggle","pauseWorkPool","pausePending","usePauseWorkPool","resumeWorkPool","resumePending","useResumeWorkPool","checked","WorkPoolToggle","handleToggle","isPaused","Tooltip","TooltipTrigger","Switch","TooltipContent","WorkPoolPageHeader","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","BreadcrumbPage","LateFlowRunsIndicator","lateRunsCount","TooltipProvider","Clock","QueueNameWithLateIndicator","queue","Link","createWorkPoolQueuesTableColumns","enableLateIndicator","columns","column","row","limit","HelpCircle","WorkPoolQueueStatusBadge","WorkPoolQueueToggle","WorkPoolQueueMenu","WorkPoolQueuesTableEmptyState","hasSearchQuery","Search","Plus","WorkPoolQueuesTableToolbar","searchQuery","onSearchChange","resultsCount","showCreateDialog","setShowCreateDialog","showClearFilters","Input","e","WorkPoolQueueCreateOrEditDialog","WorkPoolQueuesTable","queues","sortState","onSortingChange","handleSortingChange","updater","newSorting","table","useReactTable","getCoreRowModel","getSortedRowModel","DataTable","statusConfig","WorkerStatusBadge","config","createWorkersTableColumns","worker","lastSeen","createWorkersTableColumnsWithActions","ActionsComponent","WorkersTableEmptyState","EmptyState","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","EmptyStateActions","DeleteWorkerDialog","deleteWorker","useDeleteWorker","useWorkerMenu","MoreHorizontal","WorkerMenu","onWorkerDeleted","WorkersTableRowActions","WorkersTableToolbar","WorkersTable","onPaginationChange","onColumnFiltersChange","filters","filteredWorkers","getPaginationRowModel","z","tab","default","WorkPoolQueuesTabWrapper","setSearchQuery","setSortState","data","useSuspenseQuery","buildListWorkPoolQueuesQuery","filteredQueues","name","toLowerCase","includes","length","WorkersTabWrapper","pageIndex","pageSize","RouteComponent","Route","useParams","useSearch","from","fullPath","queryClient","useQueryClient","buildGetWorkPoolQuery","showCodeBanner","codeBannerCommand","tabs","id","hidden","hiddenOnDesktop","handleTabChange","newTab","search","handleWorkPoolUpdate","invalidateQueries","queryKey","workPoolsQueryKeyFactory","detailByName","LayoutWell","LayoutWellContent","LayoutWellHeader","Tabs","TabsList","map","TabsTrigger","tabItem","TabsContent","Suspense","Skeleton"],"mappings":"mjDASA,MAAMA,GAAa,CACjB,CAAC,SAAU,CAAE,GAAI,KAAM,GAAI,KAAM,EAAG,KAAM,IAAK,SAAU,EACzD,CAAC,OAAQ,CAAE,EAAG,uCAAwC,IAAK,QAAQ,CAAE,EACrE,CAAC,OAAQ,CAAE,EAAG,aAAc,IAAK,QAAQ,CAAE,CAC7C,EACMC,GAAqBC,GAAiB,uBAAwBF,EAAU,ECAjEG,GAAa,CAAC,CAC1B,QAAAC,EACA,MAAAC,EACA,SAAAC,EACA,UAAAC,CACD,IAAuB,CACtB,KAAM,CAACC,EAASC,CAAU,EAAIC,EAAAA,SAAS,EAAK,EAEtCC,EAAa,SAAY,CAC9B,GAAI,CAAAH,EAEJ,CAAAC,EAAW,EAAI,EACf,GAAI,CACH,MAAM,UAAU,UAAU,UAAUL,CAAO,EAC3CQ,EAAM,QAAQ,6BAA6B,CAC5C,MAAQ,CACPA,EAAM,MAAM,wBAAwB,CACrC,QAAA,CACCH,EAAW,EAAK,CACjB,EACD,EAEA,cACE,MAAA,CAAI,UAAWI,EAAG,YAAaN,CAAS,EAExC,SAAA,CAAAO,EAAAA,KAAC,MAAA,CAAI,UAAU,cACd,SAAA,CAAAC,EAAAA,IAAC,KAAA,CAAG,UAAU,6CAA8C,SAAAV,EAAM,EAClEU,EAAAA,IAAC,IAAA,CAAE,UAAU,gCAAiC,SAAAT,CAAA,CAAS,CAAA,EACxD,EAGAQ,EAAAA,KAAC,MAAA,CAAI,UAAU,qEAEd,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,2EACd,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,iBACd,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,iCAAA,CAAkC,EACjDA,EAAAA,IAAC,MAAA,CAAI,UAAU,oCAAA,CAAqC,EACpDA,EAAAA,IAAC,MAAA,CAAI,UAAU,mCAAA,CAAoC,CAAA,EACpD,EACAA,EAAAA,IAACC,EAAA,CACA,QAAQ,QACR,KAAK,KAEL,QAASL,EACT,SAAUH,EACV,UAAU,iFAEV,SAAAO,EAAAA,IAACE,EAAA,CAAK,UAAU,SAAA,CAAU,CAAA,CAAA,CAC3B,EACD,QAGC,MAAA,CAAI,UAAU,yCACd,SAAAH,EAAAA,KAAC,IAAA,CAAE,UAAU,OACZ,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAU,6CACd,SAAAX,EACF,EACAW,EAAAA,IAAC,OAAA,CAAK,UAAU,sEAAA,CAAuE,CAAA,CAAA,CACxF,CAAA,CACD,CAAA,CAAA,CACD,CAAA,EACD,CAEF,ECzDaG,GAAyB,CAAC,CACtC,aAAAC,EACA,UAAAZ,CACD,IAAmC,CAClC,KAAM,CAACa,EAAYC,CAAa,EAAIX,WAA0B,CAC7D,UAAW,EACX,SAAU,EAAA,CACV,EACK,CAACY,EAAMC,CAAO,EACnBb,EAAAA,SAAkD,cAAc,EAC3D,CAACc,EAAeC,CAAgB,EAAIf,EAAAA,SAA6B,CAAA,CAAE,EAEnEgB,EAAsCC,EAAAA,QAC3C,KAAO,CACN,KAAMP,EAAW,UAAY,EAC7B,MAAOA,EAAW,SAClB,KAAAE,EACA,WAAY,CACX,SAAU,OACV,KAAM,CAAE,KAAM,CAACH,CAAY,CAAA,CAAE,EAE9B,YAAa,CACZ,SAAU,OACV,wBAAyB,CACxB,MACEK,EAAc,KAAM,GAAM,EAAE,KAAO,sBAAsB,GACvD,OAAoB,EAAA,EAEzB,KAAM,CACL,SAAU,OACV,KACEA,EAAc,KAAM,GAAM,EAAE,KAAO,MAAM,GAAG,OAC7C,CAAA,CAAC,CACH,CACD,GAED,CAACL,EAAcC,EAAYE,EAAME,CAAa,CAAA,EAGzCI,EAAcD,EAAAA,QACnB,KAAO,CACN,OAAQ,EACR,KAAM,eACN,WAAY,CACX,SAAU,OACV,KAAM,CAAE,KAAM,CAACR,CAAY,CAAA,CAAE,CAC9B,GAED,CAACA,CAAY,CAAA,EAGR,CAAE,KAAMU,CAAA,EAAkBC,EAC/BC,GAA8BL,CAAM,CAAA,EAG/B,CAAE,KAAMM,CAAA,EAAeF,EAC5BG,GAA2BL,CAAW,CAAA,EAGjCM,EAAUP,EAAAA,QACf,IAAM,CAAC,GAAG,IAAI,KAAKE,GAAe,SAAW,IAAI,IAAKM,GAAMA,EAAE,OAAO,CAAC,CAAC,EACvE,CAACN,GAAe,OAAO,CAAA,EAGlB,CAAE,KAAMO,CAAA,EAAUN,EACvBO,GACC,CACC,MAAO,CACN,SAAU,OACV,GAAI,CAAE,KAAMH,CAAA,CAAQ,EAErB,OAAQ,EACR,KAAM,UAAA,EAEP,CAAE,QAASA,EAAQ,OAAS,CAAA,CAAE,CAC/B,EAGKI,EAAuBX,EAAAA,QAAQ,IAAM,CAC1C,GAAI,CAACE,GAAe,QAAS,MAAO,CAAA,EACpC,MAAMU,EAAU,IAAI,IAAIH,GAAO,IAAKI,GAAS,CAACA,EAAK,GAAIA,CAAI,CAAC,GAAK,CAAA,CAAE,EACnE,OAAOX,EAAc,QAAQ,IAAKY,IAAgB,CACjD,GAAGA,EACH,KAAMF,EAAQ,IAAIE,EAAW,OAAO,CAAA,EACnC,CACH,EAAG,CAACZ,GAAe,QAASO,CAAK,CAAC,EAE5BM,EAAyBC,EAAAA,YAC7BC,GAAmC,CACnCvB,EAAcuB,CAAa,CAC5B,EACA,CAAA,CAAC,EAGIC,EAAmBF,EAAAA,YACvBG,GAAqD,CACrDvB,EAAQuB,CAAO,CAChB,EACA,CAAA,CAAC,EAGIC,EAA4BJ,EAAAA,YAChCK,GAAmC,CACnCvB,EAAiBuB,CAAU,CAC5B,EACA,CAAA,CAAC,EAIF,MAAI,CAACnB,GAAiBG,IAAe,OAEnCjB,EAAAA,IAAC,OAAI,UAAAR,EACJ,SAAAQ,EAAAA,IAAC,OAAI,UAAU,yCAAyC,kCAExD,CAAA,CACD,EAKDA,EAAAA,IAAC,OAAI,UAAAR,EACJ,SAAAQ,EAAAA,IAACkC,GAAA,CACA,YAAaX,EACb,wBAAyBN,EACzB,UAAWH,EAAc,MACzB,WAAAT,EACA,KAAAE,EACA,cAAAE,EACA,mBAAoBkB,EACpB,aAAcG,EACd,sBAAuBE,CAAA,CAAA,EAEzB,CAEF,EChJMG,GAAkBC,GAAmC,CAC1D,OAAQA,EAAA,CACP,IAAK,QACJ,MAAO,QACR,IAAK,SACJ,MAAO,SACR,IAAK,YACJ,MAAO,WAAA,CAEV,EAEMC,GAAkBD,GAAmC,CAC1D,OAAQA,EAAA,CACP,IAAK,QACJ,MAAO,eACR,IAAK,SACJ,MAAO,gBACR,IAAK,YACJ,MAAO,YAAA,CAEV,EAEaE,GAAsB,CAAC,CACnC,OAAAF,EACA,UAAA5C,CACD,IAAgC,CAC/B,MAAM+C,EAAQJ,GAAeC,CAAM,EAC7BI,EAAaH,GAAeD,CAAM,EAExC,OACCrC,EAAAA,KAAC0C,EAAA,CACA,QAAQ,YACR,UAAW3C,EAAG,8BAA+BN,CAAS,EAErD,SAAA,CAAA4C,IAAW,SACXpC,EAAAA,IAAC0C,GAAA,CAAM,UAAU,+BAAA,CAAgC,EAEjD1C,EAAAA,IAAC,MAAA,CAAI,UAAWF,EAAG,uBAAwB0C,CAAU,EAAG,EAEzDxC,EAAAA,IAAC,QAAM,SAAAuC,CAAA,CAAM,CAAA,CAAA,CAAA,CAGhB,EClCMI,EAAO,IAAM3C,EAAAA,IAAC,KAAA,CAAG,UAAU,gCAAgC,SAAA,OAAI,EAC/D4C,GAAa,CAAC,CAAE,SAAAC,CAAA,IACrB7C,EAAAA,IAAC,KAAA,CAAG,UAAU,gCAAiC,SAAA6C,EAAS,EAEnDC,EAAa,CAAC,CACnB,SAAAD,EACA,UAAArD,CACD,UAGO,KAAA,CAAG,UAAWM,EAAG,UAAWN,CAAS,EAAI,SAAAqD,EAAS,EAGzD,SAASE,GAAiB,CAAE,SAAAC,GAAoC,CAC/D,KAAM,CAAE,KAAMC,EAAU,CAAA,EAAI,UAAAC,GAAcnC,EACzCoC,GAA8BH,EAAS,IAAI,CAAA,EAGtCI,EAAaxC,EAAAA,QAAQ,IACtBsC,GACAD,EAAQ,SAAW,EAAU,KAEdA,EACjB,IAAKI,GAAMA,EAAE,mBAAmB,EAChC,OAAQC,GAAyB,EAAQA,CAAK,EAC9C,KAAK,CAACC,EAAGC,IAAM,IAAI,KAAKA,CAAC,EAAE,QAAA,EAAY,IAAI,KAAKD,CAAC,EAAE,SAAS,EAE5C,CAAC,GAAK,KACtB,CAACN,EAASC,CAAS,CAAC,EAEjBO,EAAS,CACd,CACC,MAAO,SACP,eAAgB,IACfzD,EAAAA,IAAC,KAAA,CACA,SAAAA,EAAAA,IAACsC,IAAoB,OAAQU,EAAS,QAAU,WAAA,CAAa,CAAA,CAC9D,CAAA,EAGF,CACC,MAAO,cACP,eAAgB,IACfA,EAAS,kBACPF,EAAA,CAAY,SAAAE,EAAS,YAAY,EAC/B,IAAA,EAEN,CACC,MAAO,OACP,eAAgB,IACfA,EAAS,KACRhD,EAAAA,IAAC8C,EAAA,CAAY,SAAAY,GAAUV,EAAS,IAAI,CAAA,CAAE,EAEtChD,EAAAA,IAAC2C,EAAA,CAAA,CAAK,CAAA,EAGT,CACC,MAAO,oBACP,eAAgB,IACf3C,EAAAA,IAAC8C,EAAA,CACC,SAAAE,EAAS,kBACP,OAAOA,EAAS,iBAAiB,EACjC,WAAA,CACJ,CAAA,EAGF,CACC,MAAO,cACP,eAAgB,IACfI,QACEN,EAAA,CACA,SAAA9C,EAAAA,IAAC2D,GAAc,KAAMP,CAAA,CAAY,EAClC,EACGH,EAAQ,SAAW,EAAI,WACzBH,EAAA,CAAW,UAAU,wBAAwB,SAAA,oBAAA,CAE9C,CAAA,EAGH,CACC,MAAO,UACP,eAAgB,IACfE,EAAS,cACPF,EAAA,CACA,SAAA9C,EAAAA,IAAC2D,EAAA,CAAc,KAAMX,EAAS,OAAA,CAAS,CAAA,CACxC,QAECL,EAAA,CAAA,CAAK,CAAA,EAGT,CACC,MAAO,eACP,eAAgB,IACfK,EAAS,cACPF,EAAA,CACA,SAAA9C,EAAAA,IAAC2D,EAAA,CAAc,KAAMX,EAAS,OAAA,CAAS,CAAA,CACxC,QAECL,EAAA,CAAA,CAAK,CAAA,CAET,EACC,OAAO,CAAC,CAAE,eAAAiB,KAAqBA,EAAA,IAAqB,IAAI,EAE1D,OAAIV,EAEFlD,EAAAA,IAAC,MAAA,CAAI,UAAU,gCAAgC,SAAA,+BAE/C,QAKA,MAAA,CACA,SAAAA,EAAAA,IAAC,KAAA,CAAG,UAAU,sBACZ,SAAAyD,EAAO,IAAI,CAAC,CAAE,MAAAI,EAAO,eAAAD,CAAA,IACrB5D,MAAC,KAAA,CACA,gBAAC,KAAA,CACA,SAAA,CAAAA,EAAAA,IAAC4C,IAAY,SAAAiB,CAAA,CAAM,QAClBD,EAAA,CAAA,CAAe,CAAA,CAAA,CACjB,CAAA,EAJQC,CAKT,CACA,CAAA,CACF,CAAA,CACD,CAEF,CAGA,SAASC,GAAmB,CAAE,SAAAd,GAAoC,CAEjE,MAAMe,EAAkBf,EAAS,kBAEjC,GACC,CAACe,GAAiB,WAClB,OAAOA,EAAgB,WAAc,UACrC,EAAE,eAAgBA,EAAgB,YAClC,CAACA,EAAgB,UAAU,WAE3B,OAAO,KAGR,MAAMC,EAAaD,EAAgB,UAAU,WAMvCE,EAAkB,CAACC,EAAaC,IAEpCA,EAAS,OACTD,EACE,MAAM,GAAG,EACT,IAAKE,GAASA,EAAK,OAAO,CAAC,EAAE,cAAgBA,EAAK,MAAM,CAAC,CAAC,EAC1D,KAAK,GAAG,EAKNC,EAAeC,GAChBA,GAAU,KACN,OAEJ,OAAOA,GAAU,UACbA,EAAM,SAAA,EAEV,MAAM,QAAQA,CAAK,EACfA,EAAM,OAAS,EAAIA,EAAM,KAAK,IAAI,EAAI,OAE1C,OAAOA,GAAU,SACb,KAAK,UAAUA,CAAK,EAGrB,OAAOA,CAA0C,EAGzD,cACE,MAAA,CACA,SAAA,CAAAtE,EAAAA,IAAC,KAAA,CAAG,UAAU,eAAe,SAAA,yBAAsB,EACnDA,EAAAA,IAAC,KAAA,CAAG,UAAU,sBACZ,SAAA,OAAO,QAAQgE,CAAU,EAAE,IAAI,CAAC,CAACE,EAAKC,CAAQ,IAAM,CACpD,MAAMG,EAAQH,EAAS,SAAW,KAClC,OACCpE,EAAAA,KAAC,KAAA,CAAa,UAAU,8BACvB,SAAA,CAAAC,MAAC,QAAK,UAAU,oCACd,SAAAiE,EAAgBC,EAAKC,CAAQ,EAC/B,QACC,OAAA,CAAK,UAAU,cAAe,SAAAE,EAAYC,CAAK,CAAA,CAAE,CAAA,CAAA,EAJ1CJ,CAKT,CAEF,CAAC,CAAA,CACF,CAAA,EACD,CAEF,CAEO,SAASK,EAAgB,CAC/B,SAAAvB,EACA,UAAAwB,EAAY,GACZ,UAAAhF,CACD,EAAyB,CACxB,MAAMiF,EAAUD,EAAY,YAAc,YAE1C,cACE,MAAA,CAAI,UAAW1E,EAAG2E,EAASjF,CAAS,EACpC,SAAA,CAAAQ,MAAC+C,IAAiB,SAAAC,EAAoB,EAErC,GACAA,EAAS,mBAAmB,WAC3B,OAAOA,EAAS,kBAAkB,WAAc,UAChD,eAAgBA,EAAS,kBAAkB,WAC3CA,EAAS,kBAAkB,UAAU,YACrC,OAAO,KACNA,EAAS,kBAAkB,UAAU,UAAA,EAIpC,OAAS,IAEZjD,EAAAA,KAAA2E,WAAA,CACC,SAAA,CAAA1E,EAAAA,IAAC2E,GAAA,EAAU,EACX3E,MAAC8D,IAAmB,SAAAd,CAAA,CAAoB,CAAA,CAAA,CACzC,CAAA,EAEF,CAEF,CCzNO,MAAM4B,GAAsB,CAAC,CACnC,aAAAxE,EACA,UAAAZ,CACD,IAAgC,CAC/B,KAAM,CAACa,EAAYC,CAAa,EAAIX,WAA0B,CAC7D,MAAO,GACP,KAAM,CAAA,CACN,EACK,CAACkF,EAAYC,CAAa,EAAInF,EAAAA,SAAS,EAAE,EACzC,CAACoF,EAAgBC,CAAiB,EAAIrF,EAAAA,aACvC,GAAI,EAIHsF,EAAsBC,GAAYL,EAAY,GAAG,EAEjDlE,EAAiCC,EAAAA,QAAQ,IAAM,CACpD,MAAMuE,EAAqC,CAC1C,KAAM9E,EAAW,KACjB,MAAOA,EAAW,MAClB,KAAM,kBACN,WAAY,CACX,SAAU,OACV,KAAM,CAAE,KAAM,CAACD,CAAY,CAAA,CAAE,CAC9B,EAYD,GARI6E,EAAoB,SACvBE,EAAW,UAAY,CACtB,SAAU,OACV,KAAM,CAAE,MAAOF,EAAoB,MAAK,CAAE,GAKxCF,EAAe,KAAO,EAAG,CAC5B,MAAMK,EAAc,CACnB,MAAO,CACN,SAAU,OACV,KAAM,CAAE,KAAM,MAAM,KAAKL,CAAc,CAAA,CAAE,CAC1C,EAGGI,EAAW,UAEdA,EAAW,UAAY,CACtB,GAAGA,EAAW,UACd,GAAGC,CAAA,EAGJD,EAAW,UAAY,CACtB,SAAU,OACV,GAAGC,CAAA,CAGN,CAEA,OAAOD,CACR,EAAG,CAAC/E,EAAcC,EAAY4E,EAAqBF,CAAc,CAAC,EAE5DlE,EAAmCD,EAAAA,QAAQ,IAAM,CACtD,MAAMyE,EAAuC,CAC5C,WAAY,CACX,SAAU,OACV,KAAM,CAAE,KAAM,CAACjF,CAAY,CAAA,CAAE,CAC9B,EAYD,GARI6E,EAAoB,SACvBI,EAAgB,UAAY,CAC3B,SAAU,OACV,KAAM,CAAE,MAAOJ,EAAoB,MAAK,CAAE,GAKxCF,EAAe,KAAO,EAAG,CAC5B,MAAMK,EAAc,CACnB,MAAO,CACN,SAAU,OACV,KAAM,CAAE,KAAM,MAAM,KAAKL,CAAc,CAAA,CAAE,CAC1C,EAGGM,EAAgB,UAEnBA,EAAgB,UAAY,CAC3B,GAAGA,EAAgB,UACnB,GAAGD,CAAA,EAGJC,EAAgB,UAAY,CAC3B,SAAU,OACV,GAAGD,CAAA,CAGN,CAEA,OAAOC,CACR,EAAG,CAACjF,EAAc6E,EAAqBF,CAAc,CAAC,EAGhD,CAAE,KAAMjE,CAAA,EAAkBC,EAASuE,GAA2B3E,CAAM,CAAC,EAGrE,CAAE,KAAMM,CAAA,EAAeF,EAASwE,GAAwB1E,CAAW,CAAC,EAGpEM,EAAUP,EAAAA,QACf,IAAM,CACL,GAAG,IAAI,KACLE,GAAe,SAAW,CAAA,GAAI,IAAK0E,GAAYA,EAAQ,OAAO,CAAA,CAChE,EAED,CAAC1E,GAAe,OAAO,CAAA,EAIlB,CAAE,KAAMO,CAAA,EAAUN,EACvBO,GACC,CACC,MAAO,CACN,SAAU,OACV,GAAI,CAAE,KAAMH,CAAA,CAAQ,EAErB,OAAQ,EACR,KAAM,UAAA,EAEP,CAAE,QAASA,EAAQ,OAAS,CAAA,CAAE,CAC/B,EAIKsE,EAAoB7E,EAAAA,QAAQ,IAAM,CACvC,GAAI,CAACE,GAAe,QAAS,MAAO,CAAA,EACpC,MAAMU,EAAU,IAAI,IAAIH,GAAO,IAAKI,GAAe,CAACA,EAAK,GAAIA,CAAI,CAAC,GAAK,CAAA,CAAE,EACzE,OAAOX,EAAc,QACnB,IAAK0E,GAAY,CACjB,MAAM/D,EAAOD,EAAQ,IAAIgE,EAAQ,OAAO,EACxC,OAAK/D,EACE,CACN,GAAG+D,EACH,KAAA/D,CAAA,EAHiB,IAKnB,CAAC,EACA,OAAQ+D,GAAYA,IAAY,IAAI,CACvC,EAAG,CAAC1E,GAAe,QAASO,CAAK,CAAC,EAE5BqE,EAAqB9D,EAAAA,YACzB+D,GAA+C,CAC/Cb,EAAca,EAAM,OAAO,KAAK,EAEhCrF,EAAesF,IAAU,CAAE,GAAGA,EAAM,KAAM,GAAI,CAC/C,EACA,CAAA,CAAC,EAGIjE,EAAyBC,EAAAA,YAC7BC,GAAmC,CACnCvB,EAAcuB,CAAa,CAC5B,EACA,CAAA,CAAC,EAGIgE,EAA0BjE,EAAAA,YAC9BkE,GAAyC,CACzCd,EAAkBc,CAAiB,EAEnCxF,EAAesF,IAAU,CAAE,GAAGA,EAAM,KAAM,GAAI,CAC/C,EACA,CAAA,CAAC,EAGIG,EAAqBnE,EAAAA,YAAY,IAAM,CAC5CkD,EAAc,EAAE,EAChBE,EAAkB,IAAI,GAAK,EAC3B1E,EAAesF,IAAU,CAAE,GAAGA,EAAM,KAAM,GAAI,CAC/C,EAAG,CAAA,CAAE,EAGL,MAAI,CAAC9E,GAAiBG,IAAe,OAEnCjB,EAAAA,IAAC,OAAI,UAAAR,EACJ,SAAAQ,EAAAA,IAAC,OAAI,UAAU,yCAAyC,gCAExD,CAAA,CACD,EAKDD,OAAC,OAAI,UAAAP,EAEJ,SAAA,CAAAO,EAAAA,KAAC,MAAA,CAAI,UAAU,uCACd,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,SACd,SAAAA,EAAAA,IAACgG,GAAA,CACA,YAAY,8BACZ,MAAOnB,EACP,SAAUa,EACV,WAAY,GAAA,CAAA,EAEd,EACA1F,EAAAA,IAAC,MAAA,CAAI,UAAU,iBACd,SAAAA,EAAAA,IAACiG,GAAA,CACA,gBAAiBlB,EACjB,eAAgBc,CAAA,CAAA,CACjB,CACD,CAAA,EACD,EAGA7F,EAAAA,IAACkG,GAAA,CACA,SAAUT,EACV,eACCA,EAAkB,SAAW,EAAIM,EAAqB,MAAA,CAAA,EAKvDjF,EAAc,MAAQ,GACtBd,EAAAA,IAAC,MAAA,CAAI,UAAU,OACd,SAAAA,EAAAA,IAACmG,GAAA,CACA,MAAOlF,EACP,MAAOH,EAAc,MACrB,WAAAT,EACA,mBAAoBsB,CAAA,CAAA,CACrB,CACD,CAAA,EAEF,CAEF,ECrPayE,GAAuB,CAAC,CACpC,SAAApD,EACA,KAAAqD,EACA,aAAAC,EACA,UAAAC,CACD,IAAiC,CAChC,MAAMC,EAAWC,EAAA,EACX,CAAE,eAAAC,EAAgB,UAAAC,CAAA,EAAcC,GAAA,EAEhCC,EAAe,IAAM,CAC1BH,EAAe1D,EAAS,KAAM,CAC7B,UAAW,IAAM,CAChBnD,EAAM,QAAQ,gCAAgC,EAC9C0G,IAAA,EACKC,EAAS,CAAE,GAAI,cAAe,CACpC,EACA,QAAS,IAAM,CACd3G,EAAM,MAAM,4BAA4B,CACzC,CAAA,CACA,CACF,EAEA,OACCG,EAAAA,IAAC8G,GAAA,CACA,OAAQT,EACR,MAAM,mBACN,YAAa,kDAAkDrD,EAAS,IAAI,mCAC5E,YAAaA,EAAS,KACtB,UAAW2D,EACX,YAAY,cACZ,UAAWE,EACX,QAAS,IAAMP,EAAa,EAAK,CAAA,CAAA,CAGpC,ECzCaS,GAAmB/D,GAAuB,CACtD,MAAMwD,EAAWC,EAAA,EACX,CAACO,EAAkBC,CAAmB,EAAItH,EAAAA,SAAS,EAAK,EAiD9D,MAAO,CACN,UA7BiB,CACjB,CACC,MAAO,UACP,KAAMO,EACN,OAvBmB,IAAM,CACrB,UAAU,UAAU,UAAU8C,EAAS,EAAE,EAC9CnD,EAAM,QAAQ,wBAAwB,CACvC,EAqBE,KAAM,EAAA,EAEP,CACC,MAAO,OACP,KAAMqH,GACN,OAxBiB,IAAM,CACnBV,EAAS,CACb,GAAI,2CACJ,OAAQ,CAAE,aAAcxD,EAAS,IAAA,CAAK,CACtC,CACF,EAoBE,KAAM,EAAA,EAEP,CACC,MAAO,SACP,KAAMmE,GACN,OAAQ,IAAMF,EAAoB,EAAI,EACtC,KAAM,GACN,QAAS,aAAA,EAEV,CACC,MAAO,WACP,KAAMG,GACN,OA9BqB,IAAM,CAEvBZ,EAAS,CACb,GAAI,qBAAA,CACJ,CACF,EA0BE,KAAM,EAAA,CACP,EACC,OAAQa,GAASA,EAAK,IAAI,EAI3B,iBAAAL,EACA,oBAAAC,EACA,YAAaK,EAAA,CAEf,EC7CaC,GAAe,CAAC,CAC5B,SAAAvE,EACA,SAAAwE,EACA,UAAAhI,CACD,IAAyB,CACxB,KAAM,CACL,UAAAiI,EACA,iBAAAT,EACA,oBAAAC,EACA,YAAaS,CAAA,EACVX,GAAgB/D,CAAQ,EAE5B,OACCjD,EAAAA,KAAA2E,WAAA,CACC,SAAA,CAAA3E,OAAC4H,GAAA,CACA,SAAA,CAAA3H,EAAAA,IAAC4H,GAAA,CAAoB,QAAO,GAC3B,SAAA7H,EAAAA,KAACE,EAAA,CACA,QAAQ,UACR,KAAK,OACL,UAAWH,EAAG,SAAUN,CAAS,EAEjC,SAAA,CAAAQ,EAAAA,IAAC,OAAA,CAAK,UAAU,UAAU,SAAA,YAAS,EACnCA,EAAAA,IAAC0H,EAAA,CAAY,UAAU,QAAA,CAAS,CAAA,CAAA,CAAA,EAElC,QACCG,GAAA,CAAoB,MAAM,MACzB,SAAAJ,EAAU,IAAKJ,GAAS,CACxB,MAAMS,EAAOT,EAAK,KAClB,OACCtH,EAAAA,KAACgI,GAAA,CAEA,QAASV,EAAK,OACd,UAAWvH,EACVuH,EAAK,UAAY,eAAiB,kBAAA,EAGnC,SAAA,CAAArH,EAAAA,IAAC8H,EAAA,CAAK,UAAU,cAAA,CAAe,EAC9BT,EAAK,KAAA,CAAA,EAPDA,EAAK,KAAA,CAUb,CAAC,CAAA,CACF,CAAA,EACD,EACArH,EAAAA,IAACoG,GAAA,CACA,SAAApD,EACA,KAAMgE,EACN,aAAcC,EACd,UAAWO,CAAA,CAAA,CACZ,EACD,CAEF,EChEaQ,GAAoB,CAChChF,EACAwE,IACI,CACJ,KAAM,CAAE,cAAAS,EAAe,UAAWC,CAAA,EAAiBC,GAAA,EAC7C,CAAE,eAAAC,EAAgB,UAAWC,CAAA,EAAkBC,GAAA,EA+BrD,MAAO,CACN,aA9BoB1G,EAAAA,YACnB2G,GAAqB,CACjBA,EAEHH,EAAepF,EAAS,KAAM,CAC7B,UAAW,IAAM,CAChBnD,EAAM,QAAQ,mBAAmB,EACjC2H,IAAA,CACD,EACA,QAAS,IAAM,CACd3H,EAAM,MAAM,4BAA4B,CACzC,CAAA,CACA,EAGDoI,EAAcjF,EAAS,KAAM,CAC5B,UAAW,IAAM,CAChBnD,EAAM,QAAQ,kBAAkB,EAChC2H,IAAA,CACD,EACA,QAAS,IAAM,CACd3H,EAAM,MAAM,2BAA2B,CACxC,CAAA,CACA,CAEH,EACA,CAACmD,EAAS,KAAMiF,EAAeG,EAAgBZ,CAAQ,CAAA,EAKvD,UAAWU,GAAgBG,CAAA,CAE7B,EC7BaG,GAAiB,CAAC,CAC9B,SAAAxF,EACA,SAAAwE,EACA,UAAAhI,CACD,IAA2B,CAC1B,KAAM,CAAE,aAAAiJ,EAAc,UAAAvF,CAAA,EAAc8E,GAAkBhF,EAAUwE,CAAQ,EAClEkB,EAAW1F,EAAS,SAAW,SAErC,cACE2F,EAAA,CACA,SAAA,CAAA3I,MAAC4I,EAAA,CAAe,QAAO,GACtB,SAAA5I,MAAC,MAAA,CACA,SAAAA,EAAAA,IAAC6I,GAAA,CACA,QAAS,CAACH,EACV,gBAAiBD,EACjB,SAAUvF,EACV,aAAYwF,EAAW,mBAAqB,kBAC5C,UAAW5I,EAAGN,CAAS,CAAA,CAAA,EAEzB,CAAA,CACD,EACAQ,MAAC8I,EAAA,CACA,SAAA9I,EAAAA,IAAC,IAAA,CAAE,0CAA8B,CAAA,CAClC,CAAA,EACD,CAEF,ECvBa+I,GAAqB,CAAC,CAClC,SAAA/F,EACA,SAAAwE,EACA,UAAAhI,CACD,IAEEO,EAAAA,KAAC,SAAA,CACA,UAAWD,EACV,kDACAN,CAAA,EAGD,SAAA,CAAAQ,EAAAA,IAACgJ,GAAA,CAAW,UAAAxJ,EACX,SAAAO,OAACkJ,GAAA,CACA,SAAA,CAAAjJ,EAAAA,IAACkJ,EAAA,CACA,eAACC,GAAA,CAAe,GAAG,cAAc,UAAU,wBAAwB,sBAEnE,CAAA,CACD,QACCC,GAAA,EAAoB,EACrBpJ,EAAAA,IAACkJ,GAAe,UAAU,wBACzB,eAACG,GAAA,CAAgB,SAAArG,EAAS,KAAK,CAAA,CAChC,CAAA,CAAA,CACD,CAAA,CACD,EACAjD,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACd,SAAA,CAAAC,EAAAA,IAACwI,GAAA,CAAe,SAAAxF,EAAoB,SAAAwE,CAAA,CAAoB,EACxDxH,EAAAA,IAACuH,GAAA,CAAa,SAAAvE,EAAoB,SAAAwE,CAAA,CAAoB,CAAA,CAAA,CACvD,CAAA,CAAA,CAAA,EC9BU8B,GAAwB,CAAC,CACrC,cAAAC,EACA,UAAA/J,CACD,IACK+J,IAAkB,EACd,KAIPvJ,EAAAA,IAACwJ,GAAA,CACA,SAAAzJ,EAAAA,KAAC4I,EAAA,CACA,SAAA,CAAA3I,MAAC4I,EAAA,CACA,SAAA7I,EAAAA,KAAC0C,EAAA,CACA,QAAQ,UACR,UAAW3C,EAAG,8BAA+BN,CAAS,EAEtD,SAAA,CAAAQ,EAAAA,IAACyJ,GAAA,CAAM,UAAU,SAAA,CAAU,EAC3BzJ,EAAAA,IAAC,QAAM,SAAAuJ,CAAA,CAAc,CAAA,CAAA,CAAA,EAEvB,EACAvJ,MAAC8I,EAAA,CACA,SAAA/I,EAAAA,KAAC,MAAA,CAAI,UAAU,YACd,SAAA,CAAAC,EAAAA,IAAC,IAAA,CAAE,UAAU,gBAAgB,SAAA,iBAAc,EAC3CD,EAAAA,KAAC,IAAA,CAAE,UAAU,UACX,SAAA,CAAAwJ,EAAc,YAAUA,IAAkB,EAAI,GAAK,IAAI,eAAA,CAAA,CAEzD,CAAA,CAAA,CACD,CAAA,CACD,CAAA,CAAA,CACD,CAAA,CACD,ECrCWG,GAA6B,CAAC,CAC1C,MAAAC,CACD,IAAuC,CACtC,KAAM,CAAE,KAAMJ,EAAgB,CAAA,EAAMxI,EACnCwE,GACC,CACC,WAAY,CACX,SAAU,OACV,KAAM,CAAE,KAAM,CAACoE,EAAM,gBAAkB,EAAE,CAAA,CAAE,EAE5C,iBAAkB,CACjB,SAAU,OACV,KAAM,CAAE,KAAM,CAACA,EAAM,IAAI,CAAA,CAAE,EAE5B,UAAW,CACV,SAAU,OACV,MAAO,CACN,SAAU,OACV,KAAM,CAAE,KAAM,CAAC,MAAM,CAAA,CAAE,CACxB,CACD,EAED,GAAA,CACD,EAGD,OACC5J,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACd,SAAA,CAAAC,EAAAA,IAAC4J,EAAA,CACA,GAAG,2DACH,OAAQ,CACP,aAAcD,EAAM,gBAAkB,GACtC,cAAeA,EAAM,IAAA,EAEtB,UAAU,gDAET,SAAAA,EAAM,IAAA,CAAA,EAER3J,MAACsJ,IAAsB,cAAAC,CAAA,CAA8B,CAAA,EACtD,CAEF,EC9BaM,GAAmC,CAAC,CAChD,oBAAAC,EAAsB,EACvB,EAAuC,KAAmC,CACzE,MAAMC,EAAsC,CAAA,EAE5C,OAAAA,EAAQ,KAAK,CACZ,YAAa,OACb,OAAQ,CAAC,CAAE,OAAAC,CAAA,IACVhK,EAAAA,IAACC,EAAA,CACA,QAAQ,QACR,QAAS,IAAM+J,EAAO,cAAcA,EAAO,YAAA,IAAkB,KAAK,EAClE,UAAU,2BACV,SAAA,MAAA,CAAA,EAIF,KAAM,CAAC,CAAE,IAAAC,KAAU,CAClB,MAAMN,EAAQM,EAAI,SAElB,OAAIH,EACI9J,MAAC0J,IAA2B,MAAAC,EAAc,EAKjD3J,EAAAA,IAAC,MAAA,CAAI,UAAU,8BACd,SAAAA,EAAAA,IAAC4J,EAAA,CACA,GAAG,2DACH,OAAQ,CACP,aAAcD,EAAM,gBAAkB,GACtC,cAAeA,EAAM,IAAA,EAEtB,UAAU,gDAET,SAAAA,EAAM,IAAA,CAAA,EAET,CAEF,CAAA,CACA,EAGDI,EAAQ,KAAK,CACZ,YAAa,oBACb,OAAQ,CAAC,CAAE,OAAAC,CAAA,IACVhK,EAAAA,IAACC,EAAA,CACA,QAAQ,QACR,QAAS,IAAM+J,EAAO,cAAcA,EAAO,YAAA,IAAkB,KAAK,EAClE,UAAU,2BACV,SAAA,mBAAA,CAAA,EAIF,KAAM,CAAC,CAAE,IAAAC,KAAU,CAClB,MAAMC,EAAQD,EAAI,SAAS,kBAC3B,OAAOC,GAAU,KAA8BA,EAAM,WAAa,GACnE,CAAA,CACA,EAGDH,EAAQ,KAAK,CACZ,YAAa,WACb,OAAQ,CAAC,CAAE,OAAAC,KACVjK,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACd,SAAA,CAAAC,EAAAA,IAACC,EAAA,CACA,QAAQ,QACR,QAAS,IAAM+J,EAAO,cAAcA,EAAO,YAAA,IAAkB,KAAK,EAClE,UAAU,2BACV,SAAA,UAAA,CAAA,EAGDhK,EAAAA,IAACwJ,GAAA,CACA,SAAAzJ,EAAAA,KAAC4I,EAAA,CACA,SAAA,CAAA3I,MAAC4I,EAAA,CACA,SAAA5I,EAAAA,IAACmK,GAAA,CAAW,UAAU,gCAAgC,EACvD,EACAnK,MAAC8I,EAAA,CACA,SAAA9I,EAAAA,IAAC,IAAA,CAAE,8CAAkC,CAAA,CACtC,CAAA,CAAA,CACD,CAAA,CACD,CAAA,EACD,EAED,KAAM,CAAC,CAAE,IAAAiK,KAAUA,EAAI,SAAS,QAAA,CAChC,EAGDF,EAAQ,KAAK,CACZ,YAAa,SACb,OAAQ,SACR,KAAM,CAAC,CAAE,IAAAE,CAAA,IACRjK,MAACoK,GAAA,CAAyB,OAAQH,EAAI,SAAS,QAAU,OAAA,CAAS,CAAA,CAEnE,EAGDF,EAAQ,KAAK,CACZ,GAAI,UACJ,OAAQ,GACR,KAAM,CAAC,CAAE,IAAAE,KACRlK,EAAAA,KAAC,MAAA,CAAI,UAAU,sCACd,SAAA,CAAAC,EAAAA,IAACqK,GAAA,CAAoB,MAAOJ,EAAI,QAAA,CAAU,EAC1CjK,EAAAA,IAACsK,GAAA,CAAkB,MAAOL,EAAI,QAAA,CAAU,CAAA,EACzC,EAED,cAAe,EAAA,CACf,EAEMF,CACR,EAICF,GAAA,EC9HM,MAAMU,GAAgC,CAAC,CAC7C,eAAAC,EACA,aAAApK,CACD,IACKoK,EAEFzK,EAAAA,KAAC,MAAA,CAAI,UAAU,8DACd,SAAA,CAAAC,EAAAA,IAACyK,GAAA,CAAO,UAAU,sCAAA,CAAuC,EACzDzK,EAAAA,IAAC,KAAA,CAAG,UAAU,2CAA2C,SAAA,kBAEzD,EACAA,EAAAA,IAAC,IAAA,CAAE,UAAU,6BAA6B,SAAA,kEAAA,CAE1C,CAAA,EACD,EAKDD,EAAAA,KAAC,MAAA,CAAI,UAAU,8DACd,SAAA,CAAAC,EAAAA,IAAC,OAAI,UAAU,wEACd,eAAC0K,EAAA,CAAK,UAAU,gCAAgC,CAAA,CACjD,EACA1K,EAAAA,IAAC,KAAA,CAAG,UAAU,2CAA2C,SAAA,gBAEzD,EACAA,EAAAA,IAAC,IAAA,CAAE,UAAU,sCAAsC,SAAA,gGAGnD,EACAD,EAAAA,KAACE,EAAA,CACA,QAAS,IAAM,CAEd,QAAQ,IAAI,yBAA0BG,CAAY,CACnD,EAEA,SAAA,CAAAJ,EAAAA,IAAC0K,EAAA,CAAK,UAAU,cAAA,CAAe,EAAE,cAAA,CAAA,CAAA,CAElC,EACD,EC/BWC,GAA6B,CAAC,CAC1C,YAAAC,EACA,eAAAC,EACA,aAAAC,EACA,WAAA7J,EACA,aAAAb,EACA,UAAAZ,CACD,IAAuC,CACtC,KAAM,CAACuL,EAAkBC,CAAmB,EAAIrL,EAAAA,SAAS,EAAK,EACxDsL,EAAmBL,EAAY,OAAS,EAE9C,cACE,MAAA,CAAI,UAAW9K,EAAG,YAAaN,CAAS,EAExC,SAAA,CAAAO,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACd,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACd,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,gCACb,SAAA4K,EACE,GAAGE,CAAY,OAAO7J,CAAU,cAAcA,IAAe,EAAI,IAAM,EAAE,GACzE,GAAGA,CAAU,cAAcA,IAAe,EAAI,IAAM,EAAE,EAAA,CAC1D,EACAjB,EAAAA,IAACC,EAAA,CACA,QAAQ,QACR,KAAK,KACL,QAAS,IAAM+K,EAAoB,EAAI,EAEvC,SAAAhL,EAAAA,IAAC0K,EAAA,CAAK,UAAU,SAAA,CAAU,CAAA,CAAA,CAC3B,EACD,EAEA3K,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAkL,GACAjL,EAAAA,IAACC,EAAA,CACA,QAAQ,QACR,KAAK,KACL,QAAS,IAAM4K,EAAe,EAAE,EAChC,SAAA,eAAA,CAAA,EAIF9K,EAAAA,KAAC,MAAA,CAAI,UAAU,WACd,SAAA,CAAAC,EAAAA,IAACyK,GAAA,CAAO,UAAU,uDAAA,CAAwD,EAC1EzK,EAAAA,IAACkL,GAAA,CACA,YAAY,SACZ,MAAON,EACP,SAAWO,GAAMN,EAAeM,EAAE,OAAO,KAAK,EAC9C,UAAU,WAAA,CAAA,CACX,CAAA,CACD,CAAA,CAAA,CACD,CAAA,EACD,EAEAnL,EAAAA,IAACoL,GAAA,CACA,aAAAhL,EACA,KAAM2K,EACN,aAAcC,EACd,SAAU,IAAMA,EAAoB,EAAK,CAAA,CAAA,CAC1C,EACD,CAEF,ECnDaK,GAAsB,CAAC,CACnC,OAAAC,EACA,YAAAV,EACA,UAAAW,EACA,WAAAtK,EACA,aAAAb,EACA,UAAAZ,EACA,eAAAqL,EACA,gBAAAW,CACD,IAAgC,CAC/B,MAAMC,EAAgD7J,EAAAA,YACpD8J,GAAY,CACZ,IAAIC,EAAaJ,EACb,OAAOG,GAAY,WACtBC,EAAaD,EAAQH,CAAS,EAE9BI,EAAaD,EAEdF,EAAgBG,CAAU,CAC3B,EACA,CAACJ,EAAWC,CAAe,CAAA,EAItBzB,EAAUF,GAAiC,CAChD,oBAAqB,EAAA,CACrB,EAGK+B,EAAQC,EAAc,CAC3B,KAAMP,EACN,QAAAvB,EAEA,gBAAiB+B,EAAA,EACjB,kBAAmBC,EAAA,EACnB,MAAO,CACN,QAASR,CAAA,EAEV,gBAAiBE,EACjB,aAAc,CACb,QAAS,CAAC,CAAE,GAAI,OAAQ,KAAM,GAAO,CAAA,CACtC,CACA,EAEKX,EAAeQ,EAAO,OAE5B,cACE,MAAA,CAAI,UAAWxL,EAAG,YAAaN,CAAS,EACxC,SAAA,CAAAQ,EAAAA,IAAC2K,GAAA,CACA,YAAAC,EACA,eAAAC,EACA,aAAAC,EACA,WAAA7J,EACA,aAAAb,CAAA,CAAA,EAEA0K,IAAiB,EACjB9K,EAAAA,IAACuK,GAAA,CACA,eAAgB,CAAC,CAACK,EAClB,aAAAxK,CAAA,CAAA,EAGDJ,EAAAA,IAACgM,GAAA,CAAU,MAAAJ,CAAA,CAAc,CAAA,EAE3B,CAEF,EC/EMK,GAAe,CACpB,OAAQ,CACP,MAAO,SACP,MAAO,cAAA,EAER,QAAS,CACR,MAAO,UACP,MAAO,YAAA,CAET,EAEaC,GAAoB,CAAC,CACjC,OAAA9J,EACA,UAAA5C,CACD,IAA8B,CAC7B,MAAM2M,EAASF,GAAa7J,CAAM,EAElC,OACCrC,EAAAA,KAAC0C,EAAA,CACA,QAAQ,YACR,UAAW3C,EAAG,8BAA+BN,CAAS,EAEtD,SAAA,CAAAQ,MAAC,OAAI,UAAWF,EAAG,uBAAwBqM,EAAO,KAAK,EAAG,EAC1DnM,EAAAA,IAAC,OAAA,CAAM,SAAAmM,EAAO,KAAA,CAAM,CAAA,CAAA,CAAA,CAGvB,EChCaC,GAA4B,IAAmC,CAC3E,CACC,YAAa,OACb,OAAQ,OACR,KAAM,CAAC,CAAE,IAAAnC,KAAU,CAClB,MAAMoC,EAASpC,EAAI,SAEnB,OAAOjK,EAAAA,IAAC,OAAA,CAAK,UAAU,cAAe,WAAO,KAAK,CACnD,CAAA,EAED,CACC,YAAa,sBACb,OAAQ,YACR,KAAM,CAAC,CAAE,IAAAiK,KAAU,CAClB,MAAMqC,EAAWrC,EAAI,SAAS,oBAC9B,aAAQtG,EAAA,CAAc,KAAM2I,EAAU,OAAO,WAAW,YAAW,GAAC,CACrE,CAAA,EAED,CACC,YAAa,SACb,OAAQ,SACR,KAAM,CAAC,CAAE,IAAArC,CAAA,UAAWiC,GAAA,CAAkB,OAAQjC,EAAI,SAAS,MAAA,CAAQ,CAAA,CAErE,EAUasC,GAAuC,CAAC,CACpD,aAAAnM,EACA,iBAAAoM,CACD,IAAwE,CACvE,GAAGJ,GAAA,EACH,CACC,GAAI,UACJ,OAAQ,GACR,KAAM,CAAC,CAAE,IAAAnC,CAAA,UACPuC,EAAA,CAAiB,OAAQvC,EAAI,SAAU,aAAA7J,EAA4B,EAErE,cAAe,GACf,KAAM,GACN,QAAS,EAAA,CAEX,ECrCaqM,GAAyB,CAAC,CACtC,eAAAjC,EACA,aAAApK,EACA,UAAAZ,CACD,IACKgL,SAEDkC,EAAA,CACA,SAAA,CAAA1M,EAAAA,IAAC2M,EAAA,CAAe,GAAG,QAAA,CAAS,EAC5B3M,EAAAA,IAAC4M,GAAgB,SAAA,kBAAA,CAAgB,EACjC5M,EAAAA,IAAC6M,GAAsB,SAAA,wCAAA,CAEvB,CAAA,EACD,EAKD7M,MAAC,OAAI,UAAWF,EAAG,YAAaN,CAAS,EACxC,gBAACkN,EAAA,CACA,SAAA,CAAA1M,EAAAA,IAAC2M,EAAA,CAAe,GAAG,KAAA,CAAM,EACzB3M,EAAAA,IAAC4M,GAAgB,SAAA,oBAAA,CAAkB,SAClCC,EAAA,CAAsB,SAAA,CAAA,6CAC2BzM,EAAa,cAAA,EAE/D,QACC0M,GAAA,CACA,SAAA9M,EAAAA,IAACZ,GAAA,CACA,QAAS,gCAAgCgB,CAAY,IACrD,MAAM,iBACN,SAAS,kDAAA,CAAA,CACV,CACD,CAAA,CAAA,CACD,CAAA,CACD,ECrCW2M,GAAqB,CAAC,CAClC,OAAAV,EACA,aAAAjM,EACA,KAAAiG,EACA,aAAAC,EACA,UAAAC,CACD,IAA+B,CAC9B,KAAM,CAAE,aAAAyG,EAAc,UAAArG,CAAA,EAAcsG,GAAA,EAE9BpG,EAAe,IAAM,CAC1BmG,EACC,CACC,aAAA5M,EACA,WAAYiM,EAAO,IAAA,EAEpB,CACC,UAAW,IAAM,CAChBxM,EAAM,QAAQ,6BAA6B,EAC3C0G,IAAA,EACAD,EAAa,EAAK,CACnB,EACA,QAAS,IAAM,CACdzG,EAAM,MAAM,yBAAyB,CACtC,CAAA,CACD,CAEF,EAEA,OACCG,EAAAA,IAAC8G,GAAA,CACA,OAAQT,EACR,MAAM,gBACN,YAAa,+CAA+CgG,EAAO,IAAI,mCACvE,YAAaA,EAAO,KACpB,UAAW1F,EACX,YAAY,cACZ,UAAWE,EACX,QAAS,IAAMP,EAAa,EAAK,CAAA,CAAA,CAGpC,EChDa4G,GAAiBb,GAA2B,CACxD,KAAM,CAACrF,EAAkBC,CAAmB,EAAItH,EAAAA,SAAS,EAAK,EAuB9D,MAAO,CACN,UAjBiB,CACjB,CACC,MAAO,UACP,KAAMO,EACN,OATmB,IAAM,CACrB,UAAU,UAAU,UAAUmM,EAAO,EAAE,EAC5CxM,EAAM,QAAQ,wBAAwB,CACvC,EAOE,KAAM,EAAA,EAEP,CACC,MAAO,SACP,KAAMsH,GACN,OAAQ,IAAMF,EAAoB,EAAI,EACtC,KAAM,GACN,QAAS,aAAA,CACV,EACC,OAAQI,GAASA,EAAK,IAAI,EAI3B,iBAAAL,EACA,oBAAAC,EACA,YAAakG,EAAA,CAEf,EChBaC,GAAa,CAAC,CAC1B,OAAAf,EACA,aAAAjM,EACA,gBAAAiN,EACA,UAAA7N,CACD,IAAuB,CACtB,KAAM,CACL,UAAAiI,EACA,iBAAAT,EACA,oBAAAC,EACA,YAAaS,CAAA,EACVwF,GAAcb,CAAM,EAExB,OACCtM,EAAAA,KAAA2E,WAAA,CACC,SAAA,CAAA3E,OAAC4H,GAAA,CACA,SAAA,CAAA3H,EAAAA,IAAC4H,GAAA,CAAoB,QAAO,GAC3B,SAAA7H,EAAAA,KAACE,EAAA,CACA,QAAQ,QACR,KAAK,OACL,UAAWH,EAAG,UAAWN,CAAS,EAElC,SAAA,CAAAQ,EAAAA,IAAC,OAAA,CAAK,UAAU,UAAU,SAAA,YAAS,EACnCA,EAAAA,IAAC0H,EAAA,CAAY,UAAU,SAAA,CAAU,CAAA,CAAA,CAAA,EAEnC,QACCG,GAAA,CAAoB,MAAM,MACzB,SAAAJ,EAAU,IAAKJ,GAAS,CACxB,MAAMS,EAAOT,EAAK,KAClB,OACCtH,EAAAA,KAACgI,GAAA,CAEA,QAASV,EAAK,OACd,UAAWvH,EACVuH,EAAK,UAAY,eAAiB,kBAAA,EAGnC,SAAA,CAAArH,EAAAA,IAAC8H,EAAA,CAAK,UAAU,cAAA,CAAe,EAC9BT,EAAK,KAAA,CAAA,EAPDA,EAAK,KAAA,CAUb,CAAC,CAAA,CACF,CAAA,EACD,EACArH,EAAAA,IAAC+M,GAAA,CACA,OAAAV,EACA,aAAAjM,EACA,KAAM4G,EACN,aAAcC,EACd,UAAWoG,CAAA,CAAA,CACZ,EACD,CAEF,EChEaC,GAAyB,CAAC,CACtC,OAAAjB,EACA,aAAAjM,CACD,IACQJ,EAAAA,IAACoN,GAAA,CAAW,OAAAf,EAAgB,aAAAjM,CAAA,CAA4B,ECAnDmN,EAAsB,CAAC,CACnC,YAAA3C,EACA,eAAAC,EACA,aAAAC,EACA,WAAA7J,EACA,UAAAzB,CACD,IAAgC,CAC/B,MAAMyL,EAAmBL,EAAY,OAAS,EAE9C,cACE,MAAA,CAAI,UAAW9K,EAAG,oCAAqCN,CAAS,EAChE,SAAA,CAAAQ,EAAAA,IAAC,MAAA,CAAI,UAAU,gCACb,SAAA4K,EACE,GAAGE,CAAY,OAAO7J,CAAU,WAChC,GAAGA,CAAU,WACjB,EACAlB,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAkL,GACAjL,EAAAA,IAACC,EAAA,CAAO,QAAQ,QAAQ,KAAK,KAAK,QAAS,IAAM4K,EAAe,EAAE,EAAG,SAAA,eAAA,CAErE,EAED7K,EAAAA,IAACkL,GAAA,CACA,YAAY,oBACZ,MAAON,EACP,SAAWO,GAAMN,EAAeM,EAAE,OAAO,KAAK,EAC9C,UAAU,MAAA,CAAA,CACX,CAAA,CACD,CAAA,EACD,CAEF,ECbaqC,GAAe,CAAC,CAC5B,aAAApN,EACA,QAAA6C,EACA,WAAA5C,EACA,cAAAI,EACA,mBAAAgN,EACA,sBAAAC,EACA,UAAAlO,CACD,IAAyB,CACxB,MAAMoL,EAAenK,EAAc,KAAME,GAAWA,EAAO,KAAO,MAAM,GACrE,OAAS,GAEN+E,EAAqB9D,EAAAA,YACzB0C,GAAkB,CAClB,MAAMqJ,EAAUlN,EAAc,OAAQE,GAAWA,EAAO,KAAO,MAAM,EACrE+M,EACCpJ,EAAQ,CAAC,GAAGqJ,EAAS,CAAE,GAAI,OAAQ,MAAArJ,CAAA,CAAO,EAAIqJ,CAAA,CAEhD,EACA,CAACD,EAAuBjN,CAAa,CAAA,EAGhCkB,EAAsDC,EAAAA,YAC1D8J,GAAY,CACZ,IAAI7J,EAAgBxB,EAChB,OAAOqL,GAAY,WACtB7J,EAAgB6J,EAAQrL,CAAU,EAElCwB,EAAgB6J,EAEjB+B,EAAmB5L,CAAa,CACjC,EACA,CAACxB,EAAYoN,CAAkB,CAAA,EAG1BG,EAAkBhN,EAAAA,QAAQ,IAC1BgK,EACE3H,EAAQ,OAAQoJ,GACtBA,EAAO,KAAK,cAAc,SAASzB,EAAY,YAAA,CAAa,CAAA,EAFpC3H,EAIvB,CAACA,EAAS2H,CAAW,CAAC,EAEnBb,EAAUnJ,EAAAA,QACf,IACC2L,GAAqC,CACpC,aAAAnM,EACA,iBAAkBkN,EAAA,CAClB,EACF,CAAClN,CAAY,CAAA,EAGRwL,EAAQC,EAAc,CAC3B,KAAM+B,EACN,QAAA7D,EACA,gBAAiB+B,EAAA,EACjB,kBAAmBC,EAAA,EACnB,sBAAuB8B,GAAA,EACvB,iBAAkB,GAClB,MAAO,CACN,WAAAxN,CAAA,EAED,mBAAoBsB,EACpB,aAAc,CACb,QAAS,CAAC,CAAE,GAAI,OAAQ,KAAM,GAAO,CAAA,CACtC,CACA,EAMD,OAFCsB,EAAQ,SAAW,GAAM2H,GAAegD,EAAgB,SAAW,SAIjE,MAAA,CAAI,UAAW9N,EAAG,YAAaN,CAAS,EACxC,SAAA,CAAAQ,EAAAA,IAACuN,EAAA,CACA,YAAA3C,EACA,eAAgBlF,EAChB,aAAckI,EAAgB,OAC9B,WAAY3K,EAAQ,MAAA,CAAA,EAErBjD,EAAAA,IAACyM,GAAA,CACA,eAAgB7B,EAAY,OAAS,EACrC,aAAAxK,CAAA,CAAA,CACD,EACD,SAKA,MAAA,CAAI,UAAWN,EAAG,YAAaN,CAAS,EACxC,SAAA,CAAAQ,EAAAA,IAACuN,EAAA,CACA,YAAA3C,EACA,eAAgBlF,EAChB,aAAckI,EAAgB,OAC9B,WAAY3K,EAAQ,MAAA,CAAA,EAErBjD,MAACgM,IAAU,MAAAJ,CAAA,CAAc,CAAA,EAC1B,CAEF,EC3F6BkC,GAAS,CACrCC,IAAKD,GACE,CAAC,UAAW,OAAQ,cAAe,UAAW,aAAa,CAAC,EACjEE,QAAQ,MAAM,CACjB,CAAC,EAuGD,MAAMC,GAA2BA,CAAC,CACjC7N,aAAAA,CAGD,IAAM,CACL,KAAM,CAACwK,EAAasD,CAAc,EAAIvO,EAAAA,SAAS,EAAE,EAC3C,CAAC4L,EAAW4C,CAAY,EAAIxO,EAAAA,SAAuB,CAAA,CAAE,EAErD,CAAEyO,KAAM9C,CAAAA,EAAW+C,EACxBC,GAA6BlO,CAAY,CAC1C,EAEMmO,EAAiB3N,EAAAA,QAAQ,IACzBgK,EACEU,EAAO3K,OAAQgJ,GACrBA,EAAM6E,KAAKC,YAAAA,EAAcC,SAAS9D,EAAY6D,YAAAA,CAAa,CAC5D,EAHyBnD,EAIvB,CAACA,EAAQV,CAAW,CAAC,EAExB,OACC5K,EAAAA,IAACqL,GAAA,CACA,OAAQkD,EACR,YAAA3D,EACA,UAAAW,EACA,WAAYD,EAAOqD,OACnB,aAAAvO,EACA,eAAgB8N,EAChB,gBAAiBC,EAAa,CAGjC,EAGMS,GAAoBA,CAAC,CAAExO,aAAAA,CAAuC,IAAM,CACzE,KAAM,CAACC,EAAYC,CAAa,EAAIX,WAA0B,CAC7DkP,UAAW,EACXC,SAAU,EAAA,CACV,EACK,CAACrO,EAAeC,CAAgB,EAAIf,EAAAA,SAA6B,CAAA,CAAE,EAEnE,CAAEyO,KAAMnL,CAAAA,EAAYoL,EACzBlL,GAA8B/C,CAAY,CAC3C,EAEA,OACCJ,MAACwN,IACA,aAAApN,EACA,QAAA6C,EACA,WAAA5C,EACA,cAAAI,EACA,mBAAoBH,EACpB,sBAAuBI,CAAAA,CAAiB,CAG3C,EAEA,SAASqO,IAAiB,CACzB,KAAM,CAAE3O,aAAAA,CAAAA,EAAiB4O,EAAMC,UAAAA,EACzB,CAAElB,IAAAA,CAAAA,EAAQiB,EAAME,UAAAA,EAChB1I,EAAWC,EAAY,CAAE0I,KAAMH,EAAMI,QAAAA,CAAU,EAC/CC,EAAcC,GAAAA,EAEd,CAAElB,KAAMpL,CAAAA,EAAaqL,EAC1BkB,GAAsBnP,CAAY,CACnC,EAEMoP,EAAiBxM,EAASZ,SAAW,QACrCqN,EAAoB,gCAAgCzM,EAASwL,IAAI,IAEjEkB,EAAO9O,EAAAA,QACZ,IACC,CACC,CACC+O,GAAI,UACJpN,MAAO,UACPqN,OAAQ,GACRC,gBAAiB,EAAA,EAElB,CACCF,GAAI,OACJpN,MAAO,OACPqN,OAAQ,GACRC,gBAAiB,EAAA,EAElB,CACCF,GAAI,cACJpN,MAAO,cACPqN,OAAQ,GACRC,gBAAiB,EAAA,EAElB,CACCF,GAAI,UACJpN,MAAO,UACPsN,gBAAiB,EAAA,EAElB,CACCF,GAAI,cACJpN,MAAO,cACPqN,OAAQ,GACRC,gBAAiB,EAAA,CACjB,EACAlP,OAAQoN,GAAQ,CAACA,EAAI6B,MAAM,EAC9B,EACD,EAEME,EAAkBlO,cACtBmO,GAAmB,CACdvJ,EAAS,CACbwJ,OAAQ,CAAEjC,IAAKgC,CAAAA,CAAsC,CACrD,CACF,EACA,CAACvJ,CAAQ,CACV,EAEMyJ,EAAuBrO,EAAAA,YAAY,IAAM,CAEzCyN,EAAYa,kBAAkB,CAClCC,SAAUC,GAAyBC,aAAajQ,CAAY,CAAA,CAC5D,CACF,EAAG,CAACiP,EAAajP,CAAY,CAAC,EAE9B,OACCJ,EAAAA,IAACsQ,GAAA,CACA,SAAAvQ,EAAAA,KAACwQ,GAAA,CACA,SAAA,CAAAxQ,OAACyQ,GAAA,CACA,SAAA,CAAAxQ,EAAAA,IAAC+I,GAAA,CACA,SAAA/F,EACA,SAAUiN,CAAAA,CAAqB,EAE/BT,SACC,MAAA,CAAI,UAAU,+CACd,SAAAxP,EAAAA,IAAC,MAAA,CAAI,UAAU,oBACd,SAAAA,MAACZ,IACA,QAASqQ,EACT,MAAM,kCACN,SAAS,6BACT,UAAU,MAAA,CAAM,EAElB,CAAA,CACD,CAAA,EAEF,EAEA1P,EAAAA,KAAC,MAAA,CAAI,UAAU,qCACd,SAAA,CAAAC,EAAAA,IAAC,MAAA,CAAI,UAAU,SACd,SAAAD,EAAAA,KAAC0Q,IAAK,MAAO1C,EAAK,cAAe+B,EAChC,SAAA,CAAA9P,EAAAA,IAAC0Q,GAAA,CAAS,UAAU,6CAClBhB,SAAAA,EAAKiB,OACL3Q,EAAAA,IAAC4Q,GAAA,CAEA,MAAOC,EAAQlB,GACf,UAAW7P,EACV,kCACA+Q,EAAQhB,gBAAkB,YAAc,EACzC,EAECgB,WAAQtO,KAAAA,EAPJsO,EAAQlB,EAQd,CACA,CAAA,CACF,EAEA3P,EAAAA,IAAC8Q,EAAA,CAAY,MAAM,UAAU,UAAU,YACtC,SAAA9Q,EAAAA,IAAC+Q,EAAAA,SAAA,CACA,SACChR,OAAC,MAAA,CAAI,UAAU,YACd,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,YACd,SAAA,CAAAC,EAAAA,IAACgR,EAAA,CAAS,UAAU,UAAA,CAAU,EAC9BjR,EAAAA,KAAC,MAAA,CAAI,UAAU,wCACd,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,YACd,SAAA,CAAAC,EAAAA,IAACgR,EAAA,CAAS,UAAU,UAAA,CAAU,EAC9BhR,EAAAA,IAACgR,EAAA,CAAS,UAAU,UAAA,CAAU,CAAA,EAC/B,EACAjR,EAAAA,KAAC,MAAA,CAAI,UAAU,YACd,SAAA,CAAAC,EAAAA,IAACgR,EAAA,CAAS,UAAU,UAAA,CAAU,EAC9BhR,EAAAA,IAACgR,EAAA,CAAS,UAAU,UAAA,CAAU,CAAA,EAC/B,EACAjR,EAAAA,KAAC,MAAA,CAAI,UAAU,YACd,SAAA,CAAAC,EAAAA,IAACgR,EAAA,CAAS,UAAU,UAAA,CAAU,EAC9BhR,EAAAA,IAACgR,EAAA,CAAS,UAAU,UAAA,CAAU,CAAA,EAC/B,EACAjR,EAAAA,KAAC,MAAA,CAAI,UAAU,YACd,SAAA,CAAAC,EAAAA,IAACgR,EAAA,CAAS,UAAU,UAAA,CAAU,EAC9BhR,EAAAA,IAACgR,EAAA,CAAS,UAAU,UAAA,CAAU,CAAA,CAAA,CAC/B,CAAA,CAAA,CACD,CAAA,EACD,EACAjR,EAAAA,KAAC,MAAA,CAAI,UAAU,YACd,SAAA,CAAAC,EAAAA,IAACgR,EAAA,CAAS,UAAU,UAAA,CAAU,EAC9BhR,EAAAA,IAAC,OAAI,UAAU,YACd,eAACgR,EAAA,CAAS,UAAU,cAAa,CAAA,CAClC,CAAA,CAAA,CACD,CAAA,EACD,EAGD,SAAAhR,MAACuE,EAAA,CAAgB,SAAAvB,CAAA,CAAmB,EACrC,EACD,EAEAhD,EAAAA,IAAC8Q,EAAA,CAAY,MAAM,OAClB,SAAA9Q,EAAAA,IAAC+Q,EAAAA,UACA,SACChR,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAC,EAAAA,IAACgR,EAAA,CAAS,UAAU,aAAA,CAAa,EACjChR,EAAAA,IAACgR,EAAA,CAAS,UAAU,aAAA,CAAa,EACjChR,EAAAA,IAACgR,EAAA,CAAS,UAAU,aAAA,CAAa,CAAA,EAClC,EAGD,SAAAhR,MAAC4E,GAAA,CAAoB,aAAAxE,CAAA,CAA2B,EACjD,EACD,EAEAJ,EAAAA,IAAC8Q,EAAA,CAAY,MAAM,cAAc,UAAU,YAC1C,SAAA9Q,EAAAA,IAAC+Q,EAAAA,SAAA,CACA,SACChR,OAAC,MAAA,CAAI,UAAU,sBAEd,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACd,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,0BACd,SAAA,CAAAC,EAAAA,IAACgR,EAAA,CAAS,UAAU,UAAA,CAAU,EAC9BhR,EAAAA,IAACgR,EAAA,CAAS,UAAU,SAAA,CAAS,CAAA,EAC9B,EACAhR,EAAAA,IAAC,OAAI,UAAU,0BACd,eAACgR,EAAA,CAAS,UAAU,WAAU,CAAA,CAC/B,CAAA,EACD,EAEAhR,EAAAA,IAAC,OAAI,UAAU,YACd,eAACgR,EAAA,CAAS,UAAU,cAAa,CAAA,CAClC,CAAA,EACD,EAGD,SAAAhR,MAACiO,GAAA,CAAyB,aAAA7N,CAAA,CAA2B,EACtD,EACD,EAEAJ,EAAAA,IAAC8Q,EAAA,CAAY,MAAM,UAAU,UAAU,YACtC,SAAA9Q,EAAAA,IAAC+Q,EAAAA,SAAA,CACA,SACChR,OAAC,MAAA,CAAI,UAAU,YAEd,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACd,SAAA,CAAAC,EAAAA,IAACgR,EAAA,CAAS,UAAU,UAAA,CAAU,EAC9BhR,EAAAA,IAACgR,EAAA,CAAS,UAAU,UAAA,CAAU,CAAA,EAC/B,EAEAhR,EAAAA,IAAC,OAAI,UAAU,YACd,eAACgR,EAAA,CAAS,UAAU,cAAa,CAAA,CAClC,CAAA,EACD,EAGD,SAAAhR,MAAC4O,GAAA,CAAkB,aAAAxO,CAAA,CAA2B,EAC/C,EACD,EAEAJ,EAAAA,IAAC8Q,EAAA,CAAY,MAAM,cAAc,UAAU,YAC1C,SAAA9Q,EAAAA,IAAC+Q,EAAAA,SAAA,CACA,SACChR,OAAC,MAAA,CAAI,UAAU,YAEd,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,oCACd,SAAA,CAAAC,EAAAA,IAACgR,EAAA,CAAS,UAAU,UAAA,CAAU,EAC9BhR,EAAAA,IAACgR,EAAA,CAAS,UAAU,UAAA,CAAU,CAAA,EAC/B,EAEAhR,EAAAA,IAAC,OAAI,UAAU,YACd,eAACgR,EAAA,CAAS,UAAU,cAAa,CAAA,CAClC,CAAA,CAAA,CACD,EAGD,SAAAhR,EAAAA,IAACG,GAAA,CAAuB,aAAAC,CAAA,CAA2B,EACpD,CAAA,CACD,CAAA,CAAA,CACD,CAAA,CACD,EAEAJ,MAAC,QAAA,CAAM,UAAU,6CAChB,eAAC,MAAA,CAAI,UAAU,eACd,SAAAA,EAAAA,IAACuE,EAAA,CAAgB,SAAAvB,EAAoB,UAAS,EAAA,CAAA,EAC/C,CAAA,CACD,CAAA,CAAA,CACD,CAAA,CAAA,CACD,CAAA,CACD,CAEF","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"work-pool._workPoolName-B_NFWXKS.js","sources":["../../node_modules/lucide-react/dist/esm/icons/circle-question-mark.js","../../src/components/code-banner/code-banner.tsx","../../src/components/work-pools/work-pool-deployments-tab/work-pool-deployments-tab.tsx","../../src/components/work-pools/work-pool-status-badge/work-pool-status-badge.tsx","../../src/components/work-pools/work-pool-details/work-pool-details.tsx","../../src/components/work-pools/work-pool-flow-runs-tab/work-pool-flow-runs-tab.tsx","../../src/components/work-pools/work-pool-menu/components/delete-work-pool-dialog.tsx","../../src/components/work-pools/work-pool-menu/hooks/use-work-pool-menu.ts","../../src/components/work-pools/work-pool-menu/work-pool-menu.tsx","../../src/components/work-pools/work-pool-toggle/hooks/use-work-pool-toggle.ts","../../src/components/work-pools/work-pool-toggle/work-pool-toggle.tsx","../../src/components/work-pools/work-pool-page-header/work-pool-page-header.tsx","../../src/components/flow-runs/late-flow-runs-indicator/late-flow-runs-indicator.tsx","../../src/components/work-pools/work-pool-queues-table/components/queue-name-with-late-indicator.tsx","../../src/components/work-pools/work-pool-queues-table/components/work-pool-queues-table-columns.tsx","../../src/components/work-pools/work-pool-queues-table/components/work-pool-queues-table-empty-state.tsx","../../src/components/work-pools/work-pool-queues-table/components/work-pool-queues-table-toolbar.tsx","../../src/components/work-pools/work-pool-queues-table/work-pool-queues-table.tsx","../../src/components/workers/worker-status-badge/worker-status-badge.tsx","../../src/components/work-pools/workers-table/components/workers-table-columns.tsx","../../src/components/work-pools/workers-table/components/workers-table-empty-state.tsx","../../src/components/workers/worker-menu/components/delete-worker-dialog.tsx","../../src/components/workers/worker-menu/hooks/use-worker-menu.ts","../../src/components/workers/worker-menu/worker-menu.tsx","../../src/components/work-pools/workers-table/components/workers-table-row-actions.tsx","../../src/components/work-pools/workers-table/components/workers-table-toolbar.tsx","../../src/components/work-pools/workers-table/workers-table.tsx","../../src/routes/work-pools/work-pool.$workPoolName.tsx?tsr-split=component"],"sourcesContent":["/**\n * @license lucide-react v0.563.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst __iconNode = [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3\", key: \"1u773s\" }],\n [\"path\", { d: \"M12 17h.01\", key: \"p32p05\" }]\n];\nconst CircleQuestionMark = createLucideIcon(\"circle-question-mark\", __iconNode);\n\nexport { __iconNode, CircleQuestionMark as default };\n//# sourceMappingURL=circle-question-mark.js.map\n","import { Copy } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { toast } from \"sonner\";\n\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/utils\";\n\ntype CodeBannerProps = {\n\tcommand: string;\n\ttitle: string;\n\tsubtitle: string;\n\tclassName?: string;\n};\n\nexport const CodeBanner = ({\n\tcommand,\n\ttitle,\n\tsubtitle,\n\tclassName,\n}: CodeBannerProps) => {\n\tconst [copying, setCopying] = useState(false);\n\n\tconst handleCopy = async () => {\n\t\tif (copying) return;\n\n\t\tsetCopying(true);\n\t\ttry {\n\t\t\tawait navigator.clipboard.writeText(command);\n\t\t\ttoast.success(\"Command copied to clipboard\");\n\t\t} catch {\n\t\t\ttoast.error(\"Failed to copy command\");\n\t\t} finally {\n\t\t\tsetCopying(false);\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className={cn(\"space-y-4\", className)}>\n\t\t\t{/* Title and subtitle above terminal */}\n\t\t\t<div className=\"text-center\">\n\t\t\t\t<h3 className=\"text-lg font-semibold text-foreground mb-1\">{title}</h3>\n\t\t\t\t<p className=\"text-muted-foreground text-sm\">{subtitle}</p>\n\t\t\t</div>\n\n\t\t\t{/* Terminal window */}\n\t\t\t<div className=\"bg-muted border border-border rounded-lg shadow-sm overflow-hidden\">\n\t\t\t\t{/* macOS-style window header */}\n\t\t\t\t<div className=\"bg-muted/80 border-b border-border px-3 py-2 flex items-center space-x-2\">\n\t\t\t\t\t<div className=\"flex space-x-1\">\n\t\t\t\t\t\t<div className=\"w-3 h-3 bg-red-500 rounded-full\" />\n\t\t\t\t\t\t<div className=\"w-3 h-3 bg-yellow-500 rounded-full\" />\n\t\t\t\t\t\t<div className=\"w-3 h-3 bg-green-500 rounded-full\" />\n\t\t\t\t\t</div>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t// eslint-disable-next-line @typescript-eslint/no-misused-promises\n\t\t\t\t\t\tonClick={handleCopy}\n\t\t\t\t\t\tdisabled={copying}\n\t\t\t\t\t\tclassName=\"ml-auto text-muted-foreground hover:text-foreground hover:bg-muted h-6 w-6 p-0\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Copy className=\"h-4 w-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Terminal content */}\n\t\t\t\t<div className=\"bg-gray-800 dark:bg-gray-900 px-4 py-2\">\n\t\t\t\t\t<p className=\"py-1\">\n\t\t\t\t\t\t<code className=\"font-mono text-sm text-gray-300 select-all\">\n\t\t\t\t\t\t\t{command}\n\t\t\t\t\t\t</code>\n\t\t\t\t\t\t<span className=\"ml-1 -mb-1 inline-block w-[7px] h-[18px] bg-gray-400 terminal-cursor\" />\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport type {\n\tColumnFiltersState,\n\tPaginationState,\n} from \"@tanstack/react-table\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport {\n\tbuildCountDeploymentsQuery,\n\tbuildPaginateDeploymentsQuery,\n\ttype DeploymentsPaginationFilter,\n} from \"@/api/deployments\";\nimport { buildListFlowsQuery } from \"@/api/flows\";\nimport type { components } from \"@/api/prefect\";\nimport { DeploymentsDataTable } from \"@/components/deployments/data-table\";\n\ntype WorkPoolDeploymentsTabProps = {\n\tworkPoolName: string;\n\tclassName?: string;\n};\n\nexport const WorkPoolDeploymentsTab = ({\n\tworkPoolName,\n\tclassName,\n}: WorkPoolDeploymentsTabProps) => {\n\tconst [pagination, setPagination] = useState<PaginationState>({\n\t\tpageIndex: 0,\n\t\tpageSize: 50,\n\t});\n\tconst [sort, setSort] =\n\t\tuseState<components[\"schemas\"][\"DeploymentSort\"]>(\"CREATED_DESC\");\n\tconst [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);\n\n\tconst filter: DeploymentsPaginationFilter = useMemo(\n\t\t() => ({\n\t\t\tpage: pagination.pageIndex + 1,\n\t\t\tlimit: pagination.pageSize,\n\t\t\tsort,\n\t\t\twork_pools: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tname: { any_: [workPoolName] },\n\t\t\t},\n\t\t\tdeployments: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tflow_or_deployment_name: {\n\t\t\t\t\tlike_:\n\t\t\t\t\t\t(columnFilters.find((f) => f.id === \"flowOrDeploymentName\")\n\t\t\t\t\t\t\t?.value as string) ?? \"\",\n\t\t\t\t},\n\t\t\t\ttags: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tall_:\n\t\t\t\t\t\t(columnFilters.find((f) => f.id === \"tags\")?.value as string[]) ??\n\t\t\t\t\t\t[],\n\t\t\t\t},\n\t\t\t},\n\t\t}),\n\t\t[workPoolName, pagination, sort, columnFilters],\n\t);\n\n\tconst countFilter = useMemo(\n\t\t() => ({\n\t\t\toffset: 0,\n\t\t\tsort: \"CREATED_DESC\" as const,\n\t\t\twork_pools: {\n\t\t\t\toperator: \"and_\" as const,\n\t\t\t\tname: { any_: [workPoolName] },\n\t\t\t},\n\t\t}),\n\t\t[workPoolName],\n\t);\n\n\tconst { data: paginatedData } = useQuery(\n\t\tbuildPaginateDeploymentsQuery(filter),\n\t);\n\n\tconst { data: totalCount } = useQuery(\n\t\tbuildCountDeploymentsQuery(countFilter),\n\t);\n\n\tconst flowIds = useMemo(\n\t\t() => [...new Set((paginatedData?.results ?? []).map((d) => d.flow_id))],\n\t\t[paginatedData?.results],\n\t);\n\n\tconst { data: flows } = useQuery(\n\t\tbuildListFlowsQuery(\n\t\t\t{\n\t\t\t\tflows: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tid: { any_: flowIds },\n\t\t\t\t},\n\t\t\t\toffset: 0,\n\t\t\t\tsort: \"NAME_ASC\",\n\t\t\t},\n\t\t\t{ enabled: flowIds.length > 0 },\n\t\t),\n\t);\n\n\tconst deploymentsWithFlows = useMemo(() => {\n\t\tif (!paginatedData?.results) return [];\n\t\tconst flowMap = new Map(flows?.map((flow) => [flow.id, flow]) ?? []);\n\t\treturn paginatedData.results.map((deployment) => ({\n\t\t\t...deployment,\n\t\t\tflow: flowMap.get(deployment.flow_id),\n\t\t}));\n\t}, [paginatedData?.results, flows]);\n\n\tconst handlePaginationChange = useCallback(\n\t\t(newPagination: PaginationState) => {\n\t\t\tsetPagination(newPagination);\n\t\t},\n\t\t[],\n\t);\n\n\tconst handleSortChange = useCallback(\n\t\t(newSort: components[\"schemas\"][\"DeploymentSort\"]) => {\n\t\t\tsetSort(newSort);\n\t\t},\n\t\t[],\n\t);\n\n\tconst handleColumnFiltersChange = useCallback(\n\t\t(newFilters: ColumnFiltersState) => {\n\t\t\tsetColumnFilters(newFilters);\n\t\t},\n\t\t[],\n\t);\n\n\t// Show loading only on initial load, not on sorting/pagination changes\n\tif (!paginatedData || totalCount === undefined) {\n\t\treturn (\n\t\t\t<div className={className}>\n\t\t\t\t<div className=\"text-muted-foreground text-center py-8\">\n\t\t\t\t\tLoading deployments...\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={className}>\n\t\t\t<DeploymentsDataTable\n\t\t\t\tdeployments={deploymentsWithFlows}\n\t\t\t\tcurrentDeploymentsCount={totalCount}\n\t\t\t\tpageCount={paginatedData.pages}\n\t\t\t\tpagination={pagination}\n\t\t\t\tsort={sort}\n\t\t\t\tcolumnFilters={columnFilters}\n\t\t\t\tonPaginationChange={handlePaginationChange}\n\t\t\t\tonSortChange={handleSortChange}\n\t\t\t\tonColumnFiltersChange={handleColumnFiltersChange}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","import { Pause } from \"lucide-react\";\nimport type { WorkPoolStatus } from \"@/api/work-pools\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { cn } from \"@/utils\";\n\ntype WorkPoolStatusBadgeProps = {\n\tstatus: WorkPoolStatus;\n\tclassName?: string;\n};\n\nconst getStatusLabel = (status: WorkPoolStatus): string => {\n\tswitch (status) {\n\t\tcase \"READY\":\n\t\t\treturn \"Ready\";\n\t\tcase \"PAUSED\":\n\t\t\treturn \"Paused\";\n\t\tcase \"NOT_READY\":\n\t\t\treturn \"Not Ready\";\n\t}\n};\n\nconst getStatusColor = (status: WorkPoolStatus): string => {\n\tswitch (status) {\n\t\tcase \"READY\":\n\t\t\treturn \"bg-green-500\";\n\t\tcase \"PAUSED\":\n\t\t\treturn \"bg-yellow-500\";\n\t\tcase \"NOT_READY\":\n\t\t\treturn \"bg-red-500\";\n\t}\n};\n\nexport const WorkPoolStatusBadge = ({\n\tstatus,\n\tclassName,\n}: WorkPoolStatusBadgeProps) => {\n\tconst label = getStatusLabel(status);\n\tconst colorClass = getStatusColor(status);\n\n\treturn (\n\t\t<Badge\n\t\t\tvariant=\"secondary\"\n\t\t\tclassName={cn(\"flex items-center space-x-1\", className)}\n\t\t>\n\t\t\t{status === \"PAUSED\" ? (\n\t\t\t\t<Pause className=\"h-2 w-2 text-muted-foreground\" />\n\t\t\t) : (\n\t\t\t\t<div className={cn(\"h-2 w-2 rounded-full\", colorClass)} />\n\t\t\t)}\n\t\t\t<span>{label}</span>\n\t\t</Badge>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useMemo } from \"react\";\n\nimport type { WorkPool } from \"@/api/work-pools\";\nimport { buildListWorkPoolWorkersQuery } from \"@/api/work-pools\";\nimport type { SchemaProperty } from \"@/components/schemas/schema-display\";\nimport { FormattedDate } from \"@/components/ui/formatted-date\";\nimport { Separator } from \"@/components/ui/separator\";\nimport { WorkPoolStatusBadge } from \"@/components/work-pools/work-pool-status-badge\";\nimport { cn, titleCase } from \"@/utils\";\n\ntype WorkPoolDetailsProps = {\n\tworkPool: WorkPool;\n\talternate?: boolean;\n\tclassName?: string;\n};\n\n// Helper components for field display\nconst None = () => <dd className=\"text-muted-foreground text-sm\">None</dd>;\nconst FieldLabel = ({ children }: { children: React.ReactNode }) => (\n\t<dt className=\"text-sm text-muted-foreground\">{children}</dt>\n);\nconst FieldValue = ({\n\tchildren,\n\tclassName,\n}: {\n\tchildren: React.ReactNode;\n\tclassName?: string;\n}) => <dd className={cn(\"text-sm\", className)}>{children}</dd>;\n\n// Basic Info Section Component\nfunction BasicInfoSection({ workPool }: { workPool: WorkPool }) {\n\tconst { data: workers = [], isLoading } = useQuery(\n\t\tbuildListWorkPoolWorkersQuery(workPool.name),\n\t);\n\n\tconst lastPolled = useMemo(() => {\n\t\tif (isLoading) return null;\n\t\tif (workers.length === 0) return null;\n\n\t\tconst heartbeats = workers\n\t\t\t.map((w) => w.last_heartbeat_time)\n\t\t\t.filter((time): time is string => Boolean(time))\n\t\t\t.sort((a, b) => new Date(b).getTime() - new Date(a).getTime());\n\n\t\treturn heartbeats[0] || null;\n\t}, [workers, isLoading]);\n\n\tconst fields = [\n\t\t{\n\t\t\tfield: \"Status\",\n\t\t\tComponentValue: () => (\n\t\t\t\t<dd>\n\t\t\t\t\t<WorkPoolStatusBadge status={workPool.status || \"NOT_READY\"} />\n\t\t\t\t</dd>\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\tfield: \"Description\",\n\t\t\tComponentValue: () =>\n\t\t\t\tworkPool.description ? (\n\t\t\t\t\t<FieldValue>{workPool.description}</FieldValue>\n\t\t\t\t) : null,\n\t\t},\n\t\t{\n\t\t\tfield: \"Type\",\n\t\t\tComponentValue: () =>\n\t\t\t\tworkPool.type ? (\n\t\t\t\t\t<FieldValue>{titleCase(workPool.type)}</FieldValue>\n\t\t\t\t) : (\n\t\t\t\t\t<None />\n\t\t\t\t),\n\t\t},\n\t\t{\n\t\t\tfield: \"Concurrency Limit\",\n\t\t\tComponentValue: () => (\n\t\t\t\t<FieldValue>\n\t\t\t\t\t{workPool.concurrency_limit\n\t\t\t\t\t\t? String(workPool.concurrency_limit)\n\t\t\t\t\t\t: \"Unlimited\"}\n\t\t\t\t</FieldValue>\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\tfield: \"Last Polled\",\n\t\t\tComponentValue: () =>\n\t\t\t\tlastPolled ? (\n\t\t\t\t\t<FieldValue>\n\t\t\t\t\t\t<FormattedDate date={lastPolled} />\n\t\t\t\t\t</FieldValue>\n\t\t\t\t) : workers.length === 0 ? null : (\n\t\t\t\t\t<FieldValue className=\"text-muted-foreground\">\n\t\t\t\t\t\tNo recent activity\n\t\t\t\t\t</FieldValue>\n\t\t\t\t),\n\t\t},\n\t\t{\n\t\t\tfield: \"Created\",\n\t\t\tComponentValue: () =>\n\t\t\t\tworkPool.created ? (\n\t\t\t\t\t<FieldValue>\n\t\t\t\t\t\t<FormattedDate date={workPool.created} />\n\t\t\t\t\t</FieldValue>\n\t\t\t\t) : (\n\t\t\t\t\t<None />\n\t\t\t\t),\n\t\t},\n\t\t{\n\t\t\tfield: \"Last Updated\",\n\t\t\tComponentValue: () =>\n\t\t\t\tworkPool.updated ? (\n\t\t\t\t\t<FieldValue>\n\t\t\t\t\t\t<FormattedDate date={workPool.updated} />\n\t\t\t\t\t</FieldValue>\n\t\t\t\t) : (\n\t\t\t\t\t<None />\n\t\t\t\t),\n\t\t},\n\t].filter(({ ComponentValue }) => ComponentValue() !== null);\n\n\tif (isLoading) {\n\t\treturn (\n\t\t\t<div className=\"text-muted-foreground text-sm\">\n\t\t\t\tLoading work pool details...\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div>\n\t\t\t<ul className=\"flex flex-col gap-3\">\n\t\t\t\t{fields.map(({ field, ComponentValue }) => (\n\t\t\t\t\t<li key={field}>\n\t\t\t\t\t\t<dl>\n\t\t\t\t\t\t\t<FieldLabel>{field}</FieldLabel>\n\t\t\t\t\t\t\t<ComponentValue />\n\t\t\t\t\t\t</dl>\n\t\t\t\t\t</li>\n\t\t\t\t))}\n\t\t\t</ul>\n\t\t</div>\n\t);\n}\n\n// Job Template Section Component\nfunction JobTemplateSection({ workPool }: { workPool: WorkPool }) {\n\t// Check if work pool has base job template\n\tconst baseJobTemplate = workPool.base_job_template;\n\n\tif (\n\t\t!baseJobTemplate?.variables ||\n\t\ttypeof baseJobTemplate.variables !== \"object\" ||\n\t\t!(\"properties\" in baseJobTemplate.variables) ||\n\t\t!baseJobTemplate.variables.properties\n\t) {\n\t\treturn null;\n\t}\n\n\tconst properties = baseJobTemplate.variables.properties as Record<\n\t\tstring,\n\t\tSchemaProperty\n\t>;\n\n\t// Helper function to format field names (from property title or key)\n\tconst formatFieldName = (key: string, property: SchemaProperty): string => {\n\t\treturn (\n\t\t\tproperty.title ||\n\t\t\tkey\n\t\t\t\t.split(\"_\")\n\t\t\t\t.map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n\t\t\t\t.join(\" \")\n\t\t);\n\t};\n\n\t// Helper function to format field values\n\tconst formatValue = (value: unknown): string => {\n\t\tif (value === null || value === undefined) {\n\t\t\treturn \"None\";\n\t\t}\n\t\tif (typeof value === \"boolean\") {\n\t\t\treturn value.toString();\n\t\t}\n\t\tif (Array.isArray(value)) {\n\t\t\treturn value.length > 0 ? value.join(\", \") : \"None\";\n\t\t}\n\t\tif (typeof value === \"object\") {\n\t\t\treturn JSON.stringify(value);\n\t\t}\n\t\t// At this point, value is a primitive (string, number, bigint, symbol)\n\t\treturn String(value as string | number | bigint | symbol);\n\t};\n\n\treturn (\n\t\t<div>\n\t\t\t<h3 className=\"mb-4 text-md\">Base Job Configuration</h3>\n\t\t\t<ul className=\"flex flex-col gap-3\">\n\t\t\t\t{Object.entries(properties).map(([key, property]) => {\n\t\t\t\t\tconst value = property.default ?? null;\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<li key={key} className=\"flex flex-col gap-1 text-sm\">\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground font-medium\">\n\t\t\t\t\t\t\t\t{formatFieldName(key, property)}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span className=\"break-words\">{formatValue(value)}</span>\n\t\t\t\t\t\t</li>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</ul>\n\t\t</div>\n\t);\n}\n\nexport function WorkPoolDetails({\n\tworkPool,\n\talternate = false,\n\tclassName,\n}: WorkPoolDetailsProps) {\n\tconst spacing = alternate ? \"space-y-4\" : \"space-y-6\";\n\n\treturn (\n\t\t<div className={cn(spacing, className)}>\n\t\t\t<BasicInfoSection workPool={workPool} />\n\n\t\t\t{Boolean(\n\t\t\t\tworkPool.base_job_template?.variables &&\n\t\t\t\t\ttypeof workPool.base_job_template.variables === \"object\" &&\n\t\t\t\t\t\"properties\" in workPool.base_job_template.variables &&\n\t\t\t\t\tworkPool.base_job_template.variables.properties &&\n\t\t\t\t\tObject.keys(\n\t\t\t\t\t\tworkPool.base_job_template.variables.properties as Record<\n\t\t\t\t\t\t\tstring,\n\t\t\t\t\t\t\tunknown\n\t\t\t\t\t\t>,\n\t\t\t\t\t).length > 0,\n\t\t\t) && (\n\t\t\t\t<>\n\t\t\t\t\t<Separator />\n\t\t\t\t\t<JobTemplateSection workPool={workPool} />\n\t\t\t\t</>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useCallback, useMemo, useState } from \"react\";\nimport {\n\tbuildCountFlowRunsQuery,\n\tbuildPaginateFlowRunsQuery,\n\ttype FlowRunsCountFilter,\n\ttype FlowRunsPaginateFilter,\n\ttype FlowRunWithFlow,\n} from \"@/api/flow-runs\";\nimport { buildListFlowsQuery, type Flow } from \"@/api/flows\";\nimport { FlowRunsList } from \"@/components/flow-runs/flow-runs-list\";\nimport { StateFilter } from \"@/components/flow-runs/flow-runs-list/flow-runs-filters/state-filter\";\nimport type { FlowRunState } from \"@/components/flow-runs/flow-runs-list/flow-runs-filters/state-filters.constants\";\nimport {\n\tFlowRunsPagination,\n\ttype PaginationState,\n} from \"@/components/flow-runs/flow-runs-list/flow-runs-pagination\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport useDebounce from \"@/hooks/use-debounce\";\n\ntype WorkPoolFlowRunsTabProps = {\n\tworkPoolName: string;\n\tclassName?: string;\n};\n\nexport const WorkPoolFlowRunsTab = ({\n\tworkPoolName,\n\tclassName,\n}: WorkPoolFlowRunsTabProps) => {\n\tconst [pagination, setPagination] = useState<PaginationState>({\n\t\tlimit: 10,\n\t\tpage: 1,\n\t});\n\tconst [searchTerm, setSearchTerm] = useState(\"\");\n\tconst [selectedStates, setSelectedStates] = useState<Set<FlowRunState>>(\n\t\tnew Set(),\n\t);\n\n\t// Debounce the search term to avoid too many API calls\n\tconst debouncedSearchTerm = useDebounce(searchTerm, 500);\n\n\tconst filter: FlowRunsPaginateFilter = useMemo(() => {\n\t\tconst baseFilter: FlowRunsPaginateFilter = {\n\t\t\tpage: pagination.page,\n\t\t\tlimit: pagination.limit,\n\t\t\tsort: \"START_TIME_DESC\",\n\t\t\twork_pools: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tname: { any_: [workPoolName] },\n\t\t\t},\n\t\t};\n\n\t\t// Add search filter if search term exists\n\t\tif (debouncedSearchTerm.trim()) {\n\t\t\tbaseFilter.flow_runs = {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tname: { like_: debouncedSearchTerm.trim() },\n\t\t\t};\n\t\t}\n\n\t\t// Add state filter if states are selected\n\t\tif (selectedStates.size > 0) {\n\t\t\tconst stateFilter = {\n\t\t\t\tstate: {\n\t\t\t\t\toperator: \"and_\" as const,\n\t\t\t\t\tname: { any_: Array.from(selectedStates) },\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tif (baseFilter.flow_runs) {\n\t\t\t\t// Merge with existing flow_runs filter\n\t\t\t\tbaseFilter.flow_runs = {\n\t\t\t\t\t...baseFilter.flow_runs,\n\t\t\t\t\t...stateFilter,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tbaseFilter.flow_runs = {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t...stateFilter,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn baseFilter;\n\t}, [workPoolName, pagination, debouncedSearchTerm, selectedStates]);\n\n\tconst countFilter: FlowRunsCountFilter = useMemo(() => {\n\t\tconst baseCountFilter: FlowRunsCountFilter = {\n\t\t\twork_pools: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tname: { any_: [workPoolName] },\n\t\t\t},\n\t\t};\n\n\t\t// Add search filter to count if search term exists\n\t\tif (debouncedSearchTerm.trim()) {\n\t\t\tbaseCountFilter.flow_runs = {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tname: { like_: debouncedSearchTerm.trim() },\n\t\t\t};\n\t\t}\n\n\t\t// Add state filter to count if states are selected\n\t\tif (selectedStates.size > 0) {\n\t\t\tconst stateFilter = {\n\t\t\t\tstate: {\n\t\t\t\t\toperator: \"and_\" as const,\n\t\t\t\t\tname: { any_: Array.from(selectedStates) },\n\t\t\t\t},\n\t\t\t};\n\n\t\t\tif (baseCountFilter.flow_runs) {\n\t\t\t\t// Merge with existing flow_runs filter\n\t\t\t\tbaseCountFilter.flow_runs = {\n\t\t\t\t\t...baseCountFilter.flow_runs,\n\t\t\t\t\t...stateFilter,\n\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tbaseCountFilter.flow_runs = {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t...stateFilter,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\treturn baseCountFilter;\n\t}, [workPoolName, debouncedSearchTerm, selectedStates]);\n\n\t// Fetch paginated flow runs data\n\tconst { data: paginatedData } = useQuery(buildPaginateFlowRunsQuery(filter));\n\n\t// Fetch total count for pagination\n\tconst { data: totalCount } = useQuery(buildCountFlowRunsQuery(countFilter));\n\n\t// Get unique flow IDs for fetching flow details\n\tconst flowIds = useMemo(\n\t\t() => [\n\t\t\t...new Set(\n\t\t\t\t(paginatedData?.results ?? []).map((flowRun) => flowRun.flow_id),\n\t\t\t),\n\t\t],\n\t\t[paginatedData?.results],\n\t);\n\n\t// Fetch flow details\n\tconst { data: flows } = useQuery(\n\t\tbuildListFlowsQuery(\n\t\t\t{\n\t\t\t\tflows: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tid: { any_: flowIds },\n\t\t\t\t},\n\t\t\t\toffset: 0,\n\t\t\t\tsort: \"NAME_ASC\",\n\t\t\t},\n\t\t\t{ enabled: flowIds.length > 0 },\n\t\t),\n\t);\n\n\t// Combine flow runs with their corresponding flows\n\tconst flowRunsWithFlows = useMemo(() => {\n\t\tif (!paginatedData?.results) return [];\n\t\tconst flowMap = new Map(flows?.map((flow: Flow) => [flow.id, flow]) ?? []);\n\t\treturn paginatedData.results\n\t\t\t.map((flowRun) => {\n\t\t\t\tconst flow = flowMap.get(flowRun.flow_id);\n\t\t\t\tif (!flow) return null;\n\t\t\t\treturn {\n\t\t\t\t\t...flowRun,\n\t\t\t\t\tflow,\n\t\t\t\t};\n\t\t\t})\n\t\t\t.filter((flowRun) => flowRun !== null) as FlowRunWithFlow[];\n\t}, [paginatedData?.results, flows]);\n\n\tconst handleSearchChange = useCallback(\n\t\t(event: React.ChangeEvent<HTMLInputElement>) => {\n\t\t\tsetSearchTerm(event.target.value);\n\t\t\t// Reset to first page when searching\n\t\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t\t},\n\t\t[],\n\t);\n\n\tconst handlePaginationChange = useCallback(\n\t\t(newPagination: PaginationState) => {\n\t\t\tsetPagination(newPagination);\n\t\t},\n\t\t[],\n\t);\n\n\tconst handleStateFilterChange = useCallback(\n\t\t(newSelectedStates: Set<FlowRunState>) => {\n\t\t\tsetSelectedStates(newSelectedStates);\n\t\t\t// Reset to first page when filtering\n\t\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t\t},\n\t\t[],\n\t);\n\n\tconst handleClearFilters = useCallback(() => {\n\t\tsetSearchTerm(\"\");\n\t\tsetSelectedStates(new Set());\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t}, []);\n\n\t// Show loading only on initial load, not on pagination/filtering changes\n\tif (!paginatedData || totalCount === undefined) {\n\t\treturn (\n\t\t\t<div className={className}>\n\t\t\t\t<div className=\"text-muted-foreground text-center py-8\">\n\t\t\t\t\tLoading flow runs...\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={className}>\n\t\t\t{/* Search and Filter Controls */}\n\t\t\t<div className=\"flex flex-col sm:flex-row gap-4 mb-6\">\n\t\t\t\t<div className=\"flex-1\">\n\t\t\t\t\t<SearchInput\n\t\t\t\t\t\tplaceholder=\"Search flow runs by name...\"\n\t\t\t\t\t\tvalue={searchTerm}\n\t\t\t\t\t\tonChange={handleSearchChange}\n\t\t\t\t\t\tdebounceMs={500}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"w-full sm:w-64\">\n\t\t\t\t\t<StateFilter\n\t\t\t\t\t\tselectedFilters={selectedStates}\n\t\t\t\t\t\tonSelectFilter={handleStateFilterChange}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{/* Flow Runs List */}\n\t\t\t<FlowRunsList\n\t\t\t\tflowRuns={flowRunsWithFlows}\n\t\t\t\tonClearFilters={\n\t\t\t\t\tflowRunsWithFlows.length === 0 ? handleClearFilters : undefined\n\t\t\t\t}\n\t\t\t/>\n\n\t\t\t{/* Pagination Controls */}\n\t\t\t{paginatedData.pages > 1 && (\n\t\t\t\t<div className=\"mt-6\">\n\t\t\t\t\t<FlowRunsPagination\n\t\t\t\t\t\tcount={totalCount}\n\t\t\t\t\t\tpages={paginatedData.pages}\n\t\t\t\t\t\tpagination={pagination}\n\t\t\t\t\t\tonChangePagination={handlePaginationChange}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { useNavigate } from \"@tanstack/react-router\";\nimport { toast } from \"sonner\";\nimport type { WorkPool } from \"@/api/work-pools\";\nimport { useDeleteWorkPool } from \"@/api/work-pools\";\nimport { DeleteConfirmationDialog } from \"@/components/ui/delete-confirmation-dialog\";\n\ntype DeleteWorkPoolDialogProps = {\n\tworkPool: WorkPool;\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n\tonDeleted?: () => void;\n};\n\nexport const DeleteWorkPoolDialog = ({\n\tworkPool,\n\topen,\n\tonOpenChange,\n\tonDeleted,\n}: DeleteWorkPoolDialogProps) => {\n\tconst navigate = useNavigate();\n\tconst { deleteWorkPool, isPending } = useDeleteWorkPool();\n\n\tconst handleDelete = () => {\n\t\tdeleteWorkPool(workPool.name, {\n\t\t\tonSuccess: () => {\n\t\t\t\ttoast.success(\"Work pool deleted successfully\");\n\t\t\t\tonDeleted?.();\n\t\t\t\tvoid navigate({ to: \"/work-pools\" });\n\t\t\t},\n\t\t\tonError: () => {\n\t\t\t\ttoast.error(\"Failed to delete work pool\");\n\t\t\t},\n\t\t});\n\t};\n\n\treturn (\n\t\t<DeleteConfirmationDialog\n\t\t\tisOpen={open}\n\t\t\ttitle=\"Delete Work Pool\"\n\t\t\tdescription={`Are you sure you want to delete the work pool \"${workPool.name}\"? This action cannot be undone.`}\n\t\t\tconfirmText={workPool.name}\n\t\t\tisLoading={isPending}\n\t\t\tloadingText=\"Deleting...\"\n\t\t\tonConfirm={handleDelete}\n\t\t\tonClose={() => onOpenChange(false)}\n\t\t/>\n\t);\n};\n","import { useNavigate } from \"@tanstack/react-router\";\nimport { Copy, Edit, MoreVertical, Trash2, Zap } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport type { WorkPool } from \"@/api/work-pools\";\n\nexport const useWorkPoolMenu = (workPool: WorkPool) => {\n\tconst navigate = useNavigate();\n\tconst [showDeleteDialog, setShowDeleteDialog] = useState(false);\n\n\tconst handleCopyId = () => {\n\t\tvoid navigator.clipboard.writeText(workPool.id);\n\t\ttoast.success(\"ID copied to clipboard\");\n\t};\n\n\tconst handleEdit = () => {\n\t\tvoid navigate({\n\t\t\tto: \"/work-pools/work-pool/$workPoolName/edit\",\n\t\t\tparams: { workPoolName: workPool.name },\n\t\t});\n\t};\n\n\tconst handleAutomate = () => {\n\t\t// TODO: Add search params when route supports it\n\t\tvoid navigate({\n\t\t\tto: \"/automations/create\",\n\t\t});\n\t};\n\n\tconst menuItems = [\n\t\t{\n\t\t\tlabel: \"Copy ID\",\n\t\t\ticon: Copy,\n\t\t\taction: handleCopyId,\n\t\t\tshow: true,\n\t\t},\n\t\t{\n\t\t\tlabel: \"Edit\",\n\t\t\ticon: Edit,\n\t\t\taction: handleEdit,\n\t\t\tshow: true, // TODO: Check workPool.can?.update when permissions are available\n\t\t},\n\t\t{\n\t\t\tlabel: \"Delete\",\n\t\t\ticon: Trash2,\n\t\t\taction: () => setShowDeleteDialog(true),\n\t\t\tshow: true, // TODO: Check workPool.can?.delete when permissions are available\n\t\t\tvariant: \"destructive\" as const,\n\t\t},\n\t\t{\n\t\t\tlabel: \"Automate\",\n\t\t\ticon: Zap,\n\t\t\taction: handleAutomate,\n\t\t\tshow: true,\n\t\t},\n\t].filter((item) => item.show);\n\n\treturn {\n\t\tmenuItems,\n\t\tshowDeleteDialog,\n\t\tsetShowDeleteDialog,\n\t\ttriggerIcon: MoreVertical,\n\t};\n};\n","import type { WorkPool } from \"@/api/work-pools\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { cn } from \"@/utils\";\nimport { DeleteWorkPoolDialog } from \"./components/delete-work-pool-dialog\";\nimport { useWorkPoolMenu } from \"./hooks/use-work-pool-menu\";\n\ntype WorkPoolMenuProps = {\n\tworkPool: WorkPool;\n\tonUpdate?: () => void;\n\tclassName?: string;\n};\n\nexport const WorkPoolMenu = ({\n\tworkPool,\n\tonUpdate,\n\tclassName,\n}: WorkPoolMenuProps) => {\n\tconst {\n\t\tmenuItems,\n\t\tshowDeleteDialog,\n\t\tsetShowDeleteDialog,\n\t\ttriggerIcon: TriggerIcon,\n\t} = useWorkPoolMenu(workPool);\n\n\treturn (\n\t\t<>\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tclassName={cn(\"size-8\", className)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className=\"sr-only\">Open menu</span>\n\t\t\t\t\t\t<TriggerIcon className=\"size-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t\t{menuItems.map((item) => {\n\t\t\t\t\t\tconst Icon = item.icon;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\t\t\tkey={item.label}\n\t\t\t\t\t\t\t\tonClick={item.action}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\titem.variant === \"destructive\" && \"text-destructive\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon className=\"mr-2 h-4 w-4\" />\n\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t\t<DeleteWorkPoolDialog\n\t\t\t\tworkPool={workPool}\n\t\t\t\topen={showDeleteDialog}\n\t\t\t\tonOpenChange={setShowDeleteDialog}\n\t\t\t\tonDeleted={onUpdate}\n\t\t\t/>\n\t\t</>\n\t);\n};\n","import { useCallback } from \"react\";\nimport { toast } from \"sonner\";\nimport type { WorkPool } from \"@/api/work-pools\";\nimport { usePauseWorkPool, useResumeWorkPool } from \"@/api/work-pools\";\n\nexport const useWorkPoolToggle = (\n\tworkPool: WorkPool,\n\tonUpdate?: () => void,\n) => {\n\tconst { pauseWorkPool, isPending: pausePending } = usePauseWorkPool();\n\tconst { resumeWorkPool, isPending: resumePending } = useResumeWorkPool();\n\n\tconst handleToggle = useCallback(\n\t\t(checked: boolean) => {\n\t\t\tif (checked) {\n\t\t\t\t// Switch is checked = work pool should be active (resume)\n\t\t\t\tresumeWorkPool(workPool.name, {\n\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\ttoast.success(\"Work pool resumed\");\n\t\t\t\t\t\tonUpdate?.();\n\t\t\t\t\t},\n\t\t\t\t\tonError: () => {\n\t\t\t\t\t\ttoast.error(\"Failed to resume work pool\");\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\t// Switch is unchecked = work pool should be paused\n\t\t\t\tpauseWorkPool(workPool.name, {\n\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\ttoast.success(\"Work pool paused\");\n\t\t\t\t\t\tonUpdate?.();\n\t\t\t\t\t},\n\t\t\t\t\tonError: () => {\n\t\t\t\t\t\ttoast.error(\"Failed to pause work pool\");\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\t[workPool.name, pauseWorkPool, resumeWorkPool, onUpdate],\n\t);\n\n\treturn {\n\t\thandleToggle,\n\t\tisLoading: pausePending || resumePending,\n\t};\n};\n","import type { WorkPool } from \"@/api/work-pools\";\nimport { Switch } from \"@/components/ui/switch\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { cn } from \"@/utils\";\nimport { useWorkPoolToggle } from \"./hooks/use-work-pool-toggle\";\n\ntype WorkPoolToggleProps = {\n\tworkPool: WorkPool;\n\tonUpdate?: () => void;\n\tclassName?: string;\n};\n\nexport const WorkPoolToggle = ({\n\tworkPool,\n\tonUpdate,\n\tclassName,\n}: WorkPoolToggleProps) => {\n\tconst { handleToggle, isLoading } = useWorkPoolToggle(workPool, onUpdate);\n\tconst isPaused = workPool.status === \"PAUSED\";\n\n\treturn (\n\t\t<Tooltip>\n\t\t\t<TooltipTrigger asChild>\n\t\t\t\t<div>\n\t\t\t\t\t<Switch\n\t\t\t\t\t\tchecked={!isPaused}\n\t\t\t\t\t\tonCheckedChange={handleToggle}\n\t\t\t\t\t\tdisabled={isLoading}\n\t\t\t\t\t\taria-label={isPaused ? \"Resume work pool\" : \"Pause work pool\"}\n\t\t\t\t\t\tclassName={cn(className)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</TooltipTrigger>\n\t\t\t<TooltipContent>\n\t\t\t\t<p>Pause or resume this work pool</p>\n\t\t\t</TooltipContent>\n\t\t</Tooltip>\n\t);\n};\n","import type { WorkPool } from \"@/api/work-pools\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n\tBreadcrumbPage,\n\tBreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { cn } from \"@/utils\";\nimport { WorkPoolMenu } from \"../work-pool-menu\";\nimport { WorkPoolToggle } from \"../work-pool-toggle\";\n\ntype WorkPoolPageHeaderProps = {\n\tworkPool: WorkPool;\n\tonUpdate?: () => void;\n\tclassName?: string;\n};\n\nexport const WorkPoolPageHeader = ({\n\tworkPool,\n\tonUpdate,\n\tclassName,\n}: WorkPoolPageHeaderProps) => {\n\treturn (\n\t\t<header\n\t\t\tclassName={cn(\n\t\t\t\t\"flex mb-4 flex-row items-center justify-between\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t>\n\t\t\t<Breadcrumb className={className}>\n\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t\t<BreadcrumbLink to=\"/work-pools\" className=\"text-xl font-semibold\">\n\t\t\t\t\t\t\tWork pools\n\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\t<BreadcrumbPage>{workPool.name}</BreadcrumbPage>\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t\t<div className=\"flex items-center space-x-2\">\n\t\t\t\t<WorkPoolToggle workPool={workPool} onUpdate={onUpdate} />\n\t\t\t\t<WorkPoolMenu workPool={workPool} onUpdate={onUpdate} />\n\t\t\t</div>\n\t\t</header>\n\t);\n};\n","import { Clock } from \"lucide-react\";\nimport type { ReactElement } from \"react\";\n\nimport { Badge } from \"@/components/ui/badge\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipProvider,\n\tTooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { cn } from \"@/utils\";\n\ntype LateFlowRunsIndicatorProps = {\n\tlateRunsCount: number;\n\tclassName?: string;\n};\n\nexport const LateFlowRunsIndicator = ({\n\tlateRunsCount,\n\tclassName,\n}: LateFlowRunsIndicatorProps): ReactElement | null => {\n\tif (lateRunsCount === 0) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<TooltipProvider>\n\t\t\t<Tooltip>\n\t\t\t\t<TooltipTrigger>\n\t\t\t\t\t<Badge\n\t\t\t\t\t\tvariant=\"warning\"\n\t\t\t\t\t\tclassName={cn(\"flex items-center space-x-1\", className)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Clock className=\"h-3 w-3\" />\n\t\t\t\t\t\t<span>{lateRunsCount}</span>\n\t\t\t\t\t</Badge>\n\t\t\t\t</TooltipTrigger>\n\t\t\t\t<TooltipContent>\n\t\t\t\t\t<div className=\"space-y-1\">\n\t\t\t\t\t\t<p className=\"font-semibold\">Late Flow Runs</p>\n\t\t\t\t\t\t<p className=\"text-sm\">\n\t\t\t\t\t\t\t{lateRunsCount} flow run{lateRunsCount === 1 ? \"\" : \"s\"} running\n\t\t\t\t\t\t\tlate\n\t\t\t\t\t\t</p>\n\t\t\t\t\t</div>\n\t\t\t\t</TooltipContent>\n\t\t\t</Tooltip>\n\t\t</TooltipProvider>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { Link } from \"@tanstack/react-router\";\nimport { buildCountFlowRunsQuery } from \"@/api/flow-runs\";\nimport type { WorkPoolQueue } from \"@/api/work-pool-queues\";\nimport { LateFlowRunsIndicator } from \"@/components/flow-runs/late-flow-runs-indicator\";\n\ntype QueueNameWithLateIndicatorProps = {\n\tqueue: WorkPoolQueue;\n};\n\nexport const QueueNameWithLateIndicator = ({\n\tqueue,\n}: QueueNameWithLateIndicatorProps) => {\n\tconst { data: lateRunsCount = 0 } = useQuery(\n\t\tbuildCountFlowRunsQuery(\n\t\t\t{\n\t\t\t\twork_pools: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tname: { any_: [queue.work_pool_name || \"\"] },\n\t\t\t\t},\n\t\t\t\twork_pool_queues: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tname: { any_: [queue.name] },\n\t\t\t\t},\n\t\t\t\tflow_runs: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tstate: {\n\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\tname: { any_: [\"Late\"] },\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\t30000,\n\t\t),\n\t);\n\n\treturn (\n\t\t<div className=\"flex items-center space-x-2\">\n\t\t\t<Link\n\t\t\t\tto=\"/work-pools/work-pool/$workPoolName/queue/$workQueueName\"\n\t\t\t\tparams={{\n\t\t\t\t\tworkPoolName: queue.work_pool_name || \"\",\n\t\t\t\t\tworkQueueName: queue.name,\n\t\t\t\t}}\n\t\t\t\tclassName=\"font-medium text-blue-600 hover:text-blue-800\"\n\t\t\t>\n\t\t\t\t{queue.name}\n\t\t\t</Link>\n\t\t\t<LateFlowRunsIndicator lateRunsCount={lateRunsCount} />\n\t\t</div>\n\t);\n};\n","import { Link } from \"@tanstack/react-router\";\nimport type { ColumnDef } from \"@tanstack/react-table\";\nimport { HelpCircle } from \"lucide-react\";\nimport type { WorkPoolQueue } from \"@/api/work-pool-queues\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipProvider,\n\tTooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { WorkPoolQueueStatusBadge } from \"@/components/work-pools/work-pool-queue-status-badge\";\nimport { WorkPoolQueueMenu } from \"../../work-pool-queue-menu\";\nimport { WorkPoolQueueToggle } from \"../../work-pool-queue-toggle\";\nimport { QueueNameWithLateIndicator } from \"./queue-name-with-late-indicator\";\n\ntype WorkPoolQueuesTableColumnsOptions = {\n\tenableSelection?: boolean;\n\tenableLateIndicator?: boolean;\n};\n\nexport const createWorkPoolQueuesTableColumns = ({\n\tenableLateIndicator = false,\n}: WorkPoolQueuesTableColumnsOptions = {}): ColumnDef<WorkPoolQueue>[] => {\n\tconst columns: ColumnDef<WorkPoolQueue>[] = [];\n\t// Name column with conditional late indicator\n\tcolumns.push({\n\t\taccessorKey: \"name\",\n\t\theader: ({ column }) => (\n\t\t\t<Button\n\t\t\t\tvariant=\"ghost\"\n\t\t\t\tonClick={() => column.toggleSorting(column.getIsSorted() === \"asc\")}\n\t\t\t\tclassName=\"h-auto p-0 font-semibold\"\n\t\t\t>\n\t\t\t\tName\n\t\t\t</Button>\n\t\t),\n\t\tcell: ({ row }) => {\n\t\t\tconst queue = row.original;\n\n\t\t\tif (enableLateIndicator) {\n\t\t\t\treturn <QueueNameWithLateIndicator queue={queue} />;\n\t\t\t}\n\n\t\t\t// Basic name cell with link\n\t\t\treturn (\n\t\t\t\t<div className=\"flex items-center space-x-2\">\n\t\t\t\t\t<Link\n\t\t\t\t\t\tto=\"/work-pools/work-pool/$workPoolName/queue/$workQueueName\"\n\t\t\t\t\t\tparams={{\n\t\t\t\t\t\t\tworkPoolName: queue.work_pool_name || \"\",\n\t\t\t\t\t\t\tworkQueueName: queue.name,\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName=\"font-medium text-blue-600 hover:text-blue-800\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{queue.name}\n\t\t\t\t\t</Link>\n\t\t\t\t</div>\n\t\t\t);\n\t\t},\n\t});\n\n\t// Concurrency limit column\n\tcolumns.push({\n\t\taccessorKey: \"concurrency_limit\",\n\t\theader: ({ column }) => (\n\t\t\t<Button\n\t\t\t\tvariant=\"ghost\"\n\t\t\t\tonClick={() => column.toggleSorting(column.getIsSorted() === \"asc\")}\n\t\t\t\tclassName=\"h-auto p-0 font-semibold\"\n\t\t\t>\n\t\t\t\tConcurrency Limit\n\t\t\t</Button>\n\t\t),\n\t\tcell: ({ row }) => {\n\t\t\tconst limit = row.original.concurrency_limit;\n\t\t\treturn limit !== null && limit !== undefined ? limit.toString() : \"∞\";\n\t\t},\n\t});\n\n\t// Priority column\n\tcolumns.push({\n\t\taccessorKey: \"priority\",\n\t\theader: ({ column }) => (\n\t\t\t<div className=\"flex items-center space-x-1\">\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tonClick={() => column.toggleSorting(column.getIsSorted() === \"asc\")}\n\t\t\t\t\tclassName=\"h-auto p-0 font-semibold\"\n\t\t\t\t>\n\t\t\t\t\tPriority\n\t\t\t\t</Button>\n\t\t\t\t<TooltipProvider>\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger>\n\t\t\t\t\t\t\t<HelpCircle className=\"h-4 w-4 text-muted-foreground\" />\n\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\t<p>Lower numbers have higher priority</p>\n\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t</TooltipProvider>\n\t\t\t</div>\n\t\t),\n\t\tcell: ({ row }) => row.original.priority,\n\t});\n\n\t// Status column\n\tcolumns.push({\n\t\taccessorKey: \"status\",\n\t\theader: \"Status\",\n\t\tcell: ({ row }) => (\n\t\t\t<WorkPoolQueueStatusBadge status={row.original.status || \"READY\"} />\n\t\t),\n\t});\n\n\t// Actions column\n\tcolumns.push({\n\t\tid: \"actions\",\n\t\theader: \"\",\n\t\tcell: ({ row }) => (\n\t\t\t<div className=\"flex items-center justify-end gap-2\">\n\t\t\t\t<WorkPoolQueueToggle queue={row.original} />\n\t\t\t\t<WorkPoolQueueMenu queue={row.original} />\n\t\t\t</div>\n\t\t),\n\t\tenableSorting: false,\n\t});\n\n\treturn columns;\n};\n\n// Basic version for backward compatibility\nexport const workPoolQueuesTableColumns: ColumnDef<WorkPoolQueue>[] =\n\tcreateWorkPoolQueuesTableColumns();\n","import { Plus, Search } from \"lucide-react\";\nimport { Button } from \"@/components/ui/button\";\n\ntype WorkPoolQueuesTableEmptyStateProps = {\n\thasSearchQuery: boolean;\n\tworkPoolName: string;\n};\n\nexport const WorkPoolQueuesTableEmptyState = ({\n\thasSearchQuery,\n\tworkPoolName,\n}: WorkPoolQueuesTableEmptyStateProps) => {\n\tif (hasSearchQuery) {\n\t\treturn (\n\t\t\t<div className=\"flex flex-col items-center justify-center py-12 text-center\">\n\t\t\t\t<Search className=\"h-12 w-12 text-muted-foreground mb-4\" />\n\t\t\t\t<h3 className=\"text-lg font-medium text-foreground mb-2\">\n\t\t\t\t\tNo queues found\n\t\t\t\t</h3>\n\t\t\t\t<p className=\"text-muted-foreground mb-4\">\n\t\t\t\t\tNo queues match your search criteria. Try adjusting your search.\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col items-center justify-center py-12 text-center\">\n\t\t\t<div className=\"h-12 w-12 rounded-full bg-muted flex items-center justify-center mb-4\">\n\t\t\t\t<Plus className=\"h-6 w-6 text-muted-foreground\" />\n\t\t\t</div>\n\t\t\t<h3 className=\"text-lg font-medium text-foreground mb-2\">\n\t\t\t\tNo queues yet\n\t\t\t</h3>\n\t\t\t<p className=\"text-muted-foreground mb-4 max-w-md\">\n\t\t\t\tThis work pool doesn&apos;t have any queues yet. Create your first queue\n\t\t\t\tto start organizing work.\n\t\t\t</p>\n\t\t\t<Button\n\t\t\t\tonClick={() => {\n\t\t\t\t\t// TODO: Navigate to create queue page when route exists\n\t\t\t\t\tconsole.log(\"Create queue for pool:\", workPoolName);\n\t\t\t\t}}\n\t\t\t>\n\t\t\t\t<Plus className=\"h-4 w-4 mr-2\" />\n\t\t\t\tCreate Queue\n\t\t\t</Button>\n\t\t</div>\n\t);\n};\n","import { Plus, Search } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { cn } from \"@/utils\";\nimport { WorkPoolQueueCreateOrEditDialog } from \"../../work-pool-queue-create-dialog\";\n\ntype WorkPoolQueuesTableToolbarProps = {\n\tsearchQuery: string;\n\tonSearchChange: (query: string) => void;\n\tresultsCount: number;\n\ttotalCount: number;\n\tworkPoolName: string;\n\tclassName?: string;\n};\n\nexport const WorkPoolQueuesTableToolbar = ({\n\tsearchQuery,\n\tonSearchChange,\n\tresultsCount,\n\ttotalCount,\n\tworkPoolName,\n\tclassName,\n}: WorkPoolQueuesTableToolbarProps) => {\n\tconst [showCreateDialog, setShowCreateDialog] = useState(false);\n\tconst showClearFilters = searchQuery.length > 0;\n\n\treturn (\n\t\t<div className={cn(\"space-y-4\", className)}>\n\t\t\t{/* Main toolbar */}\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<div className=\"flex items-center space-x-2\">\n\t\t\t\t\t<div className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t{searchQuery\n\t\t\t\t\t\t\t? `${resultsCount} of ${totalCount} Work Queue${totalCount !== 1 ? \"s\" : \"\"}`\n\t\t\t\t\t\t\t: `${totalCount} Work Queue${totalCount !== 1 ? \"s\" : \"\"}`}\n\t\t\t\t\t</div>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\tonClick={() => setShowCreateDialog(true)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Plus className=\"h-4 w-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"flex items-center space-x-2\">\n\t\t\t\t\t{showClearFilters && (\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\tonClick={() => onSearchChange(\"\")}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tClear filters\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t)}\n\t\t\t\t\t<div className=\"relative\">\n\t\t\t\t\t\t<Search className=\"absolute left-2 top-2.5 h-4 w-4 text-muted-foreground\" />\n\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\tplaceholder=\"Search\"\n\t\t\t\t\t\t\tvalue={searchQuery}\n\t\t\t\t\t\t\tonChange={(e) => onSearchChange(e.target.value)}\n\t\t\t\t\t\t\tclassName=\"pl-8 w-64\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<WorkPoolQueueCreateOrEditDialog\n\t\t\t\tworkPoolName={workPoolName}\n\t\t\t\topen={showCreateDialog}\n\t\t\t\tonOpenChange={setShowCreateDialog}\n\t\t\t\tonSubmit={() => setShowCreateDialog(false)}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","import type { OnChangeFn, SortingState } from \"@tanstack/react-table\";\nimport {\n\tgetCoreRowModel,\n\tgetSortedRowModel,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport { useCallback } from \"react\";\nimport type { WorkPoolQueue } from \"@/api/work-pool-queues\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { cn } from \"@/utils\";\nimport { createWorkPoolQueuesTableColumns } from \"./components/work-pool-queues-table-columns\";\nimport { WorkPoolQueuesTableEmptyState } from \"./components/work-pool-queues-table-empty-state\";\nimport { WorkPoolQueuesTableToolbar } from \"./components/work-pool-queues-table-toolbar\";\n\ntype WorkPoolQueuesTableProps = {\n\tqueues: WorkPoolQueue[];\n\tsearchQuery: string;\n\tsortState: SortingState;\n\ttotalCount: number;\n\tworkPoolName: string;\n\tclassName?: string;\n\tonSearchChange: (query: string) => void;\n\tonSortingChange: OnChangeFn<SortingState>;\n};\n\nexport const WorkPoolQueuesTable = ({\n\tqueues,\n\tsearchQuery,\n\tsortState,\n\ttotalCount,\n\tworkPoolName,\n\tclassName,\n\tonSearchChange,\n\tonSortingChange,\n}: WorkPoolQueuesTableProps) => {\n\tconst handleSortingChange: OnChangeFn<SortingState> = useCallback(\n\t\t(updater) => {\n\t\t\tlet newSorting = sortState;\n\t\t\tif (typeof updater === \"function\") {\n\t\t\t\tnewSorting = updater(sortState);\n\t\t\t} else {\n\t\t\t\tnewSorting = updater;\n\t\t\t}\n\t\t\tonSortingChange(newSorting);\n\t\t},\n\t\t[sortState, onSortingChange],\n\t);\n\n\t// Create columns with late indicator enabled\n\tconst columns = createWorkPoolQueuesTableColumns({\n\t\tenableLateIndicator: true,\n\t});\n\n\t// Enhanced table configuration\n\tconst table = useReactTable({\n\t\tdata: queues,\n\t\tcolumns,\n\t\t// Core features\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tgetSortedRowModel: getSortedRowModel(),\n\t\tstate: {\n\t\t\tsorting: sortState,\n\t\t},\n\t\tonSortingChange: handleSortingChange,\n\t\tinitialState: {\n\t\t\tsorting: [{ id: \"name\", desc: false }],\n\t\t},\n\t});\n\n\tconst resultsCount = queues.length;\n\n\treturn (\n\t\t<div className={cn(\"space-y-4\", className)}>\n\t\t\t<WorkPoolQueuesTableToolbar\n\t\t\t\tsearchQuery={searchQuery}\n\t\t\t\tonSearchChange={onSearchChange}\n\t\t\t\tresultsCount={resultsCount}\n\t\t\t\ttotalCount={totalCount}\n\t\t\t\tworkPoolName={workPoolName}\n\t\t\t/>\n\t\t\t{resultsCount === 0 ? (\n\t\t\t\t<WorkPoolQueuesTableEmptyState\n\t\t\t\t\thasSearchQuery={!!searchQuery}\n\t\t\t\t\tworkPoolName={workPoolName}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<DataTable table={table} />\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import type { components } from \"@/api/prefect\";\nimport { Badge } from \"@/components/ui/badge\";\nimport { cn } from \"@/utils\";\n\ntype WorkerStatus = components[\"schemas\"][\"WorkerStatus\"];\n\ntype WorkerStatusBadgeProps = {\n\tstatus: WorkerStatus;\n\tclassName?: string;\n};\n\nconst statusConfig = {\n\tONLINE: {\n\t\tlabel: \"Online\",\n\t\tcolor: \"bg-green-500\",\n\t},\n\tOFFLINE: {\n\t\tlabel: \"Offline\",\n\t\tcolor: \"bg-red-500\",\n\t},\n} as const satisfies Record<WorkerStatus, { label: string; color: string }>;\n\nexport const WorkerStatusBadge = ({\n\tstatus,\n\tclassName,\n}: WorkerStatusBadgeProps) => {\n\tconst config = statusConfig[status];\n\n\treturn (\n\t\t<Badge\n\t\t\tvariant=\"secondary\"\n\t\t\tclassName={cn(\"flex items-center space-x-1\", className)}\n\t\t>\n\t\t\t<div className={cn(\"h-2 w-2 rounded-full\", config.color)} />\n\t\t\t<span>{config.label}</span>\n\t\t</Badge>\n\t);\n};\n","import type { ColumnDef } from \"@tanstack/react-table\";\nimport type { WorkPoolWorker } from \"@/api/work-pools\";\nimport { FormattedDate } from \"@/components/ui/formatted-date\";\nimport { WorkerStatusBadge } from \"@/components/workers/worker-status-badge\";\n\nexport const createWorkersTableColumns = (): ColumnDef<WorkPoolWorker>[] => [\n\t{\n\t\taccessorKey: \"name\",\n\t\theader: \"Name\",\n\t\tcell: ({ row }) => {\n\t\t\tconst worker = row.original;\n\t\t\t// TODO: Add worker detail route when available\n\t\t\treturn <span className=\"font-medium\">{worker.name}</span>;\n\t\t},\n\t},\n\t{\n\t\taccessorKey: \"last_heartbeat_time\",\n\t\theader: \"Last Seen\",\n\t\tcell: ({ row }) => {\n\t\t\tconst lastSeen = row.original.last_heartbeat_time;\n\t\t\treturn <FormattedDate date={lastSeen} format=\"relative\" showTooltip />;\n\t\t},\n\t},\n\t{\n\t\taccessorKey: \"status\",\n\t\theader: \"Status\",\n\t\tcell: ({ row }) => <WorkerStatusBadge status={row.original.status} />,\n\t},\n];\n\ntype WorkersTableColumnsWithActionsProps = {\n\tworkPoolName: string;\n\tActionsComponent: React.ComponentType<{\n\t\tworker: WorkPoolWorker;\n\t\tworkPoolName: string;\n\t}>;\n};\n\nexport const createWorkersTableColumnsWithActions = ({\n\tworkPoolName,\n\tActionsComponent,\n}: WorkersTableColumnsWithActionsProps): ColumnDef<WorkPoolWorker>[] => [\n\t...createWorkersTableColumns(),\n\t{\n\t\tid: \"actions\",\n\t\theader: \"\",\n\t\tcell: ({ row }) => (\n\t\t\t<ActionsComponent worker={row.original} workPoolName={workPoolName} />\n\t\t),\n\t\tenableSorting: false,\n\t\tsize: 50,\n\t\tmaxSize: 50,\n\t},\n];\n","import { CodeBanner } from \"@/components/code-banner\";\nimport {\n\tEmptyState,\n\tEmptyStateActions,\n\tEmptyStateDescription,\n\tEmptyStateIcon,\n\tEmptyStateTitle,\n} from \"@/components/ui/empty-state\";\nimport { cn } from \"@/utils\";\n\nexport type WorkersTableEmptyStateProps = {\n\thasSearchQuery: boolean;\n\tworkPoolName: string;\n\tclassName?: string;\n};\n\nexport const WorkersTableEmptyState = ({\n\thasSearchQuery,\n\tworkPoolName,\n\tclassName,\n}: WorkersTableEmptyStateProps) => {\n\tif (hasSearchQuery) {\n\t\treturn (\n\t\t\t<EmptyState>\n\t\t\t\t<EmptyStateIcon id=\"Search\" />\n\t\t\t\t<EmptyStateTitle>No workers found</EmptyStateTitle>\n\t\t\t\t<EmptyStateDescription>\n\t\t\t\t\tNo workers match your search criteria.\n\t\t\t\t</EmptyStateDescription>\n\t\t\t</EmptyState>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={cn(\"space-y-4\", className)}>\n\t\t\t<EmptyState>\n\t\t\t\t<EmptyStateIcon id=\"Bot\" />\n\t\t\t\t<EmptyStateTitle>No workers running</EmptyStateTitle>\n\t\t\t\t<EmptyStateDescription>\n\t\t\t\t\tNo workers are currently running for the &ldquo;{workPoolName}&rdquo;\n\t\t\t\t\twork pool.\n\t\t\t\t</EmptyStateDescription>\n\t\t\t\t<EmptyStateActions>\n\t\t\t\t\t<CodeBanner\n\t\t\t\t\t\tcommand={`prefect worker start --pool \"${workPoolName}\"`}\n\t\t\t\t\t\ttitle=\"Start a worker\"\n\t\t\t\t\t\tsubtitle=\"Run this command to start a worker for this pool\"\n\t\t\t\t\t/>\n\t\t\t\t</EmptyStateActions>\n\t\t\t</EmptyState>\n\t\t</div>\n\t);\n};\n","import { toast } from \"sonner\";\nimport type { WorkPoolWorker } from \"@/api/work-pools\";\nimport { useDeleteWorker } from \"@/api/work-pools\";\nimport { DeleteConfirmationDialog } from \"@/components/ui/delete-confirmation-dialog\";\n\ntype DeleteWorkerDialogProps = {\n\tworker: WorkPoolWorker;\n\tworkPoolName: string;\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n\tonDeleted?: () => void;\n};\n\nexport const DeleteWorkerDialog = ({\n\tworker,\n\tworkPoolName,\n\topen,\n\tonOpenChange,\n\tonDeleted,\n}: DeleteWorkerDialogProps) => {\n\tconst { deleteWorker, isPending } = useDeleteWorker();\n\n\tconst handleDelete = () => {\n\t\tdeleteWorker(\n\t\t\t{\n\t\t\t\tworkPoolName,\n\t\t\t\tworkerName: worker.name,\n\t\t\t},\n\t\t\t{\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\ttoast.success(\"Worker deleted successfully\");\n\t\t\t\t\tonDeleted?.();\n\t\t\t\t\tonOpenChange(false);\n\t\t\t\t},\n\t\t\t\tonError: () => {\n\t\t\t\t\ttoast.error(\"Failed to delete worker\");\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\treturn (\n\t\t<DeleteConfirmationDialog\n\t\t\tisOpen={open}\n\t\t\ttitle=\"Delete Worker\"\n\t\t\tdescription={`Are you sure you want to delete the worker \"${worker.name}\"? This action cannot be undone.`}\n\t\t\tconfirmText={worker.name}\n\t\t\tisLoading={isPending}\n\t\t\tloadingText=\"Deleting...\"\n\t\t\tonConfirm={handleDelete}\n\t\t\tonClose={() => onOpenChange(false)}\n\t\t/>\n\t);\n};\n","import { Copy, MoreHorizontal, Trash2 } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport type { WorkPoolWorker } from \"@/api/work-pools\";\n\nexport const useWorkerMenu = (worker: WorkPoolWorker) => {\n\tconst [showDeleteDialog, setShowDeleteDialog] = useState(false);\n\n\tconst handleCopyId = () => {\n\t\tvoid navigator.clipboard.writeText(worker.id);\n\t\ttoast.success(\"ID copied to clipboard\");\n\t};\n\n\tconst menuItems = [\n\t\t{\n\t\t\tlabel: \"Copy ID\",\n\t\t\ticon: Copy,\n\t\t\taction: handleCopyId,\n\t\t\tshow: true,\n\t\t},\n\t\t{\n\t\t\tlabel: \"Delete\",\n\t\t\ticon: Trash2,\n\t\t\taction: () => setShowDeleteDialog(true),\n\t\t\tshow: true, // Workers can typically be deleted by work pool managers\n\t\t\tvariant: \"destructive\" as const,\n\t\t},\n\t].filter((item) => item.show);\n\n\treturn {\n\t\tmenuItems,\n\t\tshowDeleteDialog,\n\t\tsetShowDeleteDialog,\n\t\ttriggerIcon: MoreHorizontal,\n\t};\n};\n","import type { WorkPoolWorker } from \"@/api/work-pools\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { cn } from \"@/utils\";\nimport { DeleteWorkerDialog } from \"./components/delete-worker-dialog\";\nimport { useWorkerMenu } from \"./hooks/use-worker-menu\";\n\ntype WorkerMenuProps = {\n\tworker: WorkPoolWorker;\n\tworkPoolName: string;\n\tonWorkerDeleted?: () => void;\n\tclassName?: string;\n};\n\nexport const WorkerMenu = ({\n\tworker,\n\tworkPoolName,\n\tonWorkerDeleted,\n\tclassName,\n}: WorkerMenuProps) => {\n\tconst {\n\t\tmenuItems,\n\t\tshowDeleteDialog,\n\t\tsetShowDeleteDialog,\n\t\ttriggerIcon: TriggerIcon,\n\t} = useWorkerMenu(worker);\n\n\treturn (\n\t\t<>\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tclassName={cn(\"h-8 w-8\", className)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<span className=\"sr-only\">Open menu</span>\n\t\t\t\t\t\t<TriggerIcon className=\"h-4 w-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t\t{menuItems.map((item) => {\n\t\t\t\t\t\tconst Icon = item.icon;\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\t\t\tkey={item.label}\n\t\t\t\t\t\t\t\tonClick={item.action}\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\titem.variant === \"destructive\" && \"text-destructive\",\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Icon className=\"mr-2 h-4 w-4\" />\n\t\t\t\t\t\t\t\t{item.label}\n\t\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t\t<DeleteWorkerDialog\n\t\t\t\tworker={worker}\n\t\t\t\tworkPoolName={workPoolName}\n\t\t\t\topen={showDeleteDialog}\n\t\t\t\tonOpenChange={setShowDeleteDialog}\n\t\t\t\tonDeleted={onWorkerDeleted}\n\t\t\t/>\n\t\t</>\n\t);\n};\n","import type { WorkPoolWorker } from \"@/api/work-pools\";\nimport { WorkerMenu } from \"@/components/workers/worker-menu\";\n\nexport type WorkersTableRowActionsProps = {\n\tworker: WorkPoolWorker;\n\tworkPoolName: string;\n};\n\nexport const WorkersTableRowActions = ({\n\tworker,\n\tworkPoolName,\n}: WorkersTableRowActionsProps) => {\n\treturn <WorkerMenu worker={worker} workPoolName={workPoolName} />;\n};\n","import { Button } from \"@/components/ui/button\";\nimport { Input } from \"@/components/ui/input\";\nimport { cn } from \"@/utils\";\n\nexport type WorkersTableToolbarProps = {\n\tsearchQuery: string;\n\tonSearchChange: (query: string) => void;\n\tresultsCount: number;\n\ttotalCount: number;\n\tclassName?: string;\n};\n\nexport const WorkersTableToolbar = ({\n\tsearchQuery,\n\tonSearchChange,\n\tresultsCount,\n\ttotalCount,\n\tclassName,\n}: WorkersTableToolbarProps) => {\n\tconst showClearFilters = searchQuery.length > 0;\n\n\treturn (\n\t\t<div className={cn(\"flex items-center justify-between\", className)}>\n\t\t\t<div className=\"text-sm text-muted-foreground\">\n\t\t\t\t{searchQuery\n\t\t\t\t\t? `${resultsCount} of ${totalCount} workers`\n\t\t\t\t\t: `${totalCount} workers`}\n\t\t\t</div>\n\t\t\t<div className=\"flex items-center space-x-2\">\n\t\t\t\t{showClearFilters && (\n\t\t\t\t\t<Button variant=\"ghost\" size=\"sm\" onClick={() => onSearchChange(\"\")}>\n\t\t\t\t\t\tClear filters\n\t\t\t\t\t</Button>\n\t\t\t\t)}\n\t\t\t\t<Input\n\t\t\t\t\tplaceholder=\"Search workers...\"\n\t\t\t\t\tvalue={searchQuery}\n\t\t\t\t\tonChange={(e) => onSearchChange(e.target.value)}\n\t\t\t\t\tclassName=\"w-64\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import type {\n\tColumnFiltersState,\n\tOnChangeFn,\n\tPaginationState,\n} from \"@tanstack/react-table\";\nimport {\n\tgetCoreRowModel,\n\tgetPaginationRowModel,\n\tgetSortedRowModel,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport { useCallback, useMemo } from \"react\";\nimport type { WorkPoolWorker } from \"@/api/work-pools\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { cn } from \"@/utils\";\nimport { createWorkersTableColumnsWithActions } from \"./components/workers-table-columns\";\nimport { WorkersTableEmptyState } from \"./components/workers-table-empty-state\";\nimport { WorkersTableRowActions } from \"./components/workers-table-row-actions\";\nimport { WorkersTableToolbar } from \"./components/workers-table-toolbar\";\n\nexport type WorkersTableProps = {\n\tworkPoolName: string;\n\tworkers: WorkPoolWorker[];\n\tpagination: PaginationState;\n\tcolumnFilters: ColumnFiltersState;\n\tonPaginationChange: (pagination: PaginationState) => void;\n\tonColumnFiltersChange: (columnFilters: ColumnFiltersState) => void;\n\tclassName?: string;\n};\n\nexport const WorkersTable = ({\n\tworkPoolName,\n\tworkers,\n\tpagination,\n\tcolumnFilters,\n\tonPaginationChange,\n\tonColumnFiltersChange,\n\tclassName,\n}: WorkersTableProps) => {\n\tconst searchQuery = (columnFilters.find((filter) => filter.id === \"name\")\n\t\t?.value ?? \"\") as string;\n\n\tconst handleSearchChange = useCallback(\n\t\t(value: string) => {\n\t\t\tconst filters = columnFilters.filter((filter) => filter.id !== \"name\");\n\t\t\tonColumnFiltersChange(\n\t\t\t\tvalue ? [...filters, { id: \"name\", value }] : filters,\n\t\t\t);\n\t\t},\n\t\t[onColumnFiltersChange, columnFilters],\n\t);\n\n\tconst handlePaginationChange: OnChangeFn<PaginationState> = useCallback(\n\t\t(updater) => {\n\t\t\tlet newPagination = pagination;\n\t\t\tif (typeof updater === \"function\") {\n\t\t\t\tnewPagination = updater(pagination);\n\t\t\t} else {\n\t\t\t\tnewPagination = updater;\n\t\t\t}\n\t\t\tonPaginationChange(newPagination);\n\t\t},\n\t\t[pagination, onPaginationChange],\n\t);\n\n\tconst filteredWorkers = useMemo(() => {\n\t\tif (!searchQuery) return workers;\n\t\treturn workers.filter((worker) =>\n\t\t\tworker.name.toLowerCase().includes(searchQuery.toLowerCase()),\n\t\t);\n\t}, [workers, searchQuery]);\n\n\tconst columns = useMemo(\n\t\t() =>\n\t\t\tcreateWorkersTableColumnsWithActions({\n\t\t\t\tworkPoolName,\n\t\t\t\tActionsComponent: WorkersTableRowActions,\n\t\t\t}),\n\t\t[workPoolName],\n\t);\n\n\tconst table = useReactTable({\n\t\tdata: filteredWorkers,\n\t\tcolumns,\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tgetSortedRowModel: getSortedRowModel(),\n\t\tgetPaginationRowModel: getPaginationRowModel(),\n\t\tmanualPagination: false,\n\t\tstate: {\n\t\t\tpagination,\n\t\t},\n\t\tonPaginationChange: handlePaginationChange,\n\t\tinitialState: {\n\t\t\tsorting: [{ id: \"name\", desc: false }],\n\t\t},\n\t});\n\n\t// Show empty state when no workers at all or no search results\n\tconst showEmptyState =\n\t\tworkers.length === 0 || (searchQuery && filteredWorkers.length === 0);\n\n\tif (showEmptyState) {\n\t\treturn (\n\t\t\t<div className={cn(\"space-y-4\", className)}>\n\t\t\t\t<WorkersTableToolbar\n\t\t\t\t\tsearchQuery={searchQuery}\n\t\t\t\t\tonSearchChange={handleSearchChange}\n\t\t\t\t\tresultsCount={filteredWorkers.length}\n\t\t\t\t\ttotalCount={workers.length}\n\t\t\t\t/>\n\t\t\t\t<WorkersTableEmptyState\n\t\t\t\t\thasSearchQuery={searchQuery.length > 0}\n\t\t\t\t\tworkPoolName={workPoolName}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={cn(\"space-y-4\", className)}>\n\t\t\t<WorkersTableToolbar\n\t\t\t\tsearchQuery={searchQuery}\n\t\t\t\tonSearchChange={handleSearchChange}\n\t\t\t\tresultsCount={filteredWorkers.length}\n\t\t\t\ttotalCount={workers.length}\n\t\t\t/>\n\t\t\t<DataTable table={table} />\n\t\t</div>\n\t);\n};\n","import { useQueryClient, useSuspenseQuery } from \"@tanstack/react-query\";\nimport { createFileRoute, useNavigate } from \"@tanstack/react-router\";\nimport type {\n\tColumnFiltersState,\n\tPaginationState,\n\tSortingState,\n} from \"@tanstack/react-table\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { Suspense, useCallback, useMemo, useState } from \"react\";\nimport { z } from \"zod\";\nimport { buildPaginateDeploymentsQuery } from \"@/api/deployments\";\nimport {\n\tbuildCountFlowRunsQuery,\n\tbuildPaginateFlowRunsQuery,\n} from \"@/api/flow-runs\";\nimport { buildGetFlowRunsTaskRunsCountQuery } from \"@/api/task-runs\";\nimport { buildListWorkPoolQueuesQuery } from \"@/api/work-pool-queues\";\nimport { buildGetWorkPoolQuery } from \"@/api/work-pools\";\nimport {\n\tbuildListWorkPoolWorkersQuery,\n\tqueryKeyFactory as workPoolsQueryKeyFactory,\n} from \"@/api/work-pools/work-pools\";\nimport { CodeBanner } from \"@/components/code-banner\";\nimport {\n\tLayoutWell,\n\tLayoutWellContent,\n\tLayoutWellHeader,\n} from \"@/components/ui/layout-well\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport { WorkPoolDeploymentsTab } from \"@/components/work-pools/work-pool-deployments-tab\";\nimport { WorkPoolDetails } from \"@/components/work-pools/work-pool-details\";\nimport { WorkPoolFlowRunsTab } from \"@/components/work-pools/work-pool-flow-runs-tab\";\nimport { WorkPoolPageHeader } from \"@/components/work-pools/work-pool-page-header\";\nimport { WorkPoolQueuesTable } from \"@/components/work-pools/work-pool-queues-table\";\nimport { WorkersTable } from \"@/components/work-pools/workers-table\";\nimport { cn } from \"@/utils\";\n\nconst workPoolSearchParams = z.object({\n\ttab: z\n\t\t.enum([\"Details\", \"Runs\", \"Work Queues\", \"Workers\", \"Deployments\"])\n\t\t.default(\"Runs\"),\n});\n\ntype WorkPoolSearchParams = z.infer<typeof workPoolSearchParams>;\n\nexport const Route = createFileRoute(\"/work-pools/work-pool/$workPoolName\")({\n\tvalidateSearch: zodValidator(workPoolSearchParams),\n\tcomponent: RouteComponent,\n\tloader: async ({ params, context: { queryClient } }) => {\n\t\t// Critical data - must await\n\t\tconst workPool = await queryClient.ensureQueryData(\n\t\t\tbuildGetWorkPoolQuery(params.workPoolName),\n\t\t);\n\n\t\t// Prefetch tab data for better UX\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildListWorkPoolQueuesQuery(params.workPoolName),\n\t\t);\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildListWorkPoolWorkersQuery(params.workPoolName),\n\t\t);\n\n\t\t// Prefetch late runs count for each queue (non-blocking)\n\t\tvoid queryClient\n\t\t\t.ensureQueryData(buildListWorkPoolQueuesQuery(params.workPoolName))\n\t\t\t.then((queues) =>\n\t\t\t\tPromise.all(\n\t\t\t\t\tqueues.map((queue) =>\n\t\t\t\t\t\tqueryClient.prefetchQuery(\n\t\t\t\t\t\t\tbuildCountFlowRunsQuery(\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\twork_pools: {\n\t\t\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\t\t\tname: { any_: [params.workPoolName] },\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\twork_pool_queues: {\n\t\t\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\t\t\tname: { any_: [queue.name] },\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tflow_runs: {\n\t\t\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\t\t\tstate: {\n\t\t\t\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\t\t\t\tname: { any_: [\"Late\"] },\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t30000,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t);\n\n\t\t// Prefetch paginated flow runs data\n\t\tvoid queryClient\n\t\t\t.ensureQueryData(\n\t\t\t\tbuildPaginateFlowRunsQuery({\n\t\t\t\t\tpage: 1,\n\t\t\t\t\tlimit: 10,\n\t\t\t\t\tsort: \"START_TIME_DESC\",\n\t\t\t\t\twork_pools: {\n\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\tname: { any_: [params.workPoolName] },\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t)\n\t\t\t.then((paginatedData) =>\n\t\t\t\tPromise.all(\n\t\t\t\t\t(paginatedData.results ?? []).map((flowRun) =>\n\t\t\t\t\t\tqueryClient.prefetchQuery(\n\t\t\t\t\t\t\tbuildGetFlowRunsTaskRunsCountQuery([flowRun.id]),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t),\n\t\t\t);\n\n\t\t// Prefetch flow runs count for pagination\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildCountFlowRunsQuery({\n\t\t\t\twork_pools: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tname: { any_: [params.workPoolName] },\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildPaginateDeploymentsQuery({\n\t\t\t\tpage: 1,\n\t\t\t\tlimit: 50,\n\t\t\t\tsort: \"CREATED_DESC\",\n\t\t\t\twork_pools: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tname: { any_: [params.workPoolName] },\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\t\treturn { workPool };\n\t},\n\twrapInSuspense: true,\n});\n\n// Wrapper component for Work Pool Queues tab\nconst WorkPoolQueuesTabWrapper = ({\n\tworkPoolName,\n}: {\n\tworkPoolName: string;\n}) => {\n\tconst [searchQuery, setSearchQuery] = useState(\"\");\n\tconst [sortState, setSortState] = useState<SortingState>([]);\n\n\tconst { data: queues } = useSuspenseQuery(\n\t\tbuildListWorkPoolQueuesQuery(workPoolName),\n\t);\n\n\tconst filteredQueues = useMemo(() => {\n\t\tif (!searchQuery) return queues;\n\t\treturn queues.filter((queue) =>\n\t\t\tqueue.name.toLowerCase().includes(searchQuery.toLowerCase()),\n\t\t);\n\t}, [queues, searchQuery]);\n\n\treturn (\n\t\t<WorkPoolQueuesTable\n\t\t\tqueues={filteredQueues}\n\t\t\tsearchQuery={searchQuery}\n\t\t\tsortState={sortState}\n\t\t\ttotalCount={queues.length}\n\t\t\tworkPoolName={workPoolName}\n\t\t\tonSearchChange={setSearchQuery}\n\t\t\tonSortingChange={setSortState}\n\t\t/>\n\t);\n};\n\n// Wrapper component for Workers tab\nconst WorkersTabWrapper = ({ workPoolName }: { workPoolName: string }) => {\n\tconst [pagination, setPagination] = useState<PaginationState>({\n\t\tpageIndex: 0,\n\t\tpageSize: 10,\n\t});\n\tconst [columnFilters, setColumnFilters] = useState<ColumnFiltersState>([]);\n\n\tconst { data: workers } = useSuspenseQuery(\n\t\tbuildListWorkPoolWorkersQuery(workPoolName),\n\t);\n\n\treturn (\n\t\t<WorkersTable\n\t\t\tworkPoolName={workPoolName}\n\t\t\tworkers={workers}\n\t\t\tpagination={pagination}\n\t\t\tcolumnFilters={columnFilters}\n\t\t\tonPaginationChange={setPagination}\n\t\t\tonColumnFiltersChange={setColumnFilters}\n\t\t/>\n\t);\n};\n\nfunction RouteComponent() {\n\tconst { workPoolName } = Route.useParams();\n\tconst { tab } = Route.useSearch();\n\tconst navigate = useNavigate({ from: Route.fullPath });\n\tconst queryClient = useQueryClient();\n\n\tconst { data: workPool } = useSuspenseQuery(\n\t\tbuildGetWorkPoolQuery(workPoolName),\n\t);\n\n\tconst showCodeBanner = workPool.status !== \"READY\";\n\tconst codeBannerCommand = `prefect worker start --pool \"${workPool.name}\"`;\n\n\tconst tabs = useMemo(\n\t\t() =>\n\t\t\t[\n\t\t\t\t{\n\t\t\t\t\tid: \"Details\",\n\t\t\t\t\tlabel: \"Details\",\n\t\t\t\t\thidden: false,\n\t\t\t\t\thiddenOnDesktop: true, // Hide on xl screens and above\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"Runs\",\n\t\t\t\t\tlabel: \"Runs\",\n\t\t\t\t\thidden: false,\n\t\t\t\t\thiddenOnDesktop: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"Work Queues\",\n\t\t\t\t\tlabel: \"Work Queues\",\n\t\t\t\t\thidden: false,\n\t\t\t\t\thiddenOnDesktop: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"Workers\",\n\t\t\t\t\tlabel: \"Workers\",\n\t\t\t\t\thiddenOnDesktop: false,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tid: \"Deployments\",\n\t\t\t\t\tlabel: \"Deployments\",\n\t\t\t\t\thidden: false,\n\t\t\t\t\thiddenOnDesktop: false,\n\t\t\t\t},\n\t\t\t].filter((tab) => !tab.hidden),\n\t\t[],\n\t);\n\n\tconst handleTabChange = useCallback(\n\t\t(newTab: string) => {\n\t\t\tvoid navigate({\n\t\t\t\tsearch: { tab: newTab as WorkPoolSearchParams[\"tab\"] },\n\t\t\t});\n\t\t},\n\t\t[navigate],\n\t);\n\n\tconst handleWorkPoolUpdate = useCallback(() => {\n\t\t// Refresh work pool data\n\t\tvoid queryClient.invalidateQueries({\n\t\t\tqueryKey: workPoolsQueryKeyFactory.detailByName(workPoolName),\n\t\t});\n\t}, [queryClient, workPoolName]);\n\n\treturn (\n\t\t<LayoutWell>\n\t\t\t<LayoutWellContent>\n\t\t\t\t<LayoutWellHeader>\n\t\t\t\t\t<WorkPoolPageHeader\n\t\t\t\t\t\tworkPool={workPool}\n\t\t\t\t\t\tonUpdate={handleWorkPoolUpdate}\n\t\t\t\t\t/>\n\t\t\t\t\t{showCodeBanner && (\n\t\t\t\t\t\t<div className=\"w-full bg-muted/50 py-6 px-4 rounded-lg mb-6\">\n\t\t\t\t\t\t\t<div className=\"max-w-4xl mx-auto\">\n\t\t\t\t\t\t\t\t<CodeBanner\n\t\t\t\t\t\t\t\t\tcommand={codeBannerCommand}\n\t\t\t\t\t\t\t\t\ttitle=\"Your work pool is almost ready!\"\n\t\t\t\t\t\t\t\t\tsubtitle=\"Run this command to start.\"\n\t\t\t\t\t\t\t\t\tclassName=\"py-0\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</LayoutWellHeader>\n\n\t\t\t\t<div className=\"flex flex-col xl:flex-row xl:gap-8\">\n\t\t\t\t\t<div className=\"flex-1\">\n\t\t\t\t\t\t<Tabs value={tab} onValueChange={handleTabChange}>\n\t\t\t\t\t\t\t<TabsList className=\"flex w-full overflow-x-auto scrollbar-none\">\n\t\t\t\t\t\t\t\t{tabs.map((tabItem) => (\n\t\t\t\t\t\t\t\t\t<TabsTrigger\n\t\t\t\t\t\t\t\t\t\tkey={tabItem.id}\n\t\t\t\t\t\t\t\t\t\tvalue={tabItem.id}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\"whitespace-nowrap flex-shrink-0\",\n\t\t\t\t\t\t\t\t\t\t\ttabItem.hiddenOnDesktop ? \"xl:hidden\" : \"\",\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{tabItem.label}\n\t\t\t\t\t\t\t\t\t</TabsTrigger>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</TabsList>\n\n\t\t\t\t\t\t\t<TabsContent value=\"Details\" className=\"space-y-0\">\n\t\t\t\t\t\t\t\t<Suspense\n\t\t\t\t\t\t\t\t\tfallback={\n\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-6\">\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-4 w-48\" />\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"grid grid-cols-1 md:grid-cols-2 gap-4\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-3 w-16\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-6 w-24\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-3 w-20\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-6 w-32\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-3 w-24\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-6 w-28\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-3 w-18\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-6 w-36\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-3\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-5 w-40\" />\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-32 w-full\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<WorkPoolDetails workPool={workPool} />\n\t\t\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t\t\t</TabsContent>\n\n\t\t\t\t\t\t\t<TabsContent value=\"Runs\">\n\t\t\t\t\t\t\t\t<Suspense\n\t\t\t\t\t\t\t\t\tfallback={\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-24 w-full\" />\n\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-24 w-full\" />\n\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-24 w-full\" />\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<WorkPoolFlowRunsTab workPoolName={workPoolName} />\n\t\t\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t\t\t</TabsContent>\n\n\t\t\t\t\t\t\t<TabsContent value=\"Work Queues\" className=\"space-y-0\">\n\t\t\t\t\t\t\t\t<Suspense\n\t\t\t\t\t\t\t\t\tfallback={\n\t\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t\t\t\t\t\t\t\t{/* Toolbar skeleton */}\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-6 w-24\" />\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-6 w-8\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-6 w-64\" />\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t{/* Table skeleton */}\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-34 w-full\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<WorkPoolQueuesTabWrapper workPoolName={workPoolName} />\n\t\t\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t\t\t</TabsContent>\n\n\t\t\t\t\t\t\t<TabsContent value=\"Workers\" className=\"space-y-0\">\n\t\t\t\t\t\t\t\t<Suspense\n\t\t\t\t\t\t\t\t\tfallback={\n\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t\t\t\t\t{/* Search skeleton */}\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-4 w-20\" />\n\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-9 w-64\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t{/* Table skeleton */}\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-34 w-full\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<WorkersTabWrapper workPoolName={workPoolName} />\n\t\t\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t\t\t</TabsContent>\n\n\t\t\t\t\t\t\t<TabsContent value=\"Deployments\" className=\"space-y-0\">\n\t\t\t\t\t\t\t\t<Suspense\n\t\t\t\t\t\t\t\t\tfallback={\n\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t\t\t\t\t{/* Search skeleton */}\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-4 w-20\" />\n\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-9 w-64\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t\t{/* Table skeleton */}\n\t\t\t\t\t\t\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t\t\t\t\t\t\t<Skeleton className=\"h-34 w-full\" />\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<WorkPoolDeploymentsTab workPoolName={workPoolName} />\n\t\t\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t\t\t</TabsContent>\n\t\t\t\t\t\t</Tabs>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<aside className=\"w-full xl:w-80 xl:shrink-0 hidden xl:block\">\n\t\t\t\t\t\t<div className=\"sticky top-8\">\n\t\t\t\t\t\t\t<WorkPoolDetails workPool={workPool} alternate />\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</aside>\n\t\t\t\t</div>\n\t\t\t</LayoutWellContent>\n\t\t</LayoutWell>\n\t);\n}\n"],"names":["__iconNode","CircleQuestionMark","createLucideIcon","CodeBanner","command","title","subtitle","className","copying","setCopying","useState","handleCopy","toast","cn","jsxs","jsx","Button","Copy","WorkPoolDeploymentsTab","workPoolName","pagination","setPagination","sort","setSort","columnFilters","setColumnFilters","filter","useMemo","countFilter","paginatedData","useQuery","buildPaginateDeploymentsQuery","totalCount","buildCountDeploymentsQuery","flowIds","d","flows","buildListFlowsQuery","deploymentsWithFlows","flowMap","flow","deployment","handlePaginationChange","useCallback","newPagination","handleSortChange","newSort","handleColumnFiltersChange","newFilters","DeploymentsDataTable","getStatusLabel","status","getStatusColor","WorkPoolStatusBadge","label","colorClass","Badge","Pause","None","FieldLabel","children","FieldValue","BasicInfoSection","workPool","workers","isLoading","buildListWorkPoolWorkersQuery","lastPolled","w","time","a","b","fields","titleCase","FormattedDate","ComponentValue","field","JobTemplateSection","baseJobTemplate","properties","formatFieldName","key","property","word","formatValue","value","WorkPoolDetails","alternate","spacing","Fragment","Separator","WorkPoolFlowRunsTab","searchTerm","setSearchTerm","selectedStates","setSelectedStates","debouncedSearchTerm","useDebounce","baseFilter","stateFilter","baseCountFilter","buildPaginateFlowRunsQuery","buildCountFlowRunsQuery","flowRun","flowRunsWithFlows","handleSearchChange","event","prev","handleStateFilterChange","newSelectedStates","handleClearFilters","SearchInput","StateFilter","FlowRunsList","FlowRunsPagination","DeleteWorkPoolDialog","open","onOpenChange","onDeleted","navigate","useNavigate","deleteWorkPool","isPending","useDeleteWorkPool","handleDelete","DeleteConfirmationDialog","useWorkPoolMenu","showDeleteDialog","setShowDeleteDialog","Edit","Trash2","Zap","item","MoreVertical","WorkPoolMenu","onUpdate","menuItems","TriggerIcon","DropdownMenu","DropdownMenuTrigger","DropdownMenuContent","Icon","DropdownMenuItem","useWorkPoolToggle","pauseWorkPool","pausePending","usePauseWorkPool","resumeWorkPool","resumePending","useResumeWorkPool","checked","WorkPoolToggle","handleToggle","isPaused","Tooltip","TooltipTrigger","Switch","TooltipContent","WorkPoolPageHeader","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","BreadcrumbPage","LateFlowRunsIndicator","lateRunsCount","TooltipProvider","Clock","QueueNameWithLateIndicator","queue","Link","createWorkPoolQueuesTableColumns","enableLateIndicator","columns","column","row","limit","HelpCircle","WorkPoolQueueStatusBadge","WorkPoolQueueToggle","WorkPoolQueueMenu","WorkPoolQueuesTableEmptyState","hasSearchQuery","Search","Plus","WorkPoolQueuesTableToolbar","searchQuery","onSearchChange","resultsCount","showCreateDialog","setShowCreateDialog","showClearFilters","Input","e","WorkPoolQueueCreateOrEditDialog","WorkPoolQueuesTable","queues","sortState","onSortingChange","handleSortingChange","updater","newSorting","table","useReactTable","getCoreRowModel","getSortedRowModel","DataTable","statusConfig","WorkerStatusBadge","config","createWorkersTableColumns","worker","lastSeen","createWorkersTableColumnsWithActions","ActionsComponent","WorkersTableEmptyState","EmptyState","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","EmptyStateActions","DeleteWorkerDialog","deleteWorker","useDeleteWorker","useWorkerMenu","MoreHorizontal","WorkerMenu","onWorkerDeleted","WorkersTableRowActions","WorkersTableToolbar","WorkersTable","onPaginationChange","onColumnFiltersChange","filters","filteredWorkers","getPaginationRowModel","z","tab","default","WorkPoolQueuesTabWrapper","setSearchQuery","setSortState","data","useSuspenseQuery","buildListWorkPoolQueuesQuery","filteredQueues","name","toLowerCase","includes","length","WorkersTabWrapper","pageIndex","pageSize","RouteComponent","Route","useParams","useSearch","from","fullPath","queryClient","useQueryClient","buildGetWorkPoolQuery","showCodeBanner","codeBannerCommand","tabs","id","hidden","hiddenOnDesktop","handleTabChange","newTab","search","handleWorkPoolUpdate","invalidateQueries","queryKey","workPoolsQueryKeyFactory","detailByName","LayoutWell","LayoutWellContent","LayoutWellHeader","Tabs","TabsList","map","TabsTrigger","tabItem","TabsContent","Suspense","Skeleton"],"mappings":"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","x_google_ignoreList":[0]}