{"version":3,"sources":["../../src/voice/remote_session.test.ts"],"sourcesContent":["// SPDX-FileCopyrightText: 2026 LiveKit, Inc.\n//\n// SPDX-License-Identifier: Apache-2.0\nimport { AgentSession as pb } from '@livekit/protocol';\nimport * as net from 'node:net';\nimport { afterEach, beforeAll, describe, expect, it, vi } from 'vitest';\nimport type { InferenceExecutor } from '../ipc/inference_executor.js';\nimport {\n  JobContext,\n  type JobProcess,\n  type RunningJobInfo,\n  runWithJobContextAsync,\n} from '../job.js';\nimport { initializeLogger } from '../log.js';\nimport type { SimulationContext } from '../simulation.js';\nimport type { AgentSession } from './agent_session.js';\nimport { FinalizeSimulationError } from './index.js';\nimport {\n  RemoteSession,\n  SessionHost,\n  SessionTransport,\n  TcpSessionTransport,\n} from './remote_session.js';\n\nbeforeAll(() => {\n  initializeLogger({ pretty: true, level: 'info' });\n});\n\n// Every session event the host forwards to a remote consumer. Asserting the set\n// rather than its size says which events are forwarded, and pairs register with\n// close: an `on` added without its `off` leaks a handler across reconnects and\n// only shows up as a mismatch between these two.\nconst FORWARDED_EVENTS = new Set([\n  'agent_false_interruption',\n  'agent_state_changed',\n  'conversation_item_added',\n  'debug_message',\n  'eot_prediction',\n  'error',\n  'function_tools_executed',\n  'metrics_collected',\n  'overlapping_speech',\n  'user_input_transcribed',\n  'user_state_changed',\n]);\n\nfunction frame(msg: pb.AgentSessionMessage): Buffer {\n  const data = msg.toBinary();\n  const header = Buffer.allocUnsafe(4);\n  header.writeUInt32BE(data.length, 0);\n  return Buffer.concat([header, Buffer.from(data)]);\n}\n\nfunction pingMessage(requestId: string): pb.AgentSessionMessage {\n  return new pb.AgentSessionMessage({\n    message: {\n      case: 'request',\n      value: new pb.SessionRequest({\n        requestId,\n        request: { case: 'ping', value: new pb.SessionRequest_Ping() },\n      }),\n    },\n  });\n}\n\nasync function listen(server: net.Server): Promise<number> {\n  await new Promise<void>((resolve) => server.listen(0, '127.0.0.1', resolve));\n  return (server.address() as net.AddressInfo).port;\n}\n\ndescribe('TcpSessionTransport framing', () => {\n  let server: net.Server | undefined;\n  let transport: TcpSessionTransport | undefined;\n\n  afterEach(async () => {\n    await transport?.close();\n    transport = undefined;\n    if (server) {\n      await new Promise<void>((resolve) => server!.close(() => resolve()));\n      server = undefined;\n    }\n  });\n\n  it('decodes a single framed message', async () => {\n    server = net.createServer((sock) => {\n      sock.write(frame(pingMessage('r1')));\n    });\n    const port = await listen(server);\n\n    transport = new TcpSessionTransport('127.0.0.1', port);\n    await transport.start();\n\n    const it = transport[Symbol.asyncIterator]();\n    const { value, done } = await it.next();\n    expect(done).toBe(false);\n    expect(value.message.case).toBe('request');\n    expect((value.message.value as pb.SessionRequest).requestId).toBe('r1');\n  });\n\n  it('reassembles a frame delivered across multiple chunks', async () => {\n    const buf = frame(pingMessage('split'));\n    server = net.createServer((sock) => {\n      // header + 1 byte, then the remainder after a tick\n      sock.write(buf.subarray(0, 5));\n      setTimeout(() => sock.write(buf.subarray(5)), 10);\n    });\n    const port = await listen(server);\n\n    transport = new TcpSessionTransport('127.0.0.1', port);\n    await transport.start();\n\n    const it = transport[Symbol.asyncIterator]();\n    const { value } = await it.next();\n    expect((value.message.value as pb.SessionRequest).requestId).toBe('split');\n  });\n\n  it('decodes multiple frames coalesced into one chunk', async () => {\n    server = net.createServer((sock) => {\n      sock.write(Buffer.concat([frame(pingMessage('a')), frame(pingMessage('b'))]));\n    });\n    const port = await listen(server);\n\n    transport = new TcpSessionTransport('127.0.0.1', port);\n    await transport.start();\n\n    const it = transport[Symbol.asyncIterator]();\n    const first = await it.next();\n    const second = await it.next();\n    expect((first.value.message.value as pb.SessionRequest).requestId).toBe('a');\n    expect((second.value.message.value as pb.SessionRequest).requestId).toBe('b');\n  });\n\n  it('round-trips a sent message back through the wire', async () => {\n    const received: Buffer[] = [];\n    const sawFullFrame = new Promise<void>((resolve) => {\n      server = net.createServer((sock) => {\n        sock.on('data', (d) => {\n          received.push(d);\n          resolve();\n        });\n      });\n    });\n    const port = await listen(server!);\n\n    transport = new TcpSessionTransport('127.0.0.1', port);\n    await transport.start();\n    await transport.sendMessage(pingMessage('outbound'));\n\n    await sawFullFrame;\n    const wire = Buffer.concat(received);\n    const length = wire.readUInt32BE(0);\n    const decoded = pb.AgentSessionMessage.fromBinary(wire.subarray(4, 4 + length));\n    expect((decoded.message.value as pb.SessionRequest).requestId).toBe('outbound');\n  });\n\n  it('rejects start() when nothing is listening', async () => {\n    // ephemeral port that is (almost certainly) closed\n    const t = new TcpSessionTransport('127.0.0.1', 1);\n    await expect(t.start()).rejects.toThrow();\n  });\n\n  it('unblocks a backpressured sendMessage when the transport closes', async () => {\n    // Self-contained: a non-reading server leaves its connection open, so we\n    // manage its lifecycle here rather than via the shared afterEach.\n    let serverSocket: net.Socket | undefined;\n    const localServer = net.createServer((sock) => {\n      serverSocket = sock; // intentionally never consume incoming data\n    });\n    const port = await listen(localServer);\n\n    const t = new TcpSessionTransport('127.0.0.1', port);\n    await t.start();\n    try {\n      // 4 MiB payload guarantees we exceed the 64 KiB drain threshold and park\n      // in waitForDrain (the peer never reads, so no natural 'drain').\n      const huge = 'x'.repeat(4 * 1024 * 1024);\n      const msg = new pb.AgentSessionMessage({\n        message: {\n          case: 'request',\n          value: new pb.SessionRequest({\n            requestId: huge,\n            request: { case: 'ping', value: new pb.SessionRequest_Ping() },\n          }),\n        },\n      });\n\n      const sendPromise = t.sendMessage(msg);\n      await new Promise((r) => setTimeout(r, 50)); // ensure we're parked in the drain wait\n      await t.close();\n\n      // Without the close/error race this would hang until the test times out.\n      await expect(sendPromise).resolves.toBeUndefined();\n    } finally {\n      await t.close();\n      serverSocket?.destroy();\n      await new Promise<void>((resolve) => localServer.close(() => resolve()));\n    }\n  });\n});\n\n/** In-memory transport so SessionHost can be driven without a socket. */\nclass FakeTransport extends SessionTransport {\n  readonly sent: pb.AgentSessionMessage[] = [];\n  private readonly inbound: pb.AgentSessionMessage[] = [];\n  private waitingResolve: ((value: IteratorResult<pb.AgentSessionMessage>) => void) | null = null;\n  private closed = false;\n  private peer?: FakeTransport;\n\n  connect(peer: FakeTransport): void {\n    this.peer = peer;\n  }\n\n  push(msg: pb.AgentSessionMessage): void {\n    if (this.waitingResolve) {\n      const resolve = this.waitingResolve;\n      this.waitingResolve = null;\n      resolve({ value: msg, done: false });\n    } else {\n      this.inbound.push(msg);\n    }\n  }\n\n  override async sendMessage(msg: pb.AgentSessionMessage): Promise<void> {\n    this.sent.push(msg);\n    this.peer?.push(msg);\n  }\n\n  override async close(): Promise<void> {\n    this.closed = true;\n    if (this.waitingResolve) {\n      const resolve = this.waitingResolve;\n      this.waitingResolve = null;\n      resolve({ value: undefined as unknown as pb.AgentSessionMessage, done: true });\n    }\n  }\n\n  override [Symbol.asyncIterator](): AsyncIterator<pb.AgentSessionMessage> {\n    return {\n      next: () => {\n        const pending = this.inbound.shift();\n        if (pending) return Promise.resolve({ value: pending, done: false });\n        if (this.closed) {\n          return Promise.resolve({\n            value: undefined as unknown as pb.AgentSessionMessage,\n            done: true,\n          });\n        }\n        return new Promise((resolve) => {\n          this.waitingResolve = resolve;\n        });\n      },\n    };\n  }\n}\n\nfunction createConnectedTransportPair(): [FakeTransport, FakeTransport] {\n  const client = new FakeTransport();\n  const host = new FakeTransport();\n  client.connect(host);\n  host.connect(client);\n  return [client, host];\n}\n\ndescribe('SessionHost event forwarding', () => {\n  it('registers every forwarded event', () => {\n    const on = vi.fn();\n    const session = { on, off: vi.fn() } as unknown as AgentSession;\n    const host = new SessionHost(new FakeTransport());\n\n    host.registerSession(session);\n\n    const subscribed = new Set(on.mock.calls.map(([event]) => event));\n    expect(subscribed).toEqual(FORWARDED_EVENTS);\n  });\n\n  it('unregisters every forwarded event on close', async () => {\n    const off = vi.fn();\n    const session = { on: vi.fn(), off } as unknown as AgentSession;\n    const host = new SessionHost(new FakeTransport());\n\n    host.registerSession(session);\n    await host.start();\n    await host.close();\n\n    const unsubscribed = new Set(off.mock.calls.map(([event]) => event));\n    expect(unsubscribed).toEqual(FORWARDED_EVENTS);\n  });\n});\n\ndescribe('RemoteSession RPCs', () => {\n  it('fetches framework info', async () => {\n    const transport = new FakeTransport();\n    const remote = new RemoteSession(transport);\n    await remote.start();\n\n    const frameworkInfo = remote.fetchFrameworkInfo();\n    await vi.waitFor(() => expect(transport.sent.length).toBe(1));\n\n    const request = transport.sent[0]!.message.value as pb.SessionRequest;\n    expect(request.request.case).toBe('getFrameworkInfo');\n\n    transport.push(\n      new pb.AgentSessionMessage({\n        message: {\n          case: 'response',\n          value: new pb.SessionResponse({\n            requestId: request.requestId,\n            response: {\n              case: 'getFrameworkInfo',\n              value: new pb.SessionResponse_GetFrameworkInfoResponse({\n                sdk: 'js',\n                sdkVersion: '1.5.5',\n              }),\n            },\n          }),\n        },\n      }),\n    );\n\n    await expect(frameworkInfo).resolves.toMatchObject({\n      sdk: 'js',\n      sdkVersion: '1.5.5',\n    });\n    await remote.close();\n  });\n});\n\nasync function startConnectedClientHost(ctx: JobContext) {\n  const [clientTransport, hostTransport] = createConnectedTransportPair();\n  const remote = new RemoteSession(clientTransport);\n  const host = new SessionHost(hostTransport);\n  host.registerSession(fakeAgentSession());\n  await runWithJobContextAsync(ctx, async () => host.start());\n  await remote.start();\n\n  return { remote, host, clientTransport, hostTransport };\n}\n\ndescribe('RemoteSession and SessionHost finalizeSimulation', () => {\n  it('round-trips a normal finalize through connected transports', async () => {\n    const ctx = fakeSimJobContext((simCtx) => {\n      expect(simCtx.simulatorVerdict).toEqual({\n        success: true,\n        reason: 'conversation passed',\n      });\n      simCtx.fail('backend state diverged');\n    });\n    const { remote, host, clientTransport, hostTransport } = await startConnectedClientHost(ctx);\n\n    try {\n      await expect(\n        remote.finalizeSimulation({\n          provisionalSuccess: true,\n          provisionalReason: 'conversation passed',\n        }),\n      ).resolves.toMatchObject({\n        userVerdict: { success: false, reason: 'backend state diverged' },\n      });\n      expect(clientTransport.sent).toHaveLength(1);\n      expect(hostTransport.sent).toHaveLength(1);\n    } finally {\n      await remote.close();\n      await host.close();\n    }\n  });\n\n  it('propagates a callback error through connected transports', async () => {\n    const ctx = fakeSimJobContext(() => {\n      throw new Error('user callback exploded');\n    });\n    const { remote, host } = await startConnectedClientHost(ctx);\n\n    try {\n      const error = await remote\n        .finalizeSimulation({ provisionalSuccess: true })\n        .catch((error: unknown) => error);\n      expect(error).toBeInstanceOf(FinalizeSimulationError);\n      expect(error).toMatchObject({\n        name: 'FinalizeSimulationError',\n        message: 'user callback exploded',\n        userVerdict: undefined,\n      });\n    } finally {\n      await remote.close();\n      await host.close();\n    }\n  });\n\n  it('propagates the callback error without losing a fail-then-throw veto', async () => {\n    const ctx = fakeSimJobContext((simCtx) => {\n      simCtx.fail('backend state diverged');\n      throw new Error('cleanup exploded');\n    });\n    const { remote, host } = await startConnectedClientHost(ctx);\n\n    try {\n      const error = await remote\n        .finalizeSimulation({ provisionalSuccess: true })\n        .catch((error: unknown) => error);\n      expect(error).toBeInstanceOf(FinalizeSimulationError);\n      expect(error).toMatchObject({\n        name: 'FinalizeSimulationError',\n        message: 'cleanup exploded',\n        userVerdict: {\n          success: false,\n          reason: 'backend state diverged',\n        },\n      });\n    } finally {\n      await remote.close();\n      await host.close();\n    }\n  });\n\n  it('keeps generic request errors generic', async () => {\n    const [clientTransport, serverTransport] = createConnectedTransportPair();\n    const remote = new RemoteSession(clientTransport);\n    await remote.start();\n    const respond = (async () => {\n      const { value: message } = await serverTransport[Symbol.asyncIterator]().next();\n      const request = message.message.value as pb.SessionRequest;\n      await serverTransport.sendMessage(\n        new pb.AgentSessionMessage({\n          message: {\n            case: 'response',\n            value: new pb.SessionResponse({\n              requestId: request.requestId,\n              error: 'generic request exploded',\n            }),\n          },\n        }),\n      );\n    })();\n\n    try {\n      const error = await remote.fetchSessionState().catch((error: unknown) => error);\n      await respond;\n      expect(error).toBeInstanceOf(Error);\n      expect(error).not.toBeInstanceOf(FinalizeSimulationError);\n      expect(error).toMatchObject({ message: 'generic request exploded' });\n    } finally {\n      await remote.close();\n      await serverTransport.close();\n    }\n  });\n});\n\ndescribe('SessionHost updateIo', () => {\n  it('toggles input/output enabled flags and acks', async () => {\n    const setInputAudio = vi.fn();\n    const setOutputAudio = vi.fn();\n    const setTranscription = vi.fn();\n    const fakeSession = {\n      on: () => {},\n      off: () => {},\n      input: { setAudioEnabled: setInputAudio },\n      output: {\n        setAudioEnabled: setOutputAudio,\n        setTranscriptionEnabled: setTranscription,\n      },\n    } as unknown as AgentSession;\n\n    const transport = new FakeTransport();\n    const host = new SessionHost(transport);\n    host.registerSession(fakeSession);\n    await host.start();\n\n    transport.push(\n      new pb.AgentSessionMessage({\n        message: {\n          case: 'request',\n          value: new pb.SessionRequest({\n            requestId: 'io1',\n            request: {\n              case: 'updateIo',\n              value: new pb.SessionRequest_UpdateIO({\n                input: new pb.SessionRequest_UpdateIO_Input({ audioEnabled: false }),\n                output: new pb.SessionRequest_UpdateIO_Output({\n                  audioEnabled: true,\n                  transcriptionEnabled: false,\n                }),\n              }),\n            },\n          }),\n        },\n      }),\n    );\n\n    // wait for the tracked task to send the response\n    await vi.waitFor(() => expect(transport.sent.length).toBe(1));\n\n    expect(setInputAudio).toHaveBeenCalledWith(false);\n    expect(setOutputAudio).toHaveBeenCalledWith(true);\n    expect(setTranscription).toHaveBeenCalledWith(false);\n\n    const resp = transport.sent[0]!.message.value as pb.SessionResponse;\n    expect(resp.requestId).toBe('io1');\n    expect(resp.response.case).toBe('updateIo');\n\n    await host.close();\n  });\n\n  it('ignores unset optional fields', async () => {\n    const setInputAudio = vi.fn();\n    const setOutputAudio = vi.fn();\n    const setTranscription = vi.fn();\n    const fakeSession = {\n      on: () => {},\n      off: () => {},\n      input: { setAudioEnabled: setInputAudio },\n      output: {\n        setAudioEnabled: setOutputAudio,\n        setTranscriptionEnabled: setTranscription,\n      },\n    } as unknown as AgentSession;\n\n    const transport = new FakeTransport();\n    const host = new SessionHost(transport);\n    host.registerSession(fakeSession);\n    await host.start();\n\n    transport.push(\n      new pb.AgentSessionMessage({\n        message: {\n          case: 'request',\n          value: new pb.SessionRequest({\n            requestId: 'io2',\n            request: {\n              case: 'updateIo',\n              value: new pb.SessionRequest_UpdateIO({\n                output: new pb.SessionRequest_UpdateIO_Output({ transcriptionEnabled: true }),\n              }),\n            },\n          }),\n        },\n      }),\n    );\n\n    await vi.waitFor(() => expect(transport.sent.length).toBe(1));\n\n    expect(setInputAudio).not.toHaveBeenCalled();\n    expect(setOutputAudio).not.toHaveBeenCalled();\n    expect(setTranscription).toHaveBeenCalledWith(true);\n\n    await host.close();\n  });\n});\n\nfunction fakeSimJobContext(onSimulationEnd?: (ctx: SimulationContext) => unknown): JobContext {\n  const room = {\n    name: 'room',\n    on: () => room,\n    off: () => room,\n    isConnected: false,\n    remoteParticipants: new Map(),\n  };\n  const ctx = new JobContext(\n    {} as unknown as JobProcess,\n    {\n      acceptArguments: { name: 'agent', identity: 'agent', metadata: '' },\n      job: {\n        id: 'job-id',\n        room: { name: 'room' },\n        attributes: {\n          'lk.simulator.dispatch': JSON.stringify({\n            simulationRunId: 'SR_9',\n            scenario: { label: 's', userdata: '{\"target\":3}' },\n          }),\n        },\n      },\n      url: 'wss://example.livekit.cloud',\n      token: 'token',\n      workerId: 'worker-id',\n    } as unknown as RunningJobInfo,\n    room as unknown as Room,\n    () => {},\n    () => {},\n    {} as unknown as InferenceExecutor,\n  );\n  ctx._simulationEndFnc = onSimulationEnd;\n  return ctx;\n}\n\nfunction finalizeMessage(requestId: string, success: boolean, reason: string) {\n  return new pb.AgentSessionMessage({\n    message: {\n      case: 'request',\n      value: new pb.SessionRequest({\n        requestId,\n        request: {\n          case: 'finalizeSimulation',\n          value: new pb.SessionRequest_FinalizeSimulation({\n            provisionalSuccess: success,\n            provisionalReason: reason,\n          }),\n        },\n      }),\n    },\n  });\n}\n\nconst fakeAgentSession = () =>\n  ({\n    on: () => {},\n    off: () => {},\n  }) as unknown as AgentSession;\n\ndescribe('SessionHost finalizeSimulation', () => {\n  it('runs onSimulationEnd with the simulator verdict and returns the agent veto', async () => {\n    let seen: SimulationContext | undefined;\n    const ctx = fakeSimJobContext((simCtx) => {\n      seen = simCtx;\n      expect(simCtx.simulatorVerdict).toEqual({ success: true, reason: 'all good' });\n      simCtx.fail('db state diverged');\n    });\n\n    const transport = new FakeTransport();\n    const host = new SessionHost(transport);\n    host.registerSession(fakeAgentSession());\n    await runWithJobContextAsync(ctx, async () => host.start());\n\n    transport.push(finalizeMessage('f1', true, 'all good'));\n    await vi.waitFor(() => expect(transport.sent.length).toBe(1));\n\n    expect(seen).toBeDefined();\n    expect(seen!.simulationRun).toMatchObject({ id: 'SR_9' });\n    const resp = transport.sent[0]!.message.value as pb.SessionResponse;\n    expect(resp.requestId).toBe('f1');\n    expect(resp.response.case).toBe('finalizeSimulation');\n    const value = resp.response.value as pb.SessionResponse_FinalizeSimulationResponse;\n    expect(value.userVerdict?.success).toBe(false);\n    expect(value.userVerdict?.reason).toBe('db state diverged');\n\n    await host.close();\n  });\n\n  it('omits the user verdict when the agent does not veto', async () => {\n    const ctx = fakeSimJobContext(() => {});\n    const transport = new FakeTransport();\n    const host = new SessionHost(transport);\n    host.registerSession(fakeAgentSession());\n    await runWithJobContextAsync(ctx, async () => host.start());\n\n    transport.push(finalizeMessage('f2', false, 'agent never answered'));\n    await vi.waitFor(() => expect(transport.sent.length).toBe(1));\n\n    const value = (transport.sent[0]!.message.value as pb.SessionResponse).response\n      .value as pb.SessionResponse_FinalizeSimulationResponse;\n    expect(value.userVerdict).toBeUndefined();\n\n    await host.close();\n  });\n\n  it('still responds when onSimulationEnd throws', async () => {\n    const ctx = fakeSimJobContext(() => {\n      throw new Error('user callback exploded');\n    });\n    const transport = new FakeTransport();\n    const host = new SessionHost(transport);\n    host.registerSession(fakeAgentSession());\n    await runWithJobContextAsync(ctx, async () => host.start());\n\n    transport.push(finalizeMessage('f3', true, 'fine'));\n    await vi.waitFor(() => expect(transport.sent.length).toBe(1));\n\n    const resp = transport.sent[0]!.message.value as pb.SessionResponse;\n    expect(resp.response.case).toBe('finalizeSimulation');\n    expect(resp.error).toBe('user callback exploded');\n\n    await host.close();\n  });\n\n  it('preserves a failure veto when onSimulationEnd throws after fail()', async () => {\n    const ctx = fakeSimJobContext((simCtx) => {\n      simCtx.fail('backend state diverged');\n      throw new Error('cleanup exploded');\n    });\n    const transport = new FakeTransport();\n    const host = new SessionHost(transport);\n    host.registerSession(fakeAgentSession());\n    await runWithJobContextAsync(ctx, async () => host.start());\n\n    transport.push(finalizeMessage('f4', true, 'fine'));\n    await vi.waitFor(() => expect(transport.sent.length).toBe(1));\n\n    const value = (transport.sent[0]!.message.value as pb.SessionResponse).response\n      .value as pb.SessionResponse_FinalizeSimulationResponse;\n    expect(value.userVerdict).toMatchObject({\n      success: false,\n      reason: 'backend state diverged',\n    });\n\n    await host.close();\n  });\n\n  it('responds without a job context (no simulation)', async () => {\n    const transport = new FakeTransport();\n    const host = new SessionHost(transport);\n    host.registerSession(fakeAgentSession());\n    await host.start();\n\n    transport.push(finalizeMessage('f5', true, 'fine'));\n    await vi.waitFor(() => expect(transport.sent.length).toBe(1));\n\n    const value = (transport.sent[0]!.message.value as pb.SessionResponse).response\n      .value as pb.SessionResponse_FinalizeSimulationResponse;\n    expect(value.userVerdict).toBeUndefined();\n\n    await host.close();\n  });\n});\n"],"mappings":"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","names":["pb","it","error"]}