/// Enrollment type: "v1" (Autopilot Classic/ESP) or "v2" (Windows Device Preparation).
/// Defaults to "v1" for sessions that predate this field.
diff --git a/src/Shared/AutopilotMonitor.Shared/Models/SessionSearchFilter.cs b/src/Shared/AutopilotMonitor.Shared/Models/SessionSearchFilter.cs
index 88e14023..ad2ef528 100644
--- a/src/Shared/AutopilotMonitor.Shared/Models/SessionSearchFilter.cs
+++ b/src/Shared/AutopilotMonitor.Shared/Models/SessionSearchFilter.cs
@@ -37,6 +37,11 @@ namespace AutopilotMonitor.Shared.Models
public int? RebootCountMin { get; set; }
public int? RebootCountMax { get; set; }
+ // Active network connection type ("WiFi" or "Ethernet"). Exact match on the
+ // stored ConnectionType column. Sessions that predate the projection lack the
+ // property and are excluded (acceptable — they have no connection data).
+ public string? ConnectionType { get; set; }
+
public int Limit { get; set; } = 50;
// Dynamic device property filters (key = "eventType.propertyName", value = filter expression)
diff --git a/src/Web/autopilot-monitor-web/app/dashboard/components/SessionTable.tsx b/src/Web/autopilot-monitor-web/app/dashboard/components/SessionTable.tsx
index a6b666131..435a1608 100644
--- a/src/Web/autopilot-monitor-web/app/dashboard/components/SessionTable.tsx
+++ b/src/Web/autopilot-monitor-web/app/dashboard/components/SessionTable.tsx
@@ -31,6 +31,7 @@ const ALL_COLUMNS: ColumnDef[] = [
{ key: "started", label: "Started", defaultVisible: true, sortKey: "startedAt" },
{ key: "country", label: "Country", defaultVisible: false, sortKey: "geoCountry", filterKey: "geoCountry" },
{ key: "apiLatency", label: "API Latency", defaultVisible: false, sortKey: "avgApiLatencyMs" },
+ { key: "connection", label: "Connection", defaultVisible: false, sortKey: "connectionType", filterKey: "connectionType" },
{ key: "agentVersion", label: "Agent Version", defaultVisible: false, sortKey: "agentVersion", filterKey: "agentVersion" },
{ key: "osName", label: "OS Name", defaultVisible: false, sortKey: "osName", filterKey: "osName" },
{ key: "osBuild", label: "OS Build", defaultVisible: false, sortKey: "osBuild", filterKey: "osBuild" },
@@ -641,7 +642,7 @@ export function SessionTable({
currentSort={sortColumn}
direction={sortDirection}
onSort={onSort}
- className={["eventCount", "duration", "started", "country", "apiLatency", "agentVersion", "osName", "osBuild", "osDisplayVersion", "osEdition", "osLanguage"].includes(col.key) ? "px-3" : undefined}
+ className={["eventCount", "duration", "started", "country", "apiLatency", "connection", "agentVersion", "osName", "osBuild", "osDisplayVersion", "osEdition", "osLanguage"].includes(col.key) ? "px-3" : undefined}
filterKey={col.filterKey}
filterValues={col.filterKey ? uniqueValuesByField[col.filterKey] : undefined}
activeFilter={col.filterKey ? columnFilters[col.filterKey] : undefined}
@@ -922,6 +923,19 @@ function SessionCell({
);
+ case "connection":
+ return (
+ |
+ {session.connectionType ? (
+
+ {session.connectionType}
+
+ ) : (
+ —
+ )}
+ |
+ );
+
case "agentVersion": {
const fullVersion = session.agentVersion || "";
const shortVersion = fullVersion.split("+")[0];
diff --git a/src/Web/autopilot-monitor-web/types/session.ts b/src/Web/autopilot-monitor-web/types/session.ts
index b5cd53db..6805b305 100644
--- a/src/Web/autopilot-monitor-web/types/session.ts
+++ b/src/Web/autopilot-monitor-web/types/session.ts
@@ -47,6 +47,8 @@ export interface Session {
avgApiLatencyMs?: number;
/** Number of HTTP requests behind avgApiLatencyMs — the weight when averaging across sessions. */
apiRequestCount?: number;
+ /** Active network connection type during enrollment ("WiFi" or "Ethernet", last emission wins). Absent for sessions predating the projection. */
+ connectionType?: string;
/**
* Compact JSON snapshot of "last known session state" written by the maintenance
* 5h-timeout sweep when a session graduates to terminal Failed (Hybrid User-Driven