prefect 3.6.15__py3-none-any.whl → 3.6.16.dev2__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.
- prefect/__init__.py +20 -0
- prefect/_build_info.py +3 -3
- prefect/_internal/analytics/__init__.py +80 -0
- prefect/_internal/analytics/_config.py +2 -0
- prefect/_internal/analytics/ci_detection.py +39 -0
- prefect/_internal/analytics/client.py +132 -0
- prefect/_internal/analytics/device_id.py +55 -0
- prefect/_internal/analytics/emit.py +90 -0
- prefect/_internal/analytics/enabled.py +33 -0
- prefect/_internal/analytics/events.py +14 -0
- prefect/_internal/analytics/milestones.py +177 -0
- prefect/_internal/analytics/notice.py +60 -0
- prefect/_internal/analytics/service.py +238 -0
- prefect/analytics/__init__.py +67 -0
- prefect/deployments/runner.py +20 -0
- prefect/flow_engine.py +16 -0
- prefect/flows.py +8 -0
- prefect/server/ui-v2/assets/{artifact-card-BBzQR-Cj.js → artifact-card-BclosG8t.js} +2 -2
- prefect/server/ui-v2/assets/{artifact-card-BBzQR-Cj.js.map → artifact-card-BclosG8t.js.map} +1 -1
- prefect/server/ui-v2/assets/artifact._id-C0r4BJr2.js +2 -0
- prefect/server/ui-v2/assets/artifact._id-C0r4BJr2.js.map +1 -0
- prefect/server/ui-v2/assets/{automation-wizard-EYSfXlQ7.js → automation-wizard-Bmgt6nn8.js} +2 -2
- prefect/server/ui-v2/assets/{automation-wizard-EYSfXlQ7.js.map → automation-wizard-Bmgt6nn8.js.map} +1 -1
- prefect/server/ui-v2/assets/automation._id-Ccke3KJz.js +2 -0
- prefect/server/ui-v2/assets/{automation._id-Dn7jABys.js.map → automation._id-Ccke3KJz.js.map} +1 -1
- prefect/server/ui-v2/assets/{automation_._id.edit-COrqswD3.js → automation_._id.edit-BlKPUTVf.js} +2 -2
- prefect/server/ui-v2/assets/{automation_._id.edit-COrqswD3.js.map → automation_._id.edit-BlKPUTVf.js.map} +1 -1
- prefect/server/ui-v2/assets/{automations-header-DN_dmMXW.js → automations-header-Df2zw3SC.js} +2 -2
- prefect/server/ui-v2/assets/{automations-header-DN_dmMXW.js.map → automations-header-Df2zw3SC.js.map} +1 -1
- prefect/server/ui-v2/assets/{base-job-template-form-section-De2ACYbw.js → base-job-template-form-section-oZD6U-RW.js} +2 -2
- prefect/server/ui-v2/assets/{base-job-template-form-section-De2ACYbw.js.map → base-job-template-form-section-oZD6U-RW.js.map} +1 -1
- prefect/server/ui-v2/assets/{block-type-details-Cklc7TkK.js → block-type-details-CYrdaLot.js} +2 -2
- prefect/server/ui-v2/assets/{block-type-details-Cklc7TkK.js.map → block-type-details-CYrdaLot.js.map} +1 -1
- prefect/server/ui-v2/assets/block-type-logo-CyAWq7mC.js +2 -0
- prefect/server/ui-v2/assets/block-type-logo-CyAWq7mC.js.map +1 -0
- prefect/server/ui-v2/assets/{block._id-tuz1Bcj2.js → block._id-CBgHrpTP.js} +2 -2
- prefect/server/ui-v2/assets/{block._id-tuz1Bcj2.js.map → block._id-CBgHrpTP.js.map} +1 -1
- prefect/server/ui-v2/assets/{block_._id.edit-CFEYhF5R.js → block_._id.edit-CW-kdi4O.js} +2 -2
- prefect/server/ui-v2/assets/{block_._id.edit-CFEYhF5R.js.map → block_._id.edit-CW-kdi4O.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog-CCPRo7nY.js → catalog-Brh0kn1I.js} +2 -2
- prefect/server/ui-v2/assets/{catalog-CCPRo7nY.js.map → catalog-Brh0kn1I.js.map} +1 -1
- prefect/server/ui-v2/assets/catalog_._slug-MCgzguIZ.js +2 -0
- prefect/server/ui-v2/assets/{catalog_._slug-Bl2J2oI3.js.map → catalog_._slug-MCgzguIZ.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog_._slug_.create-9UD_SxDN.js → catalog_._slug_.create-DBaeHi9Q.js} +2 -2
- prefect/server/ui-v2/assets/{catalog_._slug_.create-9UD_SxDN.js.map → catalog_._slug_.create-DBaeHi9Q.js.map} +1 -1
- prefect/server/ui-v2/assets/{collapsible-BVQTBG_U.js → collapsible-B_NJS0uJ.js} +2 -2
- prefect/server/ui-v2/assets/{collapsible-BVQTBG_U.js.map → collapsible-B_NJS0uJ.js.map} +1 -1
- prefect/server/ui-v2/assets/{concurrency-limit._id-CsgRxA0a.js → concurrency-limit._id-qzNUQzQa.js} +2 -2
- prefect/server/ui-v2/assets/{concurrency-limit._id-CsgRxA0a.js.map → concurrency-limit._id-qzNUQzQa.js.map} +1 -1
- prefect/server/ui-v2/assets/create-BwXG6EIb.js +2 -0
- prefect/server/ui-v2/assets/{create-D--LHaji.js.map → create-BwXG6EIb.js.map} +1 -1
- prefect/server/ui-v2/assets/{create-BycfZHGQ.js → create-MoiIE9Ms.js} +2 -2
- prefect/server/ui-v2/assets/{create-BycfZHGQ.js.map → create-MoiIE9Ms.js.map} +1 -1
- prefect/server/ui-v2/assets/data-table-CPkppyg6.js +2 -0
- prefect/server/ui-v2/assets/data-table-CPkppyg6.js.map +1 -0
- prefect/server/ui-v2/assets/delete-confirmation-dialog-CwDK_2QS.js +2 -0
- prefect/server/ui-v2/assets/{delete-confirmation-dialog-DHkm2p8m.js.map → delete-confirmation-dialog-CwDK_2QS.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-action-header-D5GOooPm.js → deployment-action-header-Vp9YsCJO.js} +2 -2
- prefect/server/ui-v2/assets/{deployment-action-header-D5GOooPm.js.map → deployment-action-header-Vp9YsCJO.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-form-wfg6HeAJ.js → deployment-form-CJcg_6DJ.js} +3 -3
- prefect/server/ui-v2/assets/{deployment-form-wfg6HeAJ.js.map → deployment-form-CJcg_6DJ.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-links-6iugOgDh.js → deployment-links-CIkJIuHh.js} +2 -2
- prefect/server/ui-v2/assets/{deployment-links-6iugOgDh.js.map → deployment-links-CIkJIuHh.js.map} +1 -1
- prefect/server/ui-v2/assets/deployment._id-C6XrGMp_.js +2 -0
- prefect/server/ui-v2/assets/{deployment._id-Ci9zge5n.js.map → deployment._id-C6XrGMp_.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment._id-whsGcHdu.js → deployment._id-CWgTYmTG.js} +2 -2
- prefect/server/ui-v2/assets/{deployment._id-whsGcHdu.js.map → deployment._id-CWgTYmTG.js.map} +1 -1
- prefect/server/ui-v2/assets/deployment_._id.duplicate-Bg0s0ZJn.js +2 -0
- prefect/server/ui-v2/assets/{deployment_._id.duplicate-D9ZWkh8H.js.map → deployment_._id.duplicate-Bg0s0ZJn.js.map} +1 -1
- prefect/server/ui-v2/assets/deployment_._id.edit-CnoB0UeG.js +2 -0
- prefect/server/ui-v2/assets/{deployment_._id.edit-CS7sObzC.js.map → deployment_._id.edit-CnoB0UeG.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment_._id.run-g7SZuDFi.js → deployment_._id.run-BqPK6rTB.js} +2 -2
- prefect/server/ui-v2/assets/{deployment_._id.run-g7SZuDFi.js.map → deployment_._id.run-BqPK6rTB.js.map} +1 -1
- prefect/server/ui-v2/assets/{dropdown-menu-0atiOSFo.js → dropdown-menu-D7Gwbd15.js} +2 -2
- prefect/server/ui-v2/assets/{dropdown-menu-0atiOSFo.js.map → dropdown-menu-D7Gwbd15.js.map} +1 -1
- prefect/server/ui-v2/assets/{event-resource-display-DHiAb1Up.js → event-resource-display-CDRgVKd4.js} +2 -2
- prefect/server/ui-v2/assets/{event-resource-display-DHiAb1Up.js.map → event-resource-display-CDRgVKd4.js.map} +1 -1
- prefect/server/ui-v2/assets/event._eventDate._eventId-C73GMDkK.js +2 -0
- prefect/server/ui-v2/assets/{event._eventDate._eventId-D7Twzb22.js.map → event._eventDate._eventId-C73GMDkK.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow-run-graph-BhzuSJLm.js → flow-run-graph-ckiE3mA9.js} +2 -2
- prefect/server/ui-v2/assets/{flow-run-graph-BhzuSJLm.js.map → flow-run-graph-ckiE3mA9.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow-run._id-CqpH6bvx.js → flow-run._id-BukrNCAq.js} +2 -2
- prefect/server/ui-v2/assets/{flow-run._id-CqpH6bvx.js.map → flow-run._id-BukrNCAq.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow-run._id-lIIQBD7H.js → flow-run._id-CtI5VZ2M.js} +2 -2
- prefect/server/ui-v2/assets/{flow-run._id-lIIQBD7H.js.map → flow-run._id-CtI5VZ2M.js.map} +1 -1
- prefect/server/ui-v2/assets/flow-run._id-s1UJuakA.js +4 -0
- prefect/server/ui-v2/assets/{flow-run._id-RLy2kBh0.js.map → flow-run._id-s1UJuakA.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow-runs-pagination-BATUweRV.js → flow-runs-pagination-SLbYtvaR.js} +2 -2
- prefect/server/ui-v2/assets/{flow-runs-pagination-BATUweRV.js.map → flow-runs-pagination-SLbYtvaR.js.map} +1 -1
- prefect/server/ui-v2/assets/flow._id-CZ5P0v4N.js +2 -0
- prefect/server/ui-v2/assets/{flow._id-BdQGWPKP.js.map → flow._id-CZ5P0v4N.js.map} +1 -1
- prefect/server/ui-v2/assets/{form-DLrbC7rV.js → form-mws4law8.js} +2 -2
- prefect/server/ui-v2/assets/{form-DLrbC7rV.js.map → form-mws4law8.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-BTAWyeXv.js → header-Bes1LmY7.js} +2 -2
- prefect/server/ui-v2/assets/{header-BTAWyeXv.js.map → header-Bes1LmY7.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-ChFAx5uR.js → header-Bj_zBR-a.js} +2 -2
- prefect/server/ui-v2/assets/{header-ChFAx5uR.js.map → header-Bj_zBR-a.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-CyQqOj1w.js → header-CPxTHSvz.js} +2 -2
- prefect/server/ui-v2/assets/{header-CyQqOj1w.js.map → header-CPxTHSvz.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-m48E4KcG.js → index-B8vo2Lrg.js} +5 -5
- prefect/server/ui-v2/assets/{index-m48E4KcG.js.map → index-B8vo2Lrg.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-D5RT-SAp.js → index-BBeh-3Nh.js} +2 -2
- prefect/server/ui-v2/assets/{index-D5RT-SAp.js.map → index-BBeh-3Nh.js.map} +1 -1
- prefect/server/ui-v2/assets/index-BLnEvHia.js +2 -0
- prefect/server/ui-v2/assets/{index-7i4X9TeK.js.map → index-BLnEvHia.js.map} +1 -1
- prefect/server/ui-v2/assets/index-BpKoubXu.js +2 -0
- prefect/server/ui-v2/assets/index-BpKoubXu.js.map +1 -0
- prefect/server/ui-v2/assets/index-By6YGqR3.js +2 -0
- prefect/server/ui-v2/assets/index-By6YGqR3.js.map +1 -0
- prefect/server/ui-v2/assets/index-CEi3BlKI.js +2 -0
- prefect/server/ui-v2/assets/index-CEi3BlKI.js.map +1 -0
- prefect/server/ui-v2/assets/{index-BaWDC4da.js → index-CS-zxv7Z.js} +2 -2
- prefect/server/ui-v2/assets/{index-BaWDC4da.js.map → index-CS-zxv7Z.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-kP_I5Qfd.js → index-CToHKh4q.js} +2 -2
- prefect/server/ui-v2/assets/{index-kP_I5Qfd.js.map → index-CToHKh4q.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CKGj5lSu.js → index-CUVvZndW.js} +2 -2
- prefect/server/ui-v2/assets/{index-CKGj5lSu.js.map → index-CUVvZndW.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CxUfZRkN.js → index-CYVn-I3i.js} +2 -2
- prefect/server/ui-v2/assets/{index-CxUfZRkN.js.map → index-CYVn-I3i.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CnlN-VC_.js → index-Cun0JN4t.js} +2 -2
- prefect/server/ui-v2/assets/{index-CnlN-VC_.js.map → index-Cun0JN4t.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-BwCLKpNb.js → index-D6ynV6U7.js} +2 -2
- prefect/server/ui-v2/assets/{index-BwCLKpNb.js.map → index-D6ynV6U7.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CHf6xi9j.js → index-DdNUJLRW.js} +2 -2
- prefect/server/ui-v2/assets/{index-CHf6xi9j.js.map → index-DdNUJLRW.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CQnWiUE5.js → index-DlHOXQhu.js} +2 -2
- prefect/server/ui-v2/assets/{index-CQnWiUE5.js.map → index-DlHOXQhu.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-Eqdr6Ff7.js → index-DyVw8YE8.js} +2 -2
- prefect/server/ui-v2/assets/{index-Eqdr6Ff7.js.map → index-DyVw8YE8.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-Btb_-PDp.js → index-DzRz7D2P.js} +2 -2
- prefect/server/ui-v2/assets/{index-Btb_-PDp.js.map → index-DzRz7D2P.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DQGif3jm.js → index-DzUcVNZg.js} +2 -2
- prefect/server/ui-v2/assets/{index-DQGif3jm.js.map → index-DzUcVNZg.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DNh9ZBy4.js → index-IBvMMs6S.js} +2 -2
- prefect/server/ui-v2/assets/{index-DNh9ZBy4.js.map → index-IBvMMs6S.js.map} +1 -1
- prefect/server/ui-v2/assets/index-_kpA__te.js +2 -0
- prefect/server/ui-v2/assets/{index-CiSFHkhI.js.map → index-_kpA__te.js.map} +1 -1
- prefect/server/ui-v2/assets/index-m9O-nIOl.css +1 -0
- prefect/server/ui-v2/assets/{index-lyQav_XM.js → index-wOvyf10b.js} +2 -2
- prefect/server/ui-v2/assets/{index-lyQav_XM.js.map → index-wOvyf10b.js.map} +1 -1
- prefect/server/ui-v2/assets/{json-input-Ba-BeBcw.js → json-input-Ce-HlRqa.js} +2 -2
- prefect/server/ui-v2/assets/{json-input-Ba-BeBcw.js.map → json-input-Ce-HlRqa.js.map} +1 -1
- prefect/server/ui-v2/assets/{key-value-DkSKn6jE.js → key-value-XHEZOtZX.js} +2 -2
- prefect/server/ui-v2/assets/{key-value-DkSKn6jE.js.map → key-value-XHEZOtZX.js.map} +1 -1
- prefect/server/ui-v2/assets/{key._key-Cjx57ymg.js → key._key-LpsMf3zD.js} +2 -2
- prefect/server/ui-v2/assets/{key._key-Cjx57ymg.js.map → key._key-LpsMf3zD.js.map} +1 -1
- prefect/server/ui-v2/assets/{lazy-markdown-Du2Xu3Yp.js → lazy-markdown-1Hz0xzca.js} +2 -2
- prefect/server/ui-v2/assets/{lazy-markdown-Du2Xu3Yp.js.map → lazy-markdown-1Hz0xzca.js.map} +1 -1
- prefect/server/ui-v2/assets/{login-DxMF9Jvj.js → login-D5uepl9L.js} +2 -2
- prefect/server/ui-v2/assets/{login-DxMF9Jvj.js.map → login-D5uepl9L.js.map} +1 -1
- prefect/server/ui-v2/assets/{markdown-input-DPi8zyRr.js → markdown-input-CG6M9zD0.js} +2 -2
- prefect/server/ui-v2/assets/{markdown-input-DPi8zyRr.js.map → markdown-input-CG6M9zD0.js.map} +1 -1
- prefect/server/ui-v2/assets/python-example-snippet-DRHcUlCX.js +3 -0
- prefect/server/ui-v2/assets/{python-example-snippet-DfCFYPN_.js.map → python-example-snippet-DRHcUlCX.js.map} +1 -1
- prefect/server/ui-v2/assets/{python-input-mr6GD840.js → python-input-BsUS8fw1.js} +2 -2
- prefect/server/ui-v2/assets/{python-input-mr6GD840.js.map → python-input-BsUS8fw1.js.map} +1 -1
- prefect/server/ui-v2/assets/{radio-group-Co3cN0Kv.js → radio-group-BUsmwdrt.js} +2 -2
- prefect/server/ui-v2/assets/{radio-group-Co3cN0Kv.js.map → radio-group-BUsmwdrt.js.map} +1 -1
- prefect/server/ui-v2/assets/{route-error-state-DnBaNT2T.js → route-error-state-BFBpiIhD.js} +2 -2
- prefect/server/ui-v2/assets/{route-error-state-DnBaNT2T.js.map → route-error-state-BFBpiIhD.js.map} +1 -1
- prefect/server/ui-v2/assets/{schema-form-CWDHSME9.js → schema-form-BwTmkvJk.js} +2 -2
- prefect/server/ui-v2/assets/{schema-form-CWDHSME9.js.map → schema-form-BwTmkvJk.js.map} +1 -1
- prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-BSWlW_aQ.js → schema-form-input-string-format-datetime-nrb3g-JJ.js} +4 -4
- prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-BSWlW_aQ.js.map → schema-form-input-string-format-datetime-nrb3g-JJ.js.map} +1 -1
- prefect/server/ui-v2/assets/{settings-DU5y6tJE.js → settings-CUBtK5aW.js} +2 -2
- prefect/server/ui-v2/assets/{settings-DU5y6tJE.js.map → settings-CUBtK5aW.js.map} +1 -1
- prefect/server/ui-v2/assets/{sort-filter-DpuWNkQo.js → sort-filter-Cv8zAXMp.js} +2 -2
- prefect/server/ui-v2/assets/{sort-filter-DpuWNkQo.js.map → sort-filter-Cv8zAXMp.js.map} +1 -1
- prefect/server/ui-v2/assets/{table-bBL6C0ZK.js → table-BBNGfPra.js} +2 -2
- prefect/server/ui-v2/assets/{table-bBL6C0ZK.js.map → table-BBNGfPra.js.map} +1 -1
- prefect/server/ui-v2/assets/{tags-input-BLPMVWpZ.js → tags-input-DHrnkwjQ.js} +2 -2
- prefect/server/ui-v2/assets/{tags-input-BLPMVWpZ.js.map → tags-input-DHrnkwjQ.js.map} +1 -1
- prefect/server/ui-v2/assets/task-run-concurrency-limits-reset-dialog-Z8-yFZ2_.js +2 -0
- prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-S69sih55.js.map → task-run-concurrency-limits-reset-dialog-Z8-yFZ2_.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-run._id-Dl3Azs8t.js → task-run._id-BY58gqs2.js} +2 -2
- prefect/server/ui-v2/assets/{task-run._id-Dl3Azs8t.js.map → task-run._id-BY58gqs2.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-run._id-B_tIDm4K.js → task-run._id-u73Jxfqw.js} +3 -3
- prefect/server/ui-v2/assets/{task-run._id-B_tIDm4K.js.map → task-run._id-u73Jxfqw.js.map} +1 -1
- prefect/server/ui-v2/assets/task-runs-pagination-DUy3147A.js +2 -0
- prefect/server/ui-v2/assets/{task-runs-pagination-VdR-LO4r.js.map → task-runs-pagination-DUy3147A.js.map} +1 -1
- prefect/server/ui-v2/assets/{textarea-B3_TtPRi.js → textarea-DUhh6-kq.js} +2 -2
- prefect/server/ui-v2/assets/{textarea-B3_TtPRi.js.map → textarea-DUhh6-kq.js.map} +1 -1
- prefect/server/ui-v2/assets/timezone-select-D4Q6VBtD.js +2 -0
- prefect/server/ui-v2/assets/{timezone-select-BuPYznge.js.map → timezone-select-D4Q6VBtD.js.map} +1 -1
- prefect/server/ui-v2/assets/{toggle-group-Cn07UIim.js → toggle-group-7WUJn2Tx.js} +2 -2
- prefect/server/ui-v2/assets/{toggle-group-Cn07UIim.js.map → toggle-group-7WUJn2Tx.js.map} +1 -1
- prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-D4AD5Ndf.js +2 -0
- prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-DpdsLH4t.js.map → use-delete-automation-confirmation-dialog-D4AD5Ndf.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-Cq5nGhzr.js → use-delete-block-document-confirmation-dialog-DnwWEGUY.js} +2 -2
- prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-Cq5nGhzr.js.map → use-delete-block-document-confirmation-dialog-DnwWEGUY.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-DmQSWBTu.js → use-flow-runs-selected-rows-C-tehPRB.js} +2 -2
- prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-DmQSWBTu.js.map → use-flow-runs-selected-rows-C-tehPRB.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DTwcWiqW.js → use-get-artifacts-flow-task-runs-DRWRrmrb.js} +2 -2
- prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DTwcWiqW.js.map → use-get-artifacts-flow-task-runs-DRWRrmrb.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-quick-run-CPempwLh.js → use-quick-run-B4Xj-YQQ.js} +2 -2
- prefect/server/ui-v2/assets/{use-quick-run-CPempwLh.js.map → use-quick-run-B4Xj-YQQ.js.map} +1 -1
- prefect/server/ui-v2/assets/use-state-favicon-au2TZdMV.js +2 -0
- prefect/server/ui-v2/assets/{use-state-favicon-M09DmrNy.js.map → use-state-favicon-au2TZdMV.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-stepper-CDucnvzp.js → use-stepper-DyIb3vlq.js} +2 -2
- prefect/server/ui-v2/assets/{use-stepper-CDucnvzp.js.map → use-stepper-DyIb3vlq.js.map} +1 -1
- prefect/server/ui-v2/assets/{utilities-BRCNRcQl.js → utilities-D9Y2wo66.js} +2 -2
- prefect/server/ui-v2/assets/{utilities-BRCNRcQl.js.map → utilities-D9Y2wo66.js.map} +1 -1
- prefect/server/ui-v2/assets/vendor-recharts-BvvJP9Po.js +34 -0
- prefect/server/ui-v2/assets/vendor-recharts-BvvJP9Po.js.map +1 -0
- prefect/server/ui-v2/assets/{work-pool-filter-C2tpSS-w.js → work-pool-filter-CSOATj2D.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool-filter-C2tpSS-w.js.map → work-pool-filter-CSOATj2D.js.map} +1 -1
- prefect/server/ui-v2/assets/work-pool-queue-toggle-Dh7B1zMo.js +2 -0
- prefect/server/ui-v2/assets/{work-pool-queue-toggle-BQ9b-Wxy.js.map → work-pool-queue-toggle-Dh7B1zMo.js.map} +1 -1
- prefect/server/ui-v2/assets/work-pool._workPoolName-B_NFWXKS.js +2 -0
- prefect/server/ui-v2/assets/{work-pool._workPoolName-C_LiL3SE.js.map → work-pool._workPoolName-B_NFWXKS.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-DBHlrVVx.js → work-pool_._workPoolName.edit-Cyzn8g-S.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-DBHlrVVx.js.map → work-pool_._workPoolName.edit-Cyzn8g-S.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-DkITxJOP.js → work-pool_._workPoolName.queue._workQueueName-DQzqQWPT.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-DkITxJOP.js.map → work-pool_._workPoolName.queue._workQueueName-DQzqQWPT.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-queue-icon-text-D4BWBVDN.js → work-queue-icon-text-BOpcJ8YU.js} +2 -2
- prefect/server/ui-v2/assets/{work-queue-icon-text-D4BWBVDN.js.map → work-queue-icon-text-BOpcJ8YU.js.map} +1 -1
- prefect/server/ui-v2/index.html +3 -3
- {prefect-3.6.15.dist-info → prefect-3.6.16.dev2.dist-info}/METADATA +2 -1
- {prefect-3.6.15.dist-info → prefect-3.6.16.dev2.dist-info}/RECORD +222 -210
- prefect/server/ui-v2/assets/artifact._id-BFdf1WUA.js +0 -2
- prefect/server/ui-v2/assets/artifact._id-BFdf1WUA.js.map +0 -1
- prefect/server/ui-v2/assets/automation._id-Dn7jABys.js +0 -2
- prefect/server/ui-v2/assets/block-type-logo-Cbpfxded.js +0 -2
- prefect/server/ui-v2/assets/block-type-logo-Cbpfxded.js.map +0 -1
- prefect/server/ui-v2/assets/catalog_._slug-Bl2J2oI3.js +0 -2
- prefect/server/ui-v2/assets/create-D--LHaji.js +0 -2
- prefect/server/ui-v2/assets/data-table-rlbkLcrY.js +0 -2
- prefect/server/ui-v2/assets/data-table-rlbkLcrY.js.map +0 -1
- prefect/server/ui-v2/assets/delete-confirmation-dialog-DHkm2p8m.js +0 -2
- prefect/server/ui-v2/assets/deployment._id-Ci9zge5n.js +0 -2
- prefect/server/ui-v2/assets/deployment_._id.duplicate-D9ZWkh8H.js +0 -2
- prefect/server/ui-v2/assets/deployment_._id.edit-CS7sObzC.js +0 -2
- prefect/server/ui-v2/assets/event._eventDate._eventId-D7Twzb22.js +0 -2
- prefect/server/ui-v2/assets/flow-run._id-RLy2kBh0.js +0 -4
- prefect/server/ui-v2/assets/flow._id-BdQGWPKP.js +0 -2
- prefect/server/ui-v2/assets/index-7i4X9TeK.js +0 -2
- prefect/server/ui-v2/assets/index-BkiGTHwU.js +0 -2
- prefect/server/ui-v2/assets/index-BkiGTHwU.js.map +0 -1
- prefect/server/ui-v2/assets/index-COouj_0-.css +0 -1
- prefect/server/ui-v2/assets/index-CiSFHkhI.js +0 -2
- prefect/server/ui-v2/assets/index-DATPYZfT.js +0 -2
- prefect/server/ui-v2/assets/index-DATPYZfT.js.map +0 -1
- prefect/server/ui-v2/assets/index-VH4TnZ4e.js +0 -2
- prefect/server/ui-v2/assets/index-VH4TnZ4e.js.map +0 -1
- prefect/server/ui-v2/assets/python-example-snippet-DfCFYPN_.js +0 -3
- prefect/server/ui-v2/assets/task-run-concurrency-limits-reset-dialog-S69sih55.js +0 -2
- prefect/server/ui-v2/assets/task-runs-pagination-VdR-LO4r.js +0 -2
- prefect/server/ui-v2/assets/timezone-select-BuPYznge.js +0 -2
- prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-DpdsLH4t.js +0 -2
- prefect/server/ui-v2/assets/use-state-favicon-M09DmrNy.js +0 -2
- prefect/server/ui-v2/assets/vendor-recharts-BAN776s_.js +0 -34
- prefect/server/ui-v2/assets/vendor-recharts-BAN776s_.js.map +0 -1
- prefect/server/ui-v2/assets/work-pool-queue-toggle-BQ9b-Wxy.js +0 -2
- prefect/server/ui-v2/assets/work-pool._workPoolName-C_LiL3SE.js +0 -2
- {prefect-3.6.15.dist-info → prefect-3.6.16.dev2.dist-info}/WHEEL +0 -0
- {prefect-3.6.15.dist-info → prefect-3.6.16.dev2.dist-info}/entry_points.txt +0 -0
- {prefect-3.6.15.dist-info → prefect-3.6.16.dev2.dist-info}/licenses/LICENSE +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"mappings":"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","names":["STUCK_STATES","TERMINAL_STATES","isStuckState","stateType","isRunningState","isPausedState","isTerminalState","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","FlowRunDetails","KeyValue","FormattedDate","TagBadgeGroup","Fragment","CancelFlowRunDialog","open","onOpenChange","cancelSubFlows","setCancelSubFlows","setFlowRunState","isPending","useSetFlowRunState","subFlowRuns","useQuery","buildFilterFlowRunsQuery","hasSubFlows","cancelSubFlowRuns","errors","subFlow","handleCancel","toast","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","StateBadge","Checkbox","checked","Label","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","e","PauseFlowRunDialog","timeout","setTimeout","handlePause","pauseTimeout","isValidTimeout","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","Input","secondsToApproximateString","DialogFooter","ResumeFlowRunDialog","runInputKeyset","ResumeDialogSkeleton","ResumeDialogWithInput","ResumeDialogSimple","resumeFlowRun","useResumeFlowRun","handleResume","keyset","values","setValues","validateForm","useSchemaForm","schema","buildGetFlowRunInputQuery","data","description","useEffect","LazyMarkdown","LazySchemaForm","RetryFlowRunDialog","handleRetry","FlowRunHeader","onDeleteClick","dialogState","confirmDelete","useDeleteConfirmationDialog","isChangeStateOpen","setChangeStateOpen","openChangeState","useChangeStateDialog","isCancelOpen","setIsCancelOpen","isPauseOpen","setIsPauseOpen","isResumeOpen","setIsResumeOpen","isRetryOpen","setIsRetryOpen","isChangingState","canChangeState","canCancel","canPause","canResume","canRetry","handleChangeState","newState","deployment","buildDeploymentDetailsQuery","taskRunCount","buildCountTaskRunsQuery","parentFlowRuns","parentFlowRun","formatTaskRunCount","count","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","BreadcrumbPage","Badge","Icon","formatDate","FlowIconText","Link","DropdownMenu","DropdownMenuTrigger","MoreVertical","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","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","prev","handleStateFilterChange","newFilters","handleSortChange","newSort","handleClearFilters","handlePrefetchPage","page","hasFilters","Typography","SearchInput","StateFilter","SortFilter","FlowRunsList","FlowRunsPagination","MAX_FILTERS_DISPLAYED","TaskRunStateFilter","selectedFilters","onSelectFilter","className","setOpen","isAllButScheduled","flowRunStatesNoScheduleSet","FLOW_RUN_STATES_NO_SCHEDULED","filter","handleSelectAllExceptScheduled","handleSelectAllRunState","handleSelectFilter","updatedFilters","renderSelectedTags","selected","visible","extraCount","FLOW_RUN_STATES_MAP","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","useStateFavicon","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/api/flow-runs/state-utilities.ts","../../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/flow-runs/flow-run-details-page/flow-run-details.tsx","../../src/components/flow-runs/flow-run-actions/cancel-flow-run-dialog.tsx","../../src/components/flow-runs/flow-run-actions/pause-flow-run-dialog.tsx","../../src/components/flow-runs/flow-run-actions/resume-flow-run-dialog.tsx","../../src/components/flow-runs/flow-run-actions/retry-flow-run-dialog.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 { components } from \"@/api/prefect\";\n\ntype StateType = components[\"schemas\"][\"StateType\"];\n\n/**\n * States that can be cancelled - flow runs that are \"stuck\" or in-progress\n */\nexport const STUCK_STATES: StateType[] = [\n\t\"RUNNING\",\n\t\"SCHEDULED\",\n\t\"PENDING\",\n\t\"PAUSED\",\n];\n\n/**\n * States that are terminal - flow runs that have completed execution\n */\nexport const TERMINAL_STATES: StateType[] = [\n\t\"COMPLETED\",\n\t\"FAILED\",\n\t\"CANCELLED\",\n\t\"CRASHED\",\n];\n\n/**\n * Check if a flow run can be cancelled (is in a stuck/cancellable state)\n */\nexport function isStuckState(stateType: StateType | null | undefined): boolean {\n\treturn stateType != null && STUCK_STATES.includes(stateType);\n}\n\n/**\n * Check if a flow run can be paused (is currently running)\n */\nexport function isRunningState(\n\tstateType: StateType | null | undefined,\n): boolean {\n\treturn stateType === \"RUNNING\";\n}\n\n/**\n * Check if a flow run can be resumed (is currently paused)\n */\nexport function isPausedState(\n\tstateType: StateType | null | undefined,\n): boolean {\n\treturn stateType === \"PAUSED\";\n}\n\n/**\n * Check if a flow run is in a terminal state\n */\nexport function isTerminalState(\n\tstateType: StateType | null | undefined,\n): boolean {\n\treturn stateType != null && TERMINAL_STATES.includes(stateType);\n}\n","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 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 { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport {\n\tbuildFilterFlowRunsQuery,\n\ttype FlowRun,\n\tuseSetFlowRunState,\n} from \"@/api/flow-runs\";\nimport {\n\tAlertDialog,\n\tAlertDialogAction,\n\tAlertDialogCancel,\n\tAlertDialogContent,\n\tAlertDialogDescription,\n\tAlertDialogFooter,\n\tAlertDialogHeader,\n\tAlertDialogTitle,\n} from \"@/components/ui/alert-dialog\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport { Label } from \"@/components/ui/label\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\n\ntype CancelFlowRunDialogProps = {\n\tflowRun: FlowRun;\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n};\n\nexport const CancelFlowRunDialog = ({\n\tflowRun,\n\topen,\n\tonOpenChange,\n}: CancelFlowRunDialogProps) => {\n\tconst [cancelSubFlows, setCancelSubFlows] = useState(false);\n\tconst { setFlowRunState, isPending } = useSetFlowRunState();\n\n\tconst { data: subFlowRuns = [] } = useQuery({\n\t\t...buildFilterFlowRunsQuery({\n\t\t\tflow_runs: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tparent_flow_run_id: { operator: \"and_\", any_: [flowRun.id] },\n\t\t\t\tstate: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\ttype: { any_: [\"RUNNING\", \"SCHEDULED\", \"PENDING\", \"PAUSED\"] },\n\t\t\t\t},\n\t\t\t},\n\t\t\tsort: \"START_TIME_DESC\",\n\t\t\tlimit: 100,\n\t\t\toffset: 0,\n\t\t}),\n\t\tenabled: open,\n\t});\n\n\tconst hasSubFlows = subFlowRuns.length > 0;\n\n\tconst cancelSubFlowRuns = (errors: string[]) => {\n\t\tfor (const subFlow of subFlowRuns) {\n\t\t\tsetFlowRunState(\n\t\t\t\t{\n\t\t\t\t\tid: subFlow.id,\n\t\t\t\t\tstate: { type: \"CANCELLING\", name: \"Cancelling\" },\n\t\t\t\t\tforce: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tonError: () => {\n\t\t\t\t\t\terrors.push(subFlow.name ?? subFlow.id);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t};\n\n\tconst handleCancel = () => {\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: \"CANCELLING\",\n\t\t\t\t\tname: \"Cancelling\",\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\tif (cancelSubFlows && subFlowRuns.length > 0) {\n\t\t\t\t\t\tconst errors: string[] = [];\n\t\t\t\t\t\tcancelSubFlowRuns(errors);\n\t\t\t\t\t\tif (errors.length > 0) {\n\t\t\t\t\t\t\ttoast.error(\n\t\t\t\t\t\t\t\t`Failed to cancel some sub-flows: ${errors.join(\", \")}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttoast.success(\n\t\t\t\t\t\t\t\t`Flow run and ${subFlowRuns.length} sub-flow${subFlowRuns.length === 1 ? \"\" : \"s\"} cancelled`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttoast.success(\"Flow run cancelled\");\n\t\t\t\t\t}\n\t\t\t\t\tonOpenChange(false);\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\ttoast.error(error.message || \"Failed to cancel flow run\");\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\treturn (\n\t\t<AlertDialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<AlertDialogContent>\n\t\t\t\t<AlertDialogHeader>\n\t\t\t\t\t<AlertDialogTitle>Cancel Flow Run</AlertDialogTitle>\n\t\t\t\t\t<AlertDialogDescription asChild>\n\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\tAre you sure you want to cancel{\" \"}\n\t\t\t\t\t\t\t\t<span className=\"font-medium\">{flowRun.name}</span>?\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tCurrent state:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{flowRun.state_type && flowRun.state_name && (\n\t\t\t\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\t\t\t\ttype={flowRun.state_type}\n\t\t\t\t\t\t\t\t\t\tname={flowRun.state_name}\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</div>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tWill become:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<StateBadge type=\"CANCELLING\" name=\"Cancelling\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</AlertDialogDescription>\n\t\t\t\t</AlertDialogHeader>\n\n\t\t\t\t{hasSubFlows && (\n\t\t\t\t\t<div className=\"flex items-center space-x-2 py-2\">\n\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\tid=\"cancel-subflows\"\n\t\t\t\t\t\t\tchecked={cancelSubFlows}\n\t\t\t\t\t\t\tonCheckedChange={(checked) => setCancelSubFlows(checked === true)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<Label htmlFor=\"cancel-subflows\" className=\"text-sm cursor-pointer\">\n\t\t\t\t\t\t\tAlso cancel {subFlowRuns.length} sub-flow run\n\t\t\t\t\t\t\t{subFlowRuns.length === 1 ? \"\" : \"s\"}\n\t\t\t\t\t\t</Label>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<AlertDialogFooter>\n\t\t\t\t\t<AlertDialogCancel disabled={isPending}>Cancel</AlertDialogCancel>\n\t\t\t\t\t<AlertDialogAction\n\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tvoid handleCancel();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tdisabled={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isPending ? \"Cancelling...\" : \"Cancel Flow Run\"}\n\t\t\t\t\t</AlertDialogAction>\n\t\t\t\t</AlertDialogFooter>\n\t\t\t</AlertDialogContent>\n\t\t</AlertDialog>\n\t);\n};\n","import { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport { type FlowRun, useSetFlowRunState } from \"@/api/flow-runs\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n} from \"@/components/ui/dialog\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\nimport { secondsToApproximateString } from \"@/utils\";\n\ntype PauseFlowRunDialogProps = {\n\tflowRun: FlowRun;\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n};\n\nexport const PauseFlowRunDialog = ({\n\tflowRun,\n\topen,\n\tonOpenChange,\n}: PauseFlowRunDialogProps) => {\n\tconst [timeout, setTimeout] = useState(300); // 5 minutes default\n\tconst { setFlowRunState, isPending } = useSetFlowRunState();\n\n\tconst handlePause = () => {\n\t\tconst pauseTimeout = new Date(Date.now() + timeout * 1000).toISOString();\n\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: \"PAUSED\",\n\t\t\t\t\tname: \"Suspended\",\n\t\t\t\t\tstate_details: {\n\t\t\t\t\t\tpause_timeout: pauseTimeout,\n\t\t\t\t\t\tpause_reschedule: true,\n\t\t\t\t\t\tdeferred: false,\n\t\t\t\t\t\tuntrackable_result: false,\n\t\t\t\t\t},\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 paused\");\n\t\t\t\t\tonOpenChange(false);\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\ttoast.error(error.message || \"Failed to pause flow run\");\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\tconst isValidTimeout = timeout >= 5;\n\n\treturn (\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<DialogContent>\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>Pause Flow Run</DialogTitle>\n\t\t\t\t\t<DialogDescription asChild>\n\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\tPause <span className=\"font-medium\">{flowRun.name}</span> for a\n\t\t\t\t\t\t\t\tspecified duration. The flow will automatically resume after the\n\t\t\t\t\t\t\t\ttimeout.\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tCurrent state:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{flowRun.state_type && flowRun.state_name && (\n\t\t\t\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\t\t\t\ttype={flowRun.state_type}\n\t\t\t\t\t\t\t\t\t\tname={flowRun.state_name}\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</div>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tWill become:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<StateBadge type=\"PAUSED\" name=\"Suspended\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</DialogDescription>\n\t\t\t\t</DialogHeader>\n\n\t\t\t\t<div className=\"space-y-2 py-4\">\n\t\t\t\t\t<Label htmlFor=\"timeout\">Timeout (seconds)</Label>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tid=\"timeout\"\n\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\tmin={5}\n\t\t\t\t\t\tvalue={timeout}\n\t\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\t\tsetTimeout(Number.parseInt(e.target.value, 10) || 5)\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\tWill pause for {secondsToApproximateString(timeout)}. Minimum 5\n\t\t\t\t\t\tseconds.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\n\t\t\t\t<DialogFooter>\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\tonClick={() => onOpenChange(false)}\n\t\t\t\t\t\tdisabled={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tonClick={handlePause}\n\t\t\t\t\t\tdisabled={isPending || !isValidTimeout}\n\t\t\t\t\t\tloading={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\tPause Flow Run\n\t\t\t\t\t</Button>\n\t\t\t\t</DialogFooter>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { Suspense, useEffect } from \"react\";\nimport { toast } from \"sonner\";\nimport {\n\tbuildGetFlowRunInputQuery,\n\ttype FlowRun,\n\tuseResumeFlowRun,\n} from \"@/api/flow-runs\";\nimport {\n\tLazySchemaForm,\n\ttype PrefectSchemaObject,\n\tuseSchemaForm,\n} from \"@/components/schemas\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n} from \"@/components/ui/dialog\";\nimport { LazyMarkdown } from \"@/components/ui/lazy-markdown\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\n\ntype ResumeFlowRunDialogProps = {\n\tflowRun: FlowRun;\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n};\n\nexport const ResumeFlowRunDialog = ({\n\tflowRun,\n\topen,\n\tonOpenChange,\n}: ResumeFlowRunDialogProps) => {\n\t// Check if this flow run requires input on resume\n\tconst runInputKeyset = flowRun.state?.state_details?.run_input_keyset as\n\t\t| Record<string, string>\n\t\t| undefined;\n\tconst requiresInput = runInputKeyset && runInputKeyset.schema;\n\n\tif (requiresInput) {\n\t\treturn (\n\t\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t\t<DialogContent className=\"max-w-2xl max-h-[80vh] overflow-y-auto\">\n\t\t\t\t\t<Suspense fallback={<ResumeDialogSkeleton />}>\n\t\t\t\t\t\t<ResumeDialogWithInput\n\t\t\t\t\t\t\tflowRun={flowRun}\n\t\t\t\t\t\t\tkeyset={runInputKeyset}\n\t\t\t\t\t\t\tonOpenChange={onOpenChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Suspense>\n\t\t\t\t</DialogContent>\n\t\t\t</Dialog>\n\t\t);\n\t}\n\n\treturn (\n\t\t<ResumeDialogSimple\n\t\t\tflowRun={flowRun}\n\t\t\topen={open}\n\t\t\tonOpenChange={onOpenChange}\n\t\t/>\n\t);\n};\n\n/**\n * Simple resume dialog for flows that don't require input\n */\nconst ResumeDialogSimple = ({\n\tflowRun,\n\topen,\n\tonOpenChange,\n}: ResumeFlowRunDialogProps) => {\n\tconst { resumeFlowRun, isPending } = useResumeFlowRun();\n\n\tconst handleResume = () => {\n\t\tresumeFlowRun(\n\t\t\t{ id: flowRun.id },\n\t\t\t{\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\ttoast.success(\"Flow run resumed\");\n\t\t\t\t\tonOpenChange(false);\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\ttoast.error(error.message || \"Failed to resume flow run\");\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\treturn (\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<DialogContent>\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>Resume Flow Run</DialogTitle>\n\t\t\t\t\t<DialogDescription asChild>\n\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\tResume the paused flow run{\" \"}\n\t\t\t\t\t\t\t\t<span className=\"font-medium\">{flowRun.name}</span>?\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tCurrent state:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{flowRun.state_type && flowRun.state_name && (\n\t\t\t\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\t\t\t\ttype={flowRun.state_type}\n\t\t\t\t\t\t\t\t\t\tname={flowRun.state_name}\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</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</DialogDescription>\n\t\t\t\t</DialogHeader>\n\n\t\t\t\t<DialogFooter>\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\tonClick={() => onOpenChange(false)}\n\t\t\t\t\t\tdisabled={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tonClick={handleResume}\n\t\t\t\t\t\tdisabled={isPending}\n\t\t\t\t\t\tloading={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\tResume\n\t\t\t\t\t</Button>\n\t\t\t\t</DialogFooter>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n};\n\n/**\n * Resume dialog with schema-based input form\n */\ntype ResumeDialogWithInputProps = {\n\tflowRun: FlowRun;\n\tkeyset: Record<string, string>;\n\tonOpenChange: (open: boolean) => void;\n};\n\nconst ResumeDialogWithInput = ({\n\tflowRun,\n\tkeyset,\n\tonOpenChange,\n}: ResumeDialogWithInputProps) => {\n\tconst { resumeFlowRun, isPending } = useResumeFlowRun();\n\tconst { values, setValues, errors, validateForm } = useSchemaForm();\n\n\t// Fetch schema and description\n\tconst { data: schema } = useQuery({\n\t\t...buildGetFlowRunInputQuery(flowRun.id, keyset.schema),\n\t\tselect: (data) => data as PrefectSchemaObject | undefined,\n\t});\n\n\tconst { data: description } = useQuery({\n\t\t...buildGetFlowRunInputQuery(flowRun.id, keyset.description ?? \"\"),\n\t\tenabled: Boolean(keyset.description),\n\t\tselect: (data) => data as string | undefined,\n\t});\n\n\t// Reset form when dialog opens\n\tuseEffect(() => {\n\t\tsetValues({});\n\t}, [setValues]);\n\n\tconst handleResume = async () => {\n\t\tif (!schema) return;\n\n\t\ttry {\n\t\t\t// Validate the form before submitting\n\t\t\tawait validateForm({ schema: values });\n\n\t\t\tif (errors.length > 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tresumeFlowRun(\n\t\t\t\t{ id: flowRun.id, runInput: values },\n\t\t\t\t{\n\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\ttoast.success(\"Flow run resumed\");\n\t\t\t\t\t\tonOpenChange(false);\n\t\t\t\t\t},\n\t\t\t\t\tonError: (error) => {\n\t\t\t\t\t\ttoast.error(error.message || \"Failed to resume flow run\");\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t} catch {\n\t\t\ttoast.error(\"Failed to validate input\");\n\t\t}\n\t};\n\n\tif (!schema) {\n\t\treturn <ResumeDialogSkeleton />;\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<DialogHeader>\n\t\t\t\t<DialogTitle>Resume Flow Run</DialogTitle>\n\t\t\t\t<DialogDescription asChild>\n\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\tProvide input to resume{\" \"}\n\t\t\t\t\t\t\t<span className=\"font-medium\">{flowRun.name}</span>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\tCurrent state:\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{flowRun.state_type && flowRun.state_name && (\n\t\t\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\t\t\ttype={flowRun.state_type}\n\t\t\t\t\t\t\t\t\tname={flowRun.state_name}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</DialogDescription>\n\t\t\t</DialogHeader>\n\n\t\t\t{description && (\n\t\t\t\t<div className=\"prose prose-sm dark:prose-invert max-w-none py-2 px-3 bg-muted/50 rounded-md\">\n\t\t\t\t\t<LazyMarkdown>{description}</LazyMarkdown>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<div className=\"py-4\">\n\t\t\t\t<LazySchemaForm\n\t\t\t\t\tschema={schema}\n\t\t\t\t\tvalues={values}\n\t\t\t\t\tonValuesChange={setValues}\n\t\t\t\t\terrors={errors}\n\t\t\t\t\tkinds={[\"json\"]}\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<DialogFooter>\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tonClick={() => onOpenChange(false)}\n\t\t\t\t\tdisabled={isPending}\n\t\t\t\t>\n\t\t\t\t\tCancel\n\t\t\t\t</Button>\n\t\t\t\t<Button\n\t\t\t\t\tonClick={() => void handleResume()}\n\t\t\t\t\tdisabled={isPending}\n\t\t\t\t\tloading={isPending}\n\t\t\t\t>\n\t\t\t\t\tResume\n\t\t\t\t</Button>\n\t\t\t</DialogFooter>\n\t\t</>\n\t);\n};\n\nconst ResumeDialogSkeleton = () => (\n\t<div className=\"flex flex-col gap-4\">\n\t\t<Skeleton className=\"h-6 w-48\" />\n\t\t<Skeleton className=\"h-4 w-full\" />\n\t\t<Skeleton className=\"h-32 w-full\" />\n\t\t<div className=\"flex justify-end gap-2\">\n\t\t\t<Skeleton className=\"h-10 w-20\" />\n\t\t\t<Skeleton className=\"h-10 w-20\" />\n\t\t</div>\n\t</div>\n);\n","import { toast } from \"sonner\";\nimport { type FlowRun, useSetFlowRunState } from \"@/api/flow-runs\";\nimport {\n\tAlertDialog,\n\tAlertDialogAction,\n\tAlertDialogCancel,\n\tAlertDialogContent,\n\tAlertDialogDescription,\n\tAlertDialogFooter,\n\tAlertDialogHeader,\n\tAlertDialogTitle,\n} from \"@/components/ui/alert-dialog\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\n\ntype RetryFlowRunDialogProps = {\n\tflowRun: FlowRun;\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n};\n\nexport const RetryFlowRunDialog = ({\n\tflowRun,\n\topen,\n\tonOpenChange,\n}: RetryFlowRunDialogProps) => {\n\tconst { setFlowRunState, isPending } = useSetFlowRunState();\n\n\tconst handleRetry = () => {\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: \"SCHEDULED\",\n\t\t\t\t\tname: \"AwaitingRetry\",\n\t\t\t\t\tmessage: \"Retry from the UI\",\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 scheduled for retry\");\n\t\t\t\t\tonOpenChange(false);\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\ttoast.error(error.message || \"Failed to retry flow run\");\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\treturn (\n\t\t<AlertDialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<AlertDialogContent>\n\t\t\t\t<AlertDialogHeader>\n\t\t\t\t\t<AlertDialogTitle>Retry Flow Run</AlertDialogTitle>\n\t\t\t\t\t<AlertDialogDescription asChild>\n\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\tRetry the flow run{\" \"}\n\t\t\t\t\t\t\t\t<span className=\"font-medium\">{flowRun.name}</span>?\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tCurrent state:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{flowRun.state_type && flowRun.state_name && (\n\t\t\t\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\t\t\t\ttype={flowRun.state_type}\n\t\t\t\t\t\t\t\t\t\tname={flowRun.state_name}\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</div>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tWill become:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<StateBadge type=\"SCHEDULED\" name=\"AwaitingRetry\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\tTask runs with persisted results will use cached values. Task\n\t\t\t\t\t\t\t\truns without persisted results will be re-executed.\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</AlertDialogDescription>\n\t\t\t\t</AlertDialogHeader>\n\n\t\t\t\t<AlertDialogFooter>\n\t\t\t\t\t<AlertDialogCancel disabled={isPending}>Cancel</AlertDialogCancel>\n\t\t\t\t\t<AlertDialogAction\n\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\thandleRetry();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tdisabled={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isPending ? \"Retrying...\" : \"Retry\"}\n\t\t\t\t\t</AlertDialogAction>\n\t\t\t\t</AlertDialogFooter>\n\t\t\t</AlertDialogContent>\n\t\t</AlertDialog>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { Link } from \"@tanstack/react-router\";\nimport { MoreVertical } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport { buildDeploymentDetailsQuery } from \"@/api/deployments\";\nimport {\n\tbuildFilterFlowRunsQuery,\n\ttype FlowRun,\n\tisPausedState,\n\tisRunningState,\n\tisStuckState,\n\tisTerminalState,\n\tuseSetFlowRunState,\n} from \"@/api/flow-runs\";\nimport { buildCountTaskRunsQuery } from \"@/api/task-runs\";\nimport {\n\tCancelFlowRunDialog,\n\tPauseFlowRunDialog,\n\tResumeFlowRunDialog,\n\tRetryFlowRunDialog,\n} from \"@/components/flow-runs/flow-run-actions\";\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\tDropdownMenuSeparator,\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 [isCancelOpen, setIsCancelOpen] = useState(false);\n\tconst [isPauseOpen, setIsPauseOpen] = useState(false);\n\tconst [isResumeOpen, setIsResumeOpen] = useState(false);\n\tconst [isRetryOpen, setIsRetryOpen] = useState(false);\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 canCancel = isStuckState(flowRun.state_type) && flowRun.deployment_id;\n\tconst canPause = isRunningState(flowRun.state_type) && flowRun.deployment_id;\n\tconst canResume = isPausedState(flowRun.state_type);\n\tconst canRetry = isTerminalState(flowRun.state_type) && flowRun.deployment_id;\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{canCancel && (\n\t\t\t\t\t\t<DropdownMenuItem onClick={() => setIsCancelOpen(true)}>\n\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t)}\n\t\t\t\t\t{canPause && (\n\t\t\t\t\t\t<DropdownMenuItem onClick={() => setIsPauseOpen(true)}>\n\t\t\t\t\t\t\tPause\n\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t)}\n\t\t\t\t\t{canResume && (\n\t\t\t\t\t\t<DropdownMenuItem onClick={() => setIsResumeOpen(true)}>\n\t\t\t\t\t\t\tResume\n\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t)}\n\t\t\t\t\t{canRetry && (\n\t\t\t\t\t\t<DropdownMenuItem onClick={() => setIsRetryOpen(true)}>\n\t\t\t\t\t\t\tRetry\n\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t)}\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{(canCancel ||\n\t\t\t\t\t\tcanPause ||\n\t\t\t\t\t\tcanResume ||\n\t\t\t\t\t\tcanRetry ||\n\t\t\t\t\t\tcanChangeState) && <DropdownMenuSeparator />}\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\t<CancelFlowRunDialog\n\t\t\t\tflowRun={flowRun}\n\t\t\t\topen={isCancelOpen}\n\t\t\t\tonOpenChange={setIsCancelOpen}\n\t\t\t/>\n\t\t\t<PauseFlowRunDialog\n\t\t\t\tflowRun={flowRun}\n\t\t\t\topen={isPauseOpen}\n\t\t\t\tonOpenChange={setIsPauseOpen}\n\t\t\t/>\n\t\t\t<ResumeFlowRunDialog\n\t\t\t\tflowRun={flowRun}\n\t\t\t\topen={isResumeOpen}\n\t\t\t\tonOpenChange={setIsResumeOpen}\n\t\t\t/>\n\t\t\t<RetryFlowRunDialog\n\t\t\t\tflowRun={flowRun}\n\t\t\t\topen={isRetryOpen}\n\t\t\t\tonOpenChange={setIsRetryOpen}\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-RLy2kBh0.js"}
|
|
1
|
+
{"version":3,"mappings":"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","names":["STUCK_STATES","TERMINAL_STATES","isStuckState","stateType","isRunningState","isPausedState","isTerminalState","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","FlowRunDetails","KeyValue","FormattedDate","TagBadgeGroup","Fragment","CancelFlowRunDialog","open","onOpenChange","cancelSubFlows","setCancelSubFlows","setFlowRunState","isPending","useSetFlowRunState","subFlowRuns","useQuery","buildFilterFlowRunsQuery","hasSubFlows","cancelSubFlowRuns","errors","subFlow","handleCancel","toast","AlertDialog","AlertDialogContent","AlertDialogHeader","AlertDialogTitle","AlertDialogDescription","StateBadge","Checkbox","checked","Label","AlertDialogFooter","AlertDialogCancel","AlertDialogAction","e","PauseFlowRunDialog","timeout","setTimeout","handlePause","pauseTimeout","isValidTimeout","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","Input","secondsToApproximateString","DialogFooter","ResumeFlowRunDialog","runInputKeyset","ResumeDialogSkeleton","ResumeDialogWithInput","ResumeDialogSimple","resumeFlowRun","useResumeFlowRun","handleResume","keyset","values","setValues","validateForm","useSchemaForm","schema","buildGetFlowRunInputQuery","data","description","useEffect","LazyMarkdown","LazySchemaForm","RetryFlowRunDialog","handleRetry","FlowRunHeader","onDeleteClick","dialogState","confirmDelete","useDeleteConfirmationDialog","isChangeStateOpen","setChangeStateOpen","openChangeState","useChangeStateDialog","isCancelOpen","setIsCancelOpen","isPauseOpen","setIsPauseOpen","isResumeOpen","setIsResumeOpen","isRetryOpen","setIsRetryOpen","isChangingState","canChangeState","canCancel","canPause","canResume","canRetry","handleChangeState","newState","deployment","buildDeploymentDetailsQuery","taskRunCount","buildCountTaskRunsQuery","parentFlowRuns","parentFlowRun","formatTaskRunCount","count","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","BreadcrumbPage","Badge","Icon","formatDate","FlowIconText","Link","DropdownMenu","DropdownMenuTrigger","MoreVertical","DropdownMenuContent","DropdownMenuItem","DropdownMenuSeparator","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","prev","handleStateFilterChange","newFilters","handleSortChange","newSort","handleClearFilters","handlePrefetchPage","page","hasFilters","Typography","SearchInput","StateFilter","SortFilter","FlowRunsList","FlowRunsPagination","MAX_FILTERS_DISPLAYED","TaskRunStateFilter","selectedFilters","onSelectFilter","className","setOpen","isAllButScheduled","flowRunStatesNoScheduleSet","FLOW_RUN_STATES_NO_SCHEDULED","filter","handleSelectAllExceptScheduled","handleSelectAllRunState","handleSelectFilter","updatedFilters","renderSelectedTags","selected","visible","extraCount","FLOW_RUN_STATES_MAP","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","useStateFavicon","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/api/flow-runs/state-utilities.ts","../../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/flow-runs/flow-run-details-page/flow-run-details.tsx","../../src/components/flow-runs/flow-run-actions/cancel-flow-run-dialog.tsx","../../src/components/flow-runs/flow-run-actions/pause-flow-run-dialog.tsx","../../src/components/flow-runs/flow-run-actions/resume-flow-run-dialog.tsx","../../src/components/flow-runs/flow-run-actions/retry-flow-run-dialog.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 { components } from \"@/api/prefect\";\n\ntype StateType = components[\"schemas\"][\"StateType\"];\n\n/**\n * States that can be cancelled - flow runs that are \"stuck\" or in-progress\n */\nexport const STUCK_STATES: StateType[] = [\n\t\"RUNNING\",\n\t\"SCHEDULED\",\n\t\"PENDING\",\n\t\"PAUSED\",\n];\n\n/**\n * States that are terminal - flow runs that have completed execution\n */\nexport const TERMINAL_STATES: StateType[] = [\n\t\"COMPLETED\",\n\t\"FAILED\",\n\t\"CANCELLED\",\n\t\"CRASHED\",\n];\n\n/**\n * Check if a flow run can be cancelled (is in a stuck/cancellable state)\n */\nexport function isStuckState(stateType: StateType | null | undefined): boolean {\n\treturn stateType != null && STUCK_STATES.includes(stateType);\n}\n\n/**\n * Check if a flow run can be paused (is currently running)\n */\nexport function isRunningState(\n\tstateType: StateType | null | undefined,\n): boolean {\n\treturn stateType === \"RUNNING\";\n}\n\n/**\n * Check if a flow run can be resumed (is currently paused)\n */\nexport function isPausedState(\n\tstateType: StateType | null | undefined,\n): boolean {\n\treturn stateType === \"PAUSED\";\n}\n\n/**\n * Check if a flow run is in a terminal state\n */\nexport function isTerminalState(\n\tstateType: StateType | null | undefined,\n): boolean {\n\treturn stateType != null && TERMINAL_STATES.includes(stateType);\n}\n","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 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 { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport {\n\tbuildFilterFlowRunsQuery,\n\ttype FlowRun,\n\tuseSetFlowRunState,\n} from \"@/api/flow-runs\";\nimport {\n\tAlertDialog,\n\tAlertDialogAction,\n\tAlertDialogCancel,\n\tAlertDialogContent,\n\tAlertDialogDescription,\n\tAlertDialogFooter,\n\tAlertDialogHeader,\n\tAlertDialogTitle,\n} from \"@/components/ui/alert-dialog\";\nimport { Checkbox } from \"@/components/ui/checkbox\";\nimport { Label } from \"@/components/ui/label\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\n\ntype CancelFlowRunDialogProps = {\n\tflowRun: FlowRun;\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n};\n\nexport const CancelFlowRunDialog = ({\n\tflowRun,\n\topen,\n\tonOpenChange,\n}: CancelFlowRunDialogProps) => {\n\tconst [cancelSubFlows, setCancelSubFlows] = useState(false);\n\tconst { setFlowRunState, isPending } = useSetFlowRunState();\n\n\tconst { data: subFlowRuns = [] } = useQuery({\n\t\t...buildFilterFlowRunsQuery({\n\t\t\tflow_runs: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tparent_flow_run_id: { operator: \"and_\", any_: [flowRun.id] },\n\t\t\t\tstate: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\ttype: { any_: [\"RUNNING\", \"SCHEDULED\", \"PENDING\", \"PAUSED\"] },\n\t\t\t\t},\n\t\t\t},\n\t\t\tsort: \"START_TIME_DESC\",\n\t\t\tlimit: 100,\n\t\t\toffset: 0,\n\t\t}),\n\t\tenabled: open,\n\t});\n\n\tconst hasSubFlows = subFlowRuns.length > 0;\n\n\tconst cancelSubFlowRuns = (errors: string[]) => {\n\t\tfor (const subFlow of subFlowRuns) {\n\t\t\tsetFlowRunState(\n\t\t\t\t{\n\t\t\t\t\tid: subFlow.id,\n\t\t\t\t\tstate: { type: \"CANCELLING\", name: \"Cancelling\" },\n\t\t\t\t\tforce: true,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tonError: () => {\n\t\t\t\t\t\terrors.push(subFlow.name ?? subFlow.id);\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t}\n\t};\n\n\tconst handleCancel = () => {\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: \"CANCELLING\",\n\t\t\t\t\tname: \"Cancelling\",\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\tif (cancelSubFlows && subFlowRuns.length > 0) {\n\t\t\t\t\t\tconst errors: string[] = [];\n\t\t\t\t\t\tcancelSubFlowRuns(errors);\n\t\t\t\t\t\tif (errors.length > 0) {\n\t\t\t\t\t\t\ttoast.error(\n\t\t\t\t\t\t\t\t`Failed to cancel some sub-flows: ${errors.join(\", \")}`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\ttoast.success(\n\t\t\t\t\t\t\t\t`Flow run and ${subFlowRuns.length} sub-flow${subFlowRuns.length === 1 ? \"\" : \"s\"} cancelled`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttoast.success(\"Flow run cancelled\");\n\t\t\t\t\t}\n\t\t\t\t\tonOpenChange(false);\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\ttoast.error(error.message || \"Failed to cancel flow run\");\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\treturn (\n\t\t<AlertDialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<AlertDialogContent>\n\t\t\t\t<AlertDialogHeader>\n\t\t\t\t\t<AlertDialogTitle>Cancel Flow Run</AlertDialogTitle>\n\t\t\t\t\t<AlertDialogDescription asChild>\n\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\tAre you sure you want to cancel{\" \"}\n\t\t\t\t\t\t\t\t<span className=\"font-medium\">{flowRun.name}</span>?\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tCurrent state:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{flowRun.state_type && flowRun.state_name && (\n\t\t\t\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\t\t\t\ttype={flowRun.state_type}\n\t\t\t\t\t\t\t\t\t\tname={flowRun.state_name}\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</div>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tWill become:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<StateBadge type=\"CANCELLING\" name=\"Cancelling\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</AlertDialogDescription>\n\t\t\t\t</AlertDialogHeader>\n\n\t\t\t\t{hasSubFlows && (\n\t\t\t\t\t<div className=\"flex items-center space-x-2 py-2\">\n\t\t\t\t\t\t<Checkbox\n\t\t\t\t\t\t\tid=\"cancel-subflows\"\n\t\t\t\t\t\t\tchecked={cancelSubFlows}\n\t\t\t\t\t\t\tonCheckedChange={(checked) => setCancelSubFlows(checked === true)}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<Label htmlFor=\"cancel-subflows\" className=\"text-sm cursor-pointer\">\n\t\t\t\t\t\t\tAlso cancel {subFlowRuns.length} sub-flow run\n\t\t\t\t\t\t\t{subFlowRuns.length === 1 ? \"\" : \"s\"}\n\t\t\t\t\t\t</Label>\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\n\t\t\t\t<AlertDialogFooter>\n\t\t\t\t\t<AlertDialogCancel disabled={isPending}>Cancel</AlertDialogCancel>\n\t\t\t\t\t<AlertDialogAction\n\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\tvoid handleCancel();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tdisabled={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isPending ? \"Cancelling...\" : \"Cancel Flow Run\"}\n\t\t\t\t\t</AlertDialogAction>\n\t\t\t\t</AlertDialogFooter>\n\t\t\t</AlertDialogContent>\n\t\t</AlertDialog>\n\t);\n};\n","import { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport { type FlowRun, useSetFlowRunState } from \"@/api/flow-runs\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n} from \"@/components/ui/dialog\";\nimport { Input } from \"@/components/ui/input\";\nimport { Label } from \"@/components/ui/label\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\nimport { secondsToApproximateString } from \"@/utils\";\n\ntype PauseFlowRunDialogProps = {\n\tflowRun: FlowRun;\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n};\n\nexport const PauseFlowRunDialog = ({\n\tflowRun,\n\topen,\n\tonOpenChange,\n}: PauseFlowRunDialogProps) => {\n\tconst [timeout, setTimeout] = useState(300); // 5 minutes default\n\tconst { setFlowRunState, isPending } = useSetFlowRunState();\n\n\tconst handlePause = () => {\n\t\tconst pauseTimeout = new Date(Date.now() + timeout * 1000).toISOString();\n\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: \"PAUSED\",\n\t\t\t\t\tname: \"Suspended\",\n\t\t\t\t\tstate_details: {\n\t\t\t\t\t\tpause_timeout: pauseTimeout,\n\t\t\t\t\t\tpause_reschedule: true,\n\t\t\t\t\t\tdeferred: false,\n\t\t\t\t\t\tuntrackable_result: false,\n\t\t\t\t\t},\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 paused\");\n\t\t\t\t\tonOpenChange(false);\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\ttoast.error(error.message || \"Failed to pause flow run\");\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\tconst isValidTimeout = timeout >= 5;\n\n\treturn (\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<DialogContent>\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>Pause Flow Run</DialogTitle>\n\t\t\t\t\t<DialogDescription asChild>\n\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\tPause <span className=\"font-medium\">{flowRun.name}</span> for a\n\t\t\t\t\t\t\t\tspecified duration. The flow will automatically resume after the\n\t\t\t\t\t\t\t\ttimeout.\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tCurrent state:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{flowRun.state_type && flowRun.state_name && (\n\t\t\t\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\t\t\t\ttype={flowRun.state_type}\n\t\t\t\t\t\t\t\t\t\tname={flowRun.state_name}\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</div>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tWill become:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<StateBadge type=\"PAUSED\" name=\"Suspended\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</DialogDescription>\n\t\t\t\t</DialogHeader>\n\n\t\t\t\t<div className=\"space-y-2 py-4\">\n\t\t\t\t\t<Label htmlFor=\"timeout\">Timeout (seconds)</Label>\n\t\t\t\t\t<Input\n\t\t\t\t\t\tid=\"timeout\"\n\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\tmin={5}\n\t\t\t\t\t\tvalue={timeout}\n\t\t\t\t\t\tonChange={(e) =>\n\t\t\t\t\t\t\tsetTimeout(Number.parseInt(e.target.value, 10) || 5)\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\tWill pause for {secondsToApproximateString(timeout)}. Minimum 5\n\t\t\t\t\t\tseconds.\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\n\t\t\t\t<DialogFooter>\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\tonClick={() => onOpenChange(false)}\n\t\t\t\t\t\tdisabled={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tonClick={handlePause}\n\t\t\t\t\t\tdisabled={isPending || !isValidTimeout}\n\t\t\t\t\t\tloading={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\tPause Flow Run\n\t\t\t\t\t</Button>\n\t\t\t\t</DialogFooter>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { Suspense, useEffect } from \"react\";\nimport { toast } from \"sonner\";\nimport {\n\tbuildGetFlowRunInputQuery,\n\ttype FlowRun,\n\tuseResumeFlowRun,\n} from \"@/api/flow-runs\";\nimport {\n\tLazySchemaForm,\n\ttype PrefectSchemaObject,\n\tuseSchemaForm,\n} from \"@/components/schemas\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n} from \"@/components/ui/dialog\";\nimport { LazyMarkdown } from \"@/components/ui/lazy-markdown\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\n\ntype ResumeFlowRunDialogProps = {\n\tflowRun: FlowRun;\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n};\n\nexport const ResumeFlowRunDialog = ({\n\tflowRun,\n\topen,\n\tonOpenChange,\n}: ResumeFlowRunDialogProps) => {\n\t// Check if this flow run requires input on resume\n\tconst runInputKeyset = flowRun.state?.state_details?.run_input_keyset as\n\t\t| Record<string, string>\n\t\t| undefined;\n\tconst requiresInput = runInputKeyset && runInputKeyset.schema;\n\n\tif (requiresInput) {\n\t\treturn (\n\t\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t\t<DialogContent className=\"max-w-2xl max-h-[80vh] overflow-y-auto\">\n\t\t\t\t\t<Suspense fallback={<ResumeDialogSkeleton />}>\n\t\t\t\t\t\t<ResumeDialogWithInput\n\t\t\t\t\t\t\tflowRun={flowRun}\n\t\t\t\t\t\t\tkeyset={runInputKeyset}\n\t\t\t\t\t\t\tonOpenChange={onOpenChange}\n\t\t\t\t\t\t/>\n\t\t\t\t\t</Suspense>\n\t\t\t\t</DialogContent>\n\t\t\t</Dialog>\n\t\t);\n\t}\n\n\treturn (\n\t\t<ResumeDialogSimple\n\t\t\tflowRun={flowRun}\n\t\t\topen={open}\n\t\t\tonOpenChange={onOpenChange}\n\t\t/>\n\t);\n};\n\n/**\n * Simple resume dialog for flows that don't require input\n */\nconst ResumeDialogSimple = ({\n\tflowRun,\n\topen,\n\tonOpenChange,\n}: ResumeFlowRunDialogProps) => {\n\tconst { resumeFlowRun, isPending } = useResumeFlowRun();\n\n\tconst handleResume = () => {\n\t\tresumeFlowRun(\n\t\t\t{ id: flowRun.id },\n\t\t\t{\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\ttoast.success(\"Flow run resumed\");\n\t\t\t\t\tonOpenChange(false);\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\ttoast.error(error.message || \"Failed to resume flow run\");\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\treturn (\n\t\t<Dialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<DialogContent>\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>Resume Flow Run</DialogTitle>\n\t\t\t\t\t<DialogDescription asChild>\n\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\tResume the paused flow run{\" \"}\n\t\t\t\t\t\t\t\t<span className=\"font-medium\">{flowRun.name}</span>?\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tCurrent state:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{flowRun.state_type && flowRun.state_name && (\n\t\t\t\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\t\t\t\ttype={flowRun.state_type}\n\t\t\t\t\t\t\t\t\t\tname={flowRun.state_name}\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</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</DialogDescription>\n\t\t\t\t</DialogHeader>\n\n\t\t\t\t<DialogFooter>\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\tonClick={() => onOpenChange(false)}\n\t\t\t\t\t\tdisabled={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\tCancel\n\t\t\t\t\t</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tonClick={handleResume}\n\t\t\t\t\t\tdisabled={isPending}\n\t\t\t\t\t\tloading={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\tResume\n\t\t\t\t\t</Button>\n\t\t\t\t</DialogFooter>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n};\n\n/**\n * Resume dialog with schema-based input form\n */\ntype ResumeDialogWithInputProps = {\n\tflowRun: FlowRun;\n\tkeyset: Record<string, string>;\n\tonOpenChange: (open: boolean) => void;\n};\n\nconst ResumeDialogWithInput = ({\n\tflowRun,\n\tkeyset,\n\tonOpenChange,\n}: ResumeDialogWithInputProps) => {\n\tconst { resumeFlowRun, isPending } = useResumeFlowRun();\n\tconst { values, setValues, errors, validateForm } = useSchemaForm();\n\n\t// Fetch schema and description\n\tconst { data: schema } = useQuery({\n\t\t...buildGetFlowRunInputQuery(flowRun.id, keyset.schema),\n\t\tselect: (data) => data as PrefectSchemaObject | undefined,\n\t});\n\n\tconst { data: description } = useQuery({\n\t\t...buildGetFlowRunInputQuery(flowRun.id, keyset.description ?? \"\"),\n\t\tenabled: Boolean(keyset.description),\n\t\tselect: (data) => data as string | undefined,\n\t});\n\n\t// Reset form when dialog opens\n\tuseEffect(() => {\n\t\tsetValues({});\n\t}, [setValues]);\n\n\tconst handleResume = async () => {\n\t\tif (!schema) return;\n\n\t\ttry {\n\t\t\t// Validate the form before submitting\n\t\t\tawait validateForm({ schema: values });\n\n\t\t\tif (errors.length > 0) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tresumeFlowRun(\n\t\t\t\t{ id: flowRun.id, runInput: values },\n\t\t\t\t{\n\t\t\t\t\tonSuccess: () => {\n\t\t\t\t\t\ttoast.success(\"Flow run resumed\");\n\t\t\t\t\t\tonOpenChange(false);\n\t\t\t\t\t},\n\t\t\t\t\tonError: (error) => {\n\t\t\t\t\t\ttoast.error(error.message || \"Failed to resume flow run\");\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t);\n\t\t} catch {\n\t\t\ttoast.error(\"Failed to validate input\");\n\t\t}\n\t};\n\n\tif (!schema) {\n\t\treturn <ResumeDialogSkeleton />;\n\t}\n\n\treturn (\n\t\t<>\n\t\t\t<DialogHeader>\n\t\t\t\t<DialogTitle>Resume Flow Run</DialogTitle>\n\t\t\t\t<DialogDescription asChild>\n\t\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\tProvide input to resume{\" \"}\n\t\t\t\t\t\t\t<span className=\"font-medium\">{flowRun.name}</span>\n\t\t\t\t\t\t</p>\n\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\tCurrent state:\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t{flowRun.state_type && flowRun.state_name && (\n\t\t\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\t\t\ttype={flowRun.state_type}\n\t\t\t\t\t\t\t\t\tname={flowRun.state_name}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</DialogDescription>\n\t\t\t</DialogHeader>\n\n\t\t\t{description && (\n\t\t\t\t<div className=\"prose prose-sm dark:prose-invert max-w-none py-2 px-3 bg-muted/50 rounded-md\">\n\t\t\t\t\t<LazyMarkdown>{description}</LazyMarkdown>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<div className=\"py-4\">\n\t\t\t\t<LazySchemaForm\n\t\t\t\t\tschema={schema}\n\t\t\t\t\tvalues={values}\n\t\t\t\t\tonValuesChange={setValues}\n\t\t\t\t\terrors={errors}\n\t\t\t\t\tkinds={[\"json\"]}\n\t\t\t\t/>\n\t\t\t</div>\n\n\t\t\t<DialogFooter>\n\t\t\t\t<Button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tonClick={() => onOpenChange(false)}\n\t\t\t\t\tdisabled={isPending}\n\t\t\t\t>\n\t\t\t\t\tCancel\n\t\t\t\t</Button>\n\t\t\t\t<Button\n\t\t\t\t\tonClick={() => void handleResume()}\n\t\t\t\t\tdisabled={isPending}\n\t\t\t\t\tloading={isPending}\n\t\t\t\t>\n\t\t\t\t\tResume\n\t\t\t\t</Button>\n\t\t\t</DialogFooter>\n\t\t</>\n\t);\n};\n\nconst ResumeDialogSkeleton = () => (\n\t<div className=\"flex flex-col gap-4\">\n\t\t<Skeleton className=\"h-6 w-48\" />\n\t\t<Skeleton className=\"h-4 w-full\" />\n\t\t<Skeleton className=\"h-32 w-full\" />\n\t\t<div className=\"flex justify-end gap-2\">\n\t\t\t<Skeleton className=\"h-10 w-20\" />\n\t\t\t<Skeleton className=\"h-10 w-20\" />\n\t\t</div>\n\t</div>\n);\n","import { toast } from \"sonner\";\nimport { type FlowRun, useSetFlowRunState } from \"@/api/flow-runs\";\nimport {\n\tAlertDialog,\n\tAlertDialogAction,\n\tAlertDialogCancel,\n\tAlertDialogContent,\n\tAlertDialogDescription,\n\tAlertDialogFooter,\n\tAlertDialogHeader,\n\tAlertDialogTitle,\n} from \"@/components/ui/alert-dialog\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\n\ntype RetryFlowRunDialogProps = {\n\tflowRun: FlowRun;\n\topen: boolean;\n\tonOpenChange: (open: boolean) => void;\n};\n\nexport const RetryFlowRunDialog = ({\n\tflowRun,\n\topen,\n\tonOpenChange,\n}: RetryFlowRunDialogProps) => {\n\tconst { setFlowRunState, isPending } = useSetFlowRunState();\n\n\tconst handleRetry = () => {\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: \"SCHEDULED\",\n\t\t\t\t\tname: \"AwaitingRetry\",\n\t\t\t\t\tmessage: \"Retry from the UI\",\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 scheduled for retry\");\n\t\t\t\t\tonOpenChange(false);\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\ttoast.error(error.message || \"Failed to retry flow run\");\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\treturn (\n\t\t<AlertDialog open={open} onOpenChange={onOpenChange}>\n\t\t\t<AlertDialogContent>\n\t\t\t\t<AlertDialogHeader>\n\t\t\t\t\t<AlertDialogTitle>Retry Flow Run</AlertDialogTitle>\n\t\t\t\t\t<AlertDialogDescription asChild>\n\t\t\t\t\t\t<div className=\"space-y-4\">\n\t\t\t\t\t\t\t<p>\n\t\t\t\t\t\t\t\tRetry the flow run{\" \"}\n\t\t\t\t\t\t\t\t<span className=\"font-medium\">{flowRun.name}</span>?\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tCurrent state:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t{flowRun.state_type && flowRun.state_name && (\n\t\t\t\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\t\t\t\ttype={flowRun.state_type}\n\t\t\t\t\t\t\t\t\t\tname={flowRun.state_name}\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</div>\n\t\t\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\t\tWill become:\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t<StateBadge type=\"SCHEDULED\" name=\"AwaitingRetry\" />\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t<p className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\t\tTask runs with persisted results will use cached values. Task\n\t\t\t\t\t\t\t\truns without persisted results will be re-executed.\n\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</AlertDialogDescription>\n\t\t\t\t</AlertDialogHeader>\n\n\t\t\t\t<AlertDialogFooter>\n\t\t\t\t\t<AlertDialogCancel disabled={isPending}>Cancel</AlertDialogCancel>\n\t\t\t\t\t<AlertDialogAction\n\t\t\t\t\t\tonClick={(e) => {\n\t\t\t\t\t\t\te.preventDefault();\n\t\t\t\t\t\t\thandleRetry();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tdisabled={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\t{isPending ? \"Retrying...\" : \"Retry\"}\n\t\t\t\t\t</AlertDialogAction>\n\t\t\t\t</AlertDialogFooter>\n\t\t\t</AlertDialogContent>\n\t\t</AlertDialog>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { Link } from \"@tanstack/react-router\";\nimport { MoreVertical } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { toast } from \"sonner\";\nimport { buildDeploymentDetailsQuery } from \"@/api/deployments\";\nimport {\n\tbuildFilterFlowRunsQuery,\n\ttype FlowRun,\n\tisPausedState,\n\tisRunningState,\n\tisStuckState,\n\tisTerminalState,\n\tuseSetFlowRunState,\n} from \"@/api/flow-runs\";\nimport { buildCountTaskRunsQuery } from \"@/api/task-runs\";\nimport {\n\tCancelFlowRunDialog,\n\tPauseFlowRunDialog,\n\tResumeFlowRunDialog,\n\tRetryFlowRunDialog,\n} from \"@/components/flow-runs/flow-run-actions\";\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\tDropdownMenuSeparator,\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 [isCancelOpen, setIsCancelOpen] = useState(false);\n\tconst [isPauseOpen, setIsPauseOpen] = useState(false);\n\tconst [isResumeOpen, setIsResumeOpen] = useState(false);\n\tconst [isRetryOpen, setIsRetryOpen] = useState(false);\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 canCancel = isStuckState(flowRun.state_type) && flowRun.deployment_id;\n\tconst canPause = isRunningState(flowRun.state_type) && flowRun.deployment_id;\n\tconst canResume = isPausedState(flowRun.state_type);\n\tconst canRetry = isTerminalState(flowRun.state_type) && flowRun.deployment_id;\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{canCancel && (\n\t\t\t\t\t\t<DropdownMenuItem onClick={() => setIsCancelOpen(true)}>\n\t\t\t\t\t\t\tCancel\n\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t)}\n\t\t\t\t\t{canPause && (\n\t\t\t\t\t\t<DropdownMenuItem onClick={() => setIsPauseOpen(true)}>\n\t\t\t\t\t\t\tPause\n\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t)}\n\t\t\t\t\t{canResume && (\n\t\t\t\t\t\t<DropdownMenuItem onClick={() => setIsResumeOpen(true)}>\n\t\t\t\t\t\t\tResume\n\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t)}\n\t\t\t\t\t{canRetry && (\n\t\t\t\t\t\t<DropdownMenuItem onClick={() => setIsRetryOpen(true)}>\n\t\t\t\t\t\t\tRetry\n\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t)}\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{(canCancel ||\n\t\t\t\t\t\tcanPause ||\n\t\t\t\t\t\tcanResume ||\n\t\t\t\t\t\tcanRetry ||\n\t\t\t\t\t\tcanChangeState) && <DropdownMenuSeparator />}\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\t<CancelFlowRunDialog\n\t\t\t\tflowRun={flowRun}\n\t\t\t\topen={isCancelOpen}\n\t\t\t\tonOpenChange={setIsCancelOpen}\n\t\t\t/>\n\t\t\t<PauseFlowRunDialog\n\t\t\t\tflowRun={flowRun}\n\t\t\t\topen={isPauseOpen}\n\t\t\t\tonOpenChange={setIsPauseOpen}\n\t\t\t/>\n\t\t\t<ResumeFlowRunDialog\n\t\t\t\tflowRun={flowRun}\n\t\t\t\topen={isResumeOpen}\n\t\t\t\tonOpenChange={setIsResumeOpen}\n\t\t\t/>\n\t\t\t<RetryFlowRunDialog\n\t\t\t\tflowRun={flowRun}\n\t\t\t\topen={isRetryOpen}\n\t\t\t\tonOpenChange={setIsRetryOpen}\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-s1UJuakA.js"}
|