perf(app): trim session render work (#16987)

This commit is contained in:
Shoubhit Dash
2026-03-11 18:19:17 +05:30
committed by GitHub
parent db57fe6193
commit 7291e28273
2 changed files with 23 additions and 14 deletions
@@ -764,6 +764,7 @@ export function MessageTimeline(props: {
"min-w-0 w-full max-w-full": true, "min-w-0 w-full max-w-full": true,
"md:max-w-200 2xl:max-w-[1000px]": props.centered, "md:max-w-200 2xl:max-w-[1000px]": props.centered,
}} }}
style={{ "content-visibility": "auto", "contain-intrinsic-size": "auto 500px" }}
> >
<Show when={commentCount() > 0}> <Show when={commentCount() > 0}>
<div class="w-full px-4 md:px-5 pb-2"> <div class="w-full px-4 md:px-5 pb-2">
+22 -14
View File
@@ -437,8 +437,8 @@ function groupParts(parts: { messageID: string; part: PartType }[]) {
return result return result
} }
function partByID(parts: readonly PartType[], partID: string) { function index<T extends { id: string }>(items: readonly T[]) {
return parts.find((part) => part.id === partID) return new Map(items.map((item) => [item.id, item] as const))
} }
function renderable(part: PartType, showReasoningSummaries = true) { function renderable(part: PartType, showReasoningSummaries = true) {
@@ -474,6 +474,13 @@ export function AssistantParts(props: {
const data = useData() const data = useData()
const emptyParts: PartType[] = [] const emptyParts: PartType[] = []
const emptyTools: ToolPart[] = [] const emptyTools: ToolPart[] = []
const msgs = createMemo(() => index(props.messages))
const part = createMemo(
() =>
new Map(
props.messages.map((message) => [message.id, index(list(data.store.part?.[message.id], emptyParts))] as const),
),
)
const grouped = createMemo( const grouped = createMemo(
() => () =>
@@ -507,7 +514,7 @@ export function AssistantParts(props: {
const entry = entryAccessor() const entry = entryAccessor()
if (entry.type !== "context") return emptyTools if (entry.type !== "context") return emptyTools
return entry.refs return entry.refs
.map((ref) => partByID(list(data.store.part?.[ref.messageID], emptyParts), ref.partID)) .map((ref) => part().get(ref.messageID)?.get(ref.partID))
.filter((part): part is ToolPart => !!part && isContextGroupTool(part)) .filter((part): part is ToolPart => !!part && isContextGroupTool(part))
}, },
emptyTools, emptyTools,
@@ -527,23 +534,23 @@ export function AssistantParts(props: {
const message = createMemo(() => { const message = createMemo(() => {
const entry = entryAccessor() const entry = entryAccessor()
if (entry.type !== "part") return if (entry.type !== "part") return
return props.messages.find((item) => item.id === entry.ref.messageID) return msgs().get(entry.ref.messageID)
}) })
const part = createMemo(() => { const item = createMemo(() => {
const entry = entryAccessor() const entry = entryAccessor()
if (entry.type !== "part") return if (entry.type !== "part") return
return partByID(list(data.store.part?.[entry.ref.messageID], emptyParts), entry.ref.partID) return part().get(entry.ref.messageID)?.get(entry.ref.partID)
}) })
return ( return (
<Show when={message()}> <Show when={message()}>
<Show when={part()}> <Show when={item()}>
<Part <Part
part={part()!} part={item()!}
message={message()!} message={message()!}
showAssistantCopyPartID={props.showAssistantCopyPartID} showAssistantCopyPartID={props.showAssistantCopyPartID}
turnDurationMs={props.turnDurationMs} turnDurationMs={props.turnDurationMs}
defaultOpen={partDefaultOpen(part()!, props.shellToolDefaultOpen, props.editToolDefaultOpen)} defaultOpen={partDefaultOpen(item()!, props.shellToolDefaultOpen, props.editToolDefaultOpen)}
/> />
</Show> </Show>
</Show> </Show>
@@ -695,6 +702,7 @@ export function AssistantMessageDisplay(props: {
showReasoningSummaries?: boolean showReasoningSummaries?: boolean
}) { }) {
const emptyTools: ToolPart[] = [] const emptyTools: ToolPart[] = []
const part = createMemo(() => index(props.parts))
const grouped = createMemo( const grouped = createMemo(
() => () =>
groupParts( groupParts(
@@ -723,7 +731,7 @@ export function AssistantMessageDisplay(props: {
const entry = entryAccessor() const entry = entryAccessor()
if (entry.type !== "context") return emptyTools if (entry.type !== "context") return emptyTools
return entry.refs return entry.refs
.map((ref) => partByID(props.parts, ref.partID)) .map((ref) => part().get(ref.partID))
.filter((part): part is ToolPart => !!part && isContextGroupTool(part)) .filter((part): part is ToolPart => !!part && isContextGroupTool(part))
}, },
emptyTools, emptyTools,
@@ -739,16 +747,16 @@ export function AssistantMessageDisplay(props: {
</Match> </Match>
<Match when={entryType() === "part"}> <Match when={entryType() === "part"}>
{(() => { {(() => {
const part = createMemo(() => { const item = createMemo(() => {
const entry = entryAccessor() const entry = entryAccessor()
if (entry.type !== "part") return if (entry.type !== "part") return
return partByID(props.parts, entry.ref.partID) return part().get(entry.ref.partID)
}) })
return ( return (
<Show when={part()}> <Show when={item()}>
<Part <Part
part={part()!} part={item()!}
message={props.message} message={props.message}
showAssistantCopyPartID={props.showAssistantCopyPartID} showAssistantCopyPartID={props.showAssistantCopyPartID}
/> />