

























@@ -1,14 +1,23 @@
11import { describe, expect, it } from "vitest";
2+import type { TalkEvent } from "./talk-events.js";
23import { createTalkSessionController, normalizeTalkTransport } from "./talk-session-controller.js";
345+const TEST_TALK_CONTEXT = {
6+brain: "agent-consult",
7+mode: "realtime",
8+provider: "test",
9+sessionId: "talk-session",
10+transport: "gateway-relay",
11+} as const;
12+13+function expectTalkEvent(event: TalkEvent | undefined, expected: TalkEvent) {
14+expect(event).toStrictEqual(expected);
15+}
16+417function createController() {
518return createTalkSessionController(
619{
7-sessionId: "talk-session",
8-mode: "realtime",
9-transport: "gateway-relay",
10-brain: "agent-consult",
11-provider: "test",
20+ ...TEST_TALK_CONTEXT,
1221maxRecentEvents: 3,
1322},
1423{ now: () => "2026-05-05T00:00:00.000Z" },
@@ -33,17 +42,19 @@ describe("createTalkSessionController", () => {
3342final: true,
3443});
354436-expect(firstTurn.event).toMatchObject({
45+expectTalkEvent(firstTurn.event, {
46+ ...TEST_TALK_CONTEXT,
47+callId: undefined,
48+captureId: undefined,
49+final: undefined,
3750id: "talk-session:2",
38-type: "turn.started",
39-sessionId: "talk-session",
40-turnId: "turn-1",
41-mode: "realtime",
42-transport: "gateway-relay",
43-brain: "agent-consult",
44-provider: "test",
51+itemId: undefined,
52+parentId: undefined,
53+payload: {},
4554seq: 2,
4655timestamp: "2026-05-05T00:00:00.000Z",
56+turnId: "turn-1",
57+type: "turn.started",
4758});
4859expect(talk.recentEvents.map((event) => event.type)).toEqual([
4960"turn.started",
@@ -63,15 +74,23 @@ describe("createTalkSessionController", () => {
63746475const ended = talk.endTurn({ turnId: "turn-old", payload: { reason: "done" } });
657666-expect(ended).toMatchObject({
67-ok: true,
68-turnId: "turn-old",
77+expect(ended).toStrictEqual({
6978event: {
70-type: "turn.ended",
71-turnId: "turn-old",
72-payload: { reason: "done" },
79+...TEST_TALK_CONTEXT,
80+callId: undefined,
81+captureId: undefined,
7382final: true,
83+id: "talk-session:2",
84+itemId: undefined,
85+parentId: undefined,
86+payload: { reason: "done" },
87+seq: 2,
88+timestamp: "2026-05-05T00:00:00.000Z",
89+turnId: "turn-old",
90+type: "turn.ended",
7491},
92+ok: true,
93+turnId: "turn-old",
7594});
7695expect(talk.activeTurnId).toBeUndefined();
7796});
@@ -83,16 +102,34 @@ describe("createTalkSessionController", () => {
83102const second = talk.startOutputAudio({ payload: { callId: "call-1" } });
84103const done = talk.finishOutputAudio({ payload: { reason: "mark" } });
8510486-expect(first.event).toMatchObject({
87-type: "output.audio.started",
105+expectTalkEvent(first.event, {
106+ ...TEST_TALK_CONTEXT,
107+callId: undefined,
108+captureId: undefined,
109+final: undefined,
110+id: "talk-session:2",
111+itemId: undefined,
112+parentId: undefined,
113+payload: { callId: "call-1" },
114+seq: 2,
115+timestamp: "2026-05-05T00:00:00.000Z",
88116turnId: "turn-1",
117+type: "output.audio.started",
89118});
90119expect(second).toEqual({ turnId: "turn-1" });
91-expect(done).toMatchObject({
92-type: "output.audio.done",
93-turnId: "turn-1",
94-payload: { reason: "mark" },
120+expectTalkEvent(done, {
121+...TEST_TALK_CONTEXT,
122+callId: undefined,
123+captureId: undefined,
95124final: true,
125+id: "talk-session:3",
126+itemId: undefined,
127+parentId: undefined,
128+payload: { reason: "mark" },
129+seq: 3,
130+timestamp: "2026-05-05T00:00:00.000Z",
131+turnId: "turn-1",
132+type: "output.audio.done",
96133});
97134expect(talk.outputAudioActive).toBe(false);
98135});
@@ -127,9 +164,22 @@ describe("createTalkSessionController", () => {
127164128165const current = talk.startTurn({ turnId: "turn-current" });
129166130-expect(current).toMatchObject({
167+expect(current).toStrictEqual({
168+event: {
169+ ...TEST_TALK_CONTEXT,
170+callId: undefined,
171+captureId: undefined,
172+final: undefined,
173+id: "talk-session:3",
174+itemId: undefined,
175+parentId: undefined,
176+payload: {},
177+seq: 3,
178+timestamp: "2026-05-05T00:00:00.000Z",
179+turnId: "turn-current",
180+type: "turn.started",
181+},
131182turnId: "turn-current",
132-event: expect.objectContaining({ type: "turn.started", turnId: "turn-current" }),
133183});
134184expect(talk.activeTurnId).toBe("turn-current");
135185expect(talk.outputAudioActive).toBe(false);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。