Pull Request Overview
- Opened on August 29, 2026
- Status Merged
- Commit count 24 with first commit August 29, 2026
Total Delta
Open Days
Test Delta
How long has this pull request spent in each phase of its lifecycle?
Data pending calculation for pull request
JS-9865: cross-space search - people dedup, 1-1 Channel rows, clearer drill
Improvements to vault-wide (cross-space) search.
Changes
-
Exclude participants from the cross-space query - they listed every person once per shared Channel. Kept for member-type queries (/is Space member) and Channel scopes. -
Inject person rows from the local cross-space participants subscription, deduplicated by identity (1:1-first order), after the Channel name matches. Query under 3 letters: 3 results; 3+ letters: up to 10 (peopleMatchLimit, unit-tested). -
Two rows per 1-1 person: the 1-1 Channel row (open it / search its messages via the space drill) and the person row (creator drill; "member in N Channels" caption, the 1-1 itself not counted; "Create 1-1 Channel" caption when none exists). -
No auto-create: clicking a person opens the standard participant menu; the 1-1 is created only via its Connect button. -
Drill affordance: search icon replaces the forward arrow, hint text + icon form one hover-highlighted click zone (text/icon color only, no badge). Until the first drill the action text and Shift+Enter/β shortcuts print inline in two lines (per-accountsearchDrillonboarding key). -
"/" refine after text: a whitespace-preceded "/" mid-query enters the same command mode the footer hint advertises ("anton /in" works like "/in"); resolving the command restores the query it was typed after. Slashes inside words ("1/2", URLs) never trigger (parseCommandQuery, unit-tested). -
Discussion messages in search results: a discussion message carries its text inblockswith an emptycontent.text, so its row rendered blank - the preview now falls back to the message blocks (blocksToText, non-text blocks skipped). Fixes both the global search popup and the in-chat search menu (sharedgetSearchResultHtml). -
Deeplink copy: Cmd+Alt+L copies the app deeplink (Cmd+L keeps the web link); while Alt is held the footer hint swaps to advertise the alternate, macOS-menu style. -
Sectioned mixed results + grouped types: the vault-wide text search leads with labeled sections β Channels (3), People, Types (3 under 3 letters / 10 after) β and an Objects header over the backend results. Type results group by uniqueKey (excluded from the plain-text RPC, injected from the aggregate). A grouped Types/People row has two verbs: the drill icon filters objects by type/creator across every Channel; the click focuses the group β the what-token carries a session-transient focus payload and the list shows that type/person once per space (participant menu one click deeper), with Back restoring the pre-focus view. Spec:docs/specs/2026-08-29-search-grouped-results-sections.md. -
Iteration batch (same day): focused group listings (click a grouped Types/People row β that type/person once per space; drill icons keep the object filters; top suggestions offer the all-Channels filter and Create 1-1 via the participant popup); focus + late-added scope persist across quick reopens; token pills render in insertion order with single-Backspace undo of a row pick; person rows wear the member-circle badge; footer shortcuts regrouped (βselection-tracked in Refine,+combos, Shift swaps OpenβFilter); the empty browse groups by date ("Pages edited Today", Yesterday, Previous 7/14 days, month+year). -
In-chat search expands into the full popup: an in-field Expand icon or a leading "/" hands over a chat-focused Messages token + query (newpresetTokens/presetFilter), enabling/bypeople filtering of one chat's messages; stepwise Backspace defocus; preset/picker sessions are ephemeral (never persisted), pickers gained the refine chips, the empty object-search state teaches the Messages filter,/is Messagecompletes first, and the Messages chip/pill carry the chat icon everywhere.
Testing
-
bun run typecheck,bun run lintclean; searchMatch unit tests pass (4 new for the limit rule). - E2E spec + regression tests added in anytype-desktop-suite (
specs/search/cross-space-people.md,specs/search/drill-hint.md). - Multi-account scenarios (person injection, dedup, counts) need a manual pass on a multi-space setup.
Linear: JS-9865
Review
Two-lens (correctness + quality) Opus review ran on the full diff; fixes landed in cabe8dad72: display-based drill-hint reveal (the hidden hint reserved ~170px of the name column on every drillable row), one shared-Channel count for person rows and the /by browse (1-1 excluded in both), per-query memoization of the injected rows (getItems runs on every hover), nested-command restore loop, globalName caption fallback for pure-DM contacts, and translator-safe sprintf for the member-count key. Known pre-existing gap filed as JS-9866 (quick-search window routes participant clicks to an editor route).
PR was closed without comments.