diff --git a/packages/ui/src/components/tool-call.tsx b/packages/ui/src/components/tool-call.tsx index 5dd398ac..c6f51592 100644 --- a/packages/ui/src/components/tool-call.tsx +++ b/packages/ui/src/components/tool-call.tsx @@ -172,7 +172,9 @@ export default function ToolCall(props: ToolCallProps) { }) const [userExpanded, setUserExpanded] = createSignal(null) - const [inputExpanded, setInputExpanded] = createSignal(false) + const [inputVisible, setInputVisible] = createSignal(false) + const [inputSectionExpanded, setInputSectionExpanded] = createSignal(false) + const [outputSectionExpanded, setOutputSectionExpanded] = createSignal(true) const isPermissionActive = createMemo(() => { const pending = pendingPermission() @@ -589,13 +591,19 @@ export default function ToolCall(props: ToolCallProps) { }) } - const handleToggleInput = (event: MouseEvent) => { + const handleToggleInputVisibility = (event: MouseEvent) => { event.preventDefault() event.stopPropagation() if (!expanded()) { toggle() } - setInputExpanded((prev) => !prev) + setInputVisible((prev) => { + const next = !prev + if (!next) { + setInputSectionExpanded(false) + } + return next + }) } const renderer = createMemo(() => resolveToolRenderer(toolName())) @@ -728,17 +736,6 @@ export default function ToolCall(props: ToolCallProps) { return renderer().renderBody(rendererContext) } - const renderToolBodyWithHeader = () => { - const body = renderToolBody() - if (!body) return null - return ( - <> -
{t("toolCall.io.output")}
- {body} - - ) - } - async function handlePermissionResponse(permission: PermissionRequestLike, response: "once" | "always" | "reject") { if (!permission) return setPermissionSubmitting(true) @@ -854,14 +851,14 @@ export default function ToolCall(props: ToolCallProps) { @@ -884,34 +881,48 @@ export default function ToolCall(props: ToolCallProps) { {expanded() && (
- - {(() => { - const content = toolInputMarkdown() - if (!content) return null - return ( - <> -
{t("toolCall.io.input")}
- {renderMarkdownContent({ content, cacheKey: "input" })} - - ) - })()} + + + + + {(() => { + const content = toolInputMarkdown() + if (!content) return null + return renderMarkdownContent({ content, cacheKey: "input" }) + })()} + - - {renderToolBodyWithHeader()} + + + + {renderToolBody()} + {renderError()} + + +
+ + {t("toolCall.pending.waitingToRun")} +
+
- - {renderError()} - + {renderPermissionBlock()} {renderQuestionBlock()} - - -
- - {t("toolCall.pending.waitingToRun")} -
-
)} diff --git a/packages/ui/src/styles/messaging/tool-call.css b/packages/ui/src/styles/messaging/tool-call.css index 5aed411d..b869bbf3 100644 --- a/packages/ui/src/styles/messaging/tool-call.css +++ b/packages/ui/src/styles/messaging/tool-call.css @@ -232,12 +232,33 @@ font-size: var(--font-size-xs); } -.tool-call-io-header { - @apply flex items-center justify-between gap-3 px-3 py-2; +.tool-call-io-toggle { + display: flex; + align-items: center; + justify-content: space-between; + gap: 0.75rem; + padding: 0.5rem; background-color: var(--surface-secondary); + border: none; border-top: 1px solid var(--tool-call-border-color); font-family: var(--font-family-mono); font-size: 13px; + color: inherit; + cursor: pointer; +} + +.tool-call-io-toggle::before { + content: "▶"; + font-size: 11px; + margin-right: 0.35rem; + color: var(--text-secondary); +} + +.tool-call-io-toggle[aria-expanded="true"]::before { + content: "▼"; +} + +.tool-call-io-title { font-weight: var(--font-weight-semibold); color: var(--text-primary); }