@xenon-device-management/xenon 1.7.0 → 1.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/lib/package.json +1 -1
  2. package/lib/public/assets/{ApiKeyGate-BSN8crwz.js → ApiKeyGate-BousCIQZ.js} +1 -1
  3. package/lib/public/assets/{BugReportButton-DNja1wQ1.js → BugReportButton-Gw4lnGnV.js} +1 -1
  4. package/lib/public/assets/{DeviceMosaicView-DVk1IpIR.js → DeviceMosaicView-BX2hfhBf.js} +2 -2
  5. package/lib/public/assets/{EmptyState-CqQ21n-H.js → EmptyState-CPOfuV3O.js} +1 -1
  6. package/lib/public/assets/{FieldGroup-DE3u01Nu.js → FieldGroup-C5UkCHbe.js} +1 -1
  7. package/lib/public/assets/{Modal-BJcFdiBP.js → Modal-MMGhL8eW.js} +1 -1
  8. package/lib/public/assets/{SegmentedControl-CSHjmrvy.js → SegmentedControl-CZfAicws.js} +1 -1
  9. package/lib/public/assets/{SettingCard-M-lFn_Wm.js → SettingCard-Dp7XIdcl.js} +1 -1
  10. package/lib/public/assets/{Table-B3EUgBi6.js → Table-DsN_IX6J.js} +1 -1
  11. package/lib/public/assets/{activity-DK3R5GAb.js → activity-DCBAvxuo.js} +1 -1
  12. package/lib/public/assets/ai-settings-yNS_bU1m.js +21 -0
  13. package/lib/public/assets/api-keys-CQ9g1g1b.js +1 -0
  14. package/lib/public/assets/apps-Bqh1eav9.js +21 -0
  15. package/lib/public/assets/apps-CTrGClro.css +1 -0
  16. package/lib/public/assets/{arrow-left-9933DNlF.js → arrow-left-GX0vzYtn.js} +1 -1
  17. package/lib/public/assets/{arrow-up-right-B7q_1mXs.js → arrow-up-right-DePHHOby.js} +1 -1
  18. package/lib/public/assets/auth-shell-BBGlC6i3.js +1 -0
  19. package/lib/public/assets/builds-page-Czf7RsmD.js +6 -0
  20. package/lib/public/assets/{button-lkxVyarW.js → button-ybNY3GYx.js} +1 -1
  21. package/lib/public/assets/{check-BkT38An9.js → check-BZMx8AhR.js} +1 -1
  22. package/lib/public/assets/{chevron-right-WELZ1Z8v.js → chevron-right-WL_bcB02.js} +1 -1
  23. package/lib/public/assets/{circle-check--2DSsfaI.js → circle-check-CI2xUlDo.js} +1 -1
  24. package/lib/public/assets/{circle-x-x7R8vTBo.js → circle-x-De3thbcr.js} +1 -1
  25. package/lib/public/assets/{clock-DIpGd4Pn.js → clock-BFVLE7wW.js} +1 -1
  26. package/lib/public/assets/{copy-CEcFYYHm.js → copy-ve3lNhva.js} +1 -1
  27. package/lib/public/assets/device-explorer-elRO7T00.css +1 -0
  28. package/lib/public/assets/device-explorer-vzZxT4-Y.js +210 -0
  29. package/lib/public/assets/{download-CaKkGvKw.js → download-BDZj44ke.js} +1 -1
  30. package/lib/public/assets/forgot-password-BSYQX2oR.js +1 -0
  31. package/lib/public/assets/{funnel-D2rLIKlM.js → funnel-CptlpFZ9.js} +1 -1
  32. package/lib/public/assets/index-BW3kENYH.css +1 -0
  33. package/lib/public/assets/{index-BrVV0Kla.js → index-PtnKslHU.js} +12 -12
  34. package/lib/public/assets/{layers-DZwF8z_0.js → layers-DRpwoKhI.js} +1 -1
  35. package/lib/public/assets/{lock-CVUUnm1V.js → lock-CrQhC34I.js} +1 -1
  36. package/lib/public/assets/login-DaJOt8Qz.js +1 -0
  37. package/lib/public/assets/maintenance-settings-D629C2IC.js +6 -0
  38. package/lib/public/assets/{mouse-pointer-2-n4xUMxHJ.js → mouse-pointer-2-Dpcc76zN.js} +1 -1
  39. package/lib/public/assets/overview-CGEKYX62.js +11 -0
  40. package/lib/public/assets/{page-header-C0pnt4xz.js → page-header-CSvuGbSO.js} +1 -1
  41. package/lib/public/assets/{plus-BObE-_z6.js → plus-vJJF9g79.js} +1 -1
  42. package/lib/public/assets/profile-page-CF7ZQNQz.js +6 -0
  43. package/lib/public/assets/reset-password-BgpjbCac.js +1 -0
  44. package/lib/public/assets/runbook-page-Dxuzftyv.js +124 -0
  45. package/lib/public/assets/selector-detail-page-B_puCd9g.js +1 -0
  46. package/lib/public/assets/{selector-health-DraY2a4b.js → selector-health-BjMHf106.js} +1 -1
  47. package/lib/public/assets/selector-health-page-Du_bGD2p.js +16 -0
  48. package/lib/public/assets/session-detail-page-lQTe5_B1.js +13 -0
  49. package/lib/public/assets/settings-Cxx_aYWT.css +1 -0
  50. package/lib/public/assets/settings-DhxWGUzy.js +1 -0
  51. package/lib/public/assets/{shield-BBc4qisQ.js → shield-JGzamJo5.js} +1 -1
  52. package/lib/public/assets/{shield-alert-BfoPJ8q_.js → shield-alert-DzE36jcb.js} +1 -1
  53. package/lib/public/assets/status-pill-outline-50aN0wRU.js +1 -0
  54. package/lib/public/assets/{tablet-CaOqzQv_.js → tablet-DHY88mxw.js} +1 -1
  55. package/lib/public/assets/teams-EOAIPbZC.js +1 -0
  56. package/lib/public/assets/time-B8FIgwPE.js +1 -0
  57. package/lib/public/assets/{trash-2-CE5TRHb2.js → trash-2-BrTSfFh5.js} +1 -1
  58. package/lib/public/assets/{useSocket-Bkt5i-U6.js → useSocket-BRto9a5m.js} +1 -1
  59. package/lib/public/assets/users-Dd44jLAB.js +11 -0
  60. package/lib/public/assets/webhook-settings-DBYmqim_.js +1 -0
  61. package/lib/public/assets/{webhook-settings-DEZQtSgr.css → webhook-settings-tW1oXXrJ.css} +1 -1
  62. package/lib/public/assets/{zap-BzdRuL9F.js → zap-JUbOoK3o.js} +1 -1
  63. package/lib/public/index.html +2 -2
  64. package/lib/src/app/routers/auth.js +19 -2
  65. package/lib/src/scripts/run-migrations.js +14 -3
  66. package/lib/test/unit/auth-me-auth-disabled.test.js +77 -0
  67. package/lib/test/unit/run-migrations-fail-fast.test.js +87 -0
  68. package/lib/tsconfig.tsbuildinfo +1 -1
  69. package/package.json +1 -1
  70. package/lib/public/assets/ai-settings-AKMDh8pd.js +0 -21
  71. package/lib/public/assets/api-keys-B5Q1EkGN.js +0 -1
  72. package/lib/public/assets/apps-CWWrkTZW.js +0 -21
  73. package/lib/public/assets/apps-Dt5dUIag.css +0 -1
  74. package/lib/public/assets/builds-page-DgWXOgh5.js +0 -6
  75. package/lib/public/assets/device-explorer-3H1hf8ld.css +0 -1
  76. package/lib/public/assets/device-explorer-nV6L3w7x.js +0 -210
  77. package/lib/public/assets/forgot-password-CsAF11d2.js +0 -1
  78. package/lib/public/assets/index-Dz1K6OJU.css +0 -1
  79. package/lib/public/assets/login-BavGkTli.js +0 -1
  80. package/lib/public/assets/maintenance-settings-Vr_u8hoR.js +0 -6
  81. package/lib/public/assets/overview-DVgoOoYF.js +0 -11
  82. package/lib/public/assets/profile-page-DNKD4MS2.js +0 -1
  83. package/lib/public/assets/reset-password-C2gSMy8a.js +0 -1
  84. package/lib/public/assets/runbook-page-BRxjWJVQ.js +0 -104
  85. package/lib/public/assets/selector-detail-page-DcV8jQuX.js +0 -1
  86. package/lib/public/assets/selector-health-page-tb5e3CXy.js +0 -16
  87. package/lib/public/assets/session-detail-page-CEtQr37W.js +0 -13
  88. package/lib/public/assets/settings-CpRbubta.css +0 -1
  89. package/lib/public/assets/settings-Cr-YjLbX.js +0 -1
  90. package/lib/public/assets/status-pill-outline-Cc4PF7Mg.js +0 -1
  91. package/lib/public/assets/teams-B3Tt_9i2.js +0 -1
  92. package/lib/public/assets/users-BIvjvjM6.js +0 -11
  93. package/lib/public/assets/webhook-settings-dAp8wwEB.js +0 -1
