Skip to content

Search PersonaBots and Channels from the top of the phone's chat list - #1861

Merged
DoodleBears merged 9 commits into
mainfrom
claude/project-thread-22miaa
Oct 15, 2026
Merged

DoodleBears merged 9 commits into
mainfrom
claude/project-thread-22miaa

Conversation

@DoodleBears

@DoodleBears DoodleBears commented Oct 15, 2026 •

Copy link
Copy Markdown
Contributor

Requested by Vain · project thread

Why the change

The phone app has no way to find a PersonaBot or Channel by name; DESIGN.md promised search in the Home header, but none existed.

Closes #1851 (part of #1848, user stories 4–7).

Special things to note

  • Placement differs from the Mobile app: two tabs, Settings behind the Human's avatar, Host drawer and Channel sections #1848 spec. The spec put search in an iOS 26 role="search" tab (the round glass button at the bottom right). In review, Vain pointed out that chat apps put search at the top of the conversation list. This PR follows that: a search field sits at the top of the Chats list and scrolls away with the list. Story 3 (the system search button) is dropped.
  • Shortcut cards removed. Also at Vain's request, the Needs you and Working cards leave Home, because Activity already gathers what needs the Human (spec story 33 no longer applies). ShortcutCards, shortcutCounts, the conversations() filter argument, and their strings and icons are deleted. The search field's left edge lines up with the row avatars (AVATAR_EDGE, 19 pt). Its 12 pt corners are concentric with the panel's top corners, which grow to 12 + 19 = 31 pt. apps/mobile/DESIGN.md Home is updated to match.
  • What it does. Typing filters the current Host's PersonaBots by display name and Channels by title on the device, in place. Matching ignores case, is NFKC-normalized (full-width letters match) and handles CJK. Names that start with the query come first. A query with no match shows one plain line.
  • Opening a result. A PersonaBot opens its native DM. The phone has no native Channel chat yet, so a Channel opens the in-app full client at that Channel. FullClientTarget gains { kind: 'channel', channelId } (#botharness-open=channel:<id>, with the id checked against the Channel id pattern), and the Web Client's landing watcher opens it, falling back to home when the Channel is gone. Channel rows on Home were not tappable before; they now open the same way.
  • Hidden Channels. Search filters the rows conversations() returns, which since Group mobile Chats by the Host's Channel sections #1860 drops hidden Channels; a search test covers it.
  • Overlap. Group mobile Chats by the Host's Channel sections #1860 (Channel sections) is merged in: while a query is typed the grouped list gives way to flat results. Mobile: Settings sheet behind the Human's avatar replaces the Me tab #1857 (Settings avatar) also edits Home; whichever lands second merges main.
  • Merge risk. Additive: a field in the Home list header and one new full-client landing kind. Revert is a plain revert. JavaScript only; no native change.
  • Verification.
    • pnpm lint, pnpm format:check, pnpm typecheck (root and mobile): pass.
    • pnpm vitest run apps/mobile: 207 passed, 8 skipped (live tests). The touched client and core tests also pass.
    • New tests: searchConversations unit tests in conversations.test.ts (case, CJK, full-width, prefix first, empty, hidden Channels). home-search.test.tsx renders the Home screen, types in the field, checks the list filters in place, taps a PersonaBot (/dm/[slug]) and a Channel (full client with target=channel), and checks the no-match copy. Locator and landing tests cover the channel target. The test shim's FlatList now renders ListHeaderComponent.
    • Runtime: an isolated Host with four PersonaBots and two Channels, paired from the web export through the device gateway. Searching and tapping "Grace Hopper" opened /dm/<slug>. Tapping "launch-team" opened /full-client?target=channel&channelId=group-launch-team. The Web Client loaded with #botharness-open=channel:group-launch-team lands on that Channel (screenshot below). In the screenshots the field's left edge and the avatars' left edge both sit at 19 pt.
    • Not run yet: a native iOS check of the field and keyboard. It is queued on the shared Simulator and will be recorded under Human QA.
  • CI test plan. affected (no new rule needed in scripts/ci-plan.mjs).

Change outline

app/(tabs)/(home)/index.tsx       SearchField in the list header (shortcut cards removed); rows = query ? searchConversations : chatList
src/ui/primitives/search-field    raised-layer field, inset = AVATAR_EDGE, radius.md
src/ui/shell/home-header          panel top radius = radius.md + AVATAR_EDGE
src/ui/chat/conversations.ts      + searchConversations(roster, action, query)
src/ui/shell/open-conversation    DM -> /dm/[slug], Channel -> /full-client target=channel
core web-locator + client landing channel landing target

Chats with search, web export, 390 × 844

Before: Home had the shortcut cards and the list, with no search.

After, idle: the field is the top of the list panel, aligned with the avatars, with corners concentric with the panel's.

After: Home with search field, light After: Home with search field, dark

After, "a": PersonaBots and Channels together, with names that start with the query first.

After: results for a, light After: results for a, dark

After, "小明": Chinese names match.

After: CJK search, light After: CJK search, dark

After, no match:

After: no match, light After: no match, dark

The ring around the focused field is the browser's focus outline in the web preview, not the app's own style.

Full client landing on a searched Channel, 390 × 844

Web Client opened at the launch-team Channel

Human QA

  • iOS Simulator: the field sits at the top of Chats and scrolls away with the list; typing filters; tapping a PersonaBot opens its DM, and tapping a Channel opens the full client at that Channel (queued on the shared Simulator).

🤖 Generated with Claude Code

https://claude.ai/code/session_01LAkXXdmCZiwU62tH4ygQy7

The search-role tab sits last in NativeTabs, so iOS 26 draws it as the
round glass button with the field above the keyboard. Typing filters the
current Host's PersonaBots by name and Channels by title on the device,
leaving Hidden Channels out. A DM result opens the native chat; a Channel
result opens the full client at that Channel through a new channel
landing target.

Refs #1851

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LAkXXdmCZiwU62tH4ygQy7
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LAkXXdmCZiwU62tH4ygQy7
@coderabbitai

coderabbitai Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 24 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 1e508a13-2abe-4614-867c-0f4e2d0e1211
📥 Commits

Reviewing files that changed from the base of the PR and between bccba3a and f202553.

⛔ Files ignored due to path filters: 9
  • .github/pr-screenshots/mobile-search-tab/search-cjk-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/mobile-search-tab/search-cjk-light.png is excluded by !**/*.png
  • .github/pr-screenshots/mobile-search-tab/search-empty-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/mobile-search-tab/search-empty-light.png is excluded by !**/*.png
  • .github/pr-screenshots/mobile-search-tab/search-none-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/mobile-search-tab/search-none-light.png is excluded by !**/*.png
  • .github/pr-screenshots/mobile-search-tab/search-results-dark.png is excluded by !**/*.png
  • .github/pr-screenshots/mobile-search-tab/search-results-light.png is excluded by !**/*.png
  • .github/pr-screenshots/mobile-search-tab/web-landing-channel.png is excluded by !**/*.png
📒 Files selected for processing: 22
  • apps/mobile/DESIGN.md
  • apps/mobile/app/(tabs)/(home)/index.tsx
  • apps/mobile/src/host/full-client.ts
  • apps/mobile/src/ui/chat/conversation-row.tsx
  • apps/mobile/src/ui/chat/conversations.ts
  • apps/mobile/src/ui/primitives/search-field.tsx
  • apps/mobile/src/ui/shell/home-header.tsx
  • apps/mobile/src/ui/shell/icons.tsx
  • apps/mobile/src/ui/shell/open-conversation.ts
  • apps/mobile/src/ui/shell/shortcut-cards.tsx
  • apps/mobile/src/ui/strings.ts
  • apps/mobile/test/conversations.test.ts
  • apps/mobile/test/full-client.test.ts
  • apps/mobile/test/home-search.test.tsx
  • apps/mobile/test/react-native-shim.ts
  • changes/1861-mobile-chat-search.md
  • docs/adr/0211-the-mobile-app-has-two-tabs-with-settings-and-hosts-in-the-header.md
  • packages/client/src/client/index.ts
  • packages/client/src/client/private-input-navigation.ts
  • packages/client/test/private-input-navigation.test.ts
  • packages/core/src/credentials/web-locator.ts
  • packages/core/test/private-input-locator.test.ts
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LAkXXdmCZiwU62tH4ygQy7
@DoodleBears DoodleBears self-assigned this Oct 15, 2026
Search filters the output of conversations(), which drops hidden
Channels once the roster carries its arrangement, so it needs no field
of its own.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LAkXXdmCZiwU62tH4ygQy7
Chat apps put search at the top of the conversation list, so a search
field above the shortcut cards now filters the list in place and
scrolls away with it. The separate search tab and its web variant go.
Channel rows on Home now open the full client at that Channel too.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LAkXXdmCZiwU62tH4ygQy7
@DoodleBears
DoodleBears force-pushed the claude/project-thread-22miaa branch from 3855793 to f8bafd1 Compare October 15, 2026 06:31
@DoodleBears DoodleBears changed the title Find PersonaBots and Channels from a search tab on the phone Search PersonaBots and Channels from the top of the phone's chat list Oct 15, 2026
Activity already gathers what needs the Human, so the Needs you and
Working cards leave Home and the search field becomes the top of the
list. The field is inset so its corners are concentric with the list
panel's rounded top.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LAkXXdmCZiwU62tH4ygQy7
Search swaps the grouped chat list for flat results while a query is
typed. The shortcut filter that #1860 kept across sections goes with
the cards, and ADR-0211 and DESIGN.md now describe search at the top
of Chats instead of an iOS search tab.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LAkXXdmCZiwU62tH4ygQy7
The field's left edge now lines up with the avatars, and its corners
stay concentric with the list panel (inner 12, inset 19, outer 31).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LAkXXdmCZiwU62tH4ygQy7
@DoodleBears
DoodleBears marked this pull request as ready for review October 15, 2026 06:58
Keep the search field at the top of Chats without shortcut cards, and
keep the panel corners concentric with the field under the new Host
band header.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LAkXXdmCZiwU62tH4ygQy7
@DoodleBears
DoodleBears merged commit 84e24b5 into main Oct 15, 2026
11 checks passed
@DoodleBears

Copy link
Copy Markdown
Contributor Author

Batch QA

Human QA passed (Vain, 08:26Z): search field at the top of Chats filters as you type. Android untested.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Mobile nav: search tab that finds PersonaBots and Channels on the current Host

2 participants