{"version":3,"sources":["../src/error.ts","../src/api/config.ts","../src/api/consume.ts","../src/utils/flatDeltaAccumulator.ts","../src/utils/parseClientEvent.ts","../src/utils/parseTranscription.ts","../src/emitter.ts","../src/transcript-accumulator.ts","../src/types.ts","../src/client.ts","../src/tools.ts","../src/api/page-actions.ts"],"names":["changed","LKConnectionQuality","ConnectionState","Room","Track","RoomEvent"],"mappings":"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","file":"index.cjs","sourcesContent":["export type AvatarErrorCode =\n  | 'CONSUME_FAILED'\n  | 'CONNECTION_FAILED'\n  | 'SESSION_CREATE_FAILED'\n  | 'ELEVENLABS_SIGNED_URL_FAILED'\n  | 'MEDIA_PERMISSION_DENIED'\n  | 'MEDIA_DEVICE_ERROR'\n  | 'SCREEN_SHARE_FAILED'\n  | 'PUBLISH_FAILED'\n  | 'UNKNOWN';\n\nexport class AvatarError extends Error {\n  readonly code: AvatarErrorCode;\n  readonly cause?: Error;\n\n  constructor(code: AvatarErrorCode, message: string, cause?: Error) {\n    super(message);\n    this.name = 'AvatarError';\n    this.code = code;\n    this.cause = cause;\n  }\n}\n\nexport function toAvatarError(\n  code: AvatarErrorCode,\n  fallbackMessage: string,\n  err: unknown,\n): AvatarError {\n  if (err instanceof AvatarError) return err;\n  const cause = err instanceof Error ? err : undefined;\n  const message = cause?.message ?? fallbackMessage;\n  return new AvatarError(code, message, cause);\n}\n","export const DEFAULT_BASE_URL = 'https://api.dev.runwayml.com';\n","import { AvatarError } from '../error';\nimport type { ConsumeSessionOptions, ConsumeSessionResponse } from '../types';\nimport { DEFAULT_BASE_URL } from './config';\n\nexport async function consumeSession(\n  options: ConsumeSessionOptions,\n): Promise<ConsumeSessionResponse> {\n  const { sessionId, sessionKey, baseUrl = DEFAULT_BASE_URL } = options;\n\n  const url = `${baseUrl}/v1/realtime_sessions/${sessionId}/consume`;\n  const response = await fetch(url, {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'application/json',\n      Authorization: `Bearer ${sessionKey}`,\n    },\n  });\n\n  if (!response.ok) {\n    const errorText = await response.text();\n    throw new AvatarError(\n      'CONSUME_FAILED',\n      `Failed to consume session: ${response.status} ${errorText}`,\n    );\n  }\n\n  return response.json();\n}\n","export interface FlatDelta {\n  role: string;\n  turn: number;\n  textDelta: string;\n}\n\nexport interface FlatDeltaTurn {\n  id: string;\n  text: string;\n  participantIdentity: string;\n}\n\nexport interface FlatDeltaEmission {\n  /** Prior turns on the same role that were just promoted to final by this delta. */\n  finalized: Array<FlatDeltaTurn>;\n  /** The turn this delta belongs to — still streaming, always interim. */\n  active: FlatDeltaTurn;\n}\n\n/**\n * Accumulates Runway flat-delta transcription fragments into coherent turns.\n *\n * The flat-delta protocol sends `{ role, turn, textDelta }` messages without\n * an explicit end-of-turn signal, so we infer the end: when a delta arrives\n * on a higher turn for the same role, prior turns on that role are done and\n * get emitted once as final. The active turn is always interim.\n *\n * Identity is remembered per-turn, so finalized priors are attributed to\n * whoever originally produced them — not to whoever triggered the role\n * switch.\n */\nexport class FlatDeltaAccumulator {\n  private readonly turns = new Map<\n    string,\n    { text: string; participantIdentity: string }\n  >();\n  private readonly finalized = new Set<string>();\n\n  ingest(delta: FlatDelta, participantIdentity: string): FlatDeltaEmission {\n    const id = `runway-transcription-${delta.role}-${delta.turn}`;\n    const prev = this.turns.get(id);\n    const text = (prev?.text ?? '') + delta.textDelta;\n    const identity = prev?.participantIdentity ?? participantIdentity;\n    this.turns.set(id, { text, participantIdentity: identity });\n\n    const prefix = `runway-transcription-${delta.role}-`;\n    const finalized: Array<FlatDeltaTurn> = [];\n    for (const [key, turn] of this.turns) {\n      if (key === id || !key.startsWith(prefix)) continue;\n      if (this.finalized.has(key)) continue;\n      this.finalized.add(key);\n      finalized.push({\n        id: key,\n        text: turn.text,\n        participantIdentity: turn.participantIdentity,\n      });\n    }\n\n    return {\n      finalized,\n      active: { id, text, participantIdentity: identity },\n    };\n  }\n\n  reset(): void {\n    this.turns.clear();\n    this.finalized.clear();\n  }\n}\n","import type { ClientEvent } from '../types';\n\n/**\n * Server-side ack messages contain `status: \"event_sent\"` — they echo back\n * tool calls and should not be surfaced as client events.\n */\nfunction isAckMessage(args: Record<string, unknown>): boolean {\n  return 'status' in args && args.status === 'event_sent';\n}\n\n/**\n * Parse and validate a data channel payload as a ClientEvent.\n * Returns null for non-client-event messages, ack messages, or malformed payloads.\n */\nexport function parseClientEvent(payload: Uint8Array): ClientEvent | null {\n  try {\n    const message = JSON.parse(new TextDecoder().decode(payload));\n\n    if (\n      message?.type === 'client_event' &&\n      typeof message.tool === 'string' &&\n      message.args != null &&\n      typeof message.args === 'object' &&\n      !isAckMessage(message.args)\n    ) {\n      return message as ClientEvent;\n    }\n\n    return null;\n  } catch {\n    return null;\n  }\n}\n","import type { TranscriptionEntry } from '../types';\n\nexport type DataChannelJSON = Record<string, unknown>;\n\nexport function tryDecodeJSON(payload: Uint8Array): DataChannelJSON | null {\n  try {\n    const text = new TextDecoder().decode(payload).trim();\n    if (!text.startsWith('{')) return null;\n    const parsed: unknown = JSON.parse(text);\n    return parsed && typeof parsed === 'object'\n      ? (parsed as DataChannelJSON)\n      : null;\n  } catch {\n    return null;\n  }\n}\n\n/**\n * Parse LiveKit-style segment arrays: `{ segments: [{ id, text, final? }] }`\n * Also handles wrapper shapes like `{ type: \"transcription\", segments: [...] }`\n * and `{ data: { segments: [...] } }`.\n */\nexport function tryParseSegmentArray(\n  root: DataChannelJSON,\n  participant?: { identity: string },\n): Array<TranscriptionEntry> | null {\n  const type = root.type;\n  const typeAllowed =\n    type === undefined ||\n    type === 'transcription' ||\n    type === 'transcript' ||\n    type === 'voice_transcript';\n  if (!typeAllowed) return null;\n\n  let segments: unknown = root.segments;\n  if (\n    !Array.isArray(segments) &&\n    root.data &&\n    typeof root.data === 'object'\n  ) {\n    segments = (root.data as DataChannelJSON).segments;\n  }\n  if (!Array.isArray(segments)) return null;\n\n  const identity = participant?.identity ?? 'unknown';\n  const out: Array<TranscriptionEntry> = [];\n\n  for (const item of segments) {\n    if (!item || typeof item !== 'object') continue;\n    const seg = item as DataChannelJSON;\n    if (typeof seg.id !== 'string' || typeof seg.text !== 'string') continue;\n    out.push({\n      id: seg.id,\n      text: seg.text,\n      final: typeof seg.final === 'boolean' ? seg.final : true,\n      participantIdentity:\n        typeof seg.participantIdentity === 'string'\n          ? seg.participantIdentity\n          : identity,\n    });\n  }\n\n  return out.length > 0 ? out : null;\n}\n\n/**\n * Parse Runway flat streaming deltas: `{ type: \"transcription\", role, turn, text }`\n * These arrive one delta at a time and are accumulated per role+turn.\n */\nexport function tryParseFlatDelta(\n  root: DataChannelJSON,\n): { role: string; turn: number; textDelta: string } | null {\n  if (root.type !== 'transcription') return null;\n  if (typeof root.text !== 'string') return null;\n\n  return {\n    role: typeof root.role === 'string' ? root.role : 'assistant',\n    turn: typeof root.turn === 'number' ? root.turn : 0,\n    textDelta: root.text,\n  };\n}\n","/**\n * Tiny typed event emitter. No Node.js polyfills, no dependencies.\n *\n * @example\n * ```ts\n * type Events = { count: [number]; ready: [] };\n * const ee = new Emitter<Events>();\n * ee.on('count', (n) => console.log(n));\n * ee.emit('count', 42);\n * ```\n */\nexport type EventMap = Record<string, Array<unknown>>;\n\ntype Handler<Args extends Array<unknown>> = (...args: Args) => void;\n\nexport class Emitter<E extends EventMap> {\n  private listeners = new Map<keyof E, Set<Handler<Array<unknown>>>>();\n\n  on<K extends keyof E>(event: K, handler: Handler<E[K]>): this {\n    let set = this.listeners.get(event);\n    if (!set) {\n      set = new Set();\n      this.listeners.set(event, set);\n    }\n    set.add(handler as Handler<Array<unknown>>);\n    return this;\n  }\n\n  once<K extends keyof E>(event: K, handler: Handler<E[K]>): this {\n    const wrapper = ((...args: E[K]) => {\n      this.off(event, wrapper);\n      handler(...args);\n    }) as Handler<E[K]>;\n    return this.on(event, wrapper);\n  }\n\n  off<K extends keyof E>(event: K, handler: Handler<E[K]>): this {\n    this.listeners.get(event)?.delete(handler as Handler<Array<unknown>>);\n    return this;\n  }\n\n  protected emit<K extends keyof E>(event: K, ...args: E[K]): void {\n    const set = this.listeners.get(event);\n    if (!set) return;\n    for (const handler of set) {\n      try {\n        handler(...args);\n      } catch (err) {\n        console.error(`[@runwayml/avatars] Error in ${String(event)} handler:`, err);\n      }\n    }\n  }\n\n  removeAllListeners(event?: keyof E): this {\n    if (event) {\n      this.listeners.delete(event);\n    } else {\n      this.listeners.clear();\n    }\n    return this;\n  }\n}\n","import type { TranscriptionEntry } from './types';\nimport { FlatDeltaAccumulator } from './utils/flatDeltaAccumulator';\nimport {\n  tryDecodeJSON,\n  tryParseFlatDelta,\n  tryParseSegmentArray,\n} from './utils/parseTranscription';\nimport { Emitter } from './emitter';\nimport type { TranscriptOptions } from './types';\n\nconst DEFAULT_BUFFER_SIZE = 100;\n\ntype TranscriptEvents = {\n  update: [entries: ReadonlyArray<TranscriptionEntry>];\n};\n\n/**\n * Stateful transcript accumulator. Deduplicates by segment `id`, caps at\n * `bufferSize`, and emits `update` on every change.\n *\n * Handles both LiveKit-style `{ segments: [...] }` and Runway flat-delta\n * `{ type: \"transcription\", role, turn, text }` data-channel payloads,\n * as well as native `TranscriptionReceived` segment arrays.\n */\nexport class TranscriptAccumulator extends Emitter<TranscriptEvents> {\n  private readonly map = new Map<string, TranscriptionEntry>();\n  private readonly flatAcc = new FlatDeltaAccumulator();\n  private readonly interim: boolean;\n  private readonly bufferSize: number;\n  private snapshot: ReadonlyArray<TranscriptionEntry> = [];\n\n  constructor(options?: TranscriptOptions) {\n    super();\n    this.interim = options?.interim ?? false;\n    this.bufferSize = options?.bufferSize ?? DEFAULT_BUFFER_SIZE;\n  }\n\n  get entries(): ReadonlyArray<TranscriptionEntry> {\n    return this.snapshot;\n  }\n\n  /**\n   * Ingest a native transcription segment (from `RoomEvent.TranscriptionReceived`).\n   */\n  ingestNative(\n    segments: ReadonlyArray<{ id: string; text: string; final: boolean }>,\n    participantIdentity: string,\n  ): void {\n    let changed = false;\n    for (const segment of segments) {\n      if (!this.interim && !segment.final) continue;\n      this.map.set(segment.id, {\n        id: segment.id,\n        text: segment.text,\n        final: segment.final,\n        participantIdentity,\n        channel: 'native',\n      });\n      changed = true;\n    }\n    if (changed) this.flush();\n  }\n\n  /**\n   * Ingest a raw data-channel payload (from `RoomEvent.DataReceived`).\n   * Handles both segment arrays and flat deltas.\n   */\n  ingestDataChannel(\n    payload: Uint8Array,\n    participantIdentity: string,\n  ): void {\n    const json = tryDecodeJSON(payload);\n    if (!json) return;\n\n    const segments = tryParseSegmentArray(json, {\n      identity: participantIdentity,\n    });\n    if (segments) {\n      let changed = false;\n      for (const entry of segments) {\n        if (!this.interim && !entry.final) continue;\n        this.map.set(entry.id, { ...entry, channel: 'custom' });\n        changed = true;\n      }\n      if (changed) this.flush();\n      return;\n    }\n\n    const delta = tryParseFlatDelta(json);\n    if (!delta) return;\n\n    const { finalized, active } = this.flatAcc.ingest(\n      delta,\n      participantIdentity,\n    );\n\n    let changed = false;\n    for (const turn of finalized) {\n      this.map.set(turn.id, { ...turn, final: true, channel: 'custom' });\n      changed = true;\n    }\n\n    if (this.interim) {\n      this.map.set(active.id, { ...active, final: false, channel: 'custom' });\n      changed = true;\n    }\n\n    if (changed) this.flush();\n  }\n\n  dispose(): void {\n    this.map.clear();\n    this.flatAcc.reset();\n    this.snapshot = [];\n    this.removeAllListeners();\n  }\n\n  private flush(): void {\n    const values = Array.from(this.map.values());\n    this.snapshot =\n      values.length > this.bufferSize\n        ? values.slice(-this.bufferSize)\n        : values;\n    this.emit('update', this.snapshot);\n  }\n}\n","/**\n * @runwayml/avatars Types\n *\n * Core types for the avatar SDK. No React or framework dependencies.\n */\n\nexport type SessionState =\n  | 'idle'\n  | 'connecting'\n  | 'reconnecting'\n  | 'active'\n  | 'ending'\n  | 'ended'\n  | 'error';\n\nexport interface ConsumeSessionResponse {\n  url: string;\n  token: string;\n  roomName: string;\n}\n\nexport interface SessionCredentials {\n  sessionId: string;\n  serverUrl: string;\n  token: string;\n  roomName: string;\n}\n\nexport interface SessionKeyResponse {\n  sessionId: string;\n  sessionKey: string;\n}\n\nexport type ConnectResponse = SessionCredentials | SessionKeyResponse;\n\nexport interface ConsumeSessionOptions {\n  sessionId: string;\n  sessionKey: string;\n  baseUrl?: string;\n}\n\nexport interface ClientEvent<\n  T extends string = string,\n  A = Record<string, unknown>,\n> {\n  type: 'client_event';\n  tool: T;\n  args: A;\n}\n\nexport type ClientEventHandler<E extends ClientEvent = ClientEvent> = (\n  event: E,\n) => void;\n\nexport interface TranscriptionEntry {\n  id: string;\n  text: string;\n  final: boolean;\n  participantIdentity: string;\n  channel?: 'native' | 'custom';\n}\n\nexport type TranscriptionHandler = (entry: TranscriptionEntry) => void;\n\nexport type MicPermissionState = 'pending' | 'granted' | 'denied';\n\nexport type ConnectionQuality = 'excellent' | 'good' | 'poor' | 'lost' | 'unknown';\n\nexport type ActiveSpeaker = 'user' | 'avatar';\n\nexport const AvatarEvent = {\n  StateChanged: 'stateChanged',\n  Transcript: 'transcript',\n  ClientEvent: 'clientEvent',\n  Error: 'error',\n  AvatarVideoReady: 'avatarVideoReady',\n  AvatarAudioReady: 'avatarAudioReady',\n  ScreenShareReady: 'screenShareReady',\n  LocalVideoReady: 'localVideoReady',\n  MediaChanged: 'mediaChanged',\n  UserSpeechStarted: 'userSpeechStarted',\n  UserSpeechEnded: 'userSpeechEnded',\n  AvatarSpeechStarted: 'avatarSpeechStarted',\n  AvatarSpeechEnded: 'avatarSpeechEnded',\n  ConnectionQualityChanged: 'connectionQualityChanged',\n  MicPermissionChanged: 'micPermissionChanged',\n  ActiveSpeakersChanged: 'activeSpeakersChanged',\n} as const;\n\nexport type AvatarEventMap = {\n  [AvatarEvent.StateChanged]: [state: SessionState];\n  [AvatarEvent.Transcript]: [entry: TranscriptionEntry];\n  [AvatarEvent.ClientEvent]: [event: ClientEvent];\n  [AvatarEvent.Error]: [error: Error];\n  [AvatarEvent.AvatarVideoReady]: [track: MediaStreamTrack];\n  [AvatarEvent.AvatarAudioReady]: [track: MediaStreamTrack];\n  [AvatarEvent.ScreenShareReady]: [track: MediaStreamTrack];\n  [AvatarEvent.LocalVideoReady]: [track: MediaStreamTrack];\n  [AvatarEvent.MediaChanged]: [];\n  [AvatarEvent.UserSpeechStarted]: [];\n  [AvatarEvent.UserSpeechEnded]: [];\n  [AvatarEvent.AvatarSpeechStarted]: [];\n  [AvatarEvent.AvatarSpeechEnded]: [];\n  [AvatarEvent.ConnectionQualityChanged]: [quality: ConnectionQuality];\n  [AvatarEvent.MicPermissionChanged]: [state: MicPermissionState];\n  [AvatarEvent.ActiveSpeakersChanged]: [speakers: ReadonlyArray<ActiveSpeaker>];\n};\n\nexport interface MediaController {\n  readonly isEnabled: boolean;\n  enable(): Promise<void>;\n  disable(): Promise<void>;\n  toggle(): Promise<void>;\n  setDevice(deviceId: string): Promise<void>;\n}\n\nexport interface ScreenShareController {\n  readonly isActive: boolean;\n  start(): Promise<void>;\n  stop(): Promise<void>;\n  toggle(): Promise<void>;\n}\n\nexport interface TranscriptOptions {\n  interim?: boolean;\n  bufferSize?: number;\n}\n","import {\n  ConnectionQuality as LKConnectionQuality,\n  ConnectionState,\n  Room,\n  RoomEvent,\n  Track,\n} from 'livekit-client';\nimport type {\n  Participant,\n  RemoteTrackPublication,\n  TranscriptionSegment,\n} from 'livekit-client';\n\nimport { consumeSession } from './api/consume';\nimport { toAvatarError } from './error';\nimport { FlatDeltaAccumulator } from './utils/flatDeltaAccumulator';\nimport { parseClientEvent } from './utils/parseClientEvent';\nimport {\n  tryDecodeJSON,\n  tryParseFlatDelta,\n  tryParseSegmentArray,\n} from './utils/parseTranscription';\nimport { Emitter } from './emitter';\nimport { TranscriptAccumulator } from './transcript-accumulator';\nimport {\n  AvatarEvent,\n  type ActiveSpeaker,\n  type AvatarEventMap,\n  type ClientEvent,\n  type ConnectionQuality,\n  type MediaController,\n  type ScreenShareController,\n  type SessionState,\n  type TranscriptOptions,\n  type TranscriptionEntry,\n} from './types';\n\nfunction toLKQuality(q: LKConnectionQuality): ConnectionQuality {\n  switch (q) {\n    case LKConnectionQuality.Excellent:\n      return 'excellent';\n    case LKConnectionQuality.Good:\n      return 'good';\n    case LKConnectionQuality.Poor:\n      return 'poor';\n    case LKConnectionQuality.Lost:\n      return 'lost';\n    default:\n      return 'unknown';\n  }\n}\n\nfunction toSessionState(cs: ConnectionState): SessionState {\n  switch (cs) {\n    case ConnectionState.Connecting:\n      return 'connecting';\n    case ConnectionState.Connected:\n      return 'active';\n    case ConnectionState.Reconnecting:\n      return 'reconnecting';\n    case ConnectionState.Disconnected:\n      return 'ended';\n    default:\n      return 'ended';\n  }\n}\n\n/**\n * A live avatar session. Returned by `streamTo` or `connect`.\n *\n * Wraps a LiveKit Room behind a clean event-driven API. No LiveKit\n * types are exposed — tracks are standard `MediaStreamTrack` objects.\n */\nexport class AvatarSession extends Emitter<AvatarEventMap> {\n  private room: Room | null = null;\n  private _sessionId: string;\n  private _state: SessionState = 'idle';\n  private _error: Error | null = null;\n  private _micEnabled = false;\n  private _cameraEnabled = false;\n  private _screenShareActive = false;\n  private attachedVideoElement: HTMLVideoElement | null = null;\n  private attachedAudioElement: HTMLAudioElement | null = null;\n  private avatarVideoTrack: MediaStreamTrack | null = null;\n  private avatarAudioTrack: MediaStreamTrack | null = null;\n  private _localVideoTrack: MediaStreamTrack | null = null;\n  private autoAudioElement: HTMLAudioElement | null = null;\n  private flatDeltaAcc = new FlatDeltaAccumulator();\n  private _userSpeaking = false;\n  private _avatarSpeaking = false;\n  private _connectedAt: number | null = null;\n\n  readonly mic: MediaController;\n  readonly camera: MediaController;\n  readonly screenShare: ScreenShareController;\n\n  constructor(sessionId: string) {\n    super();\n    this._sessionId = sessionId;\n\n    const self = this;\n\n    this.mic = {\n      get isEnabled() {\n        return self._micEnabled;\n      },\n      enable: () => this.setMic(true),\n      disable: () => this.setMic(false),\n      toggle: () => this.setMic(!this._micEnabled),\n      setDevice: (deviceId: string) => this.switchDevice('audioinput', deviceId),\n    };\n\n    this.camera = {\n      get isEnabled() {\n        return self._cameraEnabled;\n      },\n      enable: () => this.setCamera(true),\n      disable: () => this.setCamera(false),\n      toggle: () => this.setCamera(!this._cameraEnabled),\n      setDevice: (deviceId: string) => this.switchDevice('videoinput', deviceId),\n    };\n\n    this.screenShare = {\n      get isActive() {\n        return self._screenShareActive;\n      },\n      start: () => this.setScreenShare(true),\n      stop: () => this.setScreenShare(false),\n      toggle: () => this.setScreenShare(!this._screenShareActive),\n    };\n  }\n\n  get state(): SessionState {\n    return this._state;\n  }\n\n  get sessionId(): string {\n    return this._sessionId;\n  }\n\n  get error(): Error | null {\n    return this._error;\n  }\n\n  get localVideoTrack(): MediaStreamTrack | null {\n    return this._localVideoTrack;\n  }\n\n  get duration(): number {\n    if (!this._connectedAt) return 0;\n    return Date.now() - this._connectedAt;\n  }\n\n  waitFor<K extends keyof AvatarEventMap>(event: K): Promise<AvatarEventMap[K][0]> {\n    return new Promise((resolve) => {\n      this.once(event, ((...args: AvatarEventMap[K]) => {\n        resolve(args[0] as AvatarEventMap[K][0]);\n      }) as (...args: AvatarEventMap[K]) => void);\n    });\n  }\n\n  streamTo(element: HTMLVideoElement): void {\n    this.attachedVideoElement = element;\n    if (this.avatarVideoTrack) {\n      element.srcObject = new MediaStream([this.avatarVideoTrack]);\n      element.play().catch(() => {});\n    }\n  }\n\n  stopStreaming(): void {\n    if (this.attachedVideoElement) {\n      this.attachedVideoElement.srcObject = null;\n    }\n    this.attachedVideoElement = null;\n  }\n\n  attachAudio(element: HTMLAudioElement): void {\n    this.attachedAudioElement = element;\n    if (this.avatarAudioTrack) {\n      element.srcObject = new MediaStream([this.avatarAudioTrack]);\n      element.play().catch(() => {});\n    }\n  }\n\n  detachAudio(): void {\n    if (this.attachedAudioElement) {\n      this.attachedAudioElement.srcObject = null;\n    }\n    this.attachedAudioElement = null;\n  }\n\n  async end(): Promise<void> {\n    if (!this.room) return;\n    this.setState('ending');\n\n    try {\n      const encoder = new TextEncoder();\n      const data = encoder.encode(JSON.stringify({ type: 'END_CALL' }));\n      await this.room.localParticipant.publishData(data, { reliable: true });\n    } catch {\n      // Best-effort end message\n    }\n\n    this.cleanup();\n  }\n\n  transcript(options?: TranscriptOptions): TranscriptAccumulator {\n    const acc = new TranscriptAccumulator(options);\n\n    const handleTranscript = (entry: TranscriptionEntry) => {\n      acc.ingestNative(\n        [{ id: entry.id, text: entry.text, final: entry.final }],\n        entry.participantIdentity,\n      );\n    };\n\n    this.on(AvatarEvent.Transcript, handleTranscript);\n\n    const originalDispose = acc.dispose.bind(acc);\n    acc.dispose = () => {\n      this.off(AvatarEvent.Transcript, handleTranscript);\n      originalDispose();\n    };\n\n    return acc;\n  }\n\n  onClientEvent<T extends string, A>(\n    toolOrName: { name: T } | T,\n    handler: (args: A) => void,\n  ): () => void {\n    const name = typeof toolOrName === 'string' ? toolOrName : toolOrName.name;\n    const wrappedHandler = (event: ClientEvent) => {\n      if (event.tool === name) {\n        handler(event.args as A);\n      }\n    };\n    this.on(AvatarEvent.ClientEvent, wrappedHandler);\n    return () => this.off(AvatarEvent.ClientEvent, wrappedHandler);\n  }\n\n  /** @internal Called by `streamTo` and `connect` entry points. */\n  async _connect(\n    serverUrl: string,\n    token: string,\n    options: { audio?: boolean; video?: boolean },\n  ): Promise<void> {\n    this.setState('connecting');\n\n    const room = new Room({\n      adaptiveStream: false,\n      dynacast: false,\n    });\n\n    try {\n      this.room = room;\n      this.bindRoomEvents(room);\n      await room.connect(serverUrl, token, { autoSubscribe: true });\n      await this.enableInitialMedia(room, options);\n    } catch (err) {\n      room.removeAllListeners();\n      room.disconnect().catch(() => {});\n      this.room = null;\n      const error = toAvatarError('CONNECTION_FAILED', 'Failed to connect to session', err);\n      this.setError(error);\n      throw error;\n    }\n  }\n\n  async publishScreenShare(stream: MediaStream): Promise<void> {\n    if (!this.room) return;\n    const videoTrack = stream.getVideoTracks()[0];\n    if (videoTrack) {\n      await this.room.localParticipant.publishTrack(videoTrack, {\n        source: Track.Source.ScreenShare,\n      });\n    }\n    const audioTrack = stream.getAudioTracks()[0];\n    if (audioTrack) {\n      await this.room.localParticipant.publishTrack(audioTrack, {\n        source: Track.Source.ScreenShareAudio,\n      });\n    }\n  }\n\n  private bindRoomEvents(room: Room): void {\n    room.on(RoomEvent.ConnectionStateChanged, (state: ConnectionState) => {\n      this.setState(toSessionState(state));\n    });\n\n    room.on(RoomEvent.Disconnected, () => {\n      this.setState('ended');\n    });\n\n    room.on(RoomEvent.Reconnected, () => {\n      this.reattachTracks();\n    });\n\n    room.on(\n      RoomEvent.TrackSubscribed,\n      (track, publication: RemoteTrackPublication) => {\n        if (track.kind === 'video' && publication.source === Track.Source.Camera) {\n          const mediaTrack = track.mediaStreamTrack;\n          this.avatarVideoTrack = mediaTrack;\n          this.emit(AvatarEvent.AvatarVideoReady, mediaTrack);\n          this.syncVideoElement(mediaTrack);\n        }\n\n        if (track.kind === 'audio' && publication.source === Track.Source.Microphone) {\n          const mediaTrack = track.mediaStreamTrack;\n          this.avatarAudioTrack = mediaTrack;\n          this.emit(AvatarEvent.AvatarAudioReady, mediaTrack);\n\n          if (this.attachedAudioElement) {\n            this.attachedAudioElement.srcObject = new MediaStream([mediaTrack]);\n            this.attachedAudioElement.play().catch(() => {});\n          } else {\n            this.autoPlayAudio(mediaTrack);\n          }\n        }\n\n        if (track.kind === 'video' && publication.source === Track.Source.ScreenShare) {\n          this.emit(AvatarEvent.ScreenShareReady, track.mediaStreamTrack);\n        }\n      },\n    );\n\n    room.on(RoomEvent.TrackUnsubscribed, (_track, publication: RemoteTrackPublication) => {\n      if (publication.source === Track.Source.Camera) {\n        this.avatarVideoTrack = null;\n      }\n      if (publication.source === Track.Source.Microphone) {\n        this.avatarAudioTrack = null;\n      }\n    });\n\n    room.on(\n      RoomEvent.DataReceived,\n      (payload: Uint8Array, participant?: Participant) => {\n        const event = parseClientEvent(payload);\n        if (event) {\n          this.emit(AvatarEvent.ClientEvent, event);\n          return;\n        }\n\n        const identity = participant?.identity ?? 'unknown';\n        const json = tryDecodeJSON(payload);\n        if (!json) return;\n\n        const segments = tryParseSegmentArray(json, { identity });\n        if (segments) {\n          for (const entry of segments) {\n            this.emit(AvatarEvent.Transcript, { ...entry, channel: 'custom' });\n          }\n          return;\n        }\n\n        const delta = tryParseFlatDelta(json);\n        if (delta) {\n          const { finalized, active } = this.flatDeltaAcc.ingest(\n            delta,\n            identity,\n          );\n          for (const turn of finalized) {\n            this.emit(AvatarEvent.Transcript, {\n              ...turn,\n              final: true,\n              channel: 'custom',\n            });\n          }\n          this.emit(AvatarEvent.Transcript, {\n            ...active,\n            final: false,\n            channel: 'custom',\n          });\n        }\n      },\n    );\n\n    room.on(\n      RoomEvent.TranscriptionReceived,\n      (segments: Array<TranscriptionSegment>, participant?: Participant) => {\n        const identity = participant?.identity ?? 'unknown';\n        for (const segment of segments) {\n          this.emit(AvatarEvent.Transcript, {\n            id: segment.id,\n            text: segment.text,\n            final: segment.final,\n            participantIdentity: identity,\n            channel: 'native',\n          });\n        }\n      },\n    );\n\n    room.on(RoomEvent.MediaDevicesError, (error: Error) => {\n      this.emit(AvatarEvent.Error, error);\n    });\n\n    room.on(RoomEvent.ActiveSpeakersChanged, (speakers: Array<Participant>) => {\n      const localIdentity = room.localParticipant.identity;\n      const localSpeaking = speakers.some((p) => p.identity === localIdentity);\n      const remoteSpeaking = speakers.some((p) => p.identity !== localIdentity);\n\n      if (localSpeaking && !this._userSpeaking) {\n        this._userSpeaking = true;\n        this.emit(AvatarEvent.UserSpeechStarted);\n      } else if (!localSpeaking && this._userSpeaking) {\n        this._userSpeaking = false;\n        this.emit(AvatarEvent.UserSpeechEnded);\n      }\n\n      if (remoteSpeaking && !this._avatarSpeaking) {\n        this._avatarSpeaking = true;\n        this.emit(AvatarEvent.AvatarSpeechStarted);\n      } else if (!remoteSpeaking && this._avatarSpeaking) {\n        this._avatarSpeaking = false;\n        this.emit(AvatarEvent.AvatarSpeechEnded);\n      }\n\n      const active: Array<ActiveSpeaker> = [];\n      if (localSpeaking) active.push('user');\n      if (remoteSpeaking) active.push('avatar');\n      this.emit(AvatarEvent.ActiveSpeakersChanged, active);\n    });\n\n    room.on(\n      RoomEvent.ConnectionQualityChanged,\n      (quality: LKConnectionQuality, _participant: Participant) => {\n        this.emit(AvatarEvent.ConnectionQualityChanged, toLKQuality(quality));\n      },\n    );\n  }\n\n  private reattachTracks(): void {\n    if (this.avatarVideoTrack) {\n      this.syncVideoElement(this.avatarVideoTrack);\n    }\n    if (this.avatarAudioTrack) {\n      if (this.attachedAudioElement) {\n        this.attachedAudioElement.srcObject = new MediaStream([this.avatarAudioTrack]);\n        this.attachedAudioElement.play().catch(() => {});\n      } else {\n        this.autoPlayAudio(this.avatarAudioTrack);\n      }\n    }\n  }\n\n  private syncVideoElement(track: MediaStreamTrack): void {\n    if (this.attachedVideoElement) {\n      this.attachedVideoElement.srcObject = new MediaStream([track]);\n      this.attachedVideoElement.play().catch(() => {});\n    }\n  }\n\n  private async enableInitialMedia(\n    room: Room,\n    options: { audio?: boolean; video?: boolean },\n  ): Promise<void> {\n    if (\n      typeof navigator === 'undefined' ||\n      !navigator.mediaDevices?.getUserMedia\n    ) {\n      console.warn(\n        '[@runwayml/avatars] mediaDevices not available (requires secure context). Skipping mic/camera.',\n      );\n      return;\n    }\n\n    const { audio = true, video = true } = options;\n\n    if (audio) {\n      this.emit(AvatarEvent.MicPermissionChanged, 'pending');\n      try {\n        await room.localParticipant.setMicrophoneEnabled(true);\n        this._micEnabled = true;\n        this.emit(AvatarEvent.MicPermissionChanged, 'granted');\n      } catch (err) {\n        this.emit(AvatarEvent.MicPermissionChanged, 'denied');\n        this.emit(AvatarEvent.Error, toAvatarError('MEDIA_PERMISSION_DENIED', 'Microphone access denied', err));\n      }\n    }\n\n    if (video) {\n      try {\n        await room.localParticipant.setCameraEnabled(true);\n        this._cameraEnabled = true;\n        this.emitLocalVideoTrack(room);\n      } catch (err) {\n        this.emit(AvatarEvent.Error, toAvatarError('MEDIA_PERMISSION_DENIED', 'Camera access denied', err));\n      }\n    }\n\n    this.emit(AvatarEvent.MediaChanged);\n  }\n\n  private async setMic(enabled: boolean): Promise<void> {\n    if (!this.room || !navigator.mediaDevices?.getUserMedia) return;\n    try {\n      await this.room.localParticipant.setMicrophoneEnabled(enabled);\n      this._micEnabled = enabled;\n      this.emit(AvatarEvent.MediaChanged);\n    } catch (err) {\n      this.emit(AvatarEvent.Error, toAvatarError('MEDIA_DEVICE_ERROR', 'Failed to toggle microphone', err));\n    }\n  }\n\n  private async setCamera(enabled: boolean): Promise<void> {\n    if (!this.room || !navigator.mediaDevices?.getUserMedia) return;\n    try {\n      await this.room.localParticipant.setCameraEnabled(enabled);\n      this._cameraEnabled = enabled;\n      if (enabled) {\n        this.emitLocalVideoTrack(this.room);\n      } else {\n        this._localVideoTrack = null;\n      }\n      this.emit(AvatarEvent.MediaChanged);\n    } catch (err) {\n      this.emit(AvatarEvent.Error, toAvatarError('MEDIA_DEVICE_ERROR', 'Failed to toggle camera', err));\n    }\n  }\n\n  private emitLocalVideoTrack(room: Room): void {\n    const pub = room.localParticipant.getTrackPublication(Track.Source.Camera);\n    const mediaTrack = pub?.track?.mediaStreamTrack;\n    if (mediaTrack) {\n      this._localVideoTrack = mediaTrack;\n      this.emit(AvatarEvent.LocalVideoReady, mediaTrack);\n      return;\n    }\n\n    const onPublished = () => {\n      const retryPub = room.localParticipant.getTrackPublication(Track.Source.Camera);\n      const retryTrack = retryPub?.track?.mediaStreamTrack;\n      if (retryTrack) {\n        this._localVideoTrack = retryTrack;\n        this.emit(AvatarEvent.LocalVideoReady, retryTrack);\n        room.off(RoomEvent.LocalTrackPublished, onPublished);\n      }\n    };\n    room.on(RoomEvent.LocalTrackPublished, onPublished);\n  }\n\n  private async setScreenShare(active: boolean): Promise<void> {\n    if (!this.room || !navigator.mediaDevices?.getDisplayMedia) return;\n    try {\n      await this.room.localParticipant.setScreenShareEnabled(active);\n      this._screenShareActive = active;\n      this.emit(AvatarEvent.MediaChanged);\n    } catch (err) {\n      this.emit(AvatarEvent.Error, toAvatarError('SCREEN_SHARE_FAILED', 'Failed to toggle screen share', err));\n    }\n  }\n\n  private async switchDevice(kind: MediaDeviceKind, deviceId: string): Promise<void> {\n    if (!this.room) return;\n    try {\n      await this.room.switchActiveDevice(kind, deviceId);\n      this.emit(AvatarEvent.MediaChanged);\n    } catch (err) {\n      this.emit(AvatarEvent.Error, toAvatarError('MEDIA_DEVICE_ERROR', `Failed to switch ${kind}`, err));\n    }\n  }\n\n  private autoPlayAudio(track: MediaStreamTrack): void {\n    if (!this.autoAudioElement) {\n      this.autoAudioElement = document.createElement('audio');\n      this.autoAudioElement.autoplay = true;\n    }\n    this.autoAudioElement.srcObject = new MediaStream([track]);\n    this.autoAudioElement.play().catch(() => {});\n  }\n\n  private setError(error: Error): void {\n    this._error = error;\n    this.setState('error');\n    this.emit(AvatarEvent.Error, error);\n  }\n\n  private setState(state: SessionState): void {\n    if (this._state === state) return;\n    this._state = state;\n    if (state === 'active' && !this._connectedAt) {\n      this._connectedAt = Date.now();\n    }\n    this.emit(AvatarEvent.StateChanged, state);\n  }\n\n  private cleanup(): void {\n    this.stopStreaming();\n    this.detachAudio();\n    if (this.autoAudioElement) {\n      this.autoAudioElement.srcObject = null;\n      this.autoAudioElement.remove();\n      this.autoAudioElement = null;\n    }\n    this.avatarVideoTrack = null;\n    this.avatarAudioTrack = null;\n    this._localVideoTrack = null;\n\n    if (this.room) {\n      this.room.removeAllListeners();\n      this.room.disconnect();\n      this.room = null;\n    }\n\n    this._micEnabled = false;\n    this._cameraEnabled = false;\n    this._screenShareActive = false;\n    this._userSpeaking = false;\n    this._avatarSpeaking = false;\n    this._connectedAt = null;\n    this.flatDeltaAcc.reset();\n    this.setState('ended');\n  }\n}\n\nasync function resolveCredentials(options: {\n  sessionId: string;\n  sessionKey: string;\n  baseUrl?: string;\n}) {\n  const { url: serverUrl, token } = await consumeSession({\n    sessionId: options.sessionId,\n    sessionKey: options.sessionKey,\n    baseUrl: options.baseUrl,\n  });\n  return { serverUrl, token };\n}\n\n/**\n * Start an avatar session and stream video to an element.\n *\n * Handles the consume call, LiveKit connection, and media setup\n * in one call. Returns an `AvatarSession` for media controls,\n * events, and ending the call.\n *\n * @example\n * ```ts\n * const credentials = await fetch('/api/connect').then(r => r.json());\n * const session = await streamTo({ credentials, target: document.getElementById('avatar') });\n *\n * session.mic.toggle();\n * session.end();\n * ```\n */\nexport async function streamTo(options: {\n  credentials: { sessionId: string; sessionKey: string; baseUrl?: string };\n  target: HTMLVideoElement;\n  audio?: boolean;\n  video?: boolean;\n}): Promise<AvatarSession> {\n  const { credentials, target, audio, video } = options;\n  const { sessionId, sessionKey, baseUrl } = credentials;\n  const { serverUrl, token } = await resolveCredentials({ sessionId, sessionKey, baseUrl });\n\n  const session = new AvatarSession(sessionId);\n  session.streamTo(target);\n  await session._connect(serverUrl, token, { audio, video });\n\n  return session;\n}\n\n/**\n * Start an avatar session without a video element (headless).\n *\n * Use `session.streamTo(element)` later to attach video, or use\n * this for audio-only sessions.\n *\n * @example\n * ```ts\n * const credentials = await fetch('/api/connect').then(r => r.json());\n * const session = await connect({ credentials });\n * ```\n */\nexport async function connect(options: {\n  credentials: { sessionId: string; sessionKey: string; baseUrl?: string };\n  audio?: boolean;\n  video?: boolean;\n}): Promise<AvatarSession> {\n  const { credentials, audio, video } = options;\n  const { sessionId, sessionKey, baseUrl } = credentials;\n  const { serverUrl, token } = await resolveCredentials({ sessionId, sessionKey, baseUrl });\n\n  const session = new AvatarSession(sessionId);\n  await session._connect(serverUrl, token, { audio, video });\n\n  return session;\n}\n","import type {\n  InferSchemaOutput,\n  StandardSchemaResult,\n  StandardSchemaV1,\n} from './standard-schema';\nimport type { ClientEvent } from './types';\n\n/**\n * A standalone client tool definition. Composable — combine into arrays\n * and derive event types with `ClientEventsFrom`.\n *\n * At runtime this is just `{ type, name, description }` (exactly what the\n * Runway session create payload expects). The `Args` generic is phantom —\n * it only exists at the TypeScript level for type narrowing.\n *\n * When the tool is defined with a `schema` ([Standard Schema](https://standardschema.dev/)),\n * the schema is attached internally (not serialized) for runtime validation\n * and to infer `Args` from the schema output type.\n */\nexport interface ClientToolDef<Name extends string = string, Args = unknown> {\n  readonly type: 'client_event';\n  readonly name: Name;\n  readonly description: string;\n  /** @internal phantom field — always `undefined` at runtime */\n  readonly _args?: Args;\n}\n\nexport type ClientToolArgs<Tool extends ClientToolDef> =\n  Tool extends ClientToolDef<string, infer Args> ? Args : never;\n\nexport type ClientEventFromTool<Tool extends ClientToolDef> =\n  Tool extends ClientToolDef<infer Name, infer Args>\n    ? ClientEvent<Name, Args>\n    : never;\n\n/**\n * Derive a discriminated union of ClientEvent types from an array of tools.\n *\n * @example\n * ```typescript\n * const tools = [showQuestion, playSound];\n * type MyEvent = ClientEventsFrom<typeof tools>;\n * ```\n */\nexport type ClientEventsFrom<T extends ReadonlyArray<ClientToolDef>> =\n  T[number] extends infer U\n    ? U extends ClientToolDef<infer Name, infer Args>\n      ? ClientEvent<Name, Args>\n      : never\n    : never;\n\n// Schemas live in a WeakMap so the tool def itself stays a clean\n// `{ type, name, description }` object — safe to spread into the API\n// payload and JSON.stringify without leaking schema internals.\nconst toolSchemas = new WeakMap<ClientToolDef, StandardSchemaV1>();\n\n// Tracks tools that have already emitted the async-schema warning so a\n// misconfigured schema doesn't spam the console on every incoming event.\nconst asyncSchemaWarned = new WeakSet<ClientToolDef>();\n\n/**\n * Return the Standard Schema associated with a tool, if any.\n * Useful when composing validation outside of the SDK hooks.\n */\nexport function getClientToolSchema(\n  tool: ClientToolDef,\n): StandardSchemaV1 | undefined {\n  return toolSchemas.get(tool);\n}\n\n/**\n * Validate parsed client event args against a tool's schema.\n *\n * Returns the typed args on success, or `null` when the schema fails or\n * when the schema would need to resolve asynchronously (Standard Schema\n * allows async `validate`, but for fire-and-forget client events we only\n * accept sync results here).\n *\n * Tools defined without a schema always validate successfully — the\n * incoming args are returned as-is.\n */\nexport function validateClientToolArgs<Tool extends ClientToolDef>(\n  tool: Tool,\n  args: unknown,\n): ClientToolArgs<Tool> | null {\n  const schema = toolSchemas.get(tool);\n  if (!schema) {\n    return args as ClientToolArgs<Tool>;\n  }\n\n  const result = schema['~standard'].validate(args);\n  if (result instanceof Promise) {\n    if (!asyncSchemaWarned.has(tool) && typeof console !== 'undefined') {\n      asyncSchemaWarned.add(tool);\n      console.warn(\n        `[@runwayml/avatars-react] Async Standard Schema validation is not supported for client events (tool \"${tool.name}\"); subsequent events for this tool will be dropped silently.`,\n      );\n    }\n    return null;\n  }\n\n  return isSuccess(result) ? (result.value as ClientToolArgs<Tool>) : null;\n}\n\nfunction isSuccess<Output>(\n  result: StandardSchemaResult<Output>,\n): result is { readonly value: Output; readonly issues?: undefined } {\n  return result.issues == null;\n}\n\n/**\n * Define a single client tool.\n *\n * Returns a standalone object that can be composed into arrays and passed\n * to `realtimeSessions.create({ tools })`.\n *\n * Two forms are supported:\n *\n * 1. **Schema-driven** (recommended) — pass a\n *    [Standard Schema](https://standardschema.dev/) (Zod, Valibot, ArkType, …)\n *    to infer `args` types and enable runtime validation of incoming events:\n *\n *    ```typescript\n *    import { z } from 'zod';\n *    const showCaption = clientTool('show_caption', {\n *      description: 'Display a caption',\n *      schema: z.object({ text: z.string() }),\n *    });\n *    ```\n *\n * 2. **Type-only** — pass an `args` type via a cast when you don't need\n *    runtime validation:\n *\n *    ```typescript\n *    const showCaption = clientTool('show_caption', {\n *      description: 'Display a caption',\n *      args: {} as { text: string },\n *    });\n *    ```\n *\n * Combine tools and derive event types with `ClientEventsFrom`:\n *\n * ```typescript\n * const tools = [showCaption, playSound];\n * type MyEvent = ClientEventsFrom<typeof tools>;\n * ```\n */\nexport function clientTool<\n  Name extends string,\n  Schema extends StandardSchemaV1,\n>(\n  name: Name,\n  config: { description: string; schema: Schema },\n): ClientToolDef<Name, InferSchemaOutput<Schema>>;\nexport function clientTool<Name extends string, Args>(\n  name: Name,\n  config: { description: string; args: Args },\n): ClientToolDef<Name, Args>;\nexport function clientTool<Name extends string>(\n  name: Name,\n  config:\n    | { description: string; schema: StandardSchemaV1 }\n    | { description: string; args: unknown },\n): ClientToolDef<Name> {\n  const tool: ClientToolDef<Name> = {\n    type: 'client_event',\n    name,\n    description: config.description,\n  };\n\n  if ('schema' in config) {\n    toolSchemas.set(tool, config.schema);\n  }\n\n  return tool;\n}\n","import { clientTool, type ClientEventsFrom } from '../tools';\n\nexport const clickTool = clientTool('click', {\n  description: 'Clicks an interactive element on the page by its target ID',\n  args: {} as { target: string },\n});\n\nexport const scrollToTool = clientTool('scroll_to', {\n  description: 'Scrolls the page to an element by its target ID',\n  args: {} as { target: string },\n});\n\nexport const highlightTool = clientTool('highlight', {\n  description:\n    'Highlights an element on the page to draw attention to it by its target ID',\n  args: {} as { target: string; duration?: number },\n});\n\nconst toolDefs = [clickTool, scrollToTool, highlightTool] as const;\n\nexport type PageActionEvent = ClientEventsFrom<typeof toolDefs>;\n\n/**\n * Pre-built tool definitions with `parameters` arrays, ready to spread\n * into `realtimeSessions.create({ tools })`.\n *\n * @example\n * ```ts\n * import { pageActionTools } from '@runwayml/avatars-react/api';\n *\n * await client.realtimeSessions.create({\n *   model: 'gwm1_avatars',\n *   avatar: { type: 'runway-preset', presetId: 'music-superstar' },\n *   tools: [...pageActionTools, ...myCustomTools],\n * });\n * ```\n */\nexport const pageActionTools = [\n  {\n    ...clickTool,\n    parameters: [\n      {\n        name: 'target',\n        type: 'string',\n        description:\n          'The ID or data-avatar-target value of the element to click',\n      },\n    ],\n  },\n  {\n    ...scrollToTool,\n    parameters: [\n      {\n        name: 'target',\n        type: 'string',\n        description:\n          'The ID or data-avatar-target value of the element to scroll to',\n      },\n    ],\n  },\n  {\n    ...highlightTool,\n    parameters: [\n      {\n        name: 'target',\n        type: 'string',\n        description:\n          'The ID or data-avatar-target value of the element to highlight',\n      },\n      {\n        name: 'duration',\n        type: 'number',\n        description: 'How long to highlight in milliseconds. Defaults to 2000',\n      },\n    ],\n  },\n];\n"]}