Commit Graph

565 Commits

Author SHA1 Message Date
npub1223z34hd7vtwc6qj4s7flsxkj644nlre2nthu7lrrmkumhu3xddsrx9r6w
98005ccd57 feat(timeline): add ship-then-rip virtualizer debug overlay
Phase 2 follow-on: a single self-contained TimelineDebugOverlay over the main
timeline so behavior can be watched live while the virtualizer is young.

Read-only by design: it only READS state the hook and virtualizer already
expose — rendered-rows vs total, msg/divider split, overscan, visible index
range, measured row-height min/max, totalSize, scrollTop, clientHeight,
isAtBottom, newMessageCount, and the active jump target (deep-link / find /
highlight). It never touches, wraps, or perturbs the scroll path, so there is
zero risk to sticky-bottom / prepend-retention / deep-link.

Ship-then-rip: removal is delete this one file plus its single import + single
render line in MessageTimeline.tsx. No flag-gate hook, no localStorage toggle —
nothing else references it, so it leaves zero residue. Main timeline only;
thread pane untouched.

Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
2026-06-15 20:49:55 -07:00
npub1223z34hd7vtwc6qj4s7flsxkj644nlre2nthu7lrrmkumhu3xddsrx9r6w
374c829619 perf(timeline): virtualize the main message timeline
Phase 2: render only the viewport (+overscan) of the main timeline instead of
all ~200+ rows, lifting the ~2,000-row ceiling. Main timeline ONLY — the thread
pane (and its useTimelineScrollManager) is untouched (Phase 3).

What changed:

- MessageTimeline now drives @tanstack/react-virtual off the same deferred
  snapshot the rows render from, flattening day-grouped entries into
  index-addressable rows via buildVirtualTimelineRows. Rows are built from the
  FILTERED main-timeline entries (buildMainTimelineEntries), so dropped thread
  replies never desync the row->entry mapping.

- useVirtualTimelineScroll REPLACES the bespoke 427-line useTimelineScrollManager
  for the main timeline. The virtualizer owns the scroll container and all
  measurement/anchoring; this hook is a thin wrapper keeping sticky-bottom
  autoscroll, accent smooth-scroll, the newMessageCount pill, isAtBottom, and
  deep-link + find-in-page jumps (via findVirtualRowIndexForMessage ->
  scrollToIndex). No scrollTop locking, no ResizeObserver re-pinning.

- useLoadOlderOnScroll is gutted to a trigger: the double-requestAnimationFrame
  scrollTop correction and restoreScrollPosition plumbing are DELETED. Stable
  per-row keys (getItemKey) let the virtualizer hold scroll position on prepend
  natively — the band-aid is gone at the root.

- cmd+F find drives scroll-to-row through the same scrollToIndex bridge; a
  render-all-while-searching escape hatch exists as an off-by-default fallback
  (the in-app path is the default, keeping the perf win).

- The per-entry render (3 row variants + video-review context) is extracted to
  renderTimelineEntry + useVideoReviewContextById, a single source of truth
  injected into VirtualizedTimelineList. The old nested TimelineMessageList is
  deleted (orphaned by the rewire).

Must-keeps preserved: sticky-bottom autoscroll, day dividers (first-class
variable-height flat rows), jump-to-message deep links, no-tearing (same
deferredMessages snapshot drives both rows and scroll logic).

Coverage: 8 jsdom/testing-library DOM tests cover row dispatch (divider vs
message, flat-index->entry mapping), init autoscroll, accent smooth-scroll, and
deep-link scrollToIndex. jsdom has no layout engine, so react-virtual's pixel
measurement/scroll math stays on a manual/visual verification pass.

Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
2026-06-15 19:35:40 -07:00
npub1223z34hd7vtwc6qj4s7flsxkj644nlre2nthu7lrrmkumhu3xddsrx9r6w
fc2302b5e4 test(timeline): add minimal jsdom/testing-library DOM net
Phase 2 (b)-lite, slice 1: establish a thin DOM test lane so the upcoming
virtualized scroll rewrite ships with automated coverage, not just manual checks.

