feat: add conversation search modal and shortcut-driven discovery#1138
feat: add conversation search modal and shortcut-driven discovery#1138FraterCCCLXIII wants to merge 5 commits into
Conversation
|
@FraterCCCLXIII is attempting to deploy a commit to the openhands Team on Vercel. A member of the Team first needs to authorize it. |
hieptl
left a comment
There was a problem hiding this comment.
Hello @FraterCCCLXIII,
Thank you for creating this pull request.
From what I can tell, conversation search appears to be performed on the client side rather than the server side.
If that's the case, when we have 100 conversations but only 10 are currently rendered in the conversation list, the search would only be able to match those 10 rendered conversations instead of all 100 conversations.
Am I understanding this correctly?
Thank you very much! 🙏
✅ Mock-LLM E2E Tests54/54 passed Commit:
Posted by the Mock-LLM E2E workflow · results are deterministic (scripted LLM responses) |
Users can filter loaded conversations from an expandable search field in the panel header, with substring matching across title and metadata. Co-authored-by: Cursor <cursoragent@cursor.com>
Search opens in a centered overlay with filtered results, keyboard navigation, and context labels while keeping the sidebar list unchanged. Co-authored-by: Cursor <cursoragent@cursor.com>
Center the search palette with standard modal styling, add result timestamps, wire Cmd/Ctrl+K with grey tooltip hints, and simplify header button labels. Co-authored-by: Cursor <cursoragent@cursor.com>
Reorder the conversation panel header actions so the create chat control renders to the right of the filter icon, matching the intended toolbar layout. Co-authored-by: Cursor <cursoragent@cursor.com>
Rebase onto latest main and route the search modal through paginated /api/conversations/search results instead of filtering only the sidebar's loaded page, so matches include conversations beyond the visible list. Co-authored-by: Cursor <cursoragent@cursor.com>
54a775d to
347d877
Compare
✅ Mock-LLM E2E Tests60/60 passed Commit:
Posted by the Mock-LLM E2E workflow · results are deterministic (scripted LLM responses) |
|
@hieptl You were right — the initial implementation only filtered conversations already loaded in the sidebar. Fixed in
Tests run locally: Rebased onto latest |


Summary
ArrowUp/ArrowDown/Enter) and contextual result metadataK) for fast opening when focus is not in a typing targetServer-side search (review fix)
Previously the modal filtered
sortedVisibleConversationsfrom the sidebar, so only conversations already loaded in the list (e.g. 10 of 100) were searchable.The modal now uses
useConversationSearch→searchMatchingConversations():/api/conversations/searchtitle__containswhen available for server-side title filteringFiles of Note
src/components/features/conversation-panel/conversation-panel-search-modal.tsxsrc/api/conversation-service/search-matching-conversations.tssrc/hooks/query/use-conversation-search.tssrc/utils/conversation-search-filter.tssrc/components/features/conversation-panel/conversation-panel.tsxsrc/utils/keyboard-shortcut.tssrc/i18n/translation.jsonTest Plan
npm test -- __tests__/api/search-matching-conversations.test.ts __tests__/components/features/conversation-panel/conversation-panel-search-modal.test.tsx __tests__/components/features/conversation-panel/filter-conversations-by-query.test.ts __tests__/utils/keyboard-shortcut.test.ts— 13/13 passednpm test -- __tests__/components/features/conversation-panel/conversation-panel.test.tsx -t "conversation search"— 4/4 passednpm run typecheckupstream/main(commit347d877c)Made with Cursor