





























@@ -6,6 +6,7 @@
66import fs from "node:fs";
77import os from "node:os";
88import path from "node:path";
9+import { pathToFileURL } from "node:url";
910import { maybeApplyTtsToPayload } from "../../packages/speech-core/src/tts.ts";
1011import { buildWebchatAudioContentBlocksFromReplyPayloads } from "../../src/gateway/server-methods/chat-webchat-media.ts";
1112import { createPluginRecord } from "../../src/plugins/loader-records.ts";
@@ -22,8 +23,16 @@ const noopLogger = {
2223debug() {},
2324};
242526+export function cleanupProofArtifacts({ mediaPath, prefsPath }) {
27+if (mediaPath) {
28+fs.rmSync(path.dirname(mediaPath), { recursive: true, force: true });
29+}
30+fs.rmSync(prefsPath, { force: true });
31+}
32+2533async function main() {
2634resetPluginRuntimeStateForTest();
35+let mediaPath;
2736const pluginRegistry = createPluginRegistry({
2837logger: noopLogger,
2938runtime: {},
@@ -62,65 +71,65 @@ async function main() {
6271},
6372};
647365-const accumulatedBlockText =
66-"WebChat streams block text; dispatch synthesizes one TTS tail with kind final.";
67-const blockResult = await maybeApplyTtsToPayload({
68-payload: { text: accumulatedBlockText },
69- cfg,
70-channel: "webchat",
71-kind: "block",
72-});
73-console.log("maybeApplyTtsToPayload(kind=block).mediaUrl =", blockResult.mediaUrl ?? "(none)");
74-75-const tailResult = await maybeApplyTtsToPayload({
76-payload: { text: accumulatedBlockText },
77- cfg,
78-channel: "webchat",
79-kind: "final",
80-});
81-console.log("maybeApplyTtsToPayload(kind=final).mediaUrl =", tailResult.mediaUrl ?? "(none)");
82-console.log(
83-"maybeApplyTtsToPayload(kind=final).trustedLocalMedia =",
84-tailResult.trustedLocalMedia ?? false,
85-);
74+try {
75+const accumulatedBlockText =
76+"WebChat streams block text; dispatch synthesizes one TTS tail with kind final.";
77+const blockResult = await maybeApplyTtsToPayload({
78+payload: { text: accumulatedBlockText },
79+ cfg,
80+channel: "webchat",
81+kind: "block",
82+});
83+console.log("maybeApplyTtsToPayload(kind=block).mediaUrl =", blockResult.mediaUrl ?? "(none)");
868487-const mediaPath = tailResult.mediaUrl;
88-if (!mediaPath || !fs.existsSync(mediaPath)) {
89-throw new Error("expected final-mode tail TTS to write a local media file");
90-}
85+const tailResult = await maybeApplyTtsToPayload({
86+payload: { text: accumulatedBlockText },
87+ cfg,
88+channel: "webchat",
89+kind: "final",
90+});
91+console.log("maybeApplyTtsToPayload(kind=final).mediaUrl =", tailResult.mediaUrl ?? "(none)");
92+console.log(
93+"maybeApplyTtsToPayload(kind=final).trustedLocalMedia =",
94+tailResult.trustedLocalMedia ?? false,
95+);
919692-// Same shape as dispatch-from-config accumulated block TTS-only final payload.
93-const ttsOnlyPayload = {
94-mediaUrl: tailResult.mediaUrl,
95-audioAsVoice: tailResult.audioAsVoice,
96-spokenText: accumulatedBlockText,
97-trustedLocalMedia: true,
98-};
99-console.log("dispatch ttsOnlyPayload.trustedLocalMedia =", ttsOnlyPayload.trustedLocalMedia);
97+mediaPath = tailResult.mediaUrl;
98+if (!mediaPath || !fs.existsSync(mediaPath)) {
99+throw new Error("expected final-mode tail TTS to write a local media file");
100+}
100101101-const localRoots = [path.dirname(mediaPath)];
102-const trustedBlocks = await buildWebchatAudioContentBlocksFromReplyPayloads([ttsOnlyPayload], {
103- localRoots,
104-});
105-const untrustedBlocks = await buildWebchatAudioContentBlocksFromReplyPayloads(
106-[{ mediaUrl: mediaPath }],
107-{ localRoots },
108-);
109-console.log(
110-"buildWebchatAudioContentBlocksFromReplyPayloads(ttsOnlyPayload).length =",
111-trustedBlocks.length,
112-);
113-console.log(
114-"buildWebchatAudioContentBlocksFromReplyPayloads(untrusted).length =",
115-untrustedBlocks.length,
116-);
102+// Same shape as dispatch-from-config accumulated block TTS-only final payload.
103+const ttsOnlyPayload = {
104+mediaUrl: tailResult.mediaUrl,
105+audioAsVoice: tailResult.audioAsVoice,
106+spokenText: accumulatedBlockText,
107+trustedLocalMedia: true,
108+};
109+console.log("dispatch ttsOnlyPayload.trustedLocalMedia =", ttsOnlyPayload.trustedLocalMedia);
117110118-fs.rmSync(path.dirname(mediaPath), { recursive: true, force: true });
119-try {
120-fs.unlinkSync(prefsPath);
121-} catch {
122-// optional prefs file
111+const localRoots = [path.dirname(mediaPath)];
112+const trustedBlocks = await buildWebchatAudioContentBlocksFromReplyPayloads([ttsOnlyPayload], {
113+ localRoots,
114+});
115+const untrustedBlocks = await buildWebchatAudioContentBlocksFromReplyPayloads(
116+[{ mediaUrl: mediaPath }],
117+{ localRoots },
118+);
119+console.log(
120+"buildWebchatAudioContentBlocksFromReplyPayloads(ttsOnlyPayload).length =",
121+trustedBlocks.length,
122+);
123+console.log(
124+"buildWebchatAudioContentBlocksFromReplyPayloads(untrusted).length =",
125+untrustedBlocks.length,
126+);
127+} finally {
128+cleanupProofArtifacts({ mediaPath, prefsPath });
129+resetPluginRuntimeStateForTest();
123130}
124131}
125132126-await main();
133+if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
134+await main();
135+}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。