The repo's test runner is `node --test` over `*.test.mjs` with no jsdom and no
JSX transform, so component rendering wasn't testable. This adds a second lane
that coexists with the existing pure-logic lane:

- esbuild `load` hook transforms .ts/.tsx (TS + JSX, automatic React runtime)
- global-jsdom installs DOM globals via `--import`
- @testing-library/react + /dom for render/query
- `pnpm test` now runs both lanes (test:unit + test:dom)
- DOM tests are `*.dom.test.tsx`

Deliberately thin: jsdom has no layout engine, so it does not cover
react-virtual's real measurement/scroll math — those stay on the
manual/visual verification pass (see FEASIBILITY.md). One smoke test proves
the net is wired.

Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
2026-06-15 19:16:00 -07:00
npub1223z34hd7vtwc6qj4s7flsxkj644nlre2nthu7lrrmkumhu3xddsrx9r6w
606dfac37e spike(timeline): assess @tanstack/react-virtual feasibility for main timeline
Read-only Phase 2 feasibility spike (NOT ship-ready). Assesses whether
@tanstack/react-virtual can cleanly own the main timeline, replacing the
bespoke scrollTop-locking scroll manager and the ~2,000-row render ceiling.

Artifacts:
- buildVirtualTimelineRows.ts: pure helper flattening day-grouped entries
  into a flat indexed row list (day-divider + message kinds) the virtualizer
  can measure/key; includes findVirtualRowIndexForMessage for deep-link/find.
- buildVirtualTimelineRows.test.mjs: 9 tests covering dividers, renderKey
  keying, prepend key stability (native position-retention contract), and
  flat-index lookup.
- __spike__/VirtualizedTimelinePoc.tsx: thin non-wired PoC showing the
  react-virtual integration shape (autoscroll, prepend retention via
  getItemKey, scrollToIndex for find/deep-link).
- __spike__/FEASIBILITY.md: honest verdict on the three scoped points —
  sticky-bottom autoscroll, scroll-up pagination with native position
  retention, and cmd+F find-in-page plan.

