diff --git a/extensions/speech-core/src/tts.test.ts b/extensions/speech-core/src/tts.test.ts index ba5a0290cb2..4d50ce1f9a0 100644 --- a/extensions/speech-core/src/tts.test.ts +++ b/extensions/speech-core/src/tts.test.ts @@ -210,7 +210,7 @@ async function expectTtsPayloadResult(params: { expect(result.audioAsVoice).toBe(params.audioAsVoice); expect(result.mediaUrl).toMatch(new RegExp(`voice-\\d+\\.${params.mediaExtension ?? "ogg"}$`)); expect(result.spokenText).toBe(params.text); - expect(result.trustedLocalMedia).toBe(true); + expect((result as { trustedLocalMedia?: boolean }).trustedLocalMedia).toBe(true); mediaDir = result.mediaUrl ? path.dirname(result.mediaUrl) : undefined; } finally { @@ -453,7 +453,7 @@ describe("speech-core native voice-note routing", () => { }); expect(synthesizeMock).not.toHaveBeenCalled(); - expect(result.trustedLocalMedia).toBeUndefined(); + expect((result as { trustedLocalMedia?: boolean }).trustedLocalMedia).toBeUndefined(); expect(result.text).toBe("WebChat block stream chunks defer TTS to the final tail."); }); @@ -468,7 +468,7 @@ describe("speech-core native voice-note routing", () => { }); expect(synthesizeMock).not.toHaveBeenCalled(); - expect(result.trustedLocalMedia).toBeUndefined(); + expect((result as { trustedLocalMedia?: boolean }).trustedLocalMedia).toBeUndefined(); expect(result.text).toBe("Intermediate tool output should not be spoken."); }); diff --git a/extensions/speech-core/src/tts.ts b/extensions/speech-core/src/tts.ts index 0638a1caf5c..af3a74c5ab6 100644 --- a/extensions/speech-core/src/tts.ts +++ b/extensions/speech-core/src/tts.ts @@ -1850,7 +1850,7 @@ export async function maybeApplyTtsToPayload(params: { audioAsVoice: result.audioAsVoice || params.payload.audioAsVoice, spokenText: textForAudio, trustedLocalMedia: true, - }; + } as ReplyPayload; } lastTtsAttempt = { diff --git a/scripts/repro/webchat-auto-tts-live-proof.mjs b/scripts/repro/webchat-auto-tts-live-proof.mjs index a74324fd8fd..8a4ee9f065a 100644 --- a/scripts/repro/webchat-auto-tts-live-proof.mjs +++ b/scripts/repro/webchat-auto-tts-live-proof.mjs @@ -89,16 +89,14 @@ async function main() { throw new Error("expected final-mode tail TTS to write a local media file"); } + // Same shape as dispatch-from-config accumulated block TTS-only final payload. const ttsOnlyPayload = { mediaUrl: tailResult.mediaUrl, audioAsVoice: tailResult.audioAsVoice, spokenText: accumulatedBlockText, - trustedLocalMedia: tailResult.trustedLocalMedia, + trustedLocalMedia: true, }; - console.log( - "dispatch ttsOnlyPayload.trustedLocalMedia =", - ttsOnlyPayload.trustedLocalMedia ?? false, - ); + console.log("dispatch ttsOnlyPayload.trustedLocalMedia =", ttsOnlyPayload.trustedLocalMedia); const localRoots = [path.dirname(mediaPath)]; const trustedBlocks = await buildWebchatAudioContentBlocksFromReplyPayloads([ttsOnlyPayload], { diff --git a/src/auto-reply/reply/dispatch-from-config.ts b/src/auto-reply/reply/dispatch-from-config.ts index bad231cf6d8..0bcbe5232bf 100644 --- a/src/auto-reply/reply/dispatch-from-config.ts +++ b/src/auto-reply/reply/dispatch-from-config.ts @@ -1700,7 +1700,7 @@ export async function dispatchReplyFromConfig( mediaUrl: ttsSyntheticReply.mediaUrl, audioAsVoice: ttsSyntheticReply.audioAsVoice, spokenText: accumulatedBlockTtsText, - trustedLocalMedia: ttsSyntheticReply.trustedLocalMedia, + trustedLocalMedia: true, }; const normalizedTtsOnlyPayload = await normalizeReplyMediaPayload(ttsOnlyPayload); const result = await routeReplyToOriginating(normalizedTtsOnlyPayload); diff --git a/src/plugin-sdk/reply-payload.ts b/src/plugin-sdk/reply-payload.ts index 66203b7c284..ed0b5147c24 100644 --- a/src/plugin-sdk/reply-payload.ts +++ b/src/plugin-sdk/reply-payload.ts @@ -6,7 +6,7 @@ import { normalizeLowercaseStringOrEmpty, readStringValue } from "../shared/stri export type { MediaPayload, MediaPayloadInput } from "../channels/plugins/media-payload.js"; export { buildMediaPayload } from "../channels/plugins/media-payload.js"; -export type ReplyPayload = InternalReplyPayload; +export type ReplyPayload = Omit; export type OutboundReplyPayload = { text?: string;