prefect 3.6.16.dev5__py3-none-any.whl → 3.6.16.dev6__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 (286) hide show
  1. prefect/_build_info.py +3 -3
  2. prefect/cli/__init__.py +1 -0
  3. prefect/cli/cloud/asset.py +135 -0
  4. prefect/server/ui-v2/assets/artifact-card-BnPKAfkY.js +2 -0
  5. prefect/server/ui-v2/assets/artifact-card-BnPKAfkY.js.map +1 -0
  6. prefect/server/ui-v2/assets/artifact._id-vDOuIuta.js +2 -0
  7. prefect/server/ui-v2/assets/artifact._id-vDOuIuta.js.map +1 -0
  8. prefect/server/ui-v2/assets/automation-wizard-RlOhF90R.js +2 -0
  9. prefect/server/ui-v2/assets/automation-wizard-RlOhF90R.js.map +1 -0
  10. prefect/server/ui-v2/assets/automation._id-CEHa-X0X.js +2 -0
  11. prefect/server/ui-v2/assets/{automation._id-CMiura1b.js.map → automation._id-CEHa-X0X.js.map} +1 -1
  12. prefect/server/ui-v2/assets/{automation_._id.edit-Cbfcwa-K.js → automation_._id.edit-BRWAsELa.js} +2 -2
  13. prefect/server/ui-v2/assets/{automation_._id.edit-Cbfcwa-K.js.map → automation_._id.edit-BRWAsELa.js.map} +1 -1
  14. prefect/server/ui-v2/assets/{automations-header-BxPCOE-0.js → automations-header-Dr6v5dPp.js} +2 -2
  15. prefect/server/ui-v2/assets/{automations-header-BxPCOE-0.js.map → automations-header-Dr6v5dPp.js.map} +1 -1
  16. prefect/server/ui-v2/assets/base-job-template-form-section-C8_R96gO.js +2 -0
  17. prefect/server/ui-v2/assets/base-job-template-form-section-C8_R96gO.js.map +1 -0
  18. prefect/server/ui-v2/assets/block-type-details-tAkUWqs1.js +2 -0
  19. prefect/server/ui-v2/assets/block-type-details-tAkUWqs1.js.map +1 -0
  20. prefect/server/ui-v2/assets/block-type-logo-scnMsyY5.js +2 -0
  21. prefect/server/ui-v2/assets/{block-type-logo-DuvU7goV.js.map → block-type-logo-scnMsyY5.js.map} +1 -1
  22. prefect/server/ui-v2/assets/block._id-BY42cyjR.js +2 -0
  23. prefect/server/ui-v2/assets/block._id-BY42cyjR.js.map +1 -0
  24. prefect/server/ui-v2/assets/{block_._id.edit-C4SmoQ4y.js → block_._id.edit-n2jwU5yr.js} +2 -2
  25. prefect/server/ui-v2/assets/{block_._id.edit-C4SmoQ4y.js.map → block_._id.edit-n2jwU5yr.js.map} +1 -1
  26. prefect/server/ui-v2/assets/catalog-5_GoCKpb.js +2 -0
  27. prefect/server/ui-v2/assets/catalog-5_GoCKpb.js.map +1 -0
  28. prefect/server/ui-v2/assets/catalog_._slug-sZvt0fDy.js +2 -0
  29. prefect/server/ui-v2/assets/catalog_._slug-sZvt0fDy.js.map +1 -0
  30. prefect/server/ui-v2/assets/{catalog_._slug_.create-CgKL4TS2.js → catalog_._slug_.create-rboQmoyW.js} +2 -2
  31. prefect/server/ui-v2/assets/{catalog_._slug_.create-CgKL4TS2.js.map → catalog_._slug_.create-rboQmoyW.js.map} +1 -1
  32. prefect/server/ui-v2/assets/{collapsible-DZbPzSgr.js → collapsible-Lk7MRvBH.js} +2 -2
  33. prefect/server/ui-v2/assets/{collapsible-DZbPzSgr.js.map → collapsible-Lk7MRvBH.js.map} +1 -1
  34. prefect/server/ui-v2/assets/concurrency-limit._id-D5i9zZJh.js +2 -0
  35. prefect/server/ui-v2/assets/concurrency-limit._id-D5i9zZJh.js.map +1 -0
  36. prefect/server/ui-v2/assets/create-CtsA2QIl.js +2 -0
  37. prefect/server/ui-v2/assets/{create-BrNwbpVu.js.map → create-CtsA2QIl.js.map} +1 -1
  38. prefect/server/ui-v2/assets/{create-DWgkh2HT.js → create-DJPAEZ93.js} +2 -2
  39. prefect/server/ui-v2/assets/create-DJPAEZ93.js.map +1 -0
  40. prefect/server/ui-v2/assets/{data-table-QSHqmTar.js → data-table-bk-0xKWT.js} +2 -2
  41. prefect/server/ui-v2/assets/{data-table-QSHqmTar.js.map → data-table-bk-0xKWT.js.map} +1 -1
  42. prefect/server/ui-v2/assets/{delete-confirmation-dialog-dLycVNo4.js → delete-confirmation-dialog-BZg9EOfN.js} +2 -2
  43. prefect/server/ui-v2/assets/{delete-confirmation-dialog-dLycVNo4.js.map → delete-confirmation-dialog-BZg9EOfN.js.map} +1 -1
  44. prefect/server/ui-v2/assets/{deployment-action-header-CzvBTL6H.js → deployment-action-header-DwuMPgVg.js} +2 -2
  45. prefect/server/ui-v2/assets/{deployment-action-header-CzvBTL6H.js.map → deployment-action-header-DwuMPgVg.js.map} +1 -1
  46. prefect/server/ui-v2/assets/deployment-form-BpKkzEf2.js +3 -0
  47. prefect/server/ui-v2/assets/deployment-form-BpKkzEf2.js.map +1 -0
  48. prefect/server/ui-v2/assets/{deployment-links-CGjJpxJA.js → deployment-links-B67P-6Ph.js} +2 -2
  49. prefect/server/ui-v2/assets/{deployment-links-CGjJpxJA.js.map → deployment-links-B67P-6Ph.js.map} +1 -1
  50. prefect/server/ui-v2/assets/{deployment._id-DXrb6frJ.js → deployment._id-BVOBfMVf.js} +2 -2
  51. prefect/server/ui-v2/assets/deployment._id-BVOBfMVf.js.map +1 -0
  52. prefect/server/ui-v2/assets/deployment._id-KOMC9fpE.js +2 -0
  53. prefect/server/ui-v2/assets/deployment._id-KOMC9fpE.js.map +1 -0
  54. prefect/server/ui-v2/assets/deployment_._id.duplicate-BPk2SchT.js +2 -0
  55. prefect/server/ui-v2/assets/deployment_._id.duplicate-BPk2SchT.js.map +1 -0
  56. prefect/server/ui-v2/assets/deployment_._id.edit-Dv0M_huv.js +2 -0
  57. prefect/server/ui-v2/assets/deployment_._id.edit-Dv0M_huv.js.map +1 -0
  58. prefect/server/ui-v2/assets/deployment_._id.run-DFVA4Xhx.js +2 -0
  59. prefect/server/ui-v2/assets/{deployment_._id.run-CnacOmhY.js.map → deployment_._id.run-DFVA4Xhx.js.map} +1 -1
  60. prefect/server/ui-v2/assets/{dropdown-menu-B9LKPlz7.js → dropdown-menu-fRiq5bS-.js} +2 -2
  61. prefect/server/ui-v2/assets/{dropdown-menu-B9LKPlz7.js.map → dropdown-menu-fRiq5bS-.js.map} +1 -1
  62. prefect/server/ui-v2/assets/{event-resource-display-B42RIaiX.js → event-resource-display-C1ZAey-o.js} +2 -2
  63. prefect/server/ui-v2/assets/{event-resource-display-B42RIaiX.js.map → event-resource-display-C1ZAey-o.js.map} +1 -1
  64. prefect/server/ui-v2/assets/event._eventDate._eventId-CcbtP9Ag.js +2 -0
  65. prefect/server/ui-v2/assets/{event._eventDate._eventId-CKTuT_8S.js.map → event._eventDate._eventId-CcbtP9Ag.js.map} +1 -1
  66. prefect/server/ui-v2/assets/flow-run-graph-CycKStSg.js +2 -0
  67. prefect/server/ui-v2/assets/flow-run-graph-CycKStSg.js.map +1 -0
  68. prefect/server/ui-v2/assets/{flow-run._id-BKv9Meqc.js → flow-run._id-Dn9R_Tjy.js} +2 -2
  69. prefect/server/ui-v2/assets/flow-run._id-Dn9R_Tjy.js.map +1 -0
  70. prefect/server/ui-v2/assets/{flow-run._id-ZTkjj6bM.js → flow-run._id-Dwx7ojcj.js} +2 -2
  71. prefect/server/ui-v2/assets/flow-run._id-Dwx7ojcj.js.map +1 -0
  72. prefect/server/ui-v2/assets/flow-run._id-YzRd5jrC.js +4 -0
  73. prefect/server/ui-v2/assets/flow-run._id-YzRd5jrC.js.map +1 -0
  74. prefect/server/ui-v2/assets/flow-runs-pagination-DMLZFM1m.js +2 -0
  75. prefect/server/ui-v2/assets/flow-runs-pagination-DMLZFM1m.js.map +1 -0
  76. prefect/server/ui-v2/assets/flow._id-V6-Qhkwk.js +2 -0
  77. prefect/server/ui-v2/assets/flow._id-V6-Qhkwk.js.map +1 -0
  78. prefect/server/ui-v2/assets/{form-DOdmIC3A.js → form-Cl5Hk9bq.js} +2 -2
  79. prefect/server/ui-v2/assets/{form-DOdmIC3A.js.map → form-Cl5Hk9bq.js.map} +1 -1
  80. prefect/server/ui-v2/assets/{header-DcIuN5UN.js → header-BuI436ik.js} +2 -2
  81. prefect/server/ui-v2/assets/{header-DcIuN5UN.js.map → header-BuI436ik.js.map} +1 -1
  82. prefect/server/ui-v2/assets/{header-CnBwASd-.js → header-DcAQCxQl.js} +2 -2
  83. prefect/server/ui-v2/assets/{header-CnBwASd-.js.map → header-DcAQCxQl.js.map} +1 -1
  84. prefect/server/ui-v2/assets/{header-DxE-NzAK.js → header-qlcK4NLD.js} +2 -2
  85. prefect/server/ui-v2/assets/{header-DxE-NzAK.js.map → header-qlcK4NLD.js.map} +1 -1
  86. prefect/server/ui-v2/assets/index--Z69UYXV.js +2 -0
  87. prefect/server/ui-v2/assets/index--Z69UYXV.js.map +1 -0
  88. prefect/server/ui-v2/assets/{index-D0R9_LIL.js → index-BO4Qqsm8.js} +2 -2
  89. prefect/server/ui-v2/assets/index-BO4Qqsm8.js.map +1 -0
  90. prefect/server/ui-v2/assets/index-Bg45XS_V.js +2 -0
  91. prefect/server/ui-v2/assets/index-Bg45XS_V.js.map +1 -0
  92. prefect/server/ui-v2/assets/{index-BIBIJufF.js → index-BleYpDoN.js} +2 -2
  93. prefect/server/ui-v2/assets/index-BleYpDoN.js.map +1 -0
  94. prefect/server/ui-v2/assets/{index-DyOAqIOp.js → index-C63VUjOh.js} +2 -2
  95. prefect/server/ui-v2/assets/{index-DyOAqIOp.js.map → index-C63VUjOh.js.map} +1 -1
  96. prefect/server/ui-v2/assets/{index-DfKXdmko.js → index-C6LgWyJb.js} +2 -2
  97. prefect/server/ui-v2/assets/index-C6LgWyJb.js.map +1 -0
  98. prefect/server/ui-v2/assets/index-CE-bVgqj.js +2 -0
  99. prefect/server/ui-v2/assets/{index-DlAHvqFx.js.map → index-CE-bVgqj.js.map} +1 -1
  100. prefect/server/ui-v2/assets/{index-V_xTKaEb.js → index-CPpeVt8m.js} +13 -13
  101. prefect/server/ui-v2/assets/index-CPpeVt8m.js.map +1 -0
  102. prefect/server/ui-v2/assets/index-CYaUe0Ym.js +2 -0
  103. prefect/server/ui-v2/assets/index-CYaUe0Ym.js.map +1 -0
  104. prefect/server/ui-v2/assets/{index-C5RMFRyZ.js → index-Clbms0kg.js} +2 -2
  105. prefect/server/ui-v2/assets/index-Clbms0kg.js.map +1 -0
  106. prefect/server/ui-v2/assets/index-D13YFoYA.js +2 -0
  107. prefect/server/ui-v2/assets/index-D13YFoYA.js.map +1 -0
  108. prefect/server/ui-v2/assets/{index-Cx1qEoCK.js → index-D73a_nGu.js} +2 -2
  109. prefect/server/ui-v2/assets/{index-Cx1qEoCK.js.map → index-D73a_nGu.js.map} +1 -1
  110. prefect/server/ui-v2/assets/index-DJXBzX1E.css +1 -0
  111. prefect/server/ui-v2/assets/{index-BO60ehN6.js → index-DPPPaOr_.js} +2 -2
  112. prefect/server/ui-v2/assets/index-DPPPaOr_.js.map +1 -0
  113. prefect/server/ui-v2/assets/{index-DP8W-xJo.js → index-DU9ShbqW.js} +2 -2
  114. prefect/server/ui-v2/assets/index-DU9ShbqW.js.map +1 -0
  115. prefect/server/ui-v2/assets/index-DdR1lzZk.js +2 -0
  116. prefect/server/ui-v2/assets/index-DdR1lzZk.js.map +1 -0
  117. prefect/server/ui-v2/assets/{index-B9ttjsyu.js → index-ELo08q04.js} +2 -2
  118. prefect/server/ui-v2/assets/{index-B9ttjsyu.js.map → index-ELo08q04.js.map} +1 -1
  119. prefect/server/ui-v2/assets/{index-BTL1xHS9.js → index-cp6PTdHp.js} +2 -2
  120. prefect/server/ui-v2/assets/{index-BTL1xHS9.js.map → index-cp6PTdHp.js.map} +1 -1
  121. prefect/server/ui-v2/assets/{index-D6G96ToY.js → index-kM_g8J0u.js} +2 -2
  122. prefect/server/ui-v2/assets/{index-D6G96ToY.js.map → index-kM_g8J0u.js.map} +1 -1
  123. prefect/server/ui-v2/assets/{index-q5Y3hlDT.js → index-mYcm9Rkr.js} +2 -2
  124. prefect/server/ui-v2/assets/index-mYcm9Rkr.js.map +1 -0
  125. prefect/server/ui-v2/assets/{index-D9cOtoSU.js → index-yavn_NBp.js} +2 -2
  126. prefect/server/ui-v2/assets/index-yavn_NBp.js.map +1 -0
  127. prefect/server/ui-v2/assets/{json-input-YKJMJCcT.js → json-input-iUzf6BvZ.js} +2 -2
  128. prefect/server/ui-v2/assets/{json-input-YKJMJCcT.js.map → json-input-iUzf6BvZ.js.map} +1 -1
  129. prefect/server/ui-v2/assets/{key-value-RPUUqQ6F.js → key-value-DI27Dv4P.js} +2 -2
  130. prefect/server/ui-v2/assets/{key-value-RPUUqQ6F.js.map → key-value-DI27Dv4P.js.map} +1 -1
  131. prefect/server/ui-v2/assets/key._key-C-nk2nld.js +2 -0
  132. prefect/server/ui-v2/assets/key._key-C-nk2nld.js.map +1 -0
  133. prefect/server/ui-v2/assets/{lazy-markdown-B9vEkJ0h.js → lazy-markdown-D_y73qoD.js} +2 -2
  134. prefect/server/ui-v2/assets/{lazy-markdown-B9vEkJ0h.js.map → lazy-markdown-D_y73qoD.js.map} +1 -1
  135. prefect/server/ui-v2/assets/{login-C3PhSGQJ.js → login-DR_xuMmg.js} +2 -2
  136. prefect/server/ui-v2/assets/{login-C3PhSGQJ.js.map → login-DR_xuMmg.js.map} +1 -1
  137. prefect/server/ui-v2/assets/{markdown-input-Dei7u1qp.js → markdown-input-hzlzpUdj.js} +2 -2
  138. prefect/server/ui-v2/assets/{markdown-input-Dei7u1qp.js.map → markdown-input-hzlzpUdj.js.map} +1 -1
  139. prefect/server/ui-v2/assets/{python-example-snippet-DvulFxgw.js → python-example-snippet-d8bTNJ0J.js} +3 -3
  140. prefect/server/ui-v2/assets/{python-example-snippet-DvulFxgw.js.map → python-example-snippet-d8bTNJ0J.js.map} +1 -1
  141. prefect/server/ui-v2/assets/{python-input-niCawr8m.js → python-input-Bxdnzvx3.js} +2 -2
  142. prefect/server/ui-v2/assets/{python-input-niCawr8m.js.map → python-input-Bxdnzvx3.js.map} +1 -1
  143. prefect/server/ui-v2/assets/{radio-group-D55TQZsk.js → radio-group-0oOEMJCS.js} +2 -2
  144. prefect/server/ui-v2/assets/{radio-group-D55TQZsk.js.map → radio-group-0oOEMJCS.js.map} +1 -1
  145. prefect/server/ui-v2/assets/{route-error-state-Cu4m0LTX.js → route-error-state-BqbnZCc-.js} +2 -2
  146. prefect/server/ui-v2/assets/{route-error-state-Cu4m0LTX.js.map → route-error-state-BqbnZCc-.js.map} +1 -1
  147. prefect/server/ui-v2/assets/{schema-form-BQAcWW5k.js → schema-form-BD-WM4S0.js} +2 -2
  148. prefect/server/ui-v2/assets/{schema-form-BQAcWW5k.js.map → schema-form-BD-WM4S0.js.map} +1 -1
  149. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-Cb4sTJle.js → schema-form-input-string-format-datetime-Dg3zVAp5.js} +4 -4
  150. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-Cb4sTJle.js.map → schema-form-input-string-format-datetime-Dg3zVAp5.js.map} +1 -1
  151. prefect/server/ui-v2/assets/{settings-DV4ewZ_4.js → settings-Dm6yMLix.js} +2 -2
  152. prefect/server/ui-v2/assets/{settings-DV4ewZ_4.js.map → settings-Dm6yMLix.js.map} +1 -1
  153. prefect/server/ui-v2/assets/{sort-filter-DY7vgl7C.js → sort-filter-X6JyRc0-.js} +2 -2
  154. prefect/server/ui-v2/assets/{sort-filter-DY7vgl7C.js.map → sort-filter-X6JyRc0-.js.map} +1 -1
  155. prefect/server/ui-v2/assets/{table-ChOwO4Pk.js → table-Xyel2BEw.js} +2 -2
  156. prefect/server/ui-v2/assets/{table-ChOwO4Pk.js.map → table-Xyel2BEw.js.map} +1 -1
  157. prefect/server/ui-v2/assets/{tags-input-2KSBvO_K.js → tags-input-DqZ8v99z.js} +2 -2
  158. prefect/server/ui-v2/assets/{tags-input-2KSBvO_K.js.map → tags-input-DqZ8v99z.js.map} +1 -1
  159. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-CNrP9yPQ.js → task-run-concurrency-limits-reset-dialog-5xFWeoYy.js} +2 -2
  160. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-CNrP9yPQ.js.map → task-run-concurrency-limits-reset-dialog-5xFWeoYy.js.map} +1 -1
  161. prefect/server/ui-v2/assets/{task-run._id-cqXH0PMU.js → task-run._id-9DcrUEGz.js} +3 -3
  162. prefect/server/ui-v2/assets/{task-run._id-cqXH0PMU.js.map → task-run._id-9DcrUEGz.js.map} +1 -1
  163. prefect/server/ui-v2/assets/{task-run._id-CQGeAiBh.js → task-run._id-DJkoLl_e.js} +2 -2
  164. prefect/server/ui-v2/assets/task-run._id-DJkoLl_e.js.map +1 -0
  165. prefect/server/ui-v2/assets/task-runs-pagination-B2fSdB1t.js +2 -0
  166. prefect/server/ui-v2/assets/task-runs-pagination-B2fSdB1t.js.map +1 -0
  167. prefect/server/ui-v2/assets/{textarea-9v5uTuxg.js → textarea-DFEOJJdc.js} +2 -2
  168. prefect/server/ui-v2/assets/{textarea-9v5uTuxg.js.map → textarea-DFEOJJdc.js.map} +1 -1
  169. prefect/server/ui-v2/assets/{timezone-select-DPtR_b06.js → timezone-select-NViFNNLz.js} +2 -2
  170. prefect/server/ui-v2/assets/{timezone-select-DPtR_b06.js.map → timezone-select-NViFNNLz.js.map} +1 -1
  171. prefect/server/ui-v2/assets/{toggle-group-CBJphTE6.js → toggle-group-EMgSOoYH.js} +2 -2
  172. prefect/server/ui-v2/assets/{toggle-group-CBJphTE6.js.map → toggle-group-EMgSOoYH.js.map} +1 -1
  173. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-BHgDXlwg.js +2 -0
  174. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-BHgDXlwg.js.map +1 -0
  175. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-BYY1b8yH.js → use-delete-block-document-confirmation-dialog-CxRkBKPg.js} +2 -2
  176. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-BYY1b8yH.js.map → use-delete-block-document-confirmation-dialog-CxRkBKPg.js.map} +1 -1
  177. prefect/server/ui-v2/assets/use-flow-runs-selected-rows-Ck8nwx2q.js +2 -0
  178. prefect/server/ui-v2/assets/use-flow-runs-selected-rows-Ck8nwx2q.js.map +1 -0
  179. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-BOTU5FPq.js → use-get-artifacts-flow-task-runs-D7Djt53s.js} +2 -2
  180. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-BOTU5FPq.js.map → use-get-artifacts-flow-task-runs-D7Djt53s.js.map} +1 -1
  181. prefect/server/ui-v2/assets/{use-quick-run-DzSmbSlu.js → use-quick-run-Cpy0t7dX.js} +2 -2
  182. prefect/server/ui-v2/assets/{use-quick-run-DzSmbSlu.js.map → use-quick-run-Cpy0t7dX.js.map} +1 -1
  183. prefect/server/ui-v2/assets/{use-state-favicon-UFxhmhHr.js → use-state-favicon-CMsL9s6j.js} +2 -2
  184. prefect/server/ui-v2/assets/{use-state-favicon-UFxhmhHr.js.map → use-state-favicon-CMsL9s6j.js.map} +1 -1
  185. prefect/server/ui-v2/assets/use-stepper-CZZEx5js.js +2 -0
  186. prefect/server/ui-v2/assets/use-stepper-CZZEx5js.js.map +1 -0
  187. prefect/server/ui-v2/assets/{utilities-2FfCfMAV.js → utilities-D9BfvLg5.js} +2 -2
  188. prefect/server/ui-v2/assets/{utilities-2FfCfMAV.js.map → utilities-D9BfvLg5.js.map} +1 -1
  189. prefect/server/ui-v2/assets/work-pool-filter-dsJ6xeK6.js +2 -0
  190. prefect/server/ui-v2/assets/work-pool-filter-dsJ6xeK6.js.map +1 -0
  191. prefect/server/ui-v2/assets/{work-pool-queue-toggle-zSWhEFap.js → work-pool-queue-toggle-f_-cTWxB.js} +2 -2
  192. prefect/server/ui-v2/assets/{work-pool-queue-toggle-zSWhEFap.js.map → work-pool-queue-toggle-f_-cTWxB.js.map} +1 -1
  193. prefect/server/ui-v2/assets/{work-pool._workPoolName-BwIVfCIe.js → work-pool._workPoolName-zBqgkYLT.js} +2 -2
  194. prefect/server/ui-v2/assets/{work-pool._workPoolName-BwIVfCIe.js.map → work-pool._workPoolName-zBqgkYLT.js.map} +1 -1
  195. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-j7cjgoJp.js → work-pool_._workPoolName.edit-B-8_CnfA.js} +2 -2
  196. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-j7cjgoJp.js.map → work-pool_._workPoolName.edit-B-8_CnfA.js.map} +1 -1
  197. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-BlFjSdoB.js → work-pool_._workPoolName.queue._workQueueName-DzrY1tMq.js} +2 -2
  198. prefect/server/ui-v2/assets/work-pool_._workPoolName.queue._workQueueName-DzrY1tMq.js.map +1 -0
  199. prefect/server/ui-v2/assets/{work-queue-icon-text-vWlRNW-b.js → work-queue-icon-text-BqqQ413o.js} +2 -2
  200. prefect/server/ui-v2/assets/{work-queue-icon-text-vWlRNW-b.js.map → work-queue-icon-text-BqqQ413o.js.map} +1 -1
  201. prefect/server/ui-v2/index.html +2 -2
  202. prefect/task_engine.py +26 -12
  203. prefect/workers/base.py +18 -1
  204. {prefect-3.6.16.dev5.dist-info → prefect-3.6.16.dev6.dist-info}/METADATA +1 -1
  205. {prefect-3.6.16.dev5.dist-info → prefect-3.6.16.dev6.dist-info}/RECORD +208 -207
  206. prefect/server/ui-v2/assets/artifact-card-DQfjRA2u.js +0 -2
  207. prefect/server/ui-v2/assets/artifact-card-DQfjRA2u.js.map +0 -1
  208. prefect/server/ui-v2/assets/artifact._id-BBhuX3px.js +0 -2
  209. prefect/server/ui-v2/assets/artifact._id-BBhuX3px.js.map +0 -1
  210. prefect/server/ui-v2/assets/automation-wizard-DeT-tz5i.js +0 -2
  211. prefect/server/ui-v2/assets/automation-wizard-DeT-tz5i.js.map +0 -1
  212. prefect/server/ui-v2/assets/automation._id-CMiura1b.js +0 -2
  213. prefect/server/ui-v2/assets/base-job-template-form-section-MeO0M71Y.js +0 -2
  214. prefect/server/ui-v2/assets/base-job-template-form-section-MeO0M71Y.js.map +0 -1
  215. prefect/server/ui-v2/assets/block-type-details-Bcb9qEO8.js +0 -2
  216. prefect/server/ui-v2/assets/block-type-details-Bcb9qEO8.js.map +0 -1
  217. prefect/server/ui-v2/assets/block-type-logo-DuvU7goV.js +0 -2
  218. prefect/server/ui-v2/assets/block._id-DFR6zmOy.js +0 -2
  219. prefect/server/ui-v2/assets/block._id-DFR6zmOy.js.map +0 -1
  220. prefect/server/ui-v2/assets/catalog-CPzaK8QS.js +0 -2
  221. prefect/server/ui-v2/assets/catalog-CPzaK8QS.js.map +0 -1
  222. prefect/server/ui-v2/assets/catalog_._slug-60h4tERz.js +0 -2
  223. prefect/server/ui-v2/assets/catalog_._slug-60h4tERz.js.map +0 -1
  224. prefect/server/ui-v2/assets/concurrency-limit._id-BFfR6_U0.js +0 -2
  225. prefect/server/ui-v2/assets/concurrency-limit._id-BFfR6_U0.js.map +0 -1
  226. prefect/server/ui-v2/assets/create-BrNwbpVu.js +0 -2
  227. prefect/server/ui-v2/assets/create-DWgkh2HT.js.map +0 -1
  228. prefect/server/ui-v2/assets/deployment-form-B33C7F2u.js +0 -3
  229. prefect/server/ui-v2/assets/deployment-form-B33C7F2u.js.map +0 -1
  230. prefect/server/ui-v2/assets/deployment._id-5rPcPD0T.js +0 -2
  231. prefect/server/ui-v2/assets/deployment._id-5rPcPD0T.js.map +0 -1
  232. prefect/server/ui-v2/assets/deployment._id-DXrb6frJ.js.map +0 -1
  233. prefect/server/ui-v2/assets/deployment_._id.duplicate-D7YLydeq.js +0 -2
  234. prefect/server/ui-v2/assets/deployment_._id.duplicate-D7YLydeq.js.map +0 -1
  235. prefect/server/ui-v2/assets/deployment_._id.edit-Daq0J0Ow.js +0 -2
  236. prefect/server/ui-v2/assets/deployment_._id.edit-Daq0J0Ow.js.map +0 -1
  237. prefect/server/ui-v2/assets/deployment_._id.run-CnacOmhY.js +0 -2
  238. prefect/server/ui-v2/assets/event._eventDate._eventId-CKTuT_8S.js +0 -2
  239. prefect/server/ui-v2/assets/flow-run-graph-OrT2Osbu.js +0 -2
  240. prefect/server/ui-v2/assets/flow-run-graph-OrT2Osbu.js.map +0 -1
  241. prefect/server/ui-v2/assets/flow-run._id-BKv9Meqc.js.map +0 -1
  242. prefect/server/ui-v2/assets/flow-run._id-DCYAnq0D.js +0 -4
  243. prefect/server/ui-v2/assets/flow-run._id-DCYAnq0D.js.map +0 -1
  244. prefect/server/ui-v2/assets/flow-run._id-ZTkjj6bM.js.map +0 -1
  245. prefect/server/ui-v2/assets/flow-runs-pagination-CykMKOhv.js +0 -2
  246. prefect/server/ui-v2/assets/flow-runs-pagination-CykMKOhv.js.map +0 -1
  247. prefect/server/ui-v2/assets/flow._id-DhrxqQmD.js +0 -2
  248. prefect/server/ui-v2/assets/flow._id-DhrxqQmD.js.map +0 -1
  249. prefect/server/ui-v2/assets/index-BIBIJufF.js.map +0 -1
  250. prefect/server/ui-v2/assets/index-BO60ehN6.js.map +0 -1
  251. prefect/server/ui-v2/assets/index-BS7fbJ2s.js +0 -2
  252. prefect/server/ui-v2/assets/index-BS7fbJ2s.js.map +0 -1
  253. prefect/server/ui-v2/assets/index-C5RMFRyZ.js.map +0 -1
  254. prefect/server/ui-v2/assets/index-D0R9_LIL.js.map +0 -1
  255. prefect/server/ui-v2/assets/index-D9cOtoSU.js.map +0 -1
  256. prefect/server/ui-v2/assets/index-DEpWUeaO.js +0 -2
  257. prefect/server/ui-v2/assets/index-DEpWUeaO.js.map +0 -1
  258. prefect/server/ui-v2/assets/index-DP8W-xJo.js.map +0 -1
  259. prefect/server/ui-v2/assets/index-DfKXdmko.js.map +0 -1
  260. prefect/server/ui-v2/assets/index-DiVKp6rW.js +0 -2
  261. prefect/server/ui-v2/assets/index-DiVKp6rW.js.map +0 -1
  262. prefect/server/ui-v2/assets/index-DlAHvqFx.js +0 -2
  263. prefect/server/ui-v2/assets/index-VNFzALsC.js +0 -2
  264. prefect/server/ui-v2/assets/index-VNFzALsC.js.map +0 -1
  265. prefect/server/ui-v2/assets/index-V_xTKaEb.js.map +0 -1
  266. prefect/server/ui-v2/assets/index-WIq8QUNT.js +0 -2
  267. prefect/server/ui-v2/assets/index-WIq8QUNT.js.map +0 -1
  268. prefect/server/ui-v2/assets/index-m9O-nIOl.css +0 -1
  269. prefect/server/ui-v2/assets/index-q5Y3hlDT.js.map +0 -1
  270. prefect/server/ui-v2/assets/key._key-CX8FwfwL.js +0 -2
  271. prefect/server/ui-v2/assets/key._key-CX8FwfwL.js.map +0 -1
  272. prefect/server/ui-v2/assets/task-run._id-CQGeAiBh.js.map +0 -1
  273. prefect/server/ui-v2/assets/task-runs-pagination-CYoOghEN.js +0 -2
  274. prefect/server/ui-v2/assets/task-runs-pagination-CYoOghEN.js.map +0 -1
  275. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-DZplMJDW.js +0 -2
  276. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-DZplMJDW.js.map +0 -1
  277. prefect/server/ui-v2/assets/use-flow-runs-selected-rows-1YE-VIgM.js +0 -2
  278. prefect/server/ui-v2/assets/use-flow-runs-selected-rows-1YE-VIgM.js.map +0 -1
  279. prefect/server/ui-v2/assets/use-stepper-CnGJHRLP.js +0 -2
  280. prefect/server/ui-v2/assets/use-stepper-CnGJHRLP.js.map +0 -1
  281. prefect/server/ui-v2/assets/work-pool-filter-CGfXNujK.js +0 -2
  282. prefect/server/ui-v2/assets/work-pool-filter-CGfXNujK.js.map +0 -1
  283. prefect/server/ui-v2/assets/work-pool_._workPoolName.queue._workQueueName-BlFjSdoB.js.map +0 -1
  284. {prefect-3.6.16.dev5.dist-info → prefect-3.6.16.dev6.dist-info}/WHEEL +0 -0
  285. {prefect-3.6.16.dev5.dist-info → prefect-3.6.16.dev6.dist-info}/entry_points.txt +0 -0
  286. {prefect-3.6.16.dev5.dist-info → prefect-3.6.16.dev6.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"automation-wizard-RlOhF90R.js","sources":["../../src/components/automations/automations-wizard/actions-step/action-type-select.tsx","../../src/components/automations/automations-wizard/actions-step/loading-select-state.tsx","../../src/components/automations/automations-wizard/actions-step/call-webhook-fields.tsx","../../src/components/automations/automations-wizard/actions-step/change-flow-run-fields.tsx","../../src/components/automations/automations-wizard/actions-step/flow-run-action-description.tsx","../../src/components/automations/automations-wizard/actions-step/select-automations-fields.tsx","../../src/api/deployments/use-list-deployments-with-flows/use-list-deployments-with-flows.ts","../../src/components/automations/automations-wizard/actions-step/select-deployments-fields.tsx","../../src/components/automations/automations-wizard/actions-step/select-work-pools-fields.tsx","../../src/components/automations/automations-wizard/actions-step/select-work-queues-fields.tsx","../../src/components/automations/automations-wizard/actions-step/send-notification-fields.tsx","../../src/components/automations/automations-wizard/actions-step/action-step.tsx","../../src/components/automations/automations-wizard/actions-step/actions-step.tsx","../../src/components/automations/automations-wizard/details-step/details-step.tsx","../../src/components/automations/automations-wizard/trigger-step/custom-posture-select/index.tsx","../../src/components/ui/duration-input/index.tsx","../../src/components/automations/automations-wizard/trigger-step/event-resource-combobox/event-resource-combobox.tsx","../../src/components/automations/automations-wizard/trigger-step/events-combobox/events-combobox.tsx","../../src/components/automations/automations-wizard/trigger-step/custom-trigger-fields.tsx","../../src/components/automations/automations-wizard/trigger-step/automation-deployment-combobox/index.tsx","../../src/components/automations/automations-wizard/trigger-step/posture-select.tsx","../../src/components/automations/automations-wizard/trigger-step/deployment-status-trigger-fields.tsx","../../src/components/flows/flow-multi-select/flow-multi-select.tsx","../../src/components/automations/automations-wizard/trigger-step/state-multi-select.tsx","../../src/components/automations/automations-wizard/trigger-step/flow-run-state-trigger-fields.tsx","../../src/components/automations/automations-wizard/trigger-step/form-mode-toggle.tsx","../../src/components/automations/automations-wizard/trigger-step/trigger-json-input.tsx","../../src/components/automations/automations-wizard/automations-trigger-template-select/automations-trigger-template-select.tsx","../../src/components/automations/automations-wizard/trigger-step/trigger-step-utils.ts","../../src/components/work-pools/work-pool-multi-select/work-pool-multi-select.tsx","../../src/components/automations/automations-wizard/trigger-step/work-pool-status-trigger-fields.tsx","../../src/components/automations/automations-wizard/trigger-step/work-pools-combobox.tsx","../../src/components/automations/automations-wizard/trigger-step/work-queues-combobox.tsx","../../src/components/automations/automations-wizard/trigger-step/work-queue-status-trigger-fields.tsx","../../src/components/automations/automations-wizard/trigger-step/trigger-step.tsx","../../src/components/automations/automations-wizard/automation-wizard.tsx"],"sourcesContent":["import { useFormContext } from \"react-hook-form\";\n\nimport {\n\ttype ActionType,\n\ttype AutomationWizardSchema,\n\tUNASSIGNED,\n} from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n} from \"@/components/ui/form\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectGroup,\n\tSelectItem,\n\tSelectLabel,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\n\nconst AUTOMATION_ACTION_TYPES: Partial<Record<ActionType, string>> = {\n\t\"cancel-flow-run\": \"Cancel a flow run\",\n\t\"suspend-flow-run\": \"Suspend a flow run\",\n\t\"resume-flow-run\": \"Resume a flow run\",\n\t\"change-flow-run-state\": \"Change flow run's state\",\n\t\"run-deployment\": \"Run a deployment\",\n\t\"pause-deployment\": \"Pause a deployment\",\n\t\"resume-deployment\": \"Resume a deployment\",\n\t\"pause-work-queue\": \"Pause a work queue\",\n\t\"resume-work-queue\": \"Resume a work queue\",\n\t\"pause-work-pool\": \"Pause a work pool\",\n\t\"resume-work-pool\": \"Resume a work pool\",\n\t\"pause-automation\": \"Pause an automation\",\n\t\"resume-automation\": \"Resume an automation\",\n\t\"send-notification\": \"Send a notification\",\n\t\"call-webhook\": \"Call a webhook\",\n};\n\nexport const ActionTypeSelect = ({ index }: { index: number }) => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\treturn (\n\t\t<FormField\n\t\t\tcontrol={form.control}\n\t\t\tname={`actions.${index}.type`}\n\t\t\trender={({ field }) => (\n\t\t\t\t<FormItem>\n\t\t\t\t\t<FormLabel>Action Type</FormLabel>\n\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\t{...field}\n\t\t\t\t\t\t\tonValueChange={(type: ActionType) => {\n\t\t\t\t\t\t\t\tfield.onChange(type);\n\t\t\t\t\t\t\t\tconst defaultActionField = getDefaultActionField({\n\t\t\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (defaultActionField) {\n\t\t\t\t\t\t\t\t\tform.setValue(defaultActionField, UNASSIGNED);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<SelectTrigger aria-label=\"select action\" className=\"w-full\">\n\t\t\t\t\t\t\t\t<SelectValue placeholder=\"Select action\" />\n\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t<SelectGroup>\n\t\t\t\t\t\t\t\t\t<SelectLabel>Actions</SelectLabel>\n\t\t\t\t\t\t\t\t\t{Object.keys(AUTOMATION_ACTION_TYPES).map((key) => (\n\t\t\t\t\t\t\t\t\t\t<SelectItem key={key} value={key}>\n\t\t\t\t\t\t\t\t\t\t\t{AUTOMATION_ACTION_TYPES[key as ActionType]}\n\t\t\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</SelectGroup>\n\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t</Select>\n\t\t\t\t\t</FormControl>\n\t\t\t\t</FormItem>\n\t\t\t)}\n\t\t/>\n\t);\n};\n\n/**\n * @returns form field name to be set that is associated with the passed `type` arg\n */\nfunction getDefaultActionField({\n\tindex,\n\ttype,\n}: {\n\tindex: number;\n\ttype: ActionType;\n}) {\n\tswitch (type) {\n\t\tcase \"run-deployment\":\n\t\tcase \"pause-deployment\":\n\t\tcase \"resume-deployment\":\n\t\t\treturn `actions.${index}.deployment_id` as const;\n\t\tcase \"pause-work-queue\":\n\t\tcase \"resume-work-queue\":\n\t\t\treturn `actions.${index}.work_queue_id` as const;\n\t\tcase \"pause-work-pool\":\n\t\tcase \"resume-work-pool\":\n\t\t\treturn `actions.${index}.work_pool_id` as const;\n\t\tcase \"pause-automation\":\n\t\tcase \"resume-automation\":\n\t\t\treturn `actions.${index}.automation_id` as const;\n\t\t// TODO: add these back in once we have field names for them\n\t\t// case \"send-notification\":\n\t\t// case \"cancel-flow-run\":\n\t\t// case \"suspend-flow-run\":\n\t\t// case \"resume-flow-run\":\n\t\t// case \"change-flow-run-state\":\n\t\tdefault:\n\t\t\treturn null;\n\t}\n}\n","import { Skeleton } from \"@/components/ui/skeleton\";\n\nconst DEFAULT_NUM_SKELETONS = 4;\n\ntype LoadingSelectStateProps = {\n\tlength?: number;\n};\n\nexport const LoadingSelectState = ({\n\tlength = DEFAULT_NUM_SKELETONS,\n}: LoadingSelectStateProps) =>\n\tArray.from({ length }, (_, index) => (\n\t\t// biome-ignore lint/suspicious/noArrayIndexKey: ok for loading skeletons\n\t\t<Skeleton key={index} className=\"mt-2 p-4 h-2 w-full\" />\n\t));\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { useValidateTemplate } from \"@/api/automations\";\nimport {\n\ttype BlockDocument,\n\tbuildListFilterBlockDocumentsQuery,\n} from \"@/api/block-documents\";\nimport { buildListFilterBlockTypesQuery } from \"@/api/block-types\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport useDebounce from \"@/hooks/use-debounce\";\nimport { LoadingSelectState } from \"./loading-select-state\";\n\ntype CallWebhookFieldsProps = {\n\tindex: number;\n};\n\nexport const CallWebhookFields = ({ index }: CallWebhookFieldsProps) => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst [search, setSearch] = useState(\"\");\n\n\tconst { data: blockTypes, isLoading: isLoadingBlockTypes } = useQuery(\n\t\tbuildListFilterBlockTypesQuery({\n\t\t\toffset: 0,\n\t\t\tblock_types: { slug: { any_: [\"webhook\"] } },\n\t\t}),\n\t);\n\n\tconst blockTypeSlugs = useMemo(\n\t\t() => blockTypes?.map((bt) => bt.slug) ?? [],\n\t\t[blockTypes],\n\t);\n\n\tconst { data: blockDocuments, isLoading: isLoadingBlockDocuments } = useQuery(\n\t\tbuildListFilterBlockDocumentsQuery(\n\t\t\t{\n\t\t\t\tblock_types:\n\t\t\t\t\tblockTypeSlugs.length > 0\n\t\t\t\t\t\t? { slug: { any_: blockTypeSlugs } }\n\t\t\t\t\t\t: undefined,\n\t\t\t\tinclude_secrets: false,\n\t\t\t\tsort: \"BLOCK_TYPE_AND_NAME_ASC\",\n\t\t\t\toffset: 0,\n\t\t\t},\n\t\t\t{ enabled: blockTypeSlugs.length > 0 },\n\t\t),\n\t);\n\n\tconst isLoading = isLoadingBlockTypes || isLoadingBlockDocuments;\n\n\tconst groupedBlockDocuments = useMemo(() => {\n\t\tif (!blockTypes || !blockDocuments) return [];\n\n\t\treturn blockTypes\n\t\t\t.map((blockType) => ({\n\t\t\t\tblockType,\n\t\t\t\tdocuments: blockDocuments.filter(\n\t\t\t\t\t(doc) => doc.block_type_id === blockType.id,\n\t\t\t\t),\n\t\t\t}))\n\t\t\t.filter((group) => group.documents.length > 0);\n\t}, [blockTypes, blockDocuments]);\n\n\tconst filteredGroups = useMemo(() => {\n\t\tif (!search) return groupedBlockDocuments;\n\n\t\tconst lowerSearch = search.toLowerCase();\n\t\treturn groupedBlockDocuments\n\t\t\t.map((group) => ({\n\t\t\t\t...group,\n\t\t\t\tdocuments: group.documents.filter((doc) =>\n\t\t\t\t\tdoc.name?.toLowerCase().includes(lowerSearch),\n\t\t\t\t),\n\t\t\t}))\n\t\t\t.filter((group) => group.documents.length > 0);\n\t}, [groupedBlockDocuments, search]);\n\n\tconst getSelectedBlockDocument = useCallback(\n\t\t(blockDocumentId: string | undefined): BlockDocument | undefined => {\n\t\t\tif (!blockDocumentId || !blockDocuments) return undefined;\n\t\t\treturn blockDocuments.find((doc) => doc.id === blockDocumentId);\n\t\t},\n\t\t[blockDocuments],\n\t);\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname={`actions.${index}.block_document_id`}\n\t\t\t\trender={({ field }) => {\n\t\t\t\t\tconst selectedDoc = getSelectedBlockDocument(field.value);\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<FormItem className=\"flex flex-col\">\n\t\t\t\t\t\t\t<FormLabel>Block</FormLabel>\n\t\t\t\t\t\t\t<Combobox>\n\t\t\t\t\t\t\t\t<ComboboxTrigger\n\t\t\t\t\t\t\t\t\tselected={Boolean(selectedDoc)}\n\t\t\t\t\t\t\t\t\taria-label=\"Select webhook block\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{selectedDoc ? selectedDoc.name : \"Select a webhook block\"}\n\t\t\t\t\t\t\t\t</ComboboxTrigger>\n\t\t\t\t\t\t\t\t<ComboboxContent>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\t\t\t\t\t\tplaceholder=\"Search for a block...\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandEmtpy>\n\t\t\t\t\t\t\t\t\t\tNo webhook blocks found\n\t\t\t\t\t\t\t\t\t</ComboboxCommandEmtpy>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t\t\t\t\t\t{isLoading ? (\n\t\t\t\t\t\t\t\t\t\t\t<LoadingSelectState />\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\tfilteredGroups.map((group) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandGroup\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={group.blockType.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\theading={group.blockType.name}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{group.documents.map((doc) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={doc.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={doc.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === doc.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={field.onChange}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{doc.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</ComboboxCommandList>\n\t\t\t\t\t\t\t\t</ComboboxContent>\n\t\t\t\t\t\t\t</Combobox>\n\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t);\n\t\t\t\t}}\n\t\t\t/>\n\n\t\t\t<PayloadField index={index} />\n\n\t\t\t<div className=\"flex items-start gap-2 rounded-md border border-blue-200 bg-blue-50 p-3 text-sm text-blue-800 dark:border-blue-800 dark:bg-blue-950 dark:text-blue-200\">\n\t\t\t\t<Icon id=\"Info\" className=\"mt-0.5 size-4 shrink-0\" />\n\t\t\t\t<p>\n\t\t\t\t\tIn addition to any fields present on the triggering event, the\n\t\t\t\t\tfollowing objects can be used in webhook payload templates:{\" \"}\n\t\t\t\t\t<code className=\"rounded bg-blue-100 px-1 py-0.5 font-mono text-xs dark:bg-blue-900\">\n\t\t\t\t\t\tflow\n\t\t\t\t\t</code>\n\t\t\t\t\t,{\" \"}\n\t\t\t\t\t<code className=\"rounded bg-blue-100 px-1 py-0.5 font-mono text-xs dark:bg-blue-900\">\n\t\t\t\t\t\tdeployment\n\t\t\t\t\t</code>\n\t\t\t\t\t,{\" \"}\n\t\t\t\t\t<code className=\"rounded bg-blue-100 px-1 py-0.5 font-mono text-xs dark:bg-blue-900\">\n\t\t\t\t\t\tflow_run\n\t\t\t\t\t</code>\n\t\t\t\t\t,{\" \"}\n\t\t\t\t\t<code className=\"rounded bg-blue-100 px-1 py-0.5 font-mono text-xs dark:bg-blue-900\">\n\t\t\t\t\t\twork_pool\n\t\t\t\t\t</code>\n\t\t\t\t\t, and{\" \"}\n\t\t\t\t\t<code className=\"rounded bg-blue-100 px-1 py-0.5 font-mono text-xs dark:bg-blue-900\">\n\t\t\t\t\t\twork_queue\n\t\t\t\t\t</code>\n\t\t\t\t\t.\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\ntype PayloadFieldProps = {\n\tindex: number;\n};\n\nconst PayloadField = ({ index }: PayloadFieldProps) => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst { validateTemplate } = useValidateTemplate();\n\tconst [validationError, setValidationError] = useState<string | null>(null);\n\tconst [isValidating, setIsValidating] = useState(false);\n\n\tconst fieldValue = form.watch(`actions.${index}.payload`);\n\tconst debouncedValue = useDebounce(fieldValue, 1000);\n\n\tuseEffect(() => {\n\t\tconst validate = async () => {\n\t\t\tif (!debouncedValue || debouncedValue.trim() === \"\") {\n\t\t\t\tsetValidationError(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetIsValidating(true);\n\t\t\ttry {\n\t\t\t\tconst result = await validateTemplate(debouncedValue);\n\t\t\t\tif (result.valid) {\n\t\t\t\t\tsetValidationError(null);\n\t\t\t\t} else {\n\t\t\t\t\tsetValidationError(result.error);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tsetValidationError(null);\n\t\t\t} finally {\n\t\t\t\tsetIsValidating(false);\n\t\t\t}\n\t\t};\n\n\t\tvoid validate();\n\t}, [debouncedValue, validateTemplate]);\n\n\treturn (\n\t\t<FormField\n\t\t\tcontrol={form.control}\n\t\t\tname={`actions.${index}.payload`}\n\t\t\trender={({ field }) => (\n\t\t\t\t<FormItem>\n\t\t\t\t\t<FormLabel className=\"flex items-center gap-2\">\n\t\t\t\t\t\tPayload\n\t\t\t\t\t\t{isValidating && (\n\t\t\t\t\t\t\t<Icon id=\"Loader2\" className=\"size-3 animate-spin\" />\n\t\t\t\t\t\t)}\n\t\t\t\t\t</FormLabel>\n\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t<Textarea\n\t\t\t\t\t\t\t{...field}\n\t\t\t\t\t\t\tvalue={field.value ?? \"\"}\n\t\t\t\t\t\t\tplaceholder=\"Enter webhook payload...\"\n\t\t\t\t\t\t\tclassName={validationError ? \"border-destructive\" : \"\"}\n\t\t\t\t\t\t\trows={5}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</FormControl>\n\t\t\t\t\t{validationError && (\n\t\t\t\t\t\t<p className=\"text-sm text-destructive\">{validationError}</p>\n\t\t\t\t\t)}\n\t\t\t\t\t<FormMessage />\n\t\t\t\t</FormItem>\n\t\t\t)}\n\t\t/>\n\t);\n};\n","import { useFormContext } from \"react-hook-form\";\nimport { RUN_STATES } from \"@/api/flow-runs/constants\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { Input } from \"@/components/ui/input\";\nimport { StateSelect } from \"@/components/ui/state-select\";\nimport { Textarea } from \"@/components/ui/textarea\";\n\ntype ChangeFlowRunStateFieldsProps = {\n\tindex: number;\n};\n\nexport const ChangeFlowRunStateFields = ({\n\tindex,\n}: ChangeFlowRunStateFieldsProps) => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst stateField = form.watch(`actions.${index}.state`);\n\n\treturn (\n\t\t<>\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname={`actions.${index}.state`}\n\t\t\t\trender={({ field }) => (\n\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t<FormLabel>State</FormLabel>\n\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t<StateSelect value={field.value} onValueChange={field.onChange} />\n\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t</FormItem>\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname={`actions.${index}.name`}\n\t\t\t\trender={({ field }) => (\n\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t<FormLabel>Name</FormLabel>\n\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t{...field}\n\t\t\t\t\t\t\t\tvalue={field.value ?? \"\"}\n\t\t\t\t\t\t\t\tplaceholder={stateField ? RUN_STATES[stateField] : undefined}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t</FormItem>\n\t\t\t\t)}\n\t\t\t/>\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname={`actions.${index}.message`}\n\t\t\t\trender={({ field }) => (\n\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t<FormLabel>Message</FormLabel>\n\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t<Textarea\n\t\t\t\t\t\t\t\t{...field}\n\t\t\t\t\t\t\t\tplaceholder=\"State changed by Automation <id>\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t</FormItem>\n\t\t\t\t)}\n\t\t\t/>\n\t\t</>\n\t);\n};\n","type FlowRunActionDescriptionProps = {\n\taction: \"Suspend\" | \"Cancel\" | \"Resume\";\n};\n\nexport const FlowRunActionDescription = ({\n\taction,\n}: FlowRunActionDescriptionProps) => {\n\t// Vue uses different text for resume vs cancel/suspend:\n\t// - Cancel/Suspend: \"{Action} flow run inferred from the triggering event\"\n\t// - Resume: \"Resume a flow run inferred from the triggering event\"\n\tconst text =\n\t\taction === \"Resume\"\n\t\t\t? \"Resume a flow run inferred from the triggering event\"\n\t\t\t: `${action} flow run inferred from the triggering event`;\n\n\treturn <p className=\"text-sm text-muted-foreground\">{text}</p>;\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { type Automation, buildListAutomationsQuery } from \"@/api/automations\";\nimport {\n\ttype AutomationWizardSchema,\n\tUNASSIGNED,\n} from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport {\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { LoadingSelectState } from \"./loading-select-state\";\n\nconst INFER_OPTION = {\n\tvalue: UNASSIGNED,\n\tname: \"Infer Automation\",\n} as const;\n\ntype SelectAutomationsFieldsProps = {\n\taction: \"Pause\" | \"Resume\";\n\tindex: number;\n};\n\nconst getButtonLabel = (\n\tdata: Array<Automation> | undefined,\n\tfieldValue: string | null,\n) => {\n\tif (fieldValue === INFER_OPTION.value) {\n\t\treturn INFER_OPTION.name;\n\t}\n\tconst automation = data?.find((automation) => automation.id === fieldValue);\n\tif (automation) {\n\t\treturn automation.name;\n\t}\n\treturn undefined;\n};\n\nexport const SelectAutomationsFields = ({\n\taction,\n\tindex,\n}: SelectAutomationsFieldsProps) => {\n\tconst [search, setSearch] = useState(\"\");\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst { data, isSuccess } = useQuery(buildListAutomationsQuery());\n\n\t// nb: because automations API does not have filtering _like by name, do client-side filtering\n\tconst deferredSearch = useDeferredValue(search);\n\tconst filteredData = useMemo(() => {\n\t\tif (!data) {\n\t\t\treturn [];\n\t\t}\n\t\treturn data.filter((automation) =>\n\t\t\tautomation.name.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [data, deferredSearch]);\n\n\tconst isInferredOptionFiltered = INFER_OPTION.name\n\t\t.toLowerCase()\n\t\t.includes(deferredSearch.toLowerCase());\n\n\treturn (\n\t\t<FormField\n\t\t\tcontrol={form.control}\n\t\t\tname={`actions.${index}.automation_id`}\n\t\t\trender={({ field }) => {\n\t\t\t\tconst buttonLabel = getButtonLabel(data, field.value);\n\t\t\t\treturn (\n\t\t\t\t\t<FormItem className=\"flex flex-col\">\n\t\t\t\t\t\t<FormLabel>Automation To {action}</FormLabel>\n\t\t\t\t\t\t<Combobox>\n\t\t\t\t\t\t\t<ComboboxTrigger\n\t\t\t\t\t\t\t\tselected={Boolean(buttonLabel)}\n\t\t\t\t\t\t\t\taria-label={`Select Automation to ${action}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{buttonLabel ?? \"Select automation\"}\n\t\t\t\t\t\t\t</ComboboxTrigger>\n\t\t\t\t\t\t\t<ComboboxContent>\n\t\t\t\t\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\t\t\t\t\tplaceholder=\"Search for an automation...\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<ComboboxCommandEmtpy>No automation found</ComboboxCommandEmtpy>\n\t\t\t\t\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t\t\t{isInferredOptionFiltered && (\n\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === INFER_OPTION.value}\n\t\t\t\t\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tfield.onChange(value);\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\tvalue={INFER_OPTION.value}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{INFER_OPTION.name}\n\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{isSuccess ? (\n\t\t\t\t\t\t\t\t\t\t\tfilteredData.map((automation) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={automation.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === automation.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tfield.onChange(value);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={automation.id}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{automation.name}\n\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<LoadingSelectState />\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t</ComboboxCommandList>\n\t\t\t\t\t\t\t</ComboboxContent>\n\t\t\t\t\t\t</Combobox>\n\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t</FormItem>\n\t\t\t\t);\n\t\t\t}}\n\t\t/>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useMemo } from \"react\";\nimport {\n\tbuildPaginateDeploymentsQuery,\n\ttype Deployment,\n\ttype DeploymentsPaginationFilter,\n} from \"@/api/deployments\";\nimport { buildListFlowsQuery, type Flow } from \"@/api/flows\";\n\nexport type DeploymentWithFlow = Deployment & {\n\tflow: Flow | undefined;\n};\n\n/**\n * A hook that is used to get a pagination list of Deployments, with flow data joined\n *\n * @returns a pagination list of deployments, joined with flow data\n *\n * @example\n * ```tsx\nfunction DeploymentListWithFlows() {\n\tconst { data, status } = useListDeploymentsWithFlows();\n \n\tif (data) {\n\t\treturn (\n\t\t\t<ul>\n\t\t\t\t{data.results.map((deployment) => {\n\t\t\t\t\tconst label = deployment.flow\n\t\t\t\t\t\t? `${deployment.flow.name} > ${deployment.name}`\n\t\t\t\t\t\t: deployment.name;\n\t\t\t\t\treturn <li key={deployment.id}>{label}</li>;\n\t\t\t\t})}\n\t\t\t</ul>\n\t\t);\n\t}\n\n\tif (status === \"error\") {\n\t\treturn <p>Error has occurred</p>;\n\t}\n\n\treturn <div>Loading...</div>;\n}\n * ```\n */\nexport const useListDeploymentsWithFlows = (\n\tfilter: DeploymentsPaginationFilter = {\n\t\tpage: 1,\n\t\tlimit: 100,\n\t\tsort: \"NAME_ASC\",\n\t},\n) => {\n\tconst { data: deploymentsData, status: deploymentsStatus } = useQuery(\n\t\tbuildPaginateDeploymentsQuery(filter),\n\t);\n\n\t// Creates a set of unique flow ids\n\tconst deploymentsFlowIds = new Set(\n\t\tdeploymentsData?.results.map((deployment) => deployment.flow_id),\n\t);\n\n\tconst { data: flowsData, status: flowsStatus } = useQuery(\n\t\tbuildListFlowsQuery(\n\t\t\t{\n\t\t\t\tflows: {\n\t\t\t\t\toperator: \"or_\",\n\t\t\t\t\tid: { any_: Array.from(deploymentsFlowIds) },\n\t\t\t\t},\n\t\t\t\tsort: \"NAME_DESC\",\n\t\t\t\toffset: 0,\n\t\t\t},\n\t\t\t{ enabled: deploymentsFlowIds.size > 0 },\n\t\t),\n\t);\n\n\treturn useMemo(() => {\n\t\tif (flowsData && deploymentsData) {\n\t\t\tconst flowMap = new Map<string, Flow>(\n\t\t\t\tflowsData.map((flow) => [flow.id, flow]),\n\t\t\t);\n\t\t\t// Normalize data per deployment with deployment & flow\n\t\t\tconst deploymentsWithFlows = deploymentsData.results.map(\n\t\t\t\t(deployment) => ({\n\t\t\t\t\t...deployment,\n\t\t\t\t\tflow: flowMap.get(deployment.flow_id),\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tconst { count, limit, pages, page } = deploymentsData;\n\t\t\tconst retData = {\n\t\t\t\tcount,\n\t\t\t\tlimit,\n\t\t\t\tpages,\n\t\t\t\tpage,\n\t\t\t\tresults: deploymentsWithFlows,\n\t\t\t};\n\t\t\treturn {\n\t\t\t\tdata: retData,\n\t\t\t\tstatus: \"success\",\n\t\t\t};\n\t\t}\n\n\t\tif (flowsStatus === \"error\" || deploymentsStatus === \"error\") {\n\t\t\treturn {\n\t\t\t\tdata: undefined,\n\t\t\t\tstatus: \"error\",\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tdata: undefined,\n\t\t\tstatus: \"pending\",\n\t\t};\n\t}, [deploymentsData, deploymentsStatus, flowsData, flowsStatus]);\n};\n","import { useState } from \"react\";\nimport { useFormContext, useWatch } from \"react-hook-form\";\nimport type { DeploymentWithFlow } from \"@/api/deployments\";\nimport { useListDeploymentsWithFlows } from \"@/api/deployments/use-list-deployments-with-flows\";\nimport {\n\ttype AutomationWizardSchema,\n\tUNASSIGNED,\n} from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport {\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { Icon } from \"@/components/ui/icons\";\nimport useDebounce from \"@/hooks/use-debounce\";\nimport { LoadingSelectState } from \"./loading-select-state\";\n\nconst INFER_OPTION = {\n\tvalue: UNASSIGNED,\n\tname: \"Infer Deployment\",\n} as const;\n\nconst getButtonLabel = (\n\tdata: Array<DeploymentWithFlow> | undefined,\n\tfieldValue: string | null,\n) => {\n\tif (fieldValue === INFER_OPTION.value) {\n\t\treturn INFER_OPTION.name;\n\t}\n\tconst deployment = data?.find((d) => d.id === fieldValue);\n\tif (!deployment) {\n\t\treturn undefined;\n\t}\n\treturn <DeploymentLabel deploymentWithFlow={deployment} />;\n};\n\ntype SelectDeploymentsFieldsProps = {\n\taction: \"Run\" | \"Pause\" | \"Resume\";\n\tindex: number;\n};\n\nexport const SelectDeploymentsFields = ({\n\taction,\n\tindex,\n}: SelectDeploymentsFieldsProps) => {\n\tconst [search, setSearch] = useState(\"\");\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst actionType = form.watch(`actions.${index}.type`);\n\tconst deploymentId = useWatch<AutomationWizardSchema>({\n\t\tname: `actions.${index}.deployment_id`,\n\t});\n\n\tconst debouncedSearch = useDebounce(search, 500);\n\tconst { data } = useListDeploymentsWithFlows({\n\t\tpage: 1,\n\t\tsort: \"NAME_ASC\",\n\t\tdeployments: {\n\t\t\toperator: \"or_\",\n\t\t\tflow_or_deployment_name: {\n\t\t\t\tlike_: debouncedSearch,\n\t\t\t},\n\t\t},\n\t});\n\n\tconst isInferredOptionFiltered = INFER_OPTION.name\n\t\t.toLowerCase()\n\t\t.includes(search.toLowerCase());\n\n\tconst deploymentsWithFlows = data?.results;\n\n\treturn (\n\t\t<>\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname={`actions.${index}.deployment_id`}\n\t\t\t\trender={({ field }) => {\n\t\t\t\t\tconst buttonLabel = getButtonLabel(deploymentsWithFlows, field.value);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<FormItem className=\"flex flex-col\">\n\t\t\t\t\t\t\t<FormLabel>Deployment To {action}</FormLabel>\n\t\t\t\t\t\t\t<Combobox>\n\t\t\t\t\t\t\t\t<ComboboxTrigger\n\t\t\t\t\t\t\t\t\tselected={Boolean(buttonLabel)}\n\t\t\t\t\t\t\t\t\taria-label={`Select Deployment to ${action}`}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{buttonLabel ?? \"Select deployment\"}\n\t\t\t\t\t\t\t\t</ComboboxTrigger>\n\t\t\t\t\t\t\t\t<ComboboxContent>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\t\t\t\t\t\tplaceholder=\"Search for an deployment...\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandEmtpy>\n\t\t\t\t\t\t\t\t\t\tNo deployment found\n\t\t\t\t\t\t\t\t\t</ComboboxCommandEmtpy>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t\t\t\t{isInferredOptionFiltered && (\n\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === INFER_OPTION.value}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={field.onChange}\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={INFER_OPTION.value}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{INFER_OPTION.name}\n\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t{deploymentsWithFlows ? (\n\t\t\t\t\t\t\t\t\t\t\t\tdeploymentsWithFlows.map((deployment) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\taria-label={deployment.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={deployment.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === deployment.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={field.onChange}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={deployment.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<DeploymentLabel deploymentWithFlow={deployment} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t<LoadingSelectState />\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t\t</ComboboxCommandList>\n\t\t\t\t\t\t\t\t</ComboboxContent>\n\t\t\t\t\t\t\t</Combobox>\n\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t);\n\t\t\t\t}}\n\t\t\t/>\n\t\t\t{deploymentId !== INFER_OPTION.value &&\n\t\t\t\tactionType === \"run-deployment\" && <div>TODO: Additional fields</div>}\n\t\t</>\n\t);\n};\n\ntype DeploymentLabelProps = {\n\tdeploymentWithFlow: DeploymentWithFlow;\n};\nconst DeploymentLabel = ({ deploymentWithFlow }: DeploymentLabelProps) => {\n\tif (deploymentWithFlow.flow) {\n\t\treturn (\n\t\t\t<div className=\"flex items-center gap-0.5\">\n\t\t\t\t<div>{deploymentWithFlow.flow.name}</div>\n\t\t\t\t<Icon className=\"size-4\" id=\"ChevronRight\" />\n\t\t\t\t<div>{deploymentWithFlow.name}</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn deploymentWithFlow.name;\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { buildFilterWorkPoolsQuery, type WorkPool } from \"@/api/work-pools\";\nimport {\n\ttype AutomationWizardSchema,\n\tUNASSIGNED,\n} from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport {\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { LoadingSelectState } from \"./loading-select-state\";\n\nconst INFER_OPTION = {\n\tvalue: UNASSIGNED,\n\tname: \"Infer Work Pool\" as const,\n} as const;\n\ntype SelectWorkPoolFieldsProps = {\n\taction: \"Pause\" | \"Resume\";\n\tindex: number;\n};\n\nconst getButtonLabel = (\n\tdata: Array<WorkPool> | undefined,\n\tfieldValue: string | null,\n) => {\n\tif (fieldValue === INFER_OPTION.value) {\n\t\treturn INFER_OPTION.name;\n\t}\n\tconst workPool = data?.find((wp) => wp.id === fieldValue);\n\tif (workPool) {\n\t\treturn workPool.name;\n\t}\n\treturn undefined;\n};\n\nexport const SelectWorkPoolsFields = ({\n\taction,\n\tindex,\n}: SelectWorkPoolFieldsProps) => {\n\tconst [search, setSearch] = useState(\"\");\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst { data, isSuccess } = useQuery(buildFilterWorkPoolsQuery());\n\n\t// nb: because work pools API does not have filtering _like by name, do client-side filtering\n\tconst deferredSearch = useDeferredValue(search);\n\tconst filteredData = useMemo(() => {\n\t\tif (!data) {\n\t\t\treturn [];\n\t\t}\n\t\treturn data.filter((workPool) =>\n\t\t\tworkPool.name.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [data, deferredSearch]);\n\n\tconst isInferredOptionFiltered = INFER_OPTION.name\n\t\t.toLowerCase()\n\t\t.includes(deferredSearch.toLowerCase());\n\n\treturn (\n\t\t<FormField\n\t\t\tcontrol={form.control}\n\t\t\tname={`actions.${index}.work_pool_id`}\n\t\t\trender={({ field }) => {\n\t\t\t\tconst buttonLabel = getButtonLabel(data, field.value);\n\t\t\t\treturn (\n\t\t\t\t\t<FormItem className=\"flex flex-col\">\n\t\t\t\t\t\t<FormLabel>Work Pool To {action}</FormLabel>\n\t\t\t\t\t\t<Combobox>\n\t\t\t\t\t\t\t<ComboboxTrigger\n\t\t\t\t\t\t\t\tselected={Boolean(buttonLabel)}\n\t\t\t\t\t\t\t\taria-label={`Select Work Pool to ${action}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{buttonLabel ?? \"Select Work Pool\"}\n\t\t\t\t\t\t\t</ComboboxTrigger>\n\t\t\t\t\t\t\t<ComboboxContent>\n\t\t\t\t\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\t\t\t\t\tplaceholder=\"Search for a work pool...\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<ComboboxCommandEmtpy>No work pool found</ComboboxCommandEmtpy>\n\t\t\t\t\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t\t\t{isInferredOptionFiltered && (\n\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === INFER_OPTION.value}\n\t\t\t\t\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tfield.onChange(value);\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\tvalue={INFER_OPTION.value}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{INFER_OPTION.name}\n\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{isSuccess ? (\n\t\t\t\t\t\t\t\t\t\t\tfilteredData.map((workPool) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={workPool.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === workPool.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tfield.onChange(value);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={workPool.id}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{workPool.name}\n\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<LoadingSelectState />\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t</ComboboxCommandList>\n\t\t\t\t\t\t\t</ComboboxContent>\n\t\t\t\t\t\t</Combobox>\n\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t</FormItem>\n\t\t\t\t);\n\t\t\t}}\n\t\t/>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { buildFilterWorkQueuesQuery, type WorkQueue } from \"@/api/work-queues\";\nimport {\n\ttype AutomationWizardSchema,\n\tUNASSIGNED,\n} from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport {\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { LoadingSelectState } from \"./loading-select-state\";\n\nconst INFER_OPTION = {\n\tvalue: UNASSIGNED,\n\tname: \"Infer Work Queue\" as const,\n} as const;\n\ntype SelectWorkQueuesFieldsProps = {\n\taction: \"Pause\" | \"Resume\";\n\tindex: number;\n};\n\nconst getButtonLabel = (\n\tdata: Array<WorkQueue> | undefined,\n\tfieldValue: string | null,\n) => {\n\tif (fieldValue === INFER_OPTION.value) {\n\t\treturn INFER_OPTION.name;\n\t}\n\tconst workQueue = data?.find((wq) => wq.id === fieldValue);\n\tif (workQueue) {\n\t\treturn workQueue.name;\n\t}\n\treturn undefined;\n};\n\nexport const SelectWorkQueuesFields = ({\n\taction,\n\tindex,\n}: SelectWorkQueuesFieldsProps) => {\n\tconst [search, setSearch] = useState(\"\");\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst { data } = useQuery(buildFilterWorkQueuesQuery());\n\n\t// nb: because work queues API does not have filtering _like by name, do client-side filtering\n\tconst deferredSearch = useDeferredValue(search);\n\n\t// Filters data, but returns as a map of work_pool_name vs work queues\n\tconst filteredMap = useMemo(() => {\n\t\tif (!data) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst filteredMap = new Map<string, Array<WorkQueue>>();\n\t\tconst filteredWorkQueues = data.filter((workQueue) =>\n\t\t\tworkQueue.name.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t\tfor (const wq of filteredWorkQueues) {\n\t\t\tconst { work_pool_name } = wq;\n\t\t\tif (!work_pool_name) {\n\t\t\t\tthrow new Error(\"'work_pool_name expected\");\n\t\t\t}\n\t\t\tfilteredMap.set(work_pool_name, [\n\t\t\t\t...(filteredMap.get(work_pool_name) ?? []),\n\t\t\t\twq,\n\t\t\t]);\n\t\t}\n\n\t\treturn filteredMap;\n\t}, [data, deferredSearch]);\n\n\tconst isInferredOptionFiltered = INFER_OPTION.name\n\t\t.toLowerCase()\n\t\t.includes(deferredSearch.toLowerCase());\n\n\treturn (\n\t\t<FormField\n\t\t\tcontrol={form.control}\n\t\t\tname={`actions.${index}.work_queue_id`}\n\t\t\trender={({ field }) => {\n\t\t\t\tconst buttonLabel = getButtonLabel(data, field.value);\n\t\t\t\treturn (\n\t\t\t\t\t<FormItem className=\"flex flex-col\">\n\t\t\t\t\t\t<FormLabel>Work Queue To {action}</FormLabel>\n\t\t\t\t\t\t<Combobox>\n\t\t\t\t\t\t\t<ComboboxTrigger\n\t\t\t\t\t\t\t\tselected={Boolean(buttonLabel)}\n\t\t\t\t\t\t\t\taria-label={`Select Work Queue to ${action}`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{buttonLabel ?? \"Select Work Queue\"}\n\t\t\t\t\t\t\t</ComboboxTrigger>\n\t\t\t\t\t\t\t<ComboboxContent>\n\t\t\t\t\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\t\t\t\t\tplaceholder=\"Search for a work queue...\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<ComboboxCommandEmtpy>No work queue found</ComboboxCommandEmtpy>\n\t\t\t\t\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t\t\t{isInferredOptionFiltered && (\n\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === INFER_OPTION.value}\n\t\t\t\t\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\tfield.onChange(value);\n\t\t\t\t\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\tvalue={INFER_OPTION.value}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{INFER_OPTION.name}\n\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t{filteredMap ? (\n\t\t\t\t\t\t\t\t\t\t\tArray.from(filteredMap).map(\n\t\t\t\t\t\t\t\t\t\t\t\t([workPoolName, workQueues]) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div key={workPoolName} className=\"border-b\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem disabled>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{workPoolName}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{workQueues.map((workQueue) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={workQueue.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === workQueue.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={(value) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tfield.onChange(value);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={workQueue.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{workQueue.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t))}\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),\n\t\t\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t<LoadingSelectState />\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t</ComboboxCommandList>\n\t\t\t\t\t\t\t</ComboboxContent>\n\t\t\t\t\t\t</Combobox>\n\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t</FormItem>\n\t\t\t\t);\n\t\t\t}}\n\t\t/>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { useValidateTemplate } from \"@/api/automations\";\nimport {\n\ttype BlockDocument,\n\tbuildListFilterBlockDocumentsQuery,\n} from \"@/api/block-documents\";\nimport { buildListFilterBlockTypesQuery } from \"@/api/block-types\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { Input } from \"@/components/ui/input\";\nimport { Textarea } from \"@/components/ui/textarea\";\nimport useDebounce from \"@/hooks/use-debounce\";\nimport { LoadingSelectState } from \"./loading-select-state\";\n\ntype SendNotificationFieldsProps = {\n\tindex: number;\n};\n\nexport const SendNotificationFields = ({\n\tindex,\n}: SendNotificationFieldsProps) => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst [search, setSearch] = useState(\"\");\n\n\tconst { data: blockTypes, isLoading: isLoadingBlockTypes } = useQuery(\n\t\tbuildListFilterBlockTypesQuery({\n\t\t\toffset: 0,\n\t\t\tblock_schemas: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tblock_capabilities: { all_: [\"notify\"] },\n\t\t\t},\n\t\t}),\n\t);\n\n\tconst blockTypeSlugs = useMemo(\n\t\t() => blockTypes?.map((bt) => bt.slug) ?? [],\n\t\t[blockTypes],\n\t);\n\n\tconst { data: blockDocuments, isLoading: isLoadingBlockDocuments } = useQuery(\n\t\tbuildListFilterBlockDocumentsQuery(\n\t\t\t{\n\t\t\t\tblock_types:\n\t\t\t\t\tblockTypeSlugs.length > 0\n\t\t\t\t\t\t? { slug: { any_: blockTypeSlugs } }\n\t\t\t\t\t\t: undefined,\n\t\t\t\tinclude_secrets: false,\n\t\t\t\tsort: \"BLOCK_TYPE_AND_NAME_ASC\",\n\t\t\t\toffset: 0,\n\t\t\t},\n\t\t\t{ enabled: blockTypeSlugs.length > 0 },\n\t\t),\n\t);\n\n\tconst isLoading = isLoadingBlockTypes || isLoadingBlockDocuments;\n\n\tconst groupedBlockDocuments = useMemo(() => {\n\t\tif (!blockTypes || !blockDocuments) return [];\n\n\t\treturn blockTypes\n\t\t\t.map((blockType) => ({\n\t\t\t\tblockType,\n\t\t\t\tdocuments: blockDocuments.filter(\n\t\t\t\t\t(doc) => doc.block_type_id === blockType.id,\n\t\t\t\t),\n\t\t\t}))\n\t\t\t.filter((group) => group.documents.length > 0);\n\t}, [blockTypes, blockDocuments]);\n\n\tconst filteredGroups = useMemo(() => {\n\t\tif (!search) return groupedBlockDocuments;\n\n\t\tconst lowerSearch = search.toLowerCase();\n\t\treturn groupedBlockDocuments\n\t\t\t.map((group) => ({\n\t\t\t\t...group,\n\t\t\t\tdocuments: group.documents.filter((doc) =>\n\t\t\t\t\tdoc.name?.toLowerCase().includes(lowerSearch),\n\t\t\t\t),\n\t\t\t}))\n\t\t\t.filter((group) => group.documents.length > 0);\n\t}, [groupedBlockDocuments, search]);\n\n\tconst getSelectedBlockDocument = useCallback(\n\t\t(blockDocumentId: string | undefined): BlockDocument | undefined => {\n\t\t\tif (!blockDocumentId || !blockDocuments) return undefined;\n\t\t\treturn blockDocuments.find((doc) => doc.id === blockDocumentId);\n\t\t},\n\t\t[blockDocuments],\n\t);\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname={`actions.${index}.block_document_id`}\n\t\t\t\trender={({ field }) => {\n\t\t\t\t\tconst selectedDoc = getSelectedBlockDocument(field.value);\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<FormItem className=\"flex flex-col\">\n\t\t\t\t\t\t\t<FormLabel>Block</FormLabel>\n\t\t\t\t\t\t\t<Combobox>\n\t\t\t\t\t\t\t\t<ComboboxTrigger\n\t\t\t\t\t\t\t\t\tselected={Boolean(selectedDoc)}\n\t\t\t\t\t\t\t\t\taria-label=\"Select notification block\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{selectedDoc\n\t\t\t\t\t\t\t\t\t\t? selectedDoc.name\n\t\t\t\t\t\t\t\t\t\t: \"Select a notification block\"}\n\t\t\t\t\t\t\t\t</ComboboxTrigger>\n\t\t\t\t\t\t\t\t<ComboboxContent>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\t\t\t\t\t\tplaceholder=\"Search for a block...\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandEmtpy>\n\t\t\t\t\t\t\t\t\t\tNo notification blocks found\n\t\t\t\t\t\t\t\t\t</ComboboxCommandEmtpy>\n\t\t\t\t\t\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t\t\t\t\t\t{isLoading ? (\n\t\t\t\t\t\t\t\t\t\t\t<LoadingSelectState />\n\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\tfilteredGroups.map((group) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandGroup\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={group.blockType.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\theading={group.blockType.name}\n\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{group.documents.map((doc) => (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={doc.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tvalue={doc.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tselected={field.value === doc.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonSelect={field.onChange}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t{doc.name}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</ComboboxCommandList>\n\t\t\t\t\t\t\t\t</ComboboxContent>\n\t\t\t\t\t\t\t</Combobox>\n\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t);\n\t\t\t\t}}\n\t\t\t/>\n\n\t\t\t<TemplateField\n\t\t\t\tindex={index}\n\t\t\t\tname=\"subject\"\n\t\t\t\tlabel=\"Subject\"\n\t\t\t\tplaceholder=\"Enter notification subject...\"\n\t\t\t/>\n\n\t\t\t<TemplateField\n\t\t\t\tindex={index}\n\t\t\t\tname=\"body\"\n\t\t\t\tlabel=\"Body\"\n\t\t\t\tplaceholder=\"Enter notification body...\"\n\t\t\t\tmultiline\n\t\t\t/>\n\n\t\t\t<div className=\"flex items-start gap-2 rounded-md border border-blue-200 bg-blue-50 p-3 text-sm text-blue-800 dark:border-blue-800 dark:bg-blue-950 dark:text-blue-200\">\n\t\t\t\t<Icon id=\"Info\" className=\"mt-0.5 size-4 shrink-0\" />\n\t\t\t\t<p>\n\t\t\t\t\tIn addition to any fields present on the triggering event, the\n\t\t\t\t\tfollowing objects can be used in notification templates:{\" \"}\n\t\t\t\t\t<code className=\"rounded bg-blue-100 px-1 py-0.5 font-mono text-xs dark:bg-blue-900\">\n\t\t\t\t\t\tflow\n\t\t\t\t\t</code>\n\t\t\t\t\t,{\" \"}\n\t\t\t\t\t<code className=\"rounded bg-blue-100 px-1 py-0.5 font-mono text-xs dark:bg-blue-900\">\n\t\t\t\t\t\tdeployment\n\t\t\t\t\t</code>\n\t\t\t\t\t,{\" \"}\n\t\t\t\t\t<code className=\"rounded bg-blue-100 px-1 py-0.5 font-mono text-xs dark:bg-blue-900\">\n\t\t\t\t\t\tflow_run\n\t\t\t\t\t</code>\n\t\t\t\t\t,{\" \"}\n\t\t\t\t\t<code className=\"rounded bg-blue-100 px-1 py-0.5 font-mono text-xs dark:bg-blue-900\">\n\t\t\t\t\t\twork_pool\n\t\t\t\t\t</code>\n\t\t\t\t\t,{\" \"}\n\t\t\t\t\t<code className=\"rounded bg-blue-100 px-1 py-0.5 font-mono text-xs dark:bg-blue-900\">\n\t\t\t\t\t\twork_queue\n\t\t\t\t\t</code>\n\t\t\t\t\t, and{\" \"}\n\t\t\t\t\t<code className=\"rounded bg-blue-100 px-1 py-0.5 font-mono text-xs dark:bg-blue-900\">\n\t\t\t\t\t\tmetric\n\t\t\t\t\t</code>\n\t\t\t\t\t.\n\t\t\t\t</p>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\ntype TemplateFieldProps = {\n\tindex: number;\n\tname: \"subject\" | \"body\";\n\tlabel: string;\n\tplaceholder?: string;\n\tmultiline?: boolean;\n};\n\nconst TemplateField = ({\n\tindex,\n\tname,\n\tlabel,\n\tplaceholder,\n\tmultiline = false,\n}: TemplateFieldProps) => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst { validateTemplate } = useValidateTemplate();\n\tconst [validationError, setValidationError] = useState<string | null>(null);\n\tconst [isValidating, setIsValidating] = useState(false);\n\n\tconst fieldValue = form.watch(`actions.${index}.${name}`);\n\tconst debouncedValue = useDebounce(fieldValue, 1000);\n\n\tuseEffect(() => {\n\t\tconst validate = async () => {\n\t\t\tif (!debouncedValue || debouncedValue.trim() === \"\") {\n\t\t\t\tsetValidationError(null);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetIsValidating(true);\n\t\t\ttry {\n\t\t\t\tconst result = await validateTemplate(debouncedValue);\n\t\t\t\tif (result.valid) {\n\t\t\t\t\tsetValidationError(null);\n\t\t\t\t} else {\n\t\t\t\t\tsetValidationError(result.error);\n\t\t\t\t}\n\t\t\t} catch {\n\t\t\t\tsetValidationError(null);\n\t\t\t} finally {\n\t\t\t\tsetIsValidating(false);\n\t\t\t}\n\t\t};\n\n\t\tvoid validate();\n\t}, [debouncedValue, validateTemplate]);\n\n\tconst InputComponent = multiline ? Textarea : Input;\n\n\treturn (\n\t\t<FormField\n\t\t\tcontrol={form.control}\n\t\t\tname={`actions.${index}.${name}`}\n\t\t\trender={({ field }) => (\n\t\t\t\t<FormItem>\n\t\t\t\t\t<FormLabel className=\"flex items-center gap-2\">\n\t\t\t\t\t\t{label}\n\t\t\t\t\t\t{isValidating && (\n\t\t\t\t\t\t\t<Icon id=\"Loader2\" className=\"size-3 animate-spin\" />\n\t\t\t\t\t\t)}\n\t\t\t\t\t</FormLabel>\n\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t<InputComponent\n\t\t\t\t\t\t\t{...field}\n\t\t\t\t\t\t\tvalue={field.value ?? \"\"}\n\t\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\t\tclassName={validationError ? \"border-destructive\" : \"\"}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</FormControl>\n\t\t\t\t\t{validationError && (\n\t\t\t\t\t\t<p className=\"text-sm text-destructive\">{validationError}</p>\n\t\t\t\t\t)}\n\t\t\t\t\t<FormMessage />\n\t\t\t\t</FormItem>\n\t\t\t)}\n\t\t/>\n\t);\n};\n","import { useWatch } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { ActionTypeSelect } from \"./action-type-select\";\nimport { CallWebhookFields } from \"./call-webhook-fields\";\nimport { ChangeFlowRunStateFields } from \"./change-flow-run-fields\";\nimport { FlowRunActionDescription } from \"./flow-run-action-description\";\nimport { SelectAutomationsFields } from \"./select-automations-fields\";\nimport { SelectDeploymentsFields } from \"./select-deployments-fields\";\nimport { SelectWorkPoolsFields } from \"./select-work-pools-fields\";\nimport { SelectWorkQueuesFields } from \"./select-work-queues-fields\";\nimport { SendNotificationFields } from \"./send-notification-fields\";\n\ntype ActionStepProps = {\n\tindex: number;\n\tonRemove: () => void;\n};\n\nexport const ActionStep = ({ index, onRemove }: ActionStepProps) => {\n\treturn (\n\t\t<div key={index} className=\"space-y-2\">\n\t\t\t<div className=\"flex justify-between items-center\">\n\t\t\t\t<p className=\"text-base font-semibold\">Action {index + 1}</p>\n\t\t\t\t<Button\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\taria-label={`remove action ${index + 1}`}\n\t\t\t\t\tonClick={onRemove}\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t>\n\t\t\t\t\t<Icon id=\"Trash2\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t\t<ActionTypeSelect index={index} />\n\t\t\t<ActionTypeAdditionalFields index={index} />\n\t\t\t<hr className=\"my-8\" />\n\t\t</div>\n\t);\n};\n\ntype ActionTypeAdditionalFieldsProps = {\n\tindex: number;\n};\n\nconst ActionTypeAdditionalFields = ({\n\tindex,\n}: ActionTypeAdditionalFieldsProps) => {\n\tconst actionType = useWatch<AutomationWizardSchema>({\n\t\tname: `actions.${index}.type`,\n\t});\n\tswitch (actionType) {\n\t\tcase \"change-flow-run-state\":\n\t\t\treturn <ChangeFlowRunStateFields index={index} />;\n\t\tcase \"run-deployment\":\n\t\t\treturn <SelectDeploymentsFields action=\"Run\" index={index} />;\n\t\tcase \"pause-deployment\":\n\t\t\treturn <SelectDeploymentsFields action=\"Pause\" index={index} />;\n\t\tcase \"resume-deployment\":\n\t\t\treturn <SelectDeploymentsFields action=\"Resume\" index={index} />;\n\t\tcase \"pause-work-queue\":\n\t\t\treturn <SelectWorkQueuesFields action=\"Pause\" index={index} />;\n\t\tcase \"resume-work-queue\":\n\t\t\treturn <SelectWorkQueuesFields action=\"Resume\" index={index} />;\n\t\tcase \"pause-work-pool\":\n\t\t\treturn <SelectWorkPoolsFields action=\"Pause\" index={index} />;\n\t\tcase \"resume-work-pool\":\n\t\t\treturn <SelectWorkPoolsFields action=\"Resume\" index={index} />;\n\t\tcase \"pause-automation\":\n\t\t\treturn <SelectAutomationsFields action=\"Pause\" index={index} />;\n\t\tcase \"resume-automation\":\n\t\t\treturn <SelectAutomationsFields action=\"Resume\" index={index} />;\n\t\tcase \"send-notification\":\n\t\t\treturn <SendNotificationFields index={index} />;\n\t\tcase \"call-webhook\":\n\t\t\treturn <CallWebhookFields index={index} />;\n\t\tcase \"cancel-flow-run\":\n\t\t\treturn <FlowRunActionDescription action=\"Cancel\" />;\n\t\tcase \"suspend-flow-run\":\n\t\t\treturn <FlowRunActionDescription action=\"Suspend\" />;\n\t\tcase \"resume-flow-run\":\n\t\t\treturn <FlowRunActionDescription action=\"Resume\" />;\n\t\tdefault:\n\t\t\treturn null;\n\t}\n};\n","import { useFieldArray, useFormContext } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { ActionStep } from \"./action-step\";\n\nexport const ActionsStep = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst { fields, append, remove } = useFieldArray({\n\t\tcontrol: form.control,\n\t\tname: \"actions\",\n\t\tshouldUnregister: false,\n\t\trules: { minLength: 1 },\n\t});\n\n\treturn (\n\t\t<div>\n\t\t\t{fields.map(({ id }, index) => (\n\t\t\t\t<ActionStep key={id} index={index} onRemove={() => remove(index)} />\n\t\t\t))}\n\t\t\t<Button\n\t\t\t\ttype=\"button\"\n\t\t\t\tvariant=\"outline\"\n\t\t\t\tonClick={() => append({ type: \"cancel-flow-run\" })}\n\t\t\t>\n\t\t\t\t<Icon id=\"Plus\" className=\"mr-2 size-4\" /> Add Action\n\t\t\t</Button>\n\t\t</div>\n\t);\n};\n","import { useFormContext } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { Input } from \"@/components/ui/input\";\n\nexport const DetailsStep = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname=\"name\"\n\t\t\t\trender={({ field }) => (\n\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t<FormLabel>Automation Name</FormLabel>\n\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t<Input type=\"text\" {...field} value={field.value ?? \"\"} />\n\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t</FormItem>\n\t\t\t\t)}\n\t\t\t/>\n\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname=\"description\"\n\t\t\t\trender={({ field }) => (\n\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t<FormLabel>Description (Optional)</FormLabel>\n\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t<Input type=\"text\" {...field} value={field.value ?? \"\"} />\n\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t</FormItem>\n\t\t\t\t)}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","import { useFormContext } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n} from \"@/components/ui/form\";\nimport { Label } from \"@/components/ui/label\";\nimport { RadioGroup, RadioGroupItem } from \"@/components/ui/radio-group\";\n\nconst POSTURE_OPTIONS = [\n\t{ value: \"Reactive\", label: \"Observe\" },\n\t{ value: \"Proactive\", label: \"Don't observe\" },\n] as const;\n\nconst DEFAULT_PROACTIVE_WITHIN = 30;\n\nexport const CustomPostureSelect = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\n\tconst handlePostureChange = (value: \"Reactive\" | \"Proactive\") => {\n\t\tconst previousPosture = form.getValues(\"trigger.posture\");\n\t\tform.setValue(\"trigger.posture\", value);\n\n\t\t// Move state values between expect and after when posture changes\n\t\t// Reactive uses \"expect\", Proactive uses \"after\"\n\t\tif (previousPosture === \"Reactive\" && value === \"Proactive\") {\n\t\t\tconst expectValues = form.getValues(\"trigger.expect\") ?? [];\n\t\t\tform.setValue(\"trigger.after\", expectValues);\n\t\t\tform.setValue(\"trigger.expect\", []);\n\t\t\tconst currentWithin = form.getValues(\"trigger.within\");\n\t\t\tif (currentWithin === 0) {\n\t\t\t\tform.setValue(\"trigger.within\", DEFAULT_PROACTIVE_WITHIN);\n\t\t\t}\n\t\t} else if (previousPosture === \"Proactive\" && value === \"Reactive\") {\n\t\t\tconst afterValues = form.getValues(\"trigger.after\") ?? [];\n\t\t\tform.setValue(\"trigger.expect\", afterValues);\n\t\t\tform.setValue(\"trigger.after\", []);\n\t\t}\n\t};\n\n\treturn (\n\t\t<FormField\n\t\t\tcontrol={form.control}\n\t\t\tname=\"trigger.posture\"\n\t\t\trender={({ field }) => (\n\t\t\t\t<FormItem>\n\t\t\t\t\t<FormLabel>When I</FormLabel>\n\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t<RadioGroup\n\t\t\t\t\t\t\tvalue={field.value}\n\t\t\t\t\t\t\tonValueChange={handlePostureChange}\n\t\t\t\t\t\t\tclassName=\"flex gap-4\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{POSTURE_OPTIONS.map((option) => (\n\t\t\t\t\t\t\t\t<div key={option.value} className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t\t<RadioGroupItem\n\t\t\t\t\t\t\t\t\t\tvalue={option.value}\n\t\t\t\t\t\t\t\t\t\tid={`custom-${option.value}`}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<Label htmlFor={`custom-${option.value}`}>\n\t\t\t\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t\t\t\t</Label>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</RadioGroup>\n\t\t\t\t\t</FormControl>\n\t\t\t\t</FormItem>\n\t\t\t)}\n\t\t/>\n\t);\n};\n","import { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { Input } from \"@/components/ui/input\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { cn } from \"@/utils\";\n\nconst SECONDS_IN_MINUTE = 60;\nconst SECONDS_IN_HOUR = 3600;\nconst SECONDS_IN_DAY = 86400;\n\ntype DurationUnit = {\n\tlabel: string;\n\tvalue: number;\n};\n\nconst DURATION_UNITS: DurationUnit[] = [\n\t{ label: \"Seconds\", value: 1 },\n\t{ label: \"Minutes\", value: SECONDS_IN_MINUTE },\n\t{ label: \"Hours\", value: SECONDS_IN_HOUR },\n\t{ label: \"Days\", value: SECONDS_IN_DAY },\n];\n\nfunction getDefaultUnitForValue(value: number): number {\n\tif (value > 0 && value % SECONDS_IN_DAY === 0) {\n\t\treturn SECONDS_IN_DAY;\n\t}\n\tif (value > 0 && value % SECONDS_IN_HOUR === 0) {\n\t\treturn SECONDS_IN_HOUR;\n\t}\n\tif (value > 0 && value % SECONDS_IN_MINUTE === 0) {\n\t\treturn SECONDS_IN_MINUTE;\n\t}\n\treturn 1;\n}\n\nexport type DurationInputProps = {\n\tvalue: number;\n\tonChange: (seconds: number) => void;\n\tmin?: number;\n\tmax?: number;\n\tclassName?: string;\n\tdisabled?: boolean;\n};\n\nexport function DurationInput({\n\tvalue,\n\tonChange,\n\tmin = 0,\n\tmax,\n\tclassName,\n\tdisabled = false,\n}: DurationInputProps) {\n\tconst [unit, setUnit] = useState<number>(() => getDefaultUnitForValue(value));\n\n\tconst availableUnits = useMemo(() => {\n\t\treturn DURATION_UNITS.filter((u) => u.value >= min);\n\t}, [min]);\n\n\tconst quantity = useMemo(() => {\n\t\treturn value / unit;\n\t}, [value, unit]);\n\n\tconst handleQuantityChange = useCallback(\n\t\t(newQuantity: number) => {\n\t\t\tlet newValue = newQuantity * unit;\n\t\t\tif (max !== undefined && newValue > max) {\n\t\t\t\tnewValue = max;\n\t\t\t}\n\t\t\tonChange(newValue);\n\t\t},\n\t\t[onChange, unit, max],\n\t);\n\n\tconst handleUnitChange = useCallback(\n\t\t(newUnitValue: string) => {\n\t\t\tconst newUnit = Number(newUnitValue);\n\t\t\tconst oldUnit = unit;\n\t\t\tsetUnit(newUnit);\n\t\t\tlet newValue = (value / oldUnit) * newUnit;\n\t\t\tif (max !== undefined && newValue > max) {\n\t\t\t\tnewValue = max;\n\t\t\t}\n\t\t\tonChange(newValue);\n\t\t},\n\t\t[onChange, unit, value, max],\n\t);\n\n\tuseEffect(() => {\n\t\tif (!availableUnits.some((u) => u.value === unit)) {\n\t\t\tconst firstAvailable = availableUnits[0];\n\t\t\tif (firstAvailable) {\n\t\t\t\tsetUnit(firstAvailable.value);\n\t\t\t}\n\t\t}\n\t}, [availableUnits, unit]);\n\n\treturn (\n\t\t<div className={cn(\"grid grid-cols-[1fr_7rem] gap-2 w-full\", className)}>\n\t\t\t<Input\n\t\t\t\ttype=\"number\"\n\t\t\t\tmin={0}\n\t\t\t\tvalue={quantity}\n\t\t\t\tonChange={(e) => handleQuantityChange(Number(e.target.value))}\n\t\t\t\tdisabled={disabled}\n\t\t\t\taria-label=\"Duration quantity\"\n\t\t\t/>\n\t\t\t<Select\n\t\t\t\tvalue={String(unit)}\n\t\t\t\tonValueChange={handleUnitChange}\n\t\t\t\tdisabled={disabled}\n\t\t\t>\n\t\t\t\t<SelectTrigger aria-label=\"Duration unit\">\n\t\t\t\t\t<SelectValue />\n\t\t\t\t</SelectTrigger>\n\t\t\t\t<SelectContent>\n\t\t\t\t\t{availableUnits.map((u) => (\n\t\t\t\t\t\t<SelectItem key={u.value} value={String(u.value)}>\n\t\t\t\t\t\t\t{u.label}\n\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t))}\n\t\t\t\t</SelectContent>\n\t\t\t</Select>\n\t\t</div>\n\t);\n}\n","import {\n\tuseCallback,\n\tuseDeferredValue,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport { useResourceOptions } from \"@/components/events/events-resource-filter/use-resource-options\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\n\nconst FALLBACK_MAX_DISPLAYED = 2;\nconst PLUS_N_WIDTH = 40;\n\nexport type EventResourceComboboxProps = {\n\tselectedResourceIds: string[];\n\tonToggleResource: (resourceId: string) => void;\n\temptyMessage?: string;\n};\n\ntype ResourceGroup = {\n\tlabel: string;\n\toptions: Array<{ label: string; value: string }>;\n};\n\nexport function EventResourceCombobox({\n\tselectedResourceIds,\n\tonToggleResource,\n\temptyMessage = \"All resources\",\n}: EventResourceComboboxProps) {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\tconst [containerWidth, setContainerWidth] = useState(0);\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\tconst measureRef = useRef<HTMLDivElement>(null);\n\n\t// Measure container width using ResizeObserver\n\tuseEffect(() => {\n\t\tconst container = containerRef.current;\n\t\tif (!container) return;\n\n\t\tconst observer = new ResizeObserver((entries) => {\n\t\t\tfor (const entry of entries) {\n\t\t\t\tsetContainerWidth(entry.contentRect.width);\n\t\t\t}\n\t\t});\n\n\t\tobserver.observe(container);\n\t\treturn () => observer.disconnect();\n\t}, []);\n\n\t// Use existing hook that fetches all resource types\n\tconst { resourceOptions } = useResourceOptions();\n\n\t// Group resources by type\n\tconst groupedResources = useMemo(() => {\n\t\tconst groups: ResourceGroup[] = [\n\t\t\t{ label: \"Automations\", options: [] },\n\t\t\t{ label: \"Blocks\", options: [] },\n\t\t\t{ label: \"Deployments\", options: [] },\n\t\t\t{ label: \"Flows\", options: [] },\n\t\t\t{ label: \"Work Pools\", options: [] },\n\t\t\t{ label: \"Work Queues\", options: [] },\n\t\t];\n\n\t\tfor (const resource of resourceOptions) {\n\t\t\tconst option = {\n\t\t\t\tlabel: resource.name,\n\t\t\t\tvalue: resource.resourceId,\n\t\t\t};\n\n\t\t\tswitch (resource.type) {\n\t\t\t\tcase \"automation\":\n\t\t\t\t\tgroups[0].options.push(option);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"block\":\n\t\t\t\t\tgroups[1].options.push(option);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"deployment\":\n\t\t\t\t\tgroups[2].options.push(option);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"flow\":\n\t\t\t\t\tgroups[3].options.push(option);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"work-pool\":\n\t\t\t\t\tgroups[4].options.push(option);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"work-queue\":\n\t\t\t\t\tgroups[5].options.push(option);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn groups\n\t\t\t.map((group) => ({\n\t\t\t\t...group,\n\t\t\t\toptions: group.options.sort((a, b) => a.label.localeCompare(b.label)),\n\t\t\t}))\n\t\t\t.filter((group) => group.options.length > 0);\n\t}, [resourceOptions]);\n\n\t// Filter based on search\n\tconst filteredGroups = useMemo(() => {\n\t\tif (!deferredSearch) return groupedResources;\n\t\tconst lower = deferredSearch.toLowerCase();\n\t\treturn groupedResources\n\t\t\t.map((group) => ({\n\t\t\t\t...group,\n\t\t\t\toptions: group.options.filter(\n\t\t\t\t\t(opt) =>\n\t\t\t\t\t\topt.label.toLowerCase().includes(lower) ||\n\t\t\t\t\t\topt.value.toLowerCase().includes(lower),\n\t\t\t\t),\n\t\t\t}))\n\t\t\t.filter((group) => group.options.length > 0);\n\t}, [groupedResources, deferredSearch]);\n\n\t// Check if search term could be a custom resource ID (must contain \".\")\n\tconst showCustomOption = useMemo(() => {\n\t\tif (!deferredSearch.trim()) return false;\n\t\tif (!deferredSearch.includes(\".\")) return false;\n\t\tconst lower = deferredSearch.toLowerCase();\n\t\treturn !resourceOptions.some(\n\t\t\t(opt) => opt.resourceId.toLowerCase() === lower,\n\t\t);\n\t}, [deferredSearch, resourceOptions]);\n\n\t// Calculate how many names fit in the available width\n\tconst calculateVisibleCount = useCallback(\n\t\t(names: string[]): number => {\n\t\t\tconst measureEl = measureRef.current;\n\t\t\tif (!measureEl || containerWidth === 0 || names.length === 0) {\n\t\t\t\treturn Math.min(names.length, FALLBACK_MAX_DISPLAYED);\n\t\t\t}\n\n\t\t\t// Available width for names (reserve space for \"+N\" if needed)\n\t\t\tconst availableWidth =\n\t\t\t\tnames.length > 1 ? containerWidth - PLUS_N_WIDTH : containerWidth;\n\n\t\t\tlet visibleCount = 0;\n\n\t\t\tfor (let i = 0; i < names.length; i++) {\n\t\t\t\t// Measure each name by temporarily setting content\n\t\t\t\tmeasureEl.textContent = names.slice(0, i + 1).join(\", \");\n\t\t\t\tconst nameWidth = measureEl.offsetWidth;\n\n\t\t\t\tif (nameWidth <= availableWidth) {\n\t\t\t\t\tvisibleCount = i + 1;\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If all names fit, return all\n\t\t\tif (visibleCount === names.length) {\n\t\t\t\treturn names.length;\n\t\t\t}\n\n\t\t\t// Return at least 1 name\n\t\t\treturn Math.max(1, visibleCount);\n\t\t},\n\t\t[containerWidth],\n\t);\n\n\tconst renderSelectedResources = () => {\n\t\tif (selectedResourceIds.length === 0) {\n\t\t\treturn <span className=\"text-muted-foreground\">{emptyMessage}</span>;\n\t\t}\n\t\tconst selectedNames = selectedResourceIds.map((id) => {\n\t\t\tconst resource = resourceOptions.find((r) => r.resourceId === id);\n\t\t\treturn resource?.name ?? id;\n\t\t});\n\n\t\tconst visibleCount = calculateVisibleCount(selectedNames);\n\t\tconst visible = selectedNames.slice(0, visibleCount);\n\t\tconst extraCount = selectedNames.length - visibleCount;\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={containerRef}\n\t\t\t\tclassName=\"flex flex-1 min-w-0 items-center gap-2\"\n\t\t\t>\n\t\t\t\t<div className=\"flex flex-1 min-w-0 items-center gap-2 overflow-hidden\">\n\t\t\t\t\t<span className=\"truncate\">{visible.join(\", \")}</span>\n\t\t\t\t</div>\n\t\t\t\t{extraCount > 0 && <p className=\"text-sm shrink-0\">+ {extraCount}</p>}\n\t\t\t\t{/* Hidden element for measuring text width */}\n\t\t\t\t<div\n\t\t\t\t\tref={measureRef}\n\t\t\t\t\tclassName=\"absolute invisible whitespace-nowrap\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t};\n\n\tconst handleSelect = (value: string) => {\n\t\tonToggleResource(value);\n\t\tsetSearch(\"\");\n\t};\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger selected={selectedResourceIds.length > 0}>\n\t\t\t\t{renderSelectedResources()}\n\t\t\t</ComboboxTrigger>\n\t\t\t<ComboboxContent>\n\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\tvalue={search}\n\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\tplaceholder=\"Search resources...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandEmtpy>No resources found</ComboboxCommandEmtpy>\n\t\t\t\t\t{showCustomOption && (\n\t\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey=\"__custom__\"\n\t\t\t\t\t\t\t\tselected={selectedResourceIds.includes(deferredSearch)}\n\t\t\t\t\t\t\t\tonSelect={() => handleSelect(deferredSearch)}\n\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\tvalue={deferredSearch}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tAdd &quot;{deferredSearch}&quot;\n\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t\t)}\n\t\t\t\t\t{filteredGroups.map((group) => (\n\t\t\t\t\t\t<ComboboxCommandGroup key={group.label} heading={group.label}>\n\t\t\t\t\t\t\t{group.options.map((option) => (\n\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\tkey={option.value}\n\t\t\t\t\t\t\t\t\tselected={selectedResourceIds.includes(option.value)}\n\t\t\t\t\t\t\t\t\tonSelect={() => handleSelect(option.value)}\n\t\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\t\tvalue={option.value}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t\t))}\n\t\t\t\t</ComboboxCommandList>\n\t\t\t</ComboboxContent>\n\t\t</Combobox>\n\t);\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { buildEventsCountQuery } from \"@/api/events\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\n\nexport type EventsComboboxProps = {\n\tselectedEvents: string[];\n\tonToggleEvent: (event: string) => void;\n\temptyMessage?: string;\n};\n\n/**\n * Generate wildcard prefix options from event names.\n * E.g., [\"prefect.flow-run.Completed\", \"prefect.flow-run.Failed\"]\n * generates [\"prefect.*\", \"prefect.flow-run.*\"]\n *\n * Only includes prefixes that match more than one event but not all events.\n */\nfunction getEventPrefixValues(events: string[]): string[] {\n\tconst prefixCounts = new Map<string, number>();\n\n\tfor (const event of events) {\n\t\tconst parts = event.split(\".\");\n\t\tfor (let i = 1; i < parts.length; i++) {\n\t\t\tconst prefix = parts.slice(0, i).join(\".\");\n\t\t\tprefixCounts.set(prefix, (prefixCounts.get(prefix) ?? 0) + 1);\n\t\t}\n\t}\n\n\treturn Array.from(prefixCounts.entries())\n\t\t.filter(([, count]) => count > 1 && count < events.length)\n\t\t.map(([prefix]) => `${prefix}.*`);\n}\n\nexport function EventsCombobox({\n\tselectedEvents,\n\tonToggleEvent,\n\temptyMessage = \"All events\",\n}: EventsComboboxProps) {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\n\t// Create a stable filter for the past week (computed once on mount)\n\tconst [occurredFilter] = useState(() => ({\n\t\tsince: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString(),\n\t\tuntil: new Date().toISOString(),\n\t}));\n\n\t// Fetch event counts for the past week\n\tconst { data: eventCounts = [] } = useQuery(\n\t\tbuildEventsCountQuery(\"event\", {\n\t\t\tfilter: {\n\t\t\t\toccurred: occurredFilter,\n\t\t\t\torder: \"DESC\",\n\t\t\t},\n\t\t\ttime_unit: \"day\",\n\t\t\ttime_interval: 1,\n\t\t}),\n\t);\n\n\t// Extract event labels and generate prefix options\n\tconst options = useMemo(() => {\n\t\tconst eventLabels = eventCounts.map((e) => e.label);\n\t\tconst prefixes = getEventPrefixValues(eventLabels);\n\t\treturn [...eventLabels, ...prefixes].sort((a, b) => a.localeCompare(b));\n\t}, [eventCounts]);\n\n\t// Filter options based on search\n\tconst filteredOptions = useMemo(() => {\n\t\tif (!deferredSearch) return options;\n\t\tconst lower = deferredSearch.toLowerCase();\n\t\treturn options.filter((opt) => opt.toLowerCase().includes(lower));\n\t}, [options, deferredSearch]);\n\n\t// Check if search term is a valid custom value\n\tconst showCustomOption = useMemo(() => {\n\t\tif (!deferredSearch.trim()) return false;\n\t\tconst lower = deferredSearch.toLowerCase();\n\t\treturn !options.some((opt) => opt.toLowerCase() === lower);\n\t}, [deferredSearch, options]);\n\n\tconst renderSelectedEvents = () => {\n\t\tif (selectedEvents.length === 0) {\n\t\t\treturn <span className=\"text-muted-foreground\">{emptyMessage}</span>;\n\t\t}\n\t\tconst visibleNames = selectedEvents.slice(0, 2);\n\t\tconst overflow = selectedEvents.length - visibleNames.length;\n\t\treturn (\n\t\t\t<div className=\"flex min-w-0 items-center justify-start gap-1\">\n\t\t\t\t<span className=\"truncate min-w-0 text-left\">\n\t\t\t\t\t{visibleNames.join(\", \")}\n\t\t\t\t</span>\n\t\t\t\t{overflow > 0 && (\n\t\t\t\t\t<span className=\"shrink-0 text-muted-foreground\">+{overflow}</span>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t};\n\n\tconst handleSelect = (value: string) => {\n\t\tonToggleEvent(value);\n\t\tsetSearch(\"\");\n\t};\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger selected={selectedEvents.length > 0}>\n\t\t\t\t{renderSelectedEvents()}\n\t\t\t</ComboboxTrigger>\n\t\t\t<ComboboxContent>\n\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\tvalue={search}\n\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\tplaceholder=\"Search events...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandEmtpy>No events found</ComboboxCommandEmtpy>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t{showCustomOption && (\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey=\"__custom__\"\n\t\t\t\t\t\t\t\tselected={selectedEvents.includes(deferredSearch)}\n\t\t\t\t\t\t\t\tonSelect={() => handleSelect(deferredSearch)}\n\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\tvalue={deferredSearch}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tAdd &quot;{deferredSearch}&quot;\n\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{filteredOptions.map((event) => (\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey={event}\n\t\t\t\t\t\t\t\tselected={selectedEvents.includes(event)}\n\t\t\t\t\t\t\t\tonSelect={() => handleSelect(event)}\n\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\tvalue={event}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{event}\n\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t</ComboboxCommandList>\n\t\t\t</ComboboxContent>\n\t\t</Combobox>\n\t);\n}\n","import { ChevronRight } from \"lucide-react\";\nimport { useFormContext, useWatch } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\tCollapsible,\n\tCollapsibleContent,\n\tCollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\nimport { DurationInput } from \"@/components/ui/duration-input\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { Input } from \"@/components/ui/input\";\nimport { CustomPostureSelect } from \"./custom-posture-select\";\nimport { EventResourceCombobox } from \"./event-resource-combobox\";\nimport { EventsCombobox } from \"./events-combobox\";\n\nexport const CustomTriggerFields = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst posture = useWatch<AutomationWizardSchema>({ name: \"trigger.posture\" });\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t<div className=\"flex items-end gap-4\">\n\t\t\t\t<CustomPostureSelect />\n\t\t\t</div>\n\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname=\"trigger.expect\"\n\t\t\t\trender={({ field }) => {\n\t\t\t\t\tconst events = field.value ?? [];\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t<FormLabel>Any event matching</FormLabel>\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<EventsCombobox\n\t\t\t\t\t\t\t\t\tselectedEvents={events}\n\t\t\t\t\t\t\t\t\tonToggleEvent={(event) => {\n\t\t\t\t\t\t\t\t\t\tconst newEvents = events.includes(event)\n\t\t\t\t\t\t\t\t\t\t\t? events.filter((e) => e !== event)\n\t\t\t\t\t\t\t\t\t\t\t: [...events, event];\n\t\t\t\t\t\t\t\t\t\tfield.onChange(newEvents);\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</FormControl>\n\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t);\n\t\t\t\t}}\n\t\t\t/>\n\n\t\t\t<FormField\n\t\t\t\tcontrol={form.control}\n\t\t\t\tname=\"trigger.match\"\n\t\t\t\trender={({ field }) => {\n\t\t\t\t\tconst resourceIds =\n\t\t\t\t\t\t(field.value?.[\"prefect.resource.id\"] as string[] | undefined) ??\n\t\t\t\t\t\t[];\n\t\t\t\t\tconst resourceIdsArray = Array.isArray(resourceIds)\n\t\t\t\t\t\t? resourceIds\n\t\t\t\t\t\t: [resourceIds];\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t<FormLabel>From the following resources</FormLabel>\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<EventResourceCombobox\n\t\t\t\t\t\t\t\t\tselectedResourceIds={resourceIdsArray}\n\t\t\t\t\t\t\t\t\tonToggleResource={(resourceId) => {\n\t\t\t\t\t\t\t\t\t\tconst newIds = resourceIdsArray.includes(resourceId)\n\t\t\t\t\t\t\t\t\t\t\t? resourceIdsArray.filter((id) => id !== resourceId)\n\t\t\t\t\t\t\t\t\t\t\t: [...resourceIdsArray, resourceId];\n\t\t\t\t\t\t\t\t\t\tif (newIds.length > 0) {\n\t\t\t\t\t\t\t\t\t\t\tfield.onChange({ \"prefect.resource.id\": newIds });\n\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\tfield.onChange({});\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</FormControl>\n\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t);\n\t\t\t\t}}\n\t\t\t/>\n\n\t\t\t<div className=\"flex items-end gap-2\">\n\t\t\t\t<FormField\n\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\tname=\"trigger.threshold\"\n\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t<FormItem className=\"w-20\">\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<Input\n\t\t\t\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\t\t\t\tmin={1}\n\t\t\t\t\t\t\t\t\t{...field}\n\t\t\t\t\t\t\t\t\tonChange={(e) => field.onChange(Number(e.target.value))}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t\t<span className=\"pb-2 text-sm text-muted-foreground\">times within</span>\n\t\t\t\t<FormField\n\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\tname=\"trigger.within\"\n\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<DurationInput\n\t\t\t\t\t\t\t\t\tvalue={field.value ?? 0}\n\t\t\t\t\t\t\t\t\tonChange={field.onChange}\n\t\t\t\t\t\t\t\t\tmin={posture === \"Proactive\" ? 10 : 0}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<Collapsible>\n\t\t\t\t<CollapsibleTrigger className=\"flex items-center gap-2 text-sm font-medium\">\n\t\t\t\t\t<ChevronRight className=\"h-4 w-4 transition-transform data-[state=open]:rotate-90\" />\n\t\t\t\t\tEvaluation Options\n\t\t\t\t</CollapsibleTrigger>\n\t\t\t\t<CollapsibleContent className=\"mt-4 space-y-4 pl-6\">\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\tname=\"trigger.after\"\n\t\t\t\t\t\trender={({ field }) => {\n\t\t\t\t\t\t\tconst events = field.value ?? [];\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t<FormLabel>\n\t\t\t\t\t\t\t\t\t\tEvaluate trigger only after observing an event matching\n\t\t\t\t\t\t\t\t\t</FormLabel>\n\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t<EventsCombobox\n\t\t\t\t\t\t\t\t\t\t\tselectedEvents={events}\n\t\t\t\t\t\t\t\t\t\t\tonToggleEvent={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst newEvents = events.includes(event)\n\t\t\t\t\t\t\t\t\t\t\t\t\t? events.filter((e) => e !== event)\n\t\t\t\t\t\t\t\t\t\t\t\t\t: [...events, event];\n\t\t\t\t\t\t\t\t\t\t\t\tfield.onChange(newEvents);\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\tname=\"trigger.match_related\"\n\t\t\t\t\t\trender={({ field }) => {\n\t\t\t\t\t\t\tconst resourceIds =\n\t\t\t\t\t\t\t\t(field.value?.[\"prefect.resource.id\"] as\n\t\t\t\t\t\t\t\t\t| string[]\n\t\t\t\t\t\t\t\t\t| undefined) ?? [];\n\t\t\t\t\t\t\tconst resourceIdsArray = Array.isArray(resourceIds)\n\t\t\t\t\t\t\t\t? resourceIds\n\t\t\t\t\t\t\t\t: [resourceIds];\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t\t\t<FormLabel>Filter for events related to</FormLabel>\n\t\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t\t<EventResourceCombobox\n\t\t\t\t\t\t\t\t\t\t\tselectedResourceIds={resourceIdsArray}\n\t\t\t\t\t\t\t\t\t\t\tonToggleResource={(resourceId) => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst newIds = resourceIdsArray.includes(resourceId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t? resourceIdsArray.filter((id) => id !== resourceId)\n\t\t\t\t\t\t\t\t\t\t\t\t\t: [...resourceIdsArray, resourceId];\n\t\t\t\t\t\t\t\t\t\t\t\tif (newIds.length > 0) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tfield.onChange({ \"prefect.resource.id\": newIds });\n\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t\t\t\tfield.onChange({});\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t\t\t</FormItem>\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</CollapsibleContent>\n\t\t\t</Collapsible>\n\t\t</div>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport {\n\tuseCallback,\n\tuseDeferredValue,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport {\n\tbuildFilterDeploymentsQuery,\n\ttype Deployment,\n} from \"@/api/deployments\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\n\nconst FALLBACK_MAX_DISPLAYED = 2;\nconst PLUS_N_WIDTH = 40;\n\ntype AutomationDeploymentComboboxProps = {\n\tselectedDeploymentIds: string[];\n\tonSelectDeploymentIds: (deploymentIds: string[]) => void;\n};\n\nexport const AutomationDeploymentCombobox = ({\n\tselectedDeploymentIds,\n\tonSelectDeploymentIds,\n}: AutomationDeploymentComboboxProps) => {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\tconst [containerWidth, setContainerWidth] = useState(0);\n\tconst containerRef = useRef<HTMLDivElement>(null);\n\tconst measureRef = useRef<HTMLDivElement>(null);\n\n\tconst selectedDeploymentsSet = useMemo(\n\t\t() => new Set(selectedDeploymentIds),\n\t\t[selectedDeploymentIds],\n\t);\n\n\t// Measure container width using ResizeObserver\n\tuseEffect(() => {\n\t\tconst container = containerRef.current;\n\t\tif (!container) return;\n\n\t\tconst observer = new ResizeObserver((entries) => {\n\t\t\tfor (const entry of entries) {\n\t\t\t\tsetContainerWidth(entry.contentRect.width);\n\t\t\t}\n\t\t});\n\n\t\tobserver.observe(container);\n\t\treturn () => observer.disconnect();\n\t}, []);\n\n\tconst { data: deployments = [] } = useQuery(\n\t\tbuildFilterDeploymentsQuery({\n\t\t\tdeployments: deferredSearch\n\t\t\t\t? {\n\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\tname: { like_: deferredSearch },\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\t\t\tlimit: 100,\n\t\t\toffset: 0,\n\t\t\tsort: \"NAME_ASC\",\n\t\t}),\n\t);\n\n\tconst { data: selectedDeploymentsData = [] } = useQuery(\n\t\tbuildFilterDeploymentsQuery(\n\t\t\t{\n\t\t\t\tdeployments:\n\t\t\t\t\tselectedDeploymentsSet.size > 0\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\tid: { any_: selectedDeploymentIds },\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: undefined,\n\t\t\t\tlimit: selectedDeploymentsSet.size || 1,\n\t\t\t\toffset: 0,\n\t\t\t\tsort: \"NAME_ASC\",\n\t\t\t},\n\t\t\t{ enabled: selectedDeploymentsSet.size > 0 },\n\t\t),\n\t);\n\n\tconst handleSelectDeployment = (deploymentId: string) => {\n\t\tconst updatedDeployments = new Set(selectedDeploymentsSet);\n\t\tif (selectedDeploymentsSet.has(deploymentId)) {\n\t\t\tupdatedDeployments.delete(deploymentId);\n\t\t} else {\n\t\t\tupdatedDeployments.add(deploymentId);\n\t\t}\n\t\tonSelectDeploymentIds(Array.from(updatedDeployments));\n\t};\n\n\tconst handleClearAll = () => {\n\t\tonSelectDeploymentIds([]);\n\t};\n\n\t// Calculate how many names fit in the available width\n\tconst calculateVisibleCount = useCallback(\n\t\t(names: string[]): number => {\n\t\t\tconst measureEl = measureRef.current;\n\t\t\tif (!measureEl || containerWidth === 0 || names.length === 0) {\n\t\t\t\treturn Math.min(names.length, FALLBACK_MAX_DISPLAYED);\n\t\t\t}\n\n\t\t\t// Available width for names (reserve space for \"+N\" if needed)\n\t\t\tconst availableWidth =\n\t\t\t\tnames.length > 1 ? containerWidth - PLUS_N_WIDTH : containerWidth;\n\n\t\t\tlet visibleCount = 0;\n\n\t\t\tfor (let i = 0; i < names.length; i++) {\n\t\t\t\t// Measure each name by temporarily setting content\n\t\t\t\tmeasureEl.textContent = names.slice(0, i + 1).join(\", \");\n\t\t\t\tconst nameWidth = measureEl.offsetWidth;\n\n\t\t\t\tif (nameWidth <= availableWidth) {\n\t\t\t\t\tvisibleCount = i + 1;\n\t\t\t\t} else {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// If all names fit, return all\n\t\t\tif (visibleCount === names.length) {\n\t\t\t\treturn names.length;\n\t\t\t}\n\n\t\t\t// Return at least 1 name\n\t\t\treturn Math.max(1, visibleCount);\n\t\t},\n\t\t[containerWidth],\n\t);\n\n\tconst renderSelectedDeployments = () => {\n\t\tif (selectedDeploymentsSet.size === 0) {\n\t\t\treturn \"All deployments\";\n\t\t}\n\n\t\tconst selectedDeploymentNames = selectedDeploymentsData\n\t\t\t.filter((deployment) => selectedDeploymentsSet.has(deployment.id))\n\t\t\t.map((deployment) => deployment.name);\n\n\t\tconst visibleCount = calculateVisibleCount(selectedDeploymentNames);\n\t\tconst visible = selectedDeploymentNames.slice(0, visibleCount);\n\t\tconst extraCount = selectedDeploymentNames.length - visibleCount;\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={containerRef}\n\t\t\t\tclassName=\"flex flex-1 min-w-0 items-center gap-2\"\n\t\t\t>\n\t\t\t\t<div className=\"flex flex-1 min-w-0 items-center gap-2 overflow-hidden\">\n\t\t\t\t\t<span className=\"truncate\">{visible.join(\", \")}</span>\n\t\t\t\t</div>\n\t\t\t\t{extraCount > 0 && <p className=\"text-sm shrink-0\">+ {extraCount}</p>}\n\t\t\t\t{/* Hidden element for measuring text width */}\n\t\t\t\t<div\n\t\t\t\t\tref={measureRef}\n\t\t\t\t\tclassName=\"absolute invisible whitespace-nowrap\"\n\t\t\t\t\taria-hidden=\"true\"\n\t\t\t\t/>\n\t\t\t</div>\n\t\t);\n\t};\n\n\tconst filteredDeployments = useMemo(() => {\n\t\treturn deployments.filter(\n\t\t\t(deployment: Deployment) =>\n\t\t\t\t!deferredSearch ||\n\t\t\t\tdeployment.name.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [deployments, deferredSearch]);\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger\n\t\t\t\taria-label=\"Select deployments\"\n\t\t\t\tselected={selectedDeploymentsSet.size === 0}\n\t\t\t>\n\t\t\t\t{renderSelectedDeployments()}\n\t\t\t</ComboboxTrigger>\n\t\t\t<ComboboxContent>\n\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\tvalue={search}\n\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\tplaceholder=\"Search deployments...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandEmtpy>No deployments found</ComboboxCommandEmtpy>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\taria-label=\"All deployments\"\n\t\t\t\t\t\t\tonSelect={handleClearAll}\n\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\tvalue=\"__all__\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Checkbox checked={selectedDeploymentsSet.size === 0} />\n\t\t\t\t\t\t\tAll deployments\n\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t{filteredDeployments.map((deployment: Deployment) => (\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey={deployment.id}\n\t\t\t\t\t\t\t\taria-label={deployment.name}\n\t\t\t\t\t\t\t\tonSelect={() => handleSelectDeployment(deployment.id)}\n\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\tvalue={deployment.id}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<Checkbox checked={selectedDeploymentsSet.has(deployment.id)} />\n\t\t\t\t\t\t\t\t{deployment.name}\n\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t</ComboboxCommandList>\n\t\t\t</ComboboxContent>\n\t\t</Combobox>\n\t);\n};\n","import { useFormContext } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport { FormControl, FormField, FormItem } from \"@/components/ui/form\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\n\nconst POSTURE_OPTIONS = [\n\t{ value: \"Reactive\", label: \"Enters\" },\n\t{ value: \"Proactive\", label: \"Stays in\" },\n] as const;\n\nconst DEFAULT_PROACTIVE_WITHIN = 30;\n\nexport const PostureSelect = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\n\treturn (\n\t\t<FormField\n\t\t\tcontrol={form.control}\n\t\t\tname=\"trigger.posture\"\n\t\t\trender={({ field }) => (\n\t\t\t\t<FormItem>\n\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\tvalue={field.value}\n\t\t\t\t\t\t\tonValueChange={(value: \"Reactive\" | \"Proactive\") => {\n\t\t\t\t\t\t\t\tconst previousPosture = field.value;\n\t\t\t\t\t\t\t\tfield.onChange(value);\n\n\t\t\t\t\t\t\t\t// Move state values between expect and after when posture changes\n\t\t\t\t\t\t\t\t// Reactive uses \"expect\", Proactive uses \"after\"\n\t\t\t\t\t\t\t\tif (previousPosture === \"Reactive\" && value === \"Proactive\") {\n\t\t\t\t\t\t\t\t\t// Moving from Reactive to Proactive: move expect to after\n\t\t\t\t\t\t\t\t\tconst expectValues = form.getValues(\"trigger.expect\") ?? [];\n\t\t\t\t\t\t\t\t\tform.setValue(\"trigger.after\", expectValues);\n\t\t\t\t\t\t\t\t\tform.setValue(\"trigger.expect\", []);\n\t\t\t\t\t\t\t\t\t// Set a default within value if it's 0\n\t\t\t\t\t\t\t\t\tconst currentWithin = form.getValues(\"trigger.within\");\n\t\t\t\t\t\t\t\t\tif (currentWithin === 0) {\n\t\t\t\t\t\t\t\t\t\tform.setValue(\"trigger.within\", DEFAULT_PROACTIVE_WITHIN);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\t\t\tpreviousPosture === \"Proactive\" &&\n\t\t\t\t\t\t\t\t\tvalue === \"Reactive\"\n\t\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\t\t// Moving from Proactive to Reactive: move after to expect\n\t\t\t\t\t\t\t\t\tconst afterValues = form.getValues(\"trigger.after\") ?? [];\n\t\t\t\t\t\t\t\t\tform.setValue(\"trigger.expect\", afterValues);\n\t\t\t\t\t\t\t\t\tform.setValue(\"trigger.after\", []);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<SelectTrigger aria-label=\"select posture\" className=\"w-[160px]\">\n\t\t\t\t\t\t\t\t<SelectValue placeholder=\"Select posture\" />\n\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t{POSTURE_OPTIONS.map((option) => (\n\t\t\t\t\t\t\t\t\t<SelectItem key={option.value} value={option.value}>\n\t\t\t\t\t\t\t\t\t\t{option.label}\n\t\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t</Select>\n\t\t\t\t\t</FormControl>\n\t\t\t\t</FormItem>\n\t\t\t)}\n\t\t/>\n\t);\n};\n","import { useCallback, useMemo } from \"react\";\nimport { useFormContext, useWatch } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport { DurationInput } from \"@/components/ui/duration-input\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { AutomationDeploymentCombobox } from \"./automation-deployment-combobox\";\nimport { PostureSelect } from \"./posture-select\";\n\nconst SECONDS_IN_DAY = 86400;\nconst MAX_WITHIN_SECONDS = 30 * SECONDS_IN_DAY;\n\nconst DEPLOYMENT_STATUSES = [\n\t{ value: \"prefect.deployment.ready\", label: \"Ready\" },\n\t{ value: \"prefect.deployment.not-ready\", label: \"Not Ready\" },\n\t{ value: \"prefect.deployment.disabled\", label: \"Disabled\" },\n];\n\nconst DEPLOYMENT_RESOURCE_PREFIX = \"prefect.deployment.\";\nconst ALL_DEPLOYMENTS_PATTERN = \"prefect.deployment.*\";\n\nconst extractDeploymentIds = (\n\tmatchValue: string | string[] | undefined,\n): string[] => {\n\tif (!matchValue) return [];\n\tconst values = Array.isArray(matchValue) ? matchValue : [matchValue];\n\treturn values\n\t\t.filter((v) => v !== ALL_DEPLOYMENTS_PATTERN)\n\t\t.map((v) => v.replace(DEPLOYMENT_RESOURCE_PREFIX, \"\"));\n};\n\nconst buildMatchPattern = (deploymentIds: string[]): string | string[] => {\n\tif (deploymentIds.length === 0) {\n\t\treturn ALL_DEPLOYMENTS_PATTERN;\n\t}\n\treturn deploymentIds.map((id) => `${DEPLOYMENT_RESOURCE_PREFIX}${id}`);\n};\n\nexport const DeploymentStatusTriggerFields = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst posture = useWatch<AutomationWizardSchema>({ name: \"trigger.posture\" });\n\tconst matchValue = useWatch<AutomationWizardSchema>({\n\t\tname: \"trigger.match\",\n\t});\n\n\tconst selectedDeploymentIds = useMemo(() => {\n\t\tconst match = matchValue as Record<string, string | string[]> | undefined;\n\t\tconst resourceId = match?.[\"prefect.resource.id\"];\n\t\treturn extractDeploymentIds(resourceId);\n\t}, [matchValue]);\n\n\tconst handleDeploymentIdsChange = useCallback(\n\t\t(deploymentIds: string[]) => {\n\t\t\tconst currentMatch = form.getValues(\"trigger.match\") ?? {};\n\t\t\tform.setValue(\"trigger.match\", {\n\t\t\t\t...currentMatch,\n\t\t\t\t\"prefect.resource.id\": buildMatchPattern(deploymentIds),\n\t\t\t});\n\t\t},\n\t\t[form],\n\t);\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t<FormItem>\n\t\t\t\t<FormLabel>Deployments</FormLabel>\n\t\t\t\t<FormControl>\n\t\t\t\t\t<AutomationDeploymentCombobox\n\t\t\t\t\t\tselectedDeploymentIds={selectedDeploymentIds}\n\t\t\t\t\t\tonSelectDeploymentIds={handleDeploymentIdsChange}\n\t\t\t\t\t/>\n\t\t\t\t</FormControl>\n\t\t\t</FormItem>\n\n\t\t\t<FormItem>\n\t\t\t\t<FormLabel>Deployment</FormLabel>\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"grid gap-2\"\n\t\t\t\t\tstyle={{ gridTemplateColumns: \"10rem 1fr\" }}\n\t\t\t\t>\n\t\t\t\t\t<PostureSelect />\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\tname=\"trigger.expect\"\n\t\t\t\t\t\trender={({ field }) => {\n\t\t\t\t\t\t\tconst selectedStatus = field.value?.[0];\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\t\t\tvalue={selectedStatus ?? \"\"}\n\t\t\t\t\t\t\t\t\tonValueChange={(value) => field.onChange([value])}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<SelectTrigger className=\"w-full\">\n\t\t\t\t\t\t\t\t\t\t<SelectValue placeholder=\"Select status\" />\n\t\t\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t\t\t{DEPLOYMENT_STATUSES.map((status) => (\n\t\t\t\t\t\t\t\t\t\t\t<SelectItem key={status.value} value={status.value}>\n\t\t\t\t\t\t\t\t\t\t\t\t{status.label}\n\t\t\t\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t\t\t</Select>\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</div>\n\t\t\t</FormItem>\n\n\t\t\t{posture === \"Proactive\" && (\n\t\t\t\t<FormField\n\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\tname=\"trigger.within\"\n\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t<FormLabel>Within</FormLabel>\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<DurationInput\n\t\t\t\t\t\t\t\t\tvalue={field.value ?? 0}\n\t\t\t\t\t\t\t\t\tonChange={field.onChange}\n\t\t\t\t\t\t\t\t\tmin={10}\n\t\t\t\t\t\t\t\t\tmax={MAX_WITHIN_SECONDS}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { buildListFlowsQuery, type Flow } from \"@/api/flows\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\n\nconst MAX_VISIBLE_FLOWS = 2;\n\ntype FlowMultiSelectProps = {\n\tselectedFlowIds: string[];\n\tonToggleFlow: (flowId: string) => void;\n\temptyMessage?: string;\n};\n\nexport function FlowMultiSelect({\n\tselectedFlowIds,\n\tonToggleFlow,\n\temptyMessage = \"Any flow\",\n}: FlowMultiSelectProps) {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\n\tconst { data: flows = [] } = useQuery(\n\t\tbuildListFlowsQuery({\n\t\t\tflows: deferredSearch\n\t\t\t\t? {\n\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\tname: { like_: deferredSearch },\n\t\t\t\t\t}\n\t\t\t\t: undefined,\n\t\t\tlimit: 100,\n\t\t\toffset: 0,\n\t\t\tsort: \"NAME_ASC\",\n\t\t}),\n\t);\n\n\tconst { data: selectedFlowsData = [] } = useQuery(\n\t\tbuildListFlowsQuery(\n\t\t\t{\n\t\t\t\tflows:\n\t\t\t\t\tselectedFlowIds.length > 0\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\tid: { any_: selectedFlowIds },\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: undefined,\n\t\t\t\tlimit: selectedFlowIds.length || 1,\n\t\t\t\toffset: 0,\n\t\t\t\tsort: \"NAME_ASC\",\n\t\t\t},\n\t\t\t{ enabled: selectedFlowIds.length > 0 },\n\t\t),\n\t);\n\n\tconst filteredFlows = useMemo(() => {\n\t\treturn flows.filter(\n\t\t\t(flow: Flow) =>\n\t\t\t\t!deferredSearch ||\n\t\t\t\tflow.name.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t);\n\t}, [flows, deferredSearch]);\n\n\tconst renderSelectedFlows = () => {\n\t\tif (selectedFlowIds.length === 0) {\n\t\t\treturn <span className=\"text-muted-foreground\">{emptyMessage}</span>;\n\t\t}\n\n\t\tconst selectedFlowNames = selectedFlowsData\n\t\t\t.filter((flow) => selectedFlowIds.includes(flow.id))\n\t\t\t.map((flow) => flow.name);\n\n\t\tconst visibleNames = selectedFlowNames.slice(0, MAX_VISIBLE_FLOWS);\n\t\tconst overflow = selectedFlowIds.length - visibleNames.length;\n\n\t\treturn (\n\t\t\t<div className=\"flex min-w-0 items-center justify-start gap-1\">\n\t\t\t\t<span className=\"truncate min-w-0 text-left\">\n\t\t\t\t\t{visibleNames.join(\", \")}\n\t\t\t\t</span>\n\t\t\t\t{overflow > 0 && (\n\t\t\t\t\t<span className=\"shrink-0 text-muted-foreground\">+{overflow}</span>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t};\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger selected={selectedFlowIds.length > 0}>\n\t\t\t\t{renderSelectedFlows()}\n\t\t\t</ComboboxTrigger>\n\t\t\t<ComboboxContent>\n\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\tvalue={search}\n\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\tplaceholder=\"Search flows...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandEmtpy>No flows found</ComboboxCommandEmtpy>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t{filteredFlows.map((flow: Flow) => (\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey={flow.id}\n\t\t\t\t\t\t\t\tselected={selectedFlowIds.includes(flow.id)}\n\t\t\t\t\t\t\t\tonSelect={() => {\n\t\t\t\t\t\t\t\t\tonToggleFlow(flow.id);\n\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\tvalue={flow.id}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{flow.name}\n\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t</ComboboxCommandList>\n\t\t\t</ComboboxContent>\n\t\t</Combobox>\n\t);\n}\n","import { useDeferredValue, useMemo, useState } from \"react\";\nimport {\n\tSTATE_NAME_TO_TYPE,\n\tSTATE_NAMES,\n\tSTATE_NAMES_WITHOUT_SCHEDULED,\n\ttype StateName,\n} from \"@/api/flow-runs/constants\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\n\nconst ALL_RUN_STATES = \"All run states\";\nconst ALL_EXCEPT_SCHEDULED = \"All except scheduled\";\n\ntype StateMultiSelectProps = {\n\tselectedStates: StateName[];\n\tonStateChange: (states: StateName[]) => void;\n\temptyMessage?: string;\n};\n\nfunction isAllExceptScheduled(states: StateName[]): boolean {\n\tif (states.length !== STATE_NAMES.length - 1) return false;\n\treturn !states.includes(\"Scheduled\");\n}\n\nexport function StateMultiSelect({\n\tselectedStates,\n\tonStateChange,\n\temptyMessage = \"Any state\",\n}: StateMultiSelectProps) {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\n\tconst displayValue = useMemo(() => {\n\t\tif (selectedStates.length === 0) {\n\t\t\treturn ALL_RUN_STATES;\n\t\t}\n\t\tif (isAllExceptScheduled(selectedStates)) {\n\t\t\treturn ALL_EXCEPT_SCHEDULED;\n\t\t}\n\t\treturn selectedStates;\n\t}, [selectedStates]);\n\n\tconst filteredStates = useMemo(() => {\n\t\tconst lowerSearch = deferredSearch.toLowerCase();\n\t\treturn STATE_NAMES.filter((name) =>\n\t\t\tname.toLowerCase().includes(lowerSearch),\n\t\t);\n\t}, [deferredSearch]);\n\n\tconst showConvenienceOptions = useMemo(() => {\n\t\tconst lowerSearch = deferredSearch.toLowerCase();\n\t\treturn (\n\t\t\tALL_RUN_STATES.toLowerCase().includes(lowerSearch) ||\n\t\t\tALL_EXCEPT_SCHEDULED.toLowerCase().includes(lowerSearch)\n\t\t);\n\t}, [deferredSearch]);\n\n\tconst handleConvenienceSelect = (option: string) => {\n\t\tif (option === ALL_RUN_STATES) {\n\t\t\tonStateChange([]);\n\t\t} else if (option === ALL_EXCEPT_SCHEDULED) {\n\t\t\tonStateChange([...STATE_NAMES_WITHOUT_SCHEDULED]);\n\t\t}\n\t\tsetSearch(\"\");\n\t};\n\n\tconst handleStateToggle = (stateName: StateName) => {\n\t\tif (selectedStates.includes(stateName)) {\n\t\t\tonStateChange(selectedStates.filter((s) => s !== stateName));\n\t\t} else {\n\t\t\tonStateChange([...selectedStates, stateName]);\n\t\t}\n\t\tsetSearch(\"\");\n\t};\n\n\tconst renderSelectedStates = () => {\n\t\tif (displayValue === ALL_RUN_STATES) {\n\t\t\treturn <span className=\"text-muted-foreground\">{emptyMessage}</span>;\n\t\t}\n\t\tif (displayValue === ALL_EXCEPT_SCHEDULED) {\n\t\t\treturn <span>All except scheduled</span>;\n\t\t}\n\t\treturn (\n\t\t\t<div className=\"flex flex-wrap gap-1\">\n\t\t\t\t{selectedStates.map((stateName) => (\n\t\t\t\t\t<StateBadge\n\t\t\t\t\t\tkey={stateName}\n\t\t\t\t\t\ttype={STATE_NAME_TO_TYPE[stateName]}\n\t\t\t\t\t\tname={stateName}\n\t\t\t\t\t\tclassName=\"cursor-pointer\"\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t);\n\t};\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger selected={selectedStates.length > 0}>\n\t\t\t\t{renderSelectedStates()}\n\t\t\t</ComboboxTrigger>\n\t\t\t<ComboboxContent>\n\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\tvalue={search}\n\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\tplaceholder=\"Search states...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandEmtpy>No state found</ComboboxCommandEmtpy>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t{showConvenienceOptions && (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\tkey={ALL_RUN_STATES}\n\t\t\t\t\t\t\t\t\tselected={displayValue === ALL_RUN_STATES}\n\t\t\t\t\t\t\t\t\tonSelect={() => handleConvenienceSelect(ALL_RUN_STATES)}\n\t\t\t\t\t\t\t\t\tvalue={ALL_RUN_STATES}\n\t\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tAll run states\n\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\tkey={ALL_EXCEPT_SCHEDULED}\n\t\t\t\t\t\t\t\t\tselected={displayValue === ALL_EXCEPT_SCHEDULED}\n\t\t\t\t\t\t\t\t\tonSelect={() => handleConvenienceSelect(ALL_EXCEPT_SCHEDULED)}\n\t\t\t\t\t\t\t\t\tvalue={ALL_EXCEPT_SCHEDULED}\n\t\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tAll except scheduled\n\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{filteredStates.map((stateName) => (\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey={stateName}\n\t\t\t\t\t\t\t\tselected={selectedStates.includes(stateName)}\n\t\t\t\t\t\t\t\tonSelect={() => handleStateToggle(stateName)}\n\t\t\t\t\t\t\t\tvalue={stateName}\n\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\t\t\ttype={STATE_NAME_TO_TYPE[stateName]}\n\t\t\t\t\t\t\t\t\tname={stateName}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t</ComboboxCommandList>\n\t\t\t</ComboboxContent>\n\t\t</Combobox>\n\t);\n}\n","import { useFormContext, useWatch } from \"react-hook-form\";\nimport type { StateName } from \"@/api/flow-runs/constants\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport { FlowMultiSelect } from \"@/components/flows/flow-multi-select\";\nimport { DurationInput } from \"@/components/ui/duration-input\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport { TagsInput } from \"@/components/ui/tags-input\";\nimport { PostureSelect } from \"./posture-select\";\nimport { StateMultiSelect } from \"./state-multi-select\";\n\ntype MatchRelated = Record<string, string | string[]> | undefined;\n\n// Convert state names to event strings (e.g., \"Completed\" -> \"prefect.flow-run.Completed\")\n// When no states selected, returns wildcard [\"prefect.flow-run.*\"] (Vue behavior)\nfunction toStateNameEvents(stateNames: StateName[]): string[] {\n\tif (stateNames.length === 0) {\n\t\treturn [\"prefect.flow-run.*\"];\n\t}\n\treturn stateNames.map((name) => `prefect.flow-run.${name}`);\n}\n\n// Convert event strings back to state names (e.g., \"prefect.flow-run.Completed\" -> \"Completed\")\n// Wildcard \"prefect.flow-run.*\" returns empty array (means \"any state\")\nfunction fromStateNameEvents(events: string[] | undefined): StateName[] {\n\tif (!events || events.length === 0) {\n\t\treturn [];\n\t}\n\tif (events.includes(\"prefect.flow-run.*\")) {\n\t\treturn [];\n\t}\n\treturn events\n\t\t.filter((event) => event.startsWith(\"prefect.flow-run.\"))\n\t\t.map((event) => event.replace(\"prefect.flow-run.\", \"\") as StateName);\n}\n\nfunction extractFlowIdsFromMatchRelated(matchRelated: MatchRelated): string[] {\n\tif (!matchRelated) return [];\n\n\tconst resourceIds = matchRelated[\"prefect.resource.id\"];\n\tif (!resourceIds) return [];\n\n\tconst ids = Array.isArray(resourceIds) ? resourceIds : [resourceIds];\n\treturn ids\n\t\t.filter((id) => id.startsWith(\"prefect.flow.\"))\n\t\t.map((id) => id.replace(\"prefect.flow.\", \"\"));\n}\n\nfunction extractTagsFromMatchRelated(matchRelated: MatchRelated): string[] {\n\tif (!matchRelated) return [];\n\n\tconst resourceIds = matchRelated[\"prefect.resource.id\"];\n\tif (!resourceIds) return [];\n\n\tconst ids = Array.isArray(resourceIds) ? resourceIds : [resourceIds];\n\treturn ids\n\t\t.filter((id) => id.startsWith(\"prefect.tag.\"))\n\t\t.map((id) => id.replace(\"prefect.tag.\", \"\"));\n}\n\nfunction buildMatchRelated(flowIds: string[], tags: string[]): MatchRelated {\n\tconst flowResourceIds = flowIds.map((id) => `prefect.flow.${id}`);\n\tconst tagResourceIds = tags.map((tag) => `prefect.tag.${tag}`);\n\n\t// Return empty object when no flows/tags selected (matches Vue behavior)\n\tif (flowResourceIds.length === 0 && tagResourceIds.length === 0) {\n\t\treturn {};\n\t}\n\n\t// Set role based on which type is selected (Vue behavior)\n\t// Since tags are hidden when flows are selected, only one type will be present\n\tconst role = flowResourceIds.length > 0 ? \"flow\" : \"tag\";\n\tconst resourceIds = [...flowResourceIds, ...tagResourceIds];\n\n\treturn {\n\t\t\"prefect.resource.role\": role,\n\t\t\"prefect.resource.id\": resourceIds,\n\t};\n}\n\nexport const FlowRunStateTriggerFields = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst posture = useWatch<AutomationWizardSchema>({ name: \"trigger.posture\" });\n\n\t// Determine which field to use based on posture\n\t// Reactive: use \"expect\" (states to enter)\n\t// Proactive: use \"after\" (states to stay in)\n\tconst stateFieldName =\n\t\tposture === \"Proactive\" ? \"trigger.after\" : \"trigger.expect\";\n\n\tconst matchRelated = useWatch<AutomationWizardSchema>({\n\t\tname: \"trigger.match_related\",\n\t}) as MatchRelated;\n\n\tconst selectedFlowIds = extractFlowIdsFromMatchRelated(matchRelated);\n\tconst selectedTags = extractTagsFromMatchRelated(matchRelated);\n\n\tconst handleFlowToggle = (flowId: string) => {\n\t\tconst currentFlowIds = selectedFlowIds;\n\t\tconst newFlowIds = currentFlowIds.includes(flowId)\n\t\t\t? currentFlowIds.filter((id) => id !== flowId)\n\t\t\t: [...currentFlowIds, flowId];\n\n\t\t// Clear tags when flows are selected (Vue behavior)\n\t\tconst newTags = newFlowIds.length > 0 ? [] : selectedTags;\n\t\tform.setValue(\n\t\t\t\"trigger.match_related\",\n\t\t\tbuildMatchRelated(newFlowIds, newTags),\n\t\t);\n\t};\n\n\tconst handleTagsChange = (tags: string[]) => {\n\t\tform.setValue(\n\t\t\t\"trigger.match_related\",\n\t\t\tbuildMatchRelated(selectedFlowIds, tags),\n\t\t);\n\t};\n\n\t// Hide tags input when flows are selected (Vue behavior)\n\tconst showTagsInput = selectedFlowIds.length === 0;\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t<FormItem>\n\t\t\t\t<FormLabel>Flows</FormLabel>\n\t\t\t\t<FormControl>\n\t\t\t\t\t<FlowMultiSelect\n\t\t\t\t\t\tselectedFlowIds={selectedFlowIds}\n\t\t\t\t\t\tonToggleFlow={handleFlowToggle}\n\t\t\t\t\t\temptyMessage=\"All flows\"\n\t\t\t\t\t/>\n\t\t\t\t</FormControl>\n\t\t\t</FormItem>\n\n\t\t\t{showTagsInput && (\n\t\t\t\t<FormItem>\n\t\t\t\t\t<FormLabel>Flow Run Tags</FormLabel>\n\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t<TagsInput\n\t\t\t\t\t\t\tvalue={selectedTags}\n\t\t\t\t\t\t\tonChange={handleTagsChange}\n\t\t\t\t\t\t\tplaceholder=\"All tags\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t</FormControl>\n\t\t\t\t</FormItem>\n\t\t\t)}\n\n\t\t\t<FormItem>\n\t\t\t\t<FormLabel>Flow Run</FormLabel>\n\t\t\t\t<div className=\"grid grid-cols-[10rem_1fr] gap-2\">\n\t\t\t\t\t<PostureSelect />\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\tname={stateFieldName}\n\t\t\t\t\t\trender={({ field }) => {\n\t\t\t\t\t\t\t// Convert event strings to state names for UI display\n\t\t\t\t\t\t\tconst eventStrings = field.value ?? [];\n\t\t\t\t\t\t\tconst selectedStates = fromStateNameEvents(eventStrings);\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t<StateMultiSelect\n\t\t\t\t\t\t\t\t\t\tselectedStates={selectedStates}\n\t\t\t\t\t\t\t\t\t\tonStateChange={(states) => {\n\t\t\t\t\t\t\t\t\t\t\t// Convert state names to event strings for storage\n\t\t\t\t\t\t\t\t\t\t\tfield.onChange(toStateNameEvents(states));\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\temptyMessage=\"Any state\"\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</FormControl>\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</div>\n\t\t\t</FormItem>\n\n\t\t\t{posture === \"Proactive\" && (\n\t\t\t\t<FormField\n\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\tname=\"trigger.within\"\n\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t<FormLabel>For</FormLabel>\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<DurationInput\n\t\t\t\t\t\t\t\t\tvalue={field.value ?? 0}\n\t\t\t\t\t\t\t\t\tonChange={field.onChange}\n\t\t\t\t\t\t\t\t\tmin={0}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import type { ReactNode } from \"react\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\n\nexport type FormMode = \"Form\" | \"JSON\";\n\ntype FormModeToggleProps = {\n\tdefaultValue?: FormMode;\n\t/** Controlled value - when provided, the component becomes controlled */\n\tvalue?: FormMode;\n\t/** Callback when the mode changes - required for controlled mode */\n\tonValueChange?: (value: FormMode) => void;\n\tformContent: ReactNode;\n\tjsonContent: ReactNode;\n};\n\nexport const FormModeToggle = ({\n\tdefaultValue = \"Form\",\n\tvalue,\n\tonValueChange,\n\tformContent,\n\tjsonContent,\n}: FormModeToggleProps) => {\n\t// When value is provided, use controlled mode; otherwise use uncontrolled mode\n\tconst tabsProps =\n\t\tvalue !== undefined\n\t\t\t? { value, onValueChange: onValueChange as (value: string) => void }\n\t\t\t: { defaultValue };\n\n\treturn (\n\t\t<Tabs {...tabsProps}>\n\t\t\t<div className=\"flex justify-center\">\n\t\t\t\t<TabsList>\n\t\t\t\t\t<TabsTrigger value=\"Form\">Form</TabsTrigger>\n\t\t\t\t\t<TabsTrigger value=\"JSON\">JSON</TabsTrigger>\n\t\t\t\t</TabsList>\n\t\t\t</div>\n\t\t\t<TabsContent value=\"Form\">{formContent}</TabsContent>\n\t\t\t<TabsContent value=\"JSON\">{jsonContent}</TabsContent>\n\t\t</Tabs>\n\t);\n};\n","import { useState } from \"react\";\nimport { z } from \"zod\";\nimport { TriggerSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport { Button } from \"@/components/ui/button\";\nimport type { JsonInputOnChange } from \"@/components/ui/json-input\";\nimport { LazyJsonInput as JsonInput } from \"@/components/ui/json-input-lazy\";\nimport { Label } from \"@/components/ui/label\";\n\ntype TriggerJsonInputProps = {\n\tvalue: string;\n\tonChange: (value: string) => void;\n\terror?: string;\n};\n\nexport const TriggerJsonInput = ({\n\tvalue,\n\tonChange,\n\terror,\n}: TriggerJsonInputProps) => {\n\tconst [localError, setLocalError] = useState<string | null>(null);\n\n\tconst formatJson = () => {\n\t\ttry {\n\t\t\tconst parsed: unknown = JSON.parse(value);\n\t\t\tonChange(JSON.stringify(parsed, null, 2));\n\t\t} catch {\n\t\t\t// Invalid JSON, do nothing\n\t\t}\n\t};\n\n\tconst validate = (json: string): boolean => {\n\t\ttry {\n\t\t\tconst parsed: unknown = JSON.parse(json);\n\t\t\tTriggerSchema.parse(parsed);\n\t\t\tsetLocalError(null);\n\t\t\treturn true;\n\t\t} catch (e) {\n\t\t\tif (e instanceof SyntaxError) {\n\t\t\t\tsetLocalError(\"Invalid JSON syntax\");\n\t\t\t} else if (e instanceof z.ZodError) {\n\t\t\t\tsetLocalError(e.errors[0]?.message ?? \"Invalid trigger configuration\");\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className=\"space-y-2\">\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<Label>Trigger Configuration</Label>\n\t\t\t\t<Button variant=\"ghost\" size=\"sm\" onClick={formatJson}>\n\t\t\t\t\tFormat\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\tEdit the trigger configuration as JSON.{\" \"}\n\t\t\t\t<a\n\t\t\t\t\thref=\"https://docs.prefect.io/v3/automate/events/automations-triggers\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\tclassName=\"underline hover:text-foreground\"\n\t\t\t\t>\n\t\t\t\t\tView documentation\n\t\t\t\t</a>\n\t\t\t</p>\n\t\t\t<JsonInput\n\t\t\t\tvalue={value}\n\t\t\t\tonChange={onChange as JsonInputOnChange}\n\t\t\t\tonBlur={() => validate(value)}\n\t\t\t/>\n\t\t\t{(localError || error) && (\n\t\t\t\t<p className=\"text-sm text-destructive\">{localError || error}</p>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { useFormContext } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport { FormControl, FormField, FormItem } from \"@/components/ui/form\";\nimport { Label } from \"@/components/ui/label\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectGroup,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\n\nconst TEMPLATE_TRIGGERS = {\n\t\"deployment-status\": \"Deployment status\",\n\t\"flow-run-state\": \"Flow run state\",\n\t\"work-pool-status\": \"Work pool status\",\n\t\"work-queue-status\": \"Work queue status\",\n\tcustom: \"Custom\",\n} as const;\n\nexport type TemplateTriggers = keyof typeof TEMPLATE_TRIGGERS;\n\n// Type alias for consistency with ticket specification\nexport type TriggerTemplate = TemplateTriggers;\n\ntype AutomationsTriggerTemplateSelectProps = {\n\tonValueChange: (value: TemplateTriggers) => void;\n\tvalue?: TemplateTriggers;\n};\n\nexport const AutomationsTriggerTemplateSelect = ({\n\tonValueChange,\n\tvalue,\n}: AutomationsTriggerTemplateSelectProps) => {\n\treturn (\n\t\t<div className=\"space-y-2\">\n\t\t\t<Label htmlFor=\"automations-trigger-template-select\">\n\t\t\t\tTrigger Template\n\t\t\t</Label>\n\t\t\t<Select value={value} onValueChange={onValueChange}>\n\t\t\t\t<SelectTrigger\n\t\t\t\t\tid=\"automations-trigger-template-select\"\n\t\t\t\t\tclassName=\"w-full\"\n\t\t\t\t>\n\t\t\t\t\t<SelectValue placeholder=\"Select template\" />\n\t\t\t\t</SelectTrigger>\n\t\t\t\t<SelectContent>\n\t\t\t\t\t<SelectGroup>\n\t\t\t\t\t\t{Object.keys(TEMPLATE_TRIGGERS).map((key) => (\n\t\t\t\t\t\t\t<SelectItem key={key} value={key}>\n\t\t\t\t\t\t\t\t{TEMPLATE_TRIGGERS[key as TemplateTriggers]}\n\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</SelectGroup>\n\t\t\t\t</SelectContent>\n\t\t\t</Select>\n\t\t</div>\n\t);\n};\n\ntype TriggerTemplateSelectFieldProps = {\n\tonTemplateChange?: (template: TriggerTemplate) => void;\n};\n\nexport const TriggerTemplateSelectField = ({\n\tonTemplateChange,\n}: TriggerTemplateSelectFieldProps) => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\n\treturn (\n\t\t<FormField\n\t\t\tcontrol={form.control}\n\t\t\tname=\"triggerTemplate\"\n\t\t\trender={({ field }) => (\n\t\t\t\t<FormItem>\n\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t<AutomationsTriggerTemplateSelect\n\t\t\t\t\t\t\tvalue={field.value}\n\t\t\t\t\t\t\tonValueChange={(value) => {\n\t\t\t\t\t\t\t\tfield.onChange(value);\n\t\t\t\t\t\t\t\tonTemplateChange?.(value);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</FormControl>\n\t\t\t\t</FormItem>\n\t\t\t)}\n\t\t/>\n\t);\n};\n","import type { EventTrigger } from \"@/components/automations/automations-wizard/automation-schema\";\nimport type { TriggerTemplate } from \"@/components/automations/automations-wizard/automations-trigger-template-select\";\n\nconst BASE_TRIGGER: EventTrigger = {\n\ttype: \"event\",\n\tposture: \"Reactive\",\n\tthreshold: 1,\n\twithin: 0,\n};\n\nexport const getDefaultTriggerForTemplate = (\n\ttemplate: TriggerTemplate,\n): EventTrigger => {\n\tswitch (template) {\n\t\tcase \"flow-run-state\":\n\t\t\t// Return fields in same order as Vue for JSON tab visual parity\n\t\t\treturn {\n\t\t\t\ttype: \"event\",\n\t\t\t\tmatch: { \"prefect.resource.id\": \"prefect.flow-run.*\" },\n\t\t\t\tmatch_related: {},\n\t\t\t\tafter: [],\n\t\t\t\texpect: [\"prefect.flow-run.*\"],\n\t\t\t\tfor_each: [\"prefect.resource.id\"],\n\t\t\t\tposture: \"Reactive\",\n\t\t\t\tthreshold: 1,\n\t\t\t\twithin: 0,\n\t\t\t};\n\t\tcase \"deployment-status\":\n\t\t\t// Return fields in same order as Vue for JSON tab visual parity\n\t\t\treturn {\n\t\t\t\ttype: \"event\",\n\t\t\t\tmatch: { \"prefect.resource.id\": \"prefect.deployment.*\" },\n\t\t\t\tmatch_related: {},\n\t\t\t\tafter: [],\n\t\t\t\texpect: [\"prefect.deployment.not-ready\"],\n\t\t\t\tfor_each: [\"prefect.resource.id\"],\n\t\t\t\tposture: \"Reactive\",\n\t\t\t\tthreshold: 1,\n\t\t\t\twithin: 0,\n\t\t\t};\n\t\tcase \"work-pool-status\":\n\t\t\t// Return fields in same order as Vue for JSON tab visual parity\n\t\t\treturn {\n\t\t\t\ttype: \"event\",\n\t\t\t\tmatch: { \"prefect.resource.id\": \"prefect.work-pool.*\" },\n\t\t\t\tmatch_related: {},\n\t\t\t\tafter: [],\n\t\t\t\texpect: [\n\t\t\t\t\t\"prefect.work-pool.not-ready\",\n\t\t\t\t\t// compatibility with old event name\n\t\t\t\t\t\"prefect.work-pool.not_ready\",\n\t\t\t\t],\n\t\t\t\tfor_each: [\"prefect.resource.id\"],\n\t\t\t\tposture: \"Reactive\",\n\t\t\t\tthreshold: 1,\n\t\t\t\twithin: 0,\n\t\t\t};\n\t\tcase \"work-queue-status\":\n\t\t\t// Return fields in same order as Vue for JSON tab visual parity\n\t\t\treturn {\n\t\t\t\ttype: \"event\",\n\t\t\t\tmatch: { \"prefect.resource.id\": \"prefect.work-queue.*\" },\n\t\t\t\tmatch_related: {},\n\t\t\t\tafter: [],\n\t\t\t\texpect: [\"prefect.work-queue.not-ready\"],\n\t\t\t\tfor_each: [\"prefect.resource.id\"],\n\t\t\t\tposture: \"Reactive\",\n\t\t\t\tthreshold: 1,\n\t\t\t\twithin: 0,\n\t\t\t};\n\t\tcase \"custom\":\n\t\t\t// Return fields in same order as Vue for JSON tab visual parity\n\t\t\t// Include sensible defaults so users see a working example\n\t\t\treturn {\n\t\t\t\ttype: \"event\",\n\t\t\t\tmatch: { \"prefect.resource.id\": [\"prefect.flow-run.*\"] },\n\t\t\t\tmatch_related: {},\n\t\t\t\tafter: [],\n\t\t\t\texpect: [\"prefect.flow-run.Failed\"],\n\t\t\t\tfor_each: [],\n\t\t\t\tposture: \"Reactive\",\n\t\t\t\tthreshold: 5,\n\t\t\t\twithin: 60,\n\t\t\t};\n\t\tdefault:\n\t\t\treturn BASE_TRIGGER;\n\t}\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { buildFilterWorkPoolsQuery, type WorkPool } from \"@/api/work-pools\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\n\n// Show all selected work pool names and let CSS truncation handle overflow\n\ntype WorkPoolMultiSelectProps = {\n\tselectedWorkPoolIds: string[];\n\tonToggleWorkPool: (workPoolId: string) => void;\n\temptyMessage?: string;\n};\n\nexport function WorkPoolMultiSelect({\n\tselectedWorkPoolIds,\n\tonToggleWorkPool,\n\temptyMessage = \"All work pools\",\n}: WorkPoolMultiSelectProps) {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\n\tconst { data: workPools = [] } = useQuery(buildFilterWorkPoolsQuery());\n\n\t// Filter to only show work pools with a status (excluding push/agent pools)\n\t// and apply search filter\n\tconst filteredWorkPools = useMemo(() => {\n\t\treturn workPools\n\t\t\t.filter((workPool: WorkPool) => workPool.status !== null)\n\t\t\t.filter(\n\t\t\t\t(workPool: WorkPool) =>\n\t\t\t\t\t!deferredSearch ||\n\t\t\t\t\tworkPool.name.toLowerCase().includes(deferredSearch.toLowerCase()),\n\t\t\t);\n\t}, [workPools, deferredSearch]);\n\n\t// Get selected work pools data for display\n\tconst selectedWorkPoolsData = useMemo(() => {\n\t\treturn workPools.filter((workPool: WorkPool) =>\n\t\t\tselectedWorkPoolIds.includes(workPool.id),\n\t\t);\n\t}, [workPools, selectedWorkPoolIds]);\n\n\tconst renderSelectedWorkPools = () => {\n\t\tif (selectedWorkPoolIds.length === 0) {\n\t\t\treturn <span className=\"text-muted-foreground\">{emptyMessage}</span>;\n\t\t}\n\n\t\tconst selectedWorkPoolNames = selectedWorkPoolsData.map(\n\t\t\t(workPool) => workPool.name,\n\t\t);\n\n\t\t// Show all names and let CSS truncation handle overflow\n\t\treturn (\n\t\t\t<span className=\"truncate min-w-0 text-left\">\n\t\t\t\t{selectedWorkPoolNames.join(\", \")}\n\t\t\t</span>\n\t\t);\n\t};\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger selected={selectedWorkPoolIds.length > 0}>\n\t\t\t\t{renderSelectedWorkPools()}\n\t\t\t</ComboboxTrigger>\n\t\t\t<ComboboxContent>\n\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\tvalue={search}\n\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\tplaceholder=\"Search work pools...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandEmtpy>No work pools found</ComboboxCommandEmtpy>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t{filteredWorkPools.map((workPool: WorkPool) => (\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey={workPool.id}\n\t\t\t\t\t\t\t\tselected={selectedWorkPoolIds.includes(workPool.id)}\n\t\t\t\t\t\t\t\tonSelect={() => {\n\t\t\t\t\t\t\t\t\tonToggleWorkPool(workPool.id);\n\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\tvalue={workPool.id}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{workPool.name}\n\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t</ComboboxCommandList>\n\t\t\t</ComboboxContent>\n\t\t</Combobox>\n\t);\n}\n","import { useFormContext, useWatch } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport { DurationInput } from \"@/components/ui/duration-input\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { WorkPoolMultiSelect } from \"@/components/work-pools/work-pool-multi-select\";\nimport { PostureSelect } from \"./posture-select\";\n\n// Status options with their corresponding event arrays (matching Vue implementation)\n// \"not_ready\" maps to two events for backwards compatibility\nconst WORK_POOL_STATUSES = [\n\t{ value: \"ready\", label: \"Ready\", events: [\"prefect.work-pool.ready\"] },\n\t{\n\t\tvalue: \"not_ready\",\n\t\tlabel: \"Not Ready\",\n\t\tevents: [\"prefect.work-pool.not-ready\", \"prefect.work-pool.not_ready\"],\n\t},\n\t{ value: \"paused\", label: \"Paused\", events: [\"prefect.work-pool.paused\"] },\n] as const;\n\n// Get status value from events array (for reading from form state)\nfunction getStatusFromEvents(events: string[] | undefined): string {\n\tif (!events || events.length === 0) return \"not_ready\";\n\n\tfor (const status of WORK_POOL_STATUSES) {\n\t\tif (status.events.some((e) => events.includes(e))) {\n\t\t\treturn status.value;\n\t\t}\n\t}\n\treturn \"not_ready\";\n}\n\n// Get events for a status value\nfunction getEventsForStatus(statusValue: string): string[] {\n\tconst status = WORK_POOL_STATUSES.find((s) => s.value === statusValue);\n\treturn status ? [...status.events] : [];\n}\n\n// Get events for all statuses EXCEPT the given one (for Proactive expect)\nfunction getEventsExceptStatus(statusValue: string): string[] {\n\treturn WORK_POOL_STATUSES.filter((s) => s.value !== statusValue).flatMap(\n\t\t(s) => [...s.events],\n\t);\n}\n\ntype Match = Record<string, string | string[]> | undefined;\n\n// Extract work pool IDs from match['prefect.resource.id']\n// Returns empty array for wildcard \"prefect.work-pool.*\" (meaning \"all work pools\")\nfunction extractWorkPoolIdsFromMatch(match: Match): string[] {\n\tif (!match) return [];\n\n\tconst resourceIds = match[\"prefect.resource.id\"];\n\tif (!resourceIds) return [];\n\n\t// Handle wildcard case - \"all work pools\" means no specific pools selected\n\tif (resourceIds === \"prefect.work-pool.*\") return [];\n\n\tconst ids = Array.isArray(resourceIds) ? resourceIds : [resourceIds];\n\treturn ids\n\t\t.filter(\n\t\t\t(id) =>\n\t\t\t\tid.startsWith(\"prefect.work-pool.\") && id !== \"prefect.work-pool.*\",\n\t\t)\n\t\t.map((id) => id.replace(\"prefect.work-pool.\", \"\"));\n}\n\n// Build match object with work pool IDs\nfunction buildMatch(workPoolIds: string[]): Match {\n\tif (workPoolIds.length === 0) {\n\t\treturn {\n\t\t\t\"prefect.resource.id\": \"prefect.work-pool.*\",\n\t\t};\n\t}\n\n\treturn {\n\t\t\"prefect.resource.id\": workPoolIds.map((id) => `prefect.work-pool.${id}`),\n\t};\n}\n\n// Status select component that handles posture-dependent behavior\nconst StatusSelect = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst posture = useWatch<AutomationWizardSchema>({ name: \"trigger.posture\" });\n\tconst expect = useWatch<AutomationWizardSchema>({ name: \"trigger.expect\" }) as\n\t\t| string[]\n\t\t| undefined;\n\tconst after = useWatch<AutomationWizardSchema>({ name: \"trigger.after\" }) as\n\t\t| string[]\n\t\t| undefined;\n\n\t// Get current status based on posture\n\t// Reactive: status is in expect, Proactive: status is in after\n\tconst currentStatus =\n\t\tposture === \"Proactive\"\n\t\t\t? getStatusFromEvents(after)\n\t\t\t: getStatusFromEvents(expect);\n\n\tconst handleStatusChange = (statusValue: string) => {\n\t\tconst statusEvents = getEventsForStatus(statusValue);\n\t\tconst otherStatusEvents = getEventsExceptStatus(statusValue);\n\n\t\tif (posture === \"Proactive\") {\n\t\t\t// Proactive: selected status goes to \"after\", other statuses go to \"expect\"\n\t\t\tform.setValue(\"trigger.after\", statusEvents);\n\t\t\tform.setValue(\"trigger.expect\", otherStatusEvents);\n\t\t} else {\n\t\t\t// Reactive: selected status goes to \"expect\", \"after\" is empty\n\t\t\tform.setValue(\"trigger.expect\", statusEvents);\n\t\t\tform.setValue(\"trigger.after\", []);\n\t\t}\n\t};\n\n\treturn (\n\t\t<Select value={currentStatus} onValueChange={handleStatusChange}>\n\t\t\t<SelectTrigger aria-label=\"select status\" className=\"min-w-0 flex-1\">\n\t\t\t\t<SelectValue placeholder=\"Select status\" />\n\t\t\t</SelectTrigger>\n\t\t\t<SelectContent>\n\t\t\t\t{WORK_POOL_STATUSES.map((status) => (\n\t\t\t\t\t<SelectItem key={status.value} value={status.value}>\n\t\t\t\t\t\t{status.label}\n\t\t\t\t\t</SelectItem>\n\t\t\t\t))}\n\t\t\t</SelectContent>\n\t\t</Select>\n\t);\n};\n\nexport const WorkPoolStatusTriggerFields = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst posture = useWatch<AutomationWizardSchema>({ name: \"trigger.posture\" });\n\n\tconst match = useWatch<AutomationWizardSchema>({\n\t\tname: \"trigger.match\",\n\t}) as Match;\n\n\tconst selectedWorkPoolIds = extractWorkPoolIdsFromMatch(match);\n\n\tconst handleWorkPoolToggle = (workPoolId: string) => {\n\t\tconst currentWorkPoolIds = selectedWorkPoolIds;\n\t\tconst newWorkPoolIds = currentWorkPoolIds.includes(workPoolId)\n\t\t\t? currentWorkPoolIds.filter((id) => id !== workPoolId)\n\t\t\t: [...currentWorkPoolIds, workPoolId];\n\n\t\tform.setValue(\"trigger.match\", buildMatch(newWorkPoolIds));\n\t};\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t<FormItem>\n\t\t\t\t<FormLabel>Work Pools</FormLabel>\n\t\t\t\t<FormControl>\n\t\t\t\t\t<WorkPoolMultiSelect\n\t\t\t\t\t\tselectedWorkPoolIds={selectedWorkPoolIds}\n\t\t\t\t\t\tonToggleWorkPool={handleWorkPoolToggle}\n\t\t\t\t\t\temptyMessage=\"All work pools\"\n\t\t\t\t\t/>\n\t\t\t\t</FormControl>\n\t\t\t</FormItem>\n\n\t\t\t<FormItem>\n\t\t\t\t<FormLabel>Work Pool</FormLabel>\n\t\t\t\t<div className=\"flex gap-2\">\n\t\t\t\t\t<PostureSelect />\n\t\t\t\t\t<StatusSelect />\n\t\t\t\t</div>\n\t\t\t</FormItem>\n\n\t\t\t{posture === \"Proactive\" && (\n\t\t\t\t<FormField\n\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\tname=\"trigger.within\"\n\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t<FormLabel>For</FormLabel>\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<DurationInput\n\t\t\t\t\t\t\t\t\tvalue={field.value ?? 30}\n\t\t\t\t\t\t\t\t\tonChange={field.onChange}\n\t\t\t\t\t\t\t\t\tmin={0}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { buildFilterWorkPoolsQuery, type WorkPool } from \"@/api/work-pools\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\n\ntype WorkPoolsComboboxProps = {\n\tselectedWorkPoolIds: string[];\n\tonToggleWorkPool: (workPoolId: string) => void;\n\temptyMessage?: string;\n};\n\nexport function WorkPoolsCombobox({\n\tselectedWorkPoolIds,\n\tonToggleWorkPool,\n\temptyMessage = \"All work pools\",\n}: WorkPoolsComboboxProps) {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\n\tconst { data: workPools = [] } = useQuery(\n\t\tbuildFilterWorkPoolsQuery({\n\t\t\tlimit: 100,\n\t\t\toffset: 0,\n\t\t}),\n\t);\n\n\tconst filteredWorkPools = useMemo(() => {\n\t\treturn workPools.filter((workPool: WorkPool) => {\n\t\t\tif (!workPool.status) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (!deferredSearch) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn workPool.name.toLowerCase().includes(deferredSearch.toLowerCase());\n\t\t});\n\t}, [workPools, deferredSearch]);\n\n\tconst renderSelectedWorkPools = () => {\n\t\tif (selectedWorkPoolIds.length === 0) {\n\t\t\treturn <span className=\"text-muted-foreground\">{emptyMessage}</span>;\n\t\t}\n\n\t\tconst selectedWorkPoolNames = workPools\n\t\t\t.filter((workPool) => selectedWorkPoolIds.includes(workPool.id))\n\t\t\t.map((workPool) => workPool.name);\n\n\t\treturn (\n\t\t\t<span className=\"truncate min-w-0 text-left\">\n\t\t\t\t{selectedWorkPoolNames.join(\", \")}\n\t\t\t</span>\n\t\t);\n\t};\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger selected={selectedWorkPoolIds.length > 0}>\n\t\t\t\t{renderSelectedWorkPools()}\n\t\t\t</ComboboxTrigger>\n\t\t\t<ComboboxContent>\n\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\tvalue={search}\n\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\tplaceholder=\"Search work pools...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandEmtpy>No work pools found</ComboboxCommandEmtpy>\n\t\t\t\t\t<ComboboxCommandGroup>\n\t\t\t\t\t\t{filteredWorkPools.map((workPool: WorkPool) => (\n\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\tkey={workPool.id}\n\t\t\t\t\t\t\t\tselected={selectedWorkPoolIds.includes(workPool.id)}\n\t\t\t\t\t\t\t\tonSelect={() => {\n\t\t\t\t\t\t\t\t\tonToggleWorkPool(workPool.id);\n\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\tvalue={workPool.id}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{workPool.name}\n\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t</ComboboxCommandList>\n\t\t\t</ComboboxContent>\n\t\t</Combobox>\n\t);\n}\n","import { useQuery } from \"@tanstack/react-query\";\nimport { useDeferredValue, useMemo, useState } from \"react\";\nimport { buildFilterWorkQueuesQuery, type WorkQueue } from \"@/api/work-queues\";\nimport {\n\tCombobox,\n\tComboboxCommandEmtpy,\n\tComboboxCommandGroup,\n\tComboboxCommandInput,\n\tComboboxCommandItem,\n\tComboboxCommandList,\n\tComboboxContent,\n\tComboboxTrigger,\n} from \"@/components/ui/combobox\";\n\ntype WorkQueuesComboboxProps = {\n\tselectedWorkQueueIds: string[];\n\tonToggleWorkQueue: (workQueueId: string) => void;\n\tworkPoolIds?: string[];\n\temptyMessage?: string;\n};\n\nexport function WorkQueuesCombobox({\n\tselectedWorkQueueIds,\n\tonToggleWorkQueue,\n\tworkPoolIds = [],\n\temptyMessage = \"All work queues\",\n}: WorkQueuesComboboxProps) {\n\tconst [search, setSearch] = useState(\"\");\n\tconst deferredSearch = useDeferredValue(search);\n\n\tconst { data: workQueues = [] } = useQuery(\n\t\tbuildFilterWorkQueuesQuery({\n\t\t\tlimit: 100,\n\t\t\toffset: 0,\n\t\t}),\n\t);\n\n\tconst filteredWorkQueues = useMemo(() => {\n\t\treturn workQueues.filter((workQueue: WorkQueue) => {\n\t\t\t// Filter by work pool IDs if specified\n\t\t\tif (\n\t\t\t\tworkPoolIds.length > 0 &&\n\t\t\t\t(!workQueue.work_pool_id ||\n\t\t\t\t\t!workPoolIds.includes(workQueue.work_pool_id))\n\t\t\t) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (!deferredSearch) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn workQueue.name\n\t\t\t\t.toLowerCase()\n\t\t\t\t.includes(deferredSearch.toLowerCase());\n\t\t});\n\t}, [workQueues, workPoolIds, deferredSearch]);\n\n\t// Group work queues by work pool name\n\tconst groupedWorkQueues = useMemo(() => {\n\t\tconst groups: Record<string, WorkQueue[]> = {};\n\n\t\tfor (const workQueue of filteredWorkQueues) {\n\t\t\tconst poolName = workQueue.work_pool_name ?? \"Unknown\";\n\t\t\tif (!groups[poolName]) {\n\t\t\t\tgroups[poolName] = [];\n\t\t\t}\n\t\t\tgroups[poolName].push(workQueue);\n\t\t}\n\n\t\t// Sort groups by pool name and sort queues within each group by name\n\t\tconst sortedGroupNames = Object.keys(groups).sort((a, b) =>\n\t\t\ta.localeCompare(b),\n\t\t);\n\n\t\treturn sortedGroupNames.map((poolName) => ({\n\t\t\tpoolName,\n\t\t\tqueues: groups[poolName].sort((a, b) => a.name.localeCompare(b.name)),\n\t\t}));\n\t}, [filteredWorkQueues]);\n\n\tconst renderSelectedWorkQueues = () => {\n\t\tif (selectedWorkQueueIds.length === 0) {\n\t\t\treturn <span className=\"text-muted-foreground\">{emptyMessage}</span>;\n\t\t}\n\n\t\tconst selectedWorkQueueNames = workQueues\n\t\t\t.filter((workQueue) => selectedWorkQueueIds.includes(workQueue.id))\n\t\t\t.map((workQueue) => workQueue.name);\n\n\t\treturn (\n\t\t\t<span className=\"truncate min-w-0 text-left\">\n\t\t\t\t{selectedWorkQueueNames.join(\", \")}\n\t\t\t</span>\n\t\t);\n\t};\n\n\treturn (\n\t\t<Combobox>\n\t\t\t<ComboboxTrigger selected={selectedWorkQueueIds.length > 0}>\n\t\t\t\t{renderSelectedWorkQueues()}\n\t\t\t</ComboboxTrigger>\n\t\t\t<ComboboxContent>\n\t\t\t\t<ComboboxCommandInput\n\t\t\t\t\tvalue={search}\n\t\t\t\t\tonValueChange={setSearch}\n\t\t\t\t\tplaceholder=\"Search work queues...\"\n\t\t\t\t/>\n\t\t\t\t<ComboboxCommandList>\n\t\t\t\t\t<ComboboxCommandEmtpy>No work queues found</ComboboxCommandEmtpy>\n\t\t\t\t\t{groupedWorkQueues.map((group) => (\n\t\t\t\t\t\t<ComboboxCommandGroup key={group.poolName} heading={group.poolName}>\n\t\t\t\t\t\t\t{group.queues.map((workQueue: WorkQueue) => (\n\t\t\t\t\t\t\t\t<ComboboxCommandItem\n\t\t\t\t\t\t\t\t\tkey={workQueue.id}\n\t\t\t\t\t\t\t\t\tselected={selectedWorkQueueIds.includes(workQueue.id)}\n\t\t\t\t\t\t\t\t\tonSelect={() => {\n\t\t\t\t\t\t\t\t\t\tonToggleWorkQueue(workQueue.id);\n\t\t\t\t\t\t\t\t\t\tsetSearch(\"\");\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tcloseOnSelect={false}\n\t\t\t\t\t\t\t\t\tvalue={workQueue.id}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{workQueue.name}\n\t\t\t\t\t\t\t\t</ComboboxCommandItem>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</ComboboxCommandGroup>\n\t\t\t\t\t))}\n\t\t\t\t</ComboboxCommandList>\n\t\t\t</ComboboxContent>\n\t\t</Combobox>\n\t);\n}\n","import { useFormContext, useWatch } from \"react-hook-form\";\nimport type { AutomationWizardSchema } from \"@/components/automations/automations-wizard/automation-schema\";\nimport { DurationInput } from \"@/components/ui/duration-input\";\nimport {\n\tFormControl,\n\tFormField,\n\tFormItem,\n\tFormLabel,\n\tFormMessage,\n} from \"@/components/ui/form\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { PostureSelect } from \"./posture-select\";\nimport { WorkPoolsCombobox } from \"./work-pools-combobox\";\nimport { WorkQueuesCombobox } from \"./work-queues-combobox\";\n\nconst WORK_QUEUE_STATUSES = [\n\t{ value: \"prefect.work-queue.ready\", label: \"Ready\" },\n\t{ value: \"prefect.work-queue.not-ready\", label: \"Not Ready\" },\n\t{ value: \"prefect.work-queue.paused\", label: \"Paused\" },\n];\n\ntype MatchRelated = Record<string, string | string[]> | undefined;\ntype Match = Record<string, string | string[]> | undefined;\n\nfunction extractWorkPoolIdsFromMatchRelated(\n\tmatchRelated: MatchRelated,\n): string[] {\n\tif (!matchRelated) return [];\n\n\tconst resourceIds = matchRelated[\"prefect.resource.id\"];\n\tif (!resourceIds) return [];\n\n\tconst ids = Array.isArray(resourceIds) ? resourceIds : [resourceIds];\n\treturn ids\n\t\t.filter((id) => id.startsWith(\"prefect.work-pool.\"))\n\t\t.map((id) => id.replace(\"prefect.work-pool.\", \"\"));\n}\n\nfunction extractWorkQueueIdsFromMatch(match: Match): string[] {\n\tif (!match) return [];\n\n\tconst resourceIds = match[\"prefect.resource.id\"];\n\tif (!resourceIds) return [];\n\n\tconst ids = Array.isArray(resourceIds) ? resourceIds : [resourceIds];\n\n\tif (ids.includes(\"prefect.work-queue.*\")) {\n\t\treturn [];\n\t}\n\n\treturn ids\n\t\t.filter((id) => id.startsWith(\"prefect.work-queue.\"))\n\t\t.map((id) => id.replace(\"prefect.work-queue.\", \"\"));\n}\n\nfunction buildMatchRelated(workPoolIds: string[]): MatchRelated {\n\tif (workPoolIds.length === 0) {\n\t\treturn {};\n\t}\n\n\tconst resourceIds = workPoolIds.map((id) => `prefect.work-pool.${id}`);\n\n\treturn {\n\t\t\"prefect.resource.role\": \"work-pool\",\n\t\t\"prefect.resource.id\": resourceIds,\n\t};\n}\n\nfunction buildMatch(workQueueIds: string[]): Match {\n\tif (workQueueIds.length === 0) {\n\t\treturn { \"prefect.resource.id\": \"prefect.work-queue.*\" };\n\t}\n\n\tconst resourceIds = workQueueIds.map((id) => `prefect.work-queue.${id}`);\n\n\treturn {\n\t\t\"prefect.resource.id\": resourceIds,\n\t};\n}\n\nexport const WorkQueueStatusTriggerFields = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst posture = useWatch<AutomationWizardSchema>({ name: \"trigger.posture\" });\n\n\tconst matchRelated = useWatch<AutomationWizardSchema>({\n\t\tname: \"trigger.match_related\",\n\t}) as MatchRelated;\n\n\tconst match = useWatch<AutomationWizardSchema>({\n\t\tname: \"trigger.match\",\n\t}) as Match;\n\n\tconst selectedWorkPoolIds = extractWorkPoolIdsFromMatchRelated(matchRelated);\n\tconst selectedWorkQueueIds = extractWorkQueueIdsFromMatch(match);\n\n\tconst handleWorkPoolToggle = (workPoolId: string) => {\n\t\tconst currentWorkPoolIds = selectedWorkPoolIds;\n\t\tconst newWorkPoolIds = currentWorkPoolIds.includes(workPoolId)\n\t\t\t? currentWorkPoolIds.filter((id) => id !== workPoolId)\n\t\t\t: [...currentWorkPoolIds, workPoolId];\n\n\t\tform.setValue(\"trigger.match_related\", buildMatchRelated(newWorkPoolIds));\n\t};\n\n\tconst handleWorkQueueToggle = (workQueueId: string) => {\n\t\tconst currentWorkQueueIds = selectedWorkQueueIds;\n\t\tconst newWorkQueueIds = currentWorkQueueIds.includes(workQueueId)\n\t\t\t? currentWorkQueueIds.filter((id) => id !== workQueueId)\n\t\t\t: [...currentWorkQueueIds, workQueueId];\n\n\t\tform.setValue(\"trigger.match\", buildMatch(newWorkQueueIds));\n\t};\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t<FormItem>\n\t\t\t\t<FormLabel>Work Pools</FormLabel>\n\t\t\t\t<FormControl>\n\t\t\t\t\t<WorkPoolsCombobox\n\t\t\t\t\t\tselectedWorkPoolIds={selectedWorkPoolIds}\n\t\t\t\t\t\tonToggleWorkPool={handleWorkPoolToggle}\n\t\t\t\t\t\temptyMessage=\"All work pools\"\n\t\t\t\t\t/>\n\t\t\t\t</FormControl>\n\t\t\t</FormItem>\n\n\t\t\t<FormItem>\n\t\t\t\t<FormLabel>Work Queues</FormLabel>\n\t\t\t\t<FormControl>\n\t\t\t\t\t<WorkQueuesCombobox\n\t\t\t\t\t\tselectedWorkQueueIds={selectedWorkQueueIds}\n\t\t\t\t\t\tonToggleWorkQueue={handleWorkQueueToggle}\n\t\t\t\t\t\tworkPoolIds={selectedWorkPoolIds}\n\t\t\t\t\t\temptyMessage=\"All work queues\"\n\t\t\t\t\t/>\n\t\t\t\t</FormControl>\n\t\t\t</FormItem>\n\n\t\t\t<FormItem>\n\t\t\t\t<FormLabel>Work Queue</FormLabel>\n\t\t\t\t<div className=\"grid grid-cols-[10rem_1fr] gap-2\">\n\t\t\t\t\t<PostureSelect />\n\t\t\t\t\t<FormField\n\t\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\t\tname=\"trigger.expect\"\n\t\t\t\t\t\trender={({ field }) => {\n\t\t\t\t\t\t\tconst selectedStatus = field.value?.[0];\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\t\t\t\tvalue={selectedStatus ?? \"\"}\n\t\t\t\t\t\t\t\t\t\tonValueChange={(value) => field.onChange([value])}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<SelectTrigger className=\"w-full\">\n\t\t\t\t\t\t\t\t\t\t\t<SelectValue placeholder=\"Select status\" />\n\t\t\t\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t\t\t\t{WORK_QUEUE_STATUSES.map((status) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<SelectItem key={status.value} value={status.value}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{status.label}\n\t\t\t\t\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t\t\t\t</Select>\n\t\t\t\t\t\t\t\t</FormControl>\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</div>\n\t\t\t</FormItem>\n\n\t\t\t{posture === \"Proactive\" && (\n\t\t\t\t<FormField\n\t\t\t\t\tcontrol={form.control}\n\t\t\t\t\tname=\"trigger.within\"\n\t\t\t\t\trender={({ field }) => (\n\t\t\t\t\t\t<FormItem>\n\t\t\t\t\t\t\t<FormLabel>For</FormLabel>\n\t\t\t\t\t\t\t<FormControl>\n\t\t\t\t\t\t\t\t<DurationInput\n\t\t\t\t\t\t\t\t\tvalue={field.value ?? 0}\n\t\t\t\t\t\t\t\t\tonChange={field.onChange}\n\t\t\t\t\t\t\t\t\tmin={0}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</FormControl>\n\t\t\t\t\t\t\t<FormMessage />\n\t\t\t\t\t\t</FormItem>\n\t\t\t\t\t)}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { useCallback, useEffect, useState } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { z } from \"zod\";\nimport {\n\ttype AutomationWizardSchema,\n\ttype Trigger,\n\tTriggerSchema,\n} from \"@/components/automations/automations-wizard/automation-schema\";\nimport {\n\ttype TriggerTemplate,\n\tTriggerTemplateSelectField,\n} from \"@/components/automations/automations-wizard/automations-trigger-template-select\";\nimport { CustomTriggerFields } from \"./custom-trigger-fields\";\nimport { DeploymentStatusTriggerFields } from \"./deployment-status-trigger-fields\";\nimport { FlowRunStateTriggerFields } from \"./flow-run-state-trigger-fields\";\nimport { type FormMode, FormModeToggle } from \"./form-mode-toggle\";\nimport { TriggerJsonInput } from \"./trigger-json-input\";\nimport { getDefaultTriggerForTemplate } from \"./trigger-step-utils\";\nimport { WorkPoolStatusTriggerFields } from \"./work-pool-status-trigger-fields\";\nimport { WorkQueueStatusTriggerFields } from \"./work-queue-status-trigger-fields\";\n\nexport const TriggerStep = () => {\n\tconst form = useFormContext<AutomationWizardSchema>();\n\tconst triggerTemplate = form.watch(\"triggerTemplate\");\n\tconst trigger = form.watch(\"trigger\");\n\n\tconst [mode, setMode] = useState<FormMode>(\"Form\");\n\tconst [jsonString, setJsonString] = useState<string>(\"\");\n\tconst [jsonError, setJsonError] = useState<string | undefined>(undefined);\n\n\t// Serialize trigger to JSON string\n\tconst serializeTrigger = useCallback(() => {\n\t\treturn JSON.stringify(trigger, null, 2);\n\t}, [trigger]);\n\n\t// Update jsonString when trigger changes (while in Form mode)\n\tuseEffect(() => {\n\t\tif (mode === \"Form\") {\n\t\t\tsetJsonString(serializeTrigger());\n\t\t}\n\t}, [mode, serializeTrigger]);\n\n\t// Validate and parse JSON string\n\tconst validateAndParseJson = useCallback(\n\t\t(json: string): { valid: boolean; trigger?: Trigger; error?: string } => {\n\t\t\ttry {\n\t\t\t\tconst parsed: unknown = JSON.parse(json);\n\t\t\t\tconst validatedTrigger = TriggerSchema.parse(parsed);\n\t\t\t\treturn { valid: true, trigger: validatedTrigger };\n\t\t\t} catch (e) {\n\t\t\t\tif (e instanceof SyntaxError) {\n\t\t\t\t\treturn { valid: false, error: \"Invalid JSON syntax\" };\n\t\t\t\t}\n\t\t\t\tif (e instanceof z.ZodError) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tvalid: false,\n\t\t\t\t\t\terror: e.errors[0]?.message ?? \"Invalid trigger configuration\",\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn { valid: false, error: \"Unknown error\" };\n\t\t\t}\n\t\t},\n\t\t[],\n\t);\n\n\t// Handle mode change with validation\n\tconst handleModeChange = useCallback(\n\t\t(newMode: FormMode) => {\n\t\t\tif (mode === newMode) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (newMode === \"Form\") {\n\t\t\t\t// Switching from JSON to Form - validate and sync JSON to form\n\t\t\t\tconst result = validateAndParseJson(jsonString);\n\t\t\t\tif (!result.valid) {\n\t\t\t\t\tsetJsonError(result.error);\n\t\t\t\t\treturn; // Block switch if JSON is invalid\n\t\t\t\t}\n\t\t\t\t// Update form with parsed trigger\n\t\t\t\tif (result.trigger) {\n\t\t\t\t\tform.setValue(\"trigger\", result.trigger);\n\t\t\t\t}\n\t\t\t\tsetJsonError(undefined);\n\t\t\t} else {\n\t\t\t\t// Switching from Form to JSON - serialize current trigger\n\t\t\t\tsetJsonString(serializeTrigger());\n\t\t\t\tsetJsonError(undefined);\n\t\t\t}\n\n\t\t\tsetMode(newMode);\n\t\t},\n\t\t[mode, jsonString, validateAndParseJson, form, serializeTrigger],\n\t);\n\n\t// Handle JSON input changes - immediately sync valid JSON to form\n\tconst handleJsonChange = useCallback(\n\t\t(value: string) => {\n\t\t\tsetJsonString(value);\n\n\t\t\t// Try to parse and validate the JSON\n\t\t\tconst result = validateAndParseJson(value);\n\t\t\tif (result.valid && result.trigger) {\n\t\t\t\t// Valid JSON - sync to form immediately\n\t\t\t\tform.setValue(\"trigger\", result.trigger);\n\t\t\t\tsetJsonError(undefined);\n\t\t\t}\n\t\t\t// Don't set error on every keystroke - only on blur or mode switch\n\t\t},\n\t\t[validateAndParseJson, form],\n\t);\n\n\tconst handleTemplateChange = (value: TriggerTemplate) => {\n\t\tconst newTrigger = getDefaultTriggerForTemplate(value);\n\t\tform.setValue(\"trigger\", newTrigger);\n\t\t// Reset JSON string when template changes\n\t\tsetJsonString(JSON.stringify(newTrigger, null, 2));\n\t\tsetJsonError(undefined);\n\t};\n\n\treturn (\n\t\t<div className=\"space-y-6\">\n\t\t\t<TriggerTemplateSelectField onTemplateChange={handleTemplateChange} />\n\t\t\t{triggerTemplate && (\n\t\t\t\t<FormModeToggle\n\t\t\t\t\tvalue={mode}\n\t\t\t\t\tonValueChange={handleModeChange}\n\t\t\t\t\tformContent={<TriggerTemplateFields template={triggerTemplate} />}\n\t\t\t\t\tjsonContent={\n\t\t\t\t\t\t<TriggerJsonInput\n\t\t\t\t\t\t\tvalue={jsonString}\n\t\t\t\t\t\t\tonChange={handleJsonChange}\n\t\t\t\t\t\t\terror={jsonError}\n\t\t\t\t\t\t/>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n\ntype TriggerTemplateFieldsProps = {\n\ttemplate: TriggerTemplate;\n};\n\nconst TriggerTemplateFields = ({ template }: TriggerTemplateFieldsProps) => {\n\tswitch (template) {\n\t\tcase \"flow-run-state\":\n\t\t\treturn <FlowRunStateTriggerFields />;\n\t\tcase \"deployment-status\":\n\t\t\treturn <DeploymentStatusTriggerFields />;\n\t\tcase \"work-pool-status\":\n\t\t\treturn <WorkPoolStatusTriggerFields />;\n\t\tcase \"work-queue-status\":\n\t\t\treturn <WorkQueueStatusTriggerFields />;\n\t\tcase \"custom\":\n\t\t\treturn <CustomTriggerFields />;\n\t\tdefault:\n\t\t\treturn null;\n\t}\n};\n","import { zodResolver } from \"@hookform/resolvers/zod\";\nimport { Link } from \"@tanstack/react-router\";\nimport { useForm } from \"react-hook-form\";\nimport type { z } from \"zod\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent, CardFooter } from \"@/components/ui/card\";\nimport { Form, FormMessage } from \"@/components/ui/form\";\nimport { Stepper } from \"@/components/ui/stepper\";\nimport { useStepper } from \"@/hooks/use-stepper\";\nimport { ActionsStep } from \"./actions-step\";\nimport { AutomationWizardSchema } from \"./automation-schema\";\nimport { DetailsStep } from \"./details-step\";\nimport { TriggerStep } from \"./trigger-step\";\n\ntype AutomationWizardFormInput = z.input<typeof AutomationWizardSchema>;\ntype AutomationWizardFormOutput = z.output<typeof AutomationWizardSchema>;\n\nconst WIZARD_STEPS = [\"Trigger\", \"Actions\", \"Details\"] as const;\ntype WizardStep = (typeof WIZARD_STEPS)[number];\n\nconst DEFAULT_FORM_VALUES = {\n\tactions: [{ type: undefined }],\n\ttrigger: {\n\t\ttype: \"event\" as const,\n\t\tposture: \"Reactive\" as const,\n\t\tthreshold: 1,\n\t\twithin: 0,\n\t},\n};\n\nexport type AutomationWizardProps = {\n\tdefaultValues?: Partial<AutomationWizardFormInput>;\n\tonSubmit: (values: AutomationWizardFormOutput) => void;\n\tsubmitLabel?: string;\n\tisSubmitting?: boolean;\n};\n\nexport const AutomationWizard = ({\n\tdefaultValues = {},\n\tonSubmit,\n\tsubmitLabel = \"Save\",\n\tisSubmitting = false,\n}: AutomationWizardProps) => {\n\tconst isEditMode = Boolean(\n\t\tdefaultValues && Object.keys(defaultValues).length > 0,\n\t);\n\tconst initialVisitedSteps = isEditMode\n\t\t? new Set([0, 1, 2])\n\t\t: new Set<number>([0]);\n\tconst stepper = useStepper(WIZARD_STEPS.length, 0, initialVisitedSteps);\n\tconst form = useForm<\n\t\tAutomationWizardFormInput,\n\t\tunknown,\n\t\tAutomationWizardFormOutput\n\t>({\n\t\tresolver: zodResolver(AutomationWizardSchema),\n\t\tdefaultValues: {\n\t\t\t...DEFAULT_FORM_VALUES,\n\t\t\t...defaultValues,\n\t\t} as AutomationWizardFormInput,\n\t});\n\n\tconst currentStep = WIZARD_STEPS[stepper.currentStep];\n\tconst WIZARD_STEPS_MAP = {\n\t\tTrigger: {\n\t\t\trender: () => <TriggerStep />,\n\t\t\ttrigger: () => form.trigger(\"trigger\"),\n\t\t},\n\t\tActions: {\n\t\t\trender: () => <ActionsStep />,\n\t\t\ttrigger: () => form.trigger(\"actions\"),\n\t\t},\n\t\tDetails: {\n\t\t\trender: () => <DetailsStep />,\n\t\t\ttrigger: () => form.trigger([\"description\", \"name\"]),\n\t\t},\n\t} as const;\n\n\tconst handleIncrementStep = async (step: WizardStep) => {\n\t\tconst isValid = await WIZARD_STEPS_MAP[step].trigger();\n\t\tif (isValid) {\n\t\t\tstepper.incrementStep();\n\t\t}\n\t};\n\n\treturn (\n\t\t<Form {...form}>\n\t\t\t<form onSubmit={(e) => void form.handleSubmit(onSubmit)(e)}>\n\t\t\t\t<div className=\"flex flex-col gap-8\">\n\t\t\t\t\t<Stepper\n\t\t\t\t\t\tsteps={WIZARD_STEPS}\n\t\t\t\t\t\tcurrentStepNum={stepper.currentStep}\n\t\t\t\t\t\tonClick={(step) => stepper.changeStep(step.stepNum)}\n\t\t\t\t\t\tcompletedSteps={stepper.completedStepsSet}\n\t\t\t\t\t\tvisitedSteps={stepper.visitedStepsSet}\n\t\t\t\t\t/>\n\t\t\t\t\t<Card className=\"p-4 pt-8\">\n\t\t\t\t\t\t<CardContent>\n\t\t\t\t\t\t\t{WIZARD_STEPS_MAP[currentStep].render()}\n\t\t\t\t\t\t\t<FormMessage>{form.formState.errors.root?.message}</FormMessage>\n\t\t\t\t\t\t</CardContent>\n\t\t\t\t\t\t<CardFooter className=\"mt-6 flex gap-2 justify-end\">\n\t\t\t\t\t\t\t<Button type=\"button\" variant=\"outline\">\n\t\t\t\t\t\t\t\t<Link to=\"/automations\">Cancel</Link>\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tdisabled={stepper.isStartingStep}\n\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\tonClick={stepper.decrementStep}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\tPrevious\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t{stepper.isFinalStep ? (\n\t\t\t\t\t\t\t\t<Button key=\"save\" type=\"submit\" loading={isSubmitting}>\n\t\t\t\t\t\t\t\t\t{submitLabel}\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tkey=\"next\"\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tonClick={() => void handleIncrementStep(currentStep)}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tNext\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</CardFooter>\n\t\t\t\t\t</Card>\n\t\t\t\t</div>\n\t\t\t</form>\n\t\t</Form>\n\t);\n};\n"],"names":["AUTOMATION_ACTION_TYPES","ActionTypeSelect","index","form","useFormContext","jsx","FormField","field","FormItem","FormLabel","FormControl","jsxs","Select","type","defaultActionField","getDefaultActionField","UNASSIGNED","SelectTrigger","SelectValue","SelectContent","SelectGroup","SelectLabel","key","SelectItem","DEFAULT_NUM_SKELETONS","LoadingSelectState","length","_","Skeleton","CallWebhookFields","search","setSearch","useState","blockTypes","isLoadingBlockTypes","useQuery","buildListFilterBlockTypesQuery","blockTypeSlugs","useMemo","bt","blockDocuments","isLoadingBlockDocuments","buildListFilterBlockDocumentsQuery","isLoading","groupedBlockDocuments","blockType","doc","group","filteredGroups","lowerSearch","getSelectedBlockDocument","useCallback","blockDocumentId","selectedDoc","Combobox","ComboboxTrigger","ComboboxContent","ComboboxCommandInput","ComboboxCommandEmtpy","ComboboxCommandList","ComboboxCommandGroup","ComboboxCommandItem","FormMessage","PayloadField","Icon","validateTemplate","useValidateTemplate","validationError","setValidationError","isValidating","setIsValidating","fieldValue","debouncedValue","useDebounce","useEffect","result","Textarea","ChangeFlowRunStateFields","stateField","Fragment","StateSelect","Input","RUN_STATES","FlowRunActionDescription","action","text","INFER_OPTION","getButtonLabel","data","automation","SelectAutomationsFields","isSuccess","buildListAutomationsQuery","deferredSearch","useDeferredValue","filteredData","isInferredOptionFiltered","buttonLabel","value","useListDeploymentsWithFlows","filter","deploymentsData","deploymentsStatus","buildPaginateDeploymentsQuery","deploymentsFlowIds","deployment","flowsData","flowsStatus","buildListFlowsQuery","flowMap","flow","deploymentsWithFlows","count","limit","pages","page","d","DeploymentLabel","SelectDeploymentsFields","actionType","deploymentId","useWatch","debouncedSearch","deploymentWithFlow","workPool","wp","SelectWorkPoolsFields","buildFilterWorkPoolsQuery","workQueue","wq","SelectWorkQueuesFields","buildFilterWorkQueuesQuery","filteredMap","filteredWorkQueues","work_pool_name","workPoolName","workQueues","SendNotificationFields","TemplateField","name","label","placeholder","multiline","InputComponent","ActionStep","onRemove","Button","ActionTypeAdditionalFields","ActionsStep","fields","append","remove","useFieldArray","id","DetailsStep","POSTURE_OPTIONS","DEFAULT_PROACTIVE_WITHIN","CustomPostureSelect","handlePostureChange","previousPosture","expectValues","afterValues","RadioGroup","option","RadioGroupItem","Label","SECONDS_IN_MINUTE","SECONDS_IN_HOUR","SECONDS_IN_DAY","DURATION_UNITS","getDefaultUnitForValue","DurationInput","onChange","min","max","className","disabled","unit","setUnit","availableUnits","quantity","handleQuantityChange","newQuantity","newValue","handleUnitChange","newUnitValue","newUnit","oldUnit","firstAvailable","cn","e","FALLBACK_MAX_DISPLAYED","PLUS_N_WIDTH","EventResourceCombobox","selectedResourceIds","onToggleResource","emptyMessage","containerWidth","setContainerWidth","containerRef","useRef","measureRef","container","observer","entries","entry","resourceOptions","useResourceOptions","groupedResources","groups","resource","a","b","lower","opt","showCustomOption","calculateVisibleCount","names","measureEl","availableWidth","visibleCount","i","renderSelectedResources","selectedNames","r","visible","extraCount","handleSelect","getEventPrefixValues","events","prefixCounts","event","parts","prefix","EventsCombobox","selectedEvents","onToggleEvent","occurredFilter","eventCounts","buildEventsCountQuery","options","eventLabels","prefixes","filteredOptions","renderSelectedEvents","visibleNames","overflow","CustomTriggerFields","posture","newEvents","resourceIds","resourceIdsArray","resourceId","newIds","Collapsible","CollapsibleTrigger","ChevronRight","CollapsibleContent","AutomationDeploymentCombobox","selectedDeploymentIds","onSelectDeploymentIds","selectedDeploymentsSet","deployments","buildFilterDeploymentsQuery","selectedDeploymentsData","handleSelectDeployment","updatedDeployments","handleClearAll","renderSelectedDeployments","selectedDeploymentNames","filteredDeployments","Checkbox","PostureSelect","MAX_WITHIN_SECONDS","DEPLOYMENT_STATUSES","DEPLOYMENT_RESOURCE_PREFIX","ALL_DEPLOYMENTS_PATTERN","extractDeploymentIds","matchValue","v","buildMatchPattern","deploymentIds","DeploymentStatusTriggerFields","handleDeploymentIdsChange","currentMatch","selectedStatus","status","MAX_VISIBLE_FLOWS","FlowMultiSelect","selectedFlowIds","onToggleFlow","flows","selectedFlowsData","filteredFlows","renderSelectedFlows","ALL_RUN_STATES","ALL_EXCEPT_SCHEDULED","isAllExceptScheduled","states","STATE_NAMES","StateMultiSelect","selectedStates","onStateChange","displayValue","filteredStates","showConvenienceOptions","handleConvenienceSelect","STATE_NAMES_WITHOUT_SCHEDULED","handleStateToggle","stateName","s","renderSelectedStates","StateBadge","STATE_NAME_TO_TYPE","toStateNameEvents","stateNames","fromStateNameEvents","extractFlowIdsFromMatchRelated","matchRelated","extractTagsFromMatchRelated","buildMatchRelated","flowIds","tags","flowResourceIds","tagResourceIds","tag","role","FlowRunStateTriggerFields","stateFieldName","selectedTags","handleFlowToggle","flowId","currentFlowIds","newFlowIds","newTags","handleTagsChange","showTagsInput","TagsInput","eventStrings","FormModeToggle","defaultValue","onValueChange","formContent","jsonContent","tabsProps","Tabs","TabsList","TabsTrigger","TabsContent","TriggerJsonInput","error","localError","setLocalError","formatJson","parsed","validate","json","TriggerSchema","z.ZodError","JsonInput","TEMPLATE_TRIGGERS","AutomationsTriggerTemplateSelect","TriggerTemplateSelectField","onTemplateChange","BASE_TRIGGER","getDefaultTriggerForTemplate","template","WorkPoolMultiSelect","selectedWorkPoolIds","onToggleWorkPool","workPools","filteredWorkPools","selectedWorkPoolsData","renderSelectedWorkPools","selectedWorkPoolNames","WORK_POOL_STATUSES","getStatusFromEvents","getEventsForStatus","statusValue","getEventsExceptStatus","extractWorkPoolIdsFromMatch","match","buildMatch","workPoolIds","StatusSelect","expect","after","currentStatus","handleStatusChange","statusEvents","otherStatusEvents","WorkPoolStatusTriggerFields","handleWorkPoolToggle","workPoolId","currentWorkPoolIds","newWorkPoolIds","WorkPoolsCombobox","WorkQueuesCombobox","selectedWorkQueueIds","onToggleWorkQueue","groupedWorkQueues","poolName","renderSelectedWorkQueues","selectedWorkQueueNames","WORK_QUEUE_STATUSES","extractWorkPoolIdsFromMatchRelated","extractWorkQueueIdsFromMatch","ids","workQueueIds","WorkQueueStatusTriggerFields","handleWorkQueueToggle","workQueueId","currentWorkQueueIds","newWorkQueueIds","TriggerStep","triggerTemplate","trigger","mode","setMode","jsonString","setJsonString","jsonError","setJsonError","serializeTrigger","validateAndParseJson","handleModeChange","newMode","handleJsonChange","handleTemplateChange","newTrigger","TriggerTemplateFields","WIZARD_STEPS","DEFAULT_FORM_VALUES","AutomationWizard","defaultValues","onSubmit","submitLabel","isSubmitting","initialVisitedSteps","stepper","useStepper","useForm","zodResolver","AutomationWizardSchema","currentStep","WIZARD_STEPS_MAP","handleIncrementStep","step","Form","Stepper","Card","CardContent","CardFooter","Link"],"mappings":"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"}