镜像站点 · 本页由第三方 GitHub 只读镜像提供,非 GitHub 官方站点,不接受任何登录或凭据输入。前往 github.com
Skip to content

fix(search): search saved conversations while the community is offline or connecting - #2724

Merged
matt2e merged 4 commits into
mainfrom
show-saved-channels-in-search
Nov 9, 2026
Merged

matt2e merged 4 commits into
mainfrom
show-saved-channels-in-search

Conversation

@matt2e

@matt2e matt2e commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

Problem

When a community runs on its saved copy (the relay session is failing, or a launch is still connecting), the sidebar lists and opens saved channels, but ⌘K dropped to a Pages-only search. Typing "beta" said No matching pages. while #Beta sat in the sidebar, and in the connecting state nothing explained why.

Fix

CommunitySearch now lets a saved (cached) session through to SearchResults outside a conversation scope, so saved conversations are listed under Recent activity, ranked and opened as they are when connected. One line under the results says what is searched:

State Line
Saved, error "Only saved conversations are searched while this community is disconnected." + Retry connection
Saved, connecting "…until this community connects."
Nothing saved, error unchanged: "Message search is unavailable…" + Retry connection
Nothing saved, connecting, query typed "Connecting to this community…" (unscoped search only)

While saved, SearchResults keeps the relay's message, people and open-channel lookups idle instead of showing Retry rows that can't succeed, and leaves out Search in … and the Channels tab, which need the relay. The from: / in:@ author picker reads nothing from the relay either; its text is unchanged. Recent also admits cached rows, matching ChannelDirectoryResults. Retry connection returns focus to the search field before its button unmounts. Once the session is ready, the open palette switches to full search in place.

Search scoped to a conversation is unchanged.

Before / after

Same steps, same moments. Left: main. Right: this branch. Chromium 1280×800, local fixture relay; the relay session failure is modelled as a malformed 200.

cmdk-saved-before-after.mp4

Testing

  • New test in PageSearch.test.tsx: fails on main (no Recent options), passes here. Each later assertion (relay-read gates, scoped guard, Retry focus, saved→ready picker reset) was checked to fail when its fix alone is removed.
  • PageSearch, SearchResults, SearchChoices, ChannelDirectoryResults test files pass.
  • tsc --noEmit, Biome and design:check clean.
  • Not yet exercised manually: dark theme, 390 px, 200% text, VoiceOver, WebKit, desktop app with Wi-Fi off.

🤖 Generated with Claude Code

@matt2e
matt2e requested a review from a team as a code owner November 6, 2026 02:19

@kalvinnchau kalvinnchau left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 One non-blocking offline author-picker copy issue. No blocking correctness or security defects identified in the reviewed scope.

Comment thread src/app/shell/SearchResults.tsx Resolved
matt2e added a commit that referenced this pull request Nov 6, 2026
Review on #2724 pointed out that, while a community runs
on its saved copy, the from: and in:@ picker still recommended
recoveries that cannot work: from:a asked for at least two characters,
then from:al said "People search is unavailable. Try a longer name."
No query length finds more people until the relay answers.

When the picker's answer comes from the saved state and nothing known
matches, it now says "Connect to this community to search people.",
ahead of the too-short and lookup-failed copy. The wording follows the
scoped search's "Connect to this community to search messages." and
fits both connecting and disconnected; the status line under the
results already says which. Members and profiles already known are
still offered when they match, and once the session is live the picker
shows "Searching people…" until the relay answers, as before.

The help guide already says people are searched once the community
connects, so it is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Matt Toohey <contact@matttoohey.com>

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Star Lord’s automated source review via Wes’s account, integrating independent Rocket, Mantis and Groot lanes.

One P2 finding inline. The saved-session lookup gates, Retry focus ordering and scoped-search guard otherwise look consistent with the intended behavior. Kalvin’s earlier author-picker copy finding is addressed at this head.

Reviewed head 6a2f6131f14168ff37516eb8b9125170365cec00, target base 0525a67eead8f6cbb3ac8ab672b3701a4df8cce5 (diff from merge-base 7d06475db5a130eb59b92bab08b9aeac70b895bc). Source-only: regression tests were inspected, not run; no app/device, screen-reader or CI validation. PR description and one extracted demo thumbnail inspected; the full video remains unverified.

Comment thread src/app/shell/PageSearch.tsx Resolved
matt2e added a commit that referenced this pull request Nov 6, 2026
Review on #2724 pointed out that, while a community runs
on its saved copy, the from: and in:@ picker still recommended
recoveries that cannot work: from:a asked for at least two characters,
then from:al said "People search is unavailable. Try a longer name."
No query length finds more people until the relay answers.

