First public release v2.3.1

This commit is contained in:
2026-02-19 16:39:23 +01:00
parent 52e3d0c07e
commit f3d673ab27
15 changed files with 1032 additions and 60 deletions

View File

@@ -46,6 +46,9 @@ struct Message: Identifiable, Codable, Equatable {
// Streaming state (not persisted)
var isStreaming: Bool = false
// Star state (not persisted in messages table tracked via message_metadata for saved conversations)
var isStarred: Bool = false
// Generated images from image-output models (base64-decoded PNG/JPEG data)
var generatedImages: [Data]? = nil

View File

@@ -30,6 +30,7 @@ struct SessionStats {
var totalOutputTokens: Int = 0
var totalCost: Double = 0.0
var messageCount: Int = 0
var hasCostData: Bool = false
var totalTokens: Int {
totalInputTokens + totalOutputTokens
@@ -46,14 +47,18 @@ struct SessionStats {
}
var totalCostDisplay: String {
String(format: "$%.4f", totalCost)
hasCostData ? String(format: "$%.4f", totalCost) : "N/A"
}
var averageCostPerMessage: Double {
guard messageCount > 0 else { return 0.0 }
return totalCost / Double(messageCount)
}
var averageCostDisplay: String {
hasCostData ? String(format: "$%.4f", averageCostPerMessage) : "N/A"
}
mutating func addMessage(inputTokens: Int?, outputTokens: Int?, cost: Double?) {
if let input = inputTokens {
totalInputTokens += input
@@ -63,14 +68,16 @@ struct SessionStats {
}
if let messageCost = cost {
totalCost += messageCost
hasCostData = true
}
messageCount += 1
}
mutating func reset() {
totalInputTokens = 0
totalOutputTokens = 0
totalCost = 0.0
messageCount = 0
hasCostData = false
}
}