






















@@ -378,7 +378,7 @@ describe("DiscordVoiceManager", () => {
378378379379const lastMockCall = (source: MockCallSource, label: string) => {
380380const calls = Array.from(source.mock.calls);
381-const call = calls.at(-1);
381+const call = calls[calls.length - 1];
382382if (!call) {
383383throw new Error(`expected mock call: ${label}`);
384384}
@@ -405,6 +405,18 @@ describe("DiscordVoiceManager", () => {
405405`agent command args ${index}`,
406406);
407407408+const lastRealtimeBridgeParams = () =>
409+requireRecord(
410+lastMockCall(
411+createRealtimeVoiceBridgeSessionMock as unknown as MockCallSource,
412+"realtime bridge",
413+)[0],
414+"realtime bridge params",
415+);
416+417+const lastAudioResourceInput = () =>
418+lastMockCall(createAudioResourceMock as unknown as MockCallSource, "audio resource")[0];
419+408420const lastTtsArgs = () =>
409421requireRecord(
410422lastMockCall(textToSpeechMock as unknown as MockCallSource, "tts call")[0],
@@ -727,7 +739,7 @@ describe("DiscordVoiceManager", () => {
727739728740const player = getLastAudioPlayer();
729741const entry = getSessionEntry(manager);
730-const bridgeParams = createRealtimeVoiceBridgeSessionMock.mock.calls.at(-1)?.[0] as
742+const bridgeParams = lastRealtimeBridgeParams() as
731743| {
732744audioSink?: {
733745sendAudio: (audio: Buffer) => void;
@@ -784,7 +796,7 @@ describe("DiscordVoiceManager", () => {
784796) => { close: () => void; sendInputAudio: (audio: Buffer) => void };
785797};
786798};
787-const bridgeParams = createRealtimeVoiceBridgeSessionMock.mock.calls.at(-1)?.[0] as
799+const bridgeParams = lastRealtimeBridgeParams() as
788800| {
789801audioSink?: {
790802sendAudio: (audio: Buffer) => void;
@@ -1059,7 +1071,7 @@ describe("DiscordVoiceManager", () => {
10591071model: "gpt-realtime-2",
10601072voice: "cedar",
10611073});
1062-const bridgeParams = createRealtimeVoiceBridgeSessionMock.mock.calls.at(-1)?.[0] as
1074+const bridgeParams = lastRealtimeBridgeParams() as
10631075| {
10641076autoRespondToAudio?: boolean;
10651077instructions?: string;
@@ -1121,7 +1133,7 @@ describe("DiscordVoiceManager", () => {
11211133});
1122113411231135await manager.join({ guildId: "g1", channelId: "1001" });
1124-const bridgeParams = createRealtimeVoiceBridgeSessionMock.mock.calls.at(-1)?.[0] as
1136+const bridgeParams = lastRealtimeBridgeParams() as
11251137| {
11261138onToolCall?: (
11271139event: {
@@ -1189,7 +1201,7 @@ describe("DiscordVoiceManager", () => {
11891201on: ReturnType<typeof vi.fn>;
11901202play: ReturnType<typeof vi.fn>;
11911203};
1192-const bridgeParams = createRealtimeVoiceBridgeSessionMock.mock.calls.at(-1)?.[0] as
1204+const bridgeParams = lastRealtimeBridgeParams() as
11931205| {
11941206audioSink?: {
11951207sendAudio: (audio: Buffer) => void;
@@ -1201,9 +1213,7 @@ describe("DiscordVoiceManager", () => {
12011213bridgeParams?.audioSink?.sendAudio(Buffer.alloc(480));
12021214expect(createAudioResourceMock).toHaveBeenCalledTimes(1);
12031215expect(player.play).toHaveBeenCalledTimes(1);
1204-const firstStream = createAudioResourceMock.mock.calls.at(-1)?.[0] as
1205-| { writableEnded?: boolean }
1206-| undefined;
1216+const firstStream = lastAudioResourceInput() as { writableEnded?: boolean } | undefined;
12071217expect(firstStream?.writableEnded).toBe(false);
12081218bridgeParams?.onEvent?.({ direction: "server", type: "response.done" });
12091219expect(firstStream?.writableEnded).toBe(true);
@@ -1287,7 +1297,7 @@ describe("DiscordVoiceManager", () => {
12871297);
12881298nonOwnerTurn?.sendInputAudio(Buffer.alloc(8));
128912991290-const bridgeParams = createRealtimeVoiceBridgeSessionMock.mock.calls.at(-1)?.[0] as
1300+const bridgeParams = lastRealtimeBridgeParams() as
12911301| {
12921302onTranscript?: (role: "user" | "assistant", text: string, isFinal: boolean) => void;
12931303onEvent?: (event: { direction: "server"; type: string }) => void;
@@ -1328,7 +1338,7 @@ describe("DiscordVoiceManager", () => {
13281338) => { close: () => void; sendInputAudio: (audio: Buffer) => void };
13291339};
13301340};
1331-const bridgeParams = createRealtimeVoiceBridgeSessionMock.mock.calls.at(-1)?.[0] as
1341+const bridgeParams = lastRealtimeBridgeParams() as
13321342| {
13331343onTranscript?: (role: "user" | "assistant", text: string, isFinal: boolean) => void;
13341344onEvent?: (event: { direction: "server"; type: string }) => void;
@@ -1382,7 +1392,7 @@ describe("DiscordVoiceManager", () => {
13821392) => { close: () => void; sendInputAudio: (audio: Buffer) => void };
13831393};
13841394};
1385-const bridgeParams = createRealtimeVoiceBridgeSessionMock.mock.calls.at(-1)?.[0] as
1395+const bridgeParams = lastRealtimeBridgeParams() as
13861396| {
13871397onTranscript?: (role: "user" | "assistant", text: string, isFinal: boolean) => void;
13881398}
@@ -1461,7 +1471,7 @@ describe("DiscordVoiceManager", () => {
14611471const player = getLastAudioPlayer() as {
14621472on: ReturnType<typeof vi.fn>;
14631473};
1464-const bridgeParams = createRealtimeVoiceBridgeSessionMock.mock.calls.at(-1)?.[0] as
1474+const bridgeParams = lastRealtimeBridgeParams() as
14651475| {
14661476audioSink?: { sendAudio: (audio: Buffer) => void };
14671477onEvent?: (event: { direction: "server"; type: string }) => void;
@@ -1500,7 +1510,7 @@ describe("DiscordVoiceManager", () => {
15001510expectUserMessageNotIncludes("third answer");
1501151115021512bridgeParams?.onEvent?.({ direction: "server", type: "response.done" });
1503-const firstStream = createAudioResourceMock.mock.calls.at(-1)?.[0] as PassThrough | undefined;
1513+const firstStream = lastAudioResourceInput() as PassThrough | undefined;
15041514await vi.waitFor(() => expect(firstStream?.writableEnded).toBe(true));
15051515await new Promise<void>((resolve) => setImmediate(resolve));
15061516expectUserMessageNotIncludes("second answer");
@@ -1514,7 +1524,7 @@ describe("DiscordVoiceManager", () => {
1514152415151525bridgeParams?.audioSink?.sendAudio(Buffer.alloc(480));
15161526bridgeParams?.onEvent?.({ direction: "server", type: "response.done" });
1517-const secondStream = createAudioResourceMock.mock.calls.at(-1)?.[0] as PassThrough | undefined;
1527+const secondStream = lastAudioResourceInput() as PassThrough | undefined;
15181528await vi.waitFor(() => expect(secondStream?.writableEnded).toBe(true));
15191529await new Promise<void>((resolve) => setImmediate(resolve));
15201530expectUserMessageNotIncludes("third answer");
@@ -1546,7 +1556,7 @@ describe("DiscordVoiceManager", () => {
15461556};
15471557};
15481558const player = getLastAudioPlayer();
1549-const bridgeParams = createRealtimeVoiceBridgeSessionMock.mock.calls.at(-1)?.[0] as
1559+const bridgeParams = lastRealtimeBridgeParams() as
15501560| {
15511561audioSink?: { sendAudio: (audio: Buffer) => void };
15521562onEvent?: (event: { direction: "server"; type: string }) => void;
@@ -1582,7 +1592,7 @@ describe("DiscordVoiceManager", () => {
15821592expectUserMessageNotIncludes("second answer");
1583159315841594bridgeParams?.onEvent?.({ direction: "server", type: "response.done" });
1585-const firstStream = createAudioResourceMock.mock.calls.at(-1)?.[0] as PassThrough | undefined;
1595+const firstStream = lastAudioResourceInput() as PassThrough | undefined;
15861596await vi.waitFor(() => expect(firstStream?.writableEnded).toBe(true));
15871597await new Promise<void>((resolve) => setImmediate(resolve));
15881598expectUserMessageNotIncludes("second answer");
@@ -1616,7 +1626,7 @@ describe("DiscordVoiceManager", () => {
16161626) => { close: () => void; sendInputAudio: (audio: Buffer) => void };
16171627};
16181628};
1619-const bridgeParams = createRealtimeVoiceBridgeSessionMock.mock.calls.at(-1)?.[0] as
1629+const bridgeParams = lastRealtimeBridgeParams() as
16201630| {
16211631onToolCall?: (
16221632event: {
@@ -1691,7 +1701,7 @@ describe("DiscordVoiceManager", () => {
16911701) => { close: () => void; sendInputAudio: (audio: Buffer) => void };
16921702};
16931703};
1694-const bridgeParams = createRealtimeVoiceBridgeSessionMock.mock.calls.at(-1)?.[0] as
1704+const bridgeParams = lastRealtimeBridgeParams() as
16951705| {
16961706onToolCall?: (
16971707event: {
@@ -1765,7 +1775,7 @@ describe("DiscordVoiceManager", () => {
17651775) => { close: () => void; sendInputAudio: (audio: Buffer) => void };
17661776};
17671777};
1768-const bridgeParams = createRealtimeVoiceBridgeSessionMock.mock.calls.at(-1)?.[0] as
1778+const bridgeParams = lastRealtimeBridgeParams() as
17691779| {
17701780onToolCall?: (
17711781event: {
@@ -1837,7 +1847,7 @@ describe("DiscordVoiceManager", () => {
18371847) => { close: () => void; sendInputAudio: (audio: Buffer) => void };
18381848};
18391849};
1840-const bridgeParams = createRealtimeVoiceBridgeSessionMock.mock.calls.at(-1)?.[0] as
1850+const bridgeParams = lastRealtimeBridgeParams() as
18411851| {
18421852onToolCall?: (
18431853event: {
@@ -1919,7 +1929,7 @@ describe("DiscordVoiceManager", () => {
19191929) => { close: () => void; sendInputAudio: (audio: Buffer) => void };
19201930};
19211931};
1922-const bridgeParams = createRealtimeVoiceBridgeSessionMock.mock.calls.at(-1)?.[0] as
1932+const bridgeParams = lastRealtimeBridgeParams() as
19231933| {
19241934onToolCall?: (
19251935event: {
@@ -2021,7 +2031,7 @@ describe("DiscordVoiceManager", () => {
20212031);
20222032guestTurn?.sendInputAudio(Buffer.alloc(8));
202320332024-const bridgeParams = createRealtimeVoiceBridgeSessionMock.mock.calls.at(-1)?.[0] as
2034+const bridgeParams = lastRealtimeBridgeParams() as
20252035| {
20262036onTranscript?: (role: "user" | "assistant", text: string, isFinal: boolean) => void;
20272037}
@@ -2073,7 +2083,7 @@ describe("DiscordVoiceManager", () => {
20732083);
20742084ownerTurn?.sendInputAudio(Buffer.alloc(8));
207520852076-const bridgeParams = createRealtimeVoiceBridgeSessionMock.mock.calls.at(-1)?.[0] as
2086+const bridgeParams = lastRealtimeBridgeParams() as
20772087| {
20782088autoRespondToAudio?: boolean;
20792089interruptResponseOnInputAudio?: boolean;
@@ -2182,7 +2192,7 @@ describe("DiscordVoiceManager", () => {
21822192);
21832193ownerTurn?.sendInputAudio(Buffer.alloc(8));
218421942185-const bridgeParams = createRealtimeVoiceBridgeSessionMock.mock.calls.at(-1)?.[0] as
2195+const bridgeParams = lastRealtimeBridgeParams() as
21862196| {
21872197onToolCall?: (
21882198event: {
@@ -2250,7 +2260,7 @@ describe("DiscordVoiceManager", () => {
22502260);
22512261ownerTurn?.sendInputAudio(Buffer.alloc(8));
225222622253-const bridgeParams = createRealtimeVoiceBridgeSessionMock.mock.calls.at(-1)?.[0] as
2263+const bridgeParams = lastRealtimeBridgeParams() as
22542264| {
22552265onToolCall?: (
22562266event: {
@@ -2323,7 +2333,7 @@ describe("DiscordVoiceManager", () => {
23232333);
23242334guestTurn?.sendInputAudio(Buffer.alloc(8));
232523352326-const bridgeParams = createRealtimeVoiceBridgeSessionMock.mock.calls.at(-1)?.[0] as
2336+const bridgeParams = lastRealtimeBridgeParams() as
23272337| {
23282338onToolCall?: (
23292339event: {
@@ -2628,9 +2638,7 @@ describe("DiscordVoiceManager", () => {
26282638const manager = createManager({ groupPolicy: "open", allowFrom: ["discord:u-owner"] }, client);
26292639await processVoiceSegment(manager, "u-owner");
263026402631-const commandArgs = agentCommandMock.mock.calls.at(-1)?.[0] as
2632-| { senderIsOwner?: boolean }
2633-| undefined;
2641+const commandArgs = lastAgentCommandArgs() as { senderIsOwner?: boolean } | undefined;
26342642expect(commandArgs?.senderIsOwner).toBe(true);
26352643});
26362644@@ -2650,9 +2658,7 @@ describe("DiscordVoiceManager", () => {
26502658});
26512659await processVoiceSegment(manager, "u-guest");
265226602653-const commandArgs = agentCommandMock.mock.calls.at(-1)?.[0] as
2654-| { senderIsOwner?: boolean }
2655-| undefined;
2661+const commandArgs = lastAgentCommandArgs() as { senderIsOwner?: boolean } | undefined;
26562662expect(commandArgs?.senderIsOwner).toBe(false);
26572663});
26582664@@ -2681,7 +2687,7 @@ describe("DiscordVoiceManager", () => {
26812687);
26822688await processVoiceSegment(manager, "u-guest");
268326892684-const commandArgs = agentCommandMock.mock.calls.at(-1)?.[0] as
2690+const commandArgs = lastAgentCommandArgs() as
26852691| { allowModelOverride?: boolean; model?: string }
26862692| undefined;
26872693@@ -2709,7 +2715,7 @@ describe("DiscordVoiceManager", () => {
27092715});
27102716await processVoiceSegment(manager, "u-guest");
271127172712-const commandArgs = agentCommandMock.mock.calls.at(-1)?.[0] as
2718+const commandArgs = lastAgentCommandArgs() as
27132719| { message?: string; messageChannel?: string; messageProvider?: string }
27142720| undefined;
27152721@@ -2825,9 +2831,7 @@ describe("DiscordVoiceManager", () => {
28252831);
28262832await processVoiceSegment(manager, "u-guest");
282728332828-const commandArgs = agentCommandMock.mock.calls.at(-1)?.[0] as
2829-| { extraSystemPrompt?: string }
2830-| undefined;
2834+const commandArgs = lastAgentCommandArgs() as { extraSystemPrompt?: string } | undefined;
2831283528322836expect(commandArgs?.extraSystemPrompt).toBe("Use short voice replies.");
28332837});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。