


























@@ -205,6 +205,7 @@ describe("google-meet plugin", () => {
205205voiceCall: { enabled: true, requestTimeoutMs: 30000, dtmfDelayMs: 2500 },
206206realtime: {
207207provider: "openai",
208+introMessage: "Say exactly: I'm here and listening.",
208209toolPolicy: "safe-read-only",
209210},
210211oauth: {},
@@ -284,7 +285,7 @@ describe("google-meet plugin", () => {
284285properties: {
285286action: {
286287type: "string",
287-enum: ["join", "status", "setup_status", "resolve_space", "preflight", "leave"],
288+enum: ["join", "status", "setup_status", "resolve_space", "preflight", "leave", "speak"],
288289},
289290transport: { type: "string", enum: ["chrome", "chrome-node", "twilio"] },
290291mode: { type: "string", enum: ["realtime", "transcribe"] },
@@ -520,11 +521,16 @@ describe("google-meet plugin", () => {
520521});
521522522523it("joins Chrome on a paired node without local Chrome or BlackHole", async () => {
523-const { methods, nodesList, nodesInvoke } = setup({
524-defaultTransport: "chrome-node",
525-defaultMode: "transcribe",
526-chromeNode: { node: "parallels-macos" },
527-});
524+const { methods, nodesList, nodesInvoke } = setup(
525+{
526+defaultTransport: "chrome-node",
527+defaultMode: "transcribe",
528+chromeNode: { node: "parallels-macos" },
529+},
530+{
531+nodesInvokeResult: { payload: { launched: true } },
532+},
533+);
528534const handler = methods.get("googlemeet.join") as
529535| ((ctx: {
530536params: Record<string, unknown>;
@@ -669,6 +675,7 @@ describe("google-meet plugin", () => {
669675name: string;
670676args: unknown;
671677}) => void;
678+onReady?: () => void;
672679tools?: unknown[];
673680}
674681| undefined;
@@ -680,6 +687,7 @@ describe("google-meet plugin", () => {
680687submitToolResult: vi.fn(),
681688acknowledgeMark: vi.fn(),
682689close: vi.fn(),
690+triggerGreeting: vi.fn(),
683691isConnected: vi.fn(() => true),
684692};
685693const provider: RealtimeVoiceProviderPlugin = {
@@ -756,6 +764,7 @@ describe("google-meet plugin", () => {
756764inputStdout.write(Buffer.from([1, 2, 3]));
757765callbacks?.onAudio(Buffer.from([4, 5]));
758766callbacks?.onMark?.("mark-1");
767+callbacks?.onReady?.();
759768callbacks?.onToolCall?.({
760769itemId: "item-1",
761770callId: "tool-call-1",
@@ -772,6 +781,9 @@ describe("google-meet plugin", () => {
772781expect(sendAudio).toHaveBeenCalledWith(Buffer.from([1, 2, 3]));
773782expect(outputStdinWrites).toEqual([Buffer.from([4, 5])]);
774783expect(bridge.acknowledgeMark).toHaveBeenCalled();
784+expect(bridge.triggerGreeting).toHaveBeenCalledWith("Say exactly: I'm here and listening.");
785+handle.speak("Say exactly: hello from the meeting.");
786+expect(bridge.triggerGreeting).toHaveBeenLastCalledWith("Say exactly: hello from the meeting.");
775787expect(callbacks).toMatchObject({
776788tools: [
777789expect.objectContaining({
@@ -808,6 +820,7 @@ describe("google-meet plugin", () => {
808820name: string;
809821args: unknown;
810822}) => void;
823+onReady?: () => void;
811824tools?: unknown[];
812825}
813826| undefined;
@@ -819,6 +832,7 @@ describe("google-meet plugin", () => {
819832submitToolResult: vi.fn(),
820833acknowledgeMark: vi.fn(),
821834close: vi.fn(),
835+triggerGreeting: vi.fn(),
822836isConnected: vi.fn(() => true),
823837};
824838const provider: RealtimeVoiceProviderPlugin = {
@@ -879,6 +893,7 @@ describe("google-meet plugin", () => {
879893});
880894881895callbacks?.onAudio(Buffer.from([1, 2, 3]));
896+callbacks?.onReady?.();
882897callbacks?.onToolCall?.({
883898itemId: "item-1",
884899callId: "tool-call-1",
@@ -907,6 +922,9 @@ describe("google-meet plugin", () => {
907922text: "Use the launch update.",
908923});
909924});
925+expect(bridge.triggerGreeting).toHaveBeenCalledWith("Say exactly: I'm here and listening.");
926+handle.speak("Say exactly: hello from the node.");
927+expect(bridge.triggerGreeting).toHaveBeenLastCalledWith("Say exactly: hello from the node.");
910928expect(callbacks).toMatchObject({
911929tools: [
912930expect.objectContaining({
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。