Commit Graph

377 Commits

Author SHA1 Message Date
Taylor Ho
d8771fe720 feat: hybrid multi-select with team support in QuickAddAgentPopover
Transform the Quick Add Agent popover into a hybrid interaction model:

- Single-click on an individual agent still adds immediately (fast path)
- Clicking a team row selects all its personas and enters multi-select mode
- In multi-select mode, clicking agents toggles checkbox selection
- Sticky 'Add (N)' confirm button appears at the bottom in multi-select
- Teams section at the top shows usable teams with member count
- Scroll container clips mid-item (max-h-[13.75rem]) to hint at more content
- Nothing pre-selected; running agents still sort to top via recency
- Batch add uses useCreateChannelManagedAgentsMutation for new personas
  and individual attach for already-running agents
2026-05-21 19:16:13 -07:00
Taylor Ho
940935f563 fix: clip QuickAddAgentPopover items to container border-radius
Add overflow-hidden to PopoverContent so hover backgrounds on the
bottom item stay clipped within the rounded corners. Also restore
role=menu on the keyboard-navigable container (lost during revert).
2026-05-21 19:16:13 -07:00
Taylor Ho
91f398f68e fix: clip dropdown menu items to container border-radius
Change DropdownMenuContent from overflow-y-auto to overflow-hidden so
hover/focus backgrounds on menu items are clipped by the container's
rounded corners. Instances that need scrolling (e.g. PulseView) already
pass overflow-y-auto via className which overrides the y-axis.

Matches the existing SubContent pattern which already uses overflow-hidden.
2026-05-21 19:16:13 -07:00
Taylor Ho
f6b3c5d004 Move Add agent trigger to Members sidebar header row
Add a compact '+' icon button immediately left of the ellipsis (⋯)
bulk-actions menu in the Bots section header of the Members side pane.
Remove the old full-width 'Add agent' button from below the bots list.

The trigger opens the same QuickAddAgentPopover as before — just in a
more discoverable, compact location matching the ⋯ button style.
2026-05-21 19:16:13 -07:00
Taylor Ho
c1bc5dcdb3 Revert "Move Add agent button to sit immediately left of settings gear"
This reverts commit bde1fc270ffb9e988407e8f0f4e159418483f35b.
2026-05-21 19:16:13 -07:00
Taylor Ho
0bb63ae2a0 Move Add agent button to sit immediately left of settings gear
Reorder header action buttons so the Quick Add Agent popover trigger
(+ icon) is positioned directly before the manage channel button,
making it more discoverable next to the channel settings.

Also fix pre-existing lint: add role=menu to popover container and
format QuickAddAgentPopover.tsx per biome rules.
2026-05-21 19:16:13 -07:00
Taylor Ho
138ea9b613 fix: move role=listbox to item list wrapper for valid ARIA
The 'More options…' button is not a listbox option, so the listbox
role belongs on the inner div that contains only the agent option items.
2026-05-21 19:16:12 -07:00
Taylor Ho
d1b7aeb538 fix: address review feedback — criticals + mediums
Critical fixes:
1. Null channelId guard — popover renders children-only (no popover
   content) when channelId is null. Action handlers also early-return.
2. pickBotName fallback — safeBotName() wraps pickBotName with a
   defensive fallback to persona.displayName or 'Agent'.
3. E2E test updates — tests now click through the quick-add popover's
   'More options…' button before asserting on the full dialog.
4. Duplicate AddChannelBotDialog — removed the sidebar's own dialog
   instance. Dialog state is now lifted to ChannelScreen and passed
   down via props. Only one dialog instance exists (in ChannelMembersBar).

Medium fixes:
5. Discriminated union types — QuickAddAgentItem is now a proper
   tagged union (RunningAvailableItem | RunningInChannelItem | PersonaItem).
   No more optional agent?/persona? fields.
6. Extracted sortProviders utility — shared between ChannelMembersBar
   and any future consumer. Single source of truth for provider ordering.
7. Emerald colors kept — matches existing presence pattern (bg-emerald-500)
   used throughout the codebase. No design token exists for 'running' status.
8. Keyboard navigation — added arrow-key roving focus via onKeyDown handler
   on the popover container, targeting [data-quick-add-item] buttons.
9. Eager queries — channel members query already gated by popover open state.
   Other queries (agents, personas, providers) are globally cached by
   ChannelMembersBar which is always mounted — no extra network cost.
2026-05-21 19:16:12 -07:00
Taylor Ho
0d56b5805f feat: quick-add agent popover with two entry points
Replace the direct + → full dialog flow with a lightweight Radix popover
that shows available agents sorted by state (running > configured > catalog).
One click to add. The full AddChannelBotDialog is still accessible via
'More options…' at the bottom of the popover.

Two trigger points:
- The existing + button in ChannelMembersBar now opens the popover
- A new 'Add agent' button at the bottom of the sidebar Bots section

The sidebar already had People/Bots section headers — the inline add
affordance lives at the bottom of the Bots section.

