luma-infra 0.1.332__tar.gz → 0.1.334__tar.gz
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.
- {luma_infra-0.1.332 → luma_infra-0.1.334}/PKG-INFO +4 -4
- {luma_infra-0.1.332 → luma_infra-0.1.334}/README.md +3 -3
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/__init__.py +1 -1
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/README.md +3 -3
- luma_infra-0.1.332/luma/assets/dashboard/app-hYeSKKrm.js → luma_infra-0.1.334/luma/assets/dashboard/app-62MGY_fi.js +3 -3
- luma_infra-0.1.332/luma/assets/dashboard/chunk-ApplicationsPage-DpbmSx9Z.js → luma_infra-0.1.334/luma/assets/dashboard/chunk-ApplicationsPage-DL3D9bFn.js +1 -1
- luma_infra-0.1.334/luma/assets/dashboard/chunk-BuilderPage-D8T1oNZV.js +1 -0
- luma_infra-0.1.332/luma/assets/dashboard/chunk-ConfirmDialog-CPwIDbVP.js → luma_infra-0.1.334/luma/assets/dashboard/chunk-ConfirmDialog-C9ifyg81.js +1 -1
- luma_infra-0.1.332/luma/assets/dashboard/chunk-CredentialsPage-C9fuPvrh.js → luma_infra-0.1.334/luma/assets/dashboard/chunk-CredentialsPage-DfCu036X.js +1 -1
- luma_infra-0.1.332/luma/assets/dashboard/chunk-DeployPage-Cpk498cY.js → luma_infra-0.1.334/luma/assets/dashboard/chunk-DeployPage-ClA9gyt_.js +1 -1
- luma_infra-0.1.332/luma/assets/dashboard/chunk-DeploymentsPage-D4D-to5f.js → luma_infra-0.1.334/luma/assets/dashboard/chunk-DeploymentsPage-C8Lq9XQw.js +1 -1
- luma_infra-0.1.332/luma/assets/dashboard/chunk-GithubImportPanel-BGO9uv1N.js → luma_infra-0.1.334/luma/assets/dashboard/chunk-GithubImportPanel-CgCrSH00.js +1 -1
- luma_infra-0.1.332/luma/assets/dashboard/chunk-InfrastructureNavigation-1PoWSQRn.js → luma_infra-0.1.334/luma/assets/dashboard/chunk-InfrastructureNavigation-fMPPPzdp.js +1 -1
- luma_infra-0.1.332/luma/assets/dashboard/chunk-LaeAdminPage-aDUJgu9e.js → luma_infra-0.1.334/luma/assets/dashboard/chunk-LaeAdminPage-DG6fSASY.js +1 -1
- luma_infra-0.1.332/luma/assets/dashboard/chunk-NodesPage-BnzFt_vE.js → luma_infra-0.1.334/luma/assets/dashboard/chunk-NodesPage-MFEu-5Cp.js +1 -1
- luma_infra-0.1.332/luma/assets/dashboard/chunk-NotFound-DgV028Zx.js → luma_infra-0.1.334/luma/assets/dashboard/chunk-NotFound-D8hgaRg7.js +1 -1
- luma_infra-0.1.332/luma/assets/dashboard/chunk-ObservabilityPage-D0__0yVh.js → luma_infra-0.1.334/luma/assets/dashboard/chunk-ObservabilityPage-DPUBTYSQ.js +1 -1
- luma_infra-0.1.332/luma/assets/dashboard/chunk-ObservabilityPanel-D_1V9Kf2.js → luma_infra-0.1.334/luma/assets/dashboard/chunk-ObservabilityPanel-3askxTOs.js +1 -1
- luma_infra-0.1.332/luma/assets/dashboard/chunk-RegistryPage-B8cSlp6i.js → luma_infra-0.1.334/luma/assets/dashboard/chunk-RegistryPage-CDJn195G.js +1 -1
- luma_infra-0.1.332/luma/assets/dashboard/chunk-StepLog-C0bEGDfV.js → luma_infra-0.1.334/luma/assets/dashboard/chunk-StepLog-DL6ZvPmc.js +1 -1
- luma_infra-0.1.332/luma/assets/dashboard/chunk-StoragePage-Blm-MOqQ.js → luma_infra-0.1.334/luma/assets/dashboard/chunk-StoragePage-BwC_uFf2.js +1 -1
- luma_infra-0.1.332/luma/assets/dashboard/chunk-TerminalDrawer-Dja8BbbY.js → luma_infra-0.1.334/luma/assets/dashboard/chunk-TerminalDrawer-CSdFl_Ku.js +1 -1
- luma_infra-0.1.332/luma/assets/dashboard/chunk-arrow-left-gc-bXLyu.js → luma_infra-0.1.334/luma/assets/dashboard/chunk-arrow-left--tTSIDeU.js +1 -1
- luma_infra-0.1.332/luma/assets/dashboard/chunk-controlResourcesApi-BG5wfLAq.js → luma_infra-0.1.334/luma/assets/dashboard/chunk-controlResourcesApi-BkD6nVkI.js +1 -1
- luma_infra-0.1.332/luma/assets/dashboard/chunk-deployApi-DCydT_mD.js → luma_infra-0.1.334/luma/assets/dashboard/chunk-deployApi-BWcc-wRr.js +1 -1
- luma_infra-0.1.332/luma/assets/dashboard/chunk-format-BJi3nEP2.js → luma_infra-0.1.334/luma/assets/dashboard/chunk-format-BrWWTJL8.js +1 -1
- luma_infra-0.1.332/luma/assets/dashboard/chunk-git-branch-B5qKSZWm.js → luma_infra-0.1.334/luma/assets/dashboard/chunk-git-branch-tKuTtZx-.js +1 -1
- luma_infra-0.1.332/luma/assets/dashboard/chunk-hard-drive-mN7EIzKO.js → luma_infra-0.1.334/luma/assets/dashboard/chunk-hard-drive-fKee3kw0.js +1 -1
- luma_infra-0.1.334/luma/assets/dashboard/chunk-index-NMOs2Zdd.js +1 -0
- luma_infra-0.1.332/luma/assets/dashboard/chunk-lifecycleApi-DjzddJ1G.js → luma_infra-0.1.334/luma/assets/dashboard/chunk-lifecycleApi-Dg3yoxq0.js +1 -1
- luma_infra-0.1.332/luma/assets/dashboard/chunk-play-DN2GbVu_.js → luma_infra-0.1.334/luma/assets/dashboard/chunk-play-DWYm6wBb.js +1 -1
- luma_infra-0.1.332/luma/assets/dashboard/chunk-rotate-ccw-DQL6HH7V.js → luma_infra-0.1.334/luma/assets/dashboard/chunk-rotate-ccw-CITBScuk.js +1 -1
- luma_infra-0.1.332/luma/assets/dashboard/chunk-shield-check-YSTAF9h6.js → luma_infra-0.1.334/luma/assets/dashboard/chunk-shield-check-bg76aleY.js +1 -1
- luma_infra-0.1.332/luma/assets/dashboard/chunk-square-terminal-CumwnbUd.js → luma_infra-0.1.334/luma/assets/dashboard/chunk-square-terminal-DAIVOtFj.js +1 -1
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/index.html +1 -1
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/pyproject.toml +1 -1
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/cli.py +27 -1
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/control/alerting.py +4 -1
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma_infra.egg-info/PKG-INFO +4 -4
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma_infra.egg-info/SOURCES.txt +30 -30
- {luma_infra-0.1.332 → luma_infra-0.1.334}/pyproject.toml +1 -1
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_alerting.py +18 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_productization.py +26 -1
- luma_infra-0.1.332/luma/assets/dashboard/chunk-BuilderPage-CrAU82Fn.js +0 -1
- luma_infra-0.1.332/luma/assets/dashboard/chunk-index-CxRE1RjD.js +0 -1
- {luma_infra-0.1.332 → luma_infra-0.1.334}/LICENSE +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/agent.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/artifact_leases.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/Dockerfile.control +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ApplicationsPage-Dn9ham2L.css +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-DeployPage-BHONc8s_.css +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-DeploymentsPage-B57fzmCA.css +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-GithubImportPanel-Denb4iA4.css +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ObservabilityPage-nqZMz9_e.css +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ObservabilityPanel-EphwxYsm.css +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-StoragePage-CQJxwDlN.css +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-TerminalDrawer-B4BOCZbe.css +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-cyrillic-700-normal-Bp80XfeI.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-cyrillic-700-normal-O_YjL27c.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-cyrillic-ext-700-normal-BDQ-w_bc.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-cyrillic-ext-700-normal-CtgKGIh5.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-latin-700-normal-7sUh57Bg.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-latin-700-normal-CNHXzs6v.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-latin-ext-700-normal-Cwsjk1Jb.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-latin-ext-700-normal-Dhimjc7-.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-vietnamese-700-normal-Bs14ezHR.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-mono-vietnamese-700-normal-apsD3J7v.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-cyrillic-400-normal-BTotfTJu.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-cyrillic-400-normal-DZqxrq2p.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-cyrillic-500-normal-ByOcLdNv.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-cyrillic-500-normal-CocWQlwt.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-cyrillic-600-normal-71GNu3SW.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-cyrillic-600-normal-BGq0mW3O.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-cyrillic-700-normal-D_uavGvn.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-cyrillic-700-normal-RFb1v-CK.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-cyrillic-ext-400-normal-Dsrv2Tcn.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-cyrillic-ext-400-normal-g30qAdWV.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-cyrillic-ext-500-normal-Cs5J6C77.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-cyrillic-ext-500-normal-DB5PtV2g.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-cyrillic-ext-600-normal-Bz0x94Yp.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-cyrillic-ext-600-normal-DUMzJB7m.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-cyrillic-ext-700-normal-BmRLXWpJ.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-cyrillic-ext-700-normal-DCQwxkRk.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-greek-400-normal-D9ESIMu3.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-greek-400-normal-_efipK4i.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-greek-500-normal-CuWXN6rf.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-greek-500-normal-JMMifIXV.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-greek-600-normal-D-CqTdkO.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-greek-600-normal-DzTrcv_p.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-greek-700-normal-CkZN0sRy.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-greek-700-normal-wyJ6jzdA.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-latin-700-normal-Bth3BMcD.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-latin-700-normal-Bxkt5Cjx.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-latin-ext-400-normal-C5H60-Va.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-latin-ext-400-normal-RBey6euL.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-latin-ext-500-normal-D0aIdm-b.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-latin-ext-500-normal-DakdToA3.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-latin-ext-600-normal-DIrixKbi.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-latin-ext-600-normal-DOrvGEcy.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-latin-ext-700-normal-DZH6Xh-4.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-latin-ext-700-normal-aMgXseD4.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-vietnamese-400-normal-DG4YqDda.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-vietnamese-400-normal-fK1oJ5dG.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-vietnamese-500-normal-BEb3_waV.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-vietnamese-500-normal-e4dixQRQ.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-vietnamese-600-normal-DgdngZtN.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-vietnamese-600-normal-DpPYBSTl.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-vietnamese-700-normal-BV5B8Are.woff +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-ibm-plex-sans-vietnamese-700-normal-CkEo6LDy.woff2 +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-index-COG4jPn4.css +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-luma-logo-mark-CH2lRgZQ.png +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/asset-resourceWorkspaces--I9VHM-b.css +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets/dashboard/chunk-options-BJTYl9nz.js +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/assets.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/bootstrap.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/builder_build_executor.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/builder_executor.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/builder_storage.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/builder_tasks.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/cloudflare.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/compose.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/config.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/control/__init__.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/control/alert_notifications.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/control/build_queue.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/control/client.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/control/context.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/control/database.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/control/history.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/control/logs.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/control/maintenance.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/control/metrics.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/control/monitoring.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/control/observe.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/control/operations.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/control/resources.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/control/secrets.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/control/server.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/control/state.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/control/storage_governance.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/control/workflows.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/credential_broker.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/deploy_workflow.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/egress.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/envfile.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/errors.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/gitops.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/installation.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/installer.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/io.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/lae_admin_proxy.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/lae_placement.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/lae_runtime.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/local.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/local_build.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/local_storage.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/manager.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/node_lifecycle.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/node_readiness.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/nomad_api.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/nomad_node.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/nomad_render.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/observe_grafana.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/observe_instrument.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/profiles.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/regions.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/registry.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/registry_access.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/registry_management.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/remote.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/render.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/repo_paths.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/service.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/storage.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma/userconfig.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma_infra.egg-info/dependency_links.txt +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma_infra.egg-info/entry_points.txt +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma_infra.egg-info/requires.txt +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/luma_infra.egg-info/top_level.txt +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/setup.cfg +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/setup.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_bootstrap_state.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_build_queue.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_builder_analyze_executor.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_builder_artifact_leases.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_builder_build_executor.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_builder_credential_broker.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_builder_object_source_broker.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_builder_storage.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_builder_tasks_api.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_builder_tasks_security.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_ci_contract.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_cli_operations.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_control_cutover.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_control_database.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_control_environment_persistence.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_control_history.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_control_image_workflow.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_control_job_auto_revert.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_control_maintenance.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_dashboard_logs.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_deploy_workflow.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_history_routes.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_import_compose_sidecar.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_installation.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_installer_candidates.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_installer_runtime_validation.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_lae_admin_proxy.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_lae_luma_deploy_assets.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_lae_placement.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_lae_principal_files.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_lae_runtime_api.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_local_build_workflow.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_local_storage_placement.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_manager_ip_change.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_manager_update_gates.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_metrics.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_metrics_retention.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_monitoring.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_node_lifecycle.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_node_readiness.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_nomad_api.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_nomad_compose.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_nomad_node.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_nomad_render.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_observe.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_observe_instrument.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_observe_logs.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_observe_query.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_operations_integration.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_regions.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_registry_access.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_registry_management.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_render.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_resource_policy.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_setup_lae_builder.py +0 -0
- {luma_infra-0.1.332 → luma_infra-0.1.334}/tests/test_storage_governance.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: luma-infra
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.334
|
|
4
4
|
Summary: Declarative deployment CLI for region-aware Nomad infrastructure.
|
|
5
5
|
Author: Luma Contributors
|
|
6
6
|
License-Expression: MIT
|
|
@@ -107,7 +107,7 @@ A public `cn-edge` domain does not bypass the server and jump directly to a cont
|
|
|
107
107
|
For CI runners, install the published Python package. It provides the `luma` command without running the shell installer:
|
|
108
108
|
|
|
109
109
|
```bash
|
|
110
|
-
python -m pip install "luma-infra==0.1.
|
|
110
|
+
python -m pip install "luma-infra==0.1.334"
|
|
111
111
|
```
|
|
112
112
|
|
|
113
113
|
Install without cloning the repository:
|
|
@@ -125,7 +125,7 @@ Managed-runtime identity, dependency-source policy and read-only `luma doctor --
|
|
|
125
125
|
Install a tagged release:
|
|
126
126
|
|
|
127
127
|
```bash
|
|
128
|
-
export LUMA_INSTALL_REF=v0.1.
|
|
128
|
+
export LUMA_INSTALL_REF=v0.1.334
|
|
129
129
|
curl -fsSL "https://raw.githubusercontent.com/LiuTianjie/luma/$LUMA_INSTALL_REF/scripts/install-luma.sh" -o /tmp/install-luma.sh && sh /tmp/install-luma.sh
|
|
130
130
|
```
|
|
131
131
|
|
|
@@ -381,7 +381,7 @@ luma deploy status.yaml
|
|
|
381
381
|
In CI, pass the control endpoint and management token through environment variables instead of creating a login context:
|
|
382
382
|
|
|
383
383
|
```bash
|
|
384
|
-
python -m pip install "luma-infra==0.1.
|
|
384
|
+
python -m pip install "luma-infra==0.1.334"
|
|
385
385
|
|
|
386
386
|
export LUMA_CONTROL_URL="https://luma.example.com"
|
|
387
387
|
export LUMA_DEPLOY_TOKEN="$CI_LUMA_MANAGEMENT_TOKEN"
|
|
@@ -74,7 +74,7 @@ A public `cn-edge` domain does not bypass the server and jump directly to a cont
|
|
|
74
74
|
For CI runners, install the published Python package. It provides the `luma` command without running the shell installer:
|
|
75
75
|
|
|
76
76
|
```bash
|
|
77
|
-
python -m pip install "luma-infra==0.1.
|
|
77
|
+
python -m pip install "luma-infra==0.1.334"
|
|
78
78
|
```
|
|
79
79
|
|
|
80
80
|
Install without cloning the repository:
|
|
@@ -92,7 +92,7 @@ Managed-runtime identity, dependency-source policy and read-only `luma doctor --
|
|
|
92
92
|
Install a tagged release:
|
|
93
93
|
|
|
94
94
|
```bash
|
|
95
|
-
export LUMA_INSTALL_REF=v0.1.
|
|
95
|
+
export LUMA_INSTALL_REF=v0.1.334
|
|
96
96
|
curl -fsSL "https://raw.githubusercontent.com/LiuTianjie/luma/$LUMA_INSTALL_REF/scripts/install-luma.sh" -o /tmp/install-luma.sh && sh /tmp/install-luma.sh
|
|
97
97
|
```
|
|
98
98
|
|
|
@@ -348,7 +348,7 @@ luma deploy status.yaml
|
|
|
348
348
|
In CI, pass the control endpoint and management token through environment variables instead of creating a login context:
|
|
349
349
|
|
|
350
350
|
```bash
|
|
351
|
-
python -m pip install "luma-infra==0.1.
|
|
351
|
+
python -m pip install "luma-infra==0.1.334"
|
|
352
352
|
|
|
353
353
|
export LUMA_CONTROL_URL="https://luma.example.com"
|
|
354
354
|
export LUMA_DEPLOY_TOKEN="$CI_LUMA_MANAGEMENT_TOKEN"
|
|
@@ -73,7 +73,7 @@ A public `cn-edge` domain does not bypass the server and jump directly to a cont
|
|
|
73
73
|
For CI runners, install the published Python package. It provides the `luma` command without running the shell installer:
|
|
74
74
|
|
|
75
75
|
```bash
|
|
76
|
-
python -m pip install "luma-infra==0.1.
|
|
76
|
+
python -m pip install "luma-infra==0.1.334"
|
|
77
77
|
```
|
|
78
78
|
|
|
79
79
|
Install without cloning the repository:
|
|
@@ -88,7 +88,7 @@ The installer creates a private venv and writes the command shim to `~/.local/bi
|
|
|
88
88
|
Install a tagged release:
|
|
89
89
|
|
|
90
90
|
```bash
|
|
91
|
-
curl -fsSL https://raw.githubusercontent.com/LiuTianjie/luma/main/scripts/install-luma.sh | LUMA_INSTALL_REF=v0.1.
|
|
91
|
+
curl -fsSL https://raw.githubusercontent.com/LiuTianjie/luma/main/scripts/install-luma.sh | LUMA_INSTALL_REF=v0.1.334 sh
|
|
92
92
|
```
|
|
93
93
|
|
|
94
94
|
Develop from source:
|
|
@@ -252,7 +252,7 @@ luma deploy status.yaml
|
|
|
252
252
|
In CI, pass the control endpoint and management token through environment variables instead of creating a login context:
|
|
253
253
|
|
|
254
254
|
```bash
|
|
255
|
-
python -m pip install "luma-infra==0.1.
|
|
255
|
+
python -m pip install "luma-infra==0.1.334"
|
|
256
256
|
|
|
257
257
|
export LUMA_CONTROL_URL="https://luma.example.com"
|
|
258
258
|
export LUMA_DEPLOY_TOKEN="$CI_LUMA_MANAGEMENT_TOKEN"
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["chunk-ApplicationsPage-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["chunk-ApplicationsPage-DL3D9bFn.js","chunk-lifecycleApi-Dg3yoxq0.js","chunk-format-BrWWTJL8.js","chunk-index-NMOs2Zdd.js","chunk-play-DWYm6wBb.js","chunk-StepLog-DL6ZvPmc.js","chunk-ObservabilityPanel-3askxTOs.js","asset-ObservabilityPanel-EphwxYsm.css","chunk-ConfirmDialog-C9ifyg81.js","chunk-square-terminal-DAIVOtFj.js","asset-ApplicationsPage-Dn9ham2L.css","chunk-BuilderPage-D8T1oNZV.js","chunk-GithubImportPanel-CgCrSH00.js","chunk-controlResourcesApi-BkD6nVkI.js","chunk-deployApi-BWcc-wRr.js","chunk-options-BJTYl9nz.js","chunk-arrow-left--tTSIDeU.js","chunk-git-branch-tKuTtZx-.js","asset-GithubImportPanel-Denb4iA4.css","chunk-DeploymentsPage-C8Lq9XQw.js","chunk-rotate-ccw-CITBScuk.js","asset-DeploymentsPage-B57fzmCA.css","chunk-DeployPage-ClA9gyt_.js","asset-DeployPage-BHONc8s_.css","chunk-CredentialsPage-DfCu036X.js","chunk-shield-check-bg76aleY.js","asset-resourceWorkspaces--I9VHM-b.css","chunk-NodesPage-MFEu-5Cp.js","chunk-InfrastructureNavigation-fMPPPzdp.js","chunk-ObservabilityPage-DPUBTYSQ.js","asset-ObservabilityPage-nqZMz9_e.css","chunk-StoragePage-BwC_uFf2.js","chunk-hard-drive-fKee3kw0.js","asset-StoragePage-CQJxwDlN.css","chunk-RegistryPage-CDJn195G.js","chunk-TerminalDrawer-CSdFl_Ku.js","asset-TerminalDrawer-B4BOCZbe.css"])))=>i.map(i=>d[i]);
|
|
2
2
|
(function(){const f=document.createElement("link").relList;if(f&&f.supports&&f.supports("modulepreload"))return;for(const T of document.querySelectorAll('link[rel="modulepreload"]'))r(T);new MutationObserver(T=>{for(const g of T)if(g.type==="childList")for(const C of g.addedNodes)C.tagName==="LINK"&&C.rel==="modulepreload"&&r(C)}).observe(document,{childList:!0,subtree:!0});function m(T){const g={};return T.integrity&&(g.integrity=T.integrity),T.referrerPolicy&&(g.referrerPolicy=T.referrerPolicy),T.crossOrigin==="use-credentials"?g.credentials="include":T.crossOrigin==="anonymous"?g.credentials="omit":g.credentials="same-origin",g}function r(T){if(T.ep)return;T.ep=!0;const g=m(T);fetch(T.href,g)}})();var ug=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function Py(c){return c&&c.__esModule&&Object.prototype.hasOwnProperty.call(c,"default")?c.default:c}var Es={exports:{}},Un={};var Xd;function Iy(){if(Xd)return Un;Xd=1;var c=Symbol.for("react.transitional.element"),f=Symbol.for("react.fragment");function m(r,T,g){var C=null;if(g!==void 0&&(C=""+g),T.key!==void 0&&(C=""+T.key),"key"in T){g={};for(var O in T)O!=="key"&&(g[O]=T[O])}else g=T;return T=g.ref,{$$typeof:c,type:r,key:C,ref:T!==void 0?T:null,props:g}}return Un.Fragment=f,Un.jsx=m,Un.jsxs=m,Un}var Qd;function ev(){return Qd||(Qd=1,Es.exports=Iy()),Es.exports}var o=ev(),_s={exports:{}},F={};var Vd;function tv(){if(Vd)return F;Vd=1;var c=Symbol.for("react.transitional.element"),f=Symbol.for("react.portal"),m=Symbol.for("react.fragment"),r=Symbol.for("react.strict_mode"),T=Symbol.for("react.profiler"),g=Symbol.for("react.consumer"),C=Symbol.for("react.context"),O=Symbol.for("react.forward_ref"),M=Symbol.for("react.suspense"),p=Symbol.for("react.memo"),U=Symbol.for("react.lazy"),x=Symbol.for("react.activity"),R=Symbol.iterator;function X(y){return y===null||typeof y!="object"?null:(y=R&&y[R]||y["@@iterator"],typeof y=="function"?y:null)}var K={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},ie=Object.assign,L={};function Y(y,j,B){this.props=y,this.context=j,this.refs=L,this.updater=B||K}Y.prototype.isReactComponent={},Y.prototype.setState=function(y,j){if(typeof y!="object"&&typeof y!="function"&&y!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,y,j,"setState")},Y.prototype.forceUpdate=function(y){this.updater.enqueueForceUpdate(this,y,"forceUpdate")};function Se(){}Se.prototype=Y.prototype;function ke(y,j,B){this.props=y,this.context=j,this.refs=L,this.updater=B||K}var tt=ke.prototype=new Se;tt.constructor=ke,ie(tt,Y.prototype),tt.isPureReactComponent=!0;var Et=Array.isArray;function Ie(){}var te={H:null,A:null,T:null,S:null},Ee=Object.prototype.hasOwnProperty;function ze(y,j,B){var k=B.ref;return{$$typeof:c,type:y,key:j,ref:k!==void 0?k:null,props:B}}function we(y,j){return ze(y.type,j,y.props)}function Qe(y){return typeof y=="object"&&y!==null&&y.$$typeof===c}function xe(y){var j={"=":"=0",":":"=2"};return"$"+y.replace(/[=:]/g,function(B){return j[B]})}var De=/\/+/g;function _t(y,j){return typeof y=="object"&&y!==null&&y.key!=null?xe(""+y.key):j.toString(36)}function at(y){switch(y.status){case"fulfilled":return y.value;case"rejected":throw y.reason;default:switch(typeof y.status=="string"?y.then(Ie,Ie):(y.status="pending",y.then(function(j){y.status==="pending"&&(y.status="fulfilled",y.value=j)},function(j){y.status==="pending"&&(y.status="rejected",y.reason=j)})),y.status){case"fulfilled":return y.value;case"rejected":throw y.reason}}throw y}function A(y,j,B,k,W){var ee=typeof y;(ee==="undefined"||ee==="boolean")&&(y=null);var oe=!1;if(y===null)oe=!0;else switch(ee){case"bigint":case"string":case"number":oe=!0;break;case"object":switch(y.$$typeof){case c:case f:oe=!0;break;case U:return oe=y._init,A(oe(y._payload),j,B,k,W)}}if(oe)return W=W(y),oe=k===""?"."+_t(y,0):k,Et(W)?(B="",oe!=null&&(B=oe.replace(De,"$&/")+"/"),A(W,j,B,"",function(Ul){return Ul})):W!=null&&(Qe(W)&&(W=we(W,B+(W.key==null||y&&y.key===W.key?"":(""+W.key).replace(De,"$&/")+"/")+oe)),j.push(W)),1;oe=0;var Ve=k===""?".":k+":";if(Et(y))for(var Oe=0;Oe<y.length;Oe++)k=y[Oe],ee=Ve+_t(k,Oe),oe+=A(k,j,B,ee,W);else if(Oe=X(y),typeof Oe=="function")for(y=Oe.call(y),Oe=0;!(k=y.next()).done;)k=k.value,ee=Ve+_t(k,Oe++),oe+=A(k,j,B,ee,W);else if(ee==="object"){if(typeof y.then=="function")return A(at(y),j,B,k,W);throw j=String(y),Error("Objects are not valid as a React child (found: "+(j==="[object Object]"?"object with keys {"+Object.keys(y).join(", ")+"}":j)+"). If you meant to render a collection of children, use an array instead.")}return oe}function H(y,j,B){if(y==null)return y;var k=[],W=0;return A(y,k,"","",function(ee){return j.call(B,ee,W++)}),k}function Z(y){if(y._status===-1){var j=y._result;j=j(),j.then(function(B){(y._status===0||y._status===-1)&&(y._status=1,y._result=B)},function(B){(y._status===0||y._status===-1)&&(y._status=2,y._result=B)}),y._status===-1&&(y._status=0,y._result=j)}if(y._status===1)return y._result.default;throw y._result}var me=typeof reportError=="function"?reportError:function(y){if(typeof window=="object"&&typeof window.ErrorEvent=="function"){var j=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:typeof y=="object"&&y!==null&&typeof y.message=="string"?String(y.message):String(y),error:y});if(!window.dispatchEvent(j))return}else if(typeof process=="object"&&typeof process.emit=="function"){process.emit("uncaughtException",y);return}console.error(y)},se={map:H,forEach:function(y,j,B){H(y,function(){j.apply(this,arguments)},B)},count:function(y){var j=0;return H(y,function(){j++}),j},toArray:function(y){return H(y,function(j){return j})||[]},only:function(y){if(!Qe(y))throw Error("React.Children.only expected to receive a single React element child.");return y}};return F.Activity=x,F.Children=se,F.Component=Y,F.Fragment=m,F.Profiler=T,F.PureComponent=ke,F.StrictMode=r,F.Suspense=M,F.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=te,F.__COMPILER_RUNTIME={__proto__:null,c:function(y){return te.H.useMemoCache(y)}},F.cache=function(y){return function(){return y.apply(null,arguments)}},F.cacheSignal=function(){return null},F.cloneElement=function(y,j,B){if(y==null)throw Error("The argument must be a React element, but you passed "+y+".");var k=ie({},y.props),W=y.key;if(j!=null)for(ee in j.key!==void 0&&(W=""+j.key),j)!Ee.call(j,ee)||ee==="key"||ee==="__self"||ee==="__source"||ee==="ref"&&j.ref===void 0||(k[ee]=j[ee]);var ee=arguments.length-2;if(ee===1)k.children=B;else if(1<ee){for(var oe=Array(ee),Ve=0;Ve<ee;Ve++)oe[Ve]=arguments[Ve+2];k.children=oe}return ze(y.type,W,k)},F.createContext=function(y){return y={$$typeof:C,_currentValue:y,_currentValue2:y,_threadCount:0,Provider:null,Consumer:null},y.Provider=y,y.Consumer={$$typeof:g,_context:y},y},F.createElement=function(y,j,B){var k,W={},ee=null;if(j!=null)for(k in j.key!==void 0&&(ee=""+j.key),j)Ee.call(j,k)&&k!=="key"&&k!=="__self"&&k!=="__source"&&(W[k]=j[k]);var oe=arguments.length-2;if(oe===1)W.children=B;else if(1<oe){for(var Ve=Array(oe),Oe=0;Oe<oe;Oe++)Ve[Oe]=arguments[Oe+2];W.children=Ve}if(y&&y.defaultProps)for(k in oe=y.defaultProps,oe)W[k]===void 0&&(W[k]=oe[k]);return ze(y,ee,W)},F.createRef=function(){return{current:null}},F.forwardRef=function(y){return{$$typeof:O,render:y}},F.isValidElement=Qe,F.lazy=function(y){return{$$typeof:U,_payload:{_status:-1,_result:y},_init:Z}},F.memo=function(y,j){return{$$typeof:p,type:y,compare:j===void 0?null:j}},F.startTransition=function(y){var j=te.T,B={};te.T=B;try{var k=y(),W=te.S;W!==null&&W(B,k),typeof k=="object"&&k!==null&&typeof k.then=="function"&&k.then(Ie,me)}catch(ee){me(ee)}finally{j!==null&&B.types!==null&&(j.types=B.types),te.T=j}},F.unstable_useCacheRefresh=function(){return te.H.useCacheRefresh()},F.use=function(y){return te.H.use(y)},F.useActionState=function(y,j,B){return te.H.useActionState(y,j,B)},F.useCallback=function(y,j){return te.H.useCallback(y,j)},F.useContext=function(y){return te.H.useContext(y)},F.useDebugValue=function(){},F.useDeferredValue=function(y,j){return te.H.useDeferredValue(y,j)},F.useEffect=function(y,j){return te.H.useEffect(y,j)},F.useEffectEvent=function(y){return te.H.useEffectEvent(y)},F.useId=function(){return te.H.useId()},F.useImperativeHandle=function(y,j,B){return te.H.useImperativeHandle(y,j,B)},F.useInsertionEffect=function(y,j){return te.H.useInsertionEffect(y,j)},F.useLayoutEffect=function(y,j){return te.H.useLayoutEffect(y,j)},F.useMemo=function(y,j){return te.H.useMemo(y,j)},F.useOptimistic=function(y,j){return te.H.useOptimistic(y,j)},F.useReducer=function(y,j,B){return te.H.useReducer(y,j,B)},F.useRef=function(y){return te.H.useRef(y)},F.useState=function(y){return te.H.useState(y)},F.useSyncExternalStore=function(y,j,B){return te.H.useSyncExternalStore(y,j,B)},F.useTransition=function(){return te.H.useTransition()},F.version="19.2.7",F}var Zd;function Ls(){return Zd||(Zd=1,_s.exports=tv()),_s.exports}var q=Ls();const lv=Py(q);var Ts={exports:{}},Hn={},As={exports:{}},zs={};var Kd;function av(){return Kd||(Kd=1,(function(c){function f(A,H){var Z=A.length;A.push(H);e:for(;0<Z;){var me=Z-1>>>1,se=A[me];if(0<T(se,H))A[me]=H,A[Z]=se,Z=me;else break e}}function m(A){return A.length===0?null:A[0]}function r(A){if(A.length===0)return null;var H=A[0],Z=A.pop();if(Z!==H){A[0]=Z;e:for(var me=0,se=A.length,y=se>>>1;me<y;){var j=2*(me+1)-1,B=A[j],k=j+1,W=A[k];if(0>T(B,Z))k<se&&0>T(W,B)?(A[me]=W,A[k]=Z,me=k):(A[me]=B,A[j]=Z,me=j);else if(k<se&&0>T(W,Z))A[me]=W,A[k]=Z,me=k;else break e}}return H}function T(A,H){var Z=A.sortIndex-H.sortIndex;return Z!==0?Z:A.id-H.id}if(c.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var g=performance;c.unstable_now=function(){return g.now()}}else{var C=Date,O=C.now();c.unstable_now=function(){return C.now()-O}}var M=[],p=[],U=1,x=null,R=3,X=!1,K=!1,ie=!1,L=!1,Y=typeof setTimeout=="function"?setTimeout:null,Se=typeof clearTimeout=="function"?clearTimeout:null,ke=typeof setImmediate<"u"?setImmediate:null;function tt(A){for(var H=m(p);H!==null;){if(H.callback===null)r(p);else if(H.startTime<=A)r(p),H.sortIndex=H.expirationTime,f(M,H);else break;H=m(p)}}function Et(A){if(ie=!1,tt(A),!K)if(m(M)!==null)K=!0,Ie||(Ie=!0,xe());else{var H=m(p);H!==null&&at(Et,H.startTime-A)}}var Ie=!1,te=-1,Ee=5,ze=-1;function we(){return L?!0:!(c.unstable_now()-ze<Ee)}function Qe(){if(L=!1,Ie){var A=c.unstable_now();ze=A;var H=!0;try{e:{K=!1,ie&&(ie=!1,Se(te),te=-1),X=!0;var Z=R;try{t:{for(tt(A),x=m(M);x!==null&&!(x.expirationTime>A&&we());){var me=x.callback;if(typeof me=="function"){x.callback=null,R=x.priorityLevel;var se=me(x.expirationTime<=A);if(A=c.unstable_now(),typeof se=="function"){x.callback=se,tt(A),H=!0;break t}x===m(M)&&r(M),tt(A)}else r(M);x=m(M)}if(x!==null)H=!0;else{var y=m(p);y!==null&&at(Et,y.startTime-A),H=!1}}break e}finally{x=null,R=Z,X=!1}H=void 0}}finally{H?xe():Ie=!1}}}var xe;if(typeof ke=="function")xe=function(){ke(Qe)};else if(typeof MessageChannel<"u"){var De=new MessageChannel,_t=De.port2;De.port1.onmessage=Qe,xe=function(){_t.postMessage(null)}}else xe=function(){Y(Qe,0)};function at(A,H){te=Y(function(){A(c.unstable_now())},H)}c.unstable_IdlePriority=5,c.unstable_ImmediatePriority=1,c.unstable_LowPriority=4,c.unstable_NormalPriority=3,c.unstable_Profiling=null,c.unstable_UserBlockingPriority=2,c.unstable_cancelCallback=function(A){A.callback=null},c.unstable_forceFrameRate=function(A){0>A||125<A?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):Ee=0<A?Math.floor(1e3/A):5},c.unstable_getCurrentPriorityLevel=function(){return R},c.unstable_next=function(A){switch(R){case 1:case 2:case 3:var H=3;break;default:H=R}var Z=R;R=H;try{return A()}finally{R=Z}},c.unstable_requestPaint=function(){L=!0},c.unstable_runWithPriority=function(A,H){switch(A){case 1:case 2:case 3:case 4:case 5:break;default:A=3}var Z=R;R=A;try{return H()}finally{R=Z}},c.unstable_scheduleCallback=function(A,H,Z){var me=c.unstable_now();switch(typeof Z=="object"&&Z!==null?(Z=Z.delay,Z=typeof Z=="number"&&0<Z?me+Z:me):Z=me,A){case 1:var se=-1;break;case 2:se=250;break;case 5:se=1073741823;break;case 4:se=1e4;break;default:se=5e3}return se=Z+se,A={id:U++,callback:H,priorityLevel:A,startTime:Z,expirationTime:se,sortIndex:-1},Z>me?(A.sortIndex=Z,f(p,A),m(M)===null&&A===m(p)&&(ie?(Se(te),te=-1):ie=!0,at(Et,Z-me))):(A.sortIndex=se,f(M,A),K||X||(K=!0,Ie||(Ie=!0,xe()))),A},c.unstable_shouldYield=we,c.unstable_wrapCallback=function(A){var H=R;return function(){var Z=R;R=H;try{return A.apply(this,arguments)}finally{R=Z}}}})(zs)),zs}var Jd;function nv(){return Jd||(Jd=1,As.exports=av()),As.exports}var xs={exports:{}},et={};var $d;function uv(){if($d)return et;$d=1;var c=Ls();function f(M){var p="https://react.dev/errors/"+M;if(1<arguments.length){p+="?args[]="+encodeURIComponent(arguments[1]);for(var U=2;U<arguments.length;U++)p+="&args[]="+encodeURIComponent(arguments[U])}return"Minified React error #"+M+"; visit "+p+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function m(){}var r={d:{f:m,r:function(){throw Error(f(522))},D:m,C:m,L:m,m,X:m,S:m,M:m},p:0,findDOMNode:null},T=Symbol.for("react.portal");function g(M,p,U){var x=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:T,key:x==null?null:""+x,children:M,containerInfo:p,implementation:U}}var C=c.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function O(M,p){if(M==="font")return"";if(typeof p=="string")return p==="use-credentials"?p:""}return et.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=r,et.createPortal=function(M,p){var U=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!p||p.nodeType!==1&&p.nodeType!==9&&p.nodeType!==11)throw Error(f(299));return g(M,p,null,U)},et.flushSync=function(M){var p=C.T,U=r.p;try{if(C.T=null,r.p=2,M)return M()}finally{C.T=p,r.p=U,r.d.f()}},et.preconnect=function(M,p){typeof M=="string"&&(p?(p=p.crossOrigin,p=typeof p=="string"?p==="use-credentials"?p:"":void 0):p=null,r.d.C(M,p))},et.prefetchDNS=function(M){typeof M=="string"&&r.d.D(M)},et.preinit=function(M,p){if(typeof M=="string"&&p&&typeof p.as=="string"){var U=p.as,x=O(U,p.crossOrigin),R=typeof p.integrity=="string"?p.integrity:void 0,X=typeof p.fetchPriority=="string"?p.fetchPriority:void 0;U==="style"?r.d.S(M,typeof p.precedence=="string"?p.precedence:void 0,{crossOrigin:x,integrity:R,fetchPriority:X}):U==="script"&&r.d.X(M,{crossOrigin:x,integrity:R,fetchPriority:X,nonce:typeof p.nonce=="string"?p.nonce:void 0})}},et.preinitModule=function(M,p){if(typeof M=="string")if(typeof p=="object"&&p!==null){if(p.as==null||p.as==="script"){var U=O(p.as,p.crossOrigin);r.d.M(M,{crossOrigin:U,integrity:typeof p.integrity=="string"?p.integrity:void 0,nonce:typeof p.nonce=="string"?p.nonce:void 0})}}else p==null&&r.d.M(M)},et.preload=function(M,p){if(typeof M=="string"&&typeof p=="object"&&p!==null&&typeof p.as=="string"){var U=p.as,x=O(U,p.crossOrigin);r.d.L(M,U,{crossOrigin:x,integrity:typeof p.integrity=="string"?p.integrity:void 0,nonce:typeof p.nonce=="string"?p.nonce:void 0,type:typeof p.type=="string"?p.type:void 0,fetchPriority:typeof p.fetchPriority=="string"?p.fetchPriority:void 0,referrerPolicy:typeof p.referrerPolicy=="string"?p.referrerPolicy:void 0,imageSrcSet:typeof p.imageSrcSet=="string"?p.imageSrcSet:void 0,imageSizes:typeof p.imageSizes=="string"?p.imageSizes:void 0,media:typeof p.media=="string"?p.media:void 0})}},et.preloadModule=function(M,p){if(typeof M=="string")if(p){var U=O(p.as,p.crossOrigin);r.d.m(M,{as:typeof p.as=="string"&&p.as!=="script"?p.as:void 0,crossOrigin:U,integrity:typeof p.integrity=="string"?p.integrity:void 0})}else r.d.m(M)},et.requestFormReset=function(M){r.d.r(M)},et.unstable_batchedUpdates=function(M,p){return M(p)},et.useFormState=function(M,p,U){return C.H.useFormState(M,p,U)},et.useFormStatus=function(){return C.H.useHostTransitionStatus()},et.version="19.2.7",et}var Wd;function iv(){if(Wd)return xs.exports;Wd=1;function c(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(c)}catch(f){console.error(f)}}return c(),xs.exports=uv(),xs.exports}var Fd;function cv(){if(Fd)return Hn;Fd=1;var c=nv(),f=Ls(),m=iv();function r(e){var t="https://react.dev/errors/"+e;if(1<arguments.length){t+="?args[]="+encodeURIComponent(arguments[1]);for(var l=2;l<arguments.length;l++)t+="&args[]="+encodeURIComponent(arguments[l])}return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function T(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function g(e){var t=e,l=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do t=e,(t.flags&4098)!==0&&(l=t.return),e=t.return;while(e)}return t.tag===3?l:null}function C(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function O(e){if(e.tag===31){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function M(e){if(g(e)!==e)throw Error(r(188))}function p(e){var t=e.alternate;if(!t){if(t=g(e),t===null)throw Error(r(188));return t!==e?null:e}for(var l=e,a=t;;){var n=l.return;if(n===null)break;var u=n.alternate;if(u===null){if(a=n.return,a!==null){l=a;continue}break}if(n.child===u.child){for(u=n.child;u;){if(u===l)return M(n),e;if(u===a)return M(n),t;u=u.sibling}throw Error(r(188))}if(l.return!==a.return)l=n,a=u;else{for(var i=!1,s=n.child;s;){if(s===l){i=!0,l=n,a=u;break}if(s===a){i=!0,a=n,l=u;break}s=s.sibling}if(!i){for(s=u.child;s;){if(s===l){i=!0,l=u,a=n;break}if(s===a){i=!0,a=u,l=n;break}s=s.sibling}if(!i)throw Error(r(189))}}if(l.alternate!==a)throw Error(r(190))}if(l.tag!==3)throw Error(r(188));return l.stateNode.current===l?e:t}function U(e){var t=e.tag;if(t===5||t===26||t===27||t===6)return e;for(e=e.child;e!==null;){if(t=U(e),t!==null)return t;e=e.sibling}return null}var x=Object.assign,R=Symbol.for("react.element"),X=Symbol.for("react.transitional.element"),K=Symbol.for("react.portal"),ie=Symbol.for("react.fragment"),L=Symbol.for("react.strict_mode"),Y=Symbol.for("react.profiler"),Se=Symbol.for("react.consumer"),ke=Symbol.for("react.context"),tt=Symbol.for("react.forward_ref"),Et=Symbol.for("react.suspense"),Ie=Symbol.for("react.suspense_list"),te=Symbol.for("react.memo"),Ee=Symbol.for("react.lazy"),ze=Symbol.for("react.activity"),we=Symbol.for("react.memo_cache_sentinel"),Qe=Symbol.iterator;function xe(e){return e===null||typeof e!="object"?null:(e=Qe&&e[Qe]||e["@@iterator"],typeof e=="function"?e:null)}var De=Symbol.for("react.client.reference");function _t(e){if(e==null)return null;if(typeof e=="function")return e.$$typeof===De?null:e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case ie:return"Fragment";case Y:return"Profiler";case L:return"StrictMode";case Et:return"Suspense";case Ie:return"SuspenseList";case ze:return"Activity"}if(typeof e=="object")switch(e.$$typeof){case K:return"Portal";case ke:return e.displayName||"Context";case Se:return(e._context.displayName||"Context")+".Consumer";case tt:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case te:return t=e.displayName||null,t!==null?t:_t(e.type)||"Memo";case Ee:t=e._payload,e=e._init;try{return _t(e(t))}catch{}}return null}var at=Array.isArray,A=f.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,H=m.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,Z={pending:!1,data:null,method:null,action:null},me=[],se=-1;function y(e){return{current:e}}function j(e){0>se||(e.current=me[se],me[se]=null,se--)}function B(e,t){se++,me[se]=e.current,e.current=t}var k=y(null),W=y(null),ee=y(null),oe=y(null);function Ve(e,t){switch(B(ee,t),B(W,e),B(k,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?dd(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)t=dd(t),e=md(t,e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}j(k),B(k,e)}function Oe(){j(k),j(W),j(ee)}function Ul(e){e.memoizedState!==null&&B(oe,e);var t=k.current,l=md(t,e.type);t!==l&&(B(W,e),B(k,l))}function ea(e){W.current===e&&(j(k),j(W)),oe.current===e&&(j(oe),jn._currentValue=Z)}var $,He;function Ne(e){if($===void 0)try{throw Error()}catch(l){var t=l.stack.trim().match(/\n( *(at )?)/);$=t&&t[1]||"",He=-1<l.stack.indexOf(`
|
|
3
3
|
at`)?" (<anonymous>)":-1<l.stack.indexOf("@")?"@unknown:0:0":""}return`
|
|
4
4
|
`+$+e+He}var Hl=!1;function ui(e,t){if(!e||Hl)return"";Hl=!0;var l=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var a={DetermineComponentFrameRoot:function(){try{if(t){var D=function(){throw Error()};if(Object.defineProperty(D.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(D,[])}catch(_){var E=_}Reflect.construct(e,[],D)}else{try{D.call()}catch(_){E=_}e.call(D.prototype)}}else{try{throw Error()}catch(_){E=_}(D=e())&&typeof D.catch=="function"&&D.catch(function(){})}}catch(_){if(_&&E&&typeof _.stack=="string")return[_.stack,E.stack]}return[null,null]}};a.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var n=Object.getOwnPropertyDescriptor(a.DetermineComponentFrameRoot,"name");n&&n.configurable&&Object.defineProperty(a.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var u=a.DetermineComponentFrameRoot(),i=u[0],s=u[1];if(i&&s){var d=i.split(`
|
|
@@ -17,5 +17,5 @@ Error generating stack: `+a.message+`
|
|
|
17
17
|
`)})},{id:"compose-paperless-ngx",mode:"compose",name:"Paperless-ngx",description:"3 个服务:paperless、postgres、redis。",descriptionEn:"3 services: paperless, postgres, and redis.",tags:["documents","ocr"],compose:il({name:"paperless",region:"home",services:[kt({name:"paperless",exposure:"tailscale-relay",domain:"paperless.example.com",port:"8000",env:[J("PAPERLESS_REDIS","redis://redis:6379"),J("PAPERLESS_DBHOST","postgres"),J("PAPERLESS_DBNAME","paperless"),J("PAPERLESS_DBUSER","paperless"),J("PAPERLESS_URL","https://paperless.example.com"),{...J("PAPERLESS_DBPASS","${PAPERLESS_DB_PASSWORD}"),kind:"secret"},{...J("PAPERLESS_SECRET_KEY","${PAPERLESS_SECRET_KEY}"),kind:"secret"}]}),kt({name:"redis"}),kt({name:"postgres",env:[J("POSTGRES_DB","paperless"),J("POSTGRES_USER","paperless"),{...J("POSTGRES_PASSWORD","${PAPERLESS_DB_PASSWORD}"),kind:"secret"}]})],volumes:[cl("paperless-data","/usr/src/paperless/data",{storageMode:"local"}),cl("paperless-media","/usr/src/paperless/media",{storageMode:"local"}),cl("paperless-db","/var/lib/postgresql/data",{storageMode:"local"})],dockerComposeYaml:["services:"," paperless:"," image: ghcr.io/paperless-ngx/paperless-ngx:latest"," environment:"," PAPERLESS_REDIS: redis://redis:6379"," PAPERLESS_DBHOST: postgres"," PAPERLESS_DBNAME: paperless"," PAPERLESS_DBUSER: paperless"," PAPERLESS_DBPASS: ${PAPERLESS_DB_PASSWORD}"," PAPERLESS_SECRET_KEY: ${PAPERLESS_SECRET_KEY}"," PAPERLESS_URL: https://paperless.example.com"," volumes:"," - paperless-data:/usr/src/paperless/data"," - paperless-media:/usr/src/paperless/media"," depends_on:"," - redis"," - postgres"," redis:"," image: redis:7-alpine"," postgres:"," image: postgres:16-alpine"," environment:"," POSTGRES_DB: paperless"," POSTGRES_USER: paperless"," POSTGRES_PASSWORD: ${PAPERLESS_DB_PASSWORD}"," volumes:"," - paperless-db:/var/lib/postgresql/data","volumes:"," paperless-data: {}"," paperless-media: {}"," paperless-db: {}",""].join(`
|
|
18
18
|
`)})},{id:"compose-stirling-pdf",mode:"compose",name:"Stirling PDF",description:"1 个服务,home relay,容器端口 8080。",descriptionEn:"1 service, home relay, container port 8080.",tags:["documents","utility"],compose:il({name:"stirling-pdf",region:"home",services:[kt({name:"stirling-pdf",exposure:"tailscale-relay",domain:"pdf.example.com",port:"8080",env:[J("DOCKER_ENABLE_SECURITY","false")]})],volumes:[cl("stirling-training-data","/usr/share/tessdata"),cl("stirling-configs","/configs")],dockerComposeYaml:["services:"," stirling-pdf:"," image: frooodle/s-pdf:latest"," environment:",' DOCKER_ENABLE_SECURITY: "false"'," volumes:"," - stirling-training-data:/usr/share/tessdata"," - stirling-configs:/configs","volumes:"," stirling-training-data: {}"," stirling-configs: {}",""].join(`
|
|
19
19
|
`)})}],mv=new Set(["traefik","egress","luma-control"]);function hv(c){const f=c.stack||c.name||"";return mv.has(f)||f.startsWith("luma-storage")||c.name==="cloudflared"}function yv(c){return!!c.managedBy}function ym(c){return(c.status||c.health||"").toLowerCase()}function vm(c){const f=ym(c);return(c.failed||0)>0||["failed","dead","lost","error"].includes(f)||(c.pending||0)>0?!1:(c.desired||0)>0?(c.running||0)>=(c.desired||0):f==="running"||f==="healthy"||f==="complete"}function vv(c){return c.some(f=>(f.failed||0)>0||["failed","dead","lost","error"].includes(ym(f)))?"failed":c.some(f=>(f.pending||0)>0)?"pending":c.every(vm)?"running":"degraded"}function gv(c){return[...c.nodes||[],c.node||"",...(c.tasks||[]).map(f=>f.node||""),...c.resources?.actual?.nodes||[]].filter(Boolean)}function pv(c,{includePlatformManaged:f=!1}={}){const m=new Map;for(const r of c){if(hv(r)||!f&&yv(r))continue;const T=r.stack||r.name||"";T&&m.set(T,[...m.get(T)||[],r])}return[...m.entries()].map(([r,T])=>{const g=[...new Set(T.map(x=>x.domain||"").filter(Boolean))],C=T.reduce((x,R)=>x+(R.running||0),0),O=T.reduce((x,R)=>x+(R.desired||0),0),M=[...new Set(T.map(x=>x.exposure||"none"))],p=[...new Set(T.map(x=>x.region||"-"))],U=[...new Set(T.flatMap(gv))].sort();return{stack:r,services:T,domains:g,running:C,desired:O,exposure:M.length===1?M[0]:"mixed",regions:p,nodes:U,status:vv(T)}}).sort((r,T)=>r.stack.localeCompare(T.stack))}function em(c){const f=c.services[0]||{};return sl({name:c.stack,image:f.image||"",region:f.region||"cn",node:"",exposure:f.exposure||"none",domain:f.domain||"",port:f.targetPort||"",replicas:f.desired||1,proxy:!1})}function tm(c){const f=c.services.map(g=>({name:g.name||"app",region:g.region||"",node:"",exposure:g.exposure||"none",domain:g.domain||"",port:g.targetPort||"",publishPort:"",replicas:g.desired||1,proxy:!1,env:[]})),m=new Set;for(const g of c.services)for(const C of g.storage||[])C.name&&m.add(C.name);const r=[...m].map(g=>{const C=c.services.flatMap(O=>O.storage||[]).find(O=>O.name===g);return{name:g,target:"",storageMode:C?.storageClass?"storageClass":"local",storageClass:C?.storageClass||"",localNode:C?.node||"",localPath:C?.networkPath||""}}),T=["services:",...c.services.flatMap(g=>[` ${g.name||"app"}:`,` image: ${g.image||"replace-me:latest"}`]),...r.length?["volumes:",...r.map(g=>` ${g.name}: {}`)]:[],""].join(`
|
|
20
|
-
`);return{name:c.stack,composeFileName:"docker-compose.yml",region:c.regions[0]||"cn",services:f,volumes:r,dockerComposeYaml:T,skipDns:!1,skipOrchestrator:!1}}const Hs={zh:{title:"控制台",subtitle:"查看控制面状态、服务器、服务和访问路径。",navOverview:"总览",navNodes:"节点",navApplications:"应用",navServices:"服务",navTopology:"架构",navTraffic:"流量",navStorage:"存储",navDeploy:"部署",navFuture:"扩展",refresh:"刷新",signOut:"退出",readonly:"管理访问",loginTitle:"粘贴管理 Token",loginCopy:"Token 只保存在当前浏览器,并只发送给当前 Luma Control 域名。",openStatus:"打开面板",cluster:"集群",controlPlane:"控制面",nodesEyebrow:"服务器",nodes:"节点",servicesEyebrow:"工作负载",services:"服务",applications:"应用管理",application:"应用",createApplication:"创建应用",createOrUpdateApplication:"创建 / 更新应用",updateApp:"更新",viewConfig:"查看配置",loadingConfig:"读取中...",deploymentConfig:"部署配置",lumaManifest:"Luma 配置",composeFile:"Compose 文件",source:"来源",lastUpdated:"更新时间",noDeploymentConfig:"没有保存的部署配置",restart:"重启",restarting:"重启中...",shell:"终端",versions:"版本",version:"版本",loadingHistory:"读取版本...",currentVersion:"当前版本",noVersionHistory:"暂无版本历史",rollback:"回滚",rollingBack:"回滚中...",rollbackToVersion:"回滚到此版本",submitted:"提交时间",stableVersion:"稳定",actions:"操作",status:"状态",accessAddress:"访问地址",internalOnly:"内部访问",noApplications:"暂无业务应用",nodeTopology:"节点架构",pathsEyebrow:"拓扑",trafficPaths:"流量路径",storageEyebrow:"状态资源",storage:"存储",volume:"卷",kind:"类型",storageClass:"存储类",node:"节点",diagnostics:"诊断",inferred:"自动生成",name:"名称",region:"区域",role:"角色",state:"状态",availability:"可用性",leader:"Leader",service:"服务",exposure:"入口",port:"端口",network:"网络",image:"镜像",replicas:"副本",health:"健康",notConnected:"未连接",refreshing:"刷新中...",unavailable:"不可用",tokenRejected:"Token 无效",updated:"已更新",ready:"就绪",missing:"缺失",configured:"已配置",dockerReachable:"Docker socket 可访问",dockerUnavailable:"Docker socket 不可用",noPublicDomain:"无公开域名",running:"运行",pending:"等待",failed:"失败",yes:"是",details:"详情",close:"关闭",reserved:"预留"},en:{title:"Control Console",subtitle:"Inspect control readiness, servers, services, and traffic paths.",navOverview:"Overview",navNodes:"Nodes",navApplications:"Apps",navServices:"Services",navTopology:"Topology",navTraffic:"Traffic",navStorage:"Storage",navDeploy:"Deploy",navFuture:"Extensions",refresh:"Refresh",signOut:"Sign out",readonly:"Management access",loginTitle:"Paste a management token",loginCopy:"The token stays in this browser and is only sent to this Luma Control origin.",openStatus:"Open status",cluster:"Cluster",controlPlane:"Control plane",nodesEyebrow:"Servers",nodes:"Nodes",servicesEyebrow:"Workloads",services:"Services",applications:"Application Management",application:"Application",createApplication:"Create App",createOrUpdateApplication:"Create / Update App",updateApp:"Update",viewConfig:"View Config",loadingConfig:"Loading...",deploymentConfig:"Deployment Config",lumaManifest:"Luma Config",composeFile:"Compose File",source:"Source",lastUpdated:"Updated",noDeploymentConfig:"No saved deployment config",restart:"Restart",restarting:"Restarting...",shell:"Shell",versions:"Versions",version:"Version",loadingHistory:"Loading versions...",currentVersion:"Current version",noVersionHistory:"No version history",rollback:"Rollback",rollingBack:"Rolling back...",rollbackToVersion:"Rollback here",submitted:"Submitted",stableVersion:"Stable",actions:"Actions",status:"Status",accessAddress:"Access Address",internalOnly:"Internal only",noApplications:"No business applications",nodeTopology:"Node Architecture",pathsEyebrow:"Topology",trafficPaths:"Traffic Paths",storageEyebrow:"State",storage:"Storage",volume:"Volume",kind:"Kind",storageClass:"Storage Class",node:"Node",diagnostics:"Diagnostics",inferred:"Generated",name:"Name",region:"Region",role:"Role",state:"State",availability:"Availability",leader:"Leader",service:"Service",exposure:"Exposure",port:"Port",network:"Network",image:"Image",replicas:"Replicas",health:"Health",notConnected:"Not connected",refreshing:"Refreshing...",unavailable:"Unavailable",tokenRejected:"Token rejected",updated:"Updated",ready:"ready",missing:"missing",configured:"configured",dockerReachable:"Docker socket reachable",dockerUnavailable:"Docker socket unavailable",noPublicDomain:"No public domain",running:"run",pending:"pending",failed:"failed",yes:"yes",details:"Details",close:"Close",reserved:"Reserved"}};function Ue(c,f){return Hs[c][f]||Hs.zh[f]||f}function gm(c,f){return f?c==="zh"&&{ready:"就绪",healthy:"健康",running:"运行",pending:"等待",failed:"失败",degraded:"降级",missing:"缺失",unknown:"未知"}[f]||f:"-"}const Sv={displayName:{zh:"名称",en:"Name"},agent:{zh:"Agent",en:"Agent"},cpu:{zh:"CPU",en:"CPU"},load1:{zh:"负载 (1m)",en:"Load (1m)"},memory:{zh:"内存",en:"Memory"},memoryTotal:{zh:"内存总量",en:"Total memory"},cpuCapacity:{zh:"CPU 容量",en:"CPU capacity"},memoryCapacity:{zh:"内存容量",en:"Memory capacity"},fullName:{zh:"完整名称",en:"Full name"},nodes:{zh:"节点",en:"Nodes"},limits:{zh:"资源上限",en:"Limits"},reservations:{zh:"资源预留",en:"Reservations"},tasks:{zh:"任务",en:"Tasks"}};function lm(c,f){const m=Sv[f];return m?m[c]:f in Hs.zh?Ue(c,f):f}const pm="/dashboard/asset-luma-logo-mark-CH2lRgZQ.png";function bv({lang:c,onSubmit:f}){const[m,r]=q.useState(""),T=q.useId(),g=c==="zh",C=O=>{O.preventDefault(),m.trim()&&f(m)};return o.jsxs("section",{className:"login-panel",children:[o.jsxs("div",{className:"login-panel-brand",children:[o.jsx("div",{className:"brand-mark","aria-hidden":"true",children:o.jsx("img",{src:pm,alt:"",width:24,height:24})}),o.jsxs("div",{children:[o.jsx("p",{className:"eyebrow",children:Ue(c,"readonly")}),o.jsx("h1",{children:Ue(c,"loginTitle")})]})]}),o.jsx("p",{children:Ue(c,"loginCopy")}),o.jsxs("form",{onSubmit:C,children:[o.jsxs("label",{htmlFor:T,children:[o.jsx("span",{children:g?"管理 Token":"Management token"}),o.jsx("input",{id:T,autoComplete:"current-password",name:"management-token",onChange:O=>r(O.target.value),placeholder:"luma_…",spellCheck:!1,type:"password",value:m})]}),o.jsx("button",{type:"submit",className:"primary",children:Ue(c,"openStatus")})]})]})}const Sm=(...c)=>c.filter((f,m,r)=>!!f&&f.trim()!==""&&r.indexOf(f)===m).join(" ").trim();const Ev=c=>c.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();const _v=c=>c.replace(/^([A-Z])|[\s-_]+(\w)/g,(f,m,r)=>r?r.toUpperCase():m.toLowerCase());const am=c=>{const f=_v(c);return f.charAt(0).toUpperCase()+f.slice(1)};var Ns={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};const Tv=c=>{for(const f in c)if(f.startsWith("aria-")||f==="role"||f==="title")return!0;return!1},Av=q.createContext({}),zv=()=>q.useContext(Av),xv=q.forwardRef(({color:c,size:f,strokeWidth:m,absoluteStrokeWidth:r,className:T="",children:g,iconNode:C,...O},M)=>{const{size:p=24,strokeWidth:U=2,absoluteStrokeWidth:x=!1,color:R="currentColor",className:X=""}=zv()??{},K=r??x?Number(m??U)*24/Number(f??p):m??U;return q.createElement("svg",{ref:M,...Ns,width:f??p??Ns.width,height:f??p??Ns.height,stroke:c??R,strokeWidth:K,className:Sm("lucide",X,T),...!g&&!Tv(O)&&{"aria-hidden":"true"},...O},[...C.map(([ie,L])=>q.createElement(ie,L)),...Array.isArray(g)?g:[g]])});const Ge=(c,f)=>{const m=q.forwardRef(({className:r,...T},g)=>q.createElement(xv,{ref:g,iconNode:f,className:Sm(`lucide-${Ev(am(c))}`,`lucide-${c}`,r),...T}));return m.displayName=am(c),m};const Ov=[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]],Nv=Ge("activity",Ov);const Dv=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]],Ds=Ge("arrow-right",Dv);const jv=[["path",{d:"M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z",key:"lc1i9w"}],["path",{d:"m7 16.5-4.74-2.85",key:"1o9zyk"}],["path",{d:"m7 16.5 5-3",key:"va8pkn"}],["path",{d:"M7 16.5v5.17",key:"jnp8gn"}],["path",{d:"M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z",key:"8zsnat"}],["path",{d:"m17 16.5-5-3",key:"8arw3v"}],["path",{d:"m17 16.5 4.74-2.85",key:"8rfmw"}],["path",{d:"M17 16.5v5.17",key:"k6z78m"}],["path",{d:"M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z",key:"1xygjf"}],["path",{d:"M12 8 7.26 5.15",key:"1vbdud"}],["path",{d:"m12 8 4.74-2.85",key:"3rx089"}],["path",{d:"M12 13.5V8",key:"1io7kd"}]],Mv=Ge("boxes",jv);const Cv=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],Rv=Ge("check",Cv);const Uv=[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]],Hv=Ge("chevron-down",Uv);const Bv=[["path",{d:"m10.852 19.772-.383.924",key:"r7sl7d"}],["path",{d:"m13.148 14.228.383-.923",key:"1d5zpm"}],["path",{d:"M13.148 19.772a3 3 0 1 0-2.296-5.544l-.383-.923",key:"1ydik7"}],["path",{d:"m13.53 20.696-.382-.924a3 3 0 1 1-2.296-5.544",key:"1m1vsf"}],["path",{d:"m14.772 15.852.923-.383",key:"660p6e"}],["path",{d:"m14.772 18.148.923.383",key:"hrcpis"}],["path",{d:"M4.2 15.1a7 7 0 1 1 9.93-9.858A7 7 0 0 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.2",key:"j2q98n"}],["path",{d:"m9.228 15.852-.923-.383",key:"1p9ong"}],["path",{d:"m9.228 18.148-.923.383",key:"6558rz"}]],qv=Ge("cloud-cog",Bv);const Lv=[["rect",{width:"7",height:"9",x:"3",y:"3",rx:"1",key:"10lvy0"}],["rect",{width:"7",height:"5",x:"14",y:"3",rx:"1",key:"16une8"}],["rect",{width:"7",height:"9",x:"14",y:"12",rx:"1",key:"1hutg5"}],["rect",{width:"7",height:"5",x:"3",y:"16",rx:"1",key:"ldoo1y"}]],Yv=Ge("layout-dashboard",Lv);const Gv=[["path",{d:"m16 17 5-5-5-5",key:"1bji2h"}],["path",{d:"M21 12H9",key:"dn1m92"}],["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}]],kv=Ge("log-out",Gv);const wv=[["rect",{width:"20",height:"14",x:"2",y:"3",rx:"2",key:"48i651"}],["line",{x1:"8",x2:"16",y1:"21",y2:"21",key:"1svkeh"}],["line",{x1:"12",x2:"12",y1:"17",y2:"21",key:"vw1qmm"}]],Xv=Ge("monitor",wv);const Qv=[["path",{d:"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401",key:"kfwtm"}]],Vv=Ge("moon",Qv);const Zv=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M9 3v18",key:"fh3hqa"}],["path",{d:"m16 15-3-3 3-3",key:"14y99z"}]],Kv=Ge("panel-left-close",Zv);const Jv=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M9 3v18",key:"fh3hqa"}],["path",{d:"m14 9 3 3-3 3",key:"8010ee"}]],$v=Ge("panel-left-open",Jv);const Wv=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]],Fv=Ge("plus",Wv);const Pv=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],Iv=Ge("refresh-cw",Pv);const e0=[["path",{d:"M15 12h-5",key:"r7krc0"}],["path",{d:"M15 8h-5",key:"1khuty"}],["path",{d:"M19 17V5a2 2 0 0 0-2-2H4",key:"zz82l3"}],["path",{d:"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3",key:"1ph1d7"}]],t0=Ge("scroll-text",e0);const l0=[["path",{d:"m10.852 14.772-.383.923",key:"11vil6"}],["path",{d:"M13.148 14.772a3 3 0 1 0-2.296-5.544l-.383-.923",key:"1v3clb"}],["path",{d:"m13.148 9.228.383-.923",key:"t2zzyc"}],["path",{d:"m13.53 15.696-.382-.924a3 3 0 1 1-2.296-5.544",key:"1bxfiv"}],["path",{d:"m14.772 10.852.923-.383",key:"k9m8cz"}],["path",{d:"m14.772 13.148.923.383",key:"1xvhww"}],["path",{d:"M4.5 10H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-.5",key:"tn8das"}],["path",{d:"M4.5 14H4a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2h-.5",key:"1g2pve"}],["path",{d:"M6 18h.01",key:"uhywen"}],["path",{d:"M6 6h.01",key:"1utrut"}],["path",{d:"m9.228 10.852-.923-.383",key:"1wtb30"}],["path",{d:"m9.228 13.148-.923.383",key:"1a830x"}]],a0=Ge("server-cog",l0);const n0=[["path",{d:"M14 17H5",key:"gfn3mx"}],["path",{d:"M19 7h-9",key:"6i9tg"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}],["circle",{cx:"7",cy:"7",r:"3",key:"dfmy0x"}]],u0=Ge("settings-2",n0);const i0=[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",key:"1i5ecw"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],c0=Ge("settings",i0);const s0=[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]],o0=Ge("sun",s0);const f0=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],r0=Ge("x",f0);function d0({clusterId:c,lang:f,lastUpdated:m,syncStatus:r,themeMode:T,onLangChange:g,onThemeModeChange:C,onRefresh:O,onSignOut:M}){const p=new Intl.DateTimeFormat(f==="zh"?"zh-CN":"en-US",{hour:"2-digit",minute:"2-digit",second:"2-digit"}),U=r==="updated"&&m?`${Ue(f,"updated")} ${p.format(m)}`:Ue(f,r),x=[{mode:"system",icon:Xv,label:f==="zh"?"跟随系统":"Follow system"},{mode:"light",icon:o0,label:f==="zh"?"日间模式":"Light mode"},{mode:"dark",icon:Vv,label:f==="zh"?"夜间模式":"Dark mode"}];return o.jsxs("header",{className:"topbar",children:[o.jsxs("div",{className:"cluster-chip",children:[o.jsx("span",{children:Ue(f,"cluster")}),o.jsx("strong",{translate:"no",children:c})]}),o.jsxs("div",{className:"top-actions",children:[o.jsx("span",{className:`sync-state ${r}`,title:U,role:"status",children:U}),o.jsxs("details",{className:"topbar-preferences",onKeyDown:R=>{R.key==="Escape"&&(R.currentTarget.open=!1,R.currentTarget.querySelector("summary")?.focus())},children:[o.jsxs("summary",{"aria-label":f==="zh"?"界面偏好设置":"Display preferences",title:f==="zh"?"界面偏好设置":"Display preferences",children:[o.jsx(u0,{size:16,"aria-hidden":"true"}),o.jsx("span",{children:f==="zh"?"偏好":"Display"})]}),o.jsxs("div",{className:"topbar-preferences-panel",children:[o.jsx("span",{className:"preference-label",children:f==="zh"?"外观":"Appearance"}),o.jsx("div",{className:"lang-switch theme-switch",role:"group","aria-label":f==="zh"?"主题":"Theme",children:x.map(({mode:R,icon:X,label:K})=>o.jsx("button",{className:T===R?"active":"",type:"button",title:K,"aria-label":K,"aria-pressed":T===R,onClick:()=>C(R),children:o.jsx(X,{size:16,"aria-hidden":"true"})},R))}),o.jsx("span",{className:"preference-label",children:f==="zh"?"语言":"Language"}),o.jsxs("div",{className:"lang-switch",role:"group","aria-label":f==="zh"?"语言切换":"Language switch",children:[o.jsx("button",{className:f==="zh"?"active":"",onClick:()=>g("zh"),type:"button","aria-pressed":f==="zh","aria-label":f==="zh"?"切换到中文":"Switch to Chinese",children:"中文"}),o.jsx("button",{className:f==="en"?"active":"",onClick:()=>g("en"),type:"button","aria-pressed":f==="en","aria-label":f==="zh"?"切换到英文":"Switch to English",children:"EN"})]})]})]}),o.jsxs("button",{type:"button",onClick:O,"aria-label":Ue(f,"refresh"),title:Ue(f,"refresh"),children:[o.jsx(Iv,{size:16,"aria-hidden":"true"}),o.jsx("span",{className:"topbar-action-label",children:Ue(f,"refresh")})]}),o.jsxs("button",{className:"ghost",type:"button",onClick:M,"aria-label":Ue(f,"signOut"),title:Ue(f,"signOut"),children:[o.jsx(kv,{size:16,"aria-hidden":"true"}),o.jsx("span",{className:"topbar-action-label",children:Ue(f,"signOut")})]})]})]})}function sg({value:c,options:f,onChange:m,placeholder:r="-",disabled:T=!1,ariaLabel:g,className:C=""}){const O=q.useId(),M=q.useRef(null),[p,U]=q.useState(!1),x=f.find(Y=>Y.value===c),R=q.useMemo(()=>f.filter(Y=>!Y.disabled),[f]),X=Math.max(0,R.findIndex(Y=>Y.value===c));q.useEffect(()=>{if(!p)return;const Y=Se=>{M.current?.contains(Se.target)||U(!1)};return window.addEventListener("pointerdown",Y),()=>window.removeEventListener("pointerdown",Y)},[p]);const K=Y=>{Y.disabled||(m(Y.value),U(!1))},ie=Y=>{if(!R.length)return;const Se=R[(X+Y+R.length)%R.length];m(Se.value)},L=Y=>{if(Y.key==="Escape"){p&&Y.stopPropagation(),U(!1);return}if(Y.key==="Enter"||Y.key===" "){Y.preventDefault(),U(Se=>!Se);return}if(Y.key==="ArrowDown"){Y.preventDefault(),p||U(!0),ie(1);return}Y.key==="ArrowUp"&&(Y.preventDefault(),p||U(!0),ie(-1))};return o.jsxs("div",{ref:M,className:`luma-select ${p?"open":""} ${T?"disabled":""} ${C}`.trim(),children:[o.jsxs("button",{type:"button",className:"luma-select-trigger","aria-label":g,"aria-haspopup":"listbox","aria-expanded":p,"aria-controls":`${O}-listbox`,disabled:T,onClick:()=>U(Y=>!Y),onKeyDown:L,children:[o.jsx("span",{className:x?"luma-select-value":"luma-select-value placeholder",children:x?.label||r}),o.jsx(Hv,{size:15,"aria-hidden":"true"})]}),p?o.jsx("div",{id:`${O}-listbox`,className:"luma-select-menu",role:"listbox","aria-label":g,children:f.length?f.map(Y=>{const Se=Y.value===c;return o.jsxs("button",{type:"button",role:"option","aria-selected":Se,className:Se?"luma-select-option active":"luma-select-option",disabled:Y.disabled,onClick:()=>K(Y),children:[o.jsx("span",{children:Y.label}),Se?o.jsx(Rv,{size:14,"aria-hidden":"true"}):null]},Y.value||"__empty")}):o.jsx("div",{className:"luma-select-empty",children:r})}):null]})}function og({title:c,meta:f}){return o.jsxs("span",{className:"primary-cell",children:[o.jsx("strong",{children:c||"-"}),f&&f!==c?o.jsx("small",{children:f}):null]})}function m0({value:c}){return o.jsx("span",{className:"badge",children:c})}function fg({children:c}){return o.jsx("span",{className:"badge-group",children:c})}function rg({value:c}){return o.jsx("code",{children:c})}function Bn({label:c,value:f}){const m=(f||"").toLowerCase(),r=["ready","running","healthy","active","succeeded","stable","available"].includes(m)?"good":["failed","missing","bad","down","error","failed_partial","critical"].includes(m)?"danger":(["pending","degraded","drain","draining","warning","starting","deploying","unknown",""].includes(m),"warn");return o.jsx("span",{className:`badge ${r}`,children:c})}const bm=3600*1e3;function ti(c){return JSON.stringify([c.severity||"info",c.kind||"",c.target||"",c.message||""])}function h0(c,f){return`luma.dashboard.dismissedIssues.v2:${encodeURIComponent(f)}:${encodeURIComponent(c||"unknown")}`}function js(c,f,m){return!c||typeof c!="object"||Array.isArray(c)?{}:Object.fromEntries(Object.entries(c).filter(([r,T])=>f.has(r)&&typeof T=="number"&&Number.isFinite(T)&&T>m&&T<=m+bm))}function nm(c){try{return JSON.parse(localStorage.getItem(c)||"{}")}catch{return{}}}function y0(c,f){const m=h0(c,window.location.origin),r=JSON.stringify(f.map(ti)),T=q.useMemo(()=>new Set(JSON.parse(r)),[r]),[g,C]=q.useState(Date.now),[O,M]=q.useState(()=>({storageKey:m,items:js(nm(m),T,Date.now())})),p=q.useMemo(()=>js(O.storageKey===m?O.items:nm(m),T,g),[O,m,T,g]);q.useEffect(()=>{M(X=>X.storageKey===m&&JSON.stringify(X.items)===JSON.stringify(p)?X:{storageKey:m,items:p});try{localStorage.setItem(m,JSON.stringify(p))}catch{}},[m,p]),q.useEffect(()=>{const X=window.setInterval(()=>C(Date.now()),15e3);return()=>window.clearInterval(X)},[]);const U=q.useCallback(X=>{const K=Date.now();C(K),M({storageKey:m,items:{...js(p,T,K),[X]:K+bm}})},[m,p,T]),x=q.useCallback(()=>M({storageKey:m,items:{}}),[m]),R=q.useCallback(X=>!!p[X],[p]);return{dismiss:U,clear:x,isDismissed:R,dismissedCount:Object.keys(p).length}}const ei=c=>c==="critical"?0:c==="warning"?1:2;function v0(c,f,m){const r=new Map;for(const T of c){const g=T.kind==="agent"||T.kind?.startsWith("node-")?m.find(U=>U.name===T.target):void 0,C=T.kind==="deployment"||T.kind?.startsWith("service-")?f.filter(U=>U.stack===T.target||U.services.some(x=>(x.fullName||x.name)===T.target)):[],O=C.length===1?C[0]:void 0,M=g?`node:${g.name}`:O?`app:${O.stack}`:`issue:${T.kind||""}:${T.target||""}`,p=r.get(M)||{key:M,target:g?.name||O?.stack||T.target||T.kind||"—",app:O,node:g,severity:T.severity||"info",issues:[]};p.issues.push(T),ei(T.severity)<ei(p.severity)&&(p.severity=T.severity||"info"),r.set(M,p)}return[...r.values()].sort((T,g)=>ei(T.severity)-ei(g.severity)||T.target.localeCompare(g.target))}function um(c){return Math.max(c.metrics?.cpuPercent??c.metrics?.loadPercent??0,c.metrics?.memoryUsedPercent??0,c.metrics?.diskUsedPercent??0)}function g0({meta:c}){return o.jsxs("section",{className:"page-toolbar","aria-labelledby":"page-title",children:[o.jsxs("div",{className:"page-toolbar-copy",children:[o.jsx("p",{className:"eyebrow",children:c.eyebrow}),o.jsx("h1",{id:"page-title",children:c.title}),c.description?o.jsx("p",{children:c.description}):null]}),o.jsxs("div",{className:"page-toolbar-side",children:[c.score?o.jsxs("div",{className:"ops-hero-score","aria-label":c.score.label,children:[o.jsx("div",{className:"score-ring",style:{"--score":`${c.score.value}%`},children:o.jsx("strong",{children:c.score.value})}),o.jsxs("span",{children:[c.score.label,o.jsx("b",{children:c.score.status})]})]}):null,c.metrics.length?o.jsx("div",{className:"page-toolbar-metrics","aria-label":c.title,children:c.metrics.map(f=>o.jsxs("span",{children:[o.jsx("strong",{children:f.value}),o.jsx("small",{children:f.label})]},f.label))}):null,c.action?o.jsx("div",{className:"page-toolbar-action",children:c.action}):null]})]})}function Ms(c){return typeof c=="number"&&Number.isFinite(c)?`${Math.round(c)}%`:"—"}function p0({lang:c,payload:f,vm:m,onNavigate:r,onSelectNode:T}){const g=c==="zh",C=f.readiness||{},O=m.applications.filter(L=>!["healthy","running"].includes(L.status)),M=m.nodes.slice().sort((L,Y)=>um(Y)-um(L)).slice(0,5),{dismiss:p,clear:U,isDismissed:x}=y0(f.cluster?.id||"",m.issues),R=q.useMemo(()=>m.issues.filter(L=>!x(ti(L))),[m.issues,x]),X=q.useMemo(()=>v0(R,m.applications,m.nodes),[R,m.applications,m.nodes]),K=m.issues.length-R.length,ie=L=>L==="critical"?g?"严重":"Critical":L==="warning"?g?"警告":"Warning":g?"信息":"Info";return o.jsxs(o.Fragment,{children:[o.jsx(g0,{meta:{eyebrow:Ue(c,"controlPlane"),title:g?"集群总览":"Cluster overview",description:g?"从需要关注的对象开始,进入应用或节点继续处理。":"Start with objects that need attention, then continue in the application or node workspace.",metrics:[],action:o.jsxs("button",{type:"button",className:"primary page-toolbar-cta",onClick:()=>r("deploy"),children:[o.jsx(Fv,{size:16,"aria-hidden":"true"}),Ue(c,"createApplication")]})}}),o.jsxs("section",{className:"overview-summary-grid","aria-label":g?"集群运行摘要":"Cluster summary",children:[o.jsxs("button",{className:"overview-summary-item",onClick:()=>r("applications"),type:"button",children:[o.jsx("span",{children:g?"异常应用":"Affected applications"}),o.jsxs("strong",{children:[O.length,o.jsxs("small",{children:[" / ",m.applications.length]})]}),o.jsx("small",{children:g?"依据副本与任务运行状态":"Based on replica and task state"})]}),o.jsxs("button",{className:"overview-summary-item",onClick:()=>r("nodes"),type:"button",children:[o.jsx("span",{children:g?"就绪节点":"Ready nodes"}),o.jsxs("strong",{children:[m.activeNodes,o.jsxs("small",{children:[" / ",m.nodes.length]})]}),o.jsx("small",{children:g?"已排除排空中的节点":"Excludes draining nodes"})]}),o.jsxs("button",{className:"overview-summary-item",onClick:()=>r("observability"),type:"button",children:[o.jsx("span",{children:g?"当前诊断":"Current diagnostics"}),o.jsx("strong",{children:m.issues.length}),o.jsx("small",{children:g?`${m.issueCounts.critical} 严重 · ${m.issueCounts.warning} 警告`:`${m.issueCounts.critical} critical · ${m.issueCounts.warning} warning`})]})]}),o.jsxs("section",{className:"overview-priority-layout","aria-label":g?"运维关注":"Operations attention",children:[o.jsxs("article",{className:"panel overview-attention-panel",children:[o.jsxs("div",{className:"panel-heading",children:[o.jsxs("div",{children:[o.jsx("h2",{children:g?"需要关注":"Needs attention"}),o.jsx("p",{children:g?"按对象归组,展开查看原始诊断;归组不代表相同根因。":"Grouped by object. Expand for original diagnostics; grouping does not imply a shared cause."})]}),o.jsx(m0,{value:g?`${X.length} 个对象`:`${X.length} objects`})]}),o.jsxs("div",{className:"overview-issue-groups",children:[X.map(L=>o.jsxs("section",{className:`overview-issue-group ${L.severity}`,children:[o.jsxs("div",{className:"overview-issue-heading",children:[o.jsxs("div",{children:[o.jsx(Bn,{value:L.severity==="critical"?"failed":L.severity==="warning"?"pending":"unknown",label:ie(L.severity)}),o.jsx("strong",{children:L.target}),o.jsx("small",{children:L.app?g?"应用":"Application":L.node?g?"节点":"Node":g?"诊断对象":"Diagnostic target"})]}),L.app||L.node?o.jsxs("button",{type:"button",className:"ghost text-link-button",onClick:()=>L.node?T(L.node):r("applications",{selectApp:L.app.stack}),children:[g?"查看详情":"View details",o.jsx(Ds,{size:15,"aria-hidden":"true"})]}):null]}),o.jsxs("details",{className:"overview-issue-evidence",children:[o.jsx("summary",{children:g?`${L.issues.length} 条诊断 · 查看原始信息`:`${L.issues.length} diagnostics · view evidence`}),L.issues.map((Y,Se)=>o.jsxs("div",{className:"overview-evidence-row",children:[o.jsxs("div",{children:[o.jsxs("small",{children:[ie(Y.severity||"info")," · ",Y.kind||"—"," · ",Y.target||"—"]}),o.jsx("p",{children:Y.message||(g?"未提供诊断信息":"No diagnostic message provided")})]}),o.jsx("button",{type:"button",className:"ghost",title:g?"仅在此浏览器隐藏 1 小时":"Hide in this browser for 1 hour","aria-label":g?"仅在此浏览器隐藏 1 小时":"Hide in this browser for 1 hour",onClick:()=>p(ti(Y)),children:o.jsx(r0,{size:14,"aria-hidden":"true"})})]},`${ti(Y)}:${Se}`))]})]},L.key)),X.length?null:o.jsx("p",{className:"empty-inline",children:K?g?"当前诊断已在此浏览器临时隐藏,并未解决。":"Current diagnostics are temporarily hidden in this browser, not resolved.":g?"当前未报告诊断问题。":"No diagnostic issues currently reported."})]}),K?o.jsx("button",{type:"button",className:"ghost text-link-button",onClick:U,children:g?`本机临时隐藏 ${K} 条 · 全部恢复`:`${K} hidden locally · restore all`}):null]}),o.jsxs("aside",{className:"overview-side-stack",children:[o.jsxs("article",{className:"panel overview-control-panel",children:[o.jsx("div",{className:"panel-heading",children:o.jsx("h2",{children:g?"控制面":"Control plane"})}),o.jsxs("dl",{className:"overview-control-status",children:[o.jsxs("div",{children:[o.jsx("dt",{children:g?"调度器":"Scheduler"}),o.jsxs("dd",{children:[o.jsx(Bn,{value:C.nomad?.available===void 0?"unknown":C.nomad.available?"ready":"failed",label:C.nomad?.available===void 0?g?"未检查":"Not checked":C.nomad.available?g?"可连接":"Reachable":g?"无法连接":"Unreachable"}),C.nomad?.leader?o.jsx("small",{children:C.nomad.leader}):null]})]}),o.jsxs("div",{children:[o.jsx("dt",{children:"DNS"}),o.jsxs("dd",{children:[o.jsx(Bn,{value:C.dns?.ready===void 0?"unknown":C.dns.ready?"ready":"pending",label:C.dns?.ready===void 0?g?"未检查":"Not checked":C.dns.ready?g?"配置就绪":"Configured":g?"配置不完整":"Configuration incomplete"}),C.dns?.zone?o.jsx("small",{children:C.dns.zone}):null]})]})]}),o.jsx("p",{className:"panel-footnote",children:g?"DNS 状态仅检查凭据和区域配置,尚未验证解析与公网可达性。":"DNS status checks credentials and zone configuration only; resolution and public reachability are unverified."})]}),o.jsxs("article",{className:"panel overview-node-panel",children:[o.jsx("div",{className:"panel-heading",children:o.jsxs("div",{children:[o.jsx("h2",{children:g?"节点容量":"Node capacity"}),o.jsx("p",{children:g?"按 CPU、内存、磁盘的最高使用率排序":"Sorted by highest CPU, memory, or disk usage"})]})}),o.jsx("div",{className:"table-wrap",children:o.jsxs("table",{className:"overview-capacity-table",children:[o.jsx("thead",{children:o.jsxs("tr",{children:[o.jsx("th",{children:Ue(c,"nodes")}),o.jsx("th",{children:"CPU"}),o.jsx("th",{children:g?"内存":"Memory"}),o.jsx("th",{children:g?"磁盘":"Disk"})]})}),o.jsxs("tbody",{children:[M.map((L,Y)=>o.jsxs("tr",{children:[o.jsxs("td",{children:[o.jsx("button",{type:"button",className:"ghost text-link-button",onClick:()=>T(L),children:L.displayName||L.name||"—"}),o.jsx(Bn,{label:gm(c,L.state),value:L.state})]}),o.jsx("td",{children:Ms(L.metrics?.cpuPercent??L.metrics?.loadPercent)}),o.jsx("td",{children:Ms(L.metrics?.memoryUsedPercent)}),o.jsx("td",{children:Ms(L.metrics?.diskUsedPercent)})]},L.name||Y)),M.length?null:o.jsx("tr",{children:o.jsx("td",{colSpan:4,children:g?"暂无节点数据":"No node data"})})]})]})}),o.jsxs("button",{type:"button",className:"ghost text-link-button",onClick:()=>r("nodes"),children:[g?`查看全部 ${m.nodes.length} 个节点`:`View all ${m.nodes.length} nodes`,o.jsx(Ds,{size:15,"aria-hidden":"true"})]})]}),o.jsxs("article",{className:"panel overview-delivery-panel",children:[o.jsx("div",{className:"panel-heading",children:o.jsx("h2",{children:g?"交付追踪":"Delivery tracking"})}),o.jsx("p",{children:g?"在交付记录中查看近期构建、部署结果与任务详情。":"Review recent builds, deployment results, and task details in delivery history."}),o.jsxs("button",{type:"button",className:"ghost text-link-button",onClick:()=>r("deployments"),children:[g?"查看交付记录":"View delivery history",o.jsx(Ds,{size:15,"aria-hidden":"true"})]})]})]})]})]})}function li({lang:c="zh"}){const f=c==="zh"?"页面加载中…":"Loading page…";return o.jsxs("section",{className:"page-loading","aria-busy":"true","aria-live":"polite",children:[o.jsxs("div",{className:"page-loading-toolbar",children:[o.jsxs("div",{className:"page-loading-copy",children:[o.jsx("span",{className:"skeleton skeleton-line skeleton-eyebrow"}),o.jsx("span",{className:"skeleton skeleton-line skeleton-title"}),o.jsx("span",{className:"skeleton skeleton-line skeleton-desc"})]}),o.jsxs("div",{className:"page-loading-metrics","aria-hidden":"true",children:[o.jsx("span",{className:"skeleton skeleton-metric"}),o.jsx("span",{className:"skeleton skeleton-metric"}),o.jsx("span",{className:"skeleton skeleton-metric"}),o.jsx("span",{className:"skeleton skeleton-metric"})]})]}),o.jsxs("div",{className:"page-loading-panel skeleton","aria-hidden":"true",children:[o.jsx("span",{className:"skeleton skeleton-line skeleton-panel-title"}),o.jsx("span",{className:"skeleton skeleton-line"}),o.jsx("span",{className:"skeleton skeleton-line"}),o.jsx("span",{className:"skeleton skeleton-line skeleton-wide"}),o.jsx("span",{className:"skeleton skeleton-line"}),o.jsx("span",{className:"skeleton skeleton-line skeleton-medium"})]}),o.jsx("p",{className:"page-loading-label",children:f})]})}const Em=()=>Rt(()=>import("./chunk-ApplicationsPage-DpbmSx9Z.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10])).then(c=>({default:c.ApplicationsPage})),_m=()=>Rt(()=>import("./chunk-BuilderPage-CrAU82Fn.js"),__vite__mapDeps([11,12,13,14,15,5,16,17,18])).then(c=>({default:c.BuilderPage})),Tm=()=>Rt(()=>import("./chunk-DeploymentsPage-D4D-to5f.js"),__vite__mapDeps([19,14,5,2,17,20,21])).then(c=>({default:c.DeploymentsPage})),Am=()=>Rt(()=>import("./chunk-DeployPage-Cpk498cY.js"),__vite__mapDeps([22,5,15,14,12,13,16,17,18,8,3,23])).then(c=>({default:c.DeployPage})),zm=()=>Rt(()=>import("./chunk-CredentialsPage-C9fuPvrh.js"),__vite__mapDeps([24,13,8,3,17,25,26])).then(c=>({default:c.CredentialsPage})),S0=q.lazy(Em),b0=q.lazy(_m),E0=q.lazy(Tm),im=q.lazy(Am),_0=q.lazy(zm),T0=q.lazy(()=>Rt(()=>import("./chunk-NodesPage-BnzFt_vE.js"),__vite__mapDeps([27,13,15,8,3,1,28])).then(c=>({default:c.NodesPage}))),A0=q.lazy(()=>Rt(()=>import("./chunk-LaeAdminPage-aDUJgu9e.js"),[]).then(c=>({default:c.LaeAdminPage}))),z0=q.lazy(()=>Rt(()=>import("./chunk-NotFound-DgV028Zx.js"),[]).then(c=>({default:c.NotFound}))),x0=q.lazy(()=>Rt(()=>import("./chunk-ObservabilityPage-D0__0yVh.js"),__vite__mapDeps([29,6,7,30])).then(c=>({default:c.ObservabilityPage}))),O0=q.lazy(()=>Rt(()=>import("./chunk-StoragePage-Blm-MOqQ.js"),__vite__mapDeps([31,28,8,3,32,25,33])).then(c=>({default:c.StoragePage}))),N0=q.lazy(()=>Rt(()=>import("./chunk-RegistryPage-B8cSlp6i.js"),__vite__mapDeps([34,2,28,8,3,25,32,20,4,26])).then(c=>({default:c.RegistryPage})));function D0(c){const f=c==="deployments"?Tm:c==="credentials"?zm:c==="applications"?Em:c==="builder"?_m:c==="deploy"?Am:null;f&&f()}function j0(c){const{page:f,lang:m,token:r,theme:T,payload:g,vm:C}=c;let O;if(c.updateContext)O=o.jsx(im,{lang:m,token:r,payload:g,vm:C,updateContext:c.updateContext,updateContextNode:c.updateContextNode,deployTemplateLanding:!1,onRefresh:c.onRefresh,onCloseUpdate:c.onCloseUpdate,onTemplateLandingChange:c.onTemplateLandingChange});else switch(f){case"overview":O=o.jsx(p0,{lang:m,payload:g,vm:C,onNavigate:c.onNavigate,onSelectNode:c.onSelectNode});break;case"applications":O=o.jsx(S0,{lang:m,token:r,payload:g,onRefresh:c.onRefresh,onCreateApplication:c.onCreateApplication,onUpdateApplication:c.onUpdateApplication,onNavigateToDeployments:c.onNavigateToDeployments,onServiceTerminal:c.onServiceTerminal});break;case"deploy":O=o.jsx(im,{lang:m,token:r,payload:g,vm:C,updateContext:null,updateContextNode:null,deployTemplateLanding:c.deployTemplateLanding,onRefresh:c.onRefresh,onCloseUpdate:c.onCloseUpdate,onTemplateLandingChange:c.onTemplateLandingChange});break;case"builder":O=o.jsx(b0,{lang:m,token:r,payload:g,vm:C,onRefresh:c.onRefresh,onNavigate:c.onNavigate});break;case"deployments":O=o.jsx(E0,{lang:m,token:r});break;case"nodes":O=o.jsx(T0,{lang:m,vm:C,theme:T,token:r,controlVersion:g.cluster?.version||"",onSelectNode:c.onSelectNode,onTerminal:c.onTerminal,onRefresh:c.onRefresh});break;case"lae":O=o.jsx(A0,{lang:m,token:r});break;case"observability":O=o.jsx(x0,{lang:m,token:r,vm:C});break;case"storage":O=o.jsx(O0,{lang:m,vm:C,token:r});break;case"registry":O=o.jsx(N0,{lang:m,token:r});break;case"credentials":O=o.jsx(_0,{lang:m,token:r,vm:C});break;default:O=o.jsx(z0,{lang:m,onHome:()=>c.onNavigate("overview")})}return o.jsx(q.Suspense,{fallback:o.jsx(li,{lang:m}),children:o.jsx("div",{className:"page-route",children:O},c.updateContext?"update":f)})}function M0(c,f){const m=c==="zh",r=f.issueCounts.critical+f.issueCounts.warning;return[{key:"workspace",label:m?"工作空间":"Workspace",items:[{id:"overview",icon:Yv,label:m?"总览":"Overview",value:r||null,detail:m?"运行概况与待处理事项":"Operations and attention queue"},{id:"applications",icon:Mv,label:m?"应用":"Applications",detail:m?"服务、实例、终端与生命周期":"Services, instances, terminal and lifecycle"},{id:"deployments",icon:t0,label:m?"交付":"Delivery",detail:m?"构建、部署与任务记录":"Builds, deployments and tasks"},{id:"observability",icon:Nv,label:m?"可观测性":"Observability",detail:m?"指标、日志与告警":"Metrics, logs and alerts"},{id:"nodes",icon:a0,label:m?"基础设施":"Infrastructure",detail:m?"节点、存储、镜像与网络":"Nodes, storage, images and networking"}]},{key:"platform",label:m?"平台管理":"Platform",items:[{id:"lae",icon:qv,label:"LAE",detail:m?"用户、租户与应用平台":"Users, tenants and application platform"},{id:"credentials",icon:c0,label:m?"设置":"Settings",detail:m?"凭据与集群管理":"Credentials and cluster administration"}]}]}const Bs={overview:"/",applications:"/apps",deploy:"/create",builder:"/builds",deployments:"/deployments",lae:"/lae",nodes:"/fleet",observability:"/observe",storage:"/storage",registry:"/registry",credentials:"/settings/secrets"};function C0(c){return c==="/"?"overview":c.startsWith("/terminal/node/")?"nodes":c.startsWith("/terminal/service/")||c.startsWith("/services/")||c==="/apps"||c.startsWith("/apps/")?"applications":c==="/create"||c.startsWith("/create/")?"deploy":c==="/builds"||c.startsWith("/builds/")?"builder":c==="/deployments"||c.startsWith("/deployments/")?"deployments":c==="/lae"||c.startsWith("/lae/")?"lae":c==="/fleet"||c.startsWith("/fleet/")?"nodes":c==="/observe"||c.startsWith("/observe/")?"observability":c==="/storage"||c.startsWith("/storage/")?"storage":c==="/registry"||c.startsWith("/registry/")?"registry":c==="/settings"||c.startsWith("/settings/")?"credentials":"notfound"}const Ga="/dashboard";function cm(c){return c===Ga||c===Ga+"/"?"/":c.startsWith(Ga+"/")?c.slice(Ga.length)||"/":c||"/"}function ai(c){const f=c.startsWith("/")?c:`/${c}`;return f==="/"?`${Ga}/`:`${Ga}${f}`}const xm=q.createContext(null);function R0({children:c}){const[f,m]=q.useState(()=>({path:cm(window.location.pathname),search:window.location.search}));q.useEffect(()=>{const g=()=>m({path:cm(window.location.pathname),search:window.location.search});return window.addEventListener("popstate",g),()=>window.removeEventListener("popstate",g)},[]);const r=q.useCallback((g,C)=>{const O=g.indexOf("?"),M=O===-1?g:g.slice(0,O),p=O===-1?"":g.slice(O+1),U=M.startsWith("/")?M:`/${M}`,x=p?`?${p}`:"",R=ai(U)+x;C?.replace?window.history.replaceState({},"",R):window.history.pushState({},"",R),m({path:U,search:x})},[]),T=q.useMemo(()=>({...f,navigate:r}),[f,r]);return o.jsx(xm.Provider,{value:T,children:c})}function Ys(){const c=q.useContext(xm);if(!c)throw new Error("useRouter must be used within a RouterProvider");return c}function dg(){const{search:c}=Ys();return q.useMemo(()=>new URLSearchParams(c),[c])}function U0({lang:c,vm:f,activeNavPage:m,sidebarCollapsed:r,onNavigate:T,onPrefetch:g,onToggle:C}){const O=M0(c,f),M=["builder","deploy"].includes(m)?"deployments":["storage","registry"].includes(m)?"nodes":m,p=r?c==="zh"?"展开侧栏":"Expand sidebar":c==="zh"?"收起侧栏":"Collapse sidebar";return o.jsxs("aside",{className:"sidebar",children:[o.jsxs("div",{className:"sidebar-brand",children:[o.jsx("div",{className:"brand-mark","aria-hidden":"true",children:o.jsx("img",{src:pm,alt:""})}),o.jsxs("div",{className:"sidebar-title",children:[o.jsx("span",{children:"Luma"}),o.jsx("strong",{children:Ue(c,"title")})]}),o.jsx("button",{type:"button",className:"sidebar-toggle",title:p,"aria-label":p,"aria-expanded":!r,onClick:C,children:r?o.jsx($v,{size:16,"aria-hidden":"true"}):o.jsx(Kv,{size:16,"aria-hidden":"true"})})]}),o.jsx("nav",{"aria-label":"Dashboard",children:O.map(U=>o.jsxs("div",{className:"nav-group",children:[U.label?o.jsx("p",{className:"nav-section",children:U.label}):null,U.items.map(x=>{const R=x.icon,X=typeof x.value=="number",K=M===x.id,ie=r?`${x.label} - ${x.detail}`:x.detail;return o.jsxs("a",{className:K?"nav-item active":"nav-item",href:ai(Bs[x.id]),title:ie,"aria-current":K?"page":void 0,onClick:L=>{L.metaKey||L.ctrlKey||L.shiftKey||L.altKey||L.button!==0||(L.preventDefault(),T(x.id))},onPointerEnter:()=>g?.(x.id),onFocus:()=>g?.(x.id),children:[o.jsx(R,{size:16,"aria-hidden":"true"}),o.jsxs("span",{children:[o.jsx("b",{children:x.label}),o.jsx("small",{children:x.detail})]}),X?o.jsx("strong",{children:x.value}):null]},x.id)})]},U.key))}),o.jsxs("div",{className:"sidebar-status","aria-label":c==="zh"?"当前运行状态":"Current runtime status",children:[o.jsx("span",{children:c==="zh"?"就绪节点":"Ready nodes"}),o.jsxs("strong",{children:[f.activeNodes,o.jsxs("small",{children:[" / ",f.nodes.length]})]}),o.jsx("small",{children:c==="zh"?`${Math.max(0,f.services.length-f.healthyServices)} 个服务异常`:`${Math.max(0,f.services.length-f.healthyServices)} services need attention`})]})]})}function H0(c){try{return decodeURIComponent(c)}catch{return""}}function sm(c){return`/fleet/nodes/${encodeURIComponent(c)}`}function ni(c){return`/services/${encodeURIComponent(c)}`}function B0(c){return`/apps/${encodeURIComponent(c)}/edit`}function om(c,f,m){return`/terminal/${c}/${encodeURIComponent(f)}${m?`?stack=${encodeURIComponent(m)}`:""}`}function q0(c){const f=[["node",/^\/fleet\/nodes\/([^/]+)\/?$/],["service",/^\/services\/([^/]+)\/?$/],["node-terminal",/^\/terminal\/node\/([^/]+)\/?$/],["service-terminal",/^\/terminal\/service\/([^/]+)\/?$/],["update",/^\/apps\/([^/]+)\/edit\/?$/]];for(const[m,r]of f){const T=r.exec(c);if(T)return{kind:m,name:H0(T[1])}}return null}const L0=["a[href]","button:not([disabled])","input:not([disabled])","select:not([disabled])","textarea:not([disabled])",'[tabindex]:not([tabindex="-1"])'].join(", ");function fm(c){return Array.from(c.querySelectorAll(L0)).filter(f=>f.hidden||f.getAttribute("aria-hidden")==="true"?!1:f.offsetParent!==null||f.getBoundingClientRect().height>0)}function Y0(c){const f=q.useRef(null),m=q.useRef(c);return m.current=c,q.useEffect(()=>{const r=f.current,T=document.activeElement;let g=!1;if(r){const O=fm(r);O.length?O[0].focus():(r.tabIndex=-1,r.focus()),g=r.contains(document.activeElement)}const C=O=>{if(O.key==="Escape"){O.stopPropagation(),m.current();return}if(O.key!=="Tab"||!r)return;const M=fm(r);if(!M.length){O.preventDefault();return}const p=M[0],U=M[M.length-1],x=document.activeElement;r.contains(x)?O.shiftKey&&x===p?(O.preventDefault(),U.focus()):!O.shiftKey&&x===U&&(O.preventDefault(),p.focus()):(O.preventDefault(),p.focus())};return window.addEventListener("keydown",C),()=>{window.removeEventListener("keydown",C),!(!g||!T?.focus||!(M=>!M||M===document.body||!M.isConnected||!!r?.contains(M))(document.activeElement))&&(T.focus(),requestAnimationFrame(()=>{const M=document.activeElement;(!M||M===document.body)&&T.focus()}))}},[]),f}function G0({className:c,onClose:f,children:m}){const r=Y0(f);return o.jsx("div",{className:c,onClick:f,children:m(r)})}function rm(c,f,m){if(c==="node"&&typeof m=="number"){if(["cpu","memory"].includes(f))return Number.isFinite(m)?`${m}%`:"-";if(["memoryTotal","memoryCapacity"].includes(f)){if(!Number.isFinite(m)||m<0)return"-";if(m===0)return"0 B";const r=["B","KiB","MiB","GiB","TiB","PiB"],T=Math.min(Math.max(0,Math.floor(Math.log(m)/Math.log(1024))),r.length-1);return`${Number((m/1024**T).toFixed(2))} ${r[T]}`}}return String(m??"-")}function k0({lang:c,detail:f,onClose:m,inline:r=!1,showBack:T=!0}){return f?r?o.jsxs("section",{className:"detail-page panel","aria-labelledby":"detail-page-title",children:[o.jsxs("header",{className:"panel-heading",children:[o.jsxs("div",{children:[o.jsx("p",{className:"eyebrow",children:Ue(c,"details")}),o.jsx("h1",{id:"detail-page-title",children:f.title})]}),T&&o.jsx("button",{type:"button",className:"ghost",onClick:m,children:c==="zh"?"返回列表":"Back to list"})]}),o.jsx("dl",{className:"detail-properties",children:Object.entries(f.items).map(([g,C])=>o.jsxs("div",{children:[o.jsx("dt",{children:lm(c,g)}),o.jsx("dd",{children:rm(f.kind,g,C)})]},g))})]}):o.jsx(G0,{className:"detail-backdrop",onClose:m,children:g=>o.jsxs("aside",{className:"detail-drawer",ref:g,role:"dialog","aria-modal":"true","aria-labelledby":"detail-drawer-title",onClick:C=>C.stopPropagation(),children:[o.jsxs("header",{children:[o.jsxs("div",{children:[o.jsx("p",{className:"eyebrow",children:Ue(c,"details")}),o.jsx("h2",{id:"detail-drawer-title",children:f.title})]}),o.jsx("button",{type:"button",className:"icon-button",onClick:m,children:Ue(c,"close")})]}),o.jsx("dl",{children:Object.entries(f.items).map(([C,O])=>o.jsxs("div",{children:[o.jsx("dt",{children:lm(c,C)}),o.jsx("dd",{children:rm(f.kind,C,O)})]},C))})]})}):null}function w0(c){return{kind:"node",title:c.name||"-",items:{displayName:c.displayName,region:c.region,role:c.role,state:c.state,availability:c.availability,leader:c.leader,agent:[c.agentStatus,c.agentOs,c.terminalStatus?`terminal: ${c.terminalStatus}`:""].filter(Boolean).join(" / "),cpu:c.metrics?.cpuPercent??c.metrics?.loadPercent,load1:c.metrics?.load1,memory:c.metrics?.memoryUsedPercent,memoryTotal:c.metrics?.memoryTotalBytes,cpuCapacity:c.capacity?.cpus,memoryCapacity:c.capacity?.memoryBytes}}}function X0(c){return{kind:"service",title:c.stack?`${c.stack}/${c.name||"-"}`:c.name||"-",items:{fullName:c.fullName,region:c.region,exposure:c.exposure,image:c.image,replicas:`${c.running??0}/${c.desired??0}`,pending:c.pending,failed:c.failed,health:c.health,nodes:(c.nodes||[]).join(", "),limits:[c.resources?.limits?.cpus?`${c.resources.limits.cpus} CPU`:"",c.resources?.limits?.memoryBytes?`${c.resources.limits.memoryBytes} bytes`:""].filter(Boolean).join(" / "),reservations:[c.resources?.reservations?.cpus?`${c.resources.reservations.cpus} CPU`:"",c.resources?.reservations?.memoryBytes?`${c.resources.reservations.memoryBytes} bytes`:""].filter(Boolean).join(" / "),tasks:(c.tasks||[]).map(f=>`${f.node||"-"}:${f.state||"-"}`).join(", "),storage:(c.storage||[]).map(f=>`${f.name||"-"}:${f.kind||"unmanaged"}`).join(", "),diagnostics:(c.diagnostics||[]).join("; ")}}}function Q0({lang:c,node:f,service:m,services:r,applicationNames:T,onTerminal:g}){const{navigate:C}=Ys(),O=c==="zh",M=f?"/fleet":m?.stack&&T.includes(m.stack)?`/apps/${encodeURIComponent(m.stack)}/services`:"/apps",p=f?w0(f):m?X0(m):null,U=new Set(f?[f.name,f.hostname,f.displayName].filter(R=>!!R):[]),x=f?r.filter(R=>[R.node,...R.nodes||[],...(R.tasks||[]).map(X=>X.node),...R.resources?.actual?.nodes||[]].some(X=>!!X&&U.has(X))):[];return o.jsxs("div",{className:"detail-page infrastructure-workspace resource-workspace",children:[o.jsxs("div",{className:"page-actions",children:[o.jsx("a",{className:"page-back",href:ai(M),onClick:R=>{!R.metaKey&&!R.ctrlKey&&(R.preventDefault(),C(M))},children:O?"← 返回列表":"← Back to list"}),o.jsx("button",{type:"button",disabled:f?!f.terminalConnected:!m,onClick:g,children:O?"进入 Shell":"Open shell"})]}),o.jsx(k0,{lang:c,detail:p,onClose:()=>C(M),inline:!0,showBack:!1}),f?o.jsxs("section",{className:"detail-section",children:[o.jsx("h2",{children:O?"运行服务":"Workloads"}),o.jsx("div",{className:"table-wrap",children:o.jsxs("table",{children:[o.jsx("thead",{children:o.jsxs("tr",{children:[o.jsx("th",{children:O?"应用 / 服务":"Application / service"}),o.jsx("th",{children:O?"状态":"Status"}),o.jsx("th",{children:O?"副本":"Replicas"})]})}),o.jsxs("tbody",{children:[x.map(R=>o.jsxs("tr",{children:[o.jsx("td",{children:o.jsxs("a",{href:ai(ni(R.fullName||R.name||"")),onClick:X=>{!X.metaKey&&!X.ctrlKey&&(X.preventDefault(),C(ni(R.fullName||R.name||"")))},children:[R.stack?`${R.stack} / `:"",R.name]})}),o.jsx("td",{children:o.jsx(Bn,{value:R.status||R.health||"unknown",label:gm(c,R.status||R.health||"unknown")})}),o.jsxs("td",{children:[R.running??0,"/",R.desired??0]})]},R.fullName||R.name)),x.length?null:o.jsx("tr",{children:o.jsx("td",{colSpan:3,children:O?"当前没有关联的服务":"No associated services"})})]})]})})]}):null]})}function Om(c,f=!1){const m={Authorization:`Bearer ${c}`};return f&&(m["Content-Type"]="application/json"),m}async function Gs(c){const f=await c.text();let m={};try{m=f?JSON.parse(f):{}}catch{throw new Error(`Invalid response format (HTTP ${c.status}): ${f.slice(0,100)}`)}if(!c.ok)throw new Error(String(m.error||`HTTP ${c.status}`));return m}async function V0(c,f,m){const r=await fetch(c,{headers:Om(f),signal:m});return Gs(r)}async function mg(c,f,m,r){const T=await fetch(c,{method:"POST",headers:Om(f,!0),body:m===void 0?void 0:JSON.stringify(m),signal:r});return Gs(T)}async function hg(c,f,m={}){const r=m.doneStatus??"done",T=m.failStatus??"fail";if(!c.ok){const x=await Gs(c);throw new Error(String(x.error||`HTTP ${c.status}`))}if(!c.body)throw new Error(m.unavailableMessage??"stream is unavailable");const g=c.body.getReader(),C=new TextDecoder;let O="",M=null,p=!1;const U=x=>{if(!x.trim())return;const R=JSON.parse(x);if(f(R),R.status===T)throw p=!0,new Error(String(R.message||"stream failed"));R.status===r&&(p=!0,M=R.result)};try{for(;;){const{done:x,value:R}=await g.read();if(x)break;O+=C.decode(R,{stream:!0});const X=O.split(`
|
|
21
|
-
`);O=X.pop()||"";for(const K of X)U(K)}O+=C.decode(),U(O)}finally{g.cancel().catch(()=>{})}if(!p)throw new Error("stream ended before completion");return M}async function Z0({token:c,name:f}){return V0(`/v1/deployments/${encodeURIComponent(f)}/config`,c)}function K0(c){return(c.state||"").toLowerCase()==="ready"&&(c.availability||"").toLowerCase()!=="drain"}function J0(c){return c.reduce((f,m)=>m.severity==="critical"?{...f,critical:f.critical+1}:m.severity==="warning"?{...f,warning:f.warning+1}:{...f,info:f.info+1},{critical:0,warning:0,info:0})}function $0(c,f,m,r,T){if(!f&&!r)return 0;const g=f?c/f:1,C=r?m/r:1,O=Math.min(.45,T.critical*.18+T.warning*.07);return Math.max(0,Math.round((g*.38+C*.62-O)*100))}function W0(c){const f=c?.nodes||[],m=c?.services||[],r=c?.issues||[],T=c?.trafficPaths||[],g=c?.storage?.volumes||[],C=c?.storage?.storageClasses||[],O=c?.storage?.warnings||[],M=f.filter(K0).length,p=m.filter(vm).length,U=J0(r);return{clusterId:c?.cluster?.id||"-",nodes:f,regions:c?.regions||[],services:m,applications:pv(m),trafficPaths:T,issues:r,storageVolumes:g,storageClasses:C,storageWarnings:O,activeNodes:M,healthyServices:p,issueCounts:U,metricNodes:f.filter(x=>x.metrics?.cpuPercent||x.metrics?.memoryUsedPercent).length,builderNodes:(c?.build?.nodes||[]).length,templateCount:Os.length,deployServiceTemplates:Os.filter(x=>x.mode==="service").length,deployComposeTemplates:Os.filter(x=>x.mode==="compose").length,healthScore:$0(M,f.length,p,m.length,U)}}const Cs="luma.dashboard.deployToken",F0=3e4,P0=typeof window<"u"&&(window.location.hostname==="localhost"||window.location.hostname==="127.0.0.1");function I0(){const[c,f]=q.useState(()=>localStorage.getItem(Cs)||(P0?"dev-token":"")),[m,r]=q.useState(null),[T,g]=q.useState([]),[C,O]=q.useState(c?"refreshing":"notConnected"),[M,p]=q.useState(null),U=q.useRef(!1),x=q.useRef(0),R=q.useCallback(ie=>{const L=ie.trim();f(L),L?localStorage.setItem(Cs,L):localStorage.removeItem(Cs)},[]),X=q.useCallback(()=>{R(""),r(null),g([]),O("notConnected"),p(null)},[R]),K=q.useCallback(async()=>{if(!c){O("notConnected");return}const ie=++x.current;O("refreshing");try{const L=await fetch("/v1/dashboard",{headers:{Authorization:`Bearer ${c}`}}),Y=await L.text();let Se;try{Se=JSON.parse(Y)}catch{throw new Error(`Invalid response format (HTTP ${L.status}): ${Y.slice(0,100)}`)}if(!L.ok)throw new Error(Se.error||`HTTP ${L.status}`);if(ie!==x.current)return;r(Se),g(Se.errors||[]),p(new Date),O("updated")}catch(L){if(ie!==x.current)return;const Y=String(L instanceof Error?L.message:L);g([Y]),/unauthorized|bearer token/i.test(Y)?(U.current=!0,O("tokenRejected"),r(null)):O("unavailable")}},[c]);return q.useEffect(()=>{if(!c)return;U.current=!1;let ie=!1,L;const Y=async()=>{await K(),!ie&&!U.current&&(L=window.setTimeout(Y,F0))};return Y(),()=>{ie=!0,window.clearTimeout(L)}},[K,c]),{token:c,payload:m,errors:T,syncStatus:C,lastUpdated:M,setToken:R,signOut:X,loadDashboard:K}}const qs="luma.dashboard.theme",Nm="(prefers-color-scheme: light)";function dm(){const c=localStorage.getItem(qs);return c==="light"||c==="dark"?c:"system"}function Rs(c){return c==="system"?window.matchMedia(Nm).matches?"light":"dark":c}function eg(c){document.documentElement.dataset.theme=c;const f=document.querySelector('meta[name="theme-color"]');f&&f.setAttribute("content",c==="light"?"#f5f3f3":"#1a1818")}function tg(){const[c,f]=q.useState(dm),[m,r]=q.useState(()=>Rs(dm()));return q.useEffect(()=>{eg(m)},[m]),q.useEffect(()=>{if(c!=="system")return;const g=window.matchMedia(Nm),C=()=>r(Rs("system"));return g.addEventListener("change",C),()=>g.removeEventListener("change",C)},[c]),{mode:c,theme:m,setMode:g=>{f(g),g==="system"?localStorage.removeItem(qs):localStorage.setItem(qs,g),r(Rs(g))}}}const lg=q.lazy(()=>Rt(()=>import("./chunk-TerminalDrawer-
|
|
20
|
+
`);return{name:c.stack,composeFileName:"docker-compose.yml",region:c.regions[0]||"cn",services:f,volumes:r,dockerComposeYaml:T,skipDns:!1,skipOrchestrator:!1}}const Hs={zh:{title:"控制台",subtitle:"查看控制面状态、服务器、服务和访问路径。",navOverview:"总览",navNodes:"节点",navApplications:"应用",navServices:"服务",navTopology:"架构",navTraffic:"流量",navStorage:"存储",navDeploy:"部署",navFuture:"扩展",refresh:"刷新",signOut:"退出",readonly:"管理访问",loginTitle:"粘贴管理 Token",loginCopy:"Token 只保存在当前浏览器,并只发送给当前 Luma Control 域名。",openStatus:"打开面板",cluster:"集群",controlPlane:"控制面",nodesEyebrow:"服务器",nodes:"节点",servicesEyebrow:"工作负载",services:"服务",applications:"应用管理",application:"应用",createApplication:"创建应用",createOrUpdateApplication:"创建 / 更新应用",updateApp:"更新",viewConfig:"查看配置",loadingConfig:"读取中...",deploymentConfig:"部署配置",lumaManifest:"Luma 配置",composeFile:"Compose 文件",source:"来源",lastUpdated:"更新时间",noDeploymentConfig:"没有保存的部署配置",restart:"重启",restarting:"重启中...",shell:"终端",versions:"版本",version:"版本",loadingHistory:"读取版本...",currentVersion:"当前版本",noVersionHistory:"暂无版本历史",rollback:"回滚",rollingBack:"回滚中...",rollbackToVersion:"回滚到此版本",submitted:"提交时间",stableVersion:"稳定",actions:"操作",status:"状态",accessAddress:"访问地址",internalOnly:"内部访问",noApplications:"暂无业务应用",nodeTopology:"节点架构",pathsEyebrow:"拓扑",trafficPaths:"流量路径",storageEyebrow:"状态资源",storage:"存储",volume:"卷",kind:"类型",storageClass:"存储类",node:"节点",diagnostics:"诊断",inferred:"自动生成",name:"名称",region:"区域",role:"角色",state:"状态",availability:"可用性",leader:"Leader",service:"服务",exposure:"入口",port:"端口",network:"网络",image:"镜像",replicas:"副本",health:"健康",notConnected:"未连接",refreshing:"刷新中...",unavailable:"不可用",tokenRejected:"Token 无效",updated:"已更新",ready:"就绪",missing:"缺失",configured:"已配置",dockerReachable:"Docker socket 可访问",dockerUnavailable:"Docker socket 不可用",noPublicDomain:"无公开域名",running:"运行",pending:"等待",failed:"失败",yes:"是",details:"详情",close:"关闭",reserved:"预留"},en:{title:"Control Console",subtitle:"Inspect control readiness, servers, services, and traffic paths.",navOverview:"Overview",navNodes:"Nodes",navApplications:"Apps",navServices:"Services",navTopology:"Topology",navTraffic:"Traffic",navStorage:"Storage",navDeploy:"Deploy",navFuture:"Extensions",refresh:"Refresh",signOut:"Sign out",readonly:"Management access",loginTitle:"Paste a management token",loginCopy:"The token stays in this browser and is only sent to this Luma Control origin.",openStatus:"Open status",cluster:"Cluster",controlPlane:"Control plane",nodesEyebrow:"Servers",nodes:"Nodes",servicesEyebrow:"Workloads",services:"Services",applications:"Application Management",application:"Application",createApplication:"Create App",createOrUpdateApplication:"Create / Update App",updateApp:"Update",viewConfig:"View Config",loadingConfig:"Loading...",deploymentConfig:"Deployment Config",lumaManifest:"Luma Config",composeFile:"Compose File",source:"Source",lastUpdated:"Updated",noDeploymentConfig:"No saved deployment config",restart:"Restart",restarting:"Restarting...",shell:"Shell",versions:"Versions",version:"Version",loadingHistory:"Loading versions...",currentVersion:"Current version",noVersionHistory:"No version history",rollback:"Rollback",rollingBack:"Rolling back...",rollbackToVersion:"Rollback here",submitted:"Submitted",stableVersion:"Stable",actions:"Actions",status:"Status",accessAddress:"Access Address",internalOnly:"Internal only",noApplications:"No business applications",nodeTopology:"Node Architecture",pathsEyebrow:"Topology",trafficPaths:"Traffic Paths",storageEyebrow:"State",storage:"Storage",volume:"Volume",kind:"Kind",storageClass:"Storage Class",node:"Node",diagnostics:"Diagnostics",inferred:"Generated",name:"Name",region:"Region",role:"Role",state:"State",availability:"Availability",leader:"Leader",service:"Service",exposure:"Exposure",port:"Port",network:"Network",image:"Image",replicas:"Replicas",health:"Health",notConnected:"Not connected",refreshing:"Refreshing...",unavailable:"Unavailable",tokenRejected:"Token rejected",updated:"Updated",ready:"ready",missing:"missing",configured:"configured",dockerReachable:"Docker socket reachable",dockerUnavailable:"Docker socket unavailable",noPublicDomain:"No public domain",running:"run",pending:"pending",failed:"failed",yes:"yes",details:"Details",close:"Close",reserved:"Reserved"}};function Ue(c,f){return Hs[c][f]||Hs.zh[f]||f}function gm(c,f){return f?c==="zh"&&{ready:"就绪",healthy:"健康",running:"运行",pending:"等待",failed:"失败",degraded:"降级",missing:"缺失",unknown:"未知"}[f]||f:"-"}const Sv={displayName:{zh:"名称",en:"Name"},agent:{zh:"Agent",en:"Agent"},cpu:{zh:"CPU",en:"CPU"},load1:{zh:"负载 (1m)",en:"Load (1m)"},memory:{zh:"内存",en:"Memory"},memoryTotal:{zh:"内存总量",en:"Total memory"},cpuCapacity:{zh:"CPU 容量",en:"CPU capacity"},memoryCapacity:{zh:"内存容量",en:"Memory capacity"},fullName:{zh:"完整名称",en:"Full name"},nodes:{zh:"节点",en:"Nodes"},limits:{zh:"资源上限",en:"Limits"},reservations:{zh:"资源预留",en:"Reservations"},tasks:{zh:"任务",en:"Tasks"}};function lm(c,f){const m=Sv[f];return m?m[c]:f in Hs.zh?Ue(c,f):f}const pm="/dashboard/asset-luma-logo-mark-CH2lRgZQ.png";function bv({lang:c,onSubmit:f}){const[m,r]=q.useState(""),T=q.useId(),g=c==="zh",C=O=>{O.preventDefault(),m.trim()&&f(m)};return o.jsxs("section",{className:"login-panel",children:[o.jsxs("div",{className:"login-panel-brand",children:[o.jsx("div",{className:"brand-mark","aria-hidden":"true",children:o.jsx("img",{src:pm,alt:"",width:24,height:24})}),o.jsxs("div",{children:[o.jsx("p",{className:"eyebrow",children:Ue(c,"readonly")}),o.jsx("h1",{children:Ue(c,"loginTitle")})]})]}),o.jsx("p",{children:Ue(c,"loginCopy")}),o.jsxs("form",{onSubmit:C,children:[o.jsxs("label",{htmlFor:T,children:[o.jsx("span",{children:g?"管理 Token":"Management token"}),o.jsx("input",{id:T,autoComplete:"current-password",name:"management-token",onChange:O=>r(O.target.value),placeholder:"luma_…",spellCheck:!1,type:"password",value:m})]}),o.jsx("button",{type:"submit",className:"primary",children:Ue(c,"openStatus")})]})]})}const Sm=(...c)=>c.filter((f,m,r)=>!!f&&f.trim()!==""&&r.indexOf(f)===m).join(" ").trim();const Ev=c=>c.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase();const _v=c=>c.replace(/^([A-Z])|[\s-_]+(\w)/g,(f,m,r)=>r?r.toUpperCase():m.toLowerCase());const am=c=>{const f=_v(c);return f.charAt(0).toUpperCase()+f.slice(1)};var Ns={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};const Tv=c=>{for(const f in c)if(f.startsWith("aria-")||f==="role"||f==="title")return!0;return!1},Av=q.createContext({}),zv=()=>q.useContext(Av),xv=q.forwardRef(({color:c,size:f,strokeWidth:m,absoluteStrokeWidth:r,className:T="",children:g,iconNode:C,...O},M)=>{const{size:p=24,strokeWidth:U=2,absoluteStrokeWidth:x=!1,color:R="currentColor",className:X=""}=zv()??{},K=r??x?Number(m??U)*24/Number(f??p):m??U;return q.createElement("svg",{ref:M,...Ns,width:f??p??Ns.width,height:f??p??Ns.height,stroke:c??R,strokeWidth:K,className:Sm("lucide",X,T),...!g&&!Tv(O)&&{"aria-hidden":"true"},...O},[...C.map(([ie,L])=>q.createElement(ie,L)),...Array.isArray(g)?g:[g]])});const Ge=(c,f)=>{const m=q.forwardRef(({className:r,...T},g)=>q.createElement(xv,{ref:g,iconNode:f,className:Sm(`lucide-${Ev(am(c))}`,`lucide-${c}`,r),...T}));return m.displayName=am(c),m};const Ov=[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]],Nv=Ge("activity",Ov);const Dv=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]],Ds=Ge("arrow-right",Dv);const jv=[["path",{d:"M2.97 12.92A2 2 0 0 0 2 14.63v3.24a2 2 0 0 0 .97 1.71l3 1.8a2 2 0 0 0 2.06 0L12 19v-5.5l-5-3-4.03 2.42Z",key:"lc1i9w"}],["path",{d:"m7 16.5-4.74-2.85",key:"1o9zyk"}],["path",{d:"m7 16.5 5-3",key:"va8pkn"}],["path",{d:"M7 16.5v5.17",key:"jnp8gn"}],["path",{d:"M12 13.5V19l3.97 2.38a2 2 0 0 0 2.06 0l3-1.8a2 2 0 0 0 .97-1.71v-3.24a2 2 0 0 0-.97-1.71L17 10.5l-5 3Z",key:"8zsnat"}],["path",{d:"m17 16.5-5-3",key:"8arw3v"}],["path",{d:"m17 16.5 4.74-2.85",key:"8rfmw"}],["path",{d:"M17 16.5v5.17",key:"k6z78m"}],["path",{d:"M7.97 4.42A2 2 0 0 0 7 6.13v4.37l5 3 5-3V6.13a2 2 0 0 0-.97-1.71l-3-1.8a2 2 0 0 0-2.06 0l-3 1.8Z",key:"1xygjf"}],["path",{d:"M12 8 7.26 5.15",key:"1vbdud"}],["path",{d:"m12 8 4.74-2.85",key:"3rx089"}],["path",{d:"M12 13.5V8",key:"1io7kd"}]],Mv=Ge("boxes",jv);const Cv=[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]],Rv=Ge("check",Cv);const Uv=[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]],Hv=Ge("chevron-down",Uv);const Bv=[["path",{d:"m10.852 19.772-.383.924",key:"r7sl7d"}],["path",{d:"m13.148 14.228.383-.923",key:"1d5zpm"}],["path",{d:"M13.148 19.772a3 3 0 1 0-2.296-5.544l-.383-.923",key:"1ydik7"}],["path",{d:"m13.53 20.696-.382-.924a3 3 0 1 1-2.296-5.544",key:"1m1vsf"}],["path",{d:"m14.772 15.852.923-.383",key:"660p6e"}],["path",{d:"m14.772 18.148.923.383",key:"hrcpis"}],["path",{d:"M4.2 15.1a7 7 0 1 1 9.93-9.858A7 7 0 0 1 15.71 8h1.79a4.5 4.5 0 0 1 2.5 8.2",key:"j2q98n"}],["path",{d:"m9.228 15.852-.923-.383",key:"1p9ong"}],["path",{d:"m9.228 18.148-.923.383",key:"6558rz"}]],qv=Ge("cloud-cog",Bv);const Lv=[["rect",{width:"7",height:"9",x:"3",y:"3",rx:"1",key:"10lvy0"}],["rect",{width:"7",height:"5",x:"14",y:"3",rx:"1",key:"16une8"}],["rect",{width:"7",height:"9",x:"14",y:"12",rx:"1",key:"1hutg5"}],["rect",{width:"7",height:"5",x:"3",y:"16",rx:"1",key:"ldoo1y"}]],Yv=Ge("layout-dashboard",Lv);const Gv=[["path",{d:"m16 17 5-5-5-5",key:"1bji2h"}],["path",{d:"M21 12H9",key:"dn1m92"}],["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}]],kv=Ge("log-out",Gv);const wv=[["rect",{width:"20",height:"14",x:"2",y:"3",rx:"2",key:"48i651"}],["line",{x1:"8",x2:"16",y1:"21",y2:"21",key:"1svkeh"}],["line",{x1:"12",x2:"12",y1:"17",y2:"21",key:"vw1qmm"}]],Xv=Ge("monitor",wv);const Qv=[["path",{d:"M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401",key:"kfwtm"}]],Vv=Ge("moon",Qv);const Zv=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M9 3v18",key:"fh3hqa"}],["path",{d:"m16 15-3-3 3-3",key:"14y99z"}]],Kv=Ge("panel-left-close",Zv);const Jv=[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M9 3v18",key:"fh3hqa"}],["path",{d:"m14 9 3 3-3 3",key:"8010ee"}]],$v=Ge("panel-left-open",Jv);const Wv=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]],Fv=Ge("plus",Wv);const Pv=[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]],Iv=Ge("refresh-cw",Pv);const e0=[["path",{d:"M15 12h-5",key:"r7krc0"}],["path",{d:"M15 8h-5",key:"1khuty"}],["path",{d:"M19 17V5a2 2 0 0 0-2-2H4",key:"zz82l3"}],["path",{d:"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3",key:"1ph1d7"}]],t0=Ge("scroll-text",e0);const l0=[["path",{d:"m10.852 14.772-.383.923",key:"11vil6"}],["path",{d:"M13.148 14.772a3 3 0 1 0-2.296-5.544l-.383-.923",key:"1v3clb"}],["path",{d:"m13.148 9.228.383-.923",key:"t2zzyc"}],["path",{d:"m13.53 15.696-.382-.924a3 3 0 1 1-2.296-5.544",key:"1bxfiv"}],["path",{d:"m14.772 10.852.923-.383",key:"k9m8cz"}],["path",{d:"m14.772 13.148.923.383",key:"1xvhww"}],["path",{d:"M4.5 10H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h16a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-.5",key:"tn8das"}],["path",{d:"M4.5 14H4a2 2 0 0 0-2 2v4a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-4a2 2 0 0 0-2-2h-.5",key:"1g2pve"}],["path",{d:"M6 18h.01",key:"uhywen"}],["path",{d:"M6 6h.01",key:"1utrut"}],["path",{d:"m9.228 10.852-.923-.383",key:"1wtb30"}],["path",{d:"m9.228 13.148-.923.383",key:"1a830x"}]],a0=Ge("server-cog",l0);const n0=[["path",{d:"M14 17H5",key:"gfn3mx"}],["path",{d:"M19 7h-9",key:"6i9tg"}],["circle",{cx:"17",cy:"17",r:"3",key:"18b49y"}],["circle",{cx:"7",cy:"7",r:"3",key:"dfmy0x"}]],u0=Ge("settings-2",n0);const i0=[["path",{d:"M9.671 4.136a2.34 2.34 0 0 1 4.659 0 2.34 2.34 0 0 0 3.319 1.915 2.34 2.34 0 0 1 2.33 4.033 2.34 2.34 0 0 0 0 3.831 2.34 2.34 0 0 1-2.33 4.033 2.34 2.34 0 0 0-3.319 1.915 2.34 2.34 0 0 1-4.659 0 2.34 2.34 0 0 0-3.32-1.915 2.34 2.34 0 0 1-2.33-4.033 2.34 2.34 0 0 0 0-3.831A2.34 2.34 0 0 1 6.35 6.051a2.34 2.34 0 0 0 3.319-1.915",key:"1i5ecw"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]],c0=Ge("settings",i0);const s0=[["circle",{cx:"12",cy:"12",r:"4",key:"4exip2"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"m4.93 4.93 1.41 1.41",key:"149t6j"}],["path",{d:"m17.66 17.66 1.41 1.41",key:"ptbguv"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"m6.34 17.66-1.41 1.41",key:"1m8zz5"}],["path",{d:"m19.07 4.93-1.41 1.41",key:"1shlcs"}]],o0=Ge("sun",s0);const f0=[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]],r0=Ge("x",f0);function d0({clusterId:c,lang:f,lastUpdated:m,syncStatus:r,themeMode:T,onLangChange:g,onThemeModeChange:C,onRefresh:O,onSignOut:M}){const p=new Intl.DateTimeFormat(f==="zh"?"zh-CN":"en-US",{hour:"2-digit",minute:"2-digit",second:"2-digit"}),U=r==="updated"&&m?`${Ue(f,"updated")} ${p.format(m)}`:Ue(f,r),x=[{mode:"system",icon:Xv,label:f==="zh"?"跟随系统":"Follow system"},{mode:"light",icon:o0,label:f==="zh"?"日间模式":"Light mode"},{mode:"dark",icon:Vv,label:f==="zh"?"夜间模式":"Dark mode"}];return o.jsxs("header",{className:"topbar",children:[o.jsxs("div",{className:"cluster-chip",children:[o.jsx("span",{children:Ue(f,"cluster")}),o.jsx("strong",{translate:"no",children:c})]}),o.jsxs("div",{className:"top-actions",children:[o.jsx("span",{className:`sync-state ${r}`,title:U,role:"status",children:U}),o.jsxs("details",{className:"topbar-preferences",onKeyDown:R=>{R.key==="Escape"&&(R.currentTarget.open=!1,R.currentTarget.querySelector("summary")?.focus())},children:[o.jsxs("summary",{"aria-label":f==="zh"?"界面偏好设置":"Display preferences",title:f==="zh"?"界面偏好设置":"Display preferences",children:[o.jsx(u0,{size:16,"aria-hidden":"true"}),o.jsx("span",{children:f==="zh"?"偏好":"Display"})]}),o.jsxs("div",{className:"topbar-preferences-panel",children:[o.jsx("span",{className:"preference-label",children:f==="zh"?"外观":"Appearance"}),o.jsx("div",{className:"lang-switch theme-switch",role:"group","aria-label":f==="zh"?"主题":"Theme",children:x.map(({mode:R,icon:X,label:K})=>o.jsx("button",{className:T===R?"active":"",type:"button",title:K,"aria-label":K,"aria-pressed":T===R,onClick:()=>C(R),children:o.jsx(X,{size:16,"aria-hidden":"true"})},R))}),o.jsx("span",{className:"preference-label",children:f==="zh"?"语言":"Language"}),o.jsxs("div",{className:"lang-switch",role:"group","aria-label":f==="zh"?"语言切换":"Language switch",children:[o.jsx("button",{className:f==="zh"?"active":"",onClick:()=>g("zh"),type:"button","aria-pressed":f==="zh","aria-label":f==="zh"?"切换到中文":"Switch to Chinese",children:"中文"}),o.jsx("button",{className:f==="en"?"active":"",onClick:()=>g("en"),type:"button","aria-pressed":f==="en","aria-label":f==="zh"?"切换到英文":"Switch to English",children:"EN"})]})]})]}),o.jsxs("button",{type:"button",onClick:O,"aria-label":Ue(f,"refresh"),title:Ue(f,"refresh"),children:[o.jsx(Iv,{size:16,"aria-hidden":"true"}),o.jsx("span",{className:"topbar-action-label",children:Ue(f,"refresh")})]}),o.jsxs("button",{className:"ghost",type:"button",onClick:M,"aria-label":Ue(f,"signOut"),title:Ue(f,"signOut"),children:[o.jsx(kv,{size:16,"aria-hidden":"true"}),o.jsx("span",{className:"topbar-action-label",children:Ue(f,"signOut")})]})]})]})}function sg({value:c,options:f,onChange:m,placeholder:r="-",disabled:T=!1,ariaLabel:g,className:C=""}){const O=q.useId(),M=q.useRef(null),[p,U]=q.useState(!1),x=f.find(Y=>Y.value===c),R=q.useMemo(()=>f.filter(Y=>!Y.disabled),[f]),X=Math.max(0,R.findIndex(Y=>Y.value===c));q.useEffect(()=>{if(!p)return;const Y=Se=>{M.current?.contains(Se.target)||U(!1)};return window.addEventListener("pointerdown",Y),()=>window.removeEventListener("pointerdown",Y)},[p]);const K=Y=>{Y.disabled||(m(Y.value),U(!1))},ie=Y=>{if(!R.length)return;const Se=R[(X+Y+R.length)%R.length];m(Se.value)},L=Y=>{if(Y.key==="Escape"){p&&Y.stopPropagation(),U(!1);return}if(Y.key==="Enter"||Y.key===" "){Y.preventDefault(),U(Se=>!Se);return}if(Y.key==="ArrowDown"){Y.preventDefault(),p||U(!0),ie(1);return}Y.key==="ArrowUp"&&(Y.preventDefault(),p||U(!0),ie(-1))};return o.jsxs("div",{ref:M,className:`luma-select ${p?"open":""} ${T?"disabled":""} ${C}`.trim(),children:[o.jsxs("button",{type:"button",className:"luma-select-trigger","aria-label":g,"aria-haspopup":"listbox","aria-expanded":p,"aria-controls":`${O}-listbox`,disabled:T,onClick:()=>U(Y=>!Y),onKeyDown:L,children:[o.jsx("span",{className:x?"luma-select-value":"luma-select-value placeholder",children:x?.label||r}),o.jsx(Hv,{size:15,"aria-hidden":"true"})]}),p?o.jsx("div",{id:`${O}-listbox`,className:"luma-select-menu",role:"listbox","aria-label":g,children:f.length?f.map(Y=>{const Se=Y.value===c;return o.jsxs("button",{type:"button",role:"option","aria-selected":Se,className:Se?"luma-select-option active":"luma-select-option",disabled:Y.disabled,onClick:()=>K(Y),children:[o.jsx("span",{children:Y.label}),Se?o.jsx(Rv,{size:14,"aria-hidden":"true"}):null]},Y.value||"__empty")}):o.jsx("div",{className:"luma-select-empty",children:r})}):null]})}function og({title:c,meta:f}){return o.jsxs("span",{className:"primary-cell",children:[o.jsx("strong",{children:c||"-"}),f&&f!==c?o.jsx("small",{children:f}):null]})}function m0({value:c}){return o.jsx("span",{className:"badge",children:c})}function fg({children:c}){return o.jsx("span",{className:"badge-group",children:c})}function rg({value:c}){return o.jsx("code",{children:c})}function Bn({label:c,value:f}){const m=(f||"").toLowerCase(),r=["ready","running","healthy","active","succeeded","stable","available"].includes(m)?"good":["failed","missing","bad","down","error","failed_partial","critical"].includes(m)?"danger":(["pending","degraded","drain","draining","warning","starting","deploying","unknown",""].includes(m),"warn");return o.jsx("span",{className:`badge ${r}`,children:c})}const bm=3600*1e3;function ti(c){return JSON.stringify([c.severity||"info",c.kind||"",c.target||"",c.message||""])}function h0(c,f){return`luma.dashboard.dismissedIssues.v2:${encodeURIComponent(f)}:${encodeURIComponent(c||"unknown")}`}function js(c,f,m){return!c||typeof c!="object"||Array.isArray(c)?{}:Object.fromEntries(Object.entries(c).filter(([r,T])=>f.has(r)&&typeof T=="number"&&Number.isFinite(T)&&T>m&&T<=m+bm))}function nm(c){try{return JSON.parse(localStorage.getItem(c)||"{}")}catch{return{}}}function y0(c,f){const m=h0(c,window.location.origin),r=JSON.stringify(f.map(ti)),T=q.useMemo(()=>new Set(JSON.parse(r)),[r]),[g,C]=q.useState(Date.now),[O,M]=q.useState(()=>({storageKey:m,items:js(nm(m),T,Date.now())})),p=q.useMemo(()=>js(O.storageKey===m?O.items:nm(m),T,g),[O,m,T,g]);q.useEffect(()=>{M(X=>X.storageKey===m&&JSON.stringify(X.items)===JSON.stringify(p)?X:{storageKey:m,items:p});try{localStorage.setItem(m,JSON.stringify(p))}catch{}},[m,p]),q.useEffect(()=>{const X=window.setInterval(()=>C(Date.now()),15e3);return()=>window.clearInterval(X)},[]);const U=q.useCallback(X=>{const K=Date.now();C(K),M({storageKey:m,items:{...js(p,T,K),[X]:K+bm}})},[m,p,T]),x=q.useCallback(()=>M({storageKey:m,items:{}}),[m]),R=q.useCallback(X=>!!p[X],[p]);return{dismiss:U,clear:x,isDismissed:R,dismissedCount:Object.keys(p).length}}const ei=c=>c==="critical"?0:c==="warning"?1:2;function v0(c,f,m){const r=new Map;for(const T of c){const g=T.kind==="agent"||T.kind?.startsWith("node-")?m.find(U=>U.name===T.target):void 0,C=T.kind==="deployment"||T.kind?.startsWith("service-")?f.filter(U=>U.stack===T.target||U.services.some(x=>(x.fullName||x.name)===T.target)):[],O=C.length===1?C[0]:void 0,M=g?`node:${g.name}`:O?`app:${O.stack}`:`issue:${T.kind||""}:${T.target||""}`,p=r.get(M)||{key:M,target:g?.name||O?.stack||T.target||T.kind||"—",app:O,node:g,severity:T.severity||"info",issues:[]};p.issues.push(T),ei(T.severity)<ei(p.severity)&&(p.severity=T.severity||"info"),r.set(M,p)}return[...r.values()].sort((T,g)=>ei(T.severity)-ei(g.severity)||T.target.localeCompare(g.target))}function um(c){return Math.max(c.metrics?.cpuPercent??c.metrics?.loadPercent??0,c.metrics?.memoryUsedPercent??0,c.metrics?.diskUsedPercent??0)}function g0({meta:c}){return o.jsxs("section",{className:"page-toolbar","aria-labelledby":"page-title",children:[o.jsxs("div",{className:"page-toolbar-copy",children:[o.jsx("p",{className:"eyebrow",children:c.eyebrow}),o.jsx("h1",{id:"page-title",children:c.title}),c.description?o.jsx("p",{children:c.description}):null]}),o.jsxs("div",{className:"page-toolbar-side",children:[c.score?o.jsxs("div",{className:"ops-hero-score","aria-label":c.score.label,children:[o.jsx("div",{className:"score-ring",style:{"--score":`${c.score.value}%`},children:o.jsx("strong",{children:c.score.value})}),o.jsxs("span",{children:[c.score.label,o.jsx("b",{children:c.score.status})]})]}):null,c.metrics.length?o.jsx("div",{className:"page-toolbar-metrics","aria-label":c.title,children:c.metrics.map(f=>o.jsxs("span",{children:[o.jsx("strong",{children:f.value}),o.jsx("small",{children:f.label})]},f.label))}):null,c.action?o.jsx("div",{className:"page-toolbar-action",children:c.action}):null]})]})}function Ms(c){return typeof c=="number"&&Number.isFinite(c)?`${Math.round(c)}%`:"—"}function p0({lang:c,payload:f,vm:m,onNavigate:r,onSelectNode:T}){const g=c==="zh",C=f.readiness||{},O=m.applications.filter(L=>!["healthy","running"].includes(L.status)),M=m.nodes.slice().sort((L,Y)=>um(Y)-um(L)).slice(0,5),{dismiss:p,clear:U,isDismissed:x}=y0(f.cluster?.id||"",m.issues),R=q.useMemo(()=>m.issues.filter(L=>!x(ti(L))),[m.issues,x]),X=q.useMemo(()=>v0(R,m.applications,m.nodes),[R,m.applications,m.nodes]),K=m.issues.length-R.length,ie=L=>L==="critical"?g?"严重":"Critical":L==="warning"?g?"警告":"Warning":g?"信息":"Info";return o.jsxs(o.Fragment,{children:[o.jsx(g0,{meta:{eyebrow:Ue(c,"controlPlane"),title:g?"集群总览":"Cluster overview",description:g?"从需要关注的对象开始,进入应用或节点继续处理。":"Start with objects that need attention, then continue in the application or node workspace.",metrics:[],action:o.jsxs("button",{type:"button",className:"primary page-toolbar-cta",onClick:()=>r("deploy"),children:[o.jsx(Fv,{size:16,"aria-hidden":"true"}),Ue(c,"createApplication")]})}}),o.jsxs("section",{className:"overview-summary-grid","aria-label":g?"集群运行摘要":"Cluster summary",children:[o.jsxs("button",{className:"overview-summary-item",onClick:()=>r("applications"),type:"button",children:[o.jsx("span",{children:g?"异常应用":"Affected applications"}),o.jsxs("strong",{children:[O.length,o.jsxs("small",{children:[" / ",m.applications.length]})]}),o.jsx("small",{children:g?"依据副本与任务运行状态":"Based on replica and task state"})]}),o.jsxs("button",{className:"overview-summary-item",onClick:()=>r("nodes"),type:"button",children:[o.jsx("span",{children:g?"就绪节点":"Ready nodes"}),o.jsxs("strong",{children:[m.activeNodes,o.jsxs("small",{children:[" / ",m.nodes.length]})]}),o.jsx("small",{children:g?"已排除排空中的节点":"Excludes draining nodes"})]}),o.jsxs("button",{className:"overview-summary-item",onClick:()=>r("observability"),type:"button",children:[o.jsx("span",{children:g?"当前诊断":"Current diagnostics"}),o.jsx("strong",{children:m.issues.length}),o.jsx("small",{children:g?`${m.issueCounts.critical} 严重 · ${m.issueCounts.warning} 警告`:`${m.issueCounts.critical} critical · ${m.issueCounts.warning} warning`})]})]}),o.jsxs("section",{className:"overview-priority-layout","aria-label":g?"运维关注":"Operations attention",children:[o.jsxs("article",{className:"panel overview-attention-panel",children:[o.jsxs("div",{className:"panel-heading",children:[o.jsxs("div",{children:[o.jsx("h2",{children:g?"需要关注":"Needs attention"}),o.jsx("p",{children:g?"按对象归组,展开查看原始诊断;归组不代表相同根因。":"Grouped by object. Expand for original diagnostics; grouping does not imply a shared cause."})]}),o.jsx(m0,{value:g?`${X.length} 个对象`:`${X.length} objects`})]}),o.jsxs("div",{className:"overview-issue-groups",children:[X.map(L=>o.jsxs("section",{className:`overview-issue-group ${L.severity}`,children:[o.jsxs("div",{className:"overview-issue-heading",children:[o.jsxs("div",{children:[o.jsx(Bn,{value:L.severity==="critical"?"failed":L.severity==="warning"?"pending":"unknown",label:ie(L.severity)}),o.jsx("strong",{children:L.target}),o.jsx("small",{children:L.app?g?"应用":"Application":L.node?g?"节点":"Node":g?"诊断对象":"Diagnostic target"})]}),L.app||L.node?o.jsxs("button",{type:"button",className:"ghost text-link-button",onClick:()=>L.node?T(L.node):r("applications",{selectApp:L.app.stack}),children:[g?"查看详情":"View details",o.jsx(Ds,{size:15,"aria-hidden":"true"})]}):null]}),o.jsxs("details",{className:"overview-issue-evidence",children:[o.jsx("summary",{children:g?`${L.issues.length} 条诊断 · 查看原始信息`:`${L.issues.length} diagnostics · view evidence`}),L.issues.map((Y,Se)=>o.jsxs("div",{className:"overview-evidence-row",children:[o.jsxs("div",{children:[o.jsxs("small",{children:[ie(Y.severity||"info")," · ",Y.kind||"—"," · ",Y.target||"—"]}),o.jsx("p",{children:Y.message||(g?"未提供诊断信息":"No diagnostic message provided")})]}),o.jsx("button",{type:"button",className:"ghost",title:g?"仅在此浏览器隐藏 1 小时":"Hide in this browser for 1 hour","aria-label":g?"仅在此浏览器隐藏 1 小时":"Hide in this browser for 1 hour",onClick:()=>p(ti(Y)),children:o.jsx(r0,{size:14,"aria-hidden":"true"})})]},`${ti(Y)}:${Se}`))]})]},L.key)),X.length?null:o.jsx("p",{className:"empty-inline",children:K?g?"当前诊断已在此浏览器临时隐藏,并未解决。":"Current diagnostics are temporarily hidden in this browser, not resolved.":g?"当前未报告诊断问题。":"No diagnostic issues currently reported."})]}),K?o.jsx("button",{type:"button",className:"ghost text-link-button",onClick:U,children:g?`本机临时隐藏 ${K} 条 · 全部恢复`:`${K} hidden locally · restore all`}):null]}),o.jsxs("aside",{className:"overview-side-stack",children:[o.jsxs("article",{className:"panel overview-control-panel",children:[o.jsx("div",{className:"panel-heading",children:o.jsx("h2",{children:g?"控制面":"Control plane"})}),o.jsxs("dl",{className:"overview-control-status",children:[o.jsxs("div",{children:[o.jsx("dt",{children:g?"调度器":"Scheduler"}),o.jsxs("dd",{children:[o.jsx(Bn,{value:C.nomad?.available===void 0?"unknown":C.nomad.available?"ready":"failed",label:C.nomad?.available===void 0?g?"未检查":"Not checked":C.nomad.available?g?"可连接":"Reachable":g?"无法连接":"Unreachable"}),C.nomad?.leader?o.jsx("small",{children:C.nomad.leader}):null]})]}),o.jsxs("div",{children:[o.jsx("dt",{children:"DNS"}),o.jsxs("dd",{children:[o.jsx(Bn,{value:C.dns?.ready===void 0?"unknown":C.dns.ready?"ready":"pending",label:C.dns?.ready===void 0?g?"未检查":"Not checked":C.dns.ready?g?"配置就绪":"Configured":g?"配置不完整":"Configuration incomplete"}),C.dns?.zone?o.jsx("small",{children:C.dns.zone}):null]})]})]}),o.jsx("p",{className:"panel-footnote",children:g?"DNS 状态仅检查凭据和区域配置,尚未验证解析与公网可达性。":"DNS status checks credentials and zone configuration only; resolution and public reachability are unverified."})]}),o.jsxs("article",{className:"panel overview-node-panel",children:[o.jsx("div",{className:"panel-heading",children:o.jsxs("div",{children:[o.jsx("h2",{children:g?"节点容量":"Node capacity"}),o.jsx("p",{children:g?"按 CPU、内存、磁盘的最高使用率排序":"Sorted by highest CPU, memory, or disk usage"})]})}),o.jsx("div",{className:"table-wrap",children:o.jsxs("table",{className:"overview-capacity-table",children:[o.jsx("thead",{children:o.jsxs("tr",{children:[o.jsx("th",{children:Ue(c,"nodes")}),o.jsx("th",{children:"CPU"}),o.jsx("th",{children:g?"内存":"Memory"}),o.jsx("th",{children:g?"磁盘":"Disk"})]})}),o.jsxs("tbody",{children:[M.map((L,Y)=>o.jsxs("tr",{children:[o.jsxs("td",{children:[o.jsx("button",{type:"button",className:"ghost text-link-button",onClick:()=>T(L),children:L.displayName||L.name||"—"}),o.jsx(Bn,{label:gm(c,L.state),value:L.state})]}),o.jsx("td",{children:Ms(L.metrics?.cpuPercent??L.metrics?.loadPercent)}),o.jsx("td",{children:Ms(L.metrics?.memoryUsedPercent)}),o.jsx("td",{children:Ms(L.metrics?.diskUsedPercent)})]},L.name||Y)),M.length?null:o.jsx("tr",{children:o.jsx("td",{colSpan:4,children:g?"暂无节点数据":"No node data"})})]})]})}),o.jsxs("button",{type:"button",className:"ghost text-link-button",onClick:()=>r("nodes"),children:[g?`查看全部 ${m.nodes.length} 个节点`:`View all ${m.nodes.length} nodes`,o.jsx(Ds,{size:15,"aria-hidden":"true"})]})]}),o.jsxs("article",{className:"panel overview-delivery-panel",children:[o.jsx("div",{className:"panel-heading",children:o.jsx("h2",{children:g?"交付追踪":"Delivery tracking"})}),o.jsx("p",{children:g?"在交付记录中查看近期构建、部署结果与任务详情。":"Review recent builds, deployment results, and task details in delivery history."}),o.jsxs("button",{type:"button",className:"ghost text-link-button",onClick:()=>r("deployments"),children:[g?"查看交付记录":"View delivery history",o.jsx(Ds,{size:15,"aria-hidden":"true"})]})]})]})]})]})}function li({lang:c="zh"}){const f=c==="zh"?"页面加载中…":"Loading page…";return o.jsxs("section",{className:"page-loading","aria-busy":"true","aria-live":"polite",children:[o.jsxs("div",{className:"page-loading-toolbar",children:[o.jsxs("div",{className:"page-loading-copy",children:[o.jsx("span",{className:"skeleton skeleton-line skeleton-eyebrow"}),o.jsx("span",{className:"skeleton skeleton-line skeleton-title"}),o.jsx("span",{className:"skeleton skeleton-line skeleton-desc"})]}),o.jsxs("div",{className:"page-loading-metrics","aria-hidden":"true",children:[o.jsx("span",{className:"skeleton skeleton-metric"}),o.jsx("span",{className:"skeleton skeleton-metric"}),o.jsx("span",{className:"skeleton skeleton-metric"}),o.jsx("span",{className:"skeleton skeleton-metric"})]})]}),o.jsxs("div",{className:"page-loading-panel skeleton","aria-hidden":"true",children:[o.jsx("span",{className:"skeleton skeleton-line skeleton-panel-title"}),o.jsx("span",{className:"skeleton skeleton-line"}),o.jsx("span",{className:"skeleton skeleton-line"}),o.jsx("span",{className:"skeleton skeleton-line skeleton-wide"}),o.jsx("span",{className:"skeleton skeleton-line"}),o.jsx("span",{className:"skeleton skeleton-line skeleton-medium"})]}),o.jsx("p",{className:"page-loading-label",children:f})]})}const Em=()=>Rt(()=>import("./chunk-ApplicationsPage-DL3D9bFn.js"),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10])).then(c=>({default:c.ApplicationsPage})),_m=()=>Rt(()=>import("./chunk-BuilderPage-D8T1oNZV.js"),__vite__mapDeps([11,12,13,14,15,5,16,17,18])).then(c=>({default:c.BuilderPage})),Tm=()=>Rt(()=>import("./chunk-DeploymentsPage-C8Lq9XQw.js"),__vite__mapDeps([19,14,5,2,17,20,21])).then(c=>({default:c.DeploymentsPage})),Am=()=>Rt(()=>import("./chunk-DeployPage-ClA9gyt_.js"),__vite__mapDeps([22,5,15,14,12,13,16,17,18,8,3,23])).then(c=>({default:c.DeployPage})),zm=()=>Rt(()=>import("./chunk-CredentialsPage-DfCu036X.js"),__vite__mapDeps([24,13,8,3,17,25,26])).then(c=>({default:c.CredentialsPage})),S0=q.lazy(Em),b0=q.lazy(_m),E0=q.lazy(Tm),im=q.lazy(Am),_0=q.lazy(zm),T0=q.lazy(()=>Rt(()=>import("./chunk-NodesPage-MFEu-5Cp.js"),__vite__mapDeps([27,13,15,8,3,1,28])).then(c=>({default:c.NodesPage}))),A0=q.lazy(()=>Rt(()=>import("./chunk-LaeAdminPage-DG6fSASY.js"),[]).then(c=>({default:c.LaeAdminPage}))),z0=q.lazy(()=>Rt(()=>import("./chunk-NotFound-D8hgaRg7.js"),[]).then(c=>({default:c.NotFound}))),x0=q.lazy(()=>Rt(()=>import("./chunk-ObservabilityPage-DPUBTYSQ.js"),__vite__mapDeps([29,6,7,30])).then(c=>({default:c.ObservabilityPage}))),O0=q.lazy(()=>Rt(()=>import("./chunk-StoragePage-BwC_uFf2.js"),__vite__mapDeps([31,28,8,3,32,25,33])).then(c=>({default:c.StoragePage}))),N0=q.lazy(()=>Rt(()=>import("./chunk-RegistryPage-CDJn195G.js"),__vite__mapDeps([34,2,28,8,3,25,32,20,4,26])).then(c=>({default:c.RegistryPage})));function D0(c){const f=c==="deployments"?Tm:c==="credentials"?zm:c==="applications"?Em:c==="builder"?_m:c==="deploy"?Am:null;f&&f()}function j0(c){const{page:f,lang:m,token:r,theme:T,payload:g,vm:C}=c;let O;if(c.updateContext)O=o.jsx(im,{lang:m,token:r,payload:g,vm:C,updateContext:c.updateContext,updateContextNode:c.updateContextNode,deployTemplateLanding:!1,onRefresh:c.onRefresh,onCloseUpdate:c.onCloseUpdate,onTemplateLandingChange:c.onTemplateLandingChange});else switch(f){case"overview":O=o.jsx(p0,{lang:m,payload:g,vm:C,onNavigate:c.onNavigate,onSelectNode:c.onSelectNode});break;case"applications":O=o.jsx(S0,{lang:m,token:r,payload:g,onRefresh:c.onRefresh,onCreateApplication:c.onCreateApplication,onUpdateApplication:c.onUpdateApplication,onNavigateToDeployments:c.onNavigateToDeployments,onServiceTerminal:c.onServiceTerminal});break;case"deploy":O=o.jsx(im,{lang:m,token:r,payload:g,vm:C,updateContext:null,updateContextNode:null,deployTemplateLanding:c.deployTemplateLanding,onRefresh:c.onRefresh,onCloseUpdate:c.onCloseUpdate,onTemplateLandingChange:c.onTemplateLandingChange});break;case"builder":O=o.jsx(b0,{lang:m,token:r,payload:g,vm:C,onRefresh:c.onRefresh,onNavigate:c.onNavigate});break;case"deployments":O=o.jsx(E0,{lang:m,token:r});break;case"nodes":O=o.jsx(T0,{lang:m,vm:C,theme:T,token:r,controlVersion:g.cluster?.version||"",onSelectNode:c.onSelectNode,onTerminal:c.onTerminal,onRefresh:c.onRefresh});break;case"lae":O=o.jsx(A0,{lang:m,token:r});break;case"observability":O=o.jsx(x0,{lang:m,token:r,vm:C});break;case"storage":O=o.jsx(O0,{lang:m,vm:C,token:r});break;case"registry":O=o.jsx(N0,{lang:m,token:r});break;case"credentials":O=o.jsx(_0,{lang:m,token:r,vm:C});break;default:O=o.jsx(z0,{lang:m,onHome:()=>c.onNavigate("overview")})}return o.jsx(q.Suspense,{fallback:o.jsx(li,{lang:m}),children:o.jsx("div",{className:"page-route",children:O},c.updateContext?"update":f)})}function M0(c,f){const m=c==="zh",r=f.issueCounts.critical+f.issueCounts.warning;return[{key:"workspace",label:m?"工作空间":"Workspace",items:[{id:"overview",icon:Yv,label:m?"总览":"Overview",value:r||null,detail:m?"运行概况与待处理事项":"Operations and attention queue"},{id:"applications",icon:Mv,label:m?"应用":"Applications",detail:m?"服务、实例、终端与生命周期":"Services, instances, terminal and lifecycle"},{id:"deployments",icon:t0,label:m?"交付":"Delivery",detail:m?"构建、部署与任务记录":"Builds, deployments and tasks"},{id:"observability",icon:Nv,label:m?"可观测性":"Observability",detail:m?"指标、日志与告警":"Metrics, logs and alerts"},{id:"nodes",icon:a0,label:m?"基础设施":"Infrastructure",detail:m?"节点、存储、镜像与网络":"Nodes, storage, images and networking"}]},{key:"platform",label:m?"平台管理":"Platform",items:[{id:"lae",icon:qv,label:"LAE",detail:m?"用户、租户与应用平台":"Users, tenants and application platform"},{id:"credentials",icon:c0,label:m?"设置":"Settings",detail:m?"凭据与集群管理":"Credentials and cluster administration"}]}]}const Bs={overview:"/",applications:"/apps",deploy:"/create",builder:"/builds",deployments:"/deployments",lae:"/lae",nodes:"/fleet",observability:"/observe",storage:"/storage",registry:"/registry",credentials:"/settings/secrets"};function C0(c){return c==="/"?"overview":c.startsWith("/terminal/node/")?"nodes":c.startsWith("/terminal/service/")||c.startsWith("/services/")||c==="/apps"||c.startsWith("/apps/")?"applications":c==="/create"||c.startsWith("/create/")?"deploy":c==="/builds"||c.startsWith("/builds/")?"builder":c==="/deployments"||c.startsWith("/deployments/")?"deployments":c==="/lae"||c.startsWith("/lae/")?"lae":c==="/fleet"||c.startsWith("/fleet/")?"nodes":c==="/observe"||c.startsWith("/observe/")?"observability":c==="/storage"||c.startsWith("/storage/")?"storage":c==="/registry"||c.startsWith("/registry/")?"registry":c==="/settings"||c.startsWith("/settings/")?"credentials":"notfound"}const Ga="/dashboard";function cm(c){return c===Ga||c===Ga+"/"?"/":c.startsWith(Ga+"/")?c.slice(Ga.length)||"/":c||"/"}function ai(c){const f=c.startsWith("/")?c:`/${c}`;return f==="/"?`${Ga}/`:`${Ga}${f}`}const xm=q.createContext(null);function R0({children:c}){const[f,m]=q.useState(()=>({path:cm(window.location.pathname),search:window.location.search}));q.useEffect(()=>{const g=()=>m({path:cm(window.location.pathname),search:window.location.search});return window.addEventListener("popstate",g),()=>window.removeEventListener("popstate",g)},[]);const r=q.useCallback((g,C)=>{const O=g.indexOf("?"),M=O===-1?g:g.slice(0,O),p=O===-1?"":g.slice(O+1),U=M.startsWith("/")?M:`/${M}`,x=p?`?${p}`:"",R=ai(U)+x;C?.replace?window.history.replaceState({},"",R):window.history.pushState({},"",R),m({path:U,search:x})},[]),T=q.useMemo(()=>({...f,navigate:r}),[f,r]);return o.jsx(xm.Provider,{value:T,children:c})}function Ys(){const c=q.useContext(xm);if(!c)throw new Error("useRouter must be used within a RouterProvider");return c}function dg(){const{search:c}=Ys();return q.useMemo(()=>new URLSearchParams(c),[c])}function U0({lang:c,vm:f,activeNavPage:m,sidebarCollapsed:r,onNavigate:T,onPrefetch:g,onToggle:C}){const O=M0(c,f),M=["builder","deploy"].includes(m)?"deployments":["storage","registry"].includes(m)?"nodes":m,p=r?c==="zh"?"展开侧栏":"Expand sidebar":c==="zh"?"收起侧栏":"Collapse sidebar";return o.jsxs("aside",{className:"sidebar",children:[o.jsxs("div",{className:"sidebar-brand",children:[o.jsx("div",{className:"brand-mark","aria-hidden":"true",children:o.jsx("img",{src:pm,alt:""})}),o.jsxs("div",{className:"sidebar-title",children:[o.jsx("span",{children:"Luma"}),o.jsx("strong",{children:Ue(c,"title")})]}),o.jsx("button",{type:"button",className:"sidebar-toggle",title:p,"aria-label":p,"aria-expanded":!r,onClick:C,children:r?o.jsx($v,{size:16,"aria-hidden":"true"}):o.jsx(Kv,{size:16,"aria-hidden":"true"})})]}),o.jsx("nav",{"aria-label":"Dashboard",children:O.map(U=>o.jsxs("div",{className:"nav-group",children:[U.label?o.jsx("p",{className:"nav-section",children:U.label}):null,U.items.map(x=>{const R=x.icon,X=typeof x.value=="number",K=M===x.id,ie=r?`${x.label} - ${x.detail}`:x.detail;return o.jsxs("a",{className:K?"nav-item active":"nav-item",href:ai(Bs[x.id]),title:ie,"aria-current":K?"page":void 0,onClick:L=>{L.metaKey||L.ctrlKey||L.shiftKey||L.altKey||L.button!==0||(L.preventDefault(),T(x.id))},onPointerEnter:()=>g?.(x.id),onFocus:()=>g?.(x.id),children:[o.jsx(R,{size:16,"aria-hidden":"true"}),o.jsxs("span",{children:[o.jsx("b",{children:x.label}),o.jsx("small",{children:x.detail})]}),X?o.jsx("strong",{children:x.value}):null]},x.id)})]},U.key))}),o.jsxs("div",{className:"sidebar-status","aria-label":c==="zh"?"当前运行状态":"Current runtime status",children:[o.jsx("span",{children:c==="zh"?"就绪节点":"Ready nodes"}),o.jsxs("strong",{children:[f.activeNodes,o.jsxs("small",{children:[" / ",f.nodes.length]})]}),o.jsx("small",{children:c==="zh"?`${Math.max(0,f.services.length-f.healthyServices)} 个服务异常`:`${Math.max(0,f.services.length-f.healthyServices)} services need attention`})]})]})}function H0(c){try{return decodeURIComponent(c)}catch{return""}}function sm(c){return`/fleet/nodes/${encodeURIComponent(c)}`}function ni(c){return`/services/${encodeURIComponent(c)}`}function B0(c){return`/apps/${encodeURIComponent(c)}/edit`}function om(c,f,m){return`/terminal/${c}/${encodeURIComponent(f)}${m?`?stack=${encodeURIComponent(m)}`:""}`}function q0(c){const f=[["node",/^\/fleet\/nodes\/([^/]+)\/?$/],["service",/^\/services\/([^/]+)\/?$/],["node-terminal",/^\/terminal\/node\/([^/]+)\/?$/],["service-terminal",/^\/terminal\/service\/([^/]+)\/?$/],["update",/^\/apps\/([^/]+)\/edit\/?$/]];for(const[m,r]of f){const T=r.exec(c);if(T)return{kind:m,name:H0(T[1])}}return null}const L0=["a[href]","button:not([disabled])","input:not([disabled])","select:not([disabled])","textarea:not([disabled])",'[tabindex]:not([tabindex="-1"])'].join(", ");function fm(c){return Array.from(c.querySelectorAll(L0)).filter(f=>f.hidden||f.getAttribute("aria-hidden")==="true"?!1:f.offsetParent!==null||f.getBoundingClientRect().height>0)}function Y0(c){const f=q.useRef(null),m=q.useRef(c);return m.current=c,q.useEffect(()=>{const r=f.current,T=document.activeElement;let g=!1;if(r){const O=fm(r);O.length?O[0].focus():(r.tabIndex=-1,r.focus()),g=r.contains(document.activeElement)}const C=O=>{if(O.key==="Escape"){O.stopPropagation(),m.current();return}if(O.key!=="Tab"||!r)return;const M=fm(r);if(!M.length){O.preventDefault();return}const p=M[0],U=M[M.length-1],x=document.activeElement;r.contains(x)?O.shiftKey&&x===p?(O.preventDefault(),U.focus()):!O.shiftKey&&x===U&&(O.preventDefault(),p.focus()):(O.preventDefault(),p.focus())};return window.addEventListener("keydown",C),()=>{window.removeEventListener("keydown",C),!(!g||!T?.focus||!(M=>!M||M===document.body||!M.isConnected||!!r?.contains(M))(document.activeElement))&&(T.focus(),requestAnimationFrame(()=>{const M=document.activeElement;(!M||M===document.body)&&T.focus()}))}},[]),f}function G0({className:c,onClose:f,children:m}){const r=Y0(f);return o.jsx("div",{className:c,onClick:f,children:m(r)})}function rm(c,f,m){if(c==="node"&&typeof m=="number"){if(["cpu","memory"].includes(f))return Number.isFinite(m)?`${m}%`:"-";if(["memoryTotal","memoryCapacity"].includes(f)){if(!Number.isFinite(m)||m<0)return"-";if(m===0)return"0 B";const r=["B","KiB","MiB","GiB","TiB","PiB"],T=Math.min(Math.max(0,Math.floor(Math.log(m)/Math.log(1024))),r.length-1);return`${Number((m/1024**T).toFixed(2))} ${r[T]}`}}return String(m??"-")}function k0({lang:c,detail:f,onClose:m,inline:r=!1,showBack:T=!0}){return f?r?o.jsxs("section",{className:"detail-page panel","aria-labelledby":"detail-page-title",children:[o.jsxs("header",{className:"panel-heading",children:[o.jsxs("div",{children:[o.jsx("p",{className:"eyebrow",children:Ue(c,"details")}),o.jsx("h1",{id:"detail-page-title",children:f.title})]}),T&&o.jsx("button",{type:"button",className:"ghost",onClick:m,children:c==="zh"?"返回列表":"Back to list"})]}),o.jsx("dl",{className:"detail-properties",children:Object.entries(f.items).map(([g,C])=>o.jsxs("div",{children:[o.jsx("dt",{children:lm(c,g)}),o.jsx("dd",{children:rm(f.kind,g,C)})]},g))})]}):o.jsx(G0,{className:"detail-backdrop",onClose:m,children:g=>o.jsxs("aside",{className:"detail-drawer",ref:g,role:"dialog","aria-modal":"true","aria-labelledby":"detail-drawer-title",onClick:C=>C.stopPropagation(),children:[o.jsxs("header",{children:[o.jsxs("div",{children:[o.jsx("p",{className:"eyebrow",children:Ue(c,"details")}),o.jsx("h2",{id:"detail-drawer-title",children:f.title})]}),o.jsx("button",{type:"button",className:"icon-button",onClick:m,children:Ue(c,"close")})]}),o.jsx("dl",{children:Object.entries(f.items).map(([C,O])=>o.jsxs("div",{children:[o.jsx("dt",{children:lm(c,C)}),o.jsx("dd",{children:rm(f.kind,C,O)})]},C))})]})}):null}function w0(c){return{kind:"node",title:c.name||"-",items:{displayName:c.displayName,region:c.region,role:c.role,state:c.state,availability:c.availability,leader:c.leader,agent:[c.agentStatus,c.agentOs,c.terminalStatus?`terminal: ${c.terminalStatus}`:""].filter(Boolean).join(" / "),cpu:c.metrics?.cpuPercent??c.metrics?.loadPercent,load1:c.metrics?.load1,memory:c.metrics?.memoryUsedPercent,memoryTotal:c.metrics?.memoryTotalBytes,cpuCapacity:c.capacity?.cpus,memoryCapacity:c.capacity?.memoryBytes}}}function X0(c){return{kind:"service",title:c.stack?`${c.stack}/${c.name||"-"}`:c.name||"-",items:{fullName:c.fullName,region:c.region,exposure:c.exposure,image:c.image,replicas:`${c.running??0}/${c.desired??0}`,pending:c.pending,failed:c.failed,health:c.health,nodes:(c.nodes||[]).join(", "),limits:[c.resources?.limits?.cpus?`${c.resources.limits.cpus} CPU`:"",c.resources?.limits?.memoryBytes?`${c.resources.limits.memoryBytes} bytes`:""].filter(Boolean).join(" / "),reservations:[c.resources?.reservations?.cpus?`${c.resources.reservations.cpus} CPU`:"",c.resources?.reservations?.memoryBytes?`${c.resources.reservations.memoryBytes} bytes`:""].filter(Boolean).join(" / "),tasks:(c.tasks||[]).map(f=>`${f.node||"-"}:${f.state||"-"}`).join(", "),storage:(c.storage||[]).map(f=>`${f.name||"-"}:${f.kind||"unmanaged"}`).join(", "),diagnostics:(c.diagnostics||[]).join("; ")}}}function Q0({lang:c,node:f,service:m,services:r,applicationNames:T,onTerminal:g}){const{navigate:C}=Ys(),O=c==="zh",M=f?"/fleet":m?.stack&&T.includes(m.stack)?`/apps/${encodeURIComponent(m.stack)}/services`:"/apps",p=f?w0(f):m?X0(m):null,U=new Set(f?[f.name,f.hostname,f.displayName].filter(R=>!!R):[]),x=f?r.filter(R=>[R.node,...R.nodes||[],...(R.tasks||[]).map(X=>X.node),...R.resources?.actual?.nodes||[]].some(X=>!!X&&U.has(X))):[];return o.jsxs("div",{className:"detail-page infrastructure-workspace resource-workspace",children:[o.jsxs("div",{className:"page-actions",children:[o.jsx("a",{className:"page-back",href:ai(M),onClick:R=>{!R.metaKey&&!R.ctrlKey&&(R.preventDefault(),C(M))},children:O?"← 返回列表":"← Back to list"}),o.jsx("button",{type:"button",disabled:f?!f.terminalConnected:!m,onClick:g,children:O?"进入 Shell":"Open shell"})]}),o.jsx(k0,{lang:c,detail:p,onClose:()=>C(M),inline:!0,showBack:!1}),f?o.jsxs("section",{className:"detail-section",children:[o.jsx("h2",{children:O?"运行服务":"Workloads"}),o.jsx("div",{className:"table-wrap",children:o.jsxs("table",{children:[o.jsx("thead",{children:o.jsxs("tr",{children:[o.jsx("th",{children:O?"应用 / 服务":"Application / service"}),o.jsx("th",{children:O?"状态":"Status"}),o.jsx("th",{children:O?"副本":"Replicas"})]})}),o.jsxs("tbody",{children:[x.map(R=>o.jsxs("tr",{children:[o.jsx("td",{children:o.jsxs("a",{href:ai(ni(R.fullName||R.name||"")),onClick:X=>{!X.metaKey&&!X.ctrlKey&&(X.preventDefault(),C(ni(R.fullName||R.name||"")))},children:[R.stack?`${R.stack} / `:"",R.name]})}),o.jsx("td",{children:o.jsx(Bn,{value:R.status||R.health||"unknown",label:gm(c,R.status||R.health||"unknown")})}),o.jsxs("td",{children:[R.running??0,"/",R.desired??0]})]},R.fullName||R.name)),x.length?null:o.jsx("tr",{children:o.jsx("td",{colSpan:3,children:O?"当前没有关联的服务":"No associated services"})})]})]})})]}):null]})}function Om(c,f=!1){const m={Authorization:`Bearer ${c}`};return f&&(m["Content-Type"]="application/json"),m}async function Gs(c){const f=await c.text();let m={};try{m=f?JSON.parse(f):{}}catch{throw new Error(`Invalid response format (HTTP ${c.status}): ${f.slice(0,100)}`)}if(!c.ok)throw new Error(String(m.error||`HTTP ${c.status}`));return m}async function V0(c,f,m){const r=await fetch(c,{headers:Om(f),signal:m});return Gs(r)}async function mg(c,f,m,r){const T=await fetch(c,{method:"POST",headers:Om(f,!0),body:m===void 0?void 0:JSON.stringify(m),signal:r});return Gs(T)}async function hg(c,f,m={}){const r=m.doneStatus??"done",T=m.failStatus??"fail";if(!c.ok){const x=await Gs(c);throw new Error(String(x.error||`HTTP ${c.status}`))}if(!c.body)throw new Error(m.unavailableMessage??"stream is unavailable");const g=c.body.getReader(),C=new TextDecoder;let O="",M=null,p=!1;const U=x=>{if(!x.trim())return;const R=JSON.parse(x);if(f(R),R.status===T)throw p=!0,new Error(String(R.message||"stream failed"));R.status===r&&(p=!0,M=R.result)};try{for(;;){const{done:x,value:R}=await g.read();if(x)break;O+=C.decode(R,{stream:!0});const X=O.split(`
|
|
21
|
+
`);O=X.pop()||"";for(const K of X)U(K)}O+=C.decode(),U(O)}finally{g.cancel().catch(()=>{})}if(!p)throw new Error("stream ended before completion");return M}async function Z0({token:c,name:f}){return V0(`/v1/deployments/${encodeURIComponent(f)}/config`,c)}function K0(c){return(c.state||"").toLowerCase()==="ready"&&(c.availability||"").toLowerCase()!=="drain"}function J0(c){return c.reduce((f,m)=>m.severity==="critical"?{...f,critical:f.critical+1}:m.severity==="warning"?{...f,warning:f.warning+1}:{...f,info:f.info+1},{critical:0,warning:0,info:0})}function $0(c,f,m,r,T){if(!f&&!r)return 0;const g=f?c/f:1,C=r?m/r:1,O=Math.min(.45,T.critical*.18+T.warning*.07);return Math.max(0,Math.round((g*.38+C*.62-O)*100))}function W0(c){const f=c?.nodes||[],m=c?.services||[],r=c?.issues||[],T=c?.trafficPaths||[],g=c?.storage?.volumes||[],C=c?.storage?.storageClasses||[],O=c?.storage?.warnings||[],M=f.filter(K0).length,p=m.filter(vm).length,U=J0(r);return{clusterId:c?.cluster?.id||"-",nodes:f,regions:c?.regions||[],services:m,applications:pv(m),trafficPaths:T,issues:r,storageVolumes:g,storageClasses:C,storageWarnings:O,activeNodes:M,healthyServices:p,issueCounts:U,metricNodes:f.filter(x=>x.metrics?.cpuPercent||x.metrics?.memoryUsedPercent).length,builderNodes:(c?.build?.nodes||[]).length,templateCount:Os.length,deployServiceTemplates:Os.filter(x=>x.mode==="service").length,deployComposeTemplates:Os.filter(x=>x.mode==="compose").length,healthScore:$0(M,f.length,p,m.length,U)}}const Cs="luma.dashboard.deployToken",F0=3e4,P0=typeof window<"u"&&(window.location.hostname==="localhost"||window.location.hostname==="127.0.0.1");function I0(){const[c,f]=q.useState(()=>localStorage.getItem(Cs)||(P0?"dev-token":"")),[m,r]=q.useState(null),[T,g]=q.useState([]),[C,O]=q.useState(c?"refreshing":"notConnected"),[M,p]=q.useState(null),U=q.useRef(!1),x=q.useRef(0),R=q.useCallback(ie=>{const L=ie.trim();f(L),L?localStorage.setItem(Cs,L):localStorage.removeItem(Cs)},[]),X=q.useCallback(()=>{R(""),r(null),g([]),O("notConnected"),p(null)},[R]),K=q.useCallback(async()=>{if(!c){O("notConnected");return}const ie=++x.current;O("refreshing");try{const L=await fetch("/v1/dashboard",{headers:{Authorization:`Bearer ${c}`}}),Y=await L.text();let Se;try{Se=JSON.parse(Y)}catch{throw new Error(`Invalid response format (HTTP ${L.status}): ${Y.slice(0,100)}`)}if(!L.ok)throw new Error(Se.error||`HTTP ${L.status}`);if(ie!==x.current)return;r(Se),g(Se.errors||[]),p(new Date),O("updated")}catch(L){if(ie!==x.current)return;const Y=String(L instanceof Error?L.message:L);g([Y]),/unauthorized|bearer token/i.test(Y)?(U.current=!0,O("tokenRejected"),r(null)):O("unavailable")}},[c]);return q.useEffect(()=>{if(!c)return;U.current=!1;let ie=!1,L;const Y=async()=>{await K(),!ie&&!U.current&&(L=window.setTimeout(Y,F0))};return Y(),()=>{ie=!0,window.clearTimeout(L)}},[K,c]),{token:c,payload:m,errors:T,syncStatus:C,lastUpdated:M,setToken:R,signOut:X,loadDashboard:K}}const qs="luma.dashboard.theme",Nm="(prefers-color-scheme: light)";function dm(){const c=localStorage.getItem(qs);return c==="light"||c==="dark"?c:"system"}function Rs(c){return c==="system"?window.matchMedia(Nm).matches?"light":"dark":c}function eg(c){document.documentElement.dataset.theme=c;const f=document.querySelector('meta[name="theme-color"]');f&&f.setAttribute("content",c==="light"?"#f5f3f3":"#1a1818")}function tg(){const[c,f]=q.useState(dm),[m,r]=q.useState(()=>Rs(dm()));return q.useEffect(()=>{eg(m)},[m]),q.useEffect(()=>{if(c!=="system")return;const g=window.matchMedia(Nm),C=()=>r(Rs("system"));return g.addEventListener("change",C),()=>g.removeEventListener("change",C)},[c]),{mode:c,theme:m,setMode:g=>{f(g),g==="system"?localStorage.removeItem(qs):localStorage.setItem(qs,g),r(Rs(g))}}}const lg=q.lazy(()=>Rt(()=>import("./chunk-TerminalDrawer-CSdFl_Ku.js"),__vite__mapDeps([35,3,9,16,36])).then(c=>({default:c.TerminalDrawer}))),mm="luma.dashboard.lang",Us="luma.dashboard.sidebar",ag={};function ng(){const c=Ys(),[f,m]=q.useState(()=>localStorage.getItem(mm)==="en"?"en":"zh"),[r,T]=q.useState(()=>localStorage.getItem(Us)==="collapsed"),[g,C]=q.useState(!0),[O,M]=q.useState(null),[p,U]=q.useState(""),[x,R]=q.useState(0),{token:X,payload:K,errors:ie,syncStatus:L,lastUpdated:Y,setToken:Se,signOut:ke,loadDashboard:tt}=I0(),{mode:Et,theme:Ie,setMode:te}=tg(),Ee=q.useMemo(()=>W0(K),[K]),ze=q0(c.path),we=ze?.kind==="update"?ze.name:"",Qe=we&&O?.app.stack===we?O:null,xe=ze?.kind==="node"||ze?.kind==="node-terminal"?Ee.nodes.find($=>$.name===ze.name):void 0,De=ze?.kind==="service"||ze?.kind==="service-terminal"?Ee.services.find($=>($.fullName||$.name)===ze.name):void 0,_t=ze?.kind==="node-terminal"&&xe?{kind:"node",node:xe}:ze?.kind==="service-terminal"&&De?{kind:"container",service:De,stack:new URLSearchParams(c.search).get("stack")||De.stack}:null,at=q.useCallback(async()=>{window.dispatchEvent(new CustomEvent("luma:refresh")),await tt()},[tt]);q.useEffect(()=>{if(!we||!X||Qe||!K)return;const $=Ee.applications.find(Ne=>Ne.stack===we);if(!$)return;let He=!0;return U(""),Z0({token:X,name:we}).then(Ne=>{He&&M({app:$,deploymentConfig:Ne})}).catch(Ne=>{He&&U(Ne instanceof Error?Ne.message:String(Ne))}),()=>{He=!1}},[we,X,Qe,K,Ee.applications,x]);const A=C0(c.path),H=A==="notfound"?"overview":A,Z=A==="deployments"||A==="credentials"||A==="registry"||A==="lae"||A==="observability";q.useEffect(()=>{document.documentElement.lang=f==="zh"?"zh-CN":"en"},[f]);const me=$=>{m($),localStorage.setItem(mm,$)},se=q.useCallback(($,He)=>{M(null),$==="deploy"&&C(!0);let Ne=Bs[$];He?.selectApp&&(Ne=`/apps/${encodeURIComponent(He.selectApp)}/overview`),c.navigate(Ne)},[c]),y=$=>{M($),C(!1),c.navigate(B0($.app.stack))},j=()=>{M(null),c.navigate(we?`/apps/${encodeURIComponent(we)}/config`:Bs.applications)},B=q.useMemo(()=>{if(!Qe)return null;const $=Qe,{app:He,deploymentConfig:Ne}=$;if(Ne?.manifest||Ne?.composeContent){const Hl=Ne.kind==="compose"||!!Ne.composeContent;return{...$,deployMode:Hl?"compose":"service",serviceDraft:Hl?void 0:em(He),composeDraft:Hl?tm(He):void 0}}return He.services.length<=1?{...$,deployMode:"service",serviceDraft:em(He),composeDraft:void 0}:{...$,deployMode:"compose",serviceDraft:void 0,composeDraft:tm(He)}},[Qe]),k=B?o.jsxs("div",{className:"inline-banner",children:[f==="zh"?"正在更新应用:":"Updating application: ",o.jsx("strong",{children:we}),Qe?.configWarning?o.jsx("span",{children:Qe.configWarning}):null]}):null,W=$=>c.navigate(sm($.name||"")),ee=$=>c.navigate(ni($.fullName||$.name||"")),oe=$=>c.navigate(om("node",$.name||"")),Ve=($,He)=>c.navigate(om("service",$.fullName||$.name||"",He)),Oe=()=>c.navigate(xe?sm(xe.name||""):De?.stack&&Ee.applications.some($=>$.stack===De.stack)?`/apps/${encodeURIComponent(De.stack)}/services`:De?ni(De.fullName||De.name||""):"/fleet"),Ul=X?L:"notConnected",ea=()=>{T($=>{const He=!$;return He?localStorage.setItem(Us,"collapsed"):localStorage.removeItem(Us),He})};return o.jsxs("div",{className:`dashboard-shell page-${H}${r?" sidebar-collapsed":""}`,children:[o.jsx("a",{className:"skip-link",href:"#main",children:f==="zh"?"跳到主内容":"Skip to main content"}),o.jsx(U0,{lang:f,vm:Ee,activeNavPage:H,sidebarCollapsed:r,onNavigate:se,onPrefetch:D0,onToggle:ea}),o.jsxs("main",{id:"main",className:"workspace",tabIndex:-1,children:[o.jsx("div",{className:"topbar-wrapper",children:o.jsx(d0,{clusterId:Ee.clusterId,lang:f,lastUpdated:Y,themeMode:Et,onLangChange:me,onThemeModeChange:te,onRefresh:()=>{at()},onSignOut:ke,syncStatus:Ul})}),o.jsx("div",{className:"workspace-body",children:X?o.jsxs(o.Fragment,{children:[o.jsx(dv,{errors:ie}),K||Z?_t?o.jsx(q.Suspense,{fallback:o.jsx(li,{lang:f}),children:o.jsx(lg,{lang:f,target:_t,token:X,onClose:Oe,inline:!0},c.path)}):ze&&ze.kind!=="update"?xe||De?o.jsx(Q0,{lang:f,node:xe,service:De,services:Ee.services,applicationNames:Ee.applications.map($=>$.stack),onTerminal:()=>{xe?oe(xe):De&&Ve(De,De.stack||"")}}):o.jsxs("section",{className:"detail-page",children:[o.jsx("h1",{children:f==="zh"?"对象不存在或已移除":"Object not found or removed"}),o.jsx("button",{onClick:()=>se("overview"),children:f==="zh"?"返回总览":"Back to overview"})]}):we&&!B?o.jsxs("section",{className:"detail-page",children:[o.jsx("button",{className:"page-back",onClick:j,children:f==="zh"?"← 返回应用":"← Back to application"}),o.jsxs("h1",{children:[f==="zh"?"更新应用":"Update application"," · ",we]}),p?o.jsxs(o.Fragment,{children:[o.jsx("p",{role:"alert",children:p}),o.jsx("button",{onClick:()=>R($=>$+1),children:f==="zh"?"重试读取配置":"Retry loading config"})]}):Ee.applications.some($=>$.stack===we)?o.jsx(li,{lang:f}):o.jsx("p",{children:f==="zh"?"应用不存在或已移除":"Application not found or removed"})]}):o.jsx(j0,{page:A,lang:f,token:X,theme:Ie,payload:K||ag,vm:Ee,updateContext:B,updateContextNode:k,deployTemplateLanding:g,onNavigate:se,onNavigateToDeployments:()=>se("deployments"),onSelectNode:W,onSelectService:ee,onTerminal:oe,onServiceTerminal:Ve,onRefresh:at,onCreateApplication:()=>se("deploy"),onUpdateApplication:y,onCloseUpdate:j,onTemplateLandingChange:C}):o.jsx(li,{lang:f})]}):o.jsx("div",{className:"login-panel-container",children:o.jsx(bv,{lang:f,onSubmit:Se})})})]})]})}ov.createRoot(document.getElementById("root")).render(o.jsx(lv.StrictMode,{children:o.jsx(R0,{children:o.jsx(ng,{})})}));export{Nv as A,m0 as B,Hv as C,Os as D,ug as E,Py as F,lv as G,mg as H,a0 as I,Rv as J,Mv as K,t0 as L,iv as M,G0 as O,og as P,Iv as R,sg as S,r0 as X,Ys as a,ai as b,Ge as c,Bn as d,rg as e,fg as f,pv as g,Z0 as h,u0 as i,o as j,dg as k,gm as l,g0 as m,Fv as n,V0 as o,ig as p,cg as q,q as r,ym as s,Ue as t,Y0 as u,pm as v,Bs as w,Om as x,Gs as y,hg as z};
|