Skip to content

feat(desktop-messages): show compact Buzz link metadata - #6252

Open
tellaho wants to merge 27 commits into
mainfrom
tho/buzz-chip-metadata
Open

feat(desktop-messages): show compact Buzz link metadata#6252
tellaho wants to merge 27 commits into
mainfrom
tho/buzz-chip-metadata

Conversation

@tellaho

@tellaho tellaho commented Aug 18, 2026

Copy link
Copy Markdown
Contributor

Category: improvement
User Impact: Buzz links in messages now resolve into compact, descriptive chips with predictable navigation, while tooltips use the neutral secondary surface consistently across light and dark themes.

Problem: Raw Buzz-native links and opaque identifiers make message context difficult to scan, while oversized previews disrupt the conversation. Missing, delayed, or deleted metadata also needs a stable presentation that does not mislead users or break navigation.

Solution: Keep message and issue chips metadata-independent: message chips render only the channel name, while issue chips render only the repository name—never fetched content/title or an event hash. Fetched context remains available in each hover tooltip. Other native links continue to resolve into concise inline labels, with muted secondary fallbacks, distinct deleted states, and existing navigation paths preserved. This also makes two explicit shared-tooltip behavior changes:

  1. Color: shared and rich tooltips move from the primary color pair to the neutral secondary semantic pair, including dedicated huddle-token handling and matching rich-descendant foregrounds.
  2. Hover behavior: tooltip roots set Radix disableHoverableContent, and tooltip content is pointer-transparent, so moving off the trigger dismisses the tooltip instead of letting the pointer enter and keep the popover open.

Together these preserve readable contrast, authoritative project context, and predictable hover dismissal.

File changes

desktop/src/features/communities/useCommunityInit.ts
Primes channel metadata needed to resolve native links promptly.

desktop/src/features/messages/lib/messageLinkMetadata.test.mjs
Covers message preview extraction, fallbacks, and deleted-message semantics.

desktop/src/features/messages/lib/messageLinkMetadata.ts
Normalizes fetched message metadata into compact labels and status-aware presentation.

desktop/src/features/messages/ui/SentFromThreadLine.tsx
Provides thread context to linked-message metadata resolution.

desktop/src/shared/lib/useResolvedLinkPreviews.ts
Exposes resolved preview state for native entity chips.

desktop/src/shared/styles/globals/markdown.css
Adds compact chip layout and semantic disabled-state styling.

desktop/src/shared/styles/globals/theme.css
Defines the semantic colors used by unavailable and deleted chips.

desktop/src/shared/ui/markdown.test.mjs
Exercises native-link rendering and provider-backed entity metadata behavior.

desktop/src/shared/ui/markdown.tsx
Routes native markdown links through metadata-aware chip components without changing navigation contracts.

desktop/src/shared/ui/markdown/ChannelDeepLink.test.mjs
Covers resolved, unresolved, private, archived, and forum channel presentations.

desktop/src/shared/ui/markdown/ChannelDeepLink.tsx
Renders channel names and concise channel metadata inline with stable fallbacks.

desktop/src/shared/ui/markdown/MessageLinkPill.tsx
Renders loading, ready, unavailable, DM, forum, and deleted message states compactly.

desktop/src/shared/ui/markdown/entityLinks.tsx
Enriches repository, issue, and pull-request chips and uses containing-project context in tooltips.

desktop/src/shared/ui/markdown/types.ts
Extends markdown runtime metadata required by native chip rendering.

desktop/src/shared/ui/markdown/useMessageLinkMetadata.ts
Fetches and classifies linked-message metadata while preserving navigable fallbacks.

desktop/src/testing/e2eBridge.ts
Adds deterministic metadata controls for runtime visual and navigation tests.

desktop/tailwind.config.js
Makes semantic disabled colors available to chip styles.

desktop/tests/e2e/entity-link-recipient-cards.spec.ts
Verifies entity labels, project-aware tooltips, delayed metadata, and navigation behavior.

desktop/tests/e2e/navigation.spec.ts
Verifies channel and message chip states, metadata resolution, deletion handling, and navigation.

