fix(vscode): stabilize shell command streaming (#10127)

This commit is contained in:
Marius
2026-05-11 09:27:41 +02:00
committed by GitHub
parent fc6ce735c9
commit 3259008074
3 changed files with 30 additions and 13 deletions
+5
View File
@@ -0,0 +1,5 @@
---
"kilo-code": patch
---
Keep shell command blocks stable while output streams so pending animations and expanded state do not reset.
@@ -67,19 +67,26 @@ interface AssistantMessageProps {
feedback?: MessageFeedbackControls
}
type ToolStateProps = {
input?: Record<string, unknown>
metadata?: Record<string, unknown>
output?: string
status?: string
}
function TodoToolCard(props: { part: ToolPart }) {
const render = ToolRegistry.render(props.part.tool)
const state = props.part.state as any
const state = () => props.part.state as ToolStateProps
return (
<Show when={render}>
{(renderFn) => (
<Dynamic
component={renderFn()}
input={state?.input ?? {}}
metadata={state?.metadata ?? {}}
input={state()?.input ?? {}}
metadata={state()?.metadata ?? {}}
tool={props.part.tool}
output={state?.output}
status={state?.status}
output={state()?.output}
status={state()?.status}
defaultOpen
reveal={false}
/>
@@ -90,23 +97,23 @@ function TodoToolCard(props: { part: ToolPart }) {
function BashToolCard(props: { part: ToolPart; defaultOpen: boolean }) {
const render = ToolRegistry.render(props.part.tool)
const state = props.part.state as any
const state = () => props.part.state as ToolStateProps
return (
<Show when={render}>
{(card) => (
<Dynamic
component={card() as unknown as Component<Record<string, unknown>>}
input={state?.input ?? {}}
metadata={state?.metadata ?? {}}
input={state()?.input ?? {}}
metadata={state()?.metadata ?? {}}
partMetadata={props.part.metadata ?? {}}
tool={props.part.tool}
partID={props.part.id}
callID={props.part.callID}
output={state?.output}
status={state?.status}
output={state()?.output}
status={state()?.status}
defaultOpen={props.defaultOpen}
animate
reveal={state?.status === "pending" || state?.status === "running"}
reveal={state()?.status === "pending" || state()?.status === "running"}
/>
)}
</Show>
@@ -1192,8 +1192,13 @@ export const SessionProvider: ParentComponent = (props) => {
// Append text delta to text or reasoning parts
;(existing as { text: string }).text += delta.textDelta
} else {
// Replace entire part
parts[effectiveMessageID][existingIndex] = part
// Preserve the proxy identity so Solid does not remount tool UI
// during streaming updates and restart pending animations.
const target = existing as unknown as Record<string, unknown>
for (const key of Object.keys(target)) {
if (!(key in part)) delete target[key]
}
Object.assign(existing, part)
}
} else {
// Add new part