diff --git a/src/Agent/AutopilotMonitor.Agent.Core/Monitoring/Collectors/HelloDetector.cs b/src/Agent/AutopilotMonitor.Agent.Core/Monitoring/Collectors/HelloDetector.cs index 3ae84e0c..03a0df48 100644 --- a/src/Agent/AutopilotMonitor.Agent.Core/Monitoring/Collectors/HelloDetector.cs +++ b/src/Agent/AutopilotMonitor.Agent.Core/Monitoring/Collectors/HelloDetector.cs @@ -400,9 +400,10 @@ namespace AutopilotMonitor.Agent.Core.Monitoring.Collectors switch (eventId) { case EventId_ProvisioningWillLaunch: // 358 - eventType = "hello_provisioning_started"; + eventType = "hello_provisioning_willlaunch"; severity = EventSeverity.Info; - message = "Windows Hello for Business provisioning started - prerequisites passed"; + message = "Windows Hello for Business provisioning will launch - prerequisites passed (snapshot only, not a final state)"; + _logger.Info("Windows Hello provisioning will launch - prerequisites passed (snapshot only, not a final state)"); break; case EventId_NgcKeyRegistered: // 300 @@ -422,9 +423,9 @@ namespace AutopilotMonitor.Agent.Core.Monitoring.Collectors break; case EventId_ProvisioningWillNotLaunch: // 360 - eventType = "hello_provisioning_skipped"; + eventType = "hello_provisioning_willnotlaunch"; severity = EventSeverity.Warning; - message = "Windows Hello for Business provisioning prerequisites not met (snapshot only, not terminal)"; + message = "Windows Hello for Business provisioning prerequisites not met (snapshot only, not a final state"; // DO NOT mark Hello as completed - event 360 is just a snapshot and can change _logger.Info("Windows Hello provisioning prerequisites not met (snapshot, not terminal)"); break; diff --git a/src/Agent/AutopilotMonitor.Agent.Core/Monitoring/Tracking/EnrollmentTracker.cs b/src/Agent/AutopilotMonitor.Agent.Core/Monitoring/Tracking/EnrollmentTracker.cs index 88d49644..ed75cacc 100644 --- a/src/Agent/AutopilotMonitor.Agent.Core/Monitoring/Tracking/EnrollmentTracker.cs +++ b/src/Agent/AutopilotMonitor.Agent.Core/Monitoring/Tracking/EnrollmentTracker.cs @@ -205,16 +205,21 @@ namespace AutopilotMonitor.Agent.Core.Monitoring.Tracking if (!string.IsNullOrEmpty(lastBootUpTimeStr)) { // WMI time format: yyyyMMddHHmmss.ffffff+/-UUU - var bootTime = ManagementDateTimeConverter.ToDateTime(lastBootUpTimeStr); - data["bootTime"] = bootTime.ToString("o"); // ISO 8601 format - data["bootTimeUtc"] = bootTime.ToUniversalTime().ToString("o"); + // ManagementDateTimeConverter.ToDateTime returns DateTimeKind.Local, + // so we must explicitly convert to UTC and tag it as UTC to ensure + // correct ISO 8601 serialization with Z suffix. + var bootTimeLocal = ManagementDateTimeConverter.ToDateTime(lastBootUpTimeStr); + var bootTimeUtc = DateTime.SpecifyKind(bootTimeLocal.ToUniversalTime(), DateTimeKind.Utc); - // Calculate uptime - var uptime = DateTime.Now - bootTime; + data["bootTimeUtc"] = bootTimeUtc.ToString("o"); // always ends with Z + data["bootTime"] = bootTimeUtc.ToString("o"); // keep for compat, also UTC + + // Calculate uptime using UTC to avoid local-clock drift + var uptime = DateTime.UtcNow - bootTimeUtc; data["uptimeMinutes"] = (int)uptime.TotalMinutes; data["uptimeHours"] = uptime.TotalHours; - _logger.Debug($"Boot time: {bootTime:o}, Uptime: {uptime.TotalMinutes:F1} minutes"); + _logger.Debug($"Boot time (UTC): {bootTimeUtc:o}, Uptime: {uptime.TotalMinutes:F1} minutes"); break; } } diff --git a/src/Web/autopilot-monitor-web/app/globals.css b/src/Web/autopilot-monitor-web/app/globals.css index 4641962e..dd531536 100644 --- a/src/Web/autopilot-monitor-web/app/globals.css +++ b/src/Web/autopilot-monitor-web/app/globals.css @@ -292,6 +292,7 @@ body { ::-webkit-scrollbar { width: 6px; height: 6px; + transition: width 0.2s ease; } ::-webkit-scrollbar-track { background: transparent; @@ -301,12 +302,16 @@ body { border-radius: 4px; } ::-webkit-scrollbar-thumb:hover { - background: #cbd5e1; + background: #94a3b8; } html:hover ::-webkit-scrollbar-thumb, body:hover ::-webkit-scrollbar-thumb { background: #cbd5e1; } +::-webkit-scrollbar:hover { + width: 10px; + height: 10px; +} /* -- Scrollbar (dark mode) -- */ .dark ::-webkit-scrollbar { @@ -321,9 +326,13 @@ body:hover ::-webkit-scrollbar-thumb { border-radius: 4px; } .dark ::-webkit-scrollbar-thumb:hover { - background: #64748b; + background: #94a3b8; } .dark html:hover ::-webkit-scrollbar-thumb, .dark body:hover ::-webkit-scrollbar-thumb { background: #475569; } +.dark ::-webkit-scrollbar:hover { + width: 10px; + height: 10px; +} diff --git a/src/Web/autopilot-monitor-web/app/settings/page.tsx b/src/Web/autopilot-monitor-web/app/settings/page.tsx index 94575c24..fde21ec2 100644 --- a/src/Web/autopilot-monitor-web/app/settings/page.tsx +++ b/src/Web/autopilot-monitor-web/app/settings/page.tsx @@ -377,31 +377,6 @@ export default function SettingsPage() { } }; - const handleReset = () => { - if (!config) return; - - setManufacturerWhitelist(config.manufacturerWhitelist); - setModelWhitelist(config.modelWhitelist); - setValidateSerialNumber(config.validateSerialNumber); - setDataRetentionDays(config.dataRetentionDays ?? 90); - setSessionTimeoutHours(config.sessionTimeoutHours ?? 5); - setEnablePerformanceCollector(config.enablePerformanceCollector ?? false); - setPerformanceCollectorInterval(config.performanceCollectorIntervalSeconds ?? 60); - setSelfDestructOnComplete(config.selfDestructOnComplete ?? false); - setKeepLogFile(config.keepLogFile ?? true); - setRebootOnComplete(config.rebootOnComplete ?? false); - setRebootDelaySeconds(config.rebootDelaySeconds ?? 10); - setEnableGeoLocation(config.enableGeoLocation ?? true); - setEnableImeMatchLog(config.enableImeMatchLog ?? false); - setLogLevel(config.logLevel ?? "Info"); - setTeamsWebhookUrl(config.teamsWebhookUrl ?? ""); - setTeamsNotifyOnSuccess(config.teamsNotifyOnSuccess ?? true); - setTeamsNotifyOnFailure(config.teamsNotifyOnFailure ?? true); - setDiagnosticsBlobSasUrl(config.diagnosticsBlobSasUrl ?? ""); - setDiagnosticsUploadMode(config.diagnosticsUploadMode ?? "Off"); - setSuccessMessage(null); - setError(null); - }; const handleAddAdmin = async () => { if (!tenantId || !newAdminEmail.trim()) return; @@ -597,13 +572,6 @@ export default function SettingsPage() { {!loading && (