mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-09 23:14:32 +00:00
fix(telegram): skip nullish final text sends (land #30969 by @haosenwang1018)
Landed-from: #30969 Contributor: @haosenwang1018 Co-authored-by: Sense_wang <167664334+haosenwang1018@users.noreply.github.com>
This commit is contained in:
@@ -102,6 +102,7 @@ Docs: https://docs.openclaw.ai
|
|||||||
|
|
||||||
### Fixes
|
### Fixes
|
||||||
|
|
||||||
|
- Telegram/Empty final replies: skip outbound send for null/undefined final text payloads without media so Telegram typing indicators do not linger on `text must be non-empty` errors. Landed from contributor PR #30969 by @haosenwang1018. Thanks @haosenwang1018.
|
||||||
- Routing/Binding peer-kind parity: treat `peer.kind` `group` and `channel` as equivalent for binding scope matching (while keeping `direct` separate) so Slack/public channel bindings do not silently fall through. Landed from contributor PR #31135 by @Sid-Qin. Thanks @Sid-Qin.
|
- Routing/Binding peer-kind parity: treat `peer.kind` `group` and `channel` as equivalent for binding scope matching (while keeping `direct` separate) so Slack/public channel bindings do not silently fall through. Landed from contributor PR #31135 by @Sid-Qin. Thanks @Sid-Qin.
|
||||||
- Agents/FS workspace default: honor documented host file-tool default `tools.fs.workspaceOnly=false` when unset so host `write`/`edit` calls are not incorrectly workspace-restricted unless explicitly enabled. Landed from contributor PR #31128 by @SaucePackets. Thanks @SaucePackets.
|
- Agents/FS workspace default: honor documented host file-tool default `tools.fs.workspaceOnly=false` when unset so host `write`/`edit` calls are not incorrectly workspace-restricted unless explicitly enabled. Landed from contributor PR #31128 by @SaucePackets. Thanks @SaucePackets.
|
||||||
- Gateway/CLI session recovery: handle expired CLI session IDs gracefully by clearing stale session state and retrying without crashing gateway runs. Landed from contributor PR #31090 by @frankekn. Thanks @frankekn.
|
- Gateway/CLI session recovery: handle expired CLI session IDs gracefully by clearing stale session state and retrying without crashing gateway runs. Landed from contributor PR #31090 by @frankekn. Thanks @frankekn.
|
||||||
|
|||||||
@@ -1064,6 +1064,26 @@ describe("dispatchTelegramMessage draft streaming", () => {
|
|||||||
expect(editMessageTelegram).not.toHaveBeenCalled();
|
expect(editMessageTelegram).not.toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it.each([undefined, null] as const)(
|
||||||
|
"skips outbound send when final payload text is %s and has no media",
|
||||||
|
async (emptyText) => {
|
||||||
|
setupDraftStreams({ answerMessageId: 999 });
|
||||||
|
dispatchReplyWithBufferedBlockDispatcher.mockImplementation(async ({ dispatcherOptions }) => {
|
||||||
|
await dispatcherOptions.deliver(
|
||||||
|
{ text: emptyText as unknown as string },
|
||||||
|
{ kind: "final" },
|
||||||
|
);
|
||||||
|
return { queuedFinal: true };
|
||||||
|
});
|
||||||
|
deliverReplies.mockResolvedValue({ delivered: true });
|
||||||
|
|
||||||
|
await dispatchWithContext({ context: createContext(), streamMode: "partial" });
|
||||||
|
|
||||||
|
expect(deliverReplies).not.toHaveBeenCalled();
|
||||||
|
expect(editMessageTelegram).not.toHaveBeenCalled();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
it("keeps reasoning and answer streaming in separate preview lanes", async () => {
|
it("keeps reasoning and answer streaming in separate preview lanes", async () => {
|
||||||
const { answerDraftStream, reasoningDraftStream } = setupDraftStreams({
|
const { answerDraftStream, reasoningDraftStream } = setupDraftStreams({
|
||||||
answerMessageId: 999,
|
answerMessageId: 999,
|
||||||
|
|||||||
@@ -548,7 +548,7 @@ export const dispatchTelegramMessage = async ({
|
|||||||
reasoningStepState.resetForNextStep();
|
reasoningStepState.resetForNextStep();
|
||||||
}
|
}
|
||||||
const canSendAsIs =
|
const canSendAsIs =
|
||||||
hasMedia || typeof payload.text !== "string" || payload.text.length > 0;
|
hasMedia || (typeof payload.text === "string" && payload.text.length > 0);
|
||||||
if (!canSendAsIs) {
|
if (!canSendAsIs) {
|
||||||
if (info.kind === "final") {
|
if (info.kind === "final") {
|
||||||
await flushBufferedFinalAnswer();
|
await flushBufferedFinalAnswer();
|
||||||
|
|||||||
Reference in New Issue
Block a user