{"version":3,"sources":["../../src/llm/duplex_adapter.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2026 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { AudioFrame } from '@livekit/rtc-node';\nimport { ReadableStream, type ReadableStreamDefaultController } from 'node:stream/web';\nimport { setImmediate } from 'node:timers/promises';\nimport { afterEach, describe, expect, it, vi } from 'vitest';\nimport { log } from '../log.js';\nimport type { RealtimeModelMetrics } from '../metrics/base.js';\nimport { Future } from '../utils.js';\nimport { Agent } from '../voice/agent.js';\nimport { AgentSession } from '../voice/agent_session.js';\nimport {\n  AgentSessionEventTypes,\n  CloseReason,\n  createUserInputTranscribedEvent,\n} from '../voice/events.js';\nimport { type TimedString, isTimedString } from '../voice/io.js';\nimport { ChatContext, type ChatItem, FunctionCall, FunctionCallOutput } from './chat_context.js';\nimport { type DuplexAudioFrame, DuplexModel, DuplexSession } from './duplex.js';\nimport {\n  AdaptiveNoiseGate,\n  DuplexRealtimeAdapter,\n  DuplexRealtimeSession,\n  FixedGate,\n} from './duplex_adapter.js';\nimport type { DuplexRealtimeAdapterOptions } from './duplex_adapter.js';\nimport { type GenerationCreatedEvent, RealtimeError, type RealtimeModelError } from './realtime.js';\nimport { type ToolChoice, ToolContext, Toolset } from './tool_context.js';\n\nfunction frame(level: number, duration = 100): AudioFrame {\n  const samples = new Int16Array((24_000 * duration) / 1000);\n  const amplitude = Math.trunc(level * 32767);\n  for (let i = 0; i < samples.length; i++) samples[i] = i % 2 ? -amplitude : amplitude;\n  return new AudioFrame(samples, 24_000, 1, samples.length);\n}\n\nclass FakeDuplexModel extends DuplexModel {\n  activeSession!: FakeDuplexSession;\n  askable = false;\n  constructor() {\n    super({ userTranscription: true, autoToolReplyGeneration: true });\n  }\n  get model() {\n    return 'fake-duplex';\n  }\n  get provider() {\n    return 'fake';\n  }\n  session(): FakeDuplexSession {\n    return (this.activeSession = new FakeDuplexSession(this));\n  }\n  async close(): Promise<void> {}\n}\n\nclass FakeDuplexSession extends DuplexSession {\n  private readonly connectionTask = this._configured.wait().then(() => {\n    if (!this._closing) this.connected = true;\n  });\n  controller!: ReadableStreamDefaultController<DuplexAudioFrame>;\n  readonly audioStream = new ReadableStream<DuplexAudioFrame>({\n    start: (controller) => {\n      this.controller = controller;\n    },\n  });\n  tools = ToolContext.empty();\n  appended: ChatItem[] = [];\n  configBatches: unknown[][] = [];\n  repliesRequested: Array<string | undefined> = [];\n  connected = false;\n  closed = false;\n  constructor(readonly fakeModel: FakeDuplexModel) {\n    super(fakeModel);\n  }\n  get configured(): boolean {\n    return this._configured.isSet;\n  }\n  async _updateInstructions(_instructions: string): Promise<void> {}\n  async _appendItems(items: ChatItem[]): Promise<void> {\n    this.appended.push(...items);\n  }\n  async _updateTools(tools: ToolContext): Promise<void> {\n    this.tools = tools;\n  }\n  _updateOptions(_options: { toolChoice?: ToolChoice | null }): void {}\n  pushAudio(_frame: AudioFrame): void {}\n  protected async closeConnection(): Promise<void> {\n    await this.connectionTask;\n    if (!this.closed) this.controller.close();\n    this.closed = true;\n  }\n  _generateReply(instructions?: string): void {\n    if (!this.fakeModel.askable) super._generateReply(instructions);\n    this.repliesRequested.push(instructions);\n  }\n  async _updateSession(\n    instructions?: string,\n    chatCtx?: ChatContext,\n    tools?: ToolContext,\n  ): Promise<void> {\n    this.configBatches.push([instructions, chatCtx, tools]);\n    await super._updateSession(instructions, chatCtx, tools);\n  }\n  reportConnectionAcquired(duration: number): void {\n    this._reportConnectionAcquired(duration);\n  }\n  push(level: number, count = 1, startMs?: number): void {\n    for (let i = 0; i < count; i++) {\n      this.controller.enqueue({\n        frame: frame(level),\n        startMs: startMs === undefined ? undefined : startMs + i * 100,\n      });\n    }\n  }\n  say(text: string, startMs?: number, endMs?: number): void {\n    this.emit('transcript_delta', { text, startMs, endMs });\n  }\n  heard(itemId: string, transcript: string): void {\n    this.emit('input_speech_started', {});\n    this.emit('input_audio_transcription_completed', { itemId, transcript, isFinal: true });\n    this.emit('input_speech_stopped', { userTranscriptionEnabled: false });\n  }\n}\n\nconst sessions: DuplexRealtimeSession[] = [];\nafterEach(async () => {\n  await Promise.all(sessions.splice(0).map((session) => session.close()));\n  vi.useRealTimers();\n  vi.restoreAllMocks();\n});\n\nfunction setup(options: DuplexRealtimeAdapterOptions = {}, model = new FakeDuplexModel()) {\n  const adapter = new DuplexRealtimeAdapter(model, options);\n  const session = adapter.session();\n  if (!(session instanceof DuplexRealtimeSession)) throw new Error('expected duplex session');\n  sessions.push(session);\n  const generations: GenerationCreatedEvent[] = [];\n  session.on('generation_created', (ev) => generations.push(ev));\n  return { model, adapter, fake: model.activeSession, session, generations };\n}\n\nasync function readGeneration(ev: GenerationCreatedEvent) {\n  const chunks: Array<string | TimedString> = [];\n  const frames: AudioFrame[] = [];\n  const messages = [];\n  for await (const message of ev.messageStream) {\n    messages.push(message);\n    for await (const f of message.audioStream) frames.push(f);\n    for await (const chunk of message.textStream) chunks.push(chunk);\n  }\n  const functions = [];\n  for await (const call of ev.functionStream) functions.push(call);\n  return {\n    frames,\n    chunks,\n    messages,\n    functions,\n    text: chunks.map((chunk) => (isTimedString(chunk) ? chunk.text : chunk)).join(''),\n  };\n}\n\ndescribe('duplex audio gates', () => {\n  it.each([0, 0.02])('stays closed on a steady floor of %s', (level) => {\n    const gate = new AdaptiveNoiseGate();\n    for (let i = 0; i < 40; i++) expect(gate.update(frame(level))).toBe(false);\n  });\n\n  it('opens above room tone and holds through short quiet gaps', () => {\n    const gate = new AdaptiveNoiseGate({ minSilenceDuration: 250 });\n    for (let i = 0; i < 30; i++) gate.update(frame(0.001));\n    expect(gate.update(frame(0.3))).toBe(true);\n    expect(gate.update(frame(0.001))).toBe(true);\n    expect(gate.update(frame(0.001))).toBe(true);\n    expect(gate.update(frame(0.001))).toBe(false);\n  });\n\n  it.each([false, true])('does not learn sustained speech as silence (gaps: %s)', (gaps) => {\n    const gate = new AdaptiveNoiseGate({ window: 1000 });\n    for (let i = 0; i < 30; i++) gate.update(frame(0.002));\n    for (let i = 0; i < 400; i++) {\n      expect(gate.update(frame(gaps && i % 10 === 9 ? 0.003 : 0.3))).toBe(true);\n    }\n    expect(gate.update(frame(0.3))).toBe(true);\n    for (let i = 0; i < 4; i++) expect(gate.update(frame(0.002))).toBe(true);\n    expect(gate.update(frame(0.002))).toBe(false);\n    expect(gate.update(frame(0.3))).toBe(true);\n  });\n\n  it('does not learn its floor from one dropped frame', () => {\n    const gate = new AdaptiveNoiseGate();\n    for (let i = 0; i < 30; i++) gate.update(frame(0.002));\n    gate.update(frame(0));\n    for (let i = 0; i < 300; i++) expect(gate.update(frame(0.002))).toBe(false);\n  });\n\n  it('recovers when a session starts mid-speech', () => {\n    const gate = new AdaptiveNoiseGate();\n    for (let i = 0; i < 30; i++) expect(gate.update(frame(0.2))).toBe(false);\n    for (let i = 0; i < 20; i++) gate.update(frame(0.002));\n    expect(gate.update(frame(0.2))).toBe(true);\n  });\n\n  it('uses a declared silence without learning and ignores room tone', () => {\n    const gate = new FixedGate(0.02);\n    for (let i = 0; i < 40; i++) expect(gate.update(frame(0.02))).toBe(false);\n    for (let i = 0; i < 600; i++) expect(gate.update(frame(0.3))).toBe(true);\n    for (let i = 0; i < 5; i++) gate.update(frame(0.02));\n    expect(gate.update(frame(0.02))).toBe(false);\n    expect(new FixedGate(0.002).update(frame(0.2))).toBe(true);\n  });\n\n  it('uses audio duration rather than frame count', () => {\n    const levels = [\n      ...Array<number>(12).fill(0.001),\n      ...Array<number>(6).fill(0.3),\n      ...Array<number>(12).fill(0.001),\n    ];\n    const decisions = [20, 100].map((duration) => {\n      const gate = new AdaptiveNoiseGate({ window: 1000, minSilenceDuration: 450 });\n      return levels.map((level) => {\n        let open = false;\n        for (let i = 0; i < 100 / duration; i++) open = gate.update(frame(level, duration));\n        return open;\n      });\n    });\n    expect(decisions[0]).toEqual(decisions[1]);\n    expect(decisions[0]![12]).toBe(true);\n    expect(decisions[0]!.at(-1)).toBe(false);\n  });\n\n  it.each([FixedGate, AdaptiveNoiseGate])(\n    'deactivates without forgetting the floor: %s',\n    (Gate) => {\n      const gate = Gate === FixedGate ? new FixedGate(0.002) : new AdaptiveNoiseGate();\n      for (let i = 0; i < 20; i++) gate.update(frame(0.002));\n      expect(gate.update(frame(0.3))).toBe(true);\n      gate.deactivate();\n      expect(gate.update(frame(0.002))).toBe(false);\n      expect(gate.update(frame(0.3))).toBe(true);\n    },\n  );\n});\n\ndescribe('duplex segmentation', () => {\n  it('prefers an explicit gate, then the model gate, then an adaptive gate', async () => {\n    const model = new FakeDuplexModel();\n    const inferred = setup({}, model);\n    inferred.fake.push(0.3);\n    await setImmediate();\n    expect(inferred.generations).toHaveLength(0);\n    vi.spyOn(model, 'audioGate').mockImplementation(() => new FixedGate(0.002));\n    const declared = setup({}, model);\n    declared.fake.push(0.3);\n    await setImmediate();\n    expect(declared.generations).toHaveLength(1);\n    const explicit = setup({ gate: () => new AdaptiveNoiseGate() }, model);\n    explicit.fake.push(0.3);\n    await setImmediate();\n    expect(explicit.generations).toHaveLength(0);\n  });\n\n  it('closes a burst when frames stop arriving, including the last frame duration', async () => {\n    vi.useFakeTimers({ toFake: ['setTimeout', 'clearTimeout'] });\n    const { fake, generations } = setup({ audioTimeout: 50 });\n    fake.push(0.001, 20);\n    fake.push(0.3, 3);\n    await setImmediate();\n    const read = readGeneration(generations[0]!);\n    let finished = false;\n    void read.then(() => {\n      finished = true;\n    });\n    await vi.advanceTimersByTimeAsync(149);\n    expect(finished).toBe(false);\n    await vi.advanceTimersByTimeAsync(1);\n    expect((await read).frames).toHaveLength(3);\n    fake.push(0.3, 3);\n    await setImmediate();\n    expect(generations).toHaveLength(2);\n  });\n\n  it('does not produce a generation from silence', async () => {\n    const { fake, generations } = setup();\n    fake.push(0, 20);\n    await setImmediate();\n    expect(generations).toEqual([]);\n  });\n\n  it('plays untranscribed backchannels without creating a chat item', async () => {\n    const { fake, session, generations } = setup();\n    fake.push(0.001, 20);\n    fake.push(0.3, 3);\n    fake.push(0.001, 8);\n    await setImmediate();\n    expect(generations).toHaveLength(1);\n    const result = await readGeneration(generations[0]!);\n    expect(result.frames).toHaveLength(7);\n    expect(result.text).toBe('');\n    expect(session.chatCtx.items).toEqual([]);\n  });\n\n  it('creates two generations for two stretches of speech', async () => {\n    const { fake, generations } = setup();\n    fake.push(0.001, 20);\n    for (let i = 0; i < 2; i++) {\n      fake.push(0.3, 3);\n      fake.push(0.001, 8);\n    }\n    await setImmediate();\n    expect(generations).toHaveLength(2);\n    expect(generations[0]!.responseId).not.toBe(generations[1]!.responseId);\n  });\n\n  it('preserves pauses inside an utterance', async () => {\n    const { fake, generations } = setup();\n    fake.push(0.001, 20);\n    fake.push(0.3, 3);\n    fake.push(0.001, 3);\n    fake.push(0.3, 3);\n    fake.push(0.001, 8);\n    await setImmediate();\n    expect(generations).toHaveLength(1);\n    expect((await readGeneration(generations[0]!)).frames).toHaveLength(13);\n  });\n\n  it('joins transcript fragments to the open burst', async () => {\n    const { fake, generations } = setup();\n    fake.push(0.001, 20);\n    fake.push(0.3, 2);\n    await setImmediate();\n    fake.say('Sure,', 2000, 2200);\n    fake.push(0.3, 2);\n    fake.say(' I can.', 2200, 2400);\n    fake.push(0.001, 8);\n    await setImmediate();\n    expect((await readGeneration(generations[0]!)).text).toBe('Sure, I can.');\n  });\n\n  it.each([false, true])(\n    'anchors timed text to the burst onset (stamped audio: %s)',\n    async (stamped) => {\n      const { fake, generations } = setup();\n      fake.push(0.001, 20, stamped ? 5000 : undefined);\n      fake.push(0.3, 2, stamped ? 7000 : undefined);\n      await setImmediate();\n      fake.say('hello', 7000, 7200);\n      fake.say(' there', 7200, 7400);\n      fake.push(0.3, 3, stamped ? 7200 : undefined);\n      await fake.close();\n      await setImmediate();\n      const { chunks } = await readGeneration(generations[0]!);\n      expect(chunks).toMatchObject([\n        { text: 'hello', startTime: 0, endTime: 0.2 },\n        { text: ' there', startTime: 0.2, endTime: 0.4 },\n      ]);\n    },\n  );\n\n  it('waits for sound when its transcript arrives first', async () => {\n    const { fake, generations } = setup();\n    fake.push(0.001, 20);\n    await setImmediate();\n    fake.say(' Sure.', 2000, 2200);\n    fake.push(0.001, 5);\n    await setImmediate();\n    expect(generations).toHaveLength(0);\n    fake.push(0.3, 3);\n    fake.push(0.001, 8);\n    await setImmediate();\n    expect((await readGeneration(generations[0]!)).text).toBe(' Sure.');\n  });\n\n  it('carries fragments beyond a burst into the next burst', async () => {\n    const { fake, generations } = setup();\n    fake.push(0.001, 20);\n    fake.push(0.3, 3);\n    await setImmediate();\n    fake.say(' Checking the current conditions.', 2000, 2800);\n    fake.say(\" It's\", 4200, 4400);\n    fake.push(0.001, 8);\n    await setImmediate();\n    expect((await readGeneration(generations[0]!)).text).toBe(' Checking the current conditions.');\n    fake.push(0.3, 3);\n    await setImmediate();\n    fake.say(' 62 degrees.', 4400, 5000);\n    fake.push(0.3, 3);\n    fake.push(0.001, 8);\n    await setImmediate();\n    expect((await readGeneration(generations[1]!)).text).toBe(\" It's 62 degrees.\");\n  });\n\n  it('anchors late fragments at the onset and keeps annotations monotonic', async () => {\n    const { fake, generations } = setup();\n    fake.push(0.001, 20);\n    fake.push(0.3, 5);\n    await setImmediate();\n    fake.say('Hello there.', 9000, 9400);\n    fake.say(' Again.', 9200, 9300);\n    fake.push(0.3);\n    await fake.close();\n    await setImmediate();\n    expect((await readGeneration(generations[0]!)).chunks).toMatchObject([\n      { startTime: 0, endTime: 0.4 },\n      { startTime: 0.4, endTime: 0.4 },\n    ]);\n  });\n\n  it('attaches an ahead-of-audio fragment only when the audio reaches it', async () => {\n    const { fake, generations } = setup();\n    fake.push(0.001, 20);\n    fake.push(0.3, 3);\n    await setImmediate();\n    fake.say(\" Yep, I've got order A1042\", 5000, 5600);\n    fake.say(' on file.', 6500, 6900);\n    fake.push(0.3);\n    await setImmediate();\n    const messageReader = generations[0]!.messageStream.getReader();\n    const message = (await messageReader.read()).value!;\n    const reader = message.textStream.getReader();\n    expect((await reader.read()).value).toMatchObject({ text: \" Yep, I've got order A1042\" });\n    let nextArrived = false;\n    const next = reader.read().then((value) => {\n      nextArrived = true;\n      return value;\n    });\n    await setImmediate();\n    expect(nextArrived).toBe(false);\n    fake.push(0.3, 2);\n    fake.push(0.001, 4);\n    fake.push(0.3, 3);\n    await setImmediate();\n    expect((await next).value).toMatchObject({ text: ' on file.' });\n    fake.push(0.001, 8);\n    await setImmediate();\n    expect(generations).toHaveLength(1);\n    reader.releaseLock();\n    messageReader.releaseLock();\n  });\n\n  it('emits an unclaimed transcript after three seconds of silent audio', async () => {\n    const { fake, generations } = setup();\n    const error = vi.spyOn(log(), 'error');\n    fake.push(0.001, 20);\n    await setImmediate();\n    fake.say('lost audio');\n    fake.push(0.001, 29);\n    await setImmediate();\n    expect(generations).toHaveLength(0);\n    fake.push(0.001);\n    await setImmediate();\n    const result = await readGeneration(generations[0]!);\n    expect(result.text).toBe('lost audio');\n    expect(result.frames).toHaveLength(0);\n    expect(error).toHaveBeenCalledWith(\n      expect.anything(),\n      'duplex transcript outlived the audio it describes',\n    );\n  });\n});\n\ndescribe('duplex events and context', () => {\n  it.each([false, true])(\n    'delivers tool calls with or without speech (speaking: %s)',\n    async (speaking) => {\n      const { fake, session, generations } = setup();\n      if (speaking) {\n        fake.push(0.001, 20);\n        fake.push(0.3, 3);\n        await setImmediate();\n      }\n      const call = FunctionCall.create({ callId: 'c1', name: 'lookup', args: '{}' });\n      fake.emit('function_call', call);\n      if (speaking) {\n        fake.say('Let me check.');\n        fake.push(0.001, 8);\n        await setImmediate();\n      }\n      expect(generations).toHaveLength(1);\n      const result = await readGeneration(generations[0]!);\n      expect(result.functions).toEqual([call]);\n      expect(result.messages).toHaveLength(speaking ? 1 : 0);\n      expect(result.text).toBe(speaking ? 'Let me check.' : '');\n      expect(session.chatCtx.getById(call.id)).toBe(call);\n    },\n  );\n\n  it('reconnects without carrying abandoned fragments into new speech', async () => {\n    const { model, fake, session, generations } = setup();\n    const reconnected = vi.fn();\n    session.on('session_reconnected', reconnected);\n    fake.push(0.001, 20);\n    fake.push(0.3, 3);\n    await setImmediate();\n    fake.say('lost words');\n    fake.emit('session_reconnected', {});\n    expect((await readGeneration(generations[0]!)).text).toBe('');\n    model.askable = true;\n    const reply = session.generateReply();\n    const replied = vi.fn();\n    void reply.then(replied, replied);\n    fake.push(0.001, 3);\n    await setImmediate();\n    expect(generations).toHaveLength(1);\n    expect(replied).not.toHaveBeenCalled();\n    fake.push(0.3, 3);\n    fake.push(0.001, 8);\n    await setImmediate();\n    await expect(reply).resolves.toBe(generations[1]);\n    expect((await readGeneration(generations[1]!)).text).toBe('');\n    expect(reconnected).toHaveBeenCalledOnce();\n  });\n\n  it('forwards user events without cutting the current burst', async () => {\n    const { fake, session, generations } = setup();\n    const events: unknown[] = [];\n    for (const name of [\n      'input_speech_started',\n      'input_audio_transcription_completed',\n      'input_speech_stopped',\n    ]) {\n      session.on(name, (ev) => events.push(ev));\n    }\n    fake.push(0.001, 20);\n    fake.push(0.3, 3);\n    await setImmediate();\n    fake.heard('u1', 'Hello');\n    fake.say('Still speaking');\n    fake.push(0.3, 2);\n    fake.push(0.001, 8);\n    await setImmediate();\n    expect(generations).toHaveLength(1);\n    expect(events).toHaveLength(3);\n    expect((await readGeneration(generations[0]!)).text).toBe('Still speaking');\n    expect(session.chatCtx.getById('u1')).toMatchObject({ transcriptConfidence: 1 });\n  });\n\n  it('records the same message IDs and preserves a delayed user transcript time and confidence', async () => {\n    const { fake, session, generations } = setup();\n    fake.push(0.001, 20);\n    fake.push(0.3, 3);\n    await setImmediate();\n    fake.say('Hi');\n    fake.push(0.001, 8);\n    await setImmediate();\n    fake.emit('input_audio_transcription_completed', {\n      itemId: 'u1',\n      transcript: 'Hello',\n      isFinal: true,\n      turnStartedAt: 1000,\n      confidence: 0,\n    });\n    const items = session.chatCtx.items;\n    expect(items[0]).toMatchObject({ id: 'u1', createdAt: 1000, transcriptConfidence: 0 });\n    expect(items[1]).toMatchObject({\n      id: generations[0]!.responseId,\n      role: 'assistant',\n      content: ['Hi'],\n    });\n    await session.updateChatCtx(session.chatCtx);\n    expect(fake.appended).toEqual([]);\n  });\n\n  it('forwards only new chat items and warns for edits to append-only history', async () => {\n    const { fake, session } = setup();\n    fake.heard('u1', 'Hello');\n    const context = session.chatCtx;\n    context.addMessage({ id: 'typed', role: 'user', content: 'typed input' });\n    const output = FunctionCallOutput.create({\n      callId: 'c1',\n      name: 'lookup',\n      output: 'rainy',\n      isError: false,\n    });\n    context.insert(output);\n    await session.updateChatCtx(context);\n    expect(fake.appended.map((item) => item.id)).toEqual(['typed', output.id]);\n    const warn = vi.spyOn(log(), 'warn');\n    const edited = session.chatCtx;\n    edited.remove('u1');\n    await session.updateChatCtx(edited);\n    expect(warn).toHaveBeenCalledWith(\n      { item_ids: ['u1'] },\n      'duplex context is append-only; the model keeps what it has been told',\n    );\n    expect(fake.appended).toHaveLength(2);\n  });\n\n  it('allows the framework to shorten assistant transcripts without warning or resending them', async () => {\n    const { fake, session } = setup();\n    const context = ChatContext.empty();\n    context.addMessage({ id: 'assistant', role: 'assistant', content: 'Hello there' });\n    await session._updateSession(undefined, context);\n    const edited = ChatContext.empty();\n    edited.addMessage({ id: 'assistant', role: 'assistant', content: 'Hello' });\n    const warn = vi.spyOn(log(), 'warn');\n    await session.updateChatCtx(edited);\n    expect(warn).not.toHaveBeenCalled();\n    expect(fake.appended).toHaveLength(1);\n  });\n\n  it('hands over complete configuration and seeds both histories', async () => {\n    const { fake, session } = setup();\n    expect(fake.configured).toBe(false);\n    const context = ChatContext.empty();\n    context.addMessage({ id: 'm1', role: 'user', content: 'a prior turn' });\n    const tools = ToolContext.empty();\n    await session._updateSession('be brief', context, tools);\n    expect(fake.configured).toBe(true);\n    expect(fake.connected).toBe(true);\n    expect(fake.configBatches).toEqual([['be brief', expect.any(ChatContext), tools]]);\n    expect(fake.appended.map((item) => item.id)).toEqual(['m1']);\n    expect(session.chatCtx.items.map((item) => item.id)).toEqual(['m1']);\n  });\n\n  it.each([\n    new RealtimeError('configuration failed'),\n    new Error('configuration failed'),\n    new DOMException('configuration aborted', 'AbortError'),\n  ])('closes a session whose startup configuration fails with %s', async (error) => {\n    const { fake, session } = setup();\n    vi.spyOn(fake, '_updateInstructions').mockRejectedValueOnce(error);\n    const updateTools = vi.spyOn(fake, '_updateTools');\n    const context = ChatContext.empty();\n    context.addMessage({ id: 'm1', role: 'user', content: 'a prior turn' });\n\n    await expect(session._updateSession('be brief', context, ToolContext.empty())).rejects.toBe(\n      error,\n    );\n\n    expect(fake.appended).toEqual([]);\n    expect(updateTools).not.toHaveBeenCalled();\n    expect(fake.closed).toBe(true);\n    expect(fake.connected).toBe(false);\n    expect(fake.configured).toBe(true);\n    expect(fake.audioStream.locked).toBe(false);\n    expect(fake.eventNames()).toEqual([]);\n  });\n\n  it('forwards input, configuration, metrics, and provider errors', async () => {\n    const { fake, adapter, session } = setup();\n    const push = vi.spyOn(fake, 'pushAudio');\n    const instructions = vi.spyOn(fake, '_updateInstructions');\n    const tools = vi.spyOn(fake, '_updateTools');\n    const options = vi.spyOn(fake, '_updateOptions');\n    const metrics: RealtimeModelMetrics[] = [];\n    const errors: RealtimeModelError[] = [];\n    session.on('metrics_collected', (ev) => metrics.push(ev));\n    session.on('error', (ev) => errors.push(ev));\n    const input = frame(0.3);\n    session.pushAudio(input);\n    await session.updateInstructions('new instructions');\n    const context = ToolContext.empty();\n    await session.updateTools(context);\n    session.updateOptions({ toolChoice: 'none' });\n    fake.reportConnectionAcquired(125);\n    const error: RealtimeModelError = {\n      type: 'realtime_model_error',\n      error: new Error('provider'),\n      timestamp: Date.now(),\n      label: 'fake',\n      recoverable: true,\n    };\n    fake.emit('error', error);\n    expect(push).toHaveBeenCalledWith(input);\n    expect(instructions).toHaveBeenCalledWith('new instructions');\n    expect(tools).toHaveBeenCalledWith(context);\n    expect(session.tools).toBe(context);\n    expect(options).toHaveBeenCalledWith({ toolChoice: 'none' });\n    expect(errors).toEqual([error]);\n    expect(metrics).toMatchObject([\n      {\n        acquireTimeMs: 125,\n        connectionReused: false,\n        inputTokens: 0,\n        outputTokens: 0,\n        metadata: { modelName: adapter.model, modelProvider: adapter.provider },\n      },\n    ]);\n  });\n\n  it.each([\n    new Error('secret provider payload', { cause: new Error('secret nested cause') }),\n    'secret provider payload',\n    { payload: 'secret' },\n  ])(\n    'reports an unrecoverable audio failure and closes the generation (reason: %s)',\n    async (reason) => {\n      const { fake, session, generations } = setup({ gate: () => new FixedGate(0.002) });\n      const errors: RealtimeModelError[] = [];\n      const logged = vi.spyOn(log(), 'error');\n      session.on('error', (error) => errors.push(error));\n      fake.push(0.3);\n      await setImmediate();\n      fake.controller.error(reason);\n      fake.closed = true;\n      await setImmediate();\n      const expectedError =\n        reason instanceof Error ? reason : new RealtimeError('duplex audio stream failed');\n      expect(errors).toMatchObject([\n        { recoverable: false, label: fake.duplexModel.label(), error: expectedError },\n      ]);\n      if (reason instanceof Error) expect(errors[0]!.error).toBe(reason);\n      expect(logged).toHaveBeenCalledWith('duplex audio stream failed');\n      expect((await readGeneration(generations[0]!)).frames).toHaveLength(1);\n    },\n  );\n\n  it('releases the blocked reader and event listeners when closing before configuration', async () => {\n    const { fake, session } = setup();\n    const close = vi.spyOn(fake, 'close');\n    const closing = Promise.all([session.close(), session.close()]);\n    try {\n      await vi.waitFor(() => expect(fake.closed).toBe(true));\n      expect(close).toHaveBeenCalledOnce();\n      expect(fake.configured).toBe(true);\n      expect(fake.connected).toBe(false);\n      expect(fake.audioStream.locked).toBe(false);\n      expect(fake.eventNames()).toEqual([]);\n    } finally {\n      await fake._updateSession();\n      await closing;\n    }\n  });\n});\n\ndescribe('duplex requested replies', () => {\n  it.each([false, true])(\n    'claims audio enqueued inside the provider reply hook (previous request: %s)',\n    async (previousRequest) => {\n      const { model, fake, session, generations } = setup({ gate: () => new FixedGate(0.002) });\n      model.askable = true;\n      const previous = previousRequest\n        ? expect(session.generateReply()).rejects.toThrow('superseded')\n        : undefined;\n      vi.spyOn(fake, '_generateReply').mockImplementationOnce(() => fake.push(0.3));\n\n      const reply = session.generateReply();\n      await setImmediate();\n\n      expect(generations).toHaveLength(1);\n      expect(generations[0]!.userInitiated).toBe(true);\n      await expect(reply).resolves.toBe(generations[0]);\n      await previous;\n    },\n  );\n\n  it('rejects requests if the model decides when to speak', async () => {\n    const { session } = setup();\n    await expect(session.generateReply()).rejects.toThrow('decides for itself');\n  });\n\n  it('resolves a requested reply on speech, not an earlier standalone tool call', async () => {\n    const { fake, model, session, generations } = setup();\n    model.askable = true;\n    const reply = session.generateReply('say hi');\n    let replied = false;\n    void reply.then(() => {\n      replied = true;\n    });\n    expect(fake.repliesRequested).toEqual(['say hi']);\n    fake.emit('function_call', FunctionCall.create({ callId: 'c1', name: 'lookup', args: '{}' }));\n    await setImmediate();\n    expect(replied).toBe(false);\n    expect(generations[0]!.userInitiated).toBe(false);\n    fake.push(0.001, 20);\n    fake.push(0.3, 3);\n    await setImmediate();\n    expect(await reply).toBe(generations[1]);\n    expect(generations[1]!.userInitiated).toBe(true);\n  });\n\n  it('rejects superseded, reconnected, and closed requests', async () => {\n    const { model, fake, session } = setup();\n    model.askable = true;\n    const first = expect(session.generateReply()).rejects.toThrow('superseded');\n    const second = expect(session.generateReply()).rejects.toThrow('reconnected');\n    await first;\n    fake.emit('session_reconnected', {});\n    await second;\n    const third = expect(session.generateReply()).rejects.toThrow('closed');\n    await session.close();\n    await third;\n    await expect(session.generateReply()).rejects.toThrow('closed');\n  });\n\n  it('times out a declined request', async () => {\n    vi.useFakeTimers({ toFake: ['setTimeout', 'clearTimeout'] });\n    const { model, session } = setup();\n    model.askable = true;\n    const reply = expect(session.generateReply()).rejects.toThrow('did not start speaking');\n    await vi.advanceTimersByTimeAsync(10_000);\n    await reply;\n    expect(vi.getTimerCount()).toBe(0);\n  });\n\n  it.each([undefined, 'user disconnected', { source: 'client' }, new Error('aborted')])(\n    'cancels pending requests without claiming later speech (abort reason: %s)',\n    async (reason) => {\n      const { model, fake, session, generations } = setup({ gate: () => new FixedGate(0.002) });\n      model.askable = true;\n      const controller = new AbortController();\n      const reply = expect(\n        session.generateReply(undefined, { signal: controller.signal }),\n      ).rejects.toThrow('aborted');\n      controller.abort(reason);\n      await reply;\n      fake.push(0.3);\n      await setImmediate();\n      expect(generations[0]!.userInitiated).toBe(false);\n      const count = fake.repliesRequested.length;\n      await expect(session.generateReply(undefined, { signal: controller.signal })).rejects.toThrow(\n        'aborted',\n      );\n      expect(fake.repliesRequested).toHaveLength(count);\n    },\n  );\n});\n\ndescribe('duplex model integration', () => {\n  // a duplex model has no text modality: it hears and speaks only audio, and the adapter resolves\n  // a reply from the sound the model produces. under a text simulation there is no audio, so the\n  // session refuses to start rather than time out on the first turn\n  it('refuses to start under a text simulation', async () => {\n    vi.spyOn(AgentSession.prototype, '_textOnly', 'get').mockReturnValue(true);\n    const session = new AgentSession({ llm: new FakeDuplexModel(), vad: null });\n    await expect(session.start({ agent: new Agent({ instructions: '' }) })).rejects.toThrow(\n      /text simulation/,\n    );\n  });\n\n  it('does not arm an away timer from a shutdown transcript and still handles restarts', async () => {\n    vi.useFakeTimers({ toFake: ['setTimeout', 'clearTimeout'], shouldAdvanceTime: true });\n    const model = new FakeDuplexModel();\n    const agent = new Agent({ instructions: '' });\n    const session = new AgentSession({\n      llm: model,\n      vad: null,\n      aecWarmupDuration: null,\n      userAwayTimeout: 1,\n    });\n    await session.start({ agent });\n    vi.spyOn(agent, 'onExit').mockImplementationOnce(async () => {\n      session.emit(\n        AgentSessionEventTypes.UserInputTranscribed,\n        createUserInputTranscribedEvent({ transcript: 'goodbye', isFinal: true }),\n      );\n    });\n    await session.close();\n    await vi.advanceTimersByTimeAsync(1000);\n    expect(session.userState).toBe('listening');\n    await session.start({ agent });\n    try {\n      await vi.advanceTimersByTimeAsync(500);\n      expect(session.userState).toBe('listening');\n      await vi.advanceTimersByTimeAsync(500);\n      expect(session.userState).toBe('away');\n    } finally {\n      await session.close();\n    }\n  });\n\n  it.each([false, true])(\n    'awaits provider chat updates through Agent.updateChatCtx (failure: %s)',\n    async (fail) => {\n      const model = new FakeDuplexModel();\n      const agent = new Agent({ instructions: '' });\n      const session = new AgentSession({ llm: model, vad: null, aecWarmupDuration: null });\n      await session.start({ agent });\n      const provider = model.activeSession;\n      const appended = new Future<void>();\n      const entered = new Future<void>();\n      const appendItems = provider._appendItems.bind(provider);\n      vi.spyOn(provider, '_appendItems').mockImplementationOnce(async (items) => {\n        entered.resolve();\n        await appended.await;\n        await appendItems(items);\n      });\n      const error = new RealtimeError('append failed');\n      const context = agent.chatCtx.copy();\n      context.addMessage({ id: 'new-item', role: 'user', content: 'hello' });\n      let settled = false;\n      const result = agent.updateChatCtx(context).then(\n        () => {\n          settled = true;\n          return undefined;\n        },\n        (error: unknown) => {\n          settled = true;\n          return error;\n        },\n      );\n\n      try {\n        await entered.await;\n        await setImmediate();\n        expect(settled).toBe(false);\n        if (fail) appended.reject(error);\n        else appended.resolve();\n        expect(await result).toBe(fail ? error : undefined);\n        expect(provider.appended.some((item) => item.id === 'new-item')).toBe(!fail);\n      } finally {\n        if (!appended.done) appended.resolve();\n        await result;\n        await session.close();\n      }\n    },\n  );\n\n  it('rejects failed startup, cleans up, and allows a fresh start', async () => {\n    const error = new RealtimeError('configuration failed');\n    vi.spyOn(FakeDuplexSession.prototype, '_updateInstructions').mockRejectedValueOnce(error);\n    const model = new FakeDuplexModel();\n    const agentTools = Toolset.create({ id: 'agent', tools: [] });\n    const sessionTools = Toolset.create({ id: 'session', tools: [] });\n    const setupAgentTools = vi.spyOn(agentTools, 'setup');\n    const setupSessionTools = vi.spyOn(sessionTools, 'setup');\n    const closeAgentTools = vi.spyOn(agentTools, 'aclose');\n    const closeSessionTools = vi.spyOn(sessionTools, 'aclose');\n    const agent = new Agent({ instructions: 'be brief', tools: [agentTools] });\n    const session = new AgentSession({\n      llm: model,\n      tools: [sessionTools],\n      vad: null,\n      aecWarmupDuration: null,\n    });\n    const closeProvider = vi.spyOn(FakeDuplexSession.prototype, 'close');\n    const onEnter = vi.spyOn(agent, 'onEnter');\n    await expect(session.start({ agent })).rejects.toBe(error);\n    const provider = model.activeSession;\n    try {\n      expect(provider.closed).toBe(true);\n      expect(provider.configured).toBe(true);\n      expect(provider.connected).toBe(false);\n      expect(provider.audioStream.locked).toBe(false);\n      expect(provider.eventNames()).toEqual([]);\n      expect(session._started).toBe(false);\n      expect(session.rootSpanContext).toBeUndefined();\n      expect(onEnter).not.toHaveBeenCalled();\n      expect(() => agent.getActivityOrThrow()).toThrow('Agent activity not found');\n      expect(setupAgentTools).toHaveBeenCalledOnce();\n      expect(setupSessionTools).toHaveBeenCalledOnce();\n      expect(closeAgentTools).toHaveBeenCalledOnce();\n      expect(closeSessionTools).toHaveBeenCalledOnce();\n    } finally {\n      await session.close();\n    }\n    expect(closeProvider).toHaveBeenCalledOnce();\n    expect(() => agent.getActivityOrThrow()).toThrow('Agent activity not found');\n\n    await session.start({ agent });\n    try {\n      expect(session._started).toBe(true);\n      expect(model.activeSession.connected).toBe(true);\n      expect(model.activeSession.closed).toBe(false);\n      expect(setupAgentTools).toHaveBeenCalledTimes(2);\n      expect(setupSessionTools).toHaveBeenCalledTimes(2);\n      session._updateUserState('away');\n      session.emit(\n        AgentSessionEventTypes.UserInputTranscribed,\n        createUserInputTranscribedEvent({ transcript: 'hello', isFinal: true }),\n      );\n      expect(session.userState).toBe('listening');\n    } finally {\n      await session.close();\n    }\n  });\n\n  it.each(['none', 'listening', 'throwing'] as const)(\n    'closes after failed handoff configuration with a %s application error listener',\n    async (listener) => {\n      const model = new FakeDuplexModel();\n      const agent = new Agent({ instructions: 'first' });\n      const nextAgent = new Agent({ instructions: 'second' });\n      const session = new AgentSession({ llm: model, vad: null, aecWarmupDuration: null });\n      const closed = vi.fn();\n      session.on(AgentSessionEventTypes.Close, closed);\n      const errors = vi.fn(() => {\n        if (listener === 'throwing') throw new Error('application error listener failed');\n      });\n      if (listener !== 'none') session.on(AgentSessionEventTypes.Error, errors);\n      await session.start({ agent });\n      const firstProvider = model.activeSession;\n      const onEnter = vi.spyOn(nextAgent, 'onEnter');\n      vi.spyOn(FakeDuplexSession.prototype, '_updateInstructions').mockRejectedValueOnce(\n        new RealtimeError('configuration failed'),\n      );\n      session.updateAgent(nextAgent);\n\n      try {\n        await vi.waitFor(() => {\n          expect(closed).toHaveBeenCalledWith(\n            expect.objectContaining({ reason: CloseReason.ERROR }),\n          );\n        });\n        expect(firstProvider.closed).toBe(true);\n        expect(model.activeSession.closed).toBe(true);\n        expect(model.activeSession.audioStream.locked).toBe(false);\n        expect(model.activeSession.eventNames()).toEqual([]);\n        expect(onEnter).not.toHaveBeenCalled();\n        expect(errors).toHaveBeenCalledTimes(listener === 'none' ? 0 : 1);\n        expect(() => agent.getActivityOrThrow()).toThrow('Agent activity not found');\n        expect(() => nextAgent.getActivityOrThrow()).toThrow('Agent activity not found');\n      } finally {\n        await session.close();\n      }\n    },\n  );\n\n  it.each(['none', 'listening', 'throwing'] as const)(\n    'closes on an unrecoverable audio error with a %s application error listener',\n    async (listener) => {\n      const model = new FakeDuplexModel();\n      const agent = new Agent({ instructions: '' });\n      const session = new AgentSession({ llm: model, vad: null, aecWarmupDuration: null });\n      const closed = vi.fn();\n      session.on(AgentSessionEventTypes.Close, closed);\n      const errors = vi.fn(() => {\n        if (listener === 'throwing') throw new Error('application error listener failed');\n      });\n      if (listener !== 'none') session.on(AgentSessionEventTypes.Error, errors);\n      await session.start({ agent });\n      const provider = model.activeSession;\n      const closeProvider = vi.spyOn(provider, 'close');\n      provider.controller.error(new Error('audio stream failed'));\n      provider.closed = true;\n\n      try {\n        await vi.waitFor(() => {\n          expect(closed).toHaveBeenCalledWith(\n            expect.objectContaining({ reason: CloseReason.ERROR }),\n          );\n        });\n        expect(closeProvider).toHaveBeenCalledOnce();\n        expect(provider.eventNames()).toEqual([]);\n        expect(errors).toHaveBeenCalledTimes(listener === 'none' ? 0 : 1);\n        expect(() => agent.getActivityOrThrow()).toThrow('Agent activity not found');\n      } finally {\n        await session.close();\n      }\n    },\n  );\n\n  it.each([false, true])(\n    'closes after an audio error during shutdown (error listener: %s)',\n    async (listenForErrors) => {\n      const model = new FakeDuplexModel();\n      const agent = new Agent({ instructions: '' });\n      const session = new AgentSession({ llm: model, vad: null, aecWarmupDuration: null });\n      const errors = vi.fn();\n      if (listenForErrors) session.on(AgentSessionEventTypes.Error, errors);\n      await session.start({ agent });\n      const provider = model.activeSession;\n      const realtime = agent.getActivityOrThrow().realtimeLLMSession!;\n      const closeProvider = vi.spyOn(provider, 'close');\n      const closeKeyterms = session._keytermDetector.aclose.bind(session._keytermDetector);\n      vi.spyOn(session._keytermDetector, 'aclose').mockImplementationOnce(async () => {\n        provider.controller.error(new Error('audio failed during shutdown'));\n        provider.closed = true;\n        await setImmediate();\n        await closeKeyterms();\n      });\n\n      await session.close();\n\n      expect(closeProvider).toHaveBeenCalledOnce();\n      expect(provider.audioStream.locked).toBe(false);\n      expect(provider.eventNames()).toEqual([]);\n      expect(realtime.listenerCount('error')).toBe(0);\n      expect(realtime.listenerCount('metrics_collected')).toBe(0);\n      expect(errors).toHaveBeenCalledTimes(listenForErrors ? 1 : 0);\n      expect(() => agent.getActivityOrThrow()).toThrow('Agent activity not found');\n    },\n  );\n\n  it('wraps models passed to Agent, AgentSession, and updateOptions', async () => {\n    const model = new FakeDuplexModel();\n    const session = new AgentSession({ llm: model, vad: null });\n    const agent = new Agent({ instructions: '', llm: model });\n    expect(session.llm).toBeInstanceOf(DuplexRealtimeAdapter);\n    expect(agent.llm).toBeInstanceOf(DuplexRealtimeAdapter);\n    const replacement = new FakeDuplexModel();\n    await agent.updateOptions({ llm: replacement });\n    expect((agent.llm as DuplexRealtimeAdapter).duplexModel).toBe(replacement);\n    expect(() => agent.duplexSession).toThrow('Agent activity not found');\n  });\n\n  it('exposes the running provider session and rejects a model swap while running', async () => {\n    const model = new FakeDuplexModel();\n    const agent = new Agent({ instructions: '' });\n    const session = new AgentSession({ llm: model, vad: null, aecWarmupDuration: null });\n    await session.start({ agent });\n    try {\n      expect(agent.duplexSession).toBe(model.activeSession);\n      expect(model.activeSession.configured).toBe(true);\n      await expect(agent.updateOptions({ llm: new FakeDuplexModel() })).rejects.toThrow();\n    } finally {\n      await session.close();\n    }\n  });\n\n  it('rejects duplexSession when the running agent has no duplex model', async () => {\n    const agent = new Agent({ instructions: '' });\n    const session = new AgentSession({ vad: null, turnHandling: { turnDetection: null } });\n    await session.start({ agent });\n    try {\n      expect(() => agent.duplexSession).toThrow('not running a DuplexModel');\n    } finally {\n      await session.close();\n    }\n  });\n});\n"],"mappings":"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","names":["error"]}