fix(sessions): search visible categories across clients (#118912)

Co-authored-by: Peter Steinberger <steipete@gmail.com>
This commit is contained in:
ZYV5ge
2026-08-25 14:15:52 -07:00
committed by GitHub
parent 8c31fada1b
commit 43ffe41a4b
6 changed files with 37 additions and 11 deletions
@@ -366,7 +366,7 @@ fun filterSessionEntries(
val query = search.trim().lowercase()
if (query.isEmpty()) return sessions
return sessions.filter { session ->
listOfNotNull(session.displayName, session.label, session.key)
listOfNotNull(session.displayName, session.label, session.category, session.key)
.any { it.lowercase().contains(query) }
}
}
@@ -49,17 +49,18 @@ class ChatControllerSessionSearchTest {
?.content
@Test
fun filterSessionEntriesMatchesDisplayNameLabelAndKey() {
fun filterSessionEntriesMatchesDisplayNameLabelCategoryAndKey() {
val sessions =
listOf(
ChatSessionEntry(key = "agent:main:topic-a", updatedAtMs = 2, displayName = "Trip planning"),
ChatSessionEntry(key = "agent:main:topic-b", updatedAtMs = 1, displayName = "Groceries"),
ChatSessionEntry(key = "agent:main:topic-b", updatedAtMs = 1, displayName = "Groceries", category = "Team Planning"),
ChatSessionEntry(key = "agent:main:trip-notes", updatedAtMs = 3, displayName = "Notes"),
)
assertEquals(
listOf("agent:main:topic-a", "agent:main:trip-notes"),
filterSessionEntries(sessions, "TRIP").map { it.key },
)
assertEquals(listOf("agent:main:topic-b"), filterSessionEntries(sessions, "TEAM PLANNING").map { it.key })
assertEquals(sessions, filterSessionEntries(sessions, " "))
}
@@ -587,12 +587,8 @@ public enum OpenClawChatSessionListOrganizer {
let query = search.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
guard !query.isEmpty else { return sessions }
return sessions.filter { session in
for field in [session.displayName, session.label, session.subject, session.sessionId, session.key] {
if let field, field.lowercased().contains(query) {
return true
}
}
return false
[session.displayName, session.label, session.subject, session.sessionId, session.category, session.key]
.contains { $0?.lowercased().contains(query) == true }
}
}
}
@@ -307,7 +307,7 @@ struct ChatSessionSidebarModelTests {
#expect(sections.flatMap(\.nodes).map(\.session.key) == ["agent:main:research"])
}
@Test(arguments: ["holiday", "KYOTO", "session-123", " HoLiDaY "])
@Test(arguments: ["holiday", "KYOTO", "session-123", "team planning", " HoLiDaY "])
func `sidebar search matches every canonical gateway session field`(_ query: String) {
let matching = self.entry(
key: "agent:main:roadmap",
@@ -315,7 +315,8 @@ struct ChatSessionSidebarModelTests {
label: "Summer holiday",
subject: "Kyoto itinerary",
sessionId: "session-123",
updatedAt: 200)
updatedAt: 200,
category: "Team Planning")
let other = self.entry(
key: "agent:main:other",
displayName: "Unrelated",
+1
View File
@@ -280,6 +280,7 @@ function filterSessionEntries(params: {
entry.label,
entry.subject,
entry.sessionId,
entry.category,
key,
];
appendStoredSessionModelSearchFields(cheapFields, entry);
+27
View File
@@ -629,6 +629,33 @@ describe("gateway session utils", () => {
expect(listed.hasMore).toBe(true);
});
test("session list search includes the session group name", () => {
const cfg = { agents: { list: [{ id: "main", default: true }] } } as OpenClawConfig;
const store: Record<string, SessionEntry> = {
"agent:main:roadmap": {
sessionId: "roadmap",
displayName: "Quarterly roadmap",
category: "Team Planning",
updatedAt: 2,
},
"agent:main:other": {
sessionId: "other",
displayName: "Unrelated",
category: "Personal",
updatedAt: 1,
},
};
const listed = listSessionsFromStore({
cfg,
storePath: "",
store,
opts: { search: "team planning" },
});
expect(listed.sessions.map((session) => session.key)).toEqual(["agent:main:roadmap"]);
});
test("session list search includes direct-session origin display labels", () => {
const cfg = { agents: { list: [{ id: "main", default: true }] } } as OpenClawConfig;
const store: Record<string, SessionEntry> = {