When the picker's answer comes from the saved state and nothing known
matches, it now says "Connect to this community to search people.",
ahead of the too-short and lookup-failed copy. The wording follows the
scoped search's "Connect to this community to search messages." and
fits both connecting and disconnected; the status line under the
results already says which. Members and profiles already known are
still offered when they match, and once the session is live the picker
shows "Searching people…" until the relay answers, as before.

The help guide already says people are searched once the community
connects, so it is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Matt Toohey <contact@matttoohey.com>
@matt2e
matt2e force-pushed the show-saved-channels-in-search branch from 6a2f613 to 47bd85c Compare November 6, 2026 12:08
matt2e added a commit that referenced this pull request Nov 6, 2026
Review on #2724 pointed out that saved archived
conversations dropped out of name search while a community runs on its
saved copy. Restoration marks every saved member row read-only and
cached until the relay confirms it, and SearchResults admitted archived
stream, forum and Solo rows only when they were not read-only. A joined
"Past project" was therefore found by name when connected but not while
offline or connecting, although joined archives stay available through
search by design (docs/channels.md); they are only kept out of the
sidebar and Recent activity.

Archived rows that are saved now pass that check too. The type
restriction still applies, so saved archived DMs stay out, and so do
saved rows the viewer holds as a guest, matching the live result.
Recent activity still leaves archived rows out.

The archived-name test now runs each channel type against a restored
cached-only session as well as a live one, and the exclusion matrix
covers a saved archived DM and a saved guest row. The docs already
describe this behaviour, so they are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Matt Toohey <contact@matttoohey.com>
matt2e and others added 3 commits November 6, 2026 23:30
…e or connecting

When a community runs on its saved copy (the relay session is failing,
or a launch is still connecting), the sidebar lists and opens saved
channels, but ⌘K fell back to Pages-only search: typing a channel name
said "No matching pages.", and the connecting state explained nothing.

CommunitySearch now lets a saved (cached) session through to
SearchResults outside a conversation scope, so saved conversations are
listed under Recent activity, ranked and opened as they are when
connected. One status line says what is searched, "Only saved
conversations are searched while this community is disconnected." with
Retry connection, or "…until this community connects." while
connecting. Retry connection returns focus to the search field before
its button goes away. Without a saved copy, a connecting community now
shows "Connecting to this community…" once something is typed. Search
scoped to a conversation is unchanged.

While saved, SearchResults keeps the relay's message, people and
open-channel lookups idle instead of showing Retry rows that can't
succeed, and leaves out "Search in …" and the Channels tab, which need
the relay. The from: and in:@ author picker reads no agents, archives or
profiles from the relay: it offers members and profiles already known
and keeps saying "People search is unavailable. Try a longer name."
Its answer belongs to the saved state, so once the session is live the
picker shows "Searching people…" until the relay answers. The list
behind Unread and Recent activity also admits cached rows, as the
channel directory already does. Once the session is ready, the open
palette switches to full search in place.

Adds the behaviour to the agent help guide.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: mtoohey <mtoohey@squareup.com>
Signed-off-by: Matt Toohey <contact@matttoohey.com>
Review on #2724 pointed out that, while a community runs
on its saved copy, the from: and in:@ picker still recommended
recoveries that cannot work: from:a asked for at least two characters,
then from:al said "People search is unavailable. Try a longer name."
No query length finds more people until the relay answers.

When the picker's answer comes from the saved state and nothing known
matches, it now says "Connect to this community to search people.",
ahead of the too-short and lookup-failed copy. The wording follows the
scoped search's "Connect to this community to search messages." and
fits both connecting and disconnected; the status line under the
results already says which. Members and profiles already known are
still offered when they match, and once the session is live the picker
shows "Searching people…" until the relay answers, as before.

The help guide already says people are searched once the community
connects, so it is unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Matt Toohey <contact@matttoohey.com>
Review on #2724 pointed out that saved archived
conversations dropped out of name search while a community runs on its
saved copy. Restoration marks every saved member row read-only and
cached until the relay confirms it, and SearchResults admitted archived
stream, forum and Solo rows only when they were not read-only. A joined
"Past project" was therefore found by name when connected but not while
offline or connecting, although joined archives stay available through
search by design (docs/channels.md); they are only kept out of the
sidebar and Recent activity.

Archived rows that are saved now pass that check too. The type
restriction still applies, so saved archived DMs stay out, and so do
saved rows the viewer holds as a guest, matching the live result.
Recent activity still leaves archived rows out.

The archived-name test now runs each channel type against a restored
cached-only session as well as a live one, and the exclusion matrix
covers a saved archived DM and a saved guest row. The docs already
describe this behaviour, so they are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Signed-off-by: Matt Toohey <contact@matttoohey.com>
@matt2e
matt2e force-pushed the show-saved-channels-in-search branch from 47bd85c to 2aac94c Compare November 6, 2026 12:31

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Star Lord’s automated source follow-up via Wes’s account, integrating independent Rocket, Mantis and Groot review.

