{
- const parts = tools.map((tool) => patchPartKeys.get(tool)!)
+ part.type === "notice") ? "" : undefined}>
+ {
+ const parts = tools.map((tool) => patchPartKeys.get(tool)!)
- // After a split, only the subgroup with the earliest surviving member keeps the old anchor.
- const key =
- parts
- .map((part) => patchGroupKeys.get(part))
- .find((key) => key !== undefined && parts.includes(patchOwners().get(key)!)) ?? parts[0]!
+ // After a split, only the subgroup with the earliest surviving member keeps the old anchor.
+ const key =
+ parts
+ .map((part) => patchGroupKeys.get(part))
+ .find((key) => key !== undefined && parts.includes(patchOwners().get(key)!)) ?? parts[0]!
- parts.forEach((part) => patchGroupKeys.set(part, key))
+ parts.forEach((part) => patchGroupKeys.set(part, key))
- return key
- }}
- reasoningDefaultOpen={
- input.timelineDetail
- ? input.timelineDetail().thinking.details === "expanded"
- : input.reasoningMode() === "full"
- }
- reasoningOpen={(id) => input.disclosure.value(id)}
- onReasoningOpenChange={(id, open) => input.disclosure.set(id, open)}
- toolDefaultOpen={(tool) => (input.timelineDetail ? contentDefaultOpen(tool) : false)}
- toolOpen={(id) => input.disclosure.value(`${row().group.key}:tool:${id}`)}
- onToolOpenChange={(id, open) => input.disclosure.set(`${row().group.key}:tool:${id}`, open)}
- fileOpen={(path) =>
- input.disclosure.value(`patch:${path}`) ?? input.timelineDetail?.().edit.details === "expanded"
- }
- onFileOpenChange={(path, open) => input.disclosure.set(`patch:${path}`, open)}
- open={input.disclosure.value(key()) === true}
- busy={
- workingTurn(row().userMessageID) &&
- input.projection.lastAssistantGroupKey().get(row().userMessageID) === row().group.key
- }
- onOpenChange={(open) => input.disclosure.set(key(), open)}
- onSizeChange={onSizeChange}
- />
+ return key
+ }}
+ reasoningDefaultOpen={
+ input.timelineDetail
+ ? input.timelineDetail().thinking.details === "expanded"
+ : input.reasoningMode() === "full"
+ }
+ reasoningOpen={(id) => input.disclosure.value(id)}
+ onReasoningOpenChange={(id, open) => input.disclosure.set(id, open)}
+ toolDefaultOpen={(tool) => (input.timelineDetail ? contentDefaultOpen(tool) : false)}
+ toolOpen={(id) => input.disclosure.value(`${row().group.key}:tool:${id}`)}
+ onToolOpenChange={(id, open) => input.disclosure.set(`${row().group.key}:tool:${id}`, open)}
+ fileOpen={(path) =>
+ input.disclosure.value(`patch:${path}`) ?? input.timelineDetail?.().edit.details === "expanded"
+ }
+ onFileOpenChange={(path, open) => input.disclosure.set(`patch:${path}`, open)}
+ open={input.disclosure.value(key()) === true}
+ busy={
+ workingTurn(row().userMessageID) &&
+ input.projection.lastAssistantGroupKey().get(row().userMessageID) === row().group.key
+ }
+ onOpenChange={(open) => input.disclosure.set(key(), open)}
+ onSizeChange={onSizeChange}
+ />
+
)
}
@@ -471,6 +473,7 @@ export function createSessionTimelineRowRenderer(input: {
"md:max-w-[1000px] md:mx-auto": input.centered?.(),
"pt-2": Predicate.isTagged(props.row, "AssistantPart") && props.row.spacing === "tool",
"pt-4": Predicate.isTagged(props.row, "AssistantPart") && props.row.spacing === "content",
+ "pt-6": Predicate.isTagged(props.row, "Error"),
}}
>