Skip to content

Commit 7291e28

Browse files
authored
perf(app): trim session render work (anomalyco#16987)
1 parent db57fe6 commit 7291e28

File tree

2 files changed

+23
-14
lines changed

2 files changed

+23
-14
lines changed

packages/app/src/pages/session/message-timeline.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,7 @@ export function MessageTimeline(props: {
764764
"min-w-0 w-full max-w-full": true,
765765
"md:max-w-200 2xl:max-w-[1000px]": props.centered,
766766
}}
767+
style={{ "content-visibility": "auto", "contain-intrinsic-size": "auto 500px" }}
767768
>
768769
<Show when={commentCount() > 0}>
769770
<div class="w-full px-4 md:px-5 pb-2">

packages/ui/src/components/message-part.tsx

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -437,8 +437,8 @@ function groupParts(parts: { messageID: string; part: PartType }[]) {
437437
return result
438438
}
439439

440-
function partByID(parts: readonly PartType[], partID: string) {
441-
return parts.find((part) => part.id === partID)
440+
function index<T extends { id: string }>(items: readonly T[]) {
441+
return new Map(items.map((item) => [item.id, item] as const))
442442
}
443443

444444
function renderable(part: PartType, showReasoningSummaries = true) {
@@ -474,6 +474,13 @@ export function AssistantParts(props: {
474474
const data = useData()
475475
const emptyParts: PartType[] = []
476476
const emptyTools: ToolPart[] = []
477+
const msgs = createMemo(() => index(props.messages))
478+
const part = createMemo(
479+
() =>
480+
new Map(
481+
props.messages.map((message) => [message.id, index(list(data.store.part?.[message.id], emptyParts))] as const),
482+
),
483+
)
477484

478485
const grouped = createMemo(
479486
() =>
@@ -507,7 +514,7 @@ export function AssistantParts(props: {
507514
const entry = entryAccessor()
508515
if (entry.type !== "context") return emptyTools
509516
return entry.refs
510-
.map((ref) => partByID(list(data.store.part?.[ref.messageID], emptyParts), ref.partID))
517+
.map((ref) => part().get(ref.messageID)?.get(ref.partID))
511518
.filter((part): part is ToolPart => !!part && isContextGroupTool(part))
512519
},
513520
emptyTools,
@@ -527,23 +534,23 @@ export function AssistantParts(props: {
527534
const message = createMemo(() => {
528535
const entry = entryAccessor()
529536
if (entry.type !== "part") return
530-
return props.messages.find((item) => item.id === entry.ref.messageID)
537+
return msgs().get(entry.ref.messageID)
531538
})
532-
const part = createMemo(() => {
539+
const item = createMemo(() => {
533540
const entry = entryAccessor()
534541
if (entry.type !== "part") return
535-
return partByID(list(data.store.part?.[entry.ref.messageID], emptyParts), entry.ref.partID)
542+
return part().get(entry.ref.messageID)?.get(entry.ref.partID)
536543
})
537544

538545
return (
539546
<Show when={message()}>
540-
<Show when={part()}>
547+
<Show when={item()}>
541548
<Part
542-
part={part()!}
549+
part={item()!}
543550
message={message()!}
544551
showAssistantCopyPartID={props.showAssistantCopyPartID}
545552
turnDurationMs={props.turnDurationMs}
546-
defaultOpen={partDefaultOpen(part()!, props.shellToolDefaultOpen, props.editToolDefaultOpen)}
553+
defaultOpen={partDefaultOpen(item()!, props.shellToolDefaultOpen, props.editToolDefaultOpen)}
547554
/>
548555
</Show>
549556
</Show>
@@ -695,6 +702,7 @@ export function AssistantMessageDisplay(props: {
695702
showReasoningSummaries?: boolean
696703
}) {
697704
const emptyTools: ToolPart[] = []
705+
const part = createMemo(() => index(props.parts))
698706
const grouped = createMemo(
699707
() =>
700708
groupParts(
@@ -723,7 +731,7 @@ export function AssistantMessageDisplay(props: {
723731
const entry = entryAccessor()
724732
if (entry.type !== "context") return emptyTools
725733
return entry.refs
726-
.map((ref) => partByID(props.parts, ref.partID))
734+
.map((ref) => part().get(ref.partID))
727735
.filter((part): part is ToolPart => !!part && isContextGroupTool(part))
728736
},
729737
emptyTools,
@@ -739,16 +747,16 @@ export function AssistantMessageDisplay(props: {
739747
</Match>
740748
<Match when={entryType() === "part"}>
741749
{(() => {
742-
const part = createMemo(() => {
750+
const item = createMemo(() => {
743751
const entry = entryAccessor()
744752
if (entry.type !== "part") return
745-
return partByID(props.parts, entry.ref.partID)
753+
return part().get(entry.ref.partID)
746754
})
747755

748756
return (
749-
<Show when={part()}>
757+
<Show when={item()}>
750758
<Part
751-
part={part()!}
759+
part={item()!}
752760
message={props.message}
753761
showAssistantCopyPartID={props.showAssistantCopyPartID}
754762
/>

0 commit comments

Comments
 (0)