Actions:
- Running agent not in channel → useAttachManagedAgentToChannelMutation
- Persona without running agent → useCreateChannelManagedAgentMutation
  (leverages existing reuse logic from agentReuse.ts)

The popover uses useBotRecents for smart ordering and pickBotName for
instance naming. Force-new-instance stays buried in the full dialog.
2026-05-21 19:16:12 -07:00
Will Pfleger
4e060bfec2 fix(deps): upgrade Vite v8 and @vitejs/plugin-react v6 (#710) 2026-05-21 19:03:59 -04:00
Taylor Ho
ee4ee5f850 fix: composer UX improvements (cursor, upload guard, scroll, paste, perf) (#694) 2026-05-21 22:53:10 +00:00
Will Pfleger
091e38ff0a Fix SPROUT_SHARE_IDENTITY worktree dev workflow breaks (#702) 2026-05-21 17:53:20 -04:00
Will Pfleger
6fe557852c fix(frontend): remove deprecated baseUrl for TypeScript 6 compatibility (#705) 2026-05-21 17:40:54 -04:00
tlongwell-block
4373a13fb3 fix(relay): avoid websocket writes in stall watchdog (#697)
Signed-off-by: Tyler Longwell <109685178+tlongwell-block@users.noreply.github.com>
Co-authored-by: npub1mprnacetjua2xx3p5eddmhxyk6wv929ymm5py8kd2xfxurxahspqqlgyta <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co>
Co-authored-by: Dawn (sprout agent) <c6237ef84fa537c78dcee78efd2d4e59f728859c7f194da42ac51ededfa0be05@sprout-oss.stage.blox.sqprod.co>
2026-05-21 12:56:12 -04:00
renovate[bot]
26a2107523 chore(deps): update rust crate tokio to v1.52.3 (#658)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-21 01:27:18 +00:00
renovate[bot]
aff627d901 chore(deps): update rust crate sherpa-onnx to v1.13.2 (#657)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-21 01:26:24 +00:00
renovate[bot]
109c7d9a8a chore(deps): update rust crate reqwest to v0.13.3 (#639)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-20 23:08:09 +00:00
renovate[bot]
7d4c129002 chore(deps): update rust crate sherpa-onnx to v1.12.40 (#640)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-20 23:07:37 +00:00
renovate[bot]
55abbfdec6 fix(deps): update rust crate bzip2 to 0.6 (#661)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-20 22:52:18 +00:00
renovate[bot]
f55dc46c4c chore(deps): update rust crate uuid to v1.23.1 (#648)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-20 22:50:02 +00:00
renovate[bot]
3935885bb9 chore(deps): update rust crate tauri-plugin-dialog to v2.7.1 (#644)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-20 22:49:41 +00:00
renovate[bot]
42d9eafabd chore(deps): update rust crate tokio to v1.51.3 (#646)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-20 22:49:13 +00:00
renovate[bot]
576ef8cf86 chore(deps): update rust crate tauri-plugin-opener to v2.5.4 (#645)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-20 22:48:56 +00:00
renovate[bot]
73b4cb797e chore(deps): update rust crate tauri to v2.11.2 (#642)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-20 22:48:26 +00:00
renovate[bot]
cbe6f415bd chore(deps): update rust crate tar to v0.4.46 (#641)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-20 22:47:24 +00:00
renovate[bot]
f62707f4dc chore(deps): update rust crate earshot to v1.1.0 (#654)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2026-05-20 17:43:33 -04:00
tlongwell-block
a96cb487f4 fix(desktop): project home read-state from the shared NIP-RS marker (#631)
Signed-off-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com>
Co-authored-by: Dawn (sprout agent) <c6237ef84fa537c78dcee78efd2d4e59f728859c7f194da42ac51ededfa0be05@sprout-oss.stage.blox.sqprod.co>
2026-05-20 17:13:59 -04:00
Taylor Ho
af08b0f0e8 fix: prevent agent proliferation when adding bots to channels (#621) 2026-05-20 12:08:34 -07:00
Will Pfleger
c8f99bbc31 fix: surface swallowed errors across crates and emit turn failures to activity log (#628) 2026-05-20 14:55:20 -04:00
thomaspblock
b5e5a39bf0 Refine Pulse composer and post actions (#629)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-20 13:04:47 -04:00
Mat Balez
2da3402f10 [codex] Add copy button for rendered code blocks (#619)
Signed-off-by: Mat Balez <60949391+matbalez@users.noreply.github.com>
2026-05-20 14:25:03 +00:00
tlongwell-block
5370a75ca4 feat(relay): surface connection loss in the workspace header (#623)
Signed-off-by: Tyler Longwell <109685178+tlongwell-block@users.noreply.github.com>
Co-authored-by: Dawn <c6237ef84fa537c78dcee78efd2d4e59f728859c7f194da42ac51ededfa0be05@sprout-oss.stage.blox.sqprod.co>
2026-05-20 09:36:52 -04:00
Will Pfleger
582cfc8885 Bundle sprout CLI in DMG release + agent PATH discoverability (#614) 2026-05-19 20:53:46 -04:00
tlongwell-block
2392e6523a fix(composer): use native ProseMirror inserts for autocomplete (mentions / channels / emoji) (#618)
Signed-off-by: Tyler Longwell <109685178+tlongwell-block@users.noreply.github.com>
Co-authored-by: Quinn (sprout agent) <96f056ad5f2305c8ddf637dc65d048aa4c12d7daeb8867690e34fca46b0ef64c@sprout-oss.stage.blox.sqprod.co>
2026-05-19 20:28:40 -04:00
thomaspblock
b881d5319c Refine thread reply alignment (#620)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-19 19:11:49 -04:00
tlongwell-block
2fed74bdcd Show channels in command search (#617)
Signed-off-by: npub1mprnacetjua2xx3p5eddmhxyk6wv929ymm5py8kd2xfxurxahspqqlgyta <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co>
Co-authored-by: npub1mprnacetjua2xx3p5eddmhxyk6wv929ymm5py8kd2xfxurxahspqqlgyta <d8473ee32b973aa31a21a65adddcc4b69cc2a8a4dee8121ecd51926e0cddbc02@sprout-oss.stage.blox.sqprod.co>
2026-05-19 14:33:53 -04:00
thomaspblock
3973080dce Refine conversation visual affordances (#615)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-19 08:54:41 -04:00
Will Pfleger
50b350dc58 fix(desktop): worktree support — workspace boundary + shared identity (#610) 2026-05-18 19:11:34 -04:00
tlongwell-block
6e1418e571 feat(huddle): fix concurrent-speaker mixing + jitter buffer + protocol v2 (up to 10 peers) (#609)
Signed-off-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com>
2026-05-18 16:34:52 -04:00
tlongwell-block
c0eb5affcf refactor(huddle): switch local TTS to Pocket TTS (Kyutai/sherpa-onnx) (#607)
Signed-off-by: Tyler Longwell <tlongwell@squareup.com>
Signed-off-by: npub1cc3ha7z055mu0rwwu7806t2wt8mj3pvu0uv5mfp2c50dahaqhczshdalg6 <c6237ef84fa537c78dcee78efd2d4e59f728859c7f194da42ac51ededfa0be05@sprout-oss.stage.blox.sqprod.co>
Co-authored-by: npub1cc3ha7z055mu0rwwu7806t2wt8mj3pvu0uv5mfp2c50dahaqhczshdalg6 <c6237ef84fa537c78dcee78efd2d4e59f728859c7f194da42ac51ededfa0be05@sprout-oss.stage.blox.sqprod.co>
2026-05-18 14:28:27 -04:00
thomaspblock
137a4e268f Update inbox conversation experience (#608)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-18 13:48:47 -04:00
thomaspblock
17eea2d267 Fix full-width message layouts (#591)
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-17 09:04:09 -04:00
tlongwell-block
3daf8d6ae1 feat(huddle): swap STT default to Parakeet TDT-CTC 110M (EN, int8) (#562)
Signed-off-by: Tyler Longwell <109685178+tlongwell-block@users.noreply.github.com>
Signed-off-by: Tyler Longwell <tlongwell@squareup.com>
2026-05-15 22:22:05 -04:00
tlongwell-block
d1097aa91f chore(desktop): upgrade Tauri to 2.11.x to fix blank window after sleep on macOS (#600)
Signed-off-by: Tyler Longwell <109685178+tlongwell-block@users.noreply.github.com>
2026-05-15 18:59:16 -04:00
tlongwell-block
7171d4954d fix(relay,desktop): only advertise NIP-43 when enforced; probe pairing by supported_nips (#601)
Signed-off-by: Tyler Longwell <tlongwell@squareup.com>
2026-05-15 15:11:37 -04:00
tlongwell-block
7763072ef9 fix(desktop): derive unread state from NIP-RS + relay catch-up only (#599)
Signed-off-by: Tyler Longwell <109685178+tlongwell-block@users.noreply.github.com>
2026-05-15 14:46:33 -04:00
tlongwell-block
32347d117c feat(desktop): per-persona and per-agent env var overrides (#594) 2026-05-15 10:43:00 -04:00
tlongwell-block
13dc0df688 fix(desktop): stop pinning agents to deprecated SPROUT_ACP_TURN_TIMEOUT (#592)
Signed-off-by: Tyler Longwell <109685178+tlongwell-block@users.noreply.github.com>
2026-05-14 21:51:38 -04:00
tlongwell-block
5cdb3062ed fix(desktop): populate member_count in get_channels so channel browser shows real counts (#548)
Signed-off-by: tlongwell-block <109685178+tlongwell-block@users.noreply.github.com>
2026-05-14 20:38:01 -04:00
tlongwell-block
3a3501c77b fix(desktop): autofocus message composer on channel/thread open (#572)
Signed-off-by: Tyler Longwell <109685178+tlongwell-block@users.noreply.github.com>
2026-05-14 20:35:44 -04:00