- ReasoningPanel: derive text inline instead of useMemo([content]); the live
stream mutates the reasoningContent object in place under a stable reference,
so a content-keyed memo froze the panel after the first delta. Add a test that
re-renders with the same mutated object to lock in streaming.
- Explore/installed-app message API: add ExploreMessageListItem +
ExploreMessageInfiniteScrollPagination so message_metadata (incl. reasoning) is
surfaced, letting chat-with-history rehydrate the thinking panel on reload.
Base MessageListItem / service_api public contract left unchanged.
- Persist reasoning per LLM node by accumulating across iteration/loop passes
(append, not overwrite) to match the live stream; guard on isinstance(str).