prefect 3.6.12__py3-none-any.whl → 3.6.13.dev2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- prefect/_build_info.py +3 -3
- prefect/_internal/urls.py +29 -0
- prefect/_states.py +4 -1
- prefect/client/orchestration/_concurrency_limits/client.py +16 -16
- prefect/client/subscriptions.py +1 -1
- prefect/events/clients.py +52 -13
- prefect/runner/storage.py +3 -23
- prefect/server/ui-v2/assets/{artifact-card-Ds2tntMW.js → artifact-card-C8JEQRHl.js} +2 -2
- prefect/server/ui-v2/assets/{artifact-card-Ds2tntMW.js.map → artifact-card-C8JEQRHl.js.map} +1 -1
- prefect/server/ui-v2/assets/{artifact._id-erPNL0a8.js → artifact._id-67V8kTg9.js} +2 -2
- prefect/server/ui-v2/assets/{artifact._id-erPNL0a8.js.map → artifact._id-67V8kTg9.js.map} +1 -1
- prefect/server/ui-v2/assets/{automation-wizard-Bx9AQxRV.js → automation-wizard-DuxZ47Nn.js} +2 -2
- prefect/server/ui-v2/assets/{automation-wizard-Bx9AQxRV.js.map → automation-wizard-DuxZ47Nn.js.map} +1 -1
- prefect/server/ui-v2/assets/automation._id-D8S8r4Ji.js +2 -0
- prefect/server/ui-v2/assets/{automation._id-IHh5QJwE.js.map → automation._id-D8S8r4Ji.js.map} +1 -1
- prefect/server/ui-v2/assets/{automation_._id.edit-Ds8vO0c5.js → automation_._id.edit-C1fOM0Hx.js} +2 -2
- prefect/server/ui-v2/assets/{automation_._id.edit-Ds8vO0c5.js.map → automation_._id.edit-C1fOM0Hx.js.map} +1 -1
- prefect/server/ui-v2/assets/{automations-header-C6aUe5Tw.js → automations-header-DrijTNGi.js} +2 -2
- prefect/server/ui-v2/assets/{automations-header-C6aUe5Tw.js.map → automations-header-DrijTNGi.js.map} +1 -1
- prefect/server/ui-v2/assets/{base-job-template-form-section-a-9TFMcW.js → base-job-template-form-section-BDkqOkpe.js} +2 -2
- prefect/server/ui-v2/assets/{base-job-template-form-section-a-9TFMcW.js.map → base-job-template-form-section-BDkqOkpe.js.map} +1 -1
- prefect/server/ui-v2/assets/{block-type-details-eq3Wg2ht.js → block-type-details-CrFHWH5D.js} +2 -2
- prefect/server/ui-v2/assets/{block-type-details-eq3Wg2ht.js.map → block-type-details-CrFHWH5D.js.map} +1 -1
- prefect/server/ui-v2/assets/block-type-logo-WQNm0PzP.js +2 -0
- prefect/server/ui-v2/assets/{block-type-logo-B31LJm5H.js.map → block-type-logo-WQNm0PzP.js.map} +1 -1
- prefect/server/ui-v2/assets/{block._id-OVdz3htC.js → block._id-C3gN1Ae8.js} +2 -2
- prefect/server/ui-v2/assets/{block._id-OVdz3htC.js.map → block._id-C3gN1Ae8.js.map} +1 -1
- prefect/server/ui-v2/assets/block_._id.edit-DzPuSvat.js +2 -0
- prefect/server/ui-v2/assets/{block_._id.edit-CIhIBJrm.js.map → block_._id.edit-DzPuSvat.js.map} +1 -1
- prefect/server/ui-v2/assets/catalog-T-7MqsyE.js +2 -0
- prefect/server/ui-v2/assets/{catalog-CfniU0UV.js.map → catalog-T-7MqsyE.js.map} +1 -1
- prefect/server/ui-v2/assets/catalog_._slug-DMOI61fc.js +2 -0
- prefect/server/ui-v2/assets/{catalog_._slug-C9p86T4s.js.map → catalog_._slug-DMOI61fc.js.map} +1 -1
- prefect/server/ui-v2/assets/catalog_._slug_.create-l9bGUPi-.js +2 -0
- prefect/server/ui-v2/assets/{catalog_._slug_.create-BhSunL__.js.map → catalog_._slug_.create-l9bGUPi-.js.map} +1 -1
- prefect/server/ui-v2/assets/{collapsible-DBD7wjpi.js → collapsible-DM-Ze5-Y.js} +2 -2
- prefect/server/ui-v2/assets/{collapsible-DBD7wjpi.js.map → collapsible-DM-Ze5-Y.js.map} +1 -1
- prefect/server/ui-v2/assets/{concurrency-limit._id-C-XWq7Tf.js → concurrency-limit._id-BHEt9viF.js} +2 -2
- prefect/server/ui-v2/assets/{concurrency-limit._id-C-XWq7Tf.js.map → concurrency-limit._id-BHEt9viF.js.map} +1 -1
- prefect/server/ui-v2/assets/{create-Bj2t5YQq.js → create-BMxUOyN5.js} +2 -2
- prefect/server/ui-v2/assets/{create-Bj2t5YQq.js.map → create-BMxUOyN5.js.map} +1 -1
- prefect/server/ui-v2/assets/{create-noFojqGL.js → create-Cq-EAHVk.js} +2 -2
- prefect/server/ui-v2/assets/{create-noFojqGL.js.map → create-Cq-EAHVk.js.map} +1 -1
- prefect/server/ui-v2/assets/{data-table-BjFlVIyC.js → data-table-Bw8TZx9D.js} +2 -2
- prefect/server/ui-v2/assets/{data-table-BjFlVIyC.js.map → data-table-Bw8TZx9D.js.map} +1 -1
- prefect/server/ui-v2/assets/{delete-confirmation-dialog-COdZmNfa.js → delete-confirmation-dialog-CTdWZlGM.js} +2 -2
- prefect/server/ui-v2/assets/{delete-confirmation-dialog-COdZmNfa.js.map → delete-confirmation-dialog-CTdWZlGM.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-action-header-C6v2kZ6V.js → deployment-action-header-BObYqmI_.js} +2 -2
- prefect/server/ui-v2/assets/{deployment-action-header-C6v2kZ6V.js.map → deployment-action-header-BObYqmI_.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-form-D9d5sZM2.js → deployment-form-CntyhRrK.js} +3 -3
- prefect/server/ui-v2/assets/{deployment-form-D9d5sZM2.js.map → deployment-form-CntyhRrK.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment-links-Dy-M1Que.js → deployment-links-DBUSCaxB.js} +2 -2
- prefect/server/ui-v2/assets/{deployment-links-Dy-M1Que.js.map → deployment-links-DBUSCaxB.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment._id-CZlY9261.js → deployment._id-BXanVFA8.js} +2 -2
- prefect/server/ui-v2/assets/{deployment._id-CZlY9261.js.map → deployment._id-BXanVFA8.js.map} +1 -1
- prefect/server/ui-v2/assets/deployment._id-Q5cvHMX9.js +2 -0
- prefect/server/ui-v2/assets/{deployment._id-DVmqclRz.js.map → deployment._id-Q5cvHMX9.js.map} +1 -1
- prefect/server/ui-v2/assets/deployment_._id.duplicate-DB-4hHHc.js +2 -0
- prefect/server/ui-v2/assets/{deployment_._id.duplicate-DVMjpk5m.js.map → deployment_._id.duplicate-DB-4hHHc.js.map} +1 -1
- prefect/server/ui-v2/assets/deployment_._id.edit-CWf1RIGy.js +2 -0
- prefect/server/ui-v2/assets/{deployment_._id.edit-Ck_P6KDn.js.map → deployment_._id.edit-CWf1RIGy.js.map} +1 -1
- prefect/server/ui-v2/assets/{deployment_._id.run-Cht7AHDG.js → deployment_._id.run-CoHGXFoM.js} +2 -2
- prefect/server/ui-v2/assets/{deployment_._id.run-Cht7AHDG.js.map → deployment_._id.run-CoHGXFoM.js.map} +1 -1
- prefect/server/ui-v2/assets/{dropdown-menu-xZ_3w9OP.js → dropdown-menu-CT-s-V7d.js} +2 -2
- prefect/server/ui-v2/assets/{dropdown-menu-xZ_3w9OP.js.map → dropdown-menu-CT-s-V7d.js.map} +1 -1
- prefect/server/ui-v2/assets/{event._eventDate._eventId-CpexuXd6.js → event._eventDate._eventId-BITo_GYL.js} +2 -2
- prefect/server/ui-v2/assets/{event._eventDate._eventId-CpexuXd6.js.map → event._eventDate._eventId-BITo_GYL.js.map} +1 -1
- prefect/server/ui-v2/assets/flow-run-graph-DxIl6fzW.js +2 -0
- prefect/server/ui-v2/assets/flow-run-graph-DxIl6fzW.js.map +1 -0
- prefect/server/ui-v2/assets/{flow-run._id-ZBlKBwPO.js → flow-run._id-Bbm9OpDi.js} +2 -2
- prefect/server/ui-v2/assets/{flow-run._id-ZBlKBwPO.js.map → flow-run._id-Bbm9OpDi.js.map} +1 -1
- prefect/server/ui-v2/assets/flow-run._id-BtSgRDtA.js +2 -0
- prefect/server/ui-v2/assets/{flow-run._id-OL0YhyLW.js.map → flow-run._id-BtSgRDtA.js.map} +1 -1
- prefect/server/ui-v2/assets/flow-run._id-DJuMECRh.js +4 -0
- prefect/server/ui-v2/assets/flow-run._id-DJuMECRh.js.map +1 -0
- prefect/server/ui-v2/assets/flow-runs-pagination-LrU9Aio8.js +2 -0
- prefect/server/ui-v2/assets/flow-runs-pagination-LrU9Aio8.js.map +1 -0
- prefect/server/ui-v2/assets/flow._id-BJBRokk4.js +2 -0
- prefect/server/ui-v2/assets/{flow._id-DhrCicwR.js.map → flow._id-BJBRokk4.js.map} +1 -1
- prefect/server/ui-v2/assets/{form-BTub_PhK.js → form-CVSlEnl8.js} +2 -2
- prefect/server/ui-v2/assets/{form-BTub_PhK.js.map → form-CVSlEnl8.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-Dp9qi8fq.js → header-4plZZheZ.js} +2 -2
- prefect/server/ui-v2/assets/{header-Dp9qi8fq.js.map → header-4plZZheZ.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-B75eb688.js → header-9rXZ4r39.js} +2 -2
- prefect/server/ui-v2/assets/{header-B75eb688.js.map → header-9rXZ4r39.js.map} +1 -1
- prefect/server/ui-v2/assets/{header-6wmrKLU3.js → header-D3uM8_xM.js} +2 -2
- prefect/server/ui-v2/assets/{header-6wmrKLU3.js.map → header-D3uM8_xM.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-BA7ACCoL.js → index-6OsEYhIi.js} +2 -2
- prefect/server/ui-v2/assets/{index-BA7ACCoL.js.map → index-6OsEYhIi.js.map} +1 -1
- prefect/server/ui-v2/assets/index-B7xsJ-QH.js +2 -0
- prefect/server/ui-v2/assets/{index-CT_nG86y.js.map → index-B7xsJ-QH.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-CGWoVV2s.js → index-BeoNC2tJ.js} +2 -2
- prefect/server/ui-v2/assets/{index-CGWoVV2s.js.map → index-BeoNC2tJ.js.map} +1 -1
- prefect/server/ui-v2/assets/index-BfJLUM7N.js +2 -0
- prefect/server/ui-v2/assets/index-BfJLUM7N.js.map +1 -0
- prefect/server/ui-v2/assets/{index-DzMGV8GV.js → index-Bj0OOguP.js} +2 -2
- prefect/server/ui-v2/assets/{index-DzMGV8GV.js.map → index-Bj0OOguP.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-zpb5iSCL.js → index-BlpD74iH.js} +2 -2
- prefect/server/ui-v2/assets/{index-zpb5iSCL.js.map → index-BlpD74iH.js.map} +1 -1
- prefect/server/ui-v2/assets/index-BvSl3DKP.js +17 -0
- prefect/server/ui-v2/assets/index-BvSl3DKP.js.map +1 -0
- prefect/server/ui-v2/assets/index-CDwJvjUM.js +2 -0
- prefect/server/ui-v2/assets/{index-Cs8eFQKw.js.map → index-CDwJvjUM.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-UN2Tx4jH.js → index-CDyLkbVG.js} +2 -2
- prefect/server/ui-v2/assets/{index-UN2Tx4jH.js.map → index-CDyLkbVG.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-D08xgmV0.js → index-ChIrfjIW.js} +2 -2
- prefect/server/ui-v2/assets/{index-D08xgmV0.js.map → index-ChIrfjIW.js.map} +1 -1
- prefect/server/ui-v2/assets/index-CzCSgCK-.js +2 -0
- prefect/server/ui-v2/assets/{index-qPlIYf3i.js.map → index-CzCSgCK-.js.map} +1 -1
- prefect/server/ui-v2/assets/index-D5v9S-lB.js +2 -0
- prefect/server/ui-v2/assets/{index-B_3f8Hcb.js.map → index-D5v9S-lB.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DfiNsXba.js → index-D6GJ4go1.js} +2 -2
- prefect/server/ui-v2/assets/{index-DfiNsXba.js.map → index-D6GJ4go1.js.map} +1 -1
- prefect/server/ui-v2/assets/index-DJyKqsFO.js +2 -0
- prefect/server/ui-v2/assets/{index-H6bwm6L6.js.map → index-DJyKqsFO.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DSaSov8V.js → index-DODEq1Pi.js} +2 -2
- prefect/server/ui-v2/assets/{index-DSaSov8V.js.map → index-DODEq1Pi.js.map} +1 -1
- prefect/server/ui-v2/assets/index-DicK6p3K.js +2 -0
- prefect/server/ui-v2/assets/{index-7-r4ia_S.js.map → index-DicK6p3K.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DYOACRXY.js → index-DqCPbST9.js} +2 -2
- prefect/server/ui-v2/assets/{index-DYOACRXY.js.map → index-DqCPbST9.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-DOkFJdYY.js → index-DxPoKag8.js} +2 -2
- prefect/server/ui-v2/assets/{index-DOkFJdYY.js.map → index-DxPoKag8.js.map} +1 -1
- prefect/server/ui-v2/assets/index-NY089eTx.css +1 -0
- prefect/server/ui-v2/assets/{index-HGoNWFfP.js → index-h9-QgNjZ.js} +2 -2
- prefect/server/ui-v2/assets/{index-HGoNWFfP.js.map → index-h9-QgNjZ.js.map} +1 -1
- prefect/server/ui-v2/assets/{index-D3ILnEzm.js → index-tBdv6kBF.js} +2 -2
- prefect/server/ui-v2/assets/{index-D3ILnEzm.js.map → index-tBdv6kBF.js.map} +1 -1
- prefect/server/ui-v2/assets/index-udb79rgq.js +2 -0
- prefect/server/ui-v2/assets/{index-7ThYp9SY.js.map → index-udb79rgq.js.map} +1 -1
- prefect/server/ui-v2/assets/{json-input-9UPGqxTw.js → json-input-Dt1icmrn.js} +2 -2
- prefect/server/ui-v2/assets/{json-input-9UPGqxTw.js.map → json-input-Dt1icmrn.js.map} +1 -1
- prefect/server/ui-v2/assets/{key._key-CTFfXO_k.js → key._key-Cyh5MBX_.js} +2 -2
- prefect/server/ui-v2/assets/{key._key-CTFfXO_k.js.map → key._key-Cyh5MBX_.js.map} +1 -1
- prefect/server/ui-v2/assets/{lazy-markdown-BHwIrC8E.js → lazy-markdown-BwIwKFRF.js} +2 -2
- prefect/server/ui-v2/assets/{lazy-markdown-BHwIrC8E.js.map → lazy-markdown-BwIwKFRF.js.map} +1 -1
- prefect/server/ui-v2/assets/{login-kqmT29n7.js → login-DKXFVSwk.js} +2 -2
- prefect/server/ui-v2/assets/{login-kqmT29n7.js.map → login-DKXFVSwk.js.map} +1 -1
- prefect/server/ui-v2/assets/{markdown-input-BesmAbLS.js → markdown-input-Dp0mBlkV.js} +2 -2
- prefect/server/ui-v2/assets/{markdown-input-BesmAbLS.js.map → markdown-input-Dp0mBlkV.js.map} +1 -1
- prefect/server/ui-v2/assets/{python-example-snippet-COTWYn1Y.js → python-example-snippet-BYwPjHI5.js} +3 -3
- prefect/server/ui-v2/assets/{python-example-snippet-COTWYn1Y.js.map → python-example-snippet-BYwPjHI5.js.map} +1 -1
- prefect/server/ui-v2/assets/{python-input-Bjccebi0.js → python-input-y26XMqXw.js} +2 -2
- prefect/server/ui-v2/assets/{python-input-Bjccebi0.js.map → python-input-y26XMqXw.js.map} +1 -1
- prefect/server/ui-v2/assets/{radio-group-DkAK0M2h.js → radio-group-D0van45v.js} +2 -2
- prefect/server/ui-v2/assets/{radio-group-DkAK0M2h.js.map → radio-group-D0van45v.js.map} +1 -1
- prefect/server/ui-v2/assets/route-error-state-CGGpuCGN.js +2 -0
- prefect/server/ui-v2/assets/{route-error-state-ALftyvGl.js.map → route-error-state-CGGpuCGN.js.map} +1 -1
- prefect/server/ui-v2/assets/{schema-form-BR4E-WXE.js → schema-form-2tg5SXM4.js} +2 -2
- prefect/server/ui-v2/assets/{schema-form-BR4E-WXE.js.map → schema-form-2tg5SXM4.js.map} +1 -1
- prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-BhL8C5NS.js → schema-form-input-string-format-datetime-CZt6AJ4z.js} +4 -4
- prefect/server/ui-v2/assets/{schema-form-input-string-format-datetime-BhL8C5NS.js.map → schema-form-input-string-format-datetime-CZt6AJ4z.js.map} +1 -1
- prefect/server/ui-v2/assets/settings-DDUadk_N.js +2 -0
- prefect/server/ui-v2/assets/settings-DDUadk_N.js.map +1 -0
- prefect/server/ui-v2/assets/{sort-filter-BD4vwJXt.js → sort-filter-D9p3cPx9.js} +2 -2
- prefect/server/ui-v2/assets/{sort-filter-BD4vwJXt.js.map → sort-filter-D9p3cPx9.js.map} +1 -1
- prefect/server/ui-v2/assets/state-colors-CAAf0Eg3.js +2 -0
- prefect/server/ui-v2/assets/state-colors-CAAf0Eg3.js.map +1 -0
- prefect/server/ui-v2/assets/table-vo9Do8sA.js +2 -0
- prefect/server/ui-v2/assets/table-vo9Do8sA.js.map +1 -0
- prefect/server/ui-v2/assets/tags-input-Ci2JQ-k3.js +2 -0
- prefect/server/ui-v2/assets/tags-input-Ci2JQ-k3.js.map +1 -0
- prefect/server/ui-v2/assets/task-run-concurrency-limits-reset-dialog-CJzPc2gw.js +2 -0
- prefect/server/ui-v2/assets/{task-run-concurrency-limits-reset-dialog-CG3den1B.js.map → task-run-concurrency-limits-reset-dialog-CJzPc2gw.js.map} +1 -1
- prefect/server/ui-v2/assets/{task-run._id-DOcIzVi0.js → task-run._id-CjevSs79.js} +3 -3
- prefect/server/ui-v2/assets/{task-run._id-DOcIzVi0.js.map → task-run._id-CjevSs79.js.map} +1 -1
- prefect/server/ui-v2/assets/task-run._id-D8QKG5UZ.js +2 -0
- prefect/server/ui-v2/assets/{task-run._id-CnIVqU6v.js.map → task-run._id-D8QKG5UZ.js.map} +1 -1
- prefect/server/ui-v2/assets/task-runs-pagination-CifoSGct.js +2 -0
- prefect/server/ui-v2/assets/{task-runs-pagination-DLSAz-Ur.js.map → task-runs-pagination-CifoSGct.js.map} +1 -1
- prefect/server/ui-v2/assets/{textarea-D8LjlIx7.js → textarea-BAtfAxtV.js} +2 -2
- prefect/server/ui-v2/assets/{textarea-D8LjlIx7.js.map → textarea-BAtfAxtV.js.map} +1 -1
- prefect/server/ui-v2/assets/{timezone-select-BG3cL3-U.js → timezone-select-QlQTZSsF.js} +2 -2
- prefect/server/ui-v2/assets/{timezone-select-BG3cL3-U.js.map → timezone-select-QlQTZSsF.js.map} +1 -1
- prefect/server/ui-v2/assets/{toggle-group-D3zeurIL.js → toggle-group-BJN1vjEh.js} +2 -2
- prefect/server/ui-v2/assets/{toggle-group-D3zeurIL.js.map → toggle-group-BJN1vjEh.js.map} +1 -1
- prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-eOWJYPkD.js +2 -0
- prefect/server/ui-v2/assets/{use-delete-automation-confirmation-dialog-Bzy2ML2T.js.map → use-delete-automation-confirmation-dialog-eOWJYPkD.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-DRAP-Tnu.js → use-delete-block-document-confirmation-dialog-BTwSeHRM.js} +2 -2
- prefect/server/ui-v2/assets/{use-delete-block-document-confirmation-dialog-DRAP-Tnu.js.map → use-delete-block-document-confirmation-dialog-BTwSeHRM.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-D4yWonR8.js → use-flow-runs-selected-rows-BL_Gv9CC.js} +2 -2
- prefect/server/ui-v2/assets/{use-flow-runs-selected-rows-D4yWonR8.js.map → use-flow-runs-selected-rows-BL_Gv9CC.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DZeBiVd9.js → use-get-artifacts-flow-task-runs-TSCoomjQ.js} +2 -2
- prefect/server/ui-v2/assets/{use-get-artifacts-flow-task-runs-DZeBiVd9.js.map → use-get-artifacts-flow-task-runs-TSCoomjQ.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-quick-run-BxAMqZDM.js → use-quick-run-BMnCkwSv.js} +2 -2
- prefect/server/ui-v2/assets/{use-quick-run-BxAMqZDM.js.map → use-quick-run-BMnCkwSv.js.map} +1 -1
- prefect/server/ui-v2/assets/{use-stepper-T3wAKNvM.js → use-stepper-C1wm66U2.js} +2 -2
- prefect/server/ui-v2/assets/{use-stepper-T3wAKNvM.js.map → use-stepper-C1wm66U2.js.map} +1 -1
- prefect/server/ui-v2/assets/{utilities-B2JMf8iI.js → utilities-DxRXxFOF.js} +2 -2
- prefect/server/ui-v2/assets/{utilities-B2JMf8iI.js.map → utilities-DxRXxFOF.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool-filter-CZz0AJlt.js → work-pool-filter-PudrkZYj.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool-filter-CZz0AJlt.js.map → work-pool-filter-PudrkZYj.js.map} +1 -1
- prefect/server/ui-v2/assets/work-pool-queue-toggle-BAOrV_0R.js +2 -0
- prefect/server/ui-v2/assets/{work-pool-queue-toggle-D4eeo-hi.js.map → work-pool-queue-toggle-BAOrV_0R.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool._workPoolName-DrWddu9K.js → work-pool._workPoolName-BOM3849e.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool._workPoolName-DrWddu9K.js.map → work-pool._workPoolName-BOM3849e.js.map} +1 -1
- prefect/server/ui-v2/assets/work-pool_._workPoolName.edit-CIhcG6yr.js +2 -0
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.edit-CA0ePjCk.js.map → work-pool_._workPoolName.edit-CIhcG6yr.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-DpUnE86v.js → work-pool_._workPoolName.queue._workQueueName-CjoM77tu.js} +2 -2
- prefect/server/ui-v2/assets/{work-pool_._workPoolName.queue._workQueueName-DpUnE86v.js.map → work-pool_._workPoolName.queue._workQueueName-CjoM77tu.js.map} +1 -1
- prefect/server/ui-v2/assets/{work-queue-icon-text-BjiA7vAW.js → work-queue-icon-text-CP4yX3uM.js} +2 -2
- prefect/server/ui-v2/assets/{work-queue-icon-text-BjiA7vAW.js.map → work-queue-icon-text-CP4yX3uM.js.map} +1 -1
- prefect/server/ui-v2/index.html +2 -2
- prefect/task_engine.py +16 -0
- prefect/task_worker.py +98 -16
- prefect/testing/fixtures.py +18 -1
- {prefect-3.6.12.dist-info → prefect-3.6.13.dev2.dist-info}/METADATA +1 -1
- {prefect-3.6.12.dist-info → prefect-3.6.13.dev2.dist-info}/RECORD +211 -210
- prefect/server/ui-v2/assets/automation._id-IHh5QJwE.js +0 -2
- prefect/server/ui-v2/assets/block-type-logo-B31LJm5H.js +0 -2
- prefect/server/ui-v2/assets/block_._id.edit-CIhIBJrm.js +0 -2
- prefect/server/ui-v2/assets/catalog-CfniU0UV.js +0 -2
- prefect/server/ui-v2/assets/catalog_._slug-C9p86T4s.js +0 -2
- prefect/server/ui-v2/assets/catalog_._slug_.create-BhSunL__.js +0 -2
- prefect/server/ui-v2/assets/deployment._id-DVmqclRz.js +0 -2
- prefect/server/ui-v2/assets/deployment_._id.duplicate-DVMjpk5m.js +0 -2
- prefect/server/ui-v2/assets/deployment_._id.edit-Ck_P6KDn.js +0 -2
- prefect/server/ui-v2/assets/flow-run-graph-CfoPEAgQ.js +0 -2
- prefect/server/ui-v2/assets/flow-run-graph-CfoPEAgQ.js.map +0 -1
- prefect/server/ui-v2/assets/flow-run._id-C-qxwEBp.js +0 -4
- prefect/server/ui-v2/assets/flow-run._id-C-qxwEBp.js.map +0 -1
- prefect/server/ui-v2/assets/flow-run._id-OL0YhyLW.js +0 -2
- prefect/server/ui-v2/assets/flow-runs-pagination-DnwkJapB.js +0 -2
- prefect/server/ui-v2/assets/flow-runs-pagination-DnwkJapB.js.map +0 -1
- prefect/server/ui-v2/assets/flow._id-DhrCicwR.js +0 -2
- prefect/server/ui-v2/assets/index-7-r4ia_S.js +0 -2
- prefect/server/ui-v2/assets/index-7ThYp9SY.js +0 -2
- prefect/server/ui-v2/assets/index-B7zHzWQW.css +0 -1
- prefect/server/ui-v2/assets/index-B_3f8Hcb.js +0 -2
- prefect/server/ui-v2/assets/index-BiCd-Iuz.js +0 -2
- prefect/server/ui-v2/assets/index-BiCd-Iuz.js.map +0 -1
- prefect/server/ui-v2/assets/index-CT_nG86y.js +0 -2
- prefect/server/ui-v2/assets/index-Cs8eFQKw.js +0 -2
- prefect/server/ui-v2/assets/index-H6bwm6L6.js +0 -2
- prefect/server/ui-v2/assets/index-WYPZo52S.js +0 -17
- prefect/server/ui-v2/assets/index-WYPZo52S.js.map +0 -1
- prefect/server/ui-v2/assets/index-qPlIYf3i.js +0 -2
- prefect/server/ui-v2/assets/route-error-state-ALftyvGl.js +0 -2
- prefect/server/ui-v2/assets/settings-BL0X8cDU.js +0 -2
- prefect/server/ui-v2/assets/settings-BL0X8cDU.js.map +0 -1
- prefect/server/ui-v2/assets/table-CEAx-qHs.js +0 -2
- prefect/server/ui-v2/assets/table-CEAx-qHs.js.map +0 -1
- prefect/server/ui-v2/assets/tags-input-D1RJZEUA.js +0 -2
- prefect/server/ui-v2/assets/tags-input-D1RJZEUA.js.map +0 -1
- prefect/server/ui-v2/assets/task-run-concurrency-limits-reset-dialog-CG3den1B.js +0 -2
- prefect/server/ui-v2/assets/task-run._id-CnIVqU6v.js +0 -2
- prefect/server/ui-v2/assets/task-runs-pagination-DLSAz-Ur.js +0 -2
- prefect/server/ui-v2/assets/use-delete-automation-confirmation-dialog-Bzy2ML2T.js +0 -2
- prefect/server/ui-v2/assets/use-local-storage-CpxMp5wR.js +0 -2
- prefect/server/ui-v2/assets/use-local-storage-CpxMp5wR.js.map +0 -1
- prefect/server/ui-v2/assets/work-pool-queue-toggle-D4eeo-hi.js +0 -2
- prefect/server/ui-v2/assets/work-pool_._workPoolName.edit-CA0ePjCk.js +0 -2
- {prefect-3.6.12.dist-info → prefect-3.6.13.dev2.dist-info}/WHEEL +0 -0
- {prefect-3.6.12.dist-info → prefect-3.6.13.dev2.dist-info}/entry_points.txt +0 -0
- {prefect-3.6.12.dist-info → prefect-3.6.13.dev2.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-BvSl3DKP.js";import{R as M,a as c}from"./radio-group-D0van45v.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-DDUadk_N.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-DDUadk_N.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-
|
|
2
|
-
//# sourceMappingURL=sort-filter-
|
|
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-BvSl3DKP.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-D9p3cPx9.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sort-filter-
|
|
1
|
+
{"version":3,"file":"sort-filter-D9p3cPx9.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-BvSl3DKP.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-vo9Do8sA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"table-vo9Do8sA.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-BvSl3DKP.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-Ci2JQ-k3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tags-input-Ci2JQ-k3.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,cS as k,_ as x,$ as g,a0 as j,a1 as m,a2 as C,a3 as D,bh as p,cT as T}from"./index-BvSl3DKP.js";import{D as R,a as w,b as L,c as v,d as u}from"./dropdown-menu-CT-s-V7d.js";const S=({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"})]})]})},f=({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{S as T,f as a,A as b};
|
|
2
|
+
//# sourceMappingURL=task-run-concurrency-limits-reset-dialog-CJzPc2gw.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-run-concurrency-limits-reset-dialog-
|
|
1
|
+
{"version":3,"file":"task-run-concurrency-limits-reset-dialog-CJzPc2gw.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,3 +1,3 @@
|
|
|
1
|
-
import{r as c,p as E,j as e,s as
|
|
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(
|
|
3
|
-
//# sourceMappingURL=task-run._id-
|
|
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-BvSl3DKP.js";import{A as he}from"./artifact-card-C8JEQRHl.js";import{T as fe,a as D}from"./toggle-group-BJN1vjEh.js";import{R as ue,a as ge,u as pe,C as je}from"./index-CzCSgCK-.js";import{L as Ne}from"./lazy-markdown-BwIwKFRF.js";import{D as ye}from"./delete-confirmation-dialog-CTdWZlGM.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-CT-s-V7d.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-DODEq1Pi.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-CjevSs79.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-CjevSs79.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-BvSl3DKP.js";import{R as a}from"./route-error-state-CGGpuCGN.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-D8QKG5UZ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-run._id-
|
|
1
|
+
{"version":3,"file":"task-run._id-D8QKG5UZ.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"}
|