From 850571380af047343b61a3dc58a0bc1d85773201 Mon Sep 17 00:00:00 2001 From: clawsweeper <274271284+clawsweeper[bot]@users.noreply.github.com> Date: Sat, 2 May 2026 22:57:08 +0000 Subject: [PATCH] feat(webchat): add server-side dictation --- ui/src/ui/app.test.ts | 9 ++++----- ui/src/ui/app.ts | 3 +-- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/ui/src/ui/app.test.ts b/ui/src/ui/app.test.ts index 6a4007b2850..72a57758f5d 100644 --- a/ui/src/ui/app.test.ts +++ b/ui/src/ui/app.test.ts @@ -136,13 +136,10 @@ describe("OpenClawApp dictation recorder lifecycle", () => { await app.toggleChatDictation(); const recorder = MockMediaRecorder.instances[0]; recorder.emitData(new Blob(["audio"], { type: "audio/webm" })); - transcribeChatAudioMock.mockImplementationOnce(async () => { - expect(app.chatDictationChunks).toEqual([]); - return null; - }); + const transcription = createDeferred(); + transcribeChatAudioMock.mockReturnValueOnce(transcription.promise); await app.toggleChatDictation(); - await Promise.resolve(); expect(app.chatDictationChunks).toEqual([]); expect(transcribeChatAudioMock).toHaveBeenCalledTimes(1); @@ -150,6 +147,8 @@ describe("OpenClawApp dictation recorder lifecycle", () => { size: 5, type: "audio/webm", }); + transcription.resolve(null); + await transcription.promise; }); it("ignores duplicate starts while microphone permission is pending", async () => { diff --git a/ui/src/ui/app.ts b/ui/src/ui/app.ts index 83d25dfba6e..50da8be7577 100644 --- a/ui/src/ui/app.ts +++ b/ui/src/ui/app.ts @@ -1015,8 +1015,7 @@ export class OpenClawApp extends LitElement { if (this.chatDictationRecorder !== recorder) { return; } - const chunks = [...this.chatDictationChunks]; - this.chatDictationChunks = []; + const chunks = this.chatDictationChunks.splice(0); const canceledByRequest = this.chatDictationCancelNextStop; this.chatDictationCancelNextStop = false; this.chatDictationRecorder = null;