diff --git a/packages/cli/src/ui/components/messages/ShellToolMessage.test.tsx b/packages/cli/src/ui/components/messages/ShellToolMessage.test.tsx
index 233f905760..76b8f95ce7 100644
--- a/packages/cli/src/ui/components/messages/ShellToolMessage.test.tsx
+++ b/packages/cli/src/ui/components/messages/ShellToolMessage.test.tsx
@@ -137,6 +137,14 @@ describe('', () => {
{ status: CoreToolCallStatus.Error, resultDisplay: 'Error output' },
undefined,
],
+ [
+ 'renders in Cancelled state with partial output',
+ {
+ status: CoreToolCallStatus.Cancelled,
+ resultDisplay: 'Partial output before cancellation',
+ },
+ undefined,
+ ],
[
'renders in Alternate Buffer mode while focused',
{
diff --git a/packages/cli/src/ui/components/messages/__snapshots__/ShellToolMessage.test.tsx.snap b/packages/cli/src/ui/components/messages/__snapshots__/ShellToolMessage.test.tsx.snap
index b51d7c435b..3fa8a62bf8 100644
--- a/packages/cli/src/ui/components/messages/__snapshots__/ShellToolMessage.test.tsx.snap
+++ b/packages/cli/src/ui/components/messages/__snapshots__/ShellToolMessage.test.tsx.snap
@@ -309,6 +309,14 @@ exports[` > Snapshots > renders in Alternate Buffer mode whi
"
`;
+exports[` > Snapshots > renders in Cancelled state with partial output 1`] = `
+"╭──────────────────────────────────────────────────────────────────────────────╮
+│ - Shell Command A shell command │
+│ │
+│ Partial output before cancellation │
+"
+`;
+
exports[` > Snapshots > renders in Error state 1`] = `
"╭──────────────────────────────────────────────────────────────────────────────╮
│ x Shell Command A shell command │
diff --git a/packages/core/src/scheduler/state-manager.ts b/packages/core/src/scheduler/state-manager.ts
index 005f3004d6..428b7f87a8 100644
--- a/packages/core/src/scheduler/state-manager.ts
+++ b/packages/core/src/scheduler/state-manager.ts
@@ -477,13 +477,24 @@ export class SchedulerStateManager {
}
}
+ // Capture any existing live output so it isn't lost when forcing cancellation.
+ let existingOutput: ToolResultDisplay | undefined = undefined;
+ if (call.status === CoreToolCallStatus.Executing && call.liveOutput) {
+ existingOutput = call.liveOutput;
+ }
+
if (isToolCallResponseInfo(reason)) {
+ const finalResponse = { ...reason };
+ if (!finalResponse.resultDisplay) {
+ finalResponse.resultDisplay = resultDisplay ?? existingOutput;
+ }
+
return {
request: call.request,
tool: call.tool,
invocation: call.invocation,
status: CoreToolCallStatus.Cancelled,
- response: reason,
+ response: finalResponse,
durationMs: startTime ? Date.now() - startTime : undefined,
outcome: call.outcome,
schedulerId: call.schedulerId,
@@ -508,7 +519,7 @@ export class SchedulerStateManager {
},
},
],
- resultDisplay,
+ resultDisplay: resultDisplay ?? existingOutput,
error: undefined,
errorType: undefined,
contentLength: errorMessage.length,