import Foundation public struct OpenClawChatModelChoice: Identifiable, Codable, Sendable, Hashable { public var id: String { self.selectionID } public let modelID: String public let name: String public let provider: String public let contextWindow: Int? public init(modelID: String, name: String, provider: String, contextWindow: Int?) { self.modelID = modelID self.name = name self.provider = provider self.contextWindow = contextWindow } /// Provider-qualified model ref used for picker identity and selection tags. public var selectionID: String { let trimmedProvider = self.provider.trimmingCharacters(in: .whitespacesAndNewlines) guard !trimmedProvider.isEmpty else { return self.modelID } let providerPrefix = "\(trimmedProvider)/" if self.modelID.hasPrefix(providerPrefix) { return self.modelID } return "\(trimmedProvider)/\(self.modelID)" } public var displayLabel: String { self.selectionID } } public struct OpenClawChatSessionsDefaults: Codable, Sendable { public let model: String? public let contextTokens: Int? } public struct OpenClawChatSessionEntry: Codable, Identifiable, Sendable, Hashable { public var id: String { self.key } public let key: String public let kind: String? public let displayName: String? public let surface: String? public let subject: String? public let room: String? public let space: String? public let updatedAt: Double? public let sessionId: String? public let systemSent: Bool? public let abortedLastRun: Bool? public let thinkingLevel: String? public let verboseLevel: String? public let inputTokens: Int? public let outputTokens: Int? public let totalTokens: Int? public let modelProvider: String? public let model: String? public let contextTokens: Int? } public struct OpenClawChatSessionsListResponse: Codable, Sendable { public let ts: Double? public let path: String? public let count: Int? public let defaults: OpenClawChatSessionsDefaults? public let sessions: [OpenClawChatSessionEntry] }