feat(profile): embed live activity feed in profile aux panel#1380
Draft
tellaho wants to merge 41 commits into
Draft
feat(profile): embed live activity feed in profile aux panel#1380tellaho wants to merge 41 commits into
tellaho wants to merge 41 commits into
Conversation
62606eb to
618f550
Compare
36b91b0 to
be9f530
Compare
835b230 to
df07da3
Compare
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>
- Synthesize a minimal profile activity agent for declared-owned relay agents so observer and active-turn bridges track the same pubkey. - Relax the profile live activity embed to accept the shared activity-agent shape instead of requiring a full local managed-agent record. - Extract the activity-agent resolver from the oversized profile panel to keep desktop file-size guards intact. - Add an E2E regression covering a viewer-owned relay-only agent switching from the static activity row to the live activity embed. Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Derive profile embed scope from observer feed data so the pane stays mounted after turn_completed, matching full activity panel behavior without changing active-turn store semantics for working badges. - Add profileActivityFeedScope helper subscribing to observer + active-turn stores - Render embed when feed has content, not only during live turns - Switch header to "Recent activity" and drop elapsed timer after completion - Export syncAgentObserverEvents for test harness replay - Extend E2E seed helper with turn_completed and regression coverage Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
- Turn the embedded profile activity preview into a full-card ingress that opens the full activity feed scoped to the currently selected channel. - Replace the explicit open-full label with a flattened accent pill that displays friendly last-live relative time such as "Just now", "1m ago", and "1h ago". - Track latest activity timestamps per channel so persisted and live previews can render accurate last-live labels. - Disable embedded transcript row pointer events and auto-tail the compact transcript so preview clicks route to the activity feed while new turns stay visible. Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
- Tighten the embedded activity preview so auto-tailed transcripts use a real flex height chain and include scrollable bottom breathing room. - Flatten compact preview message rendering by adding data-role hooks for assistant and user message shells, avatars, and bubbles. - Scope compact preview typography and line-height overrides so embedded activity rows read denser without changing the full activity feed. - Restyle the preview surface with a muted fill, top and bottom gradient overlays, a Latest Activity footer label, and a floating last-live pill. Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
- Adjust the compact activity preview edge fades so the top fade is shorter and the bottom label fade has more vertical coverage. - Keep the Latest Activity label inside the non-interactive overlay while preserving the muted preview treatment. Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
- Remove Markdown compact/tight variants so Markdown inherits font sizing and line height from its rendering container. - Add an explicit compact transcript variant for the profile activity preview instead of relying on deep selector overrides. - Render agent sent-message previews through Markdown so formatting is consistent with other transcript messages. - Keep compact preview text small while preserving the full activity feed's normal chat bubble layout. Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
- Remove the visible assistant avatar, name, and timestamp header from activity feed message rows so agent output no longer reads like a chat-authored message. - Move assistant message timestamps to the message body hover title, matching the timestamp tooltip pattern used by other activity rows. - Increase transcript row spacing to `gap-4` across top-level rows and turn groups for a less cramped feed. - Apply `leading-5` to non-compact agent activity markdown renderers while preserving the compact profile preview at `text-xs leading-4`. Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
- Restyle runtime activity user messages as transparent bordered cards and agent sent-message cards as muted bubbles. - Add overflow-aware max-height clamping with matching bottom fades for clipped transcript cards. - Open source channel messages when clicking non-compact transcript bubbles that have message links. - Make non-compact user and agent avatars open the matching profile panel while keeping compact preview avatars passive. - Pass the agent pubkey through compact message summaries so avatar profile navigation can target the right agent. Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
- Increase the profile live activity embed from h-48 to h-56 so the compact transcript preview shows another h-8 of content. - Use tighter compact-preview transcript spacing for top-level rows and turn groups while preserving the full activity feed spacing. - Keep the existing preview ingress overlay and auto-tail behavior unchanged so clicks still open the full activity feed. Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
- Show the active channel name under the Latest Activity label when the embedded activity preview is channel-scoped. - Increase the bottom gradient overlay from h-20 to h-28 so both overlay text lines remain readable over transcript content. - Preserve the existing preview click behavior and channel switcher state while adding the scoped label. Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
- Increase the Latest Activity overlay label to text-base and the scoped channel label to text-sm for better readability. - Expand the lower gradient overlay from h-28 to h-36 so the larger two-line label has enough contrast over transcript content. - Remove the top gradient overlay so the compact activity preview content remains unobscured above the footer label. Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Replace the profile activity channel chip row with an Embla carousel that switches channel previews inside the clipped embed card, with progress dots and a fixed overlay that updates from the active slide index. - Add shadcn-style Carousel wrapper and embla-carousel-react dependency - Refactor ProfileLiveActivityEmbed to one slide per channel with lazy-mounted ManagedAgentSessionPanel instances (data-mounted on each slide) - Keep overlay gradient, Latest Activity label, channel name, and dots static while only slide content translates within the rounded frame - Update channels E2E for current labels and add multi-channel dot switching coverage including lazy-mount assertions Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
- Make compact activity feed typography consistently use compact text sizing across tool rows, sent-message previews, todo summaries, and shared activity row labels. - Avoid conflicting `text-sm` and `text-xs` classes in compact message containers so compact sizing wins reliably. - Remove the top overlay fade from the profile activity card and strengthen the bottom fade for better label and carousel-dot readability. - Preserve the refined carousel dot hit targets and compact activity label treatment in the profile preview card. Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Only render pagination when two or more channel slides exist, and update the single-channel profile activity E2E to assert dots stay hidden. Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
- Make expandable activity row summaries full-width instead of shrink-wrapped so grouped labels stay aligned to the left edge in compact profile previews. - Preserve the existing row spacing, chevron behavior, and open-state coloring while preventing centered-looking group labels such as `Ran 4 commands`. Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
- Add a loading empty state for agent transcripts so active profile activity embeds show a spinner while waiting for ACP events to arrive. - Pass the live pending state from the profile activity feed into the managed session panel with copy that sets expectations for incoming events. - Move compact embed vertical padding from the panel wrapper to the transcript scroll container so transcript content can scroll and clip against the card bounds correctly. Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
- Move compact activity embed vertical padding from the transcript scroll wrapper to the inner transcript content container so rows scroll and clip against the card bounds correctly. - Rename the managed session panel hook from scroll-container styling to transcript-content styling to match where the padding is applied. - Allow the profile embed to disable the managed session panel's default wrapper padding while preserving its horizontal inset. Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
- Remove the live working-channel badge from the profile panel summary now that the live indicator window owns that status surface. - Keep active turn state wired into the profile activity tab so live feed scoping continues to work. - Drop the now-unused profile panel navigation, elapsed-time, and ticker helpers that only supported the old summary pill. Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
- Add a secondary relative "Last updated" subtitle beneath the activity log header. - Derive the timestamp from the scoped observer events and transcript entries so channel-specific activity logs reflect the selected channel. - Reuse the shared auxiliary panel title block for consistent header typography and hover title metadata. 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>
- Update the agent profile live activity embed to use the standard bordered card treatment instead of a muted fill. - Switch the bottom preview overlay gradients to fade from the base background color so the preview blends with the profile pane surface. Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
- Remove the assistant avatar/name header from standard agent transcript message rows so stdout-style output reads as activity text rather than chat-authored messages. - Keep compact and standard transcript variants on the same body-only render path while preserving timestamp hover titles. - Drop now-unused agent identity plumbing from MessageActivity. Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
- Remove the four-second delayed loading message from agent transcript empty states. - Drop the related timer state and effect so loading remains a simple spinner-only state. Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
- Add FileContentBlock as shared scrollable mono panel for file content lines with optional footer text (path or range header) - Add agentSessionFileRead builder to parse dev MCP read_file output into structured lines (context/meta) and footer metadata - Refactor FileEditDiffBlock to render through FileContentBlock - Wire fileReadContent through buildCompactToolSummary and ToolDetailBlocks so read_file tools show file content instead of Parameters/Result JSON - Hide parameters block when file read content is shown (matches file-edit diff behavior) Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
- Add file-read and image to AgentActivityRenderClass and wire classifier to emit them for read_file and view_image harness tools - Re-gate buildFileReadContent on renderClass === "file-read" - Add buildImageContent builder and derive thumbnailSrc/imagePreview from it - Route file-read and image tools through ToolActivity presenters - Extract SimpleImageLightbox shared by ViewImageToolPreview and ComposerAttachments; dedupe resolveToolImageSrc in agentSessionUtils - Extend CompactToolSummary with imageContent and renderClass-based kind; update CompactToolSummaryRow to accept kind for action labels - Add unit tests for file read and image content builders Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
- Add shellContent to CompactToolSummary for shell and shell-sourced buzz-cli relay ops so expanded rows use ShellCommandBlock instead of raw JSON - Add ScrollFadeMonoPanel with top/bottom gradient overflow affordances; apply to ShellCommandBlock command input with accent terminal icon - Replace display-label matching with renderClass checks in transcript grouping and CompactToolSummaryRow action labels - Fix prompt-context accordion horizontal cropping with wrap-break-word on collapsed section titles and previews in PromptSectionAccordion - Extend grouping tests for file-read render class Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
- ShellCommandBlock.tsx: wrap stdout output in ScrollFadeMonoPanel (was a plain overflow pre with no fade affordances) so both the command input and output get top/bottom fade gradients - Reduce max height of both panels from max-h-64 (256px) to max-h-36 (144px) - Switch terminal icon from text-accent to text-primary - Solidify panel background (bg-muted/40 -> bg-muted) to match full-opacity from-muted fades, and add overflow-hidden so the rectangular fade overlays no longer paint over the rounded corners - FileContentBlock.tsx: fix ScrollFadeMonoPanel overflow clamp - max-height lived on the outer wrapper while the scroller used h-full, which cannot resolve against a max-height-only parent, so content bled past the cap; the max-height class now sits on the overflow-auto element itself - Move horizontal padding (px-3) into the scroll content so the scrollbar affixes to the panel's right edge instead of floating 12px inside it - Bump fade default to from-muted and modernize gradient utilities to Tailwind 4 bg-linear-to-* syntax Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
- Move overflow scrolling from the pre element to a flex child wrapper so the scroll area respects max-height within the column layout - Pin the footer with shrink-0 and matching background so path/range text stays below the code block instead of painting over the last lines Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
- Add skill-read render class and classify load_skill by tool name - Build skill body into FileReadContent with SKILL.md footer labels - Reuse FileContentBlock in expanded tool detail instead of Parameters/Result JSON - Group consecutive skill loads as "Read N skills" in transcript summaries Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
- Vendor BuzzLogoAnimation from buzz-website into desktop/src/shared/ui/buzz-logo - Add FuzzyLogo wrapper with fuzz prop to disable CPU-heavy feTurbulence filter - Add buzz-logo--compact sizing (1.75rem) for embedded non-fullscreen usage - Add TurnLivenessIndicator shown at transcript bottom while turn is active - Wire useActiveAgentTurns + channelId through AgentSessionTranscriptList - Replace loading-state Spinner with compact FuzzyLogo in transcript empty state Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
- Give the individual ToolItem <summary> the same `min-h-6` (24px)
baseline as ActivityRow's grouped summary rows ("Ran N commands"),
which were ~3-4px taller because ungrouped tool rows collapsed to
the text-sm line height (~20px)
- Switch from inline-flex to flex to match ActivityRow's summary layout
- Drop the `presentation === "inline"` conditional — the "message"
presentation returns early above, so the branch was always true
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
- Add loopRestSeconds prop to BuzzLogoAnimation: stretches the SMIL loop period to morph + rest, packing the morph keyframes into the start of the cycle at native speed via scaleVariant - Add RestWindowFade group opacity animation that hides the mark during the rest window (quick 0.15s fade after the morph completes) - Forward loopRestSeconds through FuzzyLogo; skip the CSS pulse when a rest window is active so the two opacity animations don't fight - TurnLivenessIndicator: 2s rest between plays, dimmed to 25% opacity with foreground ink - Shrink compact logo size from 1.75rem to 1.5rem Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
The rebased branch pulls the shared markdown graph into unit-tested
components (CompactMessageSummary now renders Markdown), which drags in
emoji-mart transitively. Node's ESM resolver then fails two ways the
app bundler does not:
- @emoji-mart/data's json entrypoint needs 'with { type: "json" }' on
every import hop; serve .json from the loader instead
- emoji-mart's bundled CJS main defeats cjs-module-lexer named-export
detection, so 'import { init }' throws; serve inert ESM stubs for
emoji-mart and @emoji-mart/react since tests never open the picker
Fixes RawRailActivity.render.test.mjs (and the full suite) on the
rebased branch; main was unaffected because nothing under test reached
markdown.tsx before.
Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
…toggle - AgentSessionTranscriptList.tsx: wrap each transcript display block in a motion/react motion.div — new blocks fade in and slide up 12px, and layout="position" springs rows to their new position when blocks regroup. content-visibility-auto moved to a non-animated inner child so motion's layout measurements never force skipped offscreen rows to render, keeping the CSS virtualization intact. Rows mounted on initial history load skip the enter animation via a first-render ref. Compact preview row gap tightened from gap-2 to gap-1. - transcriptAnimationPreference.ts (new): localStorage-backed useSyncExternalStore preference (buzz:animate-transcript-activity, default on) shared across all transcript surfaces; device-level UI preference, intentionally not workspace-scoped. - AgentSessionThreadPanel.tsx: add "Show Animations" Switch row to the activity settings cog menu; disabled while the raw feed is on since raw rows don't animate in. Convert the existing Raw feed toggle from DropdownMenuCheckboxItem to a matching Switch row; both rows toggle via onSelect with preventDefault so the menu stays open, with decorative pointer-events-none switches. - TurnLivenessIndicator.tsx: when Show Animations is on (and reduced motion is off), render three Buzz marks in a row that fade in and rise, hold, then subtly fade out and continue upward on a 1.8s loop with a 0.25s stagger; the original single pulsing logo remains the fallback. - FuzzyLogo.tsx: add pulse prop (default true) so the staggered indicator can opt out of the built-in CSS opacity pulse that would fight the motion-driven fade. - UserProfilePanelTabs.tsx: bump both "Latest Activity" overlay titles down (preview state text-base to text-sm; carousel state and its channel label text-sm to text-xs). Animations respect prefers-reduced-motion via useReducedMotion in both the transcript list and the liveness indicator. Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
7ab64c8 to
9aba17c
Compare
- TurnLivenessIndicator.tsx: size each mark in the staggered three-logo row with w-5! (1.25rem), down from the logo's built-in 1.5rem compact size. The important modifier is required because buzz-logo--compact's inline-size lives in unlayered CSS, which otherwise wins over layered Tailwind utilities. - The single-logo fallback (Show Animations off) keeps its original size. Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
…en layout springs - AgentSessionTranscriptList.tsx: streaming tool calls append as segments inside the current turn block (key turn:<id> stays stable), so the block-level enter animation never fired for them — wrap each turn segment in its own motion.div enter animation in TranscriptDisplayBlockView so tool calls, summaries, and messages animate in individually as they stream. - Extract useHasCompletedInitialRender hook, used per block and per list: segments present at block mount (history load, or a new turn's first paint, which the block wrapper already animates) skip the transition, preventing double animation and static-history flicker. - Make the transcript scroll container a motion.div with layoutScroll so auto-tail scrolls are subtracted from layout measurements — previously each turn's scroll-to-bottom registered as false position deltas and rows visibly sprang back toward the top event. - Gate layout="position" to autoTail surfaces only, where this component owns the scroll container and layoutScroll applies; ancestor-scrolled surfaces (thread panel) keep enter animations but skip position springs to avoid the same false-delta artifact. - Share ROW_ENTER_FROM/ROW_ENTER_TO/ROW_ENTER_SPRING constants across the block- and segment-level animations. Segment animations respect the Show Animations preference and prefers-reduced-motion. Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
- observer-feed-screenshots: settleAnimations awaited every animation's finished promise, but TurnLivenessIndicator's staggered marks loop infinitely so finished never resolves — filter out infinite-iteration animations before awaiting (tests 10/11 hit the 30s timeout). - profile-active-turn 01/02: the profile panel no longer renders 'Working in #channel' badges; assert the live-activity embed and its per-channel carousel dots instead (popover test 03 unchanged — the popover keeps the badge). - active-turn-resilience: same removed-badge assertion, but the Agents view has no AgentSessionProvider so the embed can't render there. Assert prune resilience via the sidebar channel-working badges, which read the same activeAgentTurnsStore the test exercises. Co-authored-by: Taylor Ho <taylorkmho@gmail.com> Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Stacked on PR-3 (the activity-feed rebuild). When a managed agent is live, the Profile auxiliary panel replaces the static "Activity log → View" ingress row with an embedded live activity feed (
h-48, ~192px). Clicking the embed — or pressing Enter/Space — opens the existing full activity view. When the agent is idle, the original ingress row is shown unchanged.What changed
Activity log → Viewingress with an embeddedh-48live feed whenuseActiveAgentTurnsreports the agent is live.ManagedAgentSessionPanel/AgentSessionTranscriptListcomponents (same feed, height-constrained).#channelpill switcher swaps the feed (viachannelIdintoManagedAgentSessionPanel). Falls back to the next active channel if the selected one goes idle.Checks (Bart, in-worktree)
pnpm exec biome check✅pnpm typecheck✅pnpm test✅pnpm check:file-sizes && pnpm check:px-text✅desktop-test,rust-tests,desktop-tauri-test,mobile-test✅Notes
Markdowncompact/tightprops were removed intentionally on this branch; no callers remain after the activity rendering cleanup.tho/activity-feed-rebuild; base will retarget tomainonce PR-3 lands. Review of the rebuilt feed itself belongs in PR-3.c1de233b(embed),6a52216d(per-channel scoping + switcher).Co-authored-by: Taylor Ho taylorkmho@gmail.com
Signed-off-by: Taylor Ho taylorkmho@gmail.com