@xenon-device-management/xenon 1.1.0
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.
- package/README.md +446 -0
- package/lib/package.json +207 -0
- package/lib/public/assets/Layouts-7IT8aFLI.js +11 -0
- package/lib/public/assets/Layouts-DPMls9vh.css +1 -0
- package/lib/public/assets/ai-settings-BbnfgdEx.js +11 -0
- package/lib/public/assets/apps-CRMrI4_p.js +16 -0
- package/lib/public/assets/apps-CcM77dgg.css +1 -0
- package/lib/public/assets/badge-B1nKs8zj.css +1 -0
- package/lib/public/assets/badge-CSvl5xIU.js +11 -0
- package/lib/public/assets/button-CJlKn4PZ.css +1 -0
- package/lib/public/assets/button-CvLaGFYj.js +26 -0
- package/lib/public/assets/calendar-6w-D6Oaw.js +6 -0
- package/lib/public/assets/clock-DcdeWBPr.js +6 -0
- package/lib/public/assets/cpu-DiSoXT9n.js +6 -0
- package/lib/public/assets/device-explorer-CajM63OJ.js +193 -0
- package/lib/public/assets/device-explorer-CxdUAoTL.css +1 -0
- package/lib/public/assets/index-ByQwMN5T.js +174 -0
- package/lib/public/assets/index-C1DBaoSh.js +1 -0
- package/lib/public/assets/index-qzCez_kk.css +1 -0
- package/lib/public/assets/lock-B23ibZmo.js +6 -0
- package/lib/public/assets/maintenance-settings-CirzA6yG.js +6 -0
- package/lib/public/assets/mouse-pointer-2-Cz76SHFb.js +6 -0
- package/lib/public/assets/plus-BBwlIevt.js +6 -0
- package/lib/public/assets/session-dashboard-C2k7FFv_.css +1 -0
- package/lib/public/assets/session-dashboard-HPDtwPOZ.js +62 -0
- package/lib/public/assets/settings-DrZsZwdc.js +1 -0
- package/lib/public/assets/trash-2-DQpvzJec.js +6 -0
- package/lib/public/assets/useSocket-Dxsqae2a.js +16 -0
- package/lib/public/assets/webhook-settings-CDPgsgkb.css +1 -0
- package/lib/public/assets/webhook-settings-Cp-B4Nrw.js +1 -0
- package/lib/public/assets/zap-DovP6iow.js +6 -0
- package/lib/public/favicon.ico +0 -0
- package/lib/public/favicon.png +0 -0
- package/lib/public/favicon.svg +9 -0
- package/lib/public/index.html +46 -0
- package/lib/public/logo.svg +17 -0
- package/lib/public/logo192.png +0 -0
- package/lib/public/logo512.png +0 -0
- package/lib/public/manifest.json +25 -0
- package/lib/public/robots.txt +3 -0
- package/lib/schema.json +348 -0
- package/lib/src/InternalHttpClient.js +212 -0
- package/lib/src/PluginContext.js +29 -0
- package/lib/src/XenonCapabilityManager.js +199 -0
- package/lib/src/app/index.js +167 -0
- package/lib/src/app/routers/apps.js +79 -0
- package/lib/src/app/routers/config.js +131 -0
- package/lib/src/app/routers/control.js +835 -0
- package/lib/src/app/routers/dashboard.js +301 -0
- package/lib/src/app/routers/grid.js +352 -0
- package/lib/src/app/routers/reservation.js +190 -0
- package/lib/src/app/routers/webhook.js +83 -0
- package/lib/src/app/swagger-docs.js +203 -0
- package/lib/src/app/swagger.js +366 -0
- package/lib/src/chromeUtils.js +148 -0
- package/lib/src/commands/handle.js +19 -0
- package/lib/src/commands/index.js +8 -0
- package/lib/src/config.js +73 -0
- package/lib/src/dashboard/asset-manager.js +84 -0
- package/lib/src/dashboard/commands.js +284 -0
- package/lib/src/dashboard/event-manager.js +699 -0
- package/lib/src/dashboard/services/app-service.js +134 -0
- package/lib/src/dashboard/services/failure-analysis-service.js +173 -0
- package/lib/src/dashboard/services/session-service.js +113 -0
- package/lib/src/data-service/CircuitBreaker.js +83 -0
- package/lib/src/data-service/config-service.js +155 -0
- package/lib/src/data-service/db.js +122 -0
- package/lib/src/data-service/device-service.js +320 -0
- package/lib/src/data-service/device-store.interface.js +2 -0
- package/lib/src/data-service/device-store.js +345 -0
- package/lib/src/data-service/pending-sessions-service.js +25 -0
- package/lib/src/data-service/pluginArgs.js +25 -0
- package/lib/src/data-service/prisma-service.js +31 -0
- package/lib/src/data-service/prisma-store.js +385 -0
- package/lib/src/data-service/queue-service.js +150 -0
- package/lib/src/data-service/web-config-service.js +130 -0
- package/lib/src/device-managers/AndroidDeviceManager.js +1155 -0
- package/lib/src/device-managers/ChromeDriverManager.js +68 -0
- package/lib/src/device-managers/HealthMonitorService.js +325 -0
- package/lib/src/device-managers/IOSDeviceManager.js +351 -0
- package/lib/src/device-managers/NodeDevices.js +82 -0
- package/lib/src/device-managers/android/AndroidStreamService.js +370 -0
- package/lib/src/device-managers/android/DeviceLockManager.js +45 -0
- package/lib/src/device-managers/cloud/CapabilityManager.js +26 -0
- package/lib/src/device-managers/cloud/Devices.js +86 -0
- package/lib/src/device-managers/iOSTracker.js +44 -0
- package/lib/src/device-managers/index.js +89 -0
- package/lib/src/device-managers/ios/IOSDiscoveryService.js +268 -0
- package/lib/src/device-managers/ios/IOSStreamService.js +893 -0
- package/lib/src/device-managers/ios/WDAClient.js +866 -0
- package/lib/src/device-utils.js +663 -0
- package/lib/src/enums/Capabilities.js +8 -0
- package/lib/src/enums/Cloud.js +11 -0
- package/lib/src/enums/Platform.js +9 -0
- package/lib/src/enums/SessionType.js +9 -0
- package/lib/src/enums/SocketEvents.js +15 -0
- package/lib/src/helpers/UniversalMjpegProxy.js +273 -0
- package/lib/src/helpers/index.js +229 -0
- package/lib/src/index.js +95 -0
- package/lib/src/interceptors/CommandInterceptor.js +524 -0
- package/lib/src/interfaces/ICloudManager.js +2 -0
- package/lib/src/interfaces/IDevice.js +2 -0
- package/lib/src/interfaces/IDeviceFilterOptions.js +2 -0
- package/lib/src/interfaces/IDeviceManager.js +2 -0
- package/lib/src/interfaces/IOptions.js +2 -0
- package/lib/src/interfaces/IPluginArgs.js +55 -0
- package/lib/src/interfaces/ISessionCapability.js +2 -0
- package/lib/src/logger.js +225 -0
- package/lib/src/plugin.js +244 -0
- package/lib/src/prisma.js +12 -0
- package/lib/src/profiling/AndroidAppProfiler.js +213 -0
- package/lib/src/proxy/wd-command-proxy.js +221 -0
- package/lib/src/scripts/generate-database-migration.js +59 -0
- package/lib/src/scripts/initialize-database.js +55 -0
- package/lib/src/scripts/install-go-ios.js +66 -0
- package/lib/src/scripts/prepare-prisma.js +89 -0
- package/lib/src/services/AICommandService.js +143 -0
- package/lib/src/services/AIService.js +466 -0
- package/lib/src/services/CleanupService.js +141 -0
- package/lib/src/services/EventBus.js +74 -0
- package/lib/src/services/InspectorService.js +395 -0
- package/lib/src/services/MetricsService.js +134 -0
- package/lib/src/services/NetworkConditioningService.js +173 -0
- package/lib/src/services/NotificationService.js +163 -0
- package/lib/src/services/RequestLogService.js +252 -0
- package/lib/src/services/ResourceIsolationService.js +122 -0
- package/lib/src/services/SecurityService.js +120 -0
- package/lib/src/services/ServerManager.js +284 -0
- package/lib/src/services/SessionHeartbeatService.js +158 -0
- package/lib/src/services/SessionLifecycleService.js +572 -0
- package/lib/src/services/SocketClient.js +71 -0
- package/lib/src/services/SocketServer.js +87 -0
- package/lib/src/services/TracingService.js +132 -0
- package/lib/src/services/VideoPipelineService.js +220 -0
- package/lib/src/services/healing/FuzzyXmlHealingProvider.js +333 -0
- package/lib/src/services/healing/HealEtalonService.js +98 -0
- package/lib/src/services/healing/HealedLocatorGenerator.js +132 -0
- package/lib/src/services/healing/HealingOrchestrator.js +165 -0
- package/lib/src/services/healing/LlmHealingProvider.js +77 -0
- package/lib/src/services/healing/OcrHealingProvider.js +119 -0
- package/lib/src/services/healing/ResilioTreeHealingProvider.js +100 -0
- package/lib/src/services/healing/VisualAiHealingProvider.js +90 -0
- package/lib/src/services/healing/types.js +12 -0
- package/lib/src/services/omni-vision/OmniVisionService.js +718 -0
- package/lib/src/services/omni-vision/VisionAssertionService.js +68 -0
- package/lib/src/sessions/CloudSession.js +42 -0
- package/lib/src/sessions/LocalSession.js +313 -0
- package/lib/src/sessions/RemoteSession.js +287 -0
- package/lib/src/sessions/SessionManager.js +238 -0
- package/lib/src/sessions/XenonSession.js +44 -0
- package/lib/src/types/CLIArgs.js +2 -0
- package/lib/src/types/CloudArgs.js +2 -0
- package/lib/src/types/CloudSchema.js +131 -0
- package/lib/src/types/DeviceType.js +2 -0
- package/lib/src/types/DeviceUpdate.js +2 -0
- package/lib/src/types/IOSDevice.js +2 -0
- package/lib/src/types/Platform.js +2 -0
- package/lib/src/types/SessionStatus.js +11 -0
- package/lib/src/validators/CapabilityValidator.js +93 -0
- package/lib/test/e2e/android/conf.spec.js +43 -0
- package/lib/test/e2e/android/conf2.spec.js +44 -0
- package/lib/test/e2e/android/conf3.spec.js +44 -0
- package/lib/test/e2e/e2ehelper.js +113 -0
- package/lib/test/e2e/hubnode/forward-request.spec.js +224 -0
- package/lib/test/e2e/hubnode/hubnode.spec.js +214 -0
- package/lib/test/e2e/ios/conf1.spec.js +39 -0
- package/lib/test/e2e/ios/conf2.spec.js +39 -0
- package/lib/test/e2e/plugin-harness.js +236 -0
- package/lib/test/e2e/plugin.spec.js +97 -0
- package/lib/test/e2e/telemetry_verification.spec.js +83 -0
- package/lib/test/e2e/video-recording-test.spec.js +63 -0
- package/lib/test/helpers/test-container.js +112 -0
- package/lib/test/integration/androidDevices.spec.js +137 -0
- package/lib/test/integration/cliArgs.js +73 -0
- package/lib/test/integration/ios/01iOSSimulator.spec.js +291 -0
- package/lib/test/integration/ios/02iOSDevices.spec.js +75 -0
- package/lib/test/integration/testHelpers.js +74 -0
- package/lib/test/unit/AndroidDeviceManager.spec.js +178 -0
- package/lib/test/unit/ChromeDriverManager.spec.js +26 -0
- package/lib/test/unit/CleanupService.spec.js +21 -0
- package/lib/test/unit/DeviceModel.spec.js +157 -0
- package/lib/test/unit/FuzzyXmlHealingProvider.test.js +294 -0
- package/lib/test/unit/GetAdbOriginal.js +42 -0
- package/lib/test/unit/HealingCascade.test.js +128 -0
- package/lib/test/unit/IOSDeviceManager.spec.js +261 -0
- package/lib/test/unit/RemoteIOs.spec.js +78 -0
- package/lib/test/unit/ResilioTreeHealingProvider.test.js +96 -0
- package/lib/test/unit/commands.spec.js +27 -0
- package/lib/test/unit/config.spec.js +27 -0
- package/lib/test/unit/device-service.spec.js +307 -0
- package/lib/test/unit/device-utils.spec.js +313 -0
- package/lib/test/unit/fixtures/device.config.js +4 -0
- package/lib/test/unit/fixtures/devices.js +89 -0
- package/lib/test/unit/helpers.spec.js +62 -0
- package/lib/test/unit/omni-vision.spec.js +100 -0
- package/lib/test/unit/plugin.spec.js +133 -0
- package/lib/tsconfig.tsbuildinfo +1 -0
- package/package.json +207 -0
- package/prisma/data.db +0 -0
- package/prisma/dev.db +0 -0
- package/prisma/dev.db-journal +0 -0
- package/prisma/migrations/20231011074725_initial_tables/migration.sql +47 -0
- package/prisma/migrations/20231226115334_update_session_log/migration.sql +2 -0
- package/prisma/migrations/20251204113710_add_video_recording_enabled/migration.sql +29 -0
- package/prisma/migrations/20251204132449_add_log_table/migration.sql +11 -0
- package/prisma/migrations/20251205050111_add_profiling_support/migration.sql +47 -0
- package/prisma/migrations/20251205050947_add_is_error_field/migration.sql +24 -0
- package/prisma/migrations/20260126201337_add_app_model/migration.sql +18 -0
- package/prisma/migrations/20260130115722_add_performance_trace_and_xenon_sync/migration.sql +2 -0
- package/prisma/migrations/20260130135114_add_device_models/migration.sql +57 -0
- package/prisma/migrations/20260130140655_make_systemport_optional/migration.sql +45 -0
- package/prisma/migrations/20260130140932_make_device_fields_optional/migration.sql +45 -0
- package/prisma/migrations/20260130141040_final_schema_fix/migration.sql +45 -0
- package/prisma/migrations/20260130143234_add_device_health_fields/migration.sql +4 -0
- package/prisma/migrations/20260130144921_add_failure_category/migration.sql +2 -0
- package/prisma/migrations/20260131151456_add_webhook_config/migration.sql +10 -0
- package/prisma/migrations/20260201094507_add_device_tags/migration.sql +11 -0
- package/prisma/migrations/20260201103410_add_managed_process/migration.sql +15 -0
- package/prisma/migrations/20260201140637_add_web_config/migration.sql +22 -0
- package/prisma/migrations/20260201162232_add_session_progress/migration.sql +2 -0
- package/prisma/migrations/20260201174231_add_total_healed_count/migration.sql +2 -0
- package/prisma/migrations/migration_lock.toml +3 -0
- package/prisma/schema.prisma +210 -0
- package/schema.json +348 -0
- package/scripts/build-xenon.sh +32 -0
- package/scripts/dev/debug-gemini.ts +44 -0
- package/scripts/generate-types-from-schema.js +86 -0
- package/scripts/install-compatible-driver.js +39 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
class u{makeGETRequest(e){return fetch(this.formatUrl(e)).then(this.jsonResult)}makePOSTRequest(e,s,r,n={}){return fetch(this.formatUrl(e),{method:"POST",body:JSON.stringify(r||{}),headers:{"Content-Type":"application/json"},...n}).then(this.jsonResult)}makeDELETERequest(e){return fetch(this.formatUrl(e),{method:"DELETE"}).then(this.jsonResult)}formatUrl(e){return`/xenon/api${e}`}jsonResult(e){return e.json()}}const t=new u;class i{static getDevices(){return t.makeGETRequest(`/device?t=${Date.now()}`)}static getPendingSessionsCount(){return t.makeGETRequest("/queue/length")}static getPendingSessions(){return t.makeGETRequest("/queue")}static getQueueSummary(){return t.makeGETRequest("/queue/summary")}static getQueueStatus(e){return t.makeGETRequest(`/queue/status/${e}`)}static getBuilds(){return t.makeGETRequest("/build")}static getSessions(e={}){let r=`/session?t=${Date.now()}`;return e.buildId&&(r+=`&buildId=${encodeURIComponent(e.buildId)}`),e.query&&(r+=`&query=${encodeURIComponent(e.query)}`),e.status&&(r+=`&status=${encodeURIComponent(e.status)}`),e.platform&&(r+=`&platform=${encodeURIComponent(e.platform)}`),t.makeGETRequest(r)}static getSession(e){return t.makeGETRequest(`/session/${e}`)}static getSessionLogs(e){return t.makeGETRequest(`/session/${e}/session_log`)}static getDeviceLogs(e){return t.makeGETRequest(`/session/${e}/logs/device`)}static getDebugLogs(e){return t.makeGETRequest(`/session/${e}/logs/debug`)}static getProfilingData(e){return t.makeGETRequest(`/session/${e}/profiling`)}static omniScan(e){return t.makeGETRequest(`/session/${e}/xenon/omni-scan`)}static omniScanControl(e){return t.makeGETRequest(`/control/${e}/omni-scan`)}static testAiLocator(e,s,r){return t.makePOSTRequest(`/session/${e}/xenon/test-locator`,{},{strategy:s,selector:r})}static testAiLocatorControl(e,s,r){return t.makePOSTRequest(`/control/${e}/test-locator`,{},{strategy:s,selector:r})}static blockDevice(e,s){return t.makePOSTRequest("/block",{},{udid:e,host:s})}static unblockDevice(e,s){return t.makePOSTRequest("/unblock",{},{udid:e,host:s})}static updateDeviceTags(e,s,r){return t.makePOSTRequest("/device/tags",{},{udid:e,host:s,tags:r})}static getSessionLiveVideoUrl(e){return t.formatUrl(`/session/${e}/live_video`)}static getReservations(){return t.makeGETRequest("/reservation")}static reserveDevice(e,s,r,n,a){return t.makePOSTRequest("/reservation",{},{udid:e,host:s,reservedBy:r,duration:n,reason:a})}static releaseReservation(e,s){return t.makeDELETERequest(`/reservation/${e}/${encodeURIComponent(s)}`)}static extendReservation(e,s,r){return t.makePOSTRequest(`/reservation/${e}/${encodeURIComponent(s)}/extend`,{},{duration:r})}static getAssetUrl(e){return e?`/xenon/assets/${e.replace(/^\//,"")}`:""}static tap(e,s,r){return t.makePOSTRequest(`/control/${e}/tap`,{},{x:s,y:r})}static swipe(e,s,r,n,a){return t.makePOSTRequest(`/control/${e}/swipe`,{},{x:s,y:r,endX:n,endY:a})}static typeText(e,s){return t.makePOSTRequest(`/control/${e}/text`,{},{text:s})}static pressKey(e,s){return t.makePOSTRequest(`/control/${e}/keyevent`,{},{keyCode:s})}static getClipboard(e){return t.makeGETRequest(`/control/${e}/clipboard`)}static setClipboard(e,s){return t.makePOSTRequest(`/control/${e}/clipboard`,{},{content:s})}static getScreenshot(e){return t.makeGETRequest(`/control/${e}/screenshot`)}static touchAndHold(e,s,r,n){return t.makePOSTRequest(`/control/${e}/touchAndHold`,{},{x:s,y:r,duration:n})}static lock(e){return t.makePOSTRequest(`/control/${e}/lock`,{},{})}static unlock(e){return t.makePOSTRequest(`/control/${e}/unlock`,{},{})}static installApp(e,s){return t.makePOSTRequest(`/control/${e}/install`,{},{appPath:s})}static startStream(e){return t.makePOSTRequest(`/control/${e}/stream/start`,{},{})}static stopStream(e){return t.makePOSTRequest(`/control/${e}/stream/stop`,{},{},{keepalive:!0})}static uninstallApp(e,s){return t.makePOSTRequest(`/control/${e}/uninstall`,{},{bundleId:s})}static uploadAndInstallApp(e,s){const r=new FormData;return r.append("app",s),fetch(`/xenon/api/control/${e}/upload-install`,{method:"POST",body:r}).then(n=>n.json())}static listApps(e){return t.makeGETRequest(`/control/${e}/apps`)}static getLogs(e){return t.makeGETRequest(`/control/${e}/logs`)}static getApps(){return t.makeGETRequest("/apps")}static uploadApp(e){const s=new FormData;return s.append("app",e),fetch("/xenon/api/apps/upload",{method:"POST",body:s}).then(r=>r.json())}static deleteApp(e){return t.makeDELETERequest(`/apps/${e}`)}static installRepositoryApp(e,s){return t.makePOSTRequest(`/control/${e}/install-repository-app`,{},{appId:s})}static executeShell(e,s){return t.makePOSTRequest(`/control/${e}/shell`,{},{command:s})}static getInspectorSnapshot(e){return t.makeGETRequest(`/control/${e}/inspector/snapshot`)}static getWebhookConfigs(){return t.makeGETRequest("/webhook")}static addWebhookConfig(e,s,r,n){return t.makePOSTRequest("/webhook",{},{url:e,events:s,type:r,payloadTemplate:n})}static deleteWebhookConfig(e){return t.makeDELETERequest(`/webhook/${e}`)}static testWebhook(e,s){return t.makePOSTRequest("/webhook/test",{},{url:e,type:s})}static getGlobalConfig(){return t.makeGETRequest("/config")}static updateGlobalConfig(e){return t.makePOSTRequest("/config",{},e)}static testAIConfig(e){return t.makePOSTRequest("/config/test-ai",{},e)}static resetMetrics(){return t.makePOSTRequest("/config/reset-metrics",{},{})}}export{i as X};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&family=JetBrains+Mono:wght@400;500;600&family=Outfit:wght@400;600;700&display=swap";@keyframes pulse{0%{box-shadow:0 0 #0f86}70%{box-shadow:0 0 0 10px #0f80}to{box-shadow:0 0 #0f80}}@keyframes pulse-running{0%{box-shadow:0 0 #ffb80066}70%{box-shadow:0 0 0 10px #ffb80000}to{box-shadow:0 0 #ffb80000}}.animate-pulse-success{animation:pulse 2s infinite}.animate-pulse-running{animation:pulse-running 2s infinite}:root{--bg-page: #0a0a0f;--bg-surface: #0f0f1a;--bg-card: #12121f;--bg-card-hover: #161625;--color-primary: #00ff88;--color-amber: #ffb800;--color-red: #ff4444;--color-blue: #00aaff;--color-purple: #8b5cf6;--border-subtle: #1a1a2e;--border-visible: #252540;--text-dim: #4a4a6a;--text-muted: #8888aa;--text-body: #c8c8e8;--text-bright: #e8e8ff;--primary: var(--color-primary);--primary-hover: #00e67a;--primary-glow: rgba(0, 255, 136, .2);--bg-app: var(--bg-page);--bg-glass: rgba(15, 15, 26, .7);--text-main: var(--text-body);--border-light: var(--border-subtle);--border-medium: var(--border-visible);--status-ready: var(--color-primary);--status-busy: var(--color-amber);--status-offline: var(--text-dim);--status-error: var(--color-red);--space-xs: 4px;--space-sm: 8px;--space-md: 16px;--space-lg: 24px;--space-xl: 32px;--space-xxl: 48px;--fs-xs: 11px;--fs-sm: 13px;--fs-md: 15px;--fs-lg: 18px;--fs-xl: 24px;--fs-xxl: 32px;--lh-tight: 1.2;--lh-normal: 1.5;--lh-loose: 1.8;--radius-sm: 8px;--radius-md: 12px;--radius-lg: 20px;--shadow-sm: 0 1px 2px rgba(0, 0, 0, .3);--shadow-md: 0 10px 15px -3px rgba(0, 0, 0, .4);--shadow-lg: 0 25px 50px -12px rgba(0, 0, 0, .5);--glass-blur: blur(24px)}.scanline{background:linear-gradient(to bottom,#fff0,#fff0 50%,#0003 50%,#0003);background-size:100% 4px}.text-glow{text-shadow:0 0 10px rgba(0,255,136,.5)}*{box-sizing:border-box;margin:0;padding:0}html,body{height:100%;margin:0;padding:0;background-color:var(--bg-page);overflow:hidden}body{font-family:Inter,sans-serif;color:var(--text-body);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;line-height:1.5}h1,h2,h3,h4,h5,h6,.brand-font{font-family:Outfit,sans-serif;font-weight:700;letter-spacing:-.02em}code,.code-font{font-family:JetBrains Mono,Menlo,Monaco,Consolas,monospace;font-size:.9em;background:#ffffff0d;padding:2px 6px;border-radius:4px;color:var(--primary)}button{font-family:inherit;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1)}a{color:#60a5fa;text-decoration:none;transition:color .2s ease}a:hover{color:#93c5fd}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:transparent}::-webkit-scrollbar-thumb{background:#0f83;border-radius:8px;border:1px solid rgba(0,255,136,.1)}::-webkit-scrollbar-thumb:hover{background:#0f86}input[type=checkbox]{-moz-appearance:none;appearance:none;-webkit-appearance:none;width:18px;height:18px;background:#0000004d;border:1px solid var(--border-visible);border-radius:6px;cursor:pointer;position:relative;transition:all .2s;display:inline-flex;align-items:center;justify-content:center}input[type=checkbox]:hover{border-color:var(--color-primary);background:#00ff880d}input[type=checkbox]:checked{background:var(--color-primary);border-color:var(--color-primary)}input[type=checkbox]:checked:after{content:"✓";color:var(--bg-page);font-size:14px;font-weight:800}input[type=checkbox]:focus{outline:none;box-shadow:0 0 10px #00ff884d}.fade-in{animation:fadeIn .4s ease-out forwards}@keyframes fadeIn{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.app-layout{display:flex;flex-direction:column;height:100vh;width:100vw;overflow:hidden;background:var(--bg-page)}.app-main-container{display:flex;flex:1;width:100%;margin-top:40px;height:calc(100vh - 40px)}.app-content{flex:1;margin-left:56px;overflow:hidden;display:flex;flex-direction:column}.app-body-container{display:flex;flex:1;width:100%;max-width:1400px;margin:0 auto;padding:var(--space-sm) var(--space-lg);overflow-y:auto}.app-body-container.sessions-view,.app-body-container.devices-view,.app-body-container.apps-view,.app-body-container.notifications-view,.app-body-container.ai-view,.app-body-container.settings-view{flex-direction:column;width:100%;max-width:none;margin:0;padding:0;height:100%;overflow-y:auto;overflow-x:hidden}.header-container{display:flex;flex-direction:row;align-items:center;justify-content:space-between;background:var(--bg-surface);width:100%;border-bottom:2px solid var(--border-visible);position:fixed;top:0;z-index:5000;padding:0 var(--space-xl);backdrop-filter:var(--glass-blur);-webkit-backdrop-filter:var(--glass-blur);height:40px;padding:0 var(--space-md);box-shadow:0 4px 20px #0006}.header-container:after{content:"";position:absolute;top:0;right:0;bottom:0;left:0;pointer-events:none;background:linear-gradient(to bottom,#fff0,#fff0 50%,#0000001a 50%,#0000001a);background-size:100% 4px;opacity:.2}.header-left,.header-right{display:flex;align-items:center;gap:var(--space-lg);position:relative;z-index:10}.header-logo-container{display:flex;align-items:center;gap:12px;cursor:pointer;transition:all .3s cubic-bezier(.4,0,.2,1)}.header-logo-container:hover{transform:scale(1.02)}.header-logo-image{height:28px;width:auto;filter:drop-shadow(0 0 10px rgba(0,255,136,.3))}.header-nav{display:flex;align-items:center;gap:8px;margin-left:24px}.header-nav__item{display:flex;align-items:center;gap:8px;background:transparent;color:var(--text-muted);border:1px solid transparent;border-radius:0;padding:8px 16px;font-weight:500;font-size:13px;text-transform:uppercase;letter-spacing:.05em;font-family:Outfit,sans-serif;cursor:pointer;transition:all .2s ease}.header-nav__item:hover{color:var(--text-bright);background:#ffffff08;border-color:var(--border-subtle)}.header-nav__item.active{color:var(--color-primary);background:#00ff880d;border-color:#0f83;box-shadow:0 0 15px #00ff881a}.header-nav__item.active .header-nav__icon{filter:drop-shadow(0 0 5px var(--color-primary))}.header-status-pill{display:flex;align-items:center;gap:10px;background:#0000004d;border:1px solid var(--border-visible);padding:4px 12px;border-radius:6px;font-size:11px;font-weight:600;color:var(--color-primary);text-transform:uppercase;letter-spacing:.1em;font-family:JetBrains Mono,monospace}.status-dot{width:8px;height:8px;background:var(--color-primary);border-radius:6px;box-shadow:0 0 10px var(--color-primary);animation:pulse-dot 2s infinite}@keyframes pulse-dot{0%{opacity:1;transform:scale(1)}50%{opacity:.5;transform:scale(.9)}to{opacity:1;transform:scale(1)}}.profile-trigger{display:flex;align-items:center;gap:12px;background:#0003;border:1px solid var(--border-visible);padding:4px 10px;border-radius:6px;cursor:pointer;transition:all .2s ease}.profile-trigger:hover,.profile-trigger.open{background:#ffffff08;border-color:var(--border-subtle)}.avatar-preview{width:24px;height:24px;background:var(--bg-card);border:1px solid var(--color-blue);border-radius:6px;display:flex;align-items:center;justify-content:center;color:var(--color-blue);box-shadow:0 0 10px #0af3}.profile-info-compact{display:flex;flex-direction:column;align-items:flex-start;gap:1px}.profile-name{font-size:var(--fs-sm);font-weight:700;color:var(--text-bright)}.profile-role{font-size:var(--fs-xs);color:var(--text-dim);font-weight:500;text-transform:uppercase;letter-spacing:.02em}.chevron-icon{color:var(--text-dim);margin-left:4px;transition:transform .3s cubic-bezier(.16,1,.3,1)}.chevron-icon.rotate{transform:rotate(180deg)}.profile-dropdown{position:absolute;top:calc(100% + 8px);right:0;width:300px;background:var(--bg-surface);border:2px solid var(--border-visible);border-radius:4px;padding:8px;box-shadow:0 10px 40px #0009;backdrop-filter:blur(24px);-webkit-backdrop-filter:blur(24px);z-index:2000}.profile-dropdown:before{content:"";position:absolute;top:-2px;left:-2px;width:20px;height:20px;border-top:2px solid var(--color-primary);border-left:2px solid var(--color-primary);pointer-events:none}.dropdown-group{display:flex;flex-direction:column;gap:2px;padding:4px}.dropdown-section-header{display:flex;align-items:center;gap:8px;padding:8px 12px;color:var(--color-primary);font-size:var(--fs-xs);font-weight:700;text-transform:uppercase;letter-spacing:.1em;font-family:JetBrains Mono,monospace;border-bottom:1px solid var(--border-subtle);margin-bottom:8px}.dropdown-context-item{padding:8px 12px;background:#0003;border-left:2px solid var(--border-subtle);margin-bottom:4px}.dropdown-context-item:hover{border-left-color:var(--color-primary)}.context-label{font-size:var(--fs-xs);color:var(--text-dim);font-weight:700;text-transform:uppercase;letter-spacing:.05em;margin:0 0 2px}.context-value{font-size:12px;color:var(--text-bright);font-weight:500;margin:0;font-family:JetBrains Mono,monospace}.dropdown-divider{height:1px;background:var(--border-visible);margin:8px 4px}.dropdown-item{width:100%;display:flex;align-items:center;gap:12px;padding:10px 12px;border:1px solid transparent;background:transparent;color:var(--text-body);font-size:13px;font-weight:500;border-radius:4px;cursor:pointer;transition:all .2s ease;text-align:left}.dropdown-item:hover{background:#00ff8808;color:var(--color-primary);border-color:#00ff881a;transform:translate(4px)}.dropdown-system-info{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:#0000004d;margin-top:8px;border-radius:6px}.status-indicator{display:flex;align-items:center;gap:8px}.status-dot.online{width:6px;height:6px;background:var(--color-primary);border-radius:4px;box-shadow:0 0 8px var(--color-primary)}.dropdown-system-info span{font-size:var(--fs-xs);font-weight:600;color:var(--text-dim);text-transform:uppercase;letter-spacing:.05em}.version-label{font-family:JetBrains Mono,monospace;color:var(--color-primary)!important;opacity:.8}@keyframes slideUp{0%{opacity:0;transform:translateY(8px)}to{opacity:1;transform:translateY(0)}}.animate-slide-up{animation:slideUp .2s cubic-bezier(.4,0,.2,1) forwards}@media (max-width: 768px){.header-container{padding:0 var(--space-md)}.header-status-pill,.profile-info-compact,.header-logo span,.header-nav{display:none}}.toast-container{position:fixed;bottom:32px;right:32px;display:flex;flex-direction:column;gap:16px;z-index:10000;pointer-events:none}.toast-item{pointer-events:auto;min-width:320px;max-width:480px;padding:16px 20px;border-radius:6px;display:flex;align-items:center;gap:16px;background:var(--bg-surface);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);border:1px solid var(--border-visible);box-shadow:0 20px 40px #0006;color:var(--text-bright);font-size:13px;font-weight:600;font-family:JetBrains Mono,monospace;transition:all .3s cubic-bezier(.16,1,.3,1);position:relative;overflow:hidden}.toast-item:after{content:"";position:absolute;top:0;left:0;width:100%;height:2px;background:currentColor;opacity:.3}.toast-message{flex:1;text-transform:uppercase;letter-spacing:.02em}.toast-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0}.toast-close{background:transparent;border:none;color:var(--text-dim);cursor:pointer;padding:4px;border-radius:6px;display:flex;align-items:center;justify-content:center;transition:all .2s}.toast-close:hover{background:#ffffff0d;color:var(--text-bright)}.toast-success{border-color:#00ff884d;color:var(--color-primary)}.toast-success .toast-icon{color:var(--color-primary)}.toast-error{border-color:#ff4d4d4d;color:#ff4d4d}.toast-error .toast-icon{color:#ff4d4d}.toast-info{border-color:#00bfff4d;color:#00bfff}.toast-info .toast-icon{color:#00bfff}.toast-loading{border-color:var(--text-muted);color:var(--text-dim)}.toast-loading .toast-icon{color:var(--text-dim)}@keyframes slide-in{0%{transform:translate(100%) scale(.95);opacity:0}to{transform:translate(0) scale(1);opacity:1}}.animate-slide-in{animation:slide-in .4s cubic-bezier(.16,1,.3,1) forwards}.app-sidebar{width:56px;background:var(--bg-surface);border-right:1px solid var(--border-visible);display:flex;flex-direction:column;height:calc(100vh - 40px);position:fixed;left:0;top:40px;z-index:1000;padding:16px 0;background:#0a0a0fe6;backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px)}.sidebar-nav{flex:1;display:flex;flex-direction:column;gap:8px;align-items:center}.sidebar-footer{display:flex;flex-direction:column;gap:8px;align-items:center;padding-top:12px;border-top:1px solid var(--border-visible)}.sidebar-item-wrapper{position:relative;display:flex;justify-content:center;align-items:center;width:100%;padding:8px 0;cursor:pointer}.sidebar-active-indicator{position:absolute;left:0;top:15%;bottom:15%;width:2px;background:var(--color-primary);box-shadow:0 0 10px var(--color-primary);border-radius:0 2px 2px 0}.sidebar-icon-container{padding:8px;border-radius:8px;color:var(--text-muted);transition:all .2s ease;display:flex;align-items:center;justify-content:center}.sidebar-icon-container:hover{background:#ffffff0d;color:var(--text-bright)}.sidebar-icon-container.active{background:#00ff881a;color:var(--color-primary)}.sidebar-tooltip{position:absolute;left:100%;margin-left:12px;background:var(--bg-surface);border:1px solid var(--border-visible);color:var(--text-bright);padding:4px 10px;border-radius:4px;font-size:11px;font-weight:600;white-space:nowrap;pointer-events:none;opacity:0;transform:translate(-10px);transition:all .2s ease;box-shadow:0 4px 20px #00000080;z-index:1001}.sidebar-item-wrapper:hover .sidebar-tooltip{opacity:1;transform:translate(0)}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{c}from"./index-ByQwMN5T.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 e=[["rect",{width:"18",height:"11",x:"3",y:"11",rx:"2",ry:"2",key:"1w4ew1"}],["path",{d:"M7 11V7a5 5 0 0 1 10 0v4",key:"fwvmzm"}]],t=c("lock",e);export{t as L};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{c as x,r as n,j as e,g as j,l as v,d as b,I as y,i as C,T as f}from"./index-ByQwMN5T.js";import{X as u}from"./index-C1DBaoSh.js";import{A as N}from"./Layouts-7IT8aFLI.js";import{T as S}from"./trash-2-DQpvzJec.js";import{C as M}from"./calendar-6w-D6Oaw.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 A=[["path",{d:"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8",key:"1357e3"}],["path",{d:"M3 3v5h5",key:"1xhq8a"}],["path",{d:"M12 7v5l4 2",key:"1fdv2h"}]],D=x("history",A),E=()=>{const[a,i]=n.useState({buildCleanupDays:30,buildCleanupMaxCount:100,buildCleanupSchedule:"0 0 * * *",deleteBuildAssets:!0}),[h,r]=n.useState(!0),[g,c]=n.useState(!1),[l,t]=n.useState(null);n.useEffect(()=>{d()},[]);const d=async()=>{r(!0);try{const s=await u.getGlobalConfig();i({buildCleanupDays:s.buildCleanupDays||30,buildCleanupMaxCount:s.buildCleanupMaxCount||100,buildCleanupSchedule:s.buildCleanupSchedule||"0 0 * * *",deleteBuildAssets:s.deleteBuildAssets!==void 0?s.deleteBuildAssets:!0})}catch(s){console.error("Failed to load maintenance settings",s),t({type:"error",message:"Failed to access maintenance parameters."})}finally{r(!1)}},o=async(s=a)=>{c(!0),t(null);try{await u.updateGlobalConfig(s),t({type:"success",message:"Maintenance parameters synchronized across fleet."}),setTimeout(()=>t(null),5e3)}catch(m){console.error("Failed to save maintenance settings",m),t({type:"error",message:"Synchronization failed. Check network integrity."})}finally{c(!1)}},p=async()=>{const s={buildCleanupDays:30,buildCleanupMaxCount:100,buildCleanupSchedule:"0 0 * * *",deleteBuildAssets:!0};i(s),await o(s)};return h?e.jsxs("div",{className:"settings-loading",children:[e.jsx(j,{className:"animate-spin",size:32}),e.jsx("span",{children:"Synchronizing Maintenance Parameters..."})]}):e.jsxs("div",{className:"settings-container mesh-gradient-infra",children:[e.jsx("div",{className:"scanline",style:{position:"absolute",inset:0,pointerEvents:"none",opacity:.05,zIndex:1001}}),e.jsxs("div",{className:"settings-header",children:[e.jsxs("div",{className:"settings-title-group",children:[e.jsx(v,{className:"settings-icon infra-icon",size:28}),e.jsx("h2",{children:"Maintenance & Retention"})]}),e.jsx("p",{className:"settings-subtitle",children:"Manage the lifecycle of test artifacts, automated purging schedules, and storage optimization across the global registry."})]}),e.jsxs("div",{className:"settings-content",children:[e.jsxs("div",{className:"settings-grid",children:[e.jsxs("div",{className:"setting-card stagger-1",children:[e.jsxs("div",{className:"setting-card-header",children:[e.jsx(D,{size:16}),e.jsx("h4",{children:"Retention Window"})]}),e.jsx("p",{className:"section-description-dense",children:"Number of days to preserve builds and sessions before automatic purging from the system."}),e.jsx("div",{className:"setting-field",children:e.jsxs("div",{className:"input-group",children:[e.jsx("input",{type:"number",value:a.buildCleanupDays,onChange:s=>i({...a,buildCleanupDays:parseInt(s.target.value)}),min:1}),e.jsx("span",{className:"code-font",children:"DAYS"})]})}),e.jsx("div",{className:"setting-hint-clean",children:"Standard enterprise retention is typically 30-90 days."})]}),e.jsxs("div",{className:"setting-card stagger-2",children:[e.jsxs("div",{className:"setting-card-header",children:[e.jsx(S,{size:16}),e.jsx("h4",{children:"Max Build Capacity"})]}),e.jsx("p",{className:"section-description-dense",children:"Cap the maximum number of historical builds stored in the primary database."}),e.jsx("div",{className:"setting-field",children:e.jsxs("div",{className:"input-group",children:[e.jsx("input",{type:"number",value:a.buildCleanupMaxCount,onChange:s=>i({...a,buildCleanupMaxCount:parseInt(s.target.value)}),min:1}),e.jsx("span",{className:"code-font",children:"BUILDS"})]})}),e.jsx("div",{className:"setting-hint-clean",children:"Protects against database bloat during high-frequency CI bursts."})]}),e.jsxs("div",{className:"setting-card stagger-3",children:[e.jsxs("div",{className:"setting-card-header",children:[e.jsx(b,{size:16}),e.jsx("h4",{children:"Asset Purge Strategy"})]}),e.jsx("p",{className:"section-description-dense",children:"Automatically remove binary artifacts (videos, screenshots) when build records are purged."}),e.jsxs("div",{className:"toggle-group",children:[e.jsxs("label",{className:"switch",children:[e.jsx("input",{type:"checkbox",checked:a.deleteBuildAssets,onChange:s=>i({...a,deleteBuildAssets:s.target.checked})}),e.jsx("span",{className:"slider round"})]}),e.jsx("span",{className:"toggle-label",children:a.deleteBuildAssets?"ENABLED":"DISABLED"})]}),e.jsx("div",{className:"setting-hint-clean",children:"Disabling this will leave orphaned files on disk—use with caution."})]}),e.jsxs("div",{className:"setting-card stagger-4",children:[e.jsxs("div",{className:"setting-card-header",children:[e.jsx(M,{size:16}),e.jsx("h4",{children:"Cleanup Orchestration"})]}),e.jsx("p",{className:"section-description-dense",children:"Standardized Cron syntax for scheduling the automated cleanup engine."}),e.jsx("div",{className:"setting-field",children:e.jsx("div",{className:"setting-input-wrapper",children:e.jsx("input",{type:"text",placeholder:"e.g. 0 0 * * * (Midnight)",value:a.buildCleanupSchedule,onChange:s=>i({...a,buildCleanupSchedule:s.target.value})})})}),e.jsx("div",{className:"cron-presets",children:e.jsx("div",{className:"presets-grid",children:[{label:"Daily (Midnight)",value:"0 0 * * *"},{label:"Weekly (Sunday)",value:"0 0 * * 0"},{label:"Bi-Daily (12h)",value:"0 */12 * * *"}].map(s=>e.jsx("button",{className:`preset-chip ${a.buildCleanupSchedule===s.value?"active":""}`,onClick:()=>i({...a,buildCleanupSchedule:s.value}),children:s.label},s.label))})})]})]}),e.jsxs("div",{className:"health-monitor-alert",style:{background:"rgba(59, 130, 246, 0.05)",borderColor:"rgba(59, 130, 246, 0.2)",color:"#60a5fa",marginTop:"1.5rem"},children:[e.jsx(y,{size:18}),e.jsxs("span",{children:[e.jsx("strong",{children:"Resource Notice:"})," Bulk purging operations are non-blocking and execute at low priority to ensure zero interference with active test execution."]})]}),l&&e.jsxs("div",{className:`status-banner ${l.type}`,children:[l.type==="success"?e.jsx(C,{size:18}):e.jsx(f,{size:18}),e.jsx("span",{children:l.message})]})]}),e.jsx(N,{onSave:o,onDiscard:d,onRestoreDefaults:p,isSaving:g})]})};export{E as MaintenanceSettings};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{c as e}from"./index-ByQwMN5T.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 o=[["path",{d:"M4.037 4.688a.495.495 0 0 1 .651-.651l16 6.5a.5.5 0 0 1-.063.947l-6.124 1.58a2 2 0 0 0-1.438 1.435l-1.579 6.126a.5.5 0 0 1-.947.063z",key:"edeuup"}]],t=e("mouse-pointer-2",o);export{t as M};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import{c as e}from"./index-ByQwMN5T.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 o=[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]],c=e("plus",o);export{c as P};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
@import"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap";@keyframes ldio-f6vc10xq0d9{0%{top:42px;left:42px;width:0;height:0;opacity:1}to{top:6px;left:6px;width:72px;height:72px;opacity:0}}.ldio-f6vc10xq0d9 div{position:absolute;border-width:8px;border-style:solid;opacity:1;border-radius:50%;animation:ldio-f6vc10xq0d9 1s cubic-bezier(0,.2,.8,1) infinite}.ldio-f6vc10xq0d9 div:nth-child(1){border-color:#0051a2;animation-delay:0s}.ldio-f6vc10xq0d9 div:nth-child(2){border-color:#1b75be;animation-delay:-.5s}.loadingio-spinner-ripple-oy48bsussql{width:31px;height:31px;display:inline-block;overflow:hidden;background:transparent}.ldio-f6vc10xq0d9{width:100%;height:100%;position:relative;transform:translateZ(0) scale(.31);backface-visibility:hidden;transform-origin:0 0}.ldio-f6vc10xq0d9 div{box-sizing:content-box}.input-base{display:flex;height:36px;width:100%;border-radius:6px;border:1px solid var(--border-visible);background:#0000004d;padding:0 12px;font-family:JetBrains Mono,monospace;font-size:13px;color:var(--text-bright);transition:all .2s cubic-bezier(.16,1,.3,1);box-sizing:border-box}.input-base::placeholder{color:var(--text-dim);opacity:.5}.input-base:focus{outline:none;border-color:var(--color-primary);box-shadow:0 0 10px #00ff881a;background:#0006}.input-base:disabled{cursor:not-allowed;opacity:.4;background:transparent;filter:grayscale(1)}.session-dashboard-root{height:calc(100vh - 40px);width:100%;display:flex;background:var(--bg-page);color:var(--text-body);font-family:Inter,sans-serif;overflow:hidden}.dashboard-layout{display:flex;width:100%;height:100%}.dashboard-sidebar{width:280px;min-width:280px;background:var(--bg-surface);border-right:2px solid var(--border-visible);display:flex;flex-direction:column;flex-shrink:0;box-shadow:10px 0 30px #0000004d;position:relative;z-index:100}.sidebar-header{padding:16px;border-bottom:1px solid var(--border-visible);background:#0003}.brand-font{font-family:JetBrains Mono,monospace;font-weight:700;font-size:var(--fs-xs);color:var(--color-primary);letter-spacing:.1em;text-transform:uppercase;margin-bottom:12px;display:block}.search-container{position:relative}.search-icon{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--text-dim);pointer-events:none;opacity:.5}.compact-search{width:100%;height:32px;font-size:11px;background:#0006!important;border:1px solid var(--border-visible)!important;color:var(--text-bright)!important;padding-left:32px!important;border-radius:6px!important;transition:all .2s ease;font-family:JetBrains Mono,monospace}.compact-search:focus{border-color:var(--color-primary)!important;box-shadow:0 0 15px #00ff881a!important}.compact-search::placeholder{color:var(--text-dim);text-transform:uppercase;font-size:var(--fs-xs);letter-spacing:.1em}.advanced-filters{display:flex;flex-direction:column;gap:12px;margin-top:16px;padding-top:16px;border-top:1px solid var(--border-subtle)}.filter-row{display:flex;align-items:center;gap:8px}.select-container{position:relative;flex:1;display:flex;align-items:center}.select-icon{position:absolute;left:10px;color:var(--text-dim);pointer-events:none;z-index:1}.compact-select-trigger{width:100%;height:32px;padding:0 12px 0 10px;background:var(--bg-page)!important;border:1px solid var(--border-visible)!important;border-radius:6px!important;color:var(--text-bright)!important;font-size:var(--fs-xs)!important;font-family:JetBrains Mono,monospace!important;text-transform:uppercase;letter-spacing:.05em;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);display:flex;align-items:center;gap:8px;position:relative}.custom-select-container{position:relative;width:100%}.compact-select-trigger .select-icon{position:static;color:var(--text-dim)}.compact-select-trigger .chevron-icon{margin-left:auto;transition:transform .2s ease;color:var(--text-dim)}.compact-select-trigger .chevron-icon.open{transform:rotate(180deg)}.custom-select-dropdown{position:absolute;top:calc(100% + 4px);left:0;right:0;background:var(--bg-surface);border:1px solid var(--border-visible);border-radius:6px;z-index:1100;overflow:hidden;box-shadow:0 4px 20px #00000080;animation:dropdownFadeIn .2s ease}@keyframes dropdownFadeIn{0%{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}.custom-select-option{padding:8px 12px;font-size:var(--fs-xs);color:var(--text-dim);cursor:pointer;font-family:JetBrains Mono,monospace;text-transform:uppercase;letter-spacing:.05em;transition:all .1s ease}.custom-select-option:hover{background:#ffffff0d;color:var(--text-bright)}.custom-select-option.active{background:#00ff881a;color:var(--color-primary);font-weight:700}.compact-select-trigger:hover,.compact-select:hover{border-color:var(--color-primary)!important;background:#00ff880d!important}.compact-select:focus{outline:none;border-color:var(--color-primary)!important;box-shadow:0 0 15px var(--primary-glow)!important}.status-toggles{display:flex;align-items:center;gap:6px;background:#0003!important;padding:4px!important;border-radius:8px!important;border:1px solid var(--border-visible)!important}.status-toggle{width:28px;height:28px;display:flex;align-items:center;justify-content:center;background:transparent!important;border:1px solid transparent!important;border-radius:6px!important;cursor:pointer;transition:all .2s ease;position:relative}.status-toggle:hover{background:#ffffff0d!important;border-color:var(--border-subtle)!important}.status-toggle.active{background:#ffffff14!important;border-color:var(--border-visible)!important;box-shadow:inset 0 2px 4px #0003!important}.status-toggle.active:after{content:"";position:absolute;bottom:-6px;left:50%;transform:translate(-50%);width:12px;height:2px;background:currentColor;border-radius:2px;box-shadow:0 0 8px currentColor}.filter-count-label{margin-left:auto;font-size:10px;color:var(--text-dim);font-weight:700;text-transform:uppercase;letter-spacing:.1em;font-family:JetBrains Mono,monospace;padding-right:4px}.session-card-mini.build-card{background:#0003;border:1px solid transparent;border-left:3px solid transparent;border-radius:0;padding:12px 16px;margin-bottom:1px;transition:all .2s ease;cursor:pointer;text-align:left;width:100%;position:relative;overflow:hidden}.session-card-mini.build-card:hover{background:#ffffff08;border-color:var(--border-subtle);transform:none}.session-card-mini.build-card.active{background:#00ff880d;border-color:var(--border-visible);border-left-color:var(--color-primary);box-shadow:inset 5px 0 15px #00ff8808}.session-card-mini.build-card:after{content:"";position:absolute;top:0;right:0;width:4px;height:4px;border-top:1px solid var(--border-visible);border-right:1px solid var(--border-visible);opacity:.5}.mini-header{display:flex;flex-direction:column;gap:2px;margin-bottom:6px}.mini-id{font-weight:700;font-size:11px;color:#8b5cf6;font-family:JetBrains Mono,monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mini-timestamp{font-size:10px;color:#4a4a6a;text-transform:uppercase;font-family:JetBrains Mono,monospace}.build-stats-row{display:flex;align-items:center;gap:6px}.stat-pill{font-size:var(--fs-xs)!important;font-weight:700!important;padding:1px 6px!important;border-radius:6px!important;letter-spacing:.05em;text-transform:uppercase;font-family:JetBrains Mono,monospace}.stat-pill.passed{background:#00ff880d!important;color:var(--color-primary)!important;border:1px solid rgba(0,255,136,.2)}.stat-pill.failed{background:#ff44440d!important;color:var(--color-red)!important;border:1px solid rgba(255,68,68,.2)}.stat-pill.unmarked{background:#ffb8000d!important;color:var(--color-amber)!important;border:1px solid rgba(255,184,0,.2)}.dashboard-main{flex:1;display:flex;flex-direction:column;background:var(--bg-page);overflow:hidden;min-width:0}.build-header-hero{padding:16px 24px;background:var(--bg-surface);border-bottom:2px solid var(--border-visible);display:flex;align-items:center;gap:24px;flex-shrink:0}.build-id-badge{font-family:JetBrains Mono,monospace;font-size:var(--fs-xs)!important;font-weight:700!important;padding:4px 12px!important;background:#0006!important;border:1px solid var(--border-visible)!important;color:var(--color-primary)!important;border-radius:6px!important;text-transform:uppercase;letter-spacing:.1em}.build-title-big{font-size:1.1rem;font-weight:800;margin:0;color:#e8e8ff;letter-spacing:-.01em;text-transform:uppercase;font-family:Outfit,sans-serif}.summary-item{display:flex;align-items:center;gap:8px;font-size:var(--fs-xs);font-weight:700;color:var(--text-dim);padding:6px 12px;background:#0000004d;border-radius:6px;border:1px solid var(--border-visible);text-transform:uppercase;letter-spacing:.05em;font-family:JetBrains Mono,monospace}.build-summary-row{display:flex;gap:var(--space-sm);margin-top:12px}.sessions-table{width:100%!important;border-collapse:collapse;table-layout:auto}.sessions-table-wrapper{width:100%;flex:1;overflow-x:auto;border:1px solid var(--border-visible);border-radius:8px;background:#0003}.sessions-table th{padding:12px 16px;color:var(--text-dim);font-size:var(--fs-xs);font-weight:700;text-transform:uppercase;letter-spacing:.1em;text-align:left;border-bottom:2px solid var(--border-visible);background:#0003;font-family:JetBrains Mono,monospace}.session-table-row td{padding:12px 16px;border-bottom:1px solid var(--border-visible);font-size:11px;color:var(--text-dim);font-family:JetBrains Mono,monospace;transition:background .2s ease;vertical-align:middle}.session-table-row:hover td{background:#ffffff08}.text-neon-green{color:#0f8!important}.text-neon-red{color:#f44!important}.text-neon-amber{color:#ffb800!important}.text-neon-purple{color:#8b5cf6!important}.text-neon-dim{color:#4a4a6a!important}.id-text{font-family:JetBrains Mono,monospace;font-weight:700;font-size:11px;color:#8b5cf6}.name-text{color:var(--text-bright);font-weight:600;margin-left:8px}.session-table-row.passed .status-text{color:#0f8}.session-table-row.failed .status-text{color:#f44}.session-table-row.running .status-text{color:#ffb800}.detail-breadcrumb{display:flex;align-items:center;gap:12px;padding:12px 24px;background:var(--bg-surface);border-bottom:2px solid var(--border-visible);flex-shrink:0;text-transform:uppercase;background:#0003;border-bottom:1px solid var(--border-visible);font-family:JetBrains Mono,monospace;font-size:var(--fs-xs);color:var(--text-dim)}.back-btn{display:flex;align-items:center;gap:6px;background:none;border:none;color:var(--color-primary);font-weight:700;padding:4px 8px;border-radius:4px;cursor:pointer;transition:all .2s}.back-btn:hover{background:#00ff881a;color:var(--primary-hover)}.crumb-separator{color:var(--text-dim);opacity:.5}.crumb-current{color:var(--color-purple);font-weight:700}.session-detail-view{flex:1;display:flex;flex-direction:column;overflow:hidden;height:100%;min-height:0}.session-metadata-bar{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:24px;padding:16px 24px;background:#0f0f1a66;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px);border-bottom:1px solid var(--border-visible);flex-shrink:0;overflow:hidden}.metadata-item{display:flex;flex-direction:column;gap:4px}.metadata-item.full-width{grid-column:1 / -1}.metadata-label{font-size:10px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.12em;font-weight:800;font-family:JetBrains Mono,monospace}.metadata-value{font-family:JetBrains Mono,monospace;font-size:var(--fs-xs);font-weight:600;color:var(--text-bright);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100%}.metadata-value.mono{color:var(--color-purple)}.ai-analysis-hero{margin:16px 24px 0;padding:0;background:#8b5cf608;border:1px solid rgba(139,92,246,.2);border-radius:8px;overflow:hidden;transition:all .3s cubic-bezier(.4,0,.2,1)}.ai-header{padding:12px 16px;background:#8b5cf60d;display:flex;align-items:center;justify-content:space-between}.ai-title h2{font-size:13px;color:#a78bfa;margin:0}.ai-icon{color:var(--color-purple)}.ai-smart-badge{background:#8b5cf61a!important;color:#a78bfa!important;border:1px solid rgba(139,92,246,.2)!important;font-weight:700!important}.session-detail-main{flex:1;display:flex;overflow:hidden;background:var(--bg-page);min-height:0}.session-detail-left{flex:1;display:flex;flex-direction:column;min-width:0;min-height:0;border-right:1px solid var(--border-visible)}.session-detail-right{width:340px;min-width:340px;max-width:340px;display:flex;flex-direction:column;background:var(--bg-surface);border-left:1px solid var(--border-visible);overflow:hidden}.tabs-nav{display:flex;align-items:center;gap:2px;padding:8px 16px;background:#0f0f1a99;border-bottom:1px solid var(--border-visible)}.tab-btn{padding:6px 12px;background:transparent;border:1px solid transparent;border-radius:4px;font-size:11px;font-weight:700;color:var(--text-dim);text-transform:uppercase;letter-spacing:.05em;font-family:JetBrains Mono,monospace;transition:all .2s}.tab-btn:hover{color:var(--text-muted);background:#ffffff08}.tab-btn.active{color:var(--color-primary);background:#00ff8814;border-color:#0f83;text-shadow:0 0 8px rgba(0,255,136,.3)}.log-filters{display:flex;align-items:center;gap:12px;margin-left:auto;padding-left:12px}.filter-checkbox{display:flex;align-items:center;gap:6px;cursor:pointer;font-size:11px;font-weight:600;color:var(--text-dim);font-family:JetBrains Mono,monospace;letter-spacing:.02em;white-space:nowrap;transition:color .2s}.filter-checkbox:hover{color:var(--text-muted)}.filter-checkbox input[type=checkbox]{-moz-appearance:none;appearance:none;-webkit-appearance:none;width:14px;height:14px;border:1px solid var(--border-visible);border-radius:3px;background:#0000004d;cursor:pointer;position:relative;flex-shrink:0;transition:all .2s}.filter-checkbox input[type=checkbox]:checked{background:#00ff8826;border-color:#0f86}.filter-checkbox input[type=checkbox]:checked:after{content:"✓";position:absolute;top:-1px;left:1px;font-size:11px;color:var(--color-primary);font-weight:700}.logs-viewport{flex:1;overflow-y:auto;background:#05050a}.logs-container{padding:0;background:transparent}.log-line-complex{display:flex;flex-direction:column;padding:8px 16px;margin:0;background:transparent;border:none;border-bottom:1px solid rgba(255,255,255,.03);font-family:JetBrains Mono,monospace}.log-line-complex:hover{background:#ffffff05}.log-line-header{display:flex;align-items:center;gap:12px}.log-time{font-size:10px;color:#4a4a6a;min-width:140px;flex-shrink:0}.log-method{font-size:10px;font-weight:800;min-width:60px;text-align:center;padding:2px 6px;border-radius:4px;text-transform:uppercase;letter-spacing:.05em;font-family:JetBrains Mono,monospace}.log-method.POST{background:#ffb8001a;color:var(--color-amber);border:1px solid rgba(255,184,0,.2)}.log-method.GET{background:#00ff881a;color:var(--color-primary);border:1px solid rgba(0,255,136,.2)}.log-method.DELETE{background:#ff44441a;color:var(--color-red);border:1px solid rgba(255,68,68,.2)}.log-title{color:#c8c8e8;font-size:11px}.log-duration{font-family:JetBrains Mono,monospace;font-size:var(--fs-xs);color:#4a4a6a;background:#0000004d;padding:1px 6px;border-radius:4px;margin-left:4px;border:1px solid rgba(255,255,255,.05)}.log-line-complex.error{background:#ff44440d;border-color:#ff44444d;border-left:2px solid var(--color-red)}.log-otel-link{margin-left:auto;opacity:.3;cursor:help;display:flex;align-items:center;transition:opacity .2s}.log-otel-link:hover{opacity:1;color:var(--primary)}.log-screenshot{display:flex;flex-direction:column;align-items:flex-start;gap:8px;margin:12px 0;padding:12px;background:#0006;border:1px solid var(--border-visible);border-radius:6px;width:fit-content}.log-screenshot-img{max-width:240px;max-height:200px;border-radius:6px;border:1px solid var(--border-subtle);cursor:pointer;transition:all .2s ease;object-fit:contain;background:var(--bg-page)}.log-screenshot-img:hover{transform:scale(1.02);border-color:var(--primary);box-shadow:0 4px 12px #0006}.screenshot-label{font-size:var(--fs-xs);color:var(--text-dim);font-style:italic}.log-body{background:#0000004d;border:1px solid var(--border-subtle);padding:var(--space-sm);border-radius:var(--radius-sm);margin:var(--space-xs) 0;color:var(--text-secondary);white-space:pre-wrap;word-break:break-all;font-size:var(--fs-xs);max-height:120px;overflow-y:auto}.log-response{font-size:var(--fs-xs);color:var(--text-muted);word-break:break-all;padding:var(--space-xs);background:#0003;border-radius:var(--radius-sm);margin-top:var(--space-xs)}.video-panel{padding:12px;background:#0000004d;border-bottom:1px solid var(--border-visible);flex-shrink:0}.video-player-container{background:var(--bg-page);border-radius:8px;aspect-ratio:9/16;max-height:220px;display:flex;align-items:center;justify-content:center;overflow:hidden;border:1px solid var(--border-visible);box-shadow:0 4px 16px #0009}.video-content{max-width:100%;max-height:100%;object-fit:contain}.video-placeholder{color:var(--text-dim);font-size:11px}.capabilities-panel{flex:1;overflow:hidden;display:flex;flex-direction:column;min-height:0;background:var(--bg-surface)}.capabilities-tabs{display:flex;background:#0a0a0fcc;border-bottom:1px solid var(--border-visible);flex-shrink:0}.cap-tab-btn{flex:1;padding:8px 12px;background:transparent;border:none;font-size:10px;font-weight:700;color:var(--text-dim);cursor:pointer;transition:all .2s ease;position:relative;text-align:center;text-transform:uppercase;letter-spacing:.08em;font-family:JetBrains Mono,monospace}.cap-tab-btn:hover{color:var(--text-muted);background:#ffffff08}.cap-tab-btn.active{color:var(--color-primary);background:#00ff880d}.cap-tab-btn.active:after{content:"";position:absolute;bottom:0;left:0;right:0;height:2px;background:var(--color-primary);box-shadow:0 0 10px #00ff8880}.session-detail-tags{display:flex;flex-wrap:wrap;gap:8px;margin-top:4px}.session-tag-badge{background:#8b5cf61a!important;color:#a78bfa!important;border:1px solid rgba(139,92,246,.2)!important;font-family:JetBrains Mono,monospace;font-size:10px}.healing-intelligence-card{margin-top:12px;padding:12px;background:#00ff8805;border:1px solid rgba(0,255,136,.1);border-radius:6px;position:relative}.healing-intelligence-card:before{content:"SELF-HEALING ANALYSIS";position:absolute;top:-8px;left:12px;background:var(--bg-surface);padding:0 6px;font-size:9px;font-weight:800;color:var(--color-primary);letter-spacing:.1em}.intelligence-grid{display:grid;grid-template-columns:1fr 1fr auto;gap:16px;align-items:end}.intel-label{font-size:9px;color:#4a4a6a;text-transform:uppercase;margin-bottom:4px;display:block}.intel-value{display:block;font-family:JetBrains Mono,monospace;font-size:11px}.intel-item:nth-child(2) .intel-value{color:var(--color-primary)}.capabilities-content{flex:1;overflow-y:auto;padding:0}.capabilities-table{width:100%;font-size:11px;border-collapse:collapse}.capabilities-table thead{position:sticky;top:0;z-index:1;background:var(--bg-surface)}.capabilities-table th{padding:var(--space-xs) var(--space-sm);font-size:var(--fs-xs);font-weight:600;color:var(--text-muted);text-align:left;text-transform:uppercase;letter-spacing:.04em;border-bottom:1px solid var(--border-medium)}.capabilities-table th:first-child{width:42%}.capabilities-table tbody tr{transition:background .15s}.capabilities-table tbody tr:hover{background:#ffffff05}.capabilities-table td{padding:var(--space-xs) var(--space-sm);vertical-align:top;border-bottom:1px solid var(--border-subtle)}.capabilities-table td:first-child{color:var(--text-secondary);font-weight:500}.capabilities-table td:last-child{color:var(--text-bright);font-family:JetBrains Mono,monospace;font-size:var(--fs-xs);word-break:break-all}.empty-state{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;color:var(--text-muted);gap:var(--space-md)}.empty-state h3{font-size:1.1rem;margin:0;color:var(--text-secondary)}.empty-state p{font-size:13px;opacity:.7}.sidebar-loading,.sidebar-empty{display:flex;align-items:center;justify-content:center;padding:var(--space-xl);color:var(--text-muted);font-size:12px}.animate-fade-in{animation:fadeIn .2s ease-out}@keyframes fadeIn{0%{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}@media (max-width: 1200px){.session-detail-right{width:280px;min-width:280px;max-width:280px}}@media (max-width: 1000px){.session-detail-main{flex-direction:column}.session-detail-right{width:100%;min-width:100%;max-height:350px;border-left:none;border-top:1px solid var(--border-subtle)}.video-player-container{aspect-ratio:16/9;max-height:180px}}@media (max-width: 768px){.dashboard-layout{flex-direction:column}.dashboard-sidebar{width:100%;min-width:100%;max-height:200px}}.profiling-view{padding:20px;display:flex;flex-direction:column;gap:24px;color:var(--text-main);background:var(--bg-app);height:100%;overflow-y:auto}.profiling-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;padding:40px;text-align:center;gap:16px}.empty-icon{color:var(--text-dim);opacity:.3}.success-icon{color:#10b981;animation:pulse-success 2s ease-in-out infinite}.progress-icon{color:var(--primary);animation:spin-slow 3s linear infinite}@keyframes pulse-success{0%,to{transform:scale(1);opacity:1}50%{transform:scale(1.05);opacity:.9}}@keyframes spin-slow{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.chart-subtitle{font-size:12px;color:var(--text-muted);font-weight:400;margin-left:8px}.stat-icon.peak{background:linear-gradient(135deg,#ef444433,#ef44441a);color:#ef4444}.profiling-empty h3{color:var(--text-bright);font-size:1.1rem;margin:0}.profiling-empty p{color:var(--text-muted);font-size:13px;max-width:320px;line-height:1.5;margin-bottom:8px}.download-trace-btn{display:flex;align-items:center;gap:10px;background:var(--primary-soft);border:1px solid var(--primary);color:var(--primary);padding:12px 24px;border-radius:var(--radius-md);font-size:13px;font-weight:600;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);margin-top:12px}.download-trace-btn:hover{background:var(--primary);color:var(--bg-app);transform:translateY(-2px);box-shadow:var(--shadow-glow)}.download-trace-btn:active{transform:translateY(0)}.profiling-stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:16px}.profiling-stat-card{background:#0f0f1a66;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border:1px solid var(--border-visible);border-radius:8px;padding:16px}.stat-icon{width:40px;height:40px;border-radius:6px;display:flex;align-items:center;justify-content:center}.stat-icon.cpu{background:#ffb8001a;color:var(--color-amber)}.stat-icon.memory{background:#00aaff1a;color:var(--color-blue)}.stat-info{display:flex;flex-direction:column}.stat-label{font-size:10px;color:var(--text-dim);text-transform:uppercase;letter-spacing:.1em}.stat-value{font-size:20px;font-weight:700;font-family:JetBrains Mono,monospace;color:var(--text-bright)}.profiling-chart-container{background:#0003;border:1px solid var(--border-subtle);border-radius:8px;padding:20px}.chart-title{font-size:13px;font-weight:600;margin:0 0 16px;color:var(--text-secondary)}.svg-chart-wrapper{position:relative;width:100%}.profiling-svg{width:100%;height:auto;overflow:visible}.chart-legend{display:flex;gap:16px;margin-top:16px;justify-content:center}.legend-item{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--text-muted)}.legend-dot{width:8px;height:8px;border-radius:6px}.legend-dot.cpu{background:#f59e0b}.legend-dot.memory{background:#3b82f6}.profiling-table-wrapper{background:#ffffff05;border:1px solid var(--border-subtle);border-radius:8px;overflow:hidden}.profiling-table{width:100%;border-collapse:collapse}.profiling-table th{padding:12px;text-align:left;font-size:var(--fs-xs);text-transform:uppercase;color:var(--text-muted);border-bottom:1px solid var(--border-subtle);background:#0003}.profiling-table td{padding:12px;font-size:12px;border-bottom:1px solid rgba(255,255,255,.03)}.time-cell{color:var(--text-dim);font-family:JetBrains Mono,monospace;font-size:11px}.progress-bar-container{position:relative;height:20px;background:#ffffff0d;border-radius:4px;overflow:hidden;width:120px}.progress-bar{height:100%;transition:width .3s ease}.progress-bar.cpu{background:#f59e0b4d}.progress-bar.memory{background:#3b82f64d}.progress-text{position:absolute;top:50%;left:8px;transform:translateY(-50%);font-size:var(--fs-xs);font-weight:600;color:var(--text-bright)}.details-cell{color:var(--text-muted);font-size:11px}.screenshots-view{padding:var(--space-lg);overflow-y:auto;flex:1}.screenshots-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:var(--space-lg)}.screenshot-card{background:var(--bg-surface);border:1px solid var(--border-subtle);border-radius:var(--radius-lg);overflow:hidden;display:flex;flex-direction:column;transition:all .3s cubic-bezier(.4,0,.2,1);box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -1px #0000000f}.screenshot-card:hover{transform:translateY(-4px);border-color:var(--primary-muted);box-shadow:0 10px 15px -3px #0000004d,0 4px 6px -2px #0000000d}.screenshot-img-wrapper{position:relative;aspect-ratio:9/16;background:#000;cursor:pointer;overflow:hidden}.device-screenshot-img{width:100%;height:100%;object-fit:contain;transition:transform .5s ease}.screenshot-card:hover .device-screenshot-img{transform:scale(1.05)}.screenshot-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background:#0006;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .3s ease;color:#fff}.screenshot-img-wrapper:hover .screenshot-overlay{opacity:1}.screenshot-info{padding:var(--space-md);display:flex;flex-direction:column;gap:8px;background:#ffffff05;border-top:1px solid var(--border-subtle)}.screenshot-command{font-family:Outfit,sans-serif;font-size:13px;font-weight:600;color:var(--text-bright);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.screenshot-time{font-size:11px;color:var(--text-dim);font-family:JetBrains Mono,monospace}.screenshot-download-link{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--primary);text-decoration:none;font-weight:600;margin-top:4px;transition:opacity .2s}.screenshot-download-link:hover{opacity:.8;text-decoration:underline}.waterfall-container.elite-tier{padding:1.5rem;background:var(--bg-page);border-radius:8px;border:1px solid rgba(56,189,248,.1);display:flex;flex-direction:column;gap:1.5rem;overflow-x:auto;min-height:500px;box-shadow:inset 0 0 20px #00000080;font-family:Fira Sans,sans-serif}.waterfall-header{position:sticky;top:0;z-index:20;background:#020617;padding:1rem 0;border-bottom:2px solid rgba(56,189,248,.2)}.timeline-labels{position:relative;height:30px;margin-left:200px}.tick-label{position:absolute;transform:translate(-50%);display:flex;flex-direction:column;align-items:center;gap:4px}.tick-mark{width:2px;height:8px;background:#38bdf866;border-radius:4px}.tick-text{font-size:.7rem;color:#ffffff80;font-family:Fira Code,monospace;white-space:nowrap}.waterfall-body{position:relative;display:flex;flex-direction:column}.timeline-grid{position:absolute;top:0;left:200px;right:0;bottom:0;pointer-events:none;z-index:1}.grid-line{position:absolute;top:0;bottom:0;width:1px;background:#ffffff08}.scrubber-line{position:absolute;top:0;bottom:0;width:1px;background:#38bdf8;z-index:30;box-shadow:0 0 8px #38bdf880}.scrubber-head{position:absolute;top:-4px;left:-4px;width:9px;height:9px;background:#38bdf8;border-radius:50%;box-shadow:0 0 10px #38bdf8cc}.waterfall-row{display:flex;align-items:center;height:40px;cursor:pointer;transition:all .2s cubic-bezier(.4,0,.2,1);border-bottom:1px solid rgba(255,255,255,.02);z-index:2}.waterfall-row.even{background:#1e293b4d}.waterfall-row.odd{background:transparent}.waterfall-row:hover{background:#38bdf814}.row-label{width:200px;padding:0 16px;display:flex;flex-direction:column;justify-content:center;border-right:1px solid rgba(56,189,248,.1)}.command-meta{display:flex;align-items:center;gap:8px;margin-bottom:2px}.method-badge{font-size:.6rem;font-weight:800;padding:1px 4px;border-radius:4px;background:var(--bg-surface)}.method-badge.POST{color:#38bdf8;border:1px solid rgba(56,189,248,.2)}.method-badge.GET{color:#10b981;border:1px solid rgba(16,185,129,.2)}.row-index{font-size:.6rem;color:#ffffff4d;font-family:Fira Code,monospace}.command-name{font-size:.75rem;font-weight:500;color:#f8fafc;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.row-track{flex:1;position:relative;height:100%}.bar-container{position:absolute;top:50%;transform:translateY(-50%);height:20px;display:flex;align-items:center;z-index:5}.bar-fill{position:absolute;top:0;right:0;bottom:0;left:0;background:linear-gradient(90deg,#38bdf8,#0ea5e9);border-radius:4px;box-shadow:0 2px 4px #0000004d}.bar-glow{position:absolute;top:-2px;right:-2px;bottom:-2px;left:-2px;background:#38bdf8;filter:blur(8px);opacity:0;transition:opacity .3s ease;border-radius:6px}.waterfall-row:hover .bar-glow{opacity:.2}.bar-container.warning .bar-fill{background:linear-gradient(90deg,#f59e0b,#d97706)}.bar-info{position:relative;z-index:6;display:flex;align-items:center;gap:4px;padding:0 8px;color:#fff;font-size:.65rem;font-weight:600;font-family:Fira Code,monospace;text-shadow:0 1px 2px rgba(0,0,0,.5)}.bar-tooltip-anchor{position:absolute;top:0;right:0;bottom:0;left:0;z-index:10}.custom-tooltip{position:absolute;bottom:calc(100% + 12px);left:50%;transform:translate(-50%) translateY(10px);background:var(--bg-surface);border:1px solid #38bdf8;border-radius:8px;padding:12px;width:180px;opacity:0;pointer-events:none;transition:all .2s cubic-bezier(.4,0,.2,1);box-shadow:0 10px 15px -3px #00000080;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px)}.bar-tooltip-anchor:hover .custom-tooltip{opacity:1;transform:translate(-50%) translateY(0)}.tooltip-title{font-size:.8rem;font-weight:700;color:#fff;margin-bottom:8px;border-bottom:1px solid rgba(255,255,255,.1);padding-bottom:4px}.tooltip-row{display:flex;justify-content:space-between;font-size:.7rem;margin-bottom:4px}.tooltip-row span:first-child{color:#ffffff80}.tooltip-row .value{color:#38bdf8;font-weight:600}.tooltip-row .value.mono{font-family:Fira Code,monospace}.empty-icon{color:#38bdf833;margin-bottom:1rem;animation:pulse 2s infinite}@keyframes pulse{0%{transform:scale(1);opacity:.2}50%{transform:scale(1.1);opacity:.4}to{transform:scale(1);opacity:.2}}@keyframes highlight-flash{0%{background:#38bdf880}to{background:transparent}}.highlight-flash{animation:highlight-flash 2s ease-out}.sessions-table-actions{display:flex;align-items:flex-end;justify-content:space-between;padding:var(--space-md) var(--space-lg);background:var(--bg-surface);border-bottom:1px solid var(--border-subtle);flex-shrink:0}.session-search{width:350px}.table-stats{font-size:var(--fs-xs);color:var(--text-muted);font-weight:600;text-transform:uppercase;letter-spacing:.05em;opacity:.8;margin-top:4px}.ai-analysis-hero{margin:0;padding:0;background:#0f172acc;border:none;border-bottom:1px solid var(--border-medium);border-radius:0;box-shadow:var(--shadow-lg);position:relative;overflow:hidden;-webkit-backdrop-filter:var(--glass-blur);backdrop-filter:var(--glass-blur);transition:all .4s cubic-bezier(.4,0,.2,1);z-index:5}.ai-analysis-hero.collapsed{max-height:60px}.ai-header{display:flex;align-items:center;justify-content:space-between;padding:var(--space-md) var(--space-lg);background:#ffffff08;border-bottom:1px solid transparent;transition:all .2s cubic-bezier(.4,0,.2,1)}.ai-title-group{display:flex;align-items:center;gap:var(--space-md)}.ai-smart-badge{font-size:var(--fs-xs)!important;font-weight:800!important;text-transform:uppercase;letter-spacing:.05em;color:var(--primary)!important;border-color:#22c55e66!important;background:#22c55e0d!important;display:flex;align-items:center;gap:4px;padding:2px 8px!important;box-shadow:0 0 10px #22c55e1a}.ai-header.clickable{cursor:pointer;-webkit-user-select:none;user-select:none}.ai-header.clickable:hover .chevron-wrapper{background:#ffffff1a;transform:translate(2px)}.ai-header.clickable:hover .ai-icon{animation:brain-pulse-intense 1.5s infinite ease-in-out}@keyframes brain-pulse-intense{0%{transform:scale(1);filter:drop-shadow(0 0 8px var(--primary))}50%{transform:scale(1.2);filter:drop-shadow(0 0 15px var(--primary))}to{transform:scale(1);filter:drop-shadow(0 0 8px var(--primary))}}.ai-analysis-hero:not(.collapsed) .ai-header{border-bottom-color:var(--border-medium);background:#ffffff0d}.ai-collapsible-content{overflow-y:auto;max-height:450px;opacity:1;visibility:visible;padding:var(--space-lg) var(--space-lg);transition:all .4s cubic-bezier(.4,0,.2,1);scrollbar-width:thin;scrollbar-color:var(--border-medium) transparent;background:linear-gradient(to bottom,rgba(15,23,42,.2),transparent)}.ai-collapsible-content.collapsed{max-height:0;opacity:0;visibility:hidden;overflow:hidden}.chevron-wrapper{width:32px;height:32px;display:flex;align-items:center;justify-content:center;border-radius:50%;background:#ffffff0d;transition:all .3s ease}.chevron-icon{color:var(--text-muted);transition:all .4s cubic-bezier(.4,0,.2,1)}.chevron-icon.rotated{transform:rotate(90deg);color:var(--primary)}.ai-title{display:flex;align-items:center;gap:12px}.healed-badge{background:#10b9811a;color:var(--primary);border-color:var(--primary);margin-left:var(--space-md);font-weight:700;font-size:.7rem;padding:0 8px;height:20px;display:flex;align-items:center;gap:4px}@keyframes pulse-subtle{0%,to{opacity:1;transform:scale(1)}50%{opacity:.8;transform:scale(.98)}}.animate-pulse-subtle{animation:pulse-subtle 2s ease-in-out infinite}.healing-intelligence-card{margin:var(--space-sm) 0 var(--space-md) var(--space-xl);background:#10b98108;border:1px solid rgba(16,185,129,.1);border-radius:var(--radius-md);padding:var(--space-md);max-width:800px;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);animation:slideInDown .3s cubic-bezier(.16,1,.3,1)}@keyframes slideInDown{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.intelligence-grid{display:flex;flex-wrap:wrap;gap:var(--space-lg)}.intel-item{display:flex;flex-direction:column;gap:4px;min-width:150px}.intel-label{font-size:.65rem;font-weight:800;color:var(--text-dim);letter-spacing:1px;text-transform:uppercase}.intel-value{color:var(--text-main);font-size:.85rem;font-weight:600;word-break:break-all}code.intel-value{font-family:JetBrains Mono,monospace;background:#ffffff0d;padding:2px 6px;border-radius:4px;color:var(--primary)}.intel-item:last-child .intel-value{color:var(--primary);font-family:Outfit,sans-serif;font-weight:700}.ai-icon{color:var(--primary);filter:drop-shadow(0 0 8px rgba(16,185,129,.4));animation:brain-pulse 3s infinite ease-in-out}@keyframes brain-pulse{0%{transform:scale(1);opacity:.8}50%{transform:scale(1.1);opacity:1;filter:drop-shadow(0 0 12px var(--primary-glow))}to{transform:scale(1);opacity:.8}}.ai-title h2{font-family:Outfit,sans-serif;font-size:1.1rem;font-weight:700;margin:0;color:var(--text-bright);letter-spacing:-.02em}.ai-content{color:var(--text-secondary);font-family:Fira Sans,sans-serif;font-size:13px;line-height:1.7}.ai-content h3{font-family:Outfit,sans-serif;color:var(--text-bright);font-size:14px;margin:16px 0 8px;font-weight:700;display:flex;align-items:center;gap:8px}.ai-content p{margin-bottom:12px}.ai-content strong{color:var(--text-bright);font-weight:600}.ai-content code{font-family:JetBrains Mono,monospace;background:#0000004d;padding:2px 6px;border-radius:4px;color:var(--primary);font-size:.9em}.ai-content pre{background:#0006;padding:12px;border-radius:var(--radius-md);border:1px solid var(--border-subtle);margin:12px 0;overflow-x:auto}.ai-content pre code{background:transparent;padding:0;color:var(--text-secondary);font-size:11px}.ai-content ul,.ai-content ol{margin-bottom:16px;padding-left:20px}.ai-content li{margin-bottom:8px}.session-tags-pills{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.tag-pill-mini{font-size:var(--fs-xs);font-weight:700;color:var(--text-dim);background:#ffffff0d;border:1px solid var(--border-subtle);padding:1px 4px;border-radius:4px;text-transform:uppercase;letter-spacing:.02em}.session-detail-tags{display:flex;flex-wrap:wrap;gap:6px;margin-top:4px}.session-tag-badge{font-size:var(--fs-xs)!important;font-weight:600!important;font-family:JetBrains Mono,monospace!important;background:#1e293bcc!important;border-color:var(--border-medium)!important;color:var(--accent-blue)!important;text-transform:uppercase!important}.metadata-item.full-width{width:100%;margin-top:8px}
|