The previous P2 is addressed in source. Saved member archives now remain available by name, while guest/type restrictions and exclusion from Recent activity are preserved. The regression matrix restores cached-only sessions and checks their cached/readOnly state, labels and opening. No new actionable findings in the repair and relevant rebased integration; the earlier author-picker copy repair remains intact.

Reviewed head 2aac94c415fb3091bafb1412829e176679f7d551 against base/merge-base 3bcf1c4bb1111d924a84d9b710c1da2db80ccf0b. Source-only: tests were inspected, not run; app, reconnect/navigation, accessibility and current CI remain unverified. The attached video is unchanged; prior thumbnail inspection is retained, but its full content remains unverified.

@tellaho

tellaho commented Nov 7, 2026 •

Copy link
Copy Markdown
Contributor

🤖 Design follow-up by Drip at c3c416af7a79ee8a9c12f95564ace780c5e08095.

Intent: Keep the offline search limit and Retry connection visible while people browse saved-conversation results.

The previous P2 is resolved; no remaining findings in this repair. The supplied after screenshot and sampled video show the notice and Retry below the scrolling results. SearchChoices.tsx:816 now renders them outside the scrollport; the footer-specific height rule reserves space for them. Retry still returns focus to the search field before reconnecting, with the existing assertion retained.

Checked: delta from 2aac94c41, surrounding source/CSS, test assertions, and supplied before/after screenshots plus sampled video at 1280×800. The author reports a 1280×700 check; I inspected the height rule but did not independently exercise that size. Not checked: live app/keyboard/reconnect, dark theme, narrow widths, enlarged text, screen reader, long names/many agents, or test execution.

Design review on #2724 pointed out that, while a community
runs on its saved copy, typing "beta" in ⌘K lists the saved channel and
then nine plugin-switch rows, enough to push "Only saved conversations
are searched while this community is disconnected." and Retry connection
below the visible list. The notice was passed to SearchChoices as
children, which render after every result group inside the results'
scrollport, so it appeared only after scrolling to the bottom. Someone
searching for a message saw results without the explanation that
messages and people aren't searched.

SearchChoices gains a footer slot rendered after the results scrollport,
so it stays in view however long the list grows. A palette with a footer
takes the footer's room from the results' maximum height, so both still
fit the dialog in a short window, and a fade at the scrollport's bottom
edge mirrors the one under the field. CommunitySearch and SearchResults
pass the offline notice there instead of as children; the Pages-only
fallback without a saved copy pins its disconnected line the same way.
The notice itself is unchanged: the disconnected and connecting copy,
Retry connection returning focus to the search field before the button
goes away, and the switch to full search in place once the session
connects. Status that belongs with the rows (loading, partial coverage,
lookup failures) still scrolls with them, and search scoped to a
conversation and the channel directory are unchanged.

The SearchChoices test covers the slot, and the PageSearch and
SearchResults tests assert the notice and Retry sit outside the results
scrollport. The help guide already says the line is under the results,
so it is unchanged.

Signed-off-by: Matt Toohey <contact@matttoohey.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@matt2e

matt2e commented Nov 9, 2026

Copy link
Copy Markdown
Contributor Author

🤖 @tellaho Thanks for the catch. Fixed in c3c416a, now the PR head.

What changed. SearchChoices gains an optional footer slot rendered after the results scrollport, and the saved-state notice with its Retry connection button moves from the children slot into it. The notice stays visible while the rows scroll; copy for disconnected vs connecting, Retry returning focus to the field, and the in-place switch to full search on connect are unchanged. Callers that pass no footer render exactly as before, and scoped search is untouched. With a footer, the results' max height drops by 5rem so both fit short windows (checked at 1280×700).

Measured, saved copy, beta typed, 1280×800:

Before 2aac94c41 After c3c416af7
Notice top 960 px, inside the scrollport, off the window 675 px, outside the scrollport, in view
Scroll needed to reveal 357 px none

Before (notice and Retry only appear after scrolling to the bottom):

Before: ⌘K "beta" on saved data shows Beta and nine plugin rows; no connection notice in view

After (notice and Retry pinned under the results):

After: the same search shows the notice and Retry connection below the scrolling results

Video, before then after, Chromium, fixture relay:

pr2724-notice-before-after.mp4

Tests: a new SearchChoices test asserts the footer is outside the scroll container and listbox; PageSearch and SearchResults tests assert the notice and Retry sit outside the scrollport for both copies. 186 tests pass across the three files, tsc and Biome clean. Not checked: dark theme, enlarged text, screen reader.

