{"version":3,"sources":["../../src/voice/agent.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2025 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport type { AudioFrame } from '@livekit/rtc-node';\nimport { ReadableStream } from 'node:stream/web';\nimport { describe, expect, it, vi } from 'vitest';\nimport { z } from 'zod';\nimport { ChatContext, ChatMessage, ToolError, tool } from '../llm/index.js';\nimport { initializeLogger } from '../log.js';\nimport { SynthesizeStream } from '../tts/index.js';\nimport { Task } from '../utils.js';\nimport { Agent, AgentTask, _setActivityTaskInfo } from './agent.js';\nimport { AgentActivity, agentActivityStorage } from './agent_activity.js';\nimport { AgentSession } from './agent_session.js';\nimport { FakeLLM } from './testing/fake_llm.js';\nimport { defaultEndpointingOptions } from './turn_config/endpointing.js';\nimport { defaultInterruptionOptions } from './turn_config/interruption.js';\n\nvi.mock('ofetch', () => ({ ofetch: vi.fn() }));\n\ninitializeLogger({ pretty: false, level: 'error' });\n\nasync function collectReadableStream<T>(stream: ReadableStream<T>): Promise<T[]> {\n  const chunks: T[] = [];\n  for await (const chunk of stream) {\n    chunks.push(chunk);\n  }\n  return chunks;\n}\n\nasync function withTimeout<T>(promise: Promise<T>, timeout: number): Promise<T> {\n  let timer: NodeJS.Timeout | undefined;\n  try {\n    return await Promise.race([\n      promise,\n      new Promise<never>((_, reject) => {\n        timer = setTimeout(() => reject(new TimeoutError(timeout)), timeout);\n      }),\n    ]);\n  } finally {\n    if (timer) clearTimeout(timer);\n  }\n}\n\nclass TimeoutError extends Error {\n  constructor(timeout: number) {\n    super(`timed out after ${timeout}ms`);\n  }\n}\n\nasync function closeWithTimeout(session: AgentSession): Promise<void> {\n  try {\n    await withTimeout(session.close(), 30_000);\n  } catch (error) {\n    if (!(error instanceof TimeoutError)) throw error;\n  }\n}\n\ndescribe('Agent', () => {\n  it('should create agent with basic instructions', () => {\n    const instructions = 'You are a helpful assistant';\n    const agent = new Agent({ instructions });\n\n    expect(agent).toBeDefined();\n    expect(agent.instructions).toBe(instructions);\n  });\n\n  it('should create agent with instructions and tools', () => {\n    const instructions = 'You are a helpful assistant with tools';\n\n    // Create mock tools using the tool function\n    const mockTool1 = tool({\n      name: 'getTool1',\n      description: 'First test tool',\n      parameters: z.object({}),\n      execute: async () => 'tool1 result',\n    });\n\n    const mockTool2 = tool({\n      name: 'getTool2',\n      description: 'Second test tool',\n      parameters: z.object({\n        input: z.string().describe('Input parameter'),\n      }),\n      execute: async ({ input }) => `tool2: ${input}`,\n    });\n\n    const agent = new Agent({\n      instructions,\n      tools: [mockTool1, mockTool2],\n    });\n\n    expect(agent).toBeDefined();\n    expect(agent.instructions).toBe(instructions);\n\n    // Assert tools are set correctly\n    const agentTools = agent.toolCtx.functionTools;\n    expect(Object.keys(agentTools)).toHaveLength(2);\n    expect(agentTools).toHaveProperty('getTool1');\n    expect(agentTools).toHaveProperty('getTool2');\n\n    // Verify tool properties with proper checks\n    expect(agentTools.getTool1?.description).toBe('First test tool');\n    expect(agentTools.getTool2?.description).toBe('Second test tool');\n  });\n\n  it('toolCtx returns a defensive copy that exposes the same tools', () => {\n    const instructions = 'You are a helpful assistant';\n    const mockTool = tool({\n      name: 'testTool',\n      description: 'Test tool',\n      parameters: z.object({}),\n      execute: async () => 'result',\n    });\n\n    const agent = new Agent({ instructions, tools: [mockTool] });\n\n    // Each call returns a fresh ToolContext so external mutation can't escape into the agent's\n    // internal state.\n    expect(agent.toolCtx).not.toBe(agent.toolCtx);\n    expect(agent.toolCtx.getFunctionTool('testTool')).toBe(mockTool);\n  });\n\n  describe('create', () => {\n    it('preserves constructor options and base Agent default id', () => {\n      const mockTool = tool({\n        name: 'testTool',\n        description: 'Test tool',\n        parameters: z.object({}),\n        execute: async () => 'result',\n      });\n\n      const agent = Agent.create({\n        instructions: 'factory instructions',\n        tools: [mockTool],\n      });\n\n      expect(agent).toBeInstanceOf(Agent);\n      expect(agent.instructions).toBe('factory instructions');\n      expect(agent.id).toBe('default_agent');\n      expect(agent.toolCtx.getFunctionTool('testTool')).toBe(mockTool);\n    });\n\n    it('passes AgentContext to lifecycle hooks', async () => {\n      const calls: string[] = [];\n      const chatCtx = ChatContext.empty();\n      const newMessage = ChatMessage.create({ role: 'user', content: ['hello'] });\n      const agent = Agent.create({\n        id: 'factory_agent',\n        instructions: 'factory instructions',\n        minConsecutiveSpeechDelay: 12,\n        onEnter: (ctx) => {\n          expect(ctx.agent).toBe(agent);\n          expect(ctx.id).toBe(agent.id);\n          expect(ctx.instructions).toBe(agent.instructions);\n          expect(ctx.toolCtx.functionTools).toEqual(agent.toolCtx.functionTools);\n          expect(ctx.chatCtx.items).toEqual(agent.chatCtx.items);\n          expect(ctx.minConsecutiveSpeechDelay).toBe(agent.minConsecutiveSpeechDelay);\n          calls.push('enter');\n        },\n        onExit: async (ctx) => {\n          expect(ctx.agent).toBe(agent);\n          calls.push('exit');\n        },\n        onUserTurnCompleted: (ctx, receivedChatCtx, receivedMessage) => {\n          expect(ctx.agent).toBe(agent);\n          expect(receivedChatCtx).toBe(chatCtx);\n          expect(receivedMessage).toBe(newMessage);\n          calls.push('turn');\n        },\n      });\n\n      await agent.onEnter();\n      await agent.onExit();\n      await agent.onUserTurnCompleted(chatCtx, newMessage);\n\n      expect(calls).toEqual(['enter', 'exit', 'turn']);\n    });\n\n    it('adapts stream node hooks between ReadableStream and AsyncIterable', async () => {\n      const audioFrame = 'audio' as unknown as AudioFrame;\n      const agent = Agent.create({\n        instructions: 'factory instructions',\n        async sttNode(ctx, audio) {\n          async function* stream() {\n            expect(ctx.agent).toBe(agent);\n            const frames: AudioFrame[] = [];\n            for await (const frame of audio) {\n              frames.push(frame);\n            }\n            expect(frames).toEqual([audioFrame]);\n            yield 'transcript';\n          }\n\n          return stream();\n        },\n      });\n      const audio = new ReadableStream<AudioFrame>({\n        start(controller) {\n          controller.enqueue(audioFrame);\n          controller.close();\n        },\n      });\n\n      const result = await agent.sttNode(audio, {});\n\n      expect(result).not.toBeNull();\n      await expect(collectReadableStream(result!)).resolves.toEqual(['transcript']);\n    });\n\n    it('supports async generator stream node hooks', async () => {\n      const audioFrame = 'audio' as unknown as AudioFrame;\n      const outputFrame = 'output-audio' as unknown as AudioFrame;\n      const agent = Agent.create({\n        instructions: 'factory instructions',\n        async *sttNode(ctx, audio) {\n          expect(ctx.agent).toBe(agent);\n          const frames: AudioFrame[] = [];\n          for await (const frame of audio) {\n            frames.push(frame);\n          }\n          expect(frames).toEqual([audioFrame]);\n          yield 'transcript';\n        },\n        async *llmNode(ctx, chatCtx, toolCtx) {\n          expect(ctx.agent).toBe(agent);\n          expect(chatCtx).toBeInstanceOf(ChatContext);\n          expect(toolCtx.equals(agent.toolCtx)).toBe(true);\n          yield 'llm-output';\n        },\n        async *ttsNode(ctx, text) {\n          expect(ctx.agent).toBe(agent);\n          const chunks: string[] = [];\n          for await (const chunk of text) {\n            chunks.push(chunk);\n          }\n          expect(chunks).toEqual(['hello']);\n          yield outputFrame;\n        },\n        async *realtimeAudioOutputNode(ctx, audio) {\n          expect(ctx.agent).toBe(agent);\n          const frames: AudioFrame[] = [];\n          for await (const frame of audio) {\n            frames.push(frame);\n          }\n          expect(frames).toEqual([audioFrame]);\n          yield outputFrame;\n        },\n      });\n      const audio = new ReadableStream<AudioFrame>({\n        start(controller) {\n          controller.enqueue(audioFrame);\n          controller.close();\n        },\n      });\n      const text = new ReadableStream<string>({\n        start(controller) {\n          controller.enqueue('hello');\n          controller.close();\n        },\n      });\n\n      const sttResult = await agent.sttNode(audio, {});\n      const llmResult = await agent.llmNode(ChatContext.empty(), agent.toolCtx, {});\n      const ttsResult = await agent.ttsNode(text, {});\n      const realtimeResult = await agent.realtimeAudioOutputNode(\n        new ReadableStream<AudioFrame>({\n          start(controller) {\n            controller.enqueue(audioFrame);\n            controller.close();\n          },\n        }),\n        {},\n      );\n\n      expect(sttResult).not.toBeNull();\n      expect(llmResult).not.toBeNull();\n      expect(ttsResult).not.toBeNull();\n      expect(realtimeResult).not.toBeNull();\n      await expect(collectReadableStream(sttResult!)).resolves.toEqual(['transcript']);\n      await expect(collectReadableStream(llmResult!)).resolves.toEqual(['llm-output']);\n      await expect(collectReadableStream(ttsResult!)).resolves.toEqual([outputFrame]);\n      await expect(collectReadableStream(realtimeResult!)).resolves.toEqual([outputFrame]);\n    });\n\n    it('supports stream node hooks that return async iterables', async () => {\n      function asyncIterableOf<T>(...items: T[]): AsyncIterable<T> {\n        return {\n          async *[Symbol.asyncIterator]() {\n            for (const item of items) {\n              yield item;\n            }\n          },\n        };\n      }\n\n      const audioFrame = 'audio' as unknown as AudioFrame;\n      const outputFrame = 'output-audio' as unknown as AudioFrame;\n      const agent = Agent.create({\n        instructions: 'factory instructions',\n        sttNode(ctx) {\n          expect(ctx.agent).toBe(agent);\n          return asyncIterableOf('transcript');\n        },\n        llmNode(ctx) {\n          expect(ctx.agent).toBe(agent);\n          return asyncIterableOf('llm-output');\n        },\n        ttsNode(ctx) {\n          expect(ctx.agent).toBe(agent);\n          return asyncIterableOf(outputFrame);\n        },\n        realtimeAudioOutputNode(ctx) {\n          expect(ctx.agent).toBe(agent);\n          return asyncIterableOf(outputFrame);\n        },\n      });\n\n      const sttResult = await agent.sttNode(\n        new ReadableStream<AudioFrame>({\n          start(controller) {\n            controller.enqueue(audioFrame);\n            controller.close();\n          },\n        }),\n        {},\n      );\n      const llmResult = await agent.llmNode(ChatContext.empty(), agent.toolCtx, {});\n      const ttsResult = await agent.ttsNode(\n        new ReadableStream<string>({\n          start(controller) {\n            controller.enqueue('hello');\n            controller.close();\n          },\n        }),\n        {},\n      );\n      const realtimeResult = await agent.realtimeAudioOutputNode(\n        new ReadableStream<AudioFrame>({\n          start(controller) {\n            controller.enqueue(audioFrame);\n            controller.close();\n          },\n        }),\n        {},\n      );\n\n      expect(sttResult).not.toBeNull();\n      expect(llmResult).not.toBeNull();\n      expect(ttsResult).not.toBeNull();\n      expect(realtimeResult).not.toBeNull();\n      await expect(collectReadableStream(sttResult!)).resolves.toEqual(['transcript']);\n      await expect(collectReadableStream(llmResult!)).resolves.toEqual(['llm-output']);\n      await expect(collectReadableStream(ttsResult!)).resolves.toEqual([outputFrame]);\n      await expect(collectReadableStream(realtimeResult!)).resolves.toEqual([outputFrame]);\n    });\n\n    it('falls back to existing defaults for missing hooks', async () => {\n      const audioFrame = 'audio' as unknown as AudioFrame;\n      const audio = new ReadableStream<AudioFrame>({\n        start(controller) {\n          controller.enqueue(audioFrame);\n          controller.close();\n        },\n      });\n      const agent = Agent.create({ instructions: 'factory instructions' });\n\n      const result = await agent.realtimeAudioOutputNode(audio, {});\n\n      expect(result).toBe(audio);\n    });\n  });\n\n  describe('AsyncIterable pipeline node inputs', () => {\n    it('accepts a plain AsyncIterable into Agent.create stream hooks without getReader crash', async () => {\n      const outputFrame = 'output-audio' as unknown as AudioFrame;\n      const agent = Agent.create({\n        instructions: 'factory instructions',\n        async *ttsNode(ctx, text) {\n          expect(ctx.agent).toBe(agent);\n          const chunks: string[] = [];\n          for await (const chunk of text) {\n            chunks.push(chunk);\n          }\n          expect(chunks).toEqual(['hello']);\n          yield outputFrame;\n        },\n      });\n\n      async function* textInput() {\n        yield 'hello';\n      }\n\n      // Before the fix the AgentV2 hook adapter called readStream(text).getReader()\n      // unconditionally, crashing with \"getReader is not a function\" on a plain iterable.\n      const result = await agent.ttsNode(textInput(), {});\n\n      expect(result).not.toBeNull();\n      await expect(collectReadableStream(result!)).resolves.toEqual([outputFrame]);\n    });\n\n    it('forwards transformed output through an Agent.create transcriptionNode hook', async () => {\n      const agent = Agent.create({\n        instructions: 'factory instructions',\n        async *transcriptionNode(ctx, text) {\n          expect(ctx.agent).toBe(agent);\n          for await (const chunk of text) {\n            yield `${chunk}!`;\n          }\n        },\n      });\n\n      async function* textInput() {\n        yield 'hello';\n        yield 'world';\n      }\n\n      // Before transcriptionNode was wired as an Agent.create hook the override didn't exist,\n      // so the base default returned the input unchanged instead of the transformed output.\n      const result = await agent.transcriptionNode(textInput(), {});\n\n      expect(result).not.toBeNull();\n      await expect(collectReadableStream(result!)).resolves.toEqual(['hello!', 'world!']);\n    });\n\n    it('accepts a plain AsyncIterable into Agent.default.ttsNode', async () => {\n      const frame = 'frame' as unknown as AudioFrame;\n      const agent = new Agent({ instructions: 'default instructions' });\n\n      let capturedInput: unknown;\n      const ttsStream = {\n        startTimeOffset: 0,\n        updateInputStream(input: unknown) {\n          capturedInput = input;\n        },\n        close() {},\n        async *[Symbol.asyncIterator]() {\n          yield { frame, timedTranscripts: [] };\n          yield SynthesizeStream.END_OF_STREAM;\n        },\n      };\n\n      (agent as any)._agentActivity = {\n        tts: {\n          capabilities: { streaming: true },\n          stream: () => ttsStream,\n          close: async () => {},\n          _setExpressive: () => {},\n        },\n        agentSession: { connOptions: { ttsConnOptions: {} } },\n        _resolveExpressiveOptions: () => undefined,\n      };\n\n      async function* textInput() {\n        yield 'hello';\n      }\n\n      const result = await Agent.default.ttsNode(agent, textInput(), {});\n\n      expect(result).not.toBeNull();\n      // The default must normalize the AsyncIterable into a real ReadableStream before\n      // handing it to the TTS stream (the stream calls .cancel() during cleanup).\n      expect(capturedInput).toBeInstanceOf(ReadableStream);\n      await expect(collectReadableStream(result!)).resolves.toEqual([frame]);\n    });\n  });\n\n  it('should require AgentTask to run inside task context', async () => {\n    class TestTask extends AgentTask<string> {\n      constructor() {\n        super({ instructions: 'test task' });\n      }\n    }\n\n    const task = new TestTask();\n    await expect(task.run()).rejects.toThrow('must be executed inside a Task context');\n  });\n\n  it('should require AgentTask to run inside inline task context', async () => {\n    class TestTask extends AgentTask<string> {\n      constructor() {\n        super({ instructions: 'test task' });\n      }\n    }\n\n    const task = new TestTask();\n    const wrapper = Task.from(async () => {\n      return await task.run();\n    });\n\n    await expect(wrapper.result).rejects.toThrow(\n      'should only be awaited inside function tools or the onEnter/onExit methods of an Agent',\n    );\n  });\n\n  it('should allow AgentTask run from inline task context', async () => {\n    class TestTask extends AgentTask<string> {\n      constructor() {\n        super({ instructions: 'test task' });\n      }\n    }\n\n    const task = new TestTask();\n    const oldAgent = new Agent({ instructions: 'old agent' });\n    const mockSession = {\n      currentAgent: oldAgent,\n      _globalRunState: undefined,\n      _updateActivity: async (agent: Agent) => {\n        if (agent === task) {\n          task.complete('ok');\n        }\n      },\n    };\n\n    const mockActivity = {\n      agent: oldAgent,\n      agentSession: mockSession,\n      _onEnterTask: undefined,\n      _addDrainBlockedTasks: vi.fn(),\n      _withInlineTaskSlot: async ({ fn }: { fn: () => Promise<unknown> }) => fn(),\n      llm: undefined,\n      close: async () => {},\n    };\n\n    const wrapper = Task.from(async () => {\n      const currentTask = Task.current();\n      if (!currentTask) {\n        throw new Error('expected task context');\n      }\n      _setActivityTaskInfo(currentTask, { inlineTask: true });\n      return await agentActivityStorage.run(mockActivity as any, () => task.run());\n    });\n\n    await expect(wrapper.result).resolves.toBe('ok');\n  });\n\n  describe('AgentTask.create', () => {\n    it('exposes complete on hook context', async () => {\n      const task = AgentTask.create<string>({\n        instructions: 'factory task',\n        onEnter: (ctx) => {\n          expect(ctx.agent).toBe(task);\n          expect(ctx.id).toBe('default_agent');\n          expect(ctx.instructions).toBe('factory task');\n          ctx.complete('ok');\n        },\n      });\n      const oldAgent = new Agent({ instructions: 'old agent' });\n      const mockSession = {\n        currentAgent: oldAgent,\n        _globalRunState: undefined,\n        _updateActivity: async (agent: Agent) => {\n          if (agent === task) {\n            await agent.onEnter();\n          }\n        },\n      };\n      const mockActivity = {\n        agent: oldAgent,\n        agentSession: mockSession,\n        _onEnterTask: undefined,\n        _addDrainBlockedTasks: vi.fn(),\n        _withInlineTaskSlot: async ({ fn }: { fn: () => Promise<unknown> }) => fn(),\n        llm: undefined,\n        close: async () => {},\n      };\n\n      const wrapper = Task.from(async () => {\n        const currentTask = Task.current();\n        if (!currentTask) {\n          throw new Error('expected task context');\n        }\n        _setActivityTaskInfo(currentTask, { inlineTask: true });\n        return await agentActivityStorage.run(mockActivity as any, () => task.run());\n      });\n\n      await expect(wrapper.result).resolves.toBe('ok');\n    });\n\n    it('adapts stream node hooks between ReadableStream and AsyncIterable', async () => {\n      const audioFrame = 'audio' as unknown as AudioFrame;\n      const task = AgentTask.create<string>({\n        instructions: 'factory task',\n        async sttNode(ctx, audio) {\n          async function* stream() {\n            expect(ctx.agent).toBe(task);\n            const frames: AudioFrame[] = [];\n            for await (const frame of audio) {\n              frames.push(frame);\n            }\n            expect(frames).toEqual([audioFrame]);\n            yield 'transcript';\n          }\n\n          return stream();\n        },\n      });\n      const audio = new ReadableStream<AudioFrame>({\n        start(controller) {\n          controller.enqueue(audioFrame);\n          controller.close();\n        },\n      });\n\n      const result = await task.sttNode(audio, {});\n\n      expect(result).not.toBeNull();\n      await expect(collectReadableStream(result!)).resolves.toEqual(['transcript']);\n    });\n\n    it('falls back to existing defaults for missing hooks', async () => {\n      const audioFrame = 'audio' as unknown as AudioFrame;\n      const audio = new ReadableStream<AudioFrame>({\n        start(controller) {\n          controller.enqueue(audioFrame);\n          controller.close();\n        },\n      });\n      const task = AgentTask.create<string>({ instructions: 'factory task' });\n\n      const result = await task.realtimeAudioOutputNode(audio, {});\n\n      expect(result).toBe(audio);\n    });\n  });\n\n  it('should require AgentTask to run inside AgentActivity context', async () => {\n    class TestTask extends AgentTask<string> {\n      constructor() {\n        super({ instructions: 'test task' });\n      }\n    }\n\n    const task = new TestTask();\n    const wrapper = Task.from(async () => {\n      const currentTask = Task.current();\n      if (!currentTask) {\n        throw new Error('expected task context');\n      }\n      _setActivityTaskInfo(currentTask, { inlineTask: true });\n      return await task.run();\n    });\n\n    await expect(wrapper.result).rejects.toThrow(\n      'must be executed inside an AgentActivity context',\n    );\n  });\n\n  it('should close old activity when current agent changes while AgentTask is pending', async () => {\n    class TestTask extends AgentTask<string> {\n      constructor() {\n        super({ instructions: 'test task' });\n      }\n    }\n\n    const task = new TestTask();\n    const oldAgent = new Agent({ instructions: 'old agent' });\n    const switchedAgent = new Agent({ instructions: 'switched agent' });\n    const closeOldActivity = vi.fn(async () => {});\n\n    const mockSession = {\n      currentAgent: oldAgent as Agent,\n      _globalRunState: undefined,\n      _updateActivity: async (agent: Agent) => {\n        if (agent === task) {\n          mockSession.currentAgent = switchedAgent;\n          task.complete('ok');\n        }\n      },\n    };\n\n    const mockActivity = {\n      agent: oldAgent,\n      agentSession: mockSession,\n      _onEnterTask: undefined,\n      _addDrainBlockedTasks: vi.fn(),\n      _withInlineTaskSlot: async ({ fn }: { fn: () => Promise<unknown> }) => fn(),\n      llm: undefined,\n      close: closeOldActivity,\n    };\n\n    const wrapper = Task.from(async () => {\n      const currentTask = Task.current();\n      if (!currentTask) {\n        throw new Error('expected task context');\n      }\n      _setActivityTaskInfo(currentTask, { inlineTask: true });\n      return await agentActivityStorage.run(mockActivity as any, () => task.run());\n    });\n\n    await expect(wrapper.result).resolves.toBe('ok');\n    expect(closeOldActivity).toHaveBeenCalledTimes(1);\n  });\n\n  it('runs parallel AgentTasks in turn', async () => {\n    class DialogTask extends AgentTask<void> {\n      constructor() {\n        super({\n          instructions: 'dialog task',\n          tools: [\n            tool({\n              name: 'finish',\n              description: 'Complete the dialog.',\n              parameters: z.object({}),\n              execute: async () => {\n                this.complete(undefined);\n                return 'done';\n              },\n            }),\n          ],\n        });\n      }\n\n      async onEnter() {\n        this.session.generateReply({ instructions: 'dialog_greeting' });\n      }\n    }\n\n    class ParallelDialogAgent extends Agent {\n      outcomes: string[] = [];\n\n      constructor() {\n        super({\n          instructions: 'root agent',\n          tools: [\n            tool({\n              name: 'open_name_dialog',\n              description: 'Collect the name.',\n              parameters: z.object({}),\n              execute: async () => this.open('name'),\n            }),\n            tool({\n              name: 'open_email_dialog',\n              description: 'Collect the email.',\n              parameters: z.object({}),\n              execute: async () => this.open('email'),\n            }),\n          ],\n        });\n      }\n\n      private async open(which: string): Promise<string> {\n        try {\n          await new DialogTask().run();\n        } catch (error) {\n          if (!(error instanceof ToolError)) throw error;\n          this.outcomes.push(`${which}:refused`);\n          return `${which} refused: ${error.message}`;\n        }\n        this.outcomes.push(`${which}:ran`);\n        return `${which} captured`;\n      }\n    }\n\n    const llm = new FakeLLM([\n      {\n        input: 'go',\n        toolCalls: [\n          { name: 'open_name_dialog', args: {} },\n          { name: 'open_email_dialog', args: {} },\n        ],\n      },\n      { input: 'instructions:dialog_greeting', content: 'what is it?' },\n      { input: 'done', toolCalls: [{ name: 'finish', args: {} }] },\n    ]);\n    const agent = new ParallelDialogAgent();\n    const session = new AgentSession({ llm });\n    try {\n      await session.start({ agent });\n\n      await withTimeout(session.run({ userInput: 'go' }).wait(), 5000);\n      const first = session.currentAgent;\n      expect(first).toBeInstanceOf(DialogTask);\n\n      await withTimeout(session.run({ userInput: 'done' }).wait(), 5000);\n      const second = session.currentAgent;\n      expect(second).toBeInstanceOf(DialogTask);\n      expect(second).not.toBe(first);\n\n      await withTimeout(session.run({ userInput: 'done' }).wait(), 5000);\n      expect(session.currentAgent).toBe(agent);\n    } finally {\n      await closeWithTimeout(session);\n    }\n\n    expect(agent.outcomes.sort()).toEqual(['email:ran', 'name:ran']);\n    const outputs = agent.chatCtx.items.filter(\n      (item) =>\n        item.type === 'function_call_output' &&\n        (item.callId === 'fake_call_0' || item.callId === 'fake_call_1'),\n    );\n    expect(new Set(outputs.map((item) => item.callId))).toEqual(\n      new Set(['fake_call_0', 'fake_call_1']),\n    );\n    expect(outputs.some((item) => item.output.includes('refused'))).toBe(false);\n  }, 35_000);\n\n  it('allows a nested AgentTask from a later turn', async () => {\n    class InnerTask extends AgentTask<void> {\n      constructor() {\n        super({ instructions: 'inner task' });\n      }\n\n      async onEnter() {\n        this.session.generateReply({ instructions: 'inner_greeting' });\n      }\n    }\n\n    class OuterTask extends AgentTask<void> {\n      constructor() {\n        super({\n          instructions: 'outer task',\n          tools: [\n            tool({\n              name: 'start_inner',\n              description: 'Transition into the inner task.',\n              parameters: z.object({}),\n              execute: async () => {\n                await new InnerTask().run();\n                this.complete(undefined);\n                return 'inner completed';\n              },\n            }),\n          ],\n        });\n      }\n\n      async onEnter() {\n        this.session.generateReply({ instructions: 'outer_greeting' });\n      }\n    }\n\n    class RootAgent extends Agent {\n      constructor() {\n        super({\n          instructions: 'root agent',\n          tools: [\n            tool({\n              name: 'start_outer',\n              description: 'Transition into the outer task.',\n              parameters: z.object({}),\n              execute: async () => {\n                await new OuterTask().run();\n                return 'outer completed';\n              },\n            }),\n          ],\n        });\n      }\n    }\n\n    const llm = new FakeLLM([\n      { input: 'go', toolCalls: [{ name: 'start_outer', args: {} }] },\n      { input: 'instructions:outer_greeting', content: 'what is your name?' },\n      { input: 'Dana', toolCalls: [{ name: 'start_inner', args: {} }] },\n      { input: 'instructions:inner_greeting', content: 'and your date of birth?' },\n    ]);\n    const session = new AgentSession({ llm });\n    try {\n      await session.start({ agent: new RootAgent() });\n\n      await withTimeout(session.run({ userInput: 'go' }).wait(), 5000);\n      expect(session.currentAgent).toBeInstanceOf(OuterTask);\n\n      await withTimeout(session.run({ userInput: 'Dana' }).wait(), 5000);\n      expect(session.currentAgent).toBeInstanceOf(InnerTask);\n    } finally {\n      await closeWithTimeout(session);\n    }\n  }, 35_000);\n\n  describe('Agent constructor option migration', () => {\n    it('should set allowInterruptions to false via deprecated constructor field', () => {\n      const agent = new Agent({ instructions: 'test', allowInterruptions: false });\n      expect(agent.turnHandling?.interruption?.enabled).toBe(false);\n    });\n\n    it('should not set derived properties when no compatibility fields are provided', () => {\n      const agent = new Agent({ instructions: 'test' });\n      expect(agent.turnHandling).toBeUndefined();\n    });\n\n    it('should expose minConsecutiveSpeechDelay', () => {\n      const agent = new Agent({ instructions: 'test', minConsecutiveSpeechDelay: 1.5 });\n      expect(agent.minConsecutiveSpeechDelay).toBe(1.5);\n    });\n\n    it('should ignore deprecated constructor fields when turnHandling is provided', () => {\n      const agent = new Agent({\n        instructions: 'test',\n        turnHandling: {\n          endpointing: { minDelay: 999 },\n          interruption: {},\n          preemptiveGeneration: {},\n          turnDetection: 'vad',\n        },\n        allowInterruptions: false,\n      });\n      expect(agent.turnHandling?.endpointing?.minDelay).toBe(999);\n      expect(agent.turnHandling?.endpointing?.maxDelay).toBeUndefined();\n      expect(agent.turnHandling?.interruption?.enabled).toBeUndefined();\n      expect(agent.turnHandling?.turnDetection).toBe('vad');\n    });\n\n    it('should let turnHandling override deprecated constructor fields on conflicts', () => {\n      const agent = new Agent({\n        instructions: 'test',\n        turnHandling: {\n          endpointing: { minDelay: 999, maxDelay: 4000 },\n          interruption: { enabled: true },\n          preemptiveGeneration: {},\n          turnDetection: 'vad',\n        },\n        allowInterruptions: false,\n        turnDetection: 'stt',\n      });\n      expect(agent.turnHandling?.endpointing?.minDelay).toBe(999);\n      expect(agent.turnHandling?.endpointing?.maxDelay).toBe(4000);\n      expect(agent.turnHandling?.interruption?.enabled).toBe(true);\n      expect(agent.turnHandling?.turnDetection).toBe('vad');\n    });\n\n    it('should set interruptionDetection from turnHandling.interruption.mode', () => {\n      const agent = new Agent({\n        instructions: 'test',\n        turnHandling: {\n          interruption: { mode: 'adaptive' },\n          endpointing: {},\n          preemptiveGeneration: {},\n          turnDetection: undefined,\n        },\n      });\n      expect(agent.turnHandling?.interruption?.mode).toBe('adaptive');\n    });\n\n    it('should let AgentActivity prefer agent-level overrides over session defaults', () => {\n      const agent = new Agent({\n        instructions: 'test',\n        turnHandling: {\n          endpointing: { minDelay: 111, maxDelay: 222 },\n          interruption: { enabled: false },\n          preemptiveGeneration: {},\n          turnDetection: 'manual',\n        },\n      });\n      const session = {\n        options: {\n          turnHandling: {\n            endpointing: defaultEndpointingOptions,\n            interruption: defaultInterruptionOptions,\n          },\n        },\n        turnDetection: 'stt',\n        useTtsAlignedTranscript: true,\n        vad: undefined,\n        stt: undefined,\n        llm: undefined,\n        tts: undefined,\n        interruptionDetection: undefined,\n      } as any;\n\n      const activity = new AgentActivity(agent as any, session);\n\n      expect(activity.allowInterruptions).toBe(false);\n      expect(activity.turnDetection).toBe('manual');\n      expect(activity.turnHandling.endpointing?.minDelay).toBe(111);\n      expect(activity.turnHandling.endpointing?.maxDelay).toBe(222);\n    });\n\n    it('should disable adaptive interruption detection in default mode when prerequisites are missing', () => {\n      const previousRemoteEotUrl = process.env.LIVEKIT_REMOTE_EOT_URL;\n      process.env.LIVEKIT_REMOTE_EOT_URL = 'http://localhost:9999';\n\n      try {\n        const agent = new Agent({ instructions: 'test' });\n        const session = {\n          options: {\n            turnHandling: {\n              endpointing: defaultEndpointingOptions,\n              interruption: defaultInterruptionOptions,\n            },\n          },\n          sessionOptions: {\n            turnHandling: {\n              endpointing: defaultEndpointingOptions,\n              interruption: defaultInterruptionOptions,\n            },\n          },\n          turnDetection: 'manual',\n          useTtsAlignedTranscript: true,\n          vad: {},\n          stt: {\n            capabilities: {\n              alignedTranscript: true,\n              streaming: true,\n            },\n          },\n          llm: undefined,\n          tts: undefined,\n          interruptionDetection: undefined,\n        } as any;\n\n        const activity = new AgentActivity(agent as any, session);\n        expect((activity as any).interruptionDetector).toBeUndefined();\n      } finally {\n        if (previousRemoteEotUrl === undefined) {\n          delete process.env.LIVEKIT_REMOTE_EOT_URL;\n        } else {\n          process.env.LIVEKIT_REMOTE_EOT_URL = previousRemoteEotUrl;\n        }\n      }\n    });\n\n    it.each([\n      ['word', true],\n      [false, false],\n    ] as const)(\n      'should use the STT alignment claim to resolve automatic adaptive interruption (%s)',\n      (alignedTranscript, expectedAdaptive) => {\n        const previousDevMode = process.env.LIVEKIT_DEV_MODE;\n        const previousApiKey = process.env.LIVEKIT_API_KEY;\n        const previousApiSecret = process.env.LIVEKIT_API_SECRET;\n        process.env.LIVEKIT_DEV_MODE = '1';\n        process.env.LIVEKIT_API_KEY = 'fake';\n        process.env.LIVEKIT_API_SECRET = 'fake-secret';\n\n        try {\n          const activity = Object.create(AgentActivity.prototype) as any;\n          activity.agent = {\n            _llm: {},\n            _stt: { capabilities: { alignedTranscript, streaming: true } },\n            _vad: {},\n            turnHandling: { interruption: { enabled: true }, turnDetection: 'stt' },\n          };\n          activity.agentSession = {\n            _textOnly: false,\n            interruptionDetection: undefined,\n            turnDetection: 'stt',\n          };\n          activity.logger = { warn: vi.fn() };\n          activity.onInterruptionOverlappingSpeech = vi.fn();\n          activity.onInterruptionMetricsCollected = vi.fn();\n          activity.onInterruptionError = vi.fn();\n\n          expect(activity.resolveInterruptionDetector() !== undefined).toBe(expectedAdaptive);\n        } finally {\n          if (previousDevMode === undefined) delete process.env.LIVEKIT_DEV_MODE;\n          else process.env.LIVEKIT_DEV_MODE = previousDevMode;\n          if (previousApiKey === undefined) delete process.env.LIVEKIT_API_KEY;\n          else process.env.LIVEKIT_API_KEY = previousApiKey;\n          if (previousApiSecret === undefined) delete process.env.LIVEKIT_API_SECRET;\n          else process.env.LIVEKIT_API_SECRET = previousApiSecret;\n        }\n      },\n    );\n\n    it('should keep automatic adaptive interruption off in plain production', () => {\n      const previousDevMode = process.env.LIVEKIT_DEV_MODE;\n      const previousRemoteEotUrl = process.env.LIVEKIT_REMOTE_EOT_URL;\n      delete process.env.LIVEKIT_DEV_MODE;\n      delete process.env.LIVEKIT_REMOTE_EOT_URL;\n\n      try {\n        const activity = Object.create(AgentActivity.prototype) as any;\n        activity.agent = {\n          _llm: {},\n          _stt: { capabilities: { alignedTranscript: 'word', streaming: true } },\n          _vad: {},\n          turnHandling: { interruption: { enabled: true }, turnDetection: 'stt' },\n        };\n        activity.agentSession = {\n          _textOnly: false,\n          interruptionDetection: undefined,\n          turnDetection: 'stt',\n        };\n        activity.logger = { info: vi.fn(), warn: vi.fn() };\n\n        expect(activity.resolveInterruptionDetector()).toBeUndefined();\n      } finally {\n        if (previousDevMode !== undefined) process.env.LIVEKIT_DEV_MODE = previousDevMode;\n        if (previousRemoteEotUrl !== undefined) {\n          process.env.LIVEKIT_REMOTE_EOT_URL = previousRemoteEotUrl;\n        }\n      }\n    });\n\n    it.each(['word', false] as const)(\n      'should keep VAD interruption when explicitly selected (%s alignment)',\n      (alignedTranscript) => {\n        const activity = Object.create(AgentActivity.prototype) as any;\n        activity.agent = {\n          _llm: {},\n          _stt: { capabilities: { alignedTranscript, streaming: true } },\n          _vad: {},\n          turnHandling: {\n            interruption: { enabled: true, mode: 'vad' },\n            turnDetection: 'stt',\n          },\n        };\n        activity.agentSession = {\n          _textOnly: false,\n          interruptionDetection: undefined,\n          turnDetection: 'stt',\n        };\n        activity.logger = { warn: vi.fn() };\n\n        expect(activity.resolveInterruptionDetector()).toBeUndefined();\n      },\n    );\n\n    it('should retain the session VAD for turn-detecting STT', () => {\n      const vad = {};\n      const activity = Object.create(AgentActivity.prototype) as any;\n      activity.agent = { _vad: undefined };\n      activity.agentSession = { _textOnly: false, vad };\n\n      expect(activity.vad).toBe(vad);\n    });\n\n    it('should warn when session explicitly requests adaptive detection even if agent overrides it', () => {\n      const activity = Object.create(AgentActivity.prototype) as any;\n      activity.agent = {\n        turnHandling: { interruption: { mode: 'vad' } },\n        turnDetection: undefined,\n      };\n      activity.agentSession = {\n        interruptionDetection: 'adaptive',\n        turnDetection: 'manual',\n      };\n      activity.logger = { warn: vi.fn() };\n\n      expect(activity.resolveInterruptionDetector()).toBeUndefined();\n      expect(activity.logger.warn).toHaveBeenCalledWith(\n        \"interruptionDetection is provided, but it's not compatible with the current configuration and will be disabled\",\n      );\n    });\n\n    it('should disable adaptive interruption detection when interruptions are disabled', () => {\n      const previousRemoteEotUrl = process.env.LIVEKIT_REMOTE_EOT_URL;\n      process.env.LIVEKIT_REMOTE_EOT_URL = 'http://localhost:9999';\n\n      try {\n        const activity = Object.create(AgentActivity.prototype) as any;\n        activity.agent = {\n          turnHandling: {\n            interruption: { enabled: false },\n          },\n          turnDetection: undefined,\n          _stt: undefined,\n          _vad: undefined,\n          _llm: undefined,\n        };\n        activity.agentSession = {\n          interruptionDetection: undefined,\n          turnDetection: 'stt',\n          sessionOptions: {\n            turnHandling: {\n              interruption: defaultInterruptionOptions,\n              endpointing: defaultEndpointingOptions,\n            },\n          },\n          stt: {\n            capabilities: {\n              alignedTranscript: true,\n              streaming: true,\n            },\n          },\n          vad: {},\n          llm: undefined,\n        };\n        activity.logger = { warn: vi.fn() };\n\n        expect(activity.resolveInterruptionDetector()).toBeUndefined();\n        expect(activity.logger.warn).not.toHaveBeenCalled();\n      } finally {\n        if (previousRemoteEotUrl === undefined) {\n          delete process.env.LIVEKIT_REMOTE_EOT_URL;\n        } else {\n          process.env.LIVEKIT_REMOTE_EOT_URL = previousRemoteEotUrl;\n        }\n      }\n    });\n  });\n});\n"],"mappings":"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","names":["audio","text"]}