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.
Files changed (318) hide show
  1. prefect/_build_info.py +3 -3
  2. prefect/runner/_workspace_resolver.py +17 -12
  3. prefect/server/AGENTS.md +1 -1
  4. prefect/server/api/workers.py +1 -0
  5. prefect/server/models/artifacts.py +0 -2
  6. prefect/server/models/work_queues.py +2 -2
  7. prefect/server/models/workers.py +1 -1
  8. prefect/server/schemas/core.py +1 -1
  9. prefect/server/ui-v2/assets/{admin-BAL15Uwl.js → admin-BwmAgV1B.js} +2 -2
  10. prefect/server/ui-v2/assets/{admin-BAL15Uwl.js.map → admin-BwmAgV1B.js.map} +1 -1
  11. prefect/server/ui-v2/assets/{artifact._id-D_htSbFc.js → artifact._id-DClBSNAc.js} +2 -2
  12. prefect/server/ui-v2/assets/{artifact._id-D_htSbFc.js.map → artifact._id-DClBSNAc.js.map} +1 -1
  13. prefect/server/ui-v2/assets/{artifact._id-C4vG8kN1.js → artifact._id-iTe860fK.js} +2 -2
  14. prefect/server/ui-v2/assets/{artifact._id-C4vG8kN1.js.map → artifact._id-iTe860fK.js.map} +1 -1
  15. prefect/server/ui-v2/assets/{artifacts-C94H1frM.js → artifacts-1uXI5WqD.js} +2 -2
  16. prefect/server/ui-v2/assets/{artifacts-C94H1frM.js.map → artifacts-1uXI5WqD.js.map} +1 -1
  17. prefect/server/ui-v2/assets/{artifacts-Dp1Cpics.js → artifacts-DK4EqGvl.js} +2 -2
  18. prefect/server/ui-v2/assets/{artifacts-Dp1Cpics.js.map → artifacts-DK4EqGvl.js.map} +1 -1
  19. prefect/server/ui-v2/assets/{automation-wizard-DHwU3ycN.js → automation-wizard-BY0XuXdq.js} +2 -2
  20. prefect/server/ui-v2/assets/{automation-wizard-DHwU3ycN.js.map → automation-wizard-BY0XuXdq.js.map} +1 -1
  21. prefect/server/ui-v2/assets/{automation._id-DVj5sQsY.js → automation._id-CjmsSv3o.js} +2 -2
  22. prefect/server/ui-v2/assets/{automation._id-DVj5sQsY.js.map → automation._id-CjmsSv3o.js.map} +1 -1
  23. prefect/server/ui-v2/assets/{automation._id-BPP0PFKR.js → automation._id-D9vm0dSK.js} +2 -2
  24. prefect/server/ui-v2/assets/{automation._id-BPP0PFKR.js.map → automation._id-D9vm0dSK.js.map} +1 -1
  25. prefect/server/ui-v2/assets/{automation_._id.edit-DXzu8308.js → automation_._id.edit-BsdiStqs.js} +2 -2
  26. prefect/server/ui-v2/assets/{automation_._id.edit-DXzu8308.js.map → automation_._id.edit-BsdiStqs.js.map} +1 -1
  27. prefect/server/ui-v2/assets/{automation_._id.edit-k_rZNDO5.js → automation_._id.edit-DYOqiH15.js} +2 -2
  28. prefect/server/ui-v2/assets/{automation_._id.edit-k_rZNDO5.js.map → automation_._id.edit-DYOqiH15.js.map} +1 -1
  29. prefect/server/ui-v2/assets/{automations-BBolpYje.js → automations-Dy7MEBCd.js} +2 -2
  30. prefect/server/ui-v2/assets/{automations-BBolpYje.js.map → automations-Dy7MEBCd.js.map} +1 -1
  31. prefect/server/ui-v2/assets/{automations-DEbtnaKI.js → automations-I0rut3oU.js} +2 -2
  32. prefect/server/ui-v2/assets/{automations-DEbtnaKI.js.map → automations-I0rut3oU.js.map} +1 -1
  33. prefect/server/ui-v2/assets/{automations-DXpkq-mg.js → automations-_spzfcQs.js} +2 -2
  34. prefect/server/ui-v2/assets/{automations-DXpkq-mg.js.map → automations-_spzfcQs.js.map} +1 -1
  35. prefect/server/ui-v2/assets/{automations-header-Bnufh1Se.js → automations-header-C_QvzcNT.js} +2 -2
  36. prefect/server/ui-v2/assets/{automations-header-Bnufh1Se.js.map → automations-header-C_QvzcNT.js.map} +1 -1
  37. prefect/server/ui-v2/assets/{automations-wizard-DIhcWuKm.js → automations-wizard-e40bFU9E.js} +2 -2
  38. prefect/server/ui-v2/assets/{automations-wizard-DIhcWuKm.js.map → automations-wizard-e40bFU9E.js.map} +1 -1
  39. prefect/server/ui-v2/assets/{badge-fyOQcNnR.js → badge-vurAYgxc.js} +2 -2
  40. prefect/server/ui-v2/assets/{badge-fyOQcNnR.js.map → badge-vurAYgxc.js.map} +1 -1
  41. prefect/server/ui-v2/assets/{base-job-template-form-section-xk-gbxny.js → base-job-template-form-section-DTh4Y5Ah.js} +2 -2
  42. prefect/server/ui-v2/assets/{base-job-template-form-section-xk-gbxny.js.map → base-job-template-form-section-DTh4Y5Ah.js.map} +1 -1
  43. prefect/server/ui-v2/assets/{block-type-details-Dq_SyCWm.js → block-type-details-CtMrR5QH.js} +2 -2
  44. prefect/server/ui-v2/assets/{block-type-details-Dq_SyCWm.js.map → block-type-details-CtMrR5QH.js.map} +1 -1
  45. prefect/server/ui-v2/assets/{block-type-logo-Cc5Lt-3a.js → block-type-logo-1_gehAYP.js} +2 -2
  46. prefect/server/ui-v2/assets/{block-type-logo-Cc5Lt-3a.js.map → block-type-logo-1_gehAYP.js.map} +1 -1
  47. prefect/server/ui-v2/assets/{block._id-DJ4swXQO.js → block._id-BrKW8FYY.js} +2 -2
  48. prefect/server/ui-v2/assets/{block._id-DJ4swXQO.js.map → block._id-BrKW8FYY.js.map} +1 -1
  49. prefect/server/ui-v2/assets/{block._id-7jcwcanq.js → block._id-D_TLERFK.js} +2 -2
  50. prefect/server/ui-v2/assets/{block._id-7jcwcanq.js.map → block._id-D_TLERFK.js.map} +1 -1
  51. prefect/server/ui-v2/assets/{block_._id.edit-CuQ59RzS.js → block_._id.edit-B2yl9C11.js} +2 -2
  52. prefect/server/ui-v2/assets/{block_._id.edit-CuQ59RzS.js.map → block_._id.edit-B2yl9C11.js.map} +1 -1
  53. prefect/server/ui-v2/assets/{block_._id.edit-X_LCGBMi.js → block_._id.edit-BbupcySJ.js} +2 -2
  54. prefect/server/ui-v2/assets/{block_._id.edit-X_LCGBMi.js.map → block_._id.edit-BbupcySJ.js.map} +1 -1
  55. prefect/server/ui-v2/assets/{blocks-D5uMj6X5.js → blocks-BVpxRYTR.js} +2 -2
  56. prefect/server/ui-v2/assets/{blocks-D5uMj6X5.js.map → blocks-BVpxRYTR.js.map} +1 -1
  57. prefect/server/ui-v2/assets/{blocks-CVpOVsR9.js → blocks-SUmL0Ghr.js} +2 -2
  58. prefect/server/ui-v2/assets/{blocks-CVpOVsR9.js.map → blocks-SUmL0Ghr.js.map} +1 -1
  59. prefect/server/ui-v2/assets/button-BmBv3lZP.js +3 -0
  60. prefect/server/ui-v2/assets/{button-D1nS4G4b.js.map → button-BmBv3lZP.js.map} +1 -1
  61. prefect/server/ui-v2/assets/{card-zAxS3Fox.js → card-BWi7Wr_R.js} +2 -2
  62. prefect/server/ui-v2/assets/{card-zAxS3Fox.js.map → card-BWi7Wr_R.js.map} +1 -1
  63. prefect/server/ui-v2/assets/{catalog-Cvuu07RM.js → catalog-2OlitMXZ.js} +2 -2
  64. prefect/server/ui-v2/assets/{catalog-Cvuu07RM.js.map → catalog-2OlitMXZ.js.map} +1 -1
  65. prefect/server/ui-v2/assets/{catalog-DBnpD4_R.js → catalog-BcBjU7Yy.js} +2 -2
  66. prefect/server/ui-v2/assets/{catalog-DBnpD4_R.js.map → catalog-BcBjU7Yy.js.map} +1 -1
  67. prefect/server/ui-v2/assets/{catalog_._slug-DMHkouWh.js → catalog_._slug-CpeIUyfC.js} +2 -2
  68. prefect/server/ui-v2/assets/{catalog_._slug-DMHkouWh.js.map → catalog_._slug-CpeIUyfC.js.map} +1 -1
  69. prefect/server/ui-v2/assets/{catalog_._slug-DwC2yZo9.js → catalog_._slug-DxivsC4n.js} +2 -2
  70. prefect/server/ui-v2/assets/{catalog_._slug-DwC2yZo9.js.map → catalog_._slug-DxivsC4n.js.map} +1 -1
  71. prefect/server/ui-v2/assets/{catalog_._slug_.create-DEjqmQ5H.js → catalog_._slug_.create-BfAYCqzV.js} +2 -2
  72. prefect/server/ui-v2/assets/{catalog_._slug_.create-DEjqmQ5H.js.map → catalog_._slug_.create-BfAYCqzV.js.map} +1 -1
  73. prefect/server/ui-v2/assets/{catalog_._slug_.create-pWiWaBhm.js → catalog_._slug_.create-DIls_o2s.js} +2 -2
  74. prefect/server/ui-v2/assets/{catalog_._slug_.create-pWiWaBhm.js.map → catalog_._slug_.create-DIls_o2s.js.map} +1 -1
  75. prefect/server/ui-v2/assets/{checkbox-CnS0zOAZ.js → checkbox-C61fowvt.js} +2 -2
  76. prefect/server/ui-v2/assets/{checkbox-CnS0zOAZ.js.map → checkbox-C61fowvt.js.map} +1 -1
  77. prefect/server/ui-v2/assets/{concurrency-limit._id-C1JAbeF7.js → concurrency-limit._id-BD5OWaxK.js} +2 -2
  78. prefect/server/ui-v2/assets/{concurrency-limit._id-C1JAbeF7.js.map → concurrency-limit._id-BD5OWaxK.js.map} +1 -1
  79. prefect/server/ui-v2/assets/{concurrency-limit._id-D2km7zi6.js → concurrency-limit._id-C5IwLXM-.js} +2 -2
  80. prefect/server/ui-v2/assets/{concurrency-limit._id-D2km7zi6.js.map → concurrency-limit._id-C5IwLXM-.js.map} +1 -1
  81. prefect/server/ui-v2/assets/{concurrency-limits-CiuVe4lC.js → concurrency-limits-Bc84E04d.js} +2 -2
  82. prefect/server/ui-v2/assets/{concurrency-limits-CiuVe4lC.js.map → concurrency-limits-Bc84E04d.js.map} +1 -1
  83. prefect/server/ui-v2/assets/{concurrency-limits-Bo4VHM4m.js → concurrency-limits-DbbgieMK.js} +2 -2
  84. prefect/server/ui-v2/assets/{concurrency-limits-Bo4VHM4m.js.map → concurrency-limits-DbbgieMK.js.map} +1 -1
  85. prefect/server/ui-v2/assets/{create-DC_F9Vc2.js → create-B5swJNpx.js} +2 -2
  86. prefect/server/ui-v2/assets/{create-DC_F9Vc2.js.map → create-B5swJNpx.js.map} +1 -1
  87. prefect/server/ui-v2/assets/{create-CXr3hIap.js → create-CLSh2YYJ.js} +2 -2
  88. prefect/server/ui-v2/assets/{create-CXr3hIap.js.map → create-CLSh2YYJ.js.map} +1 -1
  89. prefect/server/ui-v2/assets/{create-KsVh0LQQ.js → create-DR2ACvWj.js} +2 -2
  90. prefect/server/ui-v2/assets/{create-KsVh0LQQ.js.map → create-DR2ACvWj.js.map} +1 -1
  91. prefect/server/ui-v2/assets/{create-B8bILmAp.js → create-DUZ4ILfd.js} +2 -2
  92. prefect/server/ui-v2/assets/{create-B8bILmAp.js.map → create-DUZ4ILfd.js.map} +1 -1
  93. prefect/server/ui-v2/assets/{cron-input-B9vmWBhI.js → cron-input-DTg4XKWR.js} +2 -2
  94. prefect/server/ui-v2/assets/{cron-input-B9vmWBhI.js.map → cron-input-DTg4XKWR.js.map} +1 -1
  95. prefect/server/ui-v2/assets/{data-table-C_Co3B-8.js → data-table-BeZEMPPj.js} +2 -2
  96. prefect/server/ui-v2/assets/{data-table-C_Co3B-8.js.map → data-table-BeZEMPPj.js.map} +1 -1
  97. prefect/server/ui-v2/assets/{data-table-hPoc29Gc.js → data-table-CYvl_mU7.js} +2 -2
  98. prefect/server/ui-v2/assets/{data-table-hPoc29Gc.js.map → data-table-CYvl_mU7.js.map} +1 -1
  99. prefect/server/ui-v2/assets/{deployment-form-CrL1aiF2.js → deployment-form-BdWBEIGb.js} +3 -3
  100. prefect/server/ui-v2/assets/{deployment-form-CrL1aiF2.js.map → deployment-form-BdWBEIGb.js.map} +1 -1
  101. prefect/server/ui-v2/assets/{deployment-links-CtiX6W-O.js → deployment-links-DcaHRana.js} +2 -2
  102. prefect/server/ui-v2/assets/{deployment-links-CtiX6W-O.js.map → deployment-links-DcaHRana.js.map} +1 -1
  103. prefect/server/ui-v2/assets/{deployment._id-8DHzBBqN.js → deployment._id-DSpkCkrD.js} +2 -2
  104. prefect/server/ui-v2/assets/{deployment._id-8DHzBBqN.js.map → deployment._id-DSpkCkrD.js.map} +1 -1
  105. prefect/server/ui-v2/assets/{deployment._id-B5njgUVH.js → deployment._id-QB9oUwli.js} +2 -2
  106. prefect/server/ui-v2/assets/{deployment._id-B5njgUVH.js.map → deployment._id-QB9oUwli.js.map} +1 -1
  107. prefect/server/ui-v2/assets/{deployment_._id.duplicate-P68wrx5d.js → deployment_._id.duplicate-Buq607hT.js} +2 -2
  108. prefect/server/ui-v2/assets/{deployment_._id.duplicate-P68wrx5d.js.map → deployment_._id.duplicate-Buq607hT.js.map} +1 -1
  109. prefect/server/ui-v2/assets/{deployment_._id.duplicate-DSE5qVrl.js → deployment_._id.duplicate-CxoXM02K.js} +2 -2
  110. prefect/server/ui-v2/assets/{deployment_._id.duplicate-DSE5qVrl.js.map → deployment_._id.duplicate-CxoXM02K.js.map} +1 -1
  111. prefect/server/ui-v2/assets/deployment_._id.edit-B4-TptEu.js +2 -0
  112. prefect/server/ui-v2/assets/{deployment_._id.edit-BmCwRQfG.js.map → deployment_._id.edit-B4-TptEu.js.map} +1 -1
  113. prefect/server/ui-v2/assets/{deployment_._id.edit-BRk2Bs0U.js → deployment_._id.edit-BLbczGE6.js} +2 -2
  114. prefect/server/ui-v2/assets/{deployment_._id.edit-BRk2Bs0U.js.map → deployment_._id.edit-BLbczGE6.js.map} +1 -1
  115. prefect/server/ui-v2/assets/{deployment_._id.run-SWWrS_XP.js → deployment_._id.run-OoFiqasU.js} +2 -2
  116. prefect/server/ui-v2/assets/{deployment_._id.run-SWWrS_XP.js.map → deployment_._id.run-OoFiqasU.js.map} +1 -1
  117. prefect/server/ui-v2/assets/{deployment_._id.run-Bqnf9Hd8.js → deployment_._id.run-aNTvRx3C.js} +2 -2
  118. prefect/server/ui-v2/assets/{deployment_._id.run-Bqnf9Hd8.js.map → deployment_._id.run-aNTvRx3C.js.map} +1 -1
  119. prefect/server/ui-v2/assets/{deployments-B5DW6oSd.js → deployments-Bg48iYTk.js} +2 -2
  120. prefect/server/ui-v2/assets/{deployments-B5DW6oSd.js.map → deployments-Bg48iYTk.js.map} +1 -1
  121. prefect/server/ui-v2/assets/{deployments-vfpjs2Zu.js → deployments-C9hCXqaw.js} +2 -2
  122. prefect/server/ui-v2/assets/{deployments-vfpjs2Zu.js.map → deployments-C9hCXqaw.js.map} +1 -1
  123. prefect/server/ui-v2/assets/{deployments-C1tmJw6Q.js → deployments-f9_6GjVM.js} +2 -2
  124. prefect/server/ui-v2/assets/{deployments-C1tmJw6Q.js.map → deployments-f9_6GjVM.js.map} +1 -1
  125. prefect/server/ui-v2/assets/{dialog-DIuvBKov.js → dialog-kjByAu2K.js} +2 -2
  126. prefect/server/ui-v2/assets/{dialog-DIuvBKov.js.map → dialog-kjByAu2K.js.map} +1 -1
  127. prefect/server/ui-v2/assets/{dist-BWGcVrLy.js → dist-D70cmkC4.js} +2 -2
  128. prefect/server/ui-v2/assets/{dist-BWGcVrLy.js.map → dist-D70cmkC4.js.map} +1 -1
  129. prefect/server/ui-v2/assets/{event-resource-display-Bb5tg3Sp.js → event-resource-display-BbTlxvM0.js} +2 -2
  130. prefect/server/ui-v2/assets/{event-resource-display-Bb5tg3Sp.js.map → event-resource-display-BbTlxvM0.js.map} +1 -1
  131. prefect/server/ui-v2/assets/{event._eventDate._eventId-DSEdek1y.js → event._eventDate._eventId-52Pjmxbr.js} +2 -2
  132. prefect/server/ui-v2/assets/{event._eventDate._eventId-DSEdek1y.js.map → event._eventDate._eventId-52Pjmxbr.js.map} +1 -1
  133. prefect/server/ui-v2/assets/{event._eventDate._eventId-i_o9_8J0.js → event._eventDate._eventId-CxWp57nP.js} +2 -2
  134. prefect/server/ui-v2/assets/{event._eventDate._eventId-i_o9_8J0.js.map → event._eventDate._eventId-CxWp57nP.js.map} +1 -1
  135. prefect/server/ui-v2/assets/{events-Ba2H0nXG.js → events-DCxvBjip.js} +2 -2
  136. prefect/server/ui-v2/assets/{events-Ba2H0nXG.js.map → events-DCxvBjip.js.map} +1 -1
  137. prefect/server/ui-v2/assets/{events-DEk8mDv8.js → events-Vcoo_bS9.js} +2 -2
  138. prefect/server/ui-v2/assets/{events-DEk8mDv8.js.map → events-Vcoo_bS9.js.map} +1 -1
  139. prefect/server/ui-v2/assets/{events-timeline-BcJ4EZ3S.js → events-timeline-CnmVZdtM.js} +2 -2
  140. prefect/server/ui-v2/assets/{events-timeline-BcJ4EZ3S.js.map → events-timeline-CnmVZdtM.js.map} +1 -1
  141. prefect/server/ui-v2/assets/{flow-run-graph-C7Yv3ssM.js → flow-run-graph-CbD29Wck.js} +2 -2
  142. prefect/server/ui-v2/assets/{flow-run-graph-C7Yv3ssM.js.map → flow-run-graph-CbD29Wck.js.map} +1 -1
  143. prefect/server/ui-v2/assets/{flow-run._id-m92ddStD.js → flow-run._id-Bz9FocWM.js} +2 -2
  144. prefect/server/ui-v2/assets/{flow-run._id-m92ddStD.js.map → flow-run._id-Bz9FocWM.js.map} +1 -1
  145. prefect/server/ui-v2/assets/{flow-run._id-MIyYC3qx.js → flow-run._id-DbsY1HyI.js} +3 -3
  146. prefect/server/ui-v2/assets/{flow-run._id-MIyYC3qx.js.map → flow-run._id-DbsY1HyI.js.map} +1 -1
  147. prefect/server/ui-v2/assets/{flow-run._id-CuDYZEu4.js → flow-run._id-DqyOqm6l.js} +2 -2
  148. prefect/server/ui-v2/assets/{flow-run._id-CuDYZEu4.js.map → flow-run._id-DqyOqm6l.js.map} +1 -1
  149. prefect/server/ui-v2/assets/{flow-runs-Aasu1lzC.js → flow-runs-BlvuNAbf.js} +2 -2
  150. prefect/server/ui-v2/assets/{flow-runs-Aasu1lzC.js.map → flow-runs-BlvuNAbf.js.map} +1 -1
  151. prefect/server/ui-v2/assets/{flow._id-XXB9UBEF.js → flow._id-C7Rk6PoH.js} +2 -2
  152. prefect/server/ui-v2/assets/{flow._id-XXB9UBEF.js.map → flow._id-C7Rk6PoH.js.map} +1 -1
  153. prefect/server/ui-v2/assets/{flow._id-BRbwflJa.js → flow._id-DgOouag4.js} +2 -2
  154. prefect/server/ui-v2/assets/{flow._id-BRbwflJa.js.map → flow._id-DgOouag4.js.map} +1 -1
  155. prefect/server/ui-v2/assets/{flows-DeHBhtYq.js → flows-BKgvWEsn.js} +2 -2
  156. prefect/server/ui-v2/assets/{flows-DeHBhtYq.js.map → flows-BKgvWEsn.js.map} +1 -1
  157. prefect/server/ui-v2/assets/{flows-DxzYYVqT.js → flows-BmMWNEVL.js} +2 -2
  158. prefect/server/ui-v2/assets/{flows-DxzYYVqT.js.map → flows-BmMWNEVL.js.map} +1 -1
  159. prefect/server/ui-v2/assets/{flows-GKacvQcS.js → flows-C-NRpuYa.js} +2 -2
  160. prefect/server/ui-v2/assets/{flows-GKacvQcS.js.map → flows-C-NRpuYa.js.map} +1 -1
  161. prefect/server/ui-v2/assets/{header-DLLIG_v_.js → header-B--ytya-.js} +2 -2
  162. prefect/server/ui-v2/assets/{header-DLLIG_v_.js.map → header-B--ytya-.js.map} +1 -1
  163. prefect/server/ui-v2/assets/{header-C1Kl0PQt.js → header-Bn60nLKw.js} +2 -2
  164. prefect/server/ui-v2/assets/{header-C1Kl0PQt.js.map → header-Bn60nLKw.js.map} +1 -1
  165. prefect/server/ui-v2/assets/{header-BmLqNPjl.js → header-BvXtnaKL.js} +2 -2
  166. prefect/server/ui-v2/assets/{header-BmLqNPjl.js.map → header-BvXtnaKL.js.map} +1 -1
  167. prefect/server/ui-v2/assets/{index-DpPA2bX1.js → index-SebwJ2h3.js} +7 -7
  168. prefect/server/ui-v2/assets/index-SebwJ2h3.js.map +1 -0
  169. prefect/server/ui-v2/assets/{index-BNTLwS1u.css → index-iPs14a-7.css} +1 -1
  170. prefect/server/ui-v2/assets/{input-BaSLpSlc.js → input-Dr0oypOO.js} +2 -2
  171. prefect/server/ui-v2/assets/{input-BaSLpSlc.js.map → input-Dr0oypOO.js.map} +1 -1
  172. prefect/server/ui-v2/assets/{json-input-Ck4wcenx.js → json-input-C4f9tary.js} +2 -2
  173. prefect/server/ui-v2/assets/{json-input-Ck4wcenx.js.map → json-input-C4f9tary.js.map} +1 -1
  174. prefect/server/ui-v2/assets/{key-value-C2vDi3xo.js → key-value-C6T0AQJ-.js} +2 -2
  175. prefect/server/ui-v2/assets/{key-value-C2vDi3xo.js.map → key-value-C6T0AQJ-.js.map} +1 -1
  176. prefect/server/ui-v2/assets/{key._key-D_htSbFc.js → key._key-DClBSNAc.js} +2 -2
  177. prefect/server/ui-v2/assets/{key._key-D_htSbFc.js.map → key._key-DClBSNAc.js.map} +1 -1
  178. prefect/server/ui-v2/assets/{key._key-DZrY5Jq5.js → key._key-XPS7oVq5.js} +2 -2
  179. prefect/server/ui-v2/assets/{key._key-DZrY5Jq5.js.map → key._key-XPS7oVq5.js.map} +1 -1
  180. prefect/server/ui-v2/assets/{label-WfC7LL4G.js → label-K0MrFuta.js} +2 -2
  181. prefect/server/ui-v2/assets/{label-WfC7LL4G.js.map → label-K0MrFuta.js.map} +1 -1
  182. prefect/server/ui-v2/assets/{lazy-markdown-CCDNtAxT.js → lazy-markdown-uVUtgyxS.js} +2 -2
  183. prefect/server/ui-v2/assets/{lazy-markdown-CCDNtAxT.js.map → lazy-markdown-uVUtgyxS.js.map} +1 -1
  184. prefect/server/ui-v2/assets/{login-BeT_TSuo.js → login-BrODzAEz.js} +2 -2
  185. prefect/server/ui-v2/assets/{login-BeT_TSuo.js.map → login-BrODzAEz.js.map} +1 -1
  186. prefect/server/ui-v2/assets/{markdown-input-4x3dDfbx.js → markdown-input-tBIKaGf7.js} +2 -2
  187. prefect/server/ui-v2/assets/{markdown-input-4x3dDfbx.js.map → markdown-input-tBIKaGf7.js.map} +1 -1
  188. prefect/server/ui-v2/assets/{popover-wLn6-LQK.js → popover-DxOdMf4-.js} +2 -2
  189. prefect/server/ui-v2/assets/{popover-wLn6-LQK.js.map → popover-DxOdMf4-.js.map} +1 -1
  190. prefect/server/ui-v2/assets/python-example-snippet-BfhCQ6Qd.js +3 -0
  191. prefect/server/ui-v2/assets/{python-example-snippet-BxNh5JeI.js.map → python-example-snippet-BfhCQ6Qd.js.map} +1 -1
  192. prefect/server/ui-v2/assets/{python-input-WU0VDfRW.js → python-input-CsGs2knT.js} +2 -2
  193. prefect/server/ui-v2/assets/{python-input-WU0VDfRW.js.map → python-input-CsGs2knT.js.map} +1 -1
  194. prefect/server/ui-v2/assets/{route-error-state-DChqMSir.js → route-error-state-D3zpyudZ.js} +2 -2
  195. prefect/server/ui-v2/assets/{route-error-state-DChqMSir.js.map → route-error-state-D3zpyudZ.js.map} +1 -1
  196. prefect/server/ui-v2/assets/{run-logs-CRosV4hp.js → run-logs-Cg817JNc.js} +2 -2
  197. prefect/server/ui-v2/assets/{run-logs-CRosV4hp.js.map → run-logs-Cg817JNc.js.map} +1 -1
  198. prefect/server/ui-v2/assets/{runs-BJ5vg2mD.js → runs-BLE8kTnW.js} +2 -2
  199. prefect/server/ui-v2/assets/{runs-BJ5vg2mD.js.map → runs-BLE8kTnW.js.map} +1 -1
  200. prefect/server/ui-v2/assets/{runs-CDLtNNwI.js → runs-r6c5QXLm.js} +2 -2
  201. prefect/server/ui-v2/assets/{runs-CDLtNNwI.js.map → runs-r6c5QXLm.js.map} +1 -1
  202. prefect/server/ui-v2/assets/{schedule-badge-CMgyQe0S.js → schedule-badge-W3ssm5sb.js} +2 -2
  203. prefect/server/ui-v2/assets/{schedule-badge-CMgyQe0S.js.map → schedule-badge-W3ssm5sb.js.map} +1 -1
  204. prefect/server/ui-v2/assets/{schema-form-Dj8aocnY.js → schema-form-C_mXU59h.js} +3 -3
  205. prefect/server/ui-v2/assets/{schema-form-Dj8aocnY.js.map → schema-form-C_mXU59h.js.map} +1 -1
  206. prefect/server/ui-v2/assets/{select-Cvo9G-Ih.js → select-y2lIflCz.js} +2 -2
  207. prefect/server/ui-v2/assets/{select-Cvo9G-Ih.js.map → select-y2lIflCz.js.map} +1 -1
  208. prefect/server/ui-v2/assets/{service-DqISgcwD.js → service-DQBoCx1F.js} +2 -2
  209. prefect/server/ui-v2/assets/{service-DqISgcwD.js.map → service-DQBoCx1F.js.map} +1 -1
  210. prefect/server/ui-v2/assets/{settings-DnjyoScP.js → settings-9Ww5jBq4.js} +2 -2
  211. prefect/server/ui-v2/assets/{settings-DnjyoScP.js.map → settings-9Ww5jBq4.js.map} +1 -1
  212. prefect/server/ui-v2/assets/{skeleton-DArRq_9V.js → skeleton-CPJoizSQ.js} +2 -2
  213. prefect/server/ui-v2/assets/{skeleton-DArRq_9V.js.map → skeleton-CPJoizSQ.js.map} +1 -1
  214. prefect/server/ui-v2/assets/{state-badge-ngrQ67nq.js → state-badge-DFFq5COZ.js} +2 -2
  215. prefect/server/ui-v2/assets/{state-badge-ngrQ67nq.js.map → state-badge-DFFq5COZ.js.map} +1 -1
  216. prefect/server/ui-v2/assets/{state-select-bUmduh8e.js → state-select-TCSj7IPn.js} +2 -2
  217. prefect/server/ui-v2/assets/{state-select-bUmduh8e.js.map → state-select-TCSj7IPn.js.map} +1 -1
  218. prefect/server/ui-v2/assets/{status-badge-BCzVdEts.js → status-badge-5pEl4xty.js} +2 -2
  219. prefect/server/ui-v2/assets/{status-badge-BCzVdEts.js.map → status-badge-5pEl4xty.js.map} +1 -1
  220. prefect/server/ui-v2/assets/{tag-badge-group-BYDgVfl7.js → tag-badge-group-vf-EXVLw.js} +2 -2
  221. prefect/server/ui-v2/assets/{tag-badge-group-BYDgVfl7.js.map → tag-badge-group-vf-EXVLw.js.map} +1 -1
  222. prefect/server/ui-v2/assets/{tag-badge-DTVaiChx.js → tag-badge-mp5HxqMT.js} +2 -2
  223. prefect/server/ui-v2/assets/{tag-badge-DTVaiChx.js.map → tag-badge-mp5HxqMT.js.map} +1 -1
  224. prefect/server/ui-v2/assets/{tags-input-hwPEN4A8.js → tags-input-DS8uhDId.js} +2 -2
  225. prefect/server/ui-v2/assets/{tags-input-hwPEN4A8.js.map → tags-input-DS8uhDId.js.map} +1 -1
  226. 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
  227. 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
  228. prefect/server/ui-v2/assets/{task-run._id-Bh4SxXPB.js → task-run._id-BF5yIJbu.js} +2 -2
  229. prefect/server/ui-v2/assets/{task-run._id-Bh4SxXPB.js.map → task-run._id-BF5yIJbu.js.map} +1 -1
  230. prefect/server/ui-v2/assets/{task-run._id-CRu9NFG7.js → task-run._id-DwniCJAS.js} +2 -2
  231. prefect/server/ui-v2/assets/{task-run._id-CRu9NFG7.js.map → task-run._id-DwniCJAS.js.map} +1 -1
  232. prefect/server/ui-v2/assets/{task-runs-ChRc-e48.js → task-runs-juaJgpw8.js} +2 -2
  233. prefect/server/ui-v2/assets/{task-runs-ChRc-e48.js.map → task-runs-juaJgpw8.js.map} +1 -1
  234. prefect/server/ui-v2/assets/{timezone-select-C5FfG9pp.js → timezone-select-BxW5YhB3.js} +2 -2
  235. prefect/server/ui-v2/assets/{timezone-select-C5FfG9pp.js.map → timezone-select-BxW5YhB3.js.map} +1 -1
  236. prefect/server/ui-v2/assets/{toggle-group-_u3r2CNw.js → toggle-group-cZa2kNKg.js} +2 -2
  237. prefect/server/ui-v2/assets/{toggle-group-_u3r2CNw.js.map → toggle-group-cZa2kNKg.js.map} +1 -1
  238. prefect/server/ui-v2/assets/{tooltip-C9wxoNDR.js → tooltip-BzlEotat.js} +2 -2
  239. prefect/server/ui-v2/assets/{tooltip-C9wxoNDR.js.map → tooltip-BzlEotat.js.map} +1 -1
  240. prefect/server/ui-v2/assets/{trigger-details-CHNjlEuw.js → trigger-details-Bv6ZRMq5.js} +2 -2
  241. prefect/server/ui-v2/assets/{trigger-details-CHNjlEuw.js.map → trigger-details-Bv6ZRMq5.js.map} +1 -1
  242. prefect/server/ui-v2/assets/{ui-settings-CaRokgmg.js → ui-settings-Hapar41k.js} +2 -2
  243. prefect/server/ui-v2/assets/{ui-settings-CaRokgmg.js.map → ui-settings-Hapar41k.js.map} +1 -1
  244. prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-BughSutx.js → use-delete-automation-confirmation-dialog-Bk5-cKjd.js} +2 -2
  245. prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-BughSutx.js.map → use-delete-automation-confirmation-dialog-Bk5-cKjd.js.map} +1 -1
  246. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-CKHqokBH.js → use-delete-block-document-confirmation-dialog-CYyZ4sTs.js} +2 -2
  247. 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
  248. prefect/server/ui-v2/assets/{use-delete-deployment-confirmation-dialog-C3ycZNgq.js → use-delete-deployment-confirmation-dialog-CHPDQ8vA.js} +2 -2
  249. prefect/server/ui-v2/assets/{use-delete-deployment-confirmation-dialog-C3ycZNgq.js.map → use-delete-deployment-confirmation-dialog-CHPDQ8vA.js.map} +1 -1
  250. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DhfQBVCF.js → use-get-artifacts-flow-task-runs-3svJ-Wms.js} +2 -2
  251. 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
  252. prefect/server/ui-v2/assets/{use-page-size-preference-h2fMa3uB.js → use-page-size-preference-IOpF1ai0.js} +2 -2
  253. prefect/server/ui-v2/assets/{use-page-size-preference-h2fMa3uB.js.map → use-page-size-preference-IOpF1ai0.js.map} +1 -1
  254. prefect/server/ui-v2/assets/{use-resource-options-D89EKwub.js → use-resource-options-BEKWTTOl.js} +2 -2
  255. prefect/server/ui-v2/assets/{use-resource-options-D89EKwub.js.map → use-resource-options-BEKWTTOl.js.map} +1 -1
  256. prefect/server/ui-v2/assets/{use-stepper-EHPLdSM1.js → use-stepper-C1f9nvnR.js} +2 -2
  257. prefect/server/ui-v2/assets/{use-stepper-EHPLdSM1.js.map → use-stepper-C1f9nvnR.js.map} +1 -1
  258. prefect/server/ui-v2/assets/{variables-CNffa7fL.js → variables-BWiRHQ3L.js} +2 -2
  259. prefect/server/ui-v2/assets/{variables-CNffa7fL.js.map → variables-BWiRHQ3L.js.map} +1 -1
  260. prefect/server/ui-v2/assets/{variables-CuEJhTIi.js → variables-CxOLIk60.js} +2 -2
  261. prefect/server/ui-v2/assets/{variables-CuEJhTIi.js.map → variables-CxOLIk60.js.map} +1 -1
  262. prefect/server/ui-v2/assets/vendor-radix-CTETmXwX.js +42 -0
  263. prefect/server/ui-v2/assets/vendor-radix-CTETmXwX.js.map +1 -0
  264. prefect/server/ui-v2/assets/{vendor-react-BIruhmht.js → vendor-react-Db0NSBGF.js} +2 -2
  265. prefect/server/ui-v2/assets/{vendor-react-BIruhmht.js.map → vendor-react-Db0NSBGF.js.map} +1 -1
  266. prefect/server/ui-v2/assets/{vendor-recharts-CPNKWlI4.js → vendor-recharts-CnUR3BGJ.js} +2 -2
  267. prefect/server/ui-v2/assets/{vendor-recharts-CPNKWlI4.js.map → vendor-recharts-CnUR3BGJ.js.map} +1 -1
  268. prefect/server/ui-v2/assets/vendor-tanstack-Dx3GObhk.js +5 -0
  269. prefect/server/ui-v2/assets/vendor-tanstack-Dx3GObhk.js.map +1 -0
  270. prefect/server/ui-v2/assets/{work-pool-queue-form-D2p9bV5H.js → work-pool-queue-form-Bq2X5LHj.js} +2 -2
  271. prefect/server/ui-v2/assets/{work-pool-queue-form-D2p9bV5H.js.map → work-pool-queue-form-Bq2X5LHj.js.map} +1 -1
  272. prefect/server/ui-v2/assets/{work-pool-queue-toggle-mpNXNH8j.js → work-pool-queue-toggle-J85yKGTD.js} +2 -2
  273. prefect/server/ui-v2/assets/{work-pool-queue-toggle-mpNXNH8j.js.map → work-pool-queue-toggle-J85yKGTD.js.map} +1 -1
  274. prefect/server/ui-v2/assets/{work-pool._workPoolName-yitWW_tk.js → work-pool._workPoolName-YCXOdHVr.js} +2 -2
  275. prefect/server/ui-v2/assets/{work-pool._workPoolName-yitWW_tk.js.map → work-pool._workPoolName-YCXOdHVr.js.map} +1 -1
  276. prefect/server/ui-v2/assets/{work-pool._workPoolName-CE8bmrct.js → work-pool._workPoolName-bUofZYwQ.js} +2 -2
  277. prefect/server/ui-v2/assets/{work-pool._workPoolName-CE8bmrct.js.map → work-pool._workPoolName-bUofZYwQ.js.map} +1 -1
  278. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-D0nx4Eah.js → work-pool_._workPoolName.edit-CYfVbRNf.js} +2 -2
  279. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-D0nx4Eah.js.map → work-pool_._workPoolName.edit-CYfVbRNf.js.map} +1 -1
  280. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-DA2UEqLu.js → work-pool_._workPoolName.edit-DiXs_liC.js} +2 -2
  281. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-DA2UEqLu.js.map → work-pool_._workPoolName.edit-DiXs_liC.js.map} +1 -1
  282. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-JXuxoDuG.js → work-pool_._workPoolName.queue._workQueueName-BQuxeqDJ.js} +2 -2
  283. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-JXuxoDuG.js.map → work-pool_._workPoolName.queue._workQueueName-BQuxeqDJ.js.map} +1 -1
  284. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-DBjFQl5l.js → work-pool_._workPoolName.queue._workQueueName-DKeaiBcU.js} +2 -2
  285. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-DBjFQl5l.js.map → work-pool_._workPoolName.queue._workQueueName-DKeaiBcU.js.map} +1 -1
  286. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue.create-D66B3TgZ.js → work-pool_._workPoolName.queue.create-BOXgjauS.js} +2 -2
  287. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue.create-D66B3TgZ.js.map → work-pool_._workPoolName.queue.create-BOXgjauS.js.map} +1 -1
  288. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue.create-C4-aNOiQ.js → work-pool_._workPoolName.queue.create-D13u2idT.js} +2 -2
  289. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue.create-C4-aNOiQ.js.map → work-pool_._workPoolName.queue.create-D13u2idT.js.map} +1 -1
  290. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue_._workQueueName.edit-D0mwu3Qq.js → work-pool_._workPoolName.queue_._workQueueName.edit-B9IWAocA.js} +2 -2
  291. 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
  292. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue_._workQueueName.edit-BhfkkDyJ.js → work-pool_._workPoolName.queue_._workQueueName.edit-IUEqbb8N.js} +2 -2
  293. 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
  294. prefect/server/ui-v2/assets/{work-pools-CGC3mSny.js → work-pools-CF0R3DPQ.js} +2 -2
  295. prefect/server/ui-v2/assets/{work-pools-CGC3mSny.js.map → work-pools-CF0R3DPQ.js.map} +1 -1
  296. prefect/server/ui-v2/assets/{work-pools-CfA9RMA9.js → work-pools-CFgVsLNa.js} +2 -2
  297. prefect/server/ui-v2/assets/{work-pools-CfA9RMA9.js.map → work-pools-CFgVsLNa.js.map} +1 -1
  298. prefect/server/ui-v2/assets/{work-pools-CN3RyiZN.js → work-pools-Ca2SI6yr.js} +2 -2
  299. prefect/server/ui-v2/assets/{work-pools-CN3RyiZN.js.map → work-pools-Ca2SI6yr.js.map} +1 -1
  300. prefect/server/ui-v2/assets/{work-queue-icon-text-9KRWnE0A.js → work-queue-icon-text-D1EV2W3e.js} +2 -2
  301. prefect/server/ui-v2/assets/{work-queue-icon-text-9KRWnE0A.js.map → work-queue-icon-text-D1EV2W3e.js.map} +1 -1
  302. prefect/server/ui-v2/assets/{work-queue-select-CLtC0i-b.js → work-queue-select-DRgR5_TX.js} +2 -2
  303. prefect/server/ui-v2/assets/{work-queue-select-CLtC0i-b.js.map → work-queue-select-DRgR5_TX.js.map} +1 -1
  304. prefect/server/ui-v2/index.html +30 -30
  305. prefect/server/utilities/worker_channel.py +17 -2
  306. {prefect-3.7.7.dev2.dist-info → prefect-3.7.8.dev1.dist-info}/METADATA +1 -1
  307. {prefect-3.7.7.dev2.dist-info → prefect-3.7.8.dev1.dist-info}/RECORD +310 -310
  308. prefect/server/ui-v2/assets/button-D1nS4G4b.js +0 -3
  309. prefect/server/ui-v2/assets/deployment_._id.edit-BmCwRQfG.js +0 -2
  310. prefect/server/ui-v2/assets/index-DpPA2bX1.js.map +0 -1
  311. prefect/server/ui-v2/assets/python-example-snippet-BxNh5JeI.js +0 -3
  312. prefect/server/ui-v2/assets/vendor-radix-Dlx3ZkX2.js +0 -42
  313. prefect/server/ui-v2/assets/vendor-radix-Dlx3ZkX2.js.map +0 -1
  314. prefect/server/ui-v2/assets/vendor-tanstack-CghpeqA9.js +0 -5
  315. prefect/server/ui-v2/assets/vendor-tanstack-CghpeqA9.js.map +0 -1
  316. {prefect-3.7.7.dev2.dist-info → prefect-3.7.8.dev1.dist-info}/WHEEL +0 -0
  317. {prefect-3.7.7.dev2.dist-info → prefect-3.7.8.dev1.dist-info}/entry_points.txt +0 -0
  318. {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.7.dev2"
3
- __build_date__ = "2026-07-02 09:11:30.092077+00:00"
4
- __git_commit__ = "ab6a0dc6d01900814612a11dc41d0d80c9549112"
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.loggers import get_logger
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
- LOGGER.info("Downloading flow code from storage at %r", from_path)
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
- LOGGER.info("Running %s deployment pull step(s)", len(deployment.pull_steps))
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=_stderr_print,
364
+ print_function=run_logger.warning,
363
365
  deployment=deployment,
364
366
  flow_run=flow_run,
365
- logger=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
 
@@ -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 id.
297
+ Reads a WorkQueue by name.
298
298
 
299
299
  Args:
300
300
  session (AsyncSession): A database session
301
- work_queue_id (str): a WorkQueue id
301
+ name (str): a WorkQueue name
302
302
 
303
303
  Returns:
304
304
  orm_models.WorkQueue: the WorkQueue
@@ -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
- worker: the work queue data
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
@@ -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
- late_runs: the count of late runs for the work queue.
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-CghpeqA9.js";import{n as r}from"./service-DqISgcwD.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-BAL15Uwl.js.map
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-BAL15Uwl.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
+ {"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-DChqMSir.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-D_htSbFc.js.map
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-D_htSbFc.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
+ {"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-C4vG8kN1.js.map
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-CghpeqA9.js";import{g as i,o as a}from"./button-D1nS4G4b.js";import{i as o,n as s,o as c,s as l,t as u}from"./select-Cvo9G-Ih.js";import{n as d}from"./input-BaSLpSlc.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-DpPA2bX1.js";import{t as E}from"./use-debounce-callback-OMnDBqjj.js";import{n as D,r as O,t as k}from"./toggle-group-_u3r2CNw.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-C94H1frM.js.map
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