fix: strip leading whitespace in block streaming reply path (#16422)

Merged via /review-pr -> /prepare-pr -> /merge-pr.

Prepared head SHA: ec4225c28e
Co-authored-by: mcinteerj <3613653+mcinteerj@users.noreply.github.com>
Co-authored-by: sebslight <19554889+sebslight@users.noreply.github.com>
Reviewed-by: @sebslight
This commit is contained in:
Jake
2026-02-15 16:46:26 +13:00
committed by GitHub
parent d31e0dee55
commit 1712a71a39
3 changed files with 52 additions and 1 deletions

View File

@@ -211,4 +211,54 @@ describe("block streaming", () => {
expect(onBlockReplyStreamMode).not.toHaveBeenCalled();
});
});
it("trims leading whitespace in block-streamed replies", async () => {
await withTempHome(async (home) => {
const seen: string[] = [];
const onBlockReply = vi.fn(async (payload) => {
seen.push(payload.text ?? "");
});
piEmbeddedMock.runEmbeddedPiAgent.mockImplementation(
async (params: RunEmbeddedPiAgentParams) => {
void params.onBlockReply?.({ text: "\n\n Hello from stream" });
return {
payloads: [{ text: "\n\n Hello from stream" }],
meta: {
durationMs: 5,
agentMeta: { sessionId: "s", provider: "p", model: "m" },
},
};
},
);
const res = await getReplyFromConfig(
{
Body: "ping",
From: "+1004",
To: "+2000",
MessageSid: "msg-128",
Provider: "telegram",
},
{
onBlockReply,
disableBlockStreaming: false,
},
{
agents: {
defaults: {
model: "anthropic/claude-opus-4-5",
workspace: path.join(home, "openclaw"),
},
},
channels: { telegram: { allowFrom: ["*"] } },
session: { store: path.join(home, "sessions.json") },
},
);
expect(res).toBeUndefined();
expect(onBlockReply).toHaveBeenCalledTimes(1);
expect(seen).toEqual(["Hello from stream"]);
});
});
});

View File

@@ -414,7 +414,7 @@ export async function runAgentTurnWithFallback(params: {
const blockPayload: ReplyPayload = params.applyReplyToMode({
...taggedPayload,
text: cleaned,
text: cleaned?.trimStart(),
audioAsVoice: Boolean(parsed.audioAsVoice || payload.audioAsVoice),
replyToId: taggedPayload.replyToId ?? parsed.replyToId,
replyToTag: taggedPayload.replyToTag || parsed.replyToTag,