Adds a sortedBots memo in MembersSidebar that prioritizes online
agents at the top. Within each presence group (online vs not-online),
agents sort alphabetically by display name. No more recency-based
reordering — the list stays stable.
Mirror of the attach optimistic update. onMutate filters the member
out of the cache immediately, rolls back on error, invalidates on
settle to reconcile with server.
- Add optimistic onMutate to useAttachManagedAgentToChannelMutation
(instant member insertion, rollback on error)
- Add onSuccess cache-set to create/batch mutations (member appears
as soon as server confirms, before invalidation round-trip)
- Decompose QuickAddAgentPopover (816→271 lines) into:
- useQuickAddAgentItems.ts (data fetching + item list building)
- useQuickAddAgentActions.ts (handlers + multi-select state)
- QuickAddAgentItemRow.tsx (memoized item row component)
- Fix ARIA: remove conflicting role="menu" on container, add
role="group" with aria-label for keyboard navigation wrapper
- Fix dead team toggles: filter out teams whose members are all
already in the channel
- Toggles sit in a separate row that slides in/out (height animation)
- Agent list uses motion layout to smoothly translate down when row appears
- Header stays clean: just title + Select/Cancel button
- Gradient scroll affordance on the toggle row's right edge
- 'Add agent' title stays visible always; 's' fades in when select mode
activates ('Add agents')
- Team toggles appear to the right of the title, scroll horizontally
- Right-edge gradient (from-popover to-transparent) hints at more
content when overflowing
- Button stays ghost+border (outline look) in both states
- Label changes: 'Select' → 'Cancel' when active
- Toggle chips use default data-[state=on]:bg-primary (removed accent override)
- First team chip: opacity-only animation (no x translate)
- Second+ chips: translate from x:12 + fade, staggered by index
- Header container: px-3 py-1.5 with gap-2 for consistent spacing
around the Select button on all sides
Checkboxes were too busy in the agent list. Selection is now
indicated only by the bg-accent/50 highlight on selected rows.
Button already uses size=sm.
The outline variant includes bg-background which creates a visible
contrast block against bg-popover. Use ghost variant with explicit
border-input border for a truly transparent-bg outlined button.
- Label stays 'Select' in both states (no more 'Cancel' label)
- Inactive: variant='outline' (visible against bg-popover)
- Active: variant='default' (primary) for clear state change
- Popover uses bg-popover token (hsl 220 23% 95% light / 232 23% 18% dark)
- Select button uses Button variant='secondary', switches to 'default'
(primary) when active for clear visual state change
- Checkboxes animate in with fade + scale (motion.div) when entering
select mode
- Agent name uses min-w-0 + truncate for proper text overflow when
checkbox pushes content over
- Remove auto-exit from select mode when selectedKeys empties — only
Cancel button exits select mode now.
- Stagger team Toggle animations: first chip fades in immediately,
subsequent chips delay by index * 50ms for a fan-out effect.
- Team chips now use shadcn Toggle component (outline variant) with
visual pressed state via data-[state=on]
- Toggles are selectable/deselectable — clicking again removes the team
- 'Select' button becomes 'Cancel' when active — clears all selections
and exits select mode
- 'Add (N)' button moved to the bottom of the popover, below More Options
- Full-width button, only visible when items are selected
- 'Select' button in the header reveals team filter chips on click
- Title fades out, team chips animate in from right using motion/react
- Clicking a team chip auto-selects all its member agents
- Multi-select mode shows checkboxes + 'Add (N)' confirm button
- Single-click fast path preserved when not in select mode
- Team chips scroll horizontally when overflowing
- Exiting: deselect all returns to default title state
Restructure the dialog from a flat wall of fields into three layers:
1. Primary (always visible): Persona/team selection + runtime picker.
These are the two decisions that matter most.
2. Customize (collapsed): Bot name, system prompt, respond-to allowlist.
Power user controls that don't block the happy path.
3. Advanced (collapsed): Backend provider selection, provider config.
Expert territory hidden by default.
Uses a simple DisclosureSection component with chevron toggle. All
existing functionality preserved — just layered behind progressive
disclosure. Description updated to match the new vibe.
Remove team headers, nesting, multi-select mode, checkboxes, batch
mutations, and team-related imports. The popover returns to its core
purpose: a flat, smartly-ordered list where single-click immediately
adds an agent. Teams and batch selection will live in the 'More options'
dialog instead.
Keeps: overflow-hidden fix, role=menu, smart ordering (running first,
recents, then available), scroll container with mid-item clip.
- Agents now appear indented under their team header as a visual unit
- Ungrouped agents (not in any team) show in a separate section below
- Checkboxes hidden by default, fade in on hover (group-hover)
- Clicking checkbox enters multi-select mode; clicking row still does
single-add (fast path preserved for ungrouped agents)
- Team header click selects all members and enters multi-select mode
- Once in multi-select mode, all checkboxes stay visible
- Running agents still sort to top within their section