desktop/src/shared/ui/tooltip.tsx
Migrates the shared tooltip surface from the primary color pair to the semantic secondary pair. It also sets Radix disableHoverableContent and makes tooltip content pointer-transparent so leaving the trigger dismisses the tooltip predictably.

desktop/src/features/agents/ui/RestartDiffBadge.tsx
Aligns restart-diff tooltip values and supporting copy with the secondary tooltip foreground.

desktop/src/features/channels/ui/AddChannelBotTeamsSection.tsx
Aligns rich team tooltip descriptions, persona chips, avatars, and names with secondary tooltip semantics.

desktop/src/features/projects/ui/ProjectAuthorIdentity.tsx
Uses the matching secondary tooltip foreground for project author metadata.

desktop/src/features/projects/ui/ProjectCards.tsx
Aligns repository-unavailable tooltip descriptions with the secondary tooltip foreground.

desktop/src/shared/styles/globals/utilities.css
Makes huddle tooltips consume their dedicated palette directly without misleading primary or secondary aliases.

desktop/src/shared/styles/globals/tooltipSemantics.test.mjs
Pins direct huddle-token consumption and rejects semantic alias drift.

desktop/tests/e2e/tooltip-semantics.spec.ts
Verifies simple and rich tooltip surfaces and descendant tokens in Buzz light and Catppuccin Mocha dark themes.

desktop/playwright.config.ts
Registers tooltip semantic coverage in the desktop smoke suite.

Reproduction steps

  1. Run the desktop app and open a message containing Buzz links for a channel, message, repository, issue, and pull request.
  2. Confirm message links show only the channel name and issue links show only the repository name inline, with no fetched content/title or event hash; confirm other native links remain compact rather than rendering raw identifiers or expanded previews.
  3. Hover the chips and confirm the neutral secondary tooltip adds concise context without duplicating the visible label.
  4. Open each chip and confirm it follows the same channel, message, repository, issue, or pull-request navigation as before.
  5. Inspect links while metadata is loading, unavailable, or definitively deleted and confirm the fallback remains compact, legible, and navigable where appropriate.
  6. In Buzz light and Catppuccin Mocha dark themes, compare a simple channel-members tooltip and the rich Add agents team tooltip; both should use secondary semantics with readable nested content.
  7. Move the pointer from a trigger toward its tooltip; confirm the tooltip dismisses rather than remaining open as hoverable content.

Screenshots

The matrix below covers both the default light theme and Catppuccin Mocha with an orange accent. Message/issue-chip rows affected by the stable-label pivot are temporarily omitted until they can be recaptured from the real built UI; the prior images showed the obsolete expanding inline label.

State Default light Dark · orange accent
Public stream channel tooltip Public stream channel tooltip — default light Public stream channel tooltip — dark orange accent
Private forum channel tooltip Private forum channel tooltip — default light Private forum channel tooltip — dark orange accent
Public forum channel tooltip Public forum channel tooltip — default light Public forum channel tooltip — dark orange accent
Channel references, including unresolved Channel references, including unresolved — default light Channel references, including unresolved — dark orange accent
Unknown channel permalink Unknown channel permalink — default light Unknown channel permalink — dark orange accent
Archived channel tooltip Archived channel tooltip — default light Archived channel tooltip — dark orange accent
Repository entity Repository entity — default light Repository entity — dark orange accent
Pull request entity Pull request entity — default light Pull request entity — dark orange accent
Entity metadata fallback Corrected entity metadata fallback tooltip — default light Corrected entity metadata fallback tooltip — dark orange accent

Tooltip semantic surface spot check

Buzz light Catppuccin Mocha dark
Rich team tooltip on the secondary surface in Buzz light Rich team tooltip on the secondary surface in Catppuccin Mocha dark

