@@ -103,6 +103,17 @@ private func formatByteSize(_ value: Int) -> String? {
103103 return ByteCountFormatter.string(fromByteCount: Int64(value), countStyle: .file)
104104}
105105
106+/// Normalizes a byte count that arrived as a JSON *string*. A bare numeric string
107+/// (e.g. "1048576") is a raw byte count and is formatted like the numeric branches
108+/// so identical sizes render consistently ("1 MB") regardless of whether the server
109+/// quoted the value; an already-formatted string (e.g. "1.2 GB") is passed through
110+/// unchanged.
111+private func formatByteSize(_ value: String) -> String {
112+ let trimmed = value.trimmingCharacters(in: .whitespacesAndNewlines)
113+ if let n = Int(trimmed) { return formatByteSize(n) ?? value }
114+ return value
115+}
116+
106117struct StreamStats: Codable, Sendable {
107118 let ingestion: IngestionStats?
108119 let storage: StorageStats?
@@ -123,7 +134,7 @@ struct StreamStats: Codable, Sendable {
123134 self.lifetime_count = try? container.decode(Int.self, forKey: .lifetime_count)
124135 // Handle size as string or number
125136 if let s = try? container.decode(String.self, forKey: .size) {
126− self.size = s
137+ self.size = formatByteSize(s)
127138 } else if let n = try? container.decode(Int.self, forKey: .size) {
128139 self.size = formatByteSize(n)
129140 } else if let d = try? container.decode(Double.self, forKey: .size) {
@@ -132,7 +143,7 @@ struct StreamStats: Codable, Sendable {
132143 self.size = nil
133144 }
134145 if let s = try? container.decode(String.self, forKey: .lifetime_size) {
135− self.lifetime_size = s
146+ self.lifetime_size = formatByteSize(s)
136147 } else if let n = try? container.decode(Int.self, forKey: .lifetime_size) {
137148 self.lifetime_size = formatByteSize(n)
138149 } else if let d = try? container.decode(Double.self, forKey: .lifetime_size) {
@@ -156,7 +167,7 @@ struct StreamStats: Codable, Sendable {
156167 let container = try decoder.container(keyedBy: CodingKeys.self)
157168 self.type = try? container.decode(String.self, forKey: .type)
158169 if let s = try? container.decode(String.self, forKey: .size) {
159− self.size = s
170+ self.size = formatByteSize(s)
160171 } else if let n = try? container.decode(Int.self, forKey: .size) {
161172 self.size = formatByteSize(n)
162173 } else if let d = try? container.decode(Double.self, forKey: .size) {
@@ -165,7 +176,7 @@ struct StreamStats: Codable, Sendable {
165176 self.size = nil
166177 }
167178 if let s = try? container.decode(String.self, forKey: .lifetime_size) {
168− self.lifetime_size = s
179+ self.lifetime_size = formatByteSize(s)
169180 } else if let n = try? container.decode(Int.self, forKey: .lifetime_size) {
170181 self.lifetime_size = formatByteSize(n)
171182 } else if let d = try? container.decode(Double.self, forKey: .lifetime_size) {