+ {/* Stat strip — 5 columns matching /agents */}
+
+ 85 ? 'error' : agent.cpuUsagePct > 70 ? 'warning' : 'success'} />
+ 85 ? 'error' : agent.memoryUsagePct > 70 ? 'warning' : 'success'} detail={`${processInfo.heapUsed} / ${processInfo.heapMax}`} />
+
+
+
+
+
+ {/* Scope trail + badges */}
+
+ All Agents
+ ▸
+ {appId}
+ ▸
+ {agent.name}
+
+
+
+
+
+ {/* Process info card — right below stat strip */}
+
+
Process Information
+
+ JVM
+ {processInfo.jvmVersion}
+
+ Camel
+ {processInfo.camelVersion}
+
+ Spring Boot
+ {processInfo.springBootVersion}
+
+ Started
+ {new Date(processInfo.startTime).toLocaleString()}
+
+ File Descriptors
+ {processInfo.openFileDescriptors} / {processInfo.maxFileDescriptors.toLocaleString()}
+
+
+
+ {/* Charts grid — 3x2 (CPU, Memory, Throughput, Errors, Threads, GC) */}
+
+
+
+ CPU Usage
+ {agent.cpuUsagePct}% current
+
+
+
+
+
+
+ Memory (Heap)
+ {processInfo.heapUsed} / {processInfo.heapMax}
+
+
+
+
+
+
+ Throughput
+ {agent.tps.toFixed(1)} msg/s
+
+
+
+
+
+
+ Error Rate
+ {agent.errorRate ?? '0 err/h'}
+
+
+
+
+
+
+ Thread Count
+ {processInfo.threadCount} active
+
+
+
+
+
+
+ GC Pauses
+ {processInfo.gcPauseTotal} total
+
+
+
+
+
+ {/* Log + Timeline side by side */}
+
+ {/* Log viewer */}
+
+
+ Application Log
+
+
+
+ {filteredLogs.map((entry, i) => (
+
+ {formatLogTime(entry.ts)}
+
+ {entry.logger}
+ {entry.msg}
+
+ ))}
+ {filteredLogs.length === 0 && (
+
No log entries match the selected filter.
+ )}
+
+
+
+ {/* Timeline */}
+
+
+ Timeline
+ {instanceEvents.length} events
+
+ {instanceEvents.length > 0 ? (
+
+ ) : (
+
No events in the selected time range.
+ )}
+
+
+
+
+ )
+}