@wesbillman wesbillman left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Star Lord’s automated source follow-up via Wes’s account, integrating independent Rocket, Mantis and Groot review.

No new actionable findings in the footer/layout change since 2aac94c4. The connection notice and Retry now sit outside the results scrollport and its measured height wrapper. Retry retains its input-focus handoff; saved-archive eligibility, relay-read gates and author-picker recovery copy are unchanged. The attached after screenshot shows the notice and Retry visible beneath overflowing results at 1280×800.

Reviewed head c3c416af7a79ee8a9c12f95564ace780c5e08095 against unchanged base/merge-base 3bcf1c4bb1111d924a84d9b710c1da2db80ccf0b. Source-only: tests were inspected, not run. DOM-containment assertions establish placement, not viewport fit; narrow/short windows with enlarged text, live keyboard/screen-reader behavior, native reconnect and current CI remain unverified. Both attached screenshots were inspected; the videos have thumbnail-only coverage, not full-content validation.

@matt2e
matt2e merged commit 7f42b13 into main Nov 9, 2026
43 checks passed
@matt2e
matt2e deleted the show-saved-channels-in-search branch November 9, 2026 03:03
aharvard added a commit to aharvard/buzz-app that referenced this pull request Nov 9, 2026
Picks up c202642 (block#2837), which fixes the ThreadPanel catch-up test
that fails on every run of a merge with the older main.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* origin/main: (155 commits)
  deps: accept RUSTSEC-2026-0459 for libsqlite3-sys 0.38, move rmcp to 3.9.0 (block#3077)
  fix(communities): accept invite links and bare hosts in Join a community (block#2412)
  fix(builderlab): open a remote agent's Activity on the conversation it was opened from (block#3051)
  refactor(builderlab): keep capabilities fresh in the session (block#3003)
  feat(moderation): show invite links as a QR code (block#3029)
  Keep Create agent's Model row readable and give Goose a Thinking row (block#2673)
  Join a community right after creating it in Settings (block#2991)
  Let new Solo chats start temporary by default (block#2874)
  fix(messages): fill a screen that a head of folded agent activity leaves empty (block#3037)
  fix(search): search saved conversations while the community is offline or connecting (block#2724)
  test(agents): make version-history date assertion time-zone independent (block#3010)
  feat(relay): gate artifact writers on NIP-AR support (block#2735)
  fix(channels): open the dock's community switcher from Personal space (block#2806)
  fix(members): keep the list's place after a member change (block#2818)
  fix(channels): keep a launcher's side panel open on Close all tabs (block#2803)
  fix(activity): show a remote agent's Buzz send as its reply (block#3025)
  refactor(settings): move external identity authorization to security (block#3032)
  test(typeahead): serve the fixture pages as a build so cold loads fit (block#2793)
  feat(channels): list unread top-level mentions in sidebar Activity, and count only unread mentions on the Inbox card (block#2722)
  fix(solo): delete a removed workspace's settings after the groups write (block#2819)
  ...

Signed-off-by: Andrew Harvard <aharvard@squareup.com>
gilgtm added a commit that referenced this pull request Nov 9, 2026
…pover-card-layout-7eeda1e0

* origin/main: (128 commits)
  deps: accept RUSTSEC-2026-0459 for libsqlite3-sys 0.38, move rmcp to 3.9.0 (#3077)
  fix(communities): accept invite links and bare hosts in Join a community (#2412)
  fix(builderlab): open a remote agent's Activity on the conversation it was opened from (#3051)
  refactor(builderlab): keep capabilities fresh in the session (#3003)
  feat(moderation): show invite links as a QR code (#3029)
  Keep Create agent's Model row readable and give Goose a Thinking row (#2673)
  Join a community right after creating it in Settings (#2991)
  Let new Solo chats start temporary by default (#2874)
  fix(messages): fill a screen that a head of folded agent activity leaves empty (#3037)
  fix(search): search saved conversations while the community is offline or connecting (#2724)
  test(agents): make version-history date assertion time-zone independent (#3010)
  feat(relay): gate artifact writers on NIP-AR support (#2735)
  fix(channels): open the dock's community switcher from Personal space (#2806)
  fix(members): keep the list's place after a member change (#2818)
  fix(channels): keep a launcher's side panel open on Close all tabs (#2803)
  fix(activity): show a remote agent's Buzz send as its reply (#3025)
  refactor(settings): move external identity authorization to security (#3032)
  test(typeahead): serve the fixture pages as a build so cold loads fit (#2793)
  feat(channels): list unread top-level mentions in sidebar Activity, and count only unread mentions on the Inbox card (#2722)
  fix(solo): delete a removed workspace's settings after the groups write (#2819)
  ...
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.

5 participants