




















@@ -2,6 +2,8 @@ import OpenClawChatUI
22import SwiftUI
3344struct CommandCenterTab: View {
5+fileprivate static let recentSessionsFetchLimit = 200
6+57@Environment(NodeAppModel.self) private var appModel
68@Environment(\.colorScheme) private var colorScheme
79@Environment(\.scenePhase) private var scenePhase
@@ -331,8 +333,7 @@ struct CommandCenterTab: View {
331333private var sessionWorkItems: [WorkItem] {
332334let currentSessionKey = self.appModel.chatSessionKey
333335return self.recentChatSessions
334-.filter { !Self.isHiddenInternalSession($0.key) }
335-.filter { $0.key != self.appModel.defaultChatSessionKey }
336+.filter { Self.isRecentChatSession($0.key, defaultSessionKey: self.appModel.defaultChatSessionKey) }
336337.map { session in
337338Self.sessionWorkItem(for: session, currentSessionKey: currentSessionKey)
338339}
@@ -362,7 +363,7 @@ struct CommandCenterTab: View {
362363363364do {
364365let transport = IOSGatewayChatTransport(gateway: appModel.operatorSession)
365-let response = try await transport.listSessions(limit: 20)
366+let response = try await transport.listSessions(limit: Self.recentSessionsFetchLimit)
366367self.defaultChatSessionEntry = response.sessions.first {
367368 $0.key == self.appModel.defaultChatSessionKey
368369}
@@ -385,7 +386,7 @@ struct CommandCenterTab: View {
385386var result: [OpenClawChatSessionEntry] = []
386387var included = Set<String>()
387388388-if currentSessionKey != defaultSessionKey,
389+if Self.isRecentChatSession(currentSessionKey, defaultSessionKey: defaultSessionKey),
389390let current = sorted.first(where: { $0.key == currentSessionKey })
390391{
391392 result.append(current)
@@ -394,8 +395,7 @@ struct CommandCenterTab: View {
394395395396for session in sorted {
396397guard !included.contains(session.key) else { continue }
397-guard session.key != defaultSessionKey else { continue }
398-guard !Self.isHiddenInternalSession(session.key) else { continue }
398+guard Self.isRecentChatSession(session.key, defaultSessionKey: defaultSessionKey) else { continue }
399399 result.append(session)
400400 included.insert(session.key)
401401if result.count >= 4 { break }
@@ -491,12 +491,53 @@ struct CommandCenterTab: View {
491491return formatter.localizedString(for: date, relativeTo: .now)
492492}
493493494-fileprivate static func isHiddenInternalSession(_ key: String) -> Bool {
494+fileprivate nonisolated static func isHiddenInternalSession(_ key: String) -> Bool {
495495let trimmed = key.trimmingCharacters(in: .whitespacesAndNewlines)
496496guard !trimmed.isEmpty else { return false }
497497return trimmed == "onboarding" || trimmed.hasSuffix(":onboarding")
498498}
499499500+nonisolated static func isRecentChatSession(_ key: String, defaultSessionKey: String) -> Bool {
501+let trimmed = key.trimmingCharacters(in: .whitespacesAndNewlines)
502+guard !trimmed.isEmpty else { return false }
503+if trimmed == defaultSessionKey { return false }
504+let normalized = trimmed.lowercased()
505+let defaultBase = self.sessionBaseKey(defaultSessionKey)
506+if !normalized.contains(":"),
507+self.isDirectSessionBase(normalized, defaultBase: defaultBase)
508+{
509+return false
510+}
511+if self.isHiddenInternalSession(trimmed) { return false }
512+return !self.isAgentDeviceSession(trimmed, defaultSessionKey: defaultSessionKey)
513+}
514+515+private nonisolated static func isAgentDeviceSession(_ key: String, defaultSessionKey: String) -> Bool {
516+let parts = key
517+.trimmingCharacters(in: .whitespacesAndNewlines)
518+.split(separator: ":", omittingEmptySubsequences: false)
519+guard parts.count >= 3, parts[0].lowercased() == "agent" else { return false }
520+guard parts.count == 3 || parts[3].lowercased() == "thread" else { return false }
521+522+let base = String(parts[2]).trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
523+let defaultKey = self.sessionBaseKey(defaultSessionKey)
524+return self.isDirectSessionBase(base, defaultBase: defaultKey)
525+}
526+527+private nonisolated static func isDirectSessionBase(_ base: String, defaultBase: String) -> Bool {
528+ base == defaultBase || base == "main" || base == "global" || base.hasPrefix("node-")
529+}
530+531+private nonisolated static func sessionBaseKey(_ key: String) -> String {
532+let parts = key
533+.trimmingCharacters(in: .whitespacesAndNewlines)
534+.split(separator: ":", omittingEmptySubsequences: false)
535+guard parts.count >= 3, parts[0].lowercased() == "agent" else {
536+return key.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
537+}
538+return String(parts[2]).trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
539+}
540+500541private var gatewaySubtitle: String {
501542if let server = normalized(appModel.gatewayServerName) {
502543return "\(self.appModel.activeAgentName) on \(server)"
@@ -620,8 +661,9 @@ private struct CommandSessionsScreen: View {
620661621662private var sessionRows: [CommandCenterTab.WorkItem] {
622663self.sessions
623-.filter { !CommandCenterTab.isHiddenInternalSession($0.key) }
624-.filter { $0.key != self.appModel.defaultChatSessionKey }
664+.filter { CommandCenterTab.isRecentChatSession(
665+ $0.key,
666+ defaultSessionKey: self.appModel.defaultChatSessionKey) }
625667.sorted { ($0.updatedAt ?? 0) > ($1.updatedAt ?? 0) }
626668.map {
627669CommandCenterTab.sessionWorkItem(
@@ -658,7 +700,7 @@ private struct CommandSessionsScreen: View {
658700659701do {
660702let transport = IOSGatewayChatTransport(gateway: appModel.operatorSession)
661-let response = try await transport.listSessions(limit: 200)
703+let response = try await transport.listSessions(limit: CommandCenterTab.recentSessionsFetchLimit)
662704self.sessions = response.sessions
663705} catch {
664706self.sessions = []
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。