We were unable to construct the commit group for this pull request: Author does not currently possess a GitClear subscription seat.

JS-9865: cross-space search - people dedup, 1-1 Channel rows, clearer drill #2358

Merged
requilence opened 5:55am on August 29, 2026 wanted to merge 24 commits into anyproto/anytype-ts develop from
feature/JS-9865-cross-space-search-people

Pull Request Overview

  • Opened on August 29, 2026
  • Status Merged
  • Commit count 24 with first commit August 29, 2026

Total Delta

0 Total Diff Delta

Open Days

Open 15 weekdays

Test Delta

0 Diff Delta in Test Files
Breakdown by Phase

How long has this pull request spent in each phase of its lifecycle?

Data pending calculation for pull request

Author avatar

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-account searchDrill onboarding 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 in blocks with an empty content.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 (shared getSearchResultHtml).


  • 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 (new presetTokens/presetFilter), enabling /by people 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 Message completes first, and the Messages chip/pill carry the chat icon everywhere.

Testing



  • bun run typecheck, bun run lint clean; 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.