prefect 3.6.12__py3-none-any.whl → 3.6.13__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 (266) hide show
  1. prefect/_build_info.py +3 -3
  2. prefect/_internal/compatibility/blocks.py +18 -0
  3. prefect/_internal/urls.py +29 -0
  4. prefect/_states.py +4 -1
  5. prefect/client/orchestration/_concurrency_limits/client.py +16 -16
  6. prefect/client/schemas/filters.py +24 -0
  7. prefect/client/subscriptions.py +1 -1
  8. prefect/events/clients.py +52 -13
  9. prefect/flow_engine.py +192 -10
  10. prefect/flows.py +61 -2
  11. prefect/results.py +262 -21
  12. prefect/runner/runner.py +29 -82
  13. prefect/runner/storage.py +6 -25
  14. prefect/server/schemas/filters.py +45 -0
  15. prefect/server/ui-v2/assets/{artifact-card-Ds2tntMW.js → artifact-card-CUEaRDGw.js} +2 -2
  16. prefect/server/ui-v2/assets/{artifact-card-Ds2tntMW.js.map → artifact-card-CUEaRDGw.js.map} +1 -1
  17. prefect/server/ui-v2/assets/{artifact._id-erPNL0a8.js → artifact._id-Ca6VCUS0.js} +2 -2
  18. prefect/server/ui-v2/assets/{artifact._id-erPNL0a8.js.map → artifact._id-Ca6VCUS0.js.map} +1 -1
  19. prefect/server/ui-v2/assets/{automation-wizard-Bx9AQxRV.js → automation-wizard-z26pICBl.js} +2 -2
  20. prefect/server/ui-v2/assets/{automation-wizard-Bx9AQxRV.js.map → automation-wizard-z26pICBl.js.map} +1 -1
  21. prefect/server/ui-v2/assets/automation._id-DuodjY5t.js +2 -0
  22. prefect/server/ui-v2/assets/{automation._id-IHh5QJwE.js.map → automation._id-DuodjY5t.js.map} +1 -1
  23. prefect/server/ui-v2/assets/{automation_._id.edit-Ds8vO0c5.js → automation_._id.edit-CcuJhc-y.js} +2 -2
  24. prefect/server/ui-v2/assets/{automation_._id.edit-Ds8vO0c5.js.map → automation_._id.edit-CcuJhc-y.js.map} +1 -1
  25. prefect/server/ui-v2/assets/{automations-header-C6aUe5Tw.js → automations-header-CgOWwuc6.js} +2 -2
  26. prefect/server/ui-v2/assets/{automations-header-C6aUe5Tw.js.map → automations-header-CgOWwuc6.js.map} +1 -1
  27. prefect/server/ui-v2/assets/{base-job-template-form-section-a-9TFMcW.js → base-job-template-form-section-DN9HyjM5.js} +2 -2
  28. prefect/server/ui-v2/assets/{base-job-template-form-section-a-9TFMcW.js.map → base-job-template-form-section-DN9HyjM5.js.map} +1 -1
  29. prefect/server/ui-v2/assets/{block-type-details-eq3Wg2ht.js → block-type-details-rrToxL5r.js} +2 -2
  30. prefect/server/ui-v2/assets/{block-type-details-eq3Wg2ht.js.map → block-type-details-rrToxL5r.js.map} +1 -1
  31. prefect/server/ui-v2/assets/block-type-logo-DURScH8H.js +2 -0
  32. prefect/server/ui-v2/assets/{block-type-logo-B31LJm5H.js.map → block-type-logo-DURScH8H.js.map} +1 -1
  33. prefect/server/ui-v2/assets/{block._id-OVdz3htC.js → block._id-Bue6lnrN.js} +2 -2
  34. prefect/server/ui-v2/assets/{block._id-OVdz3htC.js.map → block._id-Bue6lnrN.js.map} +1 -1
  35. prefect/server/ui-v2/assets/block_._id.edit-QY0OzN_b.js +2 -0
  36. prefect/server/ui-v2/assets/{block_._id.edit-CIhIBJrm.js.map → block_._id.edit-QY0OzN_b.js.map} +1 -1
  37. prefect/server/ui-v2/assets/catalog-CGjRGWv6.js +2 -0
  38. prefect/server/ui-v2/assets/{catalog-CfniU0UV.js.map → catalog-CGjRGWv6.js.map} +1 -1
  39. prefect/server/ui-v2/assets/catalog_._slug-BMFNZhEb.js +2 -0
  40. prefect/server/ui-v2/assets/{catalog_._slug-C9p86T4s.js.map → catalog_._slug-BMFNZhEb.js.map} +1 -1
  41. prefect/server/ui-v2/assets/catalog_._slug_.create-CuFA3kUC.js +2 -0
  42. prefect/server/ui-v2/assets/{catalog_._slug_.create-BhSunL__.js.map → catalog_._slug_.create-CuFA3kUC.js.map} +1 -1
  43. prefect/server/ui-v2/assets/{collapsible-DBD7wjpi.js → collapsible-Ell2FjrX.js} +2 -2
  44. prefect/server/ui-v2/assets/{collapsible-DBD7wjpi.js.map → collapsible-Ell2FjrX.js.map} +1 -1
  45. prefect/server/ui-v2/assets/{concurrency-limit._id-C-XWq7Tf.js → concurrency-limit._id-Rr1ysUct.js} +2 -2
  46. prefect/server/ui-v2/assets/{concurrency-limit._id-C-XWq7Tf.js.map → concurrency-limit._id-Rr1ysUct.js.map} +1 -1
  47. prefect/server/ui-v2/assets/{create-noFojqGL.js → create-CQK8-uO1.js} +2 -2
  48. prefect/server/ui-v2/assets/{create-noFojqGL.js.map → create-CQK8-uO1.js.map} +1 -1
  49. prefect/server/ui-v2/assets/{create-Bj2t5YQq.js → create-ewA3uq_h.js} +2 -2
  50. prefect/server/ui-v2/assets/{create-Bj2t5YQq.js.map → create-ewA3uq_h.js.map} +1 -1
  51. prefect/server/ui-v2/assets/{data-table-BjFlVIyC.js → data-table-Bx1uYX_M.js} +2 -2
  52. prefect/server/ui-v2/assets/{data-table-BjFlVIyC.js.map → data-table-Bx1uYX_M.js.map} +1 -1
  53. prefect/server/ui-v2/assets/delete-confirmation-dialog-CqKsUEj_.js +2 -0
  54. prefect/server/ui-v2/assets/{delete-confirmation-dialog-COdZmNfa.js.map → delete-confirmation-dialog-CqKsUEj_.js.map} +1 -1
  55. prefect/server/ui-v2/assets/{deployment-action-header-C6v2kZ6V.js → deployment-action-header-Bz5COdER.js} +2 -2
  56. prefect/server/ui-v2/assets/{deployment-action-header-C6v2kZ6V.js.map → deployment-action-header-Bz5COdER.js.map} +1 -1
  57. prefect/server/ui-v2/assets/{deployment-form-D9d5sZM2.js → deployment-form-CrlZlNoj.js} +3 -3
  58. prefect/server/ui-v2/assets/{deployment-form-D9d5sZM2.js.map → deployment-form-CrlZlNoj.js.map} +1 -1
  59. prefect/server/ui-v2/assets/{deployment-links-Dy-M1Que.js → deployment-links-D9ZR_vmp.js} +2 -2
  60. prefect/server/ui-v2/assets/{deployment-links-Dy-M1Que.js.map → deployment-links-D9ZR_vmp.js.map} +1 -1
  61. prefect/server/ui-v2/assets/deployment._id-BV0rSqba.js +2 -0
  62. prefect/server/ui-v2/assets/{deployment._id-DVmqclRz.js.map → deployment._id-BV0rSqba.js.map} +1 -1
  63. prefect/server/ui-v2/assets/{deployment._id-CZlY9261.js → deployment._id-DvHhx-qN.js} +2 -2
  64. prefect/server/ui-v2/assets/{deployment._id-CZlY9261.js.map → deployment._id-DvHhx-qN.js.map} +1 -1
  65. prefect/server/ui-v2/assets/deployment_._id.duplicate-BrEOenqP.js +2 -0
  66. prefect/server/ui-v2/assets/{deployment_._id.duplicate-DVMjpk5m.js.map → deployment_._id.duplicate-BrEOenqP.js.map} +1 -1
  67. prefect/server/ui-v2/assets/deployment_._id.edit-BbYKPK42.js +2 -0
  68. prefect/server/ui-v2/assets/{deployment_._id.edit-Ck_P6KDn.js.map → deployment_._id.edit-BbYKPK42.js.map} +1 -1
  69. prefect/server/ui-v2/assets/{deployment_._id.run-Cht7AHDG.js → deployment_._id.run-Dv7S_MJR.js} +2 -2
  70. prefect/server/ui-v2/assets/{deployment_._id.run-Cht7AHDG.js.map → deployment_._id.run-Dv7S_MJR.js.map} +1 -1
  71. prefect/server/ui-v2/assets/{dropdown-menu-xZ_3w9OP.js → dropdown-menu-e0Fqb6aw.js} +2 -2
  72. prefect/server/ui-v2/assets/{dropdown-menu-xZ_3w9OP.js.map → dropdown-menu-e0Fqb6aw.js.map} +1 -1
  73. prefect/server/ui-v2/assets/{event._eventDate._eventId-CpexuXd6.js → event._eventDate._eventId-Cp4UmGqq.js} +2 -2
  74. prefect/server/ui-v2/assets/{event._eventDate._eventId-CpexuXd6.js.map → event._eventDate._eventId-Cp4UmGqq.js.map} +1 -1
  75. prefect/server/ui-v2/assets/flow-run-graph-BrqoR3E2.js +2 -0
  76. prefect/server/ui-v2/assets/flow-run-graph-BrqoR3E2.js.map +1 -0
  77. prefect/server/ui-v2/assets/{flow-run._id-ZBlKBwPO.js → flow-run._id-BOp38Pbq.js} +2 -2
  78. prefect/server/ui-v2/assets/{flow-run._id-ZBlKBwPO.js.map → flow-run._id-BOp38Pbq.js.map} +1 -1
  79. prefect/server/ui-v2/assets/flow-run._id-DJnTDEN_.js +2 -0
  80. prefect/server/ui-v2/assets/{flow-run._id-OL0YhyLW.js.map → flow-run._id-DJnTDEN_.js.map} +1 -1
  81. prefect/server/ui-v2/assets/flow-run._id-D_wY_rBe.js +4 -0
  82. prefect/server/ui-v2/assets/flow-run._id-D_wY_rBe.js.map +1 -0
  83. prefect/server/ui-v2/assets/flow-runs-pagination-Bq2ZUzM6.js +2 -0
  84. prefect/server/ui-v2/assets/flow-runs-pagination-Bq2ZUzM6.js.map +1 -0
  85. prefect/server/ui-v2/assets/flow._id-eCBL95rg.js +2 -0
  86. prefect/server/ui-v2/assets/{flow._id-DhrCicwR.js.map → flow._id-eCBL95rg.js.map} +1 -1
  87. prefect/server/ui-v2/assets/{form-BTub_PhK.js → form-DNerk3LS.js} +2 -2
  88. prefect/server/ui-v2/assets/{form-BTub_PhK.js.map → form-DNerk3LS.js.map} +1 -1
  89. prefect/server/ui-v2/assets/{header-6wmrKLU3.js → header-B0ejRncu.js} +2 -2
  90. prefect/server/ui-v2/assets/{header-6wmrKLU3.js.map → header-B0ejRncu.js.map} +1 -1
  91. prefect/server/ui-v2/assets/{header-Dp9qi8fq.js → header-DwagHBlF.js} +2 -2
  92. prefect/server/ui-v2/assets/{header-Dp9qi8fq.js.map → header-DwagHBlF.js.map} +1 -1
  93. prefect/server/ui-v2/assets/{header-B75eb688.js → header-huSvwxKI.js} +2 -2
  94. prefect/server/ui-v2/assets/{header-B75eb688.js.map → header-huSvwxKI.js.map} +1 -1
  95. prefect/server/ui-v2/assets/{index-DSaSov8V.js → index-BO3SOwdV.js} +2 -2
  96. prefect/server/ui-v2/assets/{index-DSaSov8V.js.map → index-BO3SOwdV.js.map} +1 -1
  97. prefect/server/ui-v2/assets/{index-DOkFJdYY.js → index-BTPE3vs7.js} +2 -2
  98. prefect/server/ui-v2/assets/{index-DOkFJdYY.js.map → index-BTPE3vs7.js.map} +1 -1
  99. prefect/server/ui-v2/assets/index-BU4yZRd3.js +2 -0
  100. prefect/server/ui-v2/assets/{index-Cs8eFQKw.js.map → index-BU4yZRd3.js.map} +1 -1
  101. prefect/server/ui-v2/assets/index-BhALpenO.js +2 -0
  102. prefect/server/ui-v2/assets/{index-qPlIYf3i.js.map → index-BhALpenO.js.map} +1 -1
  103. prefect/server/ui-v2/assets/index-BzN9bQeM.js +2 -0
  104. prefect/server/ui-v2/assets/{index-CT_nG86y.js.map → index-BzN9bQeM.js.map} +1 -1
  105. prefect/server/ui-v2/assets/{index-zpb5iSCL.js → index-CBhi1P9g.js} +2 -2
  106. prefect/server/ui-v2/assets/{index-zpb5iSCL.js.map → index-CBhi1P9g.js.map} +1 -1
  107. prefect/server/ui-v2/assets/{index-UN2Tx4jH.js → index-CRDz4nhM.js} +2 -2
  108. prefect/server/ui-v2/assets/{index-UN2Tx4jH.js.map → index-CRDz4nhM.js.map} +1 -1
  109. prefect/server/ui-v2/assets/index-CTnoa3Ho.js +2 -0
  110. prefect/server/ui-v2/assets/index-CTnoa3Ho.js.map +1 -0
  111. prefect/server/ui-v2/assets/{index-DzMGV8GV.js → index-CWkbSdxY.js} +2 -2
  112. prefect/server/ui-v2/assets/{index-DzMGV8GV.js.map → index-CWkbSdxY.js.map} +1 -1
  113. prefect/server/ui-v2/assets/index-CgOsOj5t.js +2 -0
  114. prefect/server/ui-v2/assets/{index-7ThYp9SY.js.map → index-CgOsOj5t.js.map} +1 -1
  115. prefect/server/ui-v2/assets/{index-CGWoVV2s.js → index-CnIJUujl.js} +2 -2
  116. prefect/server/ui-v2/assets/{index-CGWoVV2s.js.map → index-CnIJUujl.js.map} +1 -1
  117. prefect/server/ui-v2/assets/{index-D08xgmV0.js → index-Cutg_A1j.js} +2 -2
  118. prefect/server/ui-v2/assets/{index-D08xgmV0.js.map → index-Cutg_A1j.js.map} +1 -1
  119. prefect/server/ui-v2/assets/index-D5RdrxkU.js +17 -0
  120. prefect/server/ui-v2/assets/index-D5RdrxkU.js.map +1 -0
  121. prefect/server/ui-v2/assets/{index-DfiNsXba.js → index-DDiyFpIV.js} +2 -2
  122. prefect/server/ui-v2/assets/{index-DfiNsXba.js.map → index-DDiyFpIV.js.map} +1 -1
  123. prefect/server/ui-v2/assets/{index-BA7ACCoL.js → index-DI2DC5gd.js} +2 -2
  124. prefect/server/ui-v2/assets/{index-BA7ACCoL.js.map → index-DI2DC5gd.js.map} +1 -1
  125. prefect/server/ui-v2/assets/index-Dg_duvDx.js +2 -0
  126. prefect/server/ui-v2/assets/{index-B_3f8Hcb.js.map → index-Dg_duvDx.js.map} +1 -1
  127. prefect/server/ui-v2/assets/index-Dspw5HFj.js +2 -0
  128. prefect/server/ui-v2/assets/{index-7-r4ia_S.js.map → index-Dspw5HFj.js.map} +1 -1
  129. prefect/server/ui-v2/assets/index-NY089eTx.css +1 -0
  130. prefect/server/ui-v2/assets/{index-DYOACRXY.js → index-VOOLxiSE.js} +2 -2
  131. prefect/server/ui-v2/assets/{index-DYOACRXY.js.map → index-VOOLxiSE.js.map} +1 -1
  132. prefect/server/ui-v2/assets/{index-HGoNWFfP.js → index-Wfs7Cjew.js} +2 -2
  133. prefect/server/ui-v2/assets/{index-HGoNWFfP.js.map → index-Wfs7Cjew.js.map} +1 -1
  134. prefect/server/ui-v2/assets/index-dSUEBAqg.js +2 -0
  135. prefect/server/ui-v2/assets/{index-H6bwm6L6.js.map → index-dSUEBAqg.js.map} +1 -1
  136. prefect/server/ui-v2/assets/{index-D3ILnEzm.js → index-uvH5a3zO.js} +2 -2
  137. prefect/server/ui-v2/assets/{index-D3ILnEzm.js.map → index-uvH5a3zO.js.map} +1 -1
  138. prefect/server/ui-v2/assets/{json-input-9UPGqxTw.js → json-input-gXz7BuJj.js} +2 -2
  139. prefect/server/ui-v2/assets/{json-input-9UPGqxTw.js.map → json-input-gXz7BuJj.js.map} +1 -1
  140. prefect/server/ui-v2/assets/{key._key-CTFfXO_k.js → key._key-CJPbLXwU.js} +2 -2
  141. prefect/server/ui-v2/assets/{key._key-CTFfXO_k.js.map → key._key-CJPbLXwU.js.map} +1 -1
  142. prefect/server/ui-v2/assets/{lazy-markdown-BHwIrC8E.js → lazy-markdown-wPid80zf.js} +2 -2
  143. prefect/server/ui-v2/assets/{lazy-markdown-BHwIrC8E.js.map → lazy-markdown-wPid80zf.js.map} +1 -1
  144. prefect/server/ui-v2/assets/{login-kqmT29n7.js → login-DC63bGXK.js} +2 -2
  145. prefect/server/ui-v2/assets/{login-kqmT29n7.js.map → login-DC63bGXK.js.map} +1 -1
  146. prefect/server/ui-v2/assets/{markdown-input-BesmAbLS.js → markdown-input-BhqrU6Eo.js} +2 -2
  147. prefect/server/ui-v2/assets/{markdown-input-BesmAbLS.js.map → markdown-input-BhqrU6Eo.js.map} +1 -1
  148. prefect/server/ui-v2/assets/{python-example-snippet-COTWYn1Y.js → python-example-snippet-3jtXWQZN.js} +3 -3
  149. prefect/server/ui-v2/assets/{python-example-snippet-COTWYn1Y.js.map → python-example-snippet-3jtXWQZN.js.map} +1 -1
  150. prefect/server/ui-v2/assets/{python-input-Bjccebi0.js → python-input-ZVi-v324.js} +2 -2
  151. prefect/server/ui-v2/assets/{python-input-Bjccebi0.js.map → python-input-ZVi-v324.js.map} +1 -1
  152. prefect/server/ui-v2/assets/{radio-group-DkAK0M2h.js → radio-group-BBMLpHGc.js} +2 -2
  153. prefect/server/ui-v2/assets/{radio-group-DkAK0M2h.js.map → radio-group-BBMLpHGc.js.map} +1 -1
  154. prefect/server/ui-v2/assets/route-error-state-BJXl8qkX.js +2 -0
  155. prefect/server/ui-v2/assets/{route-error-state-ALftyvGl.js.map → route-error-state-BJXl8qkX.js.map} +1 -1
  156. prefect/server/ui-v2/assets/{schema-form-BR4E-WXE.js → schema-form-BEqYjsM-.js} +2 -2
  157. prefect/server/ui-v2/assets/{schema-form-BR4E-WXE.js.map → schema-form-BEqYjsM-.js.map} +1 -1
  158. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-BhL8C5NS.js → schema-form-input-string-format-datetime-l3xt3PWf.js} +4 -4
  159. prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-BhL8C5NS.js.map → schema-form-input-string-format-datetime-l3xt3PWf.js.map} +1 -1
  160. prefect/server/ui-v2/assets/settings-txD0dR5Q.js +2 -0
  161. prefect/server/ui-v2/assets/settings-txD0dR5Q.js.map +1 -0
  162. prefect/server/ui-v2/assets/{sort-filter-BD4vwJXt.js → sort-filter-DHPFdKZ2.js} +2 -2
  163. prefect/server/ui-v2/assets/{sort-filter-BD4vwJXt.js.map → sort-filter-DHPFdKZ2.js.map} +1 -1
  164. prefect/server/ui-v2/assets/state-colors-CAAf0Eg3.js +2 -0
  165. prefect/server/ui-v2/assets/state-colors-CAAf0Eg3.js.map +1 -0
  166. prefect/server/ui-v2/assets/table-ULfpXJXB.js +2 -0
  167. prefect/server/ui-v2/assets/table-ULfpXJXB.js.map +1 -0
  168. prefect/server/ui-v2/assets/tags-input-BLzMOTDb.js +2 -0
  169. prefect/server/ui-v2/assets/tags-input-BLzMOTDb.js.map +1 -0
  170. prefect/server/ui-v2/assets/task-run-concurrency-limits-reset-dialog-BpeKHk7g.js +2 -0
  171. prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-CG3den1B.js.map → task-run-concurrency-limits-reset-dialog-BpeKHk7g.js.map} +1 -1
  172. prefect/server/ui-v2/assets/{task-run._id-DOcIzVi0.js → task-run._id-CkOl9MJs.js} +3 -3
  173. prefect/server/ui-v2/assets/{task-run._id-DOcIzVi0.js.map → task-run._id-CkOl9MJs.js.map} +1 -1
  174. prefect/server/ui-v2/assets/task-run._id-udkz1lhh.js +2 -0
  175. prefect/server/ui-v2/assets/{task-run._id-CnIVqU6v.js.map → task-run._id-udkz1lhh.js.map} +1 -1
  176. prefect/server/ui-v2/assets/task-runs-pagination-B7D5K_FM.js +2 -0
  177. prefect/server/ui-v2/assets/{task-runs-pagination-DLSAz-Ur.js.map → task-runs-pagination-B7D5K_FM.js.map} +1 -1
  178. prefect/server/ui-v2/assets/{textarea-D8LjlIx7.js → textarea-C4bdj7Jk.js} +2 -2
  179. prefect/server/ui-v2/assets/{textarea-D8LjlIx7.js.map → textarea-C4bdj7Jk.js.map} +1 -1
  180. prefect/server/ui-v2/assets/{timezone-select-BG3cL3-U.js → timezone-select-AdlSRQxZ.js} +2 -2
  181. prefect/server/ui-v2/assets/{timezone-select-BG3cL3-U.js.map → timezone-select-AdlSRQxZ.js.map} +1 -1
  182. prefect/server/ui-v2/assets/{toggle-group-D3zeurIL.js → toggle-group-C-vxYz4l.js} +2 -2
  183. prefect/server/ui-v2/assets/{toggle-group-D3zeurIL.js.map → toggle-group-C-vxYz4l.js.map} +1 -1
  184. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-Cqhaqtqe.js +2 -0
  185. prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-Bzy2ML2T.js.map → use-delete-automation-confirmation-dialog-Cqhaqtqe.js.map} +1 -1
  186. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-DRAP-Tnu.js → use-delete-block-document-confirmation-dialog-GjNhFxZe.js} +2 -2
  187. prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-DRAP-Tnu.js.map → use-delete-block-document-confirmation-dialog-GjNhFxZe.js.map} +1 -1
  188. prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-D4yWonR8.js → use-flow-runs-selected-rows-DfwmswyR.js} +2 -2
  189. prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-D4yWonR8.js.map → use-flow-runs-selected-rows-DfwmswyR.js.map} +1 -1
  190. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DZeBiVd9.js → use-get-artifacts-flow-task-runs-BEBpG_5J.js} +2 -2
  191. prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DZeBiVd9.js.map → use-get-artifacts-flow-task-runs-BEBpG_5J.js.map} +1 -1
  192. prefect/server/ui-v2/assets/{use-quick-run-BxAMqZDM.js → use-quick-run-BYBRcDwC.js} +2 -2
  193. prefect/server/ui-v2/assets/{use-quick-run-BxAMqZDM.js.map → use-quick-run-BYBRcDwC.js.map} +1 -1
  194. prefect/server/ui-v2/assets/{use-stepper-T3wAKNvM.js → use-stepper-Bk97vOTm.js} +2 -2
  195. prefect/server/ui-v2/assets/{use-stepper-T3wAKNvM.js.map → use-stepper-Bk97vOTm.js.map} +1 -1
  196. prefect/server/ui-v2/assets/{utilities-B2JMf8iI.js → utilities-BQwGFLk5.js} +2 -2
  197. prefect/server/ui-v2/assets/{utilities-B2JMf8iI.js.map → utilities-BQwGFLk5.js.map} +1 -1
  198. prefect/server/ui-v2/assets/{work-pool-filter-CZz0AJlt.js → work-pool-filter-Ddhp_M-L.js} +2 -2
  199. prefect/server/ui-v2/assets/{work-pool-filter-CZz0AJlt.js.map → work-pool-filter-Ddhp_M-L.js.map} +1 -1
  200. prefect/server/ui-v2/assets/work-pool-queue-toggle-DX3eV3R_.js +2 -0
  201. prefect/server/ui-v2/assets/{work-pool-queue-toggle-D4eeo-hi.js.map → work-pool-queue-toggle-DX3eV3R_.js.map} +1 -1
  202. prefect/server/ui-v2/assets/{work-pool._workPoolName-DrWddu9K.js → work-pool._workPoolName-BaRIsXBX.js} +2 -2
  203. prefect/server/ui-v2/assets/{work-pool._workPoolName-DrWddu9K.js.map → work-pool._workPoolName-BaRIsXBX.js.map} +1 -1
  204. prefect/server/ui-v2/assets/work-pool_._workPoolName.edit-dhS_Xz32.js +2 -0
  205. prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-CA0ePjCk.js.map → work-pool_._workPoolName.edit-dhS_Xz32.js.map} +1 -1
  206. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-DpUnE86v.js → work-pool_._workPoolName.queue._workQueueName-BlstL9Se.js} +2 -2
  207. prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-DpUnE86v.js.map → work-pool_._workPoolName.queue._workQueueName-BlstL9Se.js.map} +1 -1
  208. prefect/server/ui-v2/assets/{work-queue-icon-text-BjiA7vAW.js → work-queue-icon-text-_Ez8e2dw.js} +2 -2
  209. prefect/server/ui-v2/assets/{work-queue-icon-text-BjiA7vAW.js.map → work-queue-icon-text-_Ez8e2dw.js.map} +1 -1
  210. prefect/server/ui-v2/index.html +2 -2
  211. prefect/settings/models/flows.py +14 -1
  212. prefect/settings/models/runner.py +16 -6
  213. prefect/task_engine.py +17 -3
  214. prefect/task_worker.py +99 -17
  215. prefect/tasks.py +2 -2
  216. prefect/testing/fixtures.py +41 -6
  217. {prefect-3.6.12.dist-info → prefect-3.6.13.dist-info}/METADATA +1 -1
  218. {prefect-3.6.12.dist-info → prefect-3.6.13.dist-info}/RECORD +221 -220
  219. prefect/server/ui-v2/assets/automation._id-IHh5QJwE.js +0 -2
  220. prefect/server/ui-v2/assets/block-type-logo-B31LJm5H.js +0 -2
  221. prefect/server/ui-v2/assets/block_._id.edit-CIhIBJrm.js +0 -2
  222. prefect/server/ui-v2/assets/catalog-CfniU0UV.js +0 -2
  223. prefect/server/ui-v2/assets/catalog_._slug-C9p86T4s.js +0 -2
  224. prefect/server/ui-v2/assets/catalog_._slug_.create-BhSunL__.js +0 -2
  225. prefect/server/ui-v2/assets/delete-confirmation-dialog-COdZmNfa.js +0 -2
  226. prefect/server/ui-v2/assets/deployment._id-DVmqclRz.js +0 -2
  227. prefect/server/ui-v2/assets/deployment_._id.duplicate-DVMjpk5m.js +0 -2
  228. prefect/server/ui-v2/assets/deployment_._id.edit-Ck_P6KDn.js +0 -2
  229. prefect/server/ui-v2/assets/flow-run-graph-CfoPEAgQ.js +0 -2
  230. prefect/server/ui-v2/assets/flow-run-graph-CfoPEAgQ.js.map +0 -1
  231. prefect/server/ui-v2/assets/flow-run._id-C-qxwEBp.js +0 -4
  232. prefect/server/ui-v2/assets/flow-run._id-C-qxwEBp.js.map +0 -1
  233. prefect/server/ui-v2/assets/flow-run._id-OL0YhyLW.js +0 -2
  234. prefect/server/ui-v2/assets/flow-runs-pagination-DnwkJapB.js +0 -2
  235. prefect/server/ui-v2/assets/flow-runs-pagination-DnwkJapB.js.map +0 -1
  236. prefect/server/ui-v2/assets/flow._id-DhrCicwR.js +0 -2
  237. prefect/server/ui-v2/assets/index-7-r4ia_S.js +0 -2
  238. prefect/server/ui-v2/assets/index-7ThYp9SY.js +0 -2
  239. prefect/server/ui-v2/assets/index-B7zHzWQW.css +0 -1
  240. prefect/server/ui-v2/assets/index-B_3f8Hcb.js +0 -2
  241. prefect/server/ui-v2/assets/index-BiCd-Iuz.js +0 -2
  242. prefect/server/ui-v2/assets/index-BiCd-Iuz.js.map +0 -1
  243. prefect/server/ui-v2/assets/index-CT_nG86y.js +0 -2
  244. prefect/server/ui-v2/assets/index-Cs8eFQKw.js +0 -2
  245. prefect/server/ui-v2/assets/index-H6bwm6L6.js +0 -2
  246. prefect/server/ui-v2/assets/index-WYPZo52S.js +0 -17
  247. prefect/server/ui-v2/assets/index-WYPZo52S.js.map +0 -1
  248. prefect/server/ui-v2/assets/index-qPlIYf3i.js +0 -2
  249. prefect/server/ui-v2/assets/route-error-state-ALftyvGl.js +0 -2
  250. prefect/server/ui-v2/assets/settings-BL0X8cDU.js +0 -2
  251. prefect/server/ui-v2/assets/settings-BL0X8cDU.js.map +0 -1
  252. prefect/server/ui-v2/assets/table-CEAx-qHs.js +0 -2
  253. prefect/server/ui-v2/assets/table-CEAx-qHs.js.map +0 -1
  254. prefect/server/ui-v2/assets/tags-input-D1RJZEUA.js +0 -2
  255. prefect/server/ui-v2/assets/tags-input-D1RJZEUA.js.map +0 -1
  256. prefect/server/ui-v2/assets/task-run-concurrency-limits-reset-dialog-CG3den1B.js +0 -2
  257. prefect/server/ui-v2/assets/task-run._id-CnIVqU6v.js +0 -2
  258. prefect/server/ui-v2/assets/task-runs-pagination-DLSAz-Ur.js +0 -2
  259. prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-Bzy2ML2T.js +0 -2
  260. prefect/server/ui-v2/assets/use-local-storage-CpxMp5wR.js +0 -2
  261. prefect/server/ui-v2/assets/use-local-storage-CpxMp5wR.js.map +0 -1
  262. prefect/server/ui-v2/assets/work-pool-queue-toggle-D4eeo-hi.js +0 -2
  263. prefect/server/ui-v2/assets/work-pool_._workPoolName.edit-CA0ePjCk.js +0 -2
  264. {prefect-3.6.12.dist-info → prefect-3.6.13.dist-info}/WHEEL +0 -0
  265. {prefect-3.6.12.dist-info → prefect-3.6.13.dist-info}/entry_points.txt +0 -0
  266. {prefect-3.6.12.dist-info → prefect-3.6.13.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,2 @@
1
+ import{j as e,p as n}from"./vendor-tanstack-BK8oseNA.js";import{u as i,S as m,a as x,b as h,c as p,d as u,e as g,f as j,B as v,g as b,h as f,L as N,z as S,i as t,I as l,j as y,k as C}from"./index-D5RdrxkU.js";import{R as M,a as c}from"./radio-group-BBMLpHGc.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-CznP1SOq.js";import"./vendor-recharts-D4imLXNl.js";import"./vendor-forms-DxqqmhL5.js";import"./vendor-date-7GxEwcQM.js";const w=["completed","running","scheduled","pending","failed","cancelled","cancelling","crashed","paused"];function k(s){return`color-mode-${s}`}const o=({mode:s})=>e.jsxs("div",{className:`flex items-center justify-between gap-2 w-full ${k(s)}`,children:[e.jsx("span",{children:j(s)}),e.jsx("div",{className:"flex items-center gap-1",children:w.map(r=>e.jsx(T,{state:r},r))})]}),T=({state:s})=>{const r={completed:"bg-[var(--state-completed-500)]",running:"bg-[var(--state-running-500)]",scheduled:"bg-[var(--state-scheduled-500)]",pending:"bg-[var(--state-pending-500)]",failed:"bg-[var(--state-failed-500)]",cancelled:"bg-[var(--state-cancelled-500)]",cancelling:"bg-[var(--state-cancelling-500)]",crashed:"bg-[var(--state-crashed-500)]",paused:"bg-[var(--state-paused-500)]"};return e.jsx("span",{className:`w-4 h-4 rounded-full ${r[s]}`})},F=()=>{const{colorMode:s,setColorMode:r,colorModes:d}=i();return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("label",{htmlFor:"color-mode-select",children:"Color Mode"}),e.jsxs(m,{value:s,onValueChange:a=>r(a),children:[e.jsx(x,{className:"w-96",id:"color-mode-select",children:e.jsx(h,{placeholder:"Select a color mode",children:e.jsx(o,{mode:s})})}),e.jsx(p,{children:e.jsx(u,{children:d.map(a=>e.jsx(g,{value:a,children:e.jsx(o,{mode:a})},a))})})]})]})},I=({version:s})=>e.jsxs("div",{className:"flex justify-between items-center",children:[e.jsx(v,{children:e.jsx(b,{children:e.jsx(f,{className:"text-xl font-semibold",children:"Settings"})})}),e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("div",{className:"text-xs text-muted-foreground",children:"Version"}),e.jsx("div",{className:"text-xs",children:s})]})]}),L=({settings:s})=>e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("label",{htmlFor:"server-settings",children:"Server Settings"}),e.jsx(N,{id:"server-settings",className:"p-2 rounded-sm",value:JSON.stringify(s,null,2),disabled:!0,hideLineNumbers:!0})]}),G=()=>{const{theme:s,setTheme:r}=S();return e.jsxs("div",{className:"flex flex-col gap-1",children:[e.jsx("label",{htmlFor:"color-mode-select",children:"Theme"}),e.jsx("div",{className:"space-y-3",children:e.jsxs(M,{value:s,onValueChange:r,className:"grid grid-cols-3 gap-4",children:[e.jsxs("div",{children:[e.jsx(c,{value:"light",id:"light",className:"peer sr-only"}),e.jsxs(t,{htmlFor:"light",className:"flex items-center space-x-2 rounded-md border-2 border-muted bg-popover p-4 hover:bg-accent hover:text-accent-foreground peer-data-[state=checked]:border-primary cursor-pointer",children:[e.jsx(l,{id:"Sun",className:"h-6 w-6"}),e.jsx("span",{children:"Light"})]})]}),e.jsxs("div",{children:[e.jsx(c,{value:"dark",id:"dark",className:"peer sr-only"}),e.jsxs(t,{htmlFor:"dark",className:"flex items-center space-x-2 rounded-md border-2 border-muted bg-popover p-4 hover:bg-accent hover:text-accent-foreground peer-data-[state=checked]:border-primary cursor-pointer",children:[e.jsx(l,{id:"Moon",className:"h-6 w-6"}),e.jsx("span",{children:"Dark"})]})]}),e.jsxs("div",{children:[e.jsx(c,{value:"system",id:"system",className:"peer sr-only"}),e.jsxs(t,{htmlFor:"system",className:"flex items-center space-x-2 rounded-md border-2 border-muted bg-popover p-4 hover:bg-accent hover:text-accent-foreground peer-data-[state=checked]:border-primary cursor-pointer",children:[e.jsx(l,{id:"Monitor",className:"h-6 w-6"}),e.jsx("span",{children:"System"})]})]})]})})]})},V=()=>{const{data:s}=n(y()),{data:r}=n(C());return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx(I,{version:r}),e.jsx(G,{}),e.jsx(F,{}),e.jsx(L,{settings:s})]})},O=V;export{O as component};
2
+ //# sourceMappingURL=settings-txD0dR5Q.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-txD0dR5Q.js","sources":["../../src/components/settings/color-mode-select.tsx","../../src/components/settings/heading.tsx","../../src/components/settings/server-settings.tsx","../../src/components/settings/theme-switch.tsx","../../src/components/settings/settings-page.tsx","../../src/routes/settings.tsx?tsr-split=component"],"sourcesContent":["import {\n\tSelect,\n\tSelectContent,\n\tSelectGroup,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport { type ColorMode, useColorMode } from \"@/hooks/use-color-mode\";\nimport { capitalize } from \"@/utils\";\n\nconst STATE_TYPES = [\n\t\"completed\",\n\t\"running\",\n\t\"scheduled\",\n\t\"pending\",\n\t\"failed\",\n\t\"cancelled\",\n\t\"cancelling\",\n\t\"crashed\",\n\t\"paused\",\n] as const;\n\ntype StateType = (typeof STATE_TYPES)[number];\n\nfunction getColorModeClass(mode: ColorMode): string {\n\treturn `color-mode-${mode}`;\n}\n\ntype ColorModeOptionProps = {\n\tmode: ColorMode;\n};\n\nconst ColorModeOption = ({ mode }: ColorModeOptionProps) => {\n\treturn (\n\t\t<div\n\t\t\tclassName={`flex items-center justify-between gap-2 w-full ${getColorModeClass(mode)}`}\n\t\t>\n\t\t\t<span>{capitalize(mode)}</span>\n\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t{STATE_TYPES.map((state) => (\n\t\t\t\t\t<StateColorCircle key={state} state={state} />\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\ntype StateColorCircleProps = {\n\tstate: StateType;\n};\n\nconst StateColorCircle = ({ state }: StateColorCircleProps) => {\n\tconst stateColorMap: Record<StateType, string> = {\n\t\tcompleted: \"bg-[var(--state-completed-500)]\",\n\t\trunning: \"bg-[var(--state-running-500)]\",\n\t\tscheduled: \"bg-[var(--state-scheduled-500)]\",\n\t\tpending: \"bg-[var(--state-pending-500)]\",\n\t\tfailed: \"bg-[var(--state-failed-500)]\",\n\t\tcancelled: \"bg-[var(--state-cancelled-500)]\",\n\t\tcancelling: \"bg-[var(--state-cancelling-500)]\",\n\t\tcrashed: \"bg-[var(--state-crashed-500)]\",\n\t\tpaused: \"bg-[var(--state-paused-500)]\",\n\t};\n\n\treturn <span className={`w-4 h-4 rounded-full ${stateColorMap[state]}`} />;\n};\n\nexport const ColorModeSelect = () => {\n\tconst { colorMode, setColorMode, colorModes } = useColorMode();\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t<label htmlFor=\"color-mode-select\">Color Mode</label>\n\t\t\t<Select\n\t\t\t\tvalue={colorMode}\n\t\t\t\tonValueChange={(value: ColorMode) => setColorMode(value)}\n\t\t\t>\n\t\t\t\t<SelectTrigger className=\"w-96\" id=\"color-mode-select\">\n\t\t\t\t\t<SelectValue placeholder=\"Select a color mode\">\n\t\t\t\t\t\t<ColorModeOption mode={colorMode} />\n\t\t\t\t\t</SelectValue>\n\t\t\t\t</SelectTrigger>\n\t\t\t\t<SelectContent>\n\t\t\t\t\t<SelectGroup>\n\t\t\t\t\t\t{colorModes.map((mode) => (\n\t\t\t\t\t\t\t<SelectItem key={mode} value={mode}>\n\t\t\t\t\t\t\t\t<ColorModeOption mode={mode} />\n\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</SelectGroup>\n\t\t\t\t</SelectContent>\n\t\t\t</Select>\n\t\t</div>\n\t);\n};\n","import {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbList,\n} from \"@/components/ui/breadcrumb\";\n\ntype HeadingProps = {\n\tversion: string;\n};\n\nexport const Heading = ({ version }: HeadingProps) => {\n\treturn (\n\t\t<div className=\"flex justify-between items-center\">\n\t\t\t<Breadcrumb>\n\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t<BreadcrumbItem className=\"text-xl font-semibold\">\n\t\t\t\t\t\tSettings\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t\t<div className=\"text-xs text-muted-foreground\">Version</div>\n\t\t\t\t<div className=\"text-xs\">{version}</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { LazyJsonInput as JsonInput } from \"@/components/ui/json-input-lazy\";\n\ntype ServerSettingsProps = {\n\tsettings: Record<string, unknown>;\n};\n\nexport const ServerSettings = ({ settings }: ServerSettingsProps) => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t<label htmlFor=\"server-settings\">Server Settings</label>\n\t\t\t<JsonInput\n\t\t\t\tid=\"server-settings\"\n\t\t\t\tclassName=\"p-2 rounded-sm\"\n\t\t\t\tvalue={JSON.stringify(settings, null, 2)}\n\t\t\t\tdisabled\n\t\t\t\thideLineNumbers\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","import { useTheme } from \"next-themes\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { Label } from \"@/components/ui/label\";\nimport { RadioGroup, RadioGroupItem } from \"@/components/ui/radio-group\";\n\nexport const ThemeSwitch = () => {\n\tconst { theme, setTheme } = useTheme();\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-1\">\n\t\t\t<label htmlFor=\"color-mode-select\">Theme</label>\n\t\t\t<div className=\"space-y-3\">\n\t\t\t\t<RadioGroup\n\t\t\t\t\tvalue={theme}\n\t\t\t\t\tonValueChange={setTheme}\n\t\t\t\t\tclassName=\"grid grid-cols-3 gap-4\"\n\t\t\t\t>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<RadioGroupItem value=\"light\" id=\"light\" className=\"peer sr-only\" />\n\t\t\t\t\t\t<Label\n\t\t\t\t\t\t\thtmlFor=\"light\"\n\t\t\t\t\t\t\tclassName=\"flex items-center space-x-2 rounded-md border-2 border-muted bg-popover p-4 hover:bg-accent hover:text-accent-foreground peer-data-[state=checked]:border-primary cursor-pointer\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon id=\"Sun\" className=\"h-6 w-6\" />\n\t\t\t\t\t\t\t<span>Light</span>\n\t\t\t\t\t\t</Label>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<RadioGroupItem value=\"dark\" id=\"dark\" className=\"peer sr-only\" />\n\t\t\t\t\t\t<Label\n\t\t\t\t\t\t\thtmlFor=\"dark\"\n\t\t\t\t\t\t\tclassName=\"flex items-center space-x-2 rounded-md border-2 border-muted bg-popover p-4 hover:bg-accent hover:text-accent-foreground peer-data-[state=checked]:border-primary cursor-pointer\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon id=\"Moon\" className=\"h-6 w-6\" />\n\t\t\t\t\t\t\t<span>Dark</span>\n\t\t\t\t\t\t</Label>\n\t\t\t\t\t</div>\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<RadioGroupItem\n\t\t\t\t\t\t\tvalue=\"system\"\n\t\t\t\t\t\t\tid=\"system\"\n\t\t\t\t\t\t\tclassName=\"peer sr-only\"\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<Label\n\t\t\t\t\t\t\thtmlFor=\"system\"\n\t\t\t\t\t\t\tclassName=\"flex items-center space-x-2 rounded-md border-2 border-muted bg-popover p-4 hover:bg-accent hover:text-accent-foreground peer-data-[state=checked]:border-primary cursor-pointer\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon id=\"Monitor\" className=\"h-6 w-6\" />\n\t\t\t\t\t\t\t<span>System</span>\n\t\t\t\t\t\t</Label>\n\t\t\t\t\t</div>\n\t\t\t\t</RadioGroup>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { buildGetSettingsQuery, buildGetVersionQuery } from \"@/api/admin\";\n\nimport { ColorModeSelect } from \"./color-mode-select\";\nimport { Heading } from \"./heading\";\nimport { ServerSettings } from \"./server-settings\";\nimport { ThemeSwitch } from \"./theme-switch\";\n\nexport const SettingsPage = () => {\n\tconst { data: settingsData } = useSuspenseQuery(buildGetSettingsQuery());\n\tconst { data: versionData } = useSuspenseQuery(buildGetVersionQuery());\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<Heading version={versionData} />\n\t\t\t<ThemeSwitch />\n\t\t\t<ColorModeSelect />\n\t\t\t{/** nb: open API needs to update schema */}\n\t\t\t<ServerSettings settings={settingsData as Record<string, unknown>} />\n\t\t</div>\n\t);\n};\n","import { createFileRoute } from \"@tanstack/react-router\";\nimport { buildGetSettingsQuery, buildGetVersionQuery } from \"@/api/admin\";\nimport { SettingsPage } from \"@/components/settings/settings-page\";\n\nexport const Route = createFileRoute(\"/settings\")({\n\tcomponent: SettingsPage,\n\tloader: ({ context }) =>\n\t\tPromise.all([\n\t\t\tcontext.queryClient.ensureQueryData(buildGetSettingsQuery()),\n\t\t\tcontext.queryClient.ensureQueryData(buildGetVersionQuery()),\n\t\t]),\n\twrapInSuspense: true,\n});\n"],"names":["STATE_TYPES","getColorModeClass","mode","ColorModeOption","jsxs","jsx","capitalize","state","StateColorCircle","stateColorMap","ColorModeSelect","colorMode","setColorMode","colorModes","useColorMode","Select","value","SelectTrigger","SelectValue","SelectContent","SelectGroup","SelectItem","Heading","version","Breadcrumb","BreadcrumbList","BreadcrumbItem","ServerSettings","settings","JsonInput","ThemeSwitch","theme","setTheme","useTheme","RadioGroup","RadioGroupItem","Label","Icon","SettingsPage","settingsData","useSuspenseQuery","buildGetSettingsQuery","versionData","buildGetVersionQuery","SplitComponent"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- import{j as e}from"./vendor-tanstack-BK8oseNA.js";import{S as a,a as o,b as c,c as n,e as l}from"./index-WYPZo52S.js";const d=({defaultValue:s,value:t,onSelect:r})=>e.jsxs(a,{defaultValue:s,value:t,onValueChange:r,children:[e.jsx(o,{"aria-label":"Flow run sort order",className:"w-full",children:e.jsx(c,{placeholder:"Sort by"})}),e.jsxs(n,{children:[e.jsx(l,{value:"START_TIME_DESC",children:"Newest to oldest"}),e.jsx(l,{value:"START_TIME_ASC",children:"Oldest to newest"}),e.jsx(l,{value:"NAME_ASC",children:"A to Z"}),e.jsx(l,{value:"NAME_DESC",children:"Z to A"})]})]});export{d as S};
2
- //# sourceMappingURL=sort-filter-BD4vwJXt.js.map
1
+ import{j as e}from"./vendor-tanstack-BK8oseNA.js";import{S as a,a as o,b as c,c as n,e as l}from"./index-D5RdrxkU.js";const d=({defaultValue:s,value:t,onSelect:r})=>e.jsxs(a,{defaultValue:s,value:t,onValueChange:r,children:[e.jsx(o,{"aria-label":"Flow run sort order",className:"w-full",children:e.jsx(c,{placeholder:"Sort by"})}),e.jsxs(n,{children:[e.jsx(l,{value:"START_TIME_DESC",children:"Newest to oldest"}),e.jsx(l,{value:"START_TIME_ASC",children:"Oldest to newest"}),e.jsx(l,{value:"NAME_ASC",children:"A to Z"}),e.jsx(l,{value:"NAME_DESC",children:"Z to A"})]})]});export{d as S};
2
+ //# sourceMappingURL=sort-filter-DHPFdKZ2.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sort-filter-BD4vwJXt.js","sources":["../../src/components/flow-runs/flow-runs-list/flow-runs-filters/sort-filter.tsx"],"sourcesContent":["import {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport type { SortFilters } from \"./sort-filter.constants\";\n\ntype SortFilterProps = {\n\tdefaultValue?: SortFilters;\n\tonSelect: (filter: SortFilters) => void;\n\tvalue: undefined | SortFilters;\n};\n\nexport const SortFilter = ({\n\tdefaultValue,\n\tvalue,\n\tonSelect,\n}: SortFilterProps) => {\n\treturn (\n\t\t<Select defaultValue={defaultValue} value={value} onValueChange={onSelect}>\n\t\t\t<SelectTrigger aria-label=\"Flow run sort order\" className=\"w-full\">\n\t\t\t\t<SelectValue placeholder=\"Sort by\" />\n\t\t\t</SelectTrigger>\n\t\t\t<SelectContent>\n\t\t\t\t<SelectItem value=\"START_TIME_DESC\">Newest to oldest</SelectItem>\n\t\t\t\t<SelectItem value=\"START_TIME_ASC\">Oldest to newest</SelectItem>\n\t\t\t\t<SelectItem value=\"NAME_ASC\">A to Z</SelectItem>\n\t\t\t\t<SelectItem value=\"NAME_DESC\">Z to A</SelectItem>\n\t\t\t</SelectContent>\n\t\t</Select>\n\t);\n};\n"],"names":["SortFilter","defaultValue","value","onSelect","jsxs","Select","jsx","SelectTrigger","SelectValue","SelectContent","SelectItem"],"mappings":"sHAeO,MAAMA,EAAa,CAAC,CAC1B,aAAAC,EACA,MAAAC,EACA,SAAAC,CACD,IAEEC,EAAAA,KAACC,EAAA,CAAO,aAAAJ,EAA4B,MAAAC,EAAc,cAAeC,EAChE,SAAA,CAAAG,EAAAA,IAACC,EAAA,CAAc,aAAW,sBAAsB,UAAU,SACzD,SAAAD,EAAAA,IAACE,EAAA,CAAY,YAAY,SAAA,CAAU,CAAA,CACpC,SACCC,EAAA,CACA,SAAA,CAAAH,EAAAA,IAACI,EAAA,CAAW,MAAM,kBAAkB,SAAA,mBAAgB,EACpDJ,EAAAA,IAACI,EAAA,CAAW,MAAM,iBAAiB,SAAA,mBAAgB,EACnDJ,EAAAA,IAACI,EAAA,CAAW,MAAM,WAAW,SAAA,SAAM,EACnCJ,EAAAA,IAACI,EAAA,CAAW,MAAM,YAAY,SAAA,QAAA,CAAM,CAAA,CAAA,CACrC,CAAA,EACD"}
1
+ {"version":3,"file":"sort-filter-DHPFdKZ2.js","sources":["../../src/components/flow-runs/flow-runs-list/flow-runs-filters/sort-filter.tsx"],"sourcesContent":["import {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\nimport type { SortFilters } from \"./sort-filter.constants\";\n\ntype SortFilterProps = {\n\tdefaultValue?: SortFilters;\n\tonSelect: (filter: SortFilters) => void;\n\tvalue: undefined | SortFilters;\n};\n\nexport const SortFilter = ({\n\tdefaultValue,\n\tvalue,\n\tonSelect,\n}: SortFilterProps) => {\n\treturn (\n\t\t<Select defaultValue={defaultValue} value={value} onValueChange={onSelect}>\n\t\t\t<SelectTrigger aria-label=\"Flow run sort order\" className=\"w-full\">\n\t\t\t\t<SelectValue placeholder=\"Sort by\" />\n\t\t\t</SelectTrigger>\n\t\t\t<SelectContent>\n\t\t\t\t<SelectItem value=\"START_TIME_DESC\">Newest to oldest</SelectItem>\n\t\t\t\t<SelectItem value=\"START_TIME_ASC\">Oldest to newest</SelectItem>\n\t\t\t\t<SelectItem value=\"NAME_ASC\">A to Z</SelectItem>\n\t\t\t\t<SelectItem value=\"NAME_DESC\">Z to A</SelectItem>\n\t\t\t</SelectContent>\n\t\t</Select>\n\t);\n};\n"],"names":["SortFilter","defaultValue","value","onSelect","jsxs","Select","jsx","SelectTrigger","SelectValue","SelectContent","SelectItem"],"mappings":"sHAeO,MAAMA,EAAa,CAAC,CAC1B,aAAAC,EACA,MAAAC,EACA,SAAAC,CACD,IAEEC,EAAAA,KAACC,EAAA,CAAO,aAAAJ,EAA4B,MAAAC,EAAc,cAAeC,EAChE,SAAA,CAAAG,EAAAA,IAACC,EAAA,CAAc,aAAW,sBAAsB,UAAU,SACzD,SAAAD,EAAAA,IAACE,EAAA,CAAY,YAAY,SAAA,CAAU,CAAA,CACpC,SACCC,EAAA,CACA,SAAA,CAAAH,EAAAA,IAACI,EAAA,CAAW,MAAM,kBAAkB,SAAA,mBAAgB,EACpDJ,EAAAA,IAACI,EAAA,CAAW,MAAM,iBAAiB,SAAA,mBAAgB,EACnDJ,EAAAA,IAACI,EAAA,CAAW,MAAM,WAAW,SAAA,SAAM,EACnCJ,EAAAA,IAACI,EAAA,CAAW,MAAM,YAAY,SAAA,QAAA,CAAM,CAAA,CAAA,CACrC,CAAA,EACD"}
@@ -0,0 +1,2 @@
1
+ const t={COMPLETED:"#219D4B",FAILED:"#DE0529",RUNNING:"#09439B",CANCELLED:"#333333",CANCELLING:"#334863",CRASHED:"#EA580C",PAUSED:"#726576",PENDING:"#8E8093",SCHEDULED:"#E08504"};function C(e,o=600){if(typeof document>"u")return t[e];const E=`--state-${e.toLowerCase()}-${o}`;return getComputedStyle(document.documentElement).getPropertyValue(E).trim()||t[e]}export{t as S,C as g};
2
+ //# sourceMappingURL=state-colors-CAAf0Eg3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-colors-CAAf0Eg3.js","sources":["../../src/utils/state-colors.ts"],"sourcesContent":["import type { components } from \"@/api/prefect\";\n\nexport type StateType = components[\"schemas\"][\"StateType\"];\n\n/**\n * Default state colors (matches CSS variable defaults).\n * Used as fallback and for chart libraries that need hex values at initialization.\n */\nexport const STATE_COLORS: Record<StateType, string> = {\n\tCOMPLETED: \"#219D4B\",\n\tFAILED: \"#DE0529\",\n\tRUNNING: \"#09439B\",\n\tCANCELLED: \"#333333\",\n\tCANCELLING: \"#334863\",\n\tCRASHED: \"#EA580C\",\n\tPAUSED: \"#726576\",\n\tPENDING: \"#8E8093\",\n\tSCHEDULED: \"#E08504\",\n};\n\n/**\n * Gets the computed state color from CSS variables.\n * Useful for canvas/chart libraries that need hex values.\n * Falls back to default colors if CSS variables are not loaded.\n */\nexport function getStateColor(state: StateType, shade = 600): string {\n\tif (typeof document === \"undefined\") {\n\t\treturn STATE_COLORS[state];\n\t}\n\tconst cssVar = `--state-${state.toLowerCase()}-${shade}`;\n\tconst computed = getComputedStyle(document.documentElement)\n\t\t.getPropertyValue(cssVar)\n\t\t.trim();\n\treturn computed || STATE_COLORS[state];\n}\n\n/**\n * Gets all state colors for chart initialization.\n * Call this after component mounts to get current color mode values.\n */\nexport function getAllStateColors(shade = 600): Record<StateType, string> {\n\tconst states: StateType[] = [\n\t\t\"COMPLETED\",\n\t\t\"FAILED\",\n\t\t\"RUNNING\",\n\t\t\"CANCELLED\",\n\t\t\"CANCELLING\",\n\t\t\"CRASHED\",\n\t\t\"PAUSED\",\n\t\t\"PENDING\",\n\t\t\"SCHEDULED\",\n\t];\n\treturn Object.fromEntries(\n\t\tstates.map((state) => [state, getStateColor(state, shade)]),\n\t) as Record<StateType, string>;\n}\n"],"names":["STATE_COLORS","getStateColor","state","shade","cssVar"],"mappings":"AAQO,MAAMA,EAA0C,CACtD,UAAW,UACX,OAAQ,UACR,QAAS,UACT,UAAW,UACX,WAAY,UACZ,QAAS,UACT,OAAQ,UACR,QAAS,UACT,UAAW,SACZ,EAOO,SAASC,EAAcC,EAAkBC,EAAQ,IAAa,CACpE,GAAI,OAAO,SAAa,IACvB,OAAOH,EAAaE,CAAK,EAE1B,MAAME,EAAS,WAAWF,EAAM,aAAa,IAAIC,CAAK,GAItD,OAHiB,iBAAiB,SAAS,eAAe,EACxD,iBAAiBC,CAAM,EACvB,KAAA,GACiBJ,EAAaE,CAAK,CACtC"}
@@ -0,0 +1,2 @@
1
+ import{j as t}from"./vendor-tanstack-BK8oseNA.js";import{aW as l}from"./index-D5RdrxkU.js";function s({className:a,...e}){return t.jsx("div",{"data-slot":"table-container",className:"relative w-full overflow-x-auto",children:t.jsx("table",{"data-slot":"table",className:l("w-full caption-bottom text-sm",a),...e})})}function d({className:a,...e}){return t.jsx("thead",{"data-slot":"table-header",className:l("[&_tr]:border-b",a),...e})}function n({className:a,...e}){return t.jsx("tbody",{"data-slot":"table-body",className:l("[&_tr:last-child]:border-0",a),...e})}function c({className:a,...e}){return t.jsx("tr",{"data-slot":"table-row",className:l("bg-card dark:bg-background hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors",a),...e})}function b({className:a,...e}){return t.jsx("th",{"data-slot":"table-head",className:l("text-muted-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",a),...e})}function i({className:a,...e}){return t.jsx("td",{"data-slot":"table-cell",className:l("p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]",a),...e})}export{s as T,d as a,c as b,b as c,n as d,i as e};
2
+ //# sourceMappingURL=table-ULfpXJXB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-ULfpXJXB.js","sources":["../../src/components/ui/table.tsx"],"sourcesContent":["import type * as React from \"react\";\n\nimport { cn } from \"@/utils\";\n\nfunction Table({ className, ...props }: React.ComponentProps<\"table\">) {\n\treturn (\n\t\t<div\n\t\t\tdata-slot=\"table-container\"\n\t\t\tclassName=\"relative w-full overflow-x-auto\"\n\t\t>\n\t\t\t<table\n\t\t\t\tdata-slot=\"table\"\n\t\t\t\tclassName={cn(\"w-full caption-bottom text-sm\", className)}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n\nfunction TableHeader({ className, ...props }: React.ComponentProps<\"thead\">) {\n\treturn (\n\t\t<thead\n\t\t\tdata-slot=\"table-header\"\n\t\t\tclassName={cn(\"[&_tr]:border-b\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction TableBody({ className, ...props }: React.ComponentProps<\"tbody\">) {\n\treturn (\n\t\t<tbody\n\t\t\tdata-slot=\"table-body\"\n\t\t\tclassName={cn(\"[&_tr:last-child]:border-0\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction TableFooter({ className, ...props }: React.ComponentProps<\"tfoot\">) {\n\treturn (\n\t\t<tfoot\n\t\t\tdata-slot=\"table-footer\"\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-muted/50 border-t font-medium [&>tr]:last:border-b-0\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction TableRow({ className, ...props }: React.ComponentProps<\"tr\">) {\n\treturn (\n\t\t<tr\n\t\t\tdata-slot=\"table-row\"\n\t\t\tclassName={cn(\n\t\t\t\t\"bg-card dark:bg-background hover:bg-muted/50 data-[state=selected]:bg-muted border-b transition-colors\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction TableHead({ className, ...props }: React.ComponentProps<\"th\">) {\n\treturn (\n\t\t<th\n\t\t\tdata-slot=\"table-head\"\n\t\t\tclassName={cn(\n\t\t\t\t\"text-muted-foreground h-10 px-2 text-left align-middle font-medium whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction TableCell({ className, ...props }: React.ComponentProps<\"td\">) {\n\treturn (\n\t\t<td\n\t\t\tdata-slot=\"table-cell\"\n\t\t\tclassName={cn(\n\t\t\t\t\"p-2 align-middle whitespace-nowrap [&:has([role=checkbox])]:pr-0 [&>[role=checkbox]]:translate-y-[2px]\",\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nfunction TableCaption({\n\tclassName,\n\t...props\n}: React.ComponentProps<\"caption\">) {\n\treturn (\n\t\t<caption\n\t\t\tdata-slot=\"table-caption\"\n\t\t\tclassName={cn(\"text-muted-foreground mt-4 text-sm\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport {\n\tTable,\n\tTableHeader,\n\tTableBody,\n\tTableFooter,\n\tTableHead,\n\tTableRow,\n\tTableCell,\n\tTableCaption,\n};\n"],"names":["Table","className","props","jsx","cn","TableHeader","TableBody","TableRow","TableHead","TableCell"],"mappings":"2FAIA,SAASA,EAAM,CAAE,UAAAC,EAAW,GAAGC,GAAwC,CACtE,OACCC,EAAAA,IAAC,MAAA,CACA,YAAU,kBACV,UAAU,kCAEV,SAAAA,EAAAA,IAAC,QAAA,CACA,YAAU,QACV,UAAWC,EAAG,gCAAiCH,CAAS,EACvD,GAAGC,CAAA,CAAA,CACL,CAAA,CAGH,CAEA,SAASG,EAAY,CAAE,UAAAJ,EAAW,GAAGC,GAAwC,CAC5E,OACCC,EAAAA,IAAC,QAAA,CACA,YAAU,eACV,UAAWC,EAAG,kBAAmBH,CAAS,EACzC,GAAGC,CAAA,CAAA,CAGP,CAEA,SAASI,EAAU,CAAE,UAAAL,EAAW,GAAGC,GAAwC,CAC1E,OACCC,EAAAA,IAAC,QAAA,CACA,YAAU,aACV,UAAWC,EAAG,6BAA8BH,CAAS,EACpD,GAAGC,CAAA,CAAA,CAGP,CAeA,SAASK,EAAS,CAAE,UAAAN,EAAW,GAAGC,GAAqC,CACtE,OACCC,EAAAA,IAAC,KAAA,CACA,YAAU,YACV,UAAWC,EACV,yGACAH,CAAA,EAEA,GAAGC,CAAA,CAAA,CAGP,CAEA,SAASM,EAAU,CAAE,UAAAP,EAAW,GAAGC,GAAqC,CACvE,OACCC,EAAAA,IAAC,KAAA,CACA,YAAU,aACV,UAAWC,EACV,2JACAH,CAAA,EAEA,GAAGC,CAAA,CAAA,CAGP,CAEA,SAASO,EAAU,CAAE,UAAAR,EAAW,GAAGC,GAAqC,CACvE,OACCC,EAAAA,IAAC,KAAA,CACA,YAAU,aACV,UAAWC,EACV,yGACAH,CAAA,EAEA,GAAGC,CAAA,CAAA,CAGP"}
@@ -0,0 +1,2 @@
1
+ import{r as h,j as a}from"./vendor-tanstack-BK8oseNA.js";import{X as x,p as b}from"./index-D5RdrxkU.js";const I=({onChange:r,value:t=[],onBlur:g,placeholder:o="Enter tags",...u}={})=>{const[e,i]=h.useState(""),d=n=>{i(n.target.value)},l=n=>{n.key==="Enter"&&e.trim()!==""?(n.preventDefault(),c(e.trim())):n.key==="Backspace"&&e===""&&t.length>0&&f(t.length-1)},p=n=>s=>{e.trim()!==""&&c(e.trim()),n?.(s)},c=n=>{if(!t.includes(n)){const s=[...t,n];i(""),r?.(s)}},f=n=>{const s=t.filter((w,m)=>m!==n);r?.(s)};return a.jsxs("div",{className:"flex items-center border rounded-md focus-within:ring-1 focus-within:ring-ring bg-card dark:bg-background",children:[a.jsx(x,{tags:t,onTagsChange:r,variant:"secondary"}),a.jsx(b,{type:"text",value:e,onChange:d,onKeyDown:l,onBlur:p(g),className:"grow border-none shadow-none focus-visible:ring-0 focus-visible:ring-offset-0",placeholder:o,"aria-label":o,...u})]})};export{I as T};
2
+ //# sourceMappingURL=tags-input-BLzMOTDb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tags-input-BLzMOTDb.js","sources":["../../src/components/ui/tags-input.tsx"],"sourcesContent":["import type { ChangeEvent, FocusEvent, KeyboardEvent } from \"react\";\nimport { useState } from \"react\";\nimport { Input, type InputProps } from \"@/components/ui/input\";\nimport { TagBadgeGroup } from \"./tag-badge-group\";\n\nexport type TagsInputProps = Omit<InputProps, \"onChange\" | \"value\"> & {\n\tvalue?: string[];\n\tonChange?: (tags: string[]) => void;\n\tplaceholder?: string;\n};\n\nexport const TagsInput = ({\n\tonChange,\n\tvalue = [],\n\tonBlur,\n\tplaceholder = \"Enter tags\",\n\t...props\n}: TagsInputProps = {}) => {\n\tconst [inputValue, setInputValue] = useState(\"\");\n\n\tconst handleInputChange = (e: ChangeEvent<HTMLInputElement>) => {\n\t\tsetInputValue(e.target.value);\n\t};\n\n\tconst handleInputKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n\t\tif (e.key === \"Enter\" && inputValue.trim() !== \"\") {\n\t\t\te.preventDefault();\n\t\t\taddTag(inputValue.trim());\n\t\t} else if (e.key === \"Backspace\" && inputValue === \"\" && value.length > 0) {\n\t\t\tremoveTag(value.length - 1);\n\t\t}\n\t};\n\n\tconst handleInputBlur =\n\t\t(childOnBlur?: (e: FocusEvent<HTMLInputElement>) => void) =>\n\t\t(e: FocusEvent<HTMLInputElement>) => {\n\t\t\tif (inputValue.trim() !== \"\") {\n\t\t\t\taddTag(inputValue.trim());\n\t\t\t}\n\t\t\tchildOnBlur?.(e);\n\t\t};\n\n\tconst addTag = (tag: string) => {\n\t\tif (!value.includes(tag)) {\n\t\t\tconst newTags = [...value, tag];\n\t\t\tsetInputValue(\"\");\n\t\t\tonChange?.(newTags);\n\t\t}\n\t};\n\n\tconst removeTag = (index: number) => {\n\t\tconst newTags = value.filter((_, i) => i !== index);\n\t\tonChange?.(newTags);\n\t};\n\n\treturn (\n\t\t<div className=\"flex items-center border rounded-md focus-within:ring-1 focus-within:ring-ring bg-card dark:bg-background\">\n\t\t\t<TagBadgeGroup tags={value} onTagsChange={onChange} variant=\"secondary\" />\n\t\t\t<Input\n\t\t\t\ttype=\"text\"\n\t\t\t\tvalue={inputValue}\n\t\t\t\tonChange={handleInputChange}\n\t\t\t\tonKeyDown={handleInputKeyDown}\n\t\t\t\tonBlur={handleInputBlur(onBlur)}\n\t\t\t\tclassName=\"grow border-none shadow-none focus-visible:ring-0 focus-visible:ring-offset-0\"\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\taria-label={placeholder}\n\t\t\t\t{...props}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n"],"names":["TagsInput","onChange","value","onBlur","placeholder","props","inputValue","setInputValue","useState","handleInputChange","e","handleInputKeyDown","addTag","removeTag","handleInputBlur","childOnBlur","tag","newTags","index","_","i","jsxs","jsx","TagBadgeGroup","Input"],"mappings":"wGAWO,MAAMA,EAAY,CAAC,CACzB,SAAAC,EACA,MAAAC,EAAQ,CAAA,EACR,OAAAC,EACA,YAAAC,EAAc,aACd,GAAGC,CACJ,EAAoB,KAAO,CAC1B,KAAM,CAACC,EAAYC,CAAa,EAAIC,EAAAA,SAAS,EAAE,EAEzCC,EAAqBC,GAAqC,CAC/DH,EAAcG,EAAE,OAAO,KAAK,CAC7B,EAEMC,EAAsBD,GAAuC,CAC9DA,EAAE,MAAQ,SAAWJ,EAAW,KAAA,IAAW,IAC9CI,EAAE,eAAA,EACFE,EAAON,EAAW,MAAM,GACdI,EAAE,MAAQ,aAAeJ,IAAe,IAAMJ,EAAM,OAAS,GACvEW,EAAUX,EAAM,OAAS,CAAC,CAE5B,EAEMY,EACJC,GACAL,GAAoC,CAChCJ,EAAW,KAAA,IAAW,IACzBM,EAAON,EAAW,MAAM,EAEzBS,IAAcL,CAAC,CAChB,EAEKE,EAAUI,GAAgB,CAC/B,GAAI,CAACd,EAAM,SAASc,CAAG,EAAG,CACzB,MAAMC,EAAU,CAAC,GAAGf,EAAOc,CAAG,EAC9BT,EAAc,EAAE,EAChBN,IAAWgB,CAAO,CACnB,CACD,EAEMJ,EAAaK,GAAkB,CACpC,MAAMD,EAAUf,EAAM,OAAO,CAACiB,EAAGC,IAAMA,IAAMF,CAAK,EAClDjB,IAAWgB,CAAO,CACnB,EAEA,OACCI,EAAAA,KAAC,MAAA,CAAI,UAAU,4GACd,SAAA,CAAAC,MAACC,GAAc,KAAMrB,EAAO,aAAcD,EAAU,QAAQ,YAAY,EACxEqB,EAAAA,IAACE,EAAA,CACA,KAAK,OACL,MAAOlB,EACP,SAAUG,EACV,UAAWE,EACX,OAAQG,EAAgBX,CAAM,EAC9B,UAAU,gFACV,YAAAC,EACA,aAAYA,EACX,GAAGC,CAAA,CAAA,CACL,EACD,CAEF"}
@@ -0,0 +1,2 @@
1
+ import{j as e}from"./vendor-tanstack-BK8oseNA.js";import{q as c,I as y,y as h,cT as k,_ as x,$ as g,a0 as j,a1 as m,a2 as C,a3 as D,bh as p,cU as T}from"./index-D5RdrxkU.js";import{D as R,a as w,b as L,c as v,d as u}from"./dropdown-menu-e0Fqb6aw.js";const f=({id:n,onDelete:s,onReset:r})=>{const i=o=>{navigator.clipboard.writeText(o),h.success("ID copied")};return e.jsxs(R,{children:[e.jsx(w,{asChild:!0,children:e.jsxs(c,{variant:"outline",className:"size-8 p-0",children:[e.jsx("span",{className:"sr-only",children:"Open menu"}),e.jsx(y,{id:"MoreVertical",className:"size-4"})]})}),e.jsxs(L,{align:"end",children:[e.jsx(v,{children:"Actions"}),e.jsx(u,{onClick:()=>i(n),children:"Copy ID"}),e.jsx(u,{onClick:s,children:"Delete"}),e.jsx(u,{onClick:r,children:"Reset"})]})]})},S=({data:n,onOpenChange:s,onDelete:r})=>{const{deleteTaskRunConcurrencyLimit:i,isPending:o}=k(),t=l=>{i(l,{onSuccess:()=>{h.success("Concurrency limit deleted")},onError:a=>{const d=a.message||"Unknown error while deleting concurrency limit.";console.error(d)},onSettled:r})};return e.jsx(x,{open:!0,onOpenChange:s,children:e.jsxs(g,{children:[e.jsx(j,{children:e.jsx(m,{children:"Delete Concurrency Limit"})}),e.jsxs(C,{children:["Are you sure you want to delete ",n.tag]}),e.jsxs(D,{children:[e.jsx(p,{asChild:!0,children:e.jsx(c,{variant:"outline",children:"Close"})}),e.jsx(c,{variant:"destructive",onClick:()=>t(n.id),loading:o,children:"Delete"})]})]})})},A=({data:n,onOpenChange:s,onReset:r})=>{const{resetTaskRunConcurrencyLimitTag:i,isPending:o}=T(),t=l=>{i(l,{onSuccess:()=>{h.success("Concurrency limit reset")},onError:a=>{const d=a.message||"Unknown error while resetting concurrency limit.";console.error(d)},onSettled:r})};return e.jsx(x,{open:!0,onOpenChange:s,children:e.jsxs(g,{children:[e.jsx(j,{children:e.jsxs(m,{children:["Reset concurrency limit for tag ",n.tag]})}),e.jsx(C,{children:"This will reset the active task run count to 0."}),e.jsxs(D,{children:[e.jsx(p,{asChild:!0,children:e.jsx(c,{variant:"outline",children:"Close"})}),e.jsx(c,{onClick:()=>t(n.tag),loading:o,children:"Reset"})]})]})})};export{f as T,S as a,A as b};
2
+ //# sourceMappingURL=task-run-concurrency-limits-reset-dialog-BpeKHk7g.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"task-run-concurrency-limits-reset-dialog-CG3den1B.js","sources":["../../src/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-actions-menu/task-run-concurrency-limits-actions-menu.tsx","../../src/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-delete-dialog/task-run-concurrency-limits-delete-dialog.tsx","../../src/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-reset-dialog/task-run-concurrency-limits-reset-dialog.tsx"],"sourcesContent":["import { toast } from \"sonner\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuLabel,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Icon } from \"@/components/ui/icons\";\n\ntype TaskRunConcurrencyLimitsActionsMenuProps = {\n\tid: string;\n\tonDelete: () => void;\n\tonReset: () => void;\n};\n\nexport const TaskRunConcurrencyLimitsActionsMenu = ({\n\tid,\n\tonDelete,\n\tonReset,\n}: TaskRunConcurrencyLimitsActionsMenuProps) => {\n\tconst handleCopyId = (id: string) => {\n\t\tvoid navigator.clipboard.writeText(id);\n\t\ttoast.success(\"ID copied\");\n\t};\n\n\treturn (\n\t\t<DropdownMenu>\n\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t<Button variant=\"outline\" className=\"size-8 p-0\">\n\t\t\t\t\t<span className=\"sr-only\">Open menu</span>\n\t\t\t\t\t<Icon id=\"MoreVertical\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t<DropdownMenuLabel>Actions</DropdownMenuLabel>\n\t\t\t\t<DropdownMenuItem onClick={() => handleCopyId(id)}>\n\t\t\t\t\tCopy ID\n\t\t\t\t</DropdownMenuItem>\n\t\t\t\t<DropdownMenuItem onClick={onDelete}>Delete</DropdownMenuItem>\n\t\t\t\t<DropdownMenuItem onClick={onReset}>Reset</DropdownMenuItem>\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n};\n","import { toast } from \"sonner\";\nimport {\n\ttype TaskRunConcurrencyLimit,\n\tuseDeleteTaskRunConcurrencyLimit,\n} from \"@/api/task-run-concurrency-limits\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n\tDialogTrigger,\n} from \"@/components/ui/dialog\";\n\ntype TaskRunConcurrencyLimitsDeleteDialogProps = {\n\tdata: TaskRunConcurrencyLimit;\n\tonOpenChange: (open: boolean) => void;\n\tonDelete: () => void;\n};\n\nexport const TaskRunConcurrencyLimitsDeleteDialog = ({\n\tdata,\n\tonOpenChange,\n\tonDelete,\n}: TaskRunConcurrencyLimitsDeleteDialogProps) => {\n\tconst { deleteTaskRunConcurrencyLimit, isPending } =\n\t\tuseDeleteTaskRunConcurrencyLimit();\n\n\tconst handleOnClick = (id: string) => {\n\t\tdeleteTaskRunConcurrencyLimit(id, {\n\t\t\tonSuccess: () => {\n\t\t\t\ttoast.success(\"Concurrency limit deleted\");\n\t\t\t},\n\t\t\tonError: (error) => {\n\t\t\t\tconst message =\n\t\t\t\t\terror.message || \"Unknown error while deleting concurrency limit.\";\n\t\t\t\tconsole.error(message);\n\t\t\t},\n\t\t\tonSettled: onDelete,\n\t\t});\n\t};\n\n\treturn (\n\t\t<Dialog open onOpenChange={onOpenChange}>\n\t\t\t<DialogContent>\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>Delete Concurrency Limit</DialogTitle>\n\t\t\t\t</DialogHeader>\n\t\t\t\t<DialogDescription>\n\t\t\t\t\tAre you sure you want to delete {data.tag}\n\t\t\t\t</DialogDescription>\n\t\t\t\t<DialogFooter>\n\t\t\t\t\t<DialogTrigger asChild>\n\t\t\t\t\t\t<Button variant=\"outline\">Close</Button>\n\t\t\t\t\t</DialogTrigger>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"destructive\"\n\t\t\t\t\t\tonClick={() => handleOnClick(data.id)}\n\t\t\t\t\t\tloading={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\tDelete\n\t\t\t\t\t</Button>\n\t\t\t\t</DialogFooter>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n};\n","import { toast } from \"sonner\";\nimport {\n\ttype TaskRunConcurrencyLimit,\n\tuseResetTaskRunConcurrencyLimitTag,\n} from \"@/api/task-run-concurrency-limits\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n\tDialogTrigger,\n} from \"@/components/ui/dialog\";\n\ntype TaskRunConcurrencyLimitsResetDialogProps = {\n\tdata: TaskRunConcurrencyLimit;\n\tonOpenChange: (open: boolean) => void;\n\tonReset: () => void;\n};\n\nexport const TaskRunConcurrencyLimitsResetDialog = ({\n\tdata,\n\tonOpenChange,\n\tonReset,\n}: TaskRunConcurrencyLimitsResetDialogProps) => {\n\tconst { resetTaskRunConcurrencyLimitTag, isPending } =\n\t\tuseResetTaskRunConcurrencyLimitTag();\n\n\tconst handleOnClick = (tag: string) => {\n\t\tresetTaskRunConcurrencyLimitTag(tag, {\n\t\t\tonSuccess: () => {\n\t\t\t\ttoast.success(\"Concurrency limit reset\");\n\t\t\t},\n\t\t\tonError: (error) => {\n\t\t\t\tconst message =\n\t\t\t\t\terror.message || \"Unknown error while resetting concurrency limit.\";\n\t\t\t\tconsole.error(message);\n\t\t\t},\n\t\t\tonSettled: onReset,\n\t\t});\n\t};\n\n\treturn (\n\t\t<Dialog open onOpenChange={onOpenChange}>\n\t\t\t<DialogContent>\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>Reset concurrency limit for tag {data.tag}</DialogTitle>\n\t\t\t\t</DialogHeader>\n\t\t\t\t<DialogDescription>\n\t\t\t\t\tThis will reset the active task run count to 0.\n\t\t\t\t</DialogDescription>\n\t\t\t\t<DialogFooter>\n\t\t\t\t\t<DialogTrigger asChild>\n\t\t\t\t\t\t<Button variant=\"outline\">Close</Button>\n\t\t\t\t\t</DialogTrigger>\n\t\t\t\t\t<Button onClick={() => handleOnClick(data.tag)} loading={isPending}>\n\t\t\t\t\t\tReset\n\t\t\t\t\t</Button>\n\t\t\t\t</DialogFooter>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n};\n"],"names":["TaskRunConcurrencyLimitsActionsMenu","id","onDelete","onReset","handleCopyId","toast","DropdownMenu","jsx","DropdownMenuTrigger","jsxs","Button","Icon","DropdownMenuContent","DropdownMenuLabel","DropdownMenuItem","TaskRunConcurrencyLimitsDeleteDialog","data","onOpenChange","deleteTaskRunConcurrencyLimit","isPending","useDeleteTaskRunConcurrencyLimit","handleOnClick","error","message","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","DialogFooter","DialogTrigger","TaskRunConcurrencyLimitsResetDialog","resetTaskRunConcurrencyLimitTag","useResetTaskRunConcurrencyLimitTag","tag"],"mappings":"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"}
1
+ {"version":3,"file":"task-run-concurrency-limits-reset-dialog-BpeKHk7g.js","sources":["../../src/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-actions-menu/task-run-concurrency-limits-actions-menu.tsx","../../src/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-delete-dialog/task-run-concurrency-limits-delete-dialog.tsx","../../src/components/concurrency/task-run-concurrency-limits/task-run-concurrency-limits-reset-dialog/task-run-concurrency-limits-reset-dialog.tsx"],"sourcesContent":["import { toast } from \"sonner\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuLabel,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Icon } from \"@/components/ui/icons\";\n\ntype TaskRunConcurrencyLimitsActionsMenuProps = {\n\tid: string;\n\tonDelete: () => void;\n\tonReset: () => void;\n};\n\nexport const TaskRunConcurrencyLimitsActionsMenu = ({\n\tid,\n\tonDelete,\n\tonReset,\n}: TaskRunConcurrencyLimitsActionsMenuProps) => {\n\tconst handleCopyId = (id: string) => {\n\t\tvoid navigator.clipboard.writeText(id);\n\t\ttoast.success(\"ID copied\");\n\t};\n\n\treturn (\n\t\t<DropdownMenu>\n\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t<Button variant=\"outline\" className=\"size-8 p-0\">\n\t\t\t\t\t<span className=\"sr-only\">Open menu</span>\n\t\t\t\t\t<Icon id=\"MoreVertical\" className=\"size-4\" />\n\t\t\t\t</Button>\n\t\t\t</DropdownMenuTrigger>\n\t\t\t<DropdownMenuContent align=\"end\">\n\t\t\t\t<DropdownMenuLabel>Actions</DropdownMenuLabel>\n\t\t\t\t<DropdownMenuItem onClick={() => handleCopyId(id)}>\n\t\t\t\t\tCopy ID\n\t\t\t\t</DropdownMenuItem>\n\t\t\t\t<DropdownMenuItem onClick={onDelete}>Delete</DropdownMenuItem>\n\t\t\t\t<DropdownMenuItem onClick={onReset}>Reset</DropdownMenuItem>\n\t\t\t</DropdownMenuContent>\n\t\t</DropdownMenu>\n\t);\n};\n","import { toast } from \"sonner\";\nimport {\n\ttype TaskRunConcurrencyLimit,\n\tuseDeleteTaskRunConcurrencyLimit,\n} from \"@/api/task-run-concurrency-limits\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n\tDialogTrigger,\n} from \"@/components/ui/dialog\";\n\ntype TaskRunConcurrencyLimitsDeleteDialogProps = {\n\tdata: TaskRunConcurrencyLimit;\n\tonOpenChange: (open: boolean) => void;\n\tonDelete: () => void;\n};\n\nexport const TaskRunConcurrencyLimitsDeleteDialog = ({\n\tdata,\n\tonOpenChange,\n\tonDelete,\n}: TaskRunConcurrencyLimitsDeleteDialogProps) => {\n\tconst { deleteTaskRunConcurrencyLimit, isPending } =\n\t\tuseDeleteTaskRunConcurrencyLimit();\n\n\tconst handleOnClick = (id: string) => {\n\t\tdeleteTaskRunConcurrencyLimit(id, {\n\t\t\tonSuccess: () => {\n\t\t\t\ttoast.success(\"Concurrency limit deleted\");\n\t\t\t},\n\t\t\tonError: (error) => {\n\t\t\t\tconst message =\n\t\t\t\t\terror.message || \"Unknown error while deleting concurrency limit.\";\n\t\t\t\tconsole.error(message);\n\t\t\t},\n\t\t\tonSettled: onDelete,\n\t\t});\n\t};\n\n\treturn (\n\t\t<Dialog open onOpenChange={onOpenChange}>\n\t\t\t<DialogContent>\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>Delete Concurrency Limit</DialogTitle>\n\t\t\t\t</DialogHeader>\n\t\t\t\t<DialogDescription>\n\t\t\t\t\tAre you sure you want to delete {data.tag}\n\t\t\t\t</DialogDescription>\n\t\t\t\t<DialogFooter>\n\t\t\t\t\t<DialogTrigger asChild>\n\t\t\t\t\t\t<Button variant=\"outline\">Close</Button>\n\t\t\t\t\t</DialogTrigger>\n\t\t\t\t\t<Button\n\t\t\t\t\t\tvariant=\"destructive\"\n\t\t\t\t\t\tonClick={() => handleOnClick(data.id)}\n\t\t\t\t\t\tloading={isPending}\n\t\t\t\t\t>\n\t\t\t\t\t\tDelete\n\t\t\t\t\t</Button>\n\t\t\t\t</DialogFooter>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n};\n","import { toast } from \"sonner\";\nimport {\n\ttype TaskRunConcurrencyLimit,\n\tuseResetTaskRunConcurrencyLimitTag,\n} from \"@/api/task-run-concurrency-limits\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tDialog,\n\tDialogContent,\n\tDialogDescription,\n\tDialogFooter,\n\tDialogHeader,\n\tDialogTitle,\n\tDialogTrigger,\n} from \"@/components/ui/dialog\";\n\ntype TaskRunConcurrencyLimitsResetDialogProps = {\n\tdata: TaskRunConcurrencyLimit;\n\tonOpenChange: (open: boolean) => void;\n\tonReset: () => void;\n};\n\nexport const TaskRunConcurrencyLimitsResetDialog = ({\n\tdata,\n\tonOpenChange,\n\tonReset,\n}: TaskRunConcurrencyLimitsResetDialogProps) => {\n\tconst { resetTaskRunConcurrencyLimitTag, isPending } =\n\t\tuseResetTaskRunConcurrencyLimitTag();\n\n\tconst handleOnClick = (tag: string) => {\n\t\tresetTaskRunConcurrencyLimitTag(tag, {\n\t\t\tonSuccess: () => {\n\t\t\t\ttoast.success(\"Concurrency limit reset\");\n\t\t\t},\n\t\t\tonError: (error) => {\n\t\t\t\tconst message =\n\t\t\t\t\terror.message || \"Unknown error while resetting concurrency limit.\";\n\t\t\t\tconsole.error(message);\n\t\t\t},\n\t\t\tonSettled: onReset,\n\t\t});\n\t};\n\n\treturn (\n\t\t<Dialog open onOpenChange={onOpenChange}>\n\t\t\t<DialogContent>\n\t\t\t\t<DialogHeader>\n\t\t\t\t\t<DialogTitle>Reset concurrency limit for tag {data.tag}</DialogTitle>\n\t\t\t\t</DialogHeader>\n\t\t\t\t<DialogDescription>\n\t\t\t\t\tThis will reset the active task run count to 0.\n\t\t\t\t</DialogDescription>\n\t\t\t\t<DialogFooter>\n\t\t\t\t\t<DialogTrigger asChild>\n\t\t\t\t\t\t<Button variant=\"outline\">Close</Button>\n\t\t\t\t\t</DialogTrigger>\n\t\t\t\t\t<Button onClick={() => handleOnClick(data.tag)} loading={isPending}>\n\t\t\t\t\t\tReset\n\t\t\t\t\t</Button>\n\t\t\t\t</DialogFooter>\n\t\t\t</DialogContent>\n\t\t</Dialog>\n\t);\n};\n"],"names":["TaskRunConcurrencyLimitsActionsMenu","id","onDelete","onReset","handleCopyId","toast","DropdownMenu","jsx","DropdownMenuTrigger","jsxs","Button","Icon","DropdownMenuContent","DropdownMenuLabel","DropdownMenuItem","TaskRunConcurrencyLimitsDeleteDialog","data","onOpenChange","deleteTaskRunConcurrencyLimit","isPending","useDeleteTaskRunConcurrencyLimit","handleOnClick","error","message","Dialog","DialogContent","DialogHeader","DialogTitle","DialogDescription","DialogFooter","DialogTrigger","TaskRunConcurrencyLimitsResetDialog","resetTaskRunConcurrencyLimitTag","useResetTaskRunConcurrencyLimitTag","tag"],"mappings":"0PAiBO,MAAMA,EAAsC,CAAC,CACnD,GAAAC,EACA,SAAAC,EACA,QAAAC,CACD,IAAgD,CAC/C,MAAMC,EAAgBH,GAAe,CAC/B,UAAU,UAAU,UAAUA,CAAE,EACrCI,EAAM,QAAQ,WAAW,CAC1B,EAEA,cACEC,EAAA,CACA,SAAA,CAAAC,EAAAA,IAACC,EAAA,CAAoB,QAAO,GAC3B,SAAAC,EAAAA,KAACC,GAAO,QAAQ,UAAU,UAAU,aACnC,SAAA,CAAAH,EAAAA,IAAC,OAAA,CAAK,UAAU,UAAU,SAAA,YAAS,EACnCA,EAAAA,IAACI,EAAA,CAAK,GAAG,eAAe,UAAU,QAAA,CAAS,CAAA,CAAA,CAC5C,CAAA,CACD,EACAF,EAAAA,KAACG,EAAA,CAAoB,MAAM,MAC1B,SAAA,CAAAL,EAAAA,IAACM,GAAkB,SAAA,SAAA,CAAO,QACzBC,EAAA,CAAiB,QAAS,IAAMV,EAAaH,CAAE,EAAG,SAAA,UAEnD,EACAM,EAAAA,IAACO,EAAA,CAAiB,QAASZ,EAAU,SAAA,SAAM,EAC3CK,EAAAA,IAACO,EAAA,CAAiB,QAASX,EAAS,SAAA,OAAA,CAAK,CAAA,CAAA,CAC1C,CAAA,EACD,CAEF,ECvBaY,EAAuC,CAAC,CACpD,KAAAC,EACA,aAAAC,EACA,SAAAf,CACD,IAAiD,CAChD,KAAM,CAAE,8BAAAgB,EAA+B,UAAAC,CAAA,EACtCC,EAAA,EAEKC,EAAiBpB,GAAe,CACrCiB,EAA8BjB,EAAI,CACjC,UAAW,IAAM,CAChBI,EAAM,QAAQ,2BAA2B,CAC1C,EACA,QAAUiB,GAAU,CACnB,MAAMC,EACLD,EAAM,SAAW,kDAClB,QAAQ,MAAMC,CAAO,CACtB,EACA,UAAWrB,CAAA,CACX,CACF,EAEA,aACEsB,EAAA,CAAO,KAAI,GAAC,aAAAP,EACZ,gBAACQ,EAAA,CACA,SAAA,CAAAlB,MAACmB,EAAA,CACA,SAAAnB,EAAAA,IAACoB,EAAA,CAAY,SAAA,0BAAA,CAAwB,EACtC,SACCC,EAAA,CAAkB,SAAA,CAAA,mCACeZ,EAAK,GAAA,EACvC,SACCa,EAAA,CACA,SAAA,CAAAtB,EAAAA,IAACuB,EAAA,CAAc,QAAO,GACrB,SAAAvB,EAAAA,IAACG,GAAO,QAAQ,UAAU,iBAAK,CAAA,CAChC,EACAH,EAAAA,IAACG,EAAA,CACA,QAAQ,cACR,QAAS,IAAMW,EAAcL,EAAK,EAAE,EACpC,QAASG,EACT,SAAA,QAAA,CAAA,CAED,CAAA,CACD,CAAA,CAAA,CACD,CAAA,CACD,CAEF,EC9CaY,EAAsC,CAAC,CACnD,KAAAf,EACA,aAAAC,EACA,QAAAd,CACD,IAAgD,CAC/C,KAAM,CAAE,gCAAA6B,EAAiC,UAAAb,CAAA,EACxCc,EAAA,EAEKZ,EAAiBa,GAAgB,CACtCF,EAAgCE,EAAK,CACpC,UAAW,IAAM,CAChB7B,EAAM,QAAQ,yBAAyB,CACxC,EACA,QAAUiB,GAAU,CACnB,MAAMC,EACLD,EAAM,SAAW,mDAClB,QAAQ,MAAMC,CAAO,CACtB,EACA,UAAWpB,CAAA,CACX,CACF,EAEA,aACEqB,EAAA,CAAO,KAAI,GAAC,aAAAP,EACZ,gBAACQ,EAAA,CACA,SAAA,CAAAlB,EAAAA,IAACmB,EAAA,CACA,gBAACC,EAAA,CAAY,SAAA,CAAA,mCAAiCX,EAAK,GAAA,CAAA,CAAI,CAAA,CACxD,EACAT,EAAAA,IAACqB,GAAkB,SAAA,iDAAA,CAEnB,SACCC,EAAA,CACA,SAAA,CAAAtB,EAAAA,IAACuB,EAAA,CAAc,QAAO,GACrB,SAAAvB,EAAAA,IAACG,GAAO,QAAQ,UAAU,iBAAK,CAAA,CAChC,EACAH,EAAAA,IAACG,EAAA,CAAO,QAAS,IAAMW,EAAcL,EAAK,GAAG,EAAG,QAASG,EAAW,SAAA,OAAA,CAEpE,CAAA,CAAA,CACD,CAAA,CAAA,CACD,CAAA,CACD,CAEF"}
@@ -1,3 +1,3 @@
1
- import{r as c,p as E,j as e,s as M,L as O,I as F,f as G,u as V}from"./vendor-tanstack-BK8oseNA.js";import{bt as Q,C as $,n as U,c4 as z,aU as q,c5 as H,I as _,bl as J,aK as K,aq as W,c6 as X,S as A,a as P,c as k,e as C,b as Y,c7 as Z,al as R,c8 as ee,B as se,g as ae,h as v,bq as T,bz as S,bB as te,ap as le,p as re,bO as ne,x as g,au as ie,av as ce,aw as p,bP as oe,bQ as de,bR as xe,ax as j,L as me,b3 as x,c9 as w}from"./index-WYPZo52S.js";import{A as he}from"./artifact-card-Ds2tntMW.js";import{T as fe,a as D}from"./toggle-group-D3zeurIL.js";import{R as ue,a as ge,u as pe,C as je}from"./index-qPlIYf3i.js";import{L as Ne}from"./lazy-markdown-BHwIrC8E.js";import{D as ve}from"./delete-confirmation-dialog-COdZmNfa.js";import{u as ye}from"./use-delete-confirmation-dialog-CvQEyyhU.js";import{D as be,a as _e,b as Ce,d as y}from"./dropdown-menu-xZ_3w9OP.js";import{u as Te}from"./use-page-title-CGAfTz8r.js";import{o as Se,e as we}from"./vendor-forms-DxqqmhL5.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-CznP1SOq.js";import"./vendor-recharts-D4imLXNl.js";import"./vendor-date-7GxEwcQM.js";import"./index-DSaSov8V.js";const De=({taskRun:s})=>{const[t,a]=c.useState("grid"),{data:n}=E(Q({artifacts:{operator:"and_",task_run_id:{any_:[s.id]},type:{not_any_:["result"]}},sort:"ID_DESC",offset:0}));return n.length===0?e.jsx($,{children:e.jsx(U,{className:"text-center",children:e.jsxs("p",{children:["This task run did not produce any artifacts; for more information on creating artifacts, see the"," ",e.jsx("a",{href:"https://docs.prefect.io/v3/develop/artifacts",target:"_blank",rel:"noopener noreferrer",className:"text-blue-500",children:"documentation"}),"."]})})}):e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx("div",{className:"flex justify-end",children:e.jsxs(fe,{type:"single",variant:"outline",value:t,onValueChange:r=>a(r),children:[e.jsx(D,{value:"grid","aria-label":"Grid view",children:e.jsx(z,{className:"w-4 h-4"})}),e.jsx(D,{value:"list","aria-label":"List view",children:e.jsx(ue,{className:"w-4 h-4"})})]})}),e.jsx("div",{className:q("grid",t==="grid"?"grid-cols-1 lg:grid-cols-2 xl:grid-cols-3":"grid-cols-1","gap-4"),"data-testid":"task-run-artifacts-grid",children:n.map(r=>e.jsx(he,{artifact:r,compact:t==="list"},r.id))})]})};function N(s){return s?K(s,"dateTimeNumeric"):"N/A"}function b(s){return s==null?"N/A":W(s*1e3,{maxDecimalPoints:2,units:["s"]})}const L=({taskRun:s})=>{const{data:t}=M({...H(s?.id??""),enabled:!!s?.id});return s?e.jsxs("div",{className:"flex flex-col gap-2 p-2 text-xs",children:[s.flow_run_id?e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Flow Run"}),e.jsx("dd",{children:e.jsxs(O,{to:"/runs/flow-run/$id",params:{id:s.flow_run_id},className:"text-blue-500 hover:underline cursor-pointer flex items-center",children:[e.jsx(_,{id:"ExternalLink",className:"mr-1 size-4"}),s.flow_run_name]})})]}):e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Flow Run"}),e.jsx("dd",{children:"None"})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Start Time"}),e.jsx("dd",{className:"font-mono",children:s.start_time?N(s.start_time):"None"})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Duration"}),e.jsx("dd",{className:"",children:e.jsxs("span",{className:"flex items-center",children:[e.jsx(_,{id:"Clock",className:"mr-1 size-4"}),s.total_run_time!==null&&s.total_run_time!==void 0?b(s.total_run_time):"None"]})})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Run Count"}),e.jsx("dd",{className:"",children:s.run_count??0})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Estimated Run Time"}),e.jsx("dd",{className:"",children:s.estimated_run_time!==null&&s.estimated_run_time!==void 0?b(s.estimated_run_time):"None"})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Created"}),e.jsx("dd",{className:"font-mono",children:s.created?N(s.created):"None"})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Last Updated"}),e.jsx("dd",{className:"font-mono",children:s.updated?N(s.updated):"None"})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Cache Key"}),e.jsx("dd",{className:"font-mono",children:s.cache_key||"None"})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Cache Expiration"}),e.jsx("dd",{className:"font-mono",children:s.cache_expiration?N(s.cache_expiration):"None"})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Dynamic Key"}),e.jsx("dd",{className:"font-mono",children:s.dynamic_key||"None"})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Task Run ID"}),e.jsx("dd",{className:"font-mono",children:s.id})]}),t?.description&&e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-muted-foreground",children:"Result"}),e.jsx("dd",{children:e.jsx("div",{className:"prose max-w-none dark:prose-invert",children:e.jsx(Ne,{children:t.description})})})]}),e.jsx("div",{className:"border-t border-gray-200 mt-2 pt-4"}),e.jsx("h3",{className:"text-sm font-semibold mb-2",children:"Task configuration"}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:" text-gray-500",children:"Version"}),e.jsx("dd",{className:"",children:s.task_version||"None"})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Retries"}),e.jsx("dd",{className:"",children:s.empirical_policy?.retries?.toString()??"0"})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Retry Delay"}),e.jsx("dd",{className:"",children:typeof s.empirical_policy?.retry_delay=="number"?b(s.empirical_policy.retry_delay):"None"})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Retry Jitter Factor"}),e.jsx("dd",{className:"",children:s.empirical_policy?.retry_jitter_factor!==null&&s.empirical_policy?.retry_jitter_factor!==void 0?s.empirical_policy.retry_jitter_factor.toString():"None"})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:" text-gray-500",children:"Tags"}),e.jsx("dd",{className:"",children:s.tags&&s.tags.length>0?e.jsx("div",{className:"flex flex-wrap gap-1",children:s.tags.map(a=>e.jsx(J,{tag:a},a))}):"None"})]})]}):e.jsx("div",{className:"flex flex-col gap-2 bg-gray-100 p-4 rounded-md",children:e.jsx("span",{className:"text-gray-500",children:"No task run details available"})})},Le=({taskRun:s,virtualize:t=!0})=>{const[a,n]=c.useState(0),[r,l]=c.useState("TIMESTAMP_ASC"),o=c.useMemo(()=>({...X({limit:50,sort:r,logs:{operator:"and_",level:{ge_:a},task_run_id:{any_:[s.id]}}}),refetchInterval:s.state_type==="RUNNING"?5e3:!1}),[a,r,s.id,s.state_type]),{data:i,hasNextPage:d,fetchNextPage:f,isFetchingNextPage:u}=F(o),m=i.pages.length===1&&i.pages[0].length===0;let h="This run did not produce any logs.";return m&&(a>0?h="No logs match your filter criteria":s.state_type==="SCHEDULED"&&s.state_name==="Scheduled"?h="Run has not yet started. Check back soon for logs.":s.state_type==="RUNNING"&&(h="Waiting for logs...")),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex flex-row gap-2 justify-end",children:[e.jsx(Ie,{levelFilter:a,setLevelFilter:n}),e.jsx(Ee,{sortOrder:r,setSortOrder:l})]}),m?e.jsx("div",{className:"flex flex-col gap-2 text-center bg-muted p-2 rounded-md",children:e.jsx("span",{className:"text-muted-foreground",children:h})}):e.jsx("div",{className:"rounded-md",children:e.jsx(ge,{taskRun:s,logs:i.pages.flat(),onBottomReached:()=>{d&&!u&&f().catch(B=>{console.error(B)})},className:"max-h-[85vh]",virtualize:t})})]})},I=[{label:"All",value:0},{label:"Critical only",value:50},{label:"Error and above",value:40},{label:"Warning and above",value:30},{label:"Info and above",value:20},{label:"Debug and above",value:10}],Ie=({levelFilter:s,setLevelFilter:t})=>e.jsxs(A,{value:s.toString(),onValueChange:a=>t(Number(a)),children:[e.jsx(P,{"aria-label":"log level filter",children:e.jsx("span",{children:`Level:
2
- ${I.find(a=>a.value===s)?.label}`})}),e.jsx(k,{children:I.map(a=>e.jsx(C,{value:a.value.toString(),children:a.label},a.value))})]}),Ee=({sortOrder:s,setSortOrder:t})=>e.jsxs(A,{value:s,onValueChange:a=>t(a),children:[e.jsx(P,{"aria-label":"log sort order",children:e.jsx(Y,{placeholder:"Sort log order"})}),e.jsxs(k,{children:[e.jsx(C,{value:"TIMESTAMP_ASC",children:"Oldest to newest"}),e.jsx(C,{value:"TIMESTAMP_DESC",children:"Newest to oldest"})]})]});function Ae(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":window.matchMedia("(prefers-color-scheme: light)").matches?"light":"no-preference"}function Pe(s){c.useEffect(()=>{const t=Ae(),a=t==="dark"?document.getElementById("favicon-16-dark"):document.getElementById("favicon-16"),n=t==="dark"?document.getElementById("favicon-32-dark"):document.getElementById("favicon-32");if(s){const r=`/${s.toLowerCase()}.svg`;a?.setAttribute("href",r),n?.setAttribute("href",r)}return()=>{t==="dark"?(a?.setAttribute("href","/favicon-16x16-dark.png"),n?.setAttribute("href","/favicon-32x32-dark.png")):(a?.setAttribute("href","/favicon-16x16.png"),n?.setAttribute("href","/favicon-32x32.png"))}},[s])}const ke=({id:s,tab:t,onTabChange:a})=>{const[n,r]=c.useState(!1),{data:l}=E({...Z(s),refetchInterval:n}),{deleteTaskRun:o}=R(),{navigate:i}=G();Te(l?.name?`Task Run: ${l.name}`:"Task Run"),Pe(l?.state_type),c.useEffect(()=>{l.state_type==="RUNNING"||l.state_type==="PENDING"?r(5e3):r(!1)},[l]);const d=()=>{o({id:l.id},{onSuccess:()=>{r(!1),g.success("Task run deleted"),l.flow_run_id?i({to:"/runs/flow-run/$id",params:{id:l.flow_run_id},replace:!0}):i({to:"/runs",replace:!0})},onError:f=>{const u=f.message||"Unknown error while deleting task run.";g.error(u)}})};return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx("div",{className:"flex flex-col gap-2",children:e.jsx(Be,{taskRun:l,onDeleteRunClicked:d})}),e.jsxs("div",{className:"grid lg:grid-cols-[1fr_250px] grid-cols-[1fr] gap-4",children:[e.jsx(Me,{currentTab:t,onTabChange:a,logsContent:e.jsx(c.Suspense,{fallback:e.jsx(Oe,{}),children:e.jsx(Le,{taskRun:l})}),artifactsContent:e.jsx(c.Suspense,{fallback:e.jsx(Fe,{}),children:e.jsx(De,{taskRun:l})}),taskInputsContent:e.jsx(Ge,{taskRun:l}),detailsContent:e.jsx(L,{taskRun:l})}),e.jsx("div",{className:"hidden lg:block",children:e.jsx(L,{taskRun:l})})]})]})},Be=({taskRun:s,onDeleteRunClicked:t})=>{const[a,n]=ye(),{open:r,onOpenChange:l,openDialog:o}=pe(),{setTaskRunState:i,isPending:d}=ee(),f=s.state_type&&["COMPLETED","FAILED","CANCELLED","CRASHED"].includes(s.state_type),u=m=>{i({id:s.id,state:{type:m.type,name:m.type.charAt(0)+m.type.slice(1).toLowerCase(),message:m.message},force:!0},{onSuccess:()=>{g.success("Task run state changed"),l(!1)},onError:h=>{g.error(h.message||"Failed to change state")}})};return e.jsxs("div",{className:"flex flex-row justify-between",children:[e.jsx(se,{children:e.jsxs(ae,{children:[e.jsx(v,{children:e.jsx(T,{to:"/runs",search:{tab:"task-runs"},className:"text-xl font-semibold",children:"Runs"})}),e.jsx(S,{}),s.flow_run_id&&e.jsxs(e.Fragment,{children:[e.jsx(v,{children:e.jsx(T,{to:"/runs/flow-run/$id",params:{id:s.flow_run_id},className:"text-xl font-semibold",children:s.flow_run_name})}),e.jsx(S,{})]}),e.jsxs(v,{className:"text-xl",children:[e.jsx(te,{className:"font-semibold",children:s.name}),s.state&&e.jsx(le,{type:s.state.type,name:s.state.name,className:"ml-2"})]})]})}),e.jsxs(be,{children:[e.jsx(_e,{asChild:!0,children:e.jsx(re,{variant:"outline",className:"p-2",children:e.jsx(ne,{className:"w-4 h-4"})})}),e.jsxs(Ce,{children:[f&&e.jsx(y,{onClick:o,children:"Change state"}),e.jsx(y,{onClick:()=>{g.success("Copied task run ID to clipboard"),navigator.clipboard.writeText(s.id)},children:"Copy ID"}),e.jsx(y,{onClick:()=>n({title:"Delete Task Run",description:`Are you sure you want to delete task run ${s.name}?`,onConfirm:t}),children:"Delete"})]})]}),e.jsx(ve,{...a}),e.jsx(je,{open:r,onOpenChange:l,currentState:s.state?{type:s.state.type,name:s.state.name??s.state.type.charAt(0)+s.state.type.slice(1).toLowerCase()}:null,label:"Task Run",onConfirm:u,isLoading:d})]})},Me=({currentTab:s,onTabChange:t,logsContent:a,artifactsContent:n,taskInputsContent:r,detailsContent:l})=>(c.useEffect(()=>{const o=getComputedStyle(document.documentElement).getPropertyValue("--breakpoint-lg").trim(),i=window.matchMedia(`(max-width: ${o})`),d=()=>{s==="Details"&&t("Logs")};return i.addEventListener("change",d),()=>i.removeEventListener("change",d)},[s,t]),e.jsxs(ie,{value:s,onValueChange:o=>t(o),children:[e.jsxs(ce,{children:[e.jsx(p,{value:"Details",className:"lg:hidden",children:"Details"}),e.jsx(p,{value:"Logs",children:"Logs"}),e.jsx(p,{value:"Artifacts",children:"Artifacts"}),e.jsxs(p,{value:"TaskInputs",children:["Task Inputs",e.jsxs(oe,{children:[e.jsx(de,{asChild:!0,children:e.jsx(_,{id:"Info",className:"w-4 h-4"})}),e.jsx(xe,{children:"Task inputs show parameter keys and can also show task run relationships."})]})]})]}),e.jsx(j,{value:"Details",children:l}),e.jsx(j,{value:"Logs",children:a}),e.jsx(j,{value:"Artifacts",children:n}),e.jsx(j,{value:"TaskInputs",children:r})]})),Oe=()=>e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex flex-row gap-2 justify-end",children:[e.jsx(x,{className:"h-8 w-25"}),e.jsx(x,{className:"h-8 w-32"})]}),e.jsx(x,{className:"h-32"})]}),Fe=()=>e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("div",{className:"flex flex-row justify-end",children:e.jsx(x,{className:"h-8 w-12"})}),e.jsxs("div",{className:"grid grid-cols-1 gap-4 lg:grid-cols-2 xl:grid-cols-3",children:[e.jsx(x,{className:"h-40"}),e.jsx(x,{className:"h-40"}),e.jsx(x,{className:"h-40"}),e.jsx(x,{className:"h-40"})]})]}),Ge=({taskRun:s})=>e.jsx(me,{value:JSON.stringify(s.task_inputs,null,2),disabled:!0,copy:!0});Se({tab:we(["Logs","Artifacts","TaskInputs","Details"]).default("Logs").catch("Logs")});function as(){const{id:s}=w.useParams(),{tab:t}=w.useSearch(),a=V(),n=r=>{a({to:".",search:l=>({...l,tab:r})})};return e.jsx(ke,{id:s,tab:t,onTabChange:n})}export{as as component};
3
- //# sourceMappingURL=task-run._id-DOcIzVi0.js.map
1
+ import{r as c,p as E,j as e,s as B,L as O,I as F,f as G,u as V}from"./vendor-tanstack-BK8oseNA.js";import{bv as Q,C as $,o as z,c6 as U,aW as q,c7 as H,I as _,bn as J,aM as W,ar as K,c8 as X,S as A,a as P,c as k,e as C,b as Y,c9 as Z,am as R,ca as ee,B as se,g as ae,h as y,bs as T,bB as S,bD as te,aq as le,q as re,bQ as ne,y as g,aw as ie,ax as ce,ay as p,bR as oe,bS as de,bT as xe,az as j,L as me,b5 as x,cb as w}from"./index-D5RdrxkU.js";import{A as he}from"./artifact-card-CUEaRDGw.js";import{T as fe,a as D}from"./toggle-group-C-vxYz4l.js";import{R as ue,a as ge,u as pe,C as je}from"./index-BhALpenO.js";import{L as Ne}from"./lazy-markdown-wPid80zf.js";import{D as ye}from"./delete-confirmation-dialog-CqKsUEj_.js";import{u as ve}from"./use-delete-confirmation-dialog-CvQEyyhU.js";import{D as be,a as _e,b as Ce,d as v}from"./dropdown-menu-e0Fqb6aw.js";import{u as Te}from"./use-page-title-CGAfTz8r.js";import{o as Se,e as we}from"./vendor-forms-DxqqmhL5.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-CznP1SOq.js";import"./vendor-recharts-D4imLXNl.js";import"./vendor-date-7GxEwcQM.js";import"./index-BO3SOwdV.js";const De=({taskRun:s})=>{const[t,a]=c.useState("grid"),{data:n}=E(Q({artifacts:{operator:"and_",task_run_id:{any_:[s.id]},type:{not_any_:["result"]}},sort:"ID_DESC",offset:0}));return n.length===0?e.jsx($,{children:e.jsx(z,{className:"text-center",children:e.jsxs("p",{children:["This task run did not produce any artifacts; for more information on creating artifacts, see the"," ",e.jsx("a",{href:"https://docs.prefect.io/v3/develop/artifacts",target:"_blank",rel:"noopener noreferrer",className:"text-blue-500",children:"documentation"}),"."]})})}):e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx("div",{className:"flex justify-end",children:e.jsxs(fe,{type:"single",variant:"outline",value:t,onValueChange:r=>a(r),children:[e.jsx(D,{value:"grid","aria-label":"Grid view",children:e.jsx(U,{className:"w-4 h-4"})}),e.jsx(D,{value:"list","aria-label":"List view",children:e.jsx(ue,{className:"w-4 h-4"})})]})}),e.jsx("div",{className:q("grid",t==="grid"?"grid-cols-1 lg:grid-cols-2 xl:grid-cols-3":"grid-cols-1","gap-4"),"data-testid":"task-run-artifacts-grid",children:n.map(r=>e.jsx(he,{artifact:r,compact:t==="list"},r.id))})]})};function N(s){return s?W(s,"dateTimeNumeric"):"N/A"}function b(s){return s==null?"N/A":K(s*1e3,{maxDecimalPoints:2,units:["s"]})}const L=({taskRun:s})=>{const{data:t}=B({...H(s?.id??""),enabled:!!s?.id});return s?e.jsxs("div",{className:"flex flex-col gap-2 p-2 text-xs",children:[s.flow_run_id?e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Flow Run"}),e.jsx("dd",{children:e.jsxs(O,{to:"/runs/flow-run/$id",params:{id:s.flow_run_id},className:"text-blue-500 hover:underline cursor-pointer flex items-center",children:[e.jsx(_,{id:"ExternalLink",className:"mr-1 size-4"}),s.flow_run_name]})})]}):e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Flow Run"}),e.jsx("dd",{children:"None"})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Start Time"}),e.jsx("dd",{className:"font-mono",children:s.start_time?N(s.start_time):"None"})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Duration"}),e.jsx("dd",{className:"",children:e.jsxs("span",{className:"flex items-center",children:[e.jsx(_,{id:"Clock",className:"mr-1 size-4"}),s.total_run_time!==null&&s.total_run_time!==void 0?b(s.total_run_time):"None"]})})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Run Count"}),e.jsx("dd",{className:"",children:s.run_count??0})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Estimated Run Time"}),e.jsx("dd",{className:"",children:s.estimated_run_time!==null&&s.estimated_run_time!==void 0?b(s.estimated_run_time):"None"})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Created"}),e.jsx("dd",{className:"font-mono",children:s.created?N(s.created):"None"})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Last Updated"}),e.jsx("dd",{className:"font-mono",children:s.updated?N(s.updated):"None"})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Cache Key"}),e.jsx("dd",{className:"font-mono",children:s.cache_key||"None"})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Cache Expiration"}),e.jsx("dd",{className:"font-mono",children:s.cache_expiration?N(s.cache_expiration):"None"})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Dynamic Key"}),e.jsx("dd",{className:"font-mono",children:s.dynamic_key||"None"})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Task Run ID"}),e.jsx("dd",{className:"font-mono",children:s.id})]}),t?.description&&e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-muted-foreground",children:"Result"}),e.jsx("dd",{children:e.jsx("div",{className:"prose max-w-none dark:prose-invert",children:e.jsx(Ne,{children:t.description})})})]}),e.jsx("div",{className:"border-t border-gray-200 mt-2 pt-4"}),e.jsx("h3",{className:"text-sm font-semibold mb-2",children:"Task configuration"}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:" text-gray-500",children:"Version"}),e.jsx("dd",{className:"",children:s.task_version||"None"})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Retries"}),e.jsx("dd",{className:"",children:s.empirical_policy?.retries?.toString()??"0"})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Retry Delay"}),e.jsx("dd",{className:"",children:typeof s.empirical_policy?.retry_delay=="number"?b(s.empirical_policy.retry_delay):"None"})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:"text-gray-500",children:"Retry Jitter Factor"}),e.jsx("dd",{className:"",children:s.empirical_policy?.retry_jitter_factor!==null&&s.empirical_policy?.retry_jitter_factor!==void 0?s.empirical_policy.retry_jitter_factor.toString():"None"})]}),e.jsxs("dl",{className:"flex flex-col gap-1 mb-2",children:[e.jsx("dt",{className:" text-gray-500",children:"Tags"}),e.jsx("dd",{className:"",children:s.tags&&s.tags.length>0?e.jsx("div",{className:"flex flex-wrap gap-1",children:s.tags.map(a=>e.jsx(J,{tag:a},a))}):"None"})]})]}):e.jsx("div",{className:"flex flex-col gap-2 bg-gray-100 p-4 rounded-md",children:e.jsx("span",{className:"text-gray-500",children:"No task run details available"})})},Le=({taskRun:s,virtualize:t=!0})=>{const[a,n]=c.useState(0),[r,l]=c.useState("TIMESTAMP_ASC"),o=c.useMemo(()=>({...X({limit:50,sort:r,logs:{operator:"and_",level:{ge_:a},task_run_id:{any_:[s.id]}}}),refetchInterval:s.state_type==="RUNNING"?5e3:!1}),[a,r,s.id,s.state_type]),{data:i,hasNextPage:d,fetchNextPage:f,isFetchingNextPage:u}=F(o),m=i.pages.length===1&&i.pages[0].length===0;let h="This run did not produce any logs.";return m&&(a>0?h="No logs match your filter criteria":s.state_type==="SCHEDULED"&&s.state_name==="Scheduled"?h="Run has not yet started. Check back soon for logs.":s.state_type==="RUNNING"&&(h="Waiting for logs...")),e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex flex-row gap-2 justify-end",children:[e.jsx(Ie,{levelFilter:a,setLevelFilter:n}),e.jsx(Ee,{sortOrder:r,setSortOrder:l})]}),m?e.jsx("div",{className:"flex flex-col gap-2 text-center bg-muted p-2 rounded-md",children:e.jsx("span",{className:"text-muted-foreground",children:h})}):e.jsx("div",{className:"rounded-md",children:e.jsx(ge,{taskRun:s,logs:i.pages.flat(),onBottomReached:()=>{d&&!u&&f().catch(M=>{console.error(M)})},className:"max-h-[85vh]",virtualize:t})})]})},I=[{label:"All",value:0},{label:"Critical only",value:50},{label:"Error and above",value:40},{label:"Warning and above",value:30},{label:"Info and above",value:20},{label:"Debug and above",value:10}],Ie=({levelFilter:s,setLevelFilter:t})=>e.jsxs(A,{value:s.toString(),onValueChange:a=>t(Number(a)),children:[e.jsx(P,{"aria-label":"log level filter",children:e.jsx("span",{children:`Level:
2
+ ${I.find(a=>a.value===s)?.label}`})}),e.jsx(k,{children:I.map(a=>e.jsx(C,{value:a.value.toString(),children:a.label},a.value))})]}),Ee=({sortOrder:s,setSortOrder:t})=>e.jsxs(A,{value:s,onValueChange:a=>t(a),children:[e.jsx(P,{"aria-label":"log sort order",children:e.jsx(Y,{placeholder:"Sort log order"})}),e.jsxs(k,{children:[e.jsx(C,{value:"TIMESTAMP_ASC",children:"Oldest to newest"}),e.jsx(C,{value:"TIMESTAMP_DESC",children:"Newest to oldest"})]})]});function Ae(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":window.matchMedia("(prefers-color-scheme: light)").matches?"light":"no-preference"}function Pe(s){c.useEffect(()=>{const t=Ae(),a=t==="dark"?document.getElementById("favicon-16-dark"):document.getElementById("favicon-16"),n=t==="dark"?document.getElementById("favicon-32-dark"):document.getElementById("favicon-32");if(s){const r=`/${s.toLowerCase()}.svg`;a?.setAttribute("href",r),n?.setAttribute("href",r)}return()=>{t==="dark"?(a?.setAttribute("href","/favicon-16x16-dark.png"),n?.setAttribute("href","/favicon-32x32-dark.png")):(a?.setAttribute("href","/favicon-16x16.png"),n?.setAttribute("href","/favicon-32x32.png"))}},[s])}const ke=({id:s,tab:t,onTabChange:a})=>{const[n,r]=c.useState(!1),{data:l}=E({...Z(s),refetchInterval:n}),{deleteTaskRun:o}=R(),{navigate:i}=G();Te(l?.name?`Task Run: ${l.name}`:"Task Run"),Pe(l?.state_type),c.useEffect(()=>{l.state_type==="RUNNING"||l.state_type==="PENDING"?r(5e3):r(!1)},[l]);const d=()=>{o({id:l.id},{onSuccess:()=>{r(!1),g.success("Task run deleted"),l.flow_run_id?i({to:"/runs/flow-run/$id",params:{id:l.flow_run_id},replace:!0}):i({to:"/runs",replace:!0})},onError:f=>{const u=f.message||"Unknown error while deleting task run.";g.error(u)}})};return e.jsxs("div",{className:"flex flex-col gap-4",children:[e.jsx("div",{className:"flex flex-col gap-2",children:e.jsx(Me,{taskRun:l,onDeleteRunClicked:d})}),e.jsxs("div",{className:"grid lg:grid-cols-[1fr_250px] grid-cols-[1fr] gap-4",children:[e.jsx(Be,{currentTab:t,onTabChange:a,logsContent:e.jsx(c.Suspense,{fallback:e.jsx(Oe,{}),children:e.jsx(Le,{taskRun:l})}),artifactsContent:e.jsx(c.Suspense,{fallback:e.jsx(Fe,{}),children:e.jsx(De,{taskRun:l})}),taskInputsContent:e.jsx(Ge,{taskRun:l}),detailsContent:e.jsx(L,{taskRun:l})}),e.jsx("div",{className:"hidden lg:block",children:e.jsx(L,{taskRun:l})})]})]})},Me=({taskRun:s,onDeleteRunClicked:t})=>{const[a,n]=ve(),{open:r,onOpenChange:l,openDialog:o}=pe(),{setTaskRunState:i,isPending:d}=ee(),f=s.state_type&&["COMPLETED","FAILED","CANCELLED","CRASHED"].includes(s.state_type),u=m=>{i({id:s.id,state:{type:m.type,name:m.type.charAt(0)+m.type.slice(1).toLowerCase(),message:m.message},force:!0},{onSuccess:()=>{g.success("Task run state changed"),l(!1)},onError:h=>{g.error(h.message||"Failed to change state")}})};return e.jsxs("div",{className:"flex flex-row justify-between",children:[e.jsx(se,{children:e.jsxs(ae,{children:[e.jsx(y,{children:e.jsx(T,{to:"/runs",search:{tab:"task-runs"},className:"text-xl font-semibold",children:"Runs"})}),e.jsx(S,{}),s.flow_run_id&&e.jsxs(e.Fragment,{children:[e.jsx(y,{children:e.jsx(T,{to:"/runs/flow-run/$id",params:{id:s.flow_run_id},className:"text-xl font-semibold",children:s.flow_run_name})}),e.jsx(S,{})]}),e.jsxs(y,{className:"text-xl",children:[e.jsx(te,{className:"font-semibold",children:s.name}),s.state&&e.jsx(le,{type:s.state.type,name:s.state.name,className:"ml-2"})]})]})}),e.jsxs(be,{children:[e.jsx(_e,{asChild:!0,children:e.jsx(re,{variant:"outline",className:"p-2",children:e.jsx(ne,{className:"w-4 h-4"})})}),e.jsxs(Ce,{children:[f&&e.jsx(v,{onClick:o,children:"Change state"}),e.jsx(v,{onClick:()=>{g.success("Copied task run ID to clipboard"),navigator.clipboard.writeText(s.id)},children:"Copy ID"}),e.jsx(v,{onClick:()=>n({title:"Delete Task Run",description:`Are you sure you want to delete task run ${s.name}?`,onConfirm:t}),children:"Delete"})]})]}),e.jsx(ye,{...a}),e.jsx(je,{open:r,onOpenChange:l,currentState:s.state?{type:s.state.type,name:s.state.name??s.state.type.charAt(0)+s.state.type.slice(1).toLowerCase()}:null,label:"Task Run",onConfirm:u,isLoading:d})]})},Be=({currentTab:s,onTabChange:t,logsContent:a,artifactsContent:n,taskInputsContent:r,detailsContent:l})=>(c.useEffect(()=>{const o=getComputedStyle(document.documentElement).getPropertyValue("--breakpoint-lg").trim(),i=window.matchMedia(`(max-width: ${o})`),d=()=>{s==="Details"&&t("Logs")};return i.addEventListener("change",d),()=>i.removeEventListener("change",d)},[s,t]),e.jsxs(ie,{value:s,onValueChange:o=>t(o),children:[e.jsxs(ce,{children:[e.jsx(p,{value:"Details",className:"lg:hidden",children:"Details"}),e.jsx(p,{value:"Logs",children:"Logs"}),e.jsx(p,{value:"Artifacts",children:"Artifacts"}),e.jsxs(p,{value:"TaskInputs",children:["Task Inputs",e.jsxs(oe,{children:[e.jsx(de,{asChild:!0,children:e.jsx(_,{id:"Info",className:"w-4 h-4"})}),e.jsx(xe,{children:"Task inputs show parameter keys and can also show task run relationships."})]})]})]}),e.jsx(j,{value:"Details",children:l}),e.jsx(j,{value:"Logs",children:a}),e.jsx(j,{value:"Artifacts",children:n}),e.jsx(j,{value:"TaskInputs",children:r})]})),Oe=()=>e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsxs("div",{className:"flex flex-row gap-2 justify-end",children:[e.jsx(x,{className:"h-8 w-25"}),e.jsx(x,{className:"h-8 w-32"})]}),e.jsx(x,{className:"h-32"})]}),Fe=()=>e.jsxs("div",{className:"flex flex-col gap-2",children:[e.jsx("div",{className:"flex flex-row justify-end",children:e.jsx(x,{className:"h-8 w-12"})}),e.jsxs("div",{className:"grid grid-cols-1 gap-4 lg:grid-cols-2 xl:grid-cols-3",children:[e.jsx(x,{className:"h-40"}),e.jsx(x,{className:"h-40"}),e.jsx(x,{className:"h-40"}),e.jsx(x,{className:"h-40"})]})]}),Ge=({taskRun:s})=>e.jsx(me,{value:JSON.stringify(s.task_inputs,null,2),disabled:!0,copy:!0});Se({tab:we(["Logs","Artifacts","TaskInputs","Details"]).default("Logs").catch("Logs")});function as(){const{id:s}=w.useParams(),{tab:t}=w.useSearch(),a=V(),n=r=>{a({to:".",search:l=>({...l,tab:r})})};return e.jsx(ke,{id:s,tab:t,onTabChange:n})}export{as as component};
3
+ //# sourceMappingURL=task-run._id-CkOl9MJs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"task-run._id-DOcIzVi0.js","sources":["../../src/components/task-runs/task-run-artifacts/index.tsx","../../src/components/task-runs/task-run-details/task-run-details.tsx","../../src/components/task-runs/task-run-logs/index.tsx","../../src/hooks/use-state-favicon.ts","../../src/components/task-runs/task-run-details-page/index.tsx","../../src/routes/runs/task-run.$id.tsx?tsr-split=component"],"sourcesContent":["import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { LayoutGrid, Rows3 } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { buildListArtifactsQuery } from \"@/api/artifacts\";\nimport type { TaskRun } from \"@/api/task-runs\";\nimport { ArtifactCard } from \"@/components/artifacts/artifact-card\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { ToggleGroup, ToggleGroupItem } from \"@/components/ui/toggle-group\";\nimport { cn } from \"@/utils\";\n\ntype TaskRunArtifactsProps = {\n\ttaskRun: TaskRun;\n};\n\nexport const TaskRunArtifacts = ({ taskRun }: TaskRunArtifactsProps) => {\n\tconst [view, setView] = useState<\"grid\" | \"list\">(\"grid\");\n\tconst { data: artifacts } = useSuspenseQuery(\n\t\tbuildListArtifactsQuery({\n\t\t\tartifacts: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\ttask_run_id: {\n\t\t\t\t\tany_: [taskRun.id],\n\t\t\t\t},\n\t\t\t\ttype: {\n\t\t\t\t\tnot_any_: [\"result\"],\n\t\t\t\t},\n\t\t\t},\n\t\t\tsort: \"ID_DESC\",\n\t\t\toffset: 0,\n\t\t}),\n\t);\n\tif (artifacts.length === 0) {\n\t\treturn (\n\t\t\t<Card>\n\t\t\t\t<CardContent className=\"text-center\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tThis task run did not produce any artifacts; for more information on\n\t\t\t\t\t\tcreating artifacts, see the{\" \"}\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref=\"https://docs.prefect.io/v3/develop/artifacts\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\tclassName=\"text-blue-500\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tdocumentation\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t.\n\t\t\t\t\t</p>\n\t\t\t\t</CardContent>\n\t\t\t</Card>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex justify-end\">\n\t\t\t\t<ToggleGroup\n\t\t\t\t\ttype=\"single\"\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tvalue={view}\n\t\t\t\t\tonValueChange={(value) => setView(value as \"grid\" | \"list\")}\n\t\t\t\t>\n\t\t\t\t\t<ToggleGroupItem value=\"grid\" aria-label=\"Grid view\">\n\t\t\t\t\t\t<LayoutGrid className=\"w-4 h-4\" />\n\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t\t<ToggleGroupItem value=\"list\" aria-label=\"List view\">\n\t\t\t\t\t\t<Rows3 className=\"w-4 h-4\" />\n\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t</ToggleGroup>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"grid\",\n\t\t\t\t\tview === \"grid\"\n\t\t\t\t\t\t? \"grid-cols-1 lg:grid-cols-2 xl:grid-cols-3\"\n\t\t\t\t\t\t: \"grid-cols-1\",\n\t\t\t\t\t\"gap-4\",\n\t\t\t\t)}\n\t\t\t\tdata-testid=\"task-run-artifacts-grid\"\n\t\t\t>\n\t\t\t\t{artifacts.map((artifact) => (\n\t\t\t\t\t<ArtifactCard\n\t\t\t\t\t\tkey={artifact.id}\n\t\t\t\t\t\tartifact={artifact}\n\t\t\t\t\t\tcompact={view === \"list\"}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { Link } from \"@tanstack/react-router\";\nimport humanizeDuration from \"humanize-duration\";\nimport { buildGetTaskRunResultQuery } from \"@/api/artifacts\";\nimport type { TaskRun } from \"@/api/task-runs\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { LazyMarkdown } from \"@/components/ui/lazy-markdown\";\nimport { TagBadge } from \"@/components/ui/tag-badge\";\nimport { formatDate } from \"@/utils/date\";\n\nfunction formatTaskDate(dateString: string | null | undefined): string {\n\tif (!dateString) return \"N/A\";\n\treturn formatDate(dateString, \"dateTimeNumeric\");\n}\n\nfunction formatTaskDuration(seconds: number | null | undefined): string {\n\tif (seconds === null || seconds === undefined) return \"N/A\";\n\treturn humanizeDuration(seconds * 1000, {\n\t\tmaxDecimalPoints: 2,\n\t\tunits: [\"s\"],\n\t});\n}\n\nexport type TaskRunDetailsProps = {\n\ttaskRun: TaskRun | null | undefined;\n};\n\nexport const TaskRunDetails = ({ taskRun }: TaskRunDetailsProps) => {\n\tconst { data: resultArtifact } = useQuery({\n\t\t...buildGetTaskRunResultQuery(taskRun?.id ?? \"\"),\n\t\tenabled: !!taskRun?.id,\n\t});\n\n\tif (!taskRun) {\n\t\treturn (\n\t\t\t<div className=\"flex flex-col gap-2 bg-gray-100 p-4 rounded-md\">\n\t\t\t\t<span className=\"text-gray-500\">No task run details available</span>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-2 p-2 text-xs\">\n\t\t\t{taskRun.flow_run_id ? (\n\t\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t\t<dt className=\"text-gray-500\">Flow Run</dt>\n\t\t\t\t\t<dd>\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: taskRun.flow_run_id }}\n\t\t\t\t\t\t\tclassName=\"text-blue-500 hover:underline cursor-pointer flex items-center\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon id=\"ExternalLink\" className=\"mr-1 size-4\" />\n\t\t\t\t\t\t\t{taskRun.flow_run_name}\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t</dd>\n\t\t\t\t</dl>\n\t\t\t) : (\n\t\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t\t<dt className=\"text-gray-500\">Flow Run</dt>\n\t\t\t\t\t<dd>None</dd>\n\t\t\t\t</dl>\n\t\t\t)}\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Start Time</dt>\n\t\t\t\t<dd className=\"font-mono\">\n\t\t\t\t\t{taskRun.start_time ? formatTaskDate(taskRun.start_time) : \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Duration</dt>\n\t\t\t\t<dd className=\"\">\n\t\t\t\t\t<span className=\"flex items-center\">\n\t\t\t\t\t\t<Icon id=\"Clock\" className=\"mr-1 size-4\" />\n\t\t\t\t\t\t{taskRun.total_run_time !== null &&\n\t\t\t\t\t\ttaskRun.total_run_time !== undefined\n\t\t\t\t\t\t\t? formatTaskDuration(taskRun.total_run_time)\n\t\t\t\t\t\t\t: \"None\"}\n\t\t\t\t\t</span>\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Run Count</dt>\n\t\t\t\t<dd className=\"\">{taskRun.run_count ?? 0}</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Estimated Run Time</dt>\n\t\t\t\t<dd className=\"\">\n\t\t\t\t\t{taskRun.estimated_run_time !== null &&\n\t\t\t\t\ttaskRun.estimated_run_time !== undefined\n\t\t\t\t\t\t? formatTaskDuration(taskRun.estimated_run_time)\n\t\t\t\t\t\t: \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Created</dt>\n\t\t\t\t<dd className=\"font-mono\">\n\t\t\t\t\t{taskRun.created ? formatTaskDate(taskRun.created) : \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Last Updated</dt>\n\t\t\t\t<dd className=\"font-mono\">\n\t\t\t\t\t{taskRun.updated ? formatTaskDate(taskRun.updated) : \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Cache Key</dt>\n\t\t\t\t<dd className=\"font-mono\">{taskRun.cache_key || \"None\"}</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Cache Expiration</dt>\n\t\t\t\t<dd className=\"font-mono\">\n\t\t\t\t\t{taskRun.cache_expiration\n\t\t\t\t\t\t? formatTaskDate(taskRun.cache_expiration)\n\t\t\t\t\t\t: \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Dynamic Key</dt>\n\t\t\t\t<dd className=\"font-mono\">{taskRun.dynamic_key || \"None\"}</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Task Run ID</dt>\n\t\t\t\t<dd className=\"font-mono\">{taskRun.id}</dd>\n\t\t\t</dl>\n\n\t\t\t{resultArtifact?.description && (\n\t\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t\t<dt className=\"text-muted-foreground\">Result</dt>\n\t\t\t\t\t<dd>\n\t\t\t\t\t\t<div className=\"prose max-w-none dark:prose-invert\">\n\t\t\t\t\t\t\t<LazyMarkdown>{resultArtifact.description}</LazyMarkdown>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</dd>\n\t\t\t\t</dl>\n\t\t\t)}\n\n\t\t\t<div className=\"border-t border-gray-200 mt-2 pt-4\" />\n\t\t\t<h3 className=\"text-sm font-semibold mb-2\">Task configuration</h3>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\" text-gray-500\">Version</dt>\n\t\t\t\t<dd className=\"\">{taskRun.task_version || \"None\"}</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Retries</dt>\n\t\t\t\t<dd className=\"\">\n\t\t\t\t\t{taskRun.empirical_policy?.retries?.toString() ?? \"0\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Retry Delay</dt>\n\t\t\t\t<dd className=\"\">\n\t\t\t\t\t{typeof taskRun.empirical_policy?.retry_delay === \"number\"\n\t\t\t\t\t\t? formatTaskDuration(taskRun.empirical_policy.retry_delay)\n\t\t\t\t\t\t: \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Retry Jitter Factor</dt>\n\t\t\t\t<dd className=\"\">\n\t\t\t\t\t{taskRun.empirical_policy?.retry_jitter_factor !== null &&\n\t\t\t\t\ttaskRun.empirical_policy?.retry_jitter_factor !== undefined\n\t\t\t\t\t\t? taskRun.empirical_policy.retry_jitter_factor.toString()\n\t\t\t\t\t\t: \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\" text-gray-500\">Tags</dt>\n\t\t\t\t<dd className=\"\">\n\t\t\t\t\t{taskRun.tags && taskRun.tags.length > 0 ? (\n\t\t\t\t\t\t<div className=\"flex flex-wrap gap-1\">\n\t\t\t\t\t\t\t{taskRun.tags.map((tag) => (\n\t\t\t\t\t\t\t\t<TagBadge key={tag} tag={tag} />\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t\"None\"\n\t\t\t\t\t)}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\t\t</div>\n\t);\n};\n","import { useSuspenseInfiniteQuery } from \"@tanstack/react-query\";\nimport { useMemo, useState } from \"react\";\nimport { buildInfiniteFilterLogsQuery } from \"@/api/logs\";\nimport type { components } from \"@/api/prefect\";\nimport { RunLogs } from \"@/components/ui/run-logs\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\n\ntype TaskRunLogsProps = {\n\ttaskRun: components[\"schemas\"][\"TaskRun\"];\n\tvirtualize?: boolean;\n};\n\nexport const TaskRunLogs = ({\n\ttaskRun,\n\tvirtualize = true,\n}: TaskRunLogsProps) => {\n\tconst [levelFilter, setLevelFilter] = useState<number>(0);\n\tconst [sortOrder, setSortOrder] = useState<\n\t\t\"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\"\n\t>(\"TIMESTAMP_ASC\");\n\n\tconst queryOptions = useMemo(\n\t\t() => ({\n\t\t\t...buildInfiniteFilterLogsQuery({\n\t\t\t\tlimit: 50,\n\t\t\t\tsort: sortOrder,\n\t\t\t\tlogs: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tlevel: { ge_: levelFilter },\n\t\t\t\t\ttask_run_id: { any_: [taskRun.id] },\n\t\t\t\t},\n\t\t\t}),\n\t\t\trefetchInterval:\n\t\t\t\ttaskRun.state_type === \"RUNNING\" ? 5000 : (false as const),\n\t\t}),\n\t\t[levelFilter, sortOrder, taskRun.id, taskRun.state_type],\n\t);\n\n\tconst {\n\t\tdata: logs,\n\t\thasNextPage,\n\t\tfetchNextPage,\n\t\tisFetchingNextPage,\n\t} = useSuspenseInfiniteQuery(queryOptions);\n\n\tconst noLogs = logs.pages.length === 1 && logs.pages[0].length === 0;\n\tlet message = \"This run did not produce any logs.\";\n\tif (noLogs) {\n\t\tif (levelFilter > 0) {\n\t\t\tmessage = \"No logs match your filter criteria\";\n\t\t} else if (\n\t\t\ttaskRun.state_type === \"SCHEDULED\" &&\n\t\t\ttaskRun.state_name === \"Scheduled\"\n\t\t) {\n\t\t\tmessage = \"Run has not yet started. Check back soon for logs.\";\n\t\t} else if (taskRun.state_type === \"RUNNING\") {\n\t\t\tmessage = \"Waiting for logs...\";\n\t\t}\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t<div className=\"flex flex-row gap-2 justify-end\">\n\t\t\t\t<LogLevelFilter\n\t\t\t\t\tlevelFilter={levelFilter}\n\t\t\t\t\tsetLevelFilter={setLevelFilter}\n\t\t\t\t/>\n\t\t\t\t<LogSortOrder sortOrder={sortOrder} setSortOrder={setSortOrder} />\n\t\t\t</div>\n\t\t\t{noLogs ? (\n\t\t\t\t<div className=\"flex flex-col gap-2 text-center bg-muted p-2 rounded-md\">\n\t\t\t\t\t<span className=\"text-muted-foreground\">{message}</span>\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<div className=\"rounded-md\">\n\t\t\t\t\t<RunLogs\n\t\t\t\t\t\ttaskRun={taskRun}\n\t\t\t\t\t\tlogs={logs.pages.flat()}\n\t\t\t\t\t\tonBottomReached={() => {\n\t\t\t\t\t\t\tif (hasNextPage && !isFetchingNextPage) {\n\t\t\t\t\t\t\t\tfetchNextPage().catch((error) => {\n\t\t\t\t\t\t\t\t\tconsole.error(error);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName=\"max-h-[85vh]\"\n\t\t\t\t\t\tvirtualize={virtualize}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n\nconst LEVEL_FILTER_OPTIONS = [\n\t{ label: \"All\", value: 0 },\n\t{ label: \"Critical only\", value: 50 },\n\t{ label: \"Error and above\", value: 40 },\n\t{ label: \"Warning and above\", value: 30 },\n\t{ label: \"Info and above\", value: 20 },\n\t{ label: \"Debug and above\", value: 10 },\n] as const;\n\nconst LogLevelFilter = ({\n\tlevelFilter,\n\tsetLevelFilter,\n}: {\n\tlevelFilter: number;\n\tsetLevelFilter: (level: number) => void;\n}) => {\n\treturn (\n\t\t<Select\n\t\t\tvalue={levelFilter.toString()}\n\t\t\tonValueChange={(value) => setLevelFilter(Number(value))}\n\t\t>\n\t\t\t<SelectTrigger aria-label=\"log level filter\">\n\t\t\t\t<span>\n\t\t\t\t\t{`Level:\n\t\t\t\t\t\t\t${\n\t\t\t\t\t\t\t\tLEVEL_FILTER_OPTIONS.find(\n\t\t\t\t\t\t\t\t\t(option) => option.value === levelFilter,\n\t\t\t\t\t\t\t\t)?.label\n\t\t\t\t\t\t\t}`}\n\t\t\t\t</span>\n\t\t\t</SelectTrigger>\n\t\t\t<SelectContent>\n\t\t\t\t{LEVEL_FILTER_OPTIONS.map((option) => (\n\t\t\t\t\t<SelectItem key={option.value} value={option.value.toString()}>\n\t\t\t\t\t\t{option.label}\n\t\t\t\t\t</SelectItem>\n\t\t\t\t))}\n\t\t\t</SelectContent>\n\t\t</Select>\n\t);\n};\n\nconst LogSortOrder = ({\n\tsortOrder,\n\tsetSortOrder,\n}: {\n\tsortOrder: \"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\";\n\tsetSortOrder: (sortOrder: \"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\") => void;\n}) => (\n\t<Select\n\t\tvalue={sortOrder}\n\t\tonValueChange={(value) =>\n\t\t\tsetSortOrder(value as \"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\")\n\t\t}\n\t>\n\t\t<SelectTrigger aria-label=\"log sort order\">\n\t\t\t<SelectValue placeholder=\"Sort log order\" />\n\t\t</SelectTrigger>\n\t\t<SelectContent>\n\t\t\t<SelectItem value=\"TIMESTAMP_ASC\">Oldest to newest</SelectItem>\n\t\t\t<SelectItem value=\"TIMESTAMP_DESC\">Newest to oldest</SelectItem>\n\t\t</SelectContent>\n\t</Select>\n);\n","import { useEffect } from \"react\";\n\ntype StateType =\n\t| \"SCHEDULED\"\n\t| \"PENDING\"\n\t| \"RUNNING\"\n\t| \"COMPLETED\"\n\t| \"FAILED\"\n\t| \"CANCELLED\"\n\t| \"CANCELLING\"\n\t| \"CRASHED\"\n\t| \"PAUSED\";\n\nfunction getPreferredColorScheme(): \"dark\" | \"light\" | \"no-preference\" {\n\tif (window.matchMedia(\"(prefers-color-scheme: dark)\").matches) {\n\t\treturn \"dark\";\n\t}\n\tif (window.matchMedia(\"(prefers-color-scheme: light)\").matches) {\n\t\treturn \"light\";\n\t}\n\treturn \"no-preference\";\n}\n\n/**\n * A hook that sets the browser favicon based on the provided state type.\n * Resets the favicon to the default when the component unmounts.\n *\n * @param stateType - The state type to display in the favicon (e.g., \"COMPLETED\", \"FAILED\")\n * @returns void\n *\n * @example\n * ```tsx\n * // Set favicon based on task run state\n * useStateFavicon(taskRun.state_type);\n * ```\n */\nexport function useStateFavicon(stateType: StateType | null | undefined): void {\n\tuseEffect(() => {\n\t\tconst colorScheme = getPreferredColorScheme();\n\t\tconst favicon16 =\n\t\t\tcolorScheme === \"dark\"\n\t\t\t\t? document.getElementById(\"favicon-16-dark\")\n\t\t\t\t: document.getElementById(\"favicon-16\");\n\t\tconst favicon32 =\n\t\t\tcolorScheme === \"dark\"\n\t\t\t\t? document.getElementById(\"favicon-32-dark\")\n\t\t\t\t: document.getElementById(\"favicon-32\");\n\n\t\tif (stateType) {\n\t\t\tconst faviconPath = `/${stateType.toLowerCase()}.svg`;\n\t\t\tfavicon16?.setAttribute(\"href\", faviconPath);\n\t\t\tfavicon32?.setAttribute(\"href\", faviconPath);\n\t\t}\n\n\t\treturn () => {\n\t\t\t// Reset to default favicon on unmount\n\t\t\tif (colorScheme === \"dark\") {\n\t\t\t\tfavicon16?.setAttribute(\"href\", \"/favicon-16x16-dark.png\");\n\t\t\t\tfavicon32?.setAttribute(\"href\", \"/favicon-32x32-dark.png\");\n\t\t\t} else {\n\t\t\t\tfavicon16?.setAttribute(\"href\", \"/favicon-16x16.png\");\n\t\t\t\tfavicon32?.setAttribute(\"href\", \"/favicon-32x32.png\");\n\t\t\t}\n\t\t};\n\t}, [stateType]);\n}\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { useRouter } from \"@tanstack/react-router\";\nimport { MoreVertical } from \"lucide-react\";\nimport { Suspense, useEffect, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport {\n\tbuildGetTaskRunDetailsQuery,\n\ttype TaskRun,\n\tuseDeleteTaskRun,\n\tuseSetTaskRunState,\n} from \"@/api/task-runs\";\nimport { TaskRunArtifacts } from \"@/components/task-runs/task-run-artifacts\";\nimport { TaskRunDetails } from \"@/components/task-runs/task-run-details/task-run-details\";\nimport { TaskRunLogs } from \"@/components/task-runs/task-run-logs\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n\tBreadcrumbPage,\n\tBreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tChangeStateDialog,\n\tuseChangeStateDialog,\n} from \"@/components/ui/change-state-dialog\";\nimport {\n\tDeleteConfirmationDialog,\n\tuseDeleteConfirmationDialog,\n} from \"@/components/ui/delete-confirmation-dialog\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { LazyJsonInput as JsonInput } from \"@/components/ui/json-input-lazy\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { usePageTitle } from \"@/hooks/use-page-title\";\nimport { useStateFavicon } from \"@/hooks/use-state-favicon\";\n\ntype TaskRunDetailsPageProps = {\n\tid: string;\n\ttab: TaskRunDetailsTabOptions;\n\tonTabChange: (tab: TaskRunDetailsTabOptions) => void;\n};\n\ntype TaskRunDetailsTabOptions = \"Logs\" | \"Artifacts\" | \"TaskInputs\" | \"Details\";\n\nexport const TaskRunDetailsPage = ({\n\tid,\n\ttab,\n\tonTabChange,\n}: TaskRunDetailsPageProps) => {\n\tconst [refetchInterval, setRefetchInterval] = useState<number | false>(false);\n\tconst { data: taskRun } = useSuspenseQuery({\n\t\t...buildGetTaskRunDetailsQuery(id),\n\t\trefetchInterval,\n\t});\n\tconst { deleteTaskRun } = useDeleteTaskRun();\n\tconst { navigate } = useRouter();\n\n\t// Set page title based on task run name\n\tusePageTitle(taskRun?.name ? `Task Run: ${taskRun.name}` : \"Task Run\");\n\n\t// Set favicon based on task run state\n\tuseStateFavicon(taskRun?.state_type);\n\n\tuseEffect(() => {\n\t\tif (taskRun.state_type === \"RUNNING\" || taskRun.state_type === \"PENDING\") {\n\t\t\tsetRefetchInterval(5000);\n\t\t} else {\n\t\t\tsetRefetchInterval(false);\n\t\t}\n\t}, [taskRun]);\n\n\tconst onDeleteRunClicked = () => {\n\t\tdeleteTaskRun(\n\t\t\t{ id: taskRun.id },\n\t\t\t{\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\tsetRefetchInterval(false);\n\t\t\t\t\ttoast.success(\"Task run deleted\");\n\t\t\t\t\tif (taskRun.flow_run_id) {\n\t\t\t\t\t\tvoid navigate({\n\t\t\t\t\t\t\tto: \"/runs/flow-run/$id\",\n\t\t\t\t\t\t\tparams: { id: taskRun.flow_run_id },\n\t\t\t\t\t\t\treplace: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvoid navigate({ to: \"/runs\", replace: true });\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\tconst message =\n\t\t\t\t\t\terror.message || \"Unknown error while deleting task run.\";\n\t\t\t\t\ttoast.error(message);\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t<Header taskRun={taskRun} onDeleteRunClicked={onDeleteRunClicked} />\n\t\t\t</div>\n\t\t\t<div className=\"grid lg:grid-cols-[1fr_250px] grid-cols-[1fr] gap-4\">\n\t\t\t\t<TabsLayout\n\t\t\t\t\tcurrentTab={tab}\n\t\t\t\t\tonTabChange={onTabChange}\n\t\t\t\t\tlogsContent={\n\t\t\t\t\t\t<Suspense fallback={<LogsSkeleton />}>\n\t\t\t\t\t\t\t<TaskRunLogs taskRun={taskRun} />\n\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t}\n\t\t\t\t\tartifactsContent={\n\t\t\t\t\t\t<Suspense fallback={<ArtifactsSkeleton />}>\n\t\t\t\t\t\t\t<TaskRunArtifacts taskRun={taskRun} />\n\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t}\n\t\t\t\t\ttaskInputsContent={<TaskInputs taskRun={taskRun} />}\n\t\t\t\t\tdetailsContent={<TaskRunDetails taskRun={taskRun} />}\n\t\t\t\t/>\n\t\t\t\t<div className=\"hidden lg:block\">\n\t\t\t\t\t<TaskRunDetails taskRun={taskRun} />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nconst Header = ({\n\ttaskRun,\n\tonDeleteRunClicked,\n}: {\n\ttaskRun: TaskRun;\n\tonDeleteRunClicked: () => void;\n}) => {\n\tconst [dialogState, confirmDelete] = useDeleteConfirmationDialog();\n\tconst {\n\t\topen: isChangeStateOpen,\n\t\tonOpenChange: setChangeStateOpen,\n\t\topenDialog: openChangeState,\n\t} = useChangeStateDialog();\n\tconst { setTaskRunState, isPending: isChangingState } = useSetTaskRunState();\n\n\tconst canChangeState =\n\t\ttaskRun.state_type &&\n\t\t[\"COMPLETED\", \"FAILED\", \"CANCELLED\", \"CRASHED\"].includes(\n\t\t\ttaskRun.state_type,\n\t\t);\n\n\tconst handleChangeState = (newState: { type: string; message?: string }) => {\n\t\tsetTaskRunState(\n\t\t\t{\n\t\t\t\tid: taskRun.id,\n\t\t\t\tstate: {\n\t\t\t\t\ttype: newState.type as\n\t\t\t\t\t\t| \"COMPLETED\"\n\t\t\t\t\t\t| \"FAILED\"\n\t\t\t\t\t\t| \"CANCELLED\"\n\t\t\t\t\t\t| \"CRASHED\",\n\t\t\t\t\tname: newState.type.charAt(0) + newState.type.slice(1).toLowerCase(),\n\t\t\t\t\tmessage: newState.message,\n\t\t\t\t},\n\t\t\t\tforce: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\ttoast.success(\"Task run state changed\");\n\t\t\t\t\tsetChangeStateOpen(false);\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\ttoast.error(error.message || \"Failed to change state\");\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-row justify-between\">\n\t\t\t<Breadcrumb>\n\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\t\tto=\"/runs\"\n\t\t\t\t\t\t\tsearch={{ tab: \"task-runs\" }}\n\t\t\t\t\t\t\tclassName=\"text-xl font-semibold\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tRuns\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{taskRun.flow_run_id && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<BreadcrumbItem>\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: taskRun.flow_run_id }}\n\t\t\t\t\t\t\t\t\tclassName=\"text-xl font-semibold\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{taskRun.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<BreadcrumbItem className=\"text-xl\">\n\t\t\t\t\t\t<BreadcrumbPage className=\"font-semibold\">\n\t\t\t\t\t\t\t{taskRun.name}\n\t\t\t\t\t\t</BreadcrumbPage>\n\t\t\t\t\t\t{taskRun.state && (\n\t\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\t\ttype={taskRun.state.type}\n\t\t\t\t\t\t\t\tname={taskRun.state.name}\n\t\t\t\t\t\t\t\tclassName=\"ml-2\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t<Button variant=\"outline\" className=\"p-2\">\n\t\t\t\t\t\t<MoreVertical className=\"w-4 h-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t<DropdownMenuContent>\n\t\t\t\t\t{canChangeState && (\n\t\t\t\t\t\t<DropdownMenuItem onClick={openChangeState}>\n\t\t\t\t\t\t\tChange state\n\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t)}\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\ttoast.success(\"Copied task run ID to clipboard\");\n\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(taskRun.id);\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tCopy ID\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\tconfirmDelete({\n\t\t\t\t\t\t\t\ttitle: \"Delete Task Run\",\n\t\t\t\t\t\t\t\tdescription: `Are you sure you want to delete task run ${taskRun.name}?`,\n\t\t\t\t\t\t\t\tonConfirm: onDeleteRunClicked,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\tDelete\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t\t<DeleteConfirmationDialog {...dialogState} />\n\t\t\t<ChangeStateDialog\n\t\t\t\topen={isChangeStateOpen}\n\t\t\t\tonOpenChange={setChangeStateOpen}\n\t\t\t\tcurrentState={\n\t\t\t\t\ttaskRun.state\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\ttype: taskRun.state.type,\n\t\t\t\t\t\t\t\tname:\n\t\t\t\t\t\t\t\t\ttaskRun.state.name ??\n\t\t\t\t\t\t\t\t\ttaskRun.state.type.charAt(0) +\n\t\t\t\t\t\t\t\t\t\ttaskRun.state.type.slice(1).toLowerCase(),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: null\n\t\t\t\t}\n\t\t\t\tlabel=\"Task Run\"\n\t\t\t\tonConfirm={handleChangeState}\n\t\t\t\tisLoading={isChangingState}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n\nconst TabsLayout = ({\n\tcurrentTab,\n\tonTabChange,\n\tlogsContent,\n\tartifactsContent,\n\ttaskInputsContent,\n\tdetailsContent,\n}: {\n\tcurrentTab: TaskRunDetailsTabOptions;\n\tonTabChange: (tab: TaskRunDetailsTabOptions) => void;\n\tlogsContent: React.ReactNode;\n\tartifactsContent: React.ReactNode;\n\ttaskInputsContent: React.ReactNode;\n\tdetailsContent: React.ReactNode;\n}) => {\n\t// Change tab on screen size change when the details tab is selected\n\tuseEffect(() => {\n\t\tconst bp = getComputedStyle(document.documentElement)\n\t\t\t.getPropertyValue(\"--breakpoint-lg\")\n\t\t\t.trim();\n\t\tconst mql = window.matchMedia(`(max-width: ${bp})`);\n\t\tconst onChange = () => {\n\t\t\tif (currentTab === \"Details\") {\n\t\t\t\tonTabChange(\"Logs\");\n\t\t\t}\n\t\t};\n\t\tmql.addEventListener(\"change\", onChange);\n\t\treturn () => mql.removeEventListener(\"change\", onChange);\n\t}, [currentTab, onTabChange]);\n\n\treturn (\n\t\t<Tabs\n\t\t\tvalue={currentTab}\n\t\t\tonValueChange={(value) => onTabChange(value as TaskRunDetailsTabOptions)}\n\t\t>\n\t\t\t<TabsList>\n\t\t\t\t<TabsTrigger value=\"Details\" className=\"lg:hidden\">\n\t\t\t\t\tDetails\n\t\t\t\t</TabsTrigger>\n\t\t\t\t<TabsTrigger value=\"Logs\">Logs</TabsTrigger>\n\t\t\t\t<TabsTrigger value=\"Artifacts\">Artifacts</TabsTrigger>\n\t\t\t\t<TabsTrigger value=\"TaskInputs\">\n\t\t\t\t\tTask Inputs\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<Icon id=\"Info\" className=\"w-4 h-4\" />\n\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\tTask inputs show parameter keys and can also show task run\n\t\t\t\t\t\t\trelationships.\n\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t</TabsTrigger>\n\t\t\t</TabsList>\n\t\t\t<TabsContent value=\"Details\">{detailsContent}</TabsContent>\n\t\t\t<TabsContent value=\"Logs\">{logsContent}</TabsContent>\n\t\t\t<TabsContent value=\"Artifacts\">{artifactsContent}</TabsContent>\n\t\t\t<TabsContent value=\"TaskInputs\">{taskInputsContent}</TabsContent>\n\t\t</Tabs>\n\t);\n};\n\nconst LogsSkeleton = () => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t<div className=\"flex flex-row gap-2 justify-end\">\n\t\t\t\t<Skeleton className=\"h-8 w-25\" />\n\t\t\t\t<Skeleton className=\"h-8 w-32\" />\n\t\t\t</div>\n\t\t\t<Skeleton className=\"h-32\" />\n\t\t</div>\n\t);\n};\n\nconst ArtifactsSkeleton = () => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t<div className=\"flex flex-row justify-end\">\n\t\t\t\t<Skeleton className=\"h-8 w-12\" />\n\t\t\t</div>\n\n\t\t\t<div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2 xl:grid-cols-3\">\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nconst TaskInputs = ({ taskRun }: { taskRun: TaskRun }) => {\n\treturn (\n\t\t<JsonInput\n\t\t\tvalue={JSON.stringify(taskRun.task_inputs, null, 2)}\n\t\t\tdisabled\n\t\t\tcopy\n\t\t/>\n\t);\n};\n","import type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute, useNavigate } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { z } from \"zod\";\nimport { buildListArtifactsQuery } from \"@/api/artifacts\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport { buildInfiniteFilterLogsQuery } from \"@/api/logs\";\nimport { buildGetTaskRunDetailsQuery } from \"@/api/task-runs\";\nimport { TaskRunDetailsPage } from \"@/components/task-runs/task-run-details-page\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\n\nconst searchParams = z.object({\n\ttab: z\n\t\t.enum([\"Logs\", \"Artifacts\", \"TaskInputs\", \"Details\"])\n\t\t.default(\"Logs\")\n\t\t.catch(\"Logs\"),\n});\n\nexport type TaskRunDetailsTabOptions = z.infer<typeof searchParams>[\"tab\"];\n\nfunction TaskRunErrorComponent({ error, reset }: ErrorComponentProps) {\n\tconst serverError = categorizeError(error, \"Failed to load task run\");\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div>\n\t\t\t\t<h1 className=\"text-2xl font-semibold\">Task Run</h1>\n\t\t\t</div>\n\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t</div>\n\t);\n}\n\nexport const Route = createFileRoute(\"/runs/task-run/$id\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: RouteComponent,\n\tloader: async ({ params, context: { queryClient } }) => {\n\t\t// ----- Deferred data\n\t\tvoid queryClient.prefetchInfiniteQuery(\n\t\t\tbuildInfiniteFilterLogsQuery({\n\t\t\t\tlimit: 50,\n\t\t\t\tsort: \"TIMESTAMP_ASC\",\n\t\t\t\tlogs: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tlevel: {\n\t\t\t\t\t\tge_: 0,\n\t\t\t\t\t},\n\t\t\t\t\ttask_run_id: {\n\t\t\t\t\t\tany_: [params.id],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildListArtifactsQuery({\n\t\t\t\tartifacts: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\ttask_run_id: {\n\t\t\t\t\t\tany_: [params.id],\n\t\t\t\t\t},\n\t\t\t\t\ttype: {\n\t\t\t\t\t\tnot_any_: [\"result\"],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tsort: \"ID_DESC\",\n\t\t\t\toffset: 0,\n\t\t\t}),\n\t\t);\n\n\t\t// ----- Critical data\n\t\tawait queryClient.ensureQueryData(buildGetTaskRunDetailsQuery(params.id));\n\t},\n\twrapInSuspense: true,\n\terrorComponent: TaskRunErrorComponent,\n});\n\nfunction RouteComponent() {\n\tconst { id } = Route.useParams();\n\tconst { tab } = Route.useSearch();\n\tconst navigate = useNavigate();\n\n\tconst onTabChange = (tab: TaskRunDetailsTabOptions) => {\n\t\tvoid navigate({\n\t\t\tto: \".\",\n\t\t\tsearch: (prev) => ({\n\t\t\t\t...prev,\n\t\t\t\ttab,\n\t\t\t}),\n\t\t});\n\t};\n\n\treturn <TaskRunDetailsPage id={id} tab={tab} onTabChange={onTabChange} />;\n}\n"],"names":["TaskRunArtifacts","taskRun","view","setView","useState","artifacts","useSuspenseQuery","buildListArtifactsQuery","Card","jsx","CardContent","jsxs","ToggleGroup","value","ToggleGroupItem","LayoutGrid","Rows3","cn","artifact","ArtifactCard","formatTaskDate","dateString","formatDate","formatTaskDuration","seconds","humanizeDuration","TaskRunDetails","resultArtifact","useQuery","buildGetTaskRunResultQuery","Link","Icon","LazyMarkdown","tag","TagBadge","TaskRunLogs","virtualize","levelFilter","setLevelFilter","sortOrder","setSortOrder","queryOptions","useMemo","buildInfiniteFilterLogsQuery","logs","hasNextPage","fetchNextPage","isFetchingNextPage","useSuspenseInfiniteQuery","noLogs","message","LogLevelFilter","LogSortOrder","RunLogs","error","LEVEL_FILTER_OPTIONS","Select","SelectTrigger","option","SelectContent","SelectItem","SelectValue","getPreferredColorScheme","useStateFavicon","stateType","useEffect","colorScheme","favicon16","favicon32","faviconPath","TaskRunDetailsPage","id","tab","onTabChange","refetchInterval","setRefetchInterval","buildGetTaskRunDetailsQuery","deleteTaskRun","useDeleteTaskRun","navigate","useRouter","usePageTitle","onDeleteRunClicked","toast","Header","TabsLayout","Suspense","LogsSkeleton","ArtifactsSkeleton","TaskInputs","dialogState","confirmDelete","useDeleteConfirmationDialog","isChangeStateOpen","setChangeStateOpen","openChangeState","useChangeStateDialog","setTaskRunState","isChangingState","useSetTaskRunState","canChangeState","handleChangeState","newState","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","Fragment","BreadcrumbPage","StateBadge","DropdownMenu","DropdownMenuTrigger","Button","MoreVertical","DropdownMenuContent","DropdownMenuItem","DeleteConfirmationDialog","ChangeStateDialog","currentTab","logsContent","artifactsContent","taskInputsContent","detailsContent","bp","mql","onChange","Tabs","TabsList","TabsTrigger","Tooltip","TooltipTrigger","TooltipContent","TabsContent","Skeleton","JsonInput","z","default","catch","RouteComponent","Route","useParams","useSearch","useNavigate","to","search","prev"],"mappings":"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"}
1
+ {"version":3,"file":"task-run._id-CkOl9MJs.js","sources":["../../src/components/task-runs/task-run-artifacts/index.tsx","../../src/components/task-runs/task-run-details/task-run-details.tsx","../../src/components/task-runs/task-run-logs/index.tsx","../../src/hooks/use-state-favicon.ts","../../src/components/task-runs/task-run-details-page/index.tsx","../../src/routes/runs/task-run.$id.tsx?tsr-split=component"],"sourcesContent":["import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { LayoutGrid, Rows3 } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { buildListArtifactsQuery } from \"@/api/artifacts\";\nimport type { TaskRun } from \"@/api/task-runs\";\nimport { ArtifactCard } from \"@/components/artifacts/artifact-card\";\nimport { Card, CardContent } from \"@/components/ui/card\";\nimport { ToggleGroup, ToggleGroupItem } from \"@/components/ui/toggle-group\";\nimport { cn } from \"@/utils\";\n\ntype TaskRunArtifactsProps = {\n\ttaskRun: TaskRun;\n};\n\nexport const TaskRunArtifacts = ({ taskRun }: TaskRunArtifactsProps) => {\n\tconst [view, setView] = useState<\"grid\" | \"list\">(\"grid\");\n\tconst { data: artifacts } = useSuspenseQuery(\n\t\tbuildListArtifactsQuery({\n\t\t\tartifacts: {\n\t\t\t\toperator: \"and_\",\n\t\t\t\ttask_run_id: {\n\t\t\t\t\tany_: [taskRun.id],\n\t\t\t\t},\n\t\t\t\ttype: {\n\t\t\t\t\tnot_any_: [\"result\"],\n\t\t\t\t},\n\t\t\t},\n\t\t\tsort: \"ID_DESC\",\n\t\t\toffset: 0,\n\t\t}),\n\t);\n\tif (artifacts.length === 0) {\n\t\treturn (\n\t\t\t<Card>\n\t\t\t\t<CardContent className=\"text-center\">\n\t\t\t\t\t<p>\n\t\t\t\t\t\tThis task run did not produce any artifacts; for more information on\n\t\t\t\t\t\tcreating artifacts, see the{\" \"}\n\t\t\t\t\t\t<a\n\t\t\t\t\t\t\thref=\"https://docs.prefect.io/v3/develop/artifacts\"\n\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\trel=\"noopener noreferrer\"\n\t\t\t\t\t\t\tclassName=\"text-blue-500\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tdocumentation\n\t\t\t\t\t\t</a>\n\t\t\t\t\t\t.\n\t\t\t\t\t</p>\n\t\t\t\t</CardContent>\n\t\t\t</Card>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex justify-end\">\n\t\t\t\t<ToggleGroup\n\t\t\t\t\ttype=\"single\"\n\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\tvalue={view}\n\t\t\t\t\tonValueChange={(value) => setView(value as \"grid\" | \"list\")}\n\t\t\t\t>\n\t\t\t\t\t<ToggleGroupItem value=\"grid\" aria-label=\"Grid view\">\n\t\t\t\t\t\t<LayoutGrid className=\"w-4 h-4\" />\n\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t\t<ToggleGroupItem value=\"list\" aria-label=\"List view\">\n\t\t\t\t\t\t<Rows3 className=\"w-4 h-4\" />\n\t\t\t\t\t</ToggleGroupItem>\n\t\t\t\t</ToggleGroup>\n\t\t\t</div>\n\t\t\t<div\n\t\t\t\tclassName={cn(\n\t\t\t\t\t\"grid\",\n\t\t\t\t\tview === \"grid\"\n\t\t\t\t\t\t? \"grid-cols-1 lg:grid-cols-2 xl:grid-cols-3\"\n\t\t\t\t\t\t: \"grid-cols-1\",\n\t\t\t\t\t\"gap-4\",\n\t\t\t\t)}\n\t\t\t\tdata-testid=\"task-run-artifacts-grid\"\n\t\t\t>\n\t\t\t\t{artifacts.map((artifact) => (\n\t\t\t\t\t<ArtifactCard\n\t\t\t\t\t\tkey={artifact.id}\n\t\t\t\t\t\tartifact={artifact}\n\t\t\t\t\t\tcompact={view === \"list\"}\n\t\t\t\t\t/>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n","import { useQuery } from \"@tanstack/react-query\";\nimport { Link } from \"@tanstack/react-router\";\nimport humanizeDuration from \"humanize-duration\";\nimport { buildGetTaskRunResultQuery } from \"@/api/artifacts\";\nimport type { TaskRun } from \"@/api/task-runs\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { LazyMarkdown } from \"@/components/ui/lazy-markdown\";\nimport { TagBadge } from \"@/components/ui/tag-badge\";\nimport { formatDate } from \"@/utils/date\";\n\nfunction formatTaskDate(dateString: string | null | undefined): string {\n\tif (!dateString) return \"N/A\";\n\treturn formatDate(dateString, \"dateTimeNumeric\");\n}\n\nfunction formatTaskDuration(seconds: number | null | undefined): string {\n\tif (seconds === null || seconds === undefined) return \"N/A\";\n\treturn humanizeDuration(seconds * 1000, {\n\t\tmaxDecimalPoints: 2,\n\t\tunits: [\"s\"],\n\t});\n}\n\nexport type TaskRunDetailsProps = {\n\ttaskRun: TaskRun | null | undefined;\n};\n\nexport const TaskRunDetails = ({ taskRun }: TaskRunDetailsProps) => {\n\tconst { data: resultArtifact } = useQuery({\n\t\t...buildGetTaskRunResultQuery(taskRun?.id ?? \"\"),\n\t\tenabled: !!taskRun?.id,\n\t});\n\n\tif (!taskRun) {\n\t\treturn (\n\t\t\t<div className=\"flex flex-col gap-2 bg-gray-100 p-4 rounded-md\">\n\t\t\t\t<span className=\"text-gray-500\">No task run details available</span>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-2 p-2 text-xs\">\n\t\t\t{taskRun.flow_run_id ? (\n\t\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t\t<dt className=\"text-gray-500\">Flow Run</dt>\n\t\t\t\t\t<dd>\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: taskRun.flow_run_id }}\n\t\t\t\t\t\t\tclassName=\"text-blue-500 hover:underline cursor-pointer flex items-center\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<Icon id=\"ExternalLink\" className=\"mr-1 size-4\" />\n\t\t\t\t\t\t\t{taskRun.flow_run_name}\n\t\t\t\t\t\t</Link>\n\t\t\t\t\t</dd>\n\t\t\t\t</dl>\n\t\t\t) : (\n\t\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t\t<dt className=\"text-gray-500\">Flow Run</dt>\n\t\t\t\t\t<dd>None</dd>\n\t\t\t\t</dl>\n\t\t\t)}\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Start Time</dt>\n\t\t\t\t<dd className=\"font-mono\">\n\t\t\t\t\t{taskRun.start_time ? formatTaskDate(taskRun.start_time) : \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Duration</dt>\n\t\t\t\t<dd className=\"\">\n\t\t\t\t\t<span className=\"flex items-center\">\n\t\t\t\t\t\t<Icon id=\"Clock\" className=\"mr-1 size-4\" />\n\t\t\t\t\t\t{taskRun.total_run_time !== null &&\n\t\t\t\t\t\ttaskRun.total_run_time !== undefined\n\t\t\t\t\t\t\t? formatTaskDuration(taskRun.total_run_time)\n\t\t\t\t\t\t\t: \"None\"}\n\t\t\t\t\t</span>\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Run Count</dt>\n\t\t\t\t<dd className=\"\">{taskRun.run_count ?? 0}</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Estimated Run Time</dt>\n\t\t\t\t<dd className=\"\">\n\t\t\t\t\t{taskRun.estimated_run_time !== null &&\n\t\t\t\t\ttaskRun.estimated_run_time !== undefined\n\t\t\t\t\t\t? formatTaskDuration(taskRun.estimated_run_time)\n\t\t\t\t\t\t: \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Created</dt>\n\t\t\t\t<dd className=\"font-mono\">\n\t\t\t\t\t{taskRun.created ? formatTaskDate(taskRun.created) : \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Last Updated</dt>\n\t\t\t\t<dd className=\"font-mono\">\n\t\t\t\t\t{taskRun.updated ? formatTaskDate(taskRun.updated) : \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Cache Key</dt>\n\t\t\t\t<dd className=\"font-mono\">{taskRun.cache_key || \"None\"}</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Cache Expiration</dt>\n\t\t\t\t<dd className=\"font-mono\">\n\t\t\t\t\t{taskRun.cache_expiration\n\t\t\t\t\t\t? formatTaskDate(taskRun.cache_expiration)\n\t\t\t\t\t\t: \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Dynamic Key</dt>\n\t\t\t\t<dd className=\"font-mono\">{taskRun.dynamic_key || \"None\"}</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Task Run ID</dt>\n\t\t\t\t<dd className=\"font-mono\">{taskRun.id}</dd>\n\t\t\t</dl>\n\n\t\t\t{resultArtifact?.description && (\n\t\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t\t<dt className=\"text-muted-foreground\">Result</dt>\n\t\t\t\t\t<dd>\n\t\t\t\t\t\t<div className=\"prose max-w-none dark:prose-invert\">\n\t\t\t\t\t\t\t<LazyMarkdown>{resultArtifact.description}</LazyMarkdown>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</dd>\n\t\t\t\t</dl>\n\t\t\t)}\n\n\t\t\t<div className=\"border-t border-gray-200 mt-2 pt-4\" />\n\t\t\t<h3 className=\"text-sm font-semibold mb-2\">Task configuration</h3>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\" text-gray-500\">Version</dt>\n\t\t\t\t<dd className=\"\">{taskRun.task_version || \"None\"}</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Retries</dt>\n\t\t\t\t<dd className=\"\">\n\t\t\t\t\t{taskRun.empirical_policy?.retries?.toString() ?? \"0\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Retry Delay</dt>\n\t\t\t\t<dd className=\"\">\n\t\t\t\t\t{typeof taskRun.empirical_policy?.retry_delay === \"number\"\n\t\t\t\t\t\t? formatTaskDuration(taskRun.empirical_policy.retry_delay)\n\t\t\t\t\t\t: \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\"text-gray-500\">Retry Jitter Factor</dt>\n\t\t\t\t<dd className=\"\">\n\t\t\t\t\t{taskRun.empirical_policy?.retry_jitter_factor !== null &&\n\t\t\t\t\ttaskRun.empirical_policy?.retry_jitter_factor !== undefined\n\t\t\t\t\t\t? taskRun.empirical_policy.retry_jitter_factor.toString()\n\t\t\t\t\t\t: \"None\"}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\n\t\t\t<dl className=\"flex flex-col gap-1 mb-2\">\n\t\t\t\t<dt className=\" text-gray-500\">Tags</dt>\n\t\t\t\t<dd className=\"\">\n\t\t\t\t\t{taskRun.tags && taskRun.tags.length > 0 ? (\n\t\t\t\t\t\t<div className=\"flex flex-wrap gap-1\">\n\t\t\t\t\t\t\t{taskRun.tags.map((tag) => (\n\t\t\t\t\t\t\t\t<TagBadge key={tag} tag={tag} />\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t) : (\n\t\t\t\t\t\t\"None\"\n\t\t\t\t\t)}\n\t\t\t\t</dd>\n\t\t\t</dl>\n\t\t</div>\n\t);\n};\n","import { useSuspenseInfiniteQuery } from \"@tanstack/react-query\";\nimport { useMemo, useState } from \"react\";\nimport { buildInfiniteFilterLogsQuery } from \"@/api/logs\";\nimport type { components } from \"@/api/prefect\";\nimport { RunLogs } from \"@/components/ui/run-logs\";\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from \"@/components/ui/select\";\n\ntype TaskRunLogsProps = {\n\ttaskRun: components[\"schemas\"][\"TaskRun\"];\n\tvirtualize?: boolean;\n};\n\nexport const TaskRunLogs = ({\n\ttaskRun,\n\tvirtualize = true,\n}: TaskRunLogsProps) => {\n\tconst [levelFilter, setLevelFilter] = useState<number>(0);\n\tconst [sortOrder, setSortOrder] = useState<\n\t\t\"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\"\n\t>(\"TIMESTAMP_ASC\");\n\n\tconst queryOptions = useMemo(\n\t\t() => ({\n\t\t\t...buildInfiniteFilterLogsQuery({\n\t\t\t\tlimit: 50,\n\t\t\t\tsort: sortOrder,\n\t\t\t\tlogs: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tlevel: { ge_: levelFilter },\n\t\t\t\t\ttask_run_id: { any_: [taskRun.id] },\n\t\t\t\t},\n\t\t\t}),\n\t\t\trefetchInterval:\n\t\t\t\ttaskRun.state_type === \"RUNNING\" ? 5000 : (false as const),\n\t\t}),\n\t\t[levelFilter, sortOrder, taskRun.id, taskRun.state_type],\n\t);\n\n\tconst {\n\t\tdata: logs,\n\t\thasNextPage,\n\t\tfetchNextPage,\n\t\tisFetchingNextPage,\n\t} = useSuspenseInfiniteQuery(queryOptions);\n\n\tconst noLogs = logs.pages.length === 1 && logs.pages[0].length === 0;\n\tlet message = \"This run did not produce any logs.\";\n\tif (noLogs) {\n\t\tif (levelFilter > 0) {\n\t\t\tmessage = \"No logs match your filter criteria\";\n\t\t} else if (\n\t\t\ttaskRun.state_type === \"SCHEDULED\" &&\n\t\t\ttaskRun.state_name === \"Scheduled\"\n\t\t) {\n\t\t\tmessage = \"Run has not yet started. Check back soon for logs.\";\n\t\t} else if (taskRun.state_type === \"RUNNING\") {\n\t\t\tmessage = \"Waiting for logs...\";\n\t\t}\n\t}\n\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t<div className=\"flex flex-row gap-2 justify-end\">\n\t\t\t\t<LogLevelFilter\n\t\t\t\t\tlevelFilter={levelFilter}\n\t\t\t\t\tsetLevelFilter={setLevelFilter}\n\t\t\t\t/>\n\t\t\t\t<LogSortOrder sortOrder={sortOrder} setSortOrder={setSortOrder} />\n\t\t\t</div>\n\t\t\t{noLogs ? (\n\t\t\t\t<div className=\"flex flex-col gap-2 text-center bg-muted p-2 rounded-md\">\n\t\t\t\t\t<span className=\"text-muted-foreground\">{message}</span>\n\t\t\t\t</div>\n\t\t\t) : (\n\t\t\t\t<div className=\"rounded-md\">\n\t\t\t\t\t<RunLogs\n\t\t\t\t\t\ttaskRun={taskRun}\n\t\t\t\t\t\tlogs={logs.pages.flat()}\n\t\t\t\t\t\tonBottomReached={() => {\n\t\t\t\t\t\t\tif (hasNextPage && !isFetchingNextPage) {\n\t\t\t\t\t\t\t\tfetchNextPage().catch((error) => {\n\t\t\t\t\t\t\t\t\tconsole.error(error);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tclassName=\"max-h-[85vh]\"\n\t\t\t\t\t\tvirtualize={virtualize}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n\nconst LEVEL_FILTER_OPTIONS = [\n\t{ label: \"All\", value: 0 },\n\t{ label: \"Critical only\", value: 50 },\n\t{ label: \"Error and above\", value: 40 },\n\t{ label: \"Warning and above\", value: 30 },\n\t{ label: \"Info and above\", value: 20 },\n\t{ label: \"Debug and above\", value: 10 },\n] as const;\n\nconst LogLevelFilter = ({\n\tlevelFilter,\n\tsetLevelFilter,\n}: {\n\tlevelFilter: number;\n\tsetLevelFilter: (level: number) => void;\n}) => {\n\treturn (\n\t\t<Select\n\t\t\tvalue={levelFilter.toString()}\n\t\t\tonValueChange={(value) => setLevelFilter(Number(value))}\n\t\t>\n\t\t\t<SelectTrigger aria-label=\"log level filter\">\n\t\t\t\t<span>\n\t\t\t\t\t{`Level:\n\t\t\t\t\t\t\t${\n\t\t\t\t\t\t\t\tLEVEL_FILTER_OPTIONS.find(\n\t\t\t\t\t\t\t\t\t(option) => option.value === levelFilter,\n\t\t\t\t\t\t\t\t)?.label\n\t\t\t\t\t\t\t}`}\n\t\t\t\t</span>\n\t\t\t</SelectTrigger>\n\t\t\t<SelectContent>\n\t\t\t\t{LEVEL_FILTER_OPTIONS.map((option) => (\n\t\t\t\t\t<SelectItem key={option.value} value={option.value.toString()}>\n\t\t\t\t\t\t{option.label}\n\t\t\t\t\t</SelectItem>\n\t\t\t\t))}\n\t\t\t</SelectContent>\n\t\t</Select>\n\t);\n};\n\nconst LogSortOrder = ({\n\tsortOrder,\n\tsetSortOrder,\n}: {\n\tsortOrder: \"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\";\n\tsetSortOrder: (sortOrder: \"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\") => void;\n}) => (\n\t<Select\n\t\tvalue={sortOrder}\n\t\tonValueChange={(value) =>\n\t\t\tsetSortOrder(value as \"TIMESTAMP_ASC\" | \"TIMESTAMP_DESC\")\n\t\t}\n\t>\n\t\t<SelectTrigger aria-label=\"log sort order\">\n\t\t\t<SelectValue placeholder=\"Sort log order\" />\n\t\t</SelectTrigger>\n\t\t<SelectContent>\n\t\t\t<SelectItem value=\"TIMESTAMP_ASC\">Oldest to newest</SelectItem>\n\t\t\t<SelectItem value=\"TIMESTAMP_DESC\">Newest to oldest</SelectItem>\n\t\t</SelectContent>\n\t</Select>\n);\n","import { useEffect } from \"react\";\n\ntype StateType =\n\t| \"SCHEDULED\"\n\t| \"PENDING\"\n\t| \"RUNNING\"\n\t| \"COMPLETED\"\n\t| \"FAILED\"\n\t| \"CANCELLED\"\n\t| \"CANCELLING\"\n\t| \"CRASHED\"\n\t| \"PAUSED\";\n\nfunction getPreferredColorScheme(): \"dark\" | \"light\" | \"no-preference\" {\n\tif (window.matchMedia(\"(prefers-color-scheme: dark)\").matches) {\n\t\treturn \"dark\";\n\t}\n\tif (window.matchMedia(\"(prefers-color-scheme: light)\").matches) {\n\t\treturn \"light\";\n\t}\n\treturn \"no-preference\";\n}\n\n/**\n * A hook that sets the browser favicon based on the provided state type.\n * Resets the favicon to the default when the component unmounts.\n *\n * @param stateType - The state type to display in the favicon (e.g., \"COMPLETED\", \"FAILED\")\n * @returns void\n *\n * @example\n * ```tsx\n * // Set favicon based on task run state\n * useStateFavicon(taskRun.state_type);\n * ```\n */\nexport function useStateFavicon(stateType: StateType | null | undefined): void {\n\tuseEffect(() => {\n\t\tconst colorScheme = getPreferredColorScheme();\n\t\tconst favicon16 =\n\t\t\tcolorScheme === \"dark\"\n\t\t\t\t? document.getElementById(\"favicon-16-dark\")\n\t\t\t\t: document.getElementById(\"favicon-16\");\n\t\tconst favicon32 =\n\t\t\tcolorScheme === \"dark\"\n\t\t\t\t? document.getElementById(\"favicon-32-dark\")\n\t\t\t\t: document.getElementById(\"favicon-32\");\n\n\t\tif (stateType) {\n\t\t\tconst faviconPath = `/${stateType.toLowerCase()}.svg`;\n\t\t\tfavicon16?.setAttribute(\"href\", faviconPath);\n\t\t\tfavicon32?.setAttribute(\"href\", faviconPath);\n\t\t}\n\n\t\treturn () => {\n\t\t\t// Reset to default favicon on unmount\n\t\t\tif (colorScheme === \"dark\") {\n\t\t\t\tfavicon16?.setAttribute(\"href\", \"/favicon-16x16-dark.png\");\n\t\t\t\tfavicon32?.setAttribute(\"href\", \"/favicon-32x32-dark.png\");\n\t\t\t} else {\n\t\t\t\tfavicon16?.setAttribute(\"href\", \"/favicon-16x16.png\");\n\t\t\t\tfavicon32?.setAttribute(\"href\", \"/favicon-32x32.png\");\n\t\t\t}\n\t\t};\n\t}, [stateType]);\n}\n","import { useSuspenseQuery } from \"@tanstack/react-query\";\nimport { useRouter } from \"@tanstack/react-router\";\nimport { MoreVertical } from \"lucide-react\";\nimport { Suspense, useEffect, useState } from \"react\";\nimport { toast } from \"sonner\";\nimport {\n\tbuildGetTaskRunDetailsQuery,\n\ttype TaskRun,\n\tuseDeleteTaskRun,\n\tuseSetTaskRunState,\n} from \"@/api/task-runs\";\nimport { TaskRunArtifacts } from \"@/components/task-runs/task-run-artifacts\";\nimport { TaskRunDetails } from \"@/components/task-runs/task-run-details/task-run-details\";\nimport { TaskRunLogs } from \"@/components/task-runs/task-run-logs\";\nimport {\n\tBreadcrumb,\n\tBreadcrumbItem,\n\tBreadcrumbLink,\n\tBreadcrumbList,\n\tBreadcrumbPage,\n\tBreadcrumbSeparator,\n} from \"@/components/ui/breadcrumb\";\nimport { Button } from \"@/components/ui/button\";\nimport {\n\tChangeStateDialog,\n\tuseChangeStateDialog,\n} from \"@/components/ui/change-state-dialog\";\nimport {\n\tDeleteConfirmationDialog,\n\tuseDeleteConfirmationDialog,\n} from \"@/components/ui/delete-confirmation-dialog\";\nimport {\n\tDropdownMenu,\n\tDropdownMenuContent,\n\tDropdownMenuItem,\n\tDropdownMenuTrigger,\n} from \"@/components/ui/dropdown-menu\";\nimport { Icon } from \"@/components/ui/icons\";\nimport { LazyJsonInput as JsonInput } from \"@/components/ui/json-input-lazy\";\nimport { Skeleton } from \"@/components/ui/skeleton\";\nimport { StateBadge } from \"@/components/ui/state-badge\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"@/components/ui/tabs\";\nimport {\n\tTooltip,\n\tTooltipContent,\n\tTooltipTrigger,\n} from \"@/components/ui/tooltip\";\nimport { usePageTitle } from \"@/hooks/use-page-title\";\nimport { useStateFavicon } from \"@/hooks/use-state-favicon\";\n\ntype TaskRunDetailsPageProps = {\n\tid: string;\n\ttab: TaskRunDetailsTabOptions;\n\tonTabChange: (tab: TaskRunDetailsTabOptions) => void;\n};\n\ntype TaskRunDetailsTabOptions = \"Logs\" | \"Artifacts\" | \"TaskInputs\" | \"Details\";\n\nexport const TaskRunDetailsPage = ({\n\tid,\n\ttab,\n\tonTabChange,\n}: TaskRunDetailsPageProps) => {\n\tconst [refetchInterval, setRefetchInterval] = useState<number | false>(false);\n\tconst { data: taskRun } = useSuspenseQuery({\n\t\t...buildGetTaskRunDetailsQuery(id),\n\t\trefetchInterval,\n\t});\n\tconst { deleteTaskRun } = useDeleteTaskRun();\n\tconst { navigate } = useRouter();\n\n\t// Set page title based on task run name\n\tusePageTitle(taskRun?.name ? `Task Run: ${taskRun.name}` : \"Task Run\");\n\n\t// Set favicon based on task run state\n\tuseStateFavicon(taskRun?.state_type);\n\n\tuseEffect(() => {\n\t\tif (taskRun.state_type === \"RUNNING\" || taskRun.state_type === \"PENDING\") {\n\t\t\tsetRefetchInterval(5000);\n\t\t} else {\n\t\t\tsetRefetchInterval(false);\n\t\t}\n\t}, [taskRun]);\n\n\tconst onDeleteRunClicked = () => {\n\t\tdeleteTaskRun(\n\t\t\t{ id: taskRun.id },\n\t\t\t{\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\tsetRefetchInterval(false);\n\t\t\t\t\ttoast.success(\"Task run deleted\");\n\t\t\t\t\tif (taskRun.flow_run_id) {\n\t\t\t\t\t\tvoid navigate({\n\t\t\t\t\t\t\tto: \"/runs/flow-run/$id\",\n\t\t\t\t\t\t\tparams: { id: taskRun.flow_run_id },\n\t\t\t\t\t\t\treplace: true,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvoid navigate({ to: \"/runs\", replace: true });\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\tconst message =\n\t\t\t\t\t\terror.message || \"Unknown error while deleting task run.\";\n\t\t\t\t\ttoast.error(message);\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t\t<Header taskRun={taskRun} onDeleteRunClicked={onDeleteRunClicked} />\n\t\t\t</div>\n\t\t\t<div className=\"grid lg:grid-cols-[1fr_250px] grid-cols-[1fr] gap-4\">\n\t\t\t\t<TabsLayout\n\t\t\t\t\tcurrentTab={tab}\n\t\t\t\t\tonTabChange={onTabChange}\n\t\t\t\t\tlogsContent={\n\t\t\t\t\t\t<Suspense fallback={<LogsSkeleton />}>\n\t\t\t\t\t\t\t<TaskRunLogs taskRun={taskRun} />\n\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t}\n\t\t\t\t\tartifactsContent={\n\t\t\t\t\t\t<Suspense fallback={<ArtifactsSkeleton />}>\n\t\t\t\t\t\t\t<TaskRunArtifacts taskRun={taskRun} />\n\t\t\t\t\t\t</Suspense>\n\t\t\t\t\t}\n\t\t\t\t\ttaskInputsContent={<TaskInputs taskRun={taskRun} />}\n\t\t\t\t\tdetailsContent={<TaskRunDetails taskRun={taskRun} />}\n\t\t\t\t/>\n\t\t\t\t<div className=\"hidden lg:block\">\n\t\t\t\t\t<TaskRunDetails taskRun={taskRun} />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nconst Header = ({\n\ttaskRun,\n\tonDeleteRunClicked,\n}: {\n\ttaskRun: TaskRun;\n\tonDeleteRunClicked: () => void;\n}) => {\n\tconst [dialogState, confirmDelete] = useDeleteConfirmationDialog();\n\tconst {\n\t\topen: isChangeStateOpen,\n\t\tonOpenChange: setChangeStateOpen,\n\t\topenDialog: openChangeState,\n\t} = useChangeStateDialog();\n\tconst { setTaskRunState, isPending: isChangingState } = useSetTaskRunState();\n\n\tconst canChangeState =\n\t\ttaskRun.state_type &&\n\t\t[\"COMPLETED\", \"FAILED\", \"CANCELLED\", \"CRASHED\"].includes(\n\t\t\ttaskRun.state_type,\n\t\t);\n\n\tconst handleChangeState = (newState: { type: string; message?: string }) => {\n\t\tsetTaskRunState(\n\t\t\t{\n\t\t\t\tid: taskRun.id,\n\t\t\t\tstate: {\n\t\t\t\t\ttype: newState.type as\n\t\t\t\t\t\t| \"COMPLETED\"\n\t\t\t\t\t\t| \"FAILED\"\n\t\t\t\t\t\t| \"CANCELLED\"\n\t\t\t\t\t\t| \"CRASHED\",\n\t\t\t\t\tname: newState.type.charAt(0) + newState.type.slice(1).toLowerCase(),\n\t\t\t\t\tmessage: newState.message,\n\t\t\t\t},\n\t\t\t\tforce: true,\n\t\t\t},\n\t\t\t{\n\t\t\t\tonSuccess: () => {\n\t\t\t\t\ttoast.success(\"Task run state changed\");\n\t\t\t\t\tsetChangeStateOpen(false);\n\t\t\t\t},\n\t\t\t\tonError: (error) => {\n\t\t\t\t\ttoast.error(error.message || \"Failed to change state\");\n\t\t\t\t},\n\t\t\t},\n\t\t);\n\t};\n\n\treturn (\n\t\t<div className=\"flex flex-row justify-between\">\n\t\t\t<Breadcrumb>\n\t\t\t\t<BreadcrumbList>\n\t\t\t\t\t<BreadcrumbItem>\n\t\t\t\t\t\t<BreadcrumbLink\n\t\t\t\t\t\t\tto=\"/runs\"\n\t\t\t\t\t\t\tsearch={{ tab: \"task-runs\" }}\n\t\t\t\t\t\t\tclassName=\"text-xl font-semibold\"\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\tRuns\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{taskRun.flow_run_id && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<BreadcrumbItem>\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: taskRun.flow_run_id }}\n\t\t\t\t\t\t\t\t\tclassName=\"text-xl font-semibold\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{taskRun.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<BreadcrumbItem className=\"text-xl\">\n\t\t\t\t\t\t<BreadcrumbPage className=\"font-semibold\">\n\t\t\t\t\t\t\t{taskRun.name}\n\t\t\t\t\t\t</BreadcrumbPage>\n\t\t\t\t\t\t{taskRun.state && (\n\t\t\t\t\t\t\t<StateBadge\n\t\t\t\t\t\t\t\ttype={taskRun.state.type}\n\t\t\t\t\t\t\t\tname={taskRun.state.name}\n\t\t\t\t\t\t\t\tclassName=\"ml-2\"\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</BreadcrumbItem>\n\t\t\t\t</BreadcrumbList>\n\t\t\t</Breadcrumb>\n\t\t\t<DropdownMenu>\n\t\t\t\t<DropdownMenuTrigger asChild>\n\t\t\t\t\t<Button variant=\"outline\" className=\"p-2\">\n\t\t\t\t\t\t<MoreVertical className=\"w-4 h-4\" />\n\t\t\t\t\t</Button>\n\t\t\t\t</DropdownMenuTrigger>\n\t\t\t\t<DropdownMenuContent>\n\t\t\t\t\t{canChangeState && (\n\t\t\t\t\t\t<DropdownMenuItem onClick={openChangeState}>\n\t\t\t\t\t\t\tChange state\n\t\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t)}\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\ttoast.success(\"Copied task run ID to clipboard\");\n\t\t\t\t\t\t\tvoid navigator.clipboard.writeText(taskRun.id);\n\t\t\t\t\t\t}}\n\t\t\t\t\t>\n\t\t\t\t\t\tCopy ID\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t\t<DropdownMenuItem\n\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\tconfirmDelete({\n\t\t\t\t\t\t\t\ttitle: \"Delete Task Run\",\n\t\t\t\t\t\t\t\tdescription: `Are you sure you want to delete task run ${taskRun.name}?`,\n\t\t\t\t\t\t\t\tonConfirm: onDeleteRunClicked,\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}\n\t\t\t\t\t>\n\t\t\t\t\t\tDelete\n\t\t\t\t\t</DropdownMenuItem>\n\t\t\t\t</DropdownMenuContent>\n\t\t\t</DropdownMenu>\n\t\t\t<DeleteConfirmationDialog {...dialogState} />\n\t\t\t<ChangeStateDialog\n\t\t\t\topen={isChangeStateOpen}\n\t\t\t\tonOpenChange={setChangeStateOpen}\n\t\t\t\tcurrentState={\n\t\t\t\t\ttaskRun.state\n\t\t\t\t\t\t? {\n\t\t\t\t\t\t\t\ttype: taskRun.state.type,\n\t\t\t\t\t\t\t\tname:\n\t\t\t\t\t\t\t\t\ttaskRun.state.name ??\n\t\t\t\t\t\t\t\t\ttaskRun.state.type.charAt(0) +\n\t\t\t\t\t\t\t\t\t\ttaskRun.state.type.slice(1).toLowerCase(),\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t: null\n\t\t\t\t}\n\t\t\t\tlabel=\"Task Run\"\n\t\t\t\tonConfirm={handleChangeState}\n\t\t\t\tisLoading={isChangingState}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n\nconst TabsLayout = ({\n\tcurrentTab,\n\tonTabChange,\n\tlogsContent,\n\tartifactsContent,\n\ttaskInputsContent,\n\tdetailsContent,\n}: {\n\tcurrentTab: TaskRunDetailsTabOptions;\n\tonTabChange: (tab: TaskRunDetailsTabOptions) => void;\n\tlogsContent: React.ReactNode;\n\tartifactsContent: React.ReactNode;\n\ttaskInputsContent: React.ReactNode;\n\tdetailsContent: React.ReactNode;\n}) => {\n\t// Change tab on screen size change when the details tab is selected\n\tuseEffect(() => {\n\t\tconst bp = getComputedStyle(document.documentElement)\n\t\t\t.getPropertyValue(\"--breakpoint-lg\")\n\t\t\t.trim();\n\t\tconst mql = window.matchMedia(`(max-width: ${bp})`);\n\t\tconst onChange = () => {\n\t\t\tif (currentTab === \"Details\") {\n\t\t\t\tonTabChange(\"Logs\");\n\t\t\t}\n\t\t};\n\t\tmql.addEventListener(\"change\", onChange);\n\t\treturn () => mql.removeEventListener(\"change\", onChange);\n\t}, [currentTab, onTabChange]);\n\n\treturn (\n\t\t<Tabs\n\t\t\tvalue={currentTab}\n\t\t\tonValueChange={(value) => onTabChange(value as TaskRunDetailsTabOptions)}\n\t\t>\n\t\t\t<TabsList>\n\t\t\t\t<TabsTrigger value=\"Details\" className=\"lg:hidden\">\n\t\t\t\t\tDetails\n\t\t\t\t</TabsTrigger>\n\t\t\t\t<TabsTrigger value=\"Logs\">Logs</TabsTrigger>\n\t\t\t\t<TabsTrigger value=\"Artifacts\">Artifacts</TabsTrigger>\n\t\t\t\t<TabsTrigger value=\"TaskInputs\">\n\t\t\t\t\tTask Inputs\n\t\t\t\t\t<Tooltip>\n\t\t\t\t\t\t<TooltipTrigger asChild>\n\t\t\t\t\t\t\t<Icon id=\"Info\" className=\"w-4 h-4\" />\n\t\t\t\t\t\t</TooltipTrigger>\n\t\t\t\t\t\t<TooltipContent>\n\t\t\t\t\t\t\tTask inputs show parameter keys and can also show task run\n\t\t\t\t\t\t\trelationships.\n\t\t\t\t\t\t</TooltipContent>\n\t\t\t\t\t</Tooltip>\n\t\t\t\t</TabsTrigger>\n\t\t\t</TabsList>\n\t\t\t<TabsContent value=\"Details\">{detailsContent}</TabsContent>\n\t\t\t<TabsContent value=\"Logs\">{logsContent}</TabsContent>\n\t\t\t<TabsContent value=\"Artifacts\">{artifactsContent}</TabsContent>\n\t\t\t<TabsContent value=\"TaskInputs\">{taskInputsContent}</TabsContent>\n\t\t</Tabs>\n\t);\n};\n\nconst LogsSkeleton = () => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t<div className=\"flex flex-row gap-2 justify-end\">\n\t\t\t\t<Skeleton className=\"h-8 w-25\" />\n\t\t\t\t<Skeleton className=\"h-8 w-32\" />\n\t\t\t</div>\n\t\t\t<Skeleton className=\"h-32\" />\n\t\t</div>\n\t);\n};\n\nconst ArtifactsSkeleton = () => {\n\treturn (\n\t\t<div className=\"flex flex-col gap-2\">\n\t\t\t<div className=\"flex flex-row justify-end\">\n\t\t\t\t<Skeleton className=\"h-8 w-12\" />\n\t\t\t</div>\n\n\t\t\t<div className=\"grid grid-cols-1 gap-4 lg:grid-cols-2 xl:grid-cols-3\">\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t\t<Skeleton className=\"h-40\" />\n\t\t\t</div>\n\t\t</div>\n\t);\n};\n\nconst TaskInputs = ({ taskRun }: { taskRun: TaskRun }) => {\n\treturn (\n\t\t<JsonInput\n\t\t\tvalue={JSON.stringify(taskRun.task_inputs, null, 2)}\n\t\t\tdisabled\n\t\t\tcopy\n\t\t/>\n\t);\n};\n","import type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute, useNavigate } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { z } from \"zod\";\nimport { buildListArtifactsQuery } from \"@/api/artifacts\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport { buildInfiniteFilterLogsQuery } from \"@/api/logs\";\nimport { buildGetTaskRunDetailsQuery } from \"@/api/task-runs\";\nimport { TaskRunDetailsPage } from \"@/components/task-runs/task-run-details-page\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\n\nconst searchParams = z.object({\n\ttab: z\n\t\t.enum([\"Logs\", \"Artifacts\", \"TaskInputs\", \"Details\"])\n\t\t.default(\"Logs\")\n\t\t.catch(\"Logs\"),\n});\n\nexport type TaskRunDetailsTabOptions = z.infer<typeof searchParams>[\"tab\"];\n\nfunction TaskRunErrorComponent({ error, reset }: ErrorComponentProps) {\n\tconst serverError = categorizeError(error, \"Failed to load task run\");\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div>\n\t\t\t\t<h1 className=\"text-2xl font-semibold\">Task Run</h1>\n\t\t\t</div>\n\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t</div>\n\t);\n}\n\nexport const Route = createFileRoute(\"/runs/task-run/$id\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: RouteComponent,\n\tloader: async ({ params, context: { queryClient } }) => {\n\t\t// ----- Deferred data\n\t\tvoid queryClient.prefetchInfiniteQuery(\n\t\t\tbuildInfiniteFilterLogsQuery({\n\t\t\t\tlimit: 50,\n\t\t\t\tsort: \"TIMESTAMP_ASC\",\n\t\t\t\tlogs: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tlevel: {\n\t\t\t\t\t\tge_: 0,\n\t\t\t\t\t},\n\t\t\t\t\ttask_run_id: {\n\t\t\t\t\t\tany_: [params.id],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildListArtifactsQuery({\n\t\t\t\tartifacts: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\ttask_run_id: {\n\t\t\t\t\t\tany_: [params.id],\n\t\t\t\t\t},\n\t\t\t\t\ttype: {\n\t\t\t\t\t\tnot_any_: [\"result\"],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tsort: \"ID_DESC\",\n\t\t\t\toffset: 0,\n\t\t\t}),\n\t\t);\n\n\t\t// ----- Critical data\n\t\tawait queryClient.ensureQueryData(buildGetTaskRunDetailsQuery(params.id));\n\t},\n\twrapInSuspense: true,\n\terrorComponent: TaskRunErrorComponent,\n});\n\nfunction RouteComponent() {\n\tconst { id } = Route.useParams();\n\tconst { tab } = Route.useSearch();\n\tconst navigate = useNavigate();\n\n\tconst onTabChange = (tab: TaskRunDetailsTabOptions) => {\n\t\tvoid navigate({\n\t\t\tto: \".\",\n\t\t\tsearch: (prev) => ({\n\t\t\t\t...prev,\n\t\t\t\ttab,\n\t\t\t}),\n\t\t});\n\t};\n\n\treturn <TaskRunDetailsPage id={id} tab={tab} onTabChange={onTabChange} />;\n}\n"],"names":["TaskRunArtifacts","taskRun","view","setView","useState","artifacts","useSuspenseQuery","buildListArtifactsQuery","Card","jsx","CardContent","jsxs","ToggleGroup","value","ToggleGroupItem","LayoutGrid","Rows3","cn","artifact","ArtifactCard","formatTaskDate","dateString","formatDate","formatTaskDuration","seconds","humanizeDuration","TaskRunDetails","resultArtifact","useQuery","buildGetTaskRunResultQuery","Link","Icon","LazyMarkdown","tag","TagBadge","TaskRunLogs","virtualize","levelFilter","setLevelFilter","sortOrder","setSortOrder","queryOptions","useMemo","buildInfiniteFilterLogsQuery","logs","hasNextPage","fetchNextPage","isFetchingNextPage","useSuspenseInfiniteQuery","noLogs","message","LogLevelFilter","LogSortOrder","RunLogs","error","LEVEL_FILTER_OPTIONS","Select","SelectTrigger","option","SelectContent","SelectItem","SelectValue","getPreferredColorScheme","useStateFavicon","stateType","useEffect","colorScheme","favicon16","favicon32","faviconPath","TaskRunDetailsPage","id","tab","onTabChange","refetchInterval","setRefetchInterval","buildGetTaskRunDetailsQuery","deleteTaskRun","useDeleteTaskRun","navigate","useRouter","usePageTitle","onDeleteRunClicked","toast","Header","TabsLayout","Suspense","LogsSkeleton","ArtifactsSkeleton","TaskInputs","dialogState","confirmDelete","useDeleteConfirmationDialog","isChangeStateOpen","setChangeStateOpen","openChangeState","useChangeStateDialog","setTaskRunState","isChangingState","useSetTaskRunState","canChangeState","handleChangeState","newState","Breadcrumb","BreadcrumbList","BreadcrumbItem","BreadcrumbLink","BreadcrumbSeparator","Fragment","BreadcrumbPage","StateBadge","DropdownMenu","DropdownMenuTrigger","Button","MoreVertical","DropdownMenuContent","DropdownMenuItem","DeleteConfirmationDialog","ChangeStateDialog","currentTab","logsContent","artifactsContent","taskInputsContent","detailsContent","bp","mql","onChange","Tabs","TabsList","TabsTrigger","Tooltip","TooltipTrigger","TooltipContent","TabsContent","Skeleton","JsonInput","z","default","catch","RouteComponent","Route","useParams","useSearch","useNavigate","to","search","prev"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{j as r}from"./vendor-tanstack-BK8oseNA.js";import{s}from"./index-D5RdrxkU.js";import{R as a}from"./route-error-state-BJXl8qkX.js";import{o as i,e as m}from"./vendor-forms-DxqqmhL5.js";import"./vendor-react-Bce9NwRC.js";import"./vendor-radix-CznP1SOq.js";import"./vendor-recharts-D4imLXNl.js";import"./vendor-date-7GxEwcQM.js";i({tab:m(["Logs","Artifacts","TaskInputs","Details"]).default("Logs").catch("Logs")});function j({error:o,reset:t}){const e=s(o,"Failed to load task run");return r.jsxs("div",{className:"flex flex-col gap-4",children:[r.jsx("div",{children:r.jsx("h1",{className:"text-2xl font-semibold",children:"Task Run"})}),r.jsx(a,{error:e,onRetry:t})]})}export{j as errorComponent};
2
+ //# sourceMappingURL=task-run._id-udkz1lhh.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"task-run._id-CnIVqU6v.js","sources":["../../src/routes/runs/task-run.$id.tsx?tsr-split=errorComponent"],"sourcesContent":["import type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute, useNavigate } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { z } from \"zod\";\nimport { buildListArtifactsQuery } from \"@/api/artifacts\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport { buildInfiniteFilterLogsQuery } from \"@/api/logs\";\nimport { buildGetTaskRunDetailsQuery } from \"@/api/task-runs\";\nimport { TaskRunDetailsPage } from \"@/components/task-runs/task-run-details-page\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\n\nconst searchParams = z.object({\n\ttab: z\n\t\t.enum([\"Logs\", \"Artifacts\", \"TaskInputs\", \"Details\"])\n\t\t.default(\"Logs\")\n\t\t.catch(\"Logs\"),\n});\n\nexport type TaskRunDetailsTabOptions = z.infer<typeof searchParams>[\"tab\"];\n\nfunction TaskRunErrorComponent({ error, reset }: ErrorComponentProps) {\n\tconst serverError = categorizeError(error, \"Failed to load task run\");\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div>\n\t\t\t\t<h1 className=\"text-2xl font-semibold\">Task Run</h1>\n\t\t\t</div>\n\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t</div>\n\t);\n}\n\nexport const Route = createFileRoute(\"/runs/task-run/$id\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: RouteComponent,\n\tloader: async ({ params, context: { queryClient } }) => {\n\t\t// ----- Deferred data\n\t\tvoid queryClient.prefetchInfiniteQuery(\n\t\t\tbuildInfiniteFilterLogsQuery({\n\t\t\t\tlimit: 50,\n\t\t\t\tsort: \"TIMESTAMP_ASC\",\n\t\t\t\tlogs: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tlevel: {\n\t\t\t\t\t\tge_: 0,\n\t\t\t\t\t},\n\t\t\t\t\ttask_run_id: {\n\t\t\t\t\t\tany_: [params.id],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildListArtifactsQuery({\n\t\t\t\tartifacts: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\ttask_run_id: {\n\t\t\t\t\t\tany_: [params.id],\n\t\t\t\t\t},\n\t\t\t\t\ttype: {\n\t\t\t\t\t\tnot_any_: [\"result\"],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tsort: \"ID_DESC\",\n\t\t\t\toffset: 0,\n\t\t\t}),\n\t\t);\n\n\t\t// ----- Critical data\n\t\tawait queryClient.ensureQueryData(buildGetTaskRunDetailsQuery(params.id));\n\t},\n\twrapInSuspense: true,\n\terrorComponent: TaskRunErrorComponent,\n});\n\nfunction RouteComponent() {\n\tconst { id } = Route.useParams();\n\tconst { tab } = Route.useSearch();\n\tconst navigate = useNavigate();\n\n\tconst onTabChange = (tab: TaskRunDetailsTabOptions) => {\n\t\tvoid navigate({\n\t\t\tto: \".\",\n\t\t\tsearch: (prev) => ({\n\t\t\t\t...prev,\n\t\t\t\ttab,\n\t\t\t}),\n\t\t});\n\t};\n\n\treturn <TaskRunDetailsPage id={id} tab={tab} onTabChange={onTabChange} />;\n}\n"],"names":["z","tab","default","catch","TaskRunErrorComponent","error","reset","serverError","categorizeError","jsxs","jsx","RouteErrorState"],"mappings":"kVAWqBA,EAAS,CAC7BC,IAAKD,EACE,CAAC,OAAQ,YAAa,aAAc,SAAS,CAAC,EACnDE,QAAQ,MAAM,EACdC,MAAM,MAAM,CACf,CAAC,EAID,SAASC,EAAsB,CAAEC,MAAAA,EAAOC,MAAAA,CAA2B,EAAG,CACrE,MAAMC,EAAcC,EAAgBH,EAAO,yBAAyB,EACpE,OACCI,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAC,EAAAA,IAAC,OACA,SAAAA,EAAAA,IAAC,KAAA,CAAG,UAAU,yBAAyB,oBAAQ,CAAA,CAChD,EACAA,EAAAA,IAACC,EAAA,CAAgB,MAAOJ,EAAa,QAASD,CAAAA,CAAM,CAAA,EACrD,CAEF"}
1
+ {"version":3,"file":"task-run._id-udkz1lhh.js","sources":["../../src/routes/runs/task-run.$id.tsx?tsr-split=errorComponent"],"sourcesContent":["import type { ErrorComponentProps } from \"@tanstack/react-router\";\nimport { createFileRoute, useNavigate } from \"@tanstack/react-router\";\nimport { zodValidator } from \"@tanstack/zod-adapter\";\nimport { z } from \"zod\";\nimport { buildListArtifactsQuery } from \"@/api/artifacts\";\nimport { categorizeError } from \"@/api/error-utils\";\nimport { buildInfiniteFilterLogsQuery } from \"@/api/logs\";\nimport { buildGetTaskRunDetailsQuery } from \"@/api/task-runs\";\nimport { TaskRunDetailsPage } from \"@/components/task-runs/task-run-details-page\";\nimport { RouteErrorState } from \"@/components/ui/route-error-state\";\n\nconst searchParams = z.object({\n\ttab: z\n\t\t.enum([\"Logs\", \"Artifacts\", \"TaskInputs\", \"Details\"])\n\t\t.default(\"Logs\")\n\t\t.catch(\"Logs\"),\n});\n\nexport type TaskRunDetailsTabOptions = z.infer<typeof searchParams>[\"tab\"];\n\nfunction TaskRunErrorComponent({ error, reset }: ErrorComponentProps) {\n\tconst serverError = categorizeError(error, \"Failed to load task run\");\n\treturn (\n\t\t<div className=\"flex flex-col gap-4\">\n\t\t\t<div>\n\t\t\t\t<h1 className=\"text-2xl font-semibold\">Task Run</h1>\n\t\t\t</div>\n\t\t\t<RouteErrorState error={serverError} onRetry={reset} />\n\t\t</div>\n\t);\n}\n\nexport const Route = createFileRoute(\"/runs/task-run/$id\")({\n\tvalidateSearch: zodValidator(searchParams),\n\tcomponent: RouteComponent,\n\tloader: async ({ params, context: { queryClient } }) => {\n\t\t// ----- Deferred data\n\t\tvoid queryClient.prefetchInfiniteQuery(\n\t\t\tbuildInfiniteFilterLogsQuery({\n\t\t\t\tlimit: 50,\n\t\t\t\tsort: \"TIMESTAMP_ASC\",\n\t\t\t\tlogs: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\tlevel: {\n\t\t\t\t\t\tge_: 0,\n\t\t\t\t\t},\n\t\t\t\t\ttask_run_id: {\n\t\t\t\t\t\tany_: [params.id],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\n\t\tvoid queryClient.prefetchQuery(\n\t\t\tbuildListArtifactsQuery({\n\t\t\t\tartifacts: {\n\t\t\t\t\toperator: \"and_\",\n\t\t\t\t\ttask_run_id: {\n\t\t\t\t\t\tany_: [params.id],\n\t\t\t\t\t},\n\t\t\t\t\ttype: {\n\t\t\t\t\t\tnot_any_: [\"result\"],\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t\tsort: \"ID_DESC\",\n\t\t\t\toffset: 0,\n\t\t\t}),\n\t\t);\n\n\t\t// ----- Critical data\n\t\tawait queryClient.ensureQueryData(buildGetTaskRunDetailsQuery(params.id));\n\t},\n\twrapInSuspense: true,\n\terrorComponent: TaskRunErrorComponent,\n});\n\nfunction RouteComponent() {\n\tconst { id } = Route.useParams();\n\tconst { tab } = Route.useSearch();\n\tconst navigate = useNavigate();\n\n\tconst onTabChange = (tab: TaskRunDetailsTabOptions) => {\n\t\tvoid navigate({\n\t\t\tto: \".\",\n\t\t\tsearch: (prev) => ({\n\t\t\t\t...prev,\n\t\t\t\ttab,\n\t\t\t}),\n\t\t});\n\t};\n\n\treturn <TaskRunDetailsPage id={id} tab={tab} onTabChange={onTabChange} />;\n}\n"],"names":["z","tab","default","catch","TaskRunErrorComponent","error","reset","serverError","categorizeError","jsxs","jsx","RouteErrorState"],"mappings":"6UAWqBA,EAAS,CAC7BC,IAAKD,EACE,CAAC,OAAQ,YAAa,aAAc,SAAS,CAAC,EACnDE,QAAQ,MAAM,EACdC,MAAM,MAAM,CACf,CAAC,EAID,SAASC,EAAsB,CAAEC,MAAAA,EAAOC,MAAAA,CAA2B,EAAG,CACrE,MAAMC,EAAcC,EAAgBH,EAAO,yBAAyB,EACpE,OACCI,EAAAA,KAAC,MAAA,CAAI,UAAU,sBACd,SAAA,CAAAC,EAAAA,IAAC,OACA,SAAAA,EAAAA,IAAC,KAAA,CAAG,UAAU,yBAAyB,oBAAQ,CAAA,CAChD,EACAA,EAAAA,IAACC,EAAA,CAAgB,MAAOJ,EAAa,QAASD,CAAAA,CAAM,CAAA,EACrD,CAEF"}