• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

stacklok / toolhive-studio / 24769501795 / 1
70%
main: 70%

Build:
DEFAULT BRANCH: main
Ran 22 Apr 2026 08:59AM UTC
Files 474
Run time 12s
Badge
Embed ▾
README BADGES
x

If you need to use a raster PNG badge, change the '.svg' to '.png' in the link

Markdown

Textile

RDoc

HTML

Rst

22 Apr 2026 08:55AM UTC coverage: 66.556% (+0.2%) from 66.316%
24769501795.1

push

github

web-flow
feat(playground): preload thread in the route loader and delegate scroll restoration to router (#2062)

* feat(playground): redirect to initial thread in beforeLoad

Resolve the target thread in the router's beforeLoad and throw redirect()
instead of mounting a component that runs the resolution in a useEffect.
Eliminates the one-frame blank render between /playground and the
chat sub-route.

* feat(playground): prime thread data via route loader and React Query

Introduce chatThreadQueryOptions and consume it from the
/playground/chat/$threadId loader via ensureQueryData + pendingComponent.
useChatStreaming reads messages from the cache with useQuery and hydrates
the useChat instance once per thread via a ref guard, so switching
threads no longer flashes a loading state. usePlaygroundThreads
invalidates the new query key on streaming-complete to refresh titles
and messages. Remove the now-unused loadMessages from
useThreadManagement.

* refactor(chat): delegate chat scroll restoration to TanStack Router

Enable router-level scrollRestoration keyed by location.pathname and
register the chat messages container with data-scroll-restoration-id so
TSR persists and restores its scroll position across navigations. Apply
overflow-anchor: auto on the scroll container and each MCP app iframe
wrapper so async height changes don't shove the viewport.

useAutoScroll is rewritten around the new contract: its responsibilities
shrink to following the bottom while streaming, the scroll-to-bottom
button, and an initial 5s settling window that re-applies the saved
scroll target as MCP iframes finish their size handshake. Distinguishes
overflow-anchor-driven scroll events from genuine user input (wheel /
touch / key / pointer) so the settling window isn't cancelled by the
first iframe resize. The in-component loading overlay is removed — the
route's pendingComponent now owns that state.

* fix(chat): restore scroll position when user was at the top

The placement effect... (continued)

3882 of 6375 branches covered (60.89%)

6032 of 9063 relevant lines covered (66.56%)

120.26 hits per line

Source Files on job 24769501795.1
  • Tree
  • List 474
  • Changed 9
  • Source Changed 9
  • Coverage Changed 8
Coverage ∆ File Lines Relevant Covered Missed Hits/Line Branch Hits Branch Misses
  • Back to Build 24769501795
  • 4b173217 on github
  • Prev Job for on main (#24768530133.1)
  • Next Job for on main (#24769524930.1)
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc