UiTranscript
data class UiTranscript(val messages: List<UiMessage> = emptyList(), val run: RunState = RunState.Idle, val sharedState: JsonElement = JsonObject(emptyMap()), val steps: List<String> = emptyList())
Everything a renderer needs to draw one conversation, at one instant.
Immutable and replaced wholesale on every change rather than mutated. A Compose renderer recomposes on identity, and the parts that did not change keep their instances, so replacing the transcript costs a diff of the list rather than a redraw of it.