When useChatUI receives patches that append to an existing state array, a repeat list can stay empty until the stream ends and loading changes. The records have already arrived, but the hook's shallow state copies share the array with the mutable patch accumulator. StateProvider sees the same array reference and does not notify its subscribers.
Capture a detached state snapshot before queuing each React message update, and detach the final callback's state as well. This keeps previously published state from changing underneath React. The core patch API and element-tree copying remain unchanged. The fix adds a deep copy of the streamed JSON state per patch.
The regression uses a controlled ReadableStream with useChatUI, JSONUIProvider, and Renderer. While the stream stays open, it verifies indexed and /- appends, a nested field replacement, removal, and preservation of earlier state snapshots. It fails on the first append without the fix ([] instead of ["First"]) and passes with it.
Validation:
pnpm test: 1,260 tests passed.pnpm type-check,pnpm lint, all package builds, version synchronization, and formatting checks passed.- Applied the equivalent patch to
@json-render/react@0.21.3in a browser consumer: twelve repeated records are visible while the replay stream is still open; without the patch, zero are visible until it closes. - Additional
pnpm --filter @json-render/react typecheckfails on existing errors inhooks.test.tsandstreaming-render.test.tsx. The unmodified baseline and this branch produce identical output. The root type-check command does not run that package's differently namedtypecheckscript.
@mxmzb is attempting to deploy a commit to the Vercel Labs Team on Vercel.
A member of the Team first needs to authorize it.