@xenon-device-management/xenon 1.7.1 → 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 (87) hide show
  1. package/lib/package.json +1 -1
  2. package/lib/public/assets/{ApiKeyGate-DBl_AZ8N.js → ApiKeyGate-BousCIQZ.js} +1 -1
  3. package/lib/public/assets/{BugReportButton-Cz4aeGCX.js → BugReportButton-Gw4lnGnV.js} +1 -1
  4. package/lib/public/assets/{DeviceMosaicView-DP4AanNV.js → DeviceMosaicView-BX2hfhBf.js} +2 -2
  5. package/lib/public/assets/{EmptyState-BwaAbjZt.js → EmptyState-CPOfuV3O.js} +1 -1
  6. package/lib/public/assets/{FieldGroup-CGdoHDQ3.js → FieldGroup-C5UkCHbe.js} +1 -1
  7. package/lib/public/assets/{Modal-OY-an2g6.js → Modal-MMGhL8eW.js} +1 -1
  8. package/lib/public/assets/{SegmentedControl-C_gsCi2P.js → SegmentedControl-CZfAicws.js} +1 -1
  9. package/lib/public/assets/{SettingCard-CRlStb6_.js → SettingCard-Dp7XIdcl.js} +1 -1
  10. package/lib/public/assets/{Table-CbmGiPJe.js → Table-DsN_IX6J.js} +1 -1
  11. package/lib/public/assets/{activity-BhRPBZ3G.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-DS59NYjg.css → apps-CTrGClro.css} +1 -1
  16. package/lib/public/assets/{arrow-left-y_SSjJz-.js → arrow-left-GX0vzYtn.js} +1 -1
  17. package/lib/public/assets/{arrow-up-right-NQ8ZGfd3.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-wz7ra9cW.js → button-ybNY3GYx.js} +1 -1
  21. package/lib/public/assets/{check-CV94AcJF.js → check-BZMx8AhR.js} +1 -1
  22. package/lib/public/assets/{chevron-right-_iIkyWqd.js → chevron-right-WL_bcB02.js} +1 -1
  23. package/lib/public/assets/{circle-check-0COJnxUq.js → circle-check-CI2xUlDo.js} +1 -1
  24. package/lib/public/assets/{circle-x-DGNoObyH.js → circle-x-De3thbcr.js} +1 -1
  25. package/lib/public/assets/{clock-DwtXByAH.js → clock-BFVLE7wW.js} +1 -1
  26. package/lib/public/assets/{copy-DL_iD5Dh.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-aeG6Qqs8.js → download-BDZj44ke.js} +1 -1
  30. package/lib/public/assets/forgot-password-BSYQX2oR.js +1 -0
  31. package/lib/public/assets/{funnel-ChogDM6h.js → funnel-CptlpFZ9.js} +1 -1
  32. package/lib/public/assets/index-BW3kENYH.css +1 -0
  33. package/lib/public/assets/{index-CkwQBzCl.js → index-PtnKslHU.js} +12 -12
  34. package/lib/public/assets/{layers-a5nj78PI.js → layers-DRpwoKhI.js} +1 -1
  35. package/lib/public/assets/{lock-CqQvL12G.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-De_oynWc.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-BeUDGs-O.js → page-header-CSvuGbSO.js} +1 -1
  41. package/lib/public/assets/{plus-BM5UAzcK.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-BWOVdnlp.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-CAA9vrIs.js → shield-JGzamJo5.js} +1 -1
  52. package/lib/public/assets/{shield-alert-Dm3Oz4Kc.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-CWU6hxZF.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-DUWA0N9n.js → trash-2-BrTSfFh5.js} +1 -1
  58. package/lib/public/assets/{useSocket-lsg6f_Dn.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-D8JQHaNH.js → zap-JUbOoK3o.js} +1 -1
  63. package/lib/public/index.html +2 -2
  64. package/package.json +1 -1
  65. package/lib/public/assets/ai-settings-DteGlf4r.js +0 -21
  66. package/lib/public/assets/api-keys-BmikiaSF.js +0 -1
  67. package/lib/public/assets/apps-BfEC5qsb.js +0 -21
  68. package/lib/public/assets/builds-page-DkLt4J8-.js +0 -6
  69. package/lib/public/assets/device-explorer-CKcXaWmZ.css +0 -1
  70. package/lib/public/assets/device-explorer-CpC-MZNT.js +0 -210
  71. package/lib/public/assets/forgot-password-Cu05XOKH.js +0 -1
  72. package/lib/public/assets/index-gXUPv-oo.css +0 -1
  73. package/lib/public/assets/login-DoaCgEPu.js +0 -1
  74. package/lib/public/assets/maintenance-settings-CBnV_5Rl.js +0 -6
  75. package/lib/public/assets/overview-DvyGTzku.js +0 -11
  76. package/lib/public/assets/profile-page-Cner_Muq.js +0 -1
  77. package/lib/public/assets/reset-password-BKWBemnU.js +0 -1
  78. package/lib/public/assets/runbook-page-CXZdhAjc.js +0 -104
  79. package/lib/public/assets/selector-detail-page-C6yA7Lwl.js +0 -1
  80. package/lib/public/assets/selector-health-page-CrR7bh4f.js +0 -16
  81. package/lib/public/assets/session-detail-page-DzW5PcxL.js +0 -13
  82. package/lib/public/assets/settings-COrR3YcC.js +0 -1
  83. package/lib/public/assets/settings-CpRbubta.css +0 -1
  84. package/lib/public/assets/status-pill-outline-3FA5raqd.js +0 -1
  85. package/lib/public/assets/teams-xa_B0pyz.js +0 -1
  86. package/lib/public/assets/users-DJDpKaGy.js +0 -11
  87. package/lib/public/assets/webhook-settings-BPf_iC_h.js +0 -1
@@ -1 +1 @@
1
- .webhook-list-grid{display:flex;flex-direction:column;gap:var(--space-3);margin-bottom:var(--space-5)}.webhook-row-card{background:var(--surface);border:1px solid var(--border-strong);border-radius:var(--radius-lg);padding:16px 20px;box-shadow:var(--shadow-sm);display:flex;flex-direction:column;gap:12px;transition:border-color .15s}.webhook-row-card:hover{border-color:#22c55e4d}.webhook-row-card__header{display:flex;align-items:center;gap:12px}.webhook-row-card__url{flex:1;min-width:0;font-family:JetBrains Mono,monospace;font-size:12.5px;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.webhook-row-card__events{display:flex;flex-wrap:wrap;gap:6px}.webhook-row-card__no-events{font-family:JetBrains Mono,monospace;font-size:11px;color:var(--text-dim)}.event-pill{display:inline-flex;align-items:center;gap:5px;padding:3px 9px;border-radius:999px;font-family:JetBrains Mono,monospace;font-size:10.5px;font-weight:600;letter-spacing:.04em;border:1px solid transparent;line-height:1.4;text-transform:none}.event-pill--red{background:#ef44441a;color:var(--status-error-fg);border-color:#ef44444d}.event-pill--green{background:#22c55e1a;color:var(--green);border-color:#22c55e4d}.event-pill--amber{background:#f59e0b1f;color:var(--amber);border-color:#f59e0b59}.event-pill--gray{background:#ffffff0a;color:var(--text-muted);border-color:var(--border-strong)}.add-webhook-card{background:var(--surface);border:1px solid var(--border-strong);border-radius:var(--radius-lg);box-shadow:var(--shadow-sm);overflow:hidden;margin-top:var(--space-4)}.add-webhook-card__header{display:flex;align-items:center;gap:8px;padding:14px 20px;color:var(--green);font-family:JetBrains Mono,monospace;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.12em;border-bottom:1px solid var(--border);background:#22c55e0a}.add-webhook-card__body{padding:24px;display:flex;flex-direction:column;gap:4px}.add-webhook-card__footer{display:flex;justify-content:flex-end;gap:10px;padding:16px 24px;border-top:1px solid var(--border);background:#00000026}.event-toggle-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:8px}.event-toggle{display:inline-flex;align-items:center;gap:10px;padding:10px 14px;border-radius:var(--radius-md);background:#ffffff06;border:1px solid var(--border-strong);color:var(--text-muted);font-size:13px;font-weight:500;cursor:pointer;transition:border-color .15s,background .15s,color .15s;text-align:left}.event-toggle:hover:not(.is-selected){border-color:#fff3;color:var(--text)}.event-toggle.is-selected{color:var(--text);background:#22c55e0f;border-color:var(--green);box-shadow:inset 0 0 0 1px #22c55e59}.event-toggle__lead{flex-shrink:0}.event-toggle--red.is-selected .event-toggle__lead{color:var(--status-error-fg)}.event-toggle--green.is-selected .event-toggle__lead{color:var(--green)}.event-toggle--amber.is-selected .event-toggle__lead{color:var(--amber)}.event-toggle__check{color:var(--green);margin-left:auto}.template-section{margin-top:var(--space-3);border:1px solid var(--border);border-radius:var(--radius-md);overflow:hidden;background:#00000026}.template-section__toggle{width:100%;display:flex;align-items:center;gap:10px;padding:12px 16px;background:transparent;border:0;color:var(--text);font-family:Inter,sans-serif;font-size:13px;font-weight:600;cursor:pointer;text-align:left;transition:background .15s}.template-section__toggle:hover{background:#ffffff08}.template-section__toggle .tone-amber{color:var(--amber)}.template-section__toggle .tone-dim{color:var(--text-dim)}.template-section__indicator{margin-left:auto;font-size:18px;color:var(--text-dim);line-height:1}.template-editor{padding:16px;border-top:1px solid var(--border);background:#0000001a;display:flex;flex-direction:column;gap:12px}.template-editor__hint{margin:0;color:var(--text-muted);font-size:12px;line-height:1.5}.template-editor__chips{display:flex;flex-wrap:wrap;gap:6px}.template-editor__chip{padding:4px 10px;border-radius:999px;background:#22c55e0f;border:1px solid rgba(34,197,94,.25);color:var(--green);font-family:JetBrains Mono,monospace;font-size:10.5px;cursor:pointer;transition:filter .15s,transform .15s}.template-editor__chip:hover{filter:brightness(1.15);transform:translateY(-1px)}.template-editor__textarea{width:100%;background:#0000004d;border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text);padding:12px 14px;font-family:JetBrains Mono,monospace;font-size:12px;line-height:1.55;resize:vertical;min-height:80px;box-sizing:border-box;transition:border-color .15s}.template-editor__textarea:focus{outline:none;border-color:var(--green);box-shadow:0 0 0 1px var(--green)}
1
+ .webhook-list-grid{display:flex;flex-direction:column;gap:var(--space-3);margin-bottom:var(--space-5)}.webhook-row-card{background:var(--surface);border:1px solid var(--border-strong);border-radius:var(--radius-lg);padding:16px 20px;box-shadow:var(--shadow-sm);display:flex;flex-direction:column;gap:12px;transition:border-color .15s}.webhook-row-card:hover{border-color:#22c55e4d}.webhook-row-card__header{display:flex;align-items:center;gap:12px}.webhook-row-card__url{flex:1;min-width:0;font-family:JetBrains Mono,monospace;font-size:12.5px;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.webhook-row-card__events{display:flex;flex-wrap:wrap;gap:6px}.webhook-row-card__no-events{font-family:JetBrains Mono,monospace;font-size:11px;color:var(--text-dim)}.event-pill{display:inline-flex;align-items:center;gap:5px;padding:3px 9px;border-radius:999px;font-family:JetBrains Mono,monospace;font-size:10.5px;font-weight:600;letter-spacing:.04em;border:1px solid transparent;line-height:1.4;text-transform:none}.event-pill--red{background:#ef44441a;color:var(--status-error-fg);border-color:#ef44444d}.event-pill--green{background:#22c55e1a;color:var(--green);border-color:#22c55e4d}.event-pill--amber{background:#f59e0b1f;color:var(--amber);border-color:#f59e0b59}.event-pill--gray{background:#ffffff0a;color:var(--text-muted);border-color:var(--border-strong)}.add-webhook-card{background:var(--surface);border:1px solid var(--border-strong);border-radius:var(--radius-lg);box-shadow:var(--shadow-sm);overflow:hidden;margin-top:var(--space-4)}.add-webhook-card__header{display:flex;align-items:center;gap:8px;padding:14px 20px;color:var(--green);font-family:JetBrains Mono,monospace;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.12em;border-bottom:1px solid var(--border);background:#22c55e0a}.add-webhook-card__body{padding:24px;display:flex;flex-direction:column;gap:4px}.add-webhook-card__footer{display:flex;justify-content:flex-end;gap:10px;padding:16px 24px;border-top:1px solid var(--border);background:#00000026}.event-toggle-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:8px}.event-toggle{display:inline-flex;align-items:center;gap:10px;padding:10px 14px;border-radius:var(--radius-md);background:#ffffff06;border:1px solid var(--border-strong);color:var(--text-muted);font-size:13px;font-weight:500;cursor:pointer;transition:border-color .15s,background .15s,color .15s;text-align:left}.event-toggle:hover:not(.is-selected){border-color:#fff3;color:var(--text)}.event-toggle.is-selected{color:var(--text);background:#22c55e0f;border-color:var(--green);box-shadow:inset 0 0 0 1px #22c55e59}.event-toggle__lead{flex-shrink:0;color:var(--text-dim)}.event-toggle.is-selected .event-toggle__lead{color:inherit}.event-toggle__check{color:var(--green);margin-left:auto}.event-toggle--red.is-selected{background:#ef44440f;border-color:var(--red);box-shadow:inset 0 0 0 1px #ef444459}.event-toggle--red.is-selected .event-toggle__check,.event-toggle--red.is-selected .event-toggle__lead{color:var(--red)}.event-toggle--amber.is-selected{background:#f59e0b0f;border-color:var(--amber);box-shadow:inset 0 0 0 1px #f59e0b59}.event-toggle--amber.is-selected .event-toggle__check,.event-toggle--amber.is-selected .event-toggle__lead{color:var(--amber)}.event-toggle--green.is-selected{background:#22c55e0f;border-color:var(--green);box-shadow:inset 0 0 0 1px #22c55e59}.event-toggle--green.is-selected .event-toggle__check,.event-toggle--green.is-selected .event-toggle__lead{color:var(--green)}.template-section{margin-top:var(--space-3);border:1px solid var(--border);border-radius:var(--radius-md);overflow:hidden;background:#00000026}.template-section__toggle{width:100%;display:flex;align-items:center;gap:10px;padding:12px 16px;background:transparent;border:0;color:var(--text);font-family:Inter,sans-serif;font-size:13px;font-weight:600;cursor:pointer;text-align:left;transition:background .15s}.template-section__toggle:hover{background:#ffffff08}.template-section__toggle .tone-amber{color:var(--amber)}.template-section__toggle .tone-dim{color:var(--text-dim)}.template-section__indicator{margin-left:auto;font-size:18px;color:var(--text-dim);line-height:1}.template-editor{padding:16px;border-top:1px solid var(--border);background:#0000001a;display:flex;flex-direction:column;gap:12px}.template-editor__hint{margin:0;color:var(--text-muted);font-size:12px;line-height:1.5}.template-editor__chips{display:flex;flex-wrap:wrap;gap:6px}.template-editor__chip{padding:4px 10px;border-radius:999px;background:#22c55e0f;border:1px solid rgba(34,197,94,.25);color:var(--green);font-family:JetBrains Mono,monospace;font-size:10.5px;cursor:pointer;transition:filter .15s,transform .15s}.template-editor__chip:hover{filter:brightness(1.15);transform:translateY(-1px)}.template-editor__textarea{width:100%;background:#0000004d;border:1px solid var(--border);border-radius:var(--radius-md);color:var(--text);padding:12px 14px;font-family:JetBrains Mono,monospace;font-size:12px;line-height:1.55;resize:vertical;min-height:80px;box-sizing:border-box;transition:border-color .15s}.template-editor__textarea:focus{outline:none;border-color:var(--green);box-shadow:0 0 0 1px var(--green)}
@@ -1,4 +1,4 @@
1
- import{g as a}from"./index-CkwQBzCl.js";/**
1
+ import{g as a}from"./index-PtnKslHU.js";/**
2
2
  * @license lucide-react v0.555.0 - ISC
3
3
  *
4
4
  * This source code is licensed under the ISC license.
@@ -24,8 +24,8 @@
24
24
  Learn how to configure a non-root public URL by running `npm run build`.
25
25
  -->
26
26
  <title>Xenon</title>
27
- <script type="module" crossorigin src="/xenon/assets/index-CkwQBzCl.js"></script>
28
- <link rel="stylesheet" crossorigin href="/xenon/assets/index-gXUPv-oo.css">
27
+ <script type="module" crossorigin src="/xenon/assets/index-PtnKslHU.js"></script>
28
+ <link rel="stylesheet" crossorigin href="/xenon/assets/index-BW3kENYH.css">
29
29
  </head>
30
30
 
31
31
  <body>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xenon-device-management/xenon",
3
- "version": "1.7.1",
3
+ "version": "1.7.2",
4
4
  "description": "Xenon - Intelligent Mobile Infrastructure. A self-healing device orchestration platform for Appium.",
5
5
  "main": "./lib/src/index.js",
6
6
  "exports": {
@@ -1,21 +0,0 @@
1
- import{g as p,m as A,r as l,X as m,j as e,s as N,v as k,y as E}from"./index-CkwQBzCl.js";/* empty css */import{S as T,A as z}from"./SettingCard-CRlStb6_.js";import{P as F}from"./page-header-BeUDGs-O.js";import{L as S}from"./lock-CqQvL12G.js";import{C as I}from"./circle-check-0COJnxUq.js";import{A as U}from"./activity-BhRPBZ3G.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 B=[["path",{d:"M12 20v2",key:"1lh1kg"}],["path",{d:"M12 2v2",key:"tus03m"}],["path",{d:"M17 20v2",key:"1rnc9c"}],["path",{d:"M17 2v2",key:"11trls"}],["path",{d:"M2 12h2",key:"1t8f8n"}],["path",{d:"M2 17h2",key:"7oei6x"}],["path",{d:"M2 7h2",key:"asdhe0"}],["path",{d:"M20 12h2",key:"1q8mjw"}],["path",{d:"M20 17h2",key:"1fpfkl"}],["path",{d:"M20 7h2",key:"1o8tra"}],["path",{d:"M7 20v2",key:"4gnj0m"}],["path",{d:"M7 2v2",key:"1i4yhu"}],["rect",{x:"4",y:"4",width:"16",height:"16",rx:"2",key:"1vbyd7"}],["rect",{x:"8",y:"8",width:"8",height:"8",rx:"1",key:"z9xiuo"}]],$=p("cpu",B);/**
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 q=[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20",key:"13o1zl"}],["path",{d:"M2 12h20",key:"9i4pu4"}]],D=p("globe",q);/**
12
- * @license lucide-react v0.555.0 - ISC
13
- *
14
- * This source code is licensed under the ISC license.
15
- * See the LICENSE file in the root directory of this source tree.
16
- */const G=[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]],L=p("server",G);/**
17
- * @license lucide-react v0.555.0 - ISC
18
- *
19
- * This source code is licensed under the ISC license.
20
- * See the LICENSE file in the root directory of this source tree.
21
- */const O=[["path",{d:"M10 8h4",key:"1sr2af"}],["path",{d:"M12 21v-9",key:"17s77i"}],["path",{d:"M12 8V3",key:"13r4qs"}],["path",{d:"M17 16h4",key:"h1uq16"}],["path",{d:"M19 12V3",key:"o1uvq1"}],["path",{d:"M19 21v-5",key:"qua636"}],["path",{d:"M3 14h4",key:"bcjad9"}],["path",{d:"M5 10V3",key:"cb8scm"}],["path",{d:"M5 21v-7",key:"1w1uti"}]],R=p("sliders-vertical",O),b={aiProvider:"gemini",aiModel:"",aiBaseUrl:"",geminiModel:"",openaiModel:"",anthropicModel:"",ollamaModel:"",geminiSet:!1,openaiSet:!1,anthropicSet:!1,aiTemperature:1,aiMaxTokens:4096,aiTopP:1},V=(s,a)=>s.aiProvider===a.aiProvider&&s.aiTemperature===a.aiTemperature&&s.aiMaxTokens===a.aiMaxTokens&&s.aiTopP===a.aiTopP,c=s=>{switch(s){case"gemini":return"gemini-3-flash-preview";case"openai":return"gpt-4o";case"anthropic":return"claude-sonnet-4-6";case"ollama":return"llama3";default:return"—"}},X=s=>{switch(s){case"ollama":return"http://localhost:11434";default:return"Provider default"}},ee=()=>{const{toast:s}=A(),[a,t]=l.useState(b),[h,u]=l.useState(b),[P,g]=l.useState(!0),[x,v]=l.useState(!1),[f,j]=l.useState(!1);l.useEffect(()=>{_()},[]);const _=async()=>{g(!0);try{const i=await m.getGlobalConfig(),n={aiProvider:i.aiProvider||"gemini",aiModel:i.aiModel||"",aiBaseUrl:i.aiBaseUrl||"",geminiModel:i.geminiModel||"",openaiModel:i.openaiModel||"",anthropicModel:i.anthropicModel||"",ollamaModel:i.ollamaModel||"",geminiSet:!!i.geminiSet,openaiSet:!!i.openaiSet,anthropicSet:!!i.anthropicSet,aiTemperature:typeof i.aiTemperature=="number"?i.aiTemperature:1,aiMaxTokens:typeof i.aiMaxTokens=="number"?i.aiMaxTokens:4096,aiTopP:typeof i.aiTopP=="number"?i.aiTopP:1};t(n),u(n)}catch(i){console.error("Failed to load AISettings",i),s("Failed to access AI configuration.","error")}finally{g(!1)}},C=async()=>{v(!0);try{await m.updateGlobalConfig({aiProvider:a.aiProvider,aiTemperature:a.aiTemperature,aiMaxTokens:a.aiMaxTokens,aiTopP:a.aiTopP}),u(a),s("AI engine configuration saved.","success")}catch(i){console.error("Failed to save AISettings",i),s("Failed to persist updates.","error")}finally{v(!1)}},w=async()=>{j(!0);const i=Date.now();try{const n=await m.testAIConfig({aiProvider:a.aiProvider}),r=Date.now()-i;n.success?s(`${n.message} (${r}ms)`,"success"):s(n.message,"error")}catch(n){s(`Connection failed: ${(n==null?void 0:n.message)||"unknown error"}`,"error")}finally{j(!1)}},d=[{id:"gemini",name:"Google Gemini",description:"Gemini 1.5 Pro — Multimodal reasoning",icon:e.jsx("span",{className:"ai-provider-glyph",children:"G"}),isConfigured:!!a.geminiSet},{id:"openai",name:"OpenAI",description:"GPT-4o — OpenAI v1 compatible",icon:e.jsx($,{size:18}),isConfigured:!!a.openaiSet},{id:"anthropic",name:"Anthropic",description:"Claude Sonnet 4.6 — Advanced analysis",icon:e.jsx(N,{size:18}),isConfigured:!!a.anthropicSet},{id:"ollama",name:"Ollama",description:"Local / Self-hosted — No API key required",icon:e.jsx(L,{size:18}),isConfigured:!!a.ollamaModel||!!a.aiModel||!!a.aiBaseUrl}],o=d.find(i=>i.id===a.aiProvider),y=d.filter(i=>i.isConfigured).length,M=!V(a,h);return P?e.jsxs("div",{className:"settings-loading",children:[e.jsx(k,{className:"animate-spin",size:32}),e.jsx("span",{children:"Synchronizing Global State..."})]}):e.jsxs("div",{className:"settings-container",children:[e.jsx(F,{icon:E,title:"AI Engine Configuration",subtitle:e.jsxs(e.Fragment,{children:["All credentials and endpoints are managed via environment variables.",e.jsxs("span",{className:"page-header-subnote",children:[e.jsx(S,{size:12}),"Select the active provider from configured options below."]})]})}),e.jsx("div",{className:"settings-content",children:e.jsxs("div",{className:"settings-grid settings-grid--two-equal",children:[e.jsx(T,{icon:e.jsx(N,{size:16}),title:"Provider Registry",titleExtra:e.jsxs("span",{className:`provider-count-pill ${y>0?"is-ok":"is-empty"}`,children:[y," / ",d.length," CONFIGURED"]}),description:"Providers are activated via environment variables. Select a configured engine to activate.",children:e.jsx("div",{className:"provider-list",children:d.map(i=>{const n=a.aiProvider===i.id,r=i.isConfigured;return e.jsxs("button",{type:"button",className:`provider-row ${n?"is-active":""} ${r?"":"is-disabled"}`,onClick:()=>r&&t({...a,aiProvider:i.id}),disabled:!r,title:r?`Activate ${i.name}`:`Set XENON_${i.id.toUpperCase()}_API_KEY to enable`,children:[e.jsx("div",{className:"provider-row__icon",children:i.icon}),e.jsxs("div",{className:"provider-row__body",children:[e.jsx("div",{className:"provider-row__name",children:i.name}),e.jsx("div",{className:"provider-row__desc",children:i.description}),e.jsx("div",{className:"provider-row__status",children:n?e.jsxs("span",{className:"provider-status provider-status--active",children:[e.jsx(I,{size:11}),"ACTIVE"]}):e.jsxs("span",{className:"provider-status provider-status--off",children:[e.jsx(S,{size:10}),"NOT SET"]})})]})]},i.id)})})}),e.jsxs(T,{icon:e.jsx(D,{size:16}),title:"Runtime Configuration",description:"Environmental overrides for AI model endpoints and identifiers.",children:[e.jsxs("div",{className:"ai-config-display",children:[e.jsxs("div",{className:"ai-config-row",children:[e.jsx("span",{className:"ai-config-label",children:"Active Provider"}),e.jsxs("span",{className:"ai-config-value",children:[o==null?void 0:o.icon,(o==null?void 0:o.name)||"—"]})]}),e.jsxs("div",{className:"ai-config-row",children:[e.jsx("span",{className:"ai-config-label",children:"Model"}),e.jsxs("span",{className:"ai-config-value mono",children:[e.jsxs("span",{children:[a.aiProvider==="gemini"&&(a.geminiModel||a.aiModel||c("gemini")),a.aiProvider==="openai"&&(a.openaiModel||a.aiModel||c("openai")),a.aiProvider==="anthropic"&&(a.anthropicModel||a.aiModel||c("anthropic")),a.aiProvider==="ollama"&&(a.ollamaModel||a.aiModel||c("ollama"))]}),e.jsx("span",{className:"ai-config-default",children:"DEFAULT"})]})]}),e.jsxs("div",{className:"ai-config-row",children:[e.jsx("span",{className:"ai-config-label",children:"Base URL"}),e.jsxs("span",{className:"ai-config-value mono",children:[e.jsx("span",{children:a.aiBaseUrl||X(a.aiProvider)}),!a.aiBaseUrl&&e.jsx("span",{className:"ai-config-default",children:"DEFAULT"})]})]})]}),e.jsxs("div",{className:"model-params",children:[e.jsxs("div",{className:"model-params__header",children:[e.jsx(R,{size:14}),e.jsx("span",{children:"Model Parameters"})]}),e.jsxs("div",{className:"model-param",children:[e.jsxs("div",{className:"model-param__label-row",children:[e.jsx("label",{htmlFor:"ai-temp",children:"TEMPERATURE"}),e.jsx("span",{className:"model-param__value",children:a.aiTemperature.toFixed(1)})]}),e.jsx("input",{id:"ai-temp",type:"range",min:0,max:2,step:.1,value:a.aiTemperature,onChange:i=>t({...a,aiTemperature:parseFloat(i.target.value)}),className:"model-param__slider"})]}),e.jsxs("div",{className:"model-param",children:[e.jsx("div",{className:"model-param__label-row",children:e.jsx("label",{htmlFor:"ai-max-tokens",children:"MAX TOKENS"})}),e.jsx("div",{className:"setting-input-wrapper",children:e.jsx("input",{id:"ai-max-tokens",type:"number",min:256,step:128,value:a.aiMaxTokens,onChange:i=>t({...a,aiMaxTokens:parseInt(i.target.value,10)||0})})})]}),e.jsxs("div",{className:"model-param",children:[e.jsxs("div",{className:"model-param__label-row",children:[e.jsx("label",{htmlFor:"ai-top-p",children:"TOP P"}),e.jsx("span",{className:"model-param__value",children:a.aiTopP.toFixed(2)})]}),e.jsx("input",{id:"ai-top-p",type:"range",min:0,max:1,step:.01,value:a.aiTopP,onChange:i=>t({...a,aiTopP:parseFloat(i.target.value)}),className:"model-param__slider"})]})]}),e.jsxs("button",{type:"button",className:"test-connection-btn",onClick:w,disabled:f||!(o!=null&&o.isConfigured),children:[f?e.jsx(k,{size:14,className:"animate-spin"}):e.jsx(U,{size:14}),e.jsx("span",{children:"Test Connection"})]})]})]})}),(M||x)&&e.jsx(z,{onSave:C,onDiscard:()=>t(h),isSaving:x,isDirty:M,saveLabel:"Save Configuration"})]})};export{ee as AISettings};
@@ -1 +0,0 @@
1
- import{m as ie,r as a,j as e,v as F,K as L,p as ne}from"./index-CkwQBzCl.js";/* empty css */import{T as re,a as le,b as $,c as l,d as oe,e as o}from"./Table-CbmGiPJe.js";import{F as m}from"./FieldGroup-CGdoHDQ3.js";import{P as z}from"./page-header-BeUDGs-O.js";import{M as O}from"./Modal-OY-an2g6.js";import{S as ce}from"./shield-alert-Dm3Oz4Kc.js";import{P as g}from"./plus-BM5UAzcK.js";import{T as de}from"./trash-2-DUWA0N9n.js";import{C as me}from"./check-CV94AcJF.js";import{C as pe}from"./copy-DL_iD5Dh.js";const H=["read","sessions","devices","admin"],M={"7d":"7 days","30d":"30 days","90d":"90 days","1y":"1 year",never:"No expiry"},he={"7d":7,"30d":30,"90d":90,"1y":365};function B(i){return i==="never"?null:new Date(Date.now()+he[i]*864e5).toISOString()}function U(i){if(!i)return"Never";const n=Date.now()-new Date(i).getTime();return n<6e4?"Just now":n<36e5?`${Math.floor(n/6e4)}m ago`:n<864e5?`${Math.floor(n/36e5)}h ago`:`${Math.floor(n/864e5)}d ago`}const Se=()=>{const{toast:i}=ie(),[n,v]=a.useState([]),[b,W]=a.useState([]),[Y,w]=a.useState(!0),[q,N]=a.useState(!1),[J,d]=a.useState(!1),[r,y]=a.useState(null),[k,C]=a.useState(null),[S,T]=a.useState(!1),[p,_]=a.useState(""),[j,A]=a.useState({read:!0,sessions:!0,devices:!1,admin:!1}),[I,R]=a.useState(300),[P,D]=a.useState(""),[h,E]=a.useState("30d"),[x,K]=a.useState(!1),X=s=>{var t;return s?((t=b.find(c=>c.id===s))==null?void 0:t.name)||s.slice(0,8):"Shared"},f=async()=>{w(!0);try{const[s,t]=await Promise.all([fetch("/xenon/api/apikeys",{credentials:"include"}),fetch("/xenon/api/teams",{credentials:"include"})]);if(s.status===403){N(!0),v([]);return}if(!s.ok)throw new Error(`HTTP ${s.status}`);v(await s.json()),t.ok&&W(await t.json()),N(!1)}catch(s){i(`Failed to load API keys: ${s.message}`,"error")}finally{w(!1)}};a.useEffect(()=>{f()},[]);const G=()=>{_(""),A({read:!0,sessions:!0,devices:!1,admin:!1}),R(300),D(""),E("30d")},Q=async()=>{const s=H.filter(t=>j[t]);if(!p.trim()){i("Key name is required","error");return}if(s.length===0){i("Select at least one scope","error");return}K(!0);try{const t=await fetch("/xenon/api/apikeys",{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:p.trim(),scopes:s,rateLimit:I,teamId:P||null,expiresAt:B(h)})});if(!t.ok)throw new Error(`HTTP ${t.status}`);const c=await t.json();d(!1),G(),y({name:p.trim(),raw:c.key}),await f()}catch(t){i(`Create failed: ${t.message}`,"error")}finally{K(!1)}},V=async s=>{C(s);try{const t=await fetch(`/xenon/api/apikeys/${s}`,{method:"DELETE",credentials:"include"});if(!t.ok)throw new Error(`HTTP ${t.status}`);i("Key revoked","success"),await f()}catch(t){i(`Revoke failed: ${t.message}`,"error")}finally{C(null)}},Z=async s=>{try{await navigator.clipboard.writeText(s),T(!0),setTimeout(()=>T(!1),1500)}catch{i("Copy failed — select the text manually","error")}};if(Y)return e.jsxs("div",{className:"settings-loading",children:[e.jsx(F,{className:"animate-spin",size:32}),e.jsx("span",{children:"Loading API keys…"})]});if(q)return e.jsx("div",{className:"settings-container",children:e.jsx(z,{icon:ce,title:"API Keys",subtitle:e.jsxs(e.Fragment,{children:["Your key lacks the ",e.jsx("code",{children:"admin"})," scope. Ask an administrator to issue an admin key so you can manage access for other users."]})})});const ee=n.length,se=n.filter(s=>s.scopes.includes("admin")).length,te=n.filter(s=>s.lastUsedAt&&Date.now()-new Date(s.lastUsedAt).getTime()<864e5).length;return e.jsxs("div",{className:"settings-container",children:[e.jsx(z,{icon:L,title:"API Keys",subtitle:e.jsxs(e.Fragment,{children:["Issue scoped credentials for humans (dashboard login) and machines (CI, WebDriver clients via ",e.jsx("code",{children:"xenon:accessKey"}),"). Keys are shown only once at creation — copy the value before closing the dialog."]}),action:e.jsxs("button",{type:"button",className:"page-header-action",onClick:()=>d(!0),children:[e.jsx(g,{size:16}),e.jsx("span",{children:"Create new key"})]})}),e.jsxs("div",{className:"settings-content",children:[n.length>0&&e.jsxs("div",{className:"stat-strip",children:[e.jsxs("div",{className:"stat-strip__cell",children:[e.jsx("div",{className:"stat-strip__value",children:ee}),e.jsx("div",{className:"stat-strip__label",children:"Total keys"})]}),e.jsxs("div",{className:"stat-strip__cell",children:[e.jsx("div",{className:"stat-strip__value stat-strip__value--accent",children:se}),e.jsx("div",{className:"stat-strip__label",children:"Admin scope"})]}),e.jsxs("div",{className:"stat-strip__cell",children:[e.jsx("div",{className:"stat-strip__value",children:te}),e.jsx("div",{className:"stat-strip__label",children:"Active in last 24h"})]})]}),n.length===0?e.jsxs("div",{className:"empty-state",children:[e.jsx("div",{className:"empty-state__icon",children:e.jsx(L,{size:28})}),e.jsx("h3",{className:"empty-state__title",children:"No API keys yet"}),e.jsx("p",{className:"empty-state__copy",children:"Issue your first key to authenticate WebDriver clients or CI pipelines. Keys are shown only once at creation — copy the value before closing the dialog."}),e.jsxs("button",{type:"button",className:"page-header-action empty-state__action",onClick:()=>d(!0),children:[e.jsx(g,{size:16}),e.jsx("span",{children:"Create your first key"})]})]}):e.jsx("div",{className:"data-card",children:e.jsxs(re,{children:[e.jsx(le,{children:e.jsxs($,{children:[e.jsx(l,{children:"Name"}),e.jsx(l,{children:"Team"}),e.jsx(l,{children:"Scopes"}),e.jsx(l,{children:"Rate limit"}),e.jsx(l,{children:"Last used"}),e.jsx(l,{children:"Created"}),e.jsx(l,{children:"Expires"}),e.jsx(l,{style:{textAlign:"right"},children:"Actions"})]})}),e.jsx(oe,{children:n.map(s=>e.jsxs($,{children:[e.jsxs(o,{children:[e.jsx("strong",{children:s.name}),e.jsx("div",{className:"row-meta-mono",children:s.id.slice(0,8)})]}),e.jsx(o,{children:e.jsx("span",{className:`pill-chip ${s.teamId?"pill-chip--team":"pill-chip--shared"}`,children:X(s.teamId)})}),e.jsx(o,{children:e.jsx("div",{className:"scope-chips",children:s.scopes.split(",").map(t=>{const c=t.trim(),ae=c==="admin";return e.jsx("span",{className:`pill-chip ${ae?"pill-chip--admin":"pill-chip--scope"}`,children:c},t)})})}),e.jsxs(o,{className:"row-mono",children:[s.rateLimit,"/min"]}),e.jsx(o,{className:"row-mono",children:U(s.lastUsedAt)}),e.jsx(o,{className:"row-mono",children:U(s.createdAt)}),e.jsx(o,{className:"row-mono",children:s.expiresAt?new Date(s.expiresAt).getTime()<=Date.now()?e.jsx("span",{style:{color:"var(--red)"},children:"expired"}):new Date(s.expiresAt).toLocaleDateString():"Never"}),e.jsx(o,{style:{textAlign:"right"},children:e.jsxs("button",{type:"button",className:"row-action row-action--danger",disabled:k===s.id,onClick:()=>{window.confirm(`Revoke "${s.name}"? Any client using this key will immediately fail.`)&&V(s.id)},children:[e.jsx(de,{size:13}),k===s.id?"Revoking…":"Revoke"]})})]},s.id))})]})})]}),e.jsx(O,{open:J,title:"Create API key",width:520,onClose:()=>d(!1),footer:e.jsxs(e.Fragment,{children:[e.jsx("button",{className:"reset-btn",onClick:()=>d(!1),disabled:x,children:"Cancel"}),e.jsxs("button",{className:"save-btn",onClick:Q,disabled:x,children:[x?e.jsx(F,{className:"animate-spin",size:18}):e.jsx(g,{size:18}),x?"Creating…":"Create key"]})]}),children:e.jsxs("div",{style:{display:"flex",flexDirection:"column"},children:[e.jsx(m,{label:"Name",htmlFor:"apikey-name",children:e.jsx("input",{id:"apikey-name",type:"text",value:p,onChange:s=>_(s.target.value),placeholder:"alice-laptop, ci-main, etc.",style:u,autoFocus:!0})}),e.jsx(m,{label:"Scopes",description:e.jsxs(e.Fragment,{children:[e.jsx("code",{children:"admin"})," grants full access including API-key management."," ",e.jsx("code",{children:"sessions"})," is required for WebDriver ",e.jsx("code",{children:"xenon:accessKey"}),"."]}),children:e.jsx("div",{style:{display:"flex",flexWrap:"wrap",gap:8},children:H.map(s=>e.jsxs("label",{style:xe,children:[e.jsx("input",{type:"checkbox",checked:j[s],onChange:t=>A({...j,[s]:t.target.checked})}),e.jsx("span",{children:s})]},s))})}),e.jsx(m,{label:"Rate limit (requests/min)",htmlFor:"apikey-ratelimit",children:e.jsx("input",{id:"apikey-ratelimit",type:"number",min:10,step:10,value:I,onChange:s=>R(parseInt(s.target.value)||300),style:u})}),e.jsx(m,{label:"Default team",description:e.jsxs(e.Fragment,{children:["Keys without a team can only reach shared-pool devices. Admins can override at session time via ",e.jsx("code",{children:"xenon:team"}),"."]}),htmlFor:"apikey-team",children:e.jsxs("select",{id:"apikey-team",value:P,onChange:s=>D(s.target.value),style:u,children:[e.jsx("option",{value:"",children:"No team (shared pool only)"}),b.map(s=>e.jsx("option",{value:s.id,children:s.name},s.id))]})}),e.jsx(m,{label:"Expires after",description:h==="never"?"Key never expires. Rotate manually when needed.":`Key will stop working on ${new Date(B(h)).toLocaleDateString()}.`,htmlFor:"apikey-expiry",children:e.jsx("select",{id:"apikey-expiry",value:h,onChange:s=>E(s.target.value),style:u,children:Object.keys(M).map(s=>e.jsx("option",{value:s,children:M[s]},s))})})]})}),e.jsx(O,{open:!!r,title:r?`Key created: ${r.name}`:"",width:560,onClose:()=>y(null),closeOnOverlayClick:!1,footer:e.jsxs(e.Fragment,{children:[e.jsxs("button",{className:"save-btn",onClick:()=>r&&Z(r.raw),disabled:!r,children:[S?e.jsx(me,{size:18}):e.jsx(pe,{size:18}),S?"Copied":"Copy to clipboard"]}),e.jsx("button",{className:"reset-btn",onClick:()=>y(null),children:"I've saved it"})]}),children:r&&e.jsxs("div",{style:{display:"flex",flexDirection:"column",gap:16},children:[e.jsxs("div",{style:{background:"var(--status-busy-bg)",border:"1px solid var(--status-busy-border)",borderRadius:6,padding:12,display:"flex",gap:8,alignItems:"flex-start"},children:[e.jsx(ne,{size:18,style:{flexShrink:0,marginTop:2}}),e.jsxs("div",{children:[e.jsx("strong",{children:"This key will not be shown again."})," Copy it now and store it in your password manager, CI secret store, or client config."]})]}),e.jsx("div",{style:{fontFamily:"monospace",padding:12,background:"rgba(0,0,0,0.3)",borderRadius:6,wordBreak:"break-all",fontSize:"0.9em"},children:r.raw})]})})]})},u={width:"100%",padding:"8px 12px",background:"rgba(0,0,0,0.3)",border:"1px solid rgba(255,255,255,0.1)",borderRadius:6,color:"inherit",fontSize:"0.95em",boxSizing:"border-box"},xe={display:"flex",alignItems:"center",gap:6,padding:"6px 12px",background:"rgba(255,255,255,0.04)",borderRadius:6,cursor:"pointer",fontFamily:"monospace",fontSize:"0.9em"};export{Se as ApiKeys};
@@ -1,21 +0,0 @@
1
- import{g as x,j as e,m as q,r,X as l,S,o as W,v as X,n as H}from"./index-CkwQBzCl.js";import{c as K,a as Z,P as J,B as D,U as Q,T as ee}from"./button-wz7ra9cW.js";import{P as se}from"./page-header-BeUDGs-O.js";import{C as ae}from"./check-CV94AcJF.js";import{C as te}from"./copy-DL_iD5Dh.js";import{Z as re}from"./zap-D8JQHaNH.js";import{D as ie}from"./download-aeG6Qqs8.js";import{T as ne}from"./trash-2-DUWA0N9n.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 ce=[["path",{d:"M12 6.528V3a1 1 0 0 1 1-1h0",key:"11qiee"}],["path",{d:"M18.237 21A15 15 0 0 0 22 11a6 6 0 0 0-10-4.472A6 6 0 0 0 2 11a15.1 15.1 0 0 0 3.763 10 3 3 0 0 0 3.648.648 5.5 5.5 0 0 1 5.178 0A3 3 0 0 0 18.237 21",key:"110c12"}]],M=x("apple",ce);/**
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 le=[["path",{d:"m3 16 4 4 4-4",key:"1co6wj"}],["path",{d:"M7 20V4",key:"1yoxec"}],["path",{d:"M11 4h10",key:"1w87gc"}],["path",{d:"M11 8h7",key:"djye34"}],["path",{d:"M11 12h4",key:"q8tih4"}]],oe=x("arrow-down-wide-narrow",le);/**
12
- * @license lucide-react v0.555.0 - ISC
13
- *
14
- * This source code is licensed under the ISC license.
15
- * See the LICENSE file in the root directory of this source tree.
16
- */const de=[["path",{d:"m3 8 4-4 4 4",key:"11wl7u"}],["path",{d:"M7 4v16",key:"1glfcx"}],["path",{d:"M11 12h4",key:"q8tih4"}],["path",{d:"M11 16h7",key:"uosisv"}],["path",{d:"M11 20h10",key:"jvxblo"}]],me=x("arrow-up-narrow-wide",de);/**
17
- * @license lucide-react v0.555.0 - ISC
18
- *
19
- * This source code is licensed under the ISC license.
20
- * See the LICENSE file in the root directory of this source tree.
21
- */const he=[["path",{d:"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z",key:"m3kijz"}],["path",{d:"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z",key:"1fmvmk"}],["path",{d:"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0",key:"1f8sc4"}],["path",{d:"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5",key:"qeys4"}]],T=x("rocket",he),pe=Z("badge-base",{variants:{variant:{default:"badge-variant-default",success:"badge-variant-success",warning:"badge-variant-warning",error:"badge-variant-error",outline:"badge-variant-outline",secondary:"badge-variant-secondary"}},defaultVariants:{variant:"default"}});function I({className:n,variant:u,...c}){return e.jsx("div",{className:K(pe({variant:u}),n),...c})}const be=()=>{const{toast:n,removeToast:u}=q(),[c,b]=r.useState([]),[E,R]=r.useState([]),[o,k]=r.useState(!1),[v,$]=r.useState(""),[F,w]=r.useState(!1),[L,A]=r.useState(null),[d,_]=r.useState({android:!0,ios:!0}),[y,U]=r.useState("desc"),[m,j]=r.useState(null),[g,f]=r.useState(""),h=r.useCallback(async()=>{k(!0);try{const s=await l.getApps();b(Array.isArray(s)?s:[])}catch(s){console.error("Failed to fetch apps",s)}finally{k(!1)}},[]),N=r.useCallback(async()=>{try{const s=await l.getDevices();R(Array.isArray(s)?s:[])}catch(s){console.error("Failed to fetch devices",s)}},[]);r.useEffect(()=>{h(),N();const s=setInterval(N,1e4);return()=>clearInterval(s)},[h,N]);const C=async s=>{var t;const a=(t=s.target.files)==null?void 0:t[0];if(a){w(!0);try{await l.uploadApp(a),await h()}catch(i){console.error("Upload failed",i)}finally{w(!1),s.target&&(s.target.value="")}}},B=async(s,a)=>{if(window.confirm(`Permanently remove artifact "${a}"?`))try{await l.deleteApp(s),b(t=>t.filter(i=>i.id!==s))}catch(t){console.error("Delete failed",t)}},P=(s,a)=>{navigator.clipboard.writeText(s),A(`${a}-${s}`),setTimeout(()=>A(null),2e3)},G=async(s,a)=>{const t=n(`Deploying app to ${a}...`,"loading",0);try{const i=await l.installRepositoryApp(a,s);i.success?(n("App deployed successfully","success"),j(null),f("")):n(`Deployment failed: ${i.error}`,"error")}catch(i){n(`Execution Error: ${i.message}`,"error")}finally{u(t)}},p=c.filter(s=>{const a=s.name.toLowerCase().includes(v.toLowerCase())||s.packageName&&s.packageName.toLowerCase().includes(v.toLowerCase()),t=d.android&&s.platform==="android"||d.ios&&s.platform==="ios";return a&&t}).sort((s,a)=>{const t=new Date(s.createdAt).getTime(),i=new Date(a.createdAt).getTime();return y==="desc"?i-t:t-i}),O=s=>{if(!s)return"0 B";const a=1024,t=Math.floor(Math.log(s)/Math.log(a));return parseFloat((s/Math.pow(a,t)).toFixed(1))+" "+["B","KB","MB","GB"][t]},Y=s=>new Date(s).toLocaleDateString(void 0,{month:"short",day:"numeric",year:"numeric",hour:"2-digit",minute:"2-digit"}),z=s=>{_(a=>({...a,[s]:!a[s]}))},V=s=>{const a=s.toLowerCase();return a.includes("wda-signed")||a.includes("wda-resign")||a.includes("webdriveragent")};return e.jsxs("div",{className:"apps-container device-explorer-container",children:[e.jsx("div",{className:"scanline",style:{position:"absolute",inset:0,pointerEvents:"none",opacity:.05,zIndex:1001}}),e.jsx(se,{icon:J,title:"App Repository",subtitle:"Manage signed builds available for installation across your device fleet."}),e.jsxs("div",{className:"device-explorer-header-container",children:[e.jsxs("div",{className:"device-explorer-header-left-container",children:[e.jsx("div",{className:"device-explorer-header-entry",children:e.jsxs("div",{className:"device-explorer-header-value",children:[e.jsxs("button",{className:`device-explorer-header__platform-btn ${d.android&&"selected"}`,onClick:()=>z("android"),children:[e.jsx(S,{size:18,color:"currentColor"})," Android"]}),e.jsxs("button",{className:`device-explorer-header__platform-btn ${d.ios&&"selected"}`,onClick:()=>z("ios"),children:[e.jsx(M,{size:18,color:"currentColor"})," iOS"]})]})}),e.jsx("div",{className:"device-explorer-header-entry",children:e.jsx("div",{className:"device-explorer-header-value",children:e.jsxs("div",{className:"device-explorer-search-wrapper",children:[e.jsx(W,{size:16,color:"#94a3b8",className:"device-explorer-search-icon"}),e.jsx("input",{type:"text",className:"device-explorer-header-text-filter",placeholder:"Filter by bundle or name...",value:v,onChange:s=>$(s.target.value)})]})})}),e.jsx("div",{className:"device-explorer-header-filter-count",children:e.jsxs(I,{variant:"secondary",children:[e.jsx("span",{className:"font-bold",children:p.length})," of"," ",e.jsx("span",{className:"font-bold",children:c.length})," ",c.length===1?"artifact":"artifacts"]})})]}),e.jsxs("div",{className:"device-explorer-header-right-container",children:[e.jsx("button",{className:"icon-btn-secondary sort-btn",onClick:()=>U(s=>s==="desc"?"asc":"desc"),title:y==="desc"?"Newest First":"Oldest First",children:y==="desc"?e.jsx(oe,{size:18}):e.jsx(me,{size:18})}),e.jsxs(D,{size:"sm",variant:"default",onClick:()=>h(),disabled:o,children:[e.jsx(X,{size:14,className:`mr-1 ${o&&"animate-spin"}`}),"Refresh"]}),e.jsxs("label",{className:"upload-trigger",children:[e.jsx("input",{type:"file",accept:".apk,.ipa",onChange:C,style:{display:"none"}}),e.jsxs(D,{size:"sm",variant:"default",className:"upload-button",children:[e.jsx(Q,{size:14,className:"mr-1"}),"Upload App"]})]})]})]}),e.jsx("main",{className:"apps-registry-content",children:o&&c.length===0?e.jsxs("div",{className:"empty-data-vignette",children:[e.jsx("div",{className:"processing-loader"}),e.jsx("p",{className:"text-muted text-xs font-bold tracking-widest",children:"SYNCING REGISTRY..."})]}):e.jsxs(e.Fragment,{children:[p.length>0&&e.jsxs("div",{className:"registry-table-header",children:[e.jsx("div",{children:"Artifact Bundle"}),e.jsx("div",{children:"Version"}),e.jsx("div",{children:"Size"}),e.jsx("div",{children:"Registry Date"}),e.jsx("div",{style:{textAlign:"right"},children:"Management"})]}),e.jsx("div",{className:"registry-list",children:p.map(s=>{const a=E.filter(t=>t.platform===s.platform&&!t.busy&&!t.offline);return e.jsxs("div",{className:`artifact-row ${s.platform}`,children:[e.jsxs("div",{className:"col-app-info",children:[e.jsx("div",{className:"app-platform-badge",children:s.platform==="android"?e.jsx(S,{size:18}):e.jsx(M,{size:18})}),e.jsxs("div",{className:"app-text-block",children:[e.jsxs("div",{className:"app-display-name",title:s.name,children:[s.name,V(s.name)&&e.jsx(I,{variant:"outline",className:"ml-2 text-[10px] h-4 py-0 border-primary text-primary",children:"WDA"})]}),e.jsxs("div",{className:"app-package-id",children:[e.jsx("code",{children:s.packageName||"internal.bundle"}),e.jsx("div",{className:"copy-hint",onClick:()=>P(s.packageName||"","pkg"),children:L===`pkg-${s.packageName}`?e.jsx(ae,{size:10,className:"text-primary"}):e.jsx(te,{size:10})})]})]})]}),e.jsx("div",{className:"col-version",children:s.version||"v1.0.0"}),e.jsx("div",{className:"col-size",children:O(s.size)}),e.jsx("div",{className:"col-timestamp",children:Y(s.createdAt)}),e.jsxs("div",{className:"col-actions",children:[e.jsx("button",{className:`instant-deploy-trigger ${m===s.id&&"active"}`,onClick:()=>{m===s.id?(j(null),f("")):j(s.id)},children:m===s.id?e.jsxs(e.Fragment,{children:[e.jsx(H,{size:12})," CANCEL"]}):e.jsxs(e.Fragment,{children:[e.jsx(re,{size:12})," DEPLOY"]})}),m===s.id&&e.jsx("div",{className:"deployment-flyout",children:a.length>0?e.jsxs("div",{className:"deploy-actions-group",children:[e.jsxs("select",{className:"target-device-select",autoFocus:!0,value:g,onChange:t=>f(t.target.value),children:[e.jsx("option",{value:"",children:"SELECT TARGET..."}),a.map(t=>e.jsxs("option",{value:t.udid,children:[t.name.toUpperCase()," (",t.udid,")"]},t.udid))]}),e.jsx("button",{className:"confirm-deploy-btn",disabled:!g,onClick:()=>G(s.id,g),title:"Confirm Deployment",children:e.jsx(T,{size:14})})]}):e.jsx("div",{className:"target-device-select empty",children:"NO TARGETS"})}),e.jsx("button",{className:"utility-icon-btn",onClick:()=>window.open(`/xenon/api/apps/${s.id}/download`,"_blank"),children:e.jsx(ie,{size:14})}),e.jsx("button",{className:"utility-icon-btn danger",onClick:()=>B(s.id,s.name),children:e.jsx(ne,{size:14})})]})]},s.id)})}),p.length===0&&!o&&e.jsxs("div",{className:"empty-registry-technical",children:[e.jsx("div",{className:"empty-icon-container",children:e.jsx(ee,{size:48,className:"text-primary opacity-40 animate-pulse"})}),e.jsx("h2",{className:"empty-title brand-font",children:"Centralized Artifact Registry"}),e.jsxs("p",{className:"empty-description",children:["The Xenon Registry is a secure, high-performance vault for your mobile binaries. Upload your ",e.jsx("code",{className:"text-primary",children:".apk"})," or"," ",e.jsx("code",{className:"text-primary",children:".ipa"}),"artifacts to enable rapid deployment, version tracking, and instant installation across your entire device fleet."]}),e.jsx("div",{className:"empty-actions",children:e.jsxs("label",{className:"upload-trigger-massive",children:[e.jsx("input",{type:"file",accept:".apk,.ipa",onChange:C,style:{display:"none"}}),e.jsxs("div",{className:"massive-upload-content",children:[e.jsx(T,{size:24,className:"mb-2"}),e.jsx("span",{children:"Ingest Your First Artifact"})]})]})})]})]})}),F&&e.jsx("div",{className:"upload-overlay-technical",children:e.jsxs("div",{className:"upload-card-technical",children:[e.jsx("div",{className:"processing-loader"}),e.jsx("h2",{className:"brand-font",style:{fontSize:"20px",marginBottom:"8px"},children:"Artifact Ingestion"}),e.jsx("p",{className:"text-muted text-xs",children:"VERIFYING CHECKSUM & DEPLOYING TO REGISTRY..."})]})})]})};export{be as default};
@@ -1,6 +0,0 @@
1
- import{g as F,j as e,o as E,k as w,T as O,S as M,r as b,u as P,c as z,m as G,X}from"./index-CkwQBzCl.js";import{f as B,s as R,b as T,d as q,p as H,o as Q,S as V,h as J,a as K,u as W}from"./status-pill-outline-3FA5raqd.js";import{A as Y}from"./activity-BhRPBZ3G.js";import{C as Z}from"./circle-x-DGNoObyH.js";import{C as ee}from"./circle-check-0COJnxUq.js";import{C as te}from"./clock-DwtXByAH.js";import{D as se}from"./download-aeG6Qqs8.js";import{C as re}from"./chevron-right-_iIkyWqd.js";import{T as ae,M as ne}from"./tablet-CWU6hxZF.js";import"./useSocket-lsg6f_Dn.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 le=[["path",{d:"M21 12a9 9 0 0 0-9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"14sxne"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M3 12a9 9 0 0 0 9 9 9.75 9.75 0 0 0 6.74-2.74L21 16",key:"1hlbsb"}],["path",{d:"M16 16h5v5",key:"ccwih5"}]],oe=F("refresh-ccw",le),ie={neutral:"bg-[var(--surface-2)] text-[var(--text-muted)] border-[var(--border)]",green:"bg-[var(--green)]/15 text-[var(--green)] border-[var(--green)]/30",red:"bg-[var(--red)]/15 text-[var(--red)] border-[var(--red)]/30",amber:"bg-[var(--amber)]/15 text-[var(--amber)] border-[var(--amber)]/30"},y=({value:t,tone:s="neutral"})=>e.jsx("span",{className:`inline-flex items-center justify-center min-w-[18px] h-[18px] px-1.5 rounded-full border text-[10px] font-mono font-medium ${ie[s]}`,children:t}),de={passed:{Icon:ee,label:"PASSED",tint:"text-[var(--green)]"},failed:{Icon:Z,label:"FAILED",tint:"text-[var(--red)]"},running:{Icon:Y,label:"RUNNING",tint:"text-[var(--amber)]"}},C=({kind:t,value:s})=>{const{Icon:r,label:i,tint:c}=de[t];return e.jsxs("div",{className:"flex-1 flex flex-col items-center gap-1 py-2 rounded-md border border-[var(--border)] bg-[var(--bg)]",children:[e.jsx(r,{className:`h-3.5 w-3.5 ${c}`}),e.jsx("span",{className:`text-[9px] font-mono font-semibold tracking-wider ${c}`,children:i}),e.jsx("span",{className:"text-sm font-semibold text-[var(--text)] tabular-nums",children:s})]})},I={all:"All time","24h":"Last 24 hours","7d":"Last 7 days","30d":"Last 30 days"},ce=({builds:t,selectedBuildId:s,onSelect:r,search:i,onSearchChange:c,timeFilter:x,onTimeFilterChange:m})=>{const l=t.filter(a=>{const d=(a.name??"")+" "+a.id;if(i&&!d.toLowerCase().includes(i.toLowerCase()))return!1;if(x!=="all"){const n={"24h":864e5,"7d":6048e5,"30d":2592e6},p=Date.parse(String(a.createdAt));if(!Number.isFinite(p)||Date.now()-p>n[x])return!1}return!0}),o=l.reduce((a,d)=>(a.passed+=d.passedCount||0,a.failed+=d.failedCount||0,a.running+=d.runningCount||0,a),{passed:0,failed:0,running:0});return e.jsxs("aside",{className:"w-[280px] shrink-0 border-r border-[var(--border)] bg-[var(--surface)] flex flex-col",children:[e.jsxs("div",{className:"p-3 space-y-2 border-b border-[var(--border)]",children:[e.jsxs("div",{className:"relative",children:[e.jsx(E,{className:"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-[var(--text-dim)]"}),e.jsx("input",{type:"text",value:i,onChange:a=>c(a.target.value),placeholder:"Find builds…",className:"w-full h-8 pl-8 pr-2 rounded-md bg-[var(--bg)] border border-[var(--border)] text-xs text-[var(--text)] placeholder:text-[var(--text-dim)] focus:outline-none focus:border-[var(--border-strong)]"})]}),e.jsx("select",{value:x,onChange:a=>m(a.target.value),className:"w-full h-8 px-2 rounded-md bg-[var(--bg)] border border-[var(--border)] text-xs text-[var(--text-muted)]",children:Object.keys(I).map(a=>e.jsx("option",{value:a,children:I[a]},a))})]}),e.jsxs("div",{className:"p-3 flex items-stretch gap-2 border-b border-[var(--border)]",children:[e.jsx(C,{kind:"passed",value:o.passed}),e.jsx(C,{kind:"failed",value:o.failed}),e.jsx(C,{kind:"running",value:o.running})]}),e.jsxs("div",{className:"flex-1 overflow-y-auto",children:[l.length===0&&e.jsx("div",{className:"px-4 py-8 text-center text-xs text-[var(--text-dim)]",children:"No builds match."}),l.map(a=>{const d=a.id===s;return e.jsxs("button",{type:"button",onClick:()=>r(a.id),className:`w-full text-left relative px-4 py-3 border-b border-[var(--border)] transition-colors ${d?"bg-[var(--surface-2)]":"hover:bg-[var(--surface-2)]/60"}`,children:[d&&e.jsx("span",{className:"absolute left-0 top-2 bottom-2 w-[3px] rounded-r bg-[var(--green)]"}),e.jsx("div",{className:"text-xs font-semibold text-[var(--text)] truncate",children:a.name||"Unnamed build"}),e.jsxs("div",{className:"mt-1 flex items-center gap-1 font-mono text-[9px] text-[var(--text-dim)]",children:[e.jsx(te,{className:"h-3 w-3"}),B(a.createdAt)]}),e.jsxs("div",{className:"mt-1.5 flex items-center gap-1.5",children:[a.passedCount>0&&e.jsx(y,{value:a.passedCount,tone:"green"}),a.failedCount>0&&e.jsx(y,{value:a.failedCount,tone:"red"}),a.runningCount>0&&e.jsx(y,{value:a.runningCount,tone:"amber"}),a.sessionCount===0&&e.jsx("span",{className:"text-[10px] font-mono text-[var(--text-dim)]",children:"empty"})]}),e.jsx("div",{className:"mt-1 font-mono text-[9px] text-[var(--text-dim)] truncate",children:R(a.id,10,4)})]},a.id)})]})]})},xe={neutral:"bg-[var(--text-dim)]",green:"bg-[var(--green)]",red:"bg-[var(--red)]",amber:"bg-[var(--amber)]",blue:"bg-[var(--blue)]"},N=({label:t,count:s,active:r,onClick:i,tone:c="neutral",bullet:x=!0})=>e.jsxs("button",{type:"button",onClick:i,"aria-pressed":r,className:`inline-flex items-center gap-2 h-8 px-3 rounded-md border text-[11px] font-semibold uppercase tracking-wider transition-colors cursor-pointer ${r?"bg-[var(--surface-2)] border-[var(--border-strong)] text-[var(--text)]":"bg-transparent border-transparent text-[var(--text-muted)] hover:text-[var(--text)] hover:bg-[var(--surface-2)]/50"}`,children:[x&&c!=="neutral"&&e.jsx("span",{className:`h-1.5 w-1.5 rounded-full ${xe[c]}`}),e.jsx("span",{children:t}),typeof s=="number"&&e.jsx("span",{className:"font-mono text-[10px] text-[var(--text-dim)]",children:s})]}),ue=({sessions:t,active:s,onChange:r,search:i,onSearchChange:c,totalMatching:x,totalUnfiltered:m})=>{const l=T(t);return e.jsxs("div",{className:"bg-[var(--surface)]",children:[e.jsxs("div",{className:"flex items-center gap-1.5 px-4 pt-3 pb-2",children:[e.jsx(N,{label:"ALL",count:l.all,active:s==="all",onClick:()=>r("all"),tone:"neutral",bullet:!1}),e.jsx(N,{label:"PASSED",count:l.passed,active:s==="passed",onClick:()=>r("passed"),tone:"green"}),e.jsx(N,{label:"FAILED",count:l.failed,active:s==="failed",onClick:()=>r("failed"),tone:"red"}),e.jsx(N,{label:"RUNNING",count:l.running,active:s==="running",onClick:()=>r("running"),tone:"amber"})]}),e.jsxs("div",{className:"flex items-center gap-4 px-4 pb-3 border-b border-[var(--border)]",children:[e.jsxs("div",{className:"relative flex-1 max-w-xl",children:[e.jsx(E,{className:"absolute left-2.5 top-1/2 -translate-y-1/2 h-3.5 w-3.5 text-[var(--text-dim)]"}),e.jsx("input",{type:"text",value:i,onChange:o=>c(o.target.value),placeholder:"Search sessions by ID, name, or device…",className:"w-full h-8 pl-8 pr-2 rounded-md bg-[var(--bg)] border border-[var(--border)] text-xs text-[var(--text)] placeholder:text-[var(--text-dim)] focus:outline-none focus:border-[var(--border-strong)]"})]}),e.jsxs("span",{className:"text-[10px] font-mono text-[var(--text-dim)] whitespace-nowrap",children:[x," of ",m," sessions"]})]})]})};function me(t){return(t.split("-")[0]||t).slice(0,8).toUpperCase()}const pe=({build:t,failedCount:s,selectedCount:r,onRetryFailed:i,onExport:c})=>{const x=s>0||r>0,[m,l]=w.useState(!1),o=w.useRef(null);w.useEffect(()=>{const d=n=>{o.current&&!o.current.contains(n.target)&&l(!1)};return document.addEventListener("mousedown",d),()=>document.removeEventListener("mousedown",d)},[]);const a=x?`Retry ${r||s} session${(r||s)===1?"":"s"}`:"No failed sessions to retry";return e.jsxs("header",{className:"flex items-start justify-between gap-4 px-4 py-3 border-b border-[var(--border)] bg-[var(--surface)]",children:[e.jsxs("div",{children:[e.jsxs("div",{className:"flex items-center gap-2 text-[10px] uppercase tracking-widest text-[var(--text-dim)]",children:[e.jsx("span",{children:"Build"}),e.jsxs("span",{className:"font-mono text-[var(--green)]",title:t.id,children:["#",me(t.id)]})]}),e.jsx("h1",{className:"mt-0.5 text-sm font-semibold text-[var(--text)]",children:t.name||"Unnamed build"})]}),e.jsxs("div",{className:"flex items-center gap-2",ref:o,children:[e.jsxs("button",{type:"button",onClick:i,disabled:!x,title:a,className:"inline-flex items-center gap-1.5 h-8 px-3 rounded-md border border-[var(--border)] text-xs text-[var(--text)] hover:border-[var(--border-strong)] hover:bg-[var(--surface-2)] transition-colors disabled:opacity-40 disabled:cursor-not-allowed",children:[e.jsx(oe,{className:"h-3.5 w-3.5"}),"Retry failed"]}),e.jsxs("div",{className:"relative",children:[e.jsxs("button",{type:"button",onClick:()=>l(d=>!d),className:"inline-flex items-center gap-1.5 h-8 px-3 rounded-md border border-[var(--border)] text-xs text-[var(--text)] hover:border-[var(--border-strong)] hover:bg-[var(--surface-2)] transition-colors",children:[e.jsx(se,{className:"h-3.5 w-3.5"}),"Export"]}),m&&e.jsxs("div",{className:"absolute top-full right-0 mt-1 w-40 rounded-md border border-[var(--border)] bg-[var(--surface)] shadow-lg overflow-hidden z-20",children:[e.jsx("button",{type:"button",onClick:()=>{l(!1),c("json")},className:"w-full text-left px-3 py-2 text-xs text-[var(--text)] hover:bg-[var(--surface-2)]",children:"Export as JSON"}),e.jsx("button",{type:"button",onClick:()=>{l(!1),c("csv")},className:"w-full text-left px-3 py-2 text-xs text-[var(--text)] hover:bg-[var(--surface-2)]",children:"Export as CSV"})]})]})]})]})};function fe({platform:t}){const s=(t||"").toLowerCase();return s.includes("tv")?e.jsx(O,{className:"h-3.5 w-3.5"}):s.includes("pad")||s.includes("tablet")?e.jsx(ae,{className:"h-3.5 w-3.5"}):s.includes("android")||s.includes("ios")?e.jsx(M,{className:"h-3.5 w-3.5"}):e.jsx(ne,{className:"h-3.5 w-3.5"})}function he(t){return t==="running"?{label:"RUNNING",tone:"running"}:t==="failed"?{label:"FAILED",tone:"failed"}:t==="ended"||t==="passed"?{label:"PASSED",tone:"passed"}:{label:t.toUpperCase(),tone:"offline"}}const ve=({session:t,selected:s,onToggleSelect:r,onOpen:i})=>{const c=t.status==="failed",x=he(t.status),m=q(t),l=c&&t.failure_reason?t.failure_reason:t.name??"";return e.jsxs("tr",{onClick:i,className:"group border-b border-[var(--border)] hover:bg-[var(--surface-2)] cursor-pointer transition-colors align-top",children:[e.jsx("td",{className:"px-3 py-3",onClick:o=>o.stopPropagation(),children:e.jsx("input",{type:"checkbox",checked:s,onChange:r,"aria-label":`Select session ${t.id}`})}),e.jsxs("td",{className:"px-3 py-3",children:[e.jsxs("div",{className:"font-mono text-xs text-[var(--green)]",title:t.id,children:["#",R(t.id,14,4)]}),l&&e.jsx("div",{className:"mt-0.5 text-[11px] text-[var(--text-muted)] truncate max-w-[420px]",title:l,children:l})]}),e.jsxs("td",{className:"px-3 py-3",children:[e.jsxs("div",{className:"flex items-center gap-1.5 text-xs text-[var(--text)]",children:[e.jsx(fe,{platform:t.device_platform}),e.jsx("span",{className:"truncate max-w-[160px]",children:m})]}),t.node_id&&e.jsxs("div",{className:"mt-0.5 font-mono text-[10px] text-[var(--text-dim)]",children:["node-",t.node_id]})]}),e.jsxs("td",{className:"px-3 py-3",children:[e.jsx("div",{className:"text-xs text-[var(--text)]",children:H(t)}),t.device_version&&e.jsx("div",{className:"mt-0.5 font-mono text-[10px] text-[var(--text-dim)]",children:Q(t)})]}),e.jsx("td",{className:"px-3 py-3",children:e.jsx(V,{label:x.label,tone:x.tone})}),e.jsx("td",{className:"px-3 py-3 font-mono text-[11px] text-[var(--text-muted)] whitespace-nowrap",children:B(t.startTime)}),e.jsx("td",{className:"px-3 py-3 font-mono text-[11px] text-[var(--text-muted)] whitespace-nowrap text-right",children:J(K(t))}),e.jsx("td",{className:"px-3 py-3 text-right",children:e.jsx(re,{className:"inline h-4 w-4 text-[var(--text-dim)] group-hover:text-[var(--text)]"})})]})};function be(t,s){return s==="all"?!0:s==="passed"?t.status==="ended"||t.status==="passed":s==="failed"?t.status==="failed":s==="running"?t.status==="running":!0}const ge=({sessions:t,statusFilter:s,searchQuery:r,selectedIds:i,onToggleSelect:c,onToggleSelectAll:x,onOpenRow:m,buildHasNoSessions:l})=>{const o=b.useMemo(()=>{const n=r.trim().toLowerCase();return t.filter(p=>!(!be(p,s)||n&&!(p.id+" "+(p.name??"")+" "+(p.device_name??"")+" "+(p.device_platform??"")+" "+(p.device_version??"")+" "+(p.node_id??"")).toLowerCase().includes(n)))},[t,s,r]);if(l)return e.jsx("div",{className:"px-4 py-12 text-center text-xs text-[var(--text-dim)]",children:"No sessions in this build yet. Trigger one from your test runner."});if(o.length===0)return e.jsx("div",{className:"px-4 py-12 text-center text-xs text-[var(--text-dim)]",children:"No sessions match the current filters."});const a=o.length>0&&o.every(n=>i.has(n.id)),d=o.some(n=>i.has(n.id));return e.jsx("div",{className:"flex-1 overflow-y-auto",children:e.jsxs("table",{className:"w-full text-left table-fixed",children:[e.jsx("thead",{className:"sticky top-0 bg-[var(--surface)] border-b border-[var(--border)] z-10",children:e.jsxs("tr",{children:[e.jsx("th",{className:"px-3 py-2 w-[36px]",children:e.jsx("input",{type:"checkbox","aria-label":"Select all visible",checked:a,ref:n=>{n&&(n.indeterminate=d&&!a)},onChange:()=>x(o.map(n=>n.id))})}),e.jsx("th",{className:"px-3 py-2 text-[10px] uppercase tracking-wider text-[var(--text-dim)] font-medium",children:"Session"}),e.jsx("th",{className:"px-3 py-2 text-[10px] uppercase tracking-wider text-[var(--text-dim)] font-medium",children:"Device · Node"}),e.jsx("th",{className:"px-3 py-2 text-[10px] uppercase tracking-wider text-[var(--text-dim)] font-medium w-[108px]",children:"Platform"}),e.jsx("th",{className:"px-3 py-2 text-[10px] uppercase tracking-wider text-[var(--text-dim)] font-medium w-[104px]",children:"Status"}),e.jsx("th",{className:"px-3 py-2 text-[10px] uppercase tracking-wider text-[var(--text-dim)] font-medium w-[160px]",children:"Start Time"}),e.jsx("th",{className:"px-3 py-2 text-[10px] uppercase tracking-wider text-[var(--text-dim)] font-medium text-right w-[92px]",children:"Duration"}),e.jsx("th",{className:"px-3 py-2 w-[32px]"})]})}),e.jsx("tbody",{children:o.map(n=>e.jsx(ve,{session:n,selected:i.has(n.id),onToggleSelect:()=>c(n.id),onOpen:()=>m(n)},n.id))})]})})},Be=()=>{const t=P(),{buildId:s}=z(),r=W(),{toast:i}=G(),[c,x]=b.useState("all"),[m,l]=b.useState("all"),[o,a]=b.useState(""),[d,n]=b.useState(new Set);w.useEffect(()=>{s&&s!==r.selectedBuildId&&(r.selectBuild(s),n(new Set))},[s,r]);const p=u=>t(`/builds/${u}`),S=u=>t(`/builds/${r.selectedBuildId}/sessions/${u.id}`),A=b.useCallback(u=>{n(f=>{const h=new Set(f);return h.has(u)?h.delete(u):h.add(u),h})},[]),D=b.useCallback(u=>{n(f=>{const h=u.length>0&&u.every(v=>f.has(v)),g=new Set(f);return h?u.forEach(v=>g.delete(v)):u.forEach(v=>g.add(v)),g})},[]),k=r.builds.find(u=>u.id===r.selectedBuildId)||null,$=T(r.sessions),U=()=>{i("Bulk retry lands in a future release.","info")},_=async u=>{if(r.selectedBuildId)try{const f=d.size>0?Array.from(d):void 0,{blob:h,filename:g}=await X.exportBuild(r.selectedBuildId,u,f),v=URL.createObjectURL(h),j=document.createElement("a");j.href=v,j.download=g,document.body.appendChild(j),j.click(),document.body.removeChild(j),URL.revokeObjectURL(v);const L=f?f.length:"all";i(`Exported ${L} session${L===1?"":"s"} as ${u.toUpperCase()}.`,"success")}catch(f){const h=f instanceof Error?f.message:String(f);i(`Export failed: ${h}`,"error")}};return e.jsxs("div",{className:"flex h-full",children:[e.jsx(ce,{builds:r.builds,selectedBuildId:r.selectedBuildId,onSelect:p,search:r.searchQuery,onSearchChange:r.setSearchQuery,timeFilter:c,onTimeFilterChange:x}),e.jsx("section",{className:"flex-1 flex flex-col min-w-0",children:k?e.jsxs(e.Fragment,{children:[e.jsx(pe,{build:k,failedCount:$.failed,selectedCount:d.size,onRetryFailed:U,onExport:_}),e.jsx(ue,{sessions:r.sessions,active:m,onChange:l,search:o,onSearchChange:a,totalMatching:r.sessions.length,totalUnfiltered:r.sessions.length}),e.jsx(ge,{sessions:r.sessions,statusFilter:m,searchQuery:o,selectedIds:d,onToggleSelect:A,onToggleSelectAll:D,onOpenRow:S,buildHasNoSessions:r.sessions.length===0})]}):e.jsx("div",{className:"flex-1 flex items-center justify-center text-xs text-[var(--text-dim)]",children:"Select a build from the left to see its sessions."})})]})};export{Be as BuildsPage,Be as default};
@@ -1 +0,0 @@
1
- @import"https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600&display=swap";.status-dot{display:inline-block;border-radius:50%;vertical-align:middle}.status-dot-ready{background:var(--status-ready-fg)}.status-dot-busy{background:var(--status-busy-fg)}.status-dot-reserved{background:var(--status-reserved-fg)}.status-dot-error{background:var(--status-error-fg)}.status-dot-offline{background:var(--status-offline-fg)}.status-code{display:inline-flex;align-items:center;gap:6px;font-family:JetBrains Mono,monospace;font-size:10px;letter-spacing:.1em;font-weight:600}.status-code-label{line-height:1}.status-code-ready{color:var(--status-ready-fg)}.status-code-busy{color:var(--status-busy-fg)}.status-code-reserved{color:var(--status-reserved-fg)}.status-code-error{color:var(--status-error-fg)}.status-code-offline{color:var(--status-offline-fg)}.kv-row{display:flex;justify-content:space-between;align-items:center;font-size:12px;min-height:18px}.kv-label{color:var(--text-muted)}.kv-value{color:var(--text);font-weight:500}.kv-value-mono{font-family:JetBrains Mono,monospace;font-size:11px}.popover{z-index:9000;background:var(--surface-2);border:1px solid var(--border-strong);border-radius:var(--radius-md);box-shadow:var(--shadow-md);min-width:180px;padding:4px}.menu{display:flex;flex-direction:column;gap:0}.menu-item{display:flex;align-items:center;gap:8px;padding:6px 10px;background:transparent;border:none;border-radius:var(--radius-sm);color:var(--text);font-family:Inter,sans-serif;font-size:12px;cursor:pointer;text-align:left;width:100%}.menu-item:hover:not(:disabled){background:var(--bg);color:var(--text)}.menu-item:disabled{opacity:.4;cursor:not-allowed}.menu-item-danger{color:var(--status-error-fg)}.menu-item-icon{display:inline-flex;align-items:center;color:var(--text-muted)}.menu-divider{height:1px;background:var(--border);margin:4px 0}.reservation-modal-body{display:flex;flex-direction:column;gap:20px}.reservation-modal-body p{color:var(--text-dim);font-size:13px;line-height:1.6;margin:0}.device-id-badge{display:inline-flex;align-items:center;gap:8px;background:#0006;padding:8px 16px;border-radius:6px;border:1px solid var(--border);font-family:JetBrains Mono,monospace;font-size:11px;width:fit-content;margin-bottom:12px}.reservation-input{width:100%;background-color:#0000004d;border:1px solid var(--border);border-radius:6px;padding:12px 16px;color:var(--text);font-size:13px;box-sizing:border-box;transition:all .2s;font-family:JetBrains Mono,monospace}.reservation-input:focus{outline:none;border-color:var(--green);box-shadow:0 0 10px #00ff881a}.duration-selector{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-bottom:8px}.duration-option{background-color:#0000004d;border:1px solid var(--border);color:var(--text-dim);padding:10px;border-radius:6px;font-size:11px;cursor:pointer;text-align:center;transition:all .2s;font-weight:800;font-family:JetBrains Mono,monospace}.duration-option:hover{border-color:var(--text-muted);background-color:#ffffff05}.duration-option.active{background-color:#00ff880d;border-color:var(--green);color:var(--green);box-shadow:0 0 10px #00ff881a}.btn-cancel{background:transparent;border:1px solid var(--border);color:var(--text-dim);padding:10px 24px;border-radius:6px;font-size:12px;font-weight:700;cursor:pointer;transition:all .2s;text-transform:uppercase;font-family:JetBrains Mono,monospace}.btn-reserve{background:var(--green);color:var(--bg);border:none;padding:10px 24px;border-radius:6px;font-size:12px;font-weight:800;cursor:pointer;transition:all .2s;text-transform:uppercase;font-family:JetBrains Mono,monospace;box-shadow:0 0 15px #0f83}.btn-reserve:hover:not(:disabled){background:#00e67a;box-shadow:0 0 25px #0f86}.btn-reserve:disabled{background-color:var(--border);color:var(--text-dim);cursor:not-allowed;box-shadow:none;filter:grayscale(1);opacity:.5}.title-icon{color:var(--green)}.tag-modal-body{display:flex;flex-direction:column;gap:20px}.device-id-badge{display:inline-flex;align-items:center;gap:8px;background:#0006;padding:8px 16px;border-radius:6px;border:1px solid var(--border);font-family:JetBrains Mono,monospace;font-size:11px}.device-id-badge .label{color:var(--text-dim);text-transform:uppercase;font-weight:800;font-size:10px}.device-id-badge .value{color:var(--green);font-weight:800}.tags-display-section label{display:block;font-size:11px;font-weight:800;color:var(--text-dim);text-transform:uppercase;letter-spacing:.1em;margin-bottom:8px;font-family:JetBrains Mono,monospace}.input-with-button{display:flex;gap:8px}.input-with-button input{flex:1;background:#0000004d;border:1px solid var(--border);border-radius:6px;padding:10px 14px;color:var(--text);font-size:13px;transition:all .2s;font-family:JetBrains Mono,monospace}.input-with-button input:focus{outline:none;border-color:var(--green);box-shadow:0 0 15px #0f83}.add-inline-btn{background:var(--green);color:var(--bg);border:none;border-radius:6px;width:40px;display:flex;align-items:center;justify-content:center;cursor:pointer;transition:all .2s}.add-inline-btn:hover:not(:disabled){background:#00e67a;box-shadow:0 0 15px #00ff884d}.add-inline-btn:disabled{background:var(--border);color:var(--text-dim);cursor:not-allowed;filter:grayscale(1);opacity:.5}.tags-list{display:flex;flex-wrap:wrap;gap:8px;min-height:48px;padding:12px;background:#0006;border-radius:6px;border:1px dashed var(--border)}.tag-pill-editable{display:flex;align-items:center;gap:6px;background:#00ff880d;color:var(--green);padding:6px 12px;border-radius:6px;font-size:11px;font-weight:800;border:1px solid rgba(0,255,136,.3);font-family:JetBrains Mono,monospace;text-transform:uppercase;letter-spacing:.05em;box-shadow:0 0 10px #00ff880d}.remove-tag{background:transparent;border:none;color:var(--green);cursor:pointer;padding:2px;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:all .2s;opacity:.7}.remove-tag:hover{background:#0f83;opacity:1}.btn-cancel{padding:10px 24px;border-radius:6px;background:transparent;border:1px solid var(--border);color:var(--text-dim);font-weight:700;cursor:pointer;transition:all .2s;text-transform:uppercase;font-size:12px;font-family:JetBrains Mono,monospace}.btn-cancel:hover{color:var(--text);border-color:var(--text-muted)}.btn-save{padding:10px 24px;border-radius:6px;background:var(--green);border:none;color:var(--bg);font-weight:800;cursor:pointer;transition:all .2s;box-shadow:0 0 15px #0f83;text-transform:uppercase;font-size:12px;font-family:JetBrains Mono,monospace}.btn-save:hover:not(:disabled){background:#00e67a;box-shadow:0 0 25px #0f86}.btn-save:disabled{background-color:var(--border);color:var(--text-dim);cursor:not-allowed;box-shadow:none;filter:grayscale(1);opacity:.5}.dc2{position:relative;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:12px 14px 14px 16px;font-family:Inter,sans-serif;display:flex;flex-direction:column;gap:8px;min-height:200px;transition:border-color var(--motion-fast),box-shadow var(--motion-fast)}.dc2:hover{border-color:var(--border-strong);box-shadow:var(--shadow-md)}.dc2-stripe{position:absolute;left:0;top:12px;bottom:12px;width:2px;border-radius:0 2px 2px 0}.dc2-ready .dc2-stripe{background:var(--status-ready-fg)}.dc2-busy .dc2-stripe{background:var(--status-busy-fg)}.dc2-reserved .dc2-stripe{background:var(--status-reserved-fg)}.dc2-error .dc2-stripe{background:var(--status-error-fg)}.dc2-offline .dc2-stripe{background:var(--status-offline-fg)}.dc2-header{display:flex;justify-content:space-between;align-items:center}.dc2-platform{color:var(--text-muted);font-size:11px;font-weight:500}.dc2-name{color:var(--text);font-size:15px;font-weight:600;letter-spacing:-.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.dc2-udid{color:var(--text-dim);font-family:JetBrains Mono,monospace;font-size:11px}.dc2-tags{display:flex;gap:4px;flex-wrap:wrap;align-items:center}.dc2-team-pill{background:transparent;border:1px solid var(--border);font-size:11px;padding:2px 8px;border-radius:999px;color:var(--text);cursor:pointer;font-family:Inter,sans-serif;line-height:1.4;transition:border-color var(--motion-fast)}.dc2-team-pill:hover{border-color:var(--border-strong)}.dc2-team-pill:focus-visible{outline:2px solid var(--accent, var(--border-strong));outline-offset:1px}.dc2-team-select{font-size:11px;padding:2px 6px;border-radius:var(--radius-sm);background:var(--surface);border:1px solid var(--border);color:var(--text);font-family:Inter,sans-serif}.dc2-metrics{background:var(--bg);border-radius:var(--radius-sm);padding:10px 12px;display:flex;flex-direction:column;gap:6px;margin-top:auto}.dc2-banner{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:600;padding:3px 8px;border-radius:var(--radius-sm);font-family:Inter,sans-serif;width:fit-content}.dc2-banner-reserved{color:var(--status-reserved-fg);background:var(--status-reserved-bg)}.dc2-banner-session{color:var(--status-busy-fg);background:var(--status-busy-bg)}.dc2-actions{display:flex;gap:6px;align-items:center}.dc2-primary{flex:1;justify-content:center}.dc2-more{background:transparent;border:1px solid var(--border);color:var(--text-muted);border-radius:var(--radius-md);width:32px;height:26px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;transition:background var(--motion-fast),color var(--motion-fast)}.dc2-more:hover{background:var(--surface-2);color:var(--text)}.dc2-health{display:flex;gap:6px;margin-top:4px;flex-wrap:wrap}.device-explorer-card-container{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:16px;padding:16px;flex:1}.device-explorer-card-container::-webkit-scrollbar{width:6px}.device-explorer-card-container::-webkit-scrollbar-thumb{background:var(--border);border-radius:8px}.device-explorer-container{display:flex;flex-direction:column;width:100%;gap:var(--space-4)}.device-explorer-header-container{display:flex;align-items:center;justify-content:space-between;padding:4px 24px;background:#0f0f1ae6;backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border-bottom:2px solid var(--border);position:sticky;top:0;z-index:1002;gap:var(--space-8);flex-wrap:nowrap;box-shadow:0 10px 30px #0006}.device-explorer-header-left-container{display:flex;align-items:center;gap:24px;flex:1;min-width:0}.device-explorer-header-entry{display:flex;flex-direction:column;gap:4px;min-width:0}.device-explorer-header-entry-header{font-size:11px;font-weight:700;color:var(--text-dim);text-transform:uppercase;letter-spacing:.1em;font-family:JetBrains Mono,monospace}.device-explorer-header-value{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.device-explorer-header-value>.device-explorer-header__platform-btn+.device-explorer-header__platform-btn{margin-left:4px}.device-explorer-header__platform-btn,.device-explorer-header__device-state{display:flex;align-items:center;gap:6px;padding:6px 12px;border-radius:6px;background:#0006;border:1px solid var(--border);color:var(--text-muted);font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;cursor:pointer;transition:all .2s ease}.device-explorer-header__platform-btn:hover,.device-explorer-header__device-state:hover{background:#ffffff08;color:var(--text);border-color:var(--border)}.device-explorer-header__platform-btn.selected,.device-explorer-header__device-state.selected{background:#00ff880d;color:var(--green);border-color:#00ff884d;box-shadow:0 0 10px #00ff881a}.device-explorer-header__device-state.ready.selected{border-color:var(--green);box-shadow:0 0 15px #0f83}.device-explorer-header__device-state.busy.selected{background:#ffb8000d;color:var(--status-busy-fg);border-color:#ffb8004d;box-shadow:0 0 15px #ffb8001a}.device-explorer-header__device-state.offline.selected{background:#4a4a6a1a;color:var(--text-dim);border-color:var(--text-dim)}.device-explorer-search-wrapper{position:relative;width:320px}.device-explorer-search-icon{position:absolute;left:12px;top:50%;transform:translateY(-50%);pointer-events:none;opacity:.5}.device-explorer-header-text-filter{width:100%;height:32px;padding:0 12px 0 36px;border-radius:6px;border:1px solid var(--border);background:#0006;font-family:JetBrains Mono,monospace;font-size:12px;color:var(--text);transition:all .2s ease}.device-explorer-header-text-filter:focus{outline:none;border-color:var(--green);background:#0009;box-shadow:0 0 15px #00ff881a}.device-explorer-header-text-filter::placeholder{color:var(--text-dim);text-transform:uppercase;font-size:11px;letter-spacing:.1em}.device-explorer-header-right-container{display:flex;align-items:center;gap:12px}.device-explorer-header-filter-count{display:flex;align-items:center;gap:8px;padding-right:16px;border-right:1px solid var(--border)}@media (max-width: 1024px){.device-explorer-header-container{flex-direction:column;align-items:stretch;gap:var(--space-4);padding:var(--space-4)}.device-explorer-header-left-container{flex-wrap:wrap;gap:var(--space-4)}.device-explorer-header-entry{flex:1;min-width:120px}.device-explorer-search-wrapper{width:100%}.device-explorer-header-right-container{justify-content:space-between;width:100%}}@media (max-width: 640px){.device-explorer-header-left-container{display:flex;flex-direction:column;align-items:stretch;gap:var(--space-3)}.device-explorer-header-entry,.device-explorer-header-value,.device-explorer-header-filter-count{width:100%;min-width:0}.device-explorer-header-filter-count{padding-right:0;border-right:none;justify-content:flex-start}.device-explorer-header-right-container{flex-direction:row;flex-wrap:wrap;align-items:center;gap:var(--space-2);width:100%}}.device-explorer-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:80px 40px;background:#0f0f1a66;border:1px dashed var(--border);border-radius:var(--radius-md);text-align:center;margin:60px auto 40px;max-width:600px;gap:var(--space-4)}.device-explorer-empty-icon{width:64px;height:64px;background:#00ff880d;border-radius:50%;display:flex;align-items:center;justify-content:center;color:var(--green);margin-bottom:8px;border:1px solid rgba(0,255,136,.1)}.device-explorer-empty h3{font-size:1.5rem;font-weight:700;color:var(--text);margin:0;font-family:Outfit,sans-serif}.device-explorer-empty p{color:var(--text-muted);font-size:14px;max-width:400px;line-height:1.6;margin:0}.device-explorer-empty .Button{margin-top:8px}.device-control-modal-overlay{position:fixed;top:0;right:0;bottom:0;left:0;background:var(--bg);z-index:6000;display:flex;flex-direction:column;padding:0;margin:0;animation:modal-fade-in .25s ease-out}.device-control-modal{flex:1;width:100%;height:100%;overflow:hidden;display:flex;flex-direction:column;background:var(--bg)}@keyframes modal-fade-in{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.de2-sticky-group{position:sticky;top:0;z-index:1002;background:var(--bg);backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);box-shadow:0 6px 16px -8px #00000080}.de2-toolbar{display:flex;gap:10px;align-items:center;padding:12px 20px;border-bottom:1px solid var(--border);background:transparent;box-shadow:none;flex-wrap:wrap}.de2-search{flex:1;min-width:200px;height:28px;background:var(--surface);border:1px solid var(--border);border-radius:var(--radius-md);padding:0 10px;color:var(--text);font-family:Inter,sans-serif;font-size:12px;outline:none}.de2-search::placeholder{color:var(--text-dim)}.de2-search:focus{border-color:var(--border-strong)}.device-explorer-empty h3{color:var(--text);font-family:Inter,sans-serif;font-weight:700;letter-spacing:-.01em}.device-control-view{display:flex;flex-direction:column;height:100%;width:100%;background:var(--bg);color:var(--text);overflow:hidden;font-family:Inter,sans-serif}*{scrollbar-width:thin;scrollbar-color:var(--border) transparent}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:var(--border);border-radius:8px;-webkit-transition:background .2s;transition:background .2s}::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.control-view-top-bar{display:flex;align-items:center;padding:0 24px;height:64px;background:var(--surface);border-bottom:2px solid var(--border);gap:24px;z-index:100;position:relative}.device-info-mini{display:flex;align-items:center;gap:16px}.device-pill{font-size:11px;font-weight:800;text-transform:uppercase;padding:2px 10px;border-radius:6px;letter-spacing:.1em;font-family:JetBrains Mono,monospace}.platform-pill{background:#00ff880d;color:var(--green);border:1px solid rgba(0,255,136,.2)}.version-pill{background:#ffb8000d;color:var(--status-busy-fg);border:1px solid rgba(255,184,0,.2)}.reserved-pill{background:#38bdf81a;color:#38bdf8;border:1px solid rgba(56,189,248,.3);animation:pulse-reserved-pill 2s infinite ease-in-out}.device-name-text{font-family:Outfit,sans-serif;font-weight:800;font-size:14px;color:var(--text);letter-spacing:.02em;text-transform:uppercase}.code-font{font-family:JetBrains Mono,monospace;font-size:11px;color:var(--text-dim);background:#0006;padding:4px 10px;border-radius:6px;border:1px solid var(--border)}.udid-chip{display:inline-flex;align-items:center;gap:6px;padding:3px 4px 3px 10px;font-family:JetBrains Mono,monospace;font-size:11px;color:var(--text-dim);background:#0006;border-radius:6px;border:1px solid var(--border);max-width:280px}.udid-chip__value{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.udid-chip__copy{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border:none;background:transparent;border-radius:4px;color:var(--text-muted);cursor:pointer;transition:background .15s,color .15s;flex-shrink:0}.udid-chip__copy:hover{background:#ffffff0d;color:var(--green)}.back-to-devices-btn{background:#0006;color:var(--text-dim);border:1px solid var(--border);padding:8px 16px;border-radius:6px;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.1em;display:flex;align-items:center;gap:8px;transition:all .2s;cursor:pointer}.back-to-devices-btn:hover{background:#ffffff08;border-color:var(--green);color:var(--green)}.control-view-main{display:flex;flex-direction:row;flex:1;overflow:hidden;padding:24px;gap:32px;background:var(--bg);justify-content:center;align-items:stretch;min-height:0}.control-view-main.is-landscape{align-items:flex-start}.control-view-main.omni-mode{gap:20px}.control-view-main.omni-mode .device-preview-column{min-width:320px}.device-preview-column{display:flex;flex-direction:column;align-items:center;gap:24px;flex-shrink:1;min-width:0}.device-screen-wrapper{position:relative;padding:12px;background:#000;border-radius:48px;box-shadow:0 0 0 2px #334155,0 20px 50px #0009,0 0 80px #10b9810d;border:1px solid rgba(255,255,255,.1);transition:all .5s cubic-bezier(.16,1,.3,1)}.device-screen-wrapper:hover{transform:translateY(-4px) scale(1.005);box-shadow:0 0 0 2px var(--green),0 30px 60px #000c,0 0 100px #10b9811a}.device-stream-canvas{position:relative;background:#000;border-radius:28px;overflow:hidden;cursor:crosshair;transition:box-shadow .3s ease,border-color .3s ease;outline:none;border:2px solid transparent}.device-stream-canvas.focused{border-color:var(--green);box-shadow:0 0 20px var(--accent-subtle)}.device-stream-image{pointer-events:none;-webkit-user-select:none;user-select:none;-webkit-user-drag:none}.device-stream-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;width:100%;color:var(--text-muted);gap:16px;background:radial-gradient(circle at center,#0f172a,#020617)}.device-footer-actions{display:flex;flex-wrap:wrap;justify-content:center;width:100%;background:#0f172acc;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-radius:16px;border:1px solid rgba(255,255,255,.08);padding:6px;gap:6px;box-shadow:0 10px 25px -5px #0006,0 0 15px #10b9810d}.footer-action-btn{flex:1;display:flex;align-items:center;justify-content:center;gap:8px;padding:12px;color:var(--text-muted);font-size:11px;text-transform:uppercase;font-weight:700;letter-spacing:.05em;border:none;background:transparent;border-radius:var(--radius-sm);transition:all .2s ease}.footer-action-btn:hover{background:#ffffff0d;color:var(--text)}.footer-action-btn.active{background:#ffffff0a;color:var(--green);box-shadow:inset 0 -2px 0 0 var(--green)}.footer-divider{width:1px;height:24px;background:var(--border);margin:auto 4px}.hint-text{font-size:11px;color:var(--text-muted);font-style:italic;margin-top:4px}.device-interactions-column{flex:1;display:flex;flex-direction:column;gap:0;min-width:450px;max-width:1200px;height:100%;overflow:hidden;min-height:0}.interaction-tabs{display:flex;gap:4px;background:var(--surface);padding:4px;border-radius:6px;border:1px solid var(--border);margin-bottom:16px;flex-shrink:0}.tab-btn{flex:1 1 0;min-width:0;display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:8px 10px;background:transparent;border:none;font-size:11px;font-weight:800;color:var(--text-dim);text-transform:uppercase;letter-spacing:.08em;border-radius:4px;cursor:pointer;transition:all .2s;font-family:JetBrains Mono,monospace;white-space:nowrap}.tab-btn>svg{flex-shrink:0;opacity:.7;transition:opacity .15s}.tab-btn:hover>svg,.tab-btn.active>svg{opacity:1}.tab-btn:hover{color:var(--text);background:#ffffff05}.tab-btn.active{color:var(--bg);background:var(--green);box-shadow:0 0 15px #00ff884d}.interactions-scroll-area{flex:1;overflow-y:auto;overflow-x:hidden;padding-right:8px;display:flex;flex-direction:column}.action-card{background:#0003;border-radius:6px;padding:20px;border:1px solid var(--border);transition:all .2s;display:flex;flex-direction:column;gap:16px}.action-card:hover{background:#ffffff03;border-color:var(--green);box-shadow:0 4px 20px #0006}.action-card-title{font-family:Outfit,sans-serif;font-size:13px;font-weight:800;color:var(--text);display:flex;align-items:center;gap:12px;text-transform:uppercase;letter-spacing:.1em;opacity:.9}.compact-label{font-size:11px;color:var(--text-muted);font-weight:600;text-transform:uppercase;letter-spacing:.05em}.action-card-hint{margin:-4px 0 4px;font-size:12px;color:var(--text-muted);line-height:1.5}.actions-grid{display:flex;flex-direction:column;gap:16px}.btn-sm{padding:8px 16px;font-size:11px}.type-input-field.compact,.app-select-dropdown.compact{padding:10px;font-size:13px}.file-select-box.compact{padding:var(--space-4);margin-bottom:8px}.clipboard-display.compact{min-height:48px;max-height:80px;overflow-y:auto;padding:8px;font-size:11px;background:#0006}.actions-row{display:flex;gap:var(--space-8)}.install-app-section,.uninstall-app-section{flex:1;display:flex;flex-direction:column;gap:12px;min-width:0}.file-select-box{background:#ffffff08;border:2px dashed var(--border);border-radius:var(--radius-md);padding:var(--space-8);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-4);transition:all .3s ease}.file-select-box:hover{background:#10b9810d;border-color:var(--green)}.btn-premium,.btn-secondary{padding:10px 20px;border-radius:var(--radius-sm);font-weight:700;font-size:11px;text-transform:uppercase;letter-spacing:.05em;cursor:pointer;transition:all .2s cubic-bezier(.16,1,.3,1);display:flex;align-items:center;justify-content:center;gap:8px;border:none}.btn-premium{background:var(--green);color:#000}.btn-premium:hover:not(:disabled){background:var(--green-dim);transform:translateY(-1px);box-shadow:0 4px 12px var(--accent-subtle)}.btn-secondary{background:#ffffff0d;color:var(--text);border:1px solid var(--border)}.btn-secondary:hover:not(:disabled){background:#ffffff1a;color:var(--text);border-color:var(--text-muted)}.btn-secondary.active{background:var(--primary-soft);color:var(--green);border-color:var(--green)}.btn-sm{padding:6px 12px!important;font-size:11px!important}.type-input-field,.app-select-dropdown{width:100%;padding:10px 14px;border-radius:var(--radius-sm);border:1px solid var(--border);background:#0003;font-size:13px;color:var(--text);transition:all .2s ease}.type-input-field:focus{outline:none;border-color:var(--green);background:#0006;box-shadow:0 0 0 3px var(--primary-soft)}.clipboard-display{background:#161b22b3;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-radius:var(--radius-md);border:1px solid var(--border);padding:var(--space-4);margin-top:var(--space-4);font-family:Fira Code,monospace;font-size:12px;color:#38bdf8;min-height:80px;box-shadow:inset 0 2px 10px #00000080}.log-display-area{flex:1;min-height:0;overflow-y:auto;font-family:Fira Code,monospace;font-size:11px;line-height:1.5;background:#161b22b3;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);padding:16px;border-radius:0 0 var(--radius-md) var(--radius-md);color:var(--text-muted);box-shadow:inset 0 2px 20px #00000080;border:1px solid var(--border);border-top:none;scrollbar-width:thin;scrollbar-color:var(--green) transparent}.log-line{display:flex;gap:12px;margin-bottom:0;padding:2px 8px 2px 6px;white-space:pre-wrap;word-break:break-all;border-left:2px solid transparent;transition:background .15s ease}.log-line:nth-child(odd){background:#ffffff03}.log-line:hover{background:#ffffff0d}.log-index{color:var(--text-dim);opacity:.55;-webkit-user-select:none;user-select:none;min-width:38px;text-align:right;font-size:11px;font-variant-numeric:tabular-nums}.log-content{flex:1}.log-notice{border-left-color:#38bdf8;color:#cbd5f5}.log-info,.log-debug{border-left-color:transparent;color:var(--text-muted)}.log-warn{border-left-color:#fbbf24;color:#fde68a}.log-warn:nth-child(odd),.log-warn:nth-child(2n){background:#fbbf240a}.log-error{border-left-color:#f43f5e;color:#fecdd3;background:#f43f5e0f;font-weight:500}.log-error:nth-child(odd),.log-error:nth-child(2n){background:#f43f5e14}.log-toolbar{display:flex;justify-content:space-between;align-items:center;background:#0f172a99;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);padding:8px 16px;border-radius:var(--radius-md) var(--radius-md) 0 0;border:1px solid var(--border);border-bottom:none}.log-filter-group,.log-actions-group{display:flex;gap:8px;align-items:center}.log-search-box{position:relative;display:flex;align-items:center}.search-icon-inline{position:absolute;left:8px;color:var(--text-muted);pointer-events:none;opacity:.6}.log-search-box .type-input-field.tiny{padding-left:28px!important;width:140px;background:#0003;border-color:var(--border)}.log-stat-pill{font-size:11px;background:#10b9811a;color:var(--green);padding:3px 8px;border-radius:4px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;display:flex;align-items:center;gap:6px}.log-live-dot{width:8px;height:8px;border-radius:50%;background:var(--text-muted);flex-shrink:0;transition:background .3s ease}.log-live-dot.active{background:#22c55e;box-shadow:0 0 8px #22c55e99;animation:pulse-dot 2s infinite}@keyframes pulse-dot{0%,to{opacity:1;box-shadow:0 0 8px #22c55e99}50%{opacity:.6;box-shadow:0 0 16px #22c55e66}}.log-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;text-align:center;min-height:200px}.log-empty-title{font-family:Outfit,sans-serif;font-size:14px;font-weight:700;color:var(--text);margin:0 0 6px;letter-spacing:.02em}.log-empty-subtitle{font-size:12px;color:var(--text-muted);max-width:300px;margin:0;line-height:1.5}.animate-pulse{animation:pulse-op 1.5s infinite}@keyframes pulse-op{0%,to{opacity:1}50%{opacity:.4}}.tab-content{animation:slideUpFade .4s cubic-bezier(.16,1,.3,1);display:flex;flex-direction:column;flex:1;min-height:0}@keyframes slideUpFade{0%{opacity:0;transform:translateY(20px)}to{opacity:1;transform:translateY(0)}}.gestures-grid-container{display:flex;flex-direction:column;align-items:center;gap:12px}.gestures-dpad{display:grid;grid-template-columns:repeat(3,1fr);grid-template-rows:repeat(3,1fr);gap:8px;width:140px;height:140px;padding:12px;background:#0003;border-radius:50%;border:1px solid rgba(255,255,255,.05)}.dpad-btn{display:flex;align-items:center;justify-content:center;background:#ffffff08;border:1px solid rgba(255,255,255,.05);border-radius:8px;color:var(--text-muted);cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1)}.dpad-btn:hover{background:var(--green);border-color:var(--green);color:#fff;transform:scale(1.1);box-shadow:0 0 20px var(--accent-subtle);z-index:2}.dpad-btn:active{transform:scale(.95)}.dpad-center{background:radial-gradient(circle,var(--accent-subtle) 0%,transparent 70%);border-radius:50%;opacity:.2}.app-mgmt-content{display:flex;flex-direction:row;gap:var(--space-8);align-items:flex-start}.upload-box-row,.uninstall-controls-row{display:flex;gap:12px;align-items:center;margin-top:8px}.file-upload-launcher{flex:1;display:flex;align-items:center;gap:12px;padding:10px 16px;background:#ffffff08;border:1px dashed var(--border);border-radius:var(--radius-md);cursor:pointer;font-size:13px;color:var(--text-muted);transition:all .2s ease}.file-upload-launcher:hover{background:#10b9810d;border-color:var(--green);color:var(--text)}.divider-v{width:1px;align-self:stretch;background:linear-gradient(180deg,transparent,var(--border),transparent)}.select-wrapper{flex:1;position:relative;display:flex;align-items:center}.select-loader{position:absolute;right:32px;color:var(--green)}.btn-destructive{background:var(--status-error-fg);color:#fff;border:1px solid transparent;padding:10px 20px;border-radius:var(--radius-sm);font-weight:700;font-size:11px;text-transform:uppercase;letter-spacing:.05em;display:flex;align-items:center;gap:8px;cursor:pointer;transition:background .2s ease,transform .2s ease,box-shadow .2s ease}.btn-destructive:hover:not(:disabled){background:#dc2626;transform:translateY(-1px);box-shadow:0 4px 12px #ef444459}.btn-destructive:disabled{opacity:.5;cursor:not-allowed}.manual-input-box{margin-top:8px;padding-top:8px;border-top:1px solid rgba(255,255,255,.05)}.type-input-field.tiny{padding:8px 12px;font-size:12px;opacity:.6}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.action-card-header{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:12px}.screenshot-workspace{display:flex;gap:20px;flex:1;min-height:0;overflow:hidden}.screenshot-gallery-sidebar{width:180px;display:flex;flex-direction:column;gap:16px;flex-shrink:0;min-height:0}.take-screenshot-btn{display:flex;align-items:center;justify-content:center;gap:8px;width:100%}.screenshot-thumbnails-list{flex:1;overflow-y:auto;display:flex;flex-direction:column;gap:10px;padding-right:4px;min-height:0}.screenshot-thumb-item{position:relative;border-radius:8px;overflow:hidden;aspect-ratio:9/16;background:#0006;border:2px solid transparent;cursor:pointer;transition:all .2s ease;flex-shrink:0}.screenshot-thumb-item:hover{border-color:#10b98166}.screenshot-thumb-item.active{border-color:var(--green);box-shadow:0 0 12px var(--accent-subtle)}.screenshot-thumb-item img{width:100%;height:100%;object-fit:cover;opacity:.7;transition:opacity .2s ease}.screenshot-thumb-item:hover img,.screenshot-thumb-item.active img{opacity:1}.thumb-time{position:absolute;bottom:0;left:0;right:0;background:#000000b3;color:#fff;font-size:11px;padding:2px 4px;text-align:center;font-family:JetBrains Mono,monospace}.thumb-delete-btn{position:absolute;top:4px;right:4px;width:20px;height:20px;border-radius:4px;background:#ef4444cc;color:#fff;border:none;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .2s ease}.screenshot-thumb-item:hover .thumb-delete-btn{opacity:1}.thumb-delete-btn:hover{background:var(--status-error-fg)}.screenshot-main-preview{flex:1;background:#0000004d;border-radius:8px;display:flex;align-items:center;justify-content:center;overflow:hidden;position:relative;border:1px solid rgba(255,255,255,.05);min-height:0}.preview-container{display:flex;flex-direction:column;width:100%;height:100%;position:relative}.preview-image-wrapper{flex:1;position:relative;min-height:0}.preview-image-wrapper img{position:absolute;top:20px;bottom:20px;left:20px;right:20px;max-width:calc(100% - 40px);max-height:calc(100% - 40px);object-fit:contain;margin:auto;border-radius:4px;box-shadow:0 10px 40px #00000080}.preview-footer{padding:16px 24px;background:#0006;border-top:1px solid rgba(255,255,255,.05);display:flex;justify-content:space-between;align-items:center}.preview-meta{display:flex;align-items:center;gap:8px;font-size:11px;color:var(--text-muted)}.meta-label{text-transform:uppercase;font-weight:700;opacity:.5}.meta-divider{opacity:.2}.preview-actions{display:flex;gap:12px}.btn-text-only{background:transparent;border:none;color:var(--text-muted);font-size:11px;font-weight:700;letter-spacing:.05em;cursor:pointer;padding:4px 8px;border-radius:4px}.btn-text-only:hover{color:#ef4444;background:#ef44440d}.preview-empty-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--text-muted);font-size:13px;opacity:.6}.empty-gallery-state{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;padding:24px 12px;color:var(--text-muted);font-size:11px;text-align:center}.empty-gallery-icon{opacity:.4}.empty-gallery-title{font-weight:700;font-size:12px;color:var(--text);margin:0}.empty-gallery-hint{margin:0;font-size:11px;color:var(--text-muted);line-height:1.4;max-width:160px}.empty-gallery-hint strong{color:var(--green);font-weight:700}.interactions-scroll-area.terminal-mode{overflow:hidden;padding:0;display:flex;flex-direction:column;height:100%;min-height:0}.omni-inspector-tab-wrapper{flex:1;min-height:0;display:flex;flex-direction:column}.interactions-scroll-area.terminal-mode .action-card.full-height{height:100%;min-height:0;border-radius:0;border:none}.interactions-scroll-area.screenshot-mode{overflow:hidden;height:100%;min-height:0;display:flex;flex-direction:column;padding:0}.interactions-scroll-area.screenshot-mode .tab-content{display:flex;flex-direction:column;flex:1 1 0%;min-height:0;padding:0}.interactions-scroll-area.screenshot-mode .action-card.screenshot-card{display:flex;flex-direction:column;flex:1;min-height:0;margin-bottom:0;border-radius:0;border:none;padding:0;overflow:hidden}@media (max-width: 900px){.control-view-main{flex-direction:column;padding:16px;gap:16px;overflow-y:auto}.device-preview-column{min-width:0;width:100%;max-width:420px;margin:0 auto}.device-interactions-column{width:100%;max-width:100%;min-width:0}}.terminal-container{display:flex;flex-direction:column;background-color:var(--bg);color:var(--text);font-family:JetBrains Mono,monospace;border-radius:6px;overflow:hidden;height:100%;max-height:100%;width:100%;min-height:0;border:1px solid var(--border);box-shadow:0 20px 50px #00000080;position:relative}.terminal-header{display:flex;align-items:center;justify-content:space-between;padding:12px 20px;background-color:#0006;border-bottom:2px solid var(--border)}.terminal-controls{display:flex;gap:8px;width:60px}.dot{width:8px;height:8px;border-radius:4px;border:1px solid rgba(255,255,255,.1)}.dot.red{background-color:#ff4d4d}.dot.yellow{background-color:#fc0}.dot.green{background-color:var(--green)}.terminal-title{font-size:11px;font-weight:800;color:var(--text-dim);text-transform:uppercase;letter-spacing:.15em;font-family:JetBrains Mono,monospace}.terminal-actions{display:flex;justify-content:flex-end;width:60px}.terminal-action-btn{background:transparent;border:1px solid var(--border);color:var(--text-dim);font-size:11px;font-weight:800;padding:4px 10px;border-radius:6px;cursor:pointer;transition:all .2s;text-transform:uppercase;font-family:JetBrains Mono,monospace}.terminal-action-btn:hover{color:var(--text);background:#ffffff0d;border-color:var(--text-muted)}.terminal-history{flex:1;overflow-y:auto;overflow-x:hidden;padding:20px;font-size:12px;line-height:1.6;scrollbar-width:thin;scrollbar-color:var(--green) var(--bg);min-height:0}.terminal-history::-webkit-scrollbar{width:6px}.terminal-history::-webkit-scrollbar-track{background:transparent}.terminal-history::-webkit-scrollbar-thumb{background-color:var(--border);border-radius:4px}.terminal-history::-webkit-scrollbar-thumb:hover{background-color:var(--green)}.terminal-line{margin-bottom:6px;white-space:pre-wrap;word-break:normal;overflow-wrap:anywhere}.terminal-line.command{color:var(--green);font-weight:600}.terminal-line.output{color:var(--text)}.terminal-line.error{color:#ff4d4d}.terminal-line.system{color:var(--text-dim);font-style:italic;border-bottom:1px dashed var(--border);padding-bottom:6px;margin-bottom:12px}.terminal-input-area{display:flex;align-items:center;padding:16px 20px;background-color:#0006;border-top:2px solid var(--border)}.terminal-prompt{color:var(--green);margin-right:12px;font-weight:800;-webkit-user-select:none;user-select:none}.terminal-input{flex:1;background:transparent;border:none;color:var(--text);font-family:inherit;font-size:13px;outline:none;font-weight:500}.terminal-input::placeholder{color:#ffffff1a}.terminal-loading-indicator{display:inline-block;width:8px;height:16px;background-color:var(--green);animation:blink 1s step-end infinite;vertical-align:middle;margin-left:8px;border-radius:4px}@keyframes blink{0%,to{opacity:1}50%{opacity:0}}.omni-inspector-container{display:flex;flex-direction:column;height:100%;background:var(--bg);color:var(--text);font-family:Inter,sans-serif;overflow:hidden;position:relative}.omni-main-content{flex:1;display:flex;gap:16px;padding:16px;overflow:hidden;height:100%}.omni-screenshot-panel{width:380px;min-width:320px;flex-shrink:0;display:flex;flex-direction:column;background:var(--surface);border-radius:6px;border:1px solid var(--border);overflow:hidden}.omni-screenshot-header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;background:#0006;border-bottom:2px solid var(--border)}.omni-screenshot-title{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.1em;color:var(--text);opacity:.9;font-family:JetBrains Mono,monospace}.omni-mode-toggle{display:flex;background:#0000004d;padding:2px;border-radius:6px;border:1px solid var(--border)}.omni-mode-btn{display:flex;align-items:center;gap:6px;padding:4px 10px;background:transparent;border:none;border-radius:4px;color:var(--text-dim);font-size:11px;font-weight:800;cursor:pointer;transition:all .2s;text-transform:uppercase;letter-spacing:.05em;font-family:JetBrains Mono,monospace}.omni-mode-btn.active{background:var(--green);color:var(--bg);box-shadow:0 0 10px #00ff884d}.omni-refresh-btn{display:flex;align-items:center;gap:6px;padding:6px 12px;background:var(--green);color:var(--bg);border:none;border-radius:6px;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.1em;cursor:pointer;transition:all .2s;font-family:JetBrains Mono,monospace}.omni-refresh-btn:hover:not(:disabled){background:#00e67a;box-shadow:0 0 15px #0f86}.omni-refresh-btn:disabled{opacity:.5;cursor:not-allowed}.omni-screenshot-container{flex:1;min-height:0;display:flex;align-items:center;justify-content:center;padding:12px;background:#161b22b3;position:relative;overflow:hidden}.omni-screenshot-wrapper{position:relative;max-width:100%;max-height:100%;height:100%;display:flex;align-items:center;justify-content:center;-webkit-user-select:none;user-select:none}.omni-screenshot-wrapper.interactable{cursor:crosshair}.omni-screenshot-img{max-width:100%;max-height:100%;width:auto;height:auto;object-fit:contain;border-radius:4px;display:block}.omni-overlay{position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none}.omni-overlay>*{pointer-events:auto}.omni-hit-area{position:absolute;cursor:pointer;background:transparent;transition:background .15s ease}.omni-hit-area:hover{background:#10b98133}.omni-frame-hover{position:absolute;border:2px solid var(--green);background:#10b9811a;pointer-events:none;border-radius:6px}.omni-frame-select{position:absolute;border:2px solid var(--green);background:#10b98133;pointer-events:none;box-shadow:0 0 20px var(--accent-subtle);border-radius:6px}.omni-frame-match{position:absolute;pointer-events:none;border-radius:6px;border-style:dashed;border-width:2px;animation:omni-match-pulse 1.6s ease-out 1}.omni-frame-match.unique{border-color:var(--green);background:#10b9811f;box-shadow:0 0 18px #10b98159}.omni-frame-match.multi{border-color:var(--amber, #f59e0b);background:#f59e0b1a;box-shadow:0 0 14px #f59e0b4d}@keyframes omni-match-pulse{0%{opacity:0;transform:scale(.96)}35%{opacity:1;transform:scale(1)}to{opacity:1;transform:scale(1)}}.omni-loading-overlay{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;background:#000c;color:var(--text-muted);font-size:11px}.omni-spinner{width:24px;height:24px;border:2px solid var(--border);border-top-color:var(--green);border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.omni-empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;color:var(--text-muted);text-align:center;padding:32px;font-size:12px}.omni-empty-state svg{opacity:.3}.omni-empty-state.small{padding:24px;font-size:11px}.omni-tree-panel{flex:1;min-width:0;display:flex;flex-direction:column;background:#0003;border-radius:6px;border:1px solid var(--border);overflow:hidden;min-height:0}.omni-tree-content{flex:1;min-height:0;overflow-y:auto;padding:8px;scrollbar-width:thin;scrollbar-color:var(--border) transparent}.omni-tree-header{display:flex;align-items:center;justify-content:space-between;padding:12px;background:#0006;border-bottom:2px solid var(--border)}.omni-tree-title{display:flex;align-items:center;gap:8px;font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.1em;color:var(--text);opacity:.9;font-family:JetBrains Mono,monospace}.omni-count-badge{font-size:11px;background:#00ff880d;color:var(--green);padding:2px 8px;border-radius:6px;font-weight:800;text-transform:uppercase;font-family:JetBrains Mono,monospace}.omni-action-btn{display:flex;align-items:center;justify-content:center;width:28px;height:28px;background:#ffffff05;border:1px solid var(--border);border-radius:6px;color:var(--text-dim);cursor:pointer;transition:all .2s}.omni-action-btn:hover{background:#ffffff0d;color:var(--green);border-color:var(--green)}.omni-tree-search{display:flex;align-items:center;gap:8px;margin:12px;padding:8px 12px;background:#0006;border:1px solid var(--border);border-radius:6px;transition:all .2s}.omni-tree-search:focus-within{border-color:var(--green);box-shadow:0 0 10px #00ff881a}.omni-tree-search input{flex:1;background:transparent;border:none;color:var(--text);font-size:11px;outline:none;font-family:JetBrains Mono,monospace}.tree-item{display:flex;align-items:center;gap:8px;padding:8px 12px;margin-bottom:2px;border-radius:4px;cursor:pointer;font-size:12px;color:var(--text-dim);transition:all .15s;border:1px solid transparent;min-height:36px;background:#0000001a}.tree-item:hover{background:#ffffff05;color:var(--text)}.tree-item.selected{background:#00ff8814;color:var(--green);border-color:#0f86;box-shadow:inset 0 0 0 1px #0f83}.tree-item.hovered:not(.selected){background:#ffffff0a;border-color:#ffffff1a;color:var(--text)}.tree-node{display:flex;flex-direction:column}.tree-children{margin-left:0}.tree-toggle{display:flex;align-items:center;justify-content:center;width:18px;height:18px;border:none;background:transparent;color:var(--text-muted);cursor:pointer;border-radius:3px;flex-shrink:0;padding:0;transition:color .15s,background .15s}.tree-toggle:hover{color:var(--green);background:#00ff881a}.tree-toggle-spacer{display:inline-block;width:18px;flex-shrink:0}.tree-item-indent{flex-shrink:0}.tree-icon{color:var(--text-muted);flex-shrink:0;opacity:.6}.tree-label{flex:1;font-size:12px;font-family:JetBrains Mono,Fira Code,monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tree-badge{font-size:10px;font-weight:700;background:#ffffff0f;color:var(--text-muted);padding:1px 5px;border-radius:4px;flex-shrink:0;font-family:JetBrains Mono,monospace}.omni-details-panel{flex:1;min-width:280px;max-width:360px;display:flex;flex-direction:column;background:var(--surface);border-radius:6px;border:1px solid var(--border);overflow:hidden;min-height:0}.omni-details-content{flex:1;min-height:0;overflow-y:auto;padding:16px;scrollbar-width:thin;scrollbar-color:var(--border) transparent}.omni-header-left{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.omni-tree-actions{display:flex;gap:6px;align-items:center}.omni-clear-btn{background:transparent;border:none;color:var(--text-muted);cursor:pointer;font-size:16px;padding:0 4px;line-height:1;border-radius:3px}.omni-clear-btn:hover{color:var(--text);background:#ffffff14}.omni-info-table,.omni-locators-list{display:flex;flex-direction:column;gap:6px}.omni-details-header{display:flex;align-items:center;gap:8px;padding:12px 16px;background:#0006;border-bottom:2px solid var(--border);font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.1em;color:var(--text);opacity:.9;font-family:JetBrains Mono,monospace}.omni-section{margin-bottom:24px}.omni-section-header{font-size:11px;font-weight:800;text-transform:uppercase;letter-spacing:.1em;color:var(--text-dim);margin-bottom:12px;padding-bottom:8px;border-bottom:1px solid var(--border);font-family:JetBrains Mono,monospace}.omni-info-row{display:flex;gap:16px;padding:12px 16px;background:#0006;border-radius:6px;border:1px solid var(--border);min-height:44px;align-items:center}.omni-info-key{width:60px;flex-shrink:0;font-size:11px;font-weight:800;text-transform:uppercase;color:var(--text-dim);font-family:JetBrains Mono,monospace}.omni-info-value{flex:1;font-size:11px;color:var(--text);word-break:break-all}.omni-layout-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}.omni-layout-item{display:flex;flex-direction:column;gap:6px;padding:12px 8px;background:#0006;border-radius:6px;border:1px solid var(--border);text-align:center;min-height:60px;justify-content:center}.omni-layout-label{font-size:11px;font-weight:800;text-transform:uppercase;color:var(--text-dim);font-family:JetBrains Mono,monospace}.omni-layout-value{font-size:12px;font-weight:800;color:var(--green);font-family:JetBrains Mono,monospace}.omni-locator-row{display:flex;align-items:center;gap:12px;padding:12px 16px;background:#0009;border-radius:6px;border:1px solid var(--border);border-left:3px solid var(--green);transition:all .2s;min-height:48px}.omni-locator-strategy{flex-shrink:0;font-size:11px;font-weight:800;text-transform:uppercase;background:#00ff880d;color:var(--green);padding:2px 6px;border-radius:6px;letter-spacing:.05em;font-family:JetBrains Mono,monospace}.omni-locator-value{flex:1;font-family:JetBrains Mono,monospace;font-size:11px;color:var(--text-muted);word-break:break-all;line-height:1.5}.omni-copy-btn{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:24px;height:24px;background:#ffffff08;border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text-muted);cursor:pointer;transition:all .2s ease}.omni-copy-btn:hover{background:var(--green);border-color:var(--green);color:#000}.omni-locator-actions{display:flex;flex-direction:column;gap:4px;flex-shrink:0}.omni-test-btn{display:flex;align-items:center;justify-content:center;width:24px;height:24px;background:#ffffff08;border:1px solid var(--border);border-radius:var(--radius-sm);color:var(--text-muted);cursor:pointer;transition:all .2s ease}.omni-test-btn:hover{background:#10b9811f;border-color:var(--green);color:var(--green)}.omni-test-btn.active{background:var(--green);border-color:var(--green);color:#000}.omni-match-badge{display:inline-flex;align-items:center;gap:3px;padding:1px 6px;border-radius:4px;font-size:9.5px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;border:1px solid transparent;line-height:1.4;white-space:nowrap}.omni-match-badge.unique{background:#10b9811f;border-color:#10b98166;color:var(--green)}.omni-match-badge.multi{background:#f59e0b1f;border-color:#f59e0b66;color:var(--amber, #f59e0b)}.omni-match-badge.zero{background:#ef44441f;border-color:#ef444466;color:var(--red, #ef4444)}.omni-match-badge.unsupported{background:#ffffff0a;border-color:var(--border);color:var(--text-dim)}.omni-copy-btn.copied{background:var(--green);border-color:var(--green);color:#000}.omni-attributes-table{display:flex;flex-direction:column;gap:4px;background:#161b22b3;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-radius:var(--radius-sm);border:1px solid var(--border);padding:8px;max-height:200px;overflow-y:auto}.omni-attr-row{display:flex;gap:8px;padding:6px 8px;border-radius:4px;transition:background .2s ease}.omni-attr-row:hover{background:#ffffff08}.omni-attr-key{width:120px;flex-shrink:0;font-size:11px;font-weight:600;color:var(--text-muted);font-family:Fira Code,monospace}.omni-attr-value{flex:1;font-size:11px;color:#e2e8f0;font-family:Fira Code,monospace;word-break:break-all}.omni-tree-content::-webkit-scrollbar,.omni-details-content::-webkit-scrollbar,.omni-attributes-table::-webkit-scrollbar{width:6px}.omni-tree-content::-webkit-scrollbar-track,.omni-details-content::-webkit-scrollbar-track,.omni-attributes-table::-webkit-scrollbar-track{background:transparent}.omni-tree-content::-webkit-scrollbar-thumb,.omni-details-content::-webkit-scrollbar-thumb,.omni-attributes-table::-webkit-scrollbar-thumb{background:var(--border);border-radius:8px}.omni-tree-content::-webkit-scrollbar-thumb:hover,.omni-details-content::-webkit-scrollbar-thumb:hover,.omni-attributes-table::-webkit-scrollbar-thumb:hover{background:var(--text-muted)}.omni-quick-actions{display:flex;flex-direction:column;gap:16px}.omni-input-group{display:flex;flex-direction:column;gap:8px}.omni-input-field{width:100%;background:#0000004d;border:1px solid var(--border);border-radius:var(--radius-sm);padding:8px 12px;color:var(--text);font-size:12px;outline:none;transition:all .2s ease}.omni-input-field:focus{border-color:var(--green);background:#00000080}.omni-gestures-container{display:flex;flex-direction:column;align-items:center;gap:12px;padding:16px;background:#0003;border-radius:var(--radius-md);border:1px solid var(--border)}.omni-dpad{display:grid;grid-template-columns:repeat(3,1fr);grid-template-rows:repeat(3,1fr);gap:8px;width:120px;height:120px}.omni-dpad-btn{display:flex;align-items:center;justify-content:center;background:#ffffff08;border:1px solid rgba(255,255,255,.05);border-radius:8px;color:var(--text-muted);cursor:pointer;transition:all .2s ease}.omni-dpad-btn:hover{background:var(--green);color:#000;transform:scale(1.1)}.omni-clipboard-box{display:flex;gap:8px;align-items:center}.omni-clipboard-val{flex:1;background:#161b22b3;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border:1px solid var(--border);border-radius:4px;padding:8px;font-family:Fira Code,monospace;font-size:11px;color:#38bdf8;min-height:32px;overflow-x:auto;white-space:nowrap}.omni-details-tabs{display:flex;background:#00000080;border-bottom:1px solid var(--border);flex-shrink:0}.omni-details-tab{display:flex;align-items:center;gap:5px;flex:1;padding:10px 8px;border:none;background:transparent;color:var(--text-muted);font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;cursor:pointer;border-bottom:2px solid transparent;transition:all .15s ease;font-family:JetBrains Mono,monospace;justify-content:center}.omni-details-tab:hover:not(:disabled){color:var(--text);background:#ffffff08}.omni-details-tab.active{color:var(--green);border-bottom-color:var(--green);background:#00ff880a}.omni-details-tab:disabled{opacity:.3;cursor:not-allowed}.omni-locator-row{display:flex;align-items:flex-start;gap:10px;padding:10px 14px;background:#0006;border-radius:6px;border:1px solid var(--border);border-left:3px solid var(--green);transition:all .15s;cursor:pointer}.omni-locator-row:hover{background:#ffffff05;border-color:var(--green)}.omni-locator-row.selected-for-code{border-color:var(--green);background:#00ff880f;box-shadow:0 0 12px #00ff8814}.omni-locator-left{flex:1;display:flex;flex-direction:column;gap:4px;min-width:0}.omni-locator-top{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.omni-stability-badge{display:inline-flex;align-items:center;gap:3px;font-size:9px;font-weight:800;padding:2px 6px;border-radius:4px;text-transform:uppercase;letter-spacing:.05em;font-family:JetBrains Mono,monospace}.omni-stability-badge.stable{background:#10b9811f;color:#10b981;border:1px solid rgba(16,185,129,.25)}.omni-stability-badge.moderate{background:#fbbf241a;color:#fbbf24;border:1px solid rgba(251,191,36,.25)}.omni-stability-badge.fragile{background:#f43f5e1a;color:#f43f5e;border:1px solid rgba(244,63,94,.25)}.omni-stability-reason{font-size:10px;color:var(--text-muted);font-style:italic;line-height:1.3}.omni-section-badge{font-size:9px;font-weight:600;background:#00ff8814;color:var(--green);padding:2px 6px;border-radius:4px;margin-left:6px;vertical-align:middle;text-transform:uppercase;letter-spacing:.05em}.tree-text-preview{font-size:10px;color:var(--text-muted);font-style:italic;max-width:80px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex-shrink:0}.tree-type-tag{font-size:9px;font-weight:700;color:var(--text-dim);background:#ffffff0a;padding:1px 5px;border-radius:3px;flex-shrink:0;font-family:JetBrains Mono,monospace;text-transform:none;letter-spacing:.02em;max-width:110px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.omni-inspector-container.omni-embedded{height:100%}.omni-inspector-container.omni-embedded .omni-main-content{padding:0;gap:12px}.omni-inspector-container.omni-embedded .omni-tree-panel{flex:1 1 50%;min-width:220px}.omni-inspector-container.omni-embedded .omni-details-panel{flex:1 1 50%;min-width:260px;max-width:none}.omni-summary-panel{display:flex;flex-direction:column;gap:18px}.omni-summary-hero{display:flex;align-items:flex-start;gap:12px;padding:14px;background:#00ff880a;border:1px solid rgba(0,255,136,.15);border-radius:8px;color:var(--green)}.omni-summary-hero>svg{flex-shrink:0;margin-top:2px}.omni-summary-title{font-size:13px;font-weight:700;color:var(--text);margin-bottom:2px}.omni-summary-subtitle{font-size:11px;color:var(--text-muted);line-height:1.5}.omni-summary-stats{display:grid;grid-template-columns:repeat(2,1fr);gap:8px}.omni-summary-stat{display:flex;flex-direction:column;gap:4px;padding:10px 12px;background:#0006;border:1px solid var(--border);border-radius:6px}.omni-summary-stat__label{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:var(--text-dim);font-family:JetBrains Mono,monospace}.omni-summary-stat__value{font-size:14px;font-weight:700;color:var(--green);font-family:JetBrains Mono,monospace;word-break:break-all}.omni-summary-roles{display:flex;flex-direction:column;gap:4px}.omni-summary-role{display:flex;align-items:center;gap:10px;padding:8px 10px;background:#00000040;border:1px solid var(--border);border-radius:6px}.omni-summary-role__emoji{font-size:16px;line-height:1}.omni-summary-role__name{flex:1;font-size:12px;color:var(--text)}.omni-summary-role__count{font-size:11px;font-weight:700;color:var(--green);background:#00ff880f;padding:2px 8px;border-radius:4px;font-family:JetBrains Mono,monospace}.omni-search-hint{display:flex;align-items:center;gap:5px;padding:4px 14px;font-size:10px;color:var(--green);opacity:.7;font-style:italic;background:#00ff8808;border-bottom:1px solid rgba(0,255,136,.08)}.omni-insight-panel{display:flex;flex-direction:column;gap:16px}.omni-insight-role{display:flex;align-items:center;gap:14px;padding:16px;background:#00ff880a;border-radius:8px;border:1px solid rgba(0,255,136,.12)}.omni-insight-emoji{font-size:28px;line-height:1}.omni-insight-role-name{font-size:14px;font-weight:700;color:var(--text);font-family:JetBrains Mono,monospace}.omni-insight-interactable{margin-top:4px;display:flex;gap:6px}.omni-badge-green{display:inline-flex;align-items:center;gap:4px;font-size:10px;font-weight:700;color:#10b981;background:#10b9811a;padding:2px 8px;border-radius:4px;border:1px solid rgba(16,185,129,.2)}.omni-badge-gray{display:inline-flex;align-items:center;gap:4px;font-size:10px;font-weight:700;color:var(--text-muted);background:#ffffff0a;padding:2px 8px;border-radius:4px;border:1px solid var(--border)}.omni-insight-warning{padding:10px 12px;background:#fbbf240f;border:1px solid rgba(251,191,36,.2);border-radius:6px;font-size:11px;color:#fbbf24}.omni-insight-description{display:flex;gap:10px;align-items:flex-start;padding:12px;background:#0000004d;border-radius:6px;border:1px solid var(--border)}.omni-insight-icon{color:var(--green);flex-shrink:0;margin-top:2px}.omni-insight-description p{font-size:12px;color:var(--text);line-height:1.6;margin:0}.omni-insight-best-locator,.omni-insight-attributes{display:flex;flex-direction:column;gap:8px}.omni-quick-facts{display:flex;flex-direction:column;gap:4px}.omni-quick-fact-row{display:flex;justify-content:space-between;align-items:center;padding:6px 10px;border-radius:4px;background:#0003}.omni-quick-fact-label{font-size:11px;color:var(--text-muted);font-weight:600}.omni-quick-fact-value{font-size:11px;color:var(--text);font-family:JetBrains Mono,monospace}.omni-quick-fact-value.true{color:#10b981;font-weight:700}.omni-codegen-panel{display:flex;flex-direction:column;gap:12px}.omni-codegen-frameworks{display:flex;gap:4px;flex-wrap:wrap}.omni-fw-btn{flex:1;padding:6px 4px;background:#ffffff08;border:1px solid var(--border);border-radius:6px;color:var(--text-muted);font-size:10px;font-weight:700;cursor:pointer;transition:all .15s;white-space:nowrap}.omni-fw-btn:hover{background:#ffffff0f;color:var(--text)}.omni-fw-btn.active{background:#00ff8814;border-color:#0f86;color:var(--green)}.omni-codegen-locator-selector{display:flex;align-items:center;gap:8px}.omni-codegen-label{font-size:10px;font-weight:700;text-transform:uppercase;color:var(--text-muted);white-space:nowrap;letter-spacing:.05em}.omni-fw-select{flex:1;padding:6px 8px;background:#0000004d;border:1px solid var(--border);border-radius:6px;color:var(--text);font-size:11px;outline:none;cursor:pointer}.omni-fw-select:focus{border-color:var(--green)}.omni-codegen-output{display:flex;flex-direction:column;border-radius:8px;border:1px solid var(--border);overflow:hidden}.omni-codegen-header{display:flex;justify-content:space-between;align-items:center;padding:8px 12px;background:#00000080;border-bottom:1px solid var(--border)}.omni-codegen-lang{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;color:var(--green);font-family:JetBrains Mono,monospace}.omni-codegen-pre{margin:0;padding:14px;background:#161b22b3;color:#e2e8f0;font-family:Fira Code,JetBrains Mono,monospace;font-size:11px;line-height:1.6;overflow-x:auto;white-space:pre}.omni-codegen-pre code{font-family:inherit;font-size:inherit;color:inherit}