Skip to content

Face-to-face in the sidebar +, removed Bots stay gone, faster Friends' Bots panel (#92) - #100

Merged
Birfy merged 2 commits into
ThinkFlowLab:mainfrom
Birfy:cursor/friends-panel-perf-dae8
Oct 15, 2026
Merged

Birfy merged 2 commits into
ThinkFlowLab:mainfrom
Birfy:cursor/friends-panel-perf-dae8

Conversation

@Birfy

@Birfy Birfy commented Oct 15, 2026

Copy link
Copy Markdown
Collaborator

Follow-up to #96 / #93 / #91.

  • Face-to-face group is now an entry in the global sidebar + (new-chat picker), right after New group chat, via a new flybot.new-chat.action slot (patch layer). It also stays in Friends' Bots + Add and works while the roster is loading.
  • Removed Bots stay gone: a hide is forgotten only after two consecutive successful non-legacy roster fetches without that handle (or an explicit revoke); hidden handles are kept out of flybot.remote.publish, so persisted remote chats do not return in the sidebar, the send-to picker or mentions. Home-level rows are filtered the same way.
  • Performance: parallel mount, stale-while-revalidate roster (Refreshing\u2026 instead of blocking Loading\u2026), keep-alive HTTP, non-blocking grant listing, slower/paused polling.
  • Tests, bundle check, patches check, CHANGELOG updated.

The owner meant the global + new-chat picker (next to Search), not
Friends' Bots + Add. A plugin slot flybot.new-chat.action adds
Face-to-face group beside Create group chat, using the same t() map.

A hide was forgotten on the next fetch: forgetHiddenIfGone ran on
legacy list_friends, failed, and partial results, wiping hiddenRemotes
to {}. Forget a hide only after two consecutive successful home
absences (or an explicit revoke). Hidden handles stay out of
flybot.remote.publish so persisted remote chats do not return in the
sidebar or 发给 picker; gone and home-level Friend rows are filtered
too. Owner labels match the sidebar.

Co-authored-by: Danyang Chen <birfychen@gmail.com>
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 15, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-15T15:10:42.425115Z 9c5b68f PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 9c5b68fc5b

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

"src/client/new-chat.js",
"src/client/palette.js",
"test/flybot-client.test.js",
"test/new-chat.test.js",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P1 Badge Regenerate 0003 with the new core test

At this reviewed tree, node scripts/ds-bot-patches.mjs check reports core/test/new-chat.test.js: committed but not produced by the patches: this topic now assigns the file to 0003, but 0003-flybot-api-client.patch has no diff for it. The required verify job therefore fails, and reconstructing core/ from the patch stack drops the new regression test; regenerate and commit 0003 with the test.

AGENTS.md reference: AGENTS.md:L68-L68

Useful? React with 👍 / 👎.

const people = [
...roster.bots.filter(bot => matchesName(bot.name, bot.role)).map(bot => ({
key: bot.id, avatar: h(BotAvatar, { bot, size: 24, badge: false, live: false }), title: bot.name,
...roster.bots.filter(bot => isListedRemoteChat(bot) && matchesName(bot.name, bot.role, pickerBotLabel(bot))).map(bot => ({

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Keep hidden local Bots searchable

When a non-main local Bot is hidden via Settings / Hide from sidebar, isListedRemoteChat returns false solely because bot.hidden, so this new filter removes it from the command palette. The settings UI explicitly promises “Search still finds it,” and the unhide branch on line 56 can no longer be reached; restrict this remote-chat filter so ordinary hidden local Bots remain searchable.

Useful? React with 👍 / 👎.

if (listedHomes) {
if (listedHomes.size === 0) continue
const homeKey = homeOfHiddenHandle(key)
if (homeKey && !listedHomes.has(homeKey)) continue

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Clear hidden state when an entire home is revoked

When the hidden Bot is the only granted Bot from a home and the relationship or grant is revoked, a successful list_remote_bots response omits that entire home. This continue prevents absentFetches from ever advancing in that case, and repo-wide search shows clearHiddenRemote is not used by social.js; if the handle is later granted again it is still filtered forever instead of reappearing. Clear hides on confirmed revoke or otherwise distinguish a complete home absence from a partial result.

Useful? React with 👍 / 👎.

Comment thread plugins/social/client.js
function FriendsBots({ renderBot, remoteChats, actions } = {}) {
useStyles()
const [data, setData] = useState(null)
const [data, setData] = useState(() => readCachedRoster())

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge Invalidate the roster cache after removing a Bot

After Remove this Bot succeeds, removeBot updates only component state with setData(result) and never rewrites this newly restored session cache. On a sidebar or client remount, readCachedRoster() therefore renders the removed Bot again until the fresh high-latency request finishes, or indefinitely if a restart refresh fails. Update or invalidate ROSTER_CACHE_KEY with the hide response so removed entries stay gone.

Useful? React with 👍 / 👎.

generate missed core/test/new-chat.test.js while it was untracked, so
check reported it committed but not produced by the patches. Record it
in 0003-flybot-api-client. Describe flybot.new-chat.action and listed
remotes in ds-bot-core so the topics.json change has a subsystem doc.

Co-authored-by: Danyang Chen <birfychen@gmail.com>
@Birfy
Birfy merged commit 14da241 into ThinkFlowLab:main Oct 15, 2026
5 checks passed
cursor Bot pushed a commit to Birfy/FlyBot that referenced this pull request Oct 15, 2026
…Lab#107)

Follow-up to ThinkFlowLab#100 (owner feedback).

- Each Bot shows its own distinct avatar in the Face-to-face Bot picker
and in the waiting room.
- The waiting room is a wrapping tile grid (avatar on top, name below),
no owner subtitle or heavy badge.
- Leave and Enter chat share one footer row.
- Tests updated; local verify passed.

---------

Co-authored-by: Cursor Agent <cursoragent@cursor.com>
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.

2 participants