Skip to content

Commit 257d540

Browse files
Keep command text in progress drafts (#93711)
* Keep command text in progress drafts * test(channels): align successful progress drafts --------- Co-authored-by: Vincent Koc <[email protected]>
1 parent ae9ae56 commit 257d540

8 files changed

Lines changed: 72 additions & 17 deletions

File tree

extensions/discord/src/monitor/message-handler.process.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3057,8 +3057,8 @@ describe("processDiscordMessage draft streaming", () => {
30573057
await runProcessDiscordMessage(ctx);
30583058

30593059
const lastUpdate = draftStream.update.mock.calls.at(-1)?.[0];
3060-
expect(lastUpdate).toContain("completed");
3061-
expect(lastUpdate).not.toContain("install dependencies");
3060+
expect(lastUpdate).toContain("install dependencies");
3061+
expect(lastUpdate).not.toContain("completed");
30623062
});
30633063

30643064
it("drops later tool warning finals after progress preview final replies", async () => {

extensions/slack/src/progress-blocks.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ describe("buildSlackProgressDraftBlocks", () => {
134134
],
135135
});
136136

137-
expectLegacyLineBlock(blocks?.[1], "• *Exec*", "command finished · completed");
137+
expectLegacyLineBlock(blocks?.[1], "• *Exec*", "command finished");
138138
expectLegacyLineBlock(blocks?.[2], "• *Exec*", "command failed · exit 1");
139139
});
140140

@@ -243,7 +243,7 @@ describe("native Slack progress stream chunks", () => {
243243
}),
244244
).toEqual([
245245
planUpdate("Shelling..."),
246-
taskUpdate("exec_1", "Exec — command finished · completed", "complete"),
246+
taskUpdate("exec_1", "Exec — command finished", "complete"),
247247
taskUpdate("exec_2", "Exec — command failed · exit 1", "error"),
248248
]);
249249
});

extensions/slack/src/progress-blocks.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,12 @@ function compactChunkText(value: string): string {
5959
}
6060

6161
function lineDetailParts(line: ChannelProgressDraftLine): string[] {
62-
return [line.detail, line.status && !line.detail?.includes(line.status) ? line.status : undefined]
62+
return [
63+
line.detail,
64+
line.status && line.status !== "completed" && !line.detail?.includes(line.status)
65+
? line.status
66+
: undefined,
67+
]
6368
.map((part) => part?.trim())
6469
.filter((part): part is string => Boolean(part));
6570
}

extensions/telegram/src/bot-message-dispatch.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2625,10 +2625,10 @@ describe("dispatchTelegramMessage draft streaming", () => {
26252625
});
26262626

26272627
const lastUpdate = answerDraftStream.updatePreview.mock.calls.at(-1)?.[0];
2628-
expect(lastUpdate?.text).toContain("completed");
26292628
expect(lastUpdate?.text).toContain("install dependencies");
2629+
expect(lastUpdate?.text).not.toContain("completed");
26302630
expect(lastUpdate?.richMessage).toEqual({
2631-
html: "<b>Shelling</b><br><b>🛠️ Exec</b> <code>install dependencies</code> <i>completed</i>",
2631+
html: "<b>Shelling</b><br><b>🛠️ Exec</b> <code>install dependencies</code>",
26322632
skip_entity_detection: true,
26332633
});
26342634
});

