prefect 3.6.14.dev7__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/events/clients.py +40 -21
- prefect/flow_engine.py +16 -0
- prefect/flows.py +8 -0
- prefect/server/api/concurrency_limits_v2.py +5 -3
- prefect/server/ui-v2/assets/{artifact-card-9Cw_dMVb.js → artifact-card-BclosG8t.js} +2 -2
- prefect/server/ui-v2/assets/{artifact-card-9Cw_dMVb.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-D7nVgckT.js → automation-wizard-Bmgt6nn8.js} +2 -2
- prefect/server/ui-v2/assets/{automation-wizard-D7nVgckT.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-BhEFaDc6.js.map → automation._id-Ccke3KJz.js.map} +1 -1
- prefect/server/ui-v2/assets/{automation_._id.edit-CffnUlbj.js → automation_._id.edit-BlKPUTVf.js} +2 -2
- prefect/server/ui-v2/assets/{automation_._id.edit-CffnUlbj.js.map → automation_._id.edit-BlKPUTVf.js.map} +1 -1
- prefect/server/ui-v2/assets/{automations-header-qb94agIp.js → automations-header-Df2zw3SC.js} +2 -2
- prefect/server/ui-v2/assets/{automations-header-qb94agIp.js.map → automations-header-Df2zw3SC.js.map} +1 -1
- prefect/server/ui-v2/assets/{base-job-template-form-section-DdDSFAJa.js → base-job-template-form-section-oZD6U-RW.js} +2 -2
- prefect/server/ui-v2/assets/{base-job-template-form-section-DdDSFAJa.js.map → base-job-template-form-section-oZD6U-RW.js.map} +1 -1
- prefect/server/ui-v2/assets/{block-type-details-2rIqbqoZ.js → block-type-details-CYrdaLot.js} +2 -2
- prefect/server/ui-v2/assets/{block-type-details-2rIqbqoZ.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-OeCbdPeL.js → block._id-CBgHrpTP.js} +2 -2
- prefect/server/ui-v2/assets/{block._id-OeCbdPeL.js.map → block._id-CBgHrpTP.js.map} +1 -1
- prefect/server/ui-v2/assets/{block_._id.edit-CD22VllN.js → block_._id.edit-CW-kdi4O.js} +2 -2
- prefect/server/ui-v2/assets/{block_._id.edit-CD22VllN.js.map → block_._id.edit-CW-kdi4O.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog-Dj7lYV7b.js → catalog-Brh0kn1I.js} +2 -2
- prefect/server/ui-v2/assets/{catalog-Dj7lYV7b.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-NLgWS8vG.js.map → catalog_._slug-MCgzguIZ.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog_._slug_.create-D0vc1Piy.js → catalog_._slug_.create-DBaeHi9Q.js} +2 -2
- prefect/server/ui-v2/assets/{catalog_._slug_.create-D0vc1Piy.js.map → catalog_._slug_.create-DBaeHi9Q.js.map} +1 -1
- prefect/server/ui-v2/assets/{collapsible-Dgk2Qvjj.js → collapsible-B_NJS0uJ.js} +2 -2
- prefect/server/ui-v2/assets/{collapsible-Dgk2Qvjj.js.map → collapsible-B_NJS0uJ.js.map} +1 -1
- prefect/server/ui-v2/assets/{concurrency-limit._id-BZiyM0NT.js → concurrency-limit._id-qzNUQzQa.js} +2 -2
- prefect/server/ui-v2/assets/{concurrency-limit._id-BZiyM0NT.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-1j1-8yhV.js.map → create-BwXG6EIb.js.map} +1 -1
- prefect/server/ui-v2/assets/{create-H21iiYVl.js → create-MoiIE9Ms.js} +2 -2
- prefect/server/ui-v2/assets/{create-H21iiYVl.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-B9-8JHV7.js.map → delete-confirmation-dialog-CwDK_2QS.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-action-header-DlD2GSJB.js → deployment-action-header-Vp9YsCJO.js} +2 -2
- prefect/server/ui-v2/assets/{deployment-action-header-DlD2GSJB.js.map → deployment-action-header-Vp9YsCJO.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-form-CFcOIeIi.js → deployment-form-CJcg_6DJ.js} +3 -3
- prefect/server/ui-v2/assets/{deployment-form-CFcOIeIi.js.map → deployment-form-CJcg_6DJ.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-links-DN2Oa0r1.js → deployment-links-CIkJIuHh.js} +2 -2
- prefect/server/ui-v2/assets/{deployment-links-DN2Oa0r1.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-C8NPwIIQ.js.map → deployment._id-C6XrGMp_.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment._id-DsVQUPNp.js → deployment._id-CWgTYmTG.js} +2 -2
- prefect/server/ui-v2/assets/{deployment._id-DsVQUPNp.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-4uYFgdPg.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-Z859_W76.js.map → deployment_._id.edit-CnoB0UeG.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment_._id.run-MW5q2SRM.js → deployment_._id.run-BqPK6rTB.js} +2 -2
- prefect/server/ui-v2/assets/{deployment_._id.run-MW5q2SRM.js.map → deployment_._id.run-BqPK6rTB.js.map} +1 -1
- prefect/server/ui-v2/assets/{dropdown-menu-DF4QR3Cp.js → dropdown-menu-D7Gwbd15.js} +2 -2
- prefect/server/ui-v2/assets/{dropdown-menu-DF4QR3Cp.js.map → dropdown-menu-D7Gwbd15.js.map} +1 -1
- prefect/server/ui-v2/assets/{event-resource-display-DR3zL_k_.js → event-resource-display-CDRgVKd4.js} +2 -2
- prefect/server/ui-v2/assets/{event-resource-display-DR3zL_k_.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-DfU7SalU.js.map → event._eventDate._eventId-C73GMDkK.js.map} +1 -1
- prefect/server/ui-v2/assets/flow-run-graph-ckiE3mA9.js +2 -0
- prefect/server/ui-v2/assets/{flow-run-graph-Bf9t75GK.js.map → flow-run-graph-ckiE3mA9.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow-run._id-RL0qeSLl.js → flow-run._id-BukrNCAq.js} +2 -2
- prefect/server/ui-v2/assets/{flow-run._id-RL0qeSLl.js.map → flow-run._id-BukrNCAq.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow-run._id-DTsj_xO3.js → flow-run._id-CtI5VZ2M.js} +2 -2
- prefect/server/ui-v2/assets/{flow-run._id-DTsj_xO3.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-s1UJuakA.js.map +1 -0
- prefect/server/ui-v2/assets/{flow-runs-pagination-Bfelp8UO.js → flow-runs-pagination-SLbYtvaR.js} +2 -2
- prefect/server/ui-v2/assets/{flow-runs-pagination-Bfelp8UO.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-DuQ5AUjj.js.map → flow._id-CZ5P0v4N.js.map} +1 -1
- prefect/server/ui-v2/assets/{form-DHWphysD.js → form-mws4law8.js} +2 -2
- prefect/server/ui-v2/assets/{form-DHWphysD.js.map → form-mws4law8.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-BK_NuSng.js → header-Bes1LmY7.js} +2 -2
- prefect/server/ui-v2/assets/{header-BK_NuSng.js.map → header-Bes1LmY7.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-nu-ZKuen.js → header-Bj_zBR-a.js} +2 -2
- prefect/server/ui-v2/assets/{header-nu-ZKuen.js.map → header-Bj_zBR-a.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-B9SuuoZx.js → header-CPxTHSvz.js} +2 -2
- prefect/server/ui-v2/assets/{header-B9SuuoZx.js.map → header-CPxTHSvz.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-_0OOjqn5.js → index-B8vo2Lrg.js} +5 -5
- prefect/server/ui-v2/assets/{index-_0OOjqn5.js.map → index-B8vo2Lrg.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DsK1RlS9.js → index-BBeh-3Nh.js} +2 -2
- prefect/server/ui-v2/assets/{index-DsK1RlS9.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-Dl_iSX0z.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-BPXdHXTb.js → index-CS-zxv7Z.js} +2 -2
- prefect/server/ui-v2/assets/{index-BPXdHXTb.js.map → index-CS-zxv7Z.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CPFMHkRh.js → index-CToHKh4q.js} +2 -2
- prefect/server/ui-v2/assets/{index-CPFMHkRh.js.map → index-CToHKh4q.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DSBmxhwG.js → index-CUVvZndW.js} +2 -2
- prefect/server/ui-v2/assets/{index-DSBmxhwG.js.map → index-CUVvZndW.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-mj9GNKt7.js → index-CYVn-I3i.js} +2 -2
- prefect/server/ui-v2/assets/{index-mj9GNKt7.js.map → index-CYVn-I3i.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DFS5GNpT.js → index-Cun0JN4t.js} +2 -2
- prefect/server/ui-v2/assets/{index-DFS5GNpT.js.map → index-Cun0JN4t.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DcMpyvW7.js → index-D6ynV6U7.js} +2 -2
- prefect/server/ui-v2/assets/{index-DcMpyvW7.js.map → index-D6ynV6U7.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DVsNA4UN.js → index-DdNUJLRW.js} +2 -2
- prefect/server/ui-v2/assets/{index-DVsNA4UN.js.map → index-DdNUJLRW.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-vRbn9rG4.js → index-DlHOXQhu.js} +2 -2
- prefect/server/ui-v2/assets/{index-vRbn9rG4.js.map → index-DlHOXQhu.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-Cj5ihRiw.js → index-DyVw8YE8.js} +2 -2
- prefect/server/ui-v2/assets/{index-Cj5ihRiw.js.map → index-DyVw8YE8.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DNuhJlQK.js → index-DzRz7D2P.js} +2 -2
- prefect/server/ui-v2/assets/{index-DNuhJlQK.js.map → index-DzRz7D2P.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DtrQRjt_.js → index-DzUcVNZg.js} +2 -2
- prefect/server/ui-v2/assets/{index-DtrQRjt_.js.map → index-DzUcVNZg.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-BCR-yD58.js → index-IBvMMs6S.js} +2 -2
- prefect/server/ui-v2/assets/{index-BCR-yD58.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-DWGx9irM.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-C0MMjoUe.js → index-wOvyf10b.js} +2 -2
- prefect/server/ui-v2/assets/{index-C0MMjoUe.js.map → index-wOvyf10b.js.map} +1 -1
- prefect/server/ui-v2/assets/{json-input-CMZiW5M2.js → json-input-Ce-HlRqa.js} +2 -2
- prefect/server/ui-v2/assets/{json-input-CMZiW5M2.js.map → json-input-Ce-HlRqa.js.map} +1 -1
- prefect/server/ui-v2/assets/key-value-XHEZOtZX.js +2 -0
- prefect/server/ui-v2/assets/key-value-XHEZOtZX.js.map +1 -0
- prefect/server/ui-v2/assets/{key._key-CdonPtNh.js → key._key-LpsMf3zD.js} +2 -2
- prefect/server/ui-v2/assets/{key._key-CdonPtNh.js.map → key._key-LpsMf3zD.js.map} +1 -1
- prefect/server/ui-v2/assets/{lazy-markdown-CKcd9ksG.js → lazy-markdown-1Hz0xzca.js} +2 -2
- prefect/server/ui-v2/assets/{lazy-markdown-CKcd9ksG.js.map → lazy-markdown-1Hz0xzca.js.map} +1 -1
- prefect/server/ui-v2/assets/{login-Dnd-tV90.js → login-D5uepl9L.js} +2 -2
- prefect/server/ui-v2/assets/{login-Dnd-tV90.js.map → login-D5uepl9L.js.map} +1 -1
- prefect/server/ui-v2/assets/{markdown-input-D6rfyTa_.js → markdown-input-CG6M9zD0.js} +2 -2
- prefect/server/ui-v2/assets/{markdown-input-D6rfyTa_.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-eWuRXCxE.js.map → python-example-snippet-DRHcUlCX.js.map} +1 -1
- prefect/server/ui-v2/assets/{python-input-itfwkkBT.js → python-input-BsUS8fw1.js} +2 -2
- prefect/server/ui-v2/assets/{python-input-itfwkkBT.js.map → python-input-BsUS8fw1.js.map} +1 -1
- prefect/server/ui-v2/assets/{radio-group-DeN-_krn.js → radio-group-BUsmwdrt.js} +2 -2
- prefect/server/ui-v2/assets/{radio-group-DeN-_krn.js.map → radio-group-BUsmwdrt.js.map} +1 -1
- prefect/server/ui-v2/assets/{route-error-state-tYzhKCqH.js → route-error-state-BFBpiIhD.js} +2 -2
- prefect/server/ui-v2/assets/{route-error-state-tYzhKCqH.js.map → route-error-state-BFBpiIhD.js.map} +1 -1
- prefect/server/ui-v2/assets/{schema-form-DDUzvjpL.js → schema-form-BwTmkvJk.js} +2 -2
- prefect/server/ui-v2/assets/{schema-form-DDUzvjpL.js.map → schema-form-BwTmkvJk.js.map} +1 -1
- prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-DrpJmvST.js → schema-form-input-string-format-datetime-nrb3g-JJ.js} +4 -4
- prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-DrpJmvST.js.map → schema-form-input-string-format-datetime-nrb3g-JJ.js.map} +1 -1
- prefect/server/ui-v2/assets/{settings-OdrJDFrk.js → settings-CUBtK5aW.js} +2 -2
- prefect/server/ui-v2/assets/{settings-OdrJDFrk.js.map → settings-CUBtK5aW.js.map} +1 -1
- prefect/server/ui-v2/assets/{sort-filter-DaBGDmua.js → sort-filter-Cv8zAXMp.js} +2 -2
- prefect/server/ui-v2/assets/{sort-filter-DaBGDmua.js.map → sort-filter-Cv8zAXMp.js.map} +1 -1
- prefect/server/ui-v2/assets/{table-4GUC4YOD.js → table-BBNGfPra.js} +2 -2
- prefect/server/ui-v2/assets/{table-4GUC4YOD.js.map → table-BBNGfPra.js.map} +1 -1
- prefect/server/ui-v2/assets/{tags-input-BvH9UY8h.js → tags-input-DHrnkwjQ.js} +2 -2
- prefect/server/ui-v2/assets/{tags-input-BvH9UY8h.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-CLZz3kwW.js.map → task-run-concurrency-limits-reset-dialog-Z8-yFZ2_.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-run._id-DgXFfCuq.js → task-run._id-BY58gqs2.js} +2 -2
- prefect/server/ui-v2/assets/{task-run._id-DgXFfCuq.js.map → task-run._id-BY58gqs2.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-run._id-DHHzTQ9d.js → task-run._id-u73Jxfqw.js} +3 -3
- prefect/server/ui-v2/assets/{task-run._id-DHHzTQ9d.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-fR9zqj38.js.map → task-runs-pagination-DUy3147A.js.map} +1 -1
- prefect/server/ui-v2/assets/{textarea-DL9UCBaB.js → textarea-DUhh6-kq.js} +2 -2
- prefect/server/ui-v2/assets/{textarea-DL9UCBaB.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-qBEoPcyO.js.map → timezone-select-D4Q6VBtD.js.map} +1 -1
- prefect/server/ui-v2/assets/{toggle-group-Cf-ZSSDP.js → toggle-group-7WUJn2Tx.js} +2 -2
- prefect/server/ui-v2/assets/{toggle-group-Cf-ZSSDP.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-DRX9Kvie.js.map → use-delete-automation-confirmation-dialog-D4AD5Ndf.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-CogrfdiO.js → use-delete-block-document-confirmation-dialog-DnwWEGUY.js} +2 -2
- prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-CogrfdiO.js.map → use-delete-block-document-confirmation-dialog-DnwWEGUY.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-CdMKKvm5.js → use-flow-runs-selected-rows-C-tehPRB.js} +2 -2
- prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-CdMKKvm5.js.map → use-flow-runs-selected-rows-C-tehPRB.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-Be1qg-IF.js → use-get-artifacts-flow-task-runs-DRWRrmrb.js} +2 -2
- prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-Be1qg-IF.js.map → use-get-artifacts-flow-task-runs-DRWRrmrb.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-quick-run-DXDfXpvs.js → use-quick-run-B4Xj-YQQ.js} +2 -2
- prefect/server/ui-v2/assets/{use-quick-run-DXDfXpvs.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-Dhkg1tqx.js.map → use-state-favicon-au2TZdMV.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-stepper-jTTsXpho.js → use-stepper-DyIb3vlq.js} +2 -2
- prefect/server/ui-v2/assets/{use-stepper-jTTsXpho.js.map → use-stepper-DyIb3vlq.js.map} +1 -1
- prefect/server/ui-v2/assets/{utilities-CgJi7g2F.js → utilities-D9Y2wo66.js} +2 -2
- prefect/server/ui-v2/assets/{utilities-CgJi7g2F.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-DLkRAAHz.js → work-pool-filter-CSOATj2D.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool-filter-DLkRAAHz.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-BFodtXQe.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-Bjh_bO5G.js.map → work-pool._workPoolName-B_NFWXKS.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-B-gnp5dc.js → work-pool_._workPoolName.edit-Cyzn8g-S.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-B-gnp5dc.js.map → work-pool_._workPoolName.edit-Cyzn8g-S.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-C7aVwLhH.js → work-pool_._workPoolName.queue._workQueueName-DQzqQWPT.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-C7aVwLhH.js.map → work-pool_._workPoolName.queue._workQueueName-DQzqQWPT.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-queue-icon-text-BK_qfkJJ.js → work-queue-icon-text-BOpcJ8YU.js} +2 -2
- prefect/server/ui-v2/assets/{work-queue-icon-text-BK_qfkJJ.js.map → work-queue-icon-text-BOpcJ8YU.js.map} +1 -1
- prefect/server/ui-v2/index.html +3 -3
- prefect/testing/fixtures.py +14 -13
- {prefect-3.6.14.dev7.dist-info → prefect-3.6.16.dev2.dist-info}/METADATA +3 -2
- {prefect-3.6.14.dev7.dist-info → prefect-3.6.16.dev2.dist-info}/RECORD +225 -211
- prefect/server/ui-v2/assets/artifact._id-zuZ8P2RD.js +0 -2
- prefect/server/ui-v2/assets/artifact._id-zuZ8P2RD.js.map +0 -1
- prefect/server/ui-v2/assets/automation._id-BhEFaDc6.js +0 -2
- prefect/server/ui-v2/assets/block-type-logo-DV1pSkV0.js +0 -2
- prefect/server/ui-v2/assets/block-type-logo-DV1pSkV0.js.map +0 -1
- prefect/server/ui-v2/assets/catalog_._slug-NLgWS8vG.js +0 -2
- prefect/server/ui-v2/assets/create-1j1-8yhV.js +0 -2
- prefect/server/ui-v2/assets/data-table-DHlbTUL7.js +0 -2
- prefect/server/ui-v2/assets/data-table-DHlbTUL7.js.map +0 -1
- prefect/server/ui-v2/assets/delete-confirmation-dialog-B9-8JHV7.js +0 -2
- prefect/server/ui-v2/assets/deployment._id-C8NPwIIQ.js +0 -2
- prefect/server/ui-v2/assets/deployment_._id.duplicate-4uYFgdPg.js +0 -2
- prefect/server/ui-v2/assets/deployment_._id.edit-Z859_W76.js +0 -2
- prefect/server/ui-v2/assets/event._eventDate._eventId-DfU7SalU.js +0 -2
- prefect/server/ui-v2/assets/flow-run-graph-Bf9t75GK.js +0 -2
- prefect/server/ui-v2/assets/flow-run._id-33WKPXsZ.js +0 -4
- prefect/server/ui-v2/assets/flow-run._id-33WKPXsZ.js.map +0 -1
- prefect/server/ui-v2/assets/flow._id-DuQ5AUjj.js +0 -2
- prefect/server/ui-v2/assets/index-BqwU5GSv.js +0 -2
- prefect/server/ui-v2/assets/index-BqwU5GSv.js.map +0 -1
- prefect/server/ui-v2/assets/index-Br7MUvka.css +0 -1
- prefect/server/ui-v2/assets/index-CYjH7t93.js +0 -2
- prefect/server/ui-v2/assets/index-CYjH7t93.js.map +0 -1
- prefect/server/ui-v2/assets/index-CqUa3fbN.js +0 -2
- prefect/server/ui-v2/assets/index-CqUa3fbN.js.map +0 -1
- prefect/server/ui-v2/assets/index-DWGx9irM.js +0 -2
- prefect/server/ui-v2/assets/index-Dl_iSX0z.js +0 -2
- prefect/server/ui-v2/assets/python-example-snippet-eWuRXCxE.js +0 -3
- prefect/server/ui-v2/assets/task-run-concurrency-limits-reset-dialog-CLZz3kwW.js +0 -2
- prefect/server/ui-v2/assets/task-runs-pagination-fR9zqj38.js +0 -2
- prefect/server/ui-v2/assets/timezone-select-qBEoPcyO.js +0 -2
- prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-DRX9Kvie.js +0 -2
- prefect/server/ui-v2/assets/use-state-favicon-Dhkg1tqx.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-BFodtXQe.js +0 -2
- prefect/server/ui-v2/assets/work-pool._workPoolName-Bjh_bO5G.js +0 -2
- {prefect-3.6.14.dev7.dist-info → prefect-3.6.16.dev2.dist-info}/WHEEL +0 -0
- {prefect-3.6.14.dev7.dist-info → prefect-3.6.16.dev2.dist-info}/entry_points.txt +0 -0
- {prefect-3.6.14.dev7.dist-info → prefect-3.6.16.dev2.dist-info}/licenses/LICENSE +0 -0
prefect/server/ui-v2/assets/{flow-run-graph-Bf9t75GK.js.map → flow-run-graph-ckiE3mA9.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow-run-graph-Bf9t75GK.js","sources":["../../src/components/flow-runs/flow-run-graph/api.ts","../../src/components/flow-runs/flow-run-graph/consts.ts","../../src/components/flow-runs/flow-run-graph/utilities.ts","../../src/components/flow-runs/flow-run-graph/flow-run-graph-center-button.tsx","../../src/components/flow-runs/flow-run-graph/flow-run-graph-fullscreen-button.tsx","../../src/components/flow-runs/flow-run-graph/flow-run-graph-settings.tsx","../../src/components/flow-runs/flow-run-graph/flow-run-graph-settings-button.tsx","../../src/components/flow-runs/flow-run-graph/flow-run-graph-actions.tsx","../../src/components/flow-runs/flow-run-graph/flow-run-graph-artifact-drawer.tsx","../../src/components/flow-runs/flow-run-graph/flow-run-graph-artifacts-popover.tsx","../../src/components/flow-runs/flow-run-graph/flow-run-graph-event-popover.tsx","../../src/components/flow-runs/flow-run-graph/flow-run-graph-events-popover.tsx","../../src/components/flow-runs/flow-run-graph/flow-run-graph-selection-panel.tsx","../../src/components/flow-runs/flow-run-graph/flow-run-graph-state-popover.tsx","../../src/components/flow-runs/flow-run-graph/flow-run-graph.tsx"],"sourcesContent":["import type {\n\tEventRelatedResource,\n\tRunGraphArtifact,\n\tRunGraphData,\n\tRunGraphEvent,\n\tRunGraphEventResource,\n\tRunGraphFetchEventsContext,\n\tRunGraphNode,\n\tRunGraphStateEvent,\n} from \"@prefecthq/graphs\";\nimport { parseISO } from \"date-fns\";\nimport type { components } from \"@/api/prefect\";\nimport { getQueryService } from \"@/api/service\";\n\n/**\n * Fetches the graph data for a flow run.\n * @param id - The ID of the flow run.\n * @returns The graph data for the flow run.\n */\nexport async function fetchFlowRunGraph(id: string): Promise<RunGraphData> {\n\tconst { data } = await (await getQueryService()).GET(\n\t\t\"/flow_runs/{id}/graph-v2\",\n\t\t{\n\t\t\tparams: { path: { id } },\n\t\t},\n\t);\n\n\tif (!data) {\n\t\tthrow new Error(\"No data returned from API\");\n\t}\n\n\treturn mapApiResponseToRunGraphData(data);\n}\n\n/**\n * Fetches events for a flow run.\n * @param since - The start date of the events to fetch.\n * @param until - The end date of the events to fetch.\n * @param nodeId - The flowRunId of the node to fetch events for.\n * @returns The events for the flow run.\n */\nexport async function fetchFlowRunEvents({\n\tsince,\n\tuntil,\n\tnodeId,\n}: RunGraphFetchEventsContext): Promise<RunGraphEvent[]> {\n\tconst { data } = await (await getQueryService()).POST(\"/events/filter\", {\n\t\tbody: {\n\t\t\tfilter: {\n\t\t\t\tany_resource: {\n\t\t\t\t\tid: [`prefect.flow-run.${nodeId}`],\n\t\t\t\t},\n\t\t\t\tevent: {\n\t\t\t\t\texclude_prefix: [\"prefect.log.write\", \"prefect.task-run.\"],\n\t\t\t\t},\n\t\t\t\toccurred: {\n\t\t\t\t\tsince: since.toISOString(),\n\t\t\t\t\tuntil: until.toISOString(),\n\t\t\t\t},\n\t\t\t\torder: \"ASC\",\n\t\t\t},\n\t\t\tlimit: 50,\n\t\t},\n\t});\n\n\tif (!data) {\n\t\tthrow new Error(\"No data returned from API\");\n\t}\n\n\treturn mapApiResponseToRunGraphEvents(data);\n}\n\ntype GraphResponse = components[\"schemas\"][\"Graph\"];\ntype GraphResponseNode = GraphResponse[\"nodes\"][number];\ntype GraphResponseArtifact = GraphResponse[\"artifacts\"][number];\ntype GraphResponseState = NonNullable<GraphResponse[\"states\"]>[number];\ntype EventsResponse = components[\"schemas\"][\"EventPage\"];\n\nfunction mapApiResponseToRunGraphData(response: GraphResponse): RunGraphData {\n\tif (!response.start_time) {\n\t\tthrow new Error(\"Start time is required\");\n\t}\n\n\treturn {\n\t\troot_node_ids: response.root_node_ids,\n\t\tstart_time: parseISO(response.start_time),\n\t\tend_time: response.end_time ? parseISO(response.end_time) : null,\n\t\tnodes: new Map(response.nodes.map((node) => mapNode(node))),\n\t\tstates: response.states?.map(mapState) ?? [],\n\t};\n}\n\nexport function mapApiResponseToRunGraphEvents(\n\tresponse: EventsResponse,\n): RunGraphEvent[] {\n\treturn response.events.map((event) => {\n\t\tif (!event.received) {\n\t\t\tthrow new Error(\"Received is required\");\n\t\t}\n\n\t\tconst runGraphEvent: RunGraphEvent = {\n\t\t\tid: event.id,\n\t\t\treceived: parseISO(event.received),\n\t\t\toccurred: parseISO(event.occurred),\n\t\t\tevent: event.event,\n\t\t\tresource: event.resource as RunGraphEventResource,\n\t\t\tpayload: event.payload,\n\t\t\trelated: (event.related ?? []) as EventRelatedResource[],\n\t\t};\n\n\t\treturn runGraphEvent;\n\t});\n}\n\nfunction mapNode([id, node]: GraphResponseNode): [string, RunGraphNode] {\n\tif (!node.start_time) {\n\t\tthrow new Error(\"Start time is required\");\n\t}\n\n\treturn [\n\t\tid,\n\t\t{\n\t\t\tkind: node.kind,\n\t\t\tid: node.id,\n\t\t\tlabel: node.label,\n\t\t\tstate_type: node.state_type,\n\t\t\tstart_time: parseISO(node.start_time),\n\t\t\tend_time: node.end_time ? parseISO(node.end_time) : null,\n\t\t\tparents: node.parents,\n\t\t\tchildren: node.children,\n\t\t\tartifacts: node.artifacts.map(mapArtifact),\n\t\t},\n\t];\n}\n\nfunction mapState(state: GraphResponseState): RunGraphStateEvent {\n\treturn {\n\t\tid: state.id,\n\t\ttimestamp: parseISO(state.timestamp),\n\t\ttype: state.type,\n\t\tname: state.name,\n\t};\n}\n\nfunction mapArtifact(artifact: GraphResponseArtifact): RunGraphArtifact {\n\tif (!artifact.type) {\n\t\tthrow new Error(\"Artifact type is required\");\n\t}\n\n\tif (artifact.type === \"progress\" && typeof artifact.data === \"number\") {\n\t\treturn {\n\t\t\tid: artifact.id,\n\t\t\tcreated: parseISO(artifact.created),\n\t\t\tkey: artifact.key ?? undefined,\n\t\t\ttype: artifact.type,\n\t\t\tdata: artifact.data,\n\t\t};\n\t}\n\n\treturn {\n\t\tid: artifact.id,\n\t\tcreated: parseISO(artifact.created),\n\t\tkey: artifact.key ?? undefined,\n\t\ttype: artifact.type as Exclude<RunGraphArtifact[\"type\"], \"progress\">,\n\t};\n}\n","import type { StateType } from \"@prefecthq/graphs\";\n\n/**\n * Shade values for each state type, used with getStateColor().\n * Different states use different shades for visual distinction.\n * See: ui-v2/src/index.css for the CSS variable definitions.\n */\nexport const stateTypeShades: Record<StateType, number> = {\n\tCOMPLETED: 600,\n\tRUNNING: 700,\n\tSCHEDULED: 700,\n\tPENDING: 800,\n\tFAILED: 700,\n\tCANCELLED: 600,\n\tCANCELLING: 600,\n\tCRASHED: 600,\n\tPAUSED: 800,\n};\n","export function isEventTargetInput(target: EventTarget | null): boolean {\n\tif (!target || !(target instanceof HTMLElement)) {\n\t\treturn false;\n\t}\n\treturn [\"INPUT\", \"TEXTAREA\", \"SELECT\"].includes(target.tagName);\n}\n","import { centerViewport } from \"@prefecthq/graphs\";\nimport { useEffect } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons/icon\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { isEventTargetInput } from \"./utilities\";\n\nconst center = () => {\n\tvoid centerViewport({ animate: true });\n};\n\nexport function FlowRunGraphCenterButton() {\n\tuseEffect(() => {\n\t\tconst controller = new AbortController();\n\n\t\tdocument.addEventListener(\n\t\t\t\"keydown\",\n\t\t\t(event: KeyboardEvent) => {\n\t\t\t\tif (\n\t\t\t\t\tisEventTargetInput(event.target) ||\n\t\t\t\t\tevent.metaKey ||\n\t\t\t\t\tevent.ctrlKey\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (event.key === \"c\") {\n\t\t\t\t\tcenter();\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ signal: controller.signal },\n\t\t);\n\n\t\treturn () => controller.abort();\n\t}, []);\n\n\treturn (\n\t\t<Tooltip>\n\t\t\t<TooltipTrigger asChild>\n\t\t\t\t<Button variant=\"ghost\" size=\"icon\" onClick={center}>\n\t\t\t\t\t<Icon id=\"Crosshair\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t</TooltipTrigger>\n\t\t\t<TooltipContent>Recenter (c)</TooltipContent>\n\t\t</Tooltip>\n\t);\n}\n","import { useCallback, useEffect } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons/icon\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { isEventTargetInput } from \"./utilities\";\n\ntype FlowRunGraphFullscreenButtonProps = {\n\tfullscreen: boolean;\n\tonFullscreenChange: (fullscreen: boolean) => void;\n};\n\nexport function FlowRunGraphFullscreenButton({\n\tfullscreen,\n\tonFullscreenChange,\n}: FlowRunGraphFullscreenButtonProps) {\n\tconst toggleFullscreen = useCallback(() => {\n\t\tonFullscreenChange(!fullscreen);\n\t}, [fullscreen, onFullscreenChange]);\n\n\tuseEffect(() => {\n\t\tconst controller = new AbortController();\n\n\t\tdocument.addEventListener(\n\t\t\t\"keydown\",\n\t\t\t(event: KeyboardEvent) => {\n\t\t\t\tif (\n\t\t\t\t\tisEventTargetInput(event.target) ||\n\t\t\t\t\tevent.metaKey ||\n\t\t\t\t\tevent.ctrlKey\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (event.key === \"f\") {\n\t\t\t\t\ttoggleFullscreen();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (event.key === \"Escape\") {\n\t\t\t\t\ttoggleFullscreen();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ signal: controller.signal },\n\t\t);\n\n\t\treturn () => controller.abort();\n\t}, [toggleFullscreen]);\n\n\treturn (\n\t\t<Tooltip>\n\t\t\t<TooltipTrigger asChild>\n\t\t\t\t<Button variant=\"ghost\" size=\"icon\" onClick={toggleFullscreen}>\n\t\t\t\t\t<Icon id=\"Expand\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t</TooltipTrigger>\n\t\t\t<TooltipContent>Fullscreen (f)</TooltipContent>\n\t\t</Tooltip>\n\t);\n}\n","import {\n\tDEFAULT_HORIZONTAL_SCALE_MULTIPLIER,\n\ttype HorizontalMode,\n\tisHorizontalMode,\n\tisVerticalMode,\n\tlayout,\n\tresetHorizontalScaleMultiplier,\n\tsetDisabledArtifacts,\n\tsetDisabledEdges,\n\tsetDisabledEvents,\n\tsetHorizontalMode,\n\tsetHorizontalScaleMultiplier,\n\tsetVerticalMode,\n\ttype VerticalMode,\n} from \"@prefecthq/graphs\";\nimport { useCallback, useState } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Label } from \"@/components/ui/label\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { Typography } from \"@/components/ui/typography\";\n\ntype LayoutOption = `${HorizontalMode}_${VerticalMode}`;\n\nconst layoutOptions: { label: string; value: LayoutOption }[] = [\n\t{\n\t\tlabel: \"Temporal dependency\",\n\t\tvalue: \"temporal_nearest-parent\",\n\t},\n\t{\n\t\tlabel: \"Temporal sequence\",\n\t\tvalue: \"temporal_waterfall\",\n\t},\n\t{\n\t\tlabel: \"Dependency grid\",\n\t\tvalue: \"dependency_nearest-parent\",\n\t},\n\t{\n\t\tlabel: \"Sequential grid\",\n\t\tvalue: \"dependency_waterfall\",\n\t},\n\t{\n\t\tlabel: \"Comparative duration\",\n\t\tvalue: \"left-aligned_duration-sorted\",\n\t},\n];\n\nconst increaseScale = () => {\n\tconst multiplier = DEFAULT_HORIZONTAL_SCALE_MULTIPLIER + 1;\n\tconst scale = layout.horizontalScaleMultiplier * multiplier;\n\tsetHorizontalScaleMultiplier(scale);\n};\n\nconst decreaseScale = () => {\n\tconst multiplier = Math.abs(DEFAULT_HORIZONTAL_SCALE_MULTIPLIER - 1);\n\tconst scale = layout.horizontalScaleMultiplier * multiplier;\n\tsetHorizontalScaleMultiplier(scale);\n};\n\nconst resetScale = () => {\n\tresetHorizontalScaleMultiplier();\n};\n\nfunction isLayoutOption(value: string): value is LayoutOption {\n\tconst [horizontal, vertical] = value.split(\"_\");\n\treturn isHorizontalMode(horizontal) && isVerticalMode(vertical);\n}\n\nexport function FlowRunGraphSettings() {\n\tconst [selectedLayoutOption, setSelectedLayoutOption] = useState(\n\t\t`${layout.horizontal}_${layout.vertical}`,\n\t);\n\tconst [hideEdges, setHideEdges] = useState(layout.disableEdges);\n\tconst [hideArtifacts, setHideArtifacts] = useState(layout.disableArtifacts);\n\tconst [hideEvents, setHideEvents] = useState(layout.disableEvents);\n\n\tconst handleLayoutChange = useCallback((value: string) => {\n\t\tif (!isLayoutOption(value)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst [horizontal, vertical] = value.split(\"_\");\n\n\t\tif (!isHorizontalMode(horizontal) || !isVerticalMode(vertical)) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetSelectedLayoutOption(value);\n\t\tsetHorizontalMode(horizontal);\n\t\tsetVerticalMode(vertical);\n\t}, []);\n\n\tconst handleHideEdgesChange = useCallback((value: boolean) => {\n\t\tsetHideEdges(value);\n\t\tsetDisabledEdges(value);\n\t}, []);\n\n\tconst handleHideArtifactsChange = useCallback((value: boolean) => {\n\t\tsetHideArtifacts(value);\n\t\tsetDisabledArtifacts(value);\n\t}, []);\n\n\tconst handleHideEventsChange = useCallback((value: boolean) => {\n\t\tsetHideEvents(value);\n\t\tsetDisabledEvents(value);\n\t}, []);\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t<Typography variant=\"bodyLarge\">Layout</Typography>\n\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t{layoutOptions.map((option) => (\n\t\t\t\t\t\t<div key={option.value} className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\t\t\tid={option.value}\n\t\t\t\t\t\t\t\tname=\"layout\"\n\t\t\t\t\t\t\t\tvalue={option.value}\n\t\t\t\t\t\t\t\tchecked={selectedLayoutOption === option.value}\n\t\t\t\t\t\t\t\tonChange={(e) => handleLayoutChange(e.target.value)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Label htmlFor={option.value}>{option.label}</Label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{(layout.isTemporal() || layout.isLeftAligned()) && (\n\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t<Typography variant=\"bodyLarge\">Scaling</Typography>\n\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\tonClick={decreaseScale}\n\t\t\t\t\t\t\ttitle=\"Decrease scale (-)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t-\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\tonClick={increaseScale}\n\t\t\t\t\t\t\ttitle=\"Increase scale (+)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t+\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Button variant=\"outline\" size=\"sm\" onClick={resetScale}>\n\t\t\t\t\t\t\tReset\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<hr className=\"my-4\" />\n\n\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<Switch\n\t\t\t\t\t\tid=\"hideEdges\"\n\t\t\t\t\t\tchecked={hideEdges}\n\t\t\t\t\t\tonCheckedChange={handleHideEdgesChange}\n\t\t\t\t\t/>\n\t\t\t\t\t<Label htmlFor=\"hideEdges\">Hide dependency arrows</Label>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<Switch\n\t\t\t\t\t\tid=\"hideArtifacts\"\n\t\t\t\t\t\tchecked={hideArtifacts}\n\t\t\t\t\t\tonCheckedChange={handleHideArtifactsChange}\n\t\t\t\t\t/>\n\t\t\t\t\t<Label htmlFor=\"hideArtifacts\">Hide artifacts</Label>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<Switch\n\t\t\t\t\t\tid=\"hideEvents\"\n\t\t\t\t\t\tchecked={hideEvents}\n\t\t\t\t\t\tonCheckedChange={handleHideEventsChange}\n\t\t\t\t\t/>\n\t\t\t\t\t<Label htmlFor=\"hideEvents\">Hide events</Label>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons/icon\";\nimport {\n\tPopover,\n\tPopoverContent,\n\tPopoverTrigger,\n} from \"@/components/ui/popover\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { FlowRunGraphSettings } from \"./flow-run-graph-settings\";\n\nexport function FlowRunGraphSettingsButton() {\n\treturn (\n\t\t<Popover>\n\t\t\t<PopoverTrigger>\n\t\t\t\t<Tooltip>\n\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t<Button variant=\"ghost\" size=\"icon\">\n\t\t\t\t\t\t\t<Icon id=\"Cog\" className=\"size-4\" />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t<TooltipContent>Settings</TooltipContent>\n\t\t\t\t</Tooltip>\n\t\t\t</PopoverTrigger>\n\t\t\t<PopoverContent>\n\t\t\t\t<FlowRunGraphSettings />\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n}\n","import { FlowRunGraphCenterButton } from \"./flow-run-graph-center-button\";\nimport { FlowRunGraphFullscreenButton } from \"./flow-run-graph-fullscreen-button\";\nimport { FlowRunGraphSettingsButton } from \"./flow-run-graph-settings-button\";\n\ntype FlowRunGraphActionsProps = {\n\tfullscreen: boolean;\n\tonFullscreenChange: (fullscreen: boolean) => void;\n};\n\nexport function FlowRunGraphActions({\n\tfullscreen,\n\tonFullscreenChange,\n}: FlowRunGraphActionsProps) {\n\treturn (\n\t\t<div className=\"flex gap-2\">\n\t\t\t<FlowRunGraphCenterButton />\n\t\t\t<FlowRunGraphFullscreenButton\n\t\t\t\tfullscreen={fullscreen}\n\t\t\t\tonFullscreenChange={onFullscreenChange}\n\t\t\t/>\n\t\t\t<FlowRunGraphSettingsButton />\n\t\t</div>\n\t);\n}\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { Suspense } from \"react\";\nimport { buildGetArtifactQuery } from \"@/api/artifacts\";\nimport { FormattedDate } from \"@/components/ui/formatted-date/formatted-date\";\nimport { KeyValue } from \"@/components/ui/key-value\";\nimport {\n\tSheet,\n\tSheetContent,\n\tSheetHeader,\n\tSheetTitle,\n} from \"@/components/ui/sheet\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { Typography } from \"@/components/ui/typography\";\n\ntype FlowRunGraphArtifactDrawerProps = {\n\tartifactId: string | null;\n\tonClose: () => void;\n};\n\nexport function FlowRunGraphArtifactDrawer({\n\tartifactId,\n\tonClose,\n}: FlowRunGraphArtifactDrawerProps) {\n\treturn (\n\t\t<Sheet\n\t\t\topen={artifactId !== null}\n\t\t\tonOpenChange={(open) => !open && onClose()}\n\t\t>\n\t\t\t<SheetContent>\n\t\t\t\t<SheetHeader>\n\t\t\t\t\t<SheetTitle>Artifact Details</SheetTitle>\n\t\t\t\t</SheetHeader>\n\t\t\t\t{artifactId && (\n\t\t\t\t\t<Suspense fallback={<ArtifactContentSkeleton />}>\n\t\t\t\t\t\t<ArtifactContent artifactId={artifactId} />\n\t\t\t\t\t</Suspense>\n\t\t\t\t)}\n\t\t\t</SheetContent>\n\t\t</Sheet>\n\t);\n}\n\nfunction ArtifactContentSkeleton() {\n\treturn (\n\t\t<div className=\"space-y-4 p-4\">\n\t\t\t<Skeleton className=\"h-6 w-32\" />\n\t\t\t<Skeleton className=\"h-4 w-24\" />\n\t\t\t<Skeleton className=\"h-4 w-48\" />\n\t\t\t<Skeleton className=\"h-32 w-full\" />\n\t\t</div>\n\t);\n}\n\nfunction ArtifactContent({ artifactId }: { artifactId: string }) {\n\tconst { data: artifact } = useSuspenseQuery(\n\t\tbuildGetArtifactQuery(artifactId),\n\t);\n\n\treturn (\n\t\t<div className=\"space-y-4 p-4\">\n\t\t\t<KeyValue\n\t\t\t\tlabel=\"Key\"\n\t\t\t\tvalue={\n\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"font-medium\">\n\t\t\t\t\t\t{artifact.key ?? \"Unnamed\"}\n\t\t\t\t\t</Typography>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t{artifact.type && (\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Type\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"uppercase\">\n\t\t\t\t\t\t\t{artifact.type}\n\t\t\t\t\t\t</Typography>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{artifact.description && (\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Description\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<Typography variant=\"bodySmall\">{artifact.description}</Typography>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{artifact.created && (\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Created\"\n\t\t\t\t\tvalue={<FormattedDate date={artifact.created} />}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{artifact.data !== undefined && artifact.data !== null && (\n\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t\tData\n\t\t\t\t\t</Typography>\n\t\t\t\t\t<pre className=\"bg-muted p-3 rounded-md text-sm overflow-auto max-h-64\">\n\t\t\t\t\t\t{typeof artifact.data === \"string\"\n\t\t\t\t\t\t\t? artifact.data\n\t\t\t\t\t\t\t: JSON.stringify(artifact.data, null, 2)}\n\t\t\t\t\t</pre>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { ArtifactsSelection } from \"@prefecthq/graphs\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { buildListArtifactsQuery } from \"@/api/artifacts\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\nimport {\n\tPopover,\n\tPopoverAnchor,\n\tPopoverContent,\n} from \"@/components/ui/popover\";\nimport { Typography } from \"@/components/ui/typography\";\n\ntype FlowRunGraphArtifactsPopoverProps = {\n\tselection: ArtifactsSelection;\n\tonClose: () => void;\n\tonViewArtifact: (artifactId: string) => void;\n};\n\nexport function FlowRunGraphArtifactsPopover({\n\tselection,\n\tonClose,\n\tonViewArtifact,\n}: FlowRunGraphArtifactsPopoverProps) {\n\tconst { data: artifacts, isLoading } = useQuery(\n\t\tbuildListArtifactsQuery({\n\t\t\tartifacts: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tid: { any_: selection.ids },\n\t\t\t},\n\t\t\tsort: \"CREATED_DESC\",\n\t\t\toffset: 0,\n\t\t}),\n\t);\n\n\tconst position = selection.position;\n\tif (!position) {\n\t\treturn null;\n\t}\n\n\tconst anchorStyle = {\n\t\tposition: \"absolute\" as const,\n\t\tleft: `${position.x + position.width / 2}px`,\n\t\ttop: `${position.y + position.height}px`,\n\t};\n\n\treturn (\n\t\t<Popover open onOpenChange={(open) => !open && onClose()}>\n\t\t\t<PopoverAnchor style={anchorStyle} />\n\t\t\t<PopoverContent align=\"center\" side=\"bottom\" className=\"w-72\">\n\t\t\t\t<div className=\"flex items-center justify-between mb-3\">\n\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"font-semibold\">\n\t\t\t\t\t\tArtifacts\n\t\t\t\t\t</Typography>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\taria-label=\"Close popover\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon id=\"X\" className=\"size-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t\t{isLoading ? (\n\t\t\t\t\t<div className=\"flex items-center justify-center py-4\">\n\t\t\t\t\t\t<Icon id=\"Loader2\" className=\"size-4 animate-spin\" />\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"space-y-2 max-h-64 overflow-y-auto\">\n\t\t\t\t\t\t{artifacts\n\t\t\t\t\t\t\t?.filter((artifact) => artifact.id !== undefined)\n\t\t\t\t\t\t\t.map((artifact) => (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={artifact.id}\n\t\t\t\t\t\t\t\t\tclassName=\"flex items-center justify-between gap-2 p-2 rounded-md border bg-muted/50\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col min-w-0 flex-1\">\n\t\t\t\t\t\t\t\t\t\t<Typography\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"bodySmall\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"font-medium truncate\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{artifact.key ?? \"Unnamed\"}\n\t\t\t\t\t\t\t\t\t\t</Typography>\n\t\t\t\t\t\t\t\t\t\t{artifact.type && (\n\t\t\t\t\t\t\t\t\t\t\t<Typography\n\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"xsmall\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground uppercase\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{artifact.type}\n\t\t\t\t\t\t\t\t\t\t\t</Typography>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => onViewArtifact(artifact.id as string)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tView\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n}\n","import type { EventSelection } from \"@prefecthq/graphs\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { Link } from \"@tanstack/react-router\";\nimport { format, isValid, parseISO } from \"date-fns\";\nimport { Suspense } from \"react\";\nimport { buildGetEventQuery, type Event } from \"@/api/events\";\nimport type { components } from \"@/api/prefect\";\nimport {\n\tEventResourceLink,\n\textractResourceId,\n\tparseResourceType,\n\tResourceDisplaySkeleton,\n\tResourceDisplayWithIcon,\n} from \"@/components/events/event-resource-display\";\nimport { ResolvedResourceDisplay } from \"@/components/events/event-resource-display/resolved-resource-display\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { KeyValue } from \"@/components/ui/key-value\";\nimport {\n\tPopover,\n\tPopoverAnchor,\n\tPopoverContent,\n} from \"@/components/ui/popover\";\n\ntype RelatedResource = components[\"schemas\"][\"RelatedResource\"];\n\ntype FlowRunGraphEventPopoverProps = {\n\tselection: EventSelection;\n\tonClose: () => void;\n};\n\n/**\n * Converts an event name like \"prefect.flow-run.Running\" to a human-readable label\n * like \"Flow run running\"\n */\nfunction getEventLabel(eventName: string): string {\n\t// Remove \"prefect.\" or \"prefect-cloud.\" prefix\n\tlet label = eventName;\n\tif (label.startsWith(\"prefect.\")) {\n\t\tlabel = label.slice(8);\n\t} else if (label.startsWith(\"prefect-cloud.\")) {\n\t\tlabel = label.slice(14);\n\t}\n\n\t// Replace dots, dashes, and underscores with spaces\n\tlabel = label.replace(/[._-]/g, \" \");\n\n\t// Capitalize first letter, lowercase the rest\n\treturn label.charAt(0).toUpperCase() + label.slice(1).toLowerCase();\n}\n\n/**\n * Formats a date to numeric format like \"2026/01/25 08:18:11 PM\"\n */\nfunction formatDateNumeric(date: string | Date): string {\n\tlet parsedDate: Date;\n\tif (typeof date === \"string\") {\n\t\tparsedDate = parseISO(date);\n\t} else {\n\t\tparsedDate = date;\n\t}\n\n\tif (!isValid(parsedDate)) {\n\t\treturn \"Invalid date\";\n\t}\n\n\treturn format(parsedDate, \"yyyy/MM/dd hh:mm:ss a\");\n}\n\nfunction getResourceName(resource: Record<string, string>): string | null {\n\treturn (\n\t\tresource[\"prefect.resource.name\"] ||\n\t\tresource[\"prefect.name\"] ||\n\t\tresource[\"prefect-cloud.name\"] ||\n\t\tnull\n\t);\n}\n\ntype EventResourceSectionProps = {\n\tevent: Event;\n};\n\nfunction EventResourceSection({ event }: EventResourceSectionProps) {\n\tconst resourceName = getResourceName(event.resource);\n\tconst prefectResourceId = event.resource[\"prefect.resource.id\"] || \"\";\n\tconst resourceType = parseResourceType(prefectResourceId);\n\tconst extractedId = extractResourceId(prefectResourceId);\n\tconst relatedResources = event.related ?? [];\n\n\t// If we have a resource name, display it with the appropriate icon\n\tif (resourceName) {\n\t\treturn (\n\t\t\t<Suspense fallback={<ResourceDisplaySkeleton />}>\n\t\t\t\t<EventResourceLink\n\t\t\t\t\tresource={event.resource as RelatedResource}\n\t\t\t\t\trelatedResources={relatedResources}\n\t\t\t\t\tclassName=\"hover:underline text-primary\"\n\t\t\t\t>\n\t\t\t\t\t<ResourceDisplayWithIcon\n\t\t\t\t\t\tresourceType={resourceType}\n\t\t\t\t\t\tdisplayText={resourceName}\n\t\t\t\t\t\tclassName=\"text-sm\"\n\t\t\t\t\t/>\n\t\t\t\t</EventResourceLink>\n\t\t\t</Suspense>\n\t\t);\n\t}\n\n\t// If we have an extracted ID but no name, try to fetch the resource name via API\n\tif (extractedId && resourceType !== \"unknown\") {\n\t\treturn (\n\t\t\t<Suspense fallback={<ResourceDisplaySkeleton />}>\n\t\t\t\t<EventResourceLink\n\t\t\t\t\tresource={event.resource as RelatedResource}\n\t\t\t\t\trelatedResources={relatedResources}\n\t\t\t\t\tclassName=\"hover:underline text-primary\"\n\t\t\t\t>\n\t\t\t\t\t<ResolvedResourceDisplay\n\t\t\t\t\t\tresourceType={resourceType}\n\t\t\t\t\t\tresourceId={extractedId}\n\t\t\t\t\t\tclassName=\"text-sm\"\n\t\t\t\t\t/>\n\t\t\t\t</EventResourceLink>\n\t\t\t</Suspense>\n\t\t);\n\t}\n\n\t// Fallback: show the raw resource ID\n\treturn (\n\t\t<span className=\"text-sm text-muted-foreground font-mono\">\n\t\t\t{prefectResourceId || \"Unknown\"}\n\t\t</span>\n\t);\n}\n\ntype RelatedResourcesSectionProps = {\n\trelatedResources: RelatedResource[];\n};\n\nfunction RelatedResourcesSection({\n\trelatedResources,\n}: RelatedResourcesSectionProps) {\n\t// Filter out tag resources and only show meaningful related resources\n\tconst filteredResources = relatedResources.filter((resource) => {\n\t\tconst role = resource[\"prefect.resource.role\"];\n\t\tconst resourceId = resource[\"prefect.resource.id\"] || \"\";\n\t\t// Exclude tags and resources without a valid type\n\t\tif (role === \"tag\" || resourceId.startsWith(\"prefect.tag.\")) {\n\t\t\treturn false;\n\t\t}\n\t\tconst resourceType = parseResourceType(resourceId);\n\t\treturn resourceType !== \"unknown\";\n\t});\n\n\tif (filteredResources.length === 0) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<KeyValue\n\t\t\tlabel=\"Related Resources\"\n\t\t\tvalue={\n\t\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t\t{filteredResources.map((resource) => {\n\t\t\t\t\t\tconst resourceName = getResourceName(resource);\n\t\t\t\t\t\tconst prefectResourceId = resource[\"prefect.resource.id\"] || \"\";\n\t\t\t\t\t\tconst resourceType = parseResourceType(prefectResourceId);\n\t\t\t\t\t\tconst extractedId = extractResourceId(prefectResourceId);\n\n\t\t\t\t\t\tif (resourceName) {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Suspense\n\t\t\t\t\t\t\t\t\tkey={prefectResourceId}\n\t\t\t\t\t\t\t\t\tfallback={<ResourceDisplaySkeleton />}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<EventResourceLink\n\t\t\t\t\t\t\t\t\t\tresource={resource}\n\t\t\t\t\t\t\t\t\t\trelatedResources={relatedResources}\n\t\t\t\t\t\t\t\t\t\tclassName=\"hover:underline text-primary\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<ResourceDisplayWithIcon\n\t\t\t\t\t\t\t\t\t\t\tresourceType={resourceType}\n\t\t\t\t\t\t\t\t\t\t\tdisplayText={resourceName}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-sm\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</EventResourceLink>\n\t\t\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (extractedId && resourceType !== \"unknown\") {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Suspense\n\t\t\t\t\t\t\t\t\tkey={prefectResourceId}\n\t\t\t\t\t\t\t\t\tfallback={<ResourceDisplaySkeleton />}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<EventResourceLink\n\t\t\t\t\t\t\t\t\t\tresource={resource}\n\t\t\t\t\t\t\t\t\t\trelatedResources={relatedResources}\n\t\t\t\t\t\t\t\t\t\tclassName=\"hover:underline text-primary\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<ResolvedResourceDisplay\n\t\t\t\t\t\t\t\t\t\t\tresourceType={resourceType}\n\t\t\t\t\t\t\t\t\t\t\tresourceId={extractedId}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-sm\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</EventResourceLink>\n\t\t\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tkey={prefectResourceId}\n\t\t\t\t\t\t\t\tclassName=\"text-sm text-muted-foreground font-mono\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{prefectResourceId}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t}\n\t\t/>\n\t);\n}\n\nexport function FlowRunGraphEventPopover({\n\tselection,\n\tonClose,\n}: FlowRunGraphEventPopoverProps) {\n\tconst { data: event, isLoading } = useQuery(\n\t\tbuildGetEventQuery(selection.id, selection.occurred),\n\t);\n\n\tconst position = selection.position;\n\tif (!position) {\n\t\treturn null;\n\t}\n\n\tconst anchorStyle = {\n\t\tposition: \"absolute\" as const,\n\t\tleft: `${position.x + position.width / 2}px`,\n\t\ttop: `${position.y + position.height}px`,\n\t};\n\n\tconst eventName = event?.event ?? \"\";\n\tconst eventLabel = eventName ? getEventLabel(eventName) : \"Loading...\";\n\tconst relatedResources = event?.related ?? [];\n\n\treturn (\n\t\t<Popover open onOpenChange={(open) => !open && onClose()}>\n\t\t\t<PopoverAnchor style={anchorStyle} />\n\t\t\t<PopoverContent align=\"center\" side=\"bottom\" className=\"w-80\">\n\t\t\t\t<div className=\"flex justify-between items-start mb-3\">\n\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">Event</span>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\taria-label=\"Close popover\"\n\t\t\t\t\t\tclassName=\"-mt-1 -mr-2\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon id=\"X\" className=\"size-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t\t{isLoading ? (\n\t\t\t\t\t<div className=\"flex items-center justify-center py-4\">\n\t\t\t\t\t\t<Icon id=\"Loader2\" className=\"size-4 animate-spin\" />\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"space-y-3\">\n\t\t\t\t\t\t<div className=\"flex flex-col gap-0.5\">\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto=\"/events\"\n\t\t\t\t\t\t\t\tsearch={{ event: [eventName] }}\n\t\t\t\t\t\t\t\tclassName=\"text-sm text-primary hover:underline font-medium\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{eventLabel}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t<span className=\"text-xs text-muted-foreground\">{eventName}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<KeyValue\n\t\t\t\t\t\t\tlabel=\"Occurred\"\n\t\t\t\t\t\t\tvalue={\n\t\t\t\t\t\t\t\t<span className=\"text-sm\">\n\t\t\t\t\t\t\t\t\t{formatDateNumeric(selection.occurred)}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{event && (\n\t\t\t\t\t\t\t<KeyValue\n\t\t\t\t\t\t\t\tlabel=\"Resource\"\n\t\t\t\t\t\t\t\tvalue={<EventResourceSection event={event} />}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{relatedResources.length > 0 && (\n\t\t\t\t\t\t\t<RelatedResourcesSection relatedResources={relatedResources} />\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n}\n","import type { EventsSelection } from \"@prefecthq/graphs\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport { buildGetEventQuery } from \"@/api/events\";\nimport { Button } from \"@/components/ui/button\";\nimport { FormattedDate } from \"@/components/ui/formatted-date/formatted-date\";\nimport { Icon } from \"@/components/ui/icons\";\nimport {\n\tPopover,\n\tPopoverAnchor,\n\tPopoverContent,\n} from \"@/components/ui/popover\";\nimport { ScrollArea } from \"@/components/ui/scroll-area\";\n\ntype FlowRunGraphEventsPopoverProps = {\n\tselection: EventsSelection;\n\tonClose: () => void;\n};\n\nexport function FlowRunGraphEventsPopover({\n\tselection,\n\tonClose,\n}: FlowRunGraphEventsPopoverProps) {\n\tconst eventQueries = useQueries({\n\t\tqueries: selection.ids.map((id) =>\n\t\t\tbuildGetEventQuery(id, selection.occurred ?? new Date()),\n\t\t),\n\t});\n\n\tconst position = selection.position;\n\tif (!position) {\n\t\treturn null;\n\t}\n\n\tconst anchorStyle = {\n\t\tposition: \"absolute\" as const,\n\t\tleft: `${position.x + position.width / 2}px`,\n\t\ttop: `${position.y + position.height}px`,\n\t};\n\n\tconst isLoading = eventQueries.some((q) => q.isLoading);\n\tconst events = eventQueries\n\t\t.map((q) => q.data)\n\t\t.filter((e): e is NonNullable<typeof e> => e !== undefined);\n\n\treturn (\n\t\t<Popover open onOpenChange={(open) => !open && onClose()}>\n\t\t\t<PopoverAnchor style={anchorStyle} />\n\t\t\t<PopoverContent align=\"center\" side=\"bottom\" className=\"w-80\">\n\t\t\t\t<div className=\"flex items-center justify-between mb-2\">\n\t\t\t\t\t<span className=\"text-sm font-medium\">\n\t\t\t\t\t\t{selection.ids.length} Events\n\t\t\t\t\t</span>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\taria-label=\"Close popover\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon id=\"X\" className=\"size-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t\t{isLoading ? (\n\t\t\t\t\t<div className=\"flex items-center justify-center py-4\">\n\t\t\t\t\t\t<Icon id=\"Loader2\" className=\"size-4 animate-spin\" />\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<ScrollArea className=\"max-h-64\">\n\t\t\t\t\t\t<div className=\"space-y-3\">\n\t\t\t\t\t\t\t{events.map((event) => (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={event.id}\n\t\t\t\t\t\t\t\t\tclassName=\"border-b pb-2 last:border-b-0 last:pb-0\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName=\"text-sm font-mono truncate\"\n\t\t\t\t\t\t\t\t\t\ttitle={event.event}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{event.event}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t<FormattedDate date={new Date(event.occurred)} />\n\t\t\t\t\t\t\t\t\t</div>\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</div>\n\t\t\t\t\t</ScrollArea>\n\t\t\t\t)}\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n}\n","import { type GraphItemSelection, isNodeSelection } from \"@prefecthq/graphs\";\nimport { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { Link } from \"@tanstack/react-router\";\nimport { Suspense } from \"react\";\nimport { buildGetFlowRunDetailsQuery } from \"@/api/flow-runs\";\nimport { buildGetTaskRunQuery } from \"@/api/task-runs\";\nimport { Button } from \"@/components/ui/button\";\nimport { FormattedDate } from \"@/components/ui/formatted-date/formatted-date\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { KeyValue } from \"@/components/ui/key-value\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\nimport { TagBadgeGroup } from \"@/components/ui/tag-badge-group\";\nimport { secondsToApproximateString } from \"@/utils/seconds\";\n\ntype FlowRunGraphSelectionPanelProps = {\n\tselection: GraphItemSelection;\n\tonClose: () => void;\n};\n\nexport function FlowRunGraphSelectionPanel({\n\tselection,\n\tonClose,\n}: FlowRunGraphSelectionPanelProps) {\n\tif (!isNodeSelection(selection)) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div className=\"absolute top-4 right-4 z-10 w-72 rounded-lg border bg-card p-4 shadow-md\">\n\t\t\t<Suspense fallback={<SelectionPanelSkeleton onClose={onClose} />}>\n\t\t\t\t{selection.kind === \"task-run\" && (\n\t\t\t\t\t<TaskRunDetails taskRunId={selection.id} onClose={onClose} />\n\t\t\t\t)}\n\t\t\t\t{selection.kind === \"flow-run\" && (\n\t\t\t\t\t<FlowRunDetails flowRunId={selection.id} onClose={onClose} />\n\t\t\t\t)}\n\t\t\t</Suspense>\n\t\t</div>\n\t);\n}\n\ntype SelectionPanelSkeletonProps = {\n\tonClose: () => void;\n};\n\nfunction SelectionPanelSkeleton({ onClose }: SelectionPanelSkeletonProps) {\n\treturn (\n\t\t<div className=\"space-y-3\">\n\t\t\t<div className=\"flex items-start justify-between gap-2\">\n\t\t\t\t<Skeleton className=\"h-6 w-3/4\" />\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t\taria-label=\"Close panel\"\n\t\t\t\t\tclassName=\"shrink-0 -mt-1 -mr-2\"\n\t\t\t\t>\n\t\t\t\t\t<Icon id=\"X\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t\t<Skeleton className=\"h-5 w-1/2\" />\n\t\t\t<Skeleton className=\"h-5 w-full\" />\n\t\t\t<Skeleton className=\"h-5 w-2/3\" />\n\t\t\t<Skeleton className=\"h-5 w-1/2\" />\n\t\t</div>\n\t);\n}\n\ntype TaskRunDetailsProps = {\n\ttaskRunId: string;\n\tonClose: () => void;\n};\n\nfunction TaskRunDetails({ taskRunId, onClose }: TaskRunDetailsProps) {\n\tconst { data: taskRun } = useSuspenseQuery(buildGetTaskRunQuery(taskRunId));\n\n\tconst duration =\n\t\ttaskRun.estimated_run_time && taskRun.estimated_run_time > 0\n\t\t\t? taskRun.estimated_run_time\n\t\t\t: (taskRun.total_run_time ?? 0);\n\n\treturn (\n\t\t<div className=\"space-y-3\">\n\t\t\t<div className=\"flex items-start justify-between gap-2\">\n\t\t\t\t<h3 className=\"font-semibold text-base\">\n\t\t\t\t\t<Link\n\t\t\t\t\t\tto=\"/runs/task-run/$id\"\n\t\t\t\t\t\tparams={{ id: taskRunId }}\n\t\t\t\t\t\tclassName=\"hover:underline text-foreground\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{taskRun.name}\n\t\t\t\t\t</Link>\n\t\t\t\t</h3>\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t\taria-label=\"Close panel\"\n\t\t\t\t\tclassName=\"shrink-0 -mt-1 -mr-2\"\n\t\t\t\t>\n\t\t\t\t\t<Icon id=\"X\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t\t<div className=\"space-y-3\">\n\t\t\t\t{taskRun.state && (\n\t\t\t\t\t<KeyValue\n\t\t\t\t\t\tlabel=\"State\"\n\t\t\t\t\t\tvalue={\n\t\t\t\t\t\t\t<StateBadge type={taskRun.state.type} name={taskRun.state.name} />\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t<KeyValue label=\"Task Run ID\" value={taskRun.id} copyable />\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Duration\"\n\t\t\t\t\tvalue={duration > 0 ? secondsToApproximateString(duration) : \"-\"}\n\t\t\t\t/>\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Created\"\n\t\t\t\t\tvalue={<FormattedDate date={taskRun.created} />}\n\t\t\t\t/>\n\t\t\t\t{taskRun.tags && taskRun.tags.length > 0 && (\n\t\t\t\t\t<KeyValue\n\t\t\t\t\t\tlabel=\"Tags\"\n\t\t\t\t\t\tvalue={<TagBadgeGroup tags={taskRun.tags} />}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\ntype FlowRunDetailsProps = {\n\tflowRunId: string;\n\tonClose: () => void;\n};\n\nfunction FlowRunDetails({ flowRunId, onClose }: FlowRunDetailsProps) {\n\tconst { data: flowRun } = useSuspenseQuery(\n\t\tbuildGetFlowRunDetailsQuery(flowRunId),\n\t);\n\n\tconst duration = flowRun.total_run_time ?? 0;\n\n\treturn (\n\t\t<div className=\"space-y-3\">\n\t\t\t<div className=\"flex items-start justify-between gap-2\">\n\t\t\t\t<h3 className=\"font-semibold text-base\">\n\t\t\t\t\t<Link\n\t\t\t\t\t\tto=\"/runs/flow-run/$id\"\n\t\t\t\t\t\tparams={{ id: flowRunId }}\n\t\t\t\t\t\tclassName=\"hover:underline text-foreground\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{flowRun.name}\n\t\t\t\t\t</Link>\n\t\t\t\t</h3>\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t\taria-label=\"Close panel\"\n\t\t\t\t\tclassName=\"shrink-0 -mt-1 -mr-2\"\n\t\t\t\t>\n\t\t\t\t\t<Icon id=\"X\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t\t<div className=\"space-y-3\">\n\t\t\t\t{flowRun.state && (\n\t\t\t\t\t<KeyValue\n\t\t\t\t\t\tlabel=\"State\"\n\t\t\t\t\t\tvalue={\n\t\t\t\t\t\t\t<StateBadge type={flowRun.state.type} name={flowRun.state.name} />\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t<KeyValue label=\"Flow Run ID\" value={flowRun.id} copyable />\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Duration\"\n\t\t\t\t\tvalue={duration > 0 ? secondsToApproximateString(duration) : \"-\"}\n\t\t\t\t/>\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Created\"\n\t\t\t\t\tvalue={<FormattedDate date={flowRun.created} />}\n\t\t\t\t/>\n\t\t\t\t{flowRun.tags && flowRun.tags.length > 0 && (\n\t\t\t\t\t<KeyValue\n\t\t\t\t\t\tlabel=\"Tags\"\n\t\t\t\t\t\tvalue={<TagBadgeGroup tags={flowRun.tags} />}\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 { StateSelection } from \"@prefecthq/graphs\";\nimport { useEffect, useRef } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { FormattedDate } from \"@/components/ui/formatted-date/formatted-date\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { KeyValue } from \"@/components/ui/key-value\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\n\ntype FlowRunGraphStatePopoverProps = {\n\tselection: StateSelection;\n\tonClose: () => void;\n};\n\nexport function FlowRunGraphStatePopover({\n\tselection,\n\tonClose,\n}: FlowRunGraphStatePopoverProps) {\n\tconst popoverRef = useRef<HTMLDivElement>(null);\n\n\tuseEffect(() => {\n\t\tconst handleClickOutside = (event: MouseEvent) => {\n\t\t\tif (\n\t\t\t\tpopoverRef.current &&\n\t\t\t\t!popoverRef.current.contains(event.target as Node)\n\t\t\t) {\n\t\t\t\tonClose();\n\t\t\t}\n\t\t};\n\n\t\tconst handleEscape = (event: KeyboardEvent) => {\n\t\t\tif (event.key === \"Escape\") {\n\t\t\t\tonClose();\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener(\"mousedown\", handleClickOutside);\n\t\tdocument.addEventListener(\"keydown\", handleEscape);\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"mousedown\", handleClickOutside);\n\t\t\tdocument.removeEventListener(\"keydown\", handleEscape);\n\t\t};\n\t}, [onClose]);\n\n\tconst position = selection.position;\n\tif (!position) {\n\t\treturn null;\n\t}\n\n\tconst popoverStyle = {\n\t\tposition: \"absolute\" as const,\n\t\tleft: `${position.x + position.width / 2}px`,\n\t\ttop: `${position.y + position.height}px`,\n\t\ttransform: \"translateX(-50%)\",\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tref={popoverRef}\n\t\t\tclassName=\"z-50 w-64 rounded-lg border bg-card p-4 shadow-md\"\n\t\t\tstyle={popoverStyle}\n\t\t>\n\t\t\t<div className=\"flex justify-end absolute top-2 right-2\">\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t\taria-label=\"Close popover\"\n\t\t\t\t>\n\t\t\t\t\t<Icon id=\"X\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t\t<div className=\"space-y-3\">\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"State\"\n\t\t\t\t\tvalue={<StateBadge type={selection.type} name={selection.name} />}\n\t\t\t\t/>\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Occurred\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<FormattedDate date={selection.timestamp} format=\"timestamp\" />\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 {\n\temitter,\n\ttype GraphItemSelection,\n\tisArtifactsSelection,\n\tisEventSelection,\n\tisEventsSelection,\n\tisNodeSelection,\n\tisStateSelection,\n\ttype RunGraphConfig,\n\ttype RunGraphNode,\n\ttype RunGraphStateEvent,\n\tselectItem,\n\tsetConfig,\n\tstart,\n\tstop,\n\tupdateViewportFromDateRange,\n\ttype ViewportDateRange,\n} from \"@prefecthq/graphs\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useTheme } from \"next-themes\";\nimport {\n\ttype CSSProperties,\n\tuseCallback,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport { buildCountFlowRunsQuery } from \"@/api/flow-runs\";\nimport { buildCountTaskRunsQuery } from \"@/api/task-runs\";\nimport { getStateColor } from \"@/utils/state-colors\";\nimport { fetchFlowRunEvents, fetchFlowRunGraph } from \"./api\";\nimport { stateTypeShades } from \"./consts\";\nimport { FlowRunGraphActions } from \"./flow-run-graph-actions\";\nimport { FlowRunGraphArtifactDrawer } from \"./flow-run-graph-artifact-drawer\";\nimport { FlowRunGraphArtifactsPopover } from \"./flow-run-graph-artifacts-popover\";\nimport { FlowRunGraphEventPopover } from \"./flow-run-graph-event-popover\";\nimport { FlowRunGraphEventsPopover } from \"./flow-run-graph-events-popover\";\nimport { FlowRunGraphSelectionPanel } from \"./flow-run-graph-selection-panel\";\nimport { FlowRunGraphStatePopover } from \"./flow-run-graph-state-popover\";\n\nconst TERMINAL_STATES = [\"COMPLETED\", \"FAILED\", \"CANCELLED\", \"CRASHED\"];\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({\n\tflowRunId,\n\tstateType,\n\tviewport,\n\tonViewportChange,\n\tselected: controlledSelected,\n\tonSelectedChange,\n\tclassName,\n\tstyle,\n\tfullscreen: controlledFullscreen,\n\tonFullscreenChange,\n}: FlowRunGraphProps) {\n\tconst stageRef = useRef<HTMLDivElement>(null);\n\tconst [internalFullscreen, setInternalFullscreen] = useState(false);\n\tconst [internalSelected, setInternalSelected] = useState<\n\t\tGraphItemSelection | undefined\n\t>(undefined);\n\tconst [selectedArtifactId, setSelectedArtifactId] = useState<string | null>(\n\t\tnull,\n\t);\n\tconst { resolvedTheme } = useTheme();\n\n\tconst fullscreen = controlledFullscreen ?? internalFullscreen;\n\tconst selected = controlledSelected ?? internalSelected;\n\tconst isTerminal = stateType && TERMINAL_STATES.includes(stateType);\n\n\tconst { data: taskRunCount } = useQuery(\n\t\tbuildCountTaskRunsQuery({\n\t\t\ttask_runs: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tflow_run_id: { operator: \"and_\", any_: [flowRunId], is_null_: false },\n\t\t\t},\n\t\t}),\n\t);\n\n\tconst { data: subflowRunCount } = useQuery(\n\t\tbuildCountFlowRunsQuery({\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_: [flowRunId],\n\t\t\t\t},\n\t\t\t},\n\t\t}),\n\t);\n\n\tconst hasNodes =\n\t\ttaskRunCount === undefined ||\n\t\tsubflowRunCount === undefined ||\n\t\ttaskRunCount > 0 ||\n\t\tsubflowRunCount > 0;\n\n\tconst updateFullscreen = useCallback(\n\t\t(value: boolean) => {\n\t\t\tsetInternalFullscreen(value);\n\t\t\tonFullscreenChange?.(value);\n\t\t},\n\t\t[onFullscreenChange],\n\t);\n\n\tconst config = useMemo<RunGraphConfig>(\n\t\t() => ({\n\t\t\trunId: flowRunId,\n\t\t\tfetch: fetchFlowRunGraph,\n\t\t\tfetchEvents: fetchFlowRunEvents,\n\t\t\tstyles: () => ({\n\t\t\t\tnode: (node: RunGraphNode) => ({\n\t\t\t\t\tbackground: getStateColor(\n\t\t\t\t\t\tnode.state_type,\n\t\t\t\t\t\tstateTypeShades[node.state_type],\n\t\t\t\t\t),\n\t\t\t\t}),\n\t\t\t\tstate: (event: RunGraphStateEvent) => ({\n\t\t\t\t\tbackground: getStateColor(event.type, stateTypeShades[event.type]),\n\t\t\t\t}),\n\t\t\t}),\n\t\t\ttheme: resolvedTheme === \"dark\" ? \"dark\" : \"light\",\n\t\t}),\n\t\t[flowRunId, resolvedTheme],\n\t);\n\n\tuseEffect(() => {\n\t\tsetConfig(config);\n\t}, [config]);\n\n\tuseEffect(() => {\n\t\tif (!stageRef.current) {\n\t\t\tthrow new Error(\"Stage does not exist\");\n\t\t}\n\n\t\tstart({\n\t\t\tstage: stageRef.current,\n\t\t\tconfig,\n\t\t});\n\n\t\treturn () => {\n\t\t\tstop();\n\t\t};\n\t}, [config]);\n\n\tuseEffect(() => {\n\t\tselectItem(selected ?? null);\n\t}, [selected]);\n\n\tuseEffect(() => {\n\t\tvoid updateViewportFromDateRange(viewport);\n\t}, [viewport]);\n\n\tuseEffect(() => {\n\t\tconst offItemSelected = emitter.on(\"itemSelected\", (nodeId) => {\n\t\t\tconst selection = nodeId ?? undefined;\n\t\t\tsetInternalSelected(selection);\n\t\t\tonSelectedChange?.(selection);\n\t\t});\n\t\tconst offViewportDateRangeUpdated = emitter.on(\n\t\t\t\"viewportDateRangeUpdated\",\n\t\t\t(range) => onViewportChange?.(range),\n\t\t);\n\n\t\treturn () => {\n\t\t\toffItemSelected();\n\t\t\toffViewportDateRangeUpdated();\n\t\t};\n\t}, [onSelectedChange, onViewportChange]);\n\n\tconst heightClass = fullscreen\n\t\t? \"fixed inset-0 z-50 bg-background\"\n\t\t: hasNodes\n\t\t\t? \"relative h-96 w-full\"\n\t\t\t: \"relative h-40 w-full\";\n\n\treturn (\n\t\t<div className={`${heightClass} ${className ?? \"\"}`} style={style}>\n\t\t\t<div ref={stageRef} className=\"size-full [&>canvas]:size-full\" />\n\t\t\t{!hasNodes && (\n\t\t\t\t<div className=\"absolute inset-0 flex items-center justify-center bg-background/50\">\n\t\t\t\t\t<p className=\"text-muted-foreground\">\n\t\t\t\t\t\t{isTerminal\n\t\t\t\t\t\t\t? \"This flow run did not generate any task or subflow runs\"\n\t\t\t\t\t\t\t: \"This flow run has not yet generated any task or subflow runs\"}\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<div className=\"absolute bottom-2 right-2\">\n\t\t\t\t<FlowRunGraphActions\n\t\t\t\t\tfullscreen={fullscreen}\n\t\t\t\t\tonFullscreenChange={updateFullscreen}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t{selected && isNodeSelection(selected) && (\n\t\t\t\t<FlowRunGraphSelectionPanel\n\t\t\t\t\tselection={selected}\n\t\t\t\t\tonClose={() => {\n\t\t\t\t\t\tsetInternalSelected(undefined);\n\t\t\t\t\t\tonSelectedChange?.(undefined);\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{selected && isStateSelection(selected) && (\n\t\t\t\t<FlowRunGraphStatePopover\n\t\t\t\t\tselection={selected}\n\t\t\t\t\tonClose={() => {\n\t\t\t\t\t\tsetInternalSelected(undefined);\n\t\t\t\t\t\tonSelectedChange?.(undefined);\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{selected && isEventSelection(selected) && (\n\t\t\t\t<FlowRunGraphEventPopover\n\t\t\t\t\tselection={selected}\n\t\t\t\t\tonClose={() => {\n\t\t\t\t\t\tsetInternalSelected(undefined);\n\t\t\t\t\t\tonSelectedChange?.(undefined);\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{selected && isEventsSelection(selected) && (\n\t\t\t\t<FlowRunGraphEventsPopover\n\t\t\t\t\tselection={selected}\n\t\t\t\t\tonClose={() => {\n\t\t\t\t\t\tsetInternalSelected(undefined);\n\t\t\t\t\t\tonSelectedChange?.(undefined);\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{selected && isArtifactsSelection(selected) && (\n\t\t\t\t<FlowRunGraphArtifactsPopover\n\t\t\t\t\tselection={selected}\n\t\t\t\t\tonClose={() => {\n\t\t\t\t\t\tsetInternalSelected(undefined);\n\t\t\t\t\t\tonSelectedChange?.(undefined);\n\t\t\t\t\t}}\n\t\t\t\t\tonViewArtifact={(artifactId) => {\n\t\t\t\t\t\tsetSelectedArtifactId(artifactId);\n\t\t\t\t\t\tsetInternalSelected(undefined);\n\t\t\t\t\t\tonSelectedChange?.(undefined);\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<FlowRunGraphArtifactDrawer\n\t\t\t\tartifactId={selectedArtifactId}\n\t\t\t\tonClose={() => setSelectedArtifactId(null)}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n"],"names":["fetchFlowRunGraph","id","data","getQueryService","mapApiResponseToRunGraphData","fetchFlowRunEvents","since","until","nodeId","mapApiResponseToRunGraphEvents","response","parseISO","node","mapNode","mapState","event","mapArtifact","state","artifact","stateTypeShades","isEventTargetInput","target","center","centerViewport","FlowRunGraphCenterButton","useEffect","controller","Tooltip","jsx","TooltipTrigger","Button","Icon","TooltipContent","FlowRunGraphFullscreenButton","fullscreen","onFullscreenChange","toggleFullscreen","useCallback","layoutOptions","increaseScale","multiplier","DEFAULT_HORIZONTAL_SCALE_MULTIPLIER","scale","layout","setHorizontalScaleMultiplier","decreaseScale","resetScale","resetHorizontalScaleMultiplier","isLayoutOption","value","horizontal","vertical","isHorizontalMode","isVerticalMode","FlowRunGraphSettings","selectedLayoutOption","setSelectedLayoutOption","useState","hideEdges","setHideEdges","hideArtifacts","setHideArtifacts","hideEvents","setHideEvents","handleLayoutChange","setHorizontalMode","setVerticalMode","handleHideEdgesChange","setDisabledEdges","handleHideArtifactsChange","setDisabledArtifacts","handleHideEventsChange","setDisabledEvents","jsxs","Typography","option","e","Label","Switch","FlowRunGraphSettingsButton","Popover","PopoverTrigger","PopoverContent","FlowRunGraphActions","FlowRunGraphArtifactDrawer","artifactId","onClose","Sheet","open","SheetContent","SheetHeader","SheetTitle","Suspense","ArtifactContentSkeleton","ArtifactContent","Skeleton","useSuspenseQuery","buildGetArtifactQuery","KeyValue","FormattedDate","FlowRunGraphArtifactsPopover","selection","onViewArtifact","artifacts","isLoading","useQuery","buildListArtifactsQuery","position","anchorStyle","PopoverAnchor","getEventLabel","eventName","label","formatDateNumeric","date","parsedDate","isValid","format","getResourceName","resource","EventResourceSection","resourceName","prefectResourceId","resourceType","parseResourceType","extractedId","extractResourceId","relatedResources","ResourceDisplaySkeleton","EventResourceLink","ResourceDisplayWithIcon","ResolvedResourceDisplay","RelatedResourcesSection","filteredResources","role","resourceId","FlowRunGraphEventPopover","buildGetEventQuery","eventLabel","Link","FlowRunGraphEventsPopover","eventQueries","useQueries","q","events","ScrollArea","FlowRunGraphSelectionPanel","isNodeSelection","SelectionPanelSkeleton","TaskRunDetails","FlowRunDetails","taskRunId","taskRun","buildGetTaskRunQuery","duration","StateBadge","secondsToApproximateString","TagBadgeGroup","flowRunId","flowRun","buildGetFlowRunDetailsQuery","FlowRunGraphStatePopover","popoverRef","useRef","handleClickOutside","handleEscape","popoverStyle","TERMINAL_STATES","FlowRunGraph","stateType","viewport","onViewportChange","controlledSelected","onSelectedChange","className","style","controlledFullscreen","stageRef","internalFullscreen","setInternalFullscreen","internalSelected","setInternalSelected","selectedArtifactId","setSelectedArtifactId","resolvedTheme","useTheme","selected","isTerminal","taskRunCount","buildCountTaskRunsQuery","subflowRunCount","buildCountFlowRunsQuery","hasNodes","updateFullscreen","config","useMemo","getStateColor","setConfig","start","stop","selectItem","updateViewportFromDateRange","offItemSelected","emitter","offViewportDateRangeUpdated","range","heightClass","isStateSelection","isEventSelection","isEventsSelection","isArtifactsSelection"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"flow-run-graph-ckiE3mA9.js","sources":["../../src/components/flow-runs/flow-run-graph/api.ts","../../src/components/flow-runs/flow-run-graph/consts.ts","../../src/components/flow-runs/flow-run-graph/utilities.ts","../../src/components/flow-runs/flow-run-graph/flow-run-graph-center-button.tsx","../../src/components/flow-runs/flow-run-graph/flow-run-graph-fullscreen-button.tsx","../../src/components/flow-runs/flow-run-graph/flow-run-graph-settings.tsx","../../src/components/flow-runs/flow-run-graph/flow-run-graph-settings-button.tsx","../../src/components/flow-runs/flow-run-graph/flow-run-graph-actions.tsx","../../src/components/flow-runs/flow-run-graph/flow-run-graph-artifact-drawer.tsx","../../src/components/flow-runs/flow-run-graph/flow-run-graph-artifacts-popover.tsx","../../src/components/flow-runs/flow-run-graph/flow-run-graph-event-popover.tsx","../../src/components/flow-runs/flow-run-graph/flow-run-graph-events-popover.tsx","../../src/components/flow-runs/flow-run-graph/flow-run-graph-selection-panel.tsx","../../src/components/flow-runs/flow-run-graph/flow-run-graph-state-popover.tsx","../../src/components/flow-runs/flow-run-graph/flow-run-graph.tsx"],"sourcesContent":["import type {\n\tEventRelatedResource,\n\tRunGraphArtifact,\n\tRunGraphData,\n\tRunGraphEvent,\n\tRunGraphEventResource,\n\tRunGraphFetchEventsContext,\n\tRunGraphNode,\n\tRunGraphStateEvent,\n} from \"@prefecthq/graphs\";\nimport { parseISO } from \"date-fns\";\nimport type { components } from \"@/api/prefect\";\nimport { getQueryService } from \"@/api/service\";\n\n/**\n * Fetches the graph data for a flow run.\n * @param id - The ID of the flow run.\n * @returns The graph data for the flow run.\n */\nexport async function fetchFlowRunGraph(id: string): Promise<RunGraphData> {\n\tconst { data } = await (await getQueryService()).GET(\n\t\t\"/flow_runs/{id}/graph-v2\",\n\t\t{\n\t\t\tparams: { path: { id } },\n\t\t},\n\t);\n\n\tif (!data) {\n\t\tthrow new Error(\"No data returned from API\");\n\t}\n\n\treturn mapApiResponseToRunGraphData(data);\n}\n\n/**\n * Fetches events for a flow run.\n * @param since - The start date of the events to fetch.\n * @param until - The end date of the events to fetch.\n * @param nodeId - The flowRunId of the node to fetch events for.\n * @returns The events for the flow run.\n */\nexport async function fetchFlowRunEvents({\n\tsince,\n\tuntil,\n\tnodeId,\n}: RunGraphFetchEventsContext): Promise<RunGraphEvent[]> {\n\tconst { data } = await (await getQueryService()).POST(\"/events/filter\", {\n\t\tbody: {\n\t\t\tfilter: {\n\t\t\t\tany_resource: {\n\t\t\t\t\tid: [`prefect.flow-run.${nodeId}`],\n\t\t\t\t},\n\t\t\t\tevent: {\n\t\t\t\t\texclude_prefix: [\"prefect.log.write\", \"prefect.task-run.\"],\n\t\t\t\t},\n\t\t\t\toccurred: {\n\t\t\t\t\tsince: since.toISOString(),\n\t\t\t\t\tuntil: until.toISOString(),\n\t\t\t\t},\n\t\t\t\torder: \"ASC\",\n\t\t\t},\n\t\t\tlimit: 50,\n\t\t},\n\t});\n\n\tif (!data) {\n\t\tthrow new Error(\"No data returned from API\");\n\t}\n\n\treturn mapApiResponseToRunGraphEvents(data);\n}\n\ntype GraphResponse = components[\"schemas\"][\"Graph\"];\ntype GraphResponseNode = GraphResponse[\"nodes\"][number];\ntype GraphResponseArtifact = GraphResponse[\"artifacts\"][number];\ntype GraphResponseState = NonNullable<GraphResponse[\"states\"]>[number];\ntype EventsResponse = components[\"schemas\"][\"EventPage\"];\n\nfunction mapApiResponseToRunGraphData(response: GraphResponse): RunGraphData {\n\tif (!response.start_time) {\n\t\tthrow new Error(\"Start time is required\");\n\t}\n\n\treturn {\n\t\troot_node_ids: response.root_node_ids,\n\t\tstart_time: parseISO(response.start_time),\n\t\tend_time: response.end_time ? parseISO(response.end_time) : null,\n\t\tnodes: new Map(response.nodes.map((node) => mapNode(node))),\n\t\tstates: response.states?.map(mapState) ?? [],\n\t};\n}\n\nexport function mapApiResponseToRunGraphEvents(\n\tresponse: EventsResponse,\n): RunGraphEvent[] {\n\treturn response.events.map((event) => {\n\t\tif (!event.received) {\n\t\t\tthrow new Error(\"Received is required\");\n\t\t}\n\n\t\tconst runGraphEvent: RunGraphEvent = {\n\t\t\tid: event.id,\n\t\t\treceived: parseISO(event.received),\n\t\t\toccurred: parseISO(event.occurred),\n\t\t\tevent: event.event,\n\t\t\tresource: event.resource as RunGraphEventResource,\n\t\t\tpayload: event.payload,\n\t\t\trelated: (event.related ?? []) as EventRelatedResource[],\n\t\t};\n\n\t\treturn runGraphEvent;\n\t});\n}\n\nfunction mapNode([id, node]: GraphResponseNode): [string, RunGraphNode] {\n\tif (!node.start_time) {\n\t\tthrow new Error(\"Start time is required\");\n\t}\n\n\treturn [\n\t\tid,\n\t\t{\n\t\t\tkind: node.kind,\n\t\t\tid: node.id,\n\t\t\tlabel: node.label,\n\t\t\tstate_type: node.state_type,\n\t\t\tstart_time: parseISO(node.start_time),\n\t\t\tend_time: node.end_time ? parseISO(node.end_time) : null,\n\t\t\tparents: node.parents,\n\t\t\tchildren: node.children,\n\t\t\tartifacts: node.artifacts.map(mapArtifact),\n\t\t},\n\t];\n}\n\nfunction mapState(state: GraphResponseState): RunGraphStateEvent {\n\treturn {\n\t\tid: state.id,\n\t\ttimestamp: parseISO(state.timestamp),\n\t\ttype: state.type,\n\t\tname: state.name,\n\t};\n}\n\nfunction mapArtifact(artifact: GraphResponseArtifact): RunGraphArtifact {\n\tif (!artifact.type) {\n\t\tthrow new Error(\"Artifact type is required\");\n\t}\n\n\tif (artifact.type === \"progress\" && typeof artifact.data === \"number\") {\n\t\treturn {\n\t\t\tid: artifact.id,\n\t\t\tcreated: parseISO(artifact.created),\n\t\t\tkey: artifact.key ?? undefined,\n\t\t\ttype: artifact.type,\n\t\t\tdata: artifact.data,\n\t\t};\n\t}\n\n\treturn {\n\t\tid: artifact.id,\n\t\tcreated: parseISO(artifact.created),\n\t\tkey: artifact.key ?? undefined,\n\t\ttype: artifact.type as Exclude<RunGraphArtifact[\"type\"], \"progress\">,\n\t};\n}\n","import type { StateType } from \"@prefecthq/graphs\";\n\n/**\n * Shade values for each state type, used with getStateColor().\n * Different states use different shades for visual distinction.\n * See: ui-v2/src/index.css for the CSS variable definitions.\n */\nexport const stateTypeShades: Record<StateType, number> = {\n\tCOMPLETED: 600,\n\tRUNNING: 700,\n\tSCHEDULED: 700,\n\tPENDING: 800,\n\tFAILED: 700,\n\tCANCELLED: 600,\n\tCANCELLING: 600,\n\tCRASHED: 600,\n\tPAUSED: 800,\n};\n","export function isEventTargetInput(target: EventTarget | null): boolean {\n\tif (!target || !(target instanceof HTMLElement)) {\n\t\treturn false;\n\t}\n\treturn [\"INPUT\", \"TEXTAREA\", \"SELECT\"].includes(target.tagName);\n}\n","import { centerViewport } from \"@prefecthq/graphs\";\nimport { useEffect } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons/icon\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { isEventTargetInput } from \"./utilities\";\n\nconst center = () => {\n\tvoid centerViewport({ animate: true });\n};\n\nexport function FlowRunGraphCenterButton() {\n\tuseEffect(() => {\n\t\tconst controller = new AbortController();\n\n\t\tdocument.addEventListener(\n\t\t\t\"keydown\",\n\t\t\t(event: KeyboardEvent) => {\n\t\t\t\tif (\n\t\t\t\t\tisEventTargetInput(event.target) ||\n\t\t\t\t\tevent.metaKey ||\n\t\t\t\t\tevent.ctrlKey\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (event.key === \"c\") {\n\t\t\t\t\tcenter();\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ signal: controller.signal },\n\t\t);\n\n\t\treturn () => controller.abort();\n\t}, []);\n\n\treturn (\n\t\t<Tooltip>\n\t\t\t<TooltipTrigger asChild>\n\t\t\t\t<Button variant=\"ghost\" size=\"icon\" onClick={center}>\n\t\t\t\t\t<Icon id=\"Crosshair\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t</TooltipTrigger>\n\t\t\t<TooltipContent>Recenter (c)</TooltipContent>\n\t\t</Tooltip>\n\t);\n}\n","import { useCallback, useEffect } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons/icon\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { isEventTargetInput } from \"./utilities\";\n\ntype FlowRunGraphFullscreenButtonProps = {\n\tfullscreen: boolean;\n\tonFullscreenChange: (fullscreen: boolean) => void;\n};\n\nexport function FlowRunGraphFullscreenButton({\n\tfullscreen,\n\tonFullscreenChange,\n}: FlowRunGraphFullscreenButtonProps) {\n\tconst toggleFullscreen = useCallback(() => {\n\t\tonFullscreenChange(!fullscreen);\n\t}, [fullscreen, onFullscreenChange]);\n\n\tuseEffect(() => {\n\t\tconst controller = new AbortController();\n\n\t\tdocument.addEventListener(\n\t\t\t\"keydown\",\n\t\t\t(event: KeyboardEvent) => {\n\t\t\t\tif (\n\t\t\t\t\tisEventTargetInput(event.target) ||\n\t\t\t\t\tevent.metaKey ||\n\t\t\t\t\tevent.ctrlKey\n\t\t\t\t) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (event.key === \"f\") {\n\t\t\t\t\ttoggleFullscreen();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (event.key === \"Escape\") {\n\t\t\t\t\ttoggleFullscreen();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t},\n\t\t\t{ signal: controller.signal },\n\t\t);\n\n\t\treturn () => controller.abort();\n\t}, [toggleFullscreen]);\n\n\treturn (\n\t\t<Tooltip>\n\t\t\t<TooltipTrigger asChild>\n\t\t\t\t<Button variant=\"ghost\" size=\"icon\" onClick={toggleFullscreen}>\n\t\t\t\t\t<Icon id=\"Expand\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t</TooltipTrigger>\n\t\t\t<TooltipContent>Fullscreen (f)</TooltipContent>\n\t\t</Tooltip>\n\t);\n}\n","import {\n\tDEFAULT_HORIZONTAL_SCALE_MULTIPLIER,\n\ttype HorizontalMode,\n\tisHorizontalMode,\n\tisVerticalMode,\n\tlayout,\n\tresetHorizontalScaleMultiplier,\n\tsetDisabledArtifacts,\n\tsetDisabledEdges,\n\tsetDisabledEvents,\n\tsetHorizontalMode,\n\tsetHorizontalScaleMultiplier,\n\tsetVerticalMode,\n\ttype VerticalMode,\n} from \"@prefecthq/graphs\";\nimport { useCallback, useState } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { Label } from \"@/components/ui/label\";\nimport { Switch } from \"@/components/ui/switch\";\nimport { Typography } from \"@/components/ui/typography\";\n\ntype LayoutOption = `${HorizontalMode}_${VerticalMode}`;\n\nconst layoutOptions: { label: string; value: LayoutOption }[] = [\n\t{\n\t\tlabel: \"Temporal dependency\",\n\t\tvalue: \"temporal_nearest-parent\",\n\t},\n\t{\n\t\tlabel: \"Temporal sequence\",\n\t\tvalue: \"temporal_waterfall\",\n\t},\n\t{\n\t\tlabel: \"Dependency grid\",\n\t\tvalue: \"dependency_nearest-parent\",\n\t},\n\t{\n\t\tlabel: \"Sequential grid\",\n\t\tvalue: \"dependency_waterfall\",\n\t},\n\t{\n\t\tlabel: \"Comparative duration\",\n\t\tvalue: \"left-aligned_duration-sorted\",\n\t},\n];\n\nconst increaseScale = () => {\n\tconst multiplier = DEFAULT_HORIZONTAL_SCALE_MULTIPLIER + 1;\n\tconst scale = layout.horizontalScaleMultiplier * multiplier;\n\tsetHorizontalScaleMultiplier(scale);\n};\n\nconst decreaseScale = () => {\n\tconst multiplier = Math.abs(DEFAULT_HORIZONTAL_SCALE_MULTIPLIER - 1);\n\tconst scale = layout.horizontalScaleMultiplier * multiplier;\n\tsetHorizontalScaleMultiplier(scale);\n};\n\nconst resetScale = () => {\n\tresetHorizontalScaleMultiplier();\n};\n\nfunction isLayoutOption(value: string): value is LayoutOption {\n\tconst [horizontal, vertical] = value.split(\"_\");\n\treturn isHorizontalMode(horizontal) && isVerticalMode(vertical);\n}\n\nexport function FlowRunGraphSettings() {\n\tconst [selectedLayoutOption, setSelectedLayoutOption] = useState(\n\t\t`${layout.horizontal}_${layout.vertical}`,\n\t);\n\tconst [hideEdges, setHideEdges] = useState(layout.disableEdges);\n\tconst [hideArtifacts, setHideArtifacts] = useState(layout.disableArtifacts);\n\tconst [hideEvents, setHideEvents] = useState(layout.disableEvents);\n\n\tconst handleLayoutChange = useCallback((value: string) => {\n\t\tif (!isLayoutOption(value)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst [horizontal, vertical] = value.split(\"_\");\n\n\t\tif (!isHorizontalMode(horizontal) || !isVerticalMode(vertical)) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetSelectedLayoutOption(value);\n\t\tsetHorizontalMode(horizontal);\n\t\tsetVerticalMode(vertical);\n\t}, []);\n\n\tconst handleHideEdgesChange = useCallback((value: boolean) => {\n\t\tsetHideEdges(value);\n\t\tsetDisabledEdges(value);\n\t}, []);\n\n\tconst handleHideArtifactsChange = useCallback((value: boolean) => {\n\t\tsetHideArtifacts(value);\n\t\tsetDisabledArtifacts(value);\n\t}, []);\n\n\tconst handleHideEventsChange = useCallback((value: boolean) => {\n\t\tsetHideEvents(value);\n\t\tsetDisabledEvents(value);\n\t}, []);\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t<Typography variant=\"bodyLarge\">Layout</Typography>\n\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t{layoutOptions.map((option) => (\n\t\t\t\t\t\t<div key={option.value} className=\"flex items-center gap-2\">\n\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\ttype=\"radio\"\n\t\t\t\t\t\t\t\tid={option.value}\n\t\t\t\t\t\t\t\tname=\"layout\"\n\t\t\t\t\t\t\t\tvalue={option.value}\n\t\t\t\t\t\t\t\tchecked={selectedLayoutOption === option.value}\n\t\t\t\t\t\t\t\tonChange={(e) => handleLayoutChange(e.target.value)}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<Label htmlFor={option.value}>{option.label}</Label>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t))}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{(layout.isTemporal() || layout.isLeftAligned()) && (\n\t\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t\t<Typography variant=\"bodyLarge\">Scaling</Typography>\n\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\tonClick={decreaseScale}\n\t\t\t\t\t\t\ttitle=\"Decrease scale (-)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t-\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\tonClick={increaseScale}\n\t\t\t\t\t\t\ttitle=\"Increase scale (+)\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t+\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t<Button variant=\"outline\" size=\"sm\" onClick={resetScale}>\n\t\t\t\t\t\t\tReset\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<hr className=\"my-4\" />\n\n\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<Switch\n\t\t\t\t\t\tid=\"hideEdges\"\n\t\t\t\t\t\tchecked={hideEdges}\n\t\t\t\t\t\tonCheckedChange={handleHideEdgesChange}\n\t\t\t\t\t/>\n\t\t\t\t\t<Label htmlFor=\"hideEdges\">Hide dependency arrows</Label>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<Switch\n\t\t\t\t\t\tid=\"hideArtifacts\"\n\t\t\t\t\t\tchecked={hideArtifacts}\n\t\t\t\t\t\tonCheckedChange={handleHideArtifactsChange}\n\t\t\t\t\t/>\n\t\t\t\t\t<Label htmlFor=\"hideArtifacts\">Hide artifacts</Label>\n\t\t\t\t</div>\n\n\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t<Switch\n\t\t\t\t\t\tid=\"hideEvents\"\n\t\t\t\t\t\tchecked={hideEvents}\n\t\t\t\t\t\tonCheckedChange={handleHideEventsChange}\n\t\t\t\t\t/>\n\t\t\t\t\t<Label htmlFor=\"hideEvents\">Hide events</Label>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","import { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons/icon\";\nimport {\n\tPopover,\n\tPopoverContent,\n\tPopoverTrigger,\n} from \"@/components/ui/popover\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { FlowRunGraphSettings } from \"./flow-run-graph-settings\";\n\nexport function FlowRunGraphSettingsButton() {\n\treturn (\n\t\t<Popover>\n\t\t\t<PopoverTrigger>\n\t\t\t\t<Tooltip>\n\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t<Button variant=\"ghost\" size=\"icon\">\n\t\t\t\t\t\t\t<Icon id=\"Cog\" className=\"size-4\" />\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t<TooltipContent>Settings</TooltipContent>\n\t\t\t\t</Tooltip>\n\t\t\t</PopoverTrigger>\n\t\t\t<PopoverContent>\n\t\t\t\t<FlowRunGraphSettings />\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n}\n","import { FlowRunGraphCenterButton } from \"./flow-run-graph-center-button\";\nimport { FlowRunGraphFullscreenButton } from \"./flow-run-graph-fullscreen-button\";\nimport { FlowRunGraphSettingsButton } from \"./flow-run-graph-settings-button\";\n\ntype FlowRunGraphActionsProps = {\n\tfullscreen: boolean;\n\tonFullscreenChange: (fullscreen: boolean) => void;\n};\n\nexport function FlowRunGraphActions({\n\tfullscreen,\n\tonFullscreenChange,\n}: FlowRunGraphActionsProps) {\n\treturn (\n\t\t<div className=\"flex gap-2\">\n\t\t\t<FlowRunGraphCenterButton />\n\t\t\t<FlowRunGraphFullscreenButton\n\t\t\t\tfullscreen={fullscreen}\n\t\t\t\tonFullscreenChange={onFullscreenChange}\n\t\t\t/>\n\t\t\t<FlowRunGraphSettingsButton />\n\t\t</div>\n\t);\n}\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { Suspense } from \"react\";\nimport { buildGetArtifactQuery } from \"@/api/artifacts\";\nimport { FormattedDate } from \"@/components/ui/formatted-date/formatted-date\";\nimport { KeyValue } from \"@/components/ui/key-value\";\nimport {\n\tSheet,\n\tSheetContent,\n\tSheetHeader,\n\tSheetTitle,\n} from \"@/components/ui/sheet\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { Typography } from \"@/components/ui/typography\";\n\ntype FlowRunGraphArtifactDrawerProps = {\n\tartifactId: string | null;\n\tonClose: () => void;\n};\n\nexport function FlowRunGraphArtifactDrawer({\n\tartifactId,\n\tonClose,\n}: FlowRunGraphArtifactDrawerProps) {\n\treturn (\n\t\t<Sheet\n\t\t\topen={artifactId !== null}\n\t\t\tonOpenChange={(open) => !open && onClose()}\n\t\t>\n\t\t\t<SheetContent>\n\t\t\t\t<SheetHeader>\n\t\t\t\t\t<SheetTitle>Artifact Details</SheetTitle>\n\t\t\t\t</SheetHeader>\n\t\t\t\t{artifactId && (\n\t\t\t\t\t<Suspense fallback={<ArtifactContentSkeleton />}>\n\t\t\t\t\t\t<ArtifactContent artifactId={artifactId} />\n\t\t\t\t\t</Suspense>\n\t\t\t\t)}\n\t\t\t</SheetContent>\n\t\t</Sheet>\n\t);\n}\n\nfunction ArtifactContentSkeleton() {\n\treturn (\n\t\t<div className=\"space-y-4 p-4\">\n\t\t\t<Skeleton className=\"h-6 w-32\" />\n\t\t\t<Skeleton className=\"h-4 w-24\" />\n\t\t\t<Skeleton className=\"h-4 w-48\" />\n\t\t\t<Skeleton className=\"h-32 w-full\" />\n\t\t</div>\n\t);\n}\n\nfunction ArtifactContent({ artifactId }: { artifactId: string }) {\n\tconst { data: artifact } = useSuspenseQuery(\n\t\tbuildGetArtifactQuery(artifactId),\n\t);\n\n\treturn (\n\t\t<div className=\"space-y-4 p-4\">\n\t\t\t<KeyValue\n\t\t\t\tlabel=\"Key\"\n\t\t\t\tvalue={\n\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"font-medium\">\n\t\t\t\t\t\t{artifact.key ?? \"Unnamed\"}\n\t\t\t\t\t</Typography>\n\t\t\t\t}\n\t\t\t/>\n\t\t\t{artifact.type && (\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Type\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"uppercase\">\n\t\t\t\t\t\t\t{artifact.type}\n\t\t\t\t\t\t</Typography>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{artifact.description && (\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Description\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<Typography variant=\"bodySmall\">{artifact.description}</Typography>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{artifact.created && (\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Created\"\n\t\t\t\t\tvalue={<FormattedDate date={artifact.created} />}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{artifact.data !== undefined && artifact.data !== null && (\n\t\t\t\t<div className=\"space-y-2\">\n\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"text-muted-foreground\">\n\t\t\t\t\t\tData\n\t\t\t\t\t</Typography>\n\t\t\t\t\t<pre className=\"bg-muted p-3 rounded-md text-sm overflow-auto max-h-64\">\n\t\t\t\t\t\t{typeof artifact.data === \"string\"\n\t\t\t\t\t\t\t? artifact.data\n\t\t\t\t\t\t\t: JSON.stringify(artifact.data, null, 2)}\n\t\t\t\t\t</pre>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import type { ArtifactsSelection } from \"@prefecthq/graphs\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { buildListArtifactsQuery } from \"@/api/artifacts\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\nimport {\n\tPopover,\n\tPopoverAnchor,\n\tPopoverContent,\n} from \"@/components/ui/popover\";\nimport { Typography } from \"@/components/ui/typography\";\n\ntype FlowRunGraphArtifactsPopoverProps = {\n\tselection: ArtifactsSelection;\n\tonClose: () => void;\n\tonViewArtifact: (artifactId: string) => void;\n};\n\nexport function FlowRunGraphArtifactsPopover({\n\tselection,\n\tonClose,\n\tonViewArtifact,\n}: FlowRunGraphArtifactsPopoverProps) {\n\tconst { data: artifacts, isLoading } = useQuery(\n\t\tbuildListArtifactsQuery({\n\t\t\tartifacts: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tid: { any_: selection.ids },\n\t\t\t},\n\t\t\tsort: \"CREATED_DESC\",\n\t\t\toffset: 0,\n\t\t}),\n\t);\n\n\tconst position = selection.position;\n\tif (!position) {\n\t\treturn null;\n\t}\n\n\tconst anchorStyle = {\n\t\tposition: \"absolute\" as const,\n\t\tleft: `${position.x + position.width / 2}px`,\n\t\ttop: `${position.y + position.height}px`,\n\t};\n\n\treturn (\n\t\t<Popover open onOpenChange={(open) => !open && onClose()}>\n\t\t\t<PopoverAnchor style={anchorStyle} />\n\t\t\t<PopoverContent align=\"center\" side=\"bottom\" className=\"w-72\">\n\t\t\t\t<div className=\"flex items-center justify-between mb-3\">\n\t\t\t\t\t<Typography variant=\"bodySmall\" className=\"font-semibold\">\n\t\t\t\t\t\tArtifacts\n\t\t\t\t\t</Typography>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\taria-label=\"Close popover\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon id=\"X\" className=\"size-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t\t{isLoading ? (\n\t\t\t\t\t<div className=\"flex items-center justify-center py-4\">\n\t\t\t\t\t\t<Icon id=\"Loader2\" className=\"size-4 animate-spin\" />\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"space-y-2 max-h-64 overflow-y-auto\">\n\t\t\t\t\t\t{artifacts\n\t\t\t\t\t\t\t?.filter((artifact) => artifact.id !== undefined)\n\t\t\t\t\t\t\t.map((artifact) => (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={artifact.id}\n\t\t\t\t\t\t\t\t\tclassName=\"flex items-center justify-between gap-2 p-2 rounded-md border bg-muted/50\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div className=\"flex flex-col min-w-0 flex-1\">\n\t\t\t\t\t\t\t\t\t\t<Typography\n\t\t\t\t\t\t\t\t\t\t\tvariant=\"bodySmall\"\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"font-medium truncate\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t{artifact.key ?? \"Unnamed\"}\n\t\t\t\t\t\t\t\t\t\t</Typography>\n\t\t\t\t\t\t\t\t\t\t{artifact.type && (\n\t\t\t\t\t\t\t\t\t\t\t<Typography\n\t\t\t\t\t\t\t\t\t\t\t\tvariant=\"xsmall\"\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-muted-foreground uppercase\"\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{artifact.type}\n\t\t\t\t\t\t\t\t\t\t\t</Typography>\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\t\t\tsize=\"sm\"\n\t\t\t\t\t\t\t\t\t\tonClick={() => onViewArtifact(artifact.id as string)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\tView\n\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n}\n","import type { EventSelection } from \"@prefecthq/graphs\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { Link } from \"@tanstack/react-router\";\nimport { format, isValid, parseISO } from \"date-fns\";\nimport { Suspense } from \"react\";\nimport { buildGetEventQuery, type Event } from \"@/api/events\";\nimport type { components } from \"@/api/prefect\";\nimport {\n\tEventResourceLink,\n\textractResourceId,\n\tparseResourceType,\n\tResourceDisplaySkeleton,\n\tResourceDisplayWithIcon,\n} from \"@/components/events/event-resource-display\";\nimport { ResolvedResourceDisplay } from \"@/components/events/event-resource-display/resolved-resource-display\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { KeyValue } from \"@/components/ui/key-value\";\nimport {\n\tPopover,\n\tPopoverAnchor,\n\tPopoverContent,\n} from \"@/components/ui/popover\";\n\ntype RelatedResource = components[\"schemas\"][\"RelatedResource\"];\n\ntype FlowRunGraphEventPopoverProps = {\n\tselection: EventSelection;\n\tonClose: () => void;\n};\n\n/**\n * Converts an event name like \"prefect.flow-run.Running\" to a human-readable label\n * like \"Flow run running\"\n */\nfunction getEventLabel(eventName: string): string {\n\t// Remove \"prefect.\" or \"prefect-cloud.\" prefix\n\tlet label = eventName;\n\tif (label.startsWith(\"prefect.\")) {\n\t\tlabel = label.slice(8);\n\t} else if (label.startsWith(\"prefect-cloud.\")) {\n\t\tlabel = label.slice(14);\n\t}\n\n\t// Replace dots, dashes, and underscores with spaces\n\tlabel = label.replace(/[._-]/g, \" \");\n\n\t// Capitalize first letter, lowercase the rest\n\treturn label.charAt(0).toUpperCase() + label.slice(1).toLowerCase();\n}\n\n/**\n * Formats a date to numeric format like \"2026/01/25 08:18:11 PM\"\n */\nfunction formatDateNumeric(date: string | Date): string {\n\tlet parsedDate: Date;\n\tif (typeof date === \"string\") {\n\t\tparsedDate = parseISO(date);\n\t} else {\n\t\tparsedDate = date;\n\t}\n\n\tif (!isValid(parsedDate)) {\n\t\treturn \"Invalid date\";\n\t}\n\n\treturn format(parsedDate, \"yyyy/MM/dd hh:mm:ss a\");\n}\n\nfunction getResourceName(resource: Record<string, string>): string | null {\n\treturn (\n\t\tresource[\"prefect.resource.name\"] ||\n\t\tresource[\"prefect.name\"] ||\n\t\tresource[\"prefect-cloud.name\"] ||\n\t\tnull\n\t);\n}\n\ntype EventResourceSectionProps = {\n\tevent: Event;\n};\n\nfunction EventResourceSection({ event }: EventResourceSectionProps) {\n\tconst resourceName = getResourceName(event.resource);\n\tconst prefectResourceId = event.resource[\"prefect.resource.id\"] || \"\";\n\tconst resourceType = parseResourceType(prefectResourceId);\n\tconst extractedId = extractResourceId(prefectResourceId);\n\tconst relatedResources = event.related ?? [];\n\n\t// If we have a resource name, display it with the appropriate icon\n\tif (resourceName) {\n\t\treturn (\n\t\t\t<Suspense fallback={<ResourceDisplaySkeleton />}>\n\t\t\t\t<EventResourceLink\n\t\t\t\t\tresource={event.resource as RelatedResource}\n\t\t\t\t\trelatedResources={relatedResources}\n\t\t\t\t\tclassName=\"hover:underline text-primary\"\n\t\t\t\t>\n\t\t\t\t\t<ResourceDisplayWithIcon\n\t\t\t\t\t\tresourceType={resourceType}\n\t\t\t\t\t\tdisplayText={resourceName}\n\t\t\t\t\t\tclassName=\"text-sm\"\n\t\t\t\t\t/>\n\t\t\t\t</EventResourceLink>\n\t\t\t</Suspense>\n\t\t);\n\t}\n\n\t// If we have an extracted ID but no name, try to fetch the resource name via API\n\tif (extractedId && resourceType !== \"unknown\") {\n\t\treturn (\n\t\t\t<Suspense fallback={<ResourceDisplaySkeleton />}>\n\t\t\t\t<EventResourceLink\n\t\t\t\t\tresource={event.resource as RelatedResource}\n\t\t\t\t\trelatedResources={relatedResources}\n\t\t\t\t\tclassName=\"hover:underline text-primary\"\n\t\t\t\t>\n\t\t\t\t\t<ResolvedResourceDisplay\n\t\t\t\t\t\tresourceType={resourceType}\n\t\t\t\t\t\tresourceId={extractedId}\n\t\t\t\t\t\tclassName=\"text-sm\"\n\t\t\t\t\t/>\n\t\t\t\t</EventResourceLink>\n\t\t\t</Suspense>\n\t\t);\n\t}\n\n\t// Fallback: show the raw resource ID\n\treturn (\n\t\t<span className=\"text-sm text-muted-foreground font-mono\">\n\t\t\t{prefectResourceId || \"Unknown\"}\n\t\t</span>\n\t);\n}\n\ntype RelatedResourcesSectionProps = {\n\trelatedResources: RelatedResource[];\n};\n\nfunction RelatedResourcesSection({\n\trelatedResources,\n}: RelatedResourcesSectionProps) {\n\t// Filter out tag resources and only show meaningful related resources\n\tconst filteredResources = relatedResources.filter((resource) => {\n\t\tconst role = resource[\"prefect.resource.role\"];\n\t\tconst resourceId = resource[\"prefect.resource.id\"] || \"\";\n\t\t// Exclude tags and resources without a valid type\n\t\tif (role === \"tag\" || resourceId.startsWith(\"prefect.tag.\")) {\n\t\t\treturn false;\n\t\t}\n\t\tconst resourceType = parseResourceType(resourceId);\n\t\treturn resourceType !== \"unknown\";\n\t});\n\n\tif (filteredResources.length === 0) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<KeyValue\n\t\t\tlabel=\"Related Resources\"\n\t\t\tvalue={\n\t\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t\t{filteredResources.map((resource) => {\n\t\t\t\t\t\tconst resourceName = getResourceName(resource);\n\t\t\t\t\t\tconst prefectResourceId = resource[\"prefect.resource.id\"] || \"\";\n\t\t\t\t\t\tconst resourceType = parseResourceType(prefectResourceId);\n\t\t\t\t\t\tconst extractedId = extractResourceId(prefectResourceId);\n\n\t\t\t\t\t\tif (resourceName) {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Suspense\n\t\t\t\t\t\t\t\t\tkey={prefectResourceId}\n\t\t\t\t\t\t\t\t\tfallback={<ResourceDisplaySkeleton />}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<EventResourceLink\n\t\t\t\t\t\t\t\t\t\tresource={resource}\n\t\t\t\t\t\t\t\t\t\trelatedResources={relatedResources}\n\t\t\t\t\t\t\t\t\t\tclassName=\"hover:underline text-primary\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<ResourceDisplayWithIcon\n\t\t\t\t\t\t\t\t\t\t\tresourceType={resourceType}\n\t\t\t\t\t\t\t\t\t\t\tdisplayText={resourceName}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-sm\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</EventResourceLink>\n\t\t\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (extractedId && resourceType !== \"unknown\") {\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<Suspense\n\t\t\t\t\t\t\t\t\tkey={prefectResourceId}\n\t\t\t\t\t\t\t\t\tfallback={<ResourceDisplaySkeleton />}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<EventResourceLink\n\t\t\t\t\t\t\t\t\t\tresource={resource}\n\t\t\t\t\t\t\t\t\t\trelatedResources={relatedResources}\n\t\t\t\t\t\t\t\t\t\tclassName=\"hover:underline text-primary\"\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<ResolvedResourceDisplay\n\t\t\t\t\t\t\t\t\t\t\tresourceType={resourceType}\n\t\t\t\t\t\t\t\t\t\t\tresourceId={extractedId}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"text-sm\"\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</EventResourceLink>\n\t\t\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tkey={prefectResourceId}\n\t\t\t\t\t\t\t\tclassName=\"text-sm text-muted-foreground font-mono\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{prefectResourceId}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t);\n\t\t\t\t\t})}\n\t\t\t\t</div>\n\t\t\t}\n\t\t/>\n\t);\n}\n\nexport function FlowRunGraphEventPopover({\n\tselection,\n\tonClose,\n}: FlowRunGraphEventPopoverProps) {\n\tconst { data: event, isLoading } = useQuery(\n\t\tbuildGetEventQuery(selection.id, selection.occurred),\n\t);\n\n\tconst position = selection.position;\n\tif (!position) {\n\t\treturn null;\n\t}\n\n\tconst anchorStyle = {\n\t\tposition: \"absolute\" as const,\n\t\tleft: `${position.x + position.width / 2}px`,\n\t\ttop: `${position.y + position.height}px`,\n\t};\n\n\tconst eventName = event?.event ?? \"\";\n\tconst eventLabel = eventName ? getEventLabel(eventName) : \"Loading...\";\n\tconst relatedResources = event?.related ?? [];\n\n\treturn (\n\t\t<Popover open onOpenChange={(open) => !open && onClose()}>\n\t\t\t<PopoverAnchor style={anchorStyle} />\n\t\t\t<PopoverContent align=\"center\" side=\"bottom\" className=\"w-80\">\n\t\t\t\t<div className=\"flex justify-between items-start mb-3\">\n\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">Event</span>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\taria-label=\"Close popover\"\n\t\t\t\t\t\tclassName=\"-mt-1 -mr-2\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon id=\"X\" className=\"size-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t\t{isLoading ? (\n\t\t\t\t\t<div className=\"flex items-center justify-center py-4\">\n\t\t\t\t\t\t<Icon id=\"Loader2\" className=\"size-4 animate-spin\" />\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<div className=\"space-y-3\">\n\t\t\t\t\t\t<div className=\"flex flex-col gap-0.5\">\n\t\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\t\tto=\"/events\"\n\t\t\t\t\t\t\t\tsearch={{ event: [eventName] }}\n\t\t\t\t\t\t\t\tclassName=\"text-sm text-primary hover:underline font-medium\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{eventLabel}\n\t\t\t\t\t\t\t</Link>\n\t\t\t\t\t\t\t<span className=\"text-xs text-muted-foreground\">{eventName}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<KeyValue\n\t\t\t\t\t\t\tlabel=\"Occurred\"\n\t\t\t\t\t\t\tvalue={\n\t\t\t\t\t\t\t\t<span className=\"text-sm\">\n\t\t\t\t\t\t\t\t\t{formatDateNumeric(selection.occurred)}\n\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t{event && (\n\t\t\t\t\t\t\t<KeyValue\n\t\t\t\t\t\t\t\tlabel=\"Resource\"\n\t\t\t\t\t\t\t\tvalue={<EventResourceSection event={event} />}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t\t{relatedResources.length > 0 && (\n\t\t\t\t\t\t\t<RelatedResourcesSection relatedResources={relatedResources} />\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n}\n","import type { EventsSelection } from \"@prefecthq/graphs\";\nimport { useQueries } from \"@tanstack/react-query\";\nimport { buildGetEventQuery } from \"@/api/events\";\nimport { Button } from \"@/components/ui/button\";\nimport { FormattedDate } from \"@/components/ui/formatted-date/formatted-date\";\nimport { Icon } from \"@/components/ui/icons\";\nimport {\n\tPopover,\n\tPopoverAnchor,\n\tPopoverContent,\n} from \"@/components/ui/popover\";\nimport { ScrollArea } from \"@/components/ui/scroll-area\";\n\ntype FlowRunGraphEventsPopoverProps = {\n\tselection: EventsSelection;\n\tonClose: () => void;\n};\n\nexport function FlowRunGraphEventsPopover({\n\tselection,\n\tonClose,\n}: FlowRunGraphEventsPopoverProps) {\n\tconst eventQueries = useQueries({\n\t\tqueries: selection.ids.map((id) =>\n\t\t\tbuildGetEventQuery(id, selection.occurred ?? new Date()),\n\t\t),\n\t});\n\n\tconst position = selection.position;\n\tif (!position) {\n\t\treturn null;\n\t}\n\n\tconst anchorStyle = {\n\t\tposition: \"absolute\" as const,\n\t\tleft: `${position.x + position.width / 2}px`,\n\t\ttop: `${position.y + position.height}px`,\n\t};\n\n\tconst isLoading = eventQueries.some((q) => q.isLoading);\n\tconst events = eventQueries\n\t\t.map((q) => q.data)\n\t\t.filter((e): e is NonNullable<typeof e> => e !== undefined);\n\n\treturn (\n\t\t<Popover open onOpenChange={(open) => !open && onClose()}>\n\t\t\t<PopoverAnchor style={anchorStyle} />\n\t\t\t<PopoverContent align=\"center\" side=\"bottom\" className=\"w-80\">\n\t\t\t\t<div className=\"flex items-center justify-between mb-2\">\n\t\t\t\t\t<span className=\"text-sm font-medium\">\n\t\t\t\t\t\t{selection.ids.length} Events\n\t\t\t\t\t</span>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t\taria-label=\"Close popover\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<Icon id=\"X\" className=\"size-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t\t{isLoading ? (\n\t\t\t\t\t<div className=\"flex items-center justify-center py-4\">\n\t\t\t\t\t\t<Icon id=\"Loader2\" className=\"size-4 animate-spin\" />\n\t\t\t\t\t</div>\n\t\t\t\t) : (\n\t\t\t\t\t<ScrollArea className=\"max-h-64\">\n\t\t\t\t\t\t<div className=\"space-y-3\">\n\t\t\t\t\t\t\t{events.map((event) => (\n\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\tkey={event.id}\n\t\t\t\t\t\t\t\t\tclassName=\"border-b pb-2 last:border-b-0 last:pb-0\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName=\"text-sm font-mono truncate\"\n\t\t\t\t\t\t\t\t\t\ttitle={event.event}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{event.event}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t<div className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t<FormattedDate date={new Date(event.occurred)} />\n\t\t\t\t\t\t\t\t\t</div>\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</div>\n\t\t\t\t\t</ScrollArea>\n\t\t\t\t)}\n\t\t\t</PopoverContent>\n\t\t</Popover>\n\t);\n}\n","import { type GraphItemSelection, isNodeSelection } from \"@prefecthq/graphs\";\nimport { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { Link } from \"@tanstack/react-router\";\nimport { Suspense } from \"react\";\nimport { buildGetFlowRunDetailsQuery } from \"@/api/flow-runs\";\nimport { buildGetTaskRunQuery } from \"@/api/task-runs\";\nimport { Button } from \"@/components/ui/button\";\nimport { FormattedDate } from \"@/components/ui/formatted-date/formatted-date\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { KeyValue } from \"@/components/ui/key-value\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\nimport { TagBadgeGroup } from \"@/components/ui/tag-badge-group\";\nimport { secondsToApproximateString } from \"@/utils/seconds\";\n\ntype FlowRunGraphSelectionPanelProps = {\n\tselection: GraphItemSelection;\n\tonClose: () => void;\n};\n\nexport function FlowRunGraphSelectionPanel({\n\tselection,\n\tonClose,\n}: FlowRunGraphSelectionPanelProps) {\n\tif (!isNodeSelection(selection)) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div className=\"absolute top-4 right-4 z-10 w-72 rounded-lg border bg-card p-4 shadow-md\">\n\t\t\t<Suspense fallback={<SelectionPanelSkeleton onClose={onClose} />}>\n\t\t\t\t{selection.kind === \"task-run\" && (\n\t\t\t\t\t<TaskRunDetails taskRunId={selection.id} onClose={onClose} />\n\t\t\t\t)}\n\t\t\t\t{selection.kind === \"flow-run\" && (\n\t\t\t\t\t<FlowRunDetails flowRunId={selection.id} onClose={onClose} />\n\t\t\t\t)}\n\t\t\t</Suspense>\n\t\t</div>\n\t);\n}\n\ntype SelectionPanelSkeletonProps = {\n\tonClose: () => void;\n};\n\nfunction SelectionPanelSkeleton({ onClose }: SelectionPanelSkeletonProps) {\n\treturn (\n\t\t<div className=\"space-y-3\">\n\t\t\t<div className=\"flex items-start justify-between gap-2\">\n\t\t\t\t<Skeleton className=\"h-6 w-3/4\" />\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t\taria-label=\"Close panel\"\n\t\t\t\t\tclassName=\"shrink-0 -mt-1 -mr-2\"\n\t\t\t\t>\n\t\t\t\t\t<Icon id=\"X\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t\t<Skeleton className=\"h-5 w-1/2\" />\n\t\t\t<Skeleton className=\"h-5 w-full\" />\n\t\t\t<Skeleton className=\"h-5 w-2/3\" />\n\t\t\t<Skeleton className=\"h-5 w-1/2\" />\n\t\t</div>\n\t);\n}\n\ntype TaskRunDetailsProps = {\n\ttaskRunId: string;\n\tonClose: () => void;\n};\n\nfunction TaskRunDetails({ taskRunId, onClose }: TaskRunDetailsProps) {\n\tconst { data: taskRun } = useSuspenseQuery(buildGetTaskRunQuery(taskRunId));\n\n\tconst duration =\n\t\ttaskRun.estimated_run_time && taskRun.estimated_run_time > 0\n\t\t\t? taskRun.estimated_run_time\n\t\t\t: (taskRun.total_run_time ?? 0);\n\n\treturn (\n\t\t<div className=\"space-y-3\">\n\t\t\t<div className=\"flex items-start justify-between gap-2\">\n\t\t\t\t<h3 className=\"font-semibold text-base\">\n\t\t\t\t\t<Link\n\t\t\t\t\t\tto=\"/runs/task-run/$id\"\n\t\t\t\t\t\tparams={{ id: taskRunId }}\n\t\t\t\t\t\tclassName=\"hover:underline text-foreground\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{taskRun.name}\n\t\t\t\t\t</Link>\n\t\t\t\t</h3>\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t\taria-label=\"Close panel\"\n\t\t\t\t\tclassName=\"shrink-0 -mt-1 -mr-2\"\n\t\t\t\t>\n\t\t\t\t\t<Icon id=\"X\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t\t<div className=\"space-y-3\">\n\t\t\t\t{taskRun.state && (\n\t\t\t\t\t<KeyValue\n\t\t\t\t\t\tlabel=\"State\"\n\t\t\t\t\t\tvalue={\n\t\t\t\t\t\t\t<StateBadge type={taskRun.state.type} name={taskRun.state.name} />\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t<KeyValue label=\"Task Run ID\" value={taskRun.id} copyable />\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Duration\"\n\t\t\t\t\tvalue={duration > 0 ? secondsToApproximateString(duration) : \"-\"}\n\t\t\t\t/>\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Created\"\n\t\t\t\t\tvalue={<FormattedDate date={taskRun.created} />}\n\t\t\t\t/>\n\t\t\t\t{taskRun.tags && taskRun.tags.length > 0 && (\n\t\t\t\t\t<KeyValue\n\t\t\t\t\t\tlabel=\"Tags\"\n\t\t\t\t\t\tvalue={<TagBadgeGroup tags={taskRun.tags} />}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\ntype FlowRunDetailsProps = {\n\tflowRunId: string;\n\tonClose: () => void;\n};\n\nfunction FlowRunDetails({ flowRunId, onClose }: FlowRunDetailsProps) {\n\tconst { data: flowRun } = useSuspenseQuery(\n\t\tbuildGetFlowRunDetailsQuery(flowRunId),\n\t);\n\n\tconst duration = flowRun.total_run_time ?? 0;\n\n\treturn (\n\t\t<div className=\"space-y-3\">\n\t\t\t<div className=\"flex items-start justify-between gap-2\">\n\t\t\t\t<h3 className=\"font-semibold text-base\">\n\t\t\t\t\t<Link\n\t\t\t\t\t\tto=\"/runs/flow-run/$id\"\n\t\t\t\t\t\tparams={{ id: flowRunId }}\n\t\t\t\t\t\tclassName=\"hover:underline text-foreground\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{flowRun.name}\n\t\t\t\t\t</Link>\n\t\t\t\t</h3>\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t\taria-label=\"Close panel\"\n\t\t\t\t\tclassName=\"shrink-0 -mt-1 -mr-2\"\n\t\t\t\t>\n\t\t\t\t\t<Icon id=\"X\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t\t<div className=\"space-y-3\">\n\t\t\t\t{flowRun.state && (\n\t\t\t\t\t<KeyValue\n\t\t\t\t\t\tlabel=\"State\"\n\t\t\t\t\t\tvalue={\n\t\t\t\t\t\t\t<StateBadge type={flowRun.state.type} name={flowRun.state.name} />\n\t\t\t\t\t\t}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t<KeyValue label=\"Flow Run ID\" value={flowRun.id} copyable />\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Duration\"\n\t\t\t\t\tvalue={duration > 0 ? secondsToApproximateString(duration) : \"-\"}\n\t\t\t\t/>\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Created\"\n\t\t\t\t\tvalue={<FormattedDate date={flowRun.created} />}\n\t\t\t\t/>\n\t\t\t\t{flowRun.tags && flowRun.tags.length > 0 && (\n\t\t\t\t\t<KeyValue\n\t\t\t\t\t\tlabel=\"Tags\"\n\t\t\t\t\t\tvalue={<TagBadgeGroup tags={flowRun.tags} />}\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 { StateSelection } from \"@prefecthq/graphs\";\nimport { useEffect, useRef } from \"react\";\nimport { Button } from \"@/components/ui/button\";\nimport { FormattedDate } from \"@/components/ui/formatted-date/formatted-date\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { KeyValue } from \"@/components/ui/key-value\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\n\ntype FlowRunGraphStatePopoverProps = {\n\tselection: StateSelection;\n\tonClose: () => void;\n};\n\nexport function FlowRunGraphStatePopover({\n\tselection,\n\tonClose,\n}: FlowRunGraphStatePopoverProps) {\n\tconst popoverRef = useRef<HTMLDivElement>(null);\n\n\tuseEffect(() => {\n\t\tconst handleClickOutside = (event: MouseEvent) => {\n\t\t\tif (\n\t\t\t\tpopoverRef.current &&\n\t\t\t\t!popoverRef.current.contains(event.target as Node)\n\t\t\t) {\n\t\t\t\tonClose();\n\t\t\t}\n\t\t};\n\n\t\tconst handleEscape = (event: KeyboardEvent) => {\n\t\t\tif (event.key === \"Escape\") {\n\t\t\t\tonClose();\n\t\t\t}\n\t\t};\n\n\t\tdocument.addEventListener(\"mousedown\", handleClickOutside);\n\t\tdocument.addEventListener(\"keydown\", handleEscape);\n\n\t\treturn () => {\n\t\t\tdocument.removeEventListener(\"mousedown\", handleClickOutside);\n\t\t\tdocument.removeEventListener(\"keydown\", handleEscape);\n\t\t};\n\t}, [onClose]);\n\n\tconst position = selection.position;\n\tif (!position) {\n\t\treturn null;\n\t}\n\n\tconst popoverStyle = {\n\t\tposition: \"absolute\" as const,\n\t\tleft: `${position.x + position.width / 2}px`,\n\t\ttop: `${position.y + position.height}px`,\n\t\ttransform: \"translateX(-50%)\",\n\t};\n\n\treturn (\n\t\t<div\n\t\t\tref={popoverRef}\n\t\t\tclassName=\"z-50 w-64 rounded-lg border bg-card p-4 shadow-md\"\n\t\t\tstyle={popoverStyle}\n\t\t>\n\t\t\t<div className=\"flex justify-end absolute top-2 right-2\">\n\t\t\t\t<Button\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tonClick={onClose}\n\t\t\t\t\taria-label=\"Close popover\"\n\t\t\t\t>\n\t\t\t\t\t<Icon id=\"X\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t\t<div className=\"space-y-3\">\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"State\"\n\t\t\t\t\tvalue={<StateBadge type={selection.type} name={selection.name} />}\n\t\t\t\t/>\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Occurred\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<FormattedDate date={selection.timestamp} format=\"timestamp\" />\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 {\n\temitter,\n\ttype GraphItemSelection,\n\tisArtifactsSelection,\n\tisEventSelection,\n\tisEventsSelection,\n\tisNodeSelection,\n\tisStateSelection,\n\ttype RunGraphConfig,\n\ttype RunGraphNode,\n\ttype RunGraphStateEvent,\n\tselectItem,\n\tsetConfig,\n\tstart,\n\tstop,\n\tupdateViewportFromDateRange,\n\ttype ViewportDateRange,\n} from \"@prefecthq/graphs\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { useTheme } from \"next-themes\";\nimport {\n\ttype CSSProperties,\n\tuseCallback,\n\tuseEffect,\n\tuseMemo,\n\tuseRef,\n\tuseState,\n} from \"react\";\nimport { buildCountFlowRunsQuery } from \"@/api/flow-runs\";\nimport { buildCountTaskRunsQuery } from \"@/api/task-runs\";\nimport { getStateColor } from \"@/utils/state-colors\";\nimport { fetchFlowRunEvents, fetchFlowRunGraph } from \"./api\";\nimport { stateTypeShades } from \"./consts\";\nimport { FlowRunGraphActions } from \"./flow-run-graph-actions\";\nimport { FlowRunGraphArtifactDrawer } from \"./flow-run-graph-artifact-drawer\";\nimport { FlowRunGraphArtifactsPopover } from \"./flow-run-graph-artifacts-popover\";\nimport { FlowRunGraphEventPopover } from \"./flow-run-graph-event-popover\";\nimport { FlowRunGraphEventsPopover } from \"./flow-run-graph-events-popover\";\nimport { FlowRunGraphSelectionPanel } from \"./flow-run-graph-selection-panel\";\nimport { FlowRunGraphStatePopover } from \"./flow-run-graph-state-popover\";\n\nconst TERMINAL_STATES = [\"COMPLETED\", \"FAILED\", \"CANCELLED\", \"CRASHED\"];\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({\n\tflowRunId,\n\tstateType,\n\tviewport,\n\tonViewportChange,\n\tselected: controlledSelected,\n\tonSelectedChange,\n\tclassName,\n\tstyle,\n\tfullscreen: controlledFullscreen,\n\tonFullscreenChange,\n}: FlowRunGraphProps) {\n\tconst stageRef = useRef<HTMLDivElement>(null);\n\tconst [internalFullscreen, setInternalFullscreen] = useState(false);\n\tconst [internalSelected, setInternalSelected] = useState<\n\t\tGraphItemSelection | undefined\n\t>(undefined);\n\tconst [selectedArtifactId, setSelectedArtifactId] = useState<string | null>(\n\t\tnull,\n\t);\n\tconst { resolvedTheme } = useTheme();\n\n\tconst fullscreen = controlledFullscreen ?? internalFullscreen;\n\tconst selected = controlledSelected ?? internalSelected;\n\tconst isTerminal = stateType && TERMINAL_STATES.includes(stateType);\n\n\tconst { data: taskRunCount } = useQuery(\n\t\tbuildCountTaskRunsQuery({\n\t\t\ttask_runs: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\tflow_run_id: { operator: \"and_\", any_: [flowRunId], is_null_: false },\n\t\t\t},\n\t\t}),\n\t);\n\n\tconst { data: subflowRunCount } = useQuery(\n\t\tbuildCountFlowRunsQuery({\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_: [flowRunId],\n\t\t\t\t},\n\t\t\t},\n\t\t}),\n\t);\n\n\tconst hasNodes =\n\t\ttaskRunCount === undefined ||\n\t\tsubflowRunCount === undefined ||\n\t\ttaskRunCount > 0 ||\n\t\tsubflowRunCount > 0;\n\n\tconst updateFullscreen = useCallback(\n\t\t(value: boolean) => {\n\t\t\tsetInternalFullscreen(value);\n\t\t\tonFullscreenChange?.(value);\n\t\t},\n\t\t[onFullscreenChange],\n\t);\n\n\tconst config = useMemo<RunGraphConfig>(\n\t\t() => ({\n\t\t\trunId: flowRunId,\n\t\t\tfetch: fetchFlowRunGraph,\n\t\t\tfetchEvents: fetchFlowRunEvents,\n\t\t\tstyles: () => ({\n\t\t\t\tnode: (node: RunGraphNode) => ({\n\t\t\t\t\tbackground: getStateColor(\n\t\t\t\t\t\tnode.state_type,\n\t\t\t\t\t\tstateTypeShades[node.state_type],\n\t\t\t\t\t),\n\t\t\t\t}),\n\t\t\t\tstate: (event: RunGraphStateEvent) => ({\n\t\t\t\t\tbackground: getStateColor(event.type, stateTypeShades[event.type]),\n\t\t\t\t}),\n\t\t\t}),\n\t\t\ttheme: resolvedTheme === \"dark\" ? \"dark\" : \"light\",\n\t\t}),\n\t\t[flowRunId, resolvedTheme],\n\t);\n\n\tuseEffect(() => {\n\t\tsetConfig(config);\n\t}, [config]);\n\n\tuseEffect(() => {\n\t\tif (!stageRef.current) {\n\t\t\tthrow new Error(\"Stage does not exist\");\n\t\t}\n\n\t\tstart({\n\t\t\tstage: stageRef.current,\n\t\t\tconfig,\n\t\t});\n\n\t\treturn () => {\n\t\t\tstop();\n\t\t};\n\t}, [config]);\n\n\tuseEffect(() => {\n\t\tselectItem(selected ?? null);\n\t}, [selected]);\n\n\tuseEffect(() => {\n\t\tvoid updateViewportFromDateRange(viewport);\n\t}, [viewport]);\n\n\tuseEffect(() => {\n\t\tconst offItemSelected = emitter.on(\"itemSelected\", (nodeId) => {\n\t\t\tconst selection = nodeId ?? undefined;\n\t\t\tsetInternalSelected(selection);\n\t\t\tonSelectedChange?.(selection);\n\t\t});\n\t\tconst offViewportDateRangeUpdated = emitter.on(\n\t\t\t\"viewportDateRangeUpdated\",\n\t\t\t(range) => onViewportChange?.(range),\n\t\t);\n\n\t\treturn () => {\n\t\t\toffItemSelected();\n\t\t\toffViewportDateRangeUpdated();\n\t\t};\n\t}, [onSelectedChange, onViewportChange]);\n\n\tconst heightClass = fullscreen\n\t\t? \"fixed inset-0 z-50 bg-background\"\n\t\t: hasNodes\n\t\t\t? \"relative h-96 w-full\"\n\t\t\t: \"relative h-40 w-full\";\n\n\treturn (\n\t\t<div className={`${heightClass} ${className ?? \"\"}`} style={style}>\n\t\t\t<div ref={stageRef} className=\"size-full [&>canvas]:size-full\" />\n\t\t\t{!hasNodes && (\n\t\t\t\t<div className=\"absolute inset-0 flex items-center justify-center bg-background/50\">\n\t\t\t\t\t<p className=\"text-muted-foreground\">\n\t\t\t\t\t\t{isTerminal\n\t\t\t\t\t\t\t? \"This flow run did not generate any task or subflow runs\"\n\t\t\t\t\t\t\t: \"This flow run has not yet generated any task or subflow runs\"}\n\t\t\t\t\t</p>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<div className=\"absolute bottom-2 right-2\">\n\t\t\t\t<FlowRunGraphActions\n\t\t\t\t\tfullscreen={fullscreen}\n\t\t\t\t\tonFullscreenChange={updateFullscreen}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t{selected && isNodeSelection(selected) && (\n\t\t\t\t<FlowRunGraphSelectionPanel\n\t\t\t\t\tselection={selected}\n\t\t\t\t\tonClose={() => {\n\t\t\t\t\t\tsetInternalSelected(undefined);\n\t\t\t\t\t\tonSelectedChange?.(undefined);\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{selected && isStateSelection(selected) && (\n\t\t\t\t<FlowRunGraphStatePopover\n\t\t\t\t\tselection={selected}\n\t\t\t\t\tonClose={() => {\n\t\t\t\t\t\tsetInternalSelected(undefined);\n\t\t\t\t\t\tonSelectedChange?.(undefined);\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{selected && isEventSelection(selected) && (\n\t\t\t\t<FlowRunGraphEventPopover\n\t\t\t\t\tselection={selected}\n\t\t\t\t\tonClose={() => {\n\t\t\t\t\t\tsetInternalSelected(undefined);\n\t\t\t\t\t\tonSelectedChange?.(undefined);\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{selected && isEventsSelection(selected) && (\n\t\t\t\t<FlowRunGraphEventsPopover\n\t\t\t\t\tselection={selected}\n\t\t\t\t\tonClose={() => {\n\t\t\t\t\t\tsetInternalSelected(undefined);\n\t\t\t\t\t\tonSelectedChange?.(undefined);\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t{selected && isArtifactsSelection(selected) && (\n\t\t\t\t<FlowRunGraphArtifactsPopover\n\t\t\t\t\tselection={selected}\n\t\t\t\t\tonClose={() => {\n\t\t\t\t\t\tsetInternalSelected(undefined);\n\t\t\t\t\t\tonSelectedChange?.(undefined);\n\t\t\t\t\t}}\n\t\t\t\t\tonViewArtifact={(artifactId) => {\n\t\t\t\t\t\tsetSelectedArtifactId(artifactId);\n\t\t\t\t\t\tsetInternalSelected(undefined);\n\t\t\t\t\t\tonSelectedChange?.(undefined);\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t)}\n\t\t\t<FlowRunGraphArtifactDrawer\n\t\t\t\tartifactId={selectedArtifactId}\n\t\t\t\tonClose={() => setSelectedArtifactId(null)}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n"],"names":["fetchFlowRunGraph","id","data","getQueryService","mapApiResponseToRunGraphData","fetchFlowRunEvents","since","until","nodeId","mapApiResponseToRunGraphEvents","response","parseISO","node","mapNode","mapState","event","mapArtifact","state","artifact","stateTypeShades","isEventTargetInput","target","center","centerViewport","FlowRunGraphCenterButton","useEffect","controller","Tooltip","jsx","TooltipTrigger","Button","Icon","TooltipContent","FlowRunGraphFullscreenButton","fullscreen","onFullscreenChange","toggleFullscreen","useCallback","layoutOptions","increaseScale","multiplier","DEFAULT_HORIZONTAL_SCALE_MULTIPLIER","scale","layout","setHorizontalScaleMultiplier","decreaseScale","resetScale","resetHorizontalScaleMultiplier","isLayoutOption","value","horizontal","vertical","isHorizontalMode","isVerticalMode","FlowRunGraphSettings","selectedLayoutOption","setSelectedLayoutOption","useState","hideEdges","setHideEdges","hideArtifacts","setHideArtifacts","hideEvents","setHideEvents","handleLayoutChange","setHorizontalMode","setVerticalMode","handleHideEdgesChange","setDisabledEdges","handleHideArtifactsChange","setDisabledArtifacts","handleHideEventsChange","setDisabledEvents","jsxs","Typography","option","e","Label","Switch","FlowRunGraphSettingsButton","Popover","PopoverTrigger","PopoverContent","FlowRunGraphActions","FlowRunGraphArtifactDrawer","artifactId","onClose","Sheet","open","SheetContent","SheetHeader","SheetTitle","Suspense","ArtifactContentSkeleton","ArtifactContent","Skeleton","useSuspenseQuery","buildGetArtifactQuery","KeyValue","FormattedDate","FlowRunGraphArtifactsPopover","selection","onViewArtifact","artifacts","isLoading","useQuery","buildListArtifactsQuery","position","anchorStyle","PopoverAnchor","getEventLabel","eventName","label","formatDateNumeric","date","parsedDate","isValid","format","getResourceName","resource","EventResourceSection","resourceName","prefectResourceId","resourceType","parseResourceType","extractedId","extractResourceId","relatedResources","ResourceDisplaySkeleton","EventResourceLink","ResourceDisplayWithIcon","ResolvedResourceDisplay","RelatedResourcesSection","filteredResources","role","resourceId","FlowRunGraphEventPopover","buildGetEventQuery","eventLabel","Link","FlowRunGraphEventsPopover","eventQueries","useQueries","q","events","ScrollArea","FlowRunGraphSelectionPanel","isNodeSelection","SelectionPanelSkeleton","TaskRunDetails","FlowRunDetails","taskRunId","taskRun","buildGetTaskRunQuery","duration","StateBadge","secondsToApproximateString","TagBadgeGroup","flowRunId","flowRun","buildGetFlowRunDetailsQuery","FlowRunGraphStatePopover","popoverRef","useRef","handleClickOutside","handleEscape","popoverStyle","TERMINAL_STATES","FlowRunGraph","stateType","viewport","onViewportChange","controlledSelected","onSelectedChange","className","style","controlledFullscreen","stageRef","internalFullscreen","setInternalFullscreen","internalSelected","setInternalSelected","selectedArtifactId","setSelectedArtifactId","resolvedTheme","useTheme","selected","isTerminal","taskRunCount","buildCountTaskRunsQuery","subflowRunCount","buildCountFlowRunsQuery","hasNodes","updateFullscreen","config","useMemo","getStateColor","setConfig","start","stop","selectItem","updateViewportFromDateRange","offItemSelected","emitter","offViewportDateRangeUpdated","range","heightClass","isStateSelection","isEventSelection","isEventsSelection","isArtifactsSelection"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as r}from"./vendor-tanstack-BcZfOOfy.js";import{s}from"./index-
|
|
2
|
-
//# sourceMappingURL=flow-run._id-
|
|
1
|
+
import{j as r}from"./vendor-tanstack-BcZfOOfy.js";import{s}from"./index-B8vo2Lrg.js";import{R as a}from"./route-error-state-BFBpiIhD.js";import{o as i,e as m}from"./vendor-forms-ClCIacbh.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-BTiKGWfR.js";import"./vendor-recharts-BvvJP9Po.js";import"./vendor-date-wwuDAncJ.js";i({tab:m(["Logs","TaskRuns","SubflowRuns","Artifacts","Details","Parameters","JobVariables"]).default("Logs").catch("Logs")});function R({error:o,reset:e}){const t=s(o,"Failed to load flow run");return r.jsxs("div",{className:"flex flex-col gap-4",children:[r.jsx("div",{children:r.jsx("h1",{className:"text-2xl font-semibold",children:"Flow Run"})}),r.jsx(a,{error:t,onRetry:e})]})}export{R as errorComponent};
|
|
2
|
+
//# sourceMappingURL=flow-run._id-BukrNCAq.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow-run._id-
|
|
1
|
+
{"version":3,"file":"flow-run._id-BukrNCAq.js","sources":["../../src/routes/runs/flow-run.$id.tsx?tsr-split=errorComponent"],"sourcesContent":["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"],"names":["z","tab","default","catch","FlowRunErrorComponent","error","reset","serverError","categorizeError","jsxs","jsx","RouteErrorState"],"mappings":"6UAaqBA,EAAS,CAC7BC,IAAKD,EACE,CACL,OACA,WACA,cACA,YACA,UACA,aACA,cAAc,CACd,EACAE,QAAQ,MAAM,EACdC,MAAM,MAAM,CACf,CAAC,EAID,SAASC,EAAsB,CAAEC,MAAAA,EAAOC,MAAAA,CAA2B,EAAG,CACrE,MAAMC,EAAcC,EAAgBH,EAAO,yBAAyB,EACpE,OACCI,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAC,EAAAA,IAAC,OACA,SAAAA,EAAAA,IAAC,KAAA,CAAG,UAAU,yBAAyB,oBAAQ,CAAA,CAChD,EACAA,EAAAA,IAACC,EAAA,CAAgB,MAAOJ,EAAa,QAASD,CAAAA,CAAM,CAAA,EACrD,CAEF"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{j as t,L as o}from"./vendor-tanstack-BcZfOOfy.js";import{E as s,t as e,v as n,w as r,x as a,q as i}from"./index-
|
|
2
|
-
//# sourceMappingURL=flow-run._id-
|
|
1
|
+
import{j as t,L as o}from"./vendor-tanstack-BcZfOOfy.js";import{E as s,t as e,v as n,w as r,x as a,q as i}from"./index-B8vo2Lrg.js";import{o as m,e as p}from"./vendor-forms-ClCIacbh.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-BTiKGWfR.js";import"./vendor-recharts-BvvJP9Po.js";import"./vendor-date-wwuDAncJ.js";function u(){return t.jsxs(s,{children:[t.jsx(e,{id:"Search"}),t.jsx(n,{children:"Flow Run Not Found"}),t.jsx(r,{children:"The flow run you are looking for does not exist or has been deleted."}),t.jsx(a,{children:t.jsx(i,{asChild:!0,children:t.jsx(o,{to:"/runs",children:"Back to Runs"})})})]})}m({tab:p(["Logs","TaskRuns","SubflowRuns","Artifacts","Details","Parameters","JobVariables"]).default("Logs").catch("Logs")});const y=u;export{y as notFoundComponent};
|
|
2
|
+
//# sourceMappingURL=flow-run._id-CtI5VZ2M.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow-run._id-
|
|
1
|
+
{"version":3,"file":"flow-run._id-CtI5VZ2M.js","sources":["../../src/components/flow-runs/flow-run-not-found.tsx","../../src/routes/runs/flow-run.$id.tsx?tsr-split=notFoundComponent"],"sourcesContent":["import { Link } from \"@tanstack/react-router\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tEmptyState,\n\tEmptyStateActions,\n\tEmptyStateDescription,\n\tEmptyStateIcon,\n\tEmptyStateTitle,\n} from \"@/components/ui/empty-state\";\n\nexport function FlowRunNotFound() {\n\treturn (\n\t\t<EmptyState>\n\t\t\t<EmptyStateIcon id=\"Search\" />\n\t\t\t<EmptyStateTitle>Flow Run Not Found</EmptyStateTitle>\n\t\t\t<EmptyStateDescription>\n\t\t\t\tThe flow run you are looking for does not exist or has been deleted.\n\t\t\t</EmptyStateDescription>\n\t\t\t<EmptyStateActions>\n\t\t\t\t<Button asChild>\n\t\t\t\t\t<Link to=\"/runs\">Back to Runs</Link>\n\t\t\t\t</Button>\n\t\t\t</EmptyStateActions>\n\t\t</EmptyState>\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"],"names":["FlowRunNotFound","EmptyState","jsx","EmptyStateIcon","EmptyStateTitle","EmptyStateDescription","EmptyStateActions","Button","Link","z","tab","default","catch","SplitNotFoundComponent"],"mappings":"wUAUO,SAASA,GAAkB,CACjC,cACEC,EAAA,CACA,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAe,GAAG,QAAA,CAAS,EAC5BD,EAAAA,IAACE,GAAgB,SAAA,oBAAA,CAAkB,EACnCF,EAAAA,IAACG,GAAsB,SAAA,sEAAA,CAEvB,EACAH,EAAAA,IAACI,EAAA,CACA,SAAAJ,EAAAA,IAACK,EAAA,CAAO,QAAO,GACd,SAAAL,EAAAA,IAACM,EAAA,CAAK,GAAG,QAAQ,SAAA,cAAA,CAAY,CAAA,CAC9B,CAAA,CACD,CAAA,EACD,CAEF,CCZqBC,EAAS,CAC7BC,IAAKD,EACE,CACL,OACA,WACA,cACA,YACA,UACA,aACA,cAAc,CACd,EACAE,QAAQ,MAAM,EACdC,MAAM,MAAM,CACf,CAAC,EAE0E,MAAAC,EAlBlEb"}
|