@@ -1 +0,0 @@
1
- @import"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap";:root{--bg: #0a0d0c;--surface: #111514;--surface-2: #161b1a;--border: #1f2624;--border-strong: #2a3331;--text: #e6ebe9;--text-muted: #8a938f;--text-dim: #5b6460;--green: #22c55e;--green-dim: #16a34a;--amber: #f59e0b;--red: #ef4444;--blue: #3b82f6;--accent-subtle: rgba(34, 197, 94, .1);--accent-border: rgba(34, 197, 94, .3);--status-ready-fg: var(--green);--status-busy-fg: var(--amber);--status-reserved-fg: var(--blue);--status-error-fg: var(--red);--status-offline-fg: var(--text-muted);--status-ready-bg: rgba(34, 197, 94, .1);--status-busy-bg: rgba(245, 158, 11, .1);--status-reserved-bg: rgba(59, 130, 246, .1);--status-error-bg: rgba(239, 68, 68, .1);--status-offline-bg: rgba(138, 147, 143, .08);--status-ready-border: rgba(34, 197, 94, .3);--status-busy-border: rgba(245, 158, 11, .3);--status-reserved-border: rgba(59, 130, 246, .3);--status-error-border: rgba(239, 68, 68, .3);--status-offline-border: rgba(138, 147, 143, .25);--space-1: 4px;--space-2: 8px;--space-3: 12px;--space-4: 16px;--space-5: 20px;--space-6: 24px;--space-8: 32px;--space-12: 48px;--radius-sm: 4px;--radius-md: 6px;--radius-lg: 8px;--shadow-sm: 0 1px 2px rgba(0, 0, 0, .25);--shadow-md: 0 4px 12px rgba(0, 0, 0, .35);--shadow-lg: 0 12px 32px rgba(0, 0, 0, .45);--motion-fast: .15s cubic-bezier(.2, 0, 0, 1);--motion-slow: .25s cubic-bezier(.2, 0, 0, 1)}.scanline,.header-container:after{display:none!important}.animate-pulse-success,.animate-pulse-running{animation:none!important}.text-glow{text-shadow:none!important}@media (prefers-reduced-motion: reduce){*{transition:none!important;animation:none!important}}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:Inter,system-ui,-apple-system,sans-serif;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:JetBrains Mono,ui-monospace,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{top:0;bottom:0}.-top-12{top:-3rem}.bottom-0{bottom:0}.bottom-1{bottom:.25rem}.bottom-2{bottom:.5rem}.bottom-4{bottom:1rem}.left-0{left:0}.left-1\/2{left:50%}.left-14{left:3.5rem}.left-2{left:.5rem}.left-2\.5{left:.625rem}.left-3{left:.75rem}.left-full{left:100%}.right-0{right:0}.right-2{right:.5rem}.right-3{right:.75rem}.right-4{right:1rem}.top-0{top:0}.top-1{top:.25rem}.top-1\/2{top:50%}.top-2{top:.5rem}.top-3{top:.75rem}.top-full{top:100%}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-auto{margin-left:auto;margin-right:auto}.my-auto{margin-top:auto;margin-bottom:auto}.mb-1{margin-bottom:.25rem}.mb-1\.5{margin-bottom:.375rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-12{margin-top:3rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-5{margin-top:1.25rem}.mt-6{margin-top:1.5rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.aspect-video{aspect-ratio:16 / 9}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-32{height:8rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-\[18px\]{height:18px}.h-\[2px\]{height:2px}.h-full{height:100%}.h-px{height:1px}.h-screen{height:100vh}.max-h-64{max-height:16rem}.max-h-96{max-height:24rem}.max-h-full{max-height:100%}.min-h-0{min-height:0px}.min-h-\[120px\]{min-height:120px}.min-h-\[280px\]{min-height:280px}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-12{width:3rem}.w-14{width:3.5rem}.w-2{width:.5rem}.w-20{width:5rem}.w-24{width:6rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-32{width:8rem}.w-4{width:1rem}.w-40{width:10rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-9{width:2.25rem}.w-\[18px\]{width:18px}.w-\[280px\]{width:280px}.w-\[2px\]{width:2px}.w-\[32px\]{width:32px}.w-\[36px\]{width:36px}.w-\[3px\]{width:3px}.w-\[64px\]{width:64px}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.min-w-0{min-width:0px}.min-w-\[18px\]{min-width:18px}.max-w-3xl{max-width:48rem}.max-w-5xl{max-width:64rem}.max-w-7xl{max-width:80rem}.max-w-\[160px\]{max-width:160px}.max-w-\[180px\]{max-width:180px}.max-w-\[240px\]{max-width:240px}.max-w-\[420px\]{max-width:420px}.max-w-\[45\%\]{max-width:45%}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.-translate-x-1\/2{--tw-translate-x: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.-rotate-90{--tw-rotate: -90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-0{--tw-rotate: 0deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.rotate-90{--tw-rotate: 90deg;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes ping{75%,to{transform:scale(2);opacity:0}}.animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.touch-none{touch-action:none}.select-none{-webkit-user-select:none;user-select:none}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-\[260px_1fr\]{grid-template-columns:260px 1fr}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.gap-6{gap:1.5rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-\[var\(--border\)\]>:not([hidden])~:not([hidden]){border-color:var(--border)}.self-center{align-self:center}.self-stretch{align-self:stretch}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-wrap{white-space:pre-wrap}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.rounded-sm{border-radius:.125rem}.rounded-r{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.rounded-t{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.border{border-width:1px}.border-2{border-width:2px}.border-4{border-width:4px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-\[var\(--border\)\]{border-color:var(--border)}.border-\[var\(--border-strong\)\]{border-color:var(--border-strong)}.border-\[var\(--green\)\]{border-color:var(--green)}.border-\[var\(--red\,\#dc2626\)\]{border-color:var(--red,#dc2626)}.border-emerald-300\/80{border-color:#6ee7b7cc}.border-emerald-500\/40{border-color:#10b98166}.border-emerald-500\/60{border-color:#10b98199}.border-neutral-800{--tw-border-opacity: 1;border-color:rgb(38 38 38 / var(--tw-border-opacity, 1))}.border-red-500\/40{border-color:#ef444466}.border-transparent{border-color:transparent}.border-white\/10{border-color:#ffffff1a}.border-t-red-500{--tw-border-opacity: 1;border-top-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.bg-\[\#000\]{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-\[var\(--accent\,\#3b82f6\)\]{background-color:var(--accent,#3b82f6)}.bg-\[var\(--amber\)\]{background-color:var(--amber)}.bg-\[var\(--bg\)\]{background-color:var(--bg)}.bg-\[var\(--blue\)\]{background-color:var(--blue)}.bg-\[var\(--border\)\]{background-color:var(--border)}.bg-\[var\(--border-strong\)\]{background-color:var(--border-strong)}.bg-\[var\(--green\)\]{background-color:var(--green)}.bg-\[var\(--green-dim\)\]{background-color:var(--green-dim)}.bg-\[var\(--red\)\]{background-color:var(--red)}.bg-\[var\(--red-soft\,rgba\(220\,38\,38\,0\.08\)\)\]{background-color:var(--red-soft,rgba(220,38,38,.08))}.bg-\[var\(--surface\)\]{background-color:var(--surface)}.bg-\[var\(--surface-1\,rgba\(255\,255\,255\,0\.02\)\)\]{background-color:var(--surface-1,rgba(255,255,255,.02))}.bg-\[var\(--surface-2\)\]{background-color:var(--surface-2)}.bg-\[var\(--surface-2\,\#2a2a2a\)\]{background-color:var(--surface-2,#2a2a2a)}.bg-\[var\(--surface-2\,rgba\(255\,255\,255\,0\.06\)\)\]{background-color:var(--surface-2,rgba(255,255,255,.06))}.bg-\[var\(--surface-2\,var\(--surface\)\)\]{background-color:var(--surface-2,var(--surface))}.bg-\[var\(--text-dim\)\]{background-color:var(--text-dim)}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-black\/40{background-color:#0006}.bg-black\/50{background-color:#00000080}.bg-black\/60{background-color:#0009}.bg-black\/80{background-color:#000c}.bg-emerald-400{--tw-bg-opacity: 1;background-color:rgb(52 211 153 / var(--tw-bg-opacity, 1))}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-emerald-500\/15{background-color:#10b98126}.bg-emerald-500\/5{background-color:#10b9810d}.bg-neutral-900{--tw-bg-opacity: 1;background-color:rgb(23 23 23 / var(--tw-bg-opacity, 1))}.bg-red-500\/10{background-color:#ef44441a}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-transparent{background-color:transparent}.bg-white\/5{background-color:#ffffff0d}.bg-yellow-500{--tw-bg-opacity: 1;background-color:rgb(234 179 8 / var(--tw-bg-opacity, 1))}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.from-\[\#0a0e1a\]{--tw-gradient-from: #0a0e1a var(--tw-gradient-from-position);--tw-gradient-to: rgb(10 14 26 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.via-\[\#131a2e\]{--tw-gradient-to: rgb(19 26 46 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), #131a2e var(--tw-gradient-via-position), var(--tw-gradient-to)}.to-\[\#1a2548\]{--tw-gradient-to: #1a2548 var(--tw-gradient-to-position)}.object-contain{object-fit:contain}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-12{padding-left:3rem;padding-right:3rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-3\.5{padding-left:.875rem;padding-right:.875rem}.px-4{padding-left:1rem;padding-right:1rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.px-8{padding-left:2rem;padding-right:2rem}.py-0{padding-top:0;padding-bottom:0}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-10{padding-top:2.5rem;padding-bottom:2.5rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-2{padding-bottom:.5rem}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pb-8{padding-bottom:2rem}.pl-1\.5{padding-left:.375rem}.pl-14{padding-left:3.5rem}.pl-7{padding-left:1.75rem}.pl-8{padding-left:2rem}.pl-9{padding-left:2.25rem}.pr-14{padding-right:3.5rem}.pr-2{padding-right:.5rem}.pr-2\.5{padding-right:.625rem}.pt-14{padding-top:3.5rem}.pt-3{padding-top:.75rem}.pt-6{padding-top:1.5rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.font-mono{font-family:JetBrains Mono,ui-monospace,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-5xl{font-size:3rem;line-height:1}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-\[13px\]{font-size:13px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-black{font-weight:900}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-10{line-height:2.5rem}.leading-none{line-height:1}.leading-relaxed{line-height:1.625}.leading-tight{line-height:1.25}.tracking-tight{letter-spacing:-.025em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-\[var\(--amber\)\]{color:var(--amber)}.text-\[var\(--blue\)\]{color:var(--blue)}.text-\[var\(--green\)\]{color:var(--green)}.text-\[var\(--red\)\]{color:var(--red)}.text-\[var\(--red\,\#dc2626\)\]{color:var(--red,#dc2626)}.text-\[var\(--text\)\]{color:var(--text)}.text-\[var\(--text-dim\)\]{color:var(--text-dim)}.text-\[var\(--text-muted\)\]{color:var(--text-muted)}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.text-emerald-300{--tw-text-opacity: 1;color:rgb(110 231 183 / var(--tw-text-opacity, 1))}.text-emerald-400{--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.text-neutral-200{--tw-text-opacity: 1;color:rgb(229 229 229 / var(--tw-text-opacity, 1))}.text-neutral-400{--tw-text-opacity: 1;color:rgb(163 163 163 / var(--tw-text-opacity, 1))}.text-neutral-500{--tw-text-opacity: 1;color:rgb(115 115 115 / var(--tw-text-opacity, 1))}.text-red-100{--tw-text-opacity: 1;color:rgb(254 226 226 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-white\/60{color:#fff9}.underline{text-decoration-line:underline}.opacity-0{opacity:0}.opacity-20{opacity:.2}.opacity-40{opacity:.4}.opacity-50{opacity:.5}.opacity-60{opacity:.6}.opacity-70{opacity:.7}.opacity-75{opacity:.75}.opacity-80{opacity:.8}.shadow-\[0_0_20px_rgba\(220\,38\,38\,0\.3\)\]{--tw-shadow: 0 0 20px rgba(220,38,38,.3);--tw-shadow-colored: 0 0 20px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-\[0_0_4px_rgba\(52\,211\,153\,0\.7\)\]{--tw-shadow: 0 0 4px rgba(52,211,153,.7);--tw-shadow-colored: 0 0 4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-sm{--tw-shadow: 0 1px 2px 0 rgb(0 0 0 / .05);--tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.outline-none{outline:2px solid transparent;outline-offset:2px}.outline{outline-style:solid}.ring{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-2{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-inset{--tw-ring-inset: inset}.ring-emerald-400\/60{--tw-ring-color: rgb(52 211 153 / .6)}.blur{--tw-blur: blur(8px);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.drop-shadow{--tw-drop-shadow: drop-shadow(0 1px 2px rgb(0 0 0 / .1)) drop-shadow(0 1px 1px rgb(0 0 0 / .06));filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.backdrop-blur-md{--tw-backdrop-blur: blur(12px);-webkit-backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia);backdrop-filter:var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-150{transition-duration:.15s}.ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)}*{box-sizing:border-box}html,body,#root{height:100%;margin:0;padding:0;background:var(--bg);color:var(--text);font-family:Inter,system-ui,-apple-system,sans-serif;font-feature-settings:"cv11","ss01";-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;line-height:1.5}body{overflow:hidden}h1,h2,h3,h4,h5,h6,.brand-font{font-family:Inter,sans-serif;font-weight:700;letter-spacing:-.02em;color:var(--text)}.font-mono,code,.code-font{font-family:JetBrains Mono,ui-monospace,Menlo,Monaco,Consolas,monospace}code,.code-font{font-size:.9em;background:var(--surface-2);padding:2px 6px;border-radius:var(--radius-sm);color:var(--green)}button{font-family:inherit;cursor:pointer;transition:background var(--motion-fast),border-color var(--motion-fast),color var(--motion-fast)}a{color:var(--blue);text-decoration:none;transition:color var(--motion-fast)}a:hover{color:#79b8ff}::-webkit-scrollbar{width:10px;height:10px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--border);border-radius:var(--radius-md)}::-webkit-scrollbar-thumb:hover{background:var(--border-strong)}input[type=checkbox]{-moz-appearance:none;appearance:none;-webkit-appearance:none;width:16px;height:16px;background:var(--bg);border:1px solid var(--border-strong);border-radius:var(--radius-sm);cursor:pointer;position:relative;transition:background var(--motion-fast),border-color var(--motion-fast);display:inline-flex;align-items:center;justify-content:center}input[type=checkbox]:hover{border-color:var(--green)}input[type=checkbox]:checked{background:var(--green);border-color:var(--green)}input[type=checkbox]:checked:after{content:"✓";color:var(--bg);font-size:11px;font-weight:700}input[type=checkbox]:focus{outline:none;box-shadow:0 0 0 2px #22c55e40}.bg-grid{background-image:linear-gradient(to right,rgba(255,255,255,.02) 1px,transparent 1px),linear-gradient(to bottom,rgba(255,255,255,.02) 1px,transparent 1px);background-size:32px 32px}@keyframes pulse-dot{0%,to{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(.85)}}.pulse-dot{animation:pulse-dot 2s ease-in-out infinite}.fade-in{animation:fadeIn .2s ease-out forwards}@keyframes fadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}.placeholder\:text-\[var\(--text-dim\)\]::placeholder{color:var(--text-dim)}.last\:border-b-0:last-child{border-bottom-width:0px}.last\:border-r-0:last-child{border-right-width:0px}.hover\:border-\[var\(--border\)\]:hover{border-color:var(--border)}.hover\:border-\[var\(--border-strong\)\]:hover{border-color:var(--border-strong)}.hover\:bg-\[var\(--bg\)\]:hover{background-color:var(--bg)}.hover\:bg-\[var\(--green-dim\)\]:hover{background-color:var(--green-dim)}.hover\:bg-\[var\(--surface\)\]:hover{background-color:var(--surface)}.hover\:bg-\[var\(--surface-2\)\]:hover{background-color:var(--surface-2)}.hover\:bg-\[var\(--surface-2\,\#1a1a1a\)\]:hover{background-color:var(--surface-2,#1a1a1a)}.hover\:bg-\[var\(--surface-2\,rgba\(255\,255\,255\,0\.04\)\)\]:hover{background-color:var(--surface-2,rgba(255,255,255,.04))}.hover\:bg-\[var\(--surface-raised\)\]:hover{background-color:var(--surface-raised)}.hover\:bg-emerald-500\/10:hover{background-color:#10b9811a}.hover\:bg-red-500:hover{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.hover\:bg-red-600\/70:hover{background-color:#dc2626b3}.hover\:bg-white\/15:hover{background-color:#ffffff26}.hover\:text-\[var\(--green\)\]:hover{color:var(--green)}.hover\:text-\[var\(--text\)\]:hover{color:var(--text)}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:underline:hover{text-decoration-line:underline}.hover\:opacity-100:hover{opacity:1}.hover\:opacity-80:hover{opacity:.8}.focus\:border-\[var\(--accent\,\#3b82f6\)\]:focus{border-color:var(--accent,#3b82f6)}.focus\:border-\[var\(--border-strong\)\]:focus{border-color:var(--border-strong)}.focus\:border-\[var\(--green\)\]:focus{border-color:var(--green)}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.active\:scale-95:active{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:opacity-30:disabled{opacity:.3}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:bg-\[var\(--green\)\]{background-color:var(--green)}.group:hover .group-hover\:text-\[var\(--text\)\]{color:var(--text)}.group:hover .group-hover\:opacity-100{opacity:1}@media (min-width: 640px){.sm\:inline-block{display:inline-block}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:flex-row{flex-direction:row}}@media (min-width: 768px){.md\:block{display:block}.md\:inline{display:inline}.md\:flex{display:flex}.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.md\:divide-x>:not([hidden])~:not([hidden]){--tw-divide-x-reverse: 0;border-right-width:calc(1px * var(--tw-divide-x-reverse));border-left-width:calc(1px * calc(1 - var(--tw-divide-x-reverse)))}.md\:divide-y-0>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(0px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(0px * var(--tw-divide-y-reverse))}.md\:px-12{padding-left:3rem;padding-right:3rem}}@media (min-width: 1024px){.lg\:col-span-2{grid-column:span 2 / span 2}.lg\:block{display:block}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-\[1fr_340px\]{grid-template-columns:1fr 340px}}.surface-card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-lg)}.toast-container{position:fixed;bottom:32px;right:32px;display:flex;flex-direction:column;gap:16px;z-index:10000;pointer-events:none}.toast-item{pointer-events:auto;min-width:320px;max-width:480px;padding:16px 20px;border-radius:6px;display:flex;align-items:center;gap:16px;background:var(--surface);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);border:1px solid var(--border);box-shadow:0 20px 40px #0006;color:var(--text);font-size:13px;font-weight:600;font-family:JetBrains Mono,monospace;transition:all .3s cubic-bezier(.16,1,.3,1);position:relative;overflow:hidden}.toast-item:after{content:"";position:absolute;top:0;left:0;width:100%;height:2px;background:currentColor;opacity:.3}.toast-message{flex:1;text-transform:uppercase;letter-spacing:.02em}.toast-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0}.toast-close{background:transparent;border:none;color:var(--text-dim);cursor:pointer;padding:4px;border-radius:6px;display:flex;align-items:center;justify-content:center;transition:all .2s}.toast-close:hover{background:#ffffff0d;color:var(--text)}.toast-success{border-color:#00ff884d;color:var(--green)}.toast-success .toast-icon{color:var(--green)}.toast-error{border-color:#ff4d4d4d;color:#ff4d4d}.toast-error .toast-icon{color:#ff4d4d}.toast-info{border-color:#00bfff4d;color:#00bfff}.toast-info .toast-icon{color:#00bfff}.toast-loading{border-color:var(--text-muted);color:var(--text-dim)}.toast-loading .toast-icon{color:var(--text-dim)}@keyframes slide-in{0%{transform:translate(100%) scale(.95);opacity:0}to{transform:translate(0) scale(1);opacity:1}}.animate-slide-in{animation:slide-in .4s cubic-bezier(.16,1,.3,1) forwards}.cp-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:#0009;z-index:9000;display:flex;justify-content:center;align-items:flex-start;padding-top:12vh;font-family:Inter,sans-serif}.cp{width:560px;max-width:90vw;background:var(--surface);border:1px solid var(--border-strong);border-radius:var(--radius-lg);box-shadow:var(--shadow-lg);overflow:hidden;display:flex;flex-direction:column}.cp-input-row{display:flex;align-items:center;gap:10px;padding:12px 14px;border-bottom:1px solid var(--border);color:var(--text-muted)}.cp-input{flex:1;background:transparent;border:none;outline:none;color:var(--text);font-family:Inter,sans-serif;font-size:14px}.cp-input::placeholder{color:var(--text-dim)}.cp-esc{font-family:JetBrains Mono,monospace;font-size:10px;color:var(--text-muted);background:var(--surface-2);border:1px solid var(--border);padding:2px 6px;border-radius:var(--radius-sm)}.cp-results{max-height:56vh;overflow-y:auto;padding:8px}.cp-empty{padding:20px;text-align:center;color:var(--text-muted);font-size:12px}.cp-group{padding:4px 0}.cp-group-head{font-family:JetBrains Mono,monospace;font-size:9px;letter-spacing:.12em;color:var(--text-dim);padding:6px 8px;text-transform:uppercase}.cp-item{display:flex;width:100%;align-items:center;gap:10px;padding:8px 10px;border-radius:var(--radius-sm);background:transparent;border:none;cursor:pointer;text-align:left;font-family:Inter,sans-serif}.cp-item-active,.cp-item:hover{background:var(--surface-2)}.cp-item-label{color:var(--text);font-size:13px;font-weight:500}.cp-item-sub{margin-left:auto;color:var(--text-dim);font-family:JetBrains Mono,monospace;font-size:10px}
@@ -1 +0,0 @@
1
- import{u as p,a as h,b as f,r as a,j as e,L as j,l as w}from"./index-BrVV0Kla.js";function S(){const d=p(),c=h(),{refresh:m}=f(),x=new URLSearchParams(c.search).get("next")||"/overview",[s,u]=a.useState(""),[r,b]=a.useState(""),[i,n]=a.useState(!1),[l,o]=a.useState(null);async function g(t){t.preventDefault(),n(!0),o(null);try{await w(s,r),await m(),d(x,{replace:!0})}catch(v){o(v.message||"Login failed")}finally{n(!1)}}return e.jsxs("div",{className:"min-h-screen w-full grid grid-cols-1 md:grid-cols-2 bg-[var(--bg)] text-[var(--text)]",children:[e.jsxs("aside",{className:"relative hidden md:flex flex-col justify-center px-12 overflow-hidden bg-gradient-to-br from-[#0a0e1a] via-[#131a2e] to-[#1a2548]",children:[e.jsx("div",{className:"absolute inset-0 pointer-events-none",style:{background:"radial-gradient(circle at 80% 20%, rgba(99,102,241,0.18), transparent 60%)"}}),e.jsxs("div",{className:"relative",children:[e.jsx("div",{className:"text-3xl font-semibold tracking-tight mb-2",children:"Xenon"}),e.jsx("p",{className:"text-sm text-[var(--text-dim)] max-w-sm leading-relaxed mb-8",children:"Enterprise-grade Appium device lab orchestration with AI self-healing, live device streaming, and proof-pack recording."}),e.jsx("div",{className:"flex flex-wrap gap-2 max-w-sm",children:["Hub-Node","5-tier Healing","Live MJPEG","Mosaic Recording"].map(t=>e.jsx("span",{className:"text-[11px] px-2.5 py-1 rounded-full bg-white/5 border border-white/10 text-[var(--text-muted)]",children:t},t))})]})]}),e.jsx("main",{className:"flex items-center justify-center px-6 md:px-12",children:e.jsxs("form",{onSubmit:g,className:"w-full max-w-sm",children:[e.jsx("h1",{className:"text-2xl font-semibold mb-1",children:"Welcome back!"}),e.jsx("p",{className:"text-sm text-[var(--text-dim)] mb-6",children:"Sign in to your account"}),e.jsx("label",{className:"block text-xs text-[var(--text-dim)] mb-1",children:"Email"}),e.jsx("input",{type:"email",value:s,onChange:t=>u(t.target.value),autoFocus:!0,required:!0,className:"w-full mb-4 h-10 px-3 rounded-md bg-[var(--surface)] border border-[var(--border)] text-sm focus:border-[var(--green)] outline-none"}),e.jsx("label",{className:"block text-xs text-[var(--text-dim)] mb-1",children:"Password"}),e.jsx("input",{type:"password",value:r,onChange:t=>b(t.target.value),required:!0,className:"w-full mb-2 h-10 px-3 rounded-md bg-[var(--surface)] border border-[var(--border)] text-sm focus:border-[var(--green)] outline-none"}),e.jsx("div",{className:"text-right mb-4",children:e.jsx(j,{to:"/forgot-password",className:"text-[11px] text-[var(--text-dim)] hover:text-[var(--text)]",children:"Forgot password?"})}),l&&e.jsx("div",{className:"mt-3 text-xs text-[var(--red)]",children:l}),e.jsx("button",{type:"submit",disabled:i,className:"mt-5 w-full h-10 rounded-md bg-[var(--green)] text-black font-medium text-sm disabled:opacity-50",children:i?"Signing in…":"Sign in"})]})})]})}export{S as default};
@@ -1,6 +0,0 @@
1
- import{g as S,m as N,r as d,X as C,j as e,v as D,s as M,I as A}from"./index-BrVV0Kla.js";/* empty css */import{S as o,A as B}from"./SettingCard-M-lFn_Wm.js";import{P as w}from"./page-header-C0pnt4xz.js";import{S as k,C as z}from"./shield-BBc4qisQ.js";import{T as E}from"./trash-2-CE5TRHb2.js";import{C as L}from"./check-BkT38An9.js";/**
2
- * @license lucide-react v0.555.0 - ISC
3
- *
4
- * This source code is licensed under the ISC license.
5
- * See the LICENSE file in the root directory of this source tree.
6
- */const I=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M12 7v5l4 2",key:"1fdv2h"}]],R=S("history",I),c={buildCleanupDays:30,buildCleanupMaxCount:100,buildCleanupSchedule:"0 0 * * *",deleteBuildAssets:!0},P=[{label:"Daily (Midnight)",value:"0 0 * * *"},{label:"Weekly (Sunday)",value:"0 0 * * 0"},{label:"Bi-Daily (12h)",value:"0 */12 * * *"}],T=(n,s)=>n.buildCleanupDays===s.buildCleanupDays&&n.buildCleanupMaxCount===s.buildCleanupMaxCount&&n.buildCleanupSchedule===s.buildCleanupSchedule&&n.deleteBuildAssets===s.deleteBuildAssets,X=()=>{const{toast:n}=N(),[s,i]=d.useState(c),[l,u]=d.useState(c),[b,p]=d.useState(!0),[h,m]=d.useState(!1);d.useEffect(()=>{y()},[]);const y=async()=>{p(!0);try{const a=await C.getGlobalConfig(),t={buildCleanupDays:a.buildCleanupDays||30,buildCleanupMaxCount:a.buildCleanupMaxCount||100,buildCleanupSchedule:a.buildCleanupSchedule||"0 0 * * *",deleteBuildAssets:a.deleteBuildAssets!==void 0?a.deleteBuildAssets:!0};i(t),u(t)}catch(a){console.error("Failed to load maintenance settings",a),n("Failed to access maintenance parameters.","error")}finally{p(!1)}},g=async a=>{const t=a??s;m(!0);try{await C.updateGlobalConfig(t),u(t),i(t),n("Maintenance parameters synchronized across fleet.","success")}catch(v){console.error("Failed to save maintenance settings",v),n("Synchronization failed. Check network integrity.","error")}finally{m(!1)}},f=async()=>{i(c),await g(c)},j=()=>{i(l)},x=!T(s,l),r={days:s.buildCleanupDays!==l.buildCleanupDays,max:s.buildCleanupMaxCount!==l.buildCleanupMaxCount,purge:s.deleteBuildAssets!==l.deleteBuildAssets,schedule:s.buildCleanupSchedule!==l.buildCleanupSchedule};return b?e.jsxs("div",{className:"settings-loading",children:[e.jsx(D,{className:"animate-spin",size:32}),e.jsx("span",{children:"Synchronizing Maintenance Parameters..."})]}):e.jsxs("div",{className:"settings-container",children:[e.jsx(w,{icon:k,title:"Maintenance & Retention",subtitle:"Manage the lifecycle of test artifacts, automated purging schedules, and storage optimization across the global registry."}),e.jsxs("div",{className:"settings-content",children:[e.jsxs("div",{className:"settings-grid",children:[e.jsx(o,{icon:e.jsx(R,{size:16}),title:e.jsxs("span",{className:"card-title-row",children:["Retention Window",r.days&&e.jsx("span",{className:"modified-dot","aria-label":"Modified"})]}),description:"Number of days to preserve builds and sessions before automatic purging from the system.",hint:"Standard enterprise retention is typically 30-90 days.",children:e.jsxs("div",{className:"input-group",children:[e.jsx("input",{type:"number",value:s.buildCleanupDays,onChange:a=>i({...s,buildCleanupDays:parseInt(a.target.value,10)}),min:1}),e.jsx("span",{className:"code-font",children:"DAYS"})]})}),e.jsx(o,{icon:e.jsx(E,{size:16}),title:e.jsxs("span",{className:"card-title-row",children:["Max Build Capacity",r.max&&e.jsx("span",{className:"modified-dot","aria-label":"Modified"})]}),description:"Cap the maximum number of historical builds stored in the primary database.",hint:"Protects against database bloat during high-frequency CI bursts.",children:e.jsxs("div",{className:"input-group",children:[e.jsx("input",{type:"number",value:s.buildCleanupMaxCount,onChange:a=>i({...s,buildCleanupMaxCount:parseInt(a.target.value,10)}),min:1}),e.jsx("span",{className:"code-font",children:"BUILDS"})]})}),e.jsx(o,{icon:e.jsx(M,{size:16}),title:e.jsxs("span",{className:"card-title-row",children:["Asset Purge Strategy",r.purge&&e.jsx("span",{className:"modified-dot","aria-label":"Modified"})]}),description:"Automatically remove binary artifacts (videos, screenshots) when build records are purged.",hint:"Disabling this will leave orphaned files on disk—use with caution.",children:e.jsxs("div",{className:"toggle-group",children:[e.jsxs("label",{className:"switch",children:[e.jsx("input",{type:"checkbox",checked:s.deleteBuildAssets,onChange:a=>i({...s,deleteBuildAssets:a.target.checked})}),e.jsx("span",{className:"slider round"})]}),e.jsx("span",{className:"toggle-label",children:s.deleteBuildAssets?"ENABLED":"DISABLED"})]})}),e.jsxs(o,{icon:e.jsx(z,{size:16}),title:e.jsxs("span",{className:"card-title-row",children:["Cleanup Orchestration",r.schedule&&e.jsx("span",{className:"modified-dot","aria-label":"Modified"})]}),description:"Standardized Cron syntax for scheduling the automated cleanup engine.",children:[e.jsx("div",{className:"setting-input-wrapper",children:e.jsx("input",{type:"text",placeholder:"e.g. 0 0 * * * (Midnight)",value:s.buildCleanupSchedule,onChange:a=>i({...s,buildCleanupSchedule:a.target.value})})}),e.jsx("div",{className:"cron-presets",children:e.jsx("div",{className:"presets-grid",children:P.map(a=>{const t=s.buildCleanupSchedule===a.value;return e.jsxs("button",{type:"button",className:`preset-chip ${t?"active":""}`,onClick:()=>i({...s,buildCleanupSchedule:a.value}),"aria-pressed":t,children:[t&&e.jsx(L,{size:11,className:"preset-chip__check"}),e.jsx("span",{children:a.label})]},a.label)})})})]})]}),e.jsxs("div",{className:"health-monitor-alert maintenance-notice",children:[e.jsx(A,{size:18}),e.jsxs("span",{children:[e.jsx("strong",{children:"Resource Notice:"})," Bulk purging operations are non-blocking and execute at low priority to ensure zero interference with active test execution."]})]})]}),(x||h)&&e.jsx(B,{onSave:()=>g(),onDiscard:j,onRestoreDefaults:f,isSaving:h,isDirty:x,saveLabel:"Save Configuration"})]})};export{X as MaintenanceSettings};
@@ -1,11 +0,0 @@
1
- import{g as B,r as g,X as y,j as e,u as U,T as X,S as Y}from"./index-BrVV0Kla.js";import{u as z}from"./useSocket-Bkt5i-U6.js";import{F as V}from"./funnel-D2rLIKlM.js";import{T as W,M as K}from"./tablet-CaOqzQv_.js";import{A as Q}from"./activity-DK3R5GAb.js";import{P as G}from"./plus-BObE-_z6.js";/**
2
- * @license lucide-react v0.555.0 - ISC
3
- *
4
- * This source code is licensed under the ISC license.
5
- * See the LICENSE file in the root directory of this source tree.
6
- */const J=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"m12 5 7 7-7 7",key:"xquz4c"}]],Z=B("arrow-right",J);/**
7
- * @license lucide-react v0.555.0 - ISC
8
- *
9
- * This source code is licensed under the ISC license.
10
- * See the LICENSE file in the root directory of this source tree.
11
- */const ee=[["path",{d:"M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z",key:"10ikf1"}]],se=B("play",ee),F=20;function te(s,n){if(!s)return!1;const t=Date.parse(s);return Number.isFinite(t)&&Date.now()-t<n}function ne(s){const t=new Date().getHours(),c=[];for(let a=0;a<24;a++){const d=(t-(23-a)+24)%24;c.push({hour:`${String(d).padStart(2,"0")}:00`,sessions:0,heals:0})}const u=Date.now()-24*60*60*1e3;let i=0;for(const a of s){const d=a.startTime?Date.parse(a.startTime):NaN;if(!Number.isFinite(d)||d<u)continue;const o=23-Math.floor((Date.now()-d)/(60*60*1e3));o>=0&&o<24&&(c[o].sessions+=1,i+=1)}return{trend:c,total:i}}function re(s){const n=new Map;for(const i of s){const a=i.platform||i.device_platform||"unknown",d=i.platformVersion||i.version||i.device_version||"",h=a==="ios"?"iOS":a==="tvos"?"tvOS":a.charAt(0).toUpperCase()+a.slice(1),o=d?`${h} ${d}`:h;n.set(o,(n.get(o)??0)+1)}const t=Array.from(n.entries()).sort((i,a)=>a[1]-i[1]);if(t.length<=6)return t.map(([i,a])=>({label:i,count:a}));const c=t.slice(0,5),u=t.slice(5).reduce((i,[,a])=>i+a,0);return[...c.map(([i,a])=>({label:i,count:a})),{label:"Other",count:u}]}function ae(s){return s.deviceName||(s.deviceUdid?s.deviceUdid.slice(0,8):"device")}function _(s){const n=s.commandName||"selector",t=ae(s);return s.tier?e.jsxs(e.Fragment,{children:[e.jsx("strong",{children:s.tier})," healed ",e.jsx("strong",{children:n})," on ",e.jsx("strong",{children:t})]}):e.jsxs(e.Fragment,{children:["Healed ",e.jsx("strong",{children:n})," on ",e.jsx("strong",{children:t})]})}function ie(){const[s,n]=g.useState([]),[t,c]=g.useState([]),[u,i]=g.useState(0),[a,d]=g.useState([]),[h,o]=g.useState(null),{on:p}=z(),w=g.useRef(0);g.useEffect(()=>{let m=!1;return y.getDevices().then(l=>{!m&&Array.isArray(l)&&n(l)}).catch(()=>{}),y.getSessions().then(l=>{!m&&Array.isArray(l)&&c(l)}).catch(()=>{}),y.getPendingSessionsCount().then(l=>{if(m)return;const N=typeof l=="number"?l:typeof(l==null?void 0:l.count)=="number"?l.count:0;i(N)}).catch(()=>{}),y.getRecentHealingEvents().then(l=>{if(m||!l)return;o(typeof l.todayCount=="number"?l.todayCount:0);const N=Array.isArray(l.events)?l.events:[];N.length!==0&&d(S=>{const T=new Set(S.map(f=>f.id));return[...N.filter(f=>!T.has(f.id)).map(f=>({id:f.id,ts:Date.parse(f.createdAt)||Date.now(),kind:"heal",message:_(f)})),...S].sort((f,r)=>r.ts-f.ts).slice(0,F)})}).catch(()=>{}),()=>{m=!0}},[]),g.useEffect(()=>{const m=[],l=(r,x)=>{w.current+=1;const b={id:`${Date.now()}-${w.current}`,ts:Date.now(),kind:r,message:x};d(v=>[b,...v].slice(0,F))},N=r=>{var v;r&&r.session&&c(j=>j.find(C=>C.id===r.session.id)?j:[r.session,...j]);const x=((v=r==null?void 0:r.session)==null?void 0:v.id)||(r==null?void 0:r.sessionId)||"",b=x?x.slice(0,6):"";l("session",e.jsxs(e.Fragment,{children:["Session ",e.jsx("strong",{children:b||"—"})," started"]}))},S=r=>{var j,A;const x=((j=r==null?void 0:r.session)==null?void 0:j.id)||(r==null?void 0:r.sessionId)||"",b=!!((A=r==null?void 0:r.session)!=null&&A.failure_reason||r!=null&&r.failure_reason);x&&c(C=>C.map(E=>E.id===x?{...E,status:b?"failed":"finished"}:E));const v=x?x.slice(0,6):"";l(b?"session-failed":"session-end",b?e.jsxs(e.Fragment,{children:["Session ",e.jsx("strong",{children:v||"—"})," failed"]}):e.jsxs(e.Fragment,{children:["Session ",e.jsx("strong",{children:v||"—"})," ended"]}))},T=r=>{const x=(r==null?void 0:r.nodeId)||(r==null?void 0:r.id)||"node";l("node",e.jsxs(e.Fragment,{children:["Node ",e.jsx("strong",{children:String(x)})," connected"]}))},M=r=>{const x=(r==null?void 0:r.nodeId)||(r==null?void 0:r.id)||"node";l("node",e.jsxs(e.Fragment,{children:["Node ",e.jsx("strong",{children:String(x)})," disconnected"]}))},f=r=>{const x=r;if(!x||!x.id)return;o(v=>v===null?1:v+1),w.current+=1;const b={id:x.id,ts:Date.parse(x.createdAt)||Date.now(),kind:"heal",message:_(x)};d(v=>v.some(j=>j.id===b.id)?v:[b,...v].slice(0,F))};return m.push(p("session_started",N)),m.push(p("session_stopped",S)),m.push(p("node_connected",T)),m.push(p("node_disconnected",M)),m.push(p("healing_event",f)),()=>{m.forEach(r=>r&&r())}},[p]);const D=t.filter(m=>m.status==="running"),R=t.filter(m=>m.failure_reason&&te(m.endTime||m.startTime,24*60*60*1e3)).length,{trend:L,total:q}=g.useMemo(()=>ne(t),[t]),P=g.useMemo(()=>re(s),[s]);return{devices:s,activeSessions:D,queuedSessions:u,healsToday:h,failures24h:R,failuresDelta:null,activity:a,sessionTrend:L,totalSessions24h:q,osBreakdown:P}}const oe={healthy:"bg-[var(--green)]",neutral:"bg-[var(--border-strong)]",warn:"bg-[var(--amber)]",critical:"bg-[var(--red)]"},le={healthy:"bg-[var(--green)]",neutral:"bg-[var(--text-dim)]",warn:"bg-[var(--amber)]",critical:"bg-[var(--red)]"},ce={healthy:"text-[var(--green)]",neutral:"text-[var(--text-muted)]",warn:"text-[var(--amber)]",critical:"text-[var(--red)]"},k=({label:s,value:n,secondaryValue:t,subtitle:c,state:u="neutral"})=>e.jsxs("div",{className:"relative overflow-hidden rounded-lg border border-[var(--border)] bg-[var(--surface)] p-4 hover:border-[var(--border-strong)] transition-colors",children:[e.jsx("span",{className:`absolute left-0 top-0 bottom-0 w-[2px] ${oe[u]}`}),e.jsx("div",{className:"text-[10px] font-mono font-semibold uppercase tracking-widest text-[var(--text-muted)]",children:s}),e.jsxs("div",{className:"mt-3 flex items-baseline gap-2",children:[e.jsx("span",{className:"text-3xl font-semibold text-[var(--text)] tabular-nums",children:n}),t!=null&&e.jsxs("span",{className:"text-sm font-mono text-[var(--text-dim)]",children:["/ ",t]})]}),e.jsxs("div",{className:`mt-3 flex items-center gap-1.5 text-xs ${ce[u]}`,children:[e.jsx("span",{className:`h-1.5 w-1.5 rounded-full ${le[u]}`}),e.jsx("span",{children:c})]})]});function I(s){return s.offline?"offline":s.reservedBy?"reserved":s.busy?"busy":"ready"}function de(s){const n=(s.platform||"").toLowerCase();return n==="tvos"?X:/pad|tablet/i.test(s.name||"")?W:n==="ios"||n==="android"?Y:K}const xe={ready:{dot:"bg-[var(--green)]",text:"text-[var(--green)]",label:"READY"},busy:{dot:"bg-[var(--amber)]",text:"text-[var(--amber)]",label:"BUSY"},reserved:{dot:"bg-[var(--blue)]",text:"text-[var(--blue)]",label:"RESERVED"},offline:{dot:"bg-[var(--text-dim)]",text:"text-[var(--text-dim)]",label:"OFFLINE"}};function me(s){return s?s.length<=16?s:`${s.slice(0,8)}…${s.slice(-4)}`:""}const ue=({devices:s,maxRows:n=6})=>{const[t,c]=g.useState("all"),u=U(),i=(t==="all"?s:s.filter(a=>I(a)!=="ready")).slice(0,n);return e.jsxs("section",{className:"rounded-lg border border-[var(--border)] bg-[var(--surface)] flex flex-col",children:[e.jsxs("header",{className:"flex items-center justify-between px-4 py-3 border-b border-[var(--border)]",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--text)]",children:"Fleet status"}),e.jsxs("span",{className:"text-xs font-mono text-[var(--text-dim)]",children:[s.length," devices"]})]}),e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsxs("div",{className:"flex items-center gap-0.5 bg-[var(--surface-2)] border border-[var(--border)] rounded-md p-0.5",children:[e.jsx("button",{type:"button",onClick:()=>c("all"),className:`px-2 py-1 text-[11px] rounded transition-colors ${t==="all"?"bg-[var(--border-strong)] text-[var(--text)]":"text-[var(--text-dim)] hover:text-[var(--text)]"}`,children:"All"}),e.jsxs("button",{type:"button",onClick:()=>c("issues"),className:`px-2 py-1 text-[11px] rounded transition-colors flex items-center gap-1 ${t==="issues"?"bg-[var(--border-strong)] text-[var(--text)]":"text-[var(--text-dim)] hover:text-[var(--text)]"}`,children:[e.jsx(V,{className:"h-3 w-3"}),"Non-ready"]})]}),e.jsxs("button",{type:"button",onClick:()=>u("/devices"),className:"ml-1 inline-flex items-center gap-1 text-xs text-[var(--text-muted)] hover:text-[var(--text)] transition-colors",children:["View all ",e.jsx(Z,{className:"h-3 w-3"})]})]})]}),e.jsx("div",{className:"divide-y divide-[var(--border)]",children:i.length===0?e.jsx("div",{className:"px-4 py-8 text-center text-xs text-[var(--text-dim)]",children:t==="issues"?"All devices are ready.":"No devices registered."}):i.map(a=>{const d=de(a),h=xe[I(a)];return e.jsxs("button",{type:"button",onClick:()=>a.udid&&u(`/devices/${a.udid}/control/screen`),className:"w-full flex items-center gap-3 px-4 py-2.5 hover:bg-[var(--surface-2)] transition-colors text-left",children:[e.jsx("span",{className:`h-1.5 w-1.5 rounded-full shrink-0 ${h.dot}`}),e.jsx(d,{className:"h-4 w-4 text-[var(--text-dim)] shrink-0"}),e.jsxs("div",{className:"flex-1 min-w-0 flex items-center gap-3",children:[e.jsx("div",{className:"min-w-0 flex-1",children:e.jsx("div",{className:"text-xs text-[var(--text)] truncate",children:a.name||a.udid})}),e.jsxs("div",{className:"hidden md:block text-[11px] font-mono text-[var(--text-dim)] w-24 text-right",children:[(a.platform||"").toUpperCase()," ",a.sdk||""]}),e.jsx("div",{className:"hidden lg:block text-[11px] font-mono text-[var(--text-dim)] w-32 text-right",children:me(a.udid)})]}),e.jsx("span",{className:`font-mono text-[10px] font-semibold tracking-wider w-20 text-right ${h.text}`,children:h.label})]},a.udid||a.name)})})]})},he={session:"bg-[var(--green)]","session-end":"bg-[var(--text-dim)]","session-failed":"bg-[var(--red)]",node:"bg-[var(--blue)]",heal:"bg-[var(--amber)]"};function ve(s){const n=new Date(s);return`${String(n.getHours()).padStart(2,"0")}:${String(n.getMinutes()).padStart(2,"0")}`}const fe=[{tag:"session.start",desc:"when a new session begins"},{tag:"device.heal",desc:"when a device self-recovers"},{tag:"fleet.offline",desc:"when a device drops offline"}],ge=({events:s,live:n=!0})=>e.jsxs("section",{className:"rounded-lg border border-[var(--border)] bg-[var(--surface)] flex flex-col",children:[e.jsx("header",{className:"flex items-center justify-between px-4 py-3 border-b border-[var(--border)]",children:e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--text)]",children:"Recent activity"}),e.jsxs("span",{className:"flex items-center gap-1 text-[10px] font-mono text-[var(--text-dim)] uppercase tracking-widest",children:[e.jsx("span",{className:`h-1.5 w-1.5 rounded-full ${n?"bg-[var(--green)] pulse-dot":"bg-[var(--text-dim)]"}`}),n?"Live":"Offline"]})]})}),s.length===0?e.jsxs("div",{className:"flex-1 flex flex-col items-center justify-center px-6 py-10 text-center gap-2",children:[e.jsx("div",{className:"h-10 w-10 rounded-full bg-[var(--surface-2)] border border-[var(--border)] flex items-center justify-center",children:e.jsx(Q,{className:"h-5 w-5 text-[var(--text-dim)]"})}),e.jsx("div",{className:"text-sm font-medium text-[var(--text)]",children:"No activity yet"}),e.jsx("div",{className:"text-xs text-[var(--text-dim)] max-w-xs",children:"Start a session to see events stream here in real-time."}),e.jsxs("button",{type:"button",onClick:()=>window.dispatchEvent(new CustomEvent("xenon.open-command-palette")),className:"mt-2 inline-flex items-center gap-1.5 text-xs text-[var(--text)] border border-[var(--border-strong)] hover:border-[var(--green)]/50 hover:text-[var(--green)] rounded-md px-3 py-1.5 transition-colors",children:[e.jsx(se,{className:"h-3 w-3"})," Start a session"]}),e.jsxs("div",{className:"mt-4 w-full max-w-xs text-left",children:[e.jsx("div",{className:"text-[10px] font-mono uppercase tracking-widest text-[var(--text-dim)] mb-2",children:"Event types you'll see"}),e.jsx("div",{className:"space-y-1",children:fe.map(t=>e.jsxs("div",{className:"flex items-baseline gap-2 text-[11px]",children:[e.jsx("span",{className:"font-mono text-[var(--green)]",children:t.tag}),e.jsxs("span",{className:"text-[var(--text-dim)] truncate",children:["— ",t.desc]})]},t.tag))})]})]}):e.jsx("div",{className:"flex-1 overflow-y-auto divide-y divide-[var(--border)]",children:s.map(t=>e.jsxs("div",{className:"flex items-center gap-3 px-4 py-2.5",children:[e.jsx("span",{className:"font-mono text-[10px] text-[var(--text-dim)] w-10 shrink-0",children:ve(t.ts)}),e.jsx("span",{className:`h-1.5 w-1.5 rounded-full shrink-0 ${he[t.kind]}`}),e.jsx("span",{className:"text-xs text-[var(--text-muted)] truncate",children:t.message})]},t.id))})]}),be=({data:s,totalSessions:n,totalHeals:t})=>{var a,d,h;const c=Math.max(1,...s.map(o=>o.sessions)),u=s.length-1,i=Math.floor(s.length/2);return e.jsxs("section",{className:"rounded-lg border border-[var(--border)] bg-[var(--surface)]",children:[e.jsxs("header",{className:"flex items-start justify-between px-4 py-3 border-b border-[var(--border)]",children:[e.jsxs("div",{children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--text)]",children:"Session activity"}),e.jsx("div",{className:"text-xs text-[var(--text-dim)] mt-0.5",children:"Last 24 hours"})]}),e.jsxs("div",{className:"flex items-center gap-4 text-right",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-[10px] font-mono uppercase tracking-widest text-[var(--text-dim)]",children:"Sessions"}),e.jsx("div",{className:"text-base font-semibold text-[var(--text)] tabular-nums",children:n})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-[10px] font-mono uppercase tracking-widest text-[var(--text-dim)]",children:"Heals"}),e.jsx("div",{className:"text-base font-semibold text-[var(--green)] tabular-nums",children:t})]})]})]}),e.jsxs("div",{className:"p-4",children:[e.jsx("div",{className:"flex items-end gap-1 h-32",children:s.map((o,p)=>{const w=o.sessions/c*100,D=o.heals/c*100;return e.jsxs("div",{className:"group relative flex-1 h-full flex flex-col justify-end",children:[o.heals>0&&e.jsx("div",{className:"absolute bottom-0 left-0 right-0 rounded-sm bg-[var(--green)]/40",style:{height:`${D}%`},"aria-hidden":!0}),e.jsx("div",{className:"relative w-full rounded-sm bg-[var(--border-strong)] group-hover:bg-[var(--green)] transition-colors",style:{height:`${Math.max(w,2)}%`},"aria-label":`${o.hour} — ${o.sessions} sessions, ${o.heals} heals`}),e.jsxs("div",{className:"pointer-events-none absolute -top-12 left-1/2 -translate-x-1/2 whitespace-nowrap rounded-md bg-[var(--surface-2)] border border-[var(--border-strong)] px-2 py-1 text-[10px] opacity-0 group-hover:opacity-100 transition-opacity z-10 shadow-lg",children:[e.jsx("div",{className:"font-mono text-[var(--text-dim)]",children:o.hour}),e.jsxs("div",{className:"text-[var(--text)]",children:[o.sessions," sessions · ",o.heals," heals"]})]})]},p)})}),e.jsxs("div",{className:"flex justify-between mt-2 text-[10px] font-mono text-[var(--text-dim)]",children:[e.jsx("span",{children:(a=s[0])==null?void 0:a.hour}),e.jsx("span",{children:(d=s[i])==null?void 0:d.hour}),e.jsx("span",{children:(h=s[u])==null?void 0:h.hour})]})]})]})};function H(s){const n=s.toLowerCase();return n.startsWith("tvos")?"bg-[var(--green)]":n.startsWith("ios")?"bg-[var(--blue)]":n.startsWith("android")?"bg-[var(--amber)]":n==="other"?"bg-[var(--border-strong)]":"bg-[var(--green-dim)]"}const pe=({rows:s})=>{const n=s.reduce((t,c)=>t+c.count,0);return e.jsxs("section",{className:"rounded-lg border border-[var(--border)] bg-[var(--surface)]",children:[e.jsxs("header",{className:"px-4 py-3 border-b border-[var(--border)]",children:[e.jsx("h2",{className:"text-sm font-semibold text-[var(--text)]",children:"Fleet composition"}),e.jsxs("div",{className:"text-xs text-[var(--text-dim)] mt-0.5",children:["By operating system · ",n," ",n===1?"device":"devices"]})]}),n===0?e.jsx("div",{className:"px-4 py-8 text-center text-xs text-[var(--text-dim)]",children:"No devices to break down."}):e.jsxs("div",{className:"p-4 space-y-3",children:[e.jsx("div",{className:"h-2 w-full rounded-full overflow-hidden flex bg-[var(--surface-2)]",children:s.map(t=>e.jsx("div",{className:`${H(t.label)} h-full`,style:{width:`${t.count/n*100}%`},title:`${t.label}: ${t.count}`},t.label))}),e.jsx("div",{className:"space-y-1.5",children:s.map(t=>e.jsxs("div",{className:"flex items-center justify-between text-xs",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("span",{className:`h-2 w-2 rounded-sm ${H(t.label)}`}),e.jsx("span",{className:"font-mono text-[var(--text)]",children:t.label})]}),e.jsxs("div",{className:"flex items-center gap-3 font-mono text-[var(--text-dim)]",children:[e.jsx("span",{className:"tabular-nums",children:t.count}),e.jsxs("span",{className:"tabular-nums w-10 text-right",children:[Math.round(t.count/n*100),"%"]})]})]},t.label))})]})]})},O="—",$="Xenon",$e=()=>{const s=ie(),n=s.devices.length,t=s.devices.filter(o=>!o.offline).length,c=n?Math.round(t/n*100):null,u=n===0?"neutral":t===n?"healthy":"warn",i=s.activeSessions.length>0?"healthy":s.queuedSessions>0?"warn":"neutral",a=s.failures24h>0?"critical":"healthy",d=()=>window.dispatchEvent(new CustomEvent("xenon.open-command-palette")),h=new Date().getFullYear();return e.jsx("div",{className:"flex-1 min-w-0 overflow-y-auto",children:e.jsxs("div",{className:"max-w-7xl mx-auto px-6 py-6",children:[e.jsxs("div",{className:"flex items-start justify-between gap-4 mb-6",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-2 text-[10px] font-mono uppercase tracking-widest text-[var(--text-dim)] mb-1.5",children:[e.jsx("span",{children:$}),e.jsx("span",{children:"/"}),e.jsx("span",{className:"text-[var(--text-muted)]",children:"Overview"})]}),e.jsxs("h1",{className:"text-2xl font-semibold tracking-tight text-[var(--text)]",children:[$," ",e.jsx("span",{className:"text-[var(--text-dim)]",children:"·"})," Overview"]}),e.jsx("p",{className:"text-sm text-[var(--text-muted)] mt-1",children:"Real-time fleet health and session activity."})]}),e.jsxs("button",{type:"button",onClick:d,className:"inline-flex items-center gap-1.5 h-9 px-3.5 rounded-md bg-[var(--green)] hover:bg-[var(--green-dim)] text-black text-sm font-medium transition-colors shadow-sm",children:[e.jsx(G,{className:"h-4 w-4"}),"New session"]})]}),e.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-3 mb-6",children:[e.jsx(k,{label:"Devices online",value:n===0?O:t,secondaryValue:n===0?void 0:n,subtitle:n===0?"No devices registered":c===100?"100% fleet uptime":`${c}% fleet uptime`,state:u}),e.jsx(k,{label:"Active sessions",value:s.activeSessions.length,subtitle:s.queuedSessions>0?`${s.queuedSessions} queued`:"No queue",state:i}),e.jsx(k,{label:"Heals today",value:s.healsToday===null?O:s.healsToday,subtitle:s.healsToday===null?"Loading…":s.healsToday===0?"No heals needed":`${s.healsToday} selector${s.healsToday===1?"":"s"} recovered`,state:s.healsToday&&s.healsToday>0?"warn":"neutral"}),e.jsx(k,{label:"Failures (24h)",value:s.failures24h,subtitle:s.failures24h===0?"No failures":`${s.failures24h} session${s.failures24h===1?"":"s"} failed`,state:a})]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-2 gap-3 mb-3",children:[e.jsx(ue,{devices:s.devices}),e.jsx(ge,{events:s.activity,live:!0})]}),e.jsxs("div",{className:"grid grid-cols-1 lg:grid-cols-3 gap-3",children:[e.jsx("div",{className:"lg:col-span-2",children:e.jsx(be,{data:s.sessionTrend,totalSessions:s.totalSessions24h,totalHeals:s.healsToday??0})}),e.jsx(pe,{rows:s.osBreakdown})]}),e.jsxs("footer",{className:"mt-12 pt-6 pb-8 border-t border-[var(--border)] flex flex-col sm:flex-row items-center justify-between gap-4 text-xs text-[var(--text-dim)]",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("span",{className:"font-medium text-[var(--text)]",children:[$," Device Ops"]}),e.jsx("span",{className:"hidden sm:inline-block h-3 w-px bg-[var(--border)]"}),e.jsx("span",{className:"hidden sm:inline-block",children:"Intelligent Fleet Management"})]}),e.jsxs("div",{className:"flex items-center gap-6",children:[e.jsxs("div",{className:"flex items-center gap-1.5",children:[e.jsxs("span",{className:"relative flex h-2 w-2",children:[e.jsx("span",{className:"animate-ping absolute inline-flex h-full w-full rounded-full bg-[var(--green)] opacity-75"}),e.jsx("span",{className:"relative inline-flex rounded-full h-2 w-2 bg-[var(--green)]"})]}),e.jsx("span",{children:"Systems operational"})]}),e.jsxs("span",{className:"font-mono",children:["© ",h," ",$]})]})]})]})})};export{$e as default};
@@ -1 +0,0 @@
1
- import{b as j,r as o,j as e,D as g,v as k}from"./index-BrVV0Kla.js";import{C as N}from"./copy-CEcFYYHm.js";import{T as S}from"./trash-2-CE5TRHb2.js";function T(){const{me:t}=j(),[r,n]=o.useState(""),[d,i]=o.useState(""),[b,h]=o.useState(""),[x,c]=o.useState(!1),[m,u]=o.useState(null);async function l(a){if(a.preventDefault(),u(null),d!==b){u({kind:"err",text:"Passwords do not match."});return}c(!0);try{await g(r,d),u({kind:"ok",text:"Password updated. Other sessions for your account were signed out."}),n(""),i(""),h("")}catch(s){u({kind:"err",text:s.message})}finally{c(!1)}}return e.jsxs("div",{className:"max-w-md",children:[(t==null?void 0:t.role)==="MEMBER"&&(t.teams.length>0?e.jsxs("div",{className:"mb-6",children:[e.jsx("div",{className:"text-xs text-[var(--text-dim)] uppercase tracking-wide mb-2",children:"Your Teams"}),e.jsx("div",{className:"flex flex-wrap gap-2",children:t.teams.map(a=>e.jsx("span",{className:"inline-block px-2 py-1 rounded bg-[var(--surface)] border border-[var(--border)] text-xs",children:a.name},a.id))})]}):e.jsx("div",{className:"mb-6 text-xs text-[var(--text-dim)]",children:"You're not on any team — ask an admin to add you so you can see team-scoped devices."})),e.jsxs("form",{onSubmit:l,children:[e.jsx("h2",{className:"text-xl font-semibold mb-4",children:"Update Password"}),["oldPassword","newPassword","confirm"].map(a=>e.jsxs("div",{className:"mb-3",children:[e.jsx("label",{className:"block text-xs text-[var(--text-dim)] mb-1",children:a==="oldPassword"?"Current password":a==="newPassword"?"New password":"Confirm new password"}),e.jsx("input",{type:"password",value:a==="oldPassword"?r:a==="newPassword"?d:b,onChange:s=>{a==="oldPassword"?n(s.target.value):a==="newPassword"?i(s.target.value):h(s.target.value)},className:"w-full h-10 px-3 rounded-md bg-[var(--surface)] border border-[var(--border)] text-sm"})]},a)),m&&e.jsx("div",{className:`text-xs mb-3 ${m.kind==="ok"?"text-[var(--green)]":"text-[var(--red)]"}`,children:m.text}),e.jsx("button",{type:"submit",disabled:x||d.length<8,className:"h-10 px-4 rounded-md bg-[var(--green)] text-black font-medium text-sm disabled:opacity-50",children:x?"Updating…":"Update Password"})]})]})}const f="/xenon/api/profile";async function P(){const t=await fetch(`${f}/tokens`,{credentials:"include"});if(!t.ok)throw new Error(`listTokens failed (${t.status})`);return t.json()}async function A(t,r,n){const d=await fetch(`${f}/tokens`,{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:t,scopes:r,expiresAt:n??void 0})});if(!d.ok){const i=await d.json().catch(()=>({}));throw new Error(i.error||`createToken failed (${d.status})`)}return d.json()}async function C(t){const r=await fetch(`${f}/tokens/${t}`,{method:"DELETE",credentials:"include"});if(!r.ok&&r.status!==204)throw new Error(`deleteToken failed (${r.status})`)}async function E(){const t=await fetch(`${f}/access-key`,{credentials:"include"});if(!t.ok)throw new Error(`getAccessKey failed (${t.status})`);return(await t.json()).accessKey}async function D(){const t=await fetch(`${f}/access-key/rotate`,{method:"POST",credentials:"include"});if(!t.ok)throw new Error(`rotateAccessKey failed (${t.status})`);return(await t.json()).accessKey}const v={"7d":"7 days","30d":"30 days","90d":"90 days","1y":"1 year",never:"No expiry"},$={"7d":7,"30d":30,"90d":90,"1y":365};function w(t){if(t==="never")return null;const r=$[t]*24*60*60*1e3;return new Date(Date.now()+r).toISOString()}function L({onClose:t,onCreated:r}){const[n,d]=o.useState(""),[i,b]=o.useState("30d"),[h,x]=o.useState(!1),[c,m]=o.useState(null);async function u(l){l.preventDefault(),x(!0),m(null);try{const a=w(i),s=await A(n,void 0,a);r({name:n,token:s.token,expiresAt:s.expiresAt})}catch(a){m(a.message)}finally{x(!1)}}return e.jsx("div",{className:"fixed inset-0 z-30 bg-black/50 flex items-center justify-center",role:"dialog","aria-modal":"true",children:e.jsxs("form",{onSubmit:u,className:"bg-[var(--bg)] border border-[var(--border)] rounded-lg w-full max-w-md p-6",children:[e.jsx("h3",{className:"text-lg font-semibold mb-4",children:"Generate Identity Token"}),e.jsx("label",{className:"block text-xs text-[var(--text-dim)] mb-1",children:"Description"}),e.jsx("input",{autoFocus:!0,value:n,onChange:l=>d(l.target.value),placeholder:"e.g. mac, CI, etc.",required:!0,className:"w-full mb-4 h-10 px-3 rounded-md bg-[var(--surface)] border border-[var(--border)] text-sm"}),e.jsx("label",{className:"block text-xs text-[var(--text-dim)] mb-1",children:"Expires after"}),e.jsx("select",{value:i,onChange:l=>b(l.target.value),className:"w-full mb-1 h-10 px-3 rounded-md bg-[var(--surface)] border border-[var(--border)] text-sm",children:Object.keys(v).map(l=>e.jsx("option",{value:l,children:v[l]},l))}),e.jsx("p",{className:"text-[11px] text-[var(--text-dim)] mb-4",children:i==="never"?"Token never expires. Rotate manually when needed.":`Token will stop working on ${new Date(w(i)).toLocaleDateString()}.`}),c&&e.jsx("div",{className:"text-xs text-[var(--red)] mb-2",children:c}),e.jsxs("div",{className:"flex justify-end gap-2",children:[e.jsx("button",{type:"button",onClick:t,className:"h-9 px-3 rounded-md border border-[var(--border)] text-sm",children:"Cancel"}),e.jsx("button",{type:"submit",disabled:h||!n,className:"h-9 px-4 rounded-md bg-[var(--green)] text-black text-sm font-medium disabled:opacity-50",children:h?"Creating…":"Create"})]})]})})}function K(){const[t,r]=o.useState(""),[n,d]=o.useState([]),[i,b]=o.useState(!0),[h,x]=o.useState(!1),[c,m]=o.useState(null);async function u(){b(!0);const[s,p]=await Promise.all([E(),P()]);r(s),d(p),b(!1)}o.useEffect(()=>{u()},[]);async function l(){confirm("Rotate access key? Existing tokens stay valid but the old accessKey will stop working immediately.")&&r(await D())}async function a(s){confirm("Delete this token? It will stop working immediately.")&&(await C(s),d(p=>p.filter(y=>y.id!==s)))}return e.jsxs("div",{className:"max-w-3xl",children:[e.jsxs("div",{className:"flex items-center gap-3 mb-6",children:[e.jsx("span",{className:"text-xs text-[var(--text-dim)]",children:"Access Key"}),e.jsx("code",{className:"px-2 py-1 rounded bg-[var(--surface)] border border-[var(--border)] text-xs",children:t||"…"}),e.jsx("button",{onClick:()=>navigator.clipboard.writeText(t),"aria-label":"Copy access key",className:"text-[var(--text-dim)] hover:text-[var(--text)]",children:e.jsx(N,{size:14})}),e.jsx("button",{onClick:l,"aria-label":"Rotate access key",className:"text-[var(--text-dim)] hover:text-[var(--text)]",children:e.jsx(k,{size:14})}),e.jsx("span",{className:"text-[10px] text-[var(--text-dim)] ml-2",children:"Public — paired with a token below"})]}),e.jsxs("div",{className:"flex items-center justify-between mb-3",children:[e.jsx("h2",{className:"text-base font-semibold",children:"Identity Tokens"}),e.jsx("button",{onClick:()=>x(!0),className:"h-9 px-4 rounded-md bg-[var(--green)] text-black font-medium text-sm",children:"Generate New Token"})]}),i?e.jsx("div",{className:"text-sm text-[var(--text-dim)]",children:"Loading…"}):n.length===0?e.jsx("div",{className:"text-sm text-[var(--text-dim)] py-6 text-center border border-dashed border-[var(--border)] rounded-md",children:"No tokens yet — generate one to use programmatically."}):e.jsxs("table",{className:"w-full text-sm",children:[e.jsx("thead",{className:"text-[11px] text-[var(--text-dim)] uppercase tracking-wide",children:e.jsxs("tr",{children:[e.jsx("th",{className:"text-left py-2",children:"Name"}),e.jsx("th",{className:"text-left py-2",children:"Issued"}),e.jsx("th",{className:"text-left py-2",children:"Last Used"}),e.jsx("th",{className:"text-left py-2",children:"Expires"}),e.jsx("th",{className:"w-px"})]})}),e.jsx("tbody",{children:n.map(s=>{const p=s.expiresAt?new Date(s.expiresAt).getTime()<=Date.now():!1;return e.jsxs("tr",{className:"border-t border-[var(--border)]",children:[e.jsx("td",{className:"py-2",children:s.name}),e.jsx("td",{className:"py-2 text-[var(--text-muted)]",children:new Date(s.createdAt).toLocaleString()}),e.jsx("td",{className:"py-2 text-[var(--text-muted)]",children:s.lastUsedAt?new Date(s.lastUsedAt).toLocaleString():"—"}),e.jsx("td",{className:`py-2 ${p?"text-[var(--red)]":"text-[var(--text-muted)]"}`,children:s.expiresAt?`${new Date(s.expiresAt).toLocaleDateString()}${p?" (expired)":""}`:"Never"}),e.jsx("td",{className:"py-2 text-right",children:e.jsx("button",{onClick:()=>a(s.id),"aria-label":"Delete token",className:"text-[var(--red)] hover:opacity-80",children:e.jsx(S,{size:14})})})]},s.id)})})]}),h&&e.jsx(L,{onClose:()=>x(!1),onCreated:s=>{x(!1),m(s),u()}}),c&&e.jsx("div",{className:"fixed inset-0 z-30 bg-black/50 flex items-center justify-center",role:"dialog",children:e.jsxs("div",{className:"bg-[var(--bg)] border border-[var(--border)] rounded-lg w-full max-w-md p-6",children:[e.jsx("h3",{className:"text-base font-semibold mb-2",children:"Token created"}),e.jsx("p",{className:"text-xs text-[var(--text-dim)] mb-3",children:"Copy this now — it will not be shown again."}),e.jsx("code",{className:"block break-all px-3 py-2 rounded bg-[var(--surface)] border border-[var(--border)] text-xs mb-3",children:c.token}),e.jsx("p",{className:"text-[11px] text-[var(--text-dim)] mb-4",children:c.expiresAt?`Expires ${new Date(c.expiresAt).toLocaleDateString()}`:"No expiry — rotate manually."}),e.jsx("div",{className:"flex justify-end",children:e.jsx("button",{onClick:()=>m(null),className:"h-9 px-4 rounded-md bg-[var(--green)] text-black text-sm font-medium",children:"Done"})})]})})]})}function M(){const[t,r]=o.useState("password");return e.jsxs("div",{className:"flex",children:[e.jsxs("nav",{className:"w-56 shrink-0 border-r border-[var(--border)] py-6 px-3",children:[e.jsx("div",{className:"text-sm font-semibold mb-4 px-2",children:"Profile Settings"}),[{id:"password",label:"Password & Authentication"},{id:"tokens",label:"API Tokens"}].map(n=>e.jsx("button",{onClick:()=>r(n.id),className:`block w-full text-left px-3 py-2 text-sm rounded-md mb-1 ${t===n.id?"bg-[var(--green)]/10 text-[var(--green)]":"text-[var(--text)] hover:bg-[var(--surface)]"}`,children:n.label},n.id))]}),e.jsx("section",{className:"flex-1 px-8 py-6",children:t==="password"?e.jsx(T,{}):e.jsx(K,{})})]})}export{M as default};
@@ -1 +0,0 @@
1
- import{c as b,u as f,r as n,d as v,j as e,L as g,e as p}from"./index-BrVV0Kla.js";function j(){const{token:i}=b(),c=f(),[s,r]=n.useState("checking"),[a,m]=n.useState(""),[l,x]=n.useState(""),[o,d]=n.useState(null);n.useEffect(()=>{if(!i){r("invalid");return}v(i).then(t=>r(t?"ready":"invalid"))},[i]);async function u(t){if(t.preventDefault(),d(null),a!==l){d("Passwords do not match.");return}if(a.length<8){d("Password must be at least 8 characters.");return}r("submitting");try{await p(i,a),r("done"),setTimeout(()=>c("/login",{replace:!0}),1500)}catch(h){d(h.message||"Reset failed"),r("ready")}}return s==="checking"?e.jsx("div",{className:"min-h-screen flex items-center justify-center text-sm text-[var(--text-dim)]",children:"Checking link…"}):s==="invalid"?e.jsx("div",{className:"min-h-screen flex items-center justify-center text-center px-6",children:e.jsxs("div",{children:[e.jsx("h1",{className:"text-xl font-semibold mb-3",children:"This link is invalid or expired"}),e.jsx("p",{className:"text-sm text-[var(--text-dim)] mb-6",children:"Reset links are good for 1 hour and single-use. Request a new one."}),e.jsx(g,{to:"/forgot-password",className:"inline-block h-10 px-4 rounded-md bg-[var(--green)] text-black text-sm font-medium leading-10",children:"Request a new link"})]})}):s==="done"?e.jsx("div",{className:"min-h-screen flex items-center justify-center text-center px-6",children:e.jsxs("div",{children:[e.jsx("h1",{className:"text-xl font-semibold mb-3",children:"Password updated"}),e.jsx("p",{className:"text-sm text-[var(--text-dim)]",children:"Redirecting to sign in…"})]})}):e.jsx("div",{className:"min-h-screen w-full flex items-center justify-center bg-[var(--bg)] text-[var(--text)]",children:e.jsxs("form",{onSubmit:u,className:"w-full max-w-sm px-6",children:[e.jsx("h1",{className:"text-2xl font-semibold mb-1",children:"Reset your password"}),e.jsx("p",{className:"text-sm text-[var(--text-dim)] mb-6",children:"Choose a new password to sign in with."}),e.jsx("label",{className:"block text-xs text-[var(--text-dim)] mb-1",children:"New password"}),e.jsx("input",{type:"password",value:a,onChange:t=>m(t.target.value),autoFocus:!0,required:!0,className:"w-full mb-3 h-10 px-3 rounded-md bg-[var(--surface)] border border-[var(--border)] text-sm focus:border-[var(--green)] outline-none"}),e.jsx("label",{className:"block text-xs text-[var(--text-dim)] mb-1",children:"Confirm new password"}),e.jsx("input",{type:"password",value:l,onChange:t=>x(t.target.value),required:!0,className:"w-full mb-3 h-10 px-3 rounded-md bg-[var(--surface)] border border-[var(--border)] text-sm focus:border-[var(--green)] outline-none"}),o&&e.jsx("div",{className:"text-xs text-[var(--red)] mb-3",children:o}),e.jsx("button",{type:"submit",disabled:s==="submitting"||a.length<8,className:"w-full h-10 rounded-md bg-[var(--green)] text-black font-medium text-sm disabled:opacity-50",children:s==="submitting"?"Updating…":"Update password"})]})})}export{j as default};