{"version":3,"sources":["../src/tools.ts","../src/error.ts","../src/api/config.ts","../src/api/consume.ts","../src/api/poll.ts","../src/api/elevenlabs.ts","../src/api/page-actions.ts"],"names":["DEFAULT_BASE_URL"],"mappings":"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","file":"api.cjs","sourcesContent":["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","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","import { AvatarError } from '../error';\n\nexport interface PollUntilReadyOptions {\n  sessionId: string;\n  apiKey: string;\n  baseUrl?: string;\n  timeoutMs?: number;\n  intervalMs?: number;\n}\n\ninterface SessionResponse {\n  id: string;\n  status: string;\n  sessionKey?: string;\n  [key: string]: unknown;\n}\n\nconst DEFAULT_BASE_URL = 'https://api.dev.runwayml.com';\nconst DEFAULT_TIMEOUT_MS = 30_000;\nconst DEFAULT_INTERVAL_MS = 1_000;\nconst TERMINAL_STATUSES = ['COMPLETED', 'FAILED', 'CANCELLED'];\n\n/**\n * Poll a realtime session until it reaches READY status.\n *\n * Returns `{ sessionId, sessionKey }` — ready to pass to `streamTo` or `connect`.\n *\n * This is a server-side utility (requires your API key). Use it in\n * Next.js API routes, Express handlers, etc.\n *\n * @example\n * ```ts\n * import Runway from '@runwayml/sdk';\n * import { pollUntilReady } from '@runwayml/avatars/api';\n *\n * const runway = new Runway();\n * const { id: sessionId } = await runway.realtimeSessions.create({ ... });\n * const { sessionKey } = await pollUntilReady({ sessionId, apiKey: process.env.RUNWAYML_API_SECRET });\n *\n * return Response.json({ sessionId, sessionKey });\n * ```\n */\nexport async function pollUntilReady(\n  options: PollUntilReadyOptions,\n): Promise<{ sessionId: string; sessionKey: string }> {\n  const {\n    sessionId,\n    apiKey,\n    baseUrl = DEFAULT_BASE_URL,\n    timeoutMs = DEFAULT_TIMEOUT_MS,\n    intervalMs = DEFAULT_INTERVAL_MS,\n  } = options;\n\n  const deadline = Date.now() + timeoutMs;\n\n  while (Date.now() < deadline) {\n    const url = `${baseUrl}/v1/realtime_sessions/${sessionId}`;\n    const response = await fetch(url, {\n      headers: {\n        Authorization: `Bearer ${apiKey}`,\n        'X-Runway-Version': '2024-11-06',\n      },\n    });\n\n    if (!response.ok) {\n      const text = await response.text();\n      throw new AvatarError(\n        'CONSUME_FAILED',\n        `Failed to retrieve session: ${response.status} ${text}`,\n      );\n    }\n\n    const session: SessionResponse = await response.json();\n\n    if (session.status === 'READY') {\n      if (!session.sessionKey) {\n        throw new AvatarError(\n          'CONSUME_FAILED',\n          'Session is READY but sessionKey is missing',\n        );\n      }\n      return { sessionId, sessionKey: session.sessionKey };\n    }\n\n    if (TERMINAL_STATUSES.includes(session.status)) {\n      throw new AvatarError(\n        'CONNECTION_FAILED',\n        `Session ${session.status.toLowerCase()} before becoming ready`,\n      );\n    }\n\n    await new Promise((resolve) => setTimeout(resolve, intervalMs));\n  }\n\n  throw new AvatarError('CONNECTION_FAILED', 'Session creation timed out');\n}\n","import { AvatarError } from '../error';\nimport { DEFAULT_BASE_URL } from './config';\nimport { pollUntilReady } from './poll';\n\nconst ELEVENLABS_SIGNED_URL_ENDPOINT =\n  'https://api.elevenlabs.io/v1/convai/conversation/get-signed-url';\n\nconst API_VERSION = '2024-11-06';\n\n// The only realtime avatar model. Kept internal so callers never pass it.\nconst AVATAR_MODEL = 'gwm1_avatars';\n\nexport interface CreateElevenLabsSessionOptions {\n  /** Runway API secret (Bearer token). */\n  runwayApiSecret: string;\n  /** ID of a custom avatar to render. Must be visible to `runwayApiSecret`. */\n  avatarId: string;\n  /** ElevenLabs API key (used server-side to obtain a signed URL). */\n  elevenLabsApiKey: string;\n  /** ID of the ElevenLabs Conversational AI agent (e.g. `agent_…`). */\n  elevenLabsAgentId: string;\n  /** Runway API base URL. Defaults to production. */\n  baseUrl?: string;\n  /** Maximum time to wait for the session to become ready, in ms. */\n  timeoutMs?: number;\n}\n\nexport interface CreateElevenLabsSessionResponse {\n  sessionId: string;\n  sessionKey: string;\n  /** Echoed back so it can be passed straight to `<AvatarCall>`. */\n  avatarId: string;\n  /** Resolved base URL (defaults applied) for the consume call on the client. */\n  baseUrl: string;\n}\n\n/**\n * Create a Runway avatar session powered by a customer-owned ElevenLabs\n * Conversational AI agent. Handles the full server-side flow:\n *\n * 1. Fetches a signed WebSocket URL from the ElevenLabs API\n * 2. Creates a Runway realtime session with the ElevenLabs integration\n * 3. Polls until the session is READY and returns credentials\n *\n * The returned `sessionId`, `sessionKey`, `avatarId`, and `baseUrl` can be\n * passed straight to `<AvatarCall>` (or to `consumeSession` for lower-level\n * control).\n *\n * Run this server-side only — it requires both your Runway API secret and your\n * ElevenLabs API key.\n *\n * The ElevenLabs agent's **User input audio format** must be **PCM 16000Hz**\n * (ElevenLabs → agent → Advanced), otherwise the avatar receives no audio.\n *\n * @throws {AvatarError} with code `ELEVENLABS_SIGNED_URL_FAILED`,\n * `SESSION_CREATE_FAILED`, or `CONNECTION_FAILED` (poll timeout).\n */\nexport async function createElevenLabsSession(\n  options: CreateElevenLabsSessionOptions,\n): Promise<CreateElevenLabsSessionResponse> {\n  const baseUrl = options.baseUrl ?? DEFAULT_BASE_URL;\n  const signedUrl = await fetchElevenLabsSignedUrl(options);\n  const sessionId = await createRunwayElevenLabsSession({\n    ...options,\n    baseUrl,\n    signedUrl,\n  });\n\n  const { sessionKey } = await pollUntilReady({\n    sessionId,\n    apiKey: options.runwayApiSecret,\n    baseUrl,\n    timeoutMs: options.timeoutMs,\n  });\n\n  return { sessionId, sessionKey, avatarId: options.avatarId, baseUrl };\n}\n\nasync function fetchElevenLabsSignedUrl(\n  options: Pick<\n    CreateElevenLabsSessionOptions,\n    'elevenLabsApiKey' | 'elevenLabsAgentId'\n  >,\n): Promise<string> {\n  const response = await fetch(\n    `${ELEVENLABS_SIGNED_URL_ENDPOINT}?agent_id=${encodeURIComponent(options.elevenLabsAgentId)}`,\n    { headers: { 'xi-api-key': options.elevenLabsApiKey } },\n  );\n\n  if (!response.ok) {\n    const body = await response.text().catch(() => '');\n    throw new AvatarError(\n      'ELEVENLABS_SIGNED_URL_FAILED',\n      `Failed to get ElevenLabs signed URL: ${response.status} ${body}`,\n    );\n  }\n\n  const { signed_url: signedUrl } = (await response.json()) as {\n    signed_url: string;\n  };\n  return signedUrl;\n}\n\nasync function createRunwayElevenLabsSession(\n  options: Pick<\n    CreateElevenLabsSessionOptions,\n    'runwayApiSecret' | 'avatarId' | 'baseUrl'\n  > & { signedUrl: string },\n): Promise<string> {\n  const response = await fetch(`${options.baseUrl}/v1/realtime_sessions`, {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'application/json',\n      Authorization: `Bearer ${options.runwayApiSecret}`,\n      'X-Runway-Version': API_VERSION,\n    },\n    body: JSON.stringify({\n      model: AVATAR_MODEL,\n      avatar: { type: 'custom', avatarId: options.avatarId },\n      integration: { type: 'elevenlabs', signedUrl: options.signedUrl },\n    }),\n  });\n\n  if (!response.ok) {\n    const body = await response.text().catch(() => '');\n    throw new AvatarError(\n      'SESSION_CREATE_FAILED',\n      `Failed to create Runway session (${options.baseUrl}): ${response.status} ${body}`,\n    );\n  }\n\n  const { id: sessionId } = (await response.json()) as { id: string };\n  return sessionId;\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"]}