@tellaho
tellaho force-pushed the tho/buzz-chip-metadata branch from aff62ed to 38f3c22 Compare August 18, 2026 22:30
@tellaho tellaho changed the title feat(desktop-messages): reveal Buzz metadata in inline chips feat(desktop-messages): show compact Buzz link metadata Aug 19, 2026
@tellaho
tellaho marked this pull request as ready for review August 19, 2026 18:50
@tellaho
tellaho requested a review from a team as a code owner August 19, 2026 18:50
tellaho and others added 25 commits August 19, 2026 11:55
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>

Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Carl <acda9e433d19dcd0e6b6840f7f4b98f3a56f1fab98049d444c087019e6d36560@buzz.block.builderlab.xyz>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
@tellaho
tellaho force-pushed the tho/buzz-chip-metadata branch from 968f8c6 to 82ad04e Compare August 19, 2026 19:01
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
@tellaho
tellaho force-pushed the tho/buzz-chip-metadata branch from dc496a5 to f87b6ba Compare August 19, 2026 19:05

@jedwards27 jedwards27 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.

Verdict: REQUEST CHANGES

Reviewed: 934f3325c3fdaa3a6f23134b74518139aac8ca3f..f87b6ba8b1a554253443cc97e8ae4985c16ea2db (exact head f87b6ba8b1a554253443cc97e8ae4985c16ea2db)

Risk: high — this changes message-link truthfulness/navigation and a shared tooltip primitive used across Desktop.

Two user-visible contract failures remain:

  1. Status metadata is resolved, then omitted from common entity tooltips. desktop/src/shared/ui/markdown/entityLinks.tsx:83-94 renders an issue tooltip from only its title and lets project context replace metadata.description for project-backed PRs. But desktop/src/shared/lib/useResolvedLinkPreviews.ts:357-376 puts issue status/labels and PR status/branch/commit in that description. Consequently, the tooltip paths named by this feature silently hide the status-aware metadata they fetched. Existing E2E proves PR status only on the separate preview card; its tooltip assertions at desktop/tests/e2e/entity-link-recipient-cards.spec.ts:142-149,182-188 require only nonempty project context or the issue subject. Please compose the status metadata into both tooltips and add assertions that fail when it is dropped.

  2. A definitive missing-event response is presented as transient unavailability. desktop/src/shared/ui/markdown/useMessageLinkMetadata.ts:18-24,32-40,73-79 retries every error and has no deleted state, so desktop/src/shared/ui/markdown/MessageLinkPill.tsx:74-86,163-173 renders Message unavailable and preserves exact-message navigation even for event not found. That contradicts this PR's stated distinct-deleted-state contract and gives users a recovery expectation for an ID the successful query did not find. This is already classified as deleted by useDraftRootStatus, and the PR's earlier 2da0cb4da implementation preserved the distinction before 632b1bd3b removed it. Please restore a separately tested deleted state with truthful accessible text/style and deletion-appropriate navigation, or explicitly reconcile the product contract before changing that semantic.

What held up: cache keys include channel and message identity; stale async completion and community-reset races are guarded; unreadable channels do not fetch message metadata; unavailable results are evicted for retry; navigation identity otherwise remains bound to the parsed destination. The global non-hoverable/pointer-transparent tooltip change had no interactive tooltip descendants in the 51 searched caller files and its semantic colors/dismissal behavior are exercised in both tested themes.

Validation at the pinned head:

  • cd desktop && pnpm check — passed (pre-existing diagnostics only).
  • cd desktop && pnpm typecheck && pnpm test — passed; 5,077 tests.
  • Built Playwright affected specs (entity-link-recipient-cards, navigation, tooltip-semantics) — 29 passed, 1 intentional skip on a clean rerun with a persistent preview server.
  • Generated built screenshots for rich tooltip semantics in Buzz Light and Catppuccin Mocha and entity recipient cards were inspected; exercised chips/tooltips were coherent and readable.
  • HEAD was rechecked as the exact pin and the source worktree was clean after validation.

Residual risk / merge gate: message/issue rows remain omitted from the PR's real-built-UI screenshot matrix. Local built E2E covers those flows, but no native exact-artifact session was provided. CI is also not green: Desktop Smoke E2E (3) is cancelled and aggregate Desktop is failed, while Desktop Core, integration shards, smoke 1/2/4, and macOS build passed. Reconcile or rerun that cancelled shard after fixing the findings.

— :bot: Jude’s code review agent

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