Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -28,3 +28,4 @@ opencode-dev
logs/
*.bun-build
tsconfig.tsbuildinfo
.opencode/command/
26 changes: 23 additions & 3 deletions packages/ui/src/components/message-part.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ export interface MessagePartProps {
defaultOpen?: boolean
showAssistantCopyPartID?: string | null
turnDurationMs?: number
working?: boolean
}

export type PartComponent = Component<MessagePartProps>
Expand Down Expand Up @@ -385,6 +386,7 @@ export function AssistantParts(props: {
showAssistantCopyPartID={props.showAssistantCopyPartID}
turnDurationMs={props.turnDurationMs}
defaultOpen={partDefaultOpen(entry().part, props.shellToolDefaultOpen, props.editToolDefaultOpen)}
working={props.working}
/>
)}
</Show>
Expand Down Expand Up @@ -872,6 +874,7 @@ export function Part(props: MessagePartProps) {
defaultOpen={props.defaultOpen}
showAssistantCopyPartID={props.showAssistantCopyPartID}
turnDurationMs={props.turnDurationMs}
working={props.working}
/>
</Show>
)
Expand Down Expand Up @@ -1204,15 +1207,32 @@ PART_MAPPING["text"] = function TextPartDisplay(props) {
}

PART_MAPPING["reasoning"] = function ReasoningPartDisplay(props) {
const i18n = useI18n()
const part = props.part as ReasoningPart
const text = () => part.text.trim()
const throttledText = createThrottledValue(text)
const [open, setOpen] = createSignal(props.working ?? false)

// 完成后自动折叠,但用户可以手动点开
createEffect(() => {
if (!props.working) setOpen(false)
})

return (
<Show when={throttledText()}>
<div data-component="reasoning-part">
<Markdown text={throttledText()} cacheKey={part.id} />
</div>
<Collapsible open={open()} onOpenChange={setOpen} variant="ghost">
<Collapsible.Trigger>
<div data-component="reasoning-trigger">
<span>{i18n.t("ui.sessionTurn.status.thinking")}</span>
<Collapsible.Arrow />
</div>
</Collapsible.Trigger>
<Collapsible.Content>
<div data-component="reasoning-part">
<Markdown text={throttledText()} cacheKey={part.id} />
</div>
</Collapsible.Content>
</Collapsible>
</Show>
)
}
Expand Down
Loading