+ {/* Summary cards */}
+
+
+
+
+
+
+ Endpoint Exists
+
+
+ {String(event.endpointExists)}
+
+
+
+
+
+ {/* Full URL */}
+
+
+
+ Captured Full URL
+
+
{event.fullUrl}
+
+
+
+ {/* === EXTENSIONS === */}
+ {(event.duration || event.userIp || event.userAgent) && (
+ <>
+
+
+
+
+ Built-in Extensions
+
+
+
+
+ Extensions enrich events with additional data via the IHttpEventExtension interface. These are built-in — you can add your own.
+
+
+
+
+
+
+ {event.duration && (
+
+
+
+ Duration
+
+
+ Extension
+
+
+
{parseDuration(event.duration)}
+ {event.startTime && event.endTime && (
+
+ {event.startTime} → {event.endTime}
+
+ )}
+
+ )}
+ {event.userIp && (
+
+
+
Client IP
+
+ Extension
+
+
+
{event.userIp}
+
+ )}
+ {event.userAgent && (
+
+
+
+ User Agent
+
+
+ Extension
+
+
+
{event.userAgent}
+
+ )}
+
+
+ >
+ )}
+
+ {/* === REQUEST CAPTURE === */}
+
+
+
+
+ Request Capture
+
+
+
+
+
+
+ } />
+
+
+
+ {hasQueryParams && (
+
+ } accent="text-amber-400" />
+
+
+ )}
+
+ {hasPathParams && (
+
+ } accent="text-purple-400" />
+
+
+ )}
+
+ {hasRequestBody && (
+
+ } />
+
+
+ )}
+
+ {hasFiles && (
+
+ } accent="text-cyan-400" />
+ {Object.entries(event.bodyPayload!.files).map(([field, files]) =>
+ files.map((f, i) => (
+
+
+ {f.filename}
+ {(f.size / 1024).toFixed(1)} KB
+
+
+ Field: {field} | Type: {f.contentType}
+
+ {f.contentType?.startsWith('image/') && f.base64Content && (
+

+ )}
+
+ ))
+ )}
+
+ )}
+
+ {/* === RESPONSE CAPTURE === */}
+
+
+
+
+ Response Capture
+
+
+
+
+
+
+
+
+
+
+ } accent="text-emerald-500" />
+
+
+
+ {hasError && (
+
+ } accent="text-red-400" />
+
+
+ )}
+
+ {hasResponseBody && (
+
+ } accent="text-emerald-400" />
+
+
+ )}
+
+ {/* Bottom padding */}
+
+