prefect 3.7.7.dev2__py3-none-any.whl → 3.7.8.dev1__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/_build_info.py +3 -3
- prefect/runner/_workspace_resolver.py +17 -12
- prefect/server/AGENTS.md +1 -1
- prefect/server/api/workers.py +1 -0
- prefect/server/models/artifacts.py +0 -2
- prefect/server/models/work_queues.py +2 -2
- prefect/server/models/workers.py +1 -1
- prefect/server/schemas/core.py +1 -1
- prefect/server/ui-v2/assets/{admin-BAL15Uwl.js → admin-BwmAgV1B.js} +2 -2
- prefect/server/ui-v2/assets/{admin-BAL15Uwl.js.map → admin-BwmAgV1B.js.map} +1 -1
- prefect/server/ui-v2/assets/{artifact._id-D_htSbFc.js → artifact._id-DClBSNAc.js} +2 -2
- prefect/server/ui-v2/assets/{artifact._id-D_htSbFc.js.map → artifact._id-DClBSNAc.js.map} +1 -1
- prefect/server/ui-v2/assets/{artifact._id-C4vG8kN1.js → artifact._id-iTe860fK.js} +2 -2
- prefect/server/ui-v2/assets/{artifact._id-C4vG8kN1.js.map → artifact._id-iTe860fK.js.map} +1 -1
- prefect/server/ui-v2/assets/{artifacts-C94H1frM.js → artifacts-1uXI5WqD.js} +2 -2
- prefect/server/ui-v2/assets/{artifacts-C94H1frM.js.map → artifacts-1uXI5WqD.js.map} +1 -1
- prefect/server/ui-v2/assets/{artifacts-Dp1Cpics.js → artifacts-DK4EqGvl.js} +2 -2
- prefect/server/ui-v2/assets/{artifacts-Dp1Cpics.js.map → artifacts-DK4EqGvl.js.map} +1 -1
- prefect/server/ui-v2/assets/{automation-wizard-DHwU3ycN.js → automation-wizard-BY0XuXdq.js} +2 -2
- prefect/server/ui-v2/assets/{automation-wizard-DHwU3ycN.js.map → automation-wizard-BY0XuXdq.js.map} +1 -1
- prefect/server/ui-v2/assets/{automation._id-DVj5sQsY.js → automation._id-CjmsSv3o.js} +2 -2
- prefect/server/ui-v2/assets/{automation._id-DVj5sQsY.js.map → automation._id-CjmsSv3o.js.map} +1 -1
- prefect/server/ui-v2/assets/{automation._id-BPP0PFKR.js → automation._id-D9vm0dSK.js} +2 -2
- prefect/server/ui-v2/assets/{automation._id-BPP0PFKR.js.map → automation._id-D9vm0dSK.js.map} +1 -1
- prefect/server/ui-v2/assets/{automation_._id.edit-DXzu8308.js → automation_._id.edit-BsdiStqs.js} +2 -2
- prefect/server/ui-v2/assets/{automation_._id.edit-DXzu8308.js.map → automation_._id.edit-BsdiStqs.js.map} +1 -1
- prefect/server/ui-v2/assets/{automation_._id.edit-k_rZNDO5.js → automation_._id.edit-DYOqiH15.js} +2 -2
- prefect/server/ui-v2/assets/{automation_._id.edit-k_rZNDO5.js.map → automation_._id.edit-DYOqiH15.js.map} +1 -1
- prefect/server/ui-v2/assets/{automations-BBolpYje.js → automations-Dy7MEBCd.js} +2 -2
- prefect/server/ui-v2/assets/{automations-BBolpYje.js.map → automations-Dy7MEBCd.js.map} +1 -1
- prefect/server/ui-v2/assets/{automations-DEbtnaKI.js → automations-I0rut3oU.js} +2 -2
- prefect/server/ui-v2/assets/{automations-DEbtnaKI.js.map → automations-I0rut3oU.js.map} +1 -1
- prefect/server/ui-v2/assets/{automations-DXpkq-mg.js → automations-_spzfcQs.js} +2 -2
- prefect/server/ui-v2/assets/{automations-DXpkq-mg.js.map → automations-_spzfcQs.js.map} +1 -1
- prefect/server/ui-v2/assets/{automations-header-Bnufh1Se.js → automations-header-C_QvzcNT.js} +2 -2
- prefect/server/ui-v2/assets/{automations-header-Bnufh1Se.js.map → automations-header-C_QvzcNT.js.map} +1 -1
- prefect/server/ui-v2/assets/{automations-wizard-DIhcWuKm.js → automations-wizard-e40bFU9E.js} +2 -2
- prefect/server/ui-v2/assets/{automations-wizard-DIhcWuKm.js.map → automations-wizard-e40bFU9E.js.map} +1 -1
- prefect/server/ui-v2/assets/{badge-fyOQcNnR.js → badge-vurAYgxc.js} +2 -2
- prefect/server/ui-v2/assets/{badge-fyOQcNnR.js.map → badge-vurAYgxc.js.map} +1 -1
- prefect/server/ui-v2/assets/{base-job-template-form-section-xk-gbxny.js → base-job-template-form-section-DTh4Y5Ah.js} +2 -2
- prefect/server/ui-v2/assets/{base-job-template-form-section-xk-gbxny.js.map → base-job-template-form-section-DTh4Y5Ah.js.map} +1 -1
- prefect/server/ui-v2/assets/{block-type-details-Dq_SyCWm.js → block-type-details-CtMrR5QH.js} +2 -2
- prefect/server/ui-v2/assets/{block-type-details-Dq_SyCWm.js.map → block-type-details-CtMrR5QH.js.map} +1 -1
- prefect/server/ui-v2/assets/{block-type-logo-Cc5Lt-3a.js → block-type-logo-1_gehAYP.js} +2 -2
- prefect/server/ui-v2/assets/{block-type-logo-Cc5Lt-3a.js.map → block-type-logo-1_gehAYP.js.map} +1 -1
- prefect/server/ui-v2/assets/{block._id-DJ4swXQO.js → block._id-BrKW8FYY.js} +2 -2
- prefect/server/ui-v2/assets/{block._id-DJ4swXQO.js.map → block._id-BrKW8FYY.js.map} +1 -1
- prefect/server/ui-v2/assets/{block._id-7jcwcanq.js → block._id-D_TLERFK.js} +2 -2
- prefect/server/ui-v2/assets/{block._id-7jcwcanq.js.map → block._id-D_TLERFK.js.map} +1 -1
- prefect/server/ui-v2/assets/{block_._id.edit-CuQ59RzS.js → block_._id.edit-B2yl9C11.js} +2 -2
- prefect/server/ui-v2/assets/{block_._id.edit-CuQ59RzS.js.map → block_._id.edit-B2yl9C11.js.map} +1 -1
- prefect/server/ui-v2/assets/{block_._id.edit-X_LCGBMi.js → block_._id.edit-BbupcySJ.js} +2 -2
- prefect/server/ui-v2/assets/{block_._id.edit-X_LCGBMi.js.map → block_._id.edit-BbupcySJ.js.map} +1 -1
- prefect/server/ui-v2/assets/{blocks-D5uMj6X5.js → blocks-BVpxRYTR.js} +2 -2
- prefect/server/ui-v2/assets/{blocks-D5uMj6X5.js.map → blocks-BVpxRYTR.js.map} +1 -1
- prefect/server/ui-v2/assets/{blocks-CVpOVsR9.js → blocks-SUmL0Ghr.js} +2 -2
- prefect/server/ui-v2/assets/{blocks-CVpOVsR9.js.map → blocks-SUmL0Ghr.js.map} +1 -1
- prefect/server/ui-v2/assets/button-BmBv3lZP.js +3 -0
- prefect/server/ui-v2/assets/{button-D1nS4G4b.js.map → button-BmBv3lZP.js.map} +1 -1
- prefect/server/ui-v2/assets/{card-zAxS3Fox.js → card-BWi7Wr_R.js} +2 -2
- prefect/server/ui-v2/assets/{card-zAxS3Fox.js.map → card-BWi7Wr_R.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog-Cvuu07RM.js → catalog-2OlitMXZ.js} +2 -2
- prefect/server/ui-v2/assets/{catalog-Cvuu07RM.js.map → catalog-2OlitMXZ.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog-DBnpD4_R.js → catalog-BcBjU7Yy.js} +2 -2
- prefect/server/ui-v2/assets/{catalog-DBnpD4_R.js.map → catalog-BcBjU7Yy.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog_._slug-DMHkouWh.js → catalog_._slug-CpeIUyfC.js} +2 -2
- prefect/server/ui-v2/assets/{catalog_._slug-DMHkouWh.js.map → catalog_._slug-CpeIUyfC.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog_._slug-DwC2yZo9.js → catalog_._slug-DxivsC4n.js} +2 -2
- prefect/server/ui-v2/assets/{catalog_._slug-DwC2yZo9.js.map → catalog_._slug-DxivsC4n.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog_._slug_.create-DEjqmQ5H.js → catalog_._slug_.create-BfAYCqzV.js} +2 -2
- prefect/server/ui-v2/assets/{catalog_._slug_.create-DEjqmQ5H.js.map → catalog_._slug_.create-BfAYCqzV.js.map} +1 -1
- prefect/server/ui-v2/assets/{catalog_._slug_.create-pWiWaBhm.js → catalog_._slug_.create-DIls_o2s.js} +2 -2
- prefect/server/ui-v2/assets/{catalog_._slug_.create-pWiWaBhm.js.map → catalog_._slug_.create-DIls_o2s.js.map} +1 -1
- prefect/server/ui-v2/assets/{checkbox-CnS0zOAZ.js → checkbox-C61fowvt.js} +2 -2
- prefect/server/ui-v2/assets/{checkbox-CnS0zOAZ.js.map → checkbox-C61fowvt.js.map} +1 -1
- prefect/server/ui-v2/assets/{concurrency-limit._id-C1JAbeF7.js → concurrency-limit._id-BD5OWaxK.js} +2 -2
- prefect/server/ui-v2/assets/{concurrency-limit._id-C1JAbeF7.js.map → concurrency-limit._id-BD5OWaxK.js.map} +1 -1
- prefect/server/ui-v2/assets/{concurrency-limit._id-D2km7zi6.js → concurrency-limit._id-C5IwLXM-.js} +2 -2
- prefect/server/ui-v2/assets/{concurrency-limit._id-D2km7zi6.js.map → concurrency-limit._id-C5IwLXM-.js.map} +1 -1
- prefect/server/ui-v2/assets/{concurrency-limits-CiuVe4lC.js → concurrency-limits-Bc84E04d.js} +2 -2
- prefect/server/ui-v2/assets/{concurrency-limits-CiuVe4lC.js.map → concurrency-limits-Bc84E04d.js.map} +1 -1
- prefect/server/ui-v2/assets/{concurrency-limits-Bo4VHM4m.js → concurrency-limits-DbbgieMK.js} +2 -2
- prefect/server/ui-v2/assets/{concurrency-limits-Bo4VHM4m.js.map → concurrency-limits-DbbgieMK.js.map} +1 -1
- prefect/server/ui-v2/assets/{create-DC_F9Vc2.js → create-B5swJNpx.js} +2 -2
- prefect/server/ui-v2/assets/{create-DC_F9Vc2.js.map → create-B5swJNpx.js.map} +1 -1
- prefect/server/ui-v2/assets/{create-CXr3hIap.js → create-CLSh2YYJ.js} +2 -2
- prefect/server/ui-v2/assets/{create-CXr3hIap.js.map → create-CLSh2YYJ.js.map} +1 -1
- prefect/server/ui-v2/assets/{create-KsVh0LQQ.js → create-DR2ACvWj.js} +2 -2
- prefect/server/ui-v2/assets/{create-KsVh0LQQ.js.map → create-DR2ACvWj.js.map} +1 -1
- prefect/server/ui-v2/assets/{create-B8bILmAp.js → create-DUZ4ILfd.js} +2 -2
- prefect/server/ui-v2/assets/{create-B8bILmAp.js.map → create-DUZ4ILfd.js.map} +1 -1
- prefect/server/ui-v2/assets/{cron-input-B9vmWBhI.js → cron-input-DTg4XKWR.js} +2 -2
- prefect/server/ui-v2/assets/{cron-input-B9vmWBhI.js.map → cron-input-DTg4XKWR.js.map} +1 -1
- prefect/server/ui-v2/assets/{data-table-C_Co3B-8.js → data-table-BeZEMPPj.js} +2 -2
- prefect/server/ui-v2/assets/{data-table-C_Co3B-8.js.map → data-table-BeZEMPPj.js.map} +1 -1
- prefect/server/ui-v2/assets/{data-table-hPoc29Gc.js → data-table-CYvl_mU7.js} +2 -2
- prefect/server/ui-v2/assets/{data-table-hPoc29Gc.js.map → data-table-CYvl_mU7.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-form-CrL1aiF2.js → deployment-form-BdWBEIGb.js} +3 -3
- prefect/server/ui-v2/assets/{deployment-form-CrL1aiF2.js.map → deployment-form-BdWBEIGb.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-links-CtiX6W-O.js → deployment-links-DcaHRana.js} +2 -2
- prefect/server/ui-v2/assets/{deployment-links-CtiX6W-O.js.map → deployment-links-DcaHRana.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment._id-8DHzBBqN.js → deployment._id-DSpkCkrD.js} +2 -2
- prefect/server/ui-v2/assets/{deployment._id-8DHzBBqN.js.map → deployment._id-DSpkCkrD.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment._id-B5njgUVH.js → deployment._id-QB9oUwli.js} +2 -2
- prefect/server/ui-v2/assets/{deployment._id-B5njgUVH.js.map → deployment._id-QB9oUwli.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment_._id.duplicate-P68wrx5d.js → deployment_._id.duplicate-Buq607hT.js} +2 -2
- prefect/server/ui-v2/assets/{deployment_._id.duplicate-P68wrx5d.js.map → deployment_._id.duplicate-Buq607hT.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment_._id.duplicate-DSE5qVrl.js → deployment_._id.duplicate-CxoXM02K.js} +2 -2
- prefect/server/ui-v2/assets/{deployment_._id.duplicate-DSE5qVrl.js.map → deployment_._id.duplicate-CxoXM02K.js.map} +1 -1
- prefect/server/ui-v2/assets/deployment_._id.edit-B4-TptEu.js +2 -0
- prefect/server/ui-v2/assets/{deployment_._id.edit-BmCwRQfG.js.map → deployment_._id.edit-B4-TptEu.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment_._id.edit-BRk2Bs0U.js → deployment_._id.edit-BLbczGE6.js} +2 -2
- prefect/server/ui-v2/assets/{deployment_._id.edit-BRk2Bs0U.js.map → deployment_._id.edit-BLbczGE6.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment_._id.run-SWWrS_XP.js → deployment_._id.run-OoFiqasU.js} +2 -2
- prefect/server/ui-v2/assets/{deployment_._id.run-SWWrS_XP.js.map → deployment_._id.run-OoFiqasU.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment_._id.run-Bqnf9Hd8.js → deployment_._id.run-aNTvRx3C.js} +2 -2
- prefect/server/ui-v2/assets/{deployment_._id.run-Bqnf9Hd8.js.map → deployment_._id.run-aNTvRx3C.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployments-B5DW6oSd.js → deployments-Bg48iYTk.js} +2 -2
- prefect/server/ui-v2/assets/{deployments-B5DW6oSd.js.map → deployments-Bg48iYTk.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployments-vfpjs2Zu.js → deployments-C9hCXqaw.js} +2 -2
- prefect/server/ui-v2/assets/{deployments-vfpjs2Zu.js.map → deployments-C9hCXqaw.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployments-C1tmJw6Q.js → deployments-f9_6GjVM.js} +2 -2
- prefect/server/ui-v2/assets/{deployments-C1tmJw6Q.js.map → deployments-f9_6GjVM.js.map} +1 -1
- prefect/server/ui-v2/assets/{dialog-DIuvBKov.js → dialog-kjByAu2K.js} +2 -2
- prefect/server/ui-v2/assets/{dialog-DIuvBKov.js.map → dialog-kjByAu2K.js.map} +1 -1
- prefect/server/ui-v2/assets/{dist-BWGcVrLy.js → dist-D70cmkC4.js} +2 -2
- prefect/server/ui-v2/assets/{dist-BWGcVrLy.js.map → dist-D70cmkC4.js.map} +1 -1
- prefect/server/ui-v2/assets/{event-resource-display-Bb5tg3Sp.js → event-resource-display-BbTlxvM0.js} +2 -2
- prefect/server/ui-v2/assets/{event-resource-display-Bb5tg3Sp.js.map → event-resource-display-BbTlxvM0.js.map} +1 -1
- prefect/server/ui-v2/assets/{event._eventDate._eventId-DSEdek1y.js → event._eventDate._eventId-52Pjmxbr.js} +2 -2
- prefect/server/ui-v2/assets/{event._eventDate._eventId-DSEdek1y.js.map → event._eventDate._eventId-52Pjmxbr.js.map} +1 -1
- prefect/server/ui-v2/assets/{event._eventDate._eventId-i_o9_8J0.js → event._eventDate._eventId-CxWp57nP.js} +2 -2
- prefect/server/ui-v2/assets/{event._eventDate._eventId-i_o9_8J0.js.map → event._eventDate._eventId-CxWp57nP.js.map} +1 -1
- prefect/server/ui-v2/assets/{events-Ba2H0nXG.js → events-DCxvBjip.js} +2 -2
- prefect/server/ui-v2/assets/{events-Ba2H0nXG.js.map → events-DCxvBjip.js.map} +1 -1
- prefect/server/ui-v2/assets/{events-DEk8mDv8.js → events-Vcoo_bS9.js} +2 -2
- prefect/server/ui-v2/assets/{events-DEk8mDv8.js.map → events-Vcoo_bS9.js.map} +1 -1
- prefect/server/ui-v2/assets/{events-timeline-BcJ4EZ3S.js → events-timeline-CnmVZdtM.js} +2 -2
- prefect/server/ui-v2/assets/{events-timeline-BcJ4EZ3S.js.map → events-timeline-CnmVZdtM.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow-run-graph-C7Yv3ssM.js → flow-run-graph-CbD29Wck.js} +2 -2
- prefect/server/ui-v2/assets/{flow-run-graph-C7Yv3ssM.js.map → flow-run-graph-CbD29Wck.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow-run._id-m92ddStD.js → flow-run._id-Bz9FocWM.js} +2 -2
- prefect/server/ui-v2/assets/{flow-run._id-m92ddStD.js.map → flow-run._id-Bz9FocWM.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow-run._id-MIyYC3qx.js → flow-run._id-DbsY1HyI.js} +3 -3
- prefect/server/ui-v2/assets/{flow-run._id-MIyYC3qx.js.map → flow-run._id-DbsY1HyI.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow-run._id-CuDYZEu4.js → flow-run._id-DqyOqm6l.js} +2 -2
- prefect/server/ui-v2/assets/{flow-run._id-CuDYZEu4.js.map → flow-run._id-DqyOqm6l.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow-runs-Aasu1lzC.js → flow-runs-BlvuNAbf.js} +2 -2
- prefect/server/ui-v2/assets/{flow-runs-Aasu1lzC.js.map → flow-runs-BlvuNAbf.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow._id-XXB9UBEF.js → flow._id-C7Rk6PoH.js} +2 -2
- prefect/server/ui-v2/assets/{flow._id-XXB9UBEF.js.map → flow._id-C7Rk6PoH.js.map} +1 -1
- prefect/server/ui-v2/assets/{flow._id-BRbwflJa.js → flow._id-DgOouag4.js} +2 -2
- prefect/server/ui-v2/assets/{flow._id-BRbwflJa.js.map → flow._id-DgOouag4.js.map} +1 -1
- prefect/server/ui-v2/assets/{flows-DeHBhtYq.js → flows-BKgvWEsn.js} +2 -2
- prefect/server/ui-v2/assets/{flows-DeHBhtYq.js.map → flows-BKgvWEsn.js.map} +1 -1
- prefect/server/ui-v2/assets/{flows-DxzYYVqT.js → flows-BmMWNEVL.js} +2 -2
- prefect/server/ui-v2/assets/{flows-DxzYYVqT.js.map → flows-BmMWNEVL.js.map} +1 -1
- prefect/server/ui-v2/assets/{flows-GKacvQcS.js → flows-C-NRpuYa.js} +2 -2
- prefect/server/ui-v2/assets/{flows-GKacvQcS.js.map → flows-C-NRpuYa.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-DLLIG_v_.js → header-B--ytya-.js} +2 -2
- prefect/server/ui-v2/assets/{header-DLLIG_v_.js.map → header-B--ytya-.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-C1Kl0PQt.js → header-Bn60nLKw.js} +2 -2
- prefect/server/ui-v2/assets/{header-C1Kl0PQt.js.map → header-Bn60nLKw.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-BmLqNPjl.js → header-BvXtnaKL.js} +2 -2
- prefect/server/ui-v2/assets/{header-BmLqNPjl.js.map → header-BvXtnaKL.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DpPA2bX1.js → index-SebwJ2h3.js} +7 -7
- prefect/server/ui-v2/assets/index-SebwJ2h3.js.map +1 -0
- prefect/server/ui-v2/assets/{index-BNTLwS1u.css → index-iPs14a-7.css} +1 -1
- prefect/server/ui-v2/assets/{input-BaSLpSlc.js → input-Dr0oypOO.js} +2 -2
- prefect/server/ui-v2/assets/{input-BaSLpSlc.js.map → input-Dr0oypOO.js.map} +1 -1
- prefect/server/ui-v2/assets/{json-input-Ck4wcenx.js → json-input-C4f9tary.js} +2 -2
- prefect/server/ui-v2/assets/{json-input-Ck4wcenx.js.map → json-input-C4f9tary.js.map} +1 -1
- prefect/server/ui-v2/assets/{key-value-C2vDi3xo.js → key-value-C6T0AQJ-.js} +2 -2
- prefect/server/ui-v2/assets/{key-value-C2vDi3xo.js.map → key-value-C6T0AQJ-.js.map} +1 -1
- prefect/server/ui-v2/assets/{key._key-D_htSbFc.js → key._key-DClBSNAc.js} +2 -2
- prefect/server/ui-v2/assets/{key._key-D_htSbFc.js.map → key._key-DClBSNAc.js.map} +1 -1
- prefect/server/ui-v2/assets/{key._key-DZrY5Jq5.js → key._key-XPS7oVq5.js} +2 -2
- prefect/server/ui-v2/assets/{key._key-DZrY5Jq5.js.map → key._key-XPS7oVq5.js.map} +1 -1
- prefect/server/ui-v2/assets/{label-WfC7LL4G.js → label-K0MrFuta.js} +2 -2
- prefect/server/ui-v2/assets/{label-WfC7LL4G.js.map → label-K0MrFuta.js.map} +1 -1
- prefect/server/ui-v2/assets/{lazy-markdown-CCDNtAxT.js → lazy-markdown-uVUtgyxS.js} +2 -2
- prefect/server/ui-v2/assets/{lazy-markdown-CCDNtAxT.js.map → lazy-markdown-uVUtgyxS.js.map} +1 -1
- prefect/server/ui-v2/assets/{login-BeT_TSuo.js → login-BrODzAEz.js} +2 -2
- prefect/server/ui-v2/assets/{login-BeT_TSuo.js.map → login-BrODzAEz.js.map} +1 -1
- prefect/server/ui-v2/assets/{markdown-input-4x3dDfbx.js → markdown-input-tBIKaGf7.js} +2 -2
- prefect/server/ui-v2/assets/{markdown-input-4x3dDfbx.js.map → markdown-input-tBIKaGf7.js.map} +1 -1
- prefect/server/ui-v2/assets/{popover-wLn6-LQK.js → popover-DxOdMf4-.js} +2 -2
- prefect/server/ui-v2/assets/{popover-wLn6-LQK.js.map → popover-DxOdMf4-.js.map} +1 -1
- prefect/server/ui-v2/assets/python-example-snippet-BfhCQ6Qd.js +3 -0
- prefect/server/ui-v2/assets/{python-example-snippet-BxNh5JeI.js.map → python-example-snippet-BfhCQ6Qd.js.map} +1 -1
- prefect/server/ui-v2/assets/{python-input-WU0VDfRW.js → python-input-CsGs2knT.js} +2 -2
- prefect/server/ui-v2/assets/{python-input-WU0VDfRW.js.map → python-input-CsGs2knT.js.map} +1 -1
- prefect/server/ui-v2/assets/{route-error-state-DChqMSir.js → route-error-state-D3zpyudZ.js} +2 -2
- prefect/server/ui-v2/assets/{route-error-state-DChqMSir.js.map → route-error-state-D3zpyudZ.js.map} +1 -1
- prefect/server/ui-v2/assets/{run-logs-CRosV4hp.js → run-logs-Cg817JNc.js} +2 -2
- prefect/server/ui-v2/assets/{run-logs-CRosV4hp.js.map → run-logs-Cg817JNc.js.map} +1 -1
- prefect/server/ui-v2/assets/{runs-BJ5vg2mD.js → runs-BLE8kTnW.js} +2 -2
- prefect/server/ui-v2/assets/{runs-BJ5vg2mD.js.map → runs-BLE8kTnW.js.map} +1 -1
- prefect/server/ui-v2/assets/{runs-CDLtNNwI.js → runs-r6c5QXLm.js} +2 -2
- prefect/server/ui-v2/assets/{runs-CDLtNNwI.js.map → runs-r6c5QXLm.js.map} +1 -1
- prefect/server/ui-v2/assets/{schedule-badge-CMgyQe0S.js → schedule-badge-W3ssm5sb.js} +2 -2
- prefect/server/ui-v2/assets/{schedule-badge-CMgyQe0S.js.map → schedule-badge-W3ssm5sb.js.map} +1 -1
- prefect/server/ui-v2/assets/{schema-form-Dj8aocnY.js → schema-form-C_mXU59h.js} +3 -3
- prefect/server/ui-v2/assets/{schema-form-Dj8aocnY.js.map → schema-form-C_mXU59h.js.map} +1 -1
- prefect/server/ui-v2/assets/{select-Cvo9G-Ih.js → select-y2lIflCz.js} +2 -2
- prefect/server/ui-v2/assets/{select-Cvo9G-Ih.js.map → select-y2lIflCz.js.map} +1 -1
- prefect/server/ui-v2/assets/{service-DqISgcwD.js → service-DQBoCx1F.js} +2 -2
- prefect/server/ui-v2/assets/{service-DqISgcwD.js.map → service-DQBoCx1F.js.map} +1 -1
- prefect/server/ui-v2/assets/{settings-DnjyoScP.js → settings-9Ww5jBq4.js} +2 -2
- prefect/server/ui-v2/assets/{settings-DnjyoScP.js.map → settings-9Ww5jBq4.js.map} +1 -1
- prefect/server/ui-v2/assets/{skeleton-DArRq_9V.js → skeleton-CPJoizSQ.js} +2 -2
- prefect/server/ui-v2/assets/{skeleton-DArRq_9V.js.map → skeleton-CPJoizSQ.js.map} +1 -1
- prefect/server/ui-v2/assets/{state-badge-ngrQ67nq.js → state-badge-DFFq5COZ.js} +2 -2
- prefect/server/ui-v2/assets/{state-badge-ngrQ67nq.js.map → state-badge-DFFq5COZ.js.map} +1 -1
- prefect/server/ui-v2/assets/{state-select-bUmduh8e.js → state-select-TCSj7IPn.js} +2 -2
- prefect/server/ui-v2/assets/{state-select-bUmduh8e.js.map → state-select-TCSj7IPn.js.map} +1 -1
- prefect/server/ui-v2/assets/{status-badge-BCzVdEts.js → status-badge-5pEl4xty.js} +2 -2
- prefect/server/ui-v2/assets/{status-badge-BCzVdEts.js.map → status-badge-5pEl4xty.js.map} +1 -1
- prefect/server/ui-v2/assets/{tag-badge-group-BYDgVfl7.js → tag-badge-group-vf-EXVLw.js} +2 -2
- prefect/server/ui-v2/assets/{tag-badge-group-BYDgVfl7.js.map → tag-badge-group-vf-EXVLw.js.map} +1 -1
- prefect/server/ui-v2/assets/{tag-badge-DTVaiChx.js → tag-badge-mp5HxqMT.js} +2 -2
- prefect/server/ui-v2/assets/{tag-badge-DTVaiChx.js.map → tag-badge-mp5HxqMT.js.map} +1 -1
- prefect/server/ui-v2/assets/{tags-input-hwPEN4A8.js → tags-input-DS8uhDId.js} +2 -2
- prefect/server/ui-v2/assets/{tags-input-hwPEN4A8.js.map → tags-input-DS8uhDId.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-C9Cd2k_x.js → task-run-concurrency-limits-reset-dialog-DVCB_sAN.js} +2 -2
- prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-C9Cd2k_x.js.map → task-run-concurrency-limits-reset-dialog-DVCB_sAN.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-run._id-Bh4SxXPB.js → task-run._id-BF5yIJbu.js} +2 -2
- prefect/server/ui-v2/assets/{task-run._id-Bh4SxXPB.js.map → task-run._id-BF5yIJbu.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-run._id-CRu9NFG7.js → task-run._id-DwniCJAS.js} +2 -2
- prefect/server/ui-v2/assets/{task-run._id-CRu9NFG7.js.map → task-run._id-DwniCJAS.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-runs-ChRc-e48.js → task-runs-juaJgpw8.js} +2 -2
- prefect/server/ui-v2/assets/{task-runs-ChRc-e48.js.map → task-runs-juaJgpw8.js.map} +1 -1
- prefect/server/ui-v2/assets/{timezone-select-C5FfG9pp.js → timezone-select-BxW5YhB3.js} +2 -2
- prefect/server/ui-v2/assets/{timezone-select-C5FfG9pp.js.map → timezone-select-BxW5YhB3.js.map} +1 -1
- prefect/server/ui-v2/assets/{toggle-group-_u3r2CNw.js → toggle-group-cZa2kNKg.js} +2 -2
- prefect/server/ui-v2/assets/{toggle-group-_u3r2CNw.js.map → toggle-group-cZa2kNKg.js.map} +1 -1
- prefect/server/ui-v2/assets/{tooltip-C9wxoNDR.js → tooltip-BzlEotat.js} +2 -2
- prefect/server/ui-v2/assets/{tooltip-C9wxoNDR.js.map → tooltip-BzlEotat.js.map} +1 -1
- prefect/server/ui-v2/assets/{trigger-details-CHNjlEuw.js → trigger-details-Bv6ZRMq5.js} +2 -2
- prefect/server/ui-v2/assets/{trigger-details-CHNjlEuw.js.map → trigger-details-Bv6ZRMq5.js.map} +1 -1
- prefect/server/ui-v2/assets/{ui-settings-CaRokgmg.js → ui-settings-Hapar41k.js} +2 -2
- prefect/server/ui-v2/assets/{ui-settings-CaRokgmg.js.map → ui-settings-Hapar41k.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-BughSutx.js → use-delete-automation-confirmation-dialog-Bk5-cKjd.js} +2 -2
- prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-BughSutx.js.map → use-delete-automation-confirmation-dialog-Bk5-cKjd.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-CKHqokBH.js → use-delete-block-document-confirmation-dialog-CYyZ4sTs.js} +2 -2
- prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-CKHqokBH.js.map → use-delete-block-document-confirmation-dialog-CYyZ4sTs.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-delete-deployment-confirmation-dialog-C3ycZNgq.js → use-delete-deployment-confirmation-dialog-CHPDQ8vA.js} +2 -2
- prefect/server/ui-v2/assets/{use-delete-deployment-confirmation-dialog-C3ycZNgq.js.map → use-delete-deployment-confirmation-dialog-CHPDQ8vA.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DhfQBVCF.js → use-get-artifacts-flow-task-runs-3svJ-Wms.js} +2 -2
- prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DhfQBVCF.js.map → use-get-artifacts-flow-task-runs-3svJ-Wms.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-page-size-preference-h2fMa3uB.js → use-page-size-preference-IOpF1ai0.js} +2 -2
- prefect/server/ui-v2/assets/{use-page-size-preference-h2fMa3uB.js.map → use-page-size-preference-IOpF1ai0.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-resource-options-D89EKwub.js → use-resource-options-BEKWTTOl.js} +2 -2
- prefect/server/ui-v2/assets/{use-resource-options-D89EKwub.js.map → use-resource-options-BEKWTTOl.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-stepper-EHPLdSM1.js → use-stepper-C1f9nvnR.js} +2 -2
- prefect/server/ui-v2/assets/{use-stepper-EHPLdSM1.js.map → use-stepper-C1f9nvnR.js.map} +1 -1
- prefect/server/ui-v2/assets/{variables-CNffa7fL.js → variables-BWiRHQ3L.js} +2 -2
- prefect/server/ui-v2/assets/{variables-CNffa7fL.js.map → variables-BWiRHQ3L.js.map} +1 -1
- prefect/server/ui-v2/assets/{variables-CuEJhTIi.js → variables-CxOLIk60.js} +2 -2
- prefect/server/ui-v2/assets/{variables-CuEJhTIi.js.map → variables-CxOLIk60.js.map} +1 -1
- prefect/server/ui-v2/assets/vendor-radix-CTETmXwX.js +42 -0
- prefect/server/ui-v2/assets/vendor-radix-CTETmXwX.js.map +1 -0
- prefect/server/ui-v2/assets/{vendor-react-BIruhmht.js → vendor-react-Db0NSBGF.js} +2 -2
- prefect/server/ui-v2/assets/{vendor-react-BIruhmht.js.map → vendor-react-Db0NSBGF.js.map} +1 -1
- prefect/server/ui-v2/assets/{vendor-recharts-CPNKWlI4.js → vendor-recharts-CnUR3BGJ.js} +2 -2
- prefect/server/ui-v2/assets/{vendor-recharts-CPNKWlI4.js.map → vendor-recharts-CnUR3BGJ.js.map} +1 -1
- prefect/server/ui-v2/assets/vendor-tanstack-Dx3GObhk.js +5 -0
- prefect/server/ui-v2/assets/vendor-tanstack-Dx3GObhk.js.map +1 -0
- prefect/server/ui-v2/assets/{work-pool-queue-form-D2p9bV5H.js → work-pool-queue-form-Bq2X5LHj.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool-queue-form-D2p9bV5H.js.map → work-pool-queue-form-Bq2X5LHj.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool-queue-toggle-mpNXNH8j.js → work-pool-queue-toggle-J85yKGTD.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool-queue-toggle-mpNXNH8j.js.map → work-pool-queue-toggle-J85yKGTD.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool._workPoolName-yitWW_tk.js → work-pool._workPoolName-YCXOdHVr.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool._workPoolName-yitWW_tk.js.map → work-pool._workPoolName-YCXOdHVr.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool._workPoolName-CE8bmrct.js → work-pool._workPoolName-bUofZYwQ.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool._workPoolName-CE8bmrct.js.map → work-pool._workPoolName-bUofZYwQ.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-D0nx4Eah.js → work-pool_._workPoolName.edit-CYfVbRNf.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-D0nx4Eah.js.map → work-pool_._workPoolName.edit-CYfVbRNf.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-DA2UEqLu.js → work-pool_._workPoolName.edit-DiXs_liC.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-DA2UEqLu.js.map → work-pool_._workPoolName.edit-DiXs_liC.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-JXuxoDuG.js → work-pool_._workPoolName.queue._workQueueName-BQuxeqDJ.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-JXuxoDuG.js.map → work-pool_._workPoolName.queue._workQueueName-BQuxeqDJ.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-DBjFQl5l.js → work-pool_._workPoolName.queue._workQueueName-DKeaiBcU.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-DBjFQl5l.js.map → work-pool_._workPoolName.queue._workQueueName-DKeaiBcU.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue.create-D66B3TgZ.js → work-pool_._workPoolName.queue.create-BOXgjauS.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue.create-D66B3TgZ.js.map → work-pool_._workPoolName.queue.create-BOXgjauS.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue.create-C4-aNOiQ.js → work-pool_._workPoolName.queue.create-D13u2idT.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue.create-C4-aNOiQ.js.map → work-pool_._workPoolName.queue.create-D13u2idT.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue_._workQueueName.edit-D0mwu3Qq.js → work-pool_._workPoolName.queue_._workQueueName.edit-B9IWAocA.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue_._workQueueName.edit-D0mwu3Qq.js.map → work-pool_._workPoolName.queue_._workQueueName.edit-B9IWAocA.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue_._workQueueName.edit-BhfkkDyJ.js → work-pool_._workPoolName.queue_._workQueueName.edit-IUEqbb8N.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue_._workQueueName.edit-BhfkkDyJ.js.map → work-pool_._workPoolName.queue_._workQueueName.edit-IUEqbb8N.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pools-CGC3mSny.js → work-pools-CF0R3DPQ.js} +2 -2
- prefect/server/ui-v2/assets/{work-pools-CGC3mSny.js.map → work-pools-CF0R3DPQ.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pools-CfA9RMA9.js → work-pools-CFgVsLNa.js} +2 -2
- prefect/server/ui-v2/assets/{work-pools-CfA9RMA9.js.map → work-pools-CFgVsLNa.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pools-CN3RyiZN.js → work-pools-Ca2SI6yr.js} +2 -2
- prefect/server/ui-v2/assets/{work-pools-CN3RyiZN.js.map → work-pools-Ca2SI6yr.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-queue-icon-text-9KRWnE0A.js → work-queue-icon-text-D1EV2W3e.js} +2 -2
- prefect/server/ui-v2/assets/{work-queue-icon-text-9KRWnE0A.js.map → work-queue-icon-text-D1EV2W3e.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-queue-select-CLtC0i-b.js → work-queue-select-DRgR5_TX.js} +2 -2
- prefect/server/ui-v2/assets/{work-queue-select-CLtC0i-b.js.map → work-queue-select-DRgR5_TX.js.map} +1 -1
- prefect/server/ui-v2/index.html +30 -30
- prefect/server/utilities/worker_channel.py +17 -2
- {prefect-3.7.7.dev2.dist-info → prefect-3.7.8.dev1.dist-info}/METADATA +1 -1
- {prefect-3.7.7.dev2.dist-info → prefect-3.7.8.dev1.dist-info}/RECORD +310 -310
- prefect/server/ui-v2/assets/button-D1nS4G4b.js +0 -3
- prefect/server/ui-v2/assets/deployment_._id.edit-BmCwRQfG.js +0 -2
- prefect/server/ui-v2/assets/index-DpPA2bX1.js.map +0 -1
- prefect/server/ui-v2/assets/python-example-snippet-BxNh5JeI.js +0 -3
- prefect/server/ui-v2/assets/vendor-radix-Dlx3ZkX2.js +0 -42
- prefect/server/ui-v2/assets/vendor-radix-Dlx3ZkX2.js.map +0 -1
- prefect/server/ui-v2/assets/vendor-tanstack-CghpeqA9.js +0 -5
- prefect/server/ui-v2/assets/vendor-tanstack-CghpeqA9.js.map +0 -1
- {prefect-3.7.7.dev2.dist-info → prefect-3.7.8.dev1.dist-info}/WHEEL +0 -0
- {prefect-3.7.7.dev2.dist-info → prefect-3.7.8.dev1.dist-info}/entry_points.txt +0 -0
- {prefect-3.7.7.dev2.dist-info → prefect-3.7.8.dev1.dist-info}/licenses/LICENSE +0 -0
prefect/_build_info.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Generated by versioningit
|
|
2
|
-
__version__ = "3.7.
|
|
3
|
-
__build_date__ = "2026-07-
|
|
4
|
-
__git_commit__ = "
|
|
2
|
+
__version__ = "3.7.8.dev1"
|
|
3
|
+
__build_date__ = "2026-07-06 09:30:01.920709+00:00"
|
|
4
|
+
__git_commit__ = "013ae5c0f2eacadd8e72558ad1e9f4206fcf56bc"
|
|
5
5
|
__dirty__ = False
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import argparse
|
|
4
|
-
import builtins
|
|
5
4
|
import contextlib
|
|
6
5
|
import os
|
|
7
6
|
import sys
|
|
@@ -20,7 +19,8 @@ from prefect.deployments.steps.core import (
|
|
|
20
19
|
run_steps,
|
|
21
20
|
)
|
|
22
21
|
from prefect.filesystems import LocalFileSystem
|
|
23
|
-
from prefect.logging.
|
|
22
|
+
from prefect.logging.handlers import APILogHandler
|
|
23
|
+
from prefect.logging.loggers import PrefectLogAdapter, flow_run_logger
|
|
24
24
|
from prefect.utilities.filesystem import relative_path_to_current_platform
|
|
25
25
|
from prefect.utilities.processutils import get_sys_executable
|
|
26
26
|
|
|
@@ -29,7 +29,6 @@ if TYPE_CHECKING:
|
|
|
29
29
|
from prefect.client.schemas.objects import FlowRun
|
|
30
30
|
from prefect.client.schemas.responses import DeploymentResponse
|
|
31
31
|
|
|
32
|
-
LOGGER = get_logger("prefect.runner.workspace_resolver")
|
|
33
32
|
STORAGE_BASE_PATH_PLACEHOLDER = "$STORAGE_BASE_PATH"
|
|
34
33
|
|
|
35
34
|
|
|
@@ -67,11 +66,6 @@ def get_workspace_resolver_command(
|
|
|
67
66
|
]
|
|
68
67
|
|
|
69
68
|
|
|
70
|
-
def _stderr_print(*args: Any, **kwargs: Any) -> None:
|
|
71
|
-
kwargs.pop("style", None)
|
|
72
|
-
builtins.print(*args, file=sys.stderr, **kwargs)
|
|
73
|
-
|
|
74
|
-
|
|
75
69
|
def _resolve_runtime_entrypoint(entrypoint: str) -> str:
|
|
76
70
|
if ":" not in entrypoint:
|
|
77
71
|
return entrypoint
|
|
@@ -211,6 +205,7 @@ async def _ensure_entrypoint_in_workspace(
|
|
|
211
205
|
workspace_root: Path,
|
|
212
206
|
source_cwd: Path,
|
|
213
207
|
storage_base_path: Path | None,
|
|
208
|
+
logger: PrefectLogAdapter,
|
|
214
209
|
) -> Path:
|
|
215
210
|
if _has_entrypoint_file(deployment.entrypoint, workspace_root):
|
|
216
211
|
return workspace_root
|
|
@@ -229,6 +224,7 @@ async def _ensure_entrypoint_in_workspace(
|
|
|
229
224
|
workspace_root,
|
|
230
225
|
source_cwd,
|
|
231
226
|
storage_base_path,
|
|
227
|
+
logger,
|
|
232
228
|
)
|
|
233
229
|
return workspace_root
|
|
234
230
|
|
|
@@ -259,6 +255,7 @@ async def _pull_storage_into_workspace(
|
|
|
259
255
|
workspace_root: Path,
|
|
260
256
|
source_cwd: Path,
|
|
261
257
|
storage_base_path: Path | None,
|
|
258
|
+
logger: PrefectLogAdapter,
|
|
262
259
|
) -> Path:
|
|
263
260
|
local_path = _workspace_destination_for_deployment_path(
|
|
264
261
|
deployment.path, workspace_root, storage_base_path
|
|
@@ -285,7 +282,7 @@ async def _pull_storage_into_workspace(
|
|
|
285
282
|
)
|
|
286
283
|
storage_block = LocalFileSystem(basepath=from_path)
|
|
287
284
|
|
|
288
|
-
|
|
285
|
+
logger.info("Downloading flow code from storage at %r", from_path)
|
|
289
286
|
await storage_block.get_directory(from_path=from_path, local_path=str(local_path))
|
|
290
287
|
return local_path
|
|
291
288
|
|
|
@@ -301,6 +298,8 @@ async def prepare_workspace(
|
|
|
301
298
|
f"Deployment {deployment.id} does not have an entrypoint and can not be run."
|
|
302
299
|
)
|
|
303
300
|
|
|
301
|
+
run_logger = flow_run_logger(flow_run)
|
|
302
|
+
|
|
304
303
|
source_cwd = Path.cwd().resolve()
|
|
305
304
|
storage_base_path = _get_configured_storage_base_path()
|
|
306
305
|
resolved_workspace_root = Path(workspace_root).expanduser().resolve()
|
|
@@ -314,6 +313,7 @@ async def prepare_workspace(
|
|
|
314
313
|
resolved_workspace_root,
|
|
315
314
|
source_cwd,
|
|
316
315
|
storage_base_path,
|
|
316
|
+
run_logger,
|
|
317
317
|
)
|
|
318
318
|
local_runtime_directory = _resolve_local_runtime_directory(
|
|
319
319
|
deployment.path, source_cwd, storage_base_path
|
|
@@ -326,7 +326,9 @@ async def prepare_workspace(
|
|
|
326
326
|
working_directory = resolved_workspace_root
|
|
327
327
|
step_selected_working_directory = False
|
|
328
328
|
os.chdir(resolved_workspace_root)
|
|
329
|
-
|
|
329
|
+
run_logger.info(
|
|
330
|
+
"Running %s deployment pull step(s)", len(deployment.pull_steps)
|
|
331
|
+
)
|
|
330
332
|
|
|
331
333
|
def _track_step_workspace(
|
|
332
334
|
_step: dict[str, Any],
|
|
@@ -359,10 +361,10 @@ async def prepare_workspace(
|
|
|
359
361
|
with _observe_step_completion(_track_step_workspace):
|
|
360
362
|
await run_steps(
|
|
361
363
|
deployment.pull_steps,
|
|
362
|
-
print_function=
|
|
364
|
+
print_function=run_logger.warning,
|
|
363
365
|
deployment=deployment,
|
|
364
366
|
flow_run=flow_run,
|
|
365
|
-
logger=
|
|
367
|
+
logger=run_logger,
|
|
366
368
|
)
|
|
367
369
|
finally:
|
|
368
370
|
_PULL_STEP_SOURCE_CWD.reset(source_cwd_token)
|
|
@@ -374,6 +376,7 @@ async def prepare_workspace(
|
|
|
374
376
|
resolved_workspace_root,
|
|
375
377
|
source_cwd,
|
|
376
378
|
storage_base_path,
|
|
379
|
+
run_logger,
|
|
377
380
|
)
|
|
378
381
|
|
|
379
382
|
os.chdir(working_directory)
|
|
@@ -436,6 +439,8 @@ async def _main_async(argv: list[str] | None = None) -> int:
|
|
|
436
439
|
sys.stdout.write(result.model_dump_json())
|
|
437
440
|
sys.stdout.write("\n")
|
|
438
441
|
return 1
|
|
442
|
+
finally:
|
|
443
|
+
await APILogHandler.aflush()
|
|
439
444
|
|
|
440
445
|
result = PreparedWorkspaceResult(status="success", workspace=workspace)
|
|
441
446
|
sys.stdout.write(result.model_dump_json())
|
prefect/server/AGENTS.md
CHANGED
|
@@ -67,7 +67,7 @@ alembic_revision("description") # Create a new migration
|
|
|
67
67
|
|
|
68
68
|
## UI Serving Architecture
|
|
69
69
|
|
|
70
|
-
Both V1 and V2 UI bundles are served simultaneously when available: V1 at `PREFECT_UI_SERVE_BASE` (default `/`), V2 at `{base_url}/v2`. The `redirect_to_preferred_ui` middleware routes neutral entry points using the `prefect_ui_version` cookie. `PREFECT_SERVER_UI_V2_ENABLED` sets the *default* for browsers with no saved preference — it does not remove V1 or force all users to V2. Both bundles must be built before packaging (`PREFECT_REQUIRE_PACKAGED_UI_BUNDLES=1` enforces this via `hatch_build.py`).
|
|
70
|
+
Both V1 and V2 UI bundles are served simultaneously when available: V1 at `PREFECT_UI_SERVE_BASE` (default `/`), V2 at `{base_url}/v2`. The `redirect_to_preferred_ui` middleware routes neutral entry points using the `prefect_ui_version` cookie. `PREFECT_SERVER_UI_V2_ENABLED` sets the *default* for browsers with no saved preference — it does not remove V1 or force all users to V2. Both bundles must be built before packaging (`PREFECT_REQUIRE_PACKAGED_UI_BUNDLES=1` enforces this via `hatch_build.py`). **The version-redirect `Location` header must be a relative path** — using `request.url.replace(...)` builds an absolute URL that embeds the internal Host behind a reverse proxy and leaks it to the client.
|
|
71
71
|
|
|
72
72
|
## Main Subsystems
|
|
73
73
|
|
prefect/server/api/workers.py
CHANGED
|
@@ -1148,6 +1148,7 @@ async def worker_channel_connect(
|
|
|
1148
1148
|
work_pool_id=ready.payload.initial_snapshot.work_pool.id,
|
|
1149
1149
|
consumer_id=hello.payload.consumer_id,
|
|
1150
1150
|
worker_name=hello.payload.worker_name,
|
|
1151
|
+
work_pool_updated=ready.payload.initial_snapshot.work_pool.updated,
|
|
1151
1152
|
cleanup_queue=(
|
|
1152
1153
|
cleanup_queue
|
|
1153
1154
|
if CLEANUP_DELIVERY_CAPABILITY
|
|
@@ -309,7 +309,6 @@ async def read_artifacts(
|
|
|
309
309
|
task_run_filter: Only select artifacts whose task runs matching this filter
|
|
310
310
|
deployment_filter: Only select artifacts whose flow runs belong to deployments matching this filter
|
|
311
311
|
flow_filter: Only select artifacts whose flow runs belong to flows matching this filter
|
|
312
|
-
work_pool_filter: Only select artifacts whose flow runs belong to work pools matching this filter
|
|
313
312
|
"""
|
|
314
313
|
query = sa.select(db.Artifact).order_by(*sort.as_sql_sort())
|
|
315
314
|
|
|
@@ -357,7 +356,6 @@ async def read_latest_artifacts(
|
|
|
357
356
|
task_run_filter: Only select artifacts whose task runs matching this filter
|
|
358
357
|
deployment_filter: Only select artifacts whose flow runs belong to deployments matching this filter
|
|
359
358
|
flow_filter: Only select artifacts whose flow runs belong to flows matching this filter
|
|
360
|
-
work_pool_filter: Only select artifacts whose flow runs belong to work pools matching this filter
|
|
361
359
|
"""
|
|
362
360
|
query = sa.select(db.ArtifactCollection).order_by(*sort.as_sql_sort())
|
|
363
361
|
query = await _apply_artifact_collection_filters(
|
|
@@ -294,11 +294,11 @@ async def read_work_queue_by_name(
|
|
|
294
294
|
db: PrefectDBInterface, session: AsyncSession, name: str
|
|
295
295
|
) -> Optional[orm_models.WorkQueue]:
|
|
296
296
|
"""
|
|
297
|
-
Reads a WorkQueue by
|
|
297
|
+
Reads a WorkQueue by name.
|
|
298
298
|
|
|
299
299
|
Args:
|
|
300
300
|
session (AsyncSession): A database session
|
|
301
|
-
|
|
301
|
+
name (str): a WorkQueue name
|
|
302
302
|
|
|
303
303
|
Returns:
|
|
304
304
|
orm_models.WorkQueue: the WorkQueue
|
prefect/server/models/workers.py
CHANGED
|
@@ -325,7 +325,7 @@ async def update_work_pool(
|
|
|
325
325
|
Args:
|
|
326
326
|
session (AsyncSession): A database session
|
|
327
327
|
work_pool_id (UUID): a WorkPool id
|
|
328
|
-
|
|
328
|
+
work_pool: the work pool data
|
|
329
329
|
emit_status_change: function to call when work pool
|
|
330
330
|
status is changed
|
|
331
331
|
emit_update_event: whether to emit an event for updated non-status fields
|
prefect/server/schemas/core.py
CHANGED
|
@@ -1046,7 +1046,7 @@ class WorkQueueHealthPolicy(PrefectBaseModel):
|
|
|
1046
1046
|
Given empirical information about the state of the work queue, evaluate its health status.
|
|
1047
1047
|
|
|
1048
1048
|
Args:
|
|
1049
|
-
|
|
1049
|
+
late_runs_count: the count of late runs for the work queue.
|
|
1050
1050
|
last_polled: the last time the work queue was polled, if available.
|
|
1051
1051
|
|
|
1052
1052
|
Returns:
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{E as e,F as t,O as n}from"./vendor-tanstack-
|
|
2
|
-
//# sourceMappingURL=admin-
|
|
1
|
+
import{E as e,F as t,O as n}from"./vendor-tanstack-Dx3GObhk.js";import{n as r}from"./service-DQBoCx1F.js";var i={settings:()=>[`settings`],version:()=>[`version`],defaultResultStorage:()=>[`default-result-storage`]},a=()=>n({queryKey:i.version(),queryFn:async()=>{let e=await(await r()).GET(`/admin/version`);if(!e.data)throw Error(`'data' expected`);return e.data}}),o=()=>n({queryKey:i.settings(),queryFn:async()=>{let e=await(await r()).GET(`/admin/settings`);if(!e.data)throw Error(`'data' expected`);return e.data}}),s=()=>n({queryKey:i.defaultResultStorage(),queryFn:async()=>{let e=await(await r()).GET(`/admin/storage`);if(!e.data)throw Error(`'data' expected`);return e.data}}),c=()=>{let n=t(),{mutate:a,...o}=e({mutationFn:async e=>{let t=await(await r()).PUT(`/admin/storage`,{body:e});if(!t.data)throw Error(`'data' expected`);return t.data},onSuccess:e=>{n.setQueryData(i.defaultResultStorage(),e),n.invalidateQueries({queryKey:i.defaultResultStorage()})}});return{updateDefaultResultStorage:a,...o}},l=()=>{let n=t(),{mutate:a,...o}=e({mutationFn:async()=>(await r()).DELETE(`/admin/storage`),onSuccess:()=>{n.setQueryData(i.defaultResultStorage(),{default_result_storage_block_id:null}),n.invalidateQueries({queryKey:i.defaultResultStorage()})}});return{clearDefaultResultStorage:a,...o}};export{l as a,i,o as n,c as o,a as r,s as t};
|
|
2
|
+
//# sourceMappingURL=admin-BwmAgV1B.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-
|
|
1
|
+
{"version":3,"file":"admin-BwmAgV1B.js","names":[],"sources":["../../src/api/admin/admin.ts"],"sourcesContent":["import {\n\tqueryOptions,\n\tuseMutation,\n\tuseQueryClient,\n} from \"@tanstack/react-query\";\nimport type { components } from \"@/api/prefect\";\nimport { getQueryService } from \"@/api/service\";\n\n/**\n * ```\n * 🏗️ Admin queries construction 👷\n * settings => ['settings'] // key to match ['settings']\n * version => ['version'] // key to match ['version']\n * defaultResultStorage => ['default-result-storage'] // key to match ['default-result-storage']\n * ```\n * */\nexport const queryKeyFactory = {\n\tsettings: () => [\"settings\"] as const,\n\tversion: () => [\"version\"] as const,\n\tdefaultResultStorage: () => [\"default-result-storage\"] as const,\n};\n\nexport type ServerDefaultResultStorage =\n\tcomponents[\"schemas\"][\"ServerDefaultResultStorage\"];\nexport type ServerDefaultResultStorageUpdate =\n\tcomponents[\"schemas\"][\"ServerDefaultResultStorageUpdate\"];\n\n// ----- 🔑 Queries 🗄️\n// ----------------------------\n\n/**\n *\n * @returns react query options object for getting the Prefect's version number\n */\nexport const buildGetVersionQuery = () =>\n\tqueryOptions({\n\t\tqueryKey: queryKeyFactory.version(),\n\t\tqueryFn: async () => {\n\t\t\tconst res = await (await getQueryService()).GET(\"/admin/version\");\n\t\t\tif (!res.data) {\n\t\t\t\tthrow new Error(\"'data' expected\");\n\t\t\t}\n\t\t\treturn res.data;\n\t\t},\n\t});\n\n/**\n *\n * @returns react query options object for getting the Prefect server's settings information\n */\nexport const buildGetSettingsQuery = () =>\n\tqueryOptions({\n\t\tqueryKey: queryKeyFactory.settings(),\n\t\tqueryFn: async () => {\n\t\t\tconst res = await (await getQueryService()).GET(\"/admin/settings\");\n\t\t\tif (!res.data) {\n\t\t\t\tthrow new Error(\"'data' expected\");\n\t\t\t}\n\t\t\treturn res.data;\n\t\t},\n\t});\n\n/**\n *\n * @returns react query options object for getting the server default result storage block\n */\nexport const buildGetDefaultResultStorageQuery = () =>\n\tqueryOptions({\n\t\tqueryKey: queryKeyFactory.defaultResultStorage(),\n\t\tqueryFn: async () => {\n\t\t\tconst res = await (await getQueryService()).GET(\"/admin/storage\");\n\t\t\tif (!res.data) {\n\t\t\t\tthrow new Error(\"'data' expected\");\n\t\t\t}\n\t\t\treturn res.data;\n\t\t},\n\t});\n\nexport const useUpdateDefaultResultStorage = () => {\n\tconst queryClient = useQueryClient();\n\n\tconst { mutate: updateDefaultResultStorage, ...rest } = useMutation({\n\t\tmutationFn: async (body: ServerDefaultResultStorageUpdate) => {\n\t\t\tconst res = await (await getQueryService()).PUT(\"/admin/storage\", {\n\t\t\t\tbody,\n\t\t\t});\n\t\t\tif (!res.data) {\n\t\t\t\tthrow new Error(\"'data' expected\");\n\t\t\t}\n\t\t\treturn res.data;\n\t\t},\n\t\tonSuccess: (data) => {\n\t\t\tqueryClient.setQueryData(queryKeyFactory.defaultResultStorage(), data);\n\t\t\tvoid queryClient.invalidateQueries({\n\t\t\t\tqueryKey: queryKeyFactory.defaultResultStorage(),\n\t\t\t});\n\t\t},\n\t});\n\n\treturn { updateDefaultResultStorage, ...rest };\n};\n\nexport const useClearDefaultResultStorage = () => {\n\tconst queryClient = useQueryClient();\n\n\tconst { mutate: clearDefaultResultStorage, ...rest } = useMutation({\n\t\tmutationFn: async () => (await getQueryService()).DELETE(\"/admin/storage\"),\n\t\tonSuccess: () => {\n\t\t\tqueryClient.setQueryData(queryKeyFactory.defaultResultStorage(), {\n\t\t\t\tdefault_result_storage_block_id: null,\n\t\t\t} satisfies ServerDefaultResultStorage);\n\t\t\tvoid queryClient.invalidateQueries({\n\t\t\t\tqueryKey: queryKeyFactory.defaultResultStorage(),\n\t\t\t});\n\t\t},\n\t});\n\n\treturn { clearDefaultResultStorage, ...rest };\n};\n"],"mappings":"0GAgBA,IAAa,EAAkB,CAC9B,aAAgB,CAAC,UAAU,EAC3B,YAAe,CAAC,SAAS,EACzB,yBAA4B,CAAC,wBAAwB,CACtD,EAca,MACZ,EAAa,CACZ,SAAU,EAAgB,QAAQ,EAClC,QAAS,SAAY,CACpB,IAAM,EAAM,MAAO,MAAM,EAAgB,EAAA,CAAG,IAAI,gBAAgB,EAChE,GAAI,CAAC,EAAI,KACR,MAAU,MAAM,iBAAiB,EAElC,OAAO,EAAI,IACZ,CACD,CAAC,EAMW,MACZ,EAAa,CACZ,SAAU,EAAgB,SAAS,EACnC,QAAS,SAAY,CACpB,IAAM,EAAM,MAAO,MAAM,EAAgB,EAAA,CAAG,IAAI,iBAAiB,EACjE,GAAI,CAAC,EAAI,KACR,MAAU,MAAM,iBAAiB,EAElC,OAAO,EAAI,IACZ,CACD,CAAC,EAMW,MACZ,EAAa,CACZ,SAAU,EAAgB,qBAAqB,EAC/C,QAAS,SAAY,CACpB,IAAM,EAAM,MAAO,MAAM,EAAgB,EAAA,CAAG,IAAI,gBAAgB,EAChE,GAAI,CAAC,EAAI,KACR,MAAU,MAAM,iBAAiB,EAElC,OAAO,EAAI,IACZ,CACD,CAAC,EAEW,MAAsC,CAClD,IAAM,EAAc,EAAe,EAE7B,CAAE,OAAQ,EAA4B,GAAG,GAAS,EAAY,CACnE,WAAY,KAAO,IAA2C,CAC7D,IAAM,EAAM,MAAO,MAAM,EAAgB,EAAA,CAAG,IAAI,iBAAkB,CACjE,MACD,CAAC,EACD,GAAI,CAAC,EAAI,KACR,MAAU,MAAM,iBAAiB,EAElC,OAAO,EAAI,IACZ,EACA,UAAY,GAAS,CACpB,EAAY,aAAa,EAAgB,qBAAqB,EAAG,CAAI,EACrE,EAAiB,kBAAkB,CAClC,SAAU,EAAgB,qBAAqB,CAChD,CAAC,CACF,CACD,CAAC,EAED,MAAO,CAAE,6BAA4B,GAAG,CAAK,CAC9C,EAEa,MAAqC,CACjD,IAAM,EAAc,EAAe,EAE7B,CAAE,OAAQ,EAA2B,GAAG,GAAS,EAAY,CAClE,WAAY,UAAa,MAAM,EAAgB,EAAA,CAAG,OAAO,gBAAgB,EACzE,cAAiB,CAChB,EAAY,aAAa,EAAgB,qBAAqB,EAAG,CAChE,gCAAiC,IAClC,CAAsC,EACtC,EAAiB,kBAAkB,CAClC,SAAU,EAAgB,qBAAqB,CAChD,CAAC,CACF,CACD,CAAC,EAED,MAAO,CAAE,4BAA2B,GAAG,CAAK,CAC7C"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{o as e}from"./vendor-codemirror-Bs7Yv0L9.js";import{t}from"./error-utils-CRZTwdQh.js";import{t as n}from"./route-error-state-
|
|
2
|
-
//# sourceMappingURL=artifact._id-
|
|
1
|
+
import{o as e}from"./vendor-codemirror-Bs7Yv0L9.js";import{t}from"./error-utils-CRZTwdQh.js";import{t as n}from"./route-error-state-D3zpyudZ.js";var r=e(),i=function({error:e,reset:i}){let a=t(e,`Failed to load artifact`);if(a.type!==`server-error`&&a.type!==`client-error`)throw e;return(0,r.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,r.jsx)(`div`,{children:(0,r.jsx)(`h1`,{className:`text-2xl font-semibold`,children:`Artifact`})}),(0,r.jsx)(n,{error:a,onRetry:i})]})};export{i as errorComponent};
|
|
2
|
+
//# sourceMappingURL=artifact._id-DClBSNAc.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact._id-
|
|
1
|
+
{"version":3,"file":"artifact._id-DClBSNAc.js","names":["categorizeError","RouteErrorState","SplitErrorComponent","ArtifactDetailErrorComponent","error","reset","ErrorComponentProps","serverError","type","errorComponent"],"sources":["../../src/routes/artifacts/artifact.$id.tsx?tsr-split=errorComponent"],"sourcesContent":["import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { z } from \"zod\";\nimport { buildGetArtifactQuery } from \"@/api/artifacts\";\nimport { useGetArtifactFlowTaskRuns } from \"@/api/artifacts/use-get-artifacts-flow-task-runs/use-get-artifacts-flow-task-runs\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport { ArtifactDetailPage } from \"@/components/artifacts/artifact/artifact-detail-page\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\n\n/**\n * Schema for validating URL search parameters for the Artifact Detail page\n * @property {\"Artifact\" | \"Details\" | \"Raw\"} tab used to designate which tab view to display\n */\nconst searchParams = z.object({\n\ttab: z.enum([\"Artifact\", \"Details\", \"Raw\"]).default(\"Artifact\"),\n});\n\nexport type ArtifactDetailTabOptions = z.infer<typeof searchParams>[\"tab\"];\n\nexport const Route = createFileRoute(\"/artifacts/artifact/$id\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: function RouteComponent() {\n\t\tconst { id } = Route.useParams();\n\n\t\tconst { data: artifact } = useSuspenseQuery(buildGetArtifactQuery(id));\n\n\t\tconst artifactWithMetadata = useGetArtifactFlowTaskRuns(id);\n\n\t\treturn <ArtifactDetailPage artifact={artifactWithMetadata ?? artifact} />;\n\t},\n\tloader: async ({ context, params }) => {\n\t\tconst { id } = params;\n\n\t\tconst artifact = await context.queryClient.ensureQueryData(\n\t\t\tbuildGetArtifactQuery(id),\n\t\t);\n\n\t\treturn { artifact };\n\t},\n\terrorComponent: function ArtifactDetailErrorComponent({\n\t\terror,\n\t\treset,\n\t}: ErrorComponentProps) {\n\t\tconst serverError = categorizeError(error, \"Failed to load artifact\");\n\t\tif (\n\t\t\tserverError.type !== \"server-error\" &&\n\t\t\tserverError.type !== \"client-error\"\n\t\t) {\n\t\t\tthrow error;\n\t\t}\n\t\treturn (\n\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t<div>\n\t\t\t\t\t<h1 className=\"text-2xl font-semibold\">Artifact</h1>\n\t\t\t\t</div>\n\t\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t\t</div>\n\t\t);\n\t},\n});\n"],"mappings":"2JAWAE,EA8BiB,SAAsC,CACrDE,QACAC,SACuB,CACvB,IAAME,EAAcP,EAAgBI,EAAO,yBAAyB,EACpE,GACCG,EAAYC,OAAS,gBACrBD,EAAYC,OAAS,eAErB,MAAMJ,EAEP,OACC,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAU,+BAAf,EACC,EAAA,EAAA,IAAA,CAAC,MAAD,CAAA,UACC,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAU,kCAAyB,UAAY,CAAA,CAC/C,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,EAAD,CAAiB,MAAOG,EAAa,QAASF,CAAM,CAAA,CAChD,GAEP"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{a as t,o as n,r,s as i}from"./vendor-codemirror-Bs7Yv0L9.js";import{_ as a,a as o,g as s,i as c,j as l,o as u,r as d}from"./vendor-tanstack-CghpeqA9.js";import{g as f,h as p,t as m,u as h}from"./button-D1nS4G4b.js";import{n as g}from"./dist-BWGcVrLy.js";import{n as _}from"./input-BaSLpSlc.js";import{t as v}from"./tag-badge-DTVaiChx.js";import{Ar as y,Dr as b,Er as x,K as S,Kr as C,Ln as w,Or as T,Tr as E,cr as D,ir as O,jr as k,lr as A,m as j,or as M,sr as N}from"./index-DpPA2bX1.js";import{t as P}from"./key-value-C2vDi3xo.js";import{n as F}from"./use-get-artifacts-flow-task-runs-DhfQBVCF.js";import{t as I}from"./lazy-markdown-CCDNtAxT.js";import{t as L}from"./data-table-C_Co3B-8.js";var R=e(i(),1),z=n(),B=({artifact:e})=>(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(`div`,{className:`flex items-center justify-between`,children:[e.key?(0,z.jsx)(`div`,{className:`flex items-center gap-2 min-w-0`,children:(0,z.jsx)(E,{className:`min-w-0`,children:(0,z.jsxs)(T,{className:`flex-nowrap`,children:[(0,z.jsx)(x,{className:`min-w-0`,children:(0,z.jsx)(b,{to:`/artifacts/key/$key`,params:{key:e.key},className:`text-xl font-semibold truncate block`,title:e.key,children:e.key})}),(0,z.jsx)(y,{}),(0,z.jsx)(x,{className:`text-xl font-semibold min-w-0`,children:(0,z.jsx)(`span`,{className:`font-mono truncate block`,title:e.id,children:e.id})})]})})}):(0,z.jsx)(`div`,{className:`flex items-center gap-2 min-w-0`,children:(0,z.jsx)(E,{className:`min-w-0`,children:(0,z.jsxs)(T,{className:`flex-nowrap`,children:[e.flow_run&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(x,{className:`min-w-0`,children:(0,z.jsx)(b,{to:`/runs/flow-run/$id`,params:{id:e.flow_run_id??``},className:`text-xl font-semibold truncate block`,title:e.flow_run.name,children:e.flow_run.name})}),(0,z.jsx)(y,{})]}),e.task_run&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(x,{className:`min-w-0`,children:(0,z.jsx)(b,{to:`/runs/task-run/$id`,params:{id:e.task_run_id??``},className:`text-xl font-semibold truncate block`,title:e.task_run.name,children:e.task_run.name})}),(0,z.jsx)(y,{})]}),(0,z.jsx)(x,{className:`text-xl font-semibold min-w-0`,children:(0,z.jsx)(`span`,{className:`font-mono truncate block`,title:e.id,children:e.id})})]})})}),(0,z.jsx)(O,{id:`artifacts-guide`,label:`Documentation`})]}),e.description&&(0,z.jsx)(`div`,{className:`text-sm text-muted-foreground my-2`,children:(0,z.jsx)(I,{children:e.description})}),(0,z.jsx)(`hr`,{})]}),V=({artifact:e})=>{let[n,i]=(0,R.useState)(!1),a=()=>{i(e=>!e)},o=(0,R.useRef)(null),{resolvedTheme:s}=C(),{setContainer:c}=r({container:o.current,extensions:[t.lineWrapping],value:String(e.data),indentWithTab:!1,editable:!0,basicSetup:{highlightActiveLine:!1,foldGutter:!1,highlightActiveLineGutter:!1},theme:s===`dark`?`dark`:`light`});(0,R.useEffect)(()=>{o.current&&c(o.current)},[c]);let l=e=>{g.success(`Copied to clipboard`),navigator.clipboard.writeText(e)};return(0,z.jsxs)(`div`,{className:`flex flex-col justify-center items-center`,children:[(0,z.jsxs)(m,{"data-testid":`show-raw-data-button`,variant:`outline`,onClick:a,className:`my-4`,children:[n?`Hide`:`Show`,` Raw Data`]}),(0,z.jsx)(`div`,{className:`rounded-md border shadow-xs focus-within:outline-hidden focus-within:ring-1 focus-within:ring-ring relative`,style:{display:n?`block`:`none`},ref:e=>{o.current=e},"data-testid":`raw-data-display`,children:(0,z.jsx)(m,{onClick:()=>l(e.data),variant:`ghost`,size:`icon`,className:`absolute top-0 right-0 z-10`,"aria-label":`copy`,children:(0,z.jsx)(f,{id:`Copy`,className:`size-2`})})})]})},ee=s(`/artifacts/artifact/$id`),H=({artifact:e,artifactContent:t,detailsContent:n})=>{let{tab:r}=ee.useSearch(),i=U(e,t,n);return(0,z.jsxs)(M,{defaultValue:`Artifact`,value:r,children:[(0,z.jsx)(D,{children:i.map(({value:e,hiddenOnDesktop:t,LinkComponent:n})=>(0,z.jsx)(n,{className:p(t&&`lg:hidden`)},e))}),i.map(({value:e,ViewComponent:t})=>(0,z.jsx)(t,{},e))]})};function U(e,t,n){return(0,R.useMemo)(()=>{let r=[];return r.push({value:`Artifact`,LinkComponent:({className:e})=>(0,z.jsx)(a,{to:`.`,search:{tab:`Artifact`},children:(0,z.jsx)(A,{value:`Artifact`,className:e,children:`Artifact`})}),ViewComponent:()=>(0,z.jsxs)(N,{value:`Artifact`,children:[t,(0,z.jsx)(V,{artifact:e})]})}),r.push({value:`Details`,hiddenOnDesktop:!0,LinkComponent:({className:e})=>(0,z.jsx)(a,{to:`.`,search:{tab:`Details`},children:(0,z.jsx)(A,{value:`Details`,className:e,children:`Details`})}),ViewComponent:()=>(0,z.jsx)(N,{value:`Details`,children:n})}),r.push({value:`Raw`,LinkComponent:({className:e})=>(0,z.jsx)(a,{to:`.`,search:{tab:`Raw`},children:(0,z.jsx)(A,{value:`Raw`,className:e,children:`Raw`})}),ViewComponent:()=>(0,z.jsx)(N,{value:`Raw`,children:(0,z.jsx)(W,{artifact:e})})}),r},[e,t,n])}function W({artifact:e}){return(0,z.jsx)(`pre`,{className:`whitespace-pre-wrap break-words rounded-md border bg-muted p-4 text-sm`,children:typeof e.data==`string`?e.data:JSON.stringify(e.data,null,2)})}var G=({url:e})=>(0,z.jsxs)(`div`,{"data-testid":e,className:`prose dark:prose-invert mt-2`,children:[(0,z.jsx)(`img`,{"data-testid":`image-${e}`,src:e,alt:`artifact-image`,className:`w-full`}),(0,z.jsxs)(`p`,{className:`text-lg`,children:[`Image URL:`,` `,(0,z.jsx)(`a`,{className:`text-link hover:text-link-hover hover:underline`,target:`_blank`,href:e,rel:`noreferrer`,children:e})]})]}),K=({markdown:e})=>(0,z.jsx)(`div`,{"data-testid":`markdown-display`,className:`mt-4 prose dark:prose-invert`,children:(0,z.jsx)(I,{children:e})}),q=({progress:e})=>(0,z.jsxs)(`p`,{"data-testid":`progress-display`,className:`text-lg`,children:[`Progress: `,e,`%`]}),J=c(),Y=({tableData:e})=>{let t=(0,R.useMemo)(()=>JSON.parse(e),[e]),n=(0,R.useMemo)(()=>Object.keys(t[0]??{}),[t]),[r,i]=(0,R.useState)(``),a=(0,R.useMemo)(()=>n.map(e=>J.display({id:e,header:()=>e,cell:({row:t})=>{let n=String(t.original[e]??``);return(0,z.jsx)(`span`,{className:`truncate block`,title:n,children:n})}})),[n]),s=d({data:(0,R.useMemo)(()=>r?t.filter(e=>Object.values(e).some(e=>String(e).toLowerCase().includes(r.toLowerCase()))):t,[r,t]),columns:a,getCoreRowModel:o(),getPaginationRowModel:u(),initialState:{pagination:{pageIndex:0,pageSize:10}}});return(0,z.jsxs)(`div`,{"data-testid":`table-display`,className:`mt-4`,children:[(0,z.jsx)(`div`,{className:`flex flex-row justify-end items-center mb-2`,children:(0,z.jsx)(_,{placeholder:`Search`,value:r,onChange:e=>i(e.target.value)})}),(0,z.jsx)(L,{table:s})]})},X=({artifact:e})=>{let t=(0,R.useMemo)(()=>e.created?h(e.created,`dateTime`):null,[e.created]);return(0,z.jsxs)(`div`,{className:`mt-4`,children:[(0,z.jsx)(`p`,{className:`text-base font-semibold`,children:`Artifact`}),(0,z.jsxs)(`div`,{className:`mt-3 flex flex-col gap-3`,children:[(0,z.jsx)(P,{label:`Key`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:e.key??`None`})}),(0,z.jsx)(P,{label:`Type`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:e.type??`None`})}),(0,z.jsx)(P,{label:`Created`,value:(0,z.jsx)(`span`,{children:t??`None`})})]})]})},Z=e(k(),1),Q=({flowRun:e})=>{let t=(0,R.useMemo)(()=>e.start_time?h(e.start_time,`dateTime`):null,[e.start_time]),n=(0,R.useMemo)(()=>e.estimated_run_time?(0,Z.default)(Math.ceil(e.estimated_run_time)*1e3):null,[e.estimated_run_time]),r=(0,R.useMemo)(()=>e.created?h(e.created,`dateTime`):null,[e.created]),i=(0,R.useMemo)(()=>e.updated?h(e.updated,`dateTime`):null,[e.updated]);return(0,z.jsxs)(`div`,{className:`mt-4`,children:[(0,z.jsx)(`p`,{className:`text-lg font-bold`,children:`Flow Run`}),(0,z.jsxs)(`div`,{className:`mt-3 flex flex-col gap-3`,children:[(0,z.jsx)(P,{label:`Start time`,value:(0,z.jsxs)(`span`,{className:`font-mono flex items-center`,children:[(0,z.jsx)(f,{id:`Calendar`,className:`inline w-4 mr-2`}),t??`None`]})}),(0,z.jsx)(P,{label:`Duration`,value:(0,z.jsxs)(`span`,{className:`font-mono flex items-center`,children:[(0,z.jsx)(f,{id:`Clock`,className:`inline w-4 mr-2`}),n??`None`]})}),(0,z.jsx)(P,{label:`Created`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:r??`None`})}),(0,z.jsx)(P,{label:`Last Updated`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:i??`None`})}),(0,z.jsx)(P,{label:`Tags`,value:e.tags&&e.tags.length>0?(0,z.jsx)(`div`,{className:`flex flex-wrap`,children:e.tags.map(e=>(0,z.jsx)(v,{tag:e},e))}):(0,z.jsx)(`span`,{className:`font-mono`,children:`None`})}),(0,z.jsx)(P,{label:`State Message`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:e.state?.message??`None`})})]})]})},$=({artifact:e})=>{let{flow_run:t,task_run:n}=e;return e.key||t||n?(0,z.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[e.key&&(0,z.jsx)(P,{label:`Artifact`,value:(0,z.jsx)(a,{to:`/artifacts/key/$key`,params:{key:e.key},className:`text-link hover:text-link-hover hover:underline`,children:e.key})}),t&&(0,z.jsx)(P,{label:`Flow Run`,value:(0,z.jsx)(a,{to:`/runs/flow-run/$id`,params:{id:t.id},className:`text-link hover:text-link-hover hover:underline`,children:t.name})}),n&&(0,z.jsx)(P,{label:`Task Run`,value:(0,z.jsx)(a,{to:`/runs/task-run/$id`,params:{id:n.id},className:`text-link hover:text-link-hover hover:underline`,children:n.name})}),(0,z.jsx)(`hr`,{className:`mt-2 border-border`})]}):null},te=({taskRun:e})=>{let t=(0,R.useMemo)(()=>e.created?h(e.created,`dateTime`):null,[e.created]),n=(0,R.useMemo)(()=>e.updated?h(e.updated,`dateTime`):null,[e.updated]);return(0,z.jsxs)(`div`,{className:`mt-4`,children:[(0,z.jsx)(`p`,{className:`text-lg font-bold`,children:`Task Run`}),(0,z.jsxs)(`div`,{className:`mt-3 flex flex-col gap-3`,children:[(0,z.jsx)(P,{label:`Created`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:t??`None`})}),(0,z.jsx)(P,{label:`Last Updated`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:n??`None`})}),(0,z.jsx)(P,{label:`Tags`,value:e.tags&&e.tags.length>0?(0,z.jsx)(`div`,{className:`flex flex-wrap`,children:e.tags.map(e=>(0,z.jsx)(v,{tag:e},e))}):(0,z.jsx)(`span`,{className:`font-mono`,children:`None`})})]})]})},ne=({artifact:e})=>{let{flow_run:t,task_run:n}=e;return(0,z.jsxs)(`div`,{className:`flex flex-col gap-4 pt-4`,children:[(0,z.jsx)($,{artifact:e}),(0,z.jsx)(X,{artifact:e}),(t||n)&&(0,z.jsx)(`hr`,{className:`mt-4 border-border`}),t&&(0,z.jsx)(Q,{flowRun:t}),t&&n&&(0,z.jsx)(`hr`,{className:`mt-4 border-border`}),n&&(0,z.jsx)(te,{taskRun:n})]})},re=({artifact:e})=>{let t=(0,R.useMemo)(()=>{switch(e.type){case`markdown`:case`link`:return(0,z.jsx)(K,{markdown:e.data});case`image`:return(0,z.jsx)(G,{url:e.data});case`progress`:return(0,z.jsx)(q,{progress:e.data});case`table`:return(0,z.jsx)(Y,{tableData:e.data});default:return(0,z.jsx)(`pre`,{children:JSON.stringify(e.data,null,2)})}},[e]),n=(0,z.jsx)(ne,{artifact:e});return(0,z.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,z.jsx)(B,{artifact:e}),(0,z.jsxs)(`div`,{className:`flex flex-col lg:flex-row lg:gap-6`,children:[(0,z.jsx)(`div`,{className:`flex-1 min-w-0`,children:(0,z.jsx)(H,{artifact:e,artifactContent:t,detailsContent:n})}),(0,z.jsx)(w,{children:n})]})]})},ie=function(){let{id:e}=j.useParams(),{data:t}=l(S(e));return(0,z.jsx)(re,{artifact:F(e)??t})};export{ie as component};
|
|
2
|
-
//# sourceMappingURL=artifact._id-
|
|
1
|
+
import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{a as t,o as n,r,s as i}from"./vendor-codemirror-Bs7Yv0L9.js";import{_ as a,a as o,g as s,i as c,j as l,o as u,r as d}from"./vendor-tanstack-Dx3GObhk.js";import{g as f,h as p,t as m,u as h}from"./button-BmBv3lZP.js";import{n as g}from"./dist-D70cmkC4.js";import{n as _}from"./input-Dr0oypOO.js";import{t as v}from"./tag-badge-mp5HxqMT.js";import{Ar as y,Dr as b,Er as x,K as S,Kr as C,Ln as w,Or as T,Tr as E,cr as D,ir as O,jr as k,lr as A,m as j,or as M,sr as N}from"./index-SebwJ2h3.js";import{t as P}from"./key-value-C6T0AQJ-.js";import{n as F}from"./use-get-artifacts-flow-task-runs-3svJ-Wms.js";import{t as I}from"./lazy-markdown-uVUtgyxS.js";import{t as L}from"./data-table-BeZEMPPj.js";var R=e(i(),1),z=n(),B=({artifact:e})=>(0,z.jsxs)(z.Fragment,{children:[(0,z.jsxs)(`div`,{className:`flex items-center justify-between`,children:[e.key?(0,z.jsx)(`div`,{className:`flex items-center gap-2 min-w-0`,children:(0,z.jsx)(E,{className:`min-w-0`,children:(0,z.jsxs)(T,{className:`flex-nowrap`,children:[(0,z.jsx)(x,{className:`min-w-0`,children:(0,z.jsx)(b,{to:`/artifacts/key/$key`,params:{key:e.key},className:`text-xl font-semibold truncate block`,title:e.key,children:e.key})}),(0,z.jsx)(y,{}),(0,z.jsx)(x,{className:`text-xl font-semibold min-w-0`,children:(0,z.jsx)(`span`,{className:`font-mono truncate block`,title:e.id,children:e.id})})]})})}):(0,z.jsx)(`div`,{className:`flex items-center gap-2 min-w-0`,children:(0,z.jsx)(E,{className:`min-w-0`,children:(0,z.jsxs)(T,{className:`flex-nowrap`,children:[e.flow_run&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(x,{className:`min-w-0`,children:(0,z.jsx)(b,{to:`/runs/flow-run/$id`,params:{id:e.flow_run_id??``},className:`text-xl font-semibold truncate block`,title:e.flow_run.name,children:e.flow_run.name})}),(0,z.jsx)(y,{})]}),e.task_run&&(0,z.jsxs)(z.Fragment,{children:[(0,z.jsx)(x,{className:`min-w-0`,children:(0,z.jsx)(b,{to:`/runs/task-run/$id`,params:{id:e.task_run_id??``},className:`text-xl font-semibold truncate block`,title:e.task_run.name,children:e.task_run.name})}),(0,z.jsx)(y,{})]}),(0,z.jsx)(x,{className:`text-xl font-semibold min-w-0`,children:(0,z.jsx)(`span`,{className:`font-mono truncate block`,title:e.id,children:e.id})})]})})}),(0,z.jsx)(O,{id:`artifacts-guide`,label:`Documentation`})]}),e.description&&(0,z.jsx)(`div`,{className:`text-sm text-muted-foreground my-2`,children:(0,z.jsx)(I,{children:e.description})}),(0,z.jsx)(`hr`,{})]}),V=({artifact:e})=>{let[n,i]=(0,R.useState)(!1),a=()=>{i(e=>!e)},o=(0,R.useRef)(null),{resolvedTheme:s}=C(),{setContainer:c}=r({container:o.current,extensions:[t.lineWrapping],value:String(e.data),indentWithTab:!1,editable:!0,basicSetup:{highlightActiveLine:!1,foldGutter:!1,highlightActiveLineGutter:!1},theme:s===`dark`?`dark`:`light`});(0,R.useEffect)(()=>{o.current&&c(o.current)},[c]);let l=e=>{g.success(`Copied to clipboard`),navigator.clipboard.writeText(e)};return(0,z.jsxs)(`div`,{className:`flex flex-col justify-center items-center`,children:[(0,z.jsxs)(m,{"data-testid":`show-raw-data-button`,variant:`outline`,onClick:a,className:`my-4`,children:[n?`Hide`:`Show`,` Raw Data`]}),(0,z.jsx)(`div`,{className:`rounded-md border shadow-xs focus-within:outline-hidden focus-within:ring-1 focus-within:ring-ring relative`,style:{display:n?`block`:`none`},ref:e=>{o.current=e},"data-testid":`raw-data-display`,children:(0,z.jsx)(m,{onClick:()=>l(e.data),variant:`ghost`,size:`icon`,className:`absolute top-0 right-0 z-10`,"aria-label":`copy`,children:(0,z.jsx)(f,{id:`Copy`,className:`size-2`})})})]})},ee=s(`/artifacts/artifact/$id`),H=({artifact:e,artifactContent:t,detailsContent:n})=>{let{tab:r}=ee.useSearch(),i=U(e,t,n);return(0,z.jsxs)(M,{defaultValue:`Artifact`,value:r,children:[(0,z.jsx)(D,{children:i.map(({value:e,hiddenOnDesktop:t,LinkComponent:n})=>(0,z.jsx)(n,{className:p(t&&`lg:hidden`)},e))}),i.map(({value:e,ViewComponent:t})=>(0,z.jsx)(t,{},e))]})};function U(e,t,n){return(0,R.useMemo)(()=>{let r=[];return r.push({value:`Artifact`,LinkComponent:({className:e})=>(0,z.jsx)(a,{to:`.`,search:{tab:`Artifact`},children:(0,z.jsx)(A,{value:`Artifact`,className:e,children:`Artifact`})}),ViewComponent:()=>(0,z.jsxs)(N,{value:`Artifact`,children:[t,(0,z.jsx)(V,{artifact:e})]})}),r.push({value:`Details`,hiddenOnDesktop:!0,LinkComponent:({className:e})=>(0,z.jsx)(a,{to:`.`,search:{tab:`Details`},children:(0,z.jsx)(A,{value:`Details`,className:e,children:`Details`})}),ViewComponent:()=>(0,z.jsx)(N,{value:`Details`,children:n})}),r.push({value:`Raw`,LinkComponent:({className:e})=>(0,z.jsx)(a,{to:`.`,search:{tab:`Raw`},children:(0,z.jsx)(A,{value:`Raw`,className:e,children:`Raw`})}),ViewComponent:()=>(0,z.jsx)(N,{value:`Raw`,children:(0,z.jsx)(W,{artifact:e})})}),r},[e,t,n])}function W({artifact:e}){return(0,z.jsx)(`pre`,{className:`whitespace-pre-wrap break-words rounded-md border bg-muted p-4 text-sm`,children:typeof e.data==`string`?e.data:JSON.stringify(e.data,null,2)})}var G=({url:e})=>(0,z.jsxs)(`div`,{"data-testid":e,className:`prose dark:prose-invert mt-2`,children:[(0,z.jsx)(`img`,{"data-testid":`image-${e}`,src:e,alt:`artifact-image`,className:`w-full`}),(0,z.jsxs)(`p`,{className:`text-lg`,children:[`Image URL:`,` `,(0,z.jsx)(`a`,{className:`text-link hover:text-link-hover hover:underline`,target:`_blank`,href:e,rel:`noreferrer`,children:e})]})]}),K=({markdown:e})=>(0,z.jsx)(`div`,{"data-testid":`markdown-display`,className:`mt-4 prose dark:prose-invert`,children:(0,z.jsx)(I,{children:e})}),q=({progress:e})=>(0,z.jsxs)(`p`,{"data-testid":`progress-display`,className:`text-lg`,children:[`Progress: `,e,`%`]}),J=c(),Y=({tableData:e})=>{let t=(0,R.useMemo)(()=>JSON.parse(e),[e]),n=(0,R.useMemo)(()=>Object.keys(t[0]??{}),[t]),[r,i]=(0,R.useState)(``),a=(0,R.useMemo)(()=>n.map(e=>J.display({id:e,header:()=>e,cell:({row:t})=>{let n=String(t.original[e]??``);return(0,z.jsx)(`span`,{className:`truncate block`,title:n,children:n})}})),[n]),s=d({data:(0,R.useMemo)(()=>r?t.filter(e=>Object.values(e).some(e=>String(e).toLowerCase().includes(r.toLowerCase()))):t,[r,t]),columns:a,getCoreRowModel:o(),getPaginationRowModel:u(),initialState:{pagination:{pageIndex:0,pageSize:10}}});return(0,z.jsxs)(`div`,{"data-testid":`table-display`,className:`mt-4`,children:[(0,z.jsx)(`div`,{className:`flex flex-row justify-end items-center mb-2`,children:(0,z.jsx)(_,{placeholder:`Search`,value:r,onChange:e=>i(e.target.value)})}),(0,z.jsx)(L,{table:s})]})},X=({artifact:e})=>{let t=(0,R.useMemo)(()=>e.created?h(e.created,`dateTime`):null,[e.created]);return(0,z.jsxs)(`div`,{className:`mt-4`,children:[(0,z.jsx)(`p`,{className:`text-base font-semibold`,children:`Artifact`}),(0,z.jsxs)(`div`,{className:`mt-3 flex flex-col gap-3`,children:[(0,z.jsx)(P,{label:`Key`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:e.key??`None`})}),(0,z.jsx)(P,{label:`Type`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:e.type??`None`})}),(0,z.jsx)(P,{label:`Created`,value:(0,z.jsx)(`span`,{children:t??`None`})})]})]})},Z=e(k(),1),Q=({flowRun:e})=>{let t=(0,R.useMemo)(()=>e.start_time?h(e.start_time,`dateTime`):null,[e.start_time]),n=(0,R.useMemo)(()=>e.estimated_run_time?(0,Z.default)(Math.ceil(e.estimated_run_time)*1e3):null,[e.estimated_run_time]),r=(0,R.useMemo)(()=>e.created?h(e.created,`dateTime`):null,[e.created]),i=(0,R.useMemo)(()=>e.updated?h(e.updated,`dateTime`):null,[e.updated]);return(0,z.jsxs)(`div`,{className:`mt-4`,children:[(0,z.jsx)(`p`,{className:`text-lg font-bold`,children:`Flow Run`}),(0,z.jsxs)(`div`,{className:`mt-3 flex flex-col gap-3`,children:[(0,z.jsx)(P,{label:`Start time`,value:(0,z.jsxs)(`span`,{className:`font-mono flex items-center`,children:[(0,z.jsx)(f,{id:`Calendar`,className:`inline w-4 mr-2`}),t??`None`]})}),(0,z.jsx)(P,{label:`Duration`,value:(0,z.jsxs)(`span`,{className:`font-mono flex items-center`,children:[(0,z.jsx)(f,{id:`Clock`,className:`inline w-4 mr-2`}),n??`None`]})}),(0,z.jsx)(P,{label:`Created`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:r??`None`})}),(0,z.jsx)(P,{label:`Last Updated`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:i??`None`})}),(0,z.jsx)(P,{label:`Tags`,value:e.tags&&e.tags.length>0?(0,z.jsx)(`div`,{className:`flex flex-wrap`,children:e.tags.map(e=>(0,z.jsx)(v,{tag:e},e))}):(0,z.jsx)(`span`,{className:`font-mono`,children:`None`})}),(0,z.jsx)(P,{label:`State Message`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:e.state?.message??`None`})})]})]})},$=({artifact:e})=>{let{flow_run:t,task_run:n}=e;return e.key||t||n?(0,z.jsxs)(`div`,{className:`flex flex-col gap-2`,children:[e.key&&(0,z.jsx)(P,{label:`Artifact`,value:(0,z.jsx)(a,{to:`/artifacts/key/$key`,params:{key:e.key},className:`text-link hover:text-link-hover hover:underline`,children:e.key})}),t&&(0,z.jsx)(P,{label:`Flow Run`,value:(0,z.jsx)(a,{to:`/runs/flow-run/$id`,params:{id:t.id},className:`text-link hover:text-link-hover hover:underline`,children:t.name})}),n&&(0,z.jsx)(P,{label:`Task Run`,value:(0,z.jsx)(a,{to:`/runs/task-run/$id`,params:{id:n.id},className:`text-link hover:text-link-hover hover:underline`,children:n.name})}),(0,z.jsx)(`hr`,{className:`mt-2 border-border`})]}):null},te=({taskRun:e})=>{let t=(0,R.useMemo)(()=>e.created?h(e.created,`dateTime`):null,[e.created]),n=(0,R.useMemo)(()=>e.updated?h(e.updated,`dateTime`):null,[e.updated]);return(0,z.jsxs)(`div`,{className:`mt-4`,children:[(0,z.jsx)(`p`,{className:`text-lg font-bold`,children:`Task Run`}),(0,z.jsxs)(`div`,{className:`mt-3 flex flex-col gap-3`,children:[(0,z.jsx)(P,{label:`Created`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:t??`None`})}),(0,z.jsx)(P,{label:`Last Updated`,value:(0,z.jsx)(`span`,{className:`font-mono`,children:n??`None`})}),(0,z.jsx)(P,{label:`Tags`,value:e.tags&&e.tags.length>0?(0,z.jsx)(`div`,{className:`flex flex-wrap`,children:e.tags.map(e=>(0,z.jsx)(v,{tag:e},e))}):(0,z.jsx)(`span`,{className:`font-mono`,children:`None`})})]})]})},ne=({artifact:e})=>{let{flow_run:t,task_run:n}=e;return(0,z.jsxs)(`div`,{className:`flex flex-col gap-4 pt-4`,children:[(0,z.jsx)($,{artifact:e}),(0,z.jsx)(X,{artifact:e}),(t||n)&&(0,z.jsx)(`hr`,{className:`mt-4 border-border`}),t&&(0,z.jsx)(Q,{flowRun:t}),t&&n&&(0,z.jsx)(`hr`,{className:`mt-4 border-border`}),n&&(0,z.jsx)(te,{taskRun:n})]})},re=({artifact:e})=>{let t=(0,R.useMemo)(()=>{switch(e.type){case`markdown`:case`link`:return(0,z.jsx)(K,{markdown:e.data});case`image`:return(0,z.jsx)(G,{url:e.data});case`progress`:return(0,z.jsx)(q,{progress:e.data});case`table`:return(0,z.jsx)(Y,{tableData:e.data});default:return(0,z.jsx)(`pre`,{children:JSON.stringify(e.data,null,2)})}},[e]),n=(0,z.jsx)(ne,{artifact:e});return(0,z.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,z.jsx)(B,{artifact:e}),(0,z.jsxs)(`div`,{className:`flex flex-col lg:flex-row lg:gap-6`,children:[(0,z.jsx)(`div`,{className:`flex-1 min-w-0`,children:(0,z.jsx)(H,{artifact:e,artifactContent:t,detailsContent:n})}),(0,z.jsx)(w,{children:n})]})]})},ie=function(){let{id:e}=j.useParams(),{data:t}=l(S(e));return(0,z.jsx)(re,{artifact:F(e)??t})};export{ie as component};
|
|
2
|
+
//# sourceMappingURL=artifact._id-iTe860fK.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifact._id-C4vG8kN1.js","names":["useSuspenseQuery","buildGetArtifactQuery","useGetArtifactFlowTaskRuns","ArtifactDetailPage","Route","SplitComponent","RouteComponent","id","useParams","data","artifact","artifactWithMetadata","component"],"sources":["../../src/components/artifacts/artifact/artifact-detail-header.tsx","../../src/components/artifacts/artifact/artifact-raw-data-display.tsx","../../src/components/artifacts/artifact/artifact-detail-tabs.tsx","../../src/components/artifacts/artifact/detail-image.tsx","../../src/components/artifacts/artifact/detail-markdown.tsx","../../src/components/artifacts/artifact/detail-progress.tsx","../../src/components/artifacts/artifact/detail-table.tsx","../../src/components/artifacts/artifact/metadata-sidebar/artifact-section.tsx","../../src/components/artifacts/artifact/metadata-sidebar/flow-run-section.tsx","../../src/components/artifacts/artifact/metadata-sidebar/links-section.tsx","../../src/components/artifacts/artifact/metadata-sidebar/task-run-section.tsx","../../src/components/artifacts/artifact/metadata-sidebar/index.tsx","../../src/components/artifacts/artifact/artifact-detail-page.tsx","../../src/routes/artifacts/artifact.$id.tsx?tsr-split=component"],"sourcesContent":["import type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n\tBreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { DocsLink } from \"@/components/ui/docs-link\";\nimport { LazyMarkdown } from \"@/components/ui/lazy-markdown\";\n\nexport type ArtifactDetailHeaderProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const ArtifactDetailHeader = ({\n\tartifact,\n}: ArtifactDetailHeaderProps) => {\n\tconst header = artifact.key ? (\n\t\t<div className=\"flex items-center gap-2 min-w-0\">\n\t\t\t<Breadcrumb className=\"min-w-0\">\n\t\t\t\t<BreadcrumbList className=\"flex-nowrap\">\n\t\t\t\t\t<BreadcrumbItem className=\"min-w-0\">\n\t\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\t\tto=\"/artifacts/key/$key\"\n\t\t\t\t\t\t\tparams={{ key: artifact.key }}\n\t\t\t\t\t\t\tclassName=\"text-xl font-semibold truncate block\"\n\t\t\t\t\t\t\ttitle={artifact.key}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{artifact.key}\n\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold min-w-0\">\n\t\t\t\t\t\t<span className=\"font-mono truncate block\" title={artifact.id}>\n\t\t\t\t\t\t\t{artifact.id}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t</div>\n\t) : (\n\t\t<div className=\"flex items-center gap-2 min-w-0\">\n\t\t\t<Breadcrumb className=\"min-w-0\">\n\t\t\t\t<BreadcrumbList className=\"flex-nowrap\">\n\t\t\t\t\t{artifact.flow_run && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<BreadcrumbItem className=\"min-w-0\">\n\t\t\t\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\t\t\t\tto=\"/runs/flow-run/$id\"\n\t\t\t\t\t\t\t\t\tparams={{ id: artifact.flow_run_id ?? \"\" }}\n\t\t\t\t\t\t\t\t\tclassName=\"text-xl font-semibold truncate block\"\n\t\t\t\t\t\t\t\t\ttitle={artifact.flow_run.name}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{artifact.flow_run.name}\n\t\t\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t\t{artifact.task_run && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<BreadcrumbItem className=\"min-w-0\">\n\t\t\t\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\t\t\t\tto=\"/runs/task-run/$id\"\n\t\t\t\t\t\t\t\t\tparams={{ id: artifact.task_run_id ?? \"\" }}\n\t\t\t\t\t\t\t\t\tclassName=\"text-xl font-semibold truncate block\"\n\t\t\t\t\t\t\t\t\ttitle={artifact.task_run.name}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{artifact.task_run.name}\n\t\t\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold min-w-0\">\n\t\t\t\t\t\t<span className=\"font-mono truncate block\" title={artifact.id}>\n\t\t\t\t\t\t\t{artifact.id}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t</div>\n\t);\n\treturn (\n\t\t<>\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t{header}\n\t\t\t\t<DocsLink id=\"artifacts-guide\" label=\"Documentation\" />\n\t\t\t</div>\n\t\t\t{artifact.description && (\n\t\t\t\t<div className=\"text-sm text-muted-foreground my-2\">\n\t\t\t\t\t<LazyMarkdown>{artifact.description}</LazyMarkdown>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<hr />\n\t\t</>\n\t);\n};\n","import { EditorView, useCodeMirror } from \"@uiw/react-codemirror\";\nimport { useTheme } from \"next-themes\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\n\ntype ArtifactDataDisplayProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const ArtifactDataDisplay = ({ artifact }: ArtifactDataDisplayProps) => {\n\tconst [showData, setShowData] = useState(false);\n\n\tconst toggleShowData = () => {\n\t\tsetShowData((val) => !val);\n\t};\n\n\tconst editor = useRef<HTMLDivElement | null>(null);\n\tconst { resolvedTheme } = useTheme();\n\tconst basicSetup = {\n\t\thighlightActiveLine: false,\n\t\tfoldGutter: false,\n\t\thighlightActiveLineGutter: false,\n\t};\n\tconst { setContainer } = useCodeMirror({\n\t\tcontainer: editor.current,\n\t\textensions: [EditorView.lineWrapping],\n\t\tvalue: String(artifact.data),\n\t\tindentWithTab: false,\n\t\teditable: true,\n\t\tbasicSetup,\n\t\ttheme: resolvedTheme === \"dark\" ? \"dark\" : \"light\",\n\t});\n\n\tuseEffect(() => {\n\t\tif (editor.current) {\n\t\t\tsetContainer(editor.current);\n\t\t}\n\t}, [setContainer]);\n\n\tconst handleCopy = (_value: string) => {\n\t\ttoast.success(\"Copied to clipboard\");\n\t\tvoid navigator.clipboard.writeText(_value);\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-col justify-center items-center\">\n\t\t\t<Button\n\t\t\t\tdata-testid=\"show-raw-data-button\"\n\t\t\t\tvariant={\"outline\"}\n\t\t\t\tonClick={toggleShowData}\n\t\t\t\tclassName=\"my-4\"\n\t\t\t>\n\t\t\t\t{showData ? \"Hide\" : \"Show\"} Raw Data\n\t\t\t</Button>\n\n\t\t\t<div\n\t\t\t\tclassName=\"rounded-md border shadow-xs focus-within:outline-hidden focus-within:ring-1 focus-within:ring-ring relative\"\n\t\t\t\tstyle={{\n\t\t\t\t\tdisplay: showData ? \"block\" : \"none\",\n\t\t\t\t}}\n\t\t\t\tref={(node) => {\n\t\t\t\t\teditor.current = node;\n\t\t\t\t}}\n\t\t\t\tdata-testid=\"raw-data-display\"\n\t\t\t>\n\t\t\t\t<Button\n\t\t\t\t\tonClick={() => handleCopy(artifact.data as string)}\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tclassName=\"absolute top-0 right-0 z-10\"\n\t\t\t\t\taria-label=\"copy\"\n\t\t\t\t>\n\t\t\t\t\t<Icon id=\"Copy\" className=\"size-2\" />\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { getRouteApi, Link } from \"@tanstack/react-router\";\nimport { type JSX, type ReactNode, useMemo } from \"react\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport type { ArtifactDetailTabOptions } from \"@/routes/artifacts/artifact.$id\";\nimport { cn } from \"@/utils\";\n\nimport { ArtifactDataDisplay } from \"./artifact-raw-data-display\";\n\nconst routeApi = getRouteApi(\"/artifacts/artifact/$id\");\n\ntype TabOption = {\n\tvalue: ArtifactDetailTabOptions;\n\thiddenOnDesktop?: boolean;\n\tLinkComponent: (props: { className?: string }) => JSX.Element;\n\tViewComponent: () => JSX.Element;\n};\n\ntype ArtifactDetailTabsProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n\tartifactContent: ReactNode;\n\tdetailsContent: ReactNode;\n};\n\nexport const ArtifactDetailTabs = ({\n\tartifact,\n\tartifactContent,\n\tdetailsContent,\n}: ArtifactDetailTabsProps) => {\n\tconst { tab } = routeApi.useSearch();\n\n\tconst tabOptions = useBuildTabOptions(\n\t\tartifact,\n\t\tartifactContent,\n\t\tdetailsContent,\n\t);\n\n\treturn (\n\t\t<Tabs defaultValue=\"Artifact\" value={tab}>\n\t\t\t<TabsList>\n\t\t\t\t{tabOptions.map(({ value, hiddenOnDesktop, LinkComponent }) => (\n\t\t\t\t\t<LinkComponent\n\t\t\t\t\t\tkey={value}\n\t\t\t\t\t\tclassName={cn(hiddenOnDesktop && \"lg:hidden\")}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</TabsList>\n\t\t\t{tabOptions.map(({ value, ViewComponent }) => (\n\t\t\t\t<ViewComponent key={value} />\n\t\t\t))}\n\t\t</Tabs>\n\t);\n};\n\nfunction useBuildTabOptions(\n\tartifact: ArtifactWithFlowRunAndTaskRun,\n\tartifactContent: ReactNode,\n\tdetailsContent: ReactNode,\n): Array<TabOption> {\n\treturn useMemo(() => {\n\t\tconst tabs: Array<TabOption> = [];\n\n\t\ttabs.push({\n\t\t\tvalue: \"Artifact\",\n\t\t\tLinkComponent: ({ className }) => (\n\t\t\t\t<Link to=\".\" search={{ tab: \"Artifact\" }}>\n\t\t\t\t\t<TabsTrigger value=\"Artifact\" className={className}>\n\t\t\t\t\t\tArtifact\n\t\t\t\t\t</TabsTrigger>\n\t\t\t\t</Link>\n\t\t\t),\n\t\t\tViewComponent: () => (\n\t\t\t\t<TabsContent value=\"Artifact\">\n\t\t\t\t\t{artifactContent}\n\t\t\t\t\t<ArtifactDataDisplay artifact={artifact} />\n\t\t\t\t</TabsContent>\n\t\t\t),\n\t\t});\n\n\t\ttabs.push({\n\t\t\tvalue: \"Details\",\n\t\t\thiddenOnDesktop: true,\n\t\t\tLinkComponent: ({ className }) => (\n\t\t\t\t<Link to=\".\" search={{ tab: \"Details\" }}>\n\t\t\t\t\t<TabsTrigger value=\"Details\" className={className}>\n\t\t\t\t\t\tDetails\n\t\t\t\t\t</TabsTrigger>\n\t\t\t\t</Link>\n\t\t\t),\n\t\t\tViewComponent: () => (\n\t\t\t\t<TabsContent value=\"Details\">{detailsContent}</TabsContent>\n\t\t\t),\n\t\t});\n\n\t\ttabs.push({\n\t\t\tvalue: \"Raw\",\n\t\t\tLinkComponent: ({ className }) => (\n\t\t\t\t<Link to=\".\" search={{ tab: \"Raw\" }}>\n\t\t\t\t\t<TabsTrigger value=\"Raw\" className={className}>\n\t\t\t\t\t\tRaw\n\t\t\t\t\t</TabsTrigger>\n\t\t\t\t</Link>\n\t\t\t),\n\t\t\tViewComponent: () => (\n\t\t\t\t<TabsContent value=\"Raw\">\n\t\t\t\t\t<ArtifactRawData artifact={artifact} />\n\t\t\t\t</TabsContent>\n\t\t\t),\n\t\t});\n\n\t\treturn tabs;\n\t}, [artifact, artifactContent, detailsContent]);\n}\n\nfunction ArtifactRawData({\n\tartifact,\n}: {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n}) {\n\treturn (\n\t\t<pre className=\"whitespace-pre-wrap break-words rounded-md border bg-muted p-4 text-sm\">\n\t\t\t{typeof artifact.data === \"string\"\n\t\t\t\t? artifact.data\n\t\t\t\t: JSON.stringify(artifact.data, null, 2)}\n\t\t</pre>\n\t);\n}\n","export type DetailImageProps = {\n\turl: string;\n};\n\nexport const DetailImage = ({ url }: DetailImageProps) => {\n\treturn (\n\t\t<div data-testid={url} className=\"prose dark:prose-invert mt-2\">\n\t\t\t<img\n\t\t\t\tdata-testid={`image-${url}`}\n\t\t\t\tsrc={url}\n\t\t\t\talt=\"artifact-image\"\n\t\t\t\tclassName=\"w-full\"\n\t\t\t/>\n\n\t\t\t<p className=\"text-lg\">\n\t\t\t\tImage URL:{\" \"}\n\t\t\t\t<a\n\t\t\t\t\tclassName=\"text-link hover:text-link-hover hover:underline\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\thref={url}\n\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t>\n\t\t\t\t\t{url}\n\t\t\t\t</a>\n\t\t\t</p>\n\t\t</div>\n\t);\n};\n","import { LazyMarkdown } from \"@/components/ui/lazy-markdown\";\n\nexport type DetailMarkdownProps = {\n\tmarkdown: string;\n};\n\nexport const DetailMarkdown = ({ markdown }: DetailMarkdownProps) => {\n\treturn (\n\t\t<div\n\t\t\tdata-testid=\"markdown-display\"\n\t\t\tclassName=\"mt-4 prose dark:prose-invert\"\n\t\t>\n\t\t\t<LazyMarkdown>{markdown}</LazyMarkdown>\n\t\t</div>\n\t);\n};\n","export type DetailProgressProps = {\n\tprogress: number;\n};\n\nexport const DetailProgress = ({ progress }: DetailProgressProps) => {\n\treturn (\n\t\t<p data-testid=\"progress-display\" className=\"text-lg\">\n\t\t\tProgress: {progress}%\n\t\t</p>\n\t);\n};\n","import {\n\tcreateColumnHelper,\n\tgetCoreRowModel,\n\tgetPaginationRowModel,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport { useMemo, useState } from \"react\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { SearchInput } from \"@/components/ui/input\";\n\nexport type DetailTableProps = {\n\ttableData: string;\n};\n\nconst columnHelper = createColumnHelper<Record<string, string>>();\n\nexport const DetailTable = ({ tableData }: DetailTableProps) => {\n\tconst rows = useMemo(\n\t\t() => JSON.parse(tableData) as Record<string, string>[],\n\t\t[tableData],\n\t);\n\tconst headers = useMemo(() => Object.keys(rows[0] ?? {}), [rows]);\n\tconst [input, setInput] = useState<string>(\"\");\n\n\tconst columns = useMemo(\n\t\t() =>\n\t\t\theaders.map((header) =>\n\t\t\t\tcolumnHelper.display({\n\t\t\t\t\tid: header,\n\t\t\t\t\theader: () => header,\n\t\t\t\t\tcell: ({ row }) => {\n\t\t\t\t\t\tconst value = String(row.original[header] ?? \"\");\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<span className=\"truncate block\" title={value}>\n\t\t\t\t\t\t\t\t{value}\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}),\n\t\t\t),\n\t\t[headers],\n\t);\n\n\tconst filteredRows = useMemo(() => {\n\t\tif (!input) return rows;\n\t\treturn rows.filter((row) =>\n\t\t\tObject.values(row).some((value) =>\n\t\t\t\tString(value).toLowerCase().includes(input.toLowerCase()),\n\t\t\t),\n\t\t);\n\t}, [input, rows]);\n\n\tconst table = useReactTable({\n\t\tdata: filteredRows,\n\t\tcolumns,\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tgetPaginationRowModel: getPaginationRowModel(),\n\t\tinitialState: { pagination: { pageIndex: 0, pageSize: 10 } },\n\t});\n\n\treturn (\n\t\t<div data-testid=\"table-display\" className=\"mt-4\">\n\t\t\t<div className=\"flex flex-row justify-end items-center mb-2\">\n\t\t\t\t<SearchInput\n\t\t\t\t\tplaceholder=\"Search\"\n\t\t\t\t\tvalue={input}\n\t\t\t\t\tonChange={(e) => setInput(e.target.value)}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<DataTable table={table} />\n\t\t</div>\n\t);\n};\n","import { useMemo } from \"react\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { KeyValue } from \"@/components/ui/key-value\";\nimport { formatDate } from \"@/utils/date\";\n\ntype ArtifactSectionProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const ArtifactSection = ({ artifact }: ArtifactSectionProps) => {\n\tconst createdDate = useMemo(() => {\n\t\tif (!artifact.created) return null;\n\t\treturn formatDate(artifact.created, \"dateTime\");\n\t}, [artifact.created]);\n\n\treturn (\n\t\t<div className=\"mt-4\">\n\t\t\t<p className=\"text-base font-semibold\">Artifact</p>\n\n\t\t\t<div className=\"mt-3 flex flex-col gap-3\">\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Key\"\n\t\t\t\t\tvalue={<span className=\"font-mono\">{artifact.key ?? \"None\"}</span>}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Type\"\n\t\t\t\t\tvalue={<span className=\"font-mono\">{artifact.type ?? \"None\"}</span>}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Created\"\n\t\t\t\t\tvalue={<span>{createdDate ?? \"None\"}</span>}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import humanizeDuration from \"humanize-duration\";\nimport { useMemo } from \"react\";\nimport type { FlowRun } from \"@/api/flow-runs\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { KeyValue } from \"@/components/ui/key-value\";\nimport { TagBadge } from \"@/components/ui/tag-badge\";\nimport { formatDate } from \"@/utils/date\";\n\ntype FlowRunSectionProps = {\n\tflowRun: FlowRun;\n};\n\nexport const FlowRunSection = ({ flowRun }: FlowRunSectionProps) => {\n\tconst startTime = useMemo(() => {\n\t\tif (!flowRun.start_time) return null;\n\t\treturn formatDate(flowRun.start_time, \"dateTime\");\n\t}, [flowRun.start_time]);\n\n\tconst duration = useMemo(() => {\n\t\tif (!flowRun.estimated_run_time) return null;\n\t\treturn humanizeDuration(Math.ceil(flowRun.estimated_run_time) * 1000);\n\t}, [flowRun.estimated_run_time]);\n\n\tconst createdDate = useMemo(() => {\n\t\tif (!flowRun.created) return null;\n\t\treturn formatDate(flowRun.created, \"dateTime\");\n\t}, [flowRun.created]);\n\n\tconst updatedDate = useMemo(() => {\n\t\tif (!flowRun.updated) return null;\n\t\treturn formatDate(flowRun.updated, \"dateTime\");\n\t}, [flowRun.updated]);\n\n\treturn (\n\t\t<div className=\"mt-4\">\n\t\t\t<p className=\"text-lg font-bold\">Flow Run</p>\n\n\t\t\t<div className=\"mt-3 flex flex-col gap-3\">\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Start time\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<span className=\"font-mono flex items-center\">\n\t\t\t\t\t\t\t<Icon id=\"Calendar\" className=\"inline w-4 mr-2\" />\n\t\t\t\t\t\t\t{startTime ?? \"None\"}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Duration\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<span className=\"font-mono flex items-center\">\n\t\t\t\t\t\t\t<Icon id=\"Clock\" className=\"inline w-4 mr-2\" />\n\t\t\t\t\t\t\t{duration ?? \"None\"}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Created\"\n\t\t\t\t\tvalue={<span className=\"font-mono\">{createdDate ?? \"None\"}</span>}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Last Updated\"\n\t\t\t\t\tvalue={<span className=\"font-mono\">{updatedDate ?? \"None\"}</span>}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Tags\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\tflowRun.tags && flowRun.tags.length > 0 ? (\n\t\t\t\t\t\t\t<div className=\"flex flex-wrap\">\n\t\t\t\t\t\t\t\t{flowRun.tags.map((tag) => (\n\t\t\t\t\t\t\t\t\t<TagBadge key={tag} tag={tag} />\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span className=\"font-mono\">None</span>\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"State Message\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<span className=\"font-mono\">\n\t\t\t\t\t\t\t{flowRun.state?.message ?? \"None\"}\n\t\t\t\t\t\t</span>\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 { Link } from \"@tanstack/react-router\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { KeyValue } from \"@/components/ui/key-value\";\n\ntype LinksSectionProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const LinksSection = ({ artifact }: LinksSectionProps) => {\n\tconst { flow_run, task_run } = artifact;\n\tconst hasLinks = artifact.key || flow_run || task_run;\n\n\tif (!hasLinks) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t{artifact.key && (\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Artifact\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/artifacts/key/$key\"\n\t\t\t\t\t\t\tparams={{ key: artifact.key }}\n\t\t\t\t\t\t\tclassName=\"text-link hover:text-link-hover hover:underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{artifact.key}\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{flow_run && (\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Flow Run\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/runs/flow-run/$id\"\n\t\t\t\t\t\t\tparams={{ id: flow_run.id }}\n\t\t\t\t\t\t\tclassName=\"text-link hover:text-link-hover hover:underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{flow_run.name}\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{task_run && (\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Task Run\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/runs/task-run/$id\"\n\t\t\t\t\t\t\tparams={{ id: task_run.id }}\n\t\t\t\t\t\t\tclassName=\"text-link hover:text-link-hover hover:underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{task_run.name}\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t<hr className=\"mt-2 border-border\" />\n\t\t</div>\n\t);\n};\n","import { useMemo } from \"react\";\nimport type { TaskRun } from \"@/api/task-runs\";\nimport { KeyValue } from \"@/components/ui/key-value\";\nimport { TagBadge } from \"@/components/ui/tag-badge\";\nimport { formatDate } from \"@/utils/date\";\n\ntype TaskRunSectionProps = {\n\ttaskRun: TaskRun;\n};\n\nexport const TaskRunSection = ({ taskRun }: TaskRunSectionProps) => {\n\tconst createdDate = useMemo(() => {\n\t\tif (!taskRun.created) return null;\n\t\treturn formatDate(taskRun.created, \"dateTime\");\n\t}, [taskRun.created]);\n\n\tconst updatedDate = useMemo(() => {\n\t\tif (!taskRun.updated) return null;\n\t\treturn formatDate(taskRun.updated, \"dateTime\");\n\t}, [taskRun.updated]);\n\n\treturn (\n\t\t<div className=\"mt-4\">\n\t\t\t<p className=\"text-lg font-bold\">Task Run</p>\n\n\t\t\t<div className=\"mt-3 flex flex-col gap-3\">\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Created\"\n\t\t\t\t\tvalue={<span className=\"font-mono\">{createdDate ?? \"None\"}</span>}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Last Updated\"\n\t\t\t\t\tvalue={<span className=\"font-mono\">{updatedDate ?? \"None\"}</span>}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Tags\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\ttaskRun.tags && taskRun.tags.length > 0 ? (\n\t\t\t\t\t\t\t<div className=\"flex flex-wrap\">\n\t\t\t\t\t\t\t\t{taskRun.tags.map((tag) => (\n\t\t\t\t\t\t\t\t\t<TagBadge key={tag} tag={tag} />\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span className=\"font-mono\">None</span>\n\t\t\t\t\t\t)\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 { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { ArtifactSection } from \"./artifact-section\";\nimport { FlowRunSection } from \"./flow-run-section\";\nimport { LinksSection } from \"./links-section\";\nimport { TaskRunSection } from \"./task-run-section\";\n\nexport type MetadataSidebarProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const MetadataSidebar = ({ artifact }: MetadataSidebarProps) => {\n\tconst { flow_run, task_run } = artifact;\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4 pt-4\">\n\t\t\t<LinksSection artifact={artifact} />\n\n\t\t\t<ArtifactSection artifact={artifact} />\n\n\t\t\t{(flow_run || task_run) && <hr className=\"mt-4 border-border\" />}\n\n\t\t\t{flow_run && <FlowRunSection flowRun={flow_run} />}\n\n\t\t\t{flow_run && task_run && <hr className=\"mt-4 border-border\" />}\n\n\t\t\t{task_run && <TaskRunSection taskRun={task_run} />}\n\t\t</div>\n\t);\n};\n","import { useMemo } from \"react\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { LayoutWellSidebar } from \"@/components/ui/layout-well\";\nimport { ArtifactDetailHeader } from \"./artifact-detail-header\";\nimport { ArtifactDetailTabs } from \"./artifact-detail-tabs\";\nimport { DetailImage } from \"./detail-image\";\nimport { DetailMarkdown } from \"./detail-markdown\";\nimport { DetailProgress } from \"./detail-progress\";\nimport { DetailTable } from \"./detail-table\";\nimport { MetadataSidebar } from \"./metadata-sidebar\";\n\nexport type ArtifactDetailPageProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const ArtifactDetailPage = ({ artifact }: ArtifactDetailPageProps) => {\n\tconst artifactContent = useMemo(() => {\n\t\tswitch (artifact.type) {\n\t\t\tcase \"markdown\":\n\t\t\tcase \"link\":\n\t\t\t\treturn <DetailMarkdown markdown={artifact.data as string} />;\n\t\t\tcase \"image\":\n\t\t\t\treturn <DetailImage url={artifact.data as string} />;\n\t\t\tcase \"progress\":\n\t\t\t\treturn <DetailProgress progress={artifact.data as number} />;\n\t\t\tcase \"table\":\n\t\t\t\treturn <DetailTable tableData={artifact.data as string} />;\n\t\t\tdefault:\n\t\t\t\treturn <pre>{JSON.stringify(artifact.data, null, 2)}</pre>;\n\t\t}\n\t}, [artifact]);\n\n\tconst sidebarContent = <MetadataSidebar artifact={artifact} />;\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<ArtifactDetailHeader artifact={artifact} />\n\t\t\t<div className=\"flex flex-col lg:flex-row lg:gap-6\">\n\t\t\t\t<div className=\"flex-1 min-w-0\">\n\t\t\t\t\t<ArtifactDetailTabs\n\t\t\t\t\t\tartifact={artifact}\n\t\t\t\t\t\tartifactContent={artifactContent}\n\t\t\t\t\t\tdetailsContent={sidebarContent}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<LayoutWellSidebar>{sidebarContent}</LayoutWellSidebar>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { z } from \"zod\";\nimport { buildGetArtifactQuery } from \"@/api/artifacts\";\nimport { useGetArtifactFlowTaskRuns } from \"@/api/artifacts/use-get-artifacts-flow-task-runs/use-get-artifacts-flow-task-runs\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport { ArtifactDetailPage } from \"@/components/artifacts/artifact/artifact-detail-page\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\n\n/**\n * Schema for validating URL search parameters for the Artifact Detail page\n * @property {\"Artifact\" | \"Details\" | \"Raw\"} tab used to designate which tab view to display\n */\nconst searchParams = z.object({\n\ttab: z.enum([\"Artifact\", \"Details\", \"Raw\"]).default(\"Artifact\"),\n});\n\nexport type ArtifactDetailTabOptions = z.infer<typeof searchParams>[\"tab\"];\n\nexport const Route = createFileRoute(\"/artifacts/artifact/$id\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: function RouteComponent() {\n\t\tconst { id } = Route.useParams();\n\n\t\tconst { data: artifact } = useSuspenseQuery(buildGetArtifactQuery(id));\n\n\t\tconst artifactWithMetadata = useGetArtifactFlowTaskRuns(id);\n\n\t\treturn <ArtifactDetailPage artifact={artifactWithMetadata ?? artifact} />;\n\t},\n\tloader: async ({ context, params }) => {\n\t\tconst { id } = params;\n\n\t\tconst artifact = await context.queryClient.ensureQueryData(\n\t\t\tbuildGetArtifactQuery(id),\n\t\t);\n\n\t\treturn { artifact };\n\t},\n\terrorComponent: function ArtifactDetailErrorComponent({\n\t\terror,\n\t\treset,\n\t}: ErrorComponentProps) {\n\t\tconst serverError = categorizeError(error, \"Failed to load artifact\");\n\t\tif (\n\t\t\tserverError.type !== \"server-error\" &&\n\t\t\tserverError.type !== \"client-error\"\n\t\t) {\n\t\t\tthrow error;\n\t\t}\n\t\treturn (\n\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t<div>\n\t\t\t\t\t<h1 className=\"text-2xl font-semibold\">Artifact</h1>\n\t\t\t\t</div>\n\t\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t\t</div>\n\t\t);\n\t},\n});\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"artifact._id-iTe860fK.js","names":["useSuspenseQuery","buildGetArtifactQuery","useGetArtifactFlowTaskRuns","ArtifactDetailPage","Route","SplitComponent","RouteComponent","id","useParams","data","artifact","artifactWithMetadata","component"],"sources":["../../src/components/artifacts/artifact/artifact-detail-header.tsx","../../src/components/artifacts/artifact/artifact-raw-data-display.tsx","../../src/components/artifacts/artifact/artifact-detail-tabs.tsx","../../src/components/artifacts/artifact/detail-image.tsx","../../src/components/artifacts/artifact/detail-markdown.tsx","../../src/components/artifacts/artifact/detail-progress.tsx","../../src/components/artifacts/artifact/detail-table.tsx","../../src/components/artifacts/artifact/metadata-sidebar/artifact-section.tsx","../../src/components/artifacts/artifact/metadata-sidebar/flow-run-section.tsx","../../src/components/artifacts/artifact/metadata-sidebar/links-section.tsx","../../src/components/artifacts/artifact/metadata-sidebar/task-run-section.tsx","../../src/components/artifacts/artifact/metadata-sidebar/index.tsx","../../src/components/artifacts/artifact/artifact-detail-page.tsx","../../src/routes/artifacts/artifact.$id.tsx?tsr-split=component"],"sourcesContent":["import type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n\tBreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { DocsLink } from \"@/components/ui/docs-link\";\nimport { LazyMarkdown } from \"@/components/ui/lazy-markdown\";\n\nexport type ArtifactDetailHeaderProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const ArtifactDetailHeader = ({\n\tartifact,\n}: ArtifactDetailHeaderProps) => {\n\tconst header = artifact.key ? (\n\t\t<div className=\"flex items-center gap-2 min-w-0\">\n\t\t\t<Breadcrumb className=\"min-w-0\">\n\t\t\t\t<BreadcrumbList className=\"flex-nowrap\">\n\t\t\t\t\t<BreadcrumbItem className=\"min-w-0\">\n\t\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\t\tto=\"/artifacts/key/$key\"\n\t\t\t\t\t\t\tparams={{ key: artifact.key }}\n\t\t\t\t\t\t\tclassName=\"text-xl font-semibold truncate block\"\n\t\t\t\t\t\t\ttitle={artifact.key}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{artifact.key}\n\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold min-w-0\">\n\t\t\t\t\t\t<span className=\"font-mono truncate block\" title={artifact.id}>\n\t\t\t\t\t\t\t{artifact.id}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t</div>\n\t) : (\n\t\t<div className=\"flex items-center gap-2 min-w-0\">\n\t\t\t<Breadcrumb className=\"min-w-0\">\n\t\t\t\t<BreadcrumbList className=\"flex-nowrap\">\n\t\t\t\t\t{artifact.flow_run && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<BreadcrumbItem className=\"min-w-0\">\n\t\t\t\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\t\t\t\tto=\"/runs/flow-run/$id\"\n\t\t\t\t\t\t\t\t\tparams={{ id: artifact.flow_run_id ?? \"\" }}\n\t\t\t\t\t\t\t\t\tclassName=\"text-xl font-semibold truncate block\"\n\t\t\t\t\t\t\t\t\ttitle={artifact.flow_run.name}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{artifact.flow_run.name}\n\t\t\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t\t{artifact.task_run && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<BreadcrumbItem className=\"min-w-0\">\n\t\t\t\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\t\t\t\tto=\"/runs/task-run/$id\"\n\t\t\t\t\t\t\t\t\tparams={{ id: artifact.task_run_id ?? \"\" }}\n\t\t\t\t\t\t\t\t\tclassName=\"text-xl font-semibold truncate block\"\n\t\t\t\t\t\t\t\t\ttitle={artifact.task_run.name}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{artifact.task_run.name}\n\t\t\t\t\t\t\t\t</BreadcrumbLink>\n\t\t\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t\t\t\t<BreadcrumbSeparator />\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold min-w-0\">\n\t\t\t\t\t\t<span className=\"font-mono truncate block\" title={artifact.id}>\n\t\t\t\t\t\t\t{artifact.id}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t</div>\n\t);\n\treturn (\n\t\t<>\n\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t{header}\n\t\t\t\t<DocsLink id=\"artifacts-guide\" label=\"Documentation\" />\n\t\t\t</div>\n\t\t\t{artifact.description && (\n\t\t\t\t<div className=\"text-sm text-muted-foreground my-2\">\n\t\t\t\t\t<LazyMarkdown>{artifact.description}</LazyMarkdown>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t<hr />\n\t\t</>\n\t);\n};\n","import { EditorView, useCodeMirror } from \"@uiw/react-codemirror\";\nimport { useTheme } from \"next-themes\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { Button } from \"@/components/ui/button\";\nimport { Icon } from \"@/components/ui/icons\";\n\ntype ArtifactDataDisplayProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const ArtifactDataDisplay = ({ artifact }: ArtifactDataDisplayProps) => {\n\tconst [showData, setShowData] = useState(false);\n\n\tconst toggleShowData = () => {\n\t\tsetShowData((val) => !val);\n\t};\n\n\tconst editor = useRef<HTMLDivElement | null>(null);\n\tconst { resolvedTheme } = useTheme();\n\tconst basicSetup = {\n\t\thighlightActiveLine: false,\n\t\tfoldGutter: false,\n\t\thighlightActiveLineGutter: false,\n\t};\n\tconst { setContainer } = useCodeMirror({\n\t\tcontainer: editor.current,\n\t\textensions: [EditorView.lineWrapping],\n\t\tvalue: String(artifact.data),\n\t\tindentWithTab: false,\n\t\teditable: true,\n\t\tbasicSetup,\n\t\ttheme: resolvedTheme === \"dark\" ? \"dark\" : \"light\",\n\t});\n\n\tuseEffect(() => {\n\t\tif (editor.current) {\n\t\t\tsetContainer(editor.current);\n\t\t}\n\t}, [setContainer]);\n\n\tconst handleCopy = (_value: string) => {\n\t\ttoast.success(\"Copied to clipboard\");\n\t\tvoid navigator.clipboard.writeText(_value);\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-col justify-center items-center\">\n\t\t\t<Button\n\t\t\t\tdata-testid=\"show-raw-data-button\"\n\t\t\t\tvariant={\"outline\"}\n\t\t\t\tonClick={toggleShowData}\n\t\t\t\tclassName=\"my-4\"\n\t\t\t>\n\t\t\t\t{showData ? \"Hide\" : \"Show\"} Raw Data\n\t\t\t</Button>\n\n\t\t\t<div\n\t\t\t\tclassName=\"rounded-md border shadow-xs focus-within:outline-hidden focus-within:ring-1 focus-within:ring-ring relative\"\n\t\t\t\tstyle={{\n\t\t\t\t\tdisplay: showData ? \"block\" : \"none\",\n\t\t\t\t}}\n\t\t\t\tref={(node) => {\n\t\t\t\t\teditor.current = node;\n\t\t\t\t}}\n\t\t\t\tdata-testid=\"raw-data-display\"\n\t\t\t>\n\t\t\t\t<Button\n\t\t\t\t\tonClick={() => handleCopy(artifact.data as string)}\n\t\t\t\t\tvariant=\"ghost\"\n\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\tclassName=\"absolute top-0 right-0 z-10\"\n\t\t\t\t\taria-label=\"copy\"\n\t\t\t\t>\n\t\t\t\t\t<Icon id=\"Copy\" className=\"size-2\" />\n\t\t\t\t</Button>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { getRouteApi, Link } from \"@tanstack/react-router\";\nimport { type JSX, type ReactNode, useMemo } from \"react\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport type { ArtifactDetailTabOptions } from \"@/routes/artifacts/artifact.$id\";\nimport { cn } from \"@/utils\";\n\nimport { ArtifactDataDisplay } from \"./artifact-raw-data-display\";\n\nconst routeApi = getRouteApi(\"/artifacts/artifact/$id\");\n\ntype TabOption = {\n\tvalue: ArtifactDetailTabOptions;\n\thiddenOnDesktop?: boolean;\n\tLinkComponent: (props: { className?: string }) => JSX.Element;\n\tViewComponent: () => JSX.Element;\n};\n\ntype ArtifactDetailTabsProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n\tartifactContent: ReactNode;\n\tdetailsContent: ReactNode;\n};\n\nexport const ArtifactDetailTabs = ({\n\tartifact,\n\tartifactContent,\n\tdetailsContent,\n}: ArtifactDetailTabsProps) => {\n\tconst { tab } = routeApi.useSearch();\n\n\tconst tabOptions = useBuildTabOptions(\n\t\tartifact,\n\t\tartifactContent,\n\t\tdetailsContent,\n\t);\n\n\treturn (\n\t\t<Tabs defaultValue=\"Artifact\" value={tab}>\n\t\t\t<TabsList>\n\t\t\t\t{tabOptions.map(({ value, hiddenOnDesktop, LinkComponent }) => (\n\t\t\t\t\t<LinkComponent\n\t\t\t\t\t\tkey={value}\n\t\t\t\t\t\tclassName={cn(hiddenOnDesktop && \"lg:hidden\")}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</TabsList>\n\t\t\t{tabOptions.map(({ value, ViewComponent }) => (\n\t\t\t\t<ViewComponent key={value} />\n\t\t\t))}\n\t\t</Tabs>\n\t);\n};\n\nfunction useBuildTabOptions(\n\tartifact: ArtifactWithFlowRunAndTaskRun,\n\tartifactContent: ReactNode,\n\tdetailsContent: ReactNode,\n): Array<TabOption> {\n\treturn useMemo(() => {\n\t\tconst tabs: Array<TabOption> = [];\n\n\t\ttabs.push({\n\t\t\tvalue: \"Artifact\",\n\t\t\tLinkComponent: ({ className }) => (\n\t\t\t\t<Link to=\".\" search={{ tab: \"Artifact\" }}>\n\t\t\t\t\t<TabsTrigger value=\"Artifact\" className={className}>\n\t\t\t\t\t\tArtifact\n\t\t\t\t\t</TabsTrigger>\n\t\t\t\t</Link>\n\t\t\t),\n\t\t\tViewComponent: () => (\n\t\t\t\t<TabsContent value=\"Artifact\">\n\t\t\t\t\t{artifactContent}\n\t\t\t\t\t<ArtifactDataDisplay artifact={artifact} />\n\t\t\t\t</TabsContent>\n\t\t\t),\n\t\t});\n\n\t\ttabs.push({\n\t\t\tvalue: \"Details\",\n\t\t\thiddenOnDesktop: true,\n\t\t\tLinkComponent: ({ className }) => (\n\t\t\t\t<Link to=\".\" search={{ tab: \"Details\" }}>\n\t\t\t\t\t<TabsTrigger value=\"Details\" className={className}>\n\t\t\t\t\t\tDetails\n\t\t\t\t\t</TabsTrigger>\n\t\t\t\t</Link>\n\t\t\t),\n\t\t\tViewComponent: () => (\n\t\t\t\t<TabsContent value=\"Details\">{detailsContent}</TabsContent>\n\t\t\t),\n\t\t});\n\n\t\ttabs.push({\n\t\t\tvalue: \"Raw\",\n\t\t\tLinkComponent: ({ className }) => (\n\t\t\t\t<Link to=\".\" search={{ tab: \"Raw\" }}>\n\t\t\t\t\t<TabsTrigger value=\"Raw\" className={className}>\n\t\t\t\t\t\tRaw\n\t\t\t\t\t</TabsTrigger>\n\t\t\t\t</Link>\n\t\t\t),\n\t\t\tViewComponent: () => (\n\t\t\t\t<TabsContent value=\"Raw\">\n\t\t\t\t\t<ArtifactRawData artifact={artifact} />\n\t\t\t\t</TabsContent>\n\t\t\t),\n\t\t});\n\n\t\treturn tabs;\n\t}, [artifact, artifactContent, detailsContent]);\n}\n\nfunction ArtifactRawData({\n\tartifact,\n}: {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n}) {\n\treturn (\n\t\t<pre className=\"whitespace-pre-wrap break-words rounded-md border bg-muted p-4 text-sm\">\n\t\t\t{typeof artifact.data === \"string\"\n\t\t\t\t? artifact.data\n\t\t\t\t: JSON.stringify(artifact.data, null, 2)}\n\t\t</pre>\n\t);\n}\n","export type DetailImageProps = {\n\turl: string;\n};\n\nexport const DetailImage = ({ url }: DetailImageProps) => {\n\treturn (\n\t\t<div data-testid={url} className=\"prose dark:prose-invert mt-2\">\n\t\t\t<img\n\t\t\t\tdata-testid={`image-${url}`}\n\t\t\t\tsrc={url}\n\t\t\t\talt=\"artifact-image\"\n\t\t\t\tclassName=\"w-full\"\n\t\t\t/>\n\n\t\t\t<p className=\"text-lg\">\n\t\t\t\tImage URL:{\" \"}\n\t\t\t\t<a\n\t\t\t\t\tclassName=\"text-link hover:text-link-hover hover:underline\"\n\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\thref={url}\n\t\t\t\t\trel=\"noreferrer\"\n\t\t\t\t>\n\t\t\t\t\t{url}\n\t\t\t\t</a>\n\t\t\t</p>\n\t\t</div>\n\t);\n};\n","import { LazyMarkdown } from \"@/components/ui/lazy-markdown\";\n\nexport type DetailMarkdownProps = {\n\tmarkdown: string;\n};\n\nexport const DetailMarkdown = ({ markdown }: DetailMarkdownProps) => {\n\treturn (\n\t\t<div\n\t\t\tdata-testid=\"markdown-display\"\n\t\t\tclassName=\"mt-4 prose dark:prose-invert\"\n\t\t>\n\t\t\t<LazyMarkdown>{markdown}</LazyMarkdown>\n\t\t</div>\n\t);\n};\n","export type DetailProgressProps = {\n\tprogress: number;\n};\n\nexport const DetailProgress = ({ progress }: DetailProgressProps) => {\n\treturn (\n\t\t<p data-testid=\"progress-display\" className=\"text-lg\">\n\t\t\tProgress: {progress}%\n\t\t</p>\n\t);\n};\n","import {\n\tcreateColumnHelper,\n\tgetCoreRowModel,\n\tgetPaginationRowModel,\n\tuseReactTable,\n} from \"@tanstack/react-table\";\nimport { useMemo, useState } from \"react\";\nimport { DataTable } from \"@/components/ui/data-table\";\nimport { SearchInput } from \"@/components/ui/input\";\n\nexport type DetailTableProps = {\n\ttableData: string;\n};\n\nconst columnHelper = createColumnHelper<Record<string, string>>();\n\nexport const DetailTable = ({ tableData }: DetailTableProps) => {\n\tconst rows = useMemo(\n\t\t() => JSON.parse(tableData) as Record<string, string>[],\n\t\t[tableData],\n\t);\n\tconst headers = useMemo(() => Object.keys(rows[0] ?? {}), [rows]);\n\tconst [input, setInput] = useState<string>(\"\");\n\n\tconst columns = useMemo(\n\t\t() =>\n\t\t\theaders.map((header) =>\n\t\t\t\tcolumnHelper.display({\n\t\t\t\t\tid: header,\n\t\t\t\t\theader: () => header,\n\t\t\t\t\tcell: ({ row }) => {\n\t\t\t\t\t\tconst value = String(row.original[header] ?? \"\");\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t<span className=\"truncate block\" title={value}>\n\t\t\t\t\t\t\t\t{value}\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}),\n\t\t\t),\n\t\t[headers],\n\t);\n\n\tconst filteredRows = useMemo(() => {\n\t\tif (!input) return rows;\n\t\treturn rows.filter((row) =>\n\t\t\tObject.values(row).some((value) =>\n\t\t\t\tString(value).toLowerCase().includes(input.toLowerCase()),\n\t\t\t),\n\t\t);\n\t}, [input, rows]);\n\n\tconst table = useReactTable({\n\t\tdata: filteredRows,\n\t\tcolumns,\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tgetPaginationRowModel: getPaginationRowModel(),\n\t\tinitialState: { pagination: { pageIndex: 0, pageSize: 10 } },\n\t});\n\n\treturn (\n\t\t<div data-testid=\"table-display\" className=\"mt-4\">\n\t\t\t<div className=\"flex flex-row justify-end items-center mb-2\">\n\t\t\t\t<SearchInput\n\t\t\t\t\tplaceholder=\"Search\"\n\t\t\t\t\tvalue={input}\n\t\t\t\t\tonChange={(e) => setInput(e.target.value)}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<DataTable table={table} />\n\t\t</div>\n\t);\n};\n","import { useMemo } from \"react\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { KeyValue } from \"@/components/ui/key-value\";\nimport { formatDate } from \"@/utils/date\";\n\ntype ArtifactSectionProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const ArtifactSection = ({ artifact }: ArtifactSectionProps) => {\n\tconst createdDate = useMemo(() => {\n\t\tif (!artifact.created) return null;\n\t\treturn formatDate(artifact.created, \"dateTime\");\n\t}, [artifact.created]);\n\n\treturn (\n\t\t<div className=\"mt-4\">\n\t\t\t<p className=\"text-base font-semibold\">Artifact</p>\n\n\t\t\t<div className=\"mt-3 flex flex-col gap-3\">\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Key\"\n\t\t\t\t\tvalue={<span className=\"font-mono\">{artifact.key ?? \"None\"}</span>}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Type\"\n\t\t\t\t\tvalue={<span className=\"font-mono\">{artifact.type ?? \"None\"}</span>}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Created\"\n\t\t\t\t\tvalue={<span>{createdDate ?? \"None\"}</span>}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import humanizeDuration from \"humanize-duration\";\nimport { useMemo } from \"react\";\nimport type { FlowRun } from \"@/api/flow-runs\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { KeyValue } from \"@/components/ui/key-value\";\nimport { TagBadge } from \"@/components/ui/tag-badge\";\nimport { formatDate } from \"@/utils/date\";\n\ntype FlowRunSectionProps = {\n\tflowRun: FlowRun;\n};\n\nexport const FlowRunSection = ({ flowRun }: FlowRunSectionProps) => {\n\tconst startTime = useMemo(() => {\n\t\tif (!flowRun.start_time) return null;\n\t\treturn formatDate(flowRun.start_time, \"dateTime\");\n\t}, [flowRun.start_time]);\n\n\tconst duration = useMemo(() => {\n\t\tif (!flowRun.estimated_run_time) return null;\n\t\treturn humanizeDuration(Math.ceil(flowRun.estimated_run_time) * 1000);\n\t}, [flowRun.estimated_run_time]);\n\n\tconst createdDate = useMemo(() => {\n\t\tif (!flowRun.created) return null;\n\t\treturn formatDate(flowRun.created, \"dateTime\");\n\t}, [flowRun.created]);\n\n\tconst updatedDate = useMemo(() => {\n\t\tif (!flowRun.updated) return null;\n\t\treturn formatDate(flowRun.updated, \"dateTime\");\n\t}, [flowRun.updated]);\n\n\treturn (\n\t\t<div className=\"mt-4\">\n\t\t\t<p className=\"text-lg font-bold\">Flow Run</p>\n\n\t\t\t<div className=\"mt-3 flex flex-col gap-3\">\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Start time\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<span className=\"font-mono flex items-center\">\n\t\t\t\t\t\t\t<Icon id=\"Calendar\" className=\"inline w-4 mr-2\" />\n\t\t\t\t\t\t\t{startTime ?? \"None\"}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Duration\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<span className=\"font-mono flex items-center\">\n\t\t\t\t\t\t\t<Icon id=\"Clock\" className=\"inline w-4 mr-2\" />\n\t\t\t\t\t\t\t{duration ?? \"None\"}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Created\"\n\t\t\t\t\tvalue={<span className=\"font-mono\">{createdDate ?? \"None\"}</span>}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Last Updated\"\n\t\t\t\t\tvalue={<span className=\"font-mono\">{updatedDate ?? \"None\"}</span>}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Tags\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\tflowRun.tags && flowRun.tags.length > 0 ? (\n\t\t\t\t\t\t\t<div className=\"flex flex-wrap\">\n\t\t\t\t\t\t\t\t{flowRun.tags.map((tag) => (\n\t\t\t\t\t\t\t\t\t<TagBadge key={tag} tag={tag} />\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span className=\"font-mono\">None</span>\n\t\t\t\t\t\t)\n\t\t\t\t\t}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"State Message\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<span className=\"font-mono\">\n\t\t\t\t\t\t\t{flowRun.state?.message ?? \"None\"}\n\t\t\t\t\t\t</span>\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 { Link } from \"@tanstack/react-router\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { KeyValue } from \"@/components/ui/key-value\";\n\ntype LinksSectionProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const LinksSection = ({ artifact }: LinksSectionProps) => {\n\tconst { flow_run, task_run } = artifact;\n\tconst hasLinks = artifact.key || flow_run || task_run;\n\n\tif (!hasLinks) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t{artifact.key && (\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Artifact\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/artifacts/key/$key\"\n\t\t\t\t\t\t\tparams={{ key: artifact.key }}\n\t\t\t\t\t\t\tclassName=\"text-link hover:text-link-hover hover:underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{artifact.key}\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{flow_run && (\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Flow Run\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/runs/flow-run/$id\"\n\t\t\t\t\t\t\tparams={{ id: flow_run.id }}\n\t\t\t\t\t\t\tclassName=\"text-link hover:text-link-hover hover:underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{flow_run.name}\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t{task_run && (\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Task Run\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\t<Link\n\t\t\t\t\t\t\tto=\"/runs/task-run/$id\"\n\t\t\t\t\t\t\tparams={{ id: task_run.id }}\n\t\t\t\t\t\t\tclassName=\"text-link hover:text-link-hover hover:underline\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t{task_run.name}\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t}\n\t\t\t\t/>\n\t\t\t)}\n\n\t\t\t<hr className=\"mt-2 border-border\" />\n\t\t</div>\n\t);\n};\n","import { useMemo } from \"react\";\nimport type { TaskRun } from \"@/api/task-runs\";\nimport { KeyValue } from \"@/components/ui/key-value\";\nimport { TagBadge } from \"@/components/ui/tag-badge\";\nimport { formatDate } from \"@/utils/date\";\n\ntype TaskRunSectionProps = {\n\ttaskRun: TaskRun;\n};\n\nexport const TaskRunSection = ({ taskRun }: TaskRunSectionProps) => {\n\tconst createdDate = useMemo(() => {\n\t\tif (!taskRun.created) return null;\n\t\treturn formatDate(taskRun.created, \"dateTime\");\n\t}, [taskRun.created]);\n\n\tconst updatedDate = useMemo(() => {\n\t\tif (!taskRun.updated) return null;\n\t\treturn formatDate(taskRun.updated, \"dateTime\");\n\t}, [taskRun.updated]);\n\n\treturn (\n\t\t<div className=\"mt-4\">\n\t\t\t<p className=\"text-lg font-bold\">Task Run</p>\n\n\t\t\t<div className=\"mt-3 flex flex-col gap-3\">\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Created\"\n\t\t\t\t\tvalue={<span className=\"font-mono\">{createdDate ?? \"None\"}</span>}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Last Updated\"\n\t\t\t\t\tvalue={<span className=\"font-mono\">{updatedDate ?? \"None\"}</span>}\n\t\t\t\t/>\n\n\t\t\t\t<KeyValue\n\t\t\t\t\tlabel=\"Tags\"\n\t\t\t\t\tvalue={\n\t\t\t\t\t\ttaskRun.tags && taskRun.tags.length > 0 ? (\n\t\t\t\t\t\t\t<div className=\"flex flex-wrap\">\n\t\t\t\t\t\t\t\t{taskRun.tags.map((tag) => (\n\t\t\t\t\t\t\t\t\t<TagBadge key={tag} tag={tag} />\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<span className=\"font-mono\">None</span>\n\t\t\t\t\t\t)\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 { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { ArtifactSection } from \"./artifact-section\";\nimport { FlowRunSection } from \"./flow-run-section\";\nimport { LinksSection } from \"./links-section\";\nimport { TaskRunSection } from \"./task-run-section\";\n\nexport type MetadataSidebarProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const MetadataSidebar = ({ artifact }: MetadataSidebarProps) => {\n\tconst { flow_run, task_run } = artifact;\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4 pt-4\">\n\t\t\t<LinksSection artifact={artifact} />\n\n\t\t\t<ArtifactSection artifact={artifact} />\n\n\t\t\t{(flow_run || task_run) && <hr className=\"mt-4 border-border\" />}\n\n\t\t\t{flow_run && <FlowRunSection flowRun={flow_run} />}\n\n\t\t\t{flow_run && task_run && <hr className=\"mt-4 border-border\" />}\n\n\t\t\t{task_run && <TaskRunSection taskRun={task_run} />}\n\t\t</div>\n\t);\n};\n","import { useMemo } from \"react\";\nimport type { ArtifactWithFlowRunAndTaskRun } from \"@/api/artifacts\";\nimport { LayoutWellSidebar } from \"@/components/ui/layout-well\";\nimport { ArtifactDetailHeader } from \"./artifact-detail-header\";\nimport { ArtifactDetailTabs } from \"./artifact-detail-tabs\";\nimport { DetailImage } from \"./detail-image\";\nimport { DetailMarkdown } from \"./detail-markdown\";\nimport { DetailProgress } from \"./detail-progress\";\nimport { DetailTable } from \"./detail-table\";\nimport { MetadataSidebar } from \"./metadata-sidebar\";\n\nexport type ArtifactDetailPageProps = {\n\tartifact: ArtifactWithFlowRunAndTaskRun;\n};\n\nexport const ArtifactDetailPage = ({ artifact }: ArtifactDetailPageProps) => {\n\tconst artifactContent = useMemo(() => {\n\t\tswitch (artifact.type) {\n\t\t\tcase \"markdown\":\n\t\t\tcase \"link\":\n\t\t\t\treturn <DetailMarkdown markdown={artifact.data as string} />;\n\t\t\tcase \"image\":\n\t\t\t\treturn <DetailImage url={artifact.data as string} />;\n\t\t\tcase \"progress\":\n\t\t\t\treturn <DetailProgress progress={artifact.data as number} />;\n\t\t\tcase \"table\":\n\t\t\t\treturn <DetailTable tableData={artifact.data as string} />;\n\t\t\tdefault:\n\t\t\t\treturn <pre>{JSON.stringify(artifact.data, null, 2)}</pre>;\n\t\t}\n\t}, [artifact]);\n\n\tconst sidebarContent = <MetadataSidebar artifact={artifact} />;\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<ArtifactDetailHeader artifact={artifact} />\n\t\t\t<div className=\"flex flex-col lg:flex-row lg:gap-6\">\n\t\t\t\t<div className=\"flex-1 min-w-0\">\n\t\t\t\t\t<ArtifactDetailTabs\n\t\t\t\t\t\tartifact={artifact}\n\t\t\t\t\t\tartifactContent={artifactContent}\n\t\t\t\t\t\tdetailsContent={sidebarContent}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<LayoutWellSidebar>{sidebarContent}</LayoutWellSidebar>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { z } from \"zod\";\nimport { buildGetArtifactQuery } from \"@/api/artifacts\";\nimport { useGetArtifactFlowTaskRuns } from \"@/api/artifacts/use-get-artifacts-flow-task-runs/use-get-artifacts-flow-task-runs\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport { ArtifactDetailPage } from \"@/components/artifacts/artifact/artifact-detail-page\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\n\n/**\n * Schema for validating URL search parameters for the Artifact Detail page\n * @property {\"Artifact\" | \"Details\" | \"Raw\"} tab used to designate which tab view to display\n */\nconst searchParams = z.object({\n\ttab: z.enum([\"Artifact\", \"Details\", \"Raw\"]).default(\"Artifact\"),\n});\n\nexport type ArtifactDetailTabOptions = z.infer<typeof searchParams>[\"tab\"];\n\nexport const Route = createFileRoute(\"/artifacts/artifact/$id\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: function RouteComponent() {\n\t\tconst { id } = Route.useParams();\n\n\t\tconst { data: artifact } = useSuspenseQuery(buildGetArtifactQuery(id));\n\n\t\tconst artifactWithMetadata = useGetArtifactFlowTaskRuns(id);\n\n\t\treturn <ArtifactDetailPage artifact={artifactWithMetadata ?? artifact} />;\n\t},\n\tloader: async ({ context, params }) => {\n\t\tconst { id } = params;\n\n\t\tconst artifact = await context.queryClient.ensureQueryData(\n\t\t\tbuildGetArtifactQuery(id),\n\t\t);\n\n\t\treturn { artifact };\n\t},\n\terrorComponent: function ArtifactDetailErrorComponent({\n\t\terror,\n\t\treset,\n\t}: ErrorComponentProps) {\n\t\tconst serverError = categorizeError(error, \"Failed to load artifact\");\n\t\tif (\n\t\t\tserverError.type !== \"server-error\" &&\n\t\t\tserverError.type !== \"client-error\"\n\t\t) {\n\t\t\tthrow error;\n\t\t}\n\t\treturn (\n\t\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t\t<div>\n\t\t\t\t\t<h1 className=\"text-2xl font-semibold\">Artifact</h1>\n\t\t\t\t</div>\n\t\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t\t</div>\n\t\t);\n\t},\n});\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{o as t,s as n}from"./vendor-codemirror-Bs7Yv0L9.js";import{k as r}from"./vendor-tanstack-
|
|
2
|
-
//# sourceMappingURL=artifacts-
|
|
1
|
+
import{r as e}from"./rolldown-runtime-QTnfLwEv.js";import{o as t,s as n}from"./vendor-codemirror-Bs7Yv0L9.js";import{k as r}from"./vendor-tanstack-Dx3GObhk.js";import{g as i,o as a}from"./button-BmBv3lZP.js";import{i as o,n as s,o as c,s as l,t as u}from"./select-y2lIflCz.js";import{n as d}from"./input-Dr0oypOO.js";import{$n as f,Er as p,G as m,Jr as h,Or as g,Tr as _,W as v,Y as y,Z as b,er as x,ir as S,nr as C,rr as w,tr as T}from"./index-SebwJ2h3.js";import{t as E}from"./use-debounce-callback-OMnDBqjj.js";import{n as D,r as O,t as k}from"./toggle-group-cZa2kNKg.js";var A=e(n(),1),j=t(),M=[{value:`all`,label:`All Types`},{value:`markdown`,label:`Markdown`},{value:`progress`,label:`Progress`},{value:`image`,label:`Image`},{value:`table`,label:`Table`}],N=({filters:e,onFilterChange:t,totalCount:n,displayMode:r,setDisplayMode:f})=>{let p=(0,A.useCallback)(n=>{t([...e.filter(e=>e.id!==`name`),{id:`name`,label:`Name`,value:n}])},[e,t]),m=(0,A.useCallback)(n=>{t([...e.filter(e=>e.id!==`type`),{id:`type`,label:`Type`,value:n}])},[e,t]),h=(0,A.useMemo)(()=>e.find(e=>e.id===`type`)?.value,[e]),g=(0,A.useMemo)(()=>e.find(e=>e.id===`name`)?.value,[e]);return(0,j.jsxs)(`div`,{"data-testid":`artifact-filter`,className:`flex justify-between items-center`,children:[(0,j.jsx)(`div`,{children:(0,j.jsxs)(`p`,{className:`text-base text-sm text-muted-foreground`,children:[n.toLocaleString(),` `,a(n,`artifact`)]})}),(0,j.jsxs)(`div`,{className:`flex gap-4`,children:[(0,j.jsx)(d,{"data-testid":`search-input`,defaultValue:g,placeholder:`Search artifacts`,onChange:e=>p(e.target.value)}),(0,j.jsxs)(`div`,{className:`flex gap-4`,children:[(0,j.jsxs)(u,{"data-testid":`type-select`,value:h,onValueChange:m,children:[(0,j.jsx)(c,{"aria-label":`Artifact type`,children:(0,j.jsx)(l,{placeholder:`Type`})}),(0,j.jsx)(s,{children:M.map(({value:e,label:t})=>(0,j.jsx)(o,{value:e,children:t},e))})]}),(0,j.jsx)(`div`,{children:(0,j.jsxs)(k,{type:`single`,defaultValue:r,onValueChange:e=>f(e),children:[(0,j.jsx)(D,{"data-testid":`grid-layout`,value:`grid`,children:(0,j.jsx)(i,{id:`LayoutGrid`})}),(0,j.jsx)(D,{"data-testid":`list-layout`,value:`list`,children:(0,j.jsx)(i,{id:`AlignJustify`})})]})})]})]})]})},P=()=>(0,j.jsxs)(`div`,{className:`flex items-center justify-between`,children:[(0,j.jsx)(`div`,{className:`flex items-center gap-2`,children:(0,j.jsx)(_,{children:(0,j.jsx)(g,{children:(0,j.jsx)(p,{className:`text-xl font-semibold`,children:`Artifacts`})})})}),(0,j.jsx)(S,{id:`artifacts-guide`,label:`Documentation`})]}),F=()=>(0,j.jsxs)(f,{children:[(0,j.jsx)(`div`,{className:`flex items-center gap-3`,children:(0,j.jsx)(C,{id:`Image`})}),(0,j.jsx)(w,{children:`Create an artifact to get started`}),(0,j.jsx)(T,{children:`Artifacts are byproducts of your runs; they can be anything from a markdown string to a table.`}),(0,j.jsx)(x,{children:(0,j.jsx)(S,{id:`artifacts-guide`})})]}),I=({filters:e,onFilterChange:t,artifactsList:n,artifactsCount:r})=>{let[i,a]=h(`artifacts-grid-style`,`grid`),o=(0,A.useMemo)(()=>i===`grid`?`grid grid-cols-1 lg:grid-cols-2 xl:grid-cols-3 gap-4`:`grid-cols-1`,[i]);return(0,j.jsxs)(`div`,{className:`flex flex-col gap-4`,children:[(0,j.jsx)(P,{}),(0,j.jsx)(N,{filters:e,onFilterChange:t,totalCount:r,setDisplayMode:a,displayMode:i}),n.length===0?(0,j.jsx)(F,{}):(0,j.jsx)(`div`,{className:o,children:n.map(e=>(0,j.jsx)(O,{artifact:e},e.id))})]})},L=()=>{let e=v.useSearch(),t=v.useNavigate();return{filters:(0,A.useMemo)(()=>[{id:`type`,label:`Type`,value:e.type??`all`},{id:`name`,label:`Name`,value:e.name}],[e.type,e.name]),onFilterChange:E((0,A.useCallback)(e=>{e&&t({to:`.`,search:()=>e.filter(e=>e.value).reduce((e,t)=>(t.value&&(e[t.id]=t.value),e),{}),replace:!0})},[t]),400)}},R=function(){let e=v.useSearch(),{filters:t,onFilterChange:n}=L(),[{data:i},{data:a}]=r({queries:[m(b(e)),y(b(e))]});return(0,j.jsx)(I,{filters:t,onFilterChange:n,artifactsCount:i,artifactsList:a})};export{R as component};
|
|
2
|
+
//# sourceMappingURL=artifacts-1uXI5WqD.js.map
|