The streaming and settled versions of the trailing assistant reply were two components, so settling unmounted one and mounted the other and the entrance tween replayed over text the reader was already on. One LatestAssistantEntry now owns that row under a single key, and the history list excludes it. The CSS entrance keyframe that doubled the GSAP tween is gone and the tween matches the documented 160ms. The step timeline no longer remounts on settle: it is a button-controlled disclosure with a 180ms grid-rows transition, the reader's own toggle wins over the live default, and an in-flight request with no events yet shows a queued row instead of an empty shell. BUG-474 BUG-475 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JUei7K13cYxLHE3Axe4A45
57 lines
1.5 KiB
TypeScript
57 lines
1.5 KiB
TypeScript
export type HomeStreamingRenderProbeSnapshot = Readonly<{
|
|
settledListRenders: number;
|
|
settledRowRenders: number;
|
|
streamingRowRenders: number;
|
|
unsplitListRenders: number;
|
|
latestEntryMounts: number;
|
|
}>;
|
|
|
|
const emptySnapshot = (): HomeStreamingRenderProbeSnapshot => ({
|
|
settledListRenders: 0,
|
|
settledRowRenders: 0,
|
|
streamingRowRenders: 0,
|
|
unsplitListRenders: 0,
|
|
latestEntryMounts: 0,
|
|
});
|
|
|
|
let enabled = false;
|
|
let snapshot = emptySnapshot();
|
|
|
|
export function enableHomeStreamingRenderProbe() {
|
|
enabled = true;
|
|
snapshot = emptySnapshot();
|
|
}
|
|
|
|
export function disableHomeStreamingRenderProbe() {
|
|
enabled = false;
|
|
snapshot = emptySnapshot();
|
|
}
|
|
|
|
export function resetHomeStreamingRenderProbe() {
|
|
snapshot = emptySnapshot();
|
|
}
|
|
|
|
export function homeStreamingRenderProbeSnapshot(): HomeStreamingRenderProbeSnapshot {
|
|
return snapshot;
|
|
}
|
|
|
|
export function noteSettledListRender() {
|
|
if (enabled) snapshot = { ...snapshot, settledListRenders: snapshot.settledListRenders + 1 };
|
|
}
|
|
|
|
export function noteSettledRowRender() {
|
|
if (enabled) snapshot = { ...snapshot, settledRowRenders: snapshot.settledRowRenders + 1 };
|
|
}
|
|
|
|
export function noteStreamingRowRender() {
|
|
if (enabled) snapshot = { ...snapshot, streamingRowRenders: snapshot.streamingRowRenders + 1 };
|
|
}
|
|
|
|
export function noteUnsplitListRender() {
|
|
if (enabled) snapshot = { ...snapshot, unsplitListRenders: snapshot.unsplitListRenders + 1 };
|
|
}
|
|
|
|
export function noteLatestEntryMount() {
|
|
if (enabled) snapshot = { ...snapshot, latestEntryMounts: snapshot.latestEntryMounts + 1 };
|
|
}
|