prefect 3.6.14.dev6__py3-none-any.whl → 3.6.15__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 (218) hide show
  1. prefect/_build_info.py +3 -3
  2. prefect/events/clients.py +40 -21
  3. prefect/server/api/concurrency_limits_v2.py +5 -3
  4. prefect/server/ui-v2/assets/{artifact-card-fXxwNG3f.js → artifact-card-BBzQR-Cj.js} +2 -2
  5. prefect/server/ui-v2/assets/{artifact-card-fXxwNG3f.js.map → artifact-card-BBzQR-Cj.js.map} +1 -1
  6. prefect/server/ui-v2/assets/artifact._id-BFdf1WUA.js +2 -0
  7. prefect/server/ui-v2/assets/artifact._id-BFdf1WUA.js.map +1 -0
  8. prefect/server/ui-v2/assets/{automation-wizard-bDZICLpV.js → automation-wizard-EYSfXlQ7.js} +2 -2
  9. prefect/server/ui-v2/assets/{automation-wizard-bDZICLpV.js.map → automation-wizard-EYSfXlQ7.js.map} +1 -1
  10. prefect/server/ui-v2/assets/{automation._id-CmDL_Eta.js → automation._id-Dn7jABys.js} +2 -2
  11. prefect/server/ui-v2/assets/{automation._id-CmDL_Eta.js.map → automation._id-Dn7jABys.js.map} +1 -1
  12. prefect/server/ui-v2/assets/{automation_._id.edit-DY7_SAuk.js → automation_._id.edit-COrqswD3.js} +2 -2
  13. prefect/server/ui-v2/assets/{automation_._id.edit-DY7_SAuk.js.map → automation_._id.edit-COrqswD3.js.map} +1 -1
  14. prefect/server/ui-v2/assets/{automations-header-CgxOgR53.js → automations-header-DN_dmMXW.js} +2 -2
  15. prefect/server/ui-v2/assets/{automations-header-CgxOgR53.js.map → automations-header-DN_dmMXW.js.map} +1 -1
  16. prefect/server/ui-v2/assets/{base-job-template-form-section-DilLn1Ul.js → base-job-template-form-section-De2ACYbw.js} +2 -2
  17. prefect/server/ui-v2/assets/{base-job-template-form-section-DilLn1Ul.js.map → base-job-template-form-section-De2ACYbw.js.map} +1 -1
  18. prefect/server/ui-v2/assets/{block-type-details-Cx4npO8Y.js → block-type-details-Cklc7TkK.js} +2 -2
  19. prefect/server/ui-v2/assets/{block-type-details-Cx4npO8Y.js.map → block-type-details-Cklc7TkK.js.map} +1 -1
  20. prefect/server/ui-v2/assets/block-type-logo-Cbpfxded.js +2 -0
  21. prefect/server/ui-v2/assets/{block-type-logo-FrtMLMYr.js.map → block-type-logo-Cbpfxded.js.map} +1 -1
  22. prefect/server/ui-v2/assets/{block._id-CWi9g5N3.js → block._id-tuz1Bcj2.js} +2 -2
  23. prefect/server/ui-v2/assets/{block._id-CWi9g5N3.js.map → block._id-tuz1Bcj2.js.map} +1 -1
  24. prefect/server/ui-v2/assets/{block_._id.edit-wf0QVPUL.js → block_._id.edit-CFEYhF5R.js} +2 -2
  25. prefect/server/ui-v2/assets/{block_._id.edit-wf0QVPUL.js.map → block_._id.edit-CFEYhF5R.js.map} +1 -1
  26. prefect/server/ui-v2/assets/{catalog-Iv1gLDUd.js → catalog-CCPRo7nY.js} +2 -2
  27. prefect/server/ui-v2/assets/{catalog-Iv1gLDUd.js.map → catalog-CCPRo7nY.js.map} +1 -1
  28. prefect/server/ui-v2/assets/{catalog_._slug-DEHFXZzp.js → catalog_._slug-Bl2J2oI3.js} +2 -2
  29. prefect/server/ui-v2/assets/{catalog_._slug-DEHFXZzp.js.map → catalog_._slug-Bl2J2oI3.js.map} +1 -1
  30. prefect/server/ui-v2/assets/{catalog_._slug_.create-C-vFPUOy.js → catalog_._slug_.create-9UD_SxDN.js} +2 -2
  31. prefect/server/ui-v2/assets/{catalog_._slug_.create-C-vFPUOy.js.map → catalog_._slug_.create-9UD_SxDN.js.map} +1 -1
  32. prefect/server/ui-v2/assets/{collapsible-BlEqjqQu.js → collapsible-BVQTBG_U.js} +2 -2
  33. prefect/server/ui-v2/assets/{collapsible-BlEqjqQu.js.map → collapsible-BVQTBG_U.js.map} +1 -1
  34. prefect/server/ui-v2/assets/{concurrency-limit._id-VfgyonlO.js → concurrency-limit._id-CsgRxA0a.js} +2 -2
  35. prefect/server/ui-v2/assets/{concurrency-limit._id-VfgyonlO.js.map → concurrency-limit._id-CsgRxA0a.js.map} +1 -1
  36. prefect/server/ui-v2/assets/{create-CC32TiFK.js → create-BycfZHGQ.js} +2 -2
  37. prefect/server/ui-v2/assets/{create-CC32TiFK.js.map → create-BycfZHGQ.js.map} +1 -1
  38. prefect/server/ui-v2/assets/{create-fSiDZ1kD.js → create-D--LHaji.js} +2 -2
  39. prefect/server/ui-v2/assets/{create-fSiDZ1kD.js.map → create-D--LHaji.js.map} +1 -1
  40. prefect/server/ui-v2/assets/{data-table-B2NqBPUR.js → data-table-rlbkLcrY.js} +2 -2
  41. prefect/server/ui-v2/assets/{data-table-B2NqBPUR.js.map → data-table-rlbkLcrY.js.map} +1 -1
  42. prefect/server/ui-v2/assets/delete-confirmation-dialog-DHkm2p8m.js +2 -0
  43. prefect/server/ui-v2/assets/{delete-confirmation-dialog-jlBI67Pk.js.map → delete-confirmation-dialog-DHkm2p8m.js.map} +1 -1
  44. prefect/server/ui-v2/assets/{deployment-action-header-C203ndcC.js → deployment-action-header-D5GOooPm.js} +2 -2
  45. prefect/server/ui-v2/assets/{deployment-action-header-C203ndcC.js.map → deployment-action-header-D5GOooPm.js.map} +1 -1
  46. prefect/server/ui-v2/assets/{deployment-form-DB4i73UE.js → deployment-form-wfg6HeAJ.js} +3 -3
  47. prefect/server/ui-v2/assets/{deployment-form-DB4i73UE.js.map → deployment-form-wfg6HeAJ.js.map} +1 -1
  48. prefect/server/ui-v2/assets/{deployment-links-UZYTtmnK.js → deployment-links-6iugOgDh.js} +2 -2
  49. prefect/server/ui-v2/assets/{deployment-links-UZYTtmnK.js.map → deployment-links-6iugOgDh.js.map} +1 -1
  50. prefect/server/ui-v2/assets/{deployment._id-Drmf70gG.js → deployment._id-Ci9zge5n.js} +2 -2
  51. prefect/server/ui-v2/assets/{deployment._id-Drmf70gG.js.map → deployment._id-Ci9zge5n.js.map} +1 -1
  52. prefect/server/ui-v2/assets/{deployment._id-Bk44iuUn.js → deployment._id-whsGcHdu.js} +2 -2
  53. prefect/server/ui-v2/assets/{deployment._id-Bk44iuUn.js.map → deployment._id-whsGcHdu.js.map} +1 -1
  54. prefect/server/ui-v2/assets/deployment_._id.duplicate-D9ZWkh8H.js +2 -0
  55. prefect/server/ui-v2/assets/{deployment_._id.duplicate-aUHtHuNO.js.map → deployment_._id.duplicate-D9ZWkh8H.js.map} +1 -1
  56. prefect/server/ui-v2/assets/deployment_._id.edit-CS7sObzC.js +2 -0
  57. prefect/server/ui-v2/assets/{deployment_._id.edit-CPRKkA-W.js.map → deployment_._id.edit-CS7sObzC.js.map} +1 -1
  58. prefect/server/ui-v2/assets/{deployment_._id.run-C8EGDJeT.js → deployment_._id.run-g7SZuDFi.js} +2 -2
  59. prefect/server/ui-v2/assets/{deployment_._id.run-C8EGDJeT.js.map → deployment_._id.run-g7SZuDFi.js.map} +1 -1
  60. prefect/server/ui-v2/assets/{dropdown-menu-CT6uZu-V.js → dropdown-menu-0atiOSFo.js} +2 -2
  61. prefect/server/ui-v2/assets/{dropdown-menu-CT6uZu-V.js.map → dropdown-menu-0atiOSFo.js.map} +1 -1
  62. prefect/server/ui-v2/assets/{event-resource-display-DmCKu0PD.js → event-resource-display-DHiAb1Up.js} +2 -2
  63. prefect/server/ui-v2/assets/{event-resource-display-DmCKu0PD.js.map → event-resource-display-DHiAb1Up.js.map} +1 -1
  64. prefect/server/ui-v2/assets/{event._eventDate._eventId-DqO9viGu.js → event._eventDate._eventId-D7Twzb22.js} +2 -2
  65. prefect/server/ui-v2/assets/{event._eventDate._eventId-DqO9viGu.js.map → event._eventDate._eventId-D7Twzb22.js.map} +1 -1
  66. prefect/server/ui-v2/assets/flow-run-graph-BhzuSJLm.js +2 -0
  67. prefect/server/ui-v2/assets/{flow-run-graph-CIvkp1kl.js.map → flow-run-graph-BhzuSJLm.js.map} +1 -1
  68. prefect/server/ui-v2/assets/{flow-run._id-DyUEsBSd.js → flow-run._id-CqpH6bvx.js} +2 -2
  69. prefect/server/ui-v2/assets/{flow-run._id-DyUEsBSd.js.map → flow-run._id-CqpH6bvx.js.map} +1 -1
  70. prefect/server/ui-v2/assets/flow-run._id-RLy2kBh0.js +4 -0
  71. prefect/server/ui-v2/assets/flow-run._id-RLy2kBh0.js.map +1 -0
  72. prefect/server/ui-v2/assets/{flow-run._id-xahYswsG.js → flow-run._id-lIIQBD7H.js} +2 -2
  73. prefect/server/ui-v2/assets/{flow-run._id-xahYswsG.js.map → flow-run._id-lIIQBD7H.js.map} +1 -1
  74. prefect/server/ui-v2/assets/{flow-runs-pagination--FfnMca3.js → flow-runs-pagination-BATUweRV.js} +2 -2
  75. prefect/server/ui-v2/assets/{flow-runs-pagination--FfnMca3.js.map → flow-runs-pagination-BATUweRV.js.map} +1 -1
  76. prefect/server/ui-v2/assets/{flow._id-C_ho4p55.js → flow._id-BdQGWPKP.js} +2 -2
  77. prefect/server/ui-v2/assets/{flow._id-C_ho4p55.js.map → flow._id-BdQGWPKP.js.map} +1 -1
  78. prefect/server/ui-v2/assets/{form-CxD6-5Qf.js → form-DLrbC7rV.js} +2 -2
  79. prefect/server/ui-v2/assets/{form-CxD6-5Qf.js.map → form-DLrbC7rV.js.map} +1 -1
  80. prefect/server/ui-v2/assets/{header-CYjjmMrB.js → header-BTAWyeXv.js} +2 -2
  81. prefect/server/ui-v2/assets/{header-CYjjmMrB.js.map → header-BTAWyeXv.js.map} +1 -1
  82. prefect/server/ui-v2/assets/{header-Cjet3B6Z.js → header-ChFAx5uR.js} +2 -2
  83. prefect/server/ui-v2/assets/{header-Cjet3B6Z.js.map → header-ChFAx5uR.js.map} +1 -1
  84. prefect/server/ui-v2/assets/{header-iN9gVtk7.js → header-CyQqOj1w.js} +2 -2
  85. prefect/server/ui-v2/assets/{header-iN9gVtk7.js.map → header-CyQqOj1w.js.map} +1 -1
  86. prefect/server/ui-v2/assets/{index-C2ayqOiQ.js → index-7i4X9TeK.js} +2 -2
  87. prefect/server/ui-v2/assets/{index-C2ayqOiQ.js.map → index-7i4X9TeK.js.map} +1 -1
  88. prefect/server/ui-v2/assets/{index-ltOkPb3X.js → index-BaWDC4da.js} +2 -2
  89. prefect/server/ui-v2/assets/{index-ltOkPb3X.js.map → index-BaWDC4da.js.map} +1 -1
  90. prefect/server/ui-v2/assets/{index-d9_i_klL.js → index-BkiGTHwU.js} +2 -2
  91. prefect/server/ui-v2/assets/{index-d9_i_klL.js.map → index-BkiGTHwU.js.map} +1 -1
  92. prefect/server/ui-v2/assets/{index-B5eJQPOP.js → index-Btb_-PDp.js} +2 -2
  93. prefect/server/ui-v2/assets/{index-B5eJQPOP.js.map → index-Btb_-PDp.js.map} +1 -1
  94. prefect/server/ui-v2/assets/{index-Cwd5Gvad.js → index-BwCLKpNb.js} +2 -2
  95. prefect/server/ui-v2/assets/{index-Cwd5Gvad.js.map → index-BwCLKpNb.js.map} +1 -1
  96. prefect/server/ui-v2/assets/{index-CT2kL3dS.js → index-CHf6xi9j.js} +2 -2
  97. prefect/server/ui-v2/assets/{index-CT2kL3dS.js.map → index-CHf6xi9j.js.map} +1 -1
  98. prefect/server/ui-v2/assets/{index-DQOPH4Rq.js → index-CKGj5lSu.js} +2 -2
  99. prefect/server/ui-v2/assets/{index-DQOPH4Rq.js.map → index-CKGj5lSu.js.map} +1 -1
  100. prefect/server/ui-v2/assets/index-COouj_0-.css +1 -0
  101. prefect/server/ui-v2/assets/{index-D0ANIqVp.js → index-CQnWiUE5.js} +2 -2
  102. prefect/server/ui-v2/assets/{index-D0ANIqVp.js.map → index-CQnWiUE5.js.map} +1 -1
  103. prefect/server/ui-v2/assets/{index-D4df3B9r.js → index-CiSFHkhI.js} +2 -2
  104. prefect/server/ui-v2/assets/{index-D4df3B9r.js.map → index-CiSFHkhI.js.map} +1 -1
  105. prefect/server/ui-v2/assets/{index-CSQa2wYx.js → index-CnlN-VC_.js} +2 -2
  106. prefect/server/ui-v2/assets/{index-CSQa2wYx.js.map → index-CnlN-VC_.js.map} +1 -1
  107. prefect/server/ui-v2/assets/{index-BfXKkd3I.js → index-CxUfZRkN.js} +2 -2
  108. prefect/server/ui-v2/assets/{index-BfXKkd3I.js.map → index-CxUfZRkN.js.map} +1 -1
  109. prefect/server/ui-v2/assets/{index-DI-aZXNg.js → index-D5RT-SAp.js} +2 -2
  110. prefect/server/ui-v2/assets/{index-DI-aZXNg.js.map → index-D5RT-SAp.js.map} +1 -1
  111. prefect/server/ui-v2/assets/{index-CTeNzxT9.js → index-DATPYZfT.js} +2 -2
  112. prefect/server/ui-v2/assets/{index-CTeNzxT9.js.map → index-DATPYZfT.js.map} +1 -1
  113. prefect/server/ui-v2/assets/{index-CfMaY6sy.js → index-DNh9ZBy4.js} +2 -2
  114. prefect/server/ui-v2/assets/{index-CfMaY6sy.js.map → index-DNh9ZBy4.js.map} +1 -1
  115. prefect/server/ui-v2/assets/{index-C3A0XavU.js → index-DQGif3jm.js} +2 -2
  116. prefect/server/ui-v2/assets/{index-C3A0XavU.js.map → index-DQGif3jm.js.map} +1 -1
  117. prefect/server/ui-v2/assets/{index-BF3HB5BS.js → index-Eqdr6Ff7.js} +2 -2
  118. prefect/server/ui-v2/assets/{index-BF3HB5BS.js.map → index-Eqdr6Ff7.js.map} +1 -1
  119. prefect/server/ui-v2/assets/{index-D8SbV2Tp.js → index-VH4TnZ4e.js} +2 -2
  120. prefect/server/ui-v2/assets/{index-D8SbV2Tp.js.map → index-VH4TnZ4e.js.map} +1 -1
  121. prefect/server/ui-v2/assets/{index-0opjCZAR.js → index-kP_I5Qfd.js} +2 -2
  122. prefect/server/ui-v2/assets/{index-0opjCZAR.js.map → index-kP_I5Qfd.js.map} +1 -1
  123. prefect/server/ui-v2/assets/{index-D-yYhKPg.js → index-lyQav_XM.js} +2 -2
  124. prefect/server/ui-v2/assets/{index-D-yYhKPg.js.map → index-lyQav_XM.js.map} +1 -1
  125. prefect/server/ui-v2/assets/{index-nxDkMXcY.js → index-m48E4KcG.js} +13 -13
  126. prefect/server/ui-v2/assets/index-m48E4KcG.js.map +1 -0
  127. prefect/server/ui-v2/assets/{json-input-BGfZindW.js → json-input-Ba-BeBcw.js} +2 -2
  128. prefect/server/ui-v2/assets/{json-input-BGfZindW.js.map → json-input-Ba-BeBcw.js.map} +1 -1
  129. prefect/server/ui-v2/assets/key-value-DkSKn6jE.js +2 -0
  130. prefect/server/ui-v2/assets/key-value-DkSKn6jE.js.map +1 -0
  131. prefect/server/ui-v2/assets/{key._key-mnO405kp.js → key._key-Cjx57ymg.js} +2 -2
  132. prefect/server/ui-v2/assets/{key._key-mnO405kp.js.map → key._key-Cjx57ymg.js.map} +1 -1
  133. prefect/server/ui-v2/assets/{lazy-markdown-CLclUkkd.js → lazy-markdown-Du2Xu3Yp.js} +2 -2
  134. prefect/server/ui-v2/assets/{lazy-markdown-CLclUkkd.js.map → lazy-markdown-Du2Xu3Yp.js.map} +1 -1
  135. prefect/server/ui-v2/assets/{login-ST_-h2GY.js → login-DxMF9Jvj.js} +2 -2
  136. prefect/server/ui-v2/assets/{login-ST_-h2GY.js.map → login-DxMF9Jvj.js.map} +1 -1
  137. prefect/server/ui-v2/assets/{markdown-input-DemuemAs.js → markdown-input-DPi8zyRr.js} +2 -2
  138. prefect/server/ui-v2/assets/{markdown-input-DemuemAs.js.map → markdown-input-DPi8zyRr.js.map} +1 -1
  139. prefect/server/ui-v2/assets/{python-example-snippet-BUllaeTS.js → python-example-snippet-DfCFYPN_.js} +3 -3
  140. prefect/server/ui-v2/assets/{python-example-snippet-BUllaeTS.js.map → python-example-snippet-DfCFYPN_.js.map} +1 -1
  141. prefect/server/ui-v2/assets/{python-input-DTpMdYLs.js → python-input-mr6GD840.js} +2 -2
  142. prefect/server/ui-v2/assets/{python-input-DTpMdYLs.js.map → python-input-mr6GD840.js.map} +1 -1
  143. prefect/server/ui-v2/assets/{radio-group-CJhtPDwC.js → radio-group-Co3cN0Kv.js} +2 -2
  144. prefect/server/ui-v2/assets/{radio-group-CJhtPDwC.js.map → radio-group-Co3cN0Kv.js.map} +1 -1
  145. prefect/server/ui-v2/assets/{route-error-state-D0wedcpP.js → route-error-state-DnBaNT2T.js} +2 -2
  146. prefect/server/ui-v2/assets/{route-error-state-D0wedcpP.js.map → route-error-state-DnBaNT2T.js.map} +1 -1
  147. prefect/server/ui-v2/assets/{schema-form-Cx-6swYW.js → schema-form-CWDHSME9.js} +2 -2
  148. prefect/server/ui-v2/assets/{schema-form-Cx-6swYW.js.map → schema-form-CWDHSME9.js.map} +1 -1
  149. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-CZkUje5U.js → schema-form-input-string-format-datetime-BSWlW_aQ.js} +4 -4
  150. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-CZkUje5U.js.map → schema-form-input-string-format-datetime-BSWlW_aQ.js.map} +1 -1
  151. prefect/server/ui-v2/assets/{settings-nHtCkknH.js → settings-DU5y6tJE.js} +2 -2
  152. prefect/server/ui-v2/assets/{settings-nHtCkknH.js.map → settings-DU5y6tJE.js.map} +1 -1
  153. prefect/server/ui-v2/assets/{sort-filter-QjOHFWPI.js → sort-filter-DpuWNkQo.js} +2 -2
  154. prefect/server/ui-v2/assets/{sort-filter-QjOHFWPI.js.map → sort-filter-DpuWNkQo.js.map} +1 -1
  155. prefect/server/ui-v2/assets/{table-Bx2Ol4j-.js → table-bBL6C0ZK.js} +2 -2
  156. prefect/server/ui-v2/assets/{table-Bx2Ol4j-.js.map → table-bBL6C0ZK.js.map} +1 -1
  157. prefect/server/ui-v2/assets/{tags-input-C7cxdTyV.js → tags-input-BLPMVWpZ.js} +2 -2
  158. prefect/server/ui-v2/assets/{tags-input-C7cxdTyV.js.map → tags-input-BLPMVWpZ.js.map} +1 -1
  159. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-CG2F0Ufy.js → task-run-concurrency-limits-reset-dialog-S69sih55.js} +2 -2
  160. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-CG2F0Ufy.js.map → task-run-concurrency-limits-reset-dialog-S69sih55.js.map} +1 -1
  161. prefect/server/ui-v2/assets/{task-run._id-CapS5wad.js → task-run._id-B_tIDm4K.js} +2 -2
  162. prefect/server/ui-v2/assets/{task-run._id-CapS5wad.js.map → task-run._id-B_tIDm4K.js.map} +1 -1
  163. prefect/server/ui-v2/assets/{task-run._id-CevQxX-E.js → task-run._id-Dl3Azs8t.js} +2 -2
  164. prefect/server/ui-v2/assets/{task-run._id-CevQxX-E.js.map → task-run._id-Dl3Azs8t.js.map} +1 -1
  165. prefect/server/ui-v2/assets/{task-runs-pagination-Dbwa2yPe.js → task-runs-pagination-VdR-LO4r.js} +2 -2
  166. prefect/server/ui-v2/assets/{task-runs-pagination-Dbwa2yPe.js.map → task-runs-pagination-VdR-LO4r.js.map} +1 -1
  167. prefect/server/ui-v2/assets/{textarea-vy4DM6KG.js → textarea-B3_TtPRi.js} +2 -2
  168. prefect/server/ui-v2/assets/{textarea-vy4DM6KG.js.map → textarea-B3_TtPRi.js.map} +1 -1
  169. prefect/server/ui-v2/assets/{timezone-select-DDUTUy-L.js → timezone-select-BuPYznge.js} +2 -2
  170. prefect/server/ui-v2/assets/{timezone-select-DDUTUy-L.js.map → timezone-select-BuPYznge.js.map} +1 -1
  171. prefect/server/ui-v2/assets/{toggle-group-Dx_fy9WJ.js → toggle-group-Cn07UIim.js} +2 -2
  172. prefect/server/ui-v2/assets/{toggle-group-Dx_fy9WJ.js.map → toggle-group-Cn07UIim.js.map} +1 -1
  173. prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-ClQsotEa.js → use-delete-automation-confirmation-dialog-DpdsLH4t.js} +2 -2
  174. prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-ClQsotEa.js.map → use-delete-automation-confirmation-dialog-DpdsLH4t.js.map} +1 -1
  175. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-DM0Dy1PL.js → use-delete-block-document-confirmation-dialog-Cq5nGhzr.js} +2 -2
  176. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-DM0Dy1PL.js.map → use-delete-block-document-confirmation-dialog-Cq5nGhzr.js.map} +1 -1
  177. prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-UhMaQqzZ.js → use-flow-runs-selected-rows-DmQSWBTu.js} +2 -2
  178. prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-UhMaQqzZ.js.map → use-flow-runs-selected-rows-DmQSWBTu.js.map} +1 -1
  179. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-P8C-ARMZ.js → use-get-artifacts-flow-task-runs-DTwcWiqW.js} +2 -2
  180. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-P8C-ARMZ.js.map → use-get-artifacts-flow-task-runs-DTwcWiqW.js.map} +1 -1
  181. prefect/server/ui-v2/assets/{use-quick-run-DT0VEa9Z.js → use-quick-run-CPempwLh.js} +2 -2
  182. prefect/server/ui-v2/assets/{use-quick-run-DT0VEa9Z.js.map → use-quick-run-CPempwLh.js.map} +1 -1
  183. prefect/server/ui-v2/assets/{use-state-favicon-DfEAuEQL.js → use-state-favicon-M09DmrNy.js} +2 -2
  184. prefect/server/ui-v2/assets/{use-state-favicon-DfEAuEQL.js.map → use-state-favicon-M09DmrNy.js.map} +1 -1
  185. prefect/server/ui-v2/assets/{use-stepper-1OG0a_eo.js → use-stepper-CDucnvzp.js} +2 -2
  186. prefect/server/ui-v2/assets/{use-stepper-1OG0a_eo.js.map → use-stepper-CDucnvzp.js.map} +1 -1
  187. prefect/server/ui-v2/assets/{utilities-DabzLyXd.js → utilities-BRCNRcQl.js} +2 -2
  188. prefect/server/ui-v2/assets/{utilities-DabzLyXd.js.map → utilities-BRCNRcQl.js.map} +1 -1
  189. prefect/server/ui-v2/assets/{work-pool-filter-CTTGgdIN.js → work-pool-filter-C2tpSS-w.js} +2 -2
  190. prefect/server/ui-v2/assets/{work-pool-filter-CTTGgdIN.js.map → work-pool-filter-C2tpSS-w.js.map} +1 -1
  191. prefect/server/ui-v2/assets/{work-pool-queue-toggle-B9KQxNdY.js → work-pool-queue-toggle-BQ9b-Wxy.js} +2 -2
  192. prefect/server/ui-v2/assets/{work-pool-queue-toggle-B9KQxNdY.js.map → work-pool-queue-toggle-BQ9b-Wxy.js.map} +1 -1
  193. prefect/server/ui-v2/assets/{work-pool._workPoolName-CGqG95Pv.js → work-pool._workPoolName-C_LiL3SE.js} +2 -2
  194. prefect/server/ui-v2/assets/{work-pool._workPoolName-CGqG95Pv.js.map → work-pool._workPoolName-C_LiL3SE.js.map} +1 -1
  195. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-CcFrethu.js → work-pool_._workPoolName.edit-DBHlrVVx.js} +2 -2
  196. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-CcFrethu.js.map → work-pool_._workPoolName.edit-DBHlrVVx.js.map} +1 -1
  197. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-CwPnpSI9.js → work-pool_._workPoolName.queue._workQueueName-DkITxJOP.js} +2 -2
  198. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-CwPnpSI9.js.map → work-pool_._workPoolName.queue._workQueueName-DkITxJOP.js.map} +1 -1
  199. prefect/server/ui-v2/assets/{work-queue-icon-text-Bix0rRM1.js → work-queue-icon-text-D4BWBVDN.js} +2 -2
  200. prefect/server/ui-v2/assets/{work-queue-icon-text-Bix0rRM1.js.map → work-queue-icon-text-D4BWBVDN.js.map} +1 -1
  201. prefect/server/ui-v2/index.html +2 -2
  202. prefect/testing/fixtures.py +14 -13
  203. {prefect-3.6.14.dev6.dist-info → prefect-3.6.15.dist-info}/METADATA +2 -2
  204. {prefect-3.6.14.dev6.dist-info → prefect-3.6.15.dist-info}/RECORD +207 -205
  205. prefect/server/ui-v2/assets/artifact._id-BIyzb0Jb.js +0 -2
  206. prefect/server/ui-v2/assets/artifact._id-BIyzb0Jb.js.map +0 -1
  207. prefect/server/ui-v2/assets/block-type-logo-FrtMLMYr.js +0 -2
  208. prefect/server/ui-v2/assets/delete-confirmation-dialog-jlBI67Pk.js +0 -2
  209. prefect/server/ui-v2/assets/deployment_._id.duplicate-aUHtHuNO.js +0 -2
  210. prefect/server/ui-v2/assets/deployment_._id.edit-CPRKkA-W.js +0 -2
  211. prefect/server/ui-v2/assets/flow-run-graph-CIvkp1kl.js +0 -2
  212. prefect/server/ui-v2/assets/flow-run._id-BT3wztDF.js +0 -4
  213. prefect/server/ui-v2/assets/flow-run._id-BT3wztDF.js.map +0 -1
  214. prefect/server/ui-v2/assets/index-CYc_PWA3.css +0 -1
  215. prefect/server/ui-v2/assets/index-nxDkMXcY.js.map +0 -1
  216. {prefect-3.6.14.dev6.dist-info → prefect-3.6.15.dist-info}/WHEEL +0 -0
  217. {prefect-3.6.14.dev6.dist-info → prefect-3.6.15.dist-info}/entry_points.txt +0 -0
  218. {prefect-3.6.14.dev6.dist-info → prefect-3.6.15.dist-info}/licenses/LICENSE +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"artifact._id-BIyzb0Jb.js","sources":["../../src/components/artifacts/artifact/artifact-detail-header.tsx","../../src/components/artifacts/artifact/artifact-raw-data-display.tsx","../../src/components/artifacts/artifact/detail-image.tsx","../../src/components/artifacts/artifact/detail-markdown.tsx","../../src/components/artifacts/artifact/detail-progress.tsx","../../src/components/artifacts/artifact/detail-table.tsx","../../src/components/artifacts/artifact/artifact-detail-page.tsx","../../src/routes/artifacts/artifact.$id.tsx?tsr-split=component"],"sourcesContent":["import type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n\tBreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { DocsLink } from \"@/components/ui/docs-link\";\nimport { LazyMarkdown } from \"@/components/ui/lazy-markdown\";\nimport { Typography } from \"@/components/ui/typography\";\n\nexport type ArtifactDetailHeaderProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const ArtifactDetailHeader = ({\n\tartifact,\n}: ArtifactDetailHeaderProps) => {\n\tlet header = <></>;\n\tif (artifact.key) {\n\t\theader = (\n\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t<Breadcrumb>\n\t\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\t\t\tto=\"/artifacts/key/$key\"\n\t\t\t\t\t\t\t\tparams={{ key: artifact.key }}\n\t\t\t\t\t\t\t\tclassName=\"text-xl font-semibold\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{artifact.key}\n\t\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\t\t{artifact.id}\n\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t</BreadcrumbList>\n\t\t\t\t</Breadcrumb>\n\t\t\t</div>\n\t\t);\n\t} else {\n\t\theader = (\n\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t<Breadcrumb>\n\t\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t\t{artifact.flow_run && (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\t\t\t\t\tto=\"/runs/flow-run/$id\"\n\t\t\t\t\t\t\t\t\t\tparams={{ id: artifact.flow_run_id ?? \"\" }}\n\t\t\t\t\t\t\t\t\t\tclassName=\"text-xl font-semibold\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{artifact.flow_run.name}\n\t\t\t\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{artifact.task_run && (\n\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\t\t\t\t\tto=\"/runs/task-run/$id\"\n\t\t\t\t\t\t\t\t\t\tparams={{ id: artifact.task_run_id ?? \"\" }}\n\t\t\t\t\t\t\t\t\t\tclassName=\"text-xl font-semibold\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{artifact.task_run.name}\n\t\t\t\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\t\t{artifact.id}\n\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t</BreadcrumbList>\n\t\t\t\t</Breadcrumb>\n\t\t\t</div>\n\t\t);\n\t}\n\treturn (\n\t\t<>\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t{header}\n\t\t\t\t<DocsLink id=\"artifacts-guide\" label=\"Documentation\" />\n\t\t\t</div>\n\t\t\t{artifact.description && (\n\t\t\t\t<div className=\"\">\n\t\t\t\t\t<Typography variant=\"h2\" className=\"my-4 font-bold prose lg:prose-xl\">\n\t\t\t\t\t\t<LazyMarkdown>{artifact.description}</LazyMarkdown>\n\t\t\t\t\t</Typography>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<hr />\n\t\t</>\n\t);\n};\n","import { EditorView, useCodeMirror } from \"@uiw/react-codemirror\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\n\ntype ArtifactDataDisplayProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const ArtifactDataDisplay = ({ artifact }: ArtifactDataDisplayProps) => {\n\tconst [showData, setShowData] = useState(false);\n\n\tconst toggleShowData = () => {\n\t\tsetShowData((val) => !val);\n\t};\n\n\tconst editor = useRef<HTMLDivElement | null>(null);\n\tconst basicSetup = {\n\t\thighlightActiveLine: false,\n\t\tfoldGutter: false,\n\t\thighlightActiveLineGutter: false,\n\t};\n\tconst { setContainer } = useCodeMirror({\n\t\tcontainer: editor.current,\n\t\textensions: [EditorView.lineWrapping],\n\t\tvalue: String(artifact.data),\n\t\tindentWithTab: false,\n\t\teditable: true,\n\t\tbasicSetup,\n\t});\n\n\tuseEffect(() => {\n\t\tif (editor.current) {\n\t\t\tsetContainer(editor.current);\n\t\t}\n\t}, [setContainer]);\n\n\tconst handleCopy = (_value: string) => {\n\t\ttoast.success(\"Copied to clipboard\");\n\t\tvoid navigator.clipboard.writeText(_value);\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-col justify-center items-center\">\n\t\t\t<Button\n\t\t\t\tdata-testid=\"show-raw-data-button\"\n\t\t\t\tvariant={\"outline\"}\n\t\t\t\tonClick={toggleShowData}\n\t\t\t\tclassName=\"my-4\"\n\t\t\t>\n\t\t\t\t{showData ? \"Hide\" : \"Show\"} Raw Data\n\t\t\t</Button>\n\n\t\t\t<div\n\t\t\t\tclassName=\"rounded-md border shadow-xs focus-within:outline-hidden focus-within:ring-1 focus-within:ring-ring relative\"\n\t\t\t\tstyle={{\n\t\t\t\t\tdisplay: showData ? \"block\" : \"none\",\n\t\t\t\t}}\n\t\t\t\tref={(node) => {\n\t\t\t\t\teditor.current = node;\n\t\t\t\t}}\n\t\t\t\tdata-testid=\"raw-data-display\"\n\t\t\t>\n\t\t\t\t<Button\n\t\t\t\t\tonClick={() => handleCopy(artifact.data as string)}\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tclassName=\"absolute top-0 right-0 z-10\"\n\t\t\t\t\taria-label=\"copy\"\n\t\t\t\t>\n\t\t\t\t\t<Icon id=\"Copy\" className=\"size-2\" />\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { Typography } from \"@/components/ui/typography\";\n\nexport type DetailImageProps = {\n\turl: string;\n};\n\nexport const DetailImage = ({ url }: DetailImageProps) => {\n\treturn (\n\t\t<div data-testid={url} className=\"prose mt-2\">\n\t\t\t<img\n\t\t\t\tdata-testid={`image-${url}`}\n\t\t\t\tsrc={url}\n\t\t\t\talt=\"artifact-image\"\n\t\t\t\tclassName=\"w-full\"\n\t\t\t/>\n\n\t\t\t<Typography variant=\"bodyLarge\">\n\t\t\t\tImage URL:{\" \"}\n\t\t\t\t<a\n\t\t\t\t\tclassName=\"text-blue-700 hover:underline\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\thref={url}\n\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t>\n\t\t\t\t\t{url}\n\t\t\t\t</a>\n\t\t\t</Typography>\n\t\t</div>\n\t);\n};\n","import { LazyMarkdown } from \"@/components/ui/lazy-markdown\";\n\nexport type DetailMarkdownProps = {\n\tmarkdown: string;\n};\n\nexport const DetailMarkdown = ({ markdown }: DetailMarkdownProps) => {\n\treturn (\n\t\t<div data-testid=\"markdown-display\" className=\"mt-4 prose\">\n\t\t\t<LazyMarkdown>{markdown}</LazyMarkdown>\n\t\t</div>\n\t);\n};\n","import { Typography } from \"@/components/ui/typography\";\n\nexport type DetailProgressProps = {\n\tprogress: number;\n};\n\nexport const DetailProgress = ({ progress }: DetailProgressProps) => {\n\treturn (\n\t\t<Typography data-testid=\"progress-display\" variant=\"bodyLarge\">\n\t\t\tProgress: {progress}%\n\t\t</Typography>\n\t);\n};\n","import { useMemo, useState } from \"react\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport {\n\tTable,\n\tTableBody,\n\tTableCell,\n\tTableHead,\n\tTableHeader,\n\tTableRow,\n} from \"@/components/ui/table\";\n\nexport type DetailTableProps = {\n\ttableData: string;\n};\n\nexport const DetailTable = ({ tableData }: DetailTableProps) => {\n\tconst table = JSON.parse(tableData) as Record<string, string>[];\n\tconst headers = Object.keys(table[0]);\n\tconst [input, setInput] = useState<string>(\"\");\n\n\tconst filteredTable = useMemo(() => {\n\t\treturn table.filter((row) => {\n\t\t\treturn Object.values(row).some((value: string) =>\n\t\t\t\tString(value).toLowerCase().includes(input.toLowerCase()),\n\t\t\t);\n\t\t});\n\t}, [input, table]);\n\n\treturn (\n\t\t<div data-testid=\"table-display\" className=\"mt-4\">\n\t\t\t<div className=\"flex flex-row justify-end items-center mb-2\">\n\t\t\t\t<div>\n\t\t\t\t\t<SearchInput\n\t\t\t\t\t\tplaceholder=\"Search\"\n\t\t\t\t\t\tvalue={input}\n\t\t\t\t\t\tonChange={(e) => setInput(e.target.value)}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"rounded-md border\">\n\t\t\t\t<Table>\n\t\t\t\t\t<TableHeader className=\"bg-muted\">\n\t\t\t\t\t\t<TableRow>\n\t\t\t\t\t\t\t{headers.map((header) => {\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<TableHead key={header} className=\"py-2 text-foreground\">\n\t\t\t\t\t\t\t\t\t\t{header}\n\t\t\t\t\t\t\t\t\t</TableHead>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t</TableHeader>\n\t\t\t\t\t<TableBody>\n\t\t\t\t\t\t{filteredTable.map((row) => {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<TableRow key={row.id}>\n\t\t\t\t\t\t\t\t\t{headers.map((header) => {\n\t\t\t\t\t\t\t\t\t\treturn <TableCell key={header}>{row[header]}</TableCell>;\n\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</TableBody>\n\t\t\t\t</Table>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { useMemo } from \"react\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { ArtifactDetailHeader } from \"./artifact-detail-header\";\nimport { ArtifactDataDisplay } from \"./artifact-raw-data-display\";\nimport { DetailImage } from \"./detail-image\";\nimport { DetailMarkdown } from \"./detail-markdown\";\nimport { DetailProgress } from \"./detail-progress\";\nimport { DetailTable } from \"./detail-table\";\n\nexport type ArtifactDetailPageProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const ArtifactDetailPage = ({ artifact }: ArtifactDetailPageProps) => {\n\tconst mapArtifactHoc = useMemo(() => {\n\t\tswitch (artifact.type) {\n\t\t\tcase \"markdown\":\n\t\t\tcase \"link\":\n\t\t\t\treturn <DetailMarkdown markdown={artifact.data as string} />;\n\t\t\tcase \"image\":\n\t\t\t\treturn <DetailImage url={artifact.data as string} />;\n\t\t\tcase \"progress\":\n\t\t\t\treturn <DetailProgress progress={artifact.data as number} />;\n\t\t\tcase \"table\":\n\t\t\t\treturn <DetailTable tableData={artifact.data as string} />;\n\t\t\tdefault:\n\t\t\t\treturn <pre>{JSON.stringify(artifact.data, null, 2)}</pre>;\n\t\t}\n\t}, [artifact]);\n\treturn (\n\t\t<div>\n\t\t\t<ArtifactDetailHeader artifact={artifact} />\n\t\t\t{mapArtifactHoc}\n\t\t\t<ArtifactDataDisplay artifact={artifact} />\n\t\t</div>\n\t);\n};\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { buildGetArtifactQuery } from \"@/api/artifacts\";\nimport { useGetArtifactFlowTaskRuns } from \"@/api/artifacts/use-get-artifacts-flow-task-runs/use-get-artifacts-flow-task-runs\";\nimport { ArtifactDetailPage } from \"@/components/artifacts/artifact/artifact-detail-page\";\n\nexport const Route = createFileRoute(\"/artifacts/artifact/$id\")({\n\tcomponent: RouteComponent,\n\tloader: async ({ context, params }) => {\n\t\tconst { id } = params;\n\n\t\tconst artifact = await context.queryClient.ensureQueryData(\n\t\t\tbuildGetArtifactQuery(id),\n\t\t);\n\n\t\treturn { artifact };\n\t},\n});\n\nfunction RouteComponent() {\n\tconst { id } = Route.useParams();\n\n\tconst { data: artifact } = useSuspenseQuery(buildGetArtifactQuery(id));\n\n\tconst artifactWithMetadata = useGetArtifactFlowTaskRuns(id);\n\n\treturn <ArtifactDetailPage artifact={artifactWithMetadata ?? artifact} />;\n}\n"],"names":["ArtifactDetailHeader","artifact","header","jsx","Fragment","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","jsxs","DocsLink","Typography","LazyMarkdown","ArtifactDataDisplay","showData","setShowData","useState","toggleShowData","val","editor","useRef","basicSetup","setContainer","useCodeMirror","EditorView","useEffect","handleCopy","_value","toast","Button","node","Icon","DetailImage","url","DetailMarkdown","markdown","DetailProgress","progress","DetailTable","tableData","table","headers","input","setInput","filteredTable","useMemo","row","value","SearchInput","e","Table","TableHeader","TableRow","TableHead","TableBody","TableCell","ArtifactDetailPage","mapArtifactHoc","RouteComponent","id","Route","useParams","data","useSuspenseQuery","buildGetArtifactQuery","artifactWithMetadata","useGetArtifactFlowTaskRuns"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{j as a}from"./vendor-tanstack-BcZfOOfy.js";import{cr as e}from"./index-nxDkMXcY.js";const c=({alt:o,logoUrl:s,size:r="sm"})=>a.jsx("img",{alt:o,src:s??void 0,className:i({size:r})}),i=e("border-4 bg-gray-200 rounded",{variants:{size:{sm:"size-8",lg:"size-14"}}});export{c as B};
2
- //# sourceMappingURL=block-type-logo-FrtMLMYr.js.map
@@ -1,2 +0,0 @@
1
- import{r as x,j as e}from"./vendor-tanstack-BcZfOOfy.js";import{cW as g,cX as u,cY as C,cZ as m,c_ as A,i as f,p as v,c$ as b,d0 as k,d1 as y}from"./index-nxDkMXcY.js";const I=({isOpen:r,title:i,description:o,onConfirm:c,onClose:d,confirmText:l,isLoading:a=!1,loadingText:h="Deleting..."})=>{const[t,s]=x.useState(""),n=()=>{s(""),d()},p=()=>{c(),s("")},D=a||!!l&&t!==l;return e.jsx(g,{open:r,onOpenChange:n,children:e.jsxs(u,{children:[e.jsxs(C,{children:[e.jsx(m,{children:i}),e.jsx(A,{children:o})]}),l&&e.jsxs("div",{className:"space-y-2",children:[e.jsxs(f,{htmlFor:"confirm-text",children:["Type ",e.jsx("strong",{children:l})," to confirm:"]}),e.jsx(v,{id:"confirm-text",value:t,onChange:j=>s(j.target.value),placeholder:l})]}),e.jsxs(b,{children:[e.jsx(k,{onClick:n,children:"Cancel"}),e.jsx(y,{variant:"destructive",onClick:p,disabled:D,children:a?h:"Delete"})]})]})})};export{I as D};
2
- //# sourceMappingURL=delete-confirmation-dialog-jlBI67Pk.js.map
@@ -1,2 +0,0 @@
1
- import{s as m,j as o}from"./vendor-tanstack-BcZfOOfy.js";import{cg as r,dK as p}from"./index-nxDkMXcY.js";import{D as i}from"./deployment-action-header-C203ndcC.js";import{D as s}from"./deployment-form-DB4i73UE.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-BTiKGWfR.js";import"./vendor-recharts-BAN776s_.js";import"./vendor-forms-ClCIacbh.js";import"./vendor-date-wwuDAncJ.js";import"./schema-form-input-string-format-datetime-CZkUje5U.js";import"./zod-Cuos7J7w.js";import"./use-debounce-callback-CSs1BjLI.js";import"./toggle-group-Dx_fy9WJ.js";import"./timezone-select-DDUTUy-L.js";import"./dropdown-menu-CT6uZu-V.js";import"./form-CxD6-5Qf.js";import"./tags-input-C7cxdTyV.js";const n=({id:t})=>{const{data:e}=m(r(t));return o.jsxs("div",{className:"flex flex-col gap-4",children:[o.jsx(i,{deployment:e,action:"Duplicate"}),o.jsx(s,{deployment:e,mode:"duplicate"})]})};function A(){const{id:t}=p.useParams();return o.jsx(n,{id:t})}export{A as component};
2
- //# sourceMappingURL=deployment_._id.duplicate-aUHtHuNO.js.map
@@ -1,2 +0,0 @@
1
- import{s as m,j as o}from"./vendor-tanstack-BcZfOOfy.js";import{cg as r,dH as i}from"./index-nxDkMXcY.js";import{D as p}from"./deployment-action-header-C203ndcC.js";import{D as s}from"./deployment-form-DB4i73UE.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-BTiKGWfR.js";import"./vendor-recharts-BAN776s_.js";import"./vendor-forms-ClCIacbh.js";import"./vendor-date-wwuDAncJ.js";import"./schema-form-input-string-format-datetime-CZkUje5U.js";import"./zod-Cuos7J7w.js";import"./use-debounce-callback-CSs1BjLI.js";import"./toggle-group-Dx_fy9WJ.js";import"./timezone-select-DDUTUy-L.js";import"./dropdown-menu-CT6uZu-V.js";import"./form-CxD6-5Qf.js";import"./tags-input-C7cxdTyV.js";const n=({id:t})=>{const{data:e}=m(r(t));return o.jsxs("div",{className:"flex flex-col gap-4",children:[o.jsx(p,{deployment:e,action:"Edit"}),o.jsx(s,{deployment:e,mode:"edit"})]})};function h(){const{id:t}=i.useParams();return o.jsx(n,{id:t})}export{h as component};
2
- //# sourceMappingURL=deployment_._id.edit-CPRKkA-W.js.map
@@ -1,2 +0,0 @@
1
- import{r as c,j as e,s as G,t as _,L as O,u as ge}from"./vendor-tanstack-BcZfOOfy.js";import{A as be,u as v,l as se,h as te,f as Ne,p as we,m as ke,g as Ee,y as Se,_ as ae,d as Ce,a as re,U as ne,i as _e,v as Re,x as De,b as Ae,c as Te,e as J,j as Le,k as ze,n as Ie,o as Fe}from"./vendor-graphs-_sWgqfe-.js";import{ci as ie,bR as P,bS as H,q as p,I as x,bT as $,al as g,i as C,G as I,cH as A,cI as Ge,cJ as T,dT as Oe,dU as Pe,dV as He,dW as $e,dw as Ue,bM as E,b5 as y,bv as Me,dX as U,bG as le,dY as Qe,dZ as Xe,aq as M,ch as ce,X as oe,an as qe,z as Ke,aD as Be,aC as Ve}from"./index-nxDkMXcY.js";import{g as Y}from"./state-colors-CAAf0Eg3.js";import{p as j,a as We,f as Je}from"./vendor-date-wwuDAncJ.js";import{K as d}from"./flow-run._id-BT3wztDF.js";import{p as F,e as de,a as R,c as ue,d as D,f as me}from"./event-resource-display-DmCKu0PD.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-BTiKGWfR.js";import"./vendor-recharts-BAN776s_.js";import"./vendor-forms-ClCIacbh.js";import"./use-state-favicon-DfEAuEQL.js";import"./index-Cwd5Gvad.js";import"./artifact-card-fXxwNG3f.js";import"./lazy-markdown-CLclUkkd.js";import"./toggle-group-Dx_fy9WJ.js";import"./delete-confirmation-dialog-jlBI67Pk.js";import"./use-delete-confirmation-dialog-CUdii6Lo.js";import"./dropdown-menu-CT6uZu-V.js";import"./sort-filter-QjOHFWPI.js";import"./flow-runs-pagination--FfnMca3.js";import"./task-runs-pagination-Dbwa2yPe.js";import"./tags-input-C7cxdTyV.js";async function Ye(s){const{data:t}=await(await ie()).GET("/flow_runs/{id}/graph-v2",{params:{path:{id:s}}});if(!t)throw new Error("No data returned from API");return es(t)}async function Ze({since:s,until:t,nodeId:a}){const{data:r}=await(await ie()).POST("/events/filter",{body:{filter:{any_resource:{id:[`prefect.flow-run.${a}`]},event:{exclude_prefix:["prefect.log.write","prefect.task-run."]},occurred:{since:s.toISOString(),until:t.toISOString()},order:"ASC"},limit:50}});if(!r)throw new Error("No data returned from API");return ss(r)}function es(s){if(!s.start_time)throw new Error("Start time is required");return{root_node_ids:s.root_node_ids,start_time:j(s.start_time),end_time:s.end_time?j(s.end_time):null,nodes:new Map(s.nodes.map(t=>ts(t))),states:s.states?.map(as)??[]}}function ss(s){return s.events.map(t=>{if(!t.received)throw new Error("Received is required");return{id:t.id,received:j(t.received),occurred:j(t.occurred),event:t.event,resource:t.resource,payload:t.payload,related:t.related??[]}})}function ts([s,t]){if(!t.start_time)throw new Error("Start time is required");return[s,{kind:t.kind,id:t.id,label:t.label,state_type:t.state_type,start_time:j(t.start_time),end_time:t.end_time?j(t.end_time):null,parents:t.parents,children:t.children,artifacts:t.artifacts.map(rs)}]}function as(s){return{id:s.id,timestamp:j(s.timestamp),type:s.type,name:s.name}}function rs(s){if(!s.type)throw new Error("Artifact type is required");return s.type==="progress"&&typeof s.data=="number"?{id:s.id,created:j(s.created),key:s.key??void 0,type:s.type,data:s.data}:{id:s.id,created:j(s.created),key:s.key??void 0,type:s.type}}const Z={COMPLETED:600,RUNNING:700,SCHEDULED:700,PENDING:800,FAILED:700,CANCELLED:600,CANCELLING:600,CRASHED:600,PAUSED:800};function pe(s){return!s||!(s instanceof HTMLElement)?!1:["INPUT","TEXTAREA","SELECT"].includes(s.tagName)}const ee=()=>{be({animate:!0})};function ns(){return c.useEffect(()=>{const s=new AbortController;return document.addEventListener("keydown",t=>{pe(t.target)||t.metaKey||t.ctrlKey||t.key==="c"&&ee()},{signal:s.signal}),()=>s.abort()},[]),e.jsxs(P,{children:[e.jsx(H,{asChild:!0,children:e.jsx(p,{variant:"ghost",size:"icon",onClick:ee,children:e.jsx(x,{id:"Crosshair",className:"size-4"})})}),e.jsx($,{children:"Recenter (c)"})]})}function is({fullscreen:s,onFullscreenChange:t}){const a=c.useCallback(()=>{t(!s)},[s,t]);return c.useEffect(()=>{const r=new AbortController;return document.addEventListener("keydown",n=>{if(!(pe(n.target)||n.metaKey||n.ctrlKey)){if(n.key==="f"){a();return}if(n.key==="Escape"){a();return}}},{signal:r.signal}),()=>r.abort()},[a]),e.jsxs(P,{children:[e.jsx(H,{asChild:!0,children:e.jsx(p,{variant:"ghost",size:"icon",onClick:a,children:e.jsx(x,{id:"Expand",className:"size-4"})})}),e.jsx($,{children:"Fullscreen (f)"})]})}const ls=[{label:"Temporal dependency",value:"temporal_nearest-parent"},{label:"Temporal sequence",value:"temporal_waterfall"},{label:"Dependency grid",value:"dependency_nearest-parent"},{label:"Sequential grid",value:"dependency_waterfall"},{label:"Comparative duration",value:"left-aligned_duration-sorted"}],cs=()=>{const s=re+1,t=v.horizontalScaleMultiplier*s;ae(t)},os=()=>{const s=Math.abs(re-1),t=v.horizontalScaleMultiplier*s;ae(t)},ds=()=>{Ce()};function us(s){const[t,a]=s.split("_");return se(t)&&te(a)}function ms(){const[s,t]=c.useState(`${v.horizontal}_${v.vertical}`),[a,r]=c.useState(v.disableEdges),[n,l]=c.useState(v.disableArtifacts),[u,i]=c.useState(v.disableEvents),b=c.useCallback(o=>{if(!us(o))return;const[w,f]=o.split("_");!se(w)||!te(f)||(t(o),Ne(w),we(f))},[]),N=c.useCallback(o=>{r(o),ke(o)},[]),k=c.useCallback(o=>{l(o),Ee(o)},[]),L=c.useCallback(o=>{i(o),Se(o)},[]);return e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(g,{variant:"bodyLarge",children:"Layout"}),e.jsx("div",{className:"flex flex-col gap-2",children:ls.map(o=>e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("input",{type:"radio",id:o.value,name:"layout",value:o.value,checked:s===o.value,onChange:w=>b(w.target.value)}),e.jsx(C,{htmlFor:o.value,children:o.label})]},o.value))})]}),(v.isTemporal()||v.isLeftAligned())&&e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(g,{variant:"bodyLarge",children:"Scaling"}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(p,{variant:"outline",size:"sm",onClick:os,title:"Decrease scale (-)",children:"-"}),e.jsx(p,{variant:"outline",size:"sm",onClick:cs,title:"Increase scale (+)",children:"+"}),e.jsx(p,{variant:"outline",size:"sm",onClick:ds,children:"Reset"})]})]}),e.jsx("hr",{className:"my-4"}),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(I,{id:"hideEdges",checked:a,onCheckedChange:N}),e.jsx(C,{htmlFor:"hideEdges",children:"Hide dependency arrows"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(I,{id:"hideArtifacts",checked:n,onCheckedChange:k}),e.jsx(C,{htmlFor:"hideArtifacts",children:"Hide artifacts"})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx(I,{id:"hideEvents",checked:u,onCheckedChange:L}),e.jsx(C,{htmlFor:"hideEvents",children:"Hide events"})]})]})]})}function ps(){return e.jsxs(A,{children:[e.jsx(Ge,{children:e.jsxs(P,{children:[e.jsx(H,{asChild:!0,children:e.jsx(p,{variant:"ghost",size:"icon",children:e.jsx(x,{id:"Cog",className:"size-4"})})}),e.jsx($,{children:"Settings"})]})}),e.jsx(T,{children:e.jsx(ms,{})})]})}function xs({fullscreen:s,onFullscreenChange:t}){return e.jsxs("div",{className:"flex gap-2",children:[e.jsx(ns,{}),e.jsx(is,{fullscreen:s,onFullscreenChange:t}),e.jsx(ps,{})]})}function hs({artifactId:s,onClose:t}){return e.jsx(Oe,{open:s!==null,onOpenChange:a=>!a&&t(),children:e.jsxs(Pe,{children:[e.jsx(He,{children:e.jsx($e,{children:"Artifact Details"})}),s&&e.jsx(c.Suspense,{fallback:e.jsx(fs,{}),children:e.jsx(js,{artifactId:s})})]})})}function fs(){return e.jsxs("div",{className:"space-y-4 p-4",children:[e.jsx(y,{className:"h-6 w-32"}),e.jsx(y,{className:"h-4 w-24"}),e.jsx(y,{className:"h-4 w-48"}),e.jsx(y,{className:"h-32 w-full"})]})}function js({artifactId:s}){const{data:t}=G(Ue(s));return e.jsxs("div",{className:"space-y-4 p-4",children:[e.jsx(d,{label:"Key",value:e.jsx(g,{variant:"bodySmall",className:"font-medium",children:t.key??"Unnamed"})}),t.type&&e.jsx(d,{label:"Type",value:e.jsx(g,{variant:"bodySmall",className:"uppercase",children:t.type})}),t.description&&e.jsx(d,{label:"Description",value:e.jsx(g,{variant:"bodySmall",children:t.description})}),t.created&&e.jsx(d,{label:"Created",value:e.jsx(E,{date:t.created})}),t.data!==void 0&&t.data!==null&&e.jsxs("div",{className:"space-y-2",children:[e.jsx(g,{variant:"bodySmall",className:"text-muted-foreground",children:"Data"}),e.jsx("pre",{className:"bg-muted p-3 rounded-md text-sm overflow-auto max-h-64",children:typeof t.data=="string"?t.data:JSON.stringify(t.data,null,2)})]})]})}function vs({selection:s,onClose:t,onViewArtifact:a}){const{data:r,isLoading:n}=_(Me({artifacts:{operator:"and_",id:{any_:s.ids}},sort:"CREATED_DESC",offset:0})),l=s.position;if(!l)return null;const u={position:"absolute",left:`${l.x+l.width/2}px`,top:`${l.y+l.height}px`};return e.jsxs(A,{open:!0,onOpenChange:i=>!i&&t(),children:[e.jsx(U,{style:u}),e.jsxs(T,{align:"center",side:"bottom",className:"w-72",children:[e.jsxs("div",{className:"flex items-center justify-between mb-3",children:[e.jsx(g,{variant:"bodySmall",className:"font-semibold",children:"Artifacts"}),e.jsx(p,{variant:"ghost",size:"icon",onClick:t,"aria-label":"Close popover",children:e.jsx(x,{id:"X",className:"size-4"})})]}),n?e.jsx("div",{className:"flex items-center justify-center py-4",children:e.jsx(x,{id:"Loader2",className:"size-4 animate-spin"})}):e.jsx("div",{className:"space-y-2 max-h-64 overflow-y-auto",children:r?.filter(i=>i.id!==void 0).map(i=>e.jsxs("div",{className:"flex items-center justify-between gap-2 p-2 rounded-md border bg-muted/50",children:[e.jsxs("div",{className:"flex flex-col min-w-0 flex-1",children:[e.jsx(g,{variant:"bodySmall",className:"font-medium truncate",children:i.key??"Unnamed"}),i.type&&e.jsx(g,{variant:"xsmall",className:"text-muted-foreground uppercase",children:i.type})]}),e.jsx(p,{variant:"outline",size:"sm",onClick:()=>a(i.id),children:"View"})]},i.id))})]})]})}function ys(s){let t=s;return t.startsWith("prefect.")?t=t.slice(8):t.startsWith("prefect-cloud.")&&(t=t.slice(14)),t=t.replace(/[._-]/g," "),t.charAt(0).toUpperCase()+t.slice(1).toLowerCase()}function gs(s){let t;return typeof s=="string"?t=j(s):t=s,We(t)?Je(t,"yyyy/MM/dd hh:mm:ss a"):"Invalid date"}function xe(s){return s["prefect.resource.name"]||s["prefect.name"]||s["prefect-cloud.name"]||null}function bs({event:s}){const t=xe(s.resource),a=s.resource["prefect.resource.id"]||"",r=F(a),n=de(a),l=s.related??[];return t?e.jsx(c.Suspense,{fallback:e.jsx(D,{}),children:e.jsx(R,{resource:s.resource,relatedResources:l,className:"hover:underline text-primary",children:e.jsx(ue,{resourceType:r,displayText:t,className:"text-sm"})})}):n&&r!=="unknown"?e.jsx(c.Suspense,{fallback:e.jsx(D,{}),children:e.jsx(R,{resource:s.resource,relatedResources:l,className:"hover:underline text-primary",children:e.jsx(me,{resourceType:r,resourceId:n,className:"text-sm"})})}):e.jsx("span",{className:"text-sm text-muted-foreground font-mono",children:a||"Unknown"})}function Ns({relatedResources:s}){const t=s.filter(a=>{const r=a["prefect.resource.role"],n=a["prefect.resource.id"]||"";return r==="tag"||n.startsWith("prefect.tag.")?!1:F(n)!=="unknown"});return t.length===0?null:e.jsx(d,{label:"Related Resources",value:e.jsx("div",{className:"flex flex-col gap-1",children:t.map(a=>{const r=xe(a),n=a["prefect.resource.id"]||"",l=F(n),u=de(n);return r?e.jsx(c.Suspense,{fallback:e.jsx(D,{}),children:e.jsx(R,{resource:a,relatedResources:s,className:"hover:underline text-primary",children:e.jsx(ue,{resourceType:l,displayText:r,className:"text-sm"})})},n):u&&l!=="unknown"?e.jsx(c.Suspense,{fallback:e.jsx(D,{}),children:e.jsx(R,{resource:a,relatedResources:s,className:"hover:underline text-primary",children:e.jsx(me,{resourceType:l,resourceId:u,className:"text-sm"})})},n):e.jsx("span",{className:"text-sm text-muted-foreground font-mono",children:n},n)})})})}function ws({selection:s,onClose:t}){const{data:a,isLoading:r}=_(le(s.id,s.occurred)),n=s.position;if(!n)return null;const l={position:"absolute",left:`${n.x+n.width/2}px`,top:`${n.y+n.height}px`},u=a?.event??"",i=u?ys(u):"Loading...",b=a?.related??[];return e.jsxs(A,{open:!0,onOpenChange:N=>!N&&t(),children:[e.jsx(U,{style:l}),e.jsxs(T,{align:"center",side:"bottom",className:"w-80",children:[e.jsxs("div",{className:"flex justify-between items-start mb-3",children:[e.jsx("span",{className:"text-sm text-muted-foreground",children:"Event"}),e.jsx(p,{variant:"ghost",size:"icon",onClick:t,"aria-label":"Close popover",className:"-mt-1 -mr-2",children:e.jsx(x,{id:"X",className:"size-4"})})]}),r?e.jsx("div",{className:"flex items-center justify-center py-4",children:e.jsx(x,{id:"Loader2",className:"size-4 animate-spin"})}):e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex flex-col gap-0.5",children:[e.jsx(O,{to:"/events",search:{event:[u]},className:"text-sm text-primary hover:underline font-medium",children:i}),e.jsx("span",{className:"text-xs text-muted-foreground",children:u})]}),e.jsx(d,{label:"Occurred",value:e.jsx("span",{className:"text-sm",children:gs(s.occurred)})}),a&&e.jsx(d,{label:"Resource",value:e.jsx(bs,{event:a})}),b.length>0&&e.jsx(Ns,{relatedResources:b})]})]})]})}function ks({selection:s,onClose:t}){const a=ge({queries:s.ids.map(i=>le(i,s.occurred??new Date))}),r=s.position;if(!r)return null;const n={position:"absolute",left:`${r.x+r.width/2}px`,top:`${r.y+r.height}px`},l=a.some(i=>i.isLoading),u=a.map(i=>i.data).filter(i=>i!==void 0);return e.jsxs(A,{open:!0,onOpenChange:i=>!i&&t(),children:[e.jsx(U,{style:n}),e.jsxs(T,{align:"center",side:"bottom",className:"w-80",children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsxs("span",{className:"text-sm font-medium",children:[s.ids.length," Events"]}),e.jsx(p,{variant:"ghost",size:"icon",onClick:t,"aria-label":"Close popover",children:e.jsx(x,{id:"X",className:"size-4"})})]}),l?e.jsx("div",{className:"flex items-center justify-center py-4",children:e.jsx(x,{id:"Loader2",className:"size-4 animate-spin"})}):e.jsx(Qe,{className:"max-h-64",children:e.jsx("div",{className:"space-y-3",children:u.map(i=>e.jsxs("div",{className:"border-b pb-2 last:border-b-0 last:pb-0",children:[e.jsx("div",{className:"text-sm font-mono truncate",title:i.event,children:i.event}),e.jsx("div",{className:"text-xs text-muted-foreground",children:e.jsx(E,{date:new Date(i.occurred)})})]},i.id))})})]})]})}function Es({selection:s,onClose:t}){return ne(s)?e.jsx("div",{className:"absolute top-4 right-4 z-10 w-72 rounded-lg border bg-card p-4 shadow-md",children:e.jsxs(c.Suspense,{fallback:e.jsx(Ss,{onClose:t}),children:[s.kind==="task-run"&&e.jsx(Cs,{taskRunId:s.id,onClose:t}),s.kind==="flow-run"&&e.jsx(_s,{flowRunId:s.id,onClose:t})]})}):null}function Ss({onClose:s}){return e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsx(y,{className:"h-6 w-3/4"}),e.jsx(p,{variant:"ghost",size:"icon",onClick:s,"aria-label":"Close panel",className:"shrink-0 -mt-1 -mr-2",children:e.jsx(x,{id:"X",className:"size-4"})})]}),e.jsx(y,{className:"h-5 w-1/2"}),e.jsx(y,{className:"h-5 w-full"}),e.jsx(y,{className:"h-5 w-2/3"}),e.jsx(y,{className:"h-5 w-1/2"})]})}function Cs({taskRunId:s,onClose:t}){const{data:a}=G(Xe(s)),r=a.estimated_run_time&&a.estimated_run_time>0?a.estimated_run_time:a.total_run_time??0;return e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsx("h3",{className:"font-semibold text-base",children:e.jsx(O,{to:"/runs/task-run/$id",params:{id:s},className:"hover:underline text-foreground",children:a.name})}),e.jsx(p,{variant:"ghost",size:"icon",onClick:t,"aria-label":"Close panel",className:"shrink-0 -mt-1 -mr-2",children:e.jsx(x,{id:"X",className:"size-4"})})]}),e.jsxs("div",{className:"space-y-3",children:[a.state&&e.jsx(d,{label:"State",value:e.jsx(M,{type:a.state.type,name:a.state.name})}),e.jsx(d,{label:"Task Run ID",value:a.id,copyable:!0}),e.jsx(d,{label:"Duration",value:r>0?ce(r):"-"}),e.jsx(d,{label:"Created",value:e.jsx(E,{date:a.created})}),a.tags&&a.tags.length>0&&e.jsx(d,{label:"Tags",value:e.jsx(oe,{tags:a.tags})})]})]})}function _s({flowRunId:s,onClose:t}){const{data:a}=G(qe(s)),r=a.total_run_time??0;return e.jsxs("div",{className:"space-y-3",children:[e.jsxs("div",{className:"flex items-start justify-between gap-2",children:[e.jsx("h3",{className:"font-semibold text-base",children:e.jsx(O,{to:"/runs/flow-run/$id",params:{id:s},className:"hover:underline text-foreground",children:a.name})}),e.jsx(p,{variant:"ghost",size:"icon",onClick:t,"aria-label":"Close panel",className:"shrink-0 -mt-1 -mr-2",children:e.jsx(x,{id:"X",className:"size-4"})})]}),e.jsxs("div",{className:"space-y-3",children:[a.state&&e.jsx(d,{label:"State",value:e.jsx(M,{type:a.state.type,name:a.state.name})}),e.jsx(d,{label:"Flow Run ID",value:a.id,copyable:!0}),e.jsx(d,{label:"Duration",value:r>0?ce(r):"-"}),e.jsx(d,{label:"Created",value:e.jsx(E,{date:a.created})}),a.tags&&a.tags.length>0&&e.jsx(d,{label:"Tags",value:e.jsx(oe,{tags:a.tags})})]})]})}function Rs({selection:s,onClose:t}){const a=c.useRef(null);c.useEffect(()=>{const l=i=>{a.current&&!a.current.contains(i.target)&&t()},u=i=>{i.key==="Escape"&&t()};return document.addEventListener("mousedown",l),document.addEventListener("keydown",u),()=>{document.removeEventListener("mousedown",l),document.removeEventListener("keydown",u)}},[t]);const r=s.position;if(!r)return null;const n={position:"absolute",left:`${r.x+r.width/2}px`,top:`${r.y+r.height}px`,transform:"translateX(-50%)"};return e.jsxs("div",{ref:a,className:"z-50 w-64 rounded-lg border bg-card p-4 shadow-md",style:n,children:[e.jsx("div",{className:"flex justify-end absolute top-2 right-2",children:e.jsx(p,{variant:"ghost",size:"icon",onClick:t,"aria-label":"Close popover",children:e.jsx(x,{id:"X",className:"size-4"})})}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(d,{label:"State",value:e.jsx(M,{type:s.type,name:s.name})}),e.jsx(d,{label:"Occurred",value:e.jsx(E,{date:s.timestamp,format:"timestamp"})})]})]})}const Ds=["COMPLETED","FAILED","CANCELLED","CRASHED"];function et({flowRunId:s,stateType:t,viewport:a,onViewportChange:r,selected:n,onSelectedChange:l,className:u,style:i,fullscreen:b,onFullscreenChange:N}){const k=c.useRef(null),[L,o]=c.useState(!1),[w,f]=c.useState(void 0),[he,Q]=c.useState(null),{resolvedTheme:X}=Ke(),q=b??L,m=n??w,fe=t&&Ds.includes(t),{data:K}=_(Be({task_runs:{operator:"and_",flow_run_id:{operator:"and_",any_:[s],is_null_:!1}}})),{data:B}=_(Ve({flow_runs:{operator:"and_",parent_flow_run_id:{operator:"and_",any_:[s]}}})),V=K===void 0||B===void 0||K>0||B>0,je=c.useCallback(h=>{o(h),N?.(h)},[N]),S=c.useMemo(()=>({runId:s,fetch:Ye,fetchEvents:Ze,styles:()=>({node:h=>({background:Y(h.state_type,Z[h.state_type])}),state:h=>({background:Y(h.type,Z[h.type])})}),theme:X==="dark"?"dark":"light"}),[s,X]);c.useEffect(()=>{_e(S)},[S]),c.useEffect(()=>{if(!k.current)throw new Error("Stage does not exist");return Re({stage:k.current,config:S}),()=>{De()}},[S]),c.useEffect(()=>{Ae(m??null)},[m]),c.useEffect(()=>{Te(a)},[a]),c.useEffect(()=>{const h=J.on("itemSelected",z=>{const W=z??void 0;f(W),l?.(W)}),ye=J.on("viewportDateRangeUpdated",z=>r?.(z));return()=>{h(),ye()}},[l,r]);const ve=q?"fixed inset-0 z-50 bg-background":V?"relative h-96 w-full":"relative h-40 w-full";return e.jsxs("div",{className:`${ve} ${u??""}`,style:i,children:[e.jsx("div",{ref:k,className:"size-full [&>canvas]:size-full"}),!V&&e.jsx("div",{className:"absolute inset-0 flex items-center justify-center bg-background/50",children:e.jsx("p",{className:"text-muted-foreground",children:fe?"This flow run did not generate any task or subflow runs":"This flow run has not yet generated any task or subflow runs"})}),e.jsx("div",{className:"absolute bottom-2 right-2",children:e.jsx(xs,{fullscreen:q,onFullscreenChange:je})}),m&&ne(m)&&e.jsx(Es,{selection:m,onClose:()=>{f(void 0),l?.(void 0)}}),m&&Le(m)&&e.jsx(Rs,{selection:m,onClose:()=>{f(void 0),l?.(void 0)}}),m&&ze(m)&&e.jsx(ws,{selection:m,onClose:()=>{f(void 0),l?.(void 0)}}),m&&Ie(m)&&e.jsx(ks,{selection:m,onClose:()=>{f(void 0),l?.(void 0)}}),m&&Fe(m)&&e.jsx(vs,{selection:m,onClose:()=>{f(void 0),l?.(void 0)},onViewArtifact:h=>{Q(h),f(void 0),l?.(void 0)}}),e.jsx(hs,{artifactId:he,onClose:()=>Q(null)})]})}export{et as FlowRunGraph};
2
- //# sourceMappingURL=flow-run-graph-CIvkp1kl.js.map
@@ -1,4 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/flow-run-graph-CIvkp1kl.js","assets/vendor-tanstack-BcZfOOfy.js","assets/vendor-react-Bce9NwRC.js","assets/vendor-graphs-_sWgqfe-.js","assets/index-nxDkMXcY.js","assets/vendor-radix-BTiKGWfR.js","assets/vendor-recharts-BAN776s_.js","assets/vendor-forms-ClCIacbh.js","assets/vendor-date-wwuDAncJ.js","assets/index-CYc_PWA3.css","assets/state-colors-CAAf0Eg3.js","assets/event-resource-display-DmCKu0PD.js","assets/use-state-favicon-DfEAuEQL.js","assets/index-Cwd5Gvad.js","assets/artifact-card-fXxwNG3f.js","assets/lazy-markdown-CLclUkkd.js","assets/toggle-group-Dx_fy9WJ.js","assets/delete-confirmation-dialog-jlBI67Pk.js","assets/use-delete-confirmation-dialog-CUdii6Lo.js","assets/dropdown-menu-CT6uZu-V.js","assets/sort-filter-QjOHFWPI.js","assets/flow-runs-pagination--FfnMca3.js","assets/task-runs-pagination-Dbwa2yPe.js","assets/tags-input-C7cxdTyV.js"])))=>i.map(i=>d[i]);
2
- import{j as e,r as o,s as O,t as F,L as I,I as je,n as U,g as fe,d as ve}from"./vendor-tanstack-BcZfOOfy.js";import{b5 as i,cc as ye,cd as Ne,q as D,ce as be,aW as W,bv as _e,C as re,o as ne,c6 as Se,I as b,y as S,bM as H,X as oe,cf as we,cg as Ce,aD as ie,aN as ke,B as Te,g as De,h as K,bs as Fe,bB as Ae,bD as Le,H as Ee,aq as V,aM as Pe,ch as Ie,c5 as ze,bQ as Me,bR as Oe,bS as Qe,bT as Re,ci as qe,c8 as Be,S as ce,a as de,c as ue,e as $,b as Ge,bN as xe,aC as Ve,aE as X,ab as $e,al as A,O as me,cj as Y,ak as B,ck as G,aF as Z,an as Ue,cl as We,cm as Je,cn as He,co as Ke,cp as Xe,L as ee,aw as Ye,ax as Ze,ay as k,az as T,cq as se}from"./index-nxDkMXcY.js";import{R as es,b as ss,C as as,a as ts,u as ls}from"./use-state-favicon-DfEAuEQL.js";import{A as rs}from"./artifact-card-fXxwNG3f.js";import{T as ns,a as ae}from"./toggle-group-Dx_fy9WJ.js";import{D as os}from"./delete-confirmation-dialog-jlBI67Pk.js";import{u as is}from"./use-delete-confirmation-dialog-CUdii6Lo.js";import{D as he,a as pe,b as ge,d as L}from"./dropdown-menu-CT6uZu-V.js";import{S as cs}from"./sort-filter-QjOHFWPI.js";import{S as ds,a as us,F as xs}from"./flow-runs-pagination--FfnMca3.js";import{T as ms,b as hs,a as ps}from"./task-runs-pagination-Dbwa2yPe.js";import{T as gs}from"./tags-input-C7cxdTyV.js";import{o as js,e as fs}from"./vendor-forms-ClCIacbh.js";const vs=o.lazy(()=>ye(()=>import("./flow-run-graph-CIvkp1kl.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23])).then(s=>({default:s.FlowRunGraph})));function ys(s){return e.jsx(o.Suspense,{fallback:e.jsx(i,{className:"h-[500px] w-full"}),children:e.jsx(vs,{...s})})}class z extends o.Component{constructor(a){super(a),this.state={hasError:!1,error:null}}static getDerivedStateFromError(a){return{hasError:!0,error:a}}render(){if(this.state.hasError){const{fallback:a}=this.props;return typeof a=="function"?a(this.state.error??new Error("Unknown error")):a}return this.props.children}}function M({error:s,onRetry:a,isRetrying:t}){return e.jsxs("div",{className:"flex flex-col items-center justify-center py-8 text-center",children:[e.jsx("div",{className:"rounded-full bg-destructive/10 p-2 mb-3",children:e.jsx(Ne,{className:"size-6 text-destructive"})}),e.jsxs("div",{className:"space-y-1 mb-4",children:[e.jsx("p",{className:"font-medium",children:s.message}),s.details&&e.jsx("p",{className:"text-xs text-muted-foreground max-w-sm",children:s.details})]}),a&&e.jsxs(D,{variant:"outline",size:"sm",onClick:a,disabled:t,className:"gap-2",children:[e.jsx(be,{className:W("size-3",t&&"animate-spin")}),t?"Retrying...":"Retry"]})]})}const Ns=({flowRun:s})=>{const[a,t]=o.useState("grid"),{data:m}=O(_e({artifacts:{operator:"and_",flow_run_id:{any_:[s.id]},type:{not_any_:["result"]}},sort:"ID_DESC",offset:0}));return m.length===0?e.jsx(re,{children:e.jsx(ne,{className:"text-center",children:e.jsxs("p",{children:["This flow run did not produce any artifacts; for more information on creating artifacts, see the"," ",e.jsx("a",{href:"https://docs.prefect.io/v3/develop/artifacts",target:"_blank",rel:"noopener noreferrer",className:"text-blue-500",children:"documentation"}),"."]})})}):e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx("div",{className:"flex justify-end",children:e.jsxs(ns,{type:"single",variant:"outline",value:a,onValueChange:r=>t(r),children:[e.jsx(ae,{value:"grid","aria-label":"Grid view",children:e.jsx(Se,{className:"w-4 h-4"})}),e.jsx(ae,{value:"list","aria-label":"List view",children:e.jsx(es,{className:"w-4 h-4"})})]})}),e.jsx("div",{className:W("grid",a==="grid"?"grid-cols-1 lg:grid-cols-2 xl:grid-cols-3":"grid-cols-1","gap-4"),"data-testid":"flow-run-artifacts-grid",children:m.map(r=>e.jsx(rs,{artifact:r,compact:a==="list"},r.id))})]})};function _({label:s,value:a,copyable:t,copyValue:m}){const r=()=>{const d=m??(typeof a=="string"?a:"");navigator.clipboard.writeText(d),S.success(`${s} copied`)};return e.jsxs("dl",{className:"flex flex-col gap-1",children:[e.jsx("dt",{className:"text-muted-foreground text-sm",children:s}),e.jsxs("dd",{className:"text-sm flex items-center gap-2",children:[a,t&&e.jsx(D,{variant:"ghost",size:"icon",onClick:r,children:e.jsx(b,{id:"Copy",className:"size-4"})})]})]})}function bs({flowRun:s}){return s?e.jsxs("div",{className:"space-y-4",children:[e.jsx(_,{label:"Run Count",value:s.run_count}),e.jsx(_,{label:"Created",value:e.jsx(H,{date:s.created})}),s.created_by?.display_value&&e.jsx(_,{label:"Created By",value:s.created_by.display_value}),e.jsx(_,{label:"Last Updated",value:e.jsx(H,{date:s.updated})}),s.idempotency_key&&e.jsx(_,{label:"Idempotency Key",value:s.idempotency_key}),s.tags&&s.tags.length>0&&e.jsx(_,{label:"Tags",value:e.jsx(oe,{tags:s.tags})}),e.jsx(_,{label:"Flow Run ID",value:s.id,copyable:!0}),s.state?.message&&e.jsx(_,{label:"State Message",value:s.state.message}),s.flow_version&&e.jsx(_,{label:"Flow Version",value:s.flow_version}),s.empirical_policy?.retries!=null&&e.jsxs(e.Fragment,{children:[e.jsx(_,{label:"Retries",value:s.empirical_policy.retries}),e.jsx(_,{label:"Retry Delay",value:s.empirical_policy.retry_delay})]})]}):e.jsx("div",{className:"flex flex-col gap-2 bg-gray-100 p-4 rounded-md",children:e.jsx("span",{className:"text-gray-500",children:"No flow run details available"})})}function _s({flowRun:s,onDeleteClick:a}){const[t,m]=is(),{open:r,onOpenChange:d,openDialog:p}=ss(),{setFlowRunState:c,isPending:n}=we(),v=s.state_type&&["COMPLETED","FAILED","CANCELLED","CRASHED"].includes(s.state_type),l=N=>{c({id:s.id,state:{type:N.type,name:N.type.charAt(0)+N.type.slice(1).toLowerCase(),message:N.message},force:!0},{onSuccess:()=>{S.success("Flow run state changed"),d(!1)},onError:C=>{S.error(C.message||"Failed to change state")}})},{data:x}=F({...Ce(s.deployment_id??""),enabled:!!s.deployment_id}),{data:g}=F({...ie({task_runs:{operator:"and_",flow_run_id:{operator:"and_",any_:[s.id],is_null_:!1}}})}),{data:y}=F({...ke({sort:"START_TIME_DESC",offset:0,limit:1,task_runs:{operator:"and_",id:{any_:[s.parent_task_run_id??""]}}}),enabled:!!s.parent_task_run_id}),h=y?.[0],w=N=>N===void 0?"...":N===0?"None":`${N} Task run${N===1?"":"s"}`;return e.jsxs("div",{className:"flex flex-row justify-between",children:[e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(Te,{children:e.jsxs(De,{children:[e.jsx(K,{children:e.jsx(Fe,{to:"/runs",className:"text-xl font-semibold",children:"Runs"})}),e.jsx(Ae,{}),e.jsxs(K,{className:"text-xl",children:[e.jsx(Le,{className:"font-semibold",children:s.name}),s.work_pool_name&&e.jsx(Ee,{variant:"outline",className:"ml-2",children:s.work_pool_name}),s.tags&&s.tags.length>0&&e.jsx("div",{className:"ml-2",children:e.jsx(oe,{tags:s.tags,maxTagsDisplayed:3})})]})]})}),e.jsxs("div",{className:"flex items-center gap-4 text-sm text-muted-foreground",children:[s.state_type&&s.state_name&&e.jsx(V,{type:s.state_type,name:s.state_name}),s.start_time&&e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(b,{id:"Calendar",className:"size-4"}),e.jsx("span",{children:Pe(s.start_time,"dateTimeNumeric")})]}),e.jsxs("div",{className:"flex items-center gap-1",children:[e.jsx(b,{id:"Clock",className:"size-4"}),e.jsx("span",{children:Ie(s.total_run_time??0)})]}),e.jsxs("div",{className:`flex items-center gap-1 ${g===0?"text-muted-foreground/60":""}`,children:[e.jsx(b,{id:"ListTodo",className:"size-4"}),e.jsx("span",{children:w(g)})]})]}),e.jsxs("div",{className:"flex items-center gap-4 text-sm flex-wrap",children:[s.flow_id&&e.jsx(ze,{flowId:s.flow_id}),s.deployment_id&&e.jsxs(I,{to:"/deployments/deployment/$id",params:{id:s.deployment_id},className:"flex items-center gap-1 hover:underline",children:[e.jsx(b,{id:"Rocket",className:"size-4"}),e.jsx("span",{className:"text-muted-foreground",children:"Deployment"}),e.jsx("span",{children:x?.name??"..."})]}),s.work_pool_name&&e.jsxs(I,{to:"/work-pools/work-pool/$workPoolName",params:{workPoolName:s.work_pool_name},className:"flex items-center gap-1 hover:underline",children:[e.jsx(b,{id:"Server",className:"size-4"}),e.jsx("span",{className:"text-muted-foreground",children:"Work Pool"}),e.jsx("span",{children:s.work_pool_name})]}),s.work_pool_name&&s.work_queue_name&&e.jsxs(I,{to:"/work-pools/work-pool/$workPoolName",params:{workPoolName:s.work_pool_name},search:{tab:"Work Queues"},className:"flex items-center gap-1 hover:underline",children:[e.jsx(b,{id:"ListOrdered",className:"size-4"}),e.jsx("span",{className:"text-muted-foreground",children:"Work Queue"}),e.jsx("span",{children:s.work_queue_name})]}),h&&e.jsxs(I,{to:"/runs/flow-run/$id",params:{id:h.id},className:"flex items-center gap-1 hover:underline",children:[e.jsx(b,{id:"Workflow",className:"size-4"}),e.jsx("span",{className:"text-muted-foreground",children:"Parent Run"}),e.jsx("span",{children:h.name??"..."})]})]})]}),e.jsxs(he,{children:[e.jsx(pe,{asChild:!0,children:e.jsx(D,{variant:"outline",className:"p-2",children:e.jsx(Me,{className:"w-4 h-4"})})}),e.jsxs(ge,{children:[v&&e.jsx(L,{onClick:p,children:"Change state"}),e.jsx(L,{onClick:()=>{navigator.clipboard.writeText(s.id),S.success("Copied flow run ID to clipboard")},children:"Copy ID"}),e.jsx(L,{onClick:()=>m({title:"Delete Flow Run",description:`Are you sure you want to delete flow run ${s.name}?`,onConfirm:a}),children:"Delete"})]})]}),e.jsx(os,{...t}),e.jsx(as,{open:r,onOpenChange:d,currentState:s.state?{type:s.state.type,name:s.state.name??s.state.type.charAt(0)+s.state.type.slice(1).toLowerCase()}:null,label:"Flow Run",onConfirm:l,isLoading:n})]})}function Ss({flowRun:s}){const[a,t]=o.useState(!1),m=async()=>{t(!0);try{const d=await(await qe()).GET("/flow_runs/{id}/logs/download",{params:{path:{id:s.id}},parseAs:"blob"});if(!d.data)throw new Error("No data received from server");const p=URL.createObjectURL(d.data),c=document.createElement("a"),n=s.name??"logs";c.href=p,c.setAttribute("download",`${n}.csv`),c.click(),URL.revokeObjectURL(p)}catch(r){console.error(r),S.error("Failed to download logs")}finally{t(!1)}};return e.jsxs(Oe,{children:[e.jsx(Qe,{asChild:!0,children:e.jsx(D,{variant:"outline",size:"icon",onClick:()=>{m()},disabled:a,"aria-label":"Download logs",children:a?e.jsx(b,{id:"Loader2",className:"size-4 animate-spin"}):e.jsx(b,{id:"Download",className:"size-4"})})}),e.jsx(Re,{children:"Download all logs as CSV"})]})}const ws=({flowRun:s,virtualize:a=!0})=>{const[t,m]=o.useState(0),[r,d]=o.useState("TIMESTAMP_ASC"),p=o.useMemo(()=>({...Be({limit:50,sort:r,logs:{operator:"and_",level:{ge_:t},flow_run_id:{any_:[s.id]}}}),refetchInterval:s.state_type==="RUNNING"?5e3:!1}),[t,r,s.id,s.state_type]),{data:c,hasNextPage:n,fetchNextPage:v,isFetchingNextPage:l}=je(p),x=c.pages.length===1&&c.pages[0].length===0;let g="This run did not produce any logs.";return x&&(t>0?g="No logs match your filter criteria":s.state_type==="SCHEDULED"&&s.state_name==="Scheduled"?g="Run has not yet started. Check back soon for logs.":s.state_type==="RUNNING"&&(g="Waiting for logs...")),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex flex-row gap-2 justify-end",children:[e.jsx(Cs,{levelFilter:t,setLevelFilter:m}),e.jsx(ks,{sortOrder:r,setSortOrder:d}),e.jsx(Ss,{flowRun:s})]}),x?e.jsx("div",{className:"flex flex-col gap-2 text-center bg-muted p-2 rounded-md",children:e.jsx("span",{className:"text-muted-foreground",children:g})}):e.jsx("div",{className:"rounded-md",children:e.jsx(ts,{logs:c.pages.flat(),onBottomReached:()=>{n&&!l&&v().catch(y=>{console.error(y)})},className:"max-h-[85vh]",virtualize:a})})]})},te=[{label:"All",value:0},{label:"Critical only",value:50},{label:"Error and above",value:40},{label:"Warning and above",value:30},{label:"Info and above",value:20},{label:"Debug and above",value:10}],Cs=({levelFilter:s,setLevelFilter:a})=>e.jsxs(ce,{value:s.toString(),onValueChange:t=>a(Number(t)),children:[e.jsx(de,{"aria-label":"log level filter",children:e.jsx("span",{children:`Level:
3
- ${te.find(t=>t.value===s)?.label}`})}),e.jsx(ue,{children:te.map(t=>e.jsx($,{value:t.value.toString(),children:t.label},t.value))})]}),ks=({sortOrder:s,setSortOrder:a})=>e.jsxs(ce,{value:s,onValueChange:t=>a(t),children:[e.jsx(de,{"aria-label":"log sort order",children:e.jsx(Ge,{placeholder:"Sort log order"})}),e.jsxs(ue,{children:[e.jsx($,{value:"TIMESTAMP_ASC",children:"Oldest to newest"}),e.jsx($,{value:"TIMESTAMP_DESC",children:"Newest to oldest"})]})]}),Ts=({parentFlowRunId:s})=>{const a=U(),[t,m]=o.useState(""),[r,d]=o.useState(new Set),[p,c]=o.useState("START_TIME_DESC"),[n,v]=o.useState({page:1,limit:10}),l=xe(t,300),x=o.useMemo(()=>({flow_runs:{operator:"and_",parent_flow_run_id:{operator:"and_",any_:[s]}}}),[s]),{data:g}=O(Ve(x,3e4)),y=o.useMemo(()=>({page:n.page,limit:n.limit,sort:p,flow_runs:{operator:"and_",parent_flow_run_id:{operator:"and_",any_:[s]},name:l?{like_:l}:void 0,state:r.size>0?{operator:"and_",name:{any_:Array.from(r)}}:void 0}}),[s,n,p,l,r]),{data:h}=F(X(y,3e4)),w=o.useMemo(()=>[...new Set((h?.results??[]).map(u=>u.flow_id))],[h?.results]),{data:N}=F($e({flows:{operator:"and_",id:{any_:w}},offset:0,sort:"NAME_ASC"},{enabled:w.length>0})),C=o.useMemo(()=>{if(!h?.results)return[];const u=new Map(N?.map(j=>[j.id,j])??[]);return h.results.map(j=>{const J=u.get(j.flow_id);return J?{...j,flow:J}:{...j,flow:void 0}}).filter(j=>j!==null)},[h?.results,N]),E=u=>{m(u.target.value),v(j=>({...j,page:1}))},Q=u=>{d(u),v(j=>({...j,page:1}))},R=u=>{c(u),v(j=>({...j,page:1}))},q=()=>{m(""),d(new Set),v(u=>({...u,page:1}))},P=u=>{a.prefetchQuery(X({...y,page:u},3e4))},f=t||r.size>0;return g===0?e.jsx("div",{className:"flex items-center justify-center h-48 border rounded-lg bg-muted/50",children:e.jsx(A,{className:"text-muted-foreground",children:"No subflow runs found for this flow run."})}):e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("div",{className:"grid grid-cols-12 items-center gap-2",children:[e.jsx("div",{className:"flex flex-col gap-1 xl:col-span-3 md:col-span-12 col-span-6 md:order-0 order-2",children:e.jsxs(A,{variant:"bodySmall",className:"text-muted-foreground",children:[g," Subflow run",g!==1?"s":""]})}),e.jsx("div",{className:"xl:col-span-4 col-span-12 md:order-1 order-0",children:e.jsx(me,{value:t,onChange:E,placeholder:"Search by run name","aria-label":"Search by run name",debounceMs:300})}),e.jsx("div",{className:"xl:col-span-3 md:col-span-6 col-span-12 md:order-2 order-1",children:e.jsx(ds,{selectedFilters:r,onSelectFilter:Q})}),e.jsx("div",{className:"xl:border-l xl:border-border xl:pl-2 xl:col-span-2 md:col-span-6 col-span-6 md:order-3 order-3",children:e.jsx(cs,{value:p,onSelect:R})})]}),e.jsx(us,{flowRuns:C,onClearFilters:f?q:void 0}),h&&h.pages>0&&e.jsx(xs,{pagination:n,onChangePagination:v,count:h.count,pages:h.pages,onPrefetchPage:P})]})},le=2,Ds=({selectedFilters:s,onSelectFilter:a,className:t})=>{const[m,r]=o.useState(!1),d=o.useMemo(()=>{const l=new Set(Y);return s.has("Scheduled")||l.size!==s.size?!1:Array.from(s).every(x=>l.has(x))},[s]),p=()=>{a(new Set(Y))},c=()=>{a(new Set)},n=l=>{if(d){a(new Set([l]));return}const x=new Set(s);s.has(l)?x.delete(l):x.add(l),a(x)},v=()=>{if(s.size===0)return"All run states";if(d)return"All except scheduled";const l=Array.from(s),x=l.slice(0,le),g=l.length-le;return e.jsxs("div",{className:"flex flex-1 min-w-0 items-center gap-2",children:[e.jsx("div",{className:"flex flex-1 min-w-0 items-center gap-2 overflow-hidden",children:x.map(y=>e.jsx(V,{name:y,type:G[y]},y))}),g>0&&e.jsxs(A,{variant:"bodySmall",className:"shrink-0",children:["+ ",g]})]})};return e.jsxs(he,{open:m,onOpenChange:r,children:[e.jsx(pe,{asChild:!0,children:e.jsxs(D,{variant:"outline",className:W("justify-between w-full",t),children:[e.jsx("span",{className:"flex-1 min-w-0",children:v()}),e.jsx(b,{id:"ChevronDown",className:"ml-2 size-4 shrink-0"})]})}),e.jsxs(ge,{className:"max-h-96 overflow-x-hidden overflow-y-auto",children:[e.jsxs(L,{onSelect:l=>{l.preventDefault(),p()},children:[e.jsx(B,{checked:d,className:"mr-2"}),"All except scheduled"]}),e.jsxs(L,{onSelect:l=>{l.preventDefault(),c()},children:[e.jsx(B,{checked:s.size===0,className:"mr-2"}),"All run states"]}),Object.keys(G).map(l=>e.jsxs(L,{"aria-label":l,onSelect:x=>{x.preventDefault(),n(l)},children:[e.jsx(B,{"aria-label":l,className:"mr-2",checked:!d&&s.has(l)}),e.jsx(V,{name:l,type:G[l]})]},l))]})]})},Fs=({flowRunId:s})=>{const a=U(),[t,m]=o.useState(""),[r,d]=o.useState(new Set),[p,c]=o.useState(new Set),[n,v]=o.useState("EXPECTED_START_TIME_DESC"),[l,x]=o.useState({page:1,limit:20}),g=xe(t,300),{data:y}=O(ie({task_runs:{operator:"and_",flow_run_id:{operator:"and_",any_:[s],is_null_:!1},subflow_runs:{exists_:!1}}},3e4)),{data:h}=F(Z({task_runs:{operator:"and_",flow_run_id:{operator:"and_",any_:[s],is_null_:!1},subflow_runs:{exists_:!1},name:g?{like_:g}:void 0,state:r.size>0?{operator:"and_",name:{any_:Array.from(r)}}:void 0,tags:p.size>0?{operator:"and_",all_:Array.from(p)}:void 0},sort:n,page:l.page,limit:l.limit},3e4)),w=f=>{m(f.target.value),x(u=>({...u,page:1}))},N=f=>{d(f),x(u=>({...u,page:1}))},C=f=>{v(f),x(u=>({...u,page:1}))},E=f=>{const u=Array.isArray(f)?f:[];c(new Set(u)),x(j=>({...j,page:1}))},Q=()=>{m(""),d(new Set),c(new Set),x(f=>({...f,page:1}))},R=f=>{a.prefetchQuery(Z({task_runs:{operator:"and_",flow_run_id:{operator:"and_",any_:[s],is_null_:!1},subflow_runs:{exists_:!1},name:g?{like_:g}:void 0,state:r.size>0?{operator:"and_",name:{any_:Array.from(r)}}:void 0,tags:p.size>0?{operator:"and_",all_:Array.from(p)}:void 0},sort:n,page:f,limit:l.limit},3e4))},q=t||r.size>0||p.size>0,P=o.useMemo(()=>{if(!h?.results)return null;const f=new Map;for(const u of h.results){const j=String(u.state?.name??"Unknown");f.set(j,(f.get(j)??0)+1)}return Array.from(f.entries()).map(([u,j])=>`${j} ${u}`).join(", ")},[h?.results]);return y===0?e.jsx("div",{className:"flex items-center justify-center h-48 border rounded-lg bg-muted/50",children:e.jsx(A,{className:"text-muted-foreground",children:"No task runs found for this flow run."})}):e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsxs("div",{className:"grid grid-cols-12 items-center gap-2",children:[e.jsxs("div",{className:"flex flex-col gap-1 xl:col-span-3 md:col-span-12 col-span-6 md:order-0 order-3",children:[e.jsxs(A,{variant:"bodySmall",className:"text-muted-foreground",children:[y," Task run",y!==1?"s":""]}),P&&e.jsxs(A,{variant:"bodySmall",className:"text-muted-foreground text-xs capitalize",children:["(",P,")"]})]}),e.jsx("div",{className:"xl:col-span-3 md:col-span-6 col-span-12 md:order-1 order-0",children:e.jsx(me,{value:t,onChange:w,placeholder:"Search by run name","aria-label":"Search by run name",debounceMs:300})}),e.jsx("div",{className:"xl:col-span-2 md:col-span-6 col-span-12 md:order-2 order-1",children:e.jsx(Ds,{selectedFilters:r,onSelectFilter:N})}),e.jsx("div",{className:"xl:col-span-2 md:col-span-6 col-span-12 md:order-3 order-2",children:e.jsx(gs,{value:Array.from(p),onChange:E,placeholder:"All tags"})}),e.jsx("div",{className:"xl:border-l xl:border-border xl:pl-2 xl:col-span-2 md:col-span-6 col-span-6 md:order-4 order-4",children:e.jsx(ms,{value:n,onSelect:C})})]}),e.jsx(hs,{taskRuns:h?.results,onClearFilters:q?Q:void 0}),h&&h.pages>0&&e.jsx(ps,{pagination:l,onChangePagination:x,count:h.count,pages:h.pages,onPrefetchPage:R})]})},As=({id:s,tab:a,onTabChange:t})=>{const[m,r]=o.useState(!1),[d,p]=o.useState(!1),c=U(),{data:n}=O({...Ue(s),refetchInterval:m}),{deleteFlowRun:v}=We(),{navigate:l}=fe(),x=n.state_type==="PENDING";ls(n?.state_type),o.useEffect(()=>{n.state_type==="RUNNING"||n.state_type==="PENDING"?r(5e3):r(!1)},[n]);const g=()=>{v(n.id,{onSuccess:()=>{r(!1),S.success("Flow run deleted"),l({to:"/runs",replace:!0})},onError:C=>{const E=C.message||"Unknown error while deleting flow run.";S.error(E)}})},y=o.useCallback(()=>{c.invalidateQueries({queryKey:Je.all()})},[c]),h=o.useCallback(()=>{c.invalidateQueries({queryKey:He.all()})},[c]),w=o.useCallback(()=>{c.invalidateQueries({queryKey:Ke.lists()})},[c]),N=o.useCallback(()=>{c.invalidateQueries({queryKey:Xe.all()})},[c]);return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx("div",{className:"flex flex-col gap-2",children:e.jsx(_s,{flowRun:n,onDeleteClick:g})}),!x&&e.jsx(re,{className:"py-0",children:e.jsx(ne,{className:"p-0",children:e.jsx(ys,{flowRunId:n.id,stateType:n.state_type??void 0,fullscreen:d,onFullscreenChange:p})})}),e.jsx("div",{className:"flex flex-col gap-4",children:e.jsx(Ls,{currentTab:a,onTabChange:t,flowRun:n,logsContent:e.jsx(z,{fallback:e.jsx(M,{error:{type:"unknown-error",message:"Failed to load logs",details:"An error occurred while loading log data. Please try again."},onRetry:y}),children:e.jsx(o.Suspense,{fallback:e.jsx(Es,{}),children:e.jsx(ws,{flowRun:n})})}),taskRunsContent:e.jsx(z,{fallback:e.jsx(M,{error:{type:"unknown-error",message:"Failed to load task runs",details:"An error occurred while loading task run data. Please try again."},onRetry:h}),children:e.jsx(o.Suspense,{fallback:e.jsx(Ps,{}),children:e.jsx(Fs,{flowRunId:s})})}),subflowRunsContent:e.jsx(z,{fallback:e.jsx(M,{error:{type:"unknown-error",message:"Failed to load subflow runs",details:"An error occurred while loading subflow run data. Please try again."},onRetry:w}),children:e.jsx(o.Suspense,{fallback:e.jsx(zs,{}),children:e.jsx(Ts,{parentFlowRunId:s})})}),artifactsContent:e.jsx(z,{fallback:e.jsx(M,{error:{type:"unknown-error",message:"Failed to load artifacts",details:"An error occurred while loading artifact data. Please try again."},onRetry:N}),children:e.jsx(o.Suspense,{fallback:e.jsx(Is,{}),children:e.jsx(Ns,{flowRun:n})})}),detailsContent:e.jsx(o.Suspense,{fallback:e.jsx(Ms,{}),children:e.jsx(bs,{flowRun:n})}),parametersContent:e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"flex justify-end",children:e.jsxs(D,{variant:"outline",size:"sm",onClick:()=>{S.success("Copied parameters to clipboard"),navigator.clipboard.writeText(JSON.stringify(n.parameters??{},null,2))},children:[e.jsx(b,{id:"Copy",className:"size-4 mr-2"}),"Copy parameters"]})}),e.jsx(ee,{value:JSON.stringify(n.parameters??{},null,2),disabled:!0})]}),jobVariablesContent:e.jsxs("div",{className:"space-y-4",children:[e.jsx("div",{className:"flex justify-end",children:e.jsxs(D,{variant:"outline",size:"sm",onClick:()=>{S.success("Copied job variables to clipboard"),navigator.clipboard.writeText(JSON.stringify(n.job_variables??{},null,2))},children:[e.jsx(b,{id:"Copy",className:"size-4 mr-2"}),"Copy job variables"]})}),e.jsx(ee,{value:JSON.stringify(n.job_variables??{},null,2),disabled:!0})]})})})]})},Ls=({currentTab:s,onTabChange:a,flowRun:t,logsContent:m,taskRunsContent:r,subflowRunsContent:d,artifactsContent:p,detailsContent:c,parametersContent:n,jobVariablesContent:v})=>e.jsxs(Ye,{value:s,onValueChange:l=>a(l),children:[e.jsxs(Ze,{children:[e.jsx(k,{value:"Details",children:"Details"}),e.jsx(k,{value:"Logs",children:"Logs"}),t.state_type!=="PENDING"&&e.jsx(k,{value:"TaskRuns",children:"Task Runs"}),t.state_type!=="PENDING"&&e.jsx(k,{value:"SubflowRuns",children:"Subflow Runs"}),e.jsx(k,{value:"Artifacts",children:"Artifacts"}),e.jsx(k,{value:"Parameters",children:"Parameters"}),e.jsx(k,{value:"JobVariables",children:"Job Variables"})]}),e.jsx(T,{value:"Details",children:c}),e.jsx(T,{value:"Logs",children:m}),e.jsx(T,{value:"TaskRuns",children:r}),e.jsx(T,{value:"SubflowRuns",children:d}),e.jsx(T,{value:"Artifacts",children:p}),e.jsx(T,{value:"Parameters",children:n}),e.jsx(T,{value:"JobVariables",children:v})]}),Es=()=>e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex flex-row gap-2 justify-end",children:[e.jsx(i,{className:"h-8 w-25"}),e.jsx(i,{className:"h-8 w-32"}),e.jsx(i,{className:"h-8 w-8"})," "]}),e.jsx(i,{className:"h-32"})]}),Ps=()=>e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx("div",{className:"flex items-center justify-between",children:e.jsx(i,{className:"h-4 w-24"})}),e.jsxs("div",{className:"flex flex-col sm:flex-row gap-2",children:[e.jsx(i,{className:"h-9 flex-1"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(i,{className:"h-9 w-48"}),e.jsx(i,{className:"h-9 w-40"})]})]}),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(i,{className:"h-24"}),e.jsx(i,{className:"h-24"}),e.jsx(i,{className:"h-24"})]})]}),Is=()=>e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("div",{className:"flex flex-row justify-end",children:e.jsx(i,{className:"h-8 w-12"})}),e.jsxs("div",{className:"grid grid-cols-1 gap-4 lg:grid-cols-2 xl:grid-cols-3",children:[e.jsx(i,{className:"h-40"}),e.jsx(i,{className:"h-40"}),e.jsx(i,{className:"h-40"}),e.jsx(i,{className:"h-40"})]})]}),zs=()=>e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx("div",{className:"flex items-center justify-between",children:e.jsx(i,{className:"h-4 w-24"})}),e.jsxs("div",{className:"flex flex-col sm:flex-row gap-2",children:[e.jsx(i,{className:"h-9 flex-1"}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(i,{className:"h-9 w-48"}),e.jsx(i,{className:"h-9 w-40"})]})]}),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx(i,{className:"h-24"}),e.jsx(i,{className:"h-24"}),e.jsx(i,{className:"h-24"})]})]}),Ms=()=>e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(i,{className:"h-4 w-20"}),e.jsx(i,{className:"h-5 w-12"})]}),e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(i,{className:"h-4 w-16"}),e.jsx(i,{className:"h-5 w-32"})]}),e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(i,{className:"h-4 w-24"}),e.jsx(i,{className:"h-5 w-32"})]}),e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx(i,{className:"h-4 w-24"}),e.jsx(i,{className:"h-5 w-64"})]})]});js({tab:fs(["Logs","TaskRuns","SubflowRuns","Artifacts","Details","Parameters","JobVariables"]).default("Logs").catch("Logs")});function Os(){const{id:s}=se.useParams(),{tab:a}=se.useSearch(),t=ve(),m=r=>{t({to:".",search:d=>({...d,tab:r})})};return e.jsx(As,{id:s,tab:a,onTabChange:m})}const Ys=Object.freeze(Object.defineProperty({__proto__:null,component:Os},Symbol.toStringTag,{value:"Module"}));export{_ as K,Ys as f};
4
- //# sourceMappingURL=flow-run._id-BT3wztDF.js.map
@@ -1 +0,0 @@
1
- {"version":3,"mappings":";q0CAKA,MAAMA,GAAmBC,OAAK,WAC7B,OAAO,8BAAkB,oFAAE,KAAMC,IAAS,CAAE,QAASA,EAAI,cAAe,CACzE,EAeO,SAASC,GAAaC,EAA0B,CACtD,OACCC,MAACC,WAAA,CAAS,SAAUD,MAACE,EAAA,CAAS,UAAU,mBAAmB,EAC1D,SAAAF,MAACL,GAAA,CAAkB,GAAGI,CAAA,CAAO,EAC9B,CAEF,CChBO,MAAMI,UAAsBC,WAGjC,CACD,YAAYL,EAA2B,CACtC,MAAMA,CAAK,EACX,KAAK,MAAQ,CAAE,SAAU,GAAO,MAAO,KACxC,CAEA,OAAO,yBAAyBM,EAAkC,CACjE,MAAO,CAAE,SAAU,GAAM,MAAAA,CAAA,CAC1B,CAEA,QAAS,CACR,GAAI,KAAK,MAAM,SAAU,CACxB,KAAM,CAAE,SAAAC,GAAa,KAAK,MAC1B,OAAI,OAAOA,GAAa,WAChBA,EAAS,KAAK,MAAM,OAAS,IAAI,MAAM,eAAe,CAAC,EAExDA,CACR,CACA,OAAO,KAAK,MAAM,QACnB,CACD,CCxBO,SAASC,EAAc,CAC7B,MAAAF,EACA,QAAAG,EACA,WAAAC,CACD,EAAuB,CACtB,OACCC,OAAC,OAAI,UAAU,6DACd,UAAAV,MAAC,OAAI,UAAU,0CACd,eAACW,GAAA,CAAY,UAAU,0BAA0B,EAClD,EACAD,OAAC,OAAI,UAAU,iBACd,UAAAV,MAAC,KAAE,UAAU,cAAe,SAAAK,EAAM,QAAQ,EACzCA,EAAM,SACNL,MAAC,KAAE,UAAU,yCACX,WAAM,QACR,GAEF,EACCQ,GACAE,OAACE,EAAA,CACA,QAAQ,UACR,KAAK,KACL,QAASJ,EACT,SAAUC,EACV,UAAU,QAEV,UAAAT,MAACa,IAAU,UAAWC,EAAG,SAAUL,GAAc,cAAc,EAAG,EACjEA,EAAa,cAAgB,UAC/B,EAEF,CAEF,CC7BO,MAAMM,GAAmB,CAAC,CAAE,QAAAC,KAAqC,CACvE,KAAM,CAACC,EAAMC,CAAO,EAAIC,WAA0B,MAAM,EAClD,CAAE,KAAMC,CAAA,EAAcC,EAC3BC,GAAwB,CACvB,UAAW,CACV,SAAU,OACV,YAAa,CACZ,KAAM,CAACN,EAAQ,EAAE,GAElB,KAAM,CACL,SAAU,CAAC,QAAQ,EACpB,EAED,KAAM,UACN,OAAQ,EACR,GAEF,OAAII,EAAU,SAAW,QAEtBG,GAAA,CACA,SAAAvB,MAACwB,IAAY,UAAU,cACtB,gBAAC,KAAE,6GAE0B,IAC5BxB,MAAC,KACA,KAAK,+CACL,OAAO,SACP,IAAI,sBACJ,UAAU,gBACV,2BAEG,KAEL,EACD,EACD,EAKDU,OAAC,OAAI,UAAU,sBACd,UAAAV,MAAC,OAAI,UAAU,mBACd,SAAAU,OAACe,GAAA,CACA,KAAK,SACL,QAAQ,UACR,MAAOR,EACP,cAAgBS,GAAUR,EAAQQ,CAAwB,EAE1D,UAAA1B,MAAC2B,GAAA,CAAgB,MAAM,OAAO,aAAW,YACxC,SAAA3B,MAAC4B,GAAA,CAAW,UAAU,UAAU,EACjC,EACA5B,MAAC2B,GAAA,CAAgB,MAAM,OAAO,aAAW,YACxC,SAAA3B,MAAC6B,GAAA,CAAM,UAAU,UAAU,EAC5B,KAEF,EACA7B,MAAC,OACA,UAAWc,EACV,OACAG,IAAS,OACN,4CACA,cACH,SAED,cAAY,0BAEX,SAAAG,EAAU,IAAKU,GACf9B,MAAC+B,GAAA,CAEA,SAAAD,EACA,QAASb,IAAS,QAFba,EAAS,GAIf,GACF,EACD,CAEF,EC/EO,SAASE,EAAS,CAAE,MAAAC,EAAO,MAAAP,EAAO,SAAAQ,EAAU,UAAAC,GAA4B,CAC9E,MAAMC,EAAa,IAAM,CACxB,MAAMC,EAAaF,IAAc,OAAOT,GAAU,SAAWA,EAAQ,IAChE,UAAU,UAAU,UAAUW,CAAU,EAC7CC,EAAM,QAAQ,GAAGL,CAAK,SAAS,CAChC,EAEA,OACCvB,OAAC,MAAG,UAAU,sBACb,UAAAV,MAAC,MAAG,UAAU,gCAAiC,SAAAiC,EAAM,EACrDvB,OAAC,MAAG,UAAU,kCACZ,UAAAgB,EACAQ,GACAlC,MAACY,EAAA,CAAO,QAAQ,QAAQ,KAAK,OAAO,QAASwB,EAC5C,eAACG,EAAA,CAAK,GAAG,OAAO,UAAU,SAAS,EACpC,GAEF,GACD,CAEF,CCtBO,SAASC,GAAe,CAAE,QAAAxB,GAAgC,CAChE,OAAKA,EASJN,OAAC,OAAI,UAAU,YACd,UAAAV,MAACgC,EAAA,CAAS,MAAM,YAAY,MAAOhB,EAAQ,UAAW,EAEtDhB,MAACgC,EAAA,CACA,MAAM,UACN,MAAOhC,MAACyC,EAAA,CAAc,KAAMzB,EAAQ,QAAS,IAG7CA,EAAQ,YAAY,eACpBhB,MAACgC,EAAA,CAAS,MAAM,aAAa,MAAOhB,EAAQ,WAAW,cAAe,EAGvEhB,MAACgC,EAAA,CACA,MAAM,eACN,MAAOhC,MAACyC,EAAA,CAAc,KAAMzB,EAAQ,QAAS,IAG7CA,EAAQ,iBACRhB,MAACgC,EAAA,CAAS,MAAM,kBAAkB,MAAOhB,EAAQ,gBAAiB,EAGlEA,EAAQ,MAAQA,EAAQ,KAAK,OAAS,GACtChB,MAACgC,EAAA,CAAS,MAAM,OAAO,MAAOhC,MAAC0C,GAAA,CAAc,KAAM1B,EAAQ,KAAM,EAAI,EAGtEhB,MAACgC,GAAS,MAAM,cAAc,MAAOhB,EAAQ,GAAI,SAAQ,GAAC,EAEzDA,EAAQ,OAAO,SACfhB,MAACgC,EAAA,CAAS,MAAM,gBAAgB,MAAOhB,EAAQ,MAAM,QAAS,EAG9DA,EAAQ,cACRhB,MAACgC,EAAA,CAAS,MAAM,eAAe,MAAOhB,EAAQ,aAAc,EAG5DA,EAAQ,kBAAkB,SAAW,MACrCN,OAAAiC,WAAA,CACC,UAAA3C,MAACgC,GAAS,MAAM,UAAU,MAAOhB,EAAQ,iBAAiB,QAAS,EACnEhB,MAACgC,EAAA,CACA,MAAM,cACN,MAAOhB,EAAQ,iBAAiB,aACjC,EACD,GAEF,EAnDChB,MAAC,OAAI,UAAU,iDACd,eAAC,QAAK,UAAU,gBAAgB,yCAA6B,EAC9D,CAmDH,CCnBO,SAAS4C,GAAc,CAAE,QAAA5B,EAAS,cAAA6B,GAAqC,CAC7E,KAAM,CAACC,EAAaC,CAAa,EAAIC,GAAA,EAC/B,CACL,KAAMC,EACN,aAAcC,EACd,WAAYC,CAAA,EACTC,GAAA,EACE,CAAE,gBAAAC,EAAiB,UAAWC,CAAA,EAAoBC,GAAA,EAElDC,EACLxC,EAAQ,YACR,CAAC,YAAa,SAAU,YAAa,SAAS,EAAE,SAC/CA,EAAQ,YAGJyC,EAAqBC,GAAiD,CAC3EL,EACC,CACC,GAAIrC,EAAQ,GACZ,MAAO,CACN,KAAM0C,EAAS,KAKf,KAAMA,EAAS,KAAK,OAAO,CAAC,EAAIA,EAAS,KAAK,MAAM,CAAC,EAAE,cACvD,QAASA,EAAS,SAEnB,MAAO,IAER,CACC,UAAW,IAAM,CAChBpB,EAAM,QAAQ,wBAAwB,EACtCY,EAAmB,EAAK,CACzB,EACA,QAAU7C,GAAU,CACnBiC,EAAM,MAAMjC,EAAM,SAAW,wBAAwB,CACtD,EACD,CAEF,EAEM,CAAE,KAAMsD,CAAA,EAAeC,EAAS,CACrC,GAAGC,GAA4B7C,EAAQ,eAAiB,EAAE,EAC1D,QAAS,CAAC,CAACA,EAAQ,cACnB,EAEK,CAAE,KAAM8C,CAAA,EAAiBF,EAAS,CACvC,GAAGG,GAAwB,CAC1B,UAAW,CACV,SAAU,OACV,YAAa,CAAE,SAAU,OAAQ,KAAM,CAAC/C,EAAQ,EAAE,EAAG,SAAU,GAAM,CACtE,CACA,EACD,EAEK,CAAE,KAAMgD,CAAA,EAAmBJ,EAAS,CACzC,GAAGK,GAAyB,CAC3B,KAAM,kBACN,OAAQ,EACR,MAAO,EACP,UAAW,CACV,SAAU,OACV,GAAI,CAAE,KAAM,CAACjD,EAAQ,oBAAsB,EAAE,EAAE,CAChD,CACA,EACD,QAAS,CAAC,CAACA,EAAQ,mBACnB,EACKkD,EAAgBF,IAAiB,CAAC,EAElCG,EAAsBC,GACvBA,IAAU,OAAkB,MAC5BA,IAAU,EAAU,OACjB,GAAGA,CAAK,YAAYA,IAAU,EAAI,GAAK,GAAG,GAGlD,OACC1D,OAAC,OAAI,UAAU,gCACd,UAAAA,OAAC,OAAI,UAAU,sBAEd,UAAAV,MAACqE,GAAA,CACA,gBAACC,GAAA,CACA,UAAAtE,MAACuE,EAAA,CACA,eAACC,GAAA,CAAe,GAAG,QAAQ,UAAU,wBAAwB,gBAE7D,EACD,QACCC,GAAA,EAAoB,EACrB/D,OAAC6D,EAAA,CAAe,UAAU,UACzB,UAAAvE,MAAC0E,GAAA,CAAe,UAAU,gBACxB,SAAA1D,EAAQ,KACV,EACCA,EAAQ,gBACRhB,MAAC2E,GAAA,CAAM,QAAQ,UAAU,UAAU,OACjC,SAAA3D,EAAQ,eACV,EAEAA,EAAQ,MAAQA,EAAQ,KAAK,OAAS,GACtChB,MAAC,OAAI,UAAU,OACd,eAAC0C,GAAA,CAAc,KAAM1B,EAAQ,KAAM,iBAAkB,EAAG,EACzD,GAEF,GACD,EACD,EAGAN,OAAC,OAAI,UAAU,wDACb,UAAAM,EAAQ,YAAcA,EAAQ,YAC9BhB,MAAC4E,EAAA,CAAW,KAAM5D,EAAQ,WAAY,KAAMA,EAAQ,WAAY,EAEhEA,EAAQ,YACRN,OAAC,OAAI,UAAU,0BACd,UAAAV,MAACuC,EAAA,CAAK,GAAG,WAAW,UAAU,SAAS,QACtC,QAAM,SAAAsC,GAAW7D,EAAQ,WAAY,iBAAiB,EAAE,GAC1D,EAEDN,OAAC,OAAI,UAAU,0BACd,UAAAV,MAACuC,EAAA,CAAK,GAAG,QAAQ,UAAU,SAAS,QACnC,QACC,SAAAuC,GAA2B9D,EAAQ,gBAAkB,CAAC,EACxD,GACD,EACAN,OAAC,OACA,UAAW,2BAA2BoD,IAAiB,EAAI,2BAA6B,EAAE,GAE1F,UAAA9D,MAACuC,EAAA,CAAK,GAAG,WAAW,UAAU,SAAS,EACvCvC,MAAC,QAAM,SAAAmE,EAAmBL,CAAY,EAAE,IACzC,EACD,EAGApD,OAAC,OAAI,UAAU,4CACb,UAAAM,EAAQ,SAAWhB,MAAC+E,GAAA,CAAa,OAAQ/D,EAAQ,QAAS,EAC1DA,EAAQ,eACRN,OAACsE,EAAA,CACA,GAAG,8BACH,OAAQ,CAAE,GAAIhE,EAAQ,eACtB,UAAU,0CAEV,UAAAhB,MAACuC,EAAA,CAAK,GAAG,SAAS,UAAU,SAAS,EACrCvC,MAAC,QAAK,UAAU,wBAAwB,sBAAU,EAClDA,MAAC,QAAM,SAAA2D,GAAY,MAAQ,MAAM,KAGlC3C,EAAQ,gBACRN,OAACsE,EAAA,CACA,GAAG,sCACH,OAAQ,CAAE,aAAchE,EAAQ,gBAChC,UAAU,0CAEV,UAAAhB,MAACuC,EAAA,CAAK,GAAG,SAAS,UAAU,SAAS,EACrCvC,MAAC,QAAK,UAAU,wBAAwB,qBAAS,EACjDA,MAAC,QAAM,SAAAgB,EAAQ,eAAe,KAG/BA,EAAQ,gBAAkBA,EAAQ,iBAClCN,OAACsE,EAAA,CACA,GAAG,sCACH,OAAQ,CAAE,aAAchE,EAAQ,gBAChC,OAAQ,CAAE,IAAK,eACf,UAAU,0CAEV,UAAAhB,MAACuC,EAAA,CAAK,GAAG,cAAc,UAAU,SAAS,EAC1CvC,MAAC,QAAK,UAAU,wBAAwB,sBAAU,EAClDA,MAAC,QAAM,SAAAgB,EAAQ,gBAAgB,KAGhCkD,GACAxD,OAACsE,EAAA,CACA,GAAG,qBACH,OAAQ,CAAE,GAAId,EAAc,IAC5B,UAAU,0CAEV,UAAAlE,MAACuC,EAAA,CAAK,GAAG,WAAW,UAAU,SAAS,EACvCvC,MAAC,QAAK,UAAU,wBAAwB,sBAAU,EAClDA,MAAC,QAAM,SAAAkE,EAAc,MAAQ,MAAM,IACpC,EAEF,GACD,SAECe,GAAA,CACA,UAAAjF,MAACkF,GAAA,CAAoB,QAAO,GAC3B,SAAAlF,MAACY,GAAO,QAAQ,UAAU,UAAU,MACnC,SAAAZ,MAACmF,GAAA,CAAa,UAAU,UAAU,EACnC,EACD,SACCC,GAAA,CACC,UAAA5B,GACAxD,MAACqF,EAAA,CAAiB,QAASlC,EAAiB,wBAE5C,EAEDnD,MAACqF,EAAA,CACA,QAAS,IAAM,CACT,UAAU,UAAU,UAAUrE,EAAQ,EAAE,EAC7CsB,EAAM,QAAQ,iCAAiC,CAChD,EACA,qBAGDtC,MAACqF,EAAA,CACA,QAAS,IACRtC,EAAc,CACb,MAAO,kBACP,YAAa,4CAA4C/B,EAAQ,IAAI,IACrE,UAAW6B,CAAA,CACX,EAEF,mBAED,EACD,GACD,EACA7C,MAACsF,GAAA,CAA0B,GAAGxC,EAAa,EAC3C9C,MAACuF,GAAA,CACA,KAAMtC,EACN,aAAcC,EACd,aACClC,EAAQ,MACL,CACA,KAAMA,EAAQ,MAAM,KACpB,KACCA,EAAQ,MAAM,MACdA,EAAQ,MAAM,KAAK,OAAO,CAAC,EAC1BA,EAAQ,MAAM,KAAK,MAAM,CAAC,EAAE,aAAY,EAE1C,KAEJ,MAAM,WACN,UAAWyC,EACX,UAAWH,CAAA,EACZ,EACD,CAEF,CC1QO,SAASkC,GAA0B,CACzC,QAAAxE,CACD,EAAmC,CAClC,KAAM,CAACyE,EAAeC,CAAgB,EAAIvE,WAAS,EAAK,EAElDwE,EAAiB,SAAY,CAClCD,EAAiB,EAAI,EACrB,GAAI,CAEH,MAAME,EAAW,MADD,MAAMC,GAAA,GACS,IAAI,gCAAiC,CACnE,OAAQ,CAAE,KAAM,CAAE,GAAI7E,EAAQ,GAAG,EACjC,QAAS,OACT,EAED,GAAI,CAAC4E,EAAS,KACb,MAAM,IAAI,MAAM,8BAA8B,EAG/C,MAAME,EAAM,IAAI,gBAAgBF,EAAS,IAAI,EACvCG,EAAO,SAAS,cAAc,GAAG,EACjCC,EAAWhF,EAAQ,MAAQ,OAEjC+E,EAAK,KAAOD,EACZC,EAAK,aAAa,WAAY,GAAGC,CAAQ,MAAM,EAC/CD,EAAK,QAEL,IAAI,gBAAgBD,CAAG,CACxB,OAASzF,EAAO,CACf,QAAQ,MAAMA,CAAK,EACnBiC,EAAM,MAAM,yBAAyB,CACtC,SACCoD,EAAiB,EAAK,CACvB,CACD,EAEA,cACEO,GAAA,CACA,UAAAjG,MAACkG,GAAA,CAAe,QAAO,GACtB,SAAAlG,MAACY,EAAA,CACA,QAAQ,UACR,KAAK,OACL,QAAS,KAAW+E,EAAA,GACpB,SAAUF,EACV,aAAW,gBAEV,SAAAA,EACAzF,MAACuC,EAAA,CAAK,GAAG,UAAU,UAAU,sBAAsB,EAEnDvC,MAACuC,EAAA,CAAK,GAAG,WAAW,UAAU,SAAS,IAG1C,EACAvC,MAACmG,IAAe,oCAAwB,GACzC,CAEF,CCpDO,MAAMC,GAAc,CAAC,CAC3B,QAAApF,EACA,WAAAqF,EAAa,EACd,IAAwB,CACvB,KAAM,CAACC,EAAaC,CAAc,EAAIpF,WAAiB,CAAC,EAClD,CAACqF,EAAWC,CAAY,EAAItF,WAEhC,eAAe,EAEXuF,EAAeC,UACpB,KAAO,CACN,GAAGC,GAA6B,CAC/B,MAAO,GACP,KAAMJ,EACN,KAAM,CACL,SAAU,OACV,MAAO,CAAE,IAAKF,CAAA,EACd,YAAa,CAAE,KAAM,CAACtF,EAAQ,EAAE,EAAE,CACnC,CACA,EACD,gBACCA,EAAQ,aAAe,UAAY,IAAQ,KAE7C,CAACsF,EAAaE,EAAWxF,EAAQ,GAAIA,EAAQ,UAAU,GAGlD,CACL,KAAM6F,EACN,YAAAC,EACA,cAAAC,EACA,mBAAAC,CAAA,EACGC,GAAyBP,CAAY,EAEnCQ,EAASL,EAAK,MAAM,SAAW,GAAKA,EAAK,MAAM,CAAC,EAAE,SAAW,EACnE,IAAIM,EAAU,qCACd,OAAID,IACCZ,EAAc,EACjBa,EAAU,qCAEVnG,EAAQ,aAAe,aACvBA,EAAQ,aAAe,YAEvBmG,EAAU,qDACAnG,EAAQ,aAAe,YACjCmG,EAAU,wBAKXzG,OAAC,OAAI,UAAU,sBACd,UAAAA,OAAC,OAAI,UAAU,kCACd,UAAAV,MAACoH,GAAA,CACA,YAAAd,EACA,eAAAC,CAAA,GAEDvG,MAACqH,GAAA,CAAa,UAAAb,EAAsB,aAAAC,CAAA,CAA4B,EAChEzG,MAACwF,IAA0B,QAAAxE,CAAA,CAAkB,GAC9C,EACCkG,EACAlH,MAAC,OAAI,UAAU,0DACd,SAAAA,MAAC,QAAK,UAAU,wBAAyB,WAAQ,EAClD,EAEAA,MAAC,OAAI,UAAU,aACd,SAAAA,MAACsH,GAAA,CACA,KAAMT,EAAK,MAAM,OACjB,gBAAiB,IAAM,CAClBC,GAAe,CAACE,GACnBD,EAAA,EAAgB,MAAO1G,GAAU,CAChC,QAAQ,MAAMA,CAAK,CACpB,CAAC,CAEH,EACA,UAAU,eACV,WAAAgG,CAAA,EACD,CACD,GAEF,CAEF,EAEMkB,GAAuB,CAC5B,CAAE,MAAO,MAAO,MAAO,GACvB,CAAE,MAAO,gBAAiB,MAAO,IACjC,CAAE,MAAO,kBAAmB,MAAO,IACnC,CAAE,MAAO,oBAAqB,MAAO,IACrC,CAAE,MAAO,iBAAkB,MAAO,IAClC,CAAE,MAAO,kBAAmB,MAAO,GACpC,EAEMH,GAAiB,CAAC,CACvB,YAAAd,EACA,eAAAC,CACD,IAKE7F,OAAC8G,GAAA,CACA,MAAOlB,EAAY,WACnB,cAAgB5E,GAAU6E,EAAe,OAAO7E,CAAK,CAAC,EAEtD,UAAA1B,MAACyH,GAAA,CAAc,aAAW,mBACzB,SAAAzH,MAAC,QACC;AAAA,SAEEuH,GAAqB,KACnBG,GAAWA,EAAO,QAAUpB,CAAA,GAC3B,KACJ,GACH,EACD,QACCqB,GAAA,CACC,SAAAJ,GAAqB,IAAKG,SACzBE,EAAA,CAA8B,MAAOF,EAAO,MAAM,WACjD,SAAAA,EAAO,OADQA,EAAO,KAExB,CACA,EACF,KAKGL,GAAe,CAAC,CACrB,UAAAb,EACA,aAAAC,CACD,IAIC/F,OAAC8G,GAAA,CACA,MAAOhB,EACP,cAAgB9E,GACf+E,EAAa/E,CAA2C,EAGzD,UAAA1B,MAACyH,IAAc,aAAW,iBACzB,eAACI,GAAA,CAAY,YAAY,iBAAiB,EAC3C,SACCF,GAAA,CACA,UAAA3H,MAAC4H,EAAA,CAAW,MAAM,gBAAgB,4BAAgB,EAClD5H,MAAC4H,EAAA,CAAW,MAAM,iBAAiB,4BAAgB,GACpD,GACD,ECpIYE,GAAkB,CAAC,CAAE,gBAAAC,KAA4C,CAC7E,MAAMC,EAAcC,EAAA,EACd,CAACC,EAAQC,CAAS,EAAIhH,WAAS,EAAE,EACjC,CAACiH,EAAaC,CAAc,EAAIlH,WAA4B,IAAI,GAAK,EACrE,CAACmH,EAAMC,CAAO,EAAIpH,WAAsB,iBAAiB,EACzD,CAACqH,EAAYC,CAAa,EAAItH,WAA0B,CAC7D,KAAM,EACN,MAAO,GACP,EAEKuH,EAAkBC,GAAYT,EAAQ,GAAG,EAEzCU,EAAmCjC,UAAQ,KACzC,CACN,UAAW,CACV,SAAU,OACV,mBAAoB,CACnB,SAAU,OACV,KAAM,CAACoB,CAAe,EACvB,CACD,GAEC,CAACA,CAAe,CAAC,EAEd,CAAE,KAAMc,CAAA,EAAcxH,EAC3ByH,GAAwBF,EAAa,GAAM,GAGtCG,EAAyCpC,UAAQ,KACX,CAC1C,KAAM6B,EAAW,KACjB,MAAOA,EAAW,MAClB,KAAAF,EACA,UAAW,CACV,SAAU,OACV,mBAAoB,CACnB,SAAU,OACV,KAAM,CAACP,CAAe,GAEvB,KAAMW,EAAkB,CAAE,MAAOA,GAAoB,OACrD,MACCN,EAAY,KAAO,EAChB,CACA,SAAU,OACV,KAAM,CAAE,KAAM,MAAM,KAAKA,CAAW,EAAE,EAEtC,OACL,GAGC,CAACL,EAAiBS,EAAYF,EAAMI,EAAiBN,CAAW,CAAC,EAE9D,CAAE,KAAMY,CAAA,EAAkBpF,EAC/BqF,EAA2BF,EAAgB,GAAM,GAG5CG,EAAUvC,UACf,IAAM,CACL,GAAG,IAAI,KACLqC,GAAe,SAAW,IAAI,IAAKhI,GAAYA,EAAQ,OAAO,EAChE,EAED,CAACgI,GAAe,OAAO,GAGlB,CAAE,KAAMG,CAAA,EAAUvF,EACvBwF,GACC,CACC,MAAO,CACN,SAAU,OACV,GAAI,CAAE,KAAMF,CAAA,CAAQ,EAErB,OAAQ,EACR,KAAM,YAEP,CAAE,QAASA,EAAQ,OAAS,EAAE,CAC/B,EAGKG,EAAoB1C,UAAQ,IAAM,CACvC,GAAI,CAACqC,GAAe,QAAS,MAAO,GACpC,MAAMM,EAAU,IAAI,IAAIH,GAAO,IAAKI,GAAe,CAACA,EAAK,GAAIA,CAAI,CAAC,GAAK,EAAE,EACzE,OAAOP,EAAc,QACnB,IAAKhI,GAAY,CACjB,MAAMuI,EAAOD,EAAQ,IAAItI,EAAQ,OAAO,EACxC,OAAKuI,EACE,CACN,GAAGvI,EACH,KAAAuI,CAAA,EAHiB,CAAE,GAAGvI,EAAS,KAAM,OAKvC,CAAC,EACA,OAAQA,GAAYA,IAAY,IAAI,CACvC,EAAG,CAACgI,GAAe,QAASG,CAAK,CAAC,EAE5BK,EAAsBC,GAA2C,CACtEtB,EAAUsB,EAAE,OAAO,KAAK,EACxBhB,EAAeiB,IAAU,CAAE,GAAGA,EAAM,KAAM,GAAI,CAC/C,EAEMC,EAA2BC,GAAkC,CAClEvB,EAAeuB,CAAU,EACzBnB,EAAeiB,IAAU,CAAE,GAAGA,EAAM,KAAM,GAAI,CAC/C,EAEMG,EAAoBC,GAAyB,CAClDvB,EAAQuB,CAAO,EACfrB,EAAeiB,IAAU,CAAE,GAAGA,EAAM,KAAM,GAAI,CAC/C,EAEMK,EAAqB,IAAM,CAChC5B,EAAU,EAAE,EACZE,EAAe,IAAI,GAAK,EACxBI,EAAeiB,IAAU,CAAE,GAAGA,EAAM,KAAM,GAAI,CAC/C,EAEMM,EAAsBC,GAAiB,CACvCjC,EAAY,cAChBiB,EACC,CACC,GAAGF,EACH,KAAAkB,CAAA,EAED,IACD,CAEF,EAEMC,EAAahC,GAAUE,EAAY,KAAO,EAEhD,OAAIS,IAAc,EAEhB7I,MAAC,OAAI,UAAU,sEACd,eAACmK,EAAA,CAAW,UAAU,wBAAwB,oDAE9C,EACD,EAKDzJ,OAAC,OAAI,UAAU,sBACd,UAAAA,OAAC,OAAI,UAAU,uCACd,UAAAV,MAAC,OAAI,UAAU,iFACd,SAAAU,OAACyJ,GAAW,QAAQ,YAAY,UAAU,wBACxC,UAAAtB,EAAU,eAAaA,IAAc,EAAI,IAAM,IACjD,EACD,EAEA7I,MAAC,OAAI,UAAU,+CACd,SAAAA,MAACoK,GAAA,CACA,MAAOlC,EACP,SAAUsB,EACV,YAAY,qBACZ,aAAW,qBACX,WAAY,MAEd,EACAxJ,MAAC,OAAI,UAAU,6DACd,SAAAA,MAACqK,GAAA,CACA,gBAAiBjC,EACjB,eAAgBuB,CAAA,GAElB,EACA3J,MAAC,OAAI,UAAU,iGACd,SAAAA,MAACsK,IAAW,MAAOhC,EAAM,SAAUuB,CAAA,CAAkB,EACtD,GACD,EAEA7J,MAACuK,GAAA,CACA,SAAUlB,EACV,eAAgBa,EAAaH,EAAqB,SAGlDf,GAAiBA,EAAc,MAAQ,GACvChJ,MAACwK,GAAA,CACA,WAAAhC,EACA,mBAAoBC,EACpB,MAAOO,EAAc,MACrB,MAAOA,EAAc,MACrB,eAAgBgB,CAAA,EACjB,EAEF,CAEF,ECpMMS,GAAwB,EAQjBC,GAAqB,CAAC,CAClC,gBAAAC,EACA,eAAAC,EACA,UAAAC,CACD,IAA+B,CAC9B,KAAM,CAACC,EAAMC,CAAO,EAAI5J,WAAS,EAAK,EAEhC6J,EAAoBrE,UAAQ,IAAM,CACvC,MAAMsE,EAA6B,IAAI,IACtCC,CAAA,EAED,OACCP,EAAgB,IAAI,WAAW,GAC/BM,EAA2B,OAASN,EAAgB,KAE7C,GAED,MAAM,KAAKA,CAAe,EAAE,MAAOQ,GACzCF,EAA2B,IAAIE,CAAM,EAEvC,EAAG,CAACR,CAAe,CAAC,EAEdS,EAAiC,IAAM,CAC5CR,EAAe,IAAI,IAAIM,CAA4B,CAAC,CACrD,EAEMG,EAA0B,IAAM,CACrCT,EAAe,IAAI,GAAK,CACzB,EAEMU,EAAsBH,GAAmB,CAC9C,GAAIH,EAAmB,CACtBJ,EAAe,IAAI,IAAI,CAACO,CAAM,CAAC,CAAC,EAChC,MACD,CACA,MAAMI,EAAiB,IAAI,IAAIZ,CAAe,EAC1CA,EAAgB,IAAIQ,CAAM,EAC7BI,EAAe,OAAOJ,CAAM,EAE5BI,EAAe,IAAIJ,CAAM,EAE1BP,EAAeW,CAAc,CAC9B,EAEMC,EAAqB,IAAM,CAChC,GAAIb,EAAgB,OAAS,EAC5B,MAAO,iBAER,GAAIK,EACH,MAAO,uBAGR,MAAMS,EAAW,MAAM,KAAKd,CAAe,EACrCe,EAAUD,EAAS,MAAM,EAAGhB,EAAqB,EACjDkB,EAAaF,EAAS,OAAShB,GAErC,OACC/J,OAAC,OAAI,UAAU,yCACd,UAAAV,MAAC,OAAI,UAAU,yDACb,SAAA0L,EAAQ,IAAKP,GACbnL,MAAC4E,EAAA,CAEA,KAAMuG,EACN,KAAMS,EAAoBT,CAAsB,GAF3CA,CAAA,CAIN,EACF,EACCQ,EAAa,GACbjL,OAACyJ,GAAW,QAAQ,YAAY,UAAU,WAAW,eACjDwB,CAAA,EACJ,GAEF,CAEF,EAEA,OACCjL,OAACuE,GAAA,CAAa,KAAA6F,EAAY,aAAcC,EACvC,UAAA/K,MAACkF,GAAA,CAAoB,QAAO,GAC3B,SAAAxE,OAACE,EAAA,CACA,QAAQ,UACR,UAAWE,EAAG,yBAA0B+J,CAAS,EAEjD,UAAA7K,MAAC,QAAK,UAAU,iBAAkB,SAAAwL,EAAA,EAAqB,EACvDxL,MAACuC,EAAA,CAAK,GAAG,cAAc,UAAU,uBAAuB,KAE1D,EACA7B,OAAC0E,GAAA,CAAoB,UAAU,6CAC9B,UAAA1E,OAAC2E,EAAA,CACA,SAAWoE,GAAM,CAChBA,EAAE,iBACF2B,EAAA,CACD,EAEA,UAAApL,MAAC6L,EAAA,CAAS,QAASb,EAAmB,UAAU,OAAO,EAAE,0BAG1DtK,OAAC2E,EAAA,CACA,SAAWoE,GAAM,CAChBA,EAAE,iBACF4B,EAAA,CACD,EAEA,UAAArL,MAAC6L,GAAS,QAASlB,EAAgB,OAAS,EAAG,UAAU,OAAO,EAAE,oBAGlE,OAAO,KAAKiB,CAAmB,EAAE,IAAKE,GACtCpL,OAAC2E,EAAA,CACA,aAAYyG,EAEZ,SAAWrC,GAAM,CAChBA,EAAE,iBACF6B,EAAmBQ,CAAS,CAC7B,EAEA,UAAA9L,MAAC6L,EAAA,CACA,aAAYC,EACZ,UAAU,OACV,QAAS,CAACd,GAAqBL,EAAgB,IAAImB,CAAS,IAE7D9L,MAAC4E,EAAA,CACA,KAAMkH,EACN,KAAMF,EAAoBE,CAAyB,GACpD,GAdKA,CAAA,CAgBN,GACF,GACD,CAEF,EChIaC,GAAkB,CAAC,CAAE,UAAAC,KAAsC,CACvE,MAAMhE,EAAcC,EAAA,EACd,CAACC,EAAQC,CAAS,EAAIhH,WAAS,EAAE,EACjC,CAACiH,EAAaC,CAAc,EAAIlH,WAAsB,IAAI,GAAK,EAC/D,CAAC8K,EAAYC,CAAa,EAAI/K,WAAsB,IAAI,GAAK,EAC7D,CAACmH,EAAMC,CAAO,EAAIpH,WACvB,4BAEK,CAACqH,EAAYC,CAAa,EAAItH,WAA0B,CAC7D,KAAM,EACN,MAAO,GACP,EAEKuH,EAAkBC,GAAYT,EAAQ,GAAG,EAEzC,CAAE,KAAMW,CAAA,EAAcxH,EAC3B0C,GACC,CACC,UAAW,CACV,SAAU,OACV,YAAa,CAAE,SAAU,OAAQ,KAAM,CAACiI,CAAS,EAAG,SAAU,IAC9D,aAAc,CAAE,QAAS,GAAM,CAChC,EAED,IACD,EAGK,CAAE,KAAMhD,CAAA,EAAkBpF,EAC/BuI,EACC,CACC,UAAW,CACV,SAAU,OACV,YAAa,CAAE,SAAU,OAAQ,KAAM,CAACH,CAAS,EAAG,SAAU,IAC9D,aAAc,CAAE,QAAS,IACzB,KAAMtD,EAAkB,CAAE,MAAOA,GAAoB,OACrD,MACCN,EAAY,KAAO,EAChB,CACA,SAAU,OACV,KAAM,CAAE,KAAM,MAAM,KAAKA,CAAW,EAAE,EAEtC,OACJ,KACC6D,EAAW,KAAO,EACf,CACA,SAAU,OACV,KAAM,MAAM,KAAKA,CAAU,GAE3B,QAEL,KAAA3D,EACA,KAAME,EAAW,KACjB,MAAOA,EAAW,OAEnB,IACD,EAGKgB,EAAsBC,GAA2C,CACtEtB,EAAUsB,EAAE,OAAO,KAAK,EACxBhB,EAAeiB,IAAU,CAAE,GAAGA,EAAM,KAAM,GAAI,CAC/C,EAEMC,EAA2BC,GAA4B,CAC5DvB,EAAeuB,CAAU,EACzBnB,EAAeiB,IAAU,CAAE,GAAGA,EAAM,KAAM,GAAI,CAC/C,EAEMG,EAAoBC,GAAgC,CACzDvB,EAAQuB,CAAO,EACfrB,EAAeiB,IAAU,CAAE,GAAGA,EAAM,KAAM,GAAI,CAC/C,EAEM0C,EACLC,GACI,CACJ,MAAMC,EAAU,MAAM,QAAQD,CAAI,EAAIA,EAAO,GAC7CH,EAAc,IAAI,IAAII,CAAO,CAAC,EAC9B7D,EAAeiB,IAAU,CAAE,GAAGA,EAAM,KAAM,GAAI,CAC/C,EAEMK,EAAqB,IAAM,CAChC5B,EAAU,EAAE,EACZE,EAAe,IAAI,GAAK,EACxB6D,EAAc,IAAI,GAAK,EACvBzD,EAAeiB,IAAU,CAAE,GAAGA,EAAM,KAAM,GAAI,CAC/C,EAEMM,EAAsBC,GAAiB,CACvCjC,EAAY,cAChBmE,EACC,CACC,UAAW,CACV,SAAU,OACV,YAAa,CACZ,SAAU,OACV,KAAM,CAACH,CAAS,EAChB,SAAU,IAEX,aAAc,CAAE,QAAS,IACzB,KAAMtD,EAAkB,CAAE,MAAOA,GAAoB,OACrD,MACCN,EAAY,KAAO,EAChB,CACA,SAAU,OACV,KAAM,CAAE,KAAM,MAAM,KAAKA,CAAW,EAAE,EAEtC,OACJ,KACC6D,EAAW,KAAO,EACf,CACA,SAAU,OACV,KAAM,MAAM,KAAKA,CAAU,GAE3B,QAEL,KAAA3D,EACA,KAAA2B,EACA,MAAOzB,EAAW,OAEnB,IACD,CAEF,EAEM0B,EAAahC,GAAUE,EAAY,KAAO,GAAK6D,EAAW,KAAO,EAGjEM,EAAe5F,UAAQ,IAAM,CAClC,GAAI,CAACqC,GAAe,QAAS,OAAO,KACpC,MAAMwD,MAAkB,IACxB,UAAWC,KAAWzD,EAAc,QAAS,CAC5C,MAAM0D,EAAY,OAAOD,EAAQ,OAAO,MAAQ,SAAS,EACzDD,EAAY,IAAIE,GAAYF,EAAY,IAAIE,CAAS,GAAK,GAAK,CAAC,CACjE,CACA,OAAO,MAAM,KAAKF,EAAY,SAAS,EACrC,IAAI,CAAC,CAACG,EAAMvI,CAAK,IAAM,GAAGA,CAAK,IAAIuI,CAAI,EAAE,EACzC,KAAK,IAAI,CACZ,EAAG,CAAC3D,GAAe,OAAO,CAAC,EAE3B,OAAIH,IAAc,EAEhB7I,MAAC,OAAI,UAAU,sEACd,eAACmK,EAAA,CAAW,UAAU,wBAAwB,iDAE9C,EACD,EAKDzJ,OAAC,OAAI,UAAU,sBAEd,UAAAA,OAAC,OAAI,UAAU,uCAEd,UAAAA,OAAC,OAAI,UAAU,iFACd,UAAAA,OAACyJ,EAAA,CAAW,QAAQ,YAAY,UAAU,wBACxC,UAAAtB,EAAU,YAAUA,IAAc,EAAI,IAAM,IAC9C,EACC0D,GACA7L,OAACyJ,EAAA,CACA,QAAQ,YACR,UAAU,2CACV,cACEoC,EAAa,MAChB,EAEF,EAGAvM,MAAC,OAAI,UAAU,6DACd,SAAAA,MAACoK,GAAA,CACA,MAAOlC,EACP,SAAUsB,EACV,YAAY,qBACZ,aAAW,qBACX,WAAY,MAEd,EACAxJ,MAAC,OAAI,UAAU,6DACd,SAAAA,MAAC0K,GAAA,CACA,gBAAiBtC,EACjB,eAAgBuB,CAAA,GAElB,EACA3J,MAAC,OAAI,UAAU,6DACd,SAAAA,MAAC4M,GAAA,CACA,MAAO,MAAM,KAAKX,CAAU,EAC5B,SAAUG,EACV,YAAY,aAEd,EAEApM,MAAC,OAAI,UAAU,iGACd,SAAAA,MAAC6M,IAAmB,MAAOvE,EAAM,SAAUuB,CAAA,CAAkB,EAC9D,GACD,EAEA7J,MAAC8M,GAAA,CACA,SAAU9D,GAAe,QACzB,eAAgBkB,EAAaH,EAAqB,SAGlDf,GAAiBA,EAAc,MAAQ,GACvChJ,MAAC+M,GAAA,CACA,WAAAvE,EACA,mBAAoBC,EACpB,MAAOO,EAAc,MACrB,MAAOA,EAAc,MACrB,eAAgBgB,CAAA,EACjB,EAEF,CAEF,ECtMagD,GAAqB,CAAC,CAClC,GAAAC,EACA,IAAAC,EACA,YAAAC,CACD,IAA+B,CAC9B,KAAM,CAACC,EAAiBC,CAAkB,EAAIlM,WAAyB,EAAK,EACtE,CAACmM,EAAYC,CAAa,EAAIpM,WAAS,EAAK,EAC5C6G,EAAcC,EAAA,EACd,CAAE,KAAMjH,CAAA,EAAYK,EAAiB,CAC1C,GAAGmM,GAA4BP,CAAE,EACjC,gBAAAG,CAAA,CACA,EACK,CAAE,cAAAK,CAAA,EAAkBC,GAAA,EACpB,CAAE,SAAAC,CAAA,EAAaC,GAAA,EACfC,EAAY7M,EAAQ,aAAe,UAGzC8M,GAAgB9M,GAAS,UAAU,EAEnC+M,YAAU,IAAM,CACX/M,EAAQ,aAAe,WAAaA,EAAQ,aAAe,UAC9DqM,EAAmB,GAAI,EAEvBA,EAAmB,EAAK,CAE1B,EAAG,CAACrM,CAAO,CAAC,EAEZ,MAAMgN,EAAqB,IAAM,CAChCP,EAAczM,EAAQ,GAAI,CACzB,UAAW,IAAM,CAChBqM,EAAmB,EAAK,EACxB/K,EAAM,QAAQ,kBAAkB,EAC3BqL,EAAS,CAAE,GAAI,QAAS,QAAS,GAAM,CAC7C,EACA,QAAUtN,GAAU,CACnB,MAAM8G,EACL9G,EAAM,SAAW,yCAClBiC,EAAM,MAAM6E,CAAO,CACpB,EACA,CACF,EAEM8G,EAAYC,cAAY,IAAM,CAC9BlG,EAAY,kBAAkB,CAClC,SAAUmG,GAAoB,KAAI,CAClC,CACF,EAAG,CAACnG,CAAW,CAAC,EAEVoG,EAAgBF,cAAY,IAAM,CAClClG,EAAY,kBAAkB,CAClC,SAAUqG,GAAwB,KAAI,CACtC,CACF,EAAG,CAACrG,CAAW,CAAC,EAEVsG,EAAgBJ,cAAY,IAAM,CAClClG,EAAY,kBAAkB,CAClC,SAAUuG,GAAwB,OAAM,CACxC,CACF,EAAG,CAACvG,CAAW,CAAC,EAEVwG,EAAiBN,cAAY,IAAM,CACnClG,EAAY,kBAAkB,CAClC,SAAUyG,GAAyB,KAAI,CACvC,CACF,EAAG,CAACzG,CAAW,CAAC,EAEhB,OACCtH,OAAC,OAAI,UAAU,sBACd,UAAAV,MAAC,OAAI,UAAU,sBACd,SAAAA,MAAC4C,IAAc,QAAA5B,EAAkB,cAAegN,EAAoB,EACrE,EACC,CAACH,GACD7N,MAACuB,GAAA,CAAK,UAAU,OACf,SAAAvB,MAACwB,GAAA,CAAY,UAAU,MACtB,SAAAxB,MAACF,GAAA,CACA,UAAWkB,EAAQ,GACnB,UAAWA,EAAQ,YAAc,OACjC,WAAAsM,EACA,mBAAoBC,CAAA,GAEtB,EACD,EAEDvN,MAAC,OAAI,UAAU,sBACd,SAAAA,MAAC0O,GAAA,CACA,WAAYxB,EACZ,YAAAC,EACA,QAAAnM,EACA,YACChB,MAACG,EAAA,CACA,SACCH,MAACO,EAAA,CACA,MAAO,CACN,KAAM,gBACN,QAAS,sBACT,QACC,+DAEF,QAAS0N,CAAA,GAIX,SAAAjO,MAACC,YAAS,SAAUD,MAAC2O,KAAa,EACjC,SAAA3O,MAACoG,GAAA,CAAY,QAAApF,CAAA,CAAkB,EAChC,IAGF,gBACChB,MAACG,EAAA,CACA,SACCH,MAACO,EAAA,CACA,MAAO,CACN,KAAM,gBACN,QAAS,2BACT,QACC,oEAEF,QAAS6N,CAAA,GAIX,SAAApO,MAACC,WAAA,CAAS,SAAUD,MAAC4O,GAAA,EAAiB,EACrC,SAAA5O,MAAC+L,GAAA,CAAgB,UAAWkB,CAAA,CAAI,EACjC,IAGF,mBACCjN,MAACG,EAAA,CACA,SACCH,MAACO,EAAA,CACA,MAAO,CACN,KAAM,gBACN,QAAS,8BACT,QACC,uEAEF,QAAS+N,CAAA,GAIX,SAAAtO,MAACC,WAAA,CAAS,SAAUD,MAAC6O,GAAA,EAAiB,EACrC,SAAA7O,MAAC8H,GAAA,CAAgB,gBAAiBmF,CAAA,CAAI,EACvC,IAGF,iBACCjN,MAACG,EAAA,CACA,SACCH,MAACO,EAAA,CACA,MAAO,CACN,KAAM,gBACN,QAAS,2BACT,QACC,oEAEF,QAASiO,CAAA,GAIX,SAAAxO,MAACC,YAAS,SAAUD,MAAC8O,KAAkB,EACtC,SAAA9O,MAACe,GAAA,CAAiB,QAAAC,CAAA,CAAkB,EACrC,IAGF,eACChB,MAACC,WAAA,CAAS,SAAUD,MAAC+O,KAAgB,EACpC,SAAA/O,MAACwC,GAAA,CAAe,QAAAxB,CAAA,CAAkB,EACnC,EAED,kBACCN,OAAC,OAAI,UAAU,YACd,UAAAV,MAAC,OAAI,UAAU,mBACd,SAAAU,OAACE,EAAA,CACA,QAAQ,UACR,KAAK,KACL,QAAS,IAAM,CACd0B,EAAM,QAAQ,gCAAgC,EACzC,UAAU,UAAU,UACxB,KAAK,UAAUtB,EAAQ,YAAc,GAAI,KAAM,CAAC,EAElD,EAEA,UAAAhB,MAACuC,EAAA,CAAK,GAAG,OAAO,UAAU,cAAc,EAAE,qBAG5C,EACAvC,MAACgP,GAAA,CACA,MAAO,KAAK,UAAUhO,EAAQ,YAAc,GAAI,KAAM,CAAC,EACvD,SAAQ,IACT,EACD,EAED,oBACCN,OAAC,OAAI,UAAU,YACd,UAAAV,MAAC,OAAI,UAAU,mBACd,SAAAU,OAACE,EAAA,CACA,QAAQ,UACR,KAAK,KACL,QAAS,IAAM,CACd0B,EAAM,QAAQ,mCAAmC,EAC5C,UAAU,UAAU,UACxB,KAAK,UAAUtB,EAAQ,eAAiB,GAAI,KAAM,CAAC,EAErD,EAEA,UAAAhB,MAACuC,EAAA,CAAK,GAAG,OAAO,UAAU,cAAc,EAAE,wBAG5C,EACAvC,MAACgP,GAAA,CACA,MAAO,KAAK,UAAUhO,EAAQ,eAAiB,GAAI,KAAM,CAAC,EAC1D,SAAQ,IACT,EACD,GAEF,CACD,GACD,CAEF,EAEM0N,GAAa,CAAC,CACnB,WAAAO,EACA,YAAA9B,EACA,QAAAnM,EACA,YAAAkO,EACA,gBAAAC,EACA,mBAAAC,EACA,iBAAAC,EACA,eAAAC,EACA,kBAAAC,EACA,oBAAAC,CACD,IAaE9O,OAAC+O,GAAA,CACA,MAAOR,EACP,cAAgBvN,GAAUyL,EAAYzL,CAAiC,EAEvE,UAAAhB,OAACgP,GAAA,CACA,UAAA1P,MAAC2P,EAAA,CAAY,MAAM,UAAU,mBAAO,EACpC3P,MAAC2P,EAAA,CAAY,MAAM,OAAO,gBAAI,EAC7B3O,EAAQ,aAAe,iBACtB2O,EAAA,CAAY,MAAM,WAAW,qBAAS,EAEvC3O,EAAQ,aAAe,iBACtB2O,EAAA,CAAY,MAAM,cAAc,wBAAY,EAE9C3P,MAAC2P,EAAA,CAAY,MAAM,YAAY,qBAAS,EACxC3P,MAAC2P,EAAA,CAAY,MAAM,aAAa,sBAAU,EAC1C3P,MAAC2P,EAAA,CAAY,MAAM,eAAe,yBAAa,GAChD,EACA3P,MAAC4P,EAAA,CAAY,MAAM,UAAW,SAAAN,EAAe,EAC7CtP,MAAC4P,EAAA,CAAY,MAAM,OAAQ,SAAAV,EAAY,EACvClP,MAAC4P,EAAA,CAAY,MAAM,WAAY,SAAAT,EAAgB,EAC/CnP,MAAC4P,EAAA,CAAY,MAAM,cAAe,SAAAR,EAAmB,EACrDpP,MAAC4P,EAAA,CAAY,MAAM,YAAa,SAAAP,EAAiB,EACjDrP,MAAC4P,EAAA,CAAY,MAAM,aAAc,SAAAL,EAAkB,EACnDvP,MAAC4P,EAAA,CAAY,MAAM,eAAgB,SAAAJ,CAAA,CAAoB,KAKpDb,GAAe,IAEnBjO,OAAC,OAAI,UAAU,sBACd,UAAAA,OAAC,OAAI,UAAU,kCACd,UAAAV,MAACE,EAAA,CAAS,UAAU,WAAW,EAC/BF,MAACE,EAAA,CAAS,UAAU,WAAW,EAC/BF,MAACE,EAAA,CAAS,UAAU,UAAU,EAAE,KACjC,EACAF,MAACE,EAAA,CAAS,UAAU,OAAO,GAC5B,EAII0O,GAAmB,IAEvBlO,OAAC,OAAI,UAAU,sBACd,UAAAV,MAAC,OAAI,UAAU,oCACd,eAACE,EAAA,CAAS,UAAU,WAAW,EAChC,EACAQ,OAAC,OAAI,UAAU,kCACd,UAAAV,MAACE,EAAA,CAAS,UAAU,aAAa,EACjCQ,OAAC,OAAI,UAAU,aACd,UAAAV,MAACE,EAAA,CAAS,UAAU,WAAW,EAC/BF,MAACE,EAAA,CAAS,UAAU,WAAW,GAChC,GACD,EACAQ,OAAC,OAAI,UAAU,sBACd,UAAAV,MAACE,EAAA,CAAS,UAAU,OAAO,EAC3BF,MAACE,EAAA,CAAS,UAAU,OAAO,EAC3BF,MAACE,EAAA,CAAS,UAAU,OAAO,GAC5B,GACD,EAII4O,GAAoB,IAExBpO,OAAC,OAAI,UAAU,sBACd,UAAAV,MAAC,OAAI,UAAU,4BACd,eAACE,EAAA,CAAS,UAAU,WAAW,EAChC,EACAQ,OAAC,OAAI,UAAU,uDACd,UAAAV,MAACE,EAAA,CAAS,UAAU,OAAO,EAC3BF,MAACE,EAAA,CAAS,UAAU,OAAO,EAC3BF,MAACE,EAAA,CAAS,UAAU,OAAO,EAC3BF,MAACE,EAAA,CAAS,UAAU,OAAO,GAC5B,GACD,EAII2O,GAAmB,IAEvBnO,OAAC,OAAI,UAAU,sBACd,UAAAV,MAAC,OAAI,UAAU,oCACd,eAACE,EAAA,CAAS,UAAU,WAAW,EAChC,EACAQ,OAAC,OAAI,UAAU,kCACd,UAAAV,MAACE,EAAA,CAAS,UAAU,aAAa,EACjCQ,OAAC,OAAI,UAAU,aACd,UAAAV,MAACE,EAAA,CAAS,UAAU,WAAW,EAC/BF,MAACE,EAAA,CAAS,UAAU,WAAW,GAChC,GACD,EACAQ,OAAC,OAAI,UAAU,sBACd,UAAAV,MAACE,EAAA,CAAS,UAAU,OAAO,EAC3BF,MAACE,EAAA,CAAS,UAAU,OAAO,EAC3BF,MAACE,EAAA,CAAS,UAAU,OAAO,GAC5B,GACD,EAII6O,GAAkB,IAEtBrO,OAAC,OAAI,UAAU,YACd,UAAAA,OAAC,OAAI,UAAU,sBACd,UAAAV,MAACE,EAAA,CAAS,UAAU,WAAW,EAC/BF,MAACE,EAAA,CAAS,UAAU,WAAW,GAChC,EACAQ,OAAC,OAAI,UAAU,sBACd,UAAAV,MAACE,EAAA,CAAS,UAAU,WAAW,EAC/BF,MAACE,EAAA,CAAS,UAAU,WAAW,GAChC,EACAQ,OAAC,OAAI,UAAU,sBACd,UAAAV,MAACE,EAAA,CAAS,UAAU,WAAW,EAC/BF,MAACE,EAAA,CAAS,UAAU,WAAW,GAChC,EACAQ,OAAC,OAAI,UAAU,sBACd,UAAAV,MAACE,EAAA,CAAS,UAAU,WAAW,EAC/BF,MAACE,EAAA,CAAS,UAAU,WAAW,GAChC,GACD,EC7YmB2P,GAAS,CAC7B3C,IAAK2C,GACE,CACL,OACA,WACA,cACA,YACA,UACA,aACA,cAAc,CACd,EACAC,QAAQ,MAAM,EACdC,MAAM,MAAM,CACf,CAAC,EAmFD,SAASC,IAAiB,CACzB,KAAM,CAAE/C,MAAOgD,GAAMC,YACf,CAAEhD,OAAQ+C,GAAME,YAChBxC,EAAWyC,KAEXjD,EAAeD,GAAkC,CACjDS,EAAS,CACb0C,GAAI,IACJnI,OAASwB,IAAU,CAClB,GAAGA,EACHwD,OACD,CACA,CACF,EAEA,OAAOlN,MAACgN,GAAA,CAAmB,GAAAC,EAAQ,IAAAC,EAAU,YAAAC,CAAA,CAAyB,CACvE","names":["FlowRunGraphLazy","lazy","mod","FlowRunGraph","props","jsx","Suspense","Skeleton","ErrorBoundary","Component","error","fallback","TabErrorState","onRetry","isRetrying","jsxs","AlertCircle","Button","RefreshCw","cn","FlowRunArtifacts","flowRun","view","setView","useState","artifacts","useSuspenseQuery","buildListArtifactsQuery","Card","CardContent","ToggleGroup","value","ToggleGroupItem","LayoutGrid","Rows3","artifact","ArtifactCard","KeyValue","label","copyable","copyValue","handleCopy","textToCopy","toast","Icon","FlowRunDetails","FormattedDate","TagBadgeGroup","Fragment","FlowRunHeader","onDeleteClick","dialogState","confirmDelete","useDeleteConfirmationDialog","isChangeStateOpen","setChangeStateOpen","openChangeState","useChangeStateDialog","setFlowRunState","isChangingState","useSetFlowRunState","canChangeState","handleChangeState","newState","deployment","useQuery","buildDeploymentDetailsQuery","taskRunCount","buildCountTaskRunsQuery","parentFlowRuns","buildFilterFlowRunsQuery","parentFlowRun","formatTaskRunCount","count","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","BreadcrumbPage","Badge","StateBadge","formatDate","secondsToApproximateString","FlowIconText","Link","DropdownMenu","DropdownMenuTrigger","MoreVertical","DropdownMenuContent","DropdownMenuItem","DeleteConfirmationDialog","ChangeStateDialog","FlowRunLogsDownloadButton","isDownloading","setIsDownloading","handleDownload","response","getQueryService","url","link","filename","Tooltip","TooltipTrigger","TooltipContent","FlowRunLogs","virtualize","levelFilter","setLevelFilter","sortOrder","setSortOrder","queryOptions","useMemo","buildInfiniteFilterLogsQuery","logs","hasNextPage","fetchNextPage","isFetchingNextPage","useSuspenseInfiniteQuery","noLogs","message","LogLevelFilter","LogSortOrder","RunLogs","LEVEL_FILTER_OPTIONS","Select","SelectTrigger","option","SelectContent","SelectItem","SelectValue","FlowRunSubflows","parentFlowRunId","queryClient","useQueryClient","search","setSearch","stateFilter","setStateFilter","sort","setSort","pagination","setPagination","debouncedSearch","useDebounce","countFilter","countData","buildCountFlowRunsQuery","paginateFilter","paginatedData","buildPaginateFlowRunsQuery","flowIds","flows","buildListFlowsQuery","flowRunsWithFlows","flowMap","flow","handleSearchChange","e","prev","handleStateFilterChange","newFilters","handleSortChange","newSort","handleClearFilters","handlePrefetchPage","page","hasFilters","Typography","SearchInput","StateFilter","SortFilter","FlowRunsList","FlowRunsPagination","MAX_FILTERS_DISPLAYED","TaskRunStateFilter","selectedFilters","onSelectFilter","className","open","setOpen","isAllButScheduled","flowRunStatesNoScheduleSet","FLOW_RUN_STATES_NO_SCHEDULED","filter","handleSelectAllExceptScheduled","handleSelectAllRunState","handleSelectFilter","updatedFilters","renderSelectedTags","selected","visible","extraCount","FLOW_RUN_STATES_MAP","Checkbox","filterKey","FlowRunTaskRuns","flowRunId","tagsFilter","setTagsFilter","buildPaginateTaskRunsQuery","handleTagsFilterChange","tags","newTags","stateSummary","stateCounts","taskRun","stateName","name","TagsInput","TaskRunsSortFilter","TaskRunsList","TaskRunsPagination","FlowRunDetailsPage","id","tab","onTabChange","refetchInterval","setRefetchInterval","fullscreen","setFullscreen","buildGetFlowRunDetailsQuery","deleteFlowRun","useDeleteFlowRun","navigate","useRouter","isPending","useStateFavicon","useEffect","onDeleteRunClicked","retryLogs","useCallback","logsQueryKeyFactory","retryTaskRuns","taskRunsQueryKeyFactory","retrySubflows","flowRunsQueryKeyFactory","retryArtifacts","artifactsQueryKeyFactory","TabsLayout","LogsSkeleton","TaskRunsSkeleton","SubflowsSkeleton","ArtifactsSkeleton","DetailsSkeleton","LazyJsonInput","currentTab","logsContent","taskRunsContent","subflowRunsContent","artifactsContent","detailsContent","parametersContent","jobVariablesContent","Tabs","TabsList","TabsTrigger","TabsContent","z","default","catch","RouteComponent","Route","useParams","useSearch","useNavigate","to"],"ignoreList":[],"sources":["../../src/components/flow-runs/flow-run-graph/index.tsx","../../src/components/ui/error-boundary.tsx","../../src/components/ui/tab-error-state.tsx","../../src/components/flow-runs/flow-run-details-page/flow-run-artifacts.tsx","../../src/components/ui/key-value.tsx","../../src/components/flow-runs/flow-run-details-page/flow-run-details.tsx","../../src/components/flow-runs/flow-run-details-page/flow-run-header.tsx","../../src/components/flow-runs/flow-run-details-page/flow-run-logs-download-button.tsx","../../src/components/flow-runs/flow-run-details-page/flow-run-logs.tsx","../../src/components/flow-runs/flow-run-details-page/flow-run-subflows.tsx","../../src/components/task-runs/task-run-state-filter.tsx","../../src/components/flow-runs/flow-run-details-page/flow-run-task-runs.tsx","../../src/components/flow-runs/flow-run-details-page/index.tsx","../../src/routes/runs/flow-run.$id.tsx?tsr-split=component"],"sourcesContent":["import type { GraphItemSelection, ViewportDateRange } from \"@prefecthq/graphs\";\nimport type { CSSProperties } from \"react\";\nimport { lazy, Suspense } from \"react\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\n\nconst FlowRunGraphLazy = lazy(() =>\n\timport(\"./flow-run-graph\").then((mod) => ({ default: mod.FlowRunGraph })),\n);\n\ntype FlowRunGraphProps = {\n\tflowRunId: string;\n\tstateType?: string;\n\tviewport?: ViewportDateRange;\n\tonViewportChange?: (viewport: ViewportDateRange) => void;\n\tselected?: GraphItemSelection;\n\tonSelectedChange?: (selected: GraphItemSelection | undefined) => void;\n\tfullscreen?: boolean;\n\tonFullscreenChange?: (fullscreen: boolean) => void;\n\tclassName?: string;\n\tstyle?: CSSProperties;\n};\n\nexport function FlowRunGraph(props: FlowRunGraphProps) {\n\treturn (\n\t\t<Suspense fallback={<Skeleton className=\"h-[500px] w-full\" />}>\n\t\t\t<FlowRunGraphLazy {...props} />\n\t\t</Suspense>\n\t);\n}\n\nexport type { GraphItemSelection, ViewportDateRange } from \"@prefecthq/graphs\";\n","import { Component, type ReactNode } from \"react\";\n\ntype ErrorBoundaryProps = {\n\tchildren: ReactNode;\n\tfallback: ReactNode | ((error: Error) => ReactNode);\n};\n\ntype ErrorBoundaryState = {\n\thasError: boolean;\n\terror: Error | null;\n};\n\nexport class ErrorBoundary extends Component<\n\tErrorBoundaryProps,\n\tErrorBoundaryState\n> {\n\tconstructor(props: ErrorBoundaryProps) {\n\t\tsuper(props);\n\t\tthis.state = { hasError: false, error: null };\n\t}\n\n\tstatic getDerivedStateFromError(error: Error): ErrorBoundaryState {\n\t\treturn { hasError: true, error };\n\t}\n\n\trender() {\n\t\tif (this.state.hasError) {\n\t\t\tconst { fallback } = this.props;\n\t\t\tif (typeof fallback === \"function\") {\n\t\t\t\treturn fallback(this.state.error ?? new Error(\"Unknown error\"));\n\t\t\t}\n\t\t\treturn fallback;\n\t\t}\n\t\treturn this.props.children;\n\t}\n}\n","import { AlertCircle, RefreshCw } from \"lucide-react\";\nimport type { ServerError } from \"@/api/error-utils\";\nimport { Button } from \"@/components/ui/button\";\nimport { cn } from \"@/utils\";\n\ntype TabErrorStateProps = {\n\terror: ServerError;\n\tonRetry?: () => void;\n\tisRetrying?: boolean;\n};\n\nexport function TabErrorState({\n\terror,\n\tonRetry,\n\tisRetrying,\n}: TabErrorStateProps) {\n\treturn (\n\t\t<div className=\"flex flex-col items-center justify-center py-8 text-center\">\n\t\t\t<div className=\"rounded-full bg-destructive/10 p-2 mb-3\">\n\t\t\t\t<AlertCircle className=\"size-6 text-destructive\" />\n\t\t\t</div>\n\t\t\t<div className=\"space-y-1 mb-4\">\n\t\t\t\t<p className=\"font-medium\">{error.message}</p>\n\t\t\t\t{error.details && (\n\t\t\t\t\t<p className=\"text-xs text-muted-foreground max-w-sm\">\n\t\t\t\t\t\t{error.details}\n\t\t\t\t\t</p>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t\t{onRetry && (\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\tonClick={onRetry}\n\t\t\t\t\tdisabled={isRetrying}\n\t\t\t\t\tclassName=\"gap-2\"\n\t\t\t\t>\n\t\t\t\t\t<RefreshCw className={cn(\"size-3\", isRetrying && \"animate-spin\")} />\n\t\t\t\t\t{isRetrying ? \"Retrying...\" : \"Retry\"}\n\t\t\t\t</Button>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { LayoutGrid, Rows3 } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { buildListArtifactsQuery } from \"@/api/artifacts\";\nimport type { FlowRun } from \"@/api/flow-runs\";\nimport { ArtifactCard } from \"@/components/artifacts/artifact-card\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { ToggleGroup, ToggleGroupItem } from \"@/components/ui/toggle-group\";\nimport { cn } from \"@/utils\";\n\ntype FlowRunArtifactsProps = {\n\tflowRun: FlowRun;\n};\n\nexport const FlowRunArtifacts = ({ flowRun }: FlowRunArtifactsProps) => {\n\tconst [view, setView] = useState<\"grid\" | \"list\">(\"grid\");\n\tconst { data: artifacts } = useSuspenseQuery(\n\t\tbuildListArtifactsQuery({\n\t\t\tartifacts: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tflow_run_id: {\n\t\t\t\t\tany_: [flowRun.id],\n\t\t\t\t},\n\t\t\t\ttype: {\n\t\t\t\t\tnot_any_: [\"result\"],\n\t\t\t\t},\n\t\t\t},\n\t\t\tsort: \"ID_DESC\",\n\t\t\toffset: 0,\n\t\t}),\n\t);\n\tif (artifacts.length === 0) {\n\t\treturn (\n\t\t\t<Card>\n\t\t\t\t<CardContent className=\"text-center\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tThis flow run did not produce any artifacts; for more information on\n\t\t\t\t\t\tcreating artifacts, see the{\" \"}\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref=\"https://docs.prefect.io/v3/develop/artifacts\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\tclassName=\"text-blue-500\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tdocumentation\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t.\n\t\t\t\t\t</p>\n\t\t\t\t</CardContent>\n\t\t\t</Card>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex justify-end\">\n\t\t\t\t<ToggleGroup\n\t\t\t\t\ttype=\"single\"\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tvalue={view}\n\t\t\t\t\tonValueChange={(value) => setView(value as \"grid\" | \"list\")}\n\t\t\t\t>\n\t\t\t\t\t<ToggleGroupItem value=\"grid\" aria-label=\"Grid view\">\n\t\t\t\t\t\t<LayoutGrid className=\"w-4 h-4\" />\n\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t\t<ToggleGroupItem value=\"list\" aria-label=\"List view\">\n\t\t\t\t\t\t<Rows3 className=\"w-4 h-4\" />\n\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t</ToggleGroup>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"grid\",\n\t\t\t\t\tview === \"grid\"\n\t\t\t\t\t\t? \"grid-cols-1 lg:grid-cols-2 xl:grid-cols-3\"\n\t\t\t\t\t\t: \"grid-cols-1\",\n\t\t\t\t\t\"gap-4\",\n\t\t\t\t)}\n\t\t\t\tdata-testid=\"flow-run-artifacts-grid\"\n\t\t\t>\n\t\t\t\t{artifacts.map((artifact) => (\n\t\t\t\t\t<ArtifactCard\n\t\t\t\t\t\tkey={artifact.id}\n\t\t\t\t\t\tartifact={artifact}\n\t\t\t\t\t\tcompact={view === \"list\"}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { toast } from \"sonner\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\n\ntype KeyValueProps = {\n\tlabel: string;\n\tvalue: React.ReactNode;\n\tcopyable?: boolean;\n\tcopyValue?: string;\n};\n\nexport function KeyValue({ label, value, copyable, copyValue }: KeyValueProps) {\n\tconst handleCopy = () => {\n\t\tconst textToCopy = copyValue ?? (typeof value === \"string\" ? value : \"\");\n\t\tvoid navigator.clipboard.writeText(textToCopy);\n\t\ttoast.success(`${label} copied`);\n\t};\n\n\treturn (\n\t\t<dl className=\"flex flex-col gap-1\">\n\t\t\t<dt className=\"text-muted-foreground text-sm\">{label}</dt>\n\t\t\t<dd className=\"text-sm flex items-center gap-2\">\n\t\t\t\t{value}\n\t\t\t\t{copyable && (\n\t\t\t\t\t<Button variant=\"ghost\" size=\"icon\" onClick={handleCopy}>\n\t\t\t\t\t\t<Icon id=\"Copy\" className=\"size-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t)}\n\t\t\t</dd>\n\t\t</dl>\n\t);\n}\n","import type { FlowRun } from \"@/api/flow-runs\";\nimport { FormattedDate } from \"@/components/ui/formatted-date/formatted-date\";\nimport { KeyValue } from \"@/components/ui/key-value\";\nimport { TagBadgeGroup } from \"@/components/ui/tag-badge-group\";\n\ntype FlowRunDetailsProps = {\n\tflowRun: FlowRun | null | undefined;\n};\n\nexport function FlowRunDetails({ flowRun }: FlowRunDetailsProps) {\n\tif (!flowRun) {\n\t\treturn (\n\t\t\t<div className=\"flex flex-col gap-2 bg-gray-100 p-4 rounded-md\">\n\t\t\t\t<span className=\"text-gray-500\">No flow run details available</span>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t<KeyValue label=\"Run Count\" value={flowRun.run_count} />\n\n\t\t\t<KeyValue\n\t\t\t\tlabel=\"Created\"\n\t\t\t\tvalue={<FormattedDate date={flowRun.created} />}\n\t\t\t/>\n\n\t\t\t{flowRun.created_by?.display_value && (\n\t\t\t\t<KeyValue label=\"Created By\" value={flowRun.created_by.display_value} />\n\t\t\t)}\n\n\t\t\t<KeyValue\n\t\t\t\tlabel=\"Last Updated\"\n\t\t\t\tvalue={<FormattedDate date={flowRun.updated} />}\n\t\t\t/>\n\n\t\t\t{flowRun.idempotency_key && (\n\t\t\t\t<KeyValue label=\"Idempotency Key\" value={flowRun.idempotency_key} />\n\t\t\t)}\n\n\t\t\t{flowRun.tags && flowRun.tags.length > 0 && (\n\t\t\t\t<KeyValue label=\"Tags\" value={<TagBadgeGroup tags={flowRun.tags} />} />\n\t\t\t)}\n\n\t\t\t<KeyValue label=\"Flow Run ID\" value={flowRun.id} copyable />\n\n\t\t\t{flowRun.state?.message && (\n\t\t\t\t<KeyValue label=\"State Message\" value={flowRun.state.message} />\n\t\t\t)}\n\n\t\t\t{flowRun.flow_version && (\n\t\t\t\t<KeyValue label=\"Flow Version\" value={flowRun.flow_version} />\n\t\t\t)}\n\n\t\t\t{flowRun.empirical_policy?.retries != null && (\n\t\t\t\t<>\n\t\t\t\t\t<KeyValue label=\"Retries\" value={flowRun.empirical_policy.retries} />\n\t\t\t\t\t<KeyValue\n\t\t\t\t\t\tlabel=\"Retry Delay\"\n\t\t\t\t\t\tvalue={flowRun.empirical_policy.retry_delay}\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 { Link } from \"@tanstack/react-router\";\nimport { MoreVertical } from \"lucide-react\";\nimport { toast } from \"sonner\";\nimport { buildDeploymentDetailsQuery } from \"@/api/deployments\";\nimport {\n\tbuildFilterFlowRunsQuery,\n\ttype FlowRun,\n\tuseSetFlowRunState,\n} from \"@/api/flow-runs\";\nimport { buildCountTaskRunsQuery } from \"@/api/task-runs\";\nimport { FlowIconText } from \"@/components/flows/flow-icon-text\";\nimport { Badge } from \"@/components/ui/badge\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n\tBreadcrumbPage,\n\tBreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tChangeStateDialog,\n\tuseChangeStateDialog,\n} from \"@/components/ui/change-state-dialog\";\nimport {\n\tDeleteConfirmationDialog,\n\tuseDeleteConfirmationDialog,\n} from \"@/components/ui/delete-confirmation-dialog\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\nimport { TagBadgeGroup } from \"@/components/ui/tag-badge-group\";\nimport { formatDate, secondsToApproximateString } from \"@/utils\";\n\ntype FlowRunHeaderProps = {\n\tflowRun: FlowRun;\n\tonDeleteClick: () => void;\n};\n\nexport function FlowRunHeader({ flowRun, onDeleteClick }: FlowRunHeaderProps) {\n\tconst [dialogState, confirmDelete] = useDeleteConfirmationDialog();\n\tconst {\n\t\topen: isChangeStateOpen,\n\t\tonOpenChange: setChangeStateOpen,\n\t\topenDialog: openChangeState,\n\t} = useChangeStateDialog();\n\tconst { setFlowRunState, isPending: isChangingState } = useSetFlowRunState();\n\n\tconst canChangeState =\n\t\tflowRun.state_type &&\n\t\t[\"COMPLETED\", \"FAILED\", \"CANCELLED\", \"CRASHED\"].includes(\n\t\t\tflowRun.state_type,\n\t\t);\n\n\tconst handleChangeState = (newState: { type: string; message?: string }) => {\n\t\tsetFlowRunState(\n\t\t\t{\n\t\t\t\tid: flowRun.id,\n\t\t\t\tstate: {\n\t\t\t\t\ttype: newState.type as\n\t\t\t\t\t\t| \"COMPLETED\"\n\t\t\t\t\t\t| \"FAILED\"\n\t\t\t\t\t\t| \"CANCELLED\"\n\t\t\t\t\t\t| \"CRASHED\",\n\t\t\t\t\tname: newState.type.charAt(0) + newState.type.slice(1).toLowerCase(),\n\t\t\t\t\tmessage: newState.message,\n\t\t\t\t},\n\t\t\t\tforce: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\ttoast.success(\"Flow run state changed\");\n\t\t\t\t\tsetChangeStateOpen(false);\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\ttoast.error(error.message || \"Failed to change state\");\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\tconst { data: deployment } = useQuery({\n\t\t...buildDeploymentDetailsQuery(flowRun.deployment_id ?? \"\"),\n\t\tenabled: !!flowRun.deployment_id,\n\t});\n\n\tconst { data: taskRunCount } = useQuery({\n\t\t...buildCountTaskRunsQuery({\n\t\t\ttask_runs: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tflow_run_id: { operator: \"and_\", any_: [flowRun.id], is_null_: false },\n\t\t\t},\n\t\t}),\n\t});\n\n\tconst { data: parentFlowRuns } = useQuery({\n\t\t...buildFilterFlowRunsQuery({\n\t\t\tsort: \"START_TIME_DESC\",\n\t\t\toffset: 0,\n\t\t\tlimit: 1,\n\t\t\ttask_runs: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tid: { any_: [flowRun.parent_task_run_id ?? \"\"] },\n\t\t\t},\n\t\t}),\n\t\tenabled: !!flowRun.parent_task_run_id,\n\t});\n\tconst parentFlowRun = parentFlowRuns?.[0];\n\n\tconst formatTaskRunCount = (count: number | undefined) => {\n\t\tif (count === undefined) return \"...\";\n\t\tif (count === 0) return \"None\";\n\t\treturn `${count} Task run${count === 1 ? \"\" : \"s\"}`;\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-row justify-between\">\n\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t{/* Row 1 - Breadcrumb */}\n\t\t\t\t<Breadcrumb>\n\t\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t\t\t<BreadcrumbLink to=\"/runs\" className=\"text-xl font-semibold\">\n\t\t\t\t\t\t\t\tRuns\n\t\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t\t<BreadcrumbItem className=\"text-xl\">\n\t\t\t\t\t\t\t<BreadcrumbPage className=\"font-semibold\">\n\t\t\t\t\t\t\t\t{flowRun.name}\n\t\t\t\t\t\t\t</BreadcrumbPage>\n\t\t\t\t\t\t\t{flowRun.work_pool_name && (\n\t\t\t\t\t\t\t\t<Badge variant=\"outline\" className=\"ml-2\">\n\t\t\t\t\t\t\t\t\t{flowRun.work_pool_name}\n\t\t\t\t\t\t\t\t</Badge>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t{flowRun.tags && flowRun.tags.length > 0 && (\n\t\t\t\t\t\t\t\t<div className=\"ml-2\">\n\t\t\t\t\t\t\t\t\t<TagBadgeGroup tags={flowRun.tags} maxTagsDisplayed={3} />\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</BreadcrumbItem>\n\t\t\t\t\t</BreadcrumbList>\n\t\t\t\t</Breadcrumb>\n\n\t\t\t\t{/* Row 2 - Meta */}\n\t\t\t\t<div className=\"flex items-center gap-4 text-sm text-muted-foreground\">\n\t\t\t\t\t{flowRun.state_type && flowRun.state_name && (\n\t\t\t\t\t\t<StateBadge type={flowRun.state_type} name={flowRun.state_name} />\n\t\t\t\t\t)}\n\t\t\t\t\t{flowRun.start_time && (\n\t\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t<Icon id=\"Calendar\" className=\"size-4\" />\n\t\t\t\t\t\t\t<span>{formatDate(flowRun.start_time, \"dateTimeNumeric\")}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t<Icon id=\"Clock\" className=\"size-4\" />\n\t\t\t\t\t\t<span>\n\t\t\t\t\t\t\t{secondsToApproximateString(flowRun.total_run_time ?? 0)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={`flex items-center gap-1 ${taskRunCount === 0 ? \"text-muted-foreground/60\" : \"\"}`}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon id=\"ListTodo\" className=\"size-4\" />\n\t\t\t\t\t\t<span>{formatTaskRunCount(taskRunCount)}</span>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t{/* Row 3 - Relationships */}\n\t\t\t\t<div className=\"flex items-center gap-4 text-sm flex-wrap\">\n\t\t\t\t\t{flowRun.flow_id && <FlowIconText flowId={flowRun.flow_id} />}\n\t\t\t\t\t{flowRun.deployment_id && (\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/deployments/deployment/$id\"\n\t\t\t\t\t\t\tparams={{ id: flowRun.deployment_id }}\n\t\t\t\t\t\t\tclassName=\"flex items-center gap-1 hover:underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon id=\"Rocket\" className=\"size-4\" />\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">Deployment</span>\n\t\t\t\t\t\t\t<span>{deployment?.name ?? \"...\"}</span>\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t)}\n\t\t\t\t\t{flowRun.work_pool_name && (\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/work-pools/work-pool/$workPoolName\"\n\t\t\t\t\t\t\tparams={{ workPoolName: flowRun.work_pool_name }}\n\t\t\t\t\t\t\tclassName=\"flex items-center gap-1 hover:underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon id=\"Server\" className=\"size-4\" />\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">Work Pool</span>\n\t\t\t\t\t\t\t<span>{flowRun.work_pool_name}</span>\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t)}\n\t\t\t\t\t{flowRun.work_pool_name && flowRun.work_queue_name && (\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/work-pools/work-pool/$workPoolName\"\n\t\t\t\t\t\t\tparams={{ workPoolName: flowRun.work_pool_name }}\n\t\t\t\t\t\t\tsearch={{ tab: \"Work Queues\" }}\n\t\t\t\t\t\t\tclassName=\"flex items-center gap-1 hover:underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon id=\"ListOrdered\" className=\"size-4\" />\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">Work Queue</span>\n\t\t\t\t\t\t\t<span>{flowRun.work_queue_name}</span>\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t)}\n\t\t\t\t\t{parentFlowRun && (\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/runs/flow-run/$id\"\n\t\t\t\t\t\t\tparams={{ id: parentFlowRun.id }}\n\t\t\t\t\t\t\tclassName=\"flex items-center gap-1 hover:underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon id=\"Workflow\" className=\"size-4\" />\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">Parent Run</span>\n\t\t\t\t\t\t\t<span>{parentFlowRun.name ?? \"...\"}</span>\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t<Button variant=\"outline\" className=\"p-2\">\n\t\t\t\t\t\t<MoreVertical className=\"w-4 h-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t<DropdownMenuContent>\n\t\t\t\t\t{canChangeState && (\n\t\t\t\t\t\t<DropdownMenuItem onClick={openChangeState}>\n\t\t\t\t\t\t\tChange state\n\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t)}\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(flowRun.id);\n\t\t\t\t\t\t\ttoast.success(\"Copied flow run ID to clipboard\");\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tCopy ID\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\tconfirmDelete({\n\t\t\t\t\t\t\t\ttitle: \"Delete Flow Run\",\n\t\t\t\t\t\t\t\tdescription: `Are you sure you want to delete flow run ${flowRun.name}?`,\n\t\t\t\t\t\t\t\tonConfirm: onDeleteClick,\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\t\tDelete\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t\t<DeleteConfirmationDialog {...dialogState} />\n\t\t\t<ChangeStateDialog\n\t\t\t\topen={isChangeStateOpen}\n\t\t\t\tonOpenChange={setChangeStateOpen}\n\t\t\t\tcurrentState={\n\t\t\t\t\tflowRun.state\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\ttype: flowRun.state.type,\n\t\t\t\t\t\t\t\tname:\n\t\t\t\t\t\t\t\t\tflowRun.state.name ??\n\t\t\t\t\t\t\t\t\tflowRun.state.type.charAt(0) +\n\t\t\t\t\t\t\t\t\t\tflowRun.state.type.slice(1).toLowerCase(),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: null\n\t\t\t\t}\n\t\t\t\tlabel=\"Flow Run\"\n\t\t\t\tonConfirm={handleChangeState}\n\t\t\t\tisLoading={isChangingState}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","import { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport type { components } from \"@/api/prefect\";\nimport { getQueryService } from \"@/api/service\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipTrigger,\n} from \"@/components/ui/tooltip\";\n\ntype FlowRunLogsDownloadButtonProps = {\n\tflowRun: components[\"schemas\"][\"FlowRunResponse\"];\n};\n\nexport function FlowRunLogsDownloadButton({\n\tflowRun,\n}: FlowRunLogsDownloadButtonProps) {\n\tconst [isDownloading, setIsDownloading] = useState(false);\n\n\tconst handleDownload = async () => {\n\t\tsetIsDownloading(true);\n\t\ttry {\n\t\t\tconst service = await getQueryService();\n\t\t\tconst response = await service.GET(\"/flow_runs/{id}/logs/download\", {\n\t\t\t\tparams: { path: { id: flowRun.id } },\n\t\t\t\tparseAs: \"blob\",\n\t\t\t});\n\n\t\t\tif (!response.data) {\n\t\t\t\tthrow new Error(\"No data received from server\");\n\t\t\t}\n\n\t\t\tconst url = URL.createObjectURL(response.data);\n\t\t\tconst link = document.createElement(\"a\");\n\t\t\tconst filename = flowRun.name ?? \"logs\";\n\n\t\t\tlink.href = url;\n\t\t\tlink.setAttribute(\"download\", `${filename}.csv`);\n\t\t\tlink.click();\n\n\t\t\tURL.revokeObjectURL(url);\n\t\t} catch (error) {\n\t\t\tconsole.error(error);\n\t\t\ttoast.error(\"Failed to download logs\");\n\t\t} finally {\n\t\t\tsetIsDownloading(false);\n\t\t}\n\t};\n\n\treturn (\n\t\t<Tooltip>\n\t\t\t<TooltipTrigger asChild>\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tonClick={() => void handleDownload()}\n\t\t\t\t\tdisabled={isDownloading}\n\t\t\t\t\taria-label=\"Download logs\"\n\t\t\t\t>\n\t\t\t\t\t{isDownloading ? (\n\t\t\t\t\t\t<Icon id=\"Loader2\" className=\"size-4 animate-spin\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<Icon id=\"Download\" className=\"size-4\" />\n\t\t\t\t\t)}\n\t\t\t\t</Button>\n\t\t\t</TooltipTrigger>\n\t\t\t<TooltipContent>Download all logs as CSV</TooltipContent>\n\t\t</Tooltip>\n\t);\n}\n","import { useSuspenseInfiniteQuery } from \"@tanstack/react-query\";\nimport { useMemo, useState } from \"react\";\nimport { buildInfiniteFilterLogsQuery } from \"@/api/logs\";\nimport type { components } from \"@/api/prefect\";\nimport { RunLogs } from \"@/components/ui/run-logs\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { FlowRunLogsDownloadButton } from \"./flow-run-logs-download-button\";\n\ntype FlowRunLogsProps = {\n\tflowRun: components[\"schemas\"][\"FlowRunResponse\"];\n\tvirtualize?: boolean;\n};\n\nexport const FlowRunLogs = ({\n\tflowRun,\n\tvirtualize = true,\n}: FlowRunLogsProps) => {\n\tconst [levelFilter, setLevelFilter] = useState<number>(0);\n\tconst [sortOrder, setSortOrder] = useState<\n\t\t\"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\"\n\t>(\"TIMESTAMP_ASC\");\n\n\tconst queryOptions = useMemo(\n\t\t() => ({\n\t\t\t...buildInfiniteFilterLogsQuery({\n\t\t\t\tlimit: 50,\n\t\t\t\tsort: sortOrder,\n\t\t\t\tlogs: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tlevel: { ge_: levelFilter },\n\t\t\t\t\tflow_run_id: { any_: [flowRun.id] },\n\t\t\t\t},\n\t\t\t}),\n\t\t\trefetchInterval:\n\t\t\t\tflowRun.state_type === \"RUNNING\" ? 5000 : (false as const),\n\t\t}),\n\t\t[levelFilter, sortOrder, flowRun.id, flowRun.state_type],\n\t);\n\n\tconst {\n\t\tdata: logs,\n\t\thasNextPage,\n\t\tfetchNextPage,\n\t\tisFetchingNextPage,\n\t} = useSuspenseInfiniteQuery(queryOptions);\n\n\tconst noLogs = logs.pages.length === 1 && logs.pages[0].length === 0;\n\tlet message = \"This run did not produce any logs.\";\n\tif (noLogs) {\n\t\tif (levelFilter > 0) {\n\t\t\tmessage = \"No logs match your filter criteria\";\n\t\t} else if (\n\t\t\tflowRun.state_type === \"SCHEDULED\" &&\n\t\t\tflowRun.state_name === \"Scheduled\"\n\t\t) {\n\t\t\tmessage = \"Run has not yet started. Check back soon for logs.\";\n\t\t} else if (flowRun.state_type === \"RUNNING\") {\n\t\t\tmessage = \"Waiting for logs...\";\n\t\t}\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t<div className=\"flex flex-row gap-2 justify-end\">\n\t\t\t\t<LogLevelFilter\n\t\t\t\t\tlevelFilter={levelFilter}\n\t\t\t\t\tsetLevelFilter={setLevelFilter}\n\t\t\t\t/>\n\t\t\t\t<LogSortOrder sortOrder={sortOrder} setSortOrder={setSortOrder} />\n\t\t\t\t<FlowRunLogsDownloadButton flowRun={flowRun} />\n\t\t\t</div>\n\t\t\t{noLogs ? (\n\t\t\t\t<div className=\"flex flex-col gap-2 text-center bg-muted p-2 rounded-md\">\n\t\t\t\t\t<span className=\"text-muted-foreground\">{message}</span>\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<div className=\"rounded-md\">\n\t\t\t\t\t<RunLogs\n\t\t\t\t\t\tlogs={logs.pages.flat()}\n\t\t\t\t\t\tonBottomReached={() => {\n\t\t\t\t\t\t\tif (hasNextPage && !isFetchingNextPage) {\n\t\t\t\t\t\t\t\tfetchNextPage().catch((error) => {\n\t\t\t\t\t\t\t\t\tconsole.error(error);\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\tclassName=\"max-h-[85vh]\"\n\t\t\t\t\t\tvirtualize={virtualize}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n\nconst LEVEL_FILTER_OPTIONS = [\n\t{ label: \"All\", value: 0 },\n\t{ label: \"Critical only\", value: 50 },\n\t{ label: \"Error and above\", value: 40 },\n\t{ label: \"Warning and above\", value: 30 },\n\t{ label: \"Info and above\", value: 20 },\n\t{ label: \"Debug and above\", value: 10 },\n] as const;\n\nconst LogLevelFilter = ({\n\tlevelFilter,\n\tsetLevelFilter,\n}: {\n\tlevelFilter: number;\n\tsetLevelFilter: (level: number) => void;\n}) => {\n\treturn (\n\t\t<Select\n\t\t\tvalue={levelFilter.toString()}\n\t\t\tonValueChange={(value) => setLevelFilter(Number(value))}\n\t\t>\n\t\t\t<SelectTrigger aria-label=\"log level filter\">\n\t\t\t\t<span>\n\t\t\t\t\t{`Level:\n\t\t\t\t\t\t\t${\n\t\t\t\t\t\t\t\tLEVEL_FILTER_OPTIONS.find(\n\t\t\t\t\t\t\t\t\t(option) => option.value === levelFilter,\n\t\t\t\t\t\t\t\t)?.label\n\t\t\t\t\t\t\t}`}\n\t\t\t\t</span>\n\t\t\t</SelectTrigger>\n\t\t\t<SelectContent>\n\t\t\t\t{LEVEL_FILTER_OPTIONS.map((option) => (\n\t\t\t\t\t<SelectItem key={option.value} value={option.value.toString()}>\n\t\t\t\t\t\t{option.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\nconst LogSortOrder = ({\n\tsortOrder,\n\tsetSortOrder,\n}: {\n\tsortOrder: \"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\";\n\tsetSortOrder: (sortOrder: \"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\") => void;\n}) => (\n\t<Select\n\t\tvalue={sortOrder}\n\t\tonValueChange={(value) =>\n\t\t\tsetSortOrder(value as \"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\")\n\t\t}\n\t>\n\t\t<SelectTrigger aria-label=\"log sort order\">\n\t\t\t<SelectValue placeholder=\"Sort log order\" />\n\t\t</SelectTrigger>\n\t\t<SelectContent>\n\t\t\t<SelectItem value=\"TIMESTAMP_ASC\">Oldest to newest</SelectItem>\n\t\t\t<SelectItem value=\"TIMESTAMP_DESC\">Newest to oldest</SelectItem>\n\t\t</SelectContent>\n\t</Select>\n);\n","import {\n\tuseQuery,\n\tuseQueryClient,\n\tuseSuspenseQuery,\n} from \"@tanstack/react-query\";\nimport { useMemo, useState } from \"react\";\nimport {\n\tbuildCountFlowRunsQuery,\n\tbuildPaginateFlowRunsQuery,\n\ttype FlowRunsCountFilter,\n\ttype FlowRunsPaginateFilter,\n\ttype FlowRunWithFlow,\n} from \"@/api/flow-runs\";\nimport { buildListFlowsQuery, type Flow } from \"@/api/flows\";\nimport { FlowRunsList } from \"@/components/flow-runs/flow-runs-list\";\nimport { SortFilter } from \"@/components/flow-runs/flow-runs-list/flow-runs-filters/sort-filter\";\nimport type { SortFilters } from \"@/components/flow-runs/flow-runs-list/flow-runs-filters/sort-filter.constants\";\nimport { StateFilter } from \"@/components/flow-runs/flow-runs-list/flow-runs-filters/state-filter\";\nimport type { FlowRunState } from \"@/components/flow-runs/flow-runs-list/flow-runs-filters/state-filters.constants\";\nimport {\n\tFlowRunsPagination,\n\ttype PaginationState,\n} from \"@/components/flow-runs/flow-runs-list/flow-runs-pagination\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport { Typography } from \"@/components/ui/typography\";\nimport useDebounce from \"@/hooks/use-debounce\";\n\ntype FlowRunSubflowsProps = {\n\tparentFlowRunId: string;\n};\n\nexport const FlowRunSubflows = ({ parentFlowRunId }: FlowRunSubflowsProps) => {\n\tconst queryClient = useQueryClient();\n\tconst [search, setSearch] = useState(\"\");\n\tconst [stateFilter, setStateFilter] = useState<Set<FlowRunState>>(new Set());\n\tconst [sort, setSort] = useState<SortFilters>(\"START_TIME_DESC\");\n\tconst [pagination, setPagination] = useState<PaginationState>({\n\t\tpage: 1,\n\t\tlimit: 10,\n\t});\n\n\tconst debouncedSearch = useDebounce(search, 300);\n\n\tconst countFilter: FlowRunsCountFilter = useMemo(() => {\n\t\treturn {\n\t\t\tflow_runs: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tparent_flow_run_id: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tany_: [parentFlowRunId],\n\t\t\t\t},\n\t\t\t},\n\t\t};\n\t}, [parentFlowRunId]);\n\n\tconst { data: countData } = useSuspenseQuery(\n\t\tbuildCountFlowRunsQuery(countFilter, 30_000),\n\t);\n\n\tconst paginateFilter: FlowRunsPaginateFilter = useMemo(() => {\n\t\tconst baseFilter: FlowRunsPaginateFilter = {\n\t\t\tpage: pagination.page,\n\t\t\tlimit: pagination.limit,\n\t\t\tsort,\n\t\t\tflow_runs: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tparent_flow_run_id: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tany_: [parentFlowRunId],\n\t\t\t\t},\n\t\t\t\tname: debouncedSearch ? { like_: debouncedSearch } : undefined,\n\t\t\t\tstate:\n\t\t\t\t\tstateFilter.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\tname: { any_: Array.from(stateFilter) },\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: undefined,\n\t\t\t},\n\t\t};\n\t\treturn baseFilter;\n\t}, [parentFlowRunId, pagination, sort, debouncedSearch, stateFilter]);\n\n\tconst { data: paginatedData } = useQuery(\n\t\tbuildPaginateFlowRunsQuery(paginateFilter, 30_000),\n\t);\n\n\tconst flowIds = useMemo(\n\t\t() => [\n\t\t\t...new Set(\n\t\t\t\t(paginatedData?.results ?? []).map((flowRun) => flowRun.flow_id),\n\t\t\t),\n\t\t],\n\t\t[paginatedData?.results],\n\t);\n\n\tconst { data: flows } = useQuery(\n\t\tbuildListFlowsQuery(\n\t\t\t{\n\t\t\t\tflows: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tid: { any_: flowIds },\n\t\t\t\t},\n\t\t\t\toffset: 0,\n\t\t\t\tsort: \"NAME_ASC\",\n\t\t\t},\n\t\t\t{ enabled: flowIds.length > 0 },\n\t\t),\n\t);\n\n\tconst flowRunsWithFlows = useMemo(() => {\n\t\tif (!paginatedData?.results) return [];\n\t\tconst flowMap = new Map(flows?.map((flow: Flow) => [flow.id, flow]) ?? []);\n\t\treturn paginatedData.results\n\t\t\t.map((flowRun) => {\n\t\t\t\tconst flow = flowMap.get(flowRun.flow_id);\n\t\t\t\tif (!flow) return { ...flowRun, flow: undefined };\n\t\t\t\treturn {\n\t\t\t\t\t...flowRun,\n\t\t\t\t\tflow,\n\t\t\t\t};\n\t\t\t})\n\t\t\t.filter((flowRun) => flowRun !== null) as FlowRunWithFlow[];\n\t}, [paginatedData?.results, flows]);\n\n\tconst handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n\t\tsetSearch(e.target.value);\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t};\n\n\tconst handleStateFilterChange = (newFilters: Set<FlowRunState>) => {\n\t\tsetStateFilter(newFilters);\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t};\n\n\tconst handleSortChange = (newSort: SortFilters) => {\n\t\tsetSort(newSort);\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t};\n\n\tconst handleClearFilters = () => {\n\t\tsetSearch(\"\");\n\t\tsetStateFilter(new Set());\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t};\n\n\tconst handlePrefetchPage = (page: number) => {\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildPaginateFlowRunsQuery(\n\t\t\t\t{\n\t\t\t\t\t...paginateFilter,\n\t\t\t\t\tpage,\n\t\t\t\t},\n\t\t\t\t30_000,\n\t\t\t),\n\t\t);\n\t};\n\n\tconst hasFilters = search || stateFilter.size > 0;\n\n\tif (countData === 0) {\n\t\treturn (\n\t\t\t<div className=\"flex items-center justify-center h-48 border rounded-lg bg-muted/50\">\n\t\t\t\t<Typography className=\"text-muted-foreground\">\n\t\t\t\t\tNo subflow runs found for this flow run.\n\t\t\t\t</Typography>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"grid grid-cols-12 items-center gap-2\">\n\t\t\t\t<div className=\"flex flex-col gap-1 xl:col-span-3 md:col-span-12 col-span-6 md:order-0 order-2\">\n\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t\t{countData} Subflow run{countData !== 1 ? \"s\" : \"\"}\n\t\t\t\t\t</Typography>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"xl:col-span-4 col-span-12 md:order-1 order-0\">\n\t\t\t\t\t<SearchInput\n\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\tonChange={handleSearchChange}\n\t\t\t\t\t\tplaceholder=\"Search by run name\"\n\t\t\t\t\t\taria-label=\"Search by run name\"\n\t\t\t\t\t\tdebounceMs={300}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xl:col-span-3 md:col-span-6 col-span-12 md:order-2 order-1\">\n\t\t\t\t\t<StateFilter\n\t\t\t\t\t\tselectedFilters={stateFilter}\n\t\t\t\t\t\tonSelectFilter={handleStateFilterChange}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xl:border-l xl:border-border xl:pl-2 xl:col-span-2 md:col-span-6 col-span-6 md:order-3 order-3\">\n\t\t\t\t\t<SortFilter value={sort} onSelect={handleSortChange} />\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<FlowRunsList\n\t\t\t\tflowRuns={flowRunsWithFlows}\n\t\t\t\tonClearFilters={hasFilters ? handleClearFilters : undefined}\n\t\t\t/>\n\n\t\t\t{paginatedData && paginatedData.pages > 0 && (\n\t\t\t\t<FlowRunsPagination\n\t\t\t\t\tpagination={pagination}\n\t\t\t\t\tonChangePagination={setPagination}\n\t\t\t\t\tcount={paginatedData.count}\n\t\t\t\t\tpages={paginatedData.pages}\n\t\t\t\t\tonPrefetchPage={handlePrefetchPage}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { useMemo, useState } from \"react\";\nimport {\n\tFLOW_RUN_STATES_MAP,\n\tFLOW_RUN_STATES_NO_SCHEDULED,\n\ttype FlowRunState,\n} from \"@/components/flow-runs/flow-runs-list/flow-runs-filters/state-filters.constants\";\nimport { Button } from \"@/components/ui/button\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\nimport { Typography } from \"@/components/ui/typography\";\nimport { cn } from \"@/utils\";\n\nconst MAX_FILTERS_DISPLAYED = 2;\n\ntype TaskRunStateFilterProps = {\n\tselectedFilters: Set<string>;\n\tonSelectFilter: (filters: Set<string>) => void;\n\tclassName?: string;\n};\n\nexport const TaskRunStateFilter = ({\n\tselectedFilters,\n\tonSelectFilter,\n\tclassName,\n}: TaskRunStateFilterProps) => {\n\tconst [open, setOpen] = useState(false);\n\n\tconst isAllButScheduled = useMemo(() => {\n\t\tconst flowRunStatesNoScheduleSet = new Set<string>(\n\t\t\tFLOW_RUN_STATES_NO_SCHEDULED,\n\t\t);\n\t\tif (\n\t\t\tselectedFilters.has(\"Scheduled\") ||\n\t\t\tflowRunStatesNoScheduleSet.size !== selectedFilters.size\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\treturn Array.from(selectedFilters).every((filter) =>\n\t\t\tflowRunStatesNoScheduleSet.has(filter),\n\t\t);\n\t}, [selectedFilters]);\n\n\tconst handleSelectAllExceptScheduled = () => {\n\t\tonSelectFilter(new Set(FLOW_RUN_STATES_NO_SCHEDULED));\n\t};\n\n\tconst handleSelectAllRunState = () => {\n\t\tonSelectFilter(new Set());\n\t};\n\n\tconst handleSelectFilter = (filter: string) => {\n\t\tif (isAllButScheduled) {\n\t\t\tonSelectFilter(new Set([filter]));\n\t\t\treturn;\n\t\t}\n\t\tconst updatedFilters = new Set(selectedFilters);\n\t\tif (selectedFilters.has(filter)) {\n\t\t\tupdatedFilters.delete(filter);\n\t\t} else {\n\t\t\tupdatedFilters.add(filter);\n\t\t}\n\t\tonSelectFilter(updatedFilters);\n\t};\n\n\tconst renderSelectedTags = () => {\n\t\tif (selectedFilters.size === 0) {\n\t\t\treturn \"All run states\";\n\t\t}\n\t\tif (isAllButScheduled) {\n\t\t\treturn \"All except scheduled\";\n\t\t}\n\n\t\tconst selected = Array.from(selectedFilters);\n\t\tconst visible = selected.slice(0, MAX_FILTERS_DISPLAYED);\n\t\tconst extraCount = selected.length - MAX_FILTERS_DISPLAYED;\n\n\t\treturn (\n\t\t\t<div className=\"flex flex-1 min-w-0 items-center gap-2\">\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{visible.map((filter) => (\n\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\tkey={filter}\n\t\t\t\t\t\t\tname={filter}\n\t\t\t\t\t\t\ttype={FLOW_RUN_STATES_MAP[filter as FlowRunState]}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t\t{extraCount > 0 && (\n\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"shrink-0\">\n\t\t\t\t\t\t+ {extraCount}\n\t\t\t\t\t</Typography>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t};\n\n\treturn (\n\t\t<DropdownMenu open={open} onOpenChange={setOpen}>\n\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tclassName={cn(\"justify-between w-full\", className)}\n\t\t\t\t>\n\t\t\t\t\t<span className=\"flex-1 min-w-0\">{renderSelectedTags()}</span>\n\t\t\t\t\t<Icon id=\"ChevronDown\" className=\"ml-2 size-4 shrink-0\" />\n\t\t\t\t</Button>\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent className=\"max-h-96 overflow-x-hidden overflow-y-auto\">\n\t\t\t\t<DropdownMenuItem\n\t\t\t\t\tonSelect={(e) => {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\thandleSelectAllExceptScheduled();\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<Checkbox checked={isAllButScheduled} className=\"mr-2\" />\n\t\t\t\t\tAll except scheduled\n\t\t\t\t</DropdownMenuItem>\n\t\t\t\t<DropdownMenuItem\n\t\t\t\t\tonSelect={(e) => {\n\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\thandleSelectAllRunState();\n\t\t\t\t\t}}\n\t\t\t\t>\n\t\t\t\t\t<Checkbox checked={selectedFilters.size === 0} className=\"mr-2\" />\n\t\t\t\t\tAll run states\n\t\t\t\t</DropdownMenuItem>\n\t\t\t\t{Object.keys(FLOW_RUN_STATES_MAP).map((filterKey) => (\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\taria-label={filterKey}\n\t\t\t\t\t\tkey={filterKey}\n\t\t\t\t\t\tonSelect={(e) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\thandleSelectFilter(filterKey);\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\taria-label={filterKey}\n\t\t\t\t\t\t\tclassName=\"mr-2\"\n\t\t\t\t\t\t\tchecked={!isAllButScheduled && selectedFilters.has(filterKey)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\tname={filterKey}\n\t\t\t\t\t\t\ttype={FLOW_RUN_STATES_MAP[filterKey as FlowRunState]}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t))}\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n};\n","import {\n\tuseQuery,\n\tuseQueryClient,\n\tuseSuspenseQuery,\n} from \"@tanstack/react-query\";\nimport type { ChangeEvent } from \"react\";\nimport { useMemo, useState } from \"react\";\nimport {\n\tbuildCountTaskRunsQuery,\n\tbuildPaginateTaskRunsQuery,\n} from \"@/api/task-runs\";\nimport { TaskRunStateFilter } from \"@/components/task-runs/task-run-state-filter\";\nimport {\n\ttype TaskRunSortFilters,\n\tTaskRunsList,\n\tTaskRunsPagination,\n\tTaskRunsSortFilter,\n} from \"@/components/task-runs/task-runs-list\";\nimport type { PaginationState } from \"@/components/task-runs/task-runs-list/task-runs-pagination\";\nimport { SearchInput } from \"@/components/ui/input\";\nimport { TagsInput } from \"@/components/ui/tags-input\";\nimport { Typography } from \"@/components/ui/typography\";\nimport useDebounce from \"@/hooks/use-debounce\";\n\ntype FlowRunTaskRunsProps = {\n\tflowRunId: string;\n};\n\nexport const FlowRunTaskRuns = ({ flowRunId }: FlowRunTaskRunsProps) => {\n\tconst queryClient = useQueryClient();\n\tconst [search, setSearch] = useState(\"\");\n\tconst [stateFilter, setStateFilter] = useState<Set<string>>(new Set());\n\tconst [tagsFilter, setTagsFilter] = useState<Set<string>>(new Set());\n\tconst [sort, setSort] = useState<TaskRunSortFilters>(\n\t\t\"EXPECTED_START_TIME_DESC\",\n\t);\n\tconst [pagination, setPagination] = useState<PaginationState>({\n\t\tpage: 1,\n\t\tlimit: 20,\n\t});\n\n\tconst debouncedSearch = useDebounce(search, 300);\n\n\tconst { data: countData } = useSuspenseQuery(\n\t\tbuildCountTaskRunsQuery(\n\t\t\t{\n\t\t\t\ttask_runs: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tflow_run_id: { operator: \"and_\", any_: [flowRunId], is_null_: false },\n\t\t\t\t\tsubflow_runs: { exists_: false },\n\t\t\t\t},\n\t\t\t},\n\t\t\t30_000,\n\t\t),\n\t);\n\n\tconst { data: paginatedData } = useQuery(\n\t\tbuildPaginateTaskRunsQuery(\n\t\t\t{\n\t\t\t\ttask_runs: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tflow_run_id: { operator: \"and_\", any_: [flowRunId], is_null_: false },\n\t\t\t\t\tsubflow_runs: { exists_: false },\n\t\t\t\t\tname: debouncedSearch ? { like_: debouncedSearch } : undefined,\n\t\t\t\t\tstate:\n\t\t\t\t\t\tstateFilter.size > 0\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\t\tname: { any_: Array.from(stateFilter) },\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\ttags:\n\t\t\t\t\t\ttagsFilter.size > 0\n\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\t\tall_: Array.from(tagsFilter),\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t: undefined,\n\t\t\t\t},\n\t\t\t\tsort,\n\t\t\t\tpage: pagination.page,\n\t\t\t\tlimit: pagination.limit,\n\t\t\t},\n\t\t\t30_000,\n\t\t),\n\t);\n\n\tconst handleSearchChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n\t\tsetSearch(e.target.value);\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t};\n\n\tconst handleStateFilterChange = (newFilters: Set<string>) => {\n\t\tsetStateFilter(newFilters);\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t};\n\n\tconst handleSortChange = (newSort: TaskRunSortFilters) => {\n\t\tsetSort(newSort);\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t};\n\n\tconst handleTagsFilterChange = (\n\t\ttags: string[] | ChangeEvent<HTMLInputElement>,\n\t) => {\n\t\tconst newTags = Array.isArray(tags) ? tags : [];\n\t\tsetTagsFilter(new Set(newTags));\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t};\n\n\tconst handleClearFilters = () => {\n\t\tsetSearch(\"\");\n\t\tsetStateFilter(new Set());\n\t\tsetTagsFilter(new Set());\n\t\tsetPagination((prev) => ({ ...prev, page: 1 }));\n\t};\n\n\tconst handlePrefetchPage = (page: number) => {\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildPaginateTaskRunsQuery(\n\t\t\t\t{\n\t\t\t\t\ttask_runs: {\n\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\tflow_run_id: {\n\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\tany_: [flowRunId],\n\t\t\t\t\t\t\tis_null_: false,\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsubflow_runs: { exists_: false },\n\t\t\t\t\t\tname: debouncedSearch ? { like_: debouncedSearch } : undefined,\n\t\t\t\t\t\tstate:\n\t\t\t\t\t\t\tstateFilter.size > 0\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\t\t\tname: { any_: Array.from(stateFilter) },\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\ttags:\n\t\t\t\t\t\t\ttagsFilter.size > 0\n\t\t\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\t\t\t\t\t\tall_: Array.from(tagsFilter),\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t},\n\t\t\t\t\tsort,\n\t\t\t\t\tpage,\n\t\t\t\t\tlimit: pagination.limit,\n\t\t\t\t},\n\t\t\t\t30_000,\n\t\t\t),\n\t\t);\n\t};\n\n\tconst hasFilters = search || stateFilter.size > 0 || tagsFilter.size > 0;\n\n\t// Calculate state summary from paginated results\n\tconst stateSummary = useMemo(() => {\n\t\tif (!paginatedData?.results) return null;\n\t\tconst stateCounts = new Map<string, number>();\n\t\tfor (const taskRun of paginatedData.results) {\n\t\t\tconst stateName = String(taskRun.state?.name ?? \"Unknown\");\n\t\t\tstateCounts.set(stateName, (stateCounts.get(stateName) ?? 0) + 1);\n\t\t}\n\t\treturn Array.from(stateCounts.entries())\n\t\t\t.map(([name, count]) => `${count} ${name}`)\n\t\t\t.join(\", \");\n\t}, [paginatedData?.results]);\n\n\tif (countData === 0) {\n\t\treturn (\n\t\t\t<div className=\"flex items-center justify-center h-48 border rounded-lg bg-muted/50\">\n\t\t\t\t<Typography className=\"text-muted-foreground\">\n\t\t\t\t\tNo task runs found for this flow run.\n\t\t\t\t</Typography>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t{/* Mobile: controls on top, count/sort on bottom. Desktop: count | controls | sort */}\n\t\t\t<div className=\"grid grid-cols-12 items-center gap-2\">\n\t\t\t\t{/* Count - first column */}\n\t\t\t\t<div className=\"flex flex-col gap-1 xl:col-span-3 md:col-span-12 col-span-6 md:order-0 order-3\">\n\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t\t{countData} Task run{countData !== 1 ? \"s\" : \"\"}\n\t\t\t\t\t</Typography>\n\t\t\t\t\t{stateSummary && (\n\t\t\t\t\t\t<Typography\n\t\t\t\t\t\t\tvariant=\"bodySmall\"\n\t\t\t\t\t\t\tclassName=\"text-muted-foreground text-xs capitalize\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t({stateSummary})\n\t\t\t\t\t\t</Typography>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\n\t\t\t\t{/* Controls - middle column */}\n\t\t\t\t<div className=\"xl:col-span-3 md:col-span-6 col-span-12 md:order-1 order-0\">\n\t\t\t\t\t<SearchInput\n\t\t\t\t\t\tvalue={search}\n\t\t\t\t\t\tonChange={handleSearchChange}\n\t\t\t\t\t\tplaceholder=\"Search by run name\"\n\t\t\t\t\t\taria-label=\"Search by run name\"\n\t\t\t\t\t\tdebounceMs={300}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xl:col-span-2 md:col-span-6 col-span-12 md:order-2 order-1\">\n\t\t\t\t\t<TaskRunStateFilter\n\t\t\t\t\t\tselectedFilters={stateFilter}\n\t\t\t\t\t\tonSelectFilter={handleStateFilterChange}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div className=\"xl:col-span-2 md:col-span-6 col-span-12 md:order-3 order-2\">\n\t\t\t\t\t<TagsInput\n\t\t\t\t\t\tvalue={Array.from(tagsFilter)}\n\t\t\t\t\t\tonChange={handleTagsFilterChange}\n\t\t\t\t\t\tplaceholder=\"All tags\"\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t{/* Sort - last column with left border on desktop */}\n\t\t\t\t<div className=\"xl:border-l xl:border-border xl:pl-2 xl:col-span-2 md:col-span-6 col-span-6 md:order-4 order-4\">\n\t\t\t\t\t<TaskRunsSortFilter value={sort} onSelect={handleSortChange} />\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t<TaskRunsList\n\t\t\t\ttaskRuns={paginatedData?.results}\n\t\t\t\tonClearFilters={hasFilters ? handleClearFilters : undefined}\n\t\t\t/>\n\n\t\t\t{paginatedData && paginatedData.pages > 0 && (\n\t\t\t\t<TaskRunsPagination\n\t\t\t\t\tpagination={pagination}\n\t\t\t\t\tonChangePagination={setPagination}\n\t\t\t\t\tcount={paginatedData.count}\n\t\t\t\t\tpages={paginatedData.pages}\n\t\t\t\t\tonPrefetchPage={handlePrefetchPage}\n\t\t\t\t/>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { useQueryClient, useSuspenseQuery } from \"@tanstack/react-query\";\nimport { useRouter } from \"@tanstack/react-router\";\nimport { Suspense, useCallback, useEffect, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport { queryKeyFactory as artifactsQueryKeyFactory } from \"@/api/artifacts\";\nimport {\n\tbuildGetFlowRunDetailsQuery,\n\ttype FlowRun,\n\tqueryKeyFactory as flowRunsQueryKeyFactory,\n\tuseDeleteFlowRun,\n} from \"@/api/flow-runs\";\nimport { queryKeyFactory as logsQueryKeyFactory } from \"@/api/logs\";\nimport { queryKeyFactory as taskRunsQueryKeyFactory } from \"@/api/task-runs\";\nimport { FlowRunGraph } from \"@/components/flow-runs/flow-run-graph\";\nimport { Button } from \"@/components/ui/button\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { ErrorBoundary } from \"@/components/ui/error-boundary\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { LazyJsonInput } from \"@/components/ui/json-input-lazy\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { TabErrorState } from \"@/components/ui/tab-error-state\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport { useStateFavicon } from \"@/hooks/use-state-favicon\";\nimport { FlowRunArtifacts } from \"./flow-run-artifacts\";\nimport { FlowRunDetails } from \"./flow-run-details\";\nimport { FlowRunHeader } from \"./flow-run-header\";\nimport { FlowRunLogs } from \"./flow-run-logs\";\nimport { FlowRunSubflows } from \"./flow-run-subflows\";\nimport { FlowRunTaskRuns } from \"./flow-run-task-runs\";\n\ntype FlowRunDetailsTabOptions =\n\t| \"Logs\"\n\t| \"TaskRuns\"\n\t| \"SubflowRuns\"\n\t| \"Artifacts\"\n\t| \"Details\"\n\t| \"Parameters\"\n\t| \"JobVariables\";\n\ntype FlowRunDetailsPageProps = {\n\tid: string;\n\ttab: FlowRunDetailsTabOptions;\n\tonTabChange: (tab: FlowRunDetailsTabOptions) => void;\n};\n\nexport const FlowRunDetailsPage = ({\n\tid,\n\ttab,\n\tonTabChange,\n}: FlowRunDetailsPageProps) => {\n\tconst [refetchInterval, setRefetchInterval] = useState<number | false>(false);\n\tconst [fullscreen, setFullscreen] = useState(false);\n\tconst queryClient = useQueryClient();\n\tconst { data: flowRun } = useSuspenseQuery({\n\t\t...buildGetFlowRunDetailsQuery(id),\n\t\trefetchInterval,\n\t});\n\tconst { deleteFlowRun } = useDeleteFlowRun();\n\tconst { navigate } = useRouter();\n\tconst isPending = flowRun.state_type === \"PENDING\";\n\n\t// Set favicon based on flow run state\n\tuseStateFavicon(flowRun?.state_type);\n\n\tuseEffect(() => {\n\t\tif (flowRun.state_type === \"RUNNING\" || flowRun.state_type === \"PENDING\") {\n\t\t\tsetRefetchInterval(5000);\n\t\t} else {\n\t\t\tsetRefetchInterval(false);\n\t\t}\n\t}, [flowRun]);\n\n\tconst onDeleteRunClicked = () => {\n\t\tdeleteFlowRun(flowRun.id, {\n\t\t\tonSuccess: () => {\n\t\t\t\tsetRefetchInterval(false);\n\t\t\t\ttoast.success(\"Flow run deleted\");\n\t\t\t\tvoid navigate({ to: \"/runs\", replace: true });\n\t\t\t},\n\t\t\tonError: (error) => {\n\t\t\t\tconst message =\n\t\t\t\t\terror.message || \"Unknown error while deleting flow run.\";\n\t\t\t\ttoast.error(message);\n\t\t\t},\n\t\t});\n\t};\n\n\tconst retryLogs = useCallback(() => {\n\t\tvoid queryClient.invalidateQueries({\n\t\t\tqueryKey: logsQueryKeyFactory.all(),\n\t\t});\n\t}, [queryClient]);\n\n\tconst retryTaskRuns = useCallback(() => {\n\t\tvoid queryClient.invalidateQueries({\n\t\t\tqueryKey: taskRunsQueryKeyFactory.all(),\n\t\t});\n\t}, [queryClient]);\n\n\tconst retrySubflows = useCallback(() => {\n\t\tvoid queryClient.invalidateQueries({\n\t\t\tqueryKey: flowRunsQueryKeyFactory.lists(),\n\t\t});\n\t}, [queryClient]);\n\n\tconst retryArtifacts = useCallback(() => {\n\t\tvoid queryClient.invalidateQueries({\n\t\t\tqueryKey: artifactsQueryKeyFactory.all(),\n\t\t});\n\t}, [queryClient]);\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t<FlowRunHeader flowRun={flowRun} onDeleteClick={onDeleteRunClicked} />\n\t\t\t</div>\n\t\t\t{!isPending && (\n\t\t\t\t<Card className=\"py-0\">\n\t\t\t\t\t<CardContent className=\"p-0\">\n\t\t\t\t\t\t<FlowRunGraph\n\t\t\t\t\t\t\tflowRunId={flowRun.id}\n\t\t\t\t\t\t\tstateType={flowRun.state_type ?? undefined}\n\t\t\t\t\t\t\tfullscreen={fullscreen}\n\t\t\t\t\t\t\tonFullscreenChange={setFullscreen}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</CardContent>\n\t\t\t\t</Card>\n\t\t\t)}\n\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t<TabsLayout\n\t\t\t\t\tcurrentTab={tab}\n\t\t\t\t\tonTabChange={onTabChange}\n\t\t\t\t\tflowRun={flowRun}\n\t\t\t\t\tlogsContent={\n\t\t\t\t\t\t<ErrorBoundary\n\t\t\t\t\t\t\tfallback={\n\t\t\t\t\t\t\t\t<TabErrorState\n\t\t\t\t\t\t\t\t\terror={{\n\t\t\t\t\t\t\t\t\t\ttype: \"unknown-error\",\n\t\t\t\t\t\t\t\t\t\tmessage: \"Failed to load logs\",\n\t\t\t\t\t\t\t\t\t\tdetails:\n\t\t\t\t\t\t\t\t\t\t\t\"An error occurred while loading log data. Please try again.\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonRetry={retryLogs}\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<Suspense fallback={<LogsSkeleton />}>\n\t\t\t\t\t\t\t\t<FlowRunLogs flowRun={flowRun} />\n\t\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t\t</ErrorBoundary>\n\t\t\t\t\t}\n\t\t\t\t\ttaskRunsContent={\n\t\t\t\t\t\t<ErrorBoundary\n\t\t\t\t\t\t\tfallback={\n\t\t\t\t\t\t\t\t<TabErrorState\n\t\t\t\t\t\t\t\t\terror={{\n\t\t\t\t\t\t\t\t\t\ttype: \"unknown-error\",\n\t\t\t\t\t\t\t\t\t\tmessage: \"Failed to load task runs\",\n\t\t\t\t\t\t\t\t\t\tdetails:\n\t\t\t\t\t\t\t\t\t\t\t\"An error occurred while loading task run data. Please try again.\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonRetry={retryTaskRuns}\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<Suspense fallback={<TaskRunsSkeleton />}>\n\t\t\t\t\t\t\t\t<FlowRunTaskRuns flowRunId={id} />\n\t\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t\t</ErrorBoundary>\n\t\t\t\t\t}\n\t\t\t\t\tsubflowRunsContent={\n\t\t\t\t\t\t<ErrorBoundary\n\t\t\t\t\t\t\tfallback={\n\t\t\t\t\t\t\t\t<TabErrorState\n\t\t\t\t\t\t\t\t\terror={{\n\t\t\t\t\t\t\t\t\t\ttype: \"unknown-error\",\n\t\t\t\t\t\t\t\t\t\tmessage: \"Failed to load subflow runs\",\n\t\t\t\t\t\t\t\t\t\tdetails:\n\t\t\t\t\t\t\t\t\t\t\t\"An error occurred while loading subflow run data. Please try again.\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonRetry={retrySubflows}\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<Suspense fallback={<SubflowsSkeleton />}>\n\t\t\t\t\t\t\t\t<FlowRunSubflows parentFlowRunId={id} />\n\t\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t\t</ErrorBoundary>\n\t\t\t\t\t}\n\t\t\t\t\tartifactsContent={\n\t\t\t\t\t\t<ErrorBoundary\n\t\t\t\t\t\t\tfallback={\n\t\t\t\t\t\t\t\t<TabErrorState\n\t\t\t\t\t\t\t\t\terror={{\n\t\t\t\t\t\t\t\t\t\ttype: \"unknown-error\",\n\t\t\t\t\t\t\t\t\t\tmessage: \"Failed to load artifacts\",\n\t\t\t\t\t\t\t\t\t\tdetails:\n\t\t\t\t\t\t\t\t\t\t\t\"An error occurred while loading artifact data. Please try again.\",\n\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\tonRetry={retryArtifacts}\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<Suspense fallback={<ArtifactsSkeleton />}>\n\t\t\t\t\t\t\t\t<FlowRunArtifacts flowRun={flowRun} />\n\t\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t\t</ErrorBoundary>\n\t\t\t\t\t}\n\t\t\t\t\tdetailsContent={\n\t\t\t\t\t\t<Suspense fallback={<DetailsSkeleton />}>\n\t\t\t\t\t\t\t<FlowRunDetails flowRun={flowRun} />\n\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t}\n\t\t\t\t\tparametersContent={\n\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t<div className=\"flex justify-end\">\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\ttoast.success(\"Copied parameters to clipboard\");\n\t\t\t\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(\n\t\t\t\t\t\t\t\t\t\t\tJSON.stringify(flowRun.parameters ?? {}, null, 2),\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\t\t<Icon id=\"Copy\" className=\"size-4 mr-2\" />\n\t\t\t\t\t\t\t\t\tCopy parameters\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<LazyJsonInput\n\t\t\t\t\t\t\t\tvalue={JSON.stringify(flowRun.parameters ?? {}, null, 2)}\n\t\t\t\t\t\t\t\tdisabled\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t\tjobVariablesContent={\n\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t<div className=\"flex justify-end\">\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\t\ttoast.success(\"Copied job variables to clipboard\");\n\t\t\t\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(\n\t\t\t\t\t\t\t\t\t\t\tJSON.stringify(flowRun.job_variables ?? {}, null, 2),\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\t\t<Icon id=\"Copy\" className=\"size-4 mr-2\" />\n\t\t\t\t\t\t\t\t\tCopy job variables\n\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<LazyJsonInput\n\t\t\t\t\t\t\t\tvalue={JSON.stringify(flowRun.job_variables ?? {}, null, 2)}\n\t\t\t\t\t\t\t\tdisabled\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nconst TabsLayout = ({\n\tcurrentTab,\n\tonTabChange,\n\tflowRun,\n\tlogsContent,\n\ttaskRunsContent,\n\tsubflowRunsContent,\n\tartifactsContent,\n\tdetailsContent,\n\tparametersContent,\n\tjobVariablesContent,\n}: {\n\tcurrentTab: FlowRunDetailsTabOptions;\n\tonTabChange: (tab: FlowRunDetailsTabOptions) => void;\n\tflowRun: FlowRun;\n\tlogsContent: React.ReactNode;\n\ttaskRunsContent: React.ReactNode;\n\tsubflowRunsContent: React.ReactNode;\n\tartifactsContent: React.ReactNode;\n\tdetailsContent: React.ReactNode;\n\tparametersContent: React.ReactNode;\n\tjobVariablesContent: React.ReactNode;\n}) => {\n\treturn (\n\t\t<Tabs\n\t\t\tvalue={currentTab}\n\t\t\tonValueChange={(value) => onTabChange(value as FlowRunDetailsTabOptions)}\n\t\t>\n\t\t\t<TabsList>\n\t\t\t\t<TabsTrigger value=\"Details\">Details</TabsTrigger>\n\t\t\t\t<TabsTrigger value=\"Logs\">Logs</TabsTrigger>\n\t\t\t\t{flowRun.state_type !== \"PENDING\" && (\n\t\t\t\t\t<TabsTrigger value=\"TaskRuns\">Task Runs</TabsTrigger>\n\t\t\t\t)}\n\t\t\t\t{flowRun.state_type !== \"PENDING\" && (\n\t\t\t\t\t<TabsTrigger value=\"SubflowRuns\">Subflow Runs</TabsTrigger>\n\t\t\t\t)}\n\t\t\t\t<TabsTrigger value=\"Artifacts\">Artifacts</TabsTrigger>\n\t\t\t\t<TabsTrigger value=\"Parameters\">Parameters</TabsTrigger>\n\t\t\t\t<TabsTrigger value=\"JobVariables\">Job Variables</TabsTrigger>\n\t\t\t</TabsList>\n\t\t\t<TabsContent value=\"Details\">{detailsContent}</TabsContent>\n\t\t\t<TabsContent value=\"Logs\">{logsContent}</TabsContent>\n\t\t\t<TabsContent value=\"TaskRuns\">{taskRunsContent}</TabsContent>\n\t\t\t<TabsContent value=\"SubflowRuns\">{subflowRunsContent}</TabsContent>\n\t\t\t<TabsContent value=\"Artifacts\">{artifactsContent}</TabsContent>\n\t\t\t<TabsContent value=\"Parameters\">{parametersContent}</TabsContent>\n\t\t\t<TabsContent value=\"JobVariables\">{jobVariablesContent}</TabsContent>\n\t\t</Tabs>\n\t);\n};\n\nconst LogsSkeleton = () => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t<div className=\"flex flex-row gap-2 justify-end\">\n\t\t\t\t<Skeleton className=\"h-8 w-25\" />\n\t\t\t\t<Skeleton className=\"h-8 w-32\" />\n\t\t\t\t<Skeleton className=\"h-8 w-8\" /> {/* Download button placeholder */}\n\t\t\t</div>\n\t\t\t<Skeleton className=\"h-32\" />\n\t\t</div>\n\t);\n};\n\nconst TaskRunsSkeleton = () => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<Skeleton className=\"h-4 w-24\" />\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col sm:flex-row gap-2\">\n\t\t\t\t<Skeleton className=\"h-9 flex-1\" />\n\t\t\t\t<div className=\"flex gap-2\">\n\t\t\t\t\t<Skeleton className=\"h-9 w-48\" />\n\t\t\t\t\t<Skeleton className=\"h-9 w-40\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t<Skeleton className=\"h-24\" />\n\t\t\t\t<Skeleton className=\"h-24\" />\n\t\t\t\t<Skeleton className=\"h-24\" />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nconst ArtifactsSkeleton = () => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t<div className=\"flex flex-row justify-end\">\n\t\t\t\t<Skeleton className=\"h-8 w-12\" />\n\t\t\t</div>\n\t\t\t<div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2 xl:grid-cols-3\">\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nconst SubflowsSkeleton = () => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t<Skeleton className=\"h-4 w-24\" />\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col sm:flex-row gap-2\">\n\t\t\t\t<Skeleton className=\"h-9 flex-1\" />\n\t\t\t\t<div className=\"flex gap-2\">\n\t\t\t\t\t<Skeleton className=\"h-9 w-48\" />\n\t\t\t\t\t<Skeleton className=\"h-9 w-40\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t<Skeleton className=\"h-24\" />\n\t\t\t\t<Skeleton className=\"h-24\" />\n\t\t\t\t<Skeleton className=\"h-24\" />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nconst DetailsSkeleton = () => {\n\treturn (\n\t\t<div className=\"space-y-4\">\n\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t<Skeleton className=\"h-4 w-20\" />\n\t\t\t\t<Skeleton className=\"h-5 w-12\" />\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t<Skeleton className=\"h-4 w-16\" />\n\t\t\t\t<Skeleton className=\"h-5 w-32\" />\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t<Skeleton className=\"h-4 w-24\" />\n\t\t\t\t<Skeleton className=\"h-5 w-32\" />\n\t\t\t</div>\n\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t<Skeleton className=\"h-4 w-24\" />\n\t\t\t\t<Skeleton className=\"h-5 w-64\" />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute, notFound, useNavigate } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { z } from \"zod\";\nimport { buildListArtifactsQuery } from \"@/api/artifacts\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport { buildGetFlowRunDetailsQuery } from \"@/api/flow-runs\";\nimport { buildInfiniteFilterLogsQuery } from \"@/api/logs\";\nimport { buildPaginateTaskRunsQuery } from \"@/api/task-runs\";\nimport { FlowRunDetailsPage } from \"@/components/flow-runs/flow-run-details-page\";\nimport { FlowRunNotFound } from \"@/components/flow-runs/flow-run-not-found\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\n\nconst searchParams = z.object({\n\ttab: z\n\t\t.enum([\n\t\t\t\"Logs\",\n\t\t\t\"TaskRuns\",\n\t\t\t\"SubflowRuns\",\n\t\t\t\"Artifacts\",\n\t\t\t\"Details\",\n\t\t\t\"Parameters\",\n\t\t\t\"JobVariables\",\n\t\t])\n\t\t.default(\"Logs\")\n\t\t.catch(\"Logs\"),\n});\n\nexport type FlowRunDetailsTabOptions = z.infer<typeof searchParams>[\"tab\"];\n\nfunction FlowRunErrorComponent({ error, reset }: ErrorComponentProps) {\n\tconst serverError = categorizeError(error, \"Failed to load flow run\");\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div>\n\t\t\t\t<h1 className=\"text-2xl font-semibold\">Flow Run</h1>\n\t\t\t</div>\n\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t</div>\n\t);\n}\n\nexport const Route = createFileRoute(\"/runs/flow-run/$id\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: RouteComponent,\n\tloader: async ({ params, context: { queryClient } }) => {\n\t\t// ----- Deferred data\n\t\tvoid queryClient.prefetchInfiniteQuery(\n\t\t\tbuildInfiniteFilterLogsQuery({\n\t\t\t\tlimit: 50,\n\t\t\t\tsort: \"TIMESTAMP_ASC\",\n\t\t\t\tlogs: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tlevel: {\n\t\t\t\t\t\tge_: 0,\n\t\t\t\t\t},\n\t\t\t\t\tflow_run_id: {\n\t\t\t\t\t\tany_: [params.id],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildListArtifactsQuery({\n\t\t\t\tartifacts: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tflow_run_id: {\n\t\t\t\t\t\tany_: [params.id],\n\t\t\t\t\t},\n\t\t\t\t\ttype: {\n\t\t\t\t\t\tnot_any_: [\"result\"],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tsort: \"ID_DESC\",\n\t\t\t\toffset: 0,\n\t\t\t}),\n\t\t);\n\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildPaginateTaskRunsQuery({\n\t\t\t\tpage: 1,\n\t\t\t\tsort: \"EXPECTED_START_TIME_DESC\",\n\t\t\t\tflow_runs: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tid: {\n\t\t\t\t\t\tany_: [params.id],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\t\t// ----- Critical data\n\t\ttry {\n\t\t\tawait queryClient.ensureQueryData(buildGetFlowRunDetailsQuery(params.id));\n\t\t} catch (error) {\n\t\t\t// Only treat \"not found\" errors as 404, rethrow other errors\n\t\t\tif (error instanceof Error && /not found/i.test(error.message)) {\n\t\t\t\t// eslint-disable-next-line @typescript-eslint/only-throw-error\n\t\t\t\tthrow notFound();\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t},\n\twrapInSuspense: true,\n\terrorComponent: FlowRunErrorComponent,\n\tnotFoundComponent: FlowRunNotFound,\n});\n\nfunction RouteComponent() {\n\tconst { id } = Route.useParams();\n\tconst { tab } = Route.useSearch();\n\tconst navigate = useNavigate();\n\n\tconst onTabChange = (tab: FlowRunDetailsTabOptions) => {\n\t\tvoid navigate({\n\t\t\tto: \".\",\n\t\t\tsearch: (prev) => ({\n\t\t\t\t...prev,\n\t\t\t\ttab,\n\t\t\t}),\n\t\t});\n\t};\n\n\treturn <FlowRunDetailsPage id={id} tab={tab} onTabChange={onTabChange} />;\n}\n"],"file":"flow-run._id-BT3wztDF.js"}