Build and Push / build (release) Successful in 2m59s
- Add SystemStats freezed models matching Core API response - Add systemStatsProvider to fetch stats from /tools/system/stats - Update dashboard to display CPU, RAM, VRAM, and disk usage gauges - Implement color-coded gauges: green ≤50%, orange 51-75%, red >75% - Add auto-refresh every 30 seconds - Improve gauge widget: speedometer style, icons below labels - Update weather widget to match air quality vertical layout 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
92 lines
2.8 KiB
Dart
92 lines
2.8 KiB
Dart
import 'package:freezed_annotation/freezed_annotation.dart';
|
|
|
|
part 'system_stats_model.freezed.dart';
|
|
part 'system_stats_model.g.dart';
|
|
|
|
/// System statistics response from Core API.
|
|
@freezed
|
|
sealed class SystemStats with _$SystemStats {
|
|
const factory SystemStats({
|
|
required CpuStats cpu,
|
|
required MemoryStats memory,
|
|
required List<DiskStats> disks,
|
|
required NetworkStats network,
|
|
required GpuStats gpu,
|
|
required String hostname,
|
|
@JsonKey(name: 'queried_at') required DateTime queriedAt,
|
|
}) = _SystemStats;
|
|
|
|
factory SystemStats.fromJson(Map<String, dynamic> json) =>
|
|
_$SystemStatsFromJson(json);
|
|
}
|
|
|
|
@freezed
|
|
sealed class CpuStats with _$CpuStats {
|
|
const factory CpuStats({
|
|
@JsonKey(name: 'usage_percent') required double usagePercent,
|
|
required int cores,
|
|
@JsonKey(name: 'load_1m') double? load1m,
|
|
@JsonKey(name: 'load_5m') double? load5m,
|
|
@JsonKey(name: 'load_15m') double? load15m,
|
|
}) = _CpuStats;
|
|
|
|
factory CpuStats.fromJson(Map<String, dynamic> json) =>
|
|
_$CpuStatsFromJson(json);
|
|
}
|
|
|
|
@freezed
|
|
sealed class MemoryStats with _$MemoryStats {
|
|
const factory MemoryStats({
|
|
@JsonKey(name: 'usage_percent') required double usagePercent,
|
|
@JsonKey(name: 'total_bytes') required int totalBytes,
|
|
@JsonKey(name: 'used_bytes') required int usedBytes,
|
|
@JsonKey(name: 'available_bytes') required int availableBytes,
|
|
}) = _MemoryStats;
|
|
|
|
factory MemoryStats.fromJson(Map<String, dynamic> json) =>
|
|
_$MemoryStatsFromJson(json);
|
|
}
|
|
|
|
@freezed
|
|
sealed class DiskStats with _$DiskStats {
|
|
const factory DiskStats({
|
|
@JsonKey(name: 'mount_point') required String mountPoint,
|
|
required String device,
|
|
required String fstype,
|
|
@JsonKey(name: 'usage_percent') required double usagePercent,
|
|
@JsonKey(name: 'total_bytes') required int totalBytes,
|
|
@JsonKey(name: 'used_bytes') required int usedBytes,
|
|
@JsonKey(name: 'free_bytes') required int freeBytes,
|
|
}) = _DiskStats;
|
|
|
|
factory DiskStats.fromJson(Map<String, dynamic> json) =>
|
|
_$DiskStatsFromJson(json);
|
|
}
|
|
|
|
@freezed
|
|
sealed class NetworkStats with _$NetworkStats {
|
|
const factory NetworkStats({
|
|
@JsonKey(name: 'bytes_sent') required int bytesSent,
|
|
@JsonKey(name: 'bytes_recv') required int bytesRecv,
|
|
@JsonKey(name: 'bytes_total') required int bytesTotal,
|
|
}) = _NetworkStats;
|
|
|
|
factory NetworkStats.fromJson(Map<String, dynamic> json) =>
|
|
_$NetworkStatsFromJson(json);
|
|
}
|
|
|
|
@freezed
|
|
sealed class GpuStats with _$GpuStats {
|
|
const factory GpuStats({
|
|
required bool available,
|
|
String? name,
|
|
@JsonKey(name: 'usage_percent') double? usagePercent,
|
|
@JsonKey(name: 'total_bytes') int? totalBytes,
|
|
@JsonKey(name: 'used_bytes') int? usedBytes,
|
|
@JsonKey(name: 'free_bytes') int? freeBytes,
|
|
}) = _GpuStats;
|
|
|
|
factory GpuStats.fromJson(Map<String, dynamic> json) =>
|
|
_$GpuStatsFromJson(json);
|
|
}
|