extensions/telegram/src/bot-message-dispatch.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -458,7 +458,7 @@ function renderTelegramProgressLine(line: ChannelProgressDraftCompositorLine): s
458458
parts.push(renderTelegramProgressStringLine(text));
459459
}
460460
}
461-
if (line.status && line.status !== line.detail) {
461+
if (line.status && line.status !== "completed" && line.status !== line.detail) {
462462
parts.push(`<i>${escapeTelegramProgressHtml(line.status)}</i>`);
463463
}
464464
return parts.join(" ");

src/channels/streaming.test.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,44 @@ import { describe, expect, it } from "vitest";
22
import { buildChannelProgressDraftLine } from "./streaming.js";
33

44
describe("buildChannelProgressDraftLine", () => {
5+
it("omits generic completed status from successful command output with title", () => {
6+
const line = buildChannelProgressDraftLine(
7+
{
8+
event: "command-output",
9+
toolCallId: "exec-1",
10+
phase: "end",
11+
title: "pwd",
12+
name: "exec",
13+
exitCode: 0,
14+
},
15+
{ commandText: "raw" },
16+
);
17+
18+
expect(line).toMatchObject({
19+
kind: "command-output",
20+
id: "exec-1",
21+
text: "🛠️ pwd",
22+
detail: "pwd",
23+
status: "completed",
24+
});
25+
});
26+
27+
it("uses the tool label when successful command output has no title", () => {
28+
const line = buildChannelProgressDraftLine({
29+
event: "command-output",
30+
phase: "end",
31+
name: "exec",
32+
exitCode: 0,
33+
});
34+
35+
expect(line).toMatchObject({
36+
kind: "command-output",
37+
text: "🛠️ Exec",
38+
status: "completed",
39+
});
40+
expect(line?.detail).toBeUndefined();
41+
});
42+
543
it("keeps command status and title in raw command progress lines", () => {
644
const line = buildChannelProgressDraftLine(
745
{

src/channels/streaming.ts

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,9 @@ function buildCommandOutputProgressLine(
443443
if (!line || !status) {
444444
return line;
445445
}
446+
if (status === "completed") {
447+
return line;
448+
}
446449
if (!line.detail || line.detail === status) {
447450
const statusLine = {
448451
...line,
@@ -1055,11 +1058,14 @@ function getProgressDraftLineText(line: string | ChannelProgressDraftLine): stri
10551058
const label = line.label.trim();
10561059
const detail = line.detail?.trim();
10571060
const status = line.status?.trim();
1061+
const displayStatus = status === "completed" ? undefined : status;
10581062
if (detail) {
10591063
const compactCommandLine =
10601064
line.toolName === "exec" || line.toolName === "bash" || line.toolName === "shell";
1061-
if (line.kind === "command-output" && status && detail !== status) {
1062-
const outputDetail = detail.startsWith(`${status};`) ? detail : `${status}; ${detail}`;
1065+
if (line.kind === "command-output" && displayStatus && detail !== displayStatus) {
1066+
const outputDetail = detail.startsWith(`${displayStatus};`)
1067+
? detail
1068+
: `${displayStatus}; ${detail}`;
10631069
if (compactCommandLine) {
10641070
return `${prefix}${outputDetail}`;
10651071
}
@@ -1070,11 +1076,11 @@ function getProgressDraftLineText(line: string | ChannelProgressDraftLine): stri
10701076
}
10711077
return `${prefix}${detail}`;
10721078
}
1073-
if (status) {
1079+
if (displayStatus) {
10741080
if (label) {
1075-
return `${prefix}${label}: ${status}`;
1081+
return `${prefix}${label}: ${displayStatus}`;
10761082
}
1077-
return `${prefix}${status}`;
1083+
return `${prefix}${displayStatus}`;
10781084
}
10791085
const text = line.text.trim();
10801086
if (!icon && text && text !== label) {

src/plugin-sdk/channel-streaming.test.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -601,10 +601,16 @@ describe("channel-streaming", () => {
601601
expect(updated[0]).toMatchObject({
602602
id: "tool:call-1-output",
603603
kind: "command-output",
604-
status: "completed",
605604
detail: "install dependencies",
606-
text: "🛠️ completed; install dependencies",
605+
status: "completed",
606+
text: "🛠️ install dependencies",
607607
});
608+
expect(
609+
formatChannelProgressDraftText({
610+
lines: updated,
611+
entry: { streaming: { progress: { label: false } } },
612+
}),
613+
).toBe("🛠️ install dependencies");
608614

609615
const recoveredItemLine = buildChannelProgressDraftLine({
610616
event: "item",
@@ -634,9 +640,9 @@ describe("channel-streaming", () => {
634640
{
635641
id: "command-2",
636642
kind: "command-output",
637-
status: "completed",
638643
detail: "install dependencies failed",
639-
text: "🛠️ completed; install dependencies failed",
644+
status: "completed",
645+
text: "🛠️ install dependencies failed",
640646
},
641647
]);
642648
});

0 commit comments

Comments
 (0)