mirror of
https://github.com/Kilo-Org/kilocode.git
synced 2026-09-01 15:32:11 +08:00
fix(vscode): stabilize shell command streaming (#10127)
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user