Co-authored-by: Taylor Ho <taylorkmho@gmail.com>
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
2026-06-15 18:42:25 -07:00
Taylor Ho
cbc754cffb perf(timeline): gate heavy message render behind useDeferredValue (#1022)
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: npub1223z34hd7vtwc6qj4s7flsxkj644nlre2nthu7lrrmkumhu3xddsrx9r6w <52a228d6edf316ec6812ac3c9fc0d696ab59fc7954d77e7be31eedcddf91335b@sprout-oss.stage.blox.sqprod.co>
Co-authored-by: npub14vtk7pvazqrq9639qu7e560wnqtl0d53ca4gjuvq6jzf3k2el23qqlwa7f <ab176f059d100602ea25073d9a69ee9817f7b691c76a897180d48498d959faa2@sprout-oss.stage.blox.sqprod.co>
2026-06-15 15:23:33 -07:00
klopez4212
116486592d Add animated profile avatars (#1031) 2026-06-15 22:52:50 +01:00
klopez4212
89ae31d203 Polish direct message and members modals (#1054) 2026-06-15 22:24:07 +01:00
klopez4212
5234fc8167 Polish huddles UI (#1041) 2026-06-15 21:58:12 +01:00
klopez4212
424ea70254 Fix video review comments in threads (#1056) 2026-06-15 21:55:36 +01:00
klopez4212
81296d9766 Polish message reaction tray (#1002) 2026-06-15 21:27:10 +01:00
klopez4212
c30d7274c2 Refine app loading skeletons (#1001) 2026-06-15 20:44:40 +01:00
klopez4212
ee34ca818b Polish channel modal forms (#1000) 2026-06-15 20:43:59 +01:00
klopez4212
19656fff46 Normalize desktop icon sizing (#999) 2026-06-15 20:43:49 +01:00
klopez4212
7a2e35521c Add shared skeleton loader primitives (#998) 2026-06-15 20:43:36 +01:00
Wes
d02aee2021 chore(release): release version 0.3.23 (#1040) 2026-06-13 22:30:13 -07:00
Wes
5d995d928b chore(release): release version 0.3.22 (#1038)
Signed-off-by: Wes <wesbillman@users.noreply.github.com>
Co-authored-by: Pinky <44b8e82baa6e0e254e0208d68f335c283c94e7b78dd1fa10d5a49d3f13dd0435@sprout-oss.stage.blox.sqprod.co>
2026-06-13 21:01:25 -07:00
Wes
455d184c7a chore(release): release version 0.3.21 (#1037) 2026-06-13 20:24:50 -07:00
tlongwell-block
6e4c8680c8 feat(emoji): latest-set-wins union for custom emoji across desktop, mobile, and CLI (#989)
Signed-off-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co>
Signed-off-by: npub1t2tgm7d8f995uqvmnm8h88sg3wnpp9a5xysjf6dg3tjmgt3ltulqdp8ehr <5a968df9a7494b4e019b9ecf739e088ba61097b4312124e9a88ae5b42e3f5f3e@sprout-oss.stage.blox.sqprod.co>
Co-authored-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co>
Co-authored-by: npub1t2tgm7d8f995uqvmnm8h88sg3wnpp9a5xysjf6dg3tjmgt3ltulqdp8ehr <5a968df9a7494b4e019b9ecf739e088ba61097b4312124e9a88ae5b42e3f5f3e@sprout-oss.stage.blox.sqprod.co>
2026-06-13 13:50:40 -04:00
Will Pfleger
5c2f46e627 fix(desktop): make Windows release compile cleanly (#1029)
Signed-off-by: Will Pfleger <pfleger.will@gmail.com>
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co>
2026-06-13 13:28:55 -04:00
Will Pfleger
a32681fd48 feat(profile): show active turn badges on agent profile panel and popover (#1026)
Signed-off-by: Will Pfleger <pfleger.will@gmail.com>
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co>
2026-06-13 12:43:26 -04:00
Will Pfleger
65b6d79423 chore(release): release version 0.3.20 (#1027) 2026-06-12 22:24:20 -04:00
Will Pfleger
29b8f73b08 chore(release): release version 0.3.19 (#1014) 2026-06-12 18:47:43 -04:00
Will Pfleger
b8c0556e7c fix: repair main build after cross-PR merge skew (#1020) 2026-06-12 18:20:16 -04:00
Will Pfleger
87e45c65bf feat(agents): show per-turn duration and prune dead turns within ~25s of host crash (#1017)
Signed-off-by: Will Pfleger <pfleger.will@gmail.com>
Co-authored-by: Will Pfleger <pfleger.will@gmail.com>
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co>
2026-06-12 18:01:29 -04:00
Bradley Axen
563f684342 fix(desktop): migrate Sprout workspace storage (#1016)
Signed-off-by: Bradley Axen <baxen@squareup.com>
2026-06-12 17:51:54 -04:00
Will Pfleger
de641fce52 feat(release): all-OS desktop builds + universal auto-update manifest (#1011)
Signed-off-by: Will Pfleger <wpfleger@block.xyz>
Signed-off-by: Will Pfleger <pfleger.will@gmail.com>
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co>
2026-06-12 14:50:03 -04:00
Will Pfleger
8c9211ffc6 Add relay disconnect UX: friendly errors, reconnect, cached identity (#1004) 2026-06-12 14:00:41 -04:00
Will Pfleger
7983bf6751 feat(agents): add active turn indicators to Agents Menu (#1005)
Signed-off-by: Will Pfleger <pfleger.will@gmail.com>
Signed-off-by: Will Pfleger <wpfleger@squareup.com>
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co>
Co-authored-by: npub1fgdl5qqnh3k3f2xkqrvt7cujalhm623x4s7fdjdj5yrtp5fzjl9qrjpucw <4a1bfa0013bc6d14a8d600d8bf6392efefbd2a26ac3c96c9b2a106b0d12297ca@sprout-oss.stage.blox.sqprod.co>
2026-06-12 13:54:07 -04:00
tlongwell-block
12433077ad fix(huddle): Pocket TTS quality overhaul — reference parity + cross-message pipelining (#997)
Signed-off-by: Tyler Longwell <tlongwell@squareup.com>
Co-authored-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co>
2026-06-12 12:56:42 -04:00
Will Pfleger
df8896f13e fix(desktop): heal stale persona_team_dir paths in release builds (#1003) 2026-06-12 11:48:19 -04:00
tlongwell-block
2846a96ed2 feat(huddle): sentence-at-a-time voice-mode guidelines for lower TTS latency (#996)
Signed-off-by: Tyler Longwell <tlongwell@squareup.com>
Co-authored-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co>
2026-06-11 19:58:36 -04:00
Wes
179c968d08 chore(release): release version 0.3.18 (#995) 2026-06-11 15:41:49 -07:00
klopez4212
05fc69b840 Video Player Improvements (#993)
Signed-off-by: Wes <wesbillman@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Wes <wesbillman@users.noreply.github.com>
Co-authored-by: Pinky <44b8e82baa6e0e254e0208d68f335c283c94e7b78dd1fa10d5a49d3f13dd0435@sprout-oss.stage.blox.sqprod.co>
2026-06-11 22:21:54 +00:00
klopez4212
d9ce0943ed Improve first-run welcome setup (#970)
Signed-off-by: Wes <wesbillman@users.noreply.github.com>
Co-authored-by: Wes <wesbillman@users.noreply.github.com>
Co-authored-by: Brain <21994759fc7a6fa6b965551d35cfd7897d262f2495467f2d78694ddcfa6a5c7e@sprout-oss.stage.blox.sqprod.co>
2026-06-11 21:56:13 +00:00
Wes
ea5a0a9b40 Replace built-in personas with Fizz (#987)
Signed-off-by: Wes <wesb@block.xyz>
Signed-off-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co>
Co-authored-by: npub1gjuws2a2dc8z2nszprtg7v6u9q7ffeah3hgl5yx45jwn7y7aqs6s5e9xj6 <44b8e82baa6e0e254e0208d68f335c283c94e7b78dd1fa10d5a49d3f13dd0435@sprout-oss.stage.blox.sqprod.co>
Co-authored-by: npub1qyvc0c5kl4gqv2fd97fsk46tu378sqgy35vc83rvgfwne90sel7s0ed67d <011987e296fd5006292d2f930b574be47c7801048d1983c46c425d3c95f0cffd@sprout-oss.stage.blox.sqprod.co>
2026-06-11 13:50:14 -07:00
Wes
824c55114e Fix Buzz command migration for saved agents (#979) 2026-06-11 11:27:58 -07:00
Will Pfleger
63738139ba fix(desktop): resolve effective model and prompt from persona in display path (#972)
Signed-off-by: Will Pfleger <pfleger.will@gmail.com>
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co>
2026-06-11 13:29:38 -04:00
Wes
1bb8b8d547 docs: clean up remaining Buzz references (#977)
Signed-off-by: Wes <wesbillman@users.noreply.github.com>
Co-authored-by: Pinky <44b8e82baa6e0e254e0208d68f335c283c94e7b78dd1fa10d5a49d3f13dd0435@sprout-oss.stage.blox.sqprod.co>
2026-06-11 10:22:14 -07:00
Wes
9242b91f00 chore(release): release version 0.3.17 (#976) 2026-06-11 10:10:34 -07:00
tlongwell-block
e4a0824c6a fix(onboarding): skip onboarding when relay already has a profile (#973) 2026-06-11 13:09:43 -04:00
Taylor Ho
6f3733d43b fix(desktop): let channel members bypass mention agent gate (#965)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-11 09:21:07 -07:00
Wes
8f580f308c Rename desktop app to Buzz (#960)
Signed-off-by: Wes <wesbillman@users.noreply.github.com>
Co-authored-by: Pinky <44b8e82baa6e0e254e0208d68f335c283c94e7b78dd1fa10d5a49d3f13dd0435@sprout-oss.stage.blox.sqprod.co>
2026-06-11 15:06:24 +00:00
Taylor Ho
dcb2639b35 feat(desktop): open profile panel from MembersSidebar rows (#962)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-11 07:42:24 -07:00
Taylor Ho
4e4dc723e4 feat(desktop): per-event notification sounds and alert controls (#968)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-11 07:31:19 -07:00
Taylor Ho
1ca16c898c fix(desktop): make header chrome zoom-correct and tidy split-pane (#941)
Signed-off-by: Taylor Ho <taylorkmho@gmail.com>
Co-authored-by: npub1223z34hd7vtwc6qj4s7flsxkj644nlre2nthu7lrrmkumhu3xddsrx9r6w <52a228d6edf316ec6812ac3c9fc0d696ab59fc7954d77e7be31eedcddf91335b@sprout-oss.stage.blox.sqprod.co>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 07:27:23 -07:00
tlongwell-block
8c8312932a fix(desktop): rename SPROUT_ env vars to BUZZ_ for child agent processes (#971) 2026-06-11 10:13:52 -04:00
Taylor Ho
31b0665cff fix(justfile): complete buzz rename in dev and staging recipes (#966)
Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-06-11 01:06:29 -07:00
Will Pfleger
d99ad131f1 refactor: rename sprout backend to buzz (#958)
Signed-off-by: Will Pfleger <pfleger.will@gmail.com>
Signed-off-by: Will Pfleger <wpfleger@block.xyz>
Signed-off-by: Will Pfleger <wpfleger@squareup.com>
Signed-off-by: Will Pfleger <wpfleger96@gmail.com>
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co>
Co-authored-by: npub1fgdl5qqnh3k3f2xkqrvt7cujalhm623x4s7fdjdj5yrtp5fzjl9qrjpucw <4a1bfa0013bc6d14a8d600d8bf6392efefbd2a26ac3c96c9b2a106b0d12297ca@sprout-oss.stage.blox.sqprod.co>
Co-authored-by: npub16v54tttfqacx9ycvc3k0ut0npj564ahcuajzy6qjvh57ntmsf4uq4806j2 <d32955ad69077062930cc46cfe2df30ca9aaf6f8e76422681265e9e9af704d78@sprout-oss.stage.blox.sqprod.co>
Co-authored-by: Will Pfleger <wpfleger96@gmail.com>
2026-06-10 19:29:51 -04:00
Will Pfleger
53e3f09485 fix(desktop): reap orphaned agent processes across instances (#954)
Signed-off-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co>
Signed-off-by: Will Pfleger <pfleger.will@gmail.com>
Co-authored-by: npub1mn7jgtj4w2pd0g0zeuhxsa6jy6p0rewxz4kujt98my82ahfmp72sxjexk7 <dcfd242e557282d7a1e2cf2e6877522682f1e5c6156dc92ca7d90eaedd3b0f95@sprout-oss.stage.blox.sqprod.co>
2026-06-10 17:38:39 -04:00
Wes
c5a54dcc39 Rename web app to Buzz (#959)
Signed-off-by: Wes <wesbillman@users.noreply.github.com>
Co-authored-by: Pinky <44b8e82baa6e0e254e0208d68f335c283c94e7b78dd1fa10d5a49d3f13dd0435@sprout-oss.stage.blox.sqprod.co>
2026-06-10 21:07:02 +00:00