{"version":3,"sources":["../src/build-config.ts","../src/shared/error-details.ts","../src/shared/sdk-error.ts","../src/i18n/en-US.ts","../src/i18n/zh-CN.ts","../src/i18n/api-error-codes.ts","../src/i18n/index.ts","../src/rtc/media/video-frame-rate.ts","../src/rtc/media/publish-fps.ts","../src/rtc/media/reference-video-size.ts","../src/rtc/media/mobile-runtime.ts","../src/rtc/canvas/canvas-frame-draw.ts","../src/rtc/render/capture-host.ts","../src/rtc/media/video-file-stream.ts","../package.json","../src/telemetry/collector.ts","../src/telemetry/backend.ts","../src/telemetry/probe-config.ts","../src/telemetry/outbox.ts","../src/telemetry/rtc-stats.ts","../src/telemetry/startup.ts","../src/api/client.ts","../src/shared/error-utils.ts","../src/shared/abort.ts","../src/telemetry/http.ts","../src/telemetry/assets.ts","../src/telemetry/md5.ts","../src/rtc/rtc-events.ts","../src/telemetry/rtc-sampler.ts","../src/rtc/quality-monitor.ts","../src/rtc/teardown-timeout.ts","../src/rtc/rtc-manager.ts","../src/realtime/default.ts","../src/realtime/mobile-video-publish-compat.ts","../src/rtc/render/preview-media-layout.ts","../src/rtc/sei.ts","../src/index.ts","../src/rtc/media/media-file-stream.ts","../src/rtc/media/image-file-stream.ts","../src/rtc/media/heic-image.ts","../src/rtc/media/camera-errors.ts","../src/files/ref-image.ts","../src/files/download.ts","../src/shared/sdk-notice.ts","../src/files/client.ts","../src/rtc/media/camera-preflight.ts","../src/realtime/client.ts","../src/realtime/instant.ts","../src/rtc/media/camera-frame-readiness.ts","../src/realtime/session.ts","../src/drag/map-viewport.ts","../src/drag/drag-track-controller.ts","../src/drag/remote-view-host.ts","../src/realtime/camera.ts","../src/realtime/utils.ts","../src/realtime/local-stream-preview.ts","../src/realtime/rtc-console-log.ts","../src/offline/client.ts","../src/offline/types.ts","../src/offline/client-helpers.ts","../src/client/create-client.ts","../src/realtime/models.ts","../src/drag/drag-video-sync.ts"],"names":["XMAX_SDK_DEFAULT_LOCALE","XmaxSdkError","API_ERROR_MESSAGES","timer","schedule","MOBILE_PUBLISH_MAX_WIDTH_PX","RTC_PUBLISH_FPS_MOBILE","RTC_PUBLISH_FPS_WEB","RTC_PUBLISH_FRAME_INTERVAL_S","RTC_PUBLISH_FRAME_INTERVAL_MS","MEDIA_TIME_EPSILON_S","MEDIA_TIME_LOOP_JUMP_S","DEFAULT_SESSION_TARGET_SIZE","MIN_UPLOAD_VIDEO_PIXELS","MAX_UPLOAD_VIDEO_PIXELS","PREVIEW_CONTAINER_ASPECT_RATIO","endpoint","pageId","window","retryDelay","active","enabled","COS","generation","epoch","VideoRenderMode","VideoSourceType","MediaType","VERTC","StreamIndex","ConnectionState","RoomProfileType","MirrorType","AudioSourceType","VideoCodecType","createVideoFileStream","content","getFirstLiveAudioTrack","toContentRect","isMediaInsetInContainer","overlay","drawable","videoHost"],"mappings":"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","file":"index.cjs","sourcesContent":["/** Deployment region baked into each published SDK package by tsup. */\nexport type XmaxSdkRegion = 'cn' | 'global'\nexport type XmaxSdkEnvironment = 'prod' | 'test' | 'dev'\n\nexport function resolveXmaxSdkBuildEnvironment(\n  value: string | undefined,\n): XmaxSdkEnvironment {\n  if (value === 'prod' || value === 'test' || value === 'dev') return value\n  return 'prod'\n}\n\nexport function resolveXmaxReportEnvironment(\n  reportSource: unknown,\n  buildEnvironment: XmaxSdkEnvironment,\n): XmaxSdkEnvironment {\n  return reportSource === 'open_platform' ? buildEnvironment : 'prod'\n}\n\n/** Falls back to the domestic package for local development and unconfigured builds. */\nexport const XMAX_SDK_BUILD_REGION: XmaxSdkRegion =\n  process.env.XMAX_SDK_REGION === 'global' ? 'global' : 'cn'\n\nexport const XMAX_SDK_BUILD_ENV: XmaxSdkEnvironment =\n  resolveXmaxSdkBuildEnvironment(process.env.XMAX_SDK_ENV)\n\n/** Default UI/error language associated with the published package. */\nexport const XMAX_SDK_DEFAULT_LOCALE: 'zh-CN' | 'en-US' =\n  XMAX_SDK_BUILD_REGION === 'global' ? 'en-US' : 'zh-CN'\n","import type { XmaxDisconnectReasonCode } from '../telemetry/startup'\n\n/** Optional, privacy-safe evidence. A disconnect trigger is not a confirmed root cause. */\nexport type XmaxErrorDetails = Readonly<{\n  reason_code?: XmaxDisconnectReasonCode\n  failure_stage?: string\n  trace_id?: string\n  session_id?: string\n  generation_id?: string\n  failure_type?: 'business_error' | 'http_error' | 'timeout' | 'network_error' | 'invalid_response' | 'cancelled'\n  http_status?: number\n  business_code?: string\n  rtc_error_code?: string\n  connection_state?: string\n  connection_reason?: string\n  connection_recovered?: boolean\n  connection_interrupted_at_ms?: number\n  connection_recovered_at_ms?: number\n  network_online?: boolean\n  detection_source?: string\n  stall_ms?: number\n  reconnect_timeout_ms?: number\n  heartbeat_failure_trigger?: string\n  session_status?: string\n  server_close_reason?: string\n  teardown_failure_stages?: string\n}>\n\nconst stringKeys = ['reason_code', 'failure_stage', 'trace_id', 'session_id', 'generation_id',\n  'failure_type', 'business_code', 'rtc_error_code', 'connection_state', 'connection_reason',\n  'detection_source', 'heartbeat_failure_trigger', 'session_status', 'server_close_reason',\n  'teardown_failure_stages'] as const\nconst numberKeys = ['http_status', 'connection_interrupted_at_ms', 'connection_recovered_at_ms',\n  'stall_ms', 'reconnect_timeout_ms'] as const\nconst booleanKeys = ['connection_recovered', 'network_online'] as const\n\n/** @internal Allowlist only: never expose tokens, URLs, request bodies or native errors. */\nexport function createErrorDetails(values: Record<string, unknown>): XmaxErrorDetails {\n  const result: Record<string, string | number | boolean> = {}\n  for (const key of stringKeys) {\n    const value = values[key]\n    if (typeof value === 'string' && value.length) result[key] = value.slice(0, 256)\n  }\n  for (const key of numberKeys) {\n    const value = values[key]\n    if (typeof value === 'number' && Number.isFinite(value)) result[key] = value\n  }\n  for (const key of booleanKeys) {\n    if (typeof values[key] === 'boolean') result[key] = values[key]\n  }\n  return Object.freeze(result) as XmaxErrorDetails\n}\n","import { createErrorDetails, type XmaxErrorDetails } from './error-details'\n\nexport type XmaxErrorCode =\n  | 'INVALID_API_KEY'\n  | 'INVALID_MODEL'\n  | 'INVALID_INPUT'\n  | 'UNSUPPORTED_MEDIA'\n  | 'MEDIA_PROCESSING_ERROR'\n  | 'CAMERA_ERROR'\n  | 'NETWORK_ERROR'\n  | 'API_ERROR'\n  | 'WEB_RTC_ERROR'\n  | 'SESSION_ERROR'\n  | 'OFFLINE_TASK_TIMEOUT'\n  | 'UNKNOWN_ERROR'\n\n/** Internal, privacy-safe request details that may be copied into probe events. */\nexport type XmaxErrorDiagnostics = {\n  failure_type?: 'business_error' | 'http_error' | 'timeout' | 'network_error' | 'invalid_response' | 'cancelled'\n  business_code?: string\n  http_status?: number\n}\n\nconst errorDiagnostics = new WeakMap<object, XmaxErrorDiagnostics>()\n\n/** @internal Attach only enumerated/coded diagnostics; never attach response messages or bodies. */\nexport function attachErrorDiagnostics<T>(error: T, diagnostics: XmaxErrorDiagnostics): T {\n  if (error && (typeof error === 'object' || typeof error === 'function')) {\n    const previous = errorDiagnostics.get(error as object)\n    errorDiagnostics.set(error as object, { ...previous, ...diagnostics })\n  }\n  return error\n}\n\n/** @internal Read privacy-safe diagnostics retained while an error crosses SDK layers. */\nexport function getErrorDiagnostics(error: unknown): XmaxErrorDiagnostics | undefined {\n  if (!error || (typeof error !== 'object' && typeof error !== 'function')) {\n    return undefined\n  }\n  return errorDiagnostics.get(error as object)\n}\n\n/** Public SDK error contract: stable code/message plus optional immutable diagnostic details. */\nexport class XmaxSdkError extends Error {\n  readonly code: XmaxErrorCode\n  declare readonly details?: XmaxErrorDetails\n\n  constructor(code: XmaxErrorCode, message: string) {\n    super(message)\n    Object.defineProperty(this, 'name', {\n      value: 'XmaxSdkError',\n      configurable: true,\n      writable: true,\n      enumerable: false,\n    })\n    Object.defineProperty(this, 'message', {\n      value: message,\n      configurable: true,\n      writable: true,\n      enumerable: true,\n    })\n    this.code = code\n  }\n}\n\n/** @internal Enrich the same error without changing its code or callback identity. */\nexport function attachPublicErrorDetails(error: XmaxSdkError, values: Record<string, unknown>): XmaxSdkError {\n  const merged = { ...values, ...error.details }\n  if (error.details?.reason_code) {\n    // Absence is part of the original operation's identity; never borrow a later task.\n    for (const key of ['trace_id', 'session_id', 'generation_id'] as const) {\n      if (!(key in error.details)) delete merged[key]\n    }\n  }\n  const details = createErrorDetails(merged)\n  try {\n    if (Object.keys(details).length) Object.defineProperty(error, 'details', {\n      value: details, enumerable: true, configurable: true,\n    })\n  } catch { /* A consumer may freeze the error; diagnostics must not replace it. */ }\n  return error\n}\n\nexport function isXmaxSdkError(error: unknown): error is XmaxSdkError {\n  return error instanceof XmaxSdkError\n}\n\nexport type XmaxErrorFallback = {\n  code: XmaxErrorCode\n  message: string\n}\n\n/** Preserve a useful native message while assigning a stable SDK code. */\nexport function toXmaxSdkError(error: unknown, fallback: XmaxErrorFallback): XmaxSdkError {\n  if (isXmaxSdkError(error)) {\n    return error\n  }\n  const nativeMessage = error instanceof Error ? error.message.trim() : ''\n  return attachErrorDiagnostics(new XmaxSdkError(fallback.code, nativeMessage || fallback.message), getErrorDiagnostics(error) ?? {})\n}\n","export const enUS = {\n  'errors.apiKeyEmpty': 'apiKey cannot be empty',\n  'errors.baseUrlEmpty': 'baseUrl is required — pass XMAX_OPEN_API_PRODUCTION_BASE_URL for production',\n  'errors.modelEmpty': 'model cannot be empty',\n  'errors.invalidJson': 'Response is not valid JSON',\n  'errors.invalidPayload': 'Response payload is invalid',\n  'errors.requestFailed': 'Request failed',\n  'errors.requestRetry': 'Request failed. Please try again later.',\n  'errors.networkError': 'There seems to be a network issue. Please try again later.',\n  'errors.requestTimeout': 'Request timeout',\n  'errors.invalidFile': 'Upload failed. Please select the file again and try again.',\n  'errors.invalidFileType': 'Upload failed. This file type is not supported.',\n  'errors.sessionJoinInfoIncomplete': 'session does not contain complete RTC join info',\n  'errors.sessionUidMissing': 'session does not contain sessionUid',\n  'errors.refImageMissing': 'missing reference image',\n  'errors.imageCheckMissingUrl': 'image check response missing url',\n  'errors.imageCheckUnsafe': 'image did not pass safety check',\n  'errors.captureStreamUnsupported': 'captureStream is not supported in this browser',\n  'errors.videoTrackMissing': 'failed to create video track from file',\n  'errors.imageTrackMissing': 'failed to create video track from image file',\n  'errors.imageLoadFailed': 'failed to load image — try again after selecting the file',\n  'errors.invalidMediaFileType': 'unsupported media file type: {type}',\n  'errors.videoPlaybackFailed': 'failed to start video playback — try again after selecting the file',\n  'errors.rtcNotJoined': 'Please join the RTC room first',\n  'errors.rtcNotJoinedForMessaging': 'Please join the RTC room before sending events',\n  'errors.systemOverloaded': 'Network connection failed. Please try again.',\n  'errors.rtcStreamInterrupted': 'Realtime media transmission was interrupted. Please reconnect.',\n  'errors.offlinePositiveNumber': '{label} must be greater than 0',\n  'errors.offlineTaskUidEmpty': 'taskUid cannot be empty',\n  'errors.offlineUploadedUrlRequired': '{label} must be a URL returned by an Xmax upload method',\n  'errors.offlineQualityInvalid': 'quality must be either sd or hd',\n  'errors.offlineFpsUnsupported': 'fps is not supported by the Offline Task API',\n  'errors.offlinePromptInvalid': 'context.prompt must contain between 1 and 1024 characters',\n  'errors.offlineTaskUidsInvalid': 'taskUids must contain between 1 and 100 IDs',\n  'errors.offlinePageNumberInvalid': 'pageNumber must be a positive integer',\n  'errors.offlinePageSizeInvalid': 'pageSize must be an integer between 1 and 100',\n  'errors.offlineStatusInvalid': 'status is not supported by the Offline Task API',\n  'errors.offlineTaskTimeout': 'Offline task did not finish within {timeoutMs}ms',\n\n  'notices.lowInputResolution': 'The current input video resolution is too low. Try again with a high-resolution video source.',\n  'notices.lowInputImageResolution': 'The current input image resolution is too low. Try again with a high-resolution image.',\n\n  'rtc.alreadyInRoom': 'RTC is already in the target room. Skip duplicate join.',\n  'rtc.joiningRoom': 'Joining RTC room',\n  'rtc.joinSuccess': 'RTC joinRoom succeeded',\n  'rtc.roomUsers': 'Current room users: {users}',\n  'rtc.localVideoAlreadyPublished': 'Local video is already published',\n  'rtc.localVideoPublished': 'Local video capture started and stream published',\n  'rtc.externalVideoPublished': 'External video stream published',\n  'rtc.localVideoStopped': 'Local video publishing stopped',\n  'rtc.leaveRoomError': 'Error occurred during RTC leaveRoom',\n  'rtc.engineDestroyed': 'RTC engine destroyed',\n  'rtc.roomEventSent': 'RTC event sent',\n  'rtc.remotePlayerRefreshed': 'Remote video player refreshed: {userId}',\n  'rtc.remotePlayerRefreshFailed': 'Failed to refresh remote video player',\n  'rtc.userJoined': 'User joined RTC room: {userId}',\n  'rtc.userLeft': 'User left RTC room: {userId}',\n  'rtc.connectionStateChanged': 'RTC connection state changed',\n  'rtc.userPublished': 'User published stream: {userId}',\n  'rtc.userUnpublished': 'User unpublished stream: {userId}',\n  'rtc.seiReceived': 'Remote SEI received: {userId}',\n  'rtc.error': 'RTC error: {code}',\n  'rtc.captureSizeSet': 'Local video capture size set: {width} x {height}',\n  'rtc.encoderPreferenceSet': 'Video encoder preference set to H.264',\n  'rtc.encoderPreferenceFailed': 'Failed to set video encoder preference',\n  'rtc.remoteWaitSei': 'Remote video is waiting for SEI gate: {userId}',\n  'rtc.remoteContainerNotReady': 'Remote video container is not ready. Skip binding.',\n  'rtc.remotePlayerBound': 'Remote video player bound: {userId}',\n  'rtc.remoteOutputStalled': 'Remote output stalled for more than 20 seconds',\n  'rtc.sendSeiFailed': 'Failed to send SEI. The browser or encoder config may not support it.',\n  'rtc.seiUnsupported': 'H.264 is not supported. SEI gate will be disabled and output will not be blocked.',\n  'rtc.seiGateFallback': 'SEI gate timed out — showing remote output',\n  'rtc.getCodecsFailed': 'Failed to get supported codecs. SEI gate will be disabled and output will not be blocked.',\n} as const\n","export const zhCN = {\n  'errors.apiKeyEmpty': 'apiKey 不能为空',\n  'errors.baseUrlEmpty': 'baseUrl 为必填项 — 生产环境请传入 XMAX_OPEN_API_PRODUCTION_BASE_URL',\n  'errors.modelEmpty': 'model 不能为空',\n  'errors.invalidJson': '响应不是有效的 JSON',\n  'errors.invalidPayload': '响应数据格式不正确',\n  'errors.requestFailed': '请求失败',\n  'errors.requestRetry': '请求失败，请稍后再试',\n  'errors.networkError': '网络遇到点问题，请稍后再试',\n  'errors.requestTimeout': '请求超时',\n  'errors.invalidFile': '上传失败：文件无效，请重新选择后再试',\n  'errors.invalidFileType': '上传失败：文件格式不支持，请重新选择',\n  'errors.sessionJoinInfoIncomplete': 'session 缺少完整的 RTC 进房信息',\n  'errors.sessionUidMissing': 'session 缺少 sessionUid',\n  'errors.refImageMissing': '缺少参考图',\n  'errors.imageCheckMissingUrl': '图片检查响应缺少 url',\n  'errors.imageCheckUnsafe': '图片未通过安全检查',\n  'errors.captureStreamUnsupported': '当前浏览器不支持 captureStream',\n  'errors.videoTrackMissing': '未能从视频文件创建 video track',\n  'errors.imageTrackMissing': '未能从图片文件创建 video track',\n  'errors.imageLoadFailed': '图片无法加载，请重新选择文件后再试',\n  'errors.invalidMediaFileType': '不支持的媒体文件类型：{type}',\n  'errors.videoPlaybackFailed': '视频无法开始播放，请重新选择文件后再试',\n  'errors.rtcNotJoined': '请先成功加入 RTC 房间',\n  'errors.rtcNotJoinedForMessaging': '请先成功加入 RTC 房间后再发送事件',\n  'errors.systemOverloaded': '网络连接失败，请重试',\n  'errors.rtcStreamInterrupted': '实时音视频传输中断，请重新连接',\n  'errors.offlinePositiveNumber': '{label} 必须大于 0',\n  'errors.offlineTaskUidEmpty': 'taskUid 不能为空',\n  'errors.offlineUploadedUrlRequired': '{label} 必须是 Xmax 上传方法返回的 URL',\n  'errors.offlineQualityInvalid': 'quality 必须是 sd 或 hd',\n  'errors.offlineFpsUnsupported': '离线任务接口不支持该 fps',\n  'errors.offlinePromptInvalid': 'context.prompt 长度必须为 1 至 1024 个字符',\n  'errors.offlineTaskUidsInvalid': 'taskUids 必须包含 1 至 100 个任务 ID',\n  'errors.offlinePageNumberInvalid': 'pageNumber 必须是正整数',\n  'errors.offlinePageSizeInvalid': 'pageSize 必须是 1 至 100 的整数',\n  'errors.offlineStatusInvalid': '离线任务接口不支持该 status',\n  'errors.offlineTaskTimeout': '离线任务未能在 {timeoutMs} 毫秒内完成',\n\n  'notices.lowInputResolution': '当前输入视频分辨率过低，建议更换高清视频源后重试',\n  'notices.lowInputImageResolution': '当前输入图片分辨率过低，建议更换高清图片后重试',\n\n  'rtc.alreadyInRoom': 'RTC 已在目标房间中，跳过重复进房',\n  'rtc.joiningRoom': '准备加入 RTC 房间',\n  'rtc.joinSuccess': 'RTC joinRoom 成功',\n  'rtc.roomUsers': '当前房间用户: {users}',\n  'rtc.localVideoAlreadyPublished': '本地视频已处于发布状态',\n  'rtc.localVideoPublished': '已开启本地视频采集并发布视频流',\n  'rtc.externalVideoPublished': '已发布自定义视频流',\n  'rtc.localVideoStopped': '已停止本地视频发布',\n  'rtc.leaveRoomError': 'RTC leaveRoom 过程中出现异常',\n  'rtc.engineDestroyed': 'RTC 引擎已销毁',\n  'rtc.roomEventSent': '已发送 RTC 事件',\n  'rtc.remotePlayerRefreshed': '已刷新远端视频播放器: {userId}',\n  'rtc.remotePlayerRefreshFailed': '刷新远端视频播放器失败',\n  'rtc.userJoined': '用户加入 RTC 房间: {userId}',\n  'rtc.userLeft': '用户离开 RTC 房间: {userId}',\n  'rtc.connectionStateChanged': 'RTC 连接状态变化',\n  'rtc.userPublished': '用户发布流: {userId}',\n  'rtc.userUnpublished': '用户取消发布流: {userId}',\n  'rtc.seiReceived': '收到远端 SEI: {userId}',\n  'rtc.error': 'RTC 错误: {code}',\n  'rtc.captureSizeSet': '已设置本地视频采集尺寸: {width} x {height}',\n  'rtc.encoderPreferenceSet': '已设置视频编码偏好为 H.264',\n  'rtc.encoderPreferenceFailed': '设置视频编码偏好失败',\n  'rtc.remoteWaitSei': '远端视频等待 SEI 放行: {userId}',\n  'rtc.remoteContainerNotReady': '远端视频容器未就绪，跳过绑定',\n  'rtc.remotePlayerBound': '已绑定远端视频播放器: {userId}',\n  'rtc.remoteOutputStalled': '远端输出超过 20 秒无新帧',\n  'rtc.sendSeiFailed': '发送 SEI 失败，当前浏览器或编码配置可能不支持该能力',\n  'rtc.seiUnsupported': '当前环境不支持 H.264，SEI gate 将不会生效，output 将不再被拦截',\n  'rtc.seiGateFallback': 'SEI 门控超时，已显示远端输出',\n  'rtc.getCodecsFailed': '获取浏览器编解码支持失败，SEI gate 将不会生效，output 将不再被拦截',\n} as const\n","import type { SDKLocale } from './index'\n\n/**\n * Open API business error codes (46xxx) mapped to user-facing messages.\n * Source: Open API v1 error code tables. Codes not listed here fall back to the\n * backend `message` when present, otherwise a generic retry message for Open\n * API endpoints (see `errors.requestRetry`).\n */\ntype LocalizedMessage = Record<SDKLocale, string>\n\n/** 46006–46008 are internal capacity/permission failures; surfaced as a single overload hint. */\nconst SYSTEM_OVERLOADED: LocalizedMessage = {\n  'zh-CN': '当前使用人数过多，请稍后再试',\n  'en-US': 'The system is currently overloaded. Please retry after some time.',\n}\n\n/** 46009–46010: server connection failures. */\nconst CONNECTION_FAILED: LocalizedMessage = {\n  'zh-CN': '连接服务器失败，请稍后重试',\n  'en-US': 'Failed to connect to the server. Please try again later.',\n}\n\nexport const API_ERROR_MESSAGES: Record<string, LocalizedMessage> = {\n  '46001': { 'zh-CN': 'X-Api-Key 不能为空', 'en-US': 'X-Api-Key cannot be empty' },\n  '46002': { 'zh-CN': '无效的用户 API Key', 'en-US': 'Invalid user API Key' },\n  '46003': { 'zh-CN': 'model 不能为空', 'en-US': 'model cannot be empty' },\n  '46004': { 'zh-CN': 'sessionUid 不能为空', 'en-US': 'sessionUid cannot be empty' },\n  '46005': { 'zh-CN': '模型类型不存在', 'en-US': 'Model type does not exist' },\n  '46006': SYSTEM_OVERLOADED,\n  '46007': SYSTEM_OVERLOADED,\n  '46008': SYSTEM_OVERLOADED,\n  '46009': CONNECTION_FAILED,\n  '46010': CONNECTION_FAILED,\n  '46012': { 'zh-CN': '会话不存在', 'en-US': 'Session does not exist' },\n  '46013': { 'zh-CN': '会话不属于当前用户', 'en-US': 'Session does not belong to the current user' },\n  '46014': { 'zh-CN': '会话已关闭', 'en-US': 'Session has been closed' },\n  '46015': { 'zh-CN': '会话已超时', 'en-US': 'Session has timed out' },\n  '46018': { 'zh-CN': '临时 API Key 已过期', 'en-US': 'Temporary API Key has expired' },\n  '46019': {\n    'zh-CN': '临时 API Key 已达到积分上限',\n    'en-US': 'Temporary API Key has reached its points limit',\n  },\n  '46021': {\n    'zh-CN': '临时 API Key 不允许再创建临时 API Key',\n    'en-US': 'A temporary API Key cannot create another temporary API Key',\n  },\n  '40030': { 'zh-CN': '请求体不能为空', 'en-US': 'Request body cannot be empty' },\n  '40032': { 'zh-CN': 'refImagePath 不是有效的 URL', 'en-US': 'refImagePath is not a valid URL' },\n  '40033': { 'zh-CN': 'refImagePath 不是图片 URL', 'en-US': 'refImagePath is not an image URL' },\n  '40034': { 'zh-CN': 'refVideoPath 不能为空', 'en-US': 'refVideoPath cannot be empty' },\n  '40035': { 'zh-CN': 'refVideoPath 不是有效的 URL', 'en-US': 'refVideoPath is not a valid URL' },\n  '40036': { 'zh-CN': 'refVideoPath 不是视频 URL', 'en-US': 'refVideoPath is not a video URL' },\n  '40037': { 'zh-CN': '无法读取源视频信息', 'en-US': 'Unable to read source video metadata' },\n  '40038': { 'zh-CN': 'prompt 不能为空', 'en-US': 'prompt cannot be empty' },\n  '40039': { 'zh-CN': 'prompt 不能超过 1024 个字符', 'en-US': 'prompt cannot exceed 1024 characters' },\n  '40040': { 'zh-CN': 'status 不是支持的任务状态', 'en-US': 'status is not a supported task status' },\n  '40041': { 'zh-CN': 'pageSize 不能超过 100', 'en-US': 'pageSize cannot exceed 100' },\n  '40043': { 'zh-CN': '源视频时长不能少于 1 秒', 'en-US': 'Source video must be at least 1 second long' },\n  '40044': { 'zh-CN': 'fps 不能低于 8', 'en-US': 'fps cannot be lower than 8' },\n  '40045': { 'zh-CN': '正在等待或处理的任务已达到 100 个', 'en-US': 'The active offline task limit of 100 has been reached' },\n  '40046': { 'zh-CN': 'taskUids 不能为空', 'en-US': 'taskUids cannot be empty' },\n  '40047': { 'zh-CN': 'taskUids 不能超过 100 个', 'en-US': 'taskUids cannot contain more than 100 IDs' },\n  '46017': { 'zh-CN': '积分不足', 'en-US': 'Insufficient credits' },\n  '46023': { 'zh-CN': 'taskUid 不能为空', 'en-US': 'taskUid cannot be empty' },\n  '46024': { 'zh-CN': '离线任务不存在', 'en-US': 'Offline task does not exist' },\n  '46025': { 'zh-CN': '离线任务不属于当前用户', 'en-US': 'Offline task does not belong to the current user' },\n  '46026': { 'zh-CN': 'quality 必须是 sd 或 hd', 'en-US': 'quality must be sd or hd' },\n  '46027': { 'zh-CN': 'fps 不是支持的值', 'en-US': 'fps is not supported' },\n\n}\n\n/** Resolve a business error code to a localized message, or `undefined` if unmapped. */\nexport function resolveApiErrorMessage(\n  code: string | number | null | undefined,\n  locale: SDKLocale,\n): string | undefined {\n  if (code === null || code === undefined) return undefined\n  const entry = API_ERROR_MESSAGES[String(code)]\n  if (!entry) return undefined\n  return entry[locale] ?? entry['en-US']\n}\n","import { enUS } from './en-US'\nimport { zhCN } from './zh-CN'\nimport { XMAX_SDK_DEFAULT_LOCALE } from '../build-config'\n\nexport type SDKLocale = 'en-US' | 'zh-CN'\n\nexport { XMAX_SDK_DEFAULT_LOCALE } from '../build-config'\nexport { API_ERROR_MESSAGES, resolveApiErrorMessage } from './api-error-codes'\n\nexport type SDKMessages = Record<string, string>\n\nexport type SDKI18n = {\n  locale: SDKLocale\n  t: (key: string, params?: Record<string, string | number | boolean | null | undefined>) => string\n}\n\nfunction formatTemplate(\n  template: string,\n  params?: Record<string, string | number | boolean | null | undefined>,\n): string {\n  if (!params) return template\n  return template.replace(/\\{(\\w+)\\}/g, (_, rawKey: string) => {\n    const value = params[rawKey]\n    return value === null || value === undefined ? '' : String(value)\n  })\n}\n\nexport function getDefaultMessages(locale: SDKLocale): SDKMessages {\n  return locale === 'zh-CN' ? (zhCN as SDKMessages) : (enUS as SDKMessages)\n}\n\nexport function createSDKI18n(input?: {\n  locale?: SDKLocale\n  messages?: Record<string, string>\n  t?: SDKI18n['t']\n}): SDKI18n {\n  // The domestic package defaults to Chinese and the global package defaults\n  // to English. An explicitly supplied locale/i18n still takes precedence.\n  const locale = input?.locale ?? XMAX_SDK_DEFAULT_LOCALE\n\n  if (typeof input?.t === 'function') {\n    return { locale, t: input.t }\n  }\n\n  const base = getDefaultMessages(locale)\n  const merged: SDKMessages = { ...base, ...(input?.messages ?? {}) }\n\n  return {\n    locale,\n    t: (key, params) => {\n      const template = merged[key] ?? key\n      return formatTemplate(template, params)\n    },\n  }\n}\n","const COMMON_VIDEO_FPS = [24, 25, 30, 48, 50, 60] as const\n\ntype VideoFrameCallbackMetadata = {\n  mediaTime: number\n  presentedFrames: number\n}\n\ntype VideoWithFrameCallback = HTMLVideoElement & {\n  requestVideoFrameCallback?: (\n    cb: (now: DOMHighResTimeStamp, metadata: VideoFrameCallbackMetadata) => void,\n  ) => number\n}\n\nfunction median(values: number[]): number {\n  if (values.length === 0) {\n    return 30\n  }\n  const sorted = [...values].sort((a, b) => a - b)\n  const mid = Math.floor(sorted.length / 2)\n  if (sorted.length % 2 === 0) {\n    return (sorted[mid - 1] + sorted[mid]) / 2\n  }\n  return sorted[mid]\n}\n\n/** Snap to broadcast fps; prefer the lower candidate when between 30 and 48 to avoid over-pacing. */\nexport function snapToCommonVideoFps(fps: number): number {\n  if (!Number.isFinite(fps) || fps <= 0) {\n    return 30\n  }\n\n  const clamped = Math.max(1, Math.min(120, fps))\n  let best = 30\n  let bestDiff = Infinity\n  for (const candidate of COMMON_VIDEO_FPS) {\n    const diff = Math.abs(clamped - candidate)\n    if (diff < bestDiff || (diff === bestDiff && candidate < best)) {\n      bestDiff = diff\n      best = candidate\n    }\n  }\n  return best\n}\n\n/** Prefer a common fps not greater than measured — avoids encoder/capture duplicate frames. */\nexport function snapToCommonVideoFpsConservative(fps: number): number {\n  if (!Number.isFinite(fps) || fps <= 0) {\n    return 30\n  }\n\n  const snapped = snapToCommonVideoFps(fps)\n  if (snapped <= fps + 0.5) {\n    return snapped\n  }\n\n  const lowerCandidates = COMMON_VIDEO_FPS.filter((candidate) => candidate < snapped)\n  if (lowerCandidates.length > 0) {\n    return lowerCandidates[lowerCandidates.length - 1]\n  }\n  return snapped\n}\n\nexport type EstimateVideoFrameRateOptions = {\n  timeoutMs?: number\n  sampleDurationMs?: number\n  fallbackFps?: number\n}\n\n/**\n * Measure actual playback fps via presentedFrames over wall time (more reliable than per-frame deltas).\n */\nexport async function estimateVideoFrameRate(\n  videoEl: HTMLVideoElement,\n  options: EstimateVideoFrameRateOptions = {},\n): Promise<number> {\n  const timeoutMs = options.timeoutMs ?? 3000\n  const sampleDurationMs = options.sampleDurationMs ?? 900\n  const fallbackFps = options.fallbackFps ?? 30\n\n  const video = videoEl as VideoWithFrameCallback\n  if (!video.requestVideoFrameCallback) {\n    return fallbackFps\n  }\n\n  return new Promise((resolve) => {\n    let settled = false\n    let startWallMs = 0\n    let startPresented = 0\n    const deltas: number[] = []\n    let lastMediaTime = -1\n\n    const finish = (rawFps: number) => {\n      if (settled) {\n        return\n      }\n      settled = true\n      clearTimeout(timer)\n      resolve(snapToCommonVideoFpsConservative(rawFps))\n    }\n\n    const timer = setTimeout(() => {\n      if (startWallMs > 0) {\n        finish(fallbackFps)\n        return\n      }\n      if (deltas.length > 0) {\n        finish(median(deltas.map((delta) => 1 / delta)))\n        return\n      }\n      finish(fallbackFps)\n    }, timeoutMs)\n\n    const schedule = () => {\n      if (settled) {\n        return\n      }\n      video.requestVideoFrameCallback!((now, metadata) => {\n        if (lastMediaTime >= 0) {\n          const delta = metadata.mediaTime - lastMediaTime\n          if (delta > 0.001 && delta < 0.5) {\n            deltas.push(delta)\n          }\n        }\n        lastMediaTime = metadata.mediaTime\n\n        if (startWallMs === 0) {\n          startWallMs = now\n          startPresented = metadata.presentedFrames\n          schedule()\n          return\n        }\n\n        const elapsedMs = now - startWallMs\n        if (elapsedMs >= sampleDurationMs) {\n          const frameCount = metadata.presentedFrames - startPresented\n          if (frameCount > 0) {\n            finish(frameCount / (elapsedMs / 1000))\n            return\n          }\n        }\n\n        schedule()\n      })\n    }\n\n    schedule()\n  })\n}\n\nexport function resolveTrackFrameRate(track: MediaStreamTrack, fallback: number): number {\n  const settings = track.getSettings?.()\n  if (typeof settings?.frameRate === 'number' && settings.frameRate > 0) {\n    return snapToCommonVideoFpsConservative(settings.frameRate)\n  }\n  return snapToCommonVideoFpsConservative(fallback)\n}\n\n/** Encoder ceiling for playback-driven upload — never pace faster than the capture track. */\nexport function resolvePlaybackDrivenEncoderFps(\n  track: MediaStreamTrack,\n  fallback = 24,\n): number {\n  return resolveTrackFrameRate(track, fallback)\n}\n","/** Mobile is below 592px; 592px and above uses Web publishing settings. */\nexport const MOBILE_PUBLISH_MAX_WIDTH_PX = 591\n\nexport const RTC_PUBLISH_FPS_WEB = 30\n\nexport const RTC_PUBLISH_FPS_MOBILE = 24\n\nexport type ResolveRtcPublishFpsOptions = {\n  /** When set, skips viewport detection. */\n  mobile?: boolean\n  /** Explicit fps override. */\n  fps?: number\n  /** Upload/file publish — use detail encoding and higher max bitrate. */\n  highQuality?: boolean\n}\n\nexport function isMobilePublishEnvironment(): boolean {\n  if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n    return false\n  }\n  return window.matchMedia(`(max-width: ${MOBILE_PUBLISH_MAX_WIDTH_PX}px)`).matches\n}\n\nexport function resolveRtcPublishFps(options: ResolveRtcPublishFpsOptions = {}): number {\n  if (typeof options.fps === 'number' && Number.isFinite(options.fps) && options.fps > 0) {\n    return options.fps\n  }\n  const mobile = options.mobile ?? isMobilePublishEnvironment()\n  return mobile ? RTC_PUBLISH_FPS_MOBILE : RTC_PUBLISH_FPS_WEB\n}\n\nexport function resolveRtcPublishFrameIntervalS(options?: ResolveRtcPublishFpsOptions): number {\n  return 1 / resolveRtcPublishFps(options)\n}\n\n/** Web @ 30fps — use {@link resolveRtcPublishFrameIntervalS} when mobile-aware. */\nexport const RTC_PUBLISH_FRAME_INTERVAL_S = 1 / RTC_PUBLISH_FPS_WEB\n\nexport const RTC_PUBLISH_FRAME_INTERVAL_MS = 1000 / RTC_PUBLISH_FPS_WEB\n\n/** Tolerance when comparing media-time deltas (seconds). */\nexport const MEDIA_TIME_EPSILON_S = 0.001\n\n/** Media time jumped backward beyond this threshold — treat as loop/seek reset. */\nexport const MEDIA_TIME_LOOP_JUMP_S = 0.05\n","/** Preview frames default to 16:9; session `size` is separate (see resolveUploadVideoSize). */\nexport const PREVIEW_CONTAINER_ASPECT_RATIO = 16 / 9\n\n/** CSS `aspect-ratio` string for a session target size — keeps preview layout aligned with passed `size`. */\nexport function resolvePreviewAspectRatio(size: [number, number]): string {\n  return `${size[0]} / ${size[1]}`\n}\n\n/** Default landscape session size under the 832 rule (16:9). */\nexport const DEFAULT_SESSION_TARGET_SIZE: [number, number] = [1472, 832]\n\nconst UPLOAD_SIZE_ALIGN = 32\nexport const MIN_UPLOAD_VIDEO_PIXELS = 600_000\nexport const MAX_UPLOAD_VIDEO_PIXELS = 1_280_000\n\nfunction alignToSizeMultiple(value: number): number {\n  return Math.max(UPLOAD_SIZE_ALIGN, Math.round(value / UPLOAD_SIZE_ALIGN) * UPLOAD_SIZE_ALIGN)\n}\n\nfunction alignUpToSizeMultiple(value: number): number {\n  return Math.max(UPLOAD_SIZE_ALIGN, Math.ceil(value / UPLOAD_SIZE_ALIGN) * UPLOAD_SIZE_ALIGN)\n}\n\nfunction alignDownToSizeMultiple(value: number): number {\n  return Math.max(UPLOAD_SIZE_ALIGN, Math.floor(value / UPLOAD_SIZE_ALIGN) * UPLOAD_SIZE_ALIGN)\n}\n\nfunction makeEven(value: number): number {\n  const rounded = Math.max(2, Math.round(value))\n  return rounded % 2 === 0 ? rounded : rounded - 1\n}\n\n/**\n * Upload publish size — keep source resolution (even dimensions for H.264).\n * Avoids canvas downscale blur.\n */\nexport function resolveUploadPublishSize(sourceWidth: number, sourceHeight: number): [number, number] {\n  if (sourceWidth <= 0 || sourceHeight <= 0) {\n    return DEFAULT_SESSION_TARGET_SIZE\n  }\n  return [makeEven(sourceWidth), makeEven(sourceHeight)]\n}\n\n/**\n * Adaptive RTC encode/session size.\n * Keeps the base width and scales height for wide sources; tall sources use the full base size.\n */\nexport function resolveAdaptiveRtcVideoSize(\n  sourceWidth: number,\n  sourceHeight: number,\n  baseSize: [number, number] = DEFAULT_SESSION_TARGET_SIZE,\n): [number, number] {\n  if (sourceWidth <= 0 || sourceHeight <= 0) {\n    return baseSize\n  }\n\n  const [baseWidth, baseHeight] = baseSize\n  const sourceAspectRatio = sourceHeight / sourceWidth\n  const baseAspectRatio = baseHeight / baseWidth\n\n  if (sourceAspectRatio >= baseAspectRatio) {\n    return [baseWidth, baseHeight]\n  }\n\n  const adaptiveHeight = Math.max(\n    UPLOAD_SIZE_ALIGN,\n    Math.round(baseWidth * sourceAspectRatio),\n  )\n  return [baseWidth, makeEven(adaptiveHeight)]\n}\n\n/**\n * Upload session size:\n * - below 600k pixels: use the smallest proportional upscale above 600k;\n * - above 1.28m pixels: use the largest proportional downscale below 1.28m;\n * - inside the range: keep native scale.\n * Width and height are aligned to multiples of 32 in the scale direction.\n */\nexport function resolveUploadVideoSize(sourceWidth: number, sourceHeight: number): [number, number] {\n  if (sourceWidth <= 0 || sourceHeight <= 0) {\n    return DEFAULT_SESSION_TARGET_SIZE\n  }\n\n  const sourcePixels = sourceWidth * sourceHeight\n  let size: [number, number]\n\n  if (sourcePixels < MIN_UPLOAD_VIDEO_PIXELS) {\n    const scale = Math.sqrt(MIN_UPLOAD_VIDEO_PIXELS / sourcePixels)\n    size = [\n      alignUpToSizeMultiple(sourceWidth * scale),\n      alignUpToSizeMultiple(sourceHeight * scale),\n    ]\n  } else if (sourcePixels > MAX_UPLOAD_VIDEO_PIXELS) {\n    const scale = Math.sqrt(MAX_UPLOAD_VIDEO_PIXELS / sourcePixels)\n    size = [\n      alignDownToSizeMultiple(sourceWidth * scale),\n      alignDownToSizeMultiple(sourceHeight * scale),\n    ]\n  } else {\n    size = [\n      alignToSizeMultiple(sourceWidth),\n      alignToSizeMultiple(sourceHeight),\n    ]\n  }\n\n  const alignedPixels = size[0] * size[1]\n  if (alignedPixels <= MIN_UPLOAD_VIDEO_PIXELS) {\n    const scale = Math.sqrt(MIN_UPLOAD_VIDEO_PIXELS / sourcePixels)\n    return [\n      alignUpToSizeMultiple(sourceWidth * scale),\n      alignUpToSizeMultiple(sourceHeight * scale),\n    ]\n  }\n  if (alignedPixels >= MAX_UPLOAD_VIDEO_PIXELS) {\n    const scale = Math.sqrt(MAX_UPLOAD_VIDEO_PIXELS / sourcePixels)\n    const constrained: [number, number] = [\n      alignDownToSizeMultiple(sourceWidth * scale),\n      alignDownToSizeMultiple(sourceHeight * scale),\n    ]\n    if (constrained[0] * constrained[1] >= MAX_UPLOAD_VIDEO_PIXELS) {\n      if (constrained[0] >= constrained[1]) {\n        constrained[0] = Math.max(UPLOAD_SIZE_ALIGN, constrained[0] - UPLOAD_SIZE_ALIGN)\n      } else {\n        constrained[1] = Math.max(UPLOAD_SIZE_ALIGN, constrained[1] - UPLOAD_SIZE_ALIGN)\n      }\n    }\n    return constrained\n  }\n  return size\n}\n\nexport function resolveSessionTargetSize(input: {\n  localVideoSize?: { width: number; height: number } | null\n  overrideSize?: [number, number]\n}): [number, number] {\n  if (input.overrideSize) {\n    return input.overrideSize\n  }\n\n  if (input.localVideoSize?.width && input.localVideoSize?.height) {\n    return [input.localVideoSize.width, input.localVideoSize.height]\n  }\n\n  return DEFAULT_SESSION_TARGET_SIZE\n}\n","/** True for iPhone/iPad/iPod, including iPadOS desktop user-agent mode. */\nexport function isAppleMobileRuntime(): boolean {\n  if (typeof navigator === 'undefined') {\n    return false\n  }\n\n  return /iPhone|iPad|iPod/i.test(navigator.userAgent)\n    || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)\n}\n","/** Fill the output frame without stretching, cropping overflow around the center. */\nexport function drawSourceCover(\n  ctx: CanvasRenderingContext2D,\n  source: CanvasImageSource,\n  outputWidth: number,\n  outputHeight: number,\n  sourceWidth: number,\n  sourceHeight: number,\n  backgroundColor = '#000000',\n): void {\n  ctx.imageSmoothingEnabled = true\n  ctx.imageSmoothingQuality = 'high'\n  ctx.clearRect(0, 0, outputWidth, outputHeight)\n  ctx.fillStyle = '#000000'\n  if (backgroundColor.trim()) {\n    // Invalid CSS colors leave the canvas fillStyle unchanged, preserving the black fallback.\n    ctx.fillStyle = backgroundColor\n  }\n  ctx.fillRect(0, 0, outputWidth, outputHeight)\n\n  const scale = Math.max(outputWidth / sourceWidth, outputHeight / sourceHeight)\n  const width = sourceWidth * scale\n  const height = sourceHeight * scale\n  const x = (outputWidth - width) / 2\n  const y = (outputHeight - height) / 2\n\n  ctx.drawImage(source, 0, 0, sourceWidth, sourceHeight, x, y, width, height)\n}\n\nexport type CanvasPosterOptions = {\n  type?: 'image/png' | 'image/jpeg' | 'image/webp'\n  quality?: number\n  /** Maximum time to wait for browsers that never invoke canvas.toBlob. */\n  timeoutMs?: number\n}\n\n/** Create a browser-owned URL for a still image of the composited Canvas frame. */\nexport function createCanvasPosterUrl(\n  canvas: HTMLCanvasElement,\n  options: CanvasPosterOptions = {},\n): Promise<string | null> {\n  if (typeof canvas.toBlob !== 'function') {\n    return Promise.resolve(null)\n  }\n\n  const type = options.type ?? 'image/png'\n  const timeoutMs = Math.max(1, options.timeoutMs ?? 8_000)\n\n  return new Promise((resolve) => {\n    let settled = false\n    const finish = (value: string | null) => {\n      if (settled) return\n      settled = true\n      clearTimeout(timer)\n      resolve(value)\n    }\n    const timer = setTimeout(() => finish(null), timeoutMs)\n\n    try {\n      canvas.toBlob((blob) => {\n        if (settled) return\n        if (!blob) {\n          finish(null)\n          return\n        }\n        try {\n          finish(URL.createObjectURL(blob))\n        } catch {\n          finish(null)\n        }\n      }, type, options.quality)\n    } catch {\n      finish(null)\n    }\n  })\n}\n","/**\n * Off-screen host for decode/canvas pipelines.\n * - Android: keep a tiny but paintable node (fully off-screen media can stall decode).\n * - Safari / desktop: keep a real-size node moved off-screen (1×1 / 16×16 can stall WebKit decode).\n */\nlet captureHostRoot: HTMLDivElement | null = null\n\nconst ANDROID_HOST_STYLE =\n  'position:fixed;left:0;top:0;width:1px;height:1px;overflow:hidden;opacity:1;pointer-events:none;z-index:2147483647;'\n\nconst ANDROID_VIDEO_STYLE =\n  'position:absolute;left:0;top:0;width:16px;height:16px;opacity:1;pointer-events:none;object-fit:cover;'\n\nconst ANDROID_CANVAS_STYLE =\n  'position:absolute;left:0;top:0;width:1px;height:1px;opacity:1;pointer-events:none;'\n\nconst DESKTOP_HOST_STYLE =\n  'position:fixed;left:0;top:0;width:0;height:0;overflow:hidden;pointer-events:none;z-index:-1;'\n\nconst DESKTOP_VIDEO_STYLE =\n  'position:fixed;left:-10000px;top:0;width:640px;height:480px;opacity:1;pointer-events:none;z-index:-1;'\n\nfunction isAndroidCaptureRuntime(): boolean {\n  return typeof navigator !== 'undefined' && /Android/i.test(navigator.userAgent)\n}\n\nfunction getCaptureHost(): HTMLDivElement {\n  if (!captureHostRoot) {\n    captureHostRoot = document.createElement('div')\n    captureHostRoot.setAttribute('data-xmax-capture-host', 'true')\n    captureHostRoot.style.cssText = isAndroidCaptureRuntime()\n      ? ANDROID_HOST_STYLE\n      : DESKTOP_HOST_STYLE\n    document.body.appendChild(captureHostRoot)\n  }\n  return captureHostRoot\n}\n\nexport function mountCaptureVideo(videoEl: HTMLVideoElement): void {\n  const android = isAndroidCaptureRuntime()\n  videoEl.setAttribute('playsinline', 'true')\n  videoEl.setAttribute('webkit-playsinline', 'true')\n  if (android) {\n    videoEl.setAttribute('x5-playsinline', 'true')\n    videoEl.setAttribute('x5-video-player-type', 'h5')\n    videoEl.setAttribute('x5-video-player-fullscreen', 'false')\n    videoEl.setAttribute('muted', '')\n    videoEl.setAttribute('preload', 'auto')\n  }\n  videoEl.style.cssText = android ? ANDROID_VIDEO_STYLE : DESKTOP_VIDEO_STYLE\n  getCaptureHost().appendChild(videoEl)\n}\n\n/** Android may need the capture canvas in the DOM; Safari/desktop do not. */\nexport function mountCaptureCanvas(canvasEl: HTMLCanvasElement): void {\n  if (!isAndroidCaptureRuntime()) {\n    return\n  }\n  canvasEl.style.cssText = ANDROID_CANVAS_STYLE\n  getCaptureHost().appendChild(canvasEl)\n}\n","import { createSDKI18n, type SDKI18n } from '../../i18n'\nimport { toXmaxSdkError, XmaxSdkError } from '../../shared/sdk-error'\nimport {\n  MEDIA_TIME_EPSILON_S,\n  MEDIA_TIME_LOOP_JUMP_S,\n  isMobilePublishEnvironment,\n  resolveRtcPublishFrameIntervalS,\n  resolveRtcPublishFps,\n} from './publish-fps'\nimport { resolveUploadVideoSize } from './reference-video-size'\nimport { isAppleMobileRuntime } from './mobile-runtime'\nimport {\n  drawSourceCover,\n  type CanvasPosterOptions,\n} from '../canvas/canvas-frame-draw'\nimport { mountCaptureCanvas, mountCaptureVideo } from '../render/capture-host'\nimport { estimateVideoFrameRate, resolvePlaybackDrivenEncoderFps } from './video-frame-rate'\n\nexport type VideoInputHealth = {\n  currentTime: number\n  duration: number\n  paused: boolean\n  ended: boolean\n  readyState: number\n  trackReadyState: string\n  trackMuted: boolean\n  stalled: boolean\n  timeSinceAdvanceMs: number\n}\n\nconst STALL_CATCHUP_MS = 1500\nconst MEDIA_READY_TIMEOUT_MS = 8000\nconst RVFC_STALL_FALLBACK_MS = 400\n\nfunction isAndroidRuntime(): boolean {\n  return typeof navigator !== 'undefined' && /Android/i.test(navigator.userAgent)\n}\n\ntype VideoFrameCallbackMetadata = {\n  mediaTime: number\n  presentedFrames: number\n}\n\ntype VideoWithCaptureStream = HTMLVideoElement & {\n  captureStream?: (frameRate?: number) => MediaStream\n  mozCaptureStream?: (frameRate?: number) => MediaStream\n}\n\ntype WindowWithWebkitAudioContext = Window & typeof globalThis & {\n  webkitAudioContext?: typeof AudioContext\n}\n\ntype VideoWithFrameCallback = HTMLVideoElement & {\n  requestVideoFrameCallback?: (\n    cb: (now: DOMHighResTimeStamp, metadata: VideoFrameCallbackMetadata) => void,\n  ) => number\n  cancelVideoFrameCallback?: (handle: number) => void\n}\n\nexport type VideoFileStreamOptions = {\n  muted?: boolean\n  playbackRate?: number\n  /** Optional fps override; when omitted, fps is measured from the source file. */\n  fps?: number\n  /** Optional hint; publish fps is still derived from the uploaded file when applicable. */\n  mobile?: boolean\n  targetSize?: [number, number]\n  /** Canvas background used for transparent source pixels. @default '#000000' */\n  backgroundColor?: string\n  /** Still-image poster encoding. Defaults to PNG. */\n  poster?: CanvasPosterOptions\n  i18n?: SDKI18n\n  onHealthReport?: (health: VideoInputHealth) => void\n  healthIntervalMs?: number\n}\n\nexport type VideoFileStream = {\n  url: string\n  /** Still image matching the composited publish Canvas; available for image sources. */\n  posterUrl?: string\n  /** Same MediaStream pushed to RTC; bind to preview via srcObject. */\n  previewStream: MediaStream\n  /** Capture-only element; pinned off-screen. */\n  videoEl: HTMLVideoElement\n  videoTrack: MediaStreamTrack\n  audioTrack?: MediaStreamTrack\n  /** Measured source fps — encoder ceiling hint only. */\n  fps: number\n  /** Session publish dimensions (native source size by default). */\n  width: number\n  height: number\n  /** Original media dimensions before scale. */\n  sourceWidth: number\n  sourceHeight: number\n  destroy: () => void\n}\n\nexport function shouldSampleAtMediaTime(\n  lastMediaTimeS: number,\n  mediaTimeS: number,\n  frameIntervalS: number,\n): boolean {\n  if (!Number.isFinite(mediaTimeS) || mediaTimeS < 0) {\n    return false\n  }\n  if (lastMediaTimeS < 0) {\n    return true\n  }\n  if (mediaTimeS + MEDIA_TIME_LOOP_JUMP_S < lastMediaTimeS) {\n    return true\n  }\n  const minIntervalS = Math.max(0, frameIntervalS - MEDIA_TIME_EPSILON_S)\n  return mediaTimeS - lastMediaTimeS >= minIntervalS\n}\n\nasync function applyPublishTrackConstraints(\n  track: MediaStreamTrack,\n  width: number,\n  height: number,\n): Promise<void> {\n  if (typeof track.applyConstraints !== 'function') {\n    return\n  }\n\n  try {\n    await track.applyConstraints({\n      width: { ideal: width, max: width },\n      height: { ideal: height, max: height },\n    })\n  } catch {\n    // Some browsers reject exact constraints on captureStream tracks.\n  }\n}\n\nexport async function createVideoFileStream(\n  fileOrUrl: Blob | string,\n  options: VideoFileStreamOptions = {},\n): Promise<VideoFileStream> {\n  const i18n = options.i18n ?? createSDKI18n()\n  const mobile = isAndroidRuntime() || isAppleMobileRuntime()\n    || (options.mobile ?? isMobilePublishEnvironment())\n  const isUrl = typeof fileOrUrl === 'string'\n  const url = isUrl ? fileOrUrl : URL.createObjectURL(fileOrUrl)\n  const videoEl = document.createElement('video')\n\n  videoEl.muted = options.muted ?? true\n  videoEl.playsInline = true\n\n  if (isUrl) {\n    videoEl.crossOrigin = 'anonymous'\n  }\n  videoEl.src = url\n  videoEl.loop = true\n  videoEl.autoplay = true\n\n  mountCaptureVideo(videoEl)\n\n  try {\n    videoEl.load()\n    await waitForEvent(videoEl, 'loadedmetadata', MEDIA_READY_TIMEOUT_MS)\n    // Safari/WebKit often needs canplay before the first frame is drawable.\n    // Android can proceed from metadata to avoid hanging on canplay.\n    if (!isAndroidRuntime()) {\n      await waitForCanPlay(videoEl, MEDIA_READY_TIMEOUT_MS)\n    }\n  } catch (error) {\n    if (!isUrl) URL.revokeObjectURL(url)\n    const timedOut = error instanceof Error && /timed out/i.test(error.message)\n    throw toXmaxSdkError(error, {\n      code: 'MEDIA_PROCESSING_ERROR',\n      message: timedOut ? 'Video metadata timed out' : 'Failed to load video metadata',\n    })\n  }\n\n  if (typeof options.playbackRate === 'number') {\n    videoEl.playbackRate = options.playbackRate\n  }\n\n  await startVideoPlayback(videoEl, i18n)\n\n  const sourceWidth = videoEl.videoWidth || 0\n  const sourceHeight = videoEl.videoHeight || 0\n  if (!sourceWidth || !sourceHeight) {\n    if (!isUrl) URL.revokeObjectURL(url)\n    throw new XmaxSdkError('MEDIA_PROCESSING_ERROR', i18n.t('errors.videoTrackMissing'))\n  }\n\n  const measuredFps = typeof options.fps === 'number' && options.fps > 0\n    ? options.fps\n    : mobile ? resolveRtcPublishFps({ mobile: true }) : await estimateVideoFrameRate(videoEl)\n\n  const [outputWidth, outputHeight] = options.targetSize\n    ?? resolveUploadVideoSize(sourceWidth, sourceHeight)\n\n  const canvas = document.createElement('canvas')\n  canvas.width = outputWidth\n  canvas.height = outputHeight\n  const ctx = canvas.getContext('2d', { alpha: false })\n  if (!ctx) {\n    if (!isUrl) URL.revokeObjectURL(url)\n    throw new XmaxSdkError('UNSUPPORTED_MEDIA', i18n.t('errors.captureStreamUnsupported'))\n  }\n  const captureStreamFn =\n    (canvas as HTMLCanvasElement & { captureStream?: (frameRate?: number) => MediaStream }).captureStream\n    ?? (canvas as HTMLCanvasElement & { mozCaptureStream?: (frameRate?: number) => MediaStream }).mozCaptureStream\n\n  if (!captureStreamFn) {\n    if (!isUrl) URL.revokeObjectURL(url)\n    throw new XmaxSdkError('UNSUPPORTED_MEDIA', i18n.t('errors.captureStreamUnsupported'))\n  }\n  mountCaptureCanvas(canvas)\n\n  const streamFps = resolveRtcPublishFps({ mobile, fps: options.fps })\n  // Keep upload video pacing aligned with image/camera publish to avoid over-driving canvas capture.\n  const previewStream = captureStreamFn.call(canvas, streamFps)\n  const videoTrack = previewStream.getVideoTracks()[0]\n  const webAudioCleanupRef: { current: (() => void) | null } = { current: null }\n  /**\n   * Mobile WebKit / WebView environments frequently fail to sustain external\n   * video publish after we force audio extraction from uploaded files.\n   * Prefer stable video-only upload publishing on mobile.\n   */\n  const shouldCaptureUploadAudio = !mobile\n  let audioTrack: MediaStreamTrack | undefined\n  if (shouldCaptureUploadAudio) {\n    audioTrack = await resolveUploadAudioTrack(videoEl, webAudioCleanupRef)\n    if (audioTrack && previewStream.getAudioTracks().length === 0) {\n      // Playground currently uses `realtime.connect(previewStream, ...)`.\n      // Attach audio to the same stream so the generic connect path can pick it up.\n      const attachedAudioTrack = typeof audioTrack.clone === 'function' ? audioTrack.clone() : audioTrack\n      previewStream.addTrack(attachedAudioTrack)\n      audioTrack = attachedAudioTrack\n    }\n  }\n\n  if (!videoTrack) {\n    if (!isUrl) URL.revokeObjectURL(url)\n    throw new XmaxSdkError('MEDIA_PROCESSING_ERROR', i18n.t('errors.videoTrackMissing'))\n  }\n\n  const frameIntervalS = resolveRtcPublishFrameIntervalS({ mobile, fps: streamFps })\n  const publishFps = resolvePlaybackDrivenEncoderFps(videoTrack, measuredFps)\n  await applyPublishTrackConstraints(videoTrack, outputWidth, outputHeight)\n\n  let destroyed = false\n  let lastAdvanceAt = performance.now()\n  let lastDrawMediaTimeS = -1\n  let lastSampleWallMs = 0\n  let videoFrameCallbackId: number | null = null\n  let rafId: number | null = null\n  let rvfcStallTimer: ReturnType<typeof setTimeout> | null = null\n  let usingRvfc = false\n\n  const drawFrame = () => {\n    if (destroyed) {\n      return\n    }\n    try {\n      drawSourceCover(ctx, videoEl, outputWidth, outputHeight, sourceWidth, sourceHeight, options.backgroundColor)\n    } catch {\n      // Android may expose metadata before its first drawable frame.\n    }\n  }\n\n  const onPlaybackSample = (mediaTimeS: number) => {\n    if (destroyed || !shouldSampleAtMediaTime(lastDrawMediaTimeS, mediaTimeS, frameIntervalS)) {\n      return\n    }\n    lastDrawMediaTimeS = mediaTimeS\n    lastAdvanceAt = performance.now()\n    lastSampleWallMs = performance.now()\n    drawFrame()\n  }\n\n  const scheduleRafWatch = () => {\n    if (destroyed || rafId !== null) {\n      return\n    }\n    const tick = () => {\n      rafId = null\n      if (destroyed) return\n      if (!usingRvfc || performance.now() - lastSampleWallMs >= RVFC_STALL_FALLBACK_MS) {\n        onPlaybackSample(videoEl.currentTime)\n      }\n      rafId = window.requestAnimationFrame(tick)\n    }\n    rafId = window.requestAnimationFrame(tick)\n  }\n\n  const scheduleRvfcWatch = () => {\n    if (destroyed) return\n    const video = videoEl as VideoWithFrameCallback\n    if (!video.requestVideoFrameCallback) return\n    usingRvfc = true\n    videoFrameCallbackId = video.requestVideoFrameCallback!((_now, metadata) => {\n      videoFrameCallbackId = null\n      onPlaybackSample(metadata.mediaTime)\n      if (rvfcStallTimer !== null) clearTimeout(rvfcStallTimer)\n      scheduleRvfcWatch()\n      rvfcStallTimer = setTimeout(() => {\n        usingRvfc = false\n        scheduleRafWatch()\n      }, RVFC_STALL_FALLBACK_MS)\n    })\n  }\n\n  const schedulePlaybackWatch = () => {\n    scheduleRafWatch()\n    if (!mobile) scheduleRvfcWatch()\n  }\n\n  drawFrame()\n  schedulePlaybackWatch()\n\n  const ensurePlaying = () => {\n    if (destroyed) {\n      return\n    }\n    if (videoEl.ended && videoEl.loop) {\n      videoEl.currentTime = 0\n      lastDrawMediaTimeS = -1\n    }\n    if (videoEl.paused) {\n      void videoEl.play().catch(() => undefined)\n    }\n  }\n\n  videoEl.addEventListener('pause', ensurePlaying)\n  videoEl.addEventListener('ended', ensurePlaying)\n  videoEl.addEventListener('stalled', ensurePlaying)\n  videoEl.addEventListener('waiting', ensurePlaying)\n\n  const healthIntervalMs = options.healthIntervalMs ?? 3000\n  let healthTimer: ReturnType<typeof setInterval> | null = null\n\n  if (options.onHealthReport) {\n    const reportHealth = options.onHealthReport\n    healthTimer = setInterval(() => {\n      ensurePlaying()\n\n      const now = performance.now()\n      const currentTime = videoEl.currentTime\n      const duration = videoEl.duration\n      const nearEnd = duration > 0 && currentTime >= duration - 0.2\n      const stalled = !videoEl.paused && !videoEl.ended && !nearEnd && now - lastAdvanceAt >= healthIntervalMs\n\n      if (stalled && now - lastAdvanceAt >= STALL_CATCHUP_MS) {\n        void videoEl.play().catch(() => undefined)\n      }\n\n      reportHealth({\n        currentTime,\n        duration,\n        paused: videoEl.paused,\n        ended: videoEl.ended,\n        readyState: videoEl.readyState,\n        trackReadyState: videoTrack.readyState,\n        trackMuted: videoTrack.muted,\n        stalled,\n        timeSinceAdvanceMs: now - lastAdvanceAt,\n      })\n    }, healthIntervalMs)\n  }\n\n  const cancelPlaybackWatch = () => {\n    const video = videoEl as VideoWithFrameCallback\n    if (rvfcStallTimer !== null) clearTimeout(rvfcStallTimer)\n    if (videoFrameCallbackId !== null) {\n      video.cancelVideoFrameCallback?.(videoFrameCallbackId)\n      videoFrameCallbackId = null\n    }\n    if (rafId !== null) {\n      window.cancelAnimationFrame(rafId)\n      rafId = null\n    }\n  }\n\n  const destroy = () => {\n    destroyed = true\n    videoEl.removeEventListener('pause', ensurePlaying)\n    videoEl.removeEventListener('ended', ensurePlaying)\n    videoEl.removeEventListener('stalled', ensurePlaying)\n    videoEl.removeEventListener('waiting', ensurePlaying)\n\n    cancelPlaybackWatch()\n\n    if (healthTimer !== null) {\n      clearInterval(healthTimer)\n      healthTimer = null\n    }\n\n    try {\n      videoEl.pause()\n    } catch {\n    }\n\n    try {\n      videoTrack.stop()\n    } catch {\n    }\n\n    try {\n      previewStream.getTracks().forEach((track) => {\n        if (track.readyState !== 'ended') {\n          track.stop()\n        }\n      })\n    } catch {\n    }\n    try {\n      webAudioCleanupRef.current?.()\n      webAudioCleanupRef.current = null\n    } catch {\n    }\n\n    try {\n      videoEl.remove()\n    } catch {\n    }\n\n    try {\n      canvas.remove()\n    } catch {\n    }\n\n    try {\n      videoEl.src = ''\n      videoEl.load()\n    } catch {\n    }\n\n    if (!isUrl) URL.revokeObjectURL(url)\n  }\n\n  return {\n    url,\n    previewStream,\n    videoEl,\n    videoTrack,\n    audioTrack,\n    fps: publishFps,\n    width: outputWidth,\n    height: outputHeight,\n    sourceWidth,\n    sourceHeight,\n    destroy,\n  }\n}\n\nasync function resolveUploadAudioTrack(\n  videoEl: HTMLVideoElement,\n  webAudioCleanupRef: { current: (() => void) | null },\n): Promise<MediaStreamTrack | undefined> {\n  let audioTrack = getFirstLiveAudioTrack(getVideoElementStream(videoEl))\n  if (audioTrack) {\n    return audioTrack\n  }\n\n  // Some browsers start playback only when muted, but muted media elements may expose\n  // no capturable audio track. Switch to silent (volume=0) playback and retry capture.\n  ensureSilentButUnmuted(videoEl)\n  audioTrack = getFirstLiveAudioTrack(getVideoElementStream(videoEl))\n  if (audioTrack) {\n    return audioTrack\n  }\n\n  // Safari fallback: derive an external audio track via WebAudio when captureStream\n  // cannot provide audio tracks for file-based video playback.\n  const webAudio = await createAudioTrackViaWebAudio(videoEl)\n  if (webAudio) {\n    webAudioCleanupRef.current = webAudio.cleanup\n    return webAudio.track\n  }\n\n  return undefined\n}\n\nasync function createAudioTrackViaWebAudio(videoEl: HTMLVideoElement): Promise<{\n  track: MediaStreamTrack\n  cleanup: () => void\n} | null> {\n  const AudioContextCtor = globalThis.AudioContext\n    ?? (globalThis.window as WindowWithWebkitAudioContext | undefined)?.webkitAudioContext\n  if (!AudioContextCtor) {\n    return null\n  }\n\n  let audioContext: AudioContext | null = null\n  let source: MediaElementAudioSourceNode | null = null\n  let destination: MediaStreamAudioDestinationNode | null = null\n  try {\n    audioContext = new AudioContextCtor()\n    source = audioContext.createMediaElementSource(videoEl)\n    destination = audioContext.createMediaStreamDestination()\n    source.connect(destination)\n\n    if (audioContext.state === 'suspended') {\n      await audioContext.resume()\n    }\n\n    const track = getFirstLiveAudioTrack(destination.stream)\n    if (!track) {\n      source.disconnect()\n      destination.disconnect()\n      await audioContext.close()\n      return null\n    }\n\n    const cleanup = () => {\n      try {\n        source?.disconnect()\n      } catch {\n      }\n      try {\n        destination?.disconnect()\n      } catch {\n      }\n      try {\n        if (track.readyState !== 'ended') {\n          track.stop()\n        }\n      } catch {\n      }\n      try {\n        if (audioContext && audioContext.state !== 'closed') {\n          void audioContext.close()\n        }\n      } catch {\n      }\n    }\n\n    return { track, cleanup }\n  } catch {\n    try {\n      source?.disconnect()\n    } catch {\n    }\n    try {\n      destination?.disconnect()\n    } catch {\n    }\n    try {\n      if (audioContext && audioContext.state !== 'closed') {\n        await audioContext.close()\n      }\n    } catch {\n    }\n    return null\n  }\n}\n\nfunction getVideoElementStream(videoEl: HTMLVideoElement): MediaStream | null {\n  const captureVideoEl = videoEl as VideoWithCaptureStream\n  const capture = captureVideoEl.captureStream ?? captureVideoEl.mozCaptureStream\n  if (!capture) {\n    return null\n  }\n  try {\n    return capture.call(captureVideoEl)\n  } catch {\n    return null\n  }\n}\n\nfunction getFirstLiveAudioTrack(stream: MediaStream | null): MediaStreamTrack | undefined {\n  return stream?.getAudioTracks().find((track) => track.readyState === 'live')\n}\n\nfunction ensureSilentButUnmuted(videoEl: HTMLVideoElement): void {\n  videoEl.muted = false\n  videoEl.volume = 0\n}\n\nfunction waitForEvent<T extends HTMLElement>(\n  el: T,\n  eventName: keyof HTMLElementEventMap,\n  timeoutMs: number,\n): Promise<void> {\n  return new Promise((resolve, reject) => {\n    const onOk = () => {\n      cleanup()\n      resolve()\n    }\n\n    const onErr = (e: Event) => {\n      cleanup()\n      // If it's a media error and we can read the code, include it\n      const mediaEl = el as unknown as HTMLMediaElement\n      const code = mediaEl.error ? mediaEl.error.code : 'unknown'\n      const message = mediaEl.error ? mediaEl.error.message : 'no message'\n      const src = mediaEl.src || 'unknown src'\n      reject(new Error(`failed to load video metadata: ${String(eventName)} (code: ${code}, message: ${message}, src: ${src})`))\n    }\n\n    const onTimeout = () => {\n      cleanup()\n      reject(new Error(`timed out waiting for video ${String(eventName)}`))\n    }\n\n    const cleanup = () => {\n      clearTimeout(timeoutId)\n      el.removeEventListener(eventName, onOk as EventListener)\n      el.removeEventListener('error', onErr as EventListener)\n    }\n\n    const timeoutId = setTimeout(onTimeout, timeoutMs)\n    el.addEventListener(eventName, onOk as EventListener, { once: true })\n    el.addEventListener('error', onErr as EventListener, { once: true })\n  })\n}\n\nfunction waitForCanPlay(videoEl: HTMLVideoElement, timeoutMs: number): Promise<void> {\n  if (videoEl.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA) {\n    return Promise.resolve()\n  }\n\n  return new Promise((resolve, reject) => {\n    const onReady = () => {\n      cleanup()\n      resolve()\n    }\n\n    const onTimeout = () => {\n      cleanup()\n      reject(new Error('timed out waiting for video canplay'))\n    }\n\n    const cleanup = () => {\n      clearTimeout(timeoutId)\n      videoEl.removeEventListener('canplay', onReady)\n      videoEl.removeEventListener('loadeddata', onReady)\n    }\n\n    const timeoutId = setTimeout(onTimeout, timeoutMs)\n    videoEl.addEventListener('canplay', onReady, { once: true })\n    videoEl.addEventListener('loadeddata', onReady, { once: true })\n  })\n}\n\nasync function startVideoPlayback(videoEl: HTMLVideoElement, i18n: SDKI18n): Promise<void> {\n  try {\n    const playResult = videoEl.play()\n    if (playResult && typeof (playResult as Promise<void>).then === 'function') {\n      await playResult\n    }\n  } catch {\n    throw new XmaxSdkError('MEDIA_PROCESSING_ERROR', i18n.t('errors.videoPlaybackFailed'))\n  }\n\n  try {\n    await waitForPlaying(videoEl, MEDIA_READY_TIMEOUT_MS)\n  } catch {\n    throw new XmaxSdkError('MEDIA_PROCESSING_ERROR', i18n.t('errors.videoPlaybackFailed'))\n  }\n\n  if (videoEl.paused || videoEl.readyState < HTMLMediaElement.HAVE_CURRENT_DATA) {\n    throw new XmaxSdkError('MEDIA_PROCESSING_ERROR', i18n.t('errors.videoPlaybackFailed'))\n  }\n}\n\nfunction waitForPlaying(videoEl: HTMLVideoElement, timeoutMs: number): Promise<void> {\n  if (!videoEl.paused && videoEl.readyState >= HTMLMediaElement.HAVE_CURRENT_DATA) {\n    return Promise.resolve()\n  }\n\n  return new Promise((resolve, reject) => {\n    const onPlaying = () => {\n      cleanup()\n      resolve()\n    }\n\n    const onErr = () => {\n      cleanup()\n      reject(new Error('video playback failed'))\n    }\n\n    const onTimeout = () => {\n      cleanup()\n      reject(new Error('timed out waiting for video playback'))\n    }\n\n    const cleanup = () => {\n      clearTimeout(timeoutId)\n      videoEl.removeEventListener('playing', onPlaying)\n      videoEl.removeEventListener('error', onErr)\n    }\n\n    const timeoutId = setTimeout(onTimeout, timeoutMs)\n    videoEl.addEventListener('playing', onPlaying, { once: true })\n    videoEl.addEventListener('error', onErr, { once: true })\n  })\n}\n","{\n  \"name\": \"@xmaxai/sdk\",\n  \"version\": \"1.1.13\",\n  \"description\": \"Xmax JavaScript SDK\",\n  \"type\": \"module\",\n  \"license\": \"MIT\",\n  \"author\": \"Xmax\",\n  \"keywords\": [\n    \"Xmax\",\n    \"rtc\",\n    \"realtime\",\n    \"video\",\n    \"ai\",\n    \"sdk\"\n  ],\n  \"sideEffects\": false,\n  \"main\": \"./dist/index.cjs\",\n  \"module\": \"./dist/index.js\",\n  \"types\": \"./dist/index.d.ts\",\n  \"files\": [\n    \"dist\",\n    \"LICENSE\"\n  ],\n  \"exports\": {\n    \".\": {\n      \"types\": \"./dist/index.d.ts\",\n      \"import\": \"./dist/index.js\",\n      \"require\": \"./dist/index.cjs\"\n    }\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"scripts\": {\n    \"build\": \"tsup\",\n    \"build:cn\": \"XMAX_SDK_REGION=cn tsup\",\n    \"build:global\": \"XMAX_SDK_REGION=global tsup\",\n    \"dev\": \"XMAX_SDK_ENV=dev tsup --watch\",\n    \"typecheck\": \"tsc -p tsconfig.json --noEmit\",\n    \"test\": \"vitest run\",\n    \"test:watch\": \"vitest\",\n    \"prepublishOnly\": \"npm run build && npm run test\",\n    \"publish:cn\": \"node scripts/publish-sdk.mjs cn\",\n    \"publish:global\": \"node scripts/publish-sdk.mjs global\",\n    \"publish:all\": \"npm run publish:cn && npm run publish:global\"\n  },\n  \"dependencies\": {\n    \"@volcengine/rtc\": \"^4.68.5\",\n    \"cos-js-sdk-v5\": \"^1.10.1\",\n    \"heic-to\": \"^1.5.2\"\n  },\n  \"devDependencies\": {\n    \"tsup\": \"^8.5.0\",\n    \"typescript\": \"^5.9.0\",\n    \"vitest\": \"^3.2.4\"\n  },\n  \"pnpm\": {\n    \"overrides\": {\n      \"fix-dts-default-cjs-exports\": \"1.0.1\"\n    }\n  }\n}\n","import { version } from '../../package.json'\nimport { resolveXmaxReportEnvironment, XMAX_SDK_BUILD_ENV } from '../build-config'\nimport {\n  createTelemetryPayload,\n  isTelemetryEndpointConfigured,\n  sendTelemetryBeacon,\n  sendTelemetryPayload,\n  telemetryEnvelopeKey,\n  TelemetryTransportError,\n  XMAX_TELEMETRY_DEFAULT_ENDPOINT,\n  type XmaxTelemetryProbeMeta,\n} from './backend'\nimport { configureRemoteProbeConfig, XMAX_TELEMETRY_DEFAULT_CONFIG_ENDPOINT } from './probe-config'\nimport { acknowledgeReport, configureReportOutbox, persistReport, releaseReport, wakeReportOutbox } from './outbox'\n\nexport type XmaxTelemetryParams = Record<string, string | number | boolean | null | undefined>\nexport type XmaxReportSource = 'open_platform' | 'external_developer'\nexport type XmaxTelemetryEventName =\n  | 'sdk_api_request'\n  | 'sdk_capture_get_user_media_start'\n  | 'sdk_capture_get_user_media_end'\n  | 'sdk_asset_sts_request'\n  | 'sdk_asset_sts_response'\n  | 'sdk_asset_upload_start'\n  | 'sdk_asset_upload_end'\n  | 'sdk_api_session_request'\n  | 'sdk_api_session_response'\n  | 'sdk_rtc_join_request'\n  | 'sdk_rtc_join_response'\n  | 'sdk_rtc_publish_local_track'\n  | 'sdk_generation_request_sent'\n  | 'sdk_generation_ack_received'\n  | 'sdk_rtc_subscribe_remote_track'\n  | 'sdk_render_output_first_frame'\n  | 'sdk_context_set_request'\n  | 'sdk_context_set_response'\n  | 'sdk_session_connect'\n  | 'sdk_session_state_change'\n  | 'sdk_session_error'\n  | 'sdk_session_disconnect'\n  | 'sdk_rtc_stats_snapshot'\n  | 'sdk_rtc_remote_state_change'\n  | 'sdk_rtc_connection_state_change'\n  | 'sdk_rtc_token_state_change'\n  | 'sdk_rtc_teardown'\n  | 'sdk_probe_degraded'\n  | 'sdk_probe_health'\n  | 'sdk_probe_buffer_overflow'\nexport type XmaxTelemetryEvent = { name: XmaxTelemetryEventName; params: XmaxTelemetryParams }\nexport type XmaxTelemetryOptions = {\n  /** Override the region-specific Xmax ingestion endpoint. */\n  endpoint?: string\n  /** Override the region-specific remote probe configuration endpoint, or disable remote config. */\n  configEndpoint?: string | false\n  /** Optional extra public fields. Never pass credentials or media/prompt content. */\n  commonParams?: XmaxTelemetryParams\n  /** @internal Test/custom transport hook. It runs outside the business request path. */\n  reporter?: (events: readonly XmaxTelemetryEvent[]) => void | Promise<void>\n}\n\nexport const TELEMETRY_LIMITS = {\n  queue: 500,\n  batch: 50,\n  targetBatchBytes: 8_000,\n  maxBatchBytes: 48_000,\n  flushMs: 2_000,\n  ttlMs: 5 * 60_000,\n  transportTimeoutMs: 3_000,\n  maxAttempts: 3,\n  retryBaseMs: 1_000,\n  circuitBreakMs: 30_000,\n  pageMinIntervalMs: 500,\n  sessionMinIntervalMs: 2_000,\n} as const\n\ntype QueuedEvent = XmaxTelemetryEvent & { queuedAt: number; critical: boolean; estimatedBytes: number }\ntype PendingBatch = {\n  id: string\n  envelopeKey: string\n  seq: number\n  critical: boolean\n  queued: QueuedEvent[]\n  events: XmaxTelemetryEvent[]\n  body: string\n  attempts: number\n}\n\nlet config: XmaxTelemetryOptions = {\n  endpoint: XMAX_TELEMETRY_DEFAULT_ENDPOINT,\n  configEndpoint: XMAX_TELEMETRY_DEFAULT_CONFIG_ENDPOINT,\n}\nlet enabled = true\nlet generation = 0\nlet queue: QueuedEvent[] = []\nlet queueBytes = 0\nlet pending: PendingBatch | undefined\nlet timer: ReturnType<typeof setTimeout> | undefined\nlet retryTimer: ReturnType<typeof setTimeout> | undefined\nlet sending = false\nlet suspendedUntil = 0\nlet forceDrain = false\nlet pageId: string | undefined\nlet listeningLifecycle = false\nlet remoteConfigStarted = false\nlet lastPageAttemptAt = Number.NEGATIVE_INFINITY\nconst lastEnvelopeAttemptAt = new Map<string, number>()\nconst packetSequences = new Map<string, number>()\nconst reportBytes = new Map<string, number>()\nconst rtcSnapshots = new Map<string, (generationId: string | null) => XmaxTelemetryParams | null>()\nconst terminalEnvelopes = new Set<string>()\n\nexport function registerTelemetrySnapshot(traceId: string, read: (generationId: string | null) => XmaxTelemetryParams | null): () => void {\n  const key = `trace:${traceId}`\n  rtcSnapshots.set(key, read)\n  return () => { rtcSnapshots.delete(key) }\n}\n\nexport function telemetryReportedBytes(traceId: string): number {\n  return reportBytes.get(`trace:${traceId}`) ?? 0\n}\nconst probeHealth = new Map<string, XmaxTelemetryProbeMeta>()\nconst queuedBytesByEnvelope = new Map<string, number>()\nconst health = {\n  events_enqueued: 0,\n  events_dropped: 0,\n  events_accepted: 0,\n  batches_accepted: 0,\n  batches_beaconed: 0,\n  send_attempts: 0,\n  send_retries: 0,\n  send_failures: 0,\n  queue_peak_count: 0,\n}\nconst CRITICAL_EVENTS = new Set<XmaxTelemetryEventName>([\n  'sdk_render_output_first_frame',\n  'sdk_session_error',\n  'sdk_session_disconnect',\n  'sdk_rtc_connection_state_change',\n  'sdk_rtc_token_state_change',\n  'sdk_rtc_teardown',\n])\n\nexport function telemetryTimer(callback: () => void, ms: number): ReturnType<typeof setTimeout> {\n  const handle = setTimeout(callback, ms)\n  ;(handle as unknown as { unref?: () => void }).unref?.()\n  return handle\n}\n\nfunction clearSchedule(): void {\n  if (timer) clearTimeout(timer)\n  if (retryTimer) clearTimeout(retryTimer)\n  timer = undefined\n  retryTimer = undefined\n}\n\nfunction ensureLifecycleListeners(): void {\n  if (listeningLifecycle || typeof window === 'undefined') return\n  listeningLifecycle = true\n  window.addEventListener?.('online', () => {\n    if (enabled) wakeReportOutbox()\n    if (!enabled || (!pending && !queue.length)) return\n    suspendedUntil = 0\n    clearSchedule()\n    timer = telemetryTimer(() => { timer = undefined; void flush() }, 0)\n  })\n  window.addEventListener?.('pagehide', () => flushTelemetry(true))\n  if (typeof document !== 'undefined') {\n    document.addEventListener?.('visibilitychange', () => {\n      if (document.visibilityState === 'hidden') flushTelemetry(true)\n    })\n  }\n}\n\n/** Configure once before creating clients; false opts out and drops pending diagnostics. */\nexport function configureXmaxTelemetry(options: XmaxTelemetryOptions | false): void {\n  generation++\n  enabled = options !== false\n  queue = []\n  if (pending) releaseReport(pending.id)\n  pending = undefined\n  sending = false\n  suspendedUntil = 0\n  forceDrain = false\n  lastPageAttemptAt = Number.NEGATIVE_INFINITY\n  remoteConfigStarted = false\n  lastEnvelopeAttemptAt.clear()\n  packetSequences.clear()\n  reportBytes.clear()\n  rtcSnapshots.clear()\n  terminalEnvelopes.clear()\n  probeHealth.clear()\n  queuedBytesByEnvelope.clear()\n  queueBytes = 0\n  clearSchedule()\n  Object.keys(health).forEach(key => { health[key as keyof typeof health] = 0 })\n  if (options !== false) {\n    config = {\n      endpoint: XMAX_TELEMETRY_DEFAULT_ENDPOINT,\n      configEndpoint: XMAX_TELEMETRY_DEFAULT_CONFIG_ENDPOINT,\n      ...options,\n      commonParams: sanitizeParams(options.commonParams ?? {}),\n    }\n    ensureLifecycleListeners()\n    configureReportOutbox(config.reporter ? undefined : config.endpoint)\n  } else {\n    configureRemoteProbeConfig(false)\n    configureReportOutbox(undefined, true)\n  }\n}\n\nexport function telemetryEnabled(): boolean {\n  const active = enabled\n    && Boolean(config.reporter || isTelemetryEndpointConfigured(config.endpoint))\n    && typeof window !== 'undefined'\n    && typeof document !== 'undefined'\n  return active\n}\n\nexport function telemetryId(): string {\n  const nativeId = globalThis.crypto?.randomUUID?.()\n  if (nativeId) return nativeId\n  const bytes = new Uint8Array(16)\n  if (typeof globalThis.crypto?.getRandomValues === 'function') globalThis.crypto.getRandomValues(bytes)\n  else for (let index = 0; index < bytes.length; index++) bytes[index] = Math.floor(Math.random() * 256)\n  bytes[6] = (bytes[6] & 0x0f) | 0x40\n  bytes[8] = (bytes[8] & 0x3f) | 0x80\n  const hex = Array.from(bytes, value => value.toString(16).padStart(2, '0'))\n  return `${hex.slice(0, 4).join('')}-${hex.slice(4, 6).join('')}-${hex.slice(6, 8).join('')}-${hex.slice(8, 10).join('')}-${hex.slice(10).join('')}`\n}\n\nexport function telemetryReportSource(value: unknown): XmaxReportSource {\n  return value === 'open_platform' ? 'open_platform' : 'external_developer'\n}\n\nexport function telemetryPageId(): string {\n  return pageId ??= telemetryId()\n}\n\nexport function telemetryHealth(): XmaxTelemetryParams {\n  return { ...health, queue_count: queue.length + (pending?.events.length ?? 0) }\n}\n\nexport function apiHost(baseUrl: string): string {\n  try { return new URL(baseUrl).host } catch { return 'invalid' }\n}\n\nexport function telemetryEnvironment(reportSource: unknown): 'prod' | 'test' | 'dev' {\n  return resolveXmaxReportEnvironment(reportSource, XMAX_SDK_BUILD_ENV)\n}\n\nexport function sanitizeParams(params: XmaxTelemetryParams): XmaxTelemetryParams {\n  const result: XmaxTelemetryParams = {}\n  let count = 0\n  for (const key of Object.keys(params)) {\n    if (count >= 220) break\n    if (\n      !/^[a-z][a-z0-9_]{0,63}$/.test(key)\n      || ['region', 'sdk_region', 'region_form'].includes(key)\n      || (/token|api_?key|authorization|password|prompt|email|account_info|ref_image|url/i.test(key) && key !== 'api_key_md5')\n      || /^(body|headers|request_body|response_body|request_headers|response_headers)$/.test(key)\n    ) continue\n    const value = params[key]\n    if (typeof value === 'string') result[key] = value.slice(0, 200)\n    else if (typeof value === 'number' && Number.isFinite(value)) result[key] = value\n    else if (typeof value === 'boolean' || value === null) result[key] = value\n    else continue\n    count++\n  }\n  return result\n}\n\nfunction schedule(delay: number = TELEMETRY_LIMITS.flushMs): void {\n  if (timer || retryTimer || sending || (!pending && !queue.length) || !telemetryEnabled()) return\n  const suspension = Math.max(0, suspendedUntil - performance.now())\n  timer = telemetryTimer(() => { timer = undefined; void flush() }, Math.max(delay, suspension))\n}\n\nfunction healthFor(key: string): XmaxTelemetryProbeMeta {\n  let value = probeHealth.get(key)\n  if (!value) {\n    value = { sent: 0, dropped: 0, retried: 0, exempted: 0 }\n    probeHealth.set(key, value)\n  }\n  return value\n}\n\nfunction noteDropped(event: QueuedEvent): void {\n  health.events_dropped++\n  healthFor(telemetryEnvelopeKey(event)).dropped++\n}\n\nfunction dropOldestNonCritical(): boolean {\n  const disposable = queue.findIndex(event => !event.critical)\n  if (disposable < 0) return false\n  const dropped = removeQueuedAt(disposable)\n  noteDropped(dropped)\n  return true\n}\n\nfunction makeQueuedEvent(name: XmaxTelemetryEventName, params: XmaxTelemetryParams, queuedAt: number): QueuedEvent {\n  const event: QueuedEvent = { name, queuedAt, critical: CRITICAL_EVENTS.has(name), estimatedBytes: 0, params: {\n    ...sanitizeParams(config.commonParams ?? {}),\n    ...sanitizeParams(params),\n    generation_id: typeof params.generation_id === 'string' ? params.generation_id.slice(0, 200) : null,\n    event_id: telemetryId(),\n    schema_version: 1,\n    xmax_sdk_version: version,\n    page_id: params.page_id ?? telemetryPageId(),\n    event_time_ms: params.event_time_ms ?? Date.now(),\n  } }\n  if (name === 'sdk_api_request' && params.ok === false) event.critical = true\n  event.estimatedBytes = utf8Bytes(JSON.stringify({ name: event.name, params: event.params }))\n  return event\n}\n\nfunction addQueued(event: QueuedEvent): void {\n  queue.push(event)\n  queueBytes += event.estimatedBytes\n  const key = telemetryEnvelopeKey(event)\n  queuedBytesByEnvelope.set(key, (queuedBytesByEnvelope.get(key) ?? 0) + event.estimatedBytes)\n}\n\nfunction removeQueuedAt(index: number): QueuedEvent {\n  const [event] = queue.splice(index, 1)\n  queueBytes -= event.estimatedBytes\n  const key = telemetryEnvelopeKey(event)\n  const remaining = Math.max(0, (queuedBytesByEnvelope.get(key) ?? 0) - event.estimatedBytes)\n  if (remaining > 0) queuedBytesByEnvelope.set(key, remaining)\n  else queuedBytesByEnvelope.delete(key)\n  return event\n}\n\nfunction overflowEvent(source: QueuedEvent, queuedAt: number): QueuedEvent {\n  const params = source.params\n  return makeQueuedEvent('sdk_probe_buffer_overflow', {\n    trace_id: params.trace_id,\n    call_id: params.call_id,\n    trace_start_time_ms: params.trace_start_time_ms,\n    session_id: params.session_id,\n    generation_id: params.generation_id,\n    page_id: params.page_id,\n    api_key_md5: params.api_key_md5,\n    env: params.env,\n    report_source: params.report_source,\n    model: params.model,\n    dropped_event: source.name,\n    queue_limit: TELEMETRY_LIMITS.queue,\n  }, queuedAt)\n}\n\n/** Constant bounded work only; it never executes network or host callbacks. */\nexport function emitTelemetry(name: XmaxTelemetryEventName, params: XmaxTelemetryParams): boolean {\n  try { return enqueueTelemetry(name, params) } catch { return false }\n}\n\nfunction enqueueTelemetry(name: XmaxTelemetryEventName, params: XmaxTelemetryParams): boolean {\n  if (!telemetryEnabled()) return false\n  if (!remoteConfigStarted) {\n    remoteConfigStarted = true\n    configureRemoteProbeConfig(\n      config.configEndpoint,\n      telemetryEnvironment(params.report_source ?? config.commonParams?.report_source),\n    )\n  }\n  ensureLifecycleListeners()\n  configureReportOutbox(config.reporter ? undefined : config.endpoint)\n  const queuedAt = performance.now()\n  const event = makeQueuedEvent(name, params, queuedAt)\n  const key = telemetryEnvelopeKey(event)\n  const bufferedCount = queue.length + (pending?.events.length ?? 0)\n  if (name === 'sdk_probe_health') terminalEnvelopes.add(key)\n  while (queue.length && queueBytes + event.estimatedBytes > 160_000) {\n    if (!dropOldestNonCritical()) { noteDropped(event); return false }\n  }\n  if (bufferedCount >= TELEMETRY_LIMITS.queue) {\n    let freed = dropOldestNonCritical()\n    if (!freed && event.critical && queue.length > 0) {\n      noteDropped(removeQueuedAt(0))\n      freed = true\n    }\n    if (!freed) {\n      health.events_dropped++\n      healthFor(key).dropped++\n      return false\n    }\n    const alreadyReported = queue.some(item => item.name === 'sdk_probe_buffer_overflow' && telemetryEnvelopeKey(item) === key)\n      || pending?.queued.some(item => item.name === 'sdk_probe_buffer_overflow' && telemetryEnvelopeKey(item) === key)\n    if (!alreadyReported) {\n      if (queue.length + (pending?.events.length ?? 0) >= TELEMETRY_LIMITS.queue) dropOldestNonCritical()\n      addQueued(overflowEvent(event, queuedAt))\n    }\n  }\n  if (queue.length + (pending?.events.length ?? 0) >= TELEMETRY_LIMITS.queue && !dropOldestNonCritical()) {\n    health.events_dropped++\n    healthFor(key).dropped++\n    return false\n  }\n  addQueued(event)\n  if (name === 'sdk_probe_buffer_overflow') healthFor(key).dropped++\n  if (event.critical) healthFor(key).exempted++\n  health.events_enqueued++\n  health.queue_peak_count = Math.max(health.queue_peak_count, queue.length + (pending?.events.length ?? 0))\n  schedule(event.critical ? 0 : TELEMETRY_LIMITS.flushMs)\n  const periodicSnapshot = name === 'sdk_rtc_stats_snapshot' && params.snapshot_reason === 'periodic'\n  if (!retryTimer && !sending && (periodicSnapshot || queue.length >= TELEMETRY_LIMITS.batch || (queuedBytesByEnvelope.get(key) ?? 0) >= TELEMETRY_LIMITS.targetBatchBytes)) {\n    if (timer) clearTimeout(timer)\n    timer = undefined\n    schedule(0)\n  }\n  return true\n}\n\nfunction utf8Bytes(value: string): number {\n  try { return new Blob([value]).size } catch { return value.length * 3 }\n}\n\nfunction purgeExpired(): void {\n  const now = performance.now()\n  for (let index = queue.length - 1; index >= 0; index--) {\n    if (now - queue[index].queuedAt < TELEMETRY_LIMITS.ttlMs) continue\n    noteDropped(removeQueuedAt(index))\n  }\n  if (pending && now - pending.queued[0].queuedAt >= TELEMETRY_LIMITS.ttlMs) {\n    pending.queued.forEach(noteDropped)\n    releaseReport(pending.id)\n    pending = undefined\n  }\n}\n\nfunction createPendingBatch(): PendingBatch | undefined {\n  purgeExpired()\n  while (queue.length) {\n    const envelopeKey = telemetryEnvelopeKey(queue[0])\n    const candidateIndexes: number[] = []\n    let statsSeen = false\n    const generationId = typeof queue[0].params.generation_id === 'string' ? queue[0].params.generation_id : null\n    for (let index = 0; index < queue.length && candidateIndexes.length < TELEMETRY_LIMITS.batch; index++) {\n      const item = queue[index]\n      if (telemetryEnvelopeKey(item) !== envelopeKey) continue\n      if ((item.params.generation_id ?? null) !== generationId) break\n      if (item.name === 'sdk_rtc_stats_snapshot') {\n        if (statsSeen) break\n        statsSeen = true\n      }\n      candidateIndexes.push(index)\n    }\n    let count = candidateIndexes.length\n    let snapshot: XmaxTelemetryParams | null = null\n    if (!statsSeen) {\n      try { snapshot = rtcSnapshots.get(envelopeKey)?.(generationId) ?? null } catch { /* Fail silent. */ }\n    }\n    while (count > 0) {\n      const selectedIndexes = candidateIndexes.slice(0, count)\n      const queued = selectedIndexes.map(index => queue[index])\n      const events = queued.map(({ name, params }) => ({ name, params }))\n      const id = telemetryId()\n      const seq = (packetSequences.get(envelopeKey) ?? 0) + 1\n      const currentHealth = healthFor(envelopeKey)\n      const envelopeEvents: XmaxTelemetryEvent[] = snapshot && !events.some(event => event.name === 'sdk_rtc_stats_snapshot')\n        ? [...events, { name: 'sdk_rtc_stats_snapshot', params: snapshot }]\n        : events\n      const body = JSON.stringify(createTelemetryPayload(id, envelopeEvents, seq, { ...currentHealth, sent: currentHealth.sent + 1 }))\n      const bytes = utf8Bytes(body)\n      if (bytes <= TELEMETRY_LIMITS.targetBatchBytes || count === 1) {\n        if (bytes > TELEMETRY_LIMITS.maxBatchBytes) {\n          const dropped = removeQueuedAt(selectedIndexes[0])\n          noteDropped(dropped)\n          break\n        }\n        selectedIndexes.slice().reverse().forEach(removeQueuedAt)\n        packetSequences.set(envelopeKey, seq)\n        if (!config.reporter) persistReport({ id, body, endpoint: config.endpoint ?? XMAX_TELEMETRY_DEFAULT_ENDPOINT,\n          createdAt: Date.now(), critical: queued.some(event => event.critical) })\n        return { id, envelopeKey, seq, critical: queued.some(event => event.critical), queued, events, body, attempts: 0 }\n      }\n      count = Math.max(1, Math.floor(count / 2))\n    }\n  }\n  return undefined\n}\n\nfunction acceptPending(beaconed: boolean): void {\n  if (!pending) return\n  const envelopeKey = pending.envelopeKey\n  const terminal = terminalEnvelopes.has(envelopeKey)\n  healthFor(envelopeKey).sent++\n  health.events_accepted += pending.events.length\n  health.batches_accepted++\n  if (beaconed) health.batches_beaconed++\n  // Beacon acceptance is not a server acknowledgement; retain a replay copy.\n  if (beaconed) releaseReport(pending.id)\n  else acknowledgeReport(pending.id)\n  pending = undefined\n  if (terminal && !queue.some(event => telemetryEnvelopeKey(event) === envelopeKey)) {\n    lastEnvelopeAttemptAt.delete(envelopeKey)\n    packetSequences.delete(envelopeKey)\n    probeHealth.delete(envelopeKey)\n    reportBytes.delete(envelopeKey)\n    terminalEnvelopes.delete(envelopeKey)\n  }\n}\n\nfunction tryBeacon(): boolean {\n  if (!telemetryEnabled() || sending || config.reporter) return false\n  pending ??= createPendingBatch()\n  if (!pending) return false\n  const bytes = utf8Bytes(pending.body)\n  const used = reportBytes.get(pending.envelopeKey) ?? 0\n  const accepted = sendTelemetryBeacon(config.endpoint ?? XMAX_TELEMETRY_DEFAULT_ENDPOINT, pending.body, TELEMETRY_LIMITS.maxBatchBytes)\n  if (!accepted) return false\n  reportBytes.set(pending.envelopeKey, used + bytes)\n  acceptPending(true)\n  schedule()\n  return true\n}\n\n/** Flushes asynchronously. `preferBeacon` is for page-hide lifecycle events. */\nexport function flushTelemetry(preferBeacon = false): void {\n  if (timer) clearTimeout(timer)\n  if (retryTimer) clearTimeout(retryTimer)\n  timer = undefined\n  retryTimer = undefined\n  forceDrain = true\n  if (preferBeacon) {\n    let sent = false\n    for (let count = 0; count < 3 && tryBeacon(); count++) sent = true\n    if (sent) { forceDrain = false; return }\n  }\n  schedule(0)\n}\n\nfunction retryDelay(attempt: number, requested?: number): number {\n  if (typeof requested === 'number') return requested\n  const ceiling = TELEMETRY_LIMITS.retryBaseMs * 2 ** Math.max(0, attempt - 1)\n  return Math.round(ceiling + Math.random() * ceiling)\n}\n\nfunction scheduleRetry(delay: number): void {\n  if (retryTimer) clearTimeout(retryTimer)\n  retryTimer = telemetryTimer(() => { retryTimer = undefined; void flush() }, delay)\n}\n\nasync function flush(): Promise<void> {\n  if (!telemetryEnabled() || sending) return\n  if (performance.now() < suspendedUntil) { schedule(); return }\n  pending ??= createPendingBatch()\n  if (!pending) return\n  const now = performance.now()\n  const pageWait = Math.max(0, TELEMETRY_LIMITS.pageMinIntervalMs - (now - lastPageAttemptAt))\n  const envelopeWait = pending.critical\n    ? 0\n    : Math.max(0, TELEMETRY_LIMITS.sessionMinIntervalMs - (now - (lastEnvelopeAttemptAt.get(pending.envelopeKey) ?? Number.NEGATIVE_INFINITY)))\n  const rateLimitWait = Math.max(pageWait, envelopeWait)\n  if (rateLimitWait > 0) { schedule(rateLimitWait); return }\n  const currentGeneration = generation\n  const currentConfig = config\n  const current = pending\n  const bytes = utf8Bytes(current.body)\n  const used = reportBytes.get(current.envelopeKey) ?? 0\n  reportBytes.set(current.envelopeKey, used + bytes)\n  current.attempts++\n  lastPageAttemptAt = now\n  lastEnvelopeAttemptAt.set(current.envelopeKey, now)\n  health.send_attempts++\n  sending = true\n  let deadline: ReturnType<typeof setTimeout> | undefined\n  try {\n    if (currentConfig.reporter) {\n      await Promise.race([\n        currentConfig.reporter(current.events),\n        new Promise<never>((_, reject) => {\n          deadline = telemetryTimer(() => reject(new TelemetryTransportError(true)), TELEMETRY_LIMITS.transportTimeoutMs)\n        }),\n      ])\n    } else {\n      await sendTelemetryPayload(\n        currentConfig.endpoint ?? XMAX_TELEMETRY_DEFAULT_ENDPOINT,\n        current.body,\n        TELEMETRY_LIMITS.transportTimeoutMs,\n      )\n    }\n    if (generation === currentGeneration && pending === current) acceptPending(false)\n  } catch (error) {\n    if (generation === currentGeneration && pending === current) {\n      health.send_failures++\n      const retryable = !(error instanceof TelemetryTransportError) || error.retryable\n      if (retryable && current.attempts < TELEMETRY_LIMITS.maxAttempts && performance.now() - current.queued[0].queuedAt < TELEMETRY_LIMITS.ttlMs) {\n        health.send_retries++\n        healthFor(current.envelopeKey).retried++\n        forceDrain = false\n        scheduleRetry(retryDelay(current.attempts, error instanceof TelemetryTransportError ? error.retryAfterMs : undefined))\n      } else {\n        current.queued.forEach(noteDropped)\n        if (retryable) releaseReport(current.id)\n        else acknowledgeReport(current.id)\n        pending = undefined\n        if (current.events.some(event => event.name === 'sdk_probe_health')) {\n          lastEnvelopeAttemptAt.delete(current.envelopeKey)\n          packetSequences.delete(current.envelopeKey)\n          probeHealth.delete(current.envelopeKey)\n        }\n        suspendedUntil = performance.now() + TELEMETRY_LIMITS.circuitBreakMs\n      }\n    }\n  } finally {\n    if (deadline) clearTimeout(deadline)\n    sending = false\n    if (!pending && !queue.length) forceDrain = false\n    if (!retryTimer) schedule(forceDrain ? 0 : TELEMETRY_LIMITS.flushMs)\n  }\n}\n","import { resolveXmaxReportEnvironment, XMAX_SDK_BUILD_ENV, XMAX_SDK_BUILD_REGION, type XmaxSdkRegion } from '../build-config'\nimport type { XmaxReportSource, XmaxTelemetryEvent, XmaxTelemetryParams } from './collector'\n\n/** Domestic and overseas ingestion routes baked into each regional SDK build. */\nexport const XMAX_TELEMETRY_ENDPOINTS: Record<XmaxSdkRegion, string> = {\n  cn: 'https://log.xmaxai.com/v1/probe/report',\n  global: 'https://api.xmax.cloud/v1/probe/report',\n}\n\nexport const XMAX_TELEMETRY_DEFAULT_ENDPOINT = XMAX_TELEMETRY_ENDPOINTS[XMAX_SDK_BUILD_REGION]\n\nexport function isTelemetryEndpointConfigured(endpoint: string | undefined): endpoint is string {\n  if (!endpoint || endpoint.includes('__pending_sdk_telemetry_endpoint__')) return false\n  try { return new URL(endpoint).protocol === 'https:' } catch { return false }\n}\n\nexport type XmaxTelemetryNetworkMeta = {\n  api_supported: boolean\n  online?: boolean\n  effective_type?: string\n  connection_type?: string\n  rtt_ms?: number\n  downlink_mbps?: number\n  save_data?: boolean\n}\n\nexport type XmaxTelemetryDeviceMeta = {\n  language?: string\n  hardware_concurrency?: number\n  device_memory_gb?: number\n  max_touch_points?: number\n}\n\nexport type XmaxTelemetryProbeMeta = {\n  sent: number\n  dropped: number\n  retried: number\n  exempted: number\n}\n\nexport type XmaxTelemetryMetricSummary = {\n  avg?: number\n  min?: number\n  max?: number\n  p50: number | null\n  p90: number | null\n  sample_count: number\n}\n\nexport type XmaxTelemetryRtcStatsBlock = {\n  duration_ms?: number\n  sample_count: number\n  metrics: Record<string, XmaxTelemetryMetricSummary>\n}\n\nexport type XmaxTelemetryRtcStats = {\n  snapshot_reason?: string\n  current_stage?: string\n  current_stage_elapsed_ms?: number\n  stats_started_offset_ms?: number\n  stats_last_offset_ms?: number\n  up_stats_age_ms?: number\n  down_stats_age_ms?: number\n  sampling_source?: string\n  down_stall_count?: number\n  down_stall_duration_ms?: number\n  window: XmaxTelemetryRtcStatsBlock\n  cumulative: XmaxTelemetryRtcStatsBlock\n}\n\nexport type XmaxTelemetryMeta = {\n  trace_id: string\n  session_id: string | null\n  generation_id?: string\n  page_id: string\n  sdk_version: string\n  env: string\n  report_source: XmaxReportSource\n  ua: string\n  t0: number\n  ts: number\n  seq: number\n  probe: XmaxTelemetryProbeMeta\n  network: XmaxTelemetryNetworkMeta\n  device: XmaxTelemetryDeviceMeta\n  api_key_md5?: string\n  model?: string\n  auto_start?: boolean\n  stream?: { width?: number; height?: number; fps?: number }\n  [key: string]: unknown\n}\n\nexport type XmaxTelemetryWireEvent = {\n  event: string\n  offset: number\n  duration?: number\n  attrs?: XmaxTelemetryParams\n}\n\n/** One document-compatible envelope. */\nexport type XmaxTelemetryEnvelope = {\n  meta: XmaxTelemetryMeta\n  rtc_stats: XmaxTelemetryRtcStats | null\n  events: XmaxTelemetryWireEvent[]\n}\n\nexport type XmaxTelemetryPayload = XmaxTelemetryEnvelope\n\ntype BrowserConnection = {\n  effectiveType?: unknown\n  type?: unknown\n  rtt?: unknown\n  downlink?: unknown\n  saveData?: unknown\n}\n\nconst META_KEYS = new Set([\n  'schema_version', 'xmax_sdk_version', 'trace_id', 'call_id',\n  'trace_start_time_ms', 'page_id', 'session_id', 'generation_id', 'model', 'media_kind',\n  'media_bytes', 'api_host', 'api_key_md5', 'env', 'auto_start', 'entry_point', 'stream_width',\n  'report_source',\n  'stream_height', 'stream_fps', 'rtc_room_id', 'rtc_sdk_version', 'visibility', 'online',\n  'background_seen', 'asset_operation_id', 'asset_age_ms', 'operation_id',\n])\n\nconst EVENT_NAMES: Record<XmaxTelemetryEvent['name'], string> = {\n  sdk_api_request: 'api.request',\n  sdk_capture_get_user_media_start: 'capture.get_user_media.start',\n  sdk_capture_get_user_media_end: 'capture.get_user_media.end',\n  sdk_asset_sts_request: 'asset.sts.request',\n  sdk_asset_sts_response: 'asset.sts.response',\n  sdk_asset_upload_start: 'asset.upload.start',\n  sdk_asset_upload_end: 'asset.upload.end',\n  sdk_api_session_request: 'api.session.request',\n  sdk_api_session_response: 'api.session.response',\n  sdk_rtc_join_request: 'rtc.signal.join.request',\n  sdk_rtc_join_response: 'rtc.signal.join.response',\n  sdk_rtc_publish_local_track: 'rtc.publish.local_track',\n  sdk_generation_request_sent: 'generation.request.sent',\n  sdk_generation_ack_received: 'generation.ack.received',\n  sdk_rtc_subscribe_remote_track: 'rtc.subscribe.remote_track',\n  sdk_render_output_first_frame: 'render.output_first_frame',\n  sdk_context_set_request: 'context.set.request',\n  sdk_context_set_response: 'context.set.response',\n  sdk_session_connect: 'session.connect',\n  sdk_session_state_change: 'session.state_change',\n  sdk_session_error: 'session.error',\n  sdk_session_disconnect: 'session.disconnect',\n  sdk_rtc_stats_snapshot: 'rtc.stats.snapshot',\n  sdk_rtc_remote_state_change: 'rtc.remote.state_change',\n  sdk_rtc_connection_state_change: 'rtc.connection.state_change',\n  sdk_rtc_token_state_change: 'rtc.token.state_change',\n  sdk_rtc_teardown: 'rtc.teardown',\n  sdk_probe_degraded: 'probe.degraded',\n  sdk_probe_health: 'probe.health',\n  sdk_probe_buffer_overflow: 'probe.buffer_overflow',\n}\n\nfunction finiteNumber(value: unknown): number | undefined {\n  return typeof value === 'number' && Number.isFinite(value) ? value : undefined\n}\n\n/** Browser-provided connection hints only. Geo/country enrichment belongs to ingestion. */\nexport function readTelemetryNetworkMeta(): XmaxTelemetryNetworkMeta {\n  try {\n    if (typeof navigator === 'undefined') return { api_supported: false }\n    const connection = (navigator as Navigator & { connection?: BrowserConnection }).connection\n    return {\n      api_supported: Boolean(connection),\n      online: typeof navigator.onLine === 'boolean' ? navigator.onLine : undefined,\n      effective_type: typeof connection?.effectiveType === 'string' ? connection.effectiveType.slice(0, 32) : undefined,\n      connection_type: typeof connection?.type === 'string' ? connection.type.slice(0, 32) : undefined,\n      rtt_ms: finiteNumber(connection?.rtt),\n      downlink_mbps: finiteNumber(connection?.downlink),\n      save_data: typeof connection?.saveData === 'boolean' ? connection.saveData : undefined,\n    }\n  } catch { return { api_supported: false } }\n}\n\nexport function readTelemetryDeviceMeta(): XmaxTelemetryDeviceMeta {\n  try {\n    if (typeof navigator === 'undefined') return {}\n    const value = navigator as Navigator & { deviceMemory?: unknown }\n    return {\n      language: typeof navigator.language === 'string' ? navigator.language.slice(0, 32) : undefined,\n      hardware_concurrency: finiteNumber(navigator.hardwareConcurrency),\n      device_memory_gb: finiteNumber(value.deviceMemory),\n      max_touch_points: finiteNumber(navigator.maxTouchPoints),\n    }\n  } catch { return {} }\n}\n\nexport function telemetryEnvelopeKey(event: XmaxTelemetryEvent): string {\n  const { trace_id: traceId, operation_id: operationId, page_id: pageId } = event.params\n  if (typeof traceId === 'string') return `trace:${traceId}`\n  if (typeof operationId === 'string') return `operation:${operationId}`\n  return `page:${String(pageId ?? '')}`\n}\n\nfunction metricSummary(params: XmaxTelemetryParams, scope: 'window' | 'cumulative', metric: string): XmaxTelemetryMetricSummary | undefined {\n  const prefix = `${scope}_${metric}_`\n  const sampleCount = finiteNumber(params[`${prefix}sample_count`])\n  if (sampleCount === undefined) return undefined\n  return {\n    sample_count: sampleCount,\n    avg: finiteNumber(params[`${prefix}avg`]),\n    min: finiteNumber(params[`${prefix}min`]),\n    max: finiteNumber(params[`${prefix}max`]),\n    p50: finiteNumber(params[`${prefix}p50`]) ?? null,\n    p90: finiteNumber(params[`${prefix}p90`]) ?? null,\n  }\n}\n\nfunction parseRtcStats(params: XmaxTelemetryParams): XmaxTelemetryRtcStats {\n  const metricNames = new Set<string>()\n  Object.keys(params).forEach(key => {\n    const match = /^(?:window|cumulative)_(.+)_sample_count$/.exec(key)\n    if (match) metricNames.add(match[1])\n  })\n  const windowMetrics: Record<string, XmaxTelemetryMetricSummary> = {}\n  const cumulativeMetrics: Record<string, XmaxTelemetryMetricSummary> = {}\n  metricNames.forEach(metric => {\n    const window = metricSummary(params, 'window', metric)\n    const cumulative = metricSummary(params, 'cumulative', metric)\n    if (window) windowMetrics[metric] = window\n    if (cumulative) cumulativeMetrics[metric] = cumulative\n  })\n  const addAlias = (target: Record<string, XmaxTelemetryMetricSummary>, alias: string, candidates: string[]) => {\n    const found = candidates.map(name => target[name]).find(Boolean)\n    if (found && !target[alias]) target[alias] = found\n  }\n  for (const target of [windowMetrics, cumulativeMetrics]) {\n    addAlias(target, 'rtt_ms', ['down_rtt_ms', 'up_rtt_ms'])\n    addAlias(target, 'packets_lost_rate', ['down_loss_rate', 'up_loss_rate'])\n    addAlias(target, 'bitrate_up_kbps', ['up_bitrate_kbps'])\n    addAlias(target, 'bitrate_down_kbps', ['down_bitrate_kbps'])\n    addAlias(target, 'fps', ['down_decode_fps'])\n  }\n  const maxCount = (metrics: Record<string, XmaxTelemetryMetricSummary>) =>\n    Math.max(0, ...Object.values(metrics).map(metric => metric.sample_count))\n  return {\n    snapshot_reason: typeof params.snapshot_reason === 'string' ? params.snapshot_reason : undefined,\n    current_stage: typeof params.current_stage === 'string' ? params.current_stage : undefined,\n    current_stage_elapsed_ms: finiteNumber(params.current_stage_elapsed_ms),\n    stats_started_offset_ms: finiteNumber(params.stats_started_offset_ms),\n    stats_last_offset_ms: finiteNumber(params.stats_last_offset_ms),\n    up_stats_age_ms: finiteNumber(params.up_stats_age_ms),\n    down_stats_age_ms: finiteNumber(params.down_stats_age_ms),\n    sampling_source: typeof params.sampling_source === 'string' ? params.sampling_source : undefined,\n    down_stall_count: finiteNumber(params.down_stall_count),\n    down_stall_duration_ms: finiteNumber(params.down_stall_duration_ms),\n    window: { duration_ms: finiteNumber(params.window_duration_ms), sample_count: maxCount(windowMetrics), metrics: windowMetrics },\n    cumulative: { sample_count: maxCount(cumulativeMetrics), metrics: cumulativeMetrics },\n  }\n}\n\nfunction normalizeAttrs(event: XmaxTelemetryEvent): XmaxTelemetryParams {\n  const attrs: XmaxTelemetryParams = {}\n  Object.keys(event.params).forEach(key => {\n    if (['region', 'sdk_region', 'region_form'].includes(key)) return\n    if (META_KEYS.has(key) || ['event_id', 'event_time_ms', 'event_seq', 'offset_ms', 'duration_ms'].includes(key)) return\n    if (/^(window|cumulative)_.+|^stats_(started|last)_offset_ms$|^snapshot_reason$|^down_stall_/.test(key)) return\n    attrs[key] = event.params[key]\n  })\n  if (typeof attrs.error_code === 'string' && attrs.code === undefined) attrs.code = attrs.error_code\n  if (attrs.code === undefined && attrs.business_code !== undefined) attrs.code = attrs.business_code\n  if (attrs.http_status !== undefined && attrs.status === undefined) attrs.status = attrs.http_status\n  if (attrs.track_kind !== undefined && attrs.kind === undefined) attrs.kind = attrs.track_kind\n  if (event.name === 'sdk_capture_get_user_media_end' && attrs.code === undefined && attrs.error_name !== undefined) attrs.code = attrs.error_name\n  if (event.name === 'sdk_session_disconnect' && attrs.reason === undefined && attrs.failure_reason !== undefined) attrs.reason = attrs.failure_reason\n  if (event.name === 'sdk_capture_get_user_media_start') {\n    if (attrs.requested_width !== undefined) attrs.width = attrs.requested_width\n    if (attrs.requested_height !== undefined) attrs.height = attrs.requested_height\n    if (attrs.requested_fps !== undefined) attrs.fps = attrs.requested_fps\n  }\n  return attrs\n}\n\nexport function createTelemetryPayload(\n  batchId: string,\n  events: readonly XmaxTelemetryEvent[],\n  seq = 1,\n  probe: XmaxTelemetryProbeMeta = { sent: 1, dropped: 0, retried: 0, exempted: 0 },\n): XmaxTelemetryPayload {\n  const first = events[0]\n  const params = first?.params ?? {}\n  const latest = events.reduce<XmaxTelemetryParams>((result, event) => ({ ...result, ...event.params }), {})\n  const generationId = typeof params.generation_id === 'string'\n    && params.generation_id.length > 0\n    && events.every(event => event.params.generation_id === params.generation_id)\n    ? params.generation_id : undefined\n  const eventTime = finiteNumber(params.event_time_ms) ?? Date.now()\n  const offset = finiteNumber(params.offset_ms) ?? 0\n  const traceId = typeof latest.trace_id === 'string'\n    ? latest.trace_id\n    : typeof latest.operation_id === 'string'\n      ? latest.operation_id\n      : String(latest.page_id ?? batchId)\n  const stream = {\n    width: finiteNumber(latest.stream_width),\n    height: finiteNumber(latest.stream_height),\n    fps: finiteNumber(latest.stream_fps),\n  }\n  const reportSource = latest.report_source === 'open_platform' ? 'open_platform' : 'external_developer'\n  const meta: XmaxTelemetryMeta = {\n    trace_id: traceId,\n    session_id: typeof latest.session_id === 'string' ? latest.session_id : null,\n    generation_id: generationId,\n    page_id: String(latest.page_id ?? ''),\n    api_key_md5: typeof latest.api_key_md5 === 'string' ? latest.api_key_md5 : undefined,\n    sdk_version: String(latest.xmax_sdk_version ?? ''),\n    env: resolveXmaxReportEnvironment(reportSource, XMAX_SDK_BUILD_ENV),\n    report_source: reportSource,\n    ua: typeof navigator !== 'undefined' && typeof navigator.userAgent === 'string' ? navigator.userAgent : '',\n    model: typeof latest.model === 'string' ? latest.model : undefined,\n    stream: Object.values(stream).some(value => value !== undefined) ? stream : undefined,\n    t0: finiteNumber(latest.trace_start_time_ms) ?? Math.round(eventTime - offset),\n    ts: Date.now(), seq, probe,\n    network: readTelemetryNetworkMeta(),\n    device: readTelemetryDeviceMeta(),\n  }\n  META_KEYS.forEach(key => {\n    if (['xmax_sdk_version', 'trace_start_time_ms', 'stream_width', 'stream_height', 'stream_fps', 'online', 'generation_id'].includes(key)) return\n    const value = latest[key]\n    if (value !== undefined && value !== null && meta[key] === undefined) meta[key] = value\n  })\n  const statsEvent = [...events].reverse().find(event => event.name === 'sdk_rtc_stats_snapshot')\n  const wireEvents = events\n    .filter(event => event.name !== 'sdk_rtc_stats_snapshot')\n    .map(event => {\n      const attrs = normalizeAttrs(event)\n      const duration = finiteNumber(event.params.duration_ms)\n      return {\n        event: EVENT_NAMES[event.name],\n        offset: finiteNumber(event.params.offset_ms) ?? 0,\n        duration,\n        attrs: Object.keys(attrs).length ? attrs : undefined,\n      }\n    })\n  return { meta, rtc_stats: statsEvent ? parseRtcStats(statsEvent.params) : null, events: wireEvents }\n}\n\nexport class TelemetryTransportError extends Error {\n  constructor(readonly retryable: boolean, readonly retryAfterMs?: number) {\n    super('Telemetry ingestion failed')\n    this.name = 'TelemetryTransportError'\n  }\n}\n\nfunction parseRetryAfter(value: string | null): number | undefined {\n  if (!value) return undefined\n  const seconds = Number(value)\n  if (Number.isFinite(seconds) && seconds >= 0) return Math.min(60_000, seconds * 1000)\n  const at = Date.parse(value)\n  return Number.isFinite(at) ? Math.max(0, Math.min(60_000, at - Date.now())) : undefined\n}\n\nfunction safeEndpoint(endpoint: string): URL {\n  if (!isTelemetryEndpointConfigured(endpoint)) throw new TelemetryTransportError(false)\n  return new URL(endpoint)\n}\n\nexport async function sendTelemetryPayload(endpoint: string, body: string, timeoutMs: number): Promise<void> {\n  const target = safeEndpoint(endpoint)\n  const controller = new AbortController()\n  const timeout = setTimeout(() => controller.abort(), timeoutMs)\n  try {\n    const response = await fetch(target.href, {\n      method: 'POST', body,\n      headers: { 'Content-Type': 'application/json' },\n      credentials: 'omit', keepalive: true, signal: controller.signal,\n    })\n    if (!response.ok) {\n      const retryable = [408, 425, 429].includes(response.status) || response.status >= 500\n      throw new TelemetryTransportError(retryable, parseRetryAfter(response.headers.get('Retry-After')))\n    }\n  } catch (error) {\n    if (error instanceof TelemetryTransportError) throw error\n    throw new TelemetryTransportError(true)\n  } finally { clearTimeout(timeout) }\n}\n\nexport function sendTelemetryBeacon(endpoint: string, body: string, maxBytes: number): boolean {\n  try {\n    if (typeof navigator === 'undefined' || typeof navigator.sendBeacon !== 'function') return false\n    const target = safeEndpoint(endpoint)\n    const payload = new Blob([body], { type: 'text/plain;charset=UTF-8' })\n    if (payload.size > maxBytes) return false\n    return navigator.sendBeacon(target.href, payload)\n  } catch { return false }\n}\n","import { XMAX_SDK_BUILD_REGION, type XmaxSdkRegion } from '../build-config'\nimport { version } from '../../package.json'\n\nexport type XmaxProbeOptions = {\n  /** Healthy-session sampling rate. Abnormal sessions are always retained. @default 1 */\n  samplingRate?: number\n  /** Sliding RTC statistics window. @default 10000 */\n  windowDurationMs?: number\n  /** Promote a slow first-frame session to full retention. Omit until the first P95 is known. */\n  e2eThresholdMs?: number\n  /** Enable passive RTC statistics collection. @default true */\n  rtcStatsEnabled?: boolean\n}\n\nexport type ResolvedXmaxProbeConfig = {\n  samplingRate: number\n  windowDurationMs: number\n  e2eThresholdMs?: number\n  rtcStatsEnabled: boolean\n}\n\ntype RemoteProbeConfig = {\n  sampling_rate?: unknown\n  window_duration_ms?: unknown\n  e2e_threshold_ms?: unknown\n  rtc_stats_enabled?: unknown\n}\n\nexport const XMAX_TELEMETRY_CONFIG_ENDPOINTS: Record<XmaxSdkRegion, string> = {\n  cn: 'https://log.xmaxai.com/v1/probe/config',\n  global: 'https://api.xmax.cloud/v1/probe/config',\n}\n\nexport const XMAX_TELEMETRY_DEFAULT_CONFIG_ENDPOINT = XMAX_TELEMETRY_CONFIG_ENDPOINTS[XMAX_SDK_BUILD_REGION]\nconst REFRESH_MS = 5 * 60_000\nconst FETCH_TIMEOUT_MS = 3_000\nconst DEFAULT_CONFIG: ResolvedXmaxProbeConfig = {\n  samplingRate: 1,\n  windowDurationMs: 10_000,\n  rtcStatsEnabled: true,\n}\n\nlet remoteConfig: Partial<ResolvedXmaxProbeConfig> = {}\nlet endpoint = XMAX_TELEMETRY_DEFAULT_CONFIG_ENDPOINT\nlet runtimeEnv = 'prod'\nlet refreshTimer: ReturnType<typeof setTimeout> | undefined\nlet fetching = false\n\nfunction configured(value: string | undefined): value is string {\n  if (!value || value.includes('__pending_')) return false\n  try { return new URL(value).protocol === 'https:' } catch { return false }\n}\n\nfunction finiteRange(value: unknown, min: number, max: number): number | undefined {\n  return typeof value === 'number' && Number.isFinite(value) && value >= min && value <= max ? value : undefined\n}\n\nfunction parseRemote(value: RemoteProbeConfig): Partial<ResolvedXmaxProbeConfig> {\n  const parsed: Partial<ResolvedXmaxProbeConfig> = {}\n  const samplingRate = finiteRange(value.sampling_rate, 0, 1)\n  const windowDurationMs = finiteRange(value.window_duration_ms, 1_000, 60_000)\n  const e2eThresholdMs = finiteRange(value.e2e_threshold_ms, 1_000, 10 * 60_000)\n  if (samplingRate !== undefined) parsed.samplingRate = samplingRate\n  if (windowDurationMs !== undefined) parsed.windowDurationMs = windowDurationMs\n  if (e2eThresholdMs !== undefined) parsed.e2eThresholdMs = e2eThresholdMs\n  if (typeof value.rtc_stats_enabled === 'boolean') parsed.rtcStatsEnabled = value.rtc_stats_enabled\n  return parsed\n}\n\nfunction timer(callback: () => void, ms: number): ReturnType<typeof setTimeout> {\n  const handle = setTimeout(callback, ms)\n  ;(handle as unknown as { unref?: () => void }).unref?.()\n  return handle\n}\n\nfunction scheduleRefresh(): void {\n  if (!configured(endpoint) || refreshTimer) return\n  refreshTimer = timer(() => {\n    refreshTimer = undefined\n    void refreshRemoteProbeConfig()\n  }, REFRESH_MS)\n}\n\nasync function refreshRemoteProbeConfig(): Promise<void> {\n  if (!configured(endpoint) || fetching) return\n  fetching = true\n  const controller = new AbortController()\n  const timeout = timer(() => controller.abort(), FETCH_TIMEOUT_MS)\n  try {\n    const target = new URL(endpoint)\n    target.searchParams.set('env', runtimeEnv)\n    target.searchParams.set('sdk_version', version)\n    const response = await fetch(target.href, { method: 'GET', credentials: 'omit', signal: controller.signal })\n    if (!response.ok) return\n    const value = await response.json() as RemoteProbeConfig\n    if (value && typeof value === 'object') remoteConfig = parseRemote(value)\n  } catch {\n    // Fail-silent and retain the last valid config.\n  } finally {\n    clearTimeout(timeout)\n    fetching = false\n    scheduleRefresh()\n  }\n}\n\n/** Starts or stops the fail-silent remote config loop. */\nexport function configureRemoteProbeConfig(value: string | false | undefined, env = 'prod'): void {\n  if (refreshTimer) clearTimeout(refreshTimer)\n  refreshTimer = undefined\n  endpoint = value === false ? '' : (value ?? XMAX_TELEMETRY_DEFAULT_CONFIG_ENDPOINT)\n  runtimeEnv = ['prod', 'test', 'dev'].includes(env) ? env : 'prod'\n  if (configured(endpoint)) void refreshRemoteProbeConfig()\n}\n\nexport function resolveProbeConfig(local: XmaxProbeOptions | undefined): ResolvedXmaxProbeConfig {\n  const localConfig: Partial<ResolvedXmaxProbeConfig> = {}\n  const samplingRate = finiteRange(local?.samplingRate, 0, 1)\n  const windowDurationMs = finiteRange(local?.windowDurationMs, 1_000, 60_000)\n  const e2eThresholdMs = finiteRange(local?.e2eThresholdMs, 1_000, 10 * 60_000)\n  if (samplingRate !== undefined) localConfig.samplingRate = samplingRate\n  if (windowDurationMs !== undefined) localConfig.windowDurationMs = windowDurationMs\n  if (e2eThresholdMs !== undefined) localConfig.e2eThresholdMs = e2eThresholdMs\n  if (typeof local?.rtcStatsEnabled === 'boolean') localConfig.rtcStatsEnabled = local.rtcStatsEnabled\n  return { ...DEFAULT_CONFIG, ...localConfig, ...remoteConfig }\n}\n","import { sendTelemetryPayload, TelemetryTransportError } from './backend'\n\nexport type StoredReport = { id: string; endpoint: string; body: string; createdAt: number; critical: boolean }\nexport const OUTBOX_LIMITS = { packets: 32, bytes: 256_000, ttlMs: 24 * 60 * 60_000 } as const\n\nexport function retainReports(rows: StoredReport[], now: number): StoredReport[] {\n  let bytes = 0\n  return rows.filter(row => typeof row?.body === 'string' && row.body.length <= 48_000\n    && typeof row.id === 'string' && typeof row.endpoint === 'string'\n    && Number.isFinite(row.createdAt) && now - row.createdAt < OUTBOX_LIMITS.ttlMs && row.createdAt <= now)\n    .sort((a, b) => Number(b.critical) - Number(a.critical) || b.createdAt - a.createdAt)\n    .filter((row, index) => {\n      const size = new Blob([row.body]).size\n      if (index >= OUTBOX_LIMITS.packets || bytes + size > OUTBOX_LIMITS.bytes) return false\n      bytes += size\n      return true\n    })\n}\n\nlet database: Promise<IDBDatabase | undefined> | undefined\nfunction openDatabase(): Promise<IDBDatabase | undefined> {\n  if (typeof indexedDB === 'undefined') return Promise.resolve(undefined)\n  return database ??= new Promise(resolve => {\n    let settled = false\n    const finish = (db?: IDBDatabase) => {\n      if (settled) { db?.close(); return }\n      settled = true\n      clearTimeout(timer)\n      resolve(db)\n    }\n    const timer = setTimeout(() => finish(), 500)\n    try {\n      const request = indexedDB.open('xmax-probe-outbox', 1)\n      request.onupgradeneeded = () => request.result.createObjectStore('reports', { keyPath: 'id' })\n      request.onsuccess = () => {\n        request.result.onversionchange = () => { request.result.close(); database = undefined }\n        finish(request.result)\n      }\n      request.onerror = request.onblocked = () => finish()\n    } catch { finish() }\n  })\n}\n\nasync function transaction<T>(run: (store: IDBObjectStore, done: (value: T) => void) => void): Promise<T | undefined> {\n  const db = await openDatabase()\n  if (!db) return\n  return new Promise(resolve => {\n    let result: T | undefined\n    let tx: IDBTransaction | undefined\n    const timer = setTimeout(() => { try { tx?.abort() } catch {} resolve(undefined) }, 500)\n    const finish = (value?: T) => { clearTimeout(timer); resolve(value) }\n    try {\n      tx = db.transaction('reports', 'readwrite')\n      tx.oncomplete = () => finish(result)\n      tx.onerror = tx.onabort = () => finish()\n      run(tx.objectStore('reports'), value => { result = value })\n    } catch { finish() }\n  })\n}\n\nexport const reportStore = {\n  put: (row: StoredReport) => transaction<void>((store, done) => {\n    const request = store.getAll()\n    request.onsuccess = () => {\n      const existing = request.result as StoredReport[]\n      const retained = retainReports([...existing.filter(item => item.id !== row.id), row], Date.now())\n      const ids = new Set(retained.map(item => item.id))\n      existing.forEach(item => { if (!ids.has(item.id)) store.delete(item.id) })\n      if (ids.has(row.id)) store.put(row)\n      done()\n    }\n  }),\n  remove: (id: string) => transaction<void>((store, done) => { store.delete(id); done() }),\n  clear: () => transaction<void>((store, done) => { store.clear(); done() }),\n  list: () => transaction<StoredReport[]>((store, done) => {\n    const request = store.getAll()\n    request.onsuccess = () => {\n      const existing = request.result as StoredReport[]\n      const retained = retainReports(existing, Date.now())\n      const ids = new Set(retained.map(item => item.id))\n      existing.forEach(item => { if (!ids.has(item.id)) store.delete(item.id) })\n      done(retained.sort((a, b) => a.createdAt - b.createdAt))\n    }\n  }),\n}\n\nconst active = new Set<string>()\nlet endpoint: string | undefined\nlet epoch = 0\nlet replaying = false\nlet timer: ReturnType<typeof setTimeout> | undefined\n\nexport function configureReportOutbox(target?: string, clear = false): void {\n  if (endpoint === target && !clear) return\n  epoch++\n  endpoint = target\n  active.clear()\n  clearTimeout(timer)\n  timer = undefined\n  if (clear) void reportStore.clear()\n  if (target) wakeReportOutbox()\n}\n\nexport function persistReport(row: StoredReport): void {\n  if (!endpoint || row.endpoint !== endpoint) return\n  active.add(row.id)\n  void reportStore.put(row)\n}\n\nexport function acknowledgeReport(id: string): void {\n  active.delete(id)\n  void reportStore.remove(id)\n}\n\nexport function releaseReport(id: string): void {\n  active.delete(id)\n  wakeReportOutbox(30_000)\n}\n\nexport function wakeReportOutbox(delay = 0): void {\n  if (!endpoint || timer || replaying || typeof indexedDB === 'undefined') return\n  timer = setTimeout(() => { timer = undefined; void replay() }, delay)\n}\n\nasync function replay(): Promise<void> {\n  if (replaying || !endpoint) return\n  replaying = true\n  const run = epoch\n  const target = endpoint\n  let retry = false\n  let retryDelay = 2_000\n  try {\n    const rows = await reportStore.list() ?? []\n    for (const row of rows) {\n      if (run !== epoch) break\n      if (row.endpoint !== target || active.has(row.id)) continue\n      if (typeof navigator !== 'undefined' && navigator.onLine === false) { retry = true; retryDelay = 30_000; break }\n      try {\n        await sendTelemetryPayload(target, row.body, 3000)\n        await reportStore.remove(row.id)\n      } catch (error) {\n        if (error instanceof TelemetryTransportError && !error.retryable) {\n          await reportStore.remove(row.id)\n        } else { retry = true; retryDelay = 30_000; break }\n      }\n      // Drain one cached packet per tick; never flood a newly recovered connection.\n      retry = true\n      break\n    }\n  } catch { /* Storage and replay cannot affect the active Session. */ }\n  finally {\n    replaying = false\n    if (run !== epoch) wakeReportOutbox()\n    else if (retry) wakeReportOutbox(retryDelay)\n  }\n}\n","import type { XmaxTelemetryParams } from './collector'\n\nconst DEFAULT_WINDOW_MS = 10_000\nconst CUMULATIVE_SAMPLE_LIMIT = 14_400\nconst PERCENTILE_MIN_SAMPLES = 10\n\nexport const RTC_METRIC_NAMES = [\n  'up_rtt_ms',\n  'down_rtt_ms',\n  'jitter_ms',\n  'up_loss_rate',\n  'down_loss_rate',\n  'up_bitrate_kbps',\n  'down_bitrate_kbps',\n  'up_fps',\n  'down_decode_fps',\n  'down_render_fps',\n  'down_receive_fps',\n] as const\n\nexport type RtcMetricName = typeof RTC_METRIC_NAMES[number]\n\ntype TimedValue = { at: number; value: number }\n\nclass MetricSeries {\n  private readonly window: TimedValue[] = []\n  private readonly percentileSamples = new Float32Array(CUMULATIVE_SAMPLE_LIMIT)\n  private retainedSamples = 0\n  private count = 0\n  private sum = 0\n  private min = Number.POSITIVE_INFINITY\n  private max = Number.NEGATIVE_INFINITY\n\n  constructor(private windowMs: number) {}\n\n  setWindowDuration(ms: number): void { this.windowMs = ms }\n\n  private prune(at: number): void {\n    while (this.window[0] && at - this.window[0].at > this.windowMs) this.window.shift()\n  }\n\n  add(at: number, value: number): void {\n    this.count++\n    this.sum += value\n    this.min = Math.min(this.min, value)\n    this.max = Math.max(this.max, value)\n    this.window.push({ at, value })\n    this.prune(at)\n\n    if (this.retainedSamples < CUMULATIVE_SAMPLE_LIMIT) {\n      this.percentileSamples[this.retainedSamples++] = value\n      return\n    }\n    const replace = Math.floor(Math.random() * this.count)\n    if (replace < CUMULATIVE_SAMPLE_LIMIT) this.percentileSamples[replace] = value\n  }\n\n  snapshot(prefix: 'window' | 'cumulative', at: number): XmaxTelemetryParams {\n    this.prune(at)\n    const values = prefix === 'window'\n      ? this.window.map(sample => sample.value)\n      : this.percentileSamples.subarray(0, this.retainedSamples)\n    const count = prefix === 'window' ? values.length : this.count\n    if (!count) return { [`${prefix}_sample_count`]: 0 }\n    const sorted = Float32Array.from(values).sort()\n    const percentile = (ratio: number) => sorted[Math.min(sorted.length - 1, Math.floor((sorted.length - 1) * ratio))]\n    const result: XmaxTelemetryParams = {\n      [`${prefix}_sample_count`]: count,\n      [`${prefix}_avg`]: prefix === 'window'\n        ? this.window.reduce((total, sample) => total + sample.value, 0) / values.length\n        : this.sum / this.count,\n      [`${prefix}_min`]: prefix === 'window' ? sorted[0] : this.min,\n      [`${prefix}_max`]: prefix === 'window' ? sorted[sorted.length - 1] : this.max,\n      [`${prefix}_p50`]: null,\n      [`${prefix}_p90`]: null,\n    }\n    if (count >= PERCENTILE_MIN_SAMPLES) {\n      result[`${prefix}_p50`] = percentile(0.5)\n      result[`${prefix}_p90`] = percentile(0.9)\n    }\n    return result\n  }\n}\n\nexport class RtcStatsAccumulator {\n  private readonly metrics = new Map<RtcMetricName, MetricSeries>()\n  private firstAt?: number\n  private lastAt?: number\n  private stallCount = 0\n  private stallDurationMs = 0\n\n  constructor(private windowMs = DEFAULT_WINDOW_MS) {}\n\n  clear(): void { this.metrics.clear() }\n\n  setWindowDuration(ms: number): void {\n    this.windowMs = ms\n    this.metrics.forEach(series => series.setWindowDuration(ms))\n  }\n\n  add(at: number, values: Partial<Record<RtcMetricName, number>>, stalls?: { count?: number; durationMs?: number }): void {\n    this.firstAt ??= at\n    this.lastAt = at\n    for (const metric of RTC_METRIC_NAMES) {\n      const value = values[metric]\n      if (typeof value !== 'number' || !Number.isFinite(value)) continue\n      let series = this.metrics.get(metric)\n      if (!series) { series = new MetricSeries(this.windowMs); this.metrics.set(metric, series) }\n      series.add(at, value)\n    }\n    if (typeof stalls?.count === 'number' && Number.isFinite(stalls.count)) this.stallCount = Math.max(this.stallCount, stalls.count)\n    if (typeof stalls?.durationMs === 'number' && Number.isFinite(stalls.durationMs)) this.stallDurationMs = Math.max(this.stallDurationMs, stalls.durationMs)\n  }\n\n  snapshot(at = this.lastAt ?? 0): XmaxTelemetryParams | null {\n    if (this.firstAt === undefined || this.lastAt === undefined) return null\n    const result: XmaxTelemetryParams = {\n      window_duration_ms: this.windowMs,\n      stats_started_offset_ms: Math.round(this.firstAt),\n      stats_last_offset_ms: Math.round(this.lastAt),\n      down_stall_count: this.stallCount,\n      down_stall_duration_ms: Math.round(this.stallDurationMs),\n    }\n    this.metrics.forEach((series, metric) => {\n      const windowSnapshot = series.snapshot('window', at)\n      Object.keys(windowSnapshot).forEach(key => {\n        result[key.replace('window', `window_${metric}`)] = windowSnapshot[key]\n      })\n      const cumulativeSnapshot = series.snapshot('cumulative', at)\n      Object.keys(cumulativeSnapshot).forEach(key => {\n        result[key.replace('cumulative', `cumulative_${metric}`)] = cumulativeSnapshot[key]\n      })\n    })\n    return result\n  }\n}\n","import {\n  emitTelemetry,\n  flushTelemetry,\n  telemetryEnabled,\n  telemetryHealth,\n  telemetryReportedBytes,\n  registerTelemetrySnapshot,\n  telemetryId,\n  telemetryTimer,\n  type XmaxTelemetryEventName,\n  type XmaxTelemetryParams,\n} from './collector'\nimport { resolveProbeConfig, type ResolvedXmaxProbeConfig, type XmaxProbeOptions } from './probe-config'\nimport { RtcStatsAccumulator, type RtcMetricName } from './rtc-stats'\nimport { getErrorDiagnostics } from '../shared/sdk-error'\n\nexport type StartupStage = 'media_prepare' | 'session_api' | 'rtc_prepare' | 'camera_capture' | 'camera_audio' | 'rtc_join' | 'camera_ready' | 'publish' | 'outbound_ready' | 'start_send' | 'context_set' | 'remote_bind' | 'wait_first_frame' | 'streaming'\nexport const STARTUP_TRACE = Symbol('xmaxStartupTrace')\nexport type WithStartupTrace = { [STARTUP_TRACE]?: StartupTrace }\n\n/** Stable values accepted by `session.disconnect.attrs.reason_code`. */\nexport const XMAX_DISCONNECT_REASON_CODES = [\n  'client_disconnect',\n  'client_background_timeout',\n  'client_session_replaced',\n  'client_context_disposed',\n  'session_inactive',\n  'heartbeat_error',\n  'remote_output_stalled',\n  'remote_unpublished',\n  'remote_user_left',\n  'remote_first_frame_timeout',\n  'local_outbound_zero_sent_frame_rate',\n  'local_outbound_track_ended',\n  'local_outbound_track_muted',\n  'rtc_async_error',\n  'rtc_reconnect_timeout',\n  'media_prepare_failed',\n  'camera_capture_failed',\n  'audio_capture_failed',\n  'session_api_failed',\n  'rtc_prepare_failed',\n  'rtc_join_failed',\n  'camera_ready_failed',\n  'local_publish_failed',\n  'local_outbound_not_ready',\n  'generation_start_failed',\n  'context_update_failed',\n  'remote_bind_failed',\n  'generation_stop_failed',\n  'local_stream_stop_failed',\n  'rtc_leave_failed',\n  'session_close_failed',\n  'media_cleanup_failed',\n  'connect_failed',\n  'session_error',\n  'pagehide',\n] as const\nexport type XmaxDisconnectReasonCode = typeof XMAX_DISCONNECT_REASON_CODES[number]\n\n/** Map the last operation stage to a stable, actionable terminal reason. */\nexport function disconnectReasonForStage(stage: StartupStage | undefined): XmaxDisconnectReasonCode {\n  switch (stage) {\n    case 'media_prepare': return 'media_prepare_failed'\n    case 'session_api': return 'session_api_failed'\n    case 'rtc_prepare': return 'rtc_prepare_failed'\n    case 'camera_capture': return 'camera_capture_failed'\n    case 'camera_audio': return 'audio_capture_failed'\n    case 'rtc_join': return 'rtc_join_failed'\n    case 'camera_ready': return 'camera_ready_failed'\n    case 'publish': return 'local_publish_failed'\n    case 'outbound_ready': return 'local_outbound_not_ready'\n    case 'start_send': return 'generation_start_failed'\n    case 'context_set': return 'context_update_failed'\n    case 'remote_bind': return 'remote_bind_failed'\n    default: return 'connect_failed'\n  }\n}\n\nconst SESSION_BUFFER_LIMIT = 500\ntype BufferedProbeEvent = { name: XmaxTelemetryEventName; params: XmaxTelemetryParams; bytes: number }\nconst BUFFER_CRITICAL_EVENTS = new Set<XmaxTelemetryEventName>([\n  'sdk_render_output_first_frame', 'sdk_session_error', 'sdk_session_disconnect',\n])\nconst SESSION_SCOPED_EVENTS = new Set<XmaxTelemetryEventName>([\n  'sdk_session_connect', 'sdk_session_state_change', 'sdk_session_disconnect',\n  'sdk_probe_health',\n])\n\nexport function diagnosticError(error: unknown): XmaxTelemetryParams {\n  try {\n    if (!error || typeof error !== 'object') return { error_name: 'UnknownError' }\n    const value = error as { name?: unknown; code?: unknown }\n    return {\n      error_name: typeof value.name === 'string' ? value.name : 'Error',\n      error_code: typeof value.code === 'string' || typeof value.code === 'number' ? String(value.code) : undefined,\n      ...getErrorDiagnostics(error),\n    }\n  } catch { return { error_name: 'UnknownError' } }\n}\n\nfunction environment(): XmaxTelemetryParams {\n  return {\n    visibility: typeof document !== 'undefined' ? document.visibilityState : 'unknown',\n    online: typeof navigator !== 'undefined' ? navigator.onLine : undefined,\n  }\n}\n\n/** One non-blocking diagnostic trace for the complete realtime connection lifecycle. */\nexport class StartupTrace {\n  readonly traceId = telemetryId()\n  /** @deprecated Compatibility alias for the earlier startup-only diagnostics. */\n  readonly callId = this.traceId\n  readonly startedAt = performance.now()\n  readonly startedAtEpochMs = Date.now()\n  done = false\n  outcome?: string\n  private readonly times: XmaxTelemetryParams = {}\n  private readonly stats: XmaxTelemetryParams = {}\n  private readonly terminalContext: XmaxTelemetryParams = {}\n  private readonly marks = new Set<string>()\n  private readonly rtcStats: RtcStatsAccumulator\n  private probeConfig: ResolvedXmaxProbeConfig\n  private readonly bufferedEvents: BufferedProbeEvent[] = []\n  private buffering: boolean\n  private retained = true\n  private stage: StartupStage = 'media_prepare'\n  private stageStartedAt = this.startedAt\n  private seq = 0\n  private connectedAt?: number\n  private firstFrameAt?: number\n  private generationSentAt?: number\n  private generationAckAt?: number\n  private generationId?: string\n  private rtcSamples = 0\n  private periodicTimer?: ReturnType<typeof setTimeout>\n  private snapshotTimer?: ReturnType<typeof setTimeout>\n  private snapshotReason?: string\n  private readonly unregisterSnapshot: () => void\n  private bufferedBytes = 0\n  private bufferedDrops = 0\n  private criticalFlushes = 0\n  private errorRecorded = false\n  private terminalFailure?: XmaxTelemetryParams\n  private backgroundSeen = false\n  private pageHiding = false\n  private readonly onVisibility = () => {\n    if (document.visibilityState !== 'hidden') return\n    this.backgroundSeen = true\n    this.recordRtcSnapshot('page_hidden')\n    flushTelemetry(true)\n  }\n  private readonly onPageHide = () => {\n    this.pageHiding = true\n    if (!this.done) this.finish('abandoned', {\n      failure_reason: 'pagehide',\n      close_mode: 'pagehide_beacon',\n      page_lifecycle: true,\n      server_close_attempted: false,\n      server_close_confirmed: false,\n    })\n    else flushTelemetry(true)\n  }\n\n  constructor(private readonly context: XmaxTelemetryParams, private readonly localProbe?: XmaxProbeOptions) {\n    this.probeConfig = resolveProbeConfig(localProbe)\n    this.rtcStats = new RtcStatsAccumulator(this.probeConfig.windowDurationMs)\n    this.unregisterSnapshot = registerTelemetrySnapshot(this.traceId, generationId =>\n      generationId === (this.generationId ?? null) ? this.snapshotParams('report') : null,\n    )\n    this.buffering = this.probeConfig.samplingRate < 1\n    this.retained = !this.buffering\n    this.backgroundSeen = typeof document !== 'undefined' && document.visibilityState === 'hidden'\n    this.schedulePeriodicSnapshot()\n    if (typeof document !== 'undefined') document.addEventListener?.('visibilitychange', this.onVisibility)\n    if (typeof window !== 'undefined') window.addEventListener?.('pagehide', this.onPageHide)\n  }\n\n  get params(): XmaxTelemetryParams {\n    return { ...this.context, trace_id: this.traceId, call_id: this.traceId }\n  }\n\n  eventContext(): XmaxTelemetryParams {\n    return { ...this.params, offset_ms: this.offset(), event_seq: this.seq + 1 }\n  }\n\n  offset(at = performance.now()): number { return Math.round(at - this.startedAt) }\n\n  get currentStage(): StartupStage { return this.stage }\n\n  /** @internal Immutable copy for the final public disconnect callback. */\n  get terminalFailureDetails(): Readonly<XmaxTelemetryParams> | undefined {\n    return this.terminalFailure ? { ...this.terminalFailure } : undefined\n  }\n\n  get rtcStatsEnabled(): boolean { return !this.done && this.probeConfig.rtcStatsEnabled }\n\n  rtcEvidence(): XmaxTelemetryParams {\n    const evidence: XmaxTelemetryParams = {}\n    for (const key of ['up_fps', 'up_bitrate_kbps', 'down_receive_fps', 'down_decode_fps', 'down_render_fps', 'down_bitrate_kbps']) {\n      if (typeof this.stats[key] === 'number') evidence[key] = this.stats[key]\n    }\n    const at = this.offset()\n    for (const direction of ['up', 'down']) {\n      const observed = this.stats[`${direction}_stats_at_ms`]\n      if (typeof observed === 'number') evidence[`${direction}_stats_age_ms`] = Math.max(0, at - observed)\n    }\n    return evidence\n  }\n\n  private schedulePeriodicSnapshot(): void {\n    this.periodicTimer = telemetryTimer(() => {\n      if (this.done) return\n      try {\n        this.probeConfig = resolveProbeConfig(this.localProbe)\n        this.rtcStats.setWindowDuration(this.probeConfig.windowDurationMs)\n        this.recordRtcSnapshot('periodic')\n      } catch { /* Optional diagnostics cannot interrupt the session. */ }\n      this.schedulePeriodicSnapshot()\n    }, 2000)\n  }\n\n  setContext(params: XmaxTelemetryParams): void { if (!this.done) Object.assign(this.context, params) }\n\n  setTerminalContext(params: XmaxTelemetryParams): void {\n    if (!this.done) Object.assign(this.terminalContext, params)\n  }\n\n  record(name: XmaxTelemetryEventName, params: XmaxTelemetryParams = {}): void {\n    try {\n      if (this.done) return\n      if ((name === 'sdk_rtc_connection_state_change' && ['1', '4', '6'].includes(String(params.state)))\n        || name === 'sdk_rtc_token_state_change'\n        || (name === 'sdk_api_request' && params.ok === false)\n        || (name === 'sdk_rtc_teardown' && params.outcome === 'error')) {\n        this.retainFullSession()\n      }\n      const event = {\n        ...this.context,\n        ...(SESSION_SCOPED_EVENTS.has(name) ? { generation_id: null } : {}),\n        trace_id: this.traceId,\n        call_id: this.traceId,\n        trace_start_time_ms: this.startedAtEpochMs,\n        event_seq: ++this.seq,\n        offset_ms: this.offset(),\n        event_time_ms: Date.now(),\n        ...environment(),\n        background_seen: this.backgroundSeen,\n        ...params,\n      }\n      if (this.buffering) this.bufferEvent(name, event)\n      else emitTelemetry(name, event)\n    } catch {\n      // Probe failures must never escape into the SDK business path.\n    }\n  }\n\n  private bufferEvent(name: XmaxTelemetryEventName, params: XmaxTelemetryParams): void {\n    const bytes = JSON.stringify(params).length * 2\n    while (this.bufferedEvents.length && (this.bufferedBytes + bytes > 120_000 || this.bufferedEvents.length >= SESSION_BUFFER_LIMIT)) {\n      const index = this.bufferedEvents.findIndex(event => !BUFFER_CRITICAL_EVENTS.has(event.name))\n      if (index < 0) { this.bufferedDrops++; return }\n      const [removed] = this.bufferedEvents.splice(index, 1)\n      this.bufferedBytes -= removed.bytes\n      this.bufferedDrops++\n    }\n    if (bytes > 120_000) { this.bufferedDrops++; return }\n    this.bufferedBytes += bytes\n    this.bufferedEvents.push({ name, params, bytes })\n  }\n\n  private retainFullSession(): void {\n    if (!this.buffering) return\n    this.buffering = false\n    this.retained = true\n    this.bufferedEvents.splice(0).forEach(event => emitTelemetry(event.name, event.params))\n    this.bufferedBytes = 0\n    if (this.bufferedDrops) this.record('sdk_probe_buffer_overflow', { dropped_count: this.bufferedDrops, queue_limit: SESSION_BUFFER_LIMIT, buffer_limit_bytes: 120_000 })\n  }\n\n  enter(stage: StartupStage): void {\n    if (this.done) return\n    this.stage = stage\n    this.stageStartedAt = performance.now()\n  }\n\n  complete(stage: StartupStage, startedAt: number): void {\n    if (this.done) return\n    this.times[`${stage}_ms`] = Math.round(performance.now() - startedAt)\n    if (stage === 'start_send') this.mark('start_send_completed')\n  }\n\n  async measure<T>(stage: StartupStage, operation: () => Promise<T>): Promise<T> {\n    const start = performance.now()\n    this.enter(stage)\n    try { return await operation() } finally { this.complete(stage, start) }\n  }\n\n  mark(name: string): void {\n    if (this.done || this.marks.has(name) || this.marks.size >= 24) return\n    this.marks.add(name)\n    this.times[`${name}_at_ms`] = this.offset()\n  }\n\n  markConnected(): void {\n    if (this.done || this.connectedAt !== undefined) return\n    this.connectedAt = performance.now()\n    this.mark('connected')\n    this.record('sdk_session_connect', { connected_ms: this.offset(this.connectedAt) })\n  }\n\n  setGeneration(generationId: string): void {\n    if (this.done) return\n    this.generationId = generationId\n    this.generationSentAt = undefined\n    this.generationAckAt = undefined\n    this.setContext({ generation_id: generationId })\n  }\n\n  clearGeneration(generationId?: string | null): void {\n    if (this.done || (generationId !== undefined && generationId !== this.generationId)) return\n    this.generationId = undefined\n    this.generationSentAt = undefined\n    this.generationAckAt = undefined\n    this.setContext({ generation_id: null })\n  }\n\n  generationSent(params: XmaxTelemetryParams = {}): void {\n    if (this.done) return\n    if (params.generation_id === undefined || params.generation_id === this.generationId) {\n      this.generationSentAt = performance.now()\n    }\n    this.record('sdk_generation_request_sent', { generation_id: this.generationId, ...params })\n  }\n\n  generationAckReceived(generationId: string, params: XmaxTelemetryParams = {}): void {\n    if (\n      this.done\n      || this.generationAckAt !== undefined\n      || this.generationId !== generationId\n    ) return\n    this.generationAckAt = performance.now()\n    this.mark('generation_ack')\n    this.record('sdk_generation_ack_received', {\n      generation_id: generationId,\n      ack_latency_ms: this.generationSentAt === undefined\n        ? undefined\n        : Math.round(this.generationAckAt - this.generationSentAt),\n      ...params,\n    })\n  }\n\n  firstFrame(params: XmaxTelemetryParams = {}): void {\n    if (this.done || this.firstFrameAt !== undefined) return\n    this.firstFrameAt = performance.now()\n    this.enter('streaming')\n    if (this.probeConfig.e2eThresholdMs !== undefined && this.offset(this.firstFrameAt) >= this.probeConfig.e2eThresholdMs) {\n      this.retainFullSession()\n    }\n    this.mark('first_frame_signal')\n    this.record('sdk_render_output_first_frame', {\n      ...this.times,\n      generation_id: this.generationId,\n      e2e_duration_ms: this.offset(this.firstFrameAt),\n      generation_duration_ms: this.generationSentAt === undefined ? undefined : Math.round(this.firstFrameAt - this.generationSentAt),\n      first_frame_source: this.stats.first_frame_source,\n      sei_matched: this.stats.sei_matched_at_frame,\n      ...params,\n    })\n    this.recordRtcSnapshot('first_frame')\n    if (this.pageHiding) flushTelemetry(true)\n    else this.flushCritical()\n  }\n\n  updateStats(params: XmaxTelemetryParams): void {\n    if (this.done) return\n    Object.assign(this.stats, params)\n    for (const key of ['up_rtt_ms', 'down_rtt_ms', 'up_loss_rate', 'down_loss_rate']) {\n      const value = params[key]\n      if (typeof value === 'number') this.stats[`${key}_max`] = Math.max(Number(this.stats[`${key}_max`] ?? 0), value)\n    }\n  }\n\n  recordRtcStats(values: Partial<Record<RtcMetricName, number>>, stalls?: { count?: number; durationMs?: number }): void {\n    if (!this.rtcStatsEnabled) return\n    const at = this.offset()\n    this.rtcStats.add(at, values, stalls)\n    this.rtcSamples++\n  }\n\n  recordRtcSnapshot(reason: string): void {\n    if (!this.rtcStatsEnabled) return\n    this.snapshotReason = reason\n    if (this.snapshotTimer !== undefined) return\n    const capture = () => {\n      this.snapshotTimer = undefined\n      try {\n        if (this.done && !this.retained) return\n        const snapshot = this.snapshotParams(this.snapshotReason ?? reason, true)\n        if (!snapshot) return\n        const params = {\n          ...this.params, trace_start_time_ms: this.startedAtEpochMs,\n          offset_ms: this.offset(), event_time_ms: Date.now(), event_seq: ++this.seq,\n          ...environment(), ...snapshot,\n        }\n        if (this.buffering && !this.done) this.bufferEvent('sdk_rtc_stats_snapshot', params)\n        else emitTelemetry('sdk_rtc_stats_snapshot', params)\n      } catch { /* Snapshot work is isolated from media and session callbacks. */ }\n      finally { if (this.done) this.rtcStats.clear() }\n    }\n    if (this.pageHiding) capture()\n    else this.snapshotTimer = telemetryTimer(capture, 0)\n  }\n\n  private snapshotParams(reason: string, allowDone = false): XmaxTelemetryParams | null {\n    if ((!allowDone && this.done) || !this.probeConfig.rtcStatsEnabled) return null\n    const at = this.offset()\n    const snapshot = this.rtcStats.snapshot(at)\n    if (!snapshot) return null\n    return {\n      ...snapshot,\n      ...this.stats,\n      generation_id: this.generationId ?? null,\n      up_stats_age_ms: typeof this.stats.up_stats_at_ms === 'number' ? Math.max(0, at - this.stats.up_stats_at_ms) : undefined,\n      down_stats_age_ms: typeof this.stats.down_stats_at_ms === 'number' ? Math.max(0, at - this.stats.down_stats_at_ms) : undefined,\n      snapshot_reason: reason,\n      current_stage: this.stage,\n      current_stage_elapsed_ms: Math.round(performance.now() - this.stageStartedAt),\n    }\n  }\n\n  recordError(params: XmaxTelemetryParams): void {\n    if (this.done || this.errorRecorded) return\n    this.errorRecorded = true\n    this.terminalFailure = { ...params }\n    this.retainFullSession()\n    this.recordRtcSnapshot('error')\n    this.record('sdk_session_error', {\n      ...this.times,\n      current_stage: this.stage,\n      error_code: params.error_code ?? params.failure_reason ?? 'UNKNOWN_ERROR',\n      ...params,\n    })\n    if (this.pageHiding) flushTelemetry(true)\n    else this.flushCritical()\n  }\n\n  private flushCritical(): void {\n    if (this.criticalFlushes >= 3) return\n    this.criticalFlushes++\n    flushTelemetry()\n  }\n\n  finish(outcome: 'success' | 'error' | 'cancelled' | 'connected' | 'abandoned' | 'unobserved', params: XmaxTelemetryParams = {}): void {\n    try { this.finishInternal(outcome, params) } catch { this.disposeAfterProbeFailure(outcome) }\n  }\n\n  private finishInternal(outcome: 'success' | 'error' | 'cancelled' | 'connected' | 'abandoned' | 'unobserved', params: XmaxTelemetryParams): void {\n    if (this.done) return\n    if (outcome === 'connected') { this.markConnected(); return }\n    if (outcome === 'success') { this.firstFrame(params); return }\n    const requestedReason = params.failure_reason\n    const recordedReason = this.terminalFailure?.failure_reason\n    const promoteRecordedFailure = (\n      (outcome === 'cancelled'\n        && (requestedReason === 'client' || requestedReason === 'client_disconnect'\n          || requestedReason === 'client_background_timeout' || requestedReason === 'client_session_replaced'\n          || requestedReason === 'client_context_disposed' || requestedReason === 'pagehide'))\n      || (outcome === 'error' && requestedReason === 'session_error')\n    )\n      && typeof recordedReason === 'string'\n    const terminalParams = promoteRecordedFailure\n      ? { ...params, ...this.terminalFailure, disconnect_trigger: `${requestedReason === 'client' ? 'client_disconnect' : requestedReason}_after_error` }\n      : params\n    if (outcome !== 'cancelled' || promoteRecordedFailure) this.retainFullSession()\n    if (outcome === 'error') this.recordError(terminalParams)\n    if (outcome !== 'unobserved') {\n      this.recordRtcSnapshot('disconnect')\n      this.record('sdk_session_disconnect', {\n        ...this.times,\n        outcome,\n        reason_code: terminalParams.failure_reason ?? outcome,\n        alive_ms: this.offset(),\n        is_abnormal: outcome !== 'cancelled' || promoteRecordedFailure,\n        connection_established: this.connectedAt !== undefined,\n        session_created: typeof this.context.session_id === 'string',\n        had_first_frame: this.firstFrameAt !== undefined,\n        current_stage: this.stage,\n        ...this.terminalContext,\n        ...terminalParams,\n      })\n    }\n    this.record('sdk_probe_health', {\n      ...telemetryHealth(),\n      rtc_samples: this.rtcSamples,\n      trace_event_count: this.seq,\n      buffered_event_count: this.bufferedEvents.length,\n      sampling_rate: this.probeConfig.samplingRate,\n      connection_established: this.connectedAt !== undefined,\n      session_created: typeof this.context.session_id === 'string',\n      had_first_frame: this.firstFrameAt !== undefined,\n      critical_flush_count: Math.min(3, this.criticalFlushes + 1),\n      finish_reason: terminalParams.failure_reason ?? outcome,\n      report_bytes: telemetryReportedBytes(this.traceId),\n      session_buffer_dropped: this.bufferedDrops,\n    })\n    if (this.buffering) {\n      if (Math.random() < this.probeConfig.samplingRate) this.retainFullSession()\n      else {\n        this.bufferedEvents.length = 0\n        this.retained = false\n      }\n    }\n    this.done = true\n    this.unregisterSnapshot()\n    if (this.snapshotTimer === undefined) this.rtcStats.clear()\n    clearTimeout(this.periodicTimer)\n    this.outcome = outcome\n    if (typeof document !== 'undefined') document.removeEventListener?.('visibilitychange', this.onVisibility)\n    if (typeof window !== 'undefined') window.removeEventListener?.('pagehide', this.onPageHide)\n    if (this.retained) {\n      if (this.pageHiding) flushTelemetry(true)\n      else this.flushCritical()\n    }\n  }\n\n  private disposeAfterProbeFailure(outcome: string): void {\n    this.unregisterSnapshot()\n    clearTimeout(this.snapshotTimer)\n    this.rtcStats.clear()\n    clearTimeout(this.periodicTimer)\n    this.done = true\n    this.outcome = outcome\n    try { if (typeof document !== 'undefined') document.removeEventListener?.('visibilitychange', this.onVisibility) } catch { /* fail silent */ }\n    try { if (typeof window !== 'undefined') window.removeEventListener?.('pagehide', this.onPageHide) } catch { /* fail silent */ }\n  }\n}\n\nexport function beginStartup(enabled: boolean | undefined, params: XmaxTelemetryParams, localProbe?: XmaxProbeOptions): StartupTrace | undefined {\n  if (enabled === false || !telemetryEnabled()) return undefined\n  try { return new StartupTrace(params, localProbe) } catch { return undefined }\n}\n","import COS from \"cos-js-sdk-v5\";\nimport { createSDKI18n, resolveApiErrorMessage, type SDKI18n, type SDKLocale } from \"../i18n\";\nimport { notifyError, type XmaxErrorNotifier } from \"../shared/error-utils\";\nimport { createAbortError, isAbortError, throwIfAborted } from \"../shared/abort\";\nimport {\n  attachErrorDiagnostics,\n  type XmaxErrorCode,\n  isXmaxSdkError,\n  toXmaxSdkError,\n  XmaxSdkError,\n} from \"../shared/sdk-error\";\nimport type { CosImageCheckResult } from \"./cos-media-check\";\nimport { XMAX_SDK_BUILD_REGION, type XmaxSdkRegion } from \"../build-config\";\nimport { beginHttpTrace } from '../telemetry/http';\nimport { apiHost, emitTelemetry, telemetryEnvironment, telemetryId, telemetryReportSource, type XmaxReportSource, type XmaxTelemetryEventName, type XmaxTelemetryParams } from '../telemetry/collector';\nimport { diagnosticError } from '../telemetry/startup';\nimport { recordUploadedAssetEvent, registerUploadedAsset } from '../telemetry/assets';\nimport { safeMd5Hex } from '../telemetry/md5';\n\nexport type { XmaxSdkRegion } from \"../build-config\";\n\n/** Region → official Open API v1 production base URL. */\nexport const XMAX_OPEN_API_BASE_URLS: Record<XmaxSdkRegion, string> = {\n  // 国内 — @xmaxai/sdk\n  cn: \"https://api.xmaxai.com/open/api/v1\",\n  // 海外 — @xmaxai/sdk-global\n  global: \"https://api.xmax.ai/open/api/v1\",\n};\n\n/**\n * Official Xmax Open Platform production API base URL (Open API v1) for the\n * region this package was built for:\n * - `@xmaxai/sdk` (cn):        https://api.xmaxai.com/open/api/v1\n * - `@xmaxai/sdk-global`:      https://api.xmax.ai/open/api/v1\n */\nexport const XMAX_OPEN_API_PRODUCTION_BASE_URL =\n  XMAX_OPEN_API_BASE_URLS[XMAX_SDK_BUILD_REGION];\n\nexport const ACTIVE_STATUS = \"ACTIVE\";\nconst STS_TTL_MS = 30 * 60 * 1000;\nconst STS_REFRESH_BUFFER_MS = 5 * 60 * 1000;\nconst HEARTBEAT_CONSECUTIVE_FAILURE_LIMIT = 3;\n\nfunction isBrowserFile(value: unknown): value is File {\n  if (!value || typeof value !== \"object\") {\n    return false;\n  }\n  if (typeof File !== \"undefined\" && value instanceof File) {\n    return true;\n  }\n  // A File created by an iframe belongs to a different JavaScript realm, so\n  // `instanceof File` is false even though it is valid for Blob uploads.\n  return Object.prototype.toString.call(value) === \"[object File]\"\n    && typeof (value as File).name === \"string\"\n    && typeof (value as File).type === \"string\"\n    && typeof (value as File).slice === \"function\";\n}\n\nfunction isBrowserBlob(value: unknown): value is Blob {\n  if (!value || typeof value !== \"object\") {\n    return false;\n  }\n  if (typeof Blob !== \"undefined\" && value instanceof Blob) {\n    return true;\n  }\n  return Object.prototype.toString.call(value) === \"[object Blob]\"\n    && typeof (value as Blob).type === \"string\"\n    && typeof (value as Blob).slice === \"function\"\n    && typeof (value as Blob).size === \"number\";\n}\n\n/** Accept File, cross-realm File, or Blob (normalized to File for COS upload). */\nfunction normalizeUploadFile(value: unknown, expectedTypePrefix: string): File | null {\n  if (isBrowserFile(value)) {\n    return value;\n  }\n  if (!isBrowserBlob(value)) {\n    return null;\n  }\n  const fallbackType = expectedTypePrefix.startsWith(\"video/\")\n    ? \"video/mp4\"\n    : \"image/jpeg\";\n  const type = value.type?.trim() || fallbackType;\n  const extension = type.includes(\"/\")\n    ? type.split(\"/\")[1]?.split(\"+\")[0] || (expectedTypePrefix.startsWith(\"video/\") ? \"mp4\" : \"jpg\")\n    : (expectedTypePrefix.startsWith(\"video/\") ? \"mp4\" : \"jpg\");\n  return new File([value], `upload.${extension}`, { type });\n}\n\nexport interface ModelExtra {\n  room_id?: string;\n  bot_name?: string;\n  user_id?: string;\n  rtc_app_id?: string;\n  room_token?: string;\n}\n\nexport interface Session {\n  sessionUid: string;\n  userUid?: string;\n  modelTypeUid?: string;\n  modelTypeName?: string;\n  modelUid?: string;\n  modelExtra?: ModelExtra;\n  status?: string;\n  lastHeartbeatTimestamp?: string;\n  closeTimestamp?: string | null;\n  closeReason?: string | null;\n  createTimestamp?: string;\n  updateTimestamp?: string;\n}\n\nexport interface StsCredentials {\n  accessKeyId: string;\n  secretAccessKey: string;\n  sessionToken: string;\n}\n\nexport interface CosSts {\n  type: string;\n  bucket: string;\n  region: string;\n  /** Overseas upload host (optional HTTP(S) scheme); also used as a returned URL fallback. */\n  endpoint: string;\n  prefix: string;\n  credentials: StsCredentials;\n}\n\nexport interface UploadImageResult {\n  key: string;\n  url: string;\n  raw: unknown;\n  sts: CosSts;\n}\n\nexport interface UploadVideoResult {\n  key: string;\n  url: string;\n  raw: unknown;\n  sts: CosSts;\n}\n\nexport interface RtcJoinInfo {\n  appId: string;\n  roomId: string;\n  userId: string;\n  token: string;\n  botName?: string;\n}\n\nexport interface XmaxLogEntry {\n  id: string;\n  level: \"info\" | \"success\" | \"warn\" | \"error\";\n  message: string;\n  data?: unknown;\n  timestamp: string;\n}\n\nexport interface ClientOptions {\n  apiKey?: string;\n  /** Open API base URL, e.g. {@link XMAX_OPEN_API_PRODUCTION_BASE_URL}. */\n  baseUrl: string;\n  authToken?: string;\n  timeoutMs?: number;\n  locale?: SDKLocale;\n  i18n?: SDKI18n;\n  /** Receives asynchronous errors as `(message, XmaxSdkError)`. */\n  onError?: XmaxErrorNotifier;\n  /** Set false to disable SDK diagnostics for this client. */\n  telemetry?: boolean;\n  reportSource?: XmaxReportSource;\n  /** @internal Correlates requests with a realtime startup. */\n  telemetryContext?: () => XmaxTelemetryParams | undefined;\n  /** @internal Records into a realtime trace so event ordering remains exact. */\n  telemetryRecord?: (name: XmaxTelemetryEventName, params: XmaxTelemetryParams) => void;\n}\n\nexport type RequestOptions = {\n  signal?: AbortSignal;\n};\n\nfunction sanitizeFileName(fileName: string): string {\n  return fileName\n    .trim()\n    .replace(/[^\\w.\\-一-龥]/g, \"_\")\n    .replace(/_+/g, \"_\");\n}\n\nfunction buildCosFileUrl(endpoint: string, bucket: string, key: string): string {\n  const trimmed = endpoint.trim();\n  const url = new URL(\n    /^https?:\\/\\//i.test(trimmed)\n      ? (trimmed.endsWith(\"/\") ? trimmed : `${trimmed}/`)\n      : `https://${trimmed.replace(/^\\/+/, \"\")}${trimmed.endsWith(\"/\") ? \"\" : \"/\"}`,\n  );\n  if (url.hostname.startsWith(\"cos.\") && !url.hostname.startsWith(`${bucket}.`)) {\n    url.hostname = `${bucket}.${url.hostname}`;\n  }\n  return new URL(key.replace(/^\\/+/, \"\"), url.toString()).toString();\n}\n\n/** Prefer COS putObject Location; fall back to STS endpoint or bucket/region URL. */\nfunction resolveCosUploadUrl(raw: unknown, sts: CosSts, key: string): string {\n  const location = (raw as { Location?: string } | null)?.Location?.trim();\n  if (location) {\n    return /^https?:\\/\\//i.test(location)\n      ? location\n      : `https://${location.replace(/^\\/+/, \"\")}`;\n  }\n\n  const endpoint = sts.endpoint?.trim();\n  if (endpoint) {\n    return buildCosFileUrl(endpoint, sts.bucket, key);\n  }\n\n  return `https://${sts.bucket}.cos.${sts.region}.myqcloud.com/${key.replace(/^\\/+/, \"\")}`;\n}\n\nfunction resolvePublicApiErrorCode(code: unknown): XmaxErrorCode {\n  const normalized = code === null || code === undefined ? '' : String(code).trim();\n  switch (normalized) {\n    case '46001':\n    case '46002':\n    case '46018':\n    case '46019':\n    case '46021':\n      return 'INVALID_API_KEY';\n    case '46003':\n    case '46005':\n      return 'INVALID_MODEL';\n    case '46004':\n    case '40030':\n    case '40032':\n    case '40034':\n    case '40035':\n    case '40038':\n    case '40039':\n    case '40040':\n    case '40041':\n    case '40043':\n    case '40044':\n    case '40046':\n    case '40047':\n    case '46023':\n    case '46026':\n    case '46027':\n      return 'INVALID_INPUT';\n    case '40033':\n    case '40036':\n      return 'UNSUPPORTED_MEDIA';\n    case '40037':\n      return 'MEDIA_PROCESSING_ERROR';\n    case '46012':\n    case '46013':\n    case '46014':\n    case '46015':\n      return 'SESSION_ERROR';\n    default:\n      return 'API_ERROR';\n  }\n}\n\nexport class XmaxOpenClient {\n  private readonly apiKey: string | undefined;\n  private readonly authToken: string | undefined;\n  private readonly baseUrl: string;\n  private readonly timeoutMs: number;\n  private readonly telemetry: boolean | undefined;\n  private readonly telemetryContext: ClientOptions['telemetryContext'];\n  private readonly telemetryRecord: ClientOptions['telemetryRecord'];\n  private readonly telemetryBase: XmaxTelemetryParams;\n  private readonly i18n: SDKI18n;\n  private readonly onError: XmaxErrorNotifier | undefined;\n  private stsCache: { value: CosSts; fetchedAt: number } | null = null;\n  private heartbeatIntervalId: number | null = null;\n  private heartbeatGeneration = 0;\n  private suppressErrorNotification = false;\n  private teardownAbortController: AbortController | null = null;\n  private readonly pendingRequestControllers = new Set<AbortController>();\n\n  constructor(options: ClientOptions) {\n    const i18n = options.i18n ?? createSDKI18n({ locale: options.locale });\n    const apiKey = options.apiKey?.trim();\n    const authToken = options.authToken?.trim();\n    if (!apiKey && !authToken) {\n      throw new XmaxSdkError(\"INVALID_API_KEY\", i18n.t(\"errors.apiKeyEmpty\"));\n    }\n    if (!options.baseUrl?.trim()) {\n      throw new XmaxSdkError(\"INVALID_INPUT\", i18n.t(\"errors.baseUrlEmpty\"));\n    }\n    this.apiKey = apiKey;\n    this.authToken = authToken;\n    this.baseUrl = options.baseUrl.replace(/\\/+$/, \"\");\n    this.timeoutMs = options.timeoutMs ?? 10_000;\n    this.telemetry = options.telemetry;\n    this.telemetryContext = options.telemetryContext;\n    this.telemetryRecord = options.telemetryRecord;\n    const reportSource = telemetryReportSource(options.reportSource);\n    this.telemetryBase = {\n      api_key_md5: options.telemetry === false ? undefined : safeMd5Hex(apiKey ?? authToken ?? ''),\n      api_host: apiHost(this.baseUrl),\n      env: telemetryEnvironment(reportSource),\n      report_source: reportSource,\n    };\n    this.i18n = i18n;\n    this.onError = options.onError;\n  }\n\n  private throwError(\n    code: XmaxErrorCode,\n    message: string,\n  ): never {\n    const error = new XmaxSdkError(code, message);\n    if (this.suppressErrorNotification) {\n      throw error;\n    }\n    throw notifyError(error, this.onError, message);\n  }\n\n  /** Stop heartbeat, abort in-flight API requests, and suppress error notifications during teardown. */\n  beginTeardown(): void {\n    this.suppressErrorNotification = true;\n    this.stopHeartbeat();\n    if (this.teardownAbortController) {\n      this.teardownAbortController.abort();\n    }\n    this.teardownAbortController = new AbortController();\n    this.pendingRequestControllers.forEach((controller) => {\n      controller.abort();\n    });\n    this.pendingRequestControllers.clear();\n  }\n\n  endTeardown(): void {\n    this.suppressErrorNotification = false;\n    this.teardownAbortController = null;\n  }\n\n  /** Normalize browser-specific fetch failures (Chrome, Safari, Firefox). */\n  private isNetworkError(error: unknown): boolean {\n    if (!(error instanceof Error)) {\n      return false;\n    }\n    return /failed to fetch|fetch failed|load failed|network\\s*(?:request\\s*)?(?:error|failed)/i.test(error.message);\n  }\n\n  async request<T>(\n    method: string,\n    path: string,\n    body?: unknown,\n    options: RequestOptions = {},\n    telemetryParams?: XmaxTelemetryParams,\n  ): Promise<T> {\n    const assetOperationId = typeof telemetryParams?.operation_id === 'string'\n      ? telemetryParams.operation_id\n      : undefined;\n    const telemetryRecord = assetOperationId\n      ? (name: XmaxTelemetryEventName, params: XmaxTelemetryParams) => {\n          recordUploadedAssetEvent(assetOperationId, name, params);\n          if (this.telemetryRecord) this.telemetryRecord(name, params);\n          else emitTelemetry(name, params);\n        }\n      : this.telemetryRecord;\n    const diagnostic = beginHttpTrace(\n      this.telemetry,\n      method,\n      path,\n      this.baseUrl,\n      this.timeoutMs,\n      () => ({ ...this.telemetryBase, ...this.telemetryContext?.(), ...telemetryParams }),\n      telemetryRecord,\n    );\n    try { throwIfAborted(options.signal); } catch (error) {\n      diagnostic?.error(error, 'cancelled', 'pre_aborted');\n      diagnostic?.finish();\n      throw error;\n    }\n    const controller = new AbortController();\n    this.pendingRequestControllers.add(controller);\n\n    const onTeardownAbort = () => controller.abort();\n    const onExternalAbort = () => controller.abort();\n    this.teardownAbortController?.signal.addEventListener(\"abort\", onTeardownAbort);\n    options.signal?.addEventListener(\"abort\", onExternalAbort, { once: true });\n    if (options.signal?.aborted) {\n      controller.abort();\n    }\n\n    let requestTimedOut = false;\n    let responseStatus: number | undefined;\n    let responseOk: boolean | undefined;\n    let responseParsed = false;\n    let responsePayloadValid = false;\n    let responseBusinessCode: string | undefined;\n    const timeoutId = globalThis.setTimeout(() => {\n      requestTimedOut = true;\n      controller.abort();\n    }, this.timeoutMs);\n\n    const headers: Record<string, string> = {\n      \"Content-Type\": \"application/json\",\n      Accept: \"application/json\",\n    };\n\n    if (this.apiKey) {\n      headers[\"X-Api-Key\"] = this.apiKey;\n    }\n\n    if (this.authToken) {\n      headers[\"Authorization\"] = `Bearer ${this.authToken}`;\n    }\n\n    try {\n      diagnostic?.sending();\n      const response = await fetch(`${this.baseUrl}${path}`, {\n        method,\n        headers,\n        body: body === undefined ? undefined : JSON.stringify(body),\n        signal: controller.signal,\n      });\n      responseStatus = response.status;\n      responseOk = response.ok;\n      diagnostic?.headers(response.status);\n      const text = await response.text();\n      diagnostic?.body();\n      let payload: unknown;\n\n      try {\n        payload = text ? JSON.parse(text) : null;\n        responseParsed = true;\n      } catch {\n        throw new XmaxSdkError(\"API_ERROR\", this.i18n.t(\"errors.invalidJson\"));\n      }\n\n      if (typeof payload !== \"object\" || payload === null) {\n        throw new XmaxSdkError(\"API_ERROR\", this.i18n.t(\"errors.invalidPayload\"));\n      }\n      responsePayloadValid = true;\n\n      const p = payload as Record<string, unknown>;\n      diagnostic?.businessCode(p.code);\n      responseBusinessCode = typeof p.code === 'string' || typeof p.code === 'number'\n        ? String(p.code)\n        : undefined;\n\n      if (response.ok && p.success === true) {\n        return p.data as T;\n      }\n\n      // Prefer localized message for known business codes; otherwise use the\n      // backend message when present; only then fall back to a generic retry hint.\n      const mappedMessage = resolveApiErrorMessage(p.code as string | number | null | undefined, this.i18n.locale);\n      const backendMessage =\n        typeof p.message === \"string\" && p.message.trim() ? p.message.trim() : undefined;\n      const errorMessage = mappedMessage ?? backendMessage ?? this.i18n.t(\"errors.requestRetry\");\n      throw attachErrorDiagnostics(\n        new XmaxSdkError(resolvePublicApiErrorCode(p.code), errorMessage),\n        {\n          failure_type: response.ok ? 'business_error' : 'http_error',\n          business_code: responseBusinessCode,\n          http_status: response.status,\n        },\n      );\n    } catch (error) {\n      const requestDiagnostics = {\n        failure_type: requestTimedOut\n          ? 'timeout' as const\n          : options.signal?.aborted || controller.signal.aborted\n            ? 'cancelled' as const\n            : responseStatus === undefined\n              ? 'network_error' as const\n              : responseOk === false\n                ? 'http_error' as const\n                : !responseParsed || !responsePayloadValid\n                  ? 'invalid_response' as const\n                  : 'business_error' as const,\n        business_code: responseBusinessCode,\n        http_status: responseStatus,\n      };\n      attachErrorDiagnostics(error, requestDiagnostics);\n      diagnostic?.error(error, requestTimedOut ? 'timeout' : controller.signal.aborted ? 'cancelled' : 'error',\n        requestTimedOut ? 'request_timeout' : options.signal?.aborted ? 'external_abort' : controller.signal.aborted ? 'session_teardown' : undefined);\n      if (isXmaxSdkError(error)) {\n        if (this.suppressErrorNotification) {\n          throw error;\n        }\n        throw notifyError(error, this.onError, {\n          code: \"API_ERROR\",\n          message: error.message || this.i18n.t(\"errors.requestFailed\"),\n        });\n      } else if (isAbortError(error)) {\n        if (options.signal?.aborted && !requestTimedOut) {\n          throw error;\n        }\n        const normalized = attachErrorDiagnostics(\n          new XmaxSdkError(\"NETWORK_ERROR\", this.i18n.t(\"errors.requestTimeout\")),\n          requestDiagnostics,\n        );\n        if (this.suppressErrorNotification) {\n          throw normalized;\n        }\n        throw notifyError(normalized, this.onError, this.i18n.t(\"errors.requestTimeout\"));\n      } else if (this.isNetworkError(error)) {\n        const normalized = attachErrorDiagnostics(\n          new XmaxSdkError(\"NETWORK_ERROR\", this.i18n.t(\"errors.networkError\")),\n          requestDiagnostics,\n        );\n        if (this.suppressErrorNotification) {\n          throw normalized;\n        }\n        throw notifyError(normalized, this.onError, this.i18n.t(\"errors.networkError\"));\n      } else if (error instanceof Error) {\n        const normalized = attachErrorDiagnostics(toXmaxSdkError(error, {\n          code: \"API_ERROR\",\n          message: error.message || this.i18n.t(\"errors.requestFailed\"),\n        }), requestDiagnostics);\n        if (this.suppressErrorNotification) {\n          throw normalized;\n        }\n        throw notifyError(normalized, this.onError, {\n          code: \"API_ERROR\",\n          message: error.message || this.i18n.t(\"errors.requestFailed\"),\n        });\n      } else {\n        const normalized = attachErrorDiagnostics(\n          new XmaxSdkError(\"API_ERROR\", this.i18n.t(\"errors.requestFailed\")),\n          requestDiagnostics,\n        );\n        if (this.suppressErrorNotification) {\n          throw normalized;\n        }\n        throw notifyError(normalized, this.onError, this.i18n.t(\"errors.requestFailed\"));\n      }\n    } finally {\n      diagnostic?.finish();\n      this.teardownAbortController?.signal.removeEventListener(\"abort\", onTeardownAbort);\n      options.signal?.removeEventListener(\"abort\", onExternalAbort);\n      this.pendingRequestControllers.delete(controller);\n      globalThis.clearTimeout(timeoutId);\n    }\n  }\n\n  async createSession(model: string): Promise<Session> {\n    if (!model.trim()) {\n      this.throwError(\"INVALID_MODEL\", this.i18n.t(\"errors.modelEmpty\"));\n    }\n    return this.request<Session>(\"POST\", \"/session\", { model });\n  }\n\n  async getSession(sessionUid: string): Promise<Session> {\n    return this.request<Session>(\"GET\", `/session/${sessionUid}`);\n  }\n\n  async heartbeatSession(sessionUid: string): Promise<Session> {\n    return this.request<Session>(\"PUT\", `/session/${sessionUid}/heartbeat`);\n  }\n\n  async closeSession(sessionUid: string): Promise<Session | null> {\n    const previousSuppress = this.suppressErrorNotification;\n    this.suppressErrorNotification = true;\n    try {\n      return await this.request<Session>(\"DELETE\", `/session/${sessionUid}`);\n    } catch {\n      return null;\n    } finally {\n      this.suppressErrorNotification = previousSuppress;\n    }\n  }\n\n  async getCosSts(\n    forceRefresh = false,\n    options: RequestOptions = {},\n    telemetryParams?: XmaxTelemetryParams,\n  ): Promise<CosSts> {\n    throwIfAborted(options.signal);\n    const now = performance.now();\n    if (\n      !forceRefresh &&\n      this.stsCache &&\n      now - this.stsCache.fetchedAt < STS_TTL_MS - STS_REFRESH_BUFFER_MS\n    ) {\n      return this.stsCache.value;\n    }\n\n    const sts = await this.request<CosSts>(\"GET\", \"/cos/sts\", undefined, options, telemetryParams);\n    throwIfAborted(options.signal);\n    this.stsCache = {\n      value: sts,\n      fetchedAt: now,\n    };\n    return sts;\n  }\n\n  /** Only overseas builds use the upload endpoint supplied by the STS service. */\n  private resolveCosUploadEndpoint(\n    sts: CosSts,\n  ): { Domain?: string; Protocol?: \"https:\" } {\n    if (XMAX_SDK_BUILD_REGION !== \"global\") {\n      return {};\n    }\n\n    const endpoint = sts.endpoint?.trim();\n    if (!endpoint) {\n      return {};\n    }\n\n    let url: URL;\n    try {\n      const value = endpoint.startsWith(\"//\")\n        ? `https:${endpoint}`\n        : /^[a-z][a-z0-9+.-]*:/i.test(endpoint)\n          ? endpoint\n          : `https://${endpoint}`;\n      url = new URL(value);\n    } catch {\n      return this.throwError(\"INVALID_INPUT\", \"Invalid COS upload endpoint\");\n    }\n\n    if (\n      ![\"https:\", \"http:\"].includes(url.protocol) ||\n      !url.hostname ||\n      url.username ||\n      url.password ||\n      url.port ||\n      url.pathname !== \"/\" ||\n      url.search ||\n      url.hash\n    ) {\n      return this.throwError(\n        \"INVALID_INPUT\",\n        \"COS upload endpoint must contain only a hostname\",\n      );\n    }\n\n    let domain = url.hostname;\n    // Region-level endpoints omit the bucket required by COS virtual-hosted requests.\n    if (/^cos\\.[a-z0-9-]+\\.myqcloud\\.com$/i.test(domain)) {\n      domain = `${sts.bucket}.${domain}`;\n    }\n    return { Domain: domain, Protocol: \"https:\" };\n  }\n\n  private async uploadObject(\n    file: File,\n    expectedTypePrefix: string,\n    options: RequestOptions = {},\n  ): Promise<{\n    key: string;\n    url: string;\n    raw: unknown;\n    sts: CosSts;\n  }> {\n    throwIfAborted(options.signal);\n    const uploadFile = normalizeUploadFile(file, expectedTypePrefix);\n    if (!uploadFile) {\n      this.throwError(\"INVALID_INPUT\", this.i18n.t(\"errors.invalidFile\"));\n    }\n\n    if (!uploadFile.type.startsWith(expectedTypePrefix)) {\n      this.throwError(\"UNSUPPORTED_MEDIA\", this.i18n.t(\"errors.invalidFileType\", { type: uploadFile.type || \"(empty)\" }));\n    }\n\n    const operationId = telemetryId();\n    const stsCacheHit = Boolean(\n      this.stsCache\n      && performance.now() - this.stsCache.fetchedAt < STS_TTL_MS - STS_REFRESH_BUFFER_MS\n    );\n    const sts = await this.getCosSts(false, options, { operation_id: operationId });\n    throwIfAborted(options.signal);\n    const safeFileName = sanitizeFileName(uploadFile.name) || \"image\";\n    const key = `${sts.prefix}${Date.now()}_${safeFileName}`;\n\n    const cos = new COS({\n      SecretId: sts.credentials.accessKeyId,\n      SecretKey: sts.credentials.secretAccessKey,\n      SecurityToken: sts.credentials.sessionToken,\n      ...this.resolveCosUploadEndpoint(sts),\n    });\n\n    const assetType = expectedTypePrefix.startsWith(\"video/\") ? \"video\" : \"image\";\n    const uploadStartedAt = performance.now();\n    const recordUpload = (name: 'sdk_asset_upload_start' | 'sdk_asset_upload_end', params: XmaxTelemetryParams) => {\n      if (this.telemetry === false) return;\n      const eventParams = { ...this.telemetryBase, ...this.telemetryContext?.(), ...params };\n      recordUploadedAssetEvent(operationId, name, eventParams);\n      if (this.telemetryRecord) this.telemetryRecord(name, params);\n      else emitTelemetry(name, eventParams);\n    };\n    recordUpload('sdk_asset_upload_start', {\n      operation_id: operationId,\n      asset_type: assetType,\n      size_bytes: uploadFile.size,\n      sts_cache_hit: stsCacheHit,\n    });\n\n    let raw: unknown;\n    try {\n      raw = await new Promise<unknown>((resolve, reject) => {\n        let settled = false;\n        let taskId: COS.TaskId | undefined;\n\n        const cleanup = () => {\n          options.signal?.removeEventListener(\"abort\", onAbort);\n        };\n        const cancelUpload = () => {\n          if (taskId === undefined) return;\n          try {\n            cos.cancelTask(taskId);\n          } catch {\n            // The task may have completed between the abort event and cancelTask.\n          }\n        };\n        const onAbort = () => {\n          if (settled) return;\n          settled = true;\n          cancelUpload();\n          cleanup();\n          reject(createAbortError());\n        };\n\n        options.signal?.addEventListener(\"abort\", onAbort, { once: true });\n        if (options.signal?.aborted) {\n          onAbort();\n        }\n        if (settled) return;\n\n        try {\n          cos.putObject(\n            {\n              Bucket: sts.bucket,\n              Region: sts.region,\n              Key: key,\n              Body: uploadFile,\n              ContentType: uploadFile.type,\n              onTaskReady: (nextTaskId) => {\n                taskId = nextTaskId;\n                if (options.signal?.aborted) {\n                  cancelUpload();\n                }\n              },\n            },\n            (error, data) => {\n              if (settled) return;\n              settled = true;\n              cleanup();\n              if (error) {\n                reject(error);\n                return;\n              }\n              resolve(data);\n            },\n          );\n        } catch (error) {\n          if (settled) return;\n          settled = true;\n          cleanup();\n          reject(error);\n        }\n      });\n    } catch (error) {\n      recordUpload('sdk_asset_upload_end', {\n        operation_id: operationId,\n        asset_type: assetType,\n        size_bytes: uploadFile.size,\n        ok: false,\n        duration_ms: Math.round(performance.now() - uploadStartedAt),\n        ...diagnosticError(error),\n      });\n      if (isAbortError(error)) {\n        throw error;\n      }\n      throw this.throwError(\n        \"API_ERROR\",\n        error instanceof Error && error.message ? error.message : this.i18n.t(\"errors.requestFailed\"),\n      );\n    }\n\n    try {\n      const result = {\n        key,\n        url: resolveCosUploadUrl(raw, sts, key),\n        raw,\n        sts,\n      };\n      recordUpload('sdk_asset_upload_end', {\n        operation_id: operationId,\n        asset_type: assetType,\n        size_bytes: uploadFile.size,\n        ok: true,\n        duration_ms: Math.round(performance.now() - uploadStartedAt),\n      });\n      registerUploadedAsset(result.url, operationId);\n      return result;\n    } catch (error) {\n      recordUpload('sdk_asset_upload_end', {\n        operation_id: operationId,\n        asset_type: assetType,\n        size_bytes: uploadFile.size,\n        ok: false,\n        duration_ms: Math.round(performance.now() - uploadStartedAt),\n        ...diagnosticError(error),\n      });\n      throw this.throwError(\n        \"API_ERROR\",\n        this.i18n.t(\"errors.requestFailed\"),\n      );\n    }\n  }\n\n  async uploadImage(file: File, options?: RequestOptions): Promise<UploadImageResult> {\n    return this.uploadObject(file, \"image/\", options);\n  }\n\n  async uploadVideo(file: File, options?: RequestOptions): Promise<UploadVideoResult> {\n    return this.uploadObject(file, \"video/\", options);\n  }\n\n  /**\n   * Upload an image then run `/cos/image/check`.\n   * Returns the same upload metadata as {@link uploadImage}, with the checked URL.\n   */\n  async uploadAndCheckImage(file: File, options?: RequestOptions): Promise<UploadImageResult> {\n    const uploaded = options\n      ? await this.uploadImage(file, options)\n      : await this.uploadImage(file);\n    const data = await this.request<CosImageCheckResult>(\"POST\", \"/cos/image/check\", {\n      url: uploaded.url,\n    }, options);\n\n    if (!data?.url) {\n      this.throwError(\"API_ERROR\", this.i18n.t(\"errors.imageCheckMissingUrl\"));\n    }\n\n    if (data.safe === false) {\n      this.throwError(\"UNSUPPORTED_MEDIA\", this.i18n.t(\"errors.imageCheckUnsafe\"));\n    }\n\n    return {\n      ...uploaded,\n      url: data.url,\n    };\n  }\n\n  startHeartbeat(\n    sessionUid: string,\n    intervalMs: number = 10000,\n    onHeartbeat?: (session: Session, diagnostics?: XmaxTelemetryParams) => void,\n    onError?: (error: XmaxSdkError, diagnostics?: XmaxTelemetryParams) => void,\n  ): void {\n    this.stopHeartbeat();\n    const generation = this.heartbeatGeneration;\n    let consecutiveFailures = 0;\n    let heartbeatInFlight = false;\n    let lastSuccessAt: number | undefined;\n    let attempts = 0;\n\n    const heartbeat = async () => {\n      if (heartbeatInFlight) {\n        return;\n      }\n      heartbeatInFlight = true;\n      attempts++;\n      try {\n        const session = await this.heartbeatSession(sessionUid);\n        if (generation !== this.heartbeatGeneration) return;\n        consecutiveFailures = 0;\n        lastSuccessAt = performance.now();\n        onHeartbeat?.(session, { heartbeat_attempts: attempts, heartbeat_consecutive_failures: 0, heartbeat_interval_ms: intervalMs });\n\n        if (session.status !== ACTIVE_STATUS) {\n          this.stopHeartbeat();\n        }\n      } catch (error) {\n        if (generation !== this.heartbeatGeneration) return;\n        consecutiveFailures += 1;\n        const definitelyOffline =\n          typeof navigator !== \"undefined\" && navigator.onLine === false;\n        if (definitelyOffline || consecutiveFailures >= HEARTBEAT_CONSECUTIVE_FAILURE_LIMIT) {\n          onError?.(toXmaxSdkError(error, {\n            code: \"SESSION_ERROR\",\n            message: this.i18n.t(\"errors.requestFailed\"),\n          }), {\n            heartbeat_attempts: attempts,\n            heartbeat_consecutive_failures: consecutiveFailures,\n            heartbeat_interval_ms: intervalMs,\n            heartbeat_last_success_age_ms: lastSuccessAt === undefined ? undefined : Math.round(performance.now() - lastSuccessAt),\n            heartbeat_failure_trigger: definitelyOffline ? 'browser_offline' : 'consecutive_failures',\n          });\n          this.stopHeartbeat();\n        }\n      } finally {\n        heartbeatInFlight = false;\n      }\n    };\n\n    heartbeat();\n    this.heartbeatIntervalId = window.setInterval(heartbeat, intervalMs);\n  }\n\n  stopHeartbeat(): void {\n    this.heartbeatGeneration++;\n    if (this.heartbeatIntervalId !== null) {\n      clearInterval(this.heartbeatIntervalId);\n      this.heartbeatIntervalId = null;\n    }\n  }\n\n  getRtcJoinInfo(session: Session): RtcJoinInfo {\n    const roomId = session.modelExtra?.room_id?.trim();\n    const appId = session.modelExtra?.rtc_app_id?.trim();\n    const token = session.modelExtra?.room_token?.trim();\n    const userId = session.modelExtra?.user_id?.trim() || session.userUid?.trim() || \"\";\n\n    if (!roomId || !appId || !token || !userId) {\n      this.throwError(\"SESSION_ERROR\", this.i18n.t(\"errors.sessionJoinInfoIncomplete\"));\n    }\n\n    return {\n      appId,\n      roomId,\n      userId,\n      token,\n      botName: session.modelExtra?.bot_name,\n    };\n  }\n}\n","import {\n  type XmaxErrorFallback,\n  XmaxSdkError,\n  toXmaxSdkError,\n  attachPublicErrorDetails,\n  getErrorDiagnostics,\n} from './sdk-error'\n\n/** SDK error callback. The first message argument preserves existing integrations. */\nexport type XmaxErrorNotifier = (message: string, error: XmaxSdkError) => void\n\nconst notifiedErrors = new WeakSet<XmaxSdkError>()\n\nexport function isNotifiedError(error: unknown): error is XmaxSdkError {\n  return error instanceof XmaxSdkError && notifiedErrors.has(error)\n}\n\nexport function notifyError(\n  error: unknown,\n  notifier: XmaxErrorNotifier | undefined,\n  fallback: string | XmaxErrorFallback,\n): XmaxSdkError {\n  const resolved = toXmaxSdkError(error, typeof fallback === 'string'\n      ? {\n        code: 'UNKNOWN_ERROR',\n        message: fallback,\n      }\n    : fallback)\n\n  attachPublicErrorDetails(resolved, getErrorDiagnostics(error) ?? {})\n  if (!notifiedErrors.has(resolved) && notifier) {\n    notifiedErrors.add(resolved)\n    try {\n      notifier(resolved.message, resolved)\n    } catch {\n      // Consumer error handlers must not replace the SDK error or interrupt cleanup.\n    }\n  }\n\n  return resolved\n}\n","export function createAbortError(): Error {\n  if (typeof DOMException !== 'undefined') {\n    return new DOMException('The operation was aborted', 'AbortError')\n  }\n  const error = new Error('The operation was aborted')\n  error.name = 'AbortError'\n  return error\n}\n\nexport function isAbortError(error: unknown): boolean {\n  return (\n    (typeof DOMException !== 'undefined'\n      && error instanceof DOMException\n      && error.name === 'AbortError')\n    || (error instanceof Error && error.name === 'AbortError')\n  )\n}\n\nexport function throwIfAborted(signal?: AbortSignal): void {\n  if (signal?.aborted) {\n    throw createAbortError()\n  }\n}\n","import { apiHost, emitTelemetry, telemetryEnabled, telemetryId, type XmaxTelemetryEventName, type XmaxTelemetryParams } from './collector'\nimport { diagnosticError } from './startup'\n\nfunction endpointTemplate(path: string): string {\n  const clean = path.split('?')[0]\n  if (['/session', '/cos/sts', '/cos/image/check', '/offline-task', '/offline-task/page', '/offline-task/batch-query'].includes(clean)) return clean\n  if (/^\\/session\\/[^/]+\\/heartbeat$/.test(clean)) return '/session/:id/heartbeat'\n  if (/^\\/session\\/[^/]+$/.test(clean)) return '/session/:id'\n  if (/^\\/offline-task\\/[^/]+$/.test(clean)) return '/offline-task/:id'\n  return '/other'\n}\n\nexport class HttpTrace {\n  private readonly startedAt = performance.now()\n  private headersAt?: number\n  private bodyAt?: number\n  private endedAt?: number\n  private finished = false\n  private outcome = 'success'\n  private stage = 'prepare'\n  private requestRecorded = false\n  private readonly params: XmaxTelemetryParams\n\n  constructor(\n    method: string,\n    path: string,\n    baseUrl: string,\n    timeoutMs: number,\n    context?: XmaxTelemetryParams,\n    private readonly recorder?: (name: XmaxTelemetryEventName, params: XmaxTelemetryParams) => void,\n  ) {\n    this.params = { ...context, request_id: telemetryId(), method, endpoint: endpointTemplate(path), api_host: apiHost(baseUrl), timeout_ms: timeoutMs, attempt: 1 }\n  }\n  private emit(name: XmaxTelemetryEventName, params: XmaxTelemetryParams): void {\n    if (this.recorder) this.recorder(name, params)\n    else emitTelemetry(name, params)\n  }\n  private eventNames(): { request: XmaxTelemetryEventName; response: XmaxTelemetryEventName } | undefined {\n    if (this.params.method === 'POST' && this.params.endpoint === '/session') return { request: 'sdk_api_session_request', response: 'sdk_api_session_response' }\n    if (this.params.method === 'GET' && this.params.endpoint === '/cos/sts') return { request: 'sdk_asset_sts_request', response: 'sdk_asset_sts_response' }\n    return undefined\n  }\n  sending(): void {\n    this.stage = 'fetch'\n    const names = this.eventNames()\n    if (names && !this.requestRecorded) {\n      this.requestRecorded = true\n      this.emit(names.request, { ...this.params })\n    }\n  }\n  headers(status: number): void {\n    this.headersAt = performance.now()\n    this.params.http_status = status\n    this.stage = 'read_body'\n  }\n  body(): void { this.bodyAt = performance.now(); this.stage = 'parse' }\n  businessCode(code: unknown): void {\n    if (typeof code === 'string' || typeof code === 'number') this.params.business_code = String(code)\n  }\n  error(error: unknown, outcome: 'error' | 'timeout' | 'cancelled', reason?: string): void {\n    this.endedAt = performance.now()\n    this.outcome = outcome\n    Object.assign(this.params, diagnosticError(error), { failure_stage: this.stage, failure_reason: reason })\n  }\n  finish(): void {\n    if (this.finished) return\n    this.finished = true\n    const now = this.endedAt ?? performance.now()\n    const duration = Math.round(now - this.startedAt)\n    const payload = {\n      ...this.params, outcome: this.outcome, duration_ms: duration, sample_rate: 1,\n      ok: this.outcome === 'success',\n      headers_wait_ms: this.headersAt === undefined ? undefined : Math.round(this.headersAt - this.startedAt),\n      body_read_ms: this.headersAt === undefined || this.bodyAt === undefined ? undefined : Math.round(this.bodyAt - this.headersAt),\n      parse_ms: this.bodyAt === undefined ? undefined : Math.round(now - this.bodyAt),\n    }\n    const names = this.eventNames()\n    this.emit(names?.response ?? 'sdk_api_request', payload)\n  }\n}\n\nexport function beginHttpTrace(\n  enabled: boolean | undefined,\n  method: string,\n  path: string,\n  baseUrl: string,\n  timeoutMs: number,\n  context?: () => XmaxTelemetryParams | undefined,\n  recorder?: (name: XmaxTelemetryEventName, params: XmaxTelemetryParams) => void,\n): HttpTrace | undefined {\n  if (enabled === false || !telemetryEnabled()) return undefined\n  try { return new HttpTrace(method, path, baseUrl, timeoutMs, context?.(), recorder) } catch { return undefined }\n}\n","import type { XmaxTelemetryEventName, XmaxTelemetryParams } from './collector'\n\nconst MAX_ASSETS = 50\nconst MAX_EVENTS_PER_ASSET = 6\nconst ASSET_TTL_MS = 60 * 60 * 1000\n\nconst ASSET_EVENT_NAMES = new Set<XmaxTelemetryEventName>([\n  'sdk_asset_sts_request',\n  'sdk_asset_sts_response',\n  'sdk_asset_upload_start',\n  'sdk_asset_upload_end',\n])\n\nexport type UploadedAssetEvent = {\n  name: XmaxTelemetryEventName\n  params: XmaxTelemetryParams\n  monotonicAtMs: number\n  epochAtMs: number\n}\n\nexport type UploadedAssetTrace = {\n  operationId: string\n  createdAtMonotonicMs: number\n  completedAtMonotonicMs: number\n  events: UploadedAssetEvent[]\n}\n\ntype AssetReplayTrace = {\n  startedAt: number\n  record: (name: XmaxTelemetryEventName, params: XmaxTelemetryParams) => void\n}\n\nconst uploadedAssets = new Map<string, UploadedAssetTrace>()\nconst assetOperations = new Map<string, UploadedAssetTrace>()\n\nfunction removeOperation(operationId: string): void {\n  assetOperations.delete(operationId)\n  uploadedAssets.forEach((value, key) => {\n    if (value.operationId === operationId) uploadedAssets.delete(key)\n  })\n}\n\nfunction pruneAssets(now: number): void {\n  assetOperations.forEach((value) => {\n    if (now - (value.completedAtMonotonicMs || value.createdAtMonotonicMs) > ASSET_TTL_MS) {\n      removeOperation(value.operationId)\n    }\n  })\n}\n\nfunction assetOperation(operationId: string): UploadedAssetTrace {\n  const now = performance.now()\n  pruneAssets(now)\n  let value = assetOperations.get(operationId)\n  if (!value) {\n    while (assetOperations.size >= MAX_ASSETS) {\n      const oldest = assetOperations.keys().next().value\n      if (typeof oldest !== 'string') break\n      removeOperation(oldest)\n    }\n    value = { operationId, createdAtMonotonicMs: now, completedAtMonotonicMs: 0, events: [] }\n    assetOperations.set(operationId, value)\n  }\n  return value\n}\n\nexport function recordUploadedAssetEvent(\n  operationId: string,\n  name: XmaxTelemetryEventName,\n  params: XmaxTelemetryParams,\n): void {\n  if (!ASSET_EVENT_NAMES.has(name)) return\n  const value = assetOperation(operationId)\n  if (value.events.length >= MAX_EVENTS_PER_ASSET) return\n  value.events.push({\n    name,\n    params: { ...params },\n    monotonicAtMs: performance.now(),\n    epochAtMs: Date.now(),\n  })\n}\n\n/** Keep a bounded in-memory association. Asset URLs are never emitted. */\nexport function registerUploadedAsset(url: string, operationId: string): void {\n  const now = performance.now()\n  const value = assetOperation(operationId)\n  value.completedAtMonotonicMs = now\n  while (uploadedAssets.size >= MAX_ASSETS && !uploadedAssets.has(url)) {\n    const oldest = uploadedAssets.keys().next().value\n    if (typeof oldest !== 'string') break\n    uploadedAssets.delete(oldest)\n  }\n  uploadedAssets.set(url, value)\n}\n\nexport function findUploadedAsset(url: string | null | undefined): UploadedAssetTrace | undefined {\n  if (!url) return undefined\n  const value = uploadedAssets.get(url)\n  if (!value) return undefined\n  if (performance.now() - (value.completedAtMonotonicMs || value.createdAtMonotonicMs) > ASSET_TTL_MS) {\n    removeOperation(value.operationId)\n    return undefined\n  }\n  return value\n}\n\nexport function replayUploadedAssetEvents(trace: AssetReplayTrace, asset: UploadedAssetTrace): void {\n  for (const event of asset.events) {\n    const {\n      trace_id: _traceId,\n      call_id: _callId,\n      session_id: _sessionId,\n      generation_id: _generationId,\n      trace_start_time_ms: _traceStartTime,\n      event_id: _eventId,\n      event_seq: _eventSeq,\n      event_time_ms: _eventTime,\n      offset_ms: _offset,\n      ...params\n    } = event.params\n    trace.record(event.name, {\n      ...params,\n      operation_id: asset.operationId,\n      event_time_ms: event.epochAtMs,\n      offset_ms: Math.min(-1, Math.round(event.monotonicAtMs - trace.startedAt)),\n    })\n  }\n}\n","/** Small dependency-free MD5 used only once per client for the probe dimension. */\nexport function md5Hex(value: string): string {\n  const source = new TextEncoder().encode(value)\n  const bitLength = source.length * 8\n  const paddedLength = Math.ceil((source.length + 9) / 64) * 64\n  const bytes = new Uint8Array(paddedLength)\n  bytes.set(source)\n  bytes[source.length] = 0x80\n  const view = new DataView(bytes.buffer)\n  view.setUint32(paddedLength - 8, bitLength >>> 0, true)\n  view.setUint32(paddedLength - 4, Math.floor(bitLength / 0x1_0000_0000), true)\n\n  let a0 = 0x67452301\n  let b0 = 0xefcdab89\n  let c0 = 0x98badcfe\n  let d0 = 0x10325476\n  const shifts = [\n    7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,\n    5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,\n    4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,\n    6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21,\n  ]\n  const constants = Array.from({ length: 64 }, (_, index) =>\n    Math.floor(Math.abs(Math.sin(index + 1)) * 0x1_0000_0000) >>> 0)\n  const rotateLeft = (input: number, count: number) => ((input << count) | (input >>> (32 - count))) >>> 0\n\n  for (let offset = 0; offset < bytes.length; offset += 64) {\n    const words = Array.from({ length: 16 }, (_, index) => view.getUint32(offset + index * 4, true))\n    let a = a0\n    let b = b0\n    let c = c0\n    let d = d0\n    for (let index = 0; index < 64; index++) {\n      let f: number\n      let wordIndex: number\n      if (index < 16) {\n        f = (b & c) | (~b & d)\n        wordIndex = index\n      } else if (index < 32) {\n        f = (d & b) | (~d & c)\n        wordIndex = (5 * index + 1) % 16\n      } else if (index < 48) {\n        f = b ^ c ^ d\n        wordIndex = (3 * index + 5) % 16\n      } else {\n        f = c ^ (b | ~d)\n        wordIndex = (7 * index) % 16\n      }\n      const previousD = d\n      d = c\n      c = b\n      b = (b + rotateLeft((a + f + constants[index] + words[wordIndex]) >>> 0, shifts[index])) >>> 0\n      a = previousD\n    }\n    a0 = (a0 + a) >>> 0\n    b0 = (b0 + b) >>> 0\n    c0 = (c0 + c) >>> 0\n    d0 = (d0 + d) >>> 0\n  }\n\n  return [a0, b0, c0, d0]\n    .flatMap(word => [0, 8, 16, 24].map(shift => ((word >>> shift) & 0xff).toString(16).padStart(2, '0')))\n    .join('')\n}\n\n/** Probe-only wrapper: hashing support must never affect SDK construction. */\nexport function safeMd5Hex(value: string): string | undefined {\n  try { return md5Hex(value) } catch { return undefined }\n}\n","export type StartRtcRoomEvent = {\n  event: \"start\";\n  user_id?: string;\n  uid?: string;\n  session_uid?: string;\n  params: {\n    model: string;\n    size: [number, number];\n    prompt: string;\n    ref_image_path?: string;\n    ref_image?: string;\n    static_generate?: boolean;\n    /** COS URL for `static_image_path` on this start; omit when unused. */\n    static_image_path?: string;\n    /** Whether the backend should horizontally flip the camera input. */\n    mirror: boolean;\n  } & Record<string, unknown>;\n};\n\nexport type ChangeConditionRtcRoomEvent = {\n  event: \"change_condition\";\n  user_id?: string;\n  session_uid?: string;\n  params: {\n    model: string;\n    size: [number, number];\n    prompt: string;\n    ref_image_path?: string;\n    ref_image?: string;\n    static_generate?: boolean;\n    /** COS URL for `static_image_path` on this start; omit when unused. */\n    static_image_path?: string;\n  } & Record<string, unknown>;\n};\n\nexport type StopRtcRoomEvent = {\n  event: \"stop\";\n  user_id?: string;\n  session_uid?: string;\n};\n\nexport type TracksRtcRoomEvent = {\n  event: \"tracks\";\n  user_id?: string;\n  uid?: string;\n  session_uid?: string;\n  tracks: Array<[number, number]>;\n};\n\nexport type RtcRoomEvent =\n  | StartRtcRoomEvent\n  | ChangeConditionRtcRoomEvent\n  | StopRtcRoomEvent\n  | TracksRtcRoomEvent;\n\n/** Generation task id sent as `uid` / `session_uid` in RTC room events. */\nexport function createTaskUid(): string {\n  const now = Date.now();\n  if (now !== lastTaskUidTimestamp) {\n    lastTaskUidTimestamp = now;\n    sameTickSequence = 0;\n  } else {\n    sameTickSequence += 1;\n  }\n  const randomPart = createRandomUint32();\n  return `task-${now}-${sameTickSequence}-${randomPart}`;\n}\n\nlet lastTaskUidTimestamp = 0;\nlet sameTickSequence = 0;\n\nfunction createRandomUint32(): number {\n  if (typeof globalThis.crypto?.getRandomValues === \"function\") {\n    const value = new Uint32Array(1);\n    globalThis.crypto.getRandomValues(value);\n    return value[0]!;\n  }\n  return Math.floor(Math.random() * 0x1_0000_0000);\n}\n\nexport function createStartRtcRoomEvent(input: {\n  userId?: string;\n  uid?: string;\n  sessionUid?: string;\n  model: string;\n  size: [number, number];\n  prompt?: string;\n  refImagePath?: string;\n  refImage?: string;\n  /** When `true`, sent as `static_generate` on this start only. */\n  staticGenerate?: boolean;\n  /** COS URL sent as `static_image_path` on this start only. */\n  staticImagePath?: string;\n  /** Whether the backend should horizontally flip the camera input. */\n  mirror: boolean;\n  extraParams?: Record<string, unknown>;\n}): StartRtcRoomEvent {\n  const resolvedPrompt = input.prompt?.trim() ?? \"\";\n  const refImagePath = input.refImagePath?.trim() || input.refImage?.trim() || undefined;\n  const useRefImage = !!refImagePath;\n  const staticImagePath = input.staticImagePath?.trim() || undefined;\n  return {\n    event: \"start\",\n    user_id: input.userId?.trim() || undefined,\n    uid: input.uid?.trim() || undefined,\n    session_uid: input.sessionUid?.trim() || undefined,\n    params: {\n      model: input.model.trim(),\n      size: input.size,\n      prompt: resolvedPrompt,\n      ref_image_path: useRefImage ? refImagePath : undefined,\n      ref_image: useRefImage ? refImagePath : undefined,\n      // Omit when false/undefined so starts never carry leftover `static_generate`.\n      static_generate: input.staticGenerate === true ? true : undefined,\n      static_image_path: staticImagePath,\n      ...(input.extraParams ?? {}),\n      mirror: input.mirror,\n    },\n  };\n}\n\nexport function createChangeConditionRtcRoomEvent(input: {\n  userId?: string;\n  sessionUid?: string;\n  model: string;\n  size: [number, number];\n  prompt?: string;\n  refImagePath?: string;\n  refImage?: string;\n  /** When `true`, sent as `static_generate` on this change only. */\n  staticGenerate?: boolean;\n  /** COS URL sent as `static_image_path` on this change only. */\n  staticImagePath?: string;\n  extraParams?: Record<string, unknown>;\n}): ChangeConditionRtcRoomEvent {\n  const resolvedPrompt = input.prompt?.trim() ?? \"\";\n  const refImagePath = input.refImagePath?.trim() || input.refImage?.trim() || undefined;\n  const useRefImage = !!refImagePath;\n  const staticImagePath = input.staticImagePath?.trim() || undefined;\n  return {\n    event: \"change_condition\",\n    user_id: input.userId?.trim() || undefined,\n    session_uid: input.sessionUid?.trim() || undefined,\n    params: {\n      model: input.model.trim(),\n      size: input.size,\n      prompt: resolvedPrompt,\n      ref_image_path: useRefImage ? refImagePath : undefined,\n      ref_image: useRefImage ? refImagePath : undefined,\n      static_generate: input.staticGenerate === true ? true : undefined,\n      static_image_path: staticImagePath,\n      ...(input.extraParams ?? {}),\n    },\n  };\n}\n\nexport function createStopRtcRoomEvent(input: { userId?: string; sessionUid?: string }): StopRtcRoomEvent {\n  return {\n    event: \"stop\",\n    user_id: input.userId?.trim() || undefined,\n    session_uid: input.sessionUid?.trim() || undefined,\n  };\n}\n\nexport function createTracksRtcRoomEvent(input: {\n  userId?: string;\n  uid?: string;\n  sessionUid?: string;\n  tracks: Array<[number, number]>;\n}): TracksRtcRoomEvent {\n  return {\n    event: \"tracks\",\n    user_id: input.userId?.trim() || undefined,\n    uid: input.uid?.trim() || undefined,\n    session_uid: input.sessionUid?.trim() || undefined,\n    tracks: input.tracks,\n  };\n}\n","import type { RtcMetricName } from './rtc-stats'\n\ntype Sample = Partial<Record<RtcMetricName, number>>\ntype Counter = { timestamp: number; bytes?: number; frames?: number; received?: number; packets?: number; lost?: number }\n\n/** Reads native counters asynchronously. A slow getStats never overlaps the next poll. */\nexport class RtcSampler {\n  private timer?: ReturnType<typeof setTimeout>\n  private stopped = false\n  private readonly previous = new Map<string, Counter>()\n\n  constructor(\n    private readonly connection: RTCPeerConnection,\n    private readonly enabled: () => boolean,\n    private readonly record: (sample: Sample) => void,\n  ) { this.schedule() }\n\n  stop(): void { this.stopped = true; clearTimeout(this.timer); this.previous.clear() }\n\n  private schedule(): void {\n    if (!this.stopped) this.timer = setTimeout(() => { void this.poll() }, 250)\n  }\n\n  private async poll(): Promise<void> {\n    const started = performance.now()\n    try {\n      if (this.stopped || !this.enabled() || this.connection.connectionState === 'closed') {\n        this.previous.clear()\n        return\n      }\n      const report = await this.connection.getStats()\n      if (this.stopped || !this.enabled()) return\n      const sample: Sample = {}\n      const seen = new Set<string>()\n      report.forEach(entry => {\n        const s = entry as RTCStats & Record<string, any>\n        if (s.type === 'candidate-pair' && s.state === 'succeeded' && s.nominated && typeof s.currentRoundTripTime === 'number') {\n          sample.down_rtt_ms = s.currentRoundTripTime * 1000\n          return\n        }\n        if ((s.kind ?? s.mediaType) !== 'video') return\n        if (s.type === 'remote-inbound-rtp') {\n          if (typeof s.roundTripTime === 'number') sample.up_rtt_ms = s.roundTripTime * 1000\n          if (typeof s.fractionLost === 'number') sample.up_loss_rate = s.fractionLost\n          return\n        }\n        if (s.type !== 'outbound-rtp' && s.type !== 'inbound-rtp') return\n        seen.add(s.id)\n        const up = s.type === 'outbound-rtp'\n        const current: Counter = {\n          timestamp: s.timestamp, bytes: up ? s.bytesSent : s.bytesReceived,\n          frames: up ? s.framesSent : s.framesDecoded, received: s.framesReceived,\n          packets: s.packetsReceived, lost: s.packetsLost,\n        }\n        const prev = this.previous.get(s.id)\n        this.previous.set(s.id, current)\n        if (!up && typeof s.jitter === 'number') sample.jitter_ms = Math.max(sample.jitter_ms ?? 0, s.jitter * 1000)\n        if (!prev || current.timestamp <= prev.timestamp) return\n        const seconds = (current.timestamp - prev.timestamp) / 1000\n        const delta = (key: keyof Counter): number | undefined => {\n          const a = current[key], b = prev[key]\n          return typeof a === 'number' && typeof b === 'number' && a >= b ? a - b : undefined\n        }\n        const bytes = delta('bytes'), frames = delta('frames'), received = delta('received')\n        const bitrateMetric = up ? 'up_bitrate_kbps' : 'down_bitrate_kbps'\n        const fpsMetric = up ? 'up_fps' : 'down_decode_fps'\n        if (bytes !== undefined) sample[bitrateMetric] = (sample[bitrateMetric] ?? 0) + bytes * 8 / seconds / 1000\n        if (frames !== undefined) sample[fpsMetric] = Math.max(sample[fpsMetric] ?? 0, frames / seconds)\n        if (!up && received !== undefined) sample.down_receive_fps = Math.max(sample.down_receive_fps ?? 0, received / seconds)\n        if (!up) {\n          const packets = delta('packets'), lost = delta('lost')\n          if (packets !== undefined && lost !== undefined && packets + lost > 0) sample.down_loss_rate = lost / (packets + lost)\n        }\n      })\n      this.previous.forEach((_, id) => { if (!seen.has(id)) this.previous.delete(id) })\n      if (Object.keys(sample).length) this.record(sample)\n    } catch {\n      // Collection must never reject into the RTC lifecycle.\n    } finally {\n      if (!this.stopped) this.timer = setTimeout(() => { void this.poll() }, Math.max(250 - (performance.now() - started), 0))\n    }\n  }\n}\n","import type { XmaxTelemetryParams } from '../telemetry/collector'\n\nexport type RemoteFailure = 'remote_output_stalled' | 'remote_stats_timeout' | 'remote_unpublished' | 'remote_user_left' | 'rtc_reconnect_timeout'\nexport type RemoteStallInfo = { userId: string; stallMs: number; reason?: RemoteFailure; diagnostics?: XmaxTelemetryParams }\n\n/** Independent of player DOM; never treats absent fields as zero samples. */\nexport class RemoteQualityMonitor {\n  private userId?: string\n  private lastSampleAt?: number\n  private zeroSince?: number\n  private missingSince?: number\n  private missingReason?: RemoteFailure\n  private last: XmaxTelemetryParams = {}\n  private reported?: RemoteFailure\n  private lastPresentedAt?: number\n\n  reset(): void {\n    this.userId = undefined\n    this.lastSampleAt = this.zeroSince = this.missingSince = undefined\n    this.missingReason = undefined\n    this.last = {}\n    this.reported = undefined\n    this.lastPresentedAt = undefined\n  }\n\n  presented(now: number): void { this.lastPresentedAt = now }\n\n  sample(userId: string, stats: Record<string, unknown>, now: number): void {\n    if (this.userId !== userId) { this.reset(); this.userId = userId }\n    const bitrate = stats.receivedKBitrate\n    const decoded = stats.decoderOutputFrameRate\n    const received = stats.receivedFrameRate\n    this.lastSampleAt = now\n    this.last = {\n      rtc_reason_code: this.last.rtc_reason_code,\n      down_bitrate_kbps: typeof bitrate === 'number' ? bitrate : undefined,\n      down_decode_fps: typeof decoded === 'number' ? decoded : undefined,\n      down_receive_fps: typeof received === 'number' ? received : undefined,\n      down_render_fps: typeof stats.rendererOutputFrameRate === 'number' ? stats.rendererOutputFrameRate : undefined,\n    }\n    if ((typeof bitrate === 'number' && bitrate > 0) || (typeof decoded === 'number' && decoded > 0)) {\n      this.zeroSince = this.missingSince = undefined\n      this.missingReason = undefined\n      this.reported = undefined\n      this.last.rtc_reason_code = undefined\n    } else if (bitrate === 0 && decoded === 0) {\n      this.zeroSince ??= now\n    } else {\n      this.zeroSince = undefined\n    }\n  }\n\n  missing(userId: string, reason: 'remote_unpublished' | 'remote_user_left', now: number, rtcReason?: number): void {\n    if (this.userId !== userId) { this.reset(); this.userId = userId }\n    this.missingSince ??= now\n    this.missingReason = reason\n    this.last.rtc_reason_code = rtcReason\n  }\n\n  suspend(now: number): void {\n    this.zeroSince = undefined\n    if (this.lastSampleAt !== undefined) this.lastSampleAt = now\n    if (this.missingSince !== undefined) this.missingSince = now\n  }\n\n  check(now: number): RemoteStallInfo | undefined {\n    if (!this.userId) return\n    const since = this.missingSince ?? this.zeroSince ?? this.lastSampleAt\n    if (since === undefined || now - since < 20_000) return\n    if (this.lastPresentedAt !== undefined && now - this.lastPresentedAt < 20_000) return\n    const fresh = this.lastSampleAt !== undefined && now - this.lastSampleAt <= 5_000\n    const reason = this.missingReason ?? (fresh && this.zeroSince !== undefined ? 'remote_output_stalled' : 'remote_stats_timeout')\n    if (this.reported === reason) return\n    this.reported = reason\n    return {\n      userId: this.userId, stallMs: Math.round(now - since), reason,\n      diagnostics: { ...this.last, detection_source: this.missingReason ? 'rtc_event' : 'rtc_stats', stats_age_ms: this.lastSampleAt === undefined ? undefined : Math.round(now - this.lastSampleAt) },\n    }\n  }\n}\n","import { XmaxSdkError } from '../shared/sdk-error'\n\nexport const RTC_TEARDOWN_TIMEOUT_MS = 5_000\n\nexport async function withRtcTeardownTimeout<T>(\n  operation: () => T | Promise<T>,\n  stage: string,\n): Promise<T> {\n  let timer: ReturnType<typeof setTimeout> | undefined\n  try {\n    return await Promise.race([\n      Promise.resolve().then(operation),\n      new Promise<never>((_, reject) => {\n        timer = setTimeout(() => {\n          const error = new XmaxSdkError('WEB_RTC_ERROR', `RTC teardown timed out: ${stage}`)\n          error.name = 'RtcTeardownTimeoutError'\n          reject(error)\n        }, RTC_TEARDOWN_TIMEOUT_MS)\n      }),\n    ])\n  } finally {\n    clearTimeout(timer)\n  }\n}\n","import VERTC, {\n  AudioSourceType,\n  ConnectionState,\n  type ConnectionStateChangeEvent,\n  MediaType,\n  type IRTCEngine,\n  type LocalStreamStats,\n  MirrorType,\n  RoomProfileType,\n  VideoCodecType,\n  StreamIndex,\n  VideoSourceType,\n  VideoRenderMode,\n} from \"@volcengine/rtc\";\n\nimport type { RtcJoinInfo } from \"../api/client\";\nimport type { StartupTrace } from '../telemetry/startup';\nimport { RtcSampler } from '../telemetry/rtc-sampler';\nimport { RemoteQualityMonitor, type RemoteStallInfo } from './quality-monitor';\nimport { withRtcTeardownTimeout } from './teardown-timeout';\nimport { createSDKI18n, type SDKI18n } from \"../i18n\";\nimport {\n  DEFAULT_REALTIME_STREAM_CONTENT_HINT,\n  DEFAULT_REALTIME_STREAM_MAX_KBPS,\n} from \"../realtime/default\";\nimport { resolveRtcPublishFps, type ResolveRtcPublishFpsOptions } from \"./media/publish-fps\";\nimport { resolvePlaybackDrivenEncoderFps } from \"./media/video-frame-rate\";\nimport {\n  type XmaxErrorCode,\n  toXmaxSdkError,\n  XmaxSdkError,\n} from \"../shared/sdk-error\";\nimport { withAppleMobileVideoStageTimeout } from \"../realtime/mobile-video-publish-compat\";\nimport {\n  applyUploadPreviewMediaLayout,\n  observeUploadPreviewMediaLayout,\n  PREVIEW_OUTPUT_LAYOUT_ATTR,\n  PREVIEW_UPLOAD_FIT_ATTR,\n  PREVIEW_UPLOAD_LAYOUT_ATTR,\n} from \"./render/preview-media-layout\";\nimport {\n  decodeSeiMessage,\n  normalizeSei,\n  RtcSeiSender,\n  type RemoteSeiReceivedPayload,\n  type RtcSessionSeiOptions,\n  type SeiGateState,\n} from \"./sei\";\n\nconst ENABLE_RTC_TIMING_LOGS = false;\n\n/** Resolve RTC rendering from the public `render.fit` option, then legacy markers. */\nfunction resolveVideoRenderMode(\n  container: HTMLElement,\n  fit?: \"cover\" | \"contain\",\n): VideoRenderMode {\n  if (fit === \"contain\") {\n    return VideoRenderMode.RENDER_MODE_FIT;\n  }\n  if (fit === \"cover\") {\n    return VideoRenderMode.RENDER_MODE_HIDDEN;\n  }\n\n  if (\n    container.hasAttribute(PREVIEW_UPLOAD_LAYOUT_ATTR)\n    || container.hasAttribute(PREVIEW_OUTPUT_LAYOUT_ATTR)\n    || container.hasAttribute(\"data-preview-contain\")\n    || container.hasAttribute(PREVIEW_UPLOAD_FIT_ATTR)\n    || container.closest(`[${PREVIEW_UPLOAD_LAYOUT_ATTR}]`)\n    || container.closest(`[${PREVIEW_OUTPUT_LAYOUT_ATTR}]`)\n    || container.closest(\"[data-preview-contain]\")\n    || container.closest(`[${PREVIEW_UPLOAD_FIT_ATTR}]`)\n  ) {\n    return VideoRenderMode.RENDER_MODE_FIT;\n  }\n\n  if (\n    container.hasAttribute(\"data-preview-cover\")\n    || container.hasAttribute(\"data-upload-preview-cover\")\n    || container.closest(\"[data-preview-cover]\")\n    || container.closest(\"[data-upload-preview-cover]\")\n  ) {\n    return VideoRenderMode.RENDER_MODE_HIDDEN;\n  }\n\n  const rect = container.getBoundingClientRect();\n  if (rect.width <= 0 || rect.height <= 0) {\n    return VideoRenderMode.RENDER_MODE_FIT;\n  }\n\n  const isCompactPreview = rect.width <= 160;\n  const isPortraitFrame = rect.height > rect.width;\n  // FILL stretches non-uniformly; HIDDEN scales proportionally to fill (CSS cover).\n  return isCompactPreview || isPortraitFrame\n    ? VideoRenderMode.RENDER_MODE_HIDDEN\n    : VideoRenderMode.RENDER_MODE_FIT;\n}\n\nexport interface RtcLogEntry {\n  level: \"info\" | \"success\" | \"warn\" | \"error\";\n  message: string;\n  data?: unknown;\n}\n\nexport interface RtcStateSnapshot {\n  roomId: string | null;\n  userId: string | null;\n  appId: string | null;\n  botUserId: string | null;\n  joined: boolean;\n  localVideoPublished: boolean;\n  remoteVideoUserId: string | null;\n  users: string[];\n}\n\ninterface RtcManagerOptions {\n  /** @internal Passive startup diagnostics; contains no business callbacks. */\n  diagnostics?: StartupTrace;\n  /** SDK-managed local/remote media fit from RealtimeRenderSetting. */\n  renderFit?: \"cover\" | \"contain\";\n  /** Whether to subscribe to and play remote output audio. */\n  playRemoteAudio?: boolean;\n  onLog?: (entry: RtcLogEntry) => void;\n  onStateChange?: (state: RtcStateSnapshot) => void;\n  onSeiGateChange?: (state: SeiGateState) => void;\n  /** Fired when Volcengine RTC reports an unrecoverable asynchronous engine error. */\n  onError?: (error: RtcAsyncErrorInfo) => void;\n  /** Fired when the first remote video frame is rendered for the active bot stream. */\n  onRemoteVideoFirstFrame?: (info: {\n    userId: string;\n    width: number;\n    height: number;\n  }) => void;\n  /** Fired for H.264 SEI received on a remote (non-local) stream. */\n  onRemoteSeiReceived?: (payload: RemoteSeiReceivedPayload) => void;\n  /** Fired when remote output stops presenting new frames after playback had started. */\n  onRemoteOutputStalled?: (info: RemoteStallInfo) => void;\n  /** Fired after the remote player is mounted (used to forward MediaStream via onRemoteStream). */\n  onRemotePlayerMounted?: () => void;\n  /** Fired when an RTC room message is received and parsed. */\n  onRoomEvent?: (event: Record<string, unknown>) => void;\n  /** Fired after a remote user joins the current RTC room. */\n  onUserJoined?: (userId: string) => void;\n  debug?: boolean;\n  i18n?: SDKI18n;\n}\n\nexport type RtcAsyncErrorInfo = {\n  errorCode: string;\n  forbiddenTime?: number;\n  cause: unknown;\n};\n\ntype VideoSize = [number, number];\ntype VideoContentHint = \"text\" | \"motion\" | \"detail\";\ntype VideoDegradationPreference = Extract<\n  RTCDegradationPreference,\n  \"maintain-framerate\" | \"maintain-resolution\"\n>;\ntype RtcVideoEncoderPreferenceOptions = ResolveRtcPublishFpsOptions & {\n  maxKbps?: number;\n  contentHint?: VideoContentHint;\n  audioTrack?: MediaStreamTrack;\n};\nexport type ExternalVideoPublishDeadlines = {\n  externalSourceMs: number;\n  encoderMs: number;\n  publishMs: number;\n  timeoutMessage: string;\n};\ntype RtcVideoDiagnosticStats = {\n  width?: number;\n  height?: number;\n  inputFrameRate?: number;\n  sentResolutionWidth?: number;\n  sentResolutionHeight?: number;\n  sentKBitrate?: number;\n  targetKBitrate?: number;\n  encodedBitrate?: number;\n  encoderOutputFrameRate?: number;\n  encodedFrameWidth?: number;\n  encodedFrameHeight?: number;\n  videoLossRate?: number;\n  rtt?: number;\n  statsInterval?: number;\n  receivedResolutionWidth?: number;\n  receivedResolutionHeight?: number;\n  decodedFrameWidth?: number;\n  decodedFrameHeight?: number;\n  sentFrameRate?: number;\n  encodeFrameRate?: number;\n  receivedFrameRate?: number;\n  decoderOutputFrameRate?: number;\n  renderFrameRate?: number;\n  rendererOutputFrameRate?: number;\n  stallCount?: number;\n  stallDuration?: number;\n};\n\nfunction readRtcVideoStat(\n  stats: RtcVideoDiagnosticStats,\n  keys: Array<keyof RtcVideoDiagnosticStats>,\n): number {\n  for (const key of keys) {\n    const value = stats[key];\n    if (typeof value === \"number\" && Number.isFinite(value) && value >= 0) {\n      return value;\n    }\n  }\n  return 0;\n}\n\ntype VideoWithFrameCallback = HTMLVideoElement & {\n  requestVideoFrameCallback?: (\n    cb: (now: DOMHighResTimeStamp, metadata: { mediaTime: number }) => void,\n  ) => number;\n  cancelVideoFrameCallback?: (handle: number) => void;\n};\n\nconst REMOTE_OUTPUT_STALL_MS = 20000;\nconst REMOTE_OUTPUT_RECOVERY_COOLDOWN_MS = 60000;\n/** First-output watchdog: cleared only after a remote frame is actually presented. */\nexport const REMOTE_FIRST_OUTPUT_TIMEOUT_MS = 15_000;\nexport const RTC_RECONNECT_TIMEOUT_MS = 60_000;\nconst DEFAULT_VIDEO_FRAME_RATE = 24;\n\nexport type LocalOutboundStallInfo = {\n  reason: \"zero-sent-frame-rate\" | \"track-ended\" | \"track-muted\";\n  consecutiveZeroStats: number;\n  stallMs: number;\n  lastSentFrameRate: number;\n};\n\ntype LocalOutboundWatchState = {\n  onStalled: (info: LocalOutboundStallInfo) => void;\n  minZeroSamples: number;\n  minStallMs: number;\n  resumeGraceMs: number;\n  consecutiveZeroStats: number;\n  lastPositiveAtMs: number;\n  graceUntilMs: number;\n  triggered: boolean;\n  track: MediaStreamTrack | null;\n  onTrackEnded: () => void;\n  onTrackMute: () => void;\n  onTrackUnmute: () => void;\n  onVisibilityChange: () => void;\n  muteTimer: ReturnType<typeof setTimeout> | null;\n  muteTriggerMs: number;\n};\n\ntype LocalOutboundReadyWaiter = {\n  positiveSamples: number;\n  minPositiveSamples: number;\n  resolve: () => void;\n  reject: (error: Error) => void;\n  timeoutId: ReturnType<typeof setTimeout>;\n};\n\nfunction normalizeRtcError(\n  error: unknown,\n  fallbackCode: XmaxErrorCode,\n  message: string,\n): XmaxSdkError {\n  return toXmaxSdkError(error, {\n    code: fallbackCode,\n    message,\n  });\n}\n\nexport class RtcManager {\n  private engine: IRTCEngine | null = null;\n  private leaveTask: Promise<void> | null = null;\n  private stopPublishingTask: Promise<void> | null = null;\n  private readonly users = new Set<string>();\n  private currentJoinInfo: RtcJoinInfo | null = null;\n  private joined = false;\n  private preserveRemoteDom = false;\n  private localVideoPublished = false;\n  private localAudioPublished = false;\n  private internalVideoCaptureStarted = false;\n  private internalAudioCaptureStarted = false;\n  private localVideoSourceType: VideoSourceType = VideoSourceType.VIDEO_SOURCE_TYPE_INTERNAL;\n  private externalVideoTrack: MediaStreamTrack | null = null;\n  private externalAudioTrack: MediaStreamTrack | null = null;\n  private remoteVideoUserId: string | null = null;\n  private pendingRemoteVideoUserId: string | null = null;\n  private pendingRemoteVideoMediaType: MediaType = MediaType.VIDEO;\n  /** Subscribed to RTC media; render may still wait on SEI match. */\n  private subscribedRemoteUserId: string | null = null;\n  private subscribedRemoteMediaType: MediaType = MediaType.VIDEO;\n  private readonly onLog: RtcManagerOptions[\"onLog\"];\n  private readonly onStateChange: RtcManagerOptions[\"onStateChange\"];\n  private readonly onSeiGateChange: RtcManagerOptions[\"onSeiGateChange\"];\n  private onError: RtcManagerOptions[\"onError\"];\n  private onRemoteVideoFirstFrame: RtcManagerOptions[\"onRemoteVideoFirstFrame\"];\n  private readonly onRemoteSeiReceived: RtcManagerOptions[\"onRemoteSeiReceived\"];\n  private onRemoteOutputStalled: RtcManagerOptions[\"onRemoteOutputStalled\"];\n  private onRemotePlayerMounted: RtcManagerOptions[\"onRemotePlayerMounted\"];\n  private onRoomEvent: RtcManagerOptions[\"onRoomEvent\"];\n  private onUserJoined: RtcManagerOptions[\"onUserJoined\"];\n  private remoteFirstOutputTimer: ReturnType<typeof setTimeout> | null = null;\n  private onRemoteFirstOutputTimeout: (() => void) | null = null;\n  private localVideoContainer: HTMLElement | null = null;\n  private remoteVideoContainer: HTMLElement | null = null;\n  private activeGenerationId: string | null = null;\n  private expectedRemoteSei: string | null = null;\n  private lastRemoteSei: string | null = null;\n  private lastRemoteSeiUserId: string | null = null;\n  private localVideoFrameRate = DEFAULT_VIDEO_FRAME_RATE;\n  private readonly seiSender: RtcSeiSender;\n  private seiSupport: \"unknown\" | \"supported\" | \"unsupported\" = \"unknown\";\n  private hasLoggedSeiUnsupported = false;\n  private readonly debug: boolean;\n  private lastDebugSeiMatched: boolean | null = null;\n  private lastDebugRemoteSei: string | null = null;\n  private remoteFrameWatchStop: (() => void) | null = null;\n  private uploadPreviewLayoutObserverStop: (() => void) | null = null;\n  private remoteOutputRecoveryCooldownUntil = 0;\n  private readonly i18n: SDKI18n;\n  private readonly renderFit: \"cover\" | \"contain\" | undefined;\n  private readonly playRemoteAudio: boolean;\n  private joinedAtMs = 0;\n  private publishStartedAtMs = 0;\n  private lastRoomStartEventAtMs = 0;\n  private localStreamStatsCount = 0;\n  private firstNonZeroSentFrameRateAtMs = 0;\n  private lastObservedSentFrameRate = 0;\n  private localVideoDegradationPreference: VideoDegradationPreference | null = null;\n  private localOutboundWatch: LocalOutboundWatchState | null = null;\n  private readonly localOutboundReadyWaiters = new Set<LocalOutboundReadyWaiter>();\n  private seiGateFallbackTimer: ReturnType<typeof setTimeout> | null = null;\n  private seiMatchedDelayTimer: ReturnType<typeof setTimeout> | null = null;\n  private lastSentResolution = \"\";\n  private lastReceivedResolution = \"\";\n  private diagnostics?: StartupTrace;\n  private nativeSampler?: RtcSampler;\n  private readonly nativeMetricAt: Record<string, number> = {};\n  private readonly diagnosticSampleAt = { up: Number.NEGATIVE_INFINITY, down: Number.NEGATIVE_INFINITY };\n  private readonly remoteQuality = new RemoteQualityMonitor();\n  private qualityTimer?: ReturnType<typeof setInterval>;\n  private qualityHadFrame = false;\n  private qualityUserId?: string;\n  private qualityWasHidden = false;\n  private readonly onQualityVisibility = () => {\n    this.remoteQuality.suspend(performance.now());\n    this.qualityWasHidden = document.visibilityState === 'hidden';\n  };\n  private diagnosticConnectionChanges = 0;\n  private connectionState?: ConnectionState;\n  private connectionReason?: string;\n  private reconnectStartedAt?: number;\n  private reconnectTimer?: ReturnType<typeof setTimeout>;\n  private connectionRecoveredAt = 0;\n  private connectionInterruptedAtEpoch?: number;\n  private connectionRecoveredAtEpoch?: number;\n  private tearingDown = false;\n  private static readonly SEI_GATE_FALLBACK_MS = 6000;\n  private static readonly SEI_MATCHED_DISPLAY_DELAY_MS = 200;\n\n  constructor(options: RtcManagerOptions = {}) {\n    this.diagnostics = options.diagnostics;\n    this.diagnostics?.setContext({ rtc_sdk_version: VERTC.getSdkVersion?.() });\n    this.renderFit = options.renderFit;\n    this.playRemoteAudio = options.playRemoteAudio === true;\n    this.onLog = options.onLog;\n    this.onStateChange = options.onStateChange;\n    this.onSeiGateChange = options.onSeiGateChange;\n    this.onError = options.onError;\n    this.onRemoteVideoFirstFrame = options.onRemoteVideoFirstFrame;\n    this.onRemoteSeiReceived = options.onRemoteSeiReceived;\n    this.onRemoteOutputStalled = options.onRemoteOutputStalled;\n    this.onRoomEvent = options.onRoomEvent;\n    this.onUserJoined = options.onUserJoined;\n    this.debug = options.debug ?? false;\n    this.i18n = options.i18n ?? createSDKI18n();\n    this.seiSender = new RtcSeiSender({\n      canSend: () => Boolean(\n        this.engine\n        && this.joined\n        && !this.tearingDown\n        && this.isSignalingConnected()\n        && this.localVideoPublished\n        && this.firstNonZeroSentFrameRateAtMs > 0\n        && this.seiSupport === \"supported\"\n      ),\n      send: (message, repeatCount) => {\n        return this.engine?.sendSEIMessage(StreamIndex.STREAM_INDEX_MAIN, message, repeatCount);\n      },\n      onError: (error) => {\n        this.log(\"warn\", this.i18n.t(\"rtc.sendSeiFailed\"), error);\n      },\n    });\n  }\n\n  private isSignalingConnected(): boolean {\n    return this.connectionState === ConnectionState.CONNECTION_STATE_CONNECTED\n      || this.connectionState === ConnectionState.CONNECTION_STATE_RECONNECTED;\n  }\n\n  beginTeardown(): void {\n    this.tearingDown = true;\n    clearTimeout(this.reconnectTimer);\n    this.reconnectTimer = undefined;\n    this.seiSender.stop();\n  }\n\n  /** @internal Read cached connection evidence; never poll RTC or perform I/O here. */\n  getConnectionDiagnostics(): Record<string, string | number | boolean | undefined> {\n    return {\n      connection_state: this.connectionState === undefined ? undefined : ConnectionState[this.connectionState],\n      connection_reason: this.connectionReason,\n      connection_interrupted_at_ms: this.connectionInterruptedAtEpoch,\n      connection_recovered_at_ms: this.connectionRecoveredAtEpoch,\n      connection_recovered: this.connectionInterruptedAtEpoch === undefined ? undefined : this.connectionRecoveredAtEpoch !== undefined,\n      network_online: typeof navigator === 'undefined' ? undefined : navigator.onLine,\n    };\n  }\n\n  private handleConnectionStateChange(event: ConnectionStateChangeEvent): void {\n    const now = performance.now();\n    const previous = this.connectionState;\n    this.connectionState = event.state;\n    if (!this.tearingDown && this.joined && !this.isSignalingConnected() && this.reconnectStartedAt === undefined) {\n      this.connectionReason = undefined;\n      this.connectionInterruptedAtEpoch = Date.now();\n      this.connectionRecoveredAtEpoch = undefined;\n    }\n    if (event.reason !== undefined) this.connectionReason = String(event.reason);\n    const params = {\n      state: String(event.state), state_name: ConnectionState[event.state],\n      previous_state: previous === undefined ? undefined : String(previous),\n      reason: event.reason === undefined ? undefined : String(event.reason),\n      last_disconnect_reason: this.connectionReason,\n      reconnect_elapsed_ms: this.reconnectStartedAt === undefined ? undefined : Math.round(now - this.reconnectStartedAt),\n      during_teardown: this.tearingDown,\n    };\n    this.diagnostics?.record('sdk_rtc_connection_state_change', params);\n    this.diagnostics?.updateStats({ connection_changes: ++this.diagnosticConnectionChanges,\n      connection_state: params.state, connection_state_name: params.state_name,\n      connection_reason: this.connectionReason });\n    if (this.tearingDown) return;\n    if (this.isSignalingConnected()) {\n      const recovering = this.reconnectStartedAt !== undefined;\n      clearTimeout(this.reconnectTimer);\n      this.reconnectTimer = undefined;\n      this.reconnectStartedAt = undefined;\n      if (recovering) {\n        this.connectionRecoveredAt = now;\n        this.connectionRecoveredAtEpoch = Date.now();\n        this.remoteQuality.reset();\n        const watch = this.localOutboundWatch;\n        if (watch) { watch.consecutiveZeroStats = 0; watch.lastPositiveAtMs = now; watch.graceUntilMs = now + watch.minStallMs; }\n        this.nativeSampler?.stop();\n        this.nativeSampler = undefined;\n        this.startNativeSampler();\n        if (this.seiSender.configured) this.seiSender.start();\n      }\n      return;\n    }\n    this.seiSender.stop();\n    if (!this.joined || this.reconnectStartedAt !== undefined) return;\n    this.reconnectStartedAt = now;\n    this.remoteQuality.reset();\n    this.reconnectTimer = setTimeout(() => {\n      this.reconnectTimer = undefined;\n      if (this.tearingDown || this.isSignalingConnected()) return;\n      this.onRemoteOutputStalled?.({\n        userId: this.remoteVideoUserId ?? this.qualityUserId ?? '',\n        reason: 'rtc_reconnect_timeout', stallMs: Math.round(performance.now() - now),\n        diagnostics: { detection_source: 'rtc_connection', connection_state: String(this.connectionState),\n          connection_reason: this.connectionReason, reconnect_timeout_ms: RTC_RECONNECT_TIMEOUT_MS },\n      });\n    }, RTC_RECONNECT_TIMEOUT_MS);\n  }\n\n  private async teardownOperation<T>(stage: string, operation: () => T | Promise<T>): Promise<T> {\n    const start = performance.now();\n    this.diagnostics?.record('sdk_rtc_teardown', { operation: stage, outcome: 'started' });\n    try {\n      const result = await withRtcTeardownTimeout(operation, stage);\n      this.diagnostics?.record('sdk_rtc_teardown', { operation: stage, outcome: 'success', duration_ms: Math.round(performance.now() - start) });\n      return result;\n    } catch (error) {\n      this.diagnostics?.record('sdk_rtc_teardown', { operation: stage, outcome: 'error',\n        duration_ms: Math.round(performance.now() - start),\n        error_name: error instanceof Error ? error.name : 'UnknownError',\n        error_code: String((error as { code?: unknown })?.code ?? 'WEB_RTC_ERROR'),\n        connection_state: String(this.connectionState), connection_reason: this.connectionReason });\n      throw error;\n    }\n  }\n\n  /** @internal Allows an explicit manual start to have its own startup trace. */\n  setDiagnostics(trace?: StartupTrace): void {\n    this.diagnostics = trace;\n  }\n\n  private startNativeSampler(): void {\n    try {\n      const pc = this.engine?.peerConnection;\n      if (!this.joined || this.leaveTask || !pc?.getStats || this.nativeSampler || !this.diagnostics) return;\n      this.nativeSampler = new RtcSampler(pc, () => this.diagnostics?.rtcStatsEnabled === true, sample => {\n        const now = performance.now();\n        Object.keys(sample).forEach(key => { this.nativeMetricAt[key] = now });\n        const at = this.diagnostics?.offset();\n        this.diagnostics?.updateStats({\n          ...sample,\n          sampling_source: 'native_get_stats',\n          ...(sample.up_fps !== undefined || sample.up_bitrate_kbps !== undefined ? { up_stats_at_ms: at } : {}),\n          ...(sample.down_decode_fps !== undefined || sample.down_bitrate_kbps !== undefined ? { down_stats_at_ms: at } : {}),\n        });\n        this.diagnostics?.recordRtcStats(sample);\n        if (this.qualityHadFrame && this.qualityUserId && (sample.down_bitrate_kbps !== undefined || sample.down_decode_fps !== undefined)) {\n          this.remoteQuality.sample(this.qualityUserId, {\n            receivedKBitrate: sample.down_bitrate_kbps,\n            decoderOutputFrameRate: sample.down_decode_fps,\n            receivedFrameRate: sample.down_receive_fps,\n          }, performance.now());\n        }\n      });\n    } catch { /* Native stats are optional on older RTC/browser implementations. */ }\n  }\n\n  stopRemoteQualityWatch(): void {\n    clearInterval(this.qualityTimer);\n    this.qualityTimer = undefined;\n    this.qualityHadFrame = false;\n    this.qualityUserId = undefined;\n    this.remoteQuality.reset();\n    if (typeof document !== 'undefined') document.removeEventListener?.('visibilitychange', this.onQualityVisibility);\n  }\n\n  private startRemoteQualityWatch(): void {\n    this.stopRemoteQualityWatch();\n    this.qualityWasHidden = typeof document !== 'undefined' && document.visibilityState === 'hidden';\n    if (typeof document !== 'undefined') document.addEventListener?.('visibilitychange', this.onQualityVisibility);\n    this.qualityTimer = setInterval(() => {\n      const now = performance.now();\n      const hidden = typeof document !== 'undefined' && document.visibilityState === 'hidden';\n      if (hidden || this.qualityWasHidden || this.reconnectStartedAt !== undefined) {\n        this.remoteQuality.suspend(now);\n        this.qualityWasHidden = hidden;\n        return;\n      }\n      if (!this.qualityHadFrame) return;\n      const info = this.remoteQuality.check(now);\n      if (info?.reason === 'remote_stats_timeout') {\n        this.diagnostics?.record('sdk_rtc_remote_state_change', {\n          state: 'stats_timeout', remote_user_id: info.userId, stall_ms: info.stallMs, ...info.diagnostics,\n        });\n      } else if (info) this.onRemoteOutputStalled?.(info);\n    }, 3000);\n  }\n\n  private recordRemoteState(userId: string, state: 'published' | 'unpublished' | 'left', mediaType?: number, rtcReason?: number): void {\n    if (!this.isRemoteSeiUser(userId) && this.qualityUserId !== userId) return;\n    this.diagnostics?.record('sdk_rtc_remote_state_change', { remote_user_id: userId, state, media_type: mediaType, rtc_reason_code: rtcReason });\n    if (state !== 'published' && this.qualityHadFrame && this.qualityUserId === userId) {\n      this.remoteQuality.missing(userId, state === 'left' ? 'remote_user_left' : 'remote_unpublished', performance.now(), rtcReason);\n    }\n  }\n\n  private recordDiagnosticStats(direction: 'up' | 'down', stats: unknown, audioStats?: unknown): void {\n    try { this.recordDiagnosticStatsInternal(direction, stats) } catch { /* Probe errors must not escape the RTC callback. */ }\n  }\n\n  private recordDiagnosticStatsInternal(direction: 'up' | 'down', stats: unknown): void {\n    this.startNativeSampler();\n    if (!this.diagnostics || this.diagnostics.done || !stats || typeof stats !== 'object') return;\n    const now = performance.now();\n    if (now - this.diagnosticSampleAt[direction] < 250) return;\n    this.diagnosticSampleAt[direction] = now;\n    const value = stats as Record<string, unknown>;\n    const fields = direction === 'up'\n      ? { sentFrameRate: 'up_fps', sentKBitrate: 'up_bitrate_kbps', videoLossRate: 'up_loss_rate', rtt: 'up_rtt_ms' }\n      : { receivedKBitrate: 'down_bitrate_kbps', receivedFrameRate: 'down_receive_fps', decoderOutputFrameRate: 'down_decode_fps', rendererOutputFrameRate: 'down_render_fps', videoLossRate: 'down_loss_rate', rtt: 'down_rtt_ms' };\n    const sample: Record<string, number | boolean> = { [`${direction}_stats_available`]: true };\n    for (const [source, target] of Object.entries(fields)) {\n      const metric = value[source];\n      if (typeof metric === 'number' && Number.isFinite(metric)) sample[target] = metric;\n    }\n    sample[`${direction}_stats_at_ms`] = Math.round(performance.now() - this.diagnostics.startedAt);\n    this.diagnostics.updateStats(sample);\n    const metricValues: Record<string, number> = {};\n    for (const target of Object.values(fields)) {\n      const metric = sample[target];\n      if (typeof metric === 'number') metricValues[target] = metric;\n    }\n    if (typeof sample.jitter_ms === 'number') metricValues.jitter_ms = sample.jitter_ms;\n    let nativeFresh = false;\n    Object.keys(metricValues).forEach(key => {\n      if (now - (this.nativeMetricAt[key] ?? Number.NEGATIVE_INFINITY) < 2000) {\n        delete metricValues[key];\n        nativeFresh = true;\n      }\n    });\n    this.diagnostics.updateStats({ sampling_source: nativeFresh ? 'native_get_stats' : 'rtc_callback' });\n    this.diagnostics.recordRtcStats(metricValues, direction === 'down' ? {\n      count: typeof value.stallCount === 'number' ? value.stallCount : undefined,\n      durationMs: typeof value.stallDuration === 'number' ? value.stallDuration : undefined,\n    } : undefined);\n    if (direction === 'up' && (Number(sample.up_fps) > 0 || Number(sample.up_bitrate_kbps) > 0)) this.diagnostics.mark('outbound_started');\n    if (direction === 'down' && Number(sample.down_bitrate_kbps) > 0) this.diagnostics.mark('inbound_started');\n  }\n\n  private emitSeiGateState(): void {\n    const matched = this.isSeiMatched();\n    this.onSeiGateChange?.({\n      expectedSei: this.expectedRemoteSei,\n      sei: this.lastRemoteSei,\n      userId: this.lastRemoteSeiUserId,\n      matched,\n    });\n  }\n\n  setOnError(handler: RtcManagerOptions[\"onError\"]): void {\n    this.onError = handler;\n  }\n\n  setOnRemoteOutputStalled(\n    handler: RtcManagerOptions[\"onRemoteOutputStalled\"],\n  ): void {\n    this.onRemoteOutputStalled = handler;\n  }\n\n  setOnRemoteVideoFirstFrame(\n    handler: RtcManagerOptions[\"onRemoteVideoFirstFrame\"],\n  ): void {\n    this.onRemoteVideoFirstFrame = handler;\n  }\n\n  private emitRemoteVideoFirstFrame(info: {\n    userId: string;\n    width: number;\n    height: number;\n  }, source = 'rtc_callback'): void {\n    if (this.qualityTimer !== undefined) this.remoteQuality.presented(performance.now());\n    if (this.qualityTimer !== undefined && !this.qualityHadFrame) {\n      this.qualityHadFrame = true;\n      this.qualityUserId = info.userId;\n      this.remoteQuality.sample(info.userId, {}, performance.now());\n    }\n    if (!this.diagnostics?.done) {\n      this.diagnostics?.updateStats({ first_frame_source: source, sei_matched_at_frame: this.isSeiMatched() });\n    }\n    this.clearRemoteFirstOutputWatch();\n    this.onRemoteVideoFirstFrame?.(info);\n  }\n\n  /**\n   * Arm first-output deadline immediately after the RTC `start` event is sent.\n   */\n  armRemoteFirstOutputWatch(options: {\n    timeoutMs?: number;\n    onTimeout: () => void;\n  }): void {\n    this.clearRemoteFirstOutputWatch();\n    const timeoutMs = options.timeoutMs ?? REMOTE_FIRST_OUTPUT_TIMEOUT_MS;\n    const armedAt = performance.now();\n    if (this.qualityTimer === undefined) this.startRemoteQualityWatch();\n    this.onRemoteFirstOutputTimeout = options.onTimeout;\n    const check = () => {\n      if (this.reconnectStartedAt !== undefined) {\n        this.remoteFirstOutputTimer = setTimeout(check, 3000);\n        return;\n      }\n      const remainingMs = Math.max(armedAt, this.connectionRecoveredAt) + timeoutMs - performance.now();\n      if (remainingMs > 0) {\n        this.remoteFirstOutputTimer = setTimeout(check, remainingMs);\n        return;\n      }\n      this.remoteFirstOutputTimer = null;\n      const cb = this.onRemoteFirstOutputTimeout;\n      this.onRemoteFirstOutputTimeout = null;\n      cb?.();\n    };\n    this.remoteFirstOutputTimer = setTimeout(check, timeoutMs);\n  }\n\n  clearRemoteFirstOutputWatch(): void {\n    if (this.remoteFirstOutputTimer !== null) {\n      clearTimeout(this.remoteFirstOutputTimer);\n      this.remoteFirstOutputTimer = null;\n    }\n    this.onRemoteFirstOutputTimeout = null;\n  }\n\n  /**\n   * Last-chance synchronous verification for a missed vendor/browser frame event.\n   * Reading media readiness is non-blocking and does not force layout.\n   */\n  confirmRemoteVideoFirstFrame(): boolean {\n    const userId = this.remoteVideoUserId;\n    const container = this.remoteVideoContainer;\n    if (!userId || !container) {\n      return false;\n    }\n    const video = container instanceof HTMLVideoElement\n      ? container\n      : container.querySelector(\"video\");\n    if (!video || video.readyState < 2 || video.videoWidth <= 0 || video.videoHeight <= 0) {\n      return false;\n    }\n    this.emitRemoteVideoFirstFrame({\n      userId,\n      width: video.videoWidth,\n      height: video.videoHeight,\n    }, 'ready_state_fallback');\n    return true;\n  }\n\n  /**\n   * Passively watch RTC outbound stats after start. It never touches the source track,\n   * canvas, or encoder; only sustained zero fps (or an ended track) triggers failure.\n   */\n  armLocalOutboundWatch(options: {\n    onStalled: (info: LocalOutboundStallInfo) => void;\n    minZeroSamples?: number;\n    minStallMs?: number;\n    startGraceMs?: number;\n    resumeGraceMs?: number;\n  }): void {\n    this.clearLocalOutboundWatch();\n\n    const nowMs = performance.now();\n    const track = this.externalVideoTrack\n      ?? this.engine?.getLocalStreamTrack(StreamIndex.STREAM_INDEX_MAIN, \"video\")\n      ?? null;\n\n    const state: LocalOutboundWatchState = {\n      onStalled: options.onStalled,\n      minZeroSamples: options.minZeroSamples ?? 3,\n      minStallMs: options.minStallMs ?? 6000,\n      resumeGraceMs: options.resumeGraceMs ?? 5000,\n      consecutiveZeroStats: 0,\n      lastPositiveAtMs: nowMs,\n      graceUntilMs: nowMs + (options.startGraceMs ?? 6000),\n      triggered: false,\n      track,\n      onTrackEnded: () => {\n        this.triggerLocalOutboundStall(\"track-ended\");\n      },\n      onTrackMute: () => {\n        const watch = this.localOutboundWatch;\n        if (!watch || watch.triggered) {\n          return;\n        }\n        if (watch.muteTimer !== null) {\n          clearTimeout(watch.muteTimer);\n        }\n        watch.muteTimer = setTimeout(() => {\n          watch.muteTimer = null;\n          if (!this.localOutboundWatch || this.localOutboundWatch !== watch || watch.triggered) {\n            return;\n          }\n          // Ignore temporary mute while tab is backgrounded.\n          if (typeof document !== \"undefined\" && document.visibilityState === \"hidden\") {\n            return;\n          }\n          this.triggerLocalOutboundStall(\"track-muted\");\n        }, watch.muteTriggerMs);\n      },\n      onTrackUnmute: () => {\n        const watch = this.localOutboundWatch;\n        if (!watch) {\n          return;\n        }\n        if (watch.muteTimer !== null) {\n          clearTimeout(watch.muteTimer);\n          watch.muteTimer = null;\n        }\n        watch.consecutiveZeroStats = 0;\n        watch.lastPositiveAtMs = performance.now();\n        watch.graceUntilMs = performance.now() + watch.resumeGraceMs;\n      },\n      onVisibilityChange: () => {\n        const watch = this.localOutboundWatch;\n        if (!watch) {\n          return;\n        }\n        watch.consecutiveZeroStats = 0;\n        watch.lastPositiveAtMs = performance.now();\n        watch.graceUntilMs = document.visibilityState === \"hidden\"\n          ? Number.POSITIVE_INFINITY\n          : performance.now() + watch.resumeGraceMs;\n      },\n      muteTimer: null,\n      muteTriggerMs: 1500,\n    };\n\n    this.localOutboundWatch = state;\n    track?.addEventListener(\"ended\", state.onTrackEnded);\n    track?.addEventListener(\"mute\", state.onTrackMute);\n    track?.addEventListener(\"unmute\", state.onTrackUnmute);\n    if (typeof document !== \"undefined\") {\n      document.addEventListener(\"visibilitychange\", state.onVisibilityChange);\n      if (document.visibilityState === \"hidden\") {\n        state.graceUntilMs = Number.POSITIVE_INFINITY;\n      }\n    }\n\n    if (track?.readyState === \"ended\") {\n      queueMicrotask(() => this.triggerLocalOutboundStall(\"track-ended\"));\n    }\n  }\n\n  clearLocalOutboundWatch(): void {\n    const state = this.localOutboundWatch;\n    if (!state) {\n      return;\n    }\n    if (state.muteTimer !== null) {\n      clearTimeout(state.muteTimer);\n      state.muteTimer = null;\n    }\n    state.track?.removeEventListener(\"ended\", state.onTrackEnded);\n    state.track?.removeEventListener(\"mute\", state.onTrackMute);\n    state.track?.removeEventListener(\"unmute\", state.onTrackUnmute);\n    if (typeof document !== \"undefined\") {\n      document.removeEventListener(\"visibilitychange\", state.onVisibilityChange);\n    }\n    this.localOutboundWatch = null;\n  }\n\n  setPreserveRemoteDom(preserve: boolean): void {\n    this.preserveRemoteDom = preserve;\n  }\n\n  setOnRemotePlayerMounted(callback: RtcManagerOptions[\"onRemotePlayerMounted\"]): void {\n    this.onRemotePlayerMounted = callback;\n  }\n\n  setOnRoomEvent(callback: RtcManagerOptions[\"onRoomEvent\"]): void {\n    this.onRoomEvent = callback;\n  }\n\n  setOnUserJoined(callback: RtcManagerOptions[\"onUserJoined\"]): void {\n    this.onUserJoined = callback;\n  }\n\n  setLocalVideoContainer(container: HTMLElement | null): void {\n    const previous = this.localVideoContainer;\n    const changed = previous !== container;\n    this.localVideoContainer = container;\n    if (previous && changed) {\n      previous.replaceChildren();\n    }\n    if (container && changed) {\n      container.replaceChildren();\n    }\n    if (container && this.localVideoPublished && this.engine) {\n      this.bindLocalVideoPlayer();\n    }\n  }\n\n  setRemoteVideoContainer(container: HTMLElement | null): void {\n    const previous = this.remoteVideoContainer;\n    if (previous === container) {\n      if (\n        this.debug &&\n        container &&\n        container.childElementCount === 0 &&\n        (this.remoteVideoUserId || this.pendingRemoteVideoUserId)\n      ) {\n        this.debugLog(\"setRemoteVideoContainer skipped but container empty\", {\n          remoteVideoUserId: this.remoteVideoUserId,\n          pendingRemoteVideoUserId: this.pendingRemoteVideoUserId,\n        });\n      }\n      return;\n    }\n\n    this.remoteVideoContainer = container;\n    this.debugLog(\"setRemoteVideoContainer\", {\n      hadPrevious: !!previous,\n      next: !!container,\n      remoteVideoUserId: this.remoteVideoUserId,\n      pendingRemoteVideoUserId: this.pendingRemoteVideoUserId,\n    });\n    if (previous) {\n      previous.replaceChildren();\n    }\n    if (container && this.engine && this.joined && (this.remoteVideoUserId || this.pendingRemoteVideoUserId)) {\n      this.refreshRemoteVideoBindingBestEffort();\n    }\n  }\n\n  /** Tag every local encoded frame with the task id and gate display on matching remote SEI. */\n  configureSessionSei(sessionId: string | null, options: RtcSessionSeiOptions = {}): void {\n    const nextGeneration = sessionId?.trim() || null\n    if (!nextGeneration) this.stopRemoteQualityWatch()\n    else if (nextGeneration !== this.activeGenerationId) this.startRemoteQualityWatch()\n    this.activeGenerationId = sessionId?.trim() || null\n    const normalizedSessionId = normalizeSei(sessionId)\n    const previousExpectedRemoteSei = this.expectedRemoteSei\n\n    this.seiSender.configure(normalizedSessionId, options, this.localVideoFrameRate)\n    this.clearSeiGateFallbackTimer()\n    this.clearSeiMatchedDelayTimer()\n    this.expectedRemoteSei = this.seiSupport === \"unsupported\" ? null : normalizedSessionId\n    this.lastRemoteSei = null\n    this.lastRemoteSeiUserId = null\n\n    if (\n      previousExpectedRemoteSei !== this.expectedRemoteSei &&\n      this.remoteVideoUserId &&\n      !this.preserveRemoteDom\n    ) {\n      this.pendingRemoteVideoUserId = this.remoteVideoUserId\n      this.remoteVideoUserId = null\n    }\n\n    this.emitSeiGateState()\n    if (previousExpectedRemoteSei !== this.expectedRemoteSei && !this.preserveRemoteDom) {\n      this.clearContainer(this.remoteVideoContainer)\n    }\n\n    this.scheduleSeiGateFallback(normalizedSessionId)\n\n    if (!normalizedSessionId) {\n      return\n    }\n\n    this.ensureSeiSupport()\n    if (this.seiSupport === \"supported\") {\n      this.seiSender.start()\n    }\n  }\n\n  private clearSeiGateFallbackTimer(): void {\n    if (this.seiGateFallbackTimer !== null) {\n      clearTimeout(this.seiGateFallbackTimer)\n      this.seiGateFallbackTimer = null\n    }\n  }\n\n  private clearSeiMatchedDelayTimer(): void {\n    if (this.seiMatchedDelayTimer !== null) {\n      clearTimeout(this.seiMatchedDelayTimer)\n      this.seiMatchedDelayTimer = null\n    }\n  }\n\n  /** Mark SEI matched if remote SEI never arrives — display gate only; RTC bind is not blocked. */\n  private scheduleSeiGateFallback(expectedSei: string | null): void {\n    this.clearSeiGateFallbackTimer()\n    if (!expectedSei) {\n      return\n    }\n\n    this.seiGateFallbackTimer = setTimeout(() => {\n      this.seiGateFallbackTimer = null\n      if (this.expectedRemoteSei !== expectedSei || this.isSeiMatched()) {\n        return\n      }\n      this.log(\"warn\", this.i18n.t(\"rtc.seiGateFallback\"), { expectedSei })\n      this.diagnostics?.updateStats({ sei_fallback: true });\n      this.expectedRemoteSei = null\n      this.emitSeiGateState()\n      this.refreshRemoteVideoBindingBestEffort({ force: true })\n    }, RtcManager.SEI_GATE_FALLBACK_MS)\n  }\n\n  get snapshot(): RtcStateSnapshot {\n    return {\n      roomId: this.currentJoinInfo?.roomId ?? null,\n      userId: this.currentJoinInfo?.userId ?? null,\n      appId: this.currentJoinInfo?.appId ?? null,\n      botUserId: this.currentJoinInfo?.botName ?? null,\n      joined: this.joined,\n      localVideoPublished: this.localVideoPublished,\n      remoteVideoUserId: this.remoteVideoUserId,\n      users: Array.from(this.users),\n    };\n  }\n\n  getLocalVideoSize(): { width: number; height: number } | null {\n    if (!this.engine || !this.joined) {\n      return null;\n    }\n\n    const track = this.engine.getLocalStreamTrack(StreamIndex.STREAM_INDEX_MAIN, \"video\");\n    if (!track) {\n      return null;\n    }\n\n    const settings = track.getSettings?.();\n    const width = typeof settings?.width === \"number\" ? settings.width : 0;\n    const height = typeof settings?.height === \"number\" ? settings.height : 0;\n\n    if (!width || !height) {\n      return null;\n    }\n\n    return { width, height };\n  }\n\n  getInternalVideoTrack(): MediaStreamTrack | null {\n    if (!this.engine || !this.internalVideoCaptureStarted) {\n      return null;\n    }\n    return this.engine.getLocalStreamTrack(StreamIndex.STREAM_INDEX_MAIN, \"video\") ?? null;\n  }\n\n  async prepareEngine(joinInfo: RtcJoinInfo): Promise<void> {\n    await this.leave();\n    this.tearingDown = false;\n    this.connectionState = undefined;\n    this.connectionReason = undefined;\n    this.reconnectStartedAt = undefined;\n    this.connectionRecoveredAt = 0;\n    this.connectionInterruptedAtEpoch = undefined;\n    this.connectionRecoveredAtEpoch = undefined;\n    this.currentJoinInfo = joinInfo;\n    this.users.clear();\n    this.users.add(joinInfo.userId);\n    this.localVideoPublished = false;\n    this.localAudioPublished = false;\n    this.internalVideoCaptureStarted = false;\n    this.internalAudioCaptureStarted = false;\n    this.localVideoDegradationPreference = null;\n    this.remoteVideoUserId = null;\n    this.pendingRemoteVideoUserId = null;\n    this.pendingRemoteVideoMediaType = MediaType.VIDEO;\n    this.lastRemoteSei = null;\n    this.lastRemoteSeiUserId = null;\n    this.clearVideoContainers();\n\n    const createEngineStartedAt = performance.now();\n    const engine = VERTC.createEngine(joinInfo.appId);\n    this.engine = engine;\n    this.bindEngineEvents(engine);\n    this.logTiming(\"创建并绑定 RTC Engine\", createEngineStartedAt, {\n      appId: joinInfo.appId,\n    });\n  }\n\n  async joinPreparedRoom(): Promise<void> {\n    const engine = this.engine;\n    const joinInfo = this.currentJoinInfo;\n    if (!engine || !joinInfo) {\n      throw new XmaxSdkError(\"SESSION_ERROR\", this.i18n.t(\"errors.rtcNotJoined\"));\n    }\n    if (this.joined) {\n      this.log(\"info\", this.i18n.t(\"rtc.alreadyInRoom\"), joinInfo);\n      return;\n    }\n\n    this.log(\"info\", this.i18n.t(\"rtc.joiningRoom\"), joinInfo);\n\n    const joinRoomStartedAt = performance.now();\n    this.diagnostics?.record('sdk_rtc_join_request', { room_id: joinInfo.roomId });\n    try {\n      await engine.joinRoom(\n        joinInfo.token,\n        joinInfo.roomId,\n        {\n          userId: joinInfo.userId,\n        },\n        {\n          isAutoPublish: false,\n          isAutoSubscribeAudio: false,\n          isAutoSubscribeVideo: true,\n          roomProfileType: RoomProfileType.communication,\n        },\n      );\n    } catch (error) {\n      this.diagnostics?.record('sdk_rtc_join_response', {\n        ok: false,\n        room_id: joinInfo.roomId,\n        duration_ms: Math.round(performance.now() - joinRoomStartedAt),\n        error_code: 'WEB_RTC_ERROR',\n      });\n      throw normalizeRtcError(error, \"WEB_RTC_ERROR\", \"Failed to join RTC room\");\n    }\n    this.diagnostics?.record('sdk_rtc_join_response', {\n      ok: true,\n      room_id: joinInfo.roomId,\n      duration_ms: Math.round(performance.now() - joinRoomStartedAt),\n    });\n    this.logTiming(\"joinRoom\", joinRoomStartedAt, { roomId: joinInfo.roomId });\n\n    this.joined = true;\n    this.startNativeSampler();\n    this.joinedAtMs = performance.now();\n    this.ensureSeiSupport();\n    this.emitState();\n    this.log(\"success\", this.i18n.t(\"rtc.joinSuccess\"), this.snapshot);\n    this.log(\"info\", this.i18n.t(\"rtc.roomUsers\", { users: this.snapshot.users.join(\", \") }), this.snapshot.users);\n  }\n\n  async join(joinInfo: RtcJoinInfo): Promise<void> {\n    if (this.currentJoinInfo?.roomId === joinInfo.roomId && this.joined) {\n      this.log(\"info\", this.i18n.t(\"rtc.alreadyInRoom\"), joinInfo);\n      return;\n    }\n\n    await this.prepareEngine(joinInfo);\n    await this.joinPreparedRoom();\n  }\n\n  async startInternalVideoCapture(options?: {\n    encoderSize?: VideoSize;\n    encoderFps?: number;\n    encoderMaxKbps?: number;\n    encoderContentHint?: VideoContentHint;\n    facingMode?: 'user' | 'environment';\n  }): Promise<MediaTrackSettings> {\n    if (!this.engine || !this.currentJoinInfo) {\n      throw new XmaxSdkError(\"SESSION_ERROR\", this.i18n.t(\"errors.rtcNotJoined\"));\n    }\n\n    this.localVideoFrameRate = options?.encoderFps ?? DEFAULT_VIDEO_FRAME_RATE;\n\n    if (options?.facingMode) {\n      const captureDeviceStartedAt = performance.now();\n      try {\n        await this.engine.setVideoCaptureDevice(options.facingMode);\n      } catch (error) {\n        throw normalizeRtcError(error, \"CAMERA_ERROR\", \"Failed to select camera device\");\n      }\n      this.logTiming(\"setVideoCaptureDevice\", captureDeviceStartedAt, {\n        facingMode: options.facingMode,\n      });\n    }\n\n    if (options?.encoderSize) {\n      const encoderFrameRate = options.encoderFps ?? DEFAULT_VIDEO_FRAME_RATE;\n      const encoderConfigStartedAt = performance.now();\n      await this.applyVideoEncoderPreference(options.encoderSize, {\n        highQuality: true,\n        fps: encoderFrameRate,\n        maxKbps: options.encoderMaxKbps,\n        contentHint: options.encoderContentHint,\n      });\n      this.logTiming(\"setVideoEncoderConfig\", encoderConfigStartedAt, {\n        width: options.encoderSize[0],\n        height: options.encoderSize[1],\n        frameRate: encoderFrameRate,\n      });\n    }\n\n    if (this.internalVideoCaptureStarted) {\n      return this.engine\n        .getLocalStreamTrack(StreamIndex.STREAM_INDEX_MAIN, \"video\")\n        ?.getSettings?.() ?? {};\n    }\n\n    this.bindLocalVideoPlayer();\n    await this.switchToInternalVideoSource();\n    const captureStartedAt = performance.now();\n    let captureSettings: MediaTrackSettings | void;\n    try {\n      captureSettings = await this.engine.startVideoCapture();\n    } catch (error) {\n      throw normalizeRtcError(error, \"CAMERA_ERROR\", \"Failed to start camera capture\");\n    }\n    this.internalVideoCaptureStarted = true;\n    this.logTiming(\"startVideoCapture\", captureStartedAt, { captureSettings });\n    return captureSettings ?? {};\n  }\n\n  async publishInternalVideo(): Promise<MediaStreamTrack> {\n    if (!this.engine || !this.currentJoinInfo || !this.joined) {\n      throw new XmaxSdkError(\"SESSION_ERROR\", this.i18n.t(\"errors.rtcNotJoined\"));\n    }\n    if (!this.internalVideoCaptureStarted) {\n      throw new XmaxSdkError(\"MEDIA_PROCESSING_ERROR\", this.i18n.t(\"errors.videoTrackMissing\"));\n    }\n\n    if (this.localVideoPublished) {\n      this.log(\"info\", this.i18n.t(\"rtc.localVideoAlreadyPublished\"));\n      const existingTrack = this.engine.getLocalStreamTrack(StreamIndex.STREAM_INDEX_MAIN, \"video\");\n      if (!existingTrack) {\n        throw new XmaxSdkError(\"MEDIA_PROCESSING_ERROR\", this.i18n.t(\"errors.videoTrackMissing\"));\n      }\n      return existingTrack;\n    }\n\n    const publishWithAudio = this.internalAudioCaptureStarted;\n    const mediaType = publishWithAudio\n      ? MediaType.AUDIO_AND_VIDEO\n      : MediaType.VIDEO;\n    const publishStreamStartedAt = performance.now();\n    try {\n      await this.engine.publishStream(mediaType);\n    } catch (error) {\n      if (!publishWithAudio) {\n        throw normalizeRtcError(error, \"WEB_RTC_ERROR\", \"Failed to publish RTC stream\");\n      }\n      // Some mobile browsers can start mic capture but fail A/V publish.\n      // Retry with video-only so camera flow continues.\n      this.log(\"warn\", \"[RTC Diagnose] internal A/V publish failed; fallback to video-only\", error);\n      const maybeStopAudioCapture = (this.engine as unknown as { stopAudioCapture?: () => Promise<void> | void })\n        .stopAudioCapture;\n      if (typeof maybeStopAudioCapture === \"function\") {\n        try {\n          await maybeStopAudioCapture.call(this.engine);\n        } catch {\n        }\n      }\n      this.internalAudioCaptureStarted = false;\n      await this.switchToInternalAudioSource();\n      try {\n        await this.engine.publishStream(MediaType.VIDEO);\n      } catch (fallbackError) {\n        throw normalizeRtcError(fallbackError, \"WEB_RTC_ERROR\", \"Failed to publish RTC video stream\");\n      }\n    }\n    this.logTiming(\"publishStream\", publishStreamStartedAt);\n    const publishStartedAtMs = performance.now();\n\n    const track = this.engine.getLocalStreamTrack(StreamIndex.STREAM_INDEX_MAIN, \"video\");\n    if (!track) {\n      throw new XmaxSdkError(\"MEDIA_PROCESSING_ERROR\", this.i18n.t(\"errors.videoTrackMissing\"));\n    }\n    await this.applyLocalVideoDegradationPreference(track);\n    this.localVideoPublished = true;\n    this.localAudioPublished = this.internalAudioCaptureStarted;\n    this.publishStartedAtMs = publishStartedAtMs;\n    this.localStreamStatsCount = 0;\n    this.firstNonZeroSentFrameRateAtMs = 0;\n    this.lastObservedSentFrameRate = 0;\n    this.ensureSeiSupport();\n    this.emitState();\n    this.diagnostics?.record('sdk_rtc_publish_local_track', {\n      track_kind: 'video',\n      publish_duration_ms: Math.round(performance.now() - publishStreamStartedAt),\n    });\n    this.log(\"success\", this.i18n.t(\"rtc.localVideoPublished\"));\n    return track;\n  }\n\n  async startInternalAudioCapture(): Promise<void> {\n    if (!this.engine || !this.currentJoinInfo) {\n      throw new XmaxSdkError(\"SESSION_ERROR\", this.i18n.t(\"errors.rtcNotJoined\"));\n    }\n    if (this.internalAudioCaptureStarted) {\n      return;\n    }\n    const maybeStartAudioCapture = (this.engine as unknown as { startAudioCapture?: () => Promise<void> | void })\n      .startAudioCapture;\n    if (typeof maybeStartAudioCapture !== \"function\") {\n      this.log(\"warn\", \"[Xmax][RTC] startAudioCapture API is unavailable\");\n      return;\n    }\n    try {\n      await maybeStartAudioCapture.call(this.engine);\n      this.internalAudioCaptureStarted = true;\n    } catch (error) {\n      // Browser/WebView mic capture mismatch should not block camera video flow.\n      this.internalAudioCaptureStarted = false;\n      this.log(\"warn\", \"[RTC Diagnose] startAudioCapture failed; fallback to video-only\", error);\n    }\n  }\n\n  async startExternalVideoPublishing(\n    track: MediaStreamTrack,\n    encoderSize: VideoSize,\n    publishOptions: RtcVideoEncoderPreferenceOptions,\n    deadlines?: ExternalVideoPublishDeadlines,\n  ): Promise<void> {\n    if (!this.engine || !this.currentJoinInfo || !this.joined) {\n      throw new XmaxSdkError(\"SESSION_ERROR\", this.i18n.t(\"errors.rtcNotJoined\"));\n    }\n\n    if (this.localVideoPublished) {\n      this.log(\"info\", this.i18n.t(\"rtc.localVideoAlreadyPublished\"));\n      return;\n    }\n\n    const publishStartedAtMs = performance.now();\n    const requestedAudioTrack = publishOptions.audioTrack;\n    this.log(\"info\", \"[Xmax][RTC] external publish tracks\", {\n      hasVideoTrack: true,\n      hasAudioTrack: Boolean(requestedAudioTrack),\n      audioReadyState: requestedAudioTrack?.readyState ?? null,\n    });\n\n    const encoderOptions = publishOptions.highQuality !== false\n      ? {\n          ...publishOptions,\n          highQuality: true,\n          fps: publishOptions.fps ?? resolvePlaybackDrivenEncoderFps(track),\n        }\n      : publishOptions;\n    this.localVideoFrameRate = encoderOptions.fps ?? DEFAULT_VIDEO_FRAME_RATE;\n\n    this.bindLocalVideoPlayer();\n    await this.runExternalPublishStage(\n      () => this.switchToExternalVideoSource(track),\n      deadlines,\n      deadlines?.externalSourceMs,\n      \"external_video_source\",\n    );\n    let audioTrack: MediaStreamTrack | undefined = requestedAudioTrack;\n    if (audioTrack) {\n      try {\n        await this.switchToExternalAudioSource(audioTrack);\n      } catch (error) {\n        // Some mobile browsers/WebViews reject external audio source wiring for media files.\n        // Fallback to video-only publish so upload inputs remain usable.\n        audioTrack = undefined;\n        this.externalAudioTrack = null;\n        await this.switchToInternalAudioSource();\n      }\n    }\n    await this.runExternalPublishStage(\n      () => this.applyVideoEncoderPreference(\n        encoderSize,\n        encoderOptions,\n        { throwOnFailure: Boolean(deadlines) },\n      ),\n      deadlines,\n      deadlines?.encoderMs,\n      \"video_encoder_config\",\n    );\n    try {\n      await this.runExternalPublishStage(\n        () => this.engine!.publishStream(\n          audioTrack ? MediaType.AUDIO_AND_VIDEO : MediaType.VIDEO,\n        ),\n        deadlines,\n        deadlines?.publishMs,\n        \"publish_stream\",\n      );\n    } catch (error) {\n      if (!audioTrack) {\n        throw error;\n      }\n      this.externalAudioTrack = null;\n      audioTrack = undefined;\n      await this.switchToInternalAudioSource();\n      try {\n        await this.engine.publishStream(MediaType.VIDEO);\n      } catch (fallbackError) {\n        throw normalizeRtcError(\n          fallbackError,\n          \"WEB_RTC_ERROR\",\n          \"Failed to publish external RTC video stream\",\n        );\n      }\n    }\n    this.localVideoPublished = true;\n    this.localAudioPublished = Boolean(audioTrack);\n    this.publishStartedAtMs = publishStartedAtMs;\n    this.localStreamStatsCount = 0;\n    this.firstNonZeroSentFrameRateAtMs = 0;\n    this.lastObservedSentFrameRate = 0;\n    this.ensureSeiSupport();\n    this.emitState();\n    this.diagnostics?.record('sdk_rtc_publish_local_track', {\n      track_kind: 'video',\n      publish_duration_ms: Math.round(performance.now() - publishStartedAtMs),\n    });\n    this.log(\"success\", this.i18n.t(\"rtc.externalVideoPublished\"));\n  }\n\n  private async runExternalPublishStage<T>(\n    operation: () => Promise<T>,\n    deadlines: ExternalVideoPublishDeadlines | undefined,\n    timeoutMs: number | undefined,\n    stage: string,\n  ): Promise<T> {\n    try {\n      if (!deadlines || !timeoutMs) {\n        return await operation();\n      }\n      return await withAppleMobileVideoStageTimeout(operation, {\n        stage,\n        timeoutMs,\n        message: deadlines.timeoutMessage,\n      });\n    } catch (error) {\n      throw normalizeRtcError(error, \"WEB_RTC_ERROR\", \"Failed to publish external RTC stream\");\n    }\n  }\n\n  async stopVideoPublishing(options?: {\n    preserveExternalTrack?: boolean\n    preserveRemote?: boolean\n  }): Promise<void> {\n    if (this.stopPublishingTask) {\n      return this.stopPublishingTask;\n    }\n    const task = this.stopVideoPublishingInternal(options);\n    this.stopPublishingTask = task;\n    try {\n      await task;\n    } finally {\n      if (this.stopPublishingTask === task) this.stopPublishingTask = null;\n    }\n  }\n\n  private async stopVideoPublishingInternal(options?: {\n    preserveExternalTrack?: boolean\n    preserveRemote?: boolean\n  }): Promise<void> {\n    this.clearLocalOutboundWatch();\n    this.rejectLocalOutboundReadyWaiters(\n      \"Local video publishing stopped\",\n    );\n    const engine = this.engine;\n    if (!engine) {\n      return;\n    }\n\n    this.seiSender.stop();\n\n    // Hardware release must not wait for the remote unpublish acknowledgement.\n    for (const kind of ['video', 'audio'] as const) {\n      const internal = kind === 'video' ? this.internalVideoCaptureStarted : this.internalAudioCaptureStarted;\n      if (internal) {\n        try { engine.getLocalStreamTrack?.(StreamIndex.STREAM_INDEX_MAIN, kind)?.stop(); } catch {}\n      }\n    }\n\n    if (this.externalVideoTrack) {\n      if (!options?.preserveExternalTrack) {\n        try {\n          this.externalVideoTrack.stop();\n        } catch {\n        }\n      }\n      this.externalVideoTrack = null;\n    }\n    if (this.externalAudioTrack) {\n      if (!options?.preserveExternalTrack) {\n        try {\n          this.externalAudioTrack.stop();\n        } catch {\n        }\n      }\n      this.externalAudioTrack = null;\n    }\n\n    try {\n      const operations: Array<Promise<unknown>> = [];\n      if (this.localVideoPublished || this.localAudioPublished) {\n        const mediaType = this.localVideoPublished && this.localAudioPublished\n          ? MediaType.AUDIO_AND_VIDEO\n          : (this.localAudioPublished ? MediaType.AUDIO : MediaType.VIDEO);\n        operations.push(this.teardownOperation('unpublish', () => engine.unpublishStream(mediaType)));\n      }\n      if (this.internalVideoCaptureStarted) {\n        operations.push(this.teardownOperation('stop_video_capture', () => engine.stopVideoCapture()));\n      }\n      if (this.internalAudioCaptureStarted) {\n        operations.push(this.teardownOperation('stop_audio_capture', () => engine.stopAudioCapture()));\n      }\n      await Promise.all(operations);\n      if (this.engine !== engine) return;\n      await withRtcTeardownTimeout(async () => {\n        await this.switchToInternalVideoSource(false);\n        if (this.engine !== engine) return;\n        await this.switchToInternalAudioSource();\n      }, 'reset_media_source');\n      if (this.engine !== engine) return;\n    } catch (error) {\n      if (this.engine === engine) this.forceDestroy(options);\n      throw error;\n    }\n    this.clearUploadPreviewLayoutObserver();\n    this.clearContainer(this.localVideoContainer);\n    if (!options?.preserveRemote) {\n      this.clearRemoteVideo();\n    }\n    this.localVideoPublished = false;\n    this.localAudioPublished = false;\n    this.internalVideoCaptureStarted = false;\n    this.internalAudioCaptureStarted = false;\n    this.localVideoDegradationPreference = null;\n    this.publishStartedAtMs = 0;\n    this.lastSentResolution = \"\";\n    this.emitState();\n    this.log(\"warn\", this.i18n.t(\"rtc.localVideoStopped\"));\n  }\n\n  async leave(options?: { preserveExternalTrack?: boolean }): Promise<void> {\n    this.tearingDown = true;\n    clearTimeout(this.reconnectTimer);\n    this.nativeSampler?.stop();\n    this.nativeSampler = undefined;\n    this.stopRemoteQualityWatch();\n    if (this.leaveTask) {\n      await this.leaveTask;\n      return;\n    }\n\n    const engine = this.engine;\n    if (!engine) {\n      return;\n    }\n\n    this.leaveTask = (async () => {\n      try {\n        if (\n          this.localVideoPublished\n          || this.localAudioPublished\n          || this.internalVideoCaptureStarted\n          || this.internalAudioCaptureStarted\n          || this.externalVideoTrack\n          || this.externalAudioTrack\n        ) {\n          await this.stopVideoPublishing(options);\n        }\n        if (this.joined) {\n          await this.teardownOperation('leave_room', () => engine.leaveRoom());\n        }\n      } catch (error) {\n        this.log(\"warn\", this.i18n.t(\"rtc.leaveRoomError\"), error);\n        throw error;\n      } finally {\n        try {\n          engine.destroy();\n          this.diagnostics?.record('sdk_rtc_teardown', { operation: 'destroy_engine', outcome: 'success' });\n        } catch {\n          this.diagnostics?.record('sdk_rtc_teardown', { operation: 'destroy_engine', outcome: 'error' });\n        }\n        if (this.engine === engine) {\n          this.engine = null;\n        }\n        this.currentJoinInfo = null;\n        this.users.clear();\n        this.joined = false;\n        this.localVideoPublished = false;\n        this.localAudioPublished = false;\n        this.internalVideoCaptureStarted = false;\n        this.internalAudioCaptureStarted = false;\n        this.localVideoSourceType = VideoSourceType.VIDEO_SOURCE_TYPE_INTERNAL;\n        this.externalVideoTrack = null;\n        this.externalAudioTrack = null;\n        this.remoteVideoUserId = null;\n        this.pendingRemoteVideoUserId = null;\n        this.pendingRemoteVideoMediaType = MediaType.VIDEO;\n        this.subscribedRemoteUserId = null;\n        this.subscribedRemoteMediaType = MediaType.VIDEO;\n        this.activeGenerationId = null;\n        this.seiSender.stop();\n        this.clearSeiGateFallbackTimer();\n        this.clearSeiMatchedDelayTimer();\n        this.clearRemoteFirstOutputWatch();\n        this.clearLocalOutboundWatch();\n        this.stopRemoteFrameWatch();\n        this.joinedAtMs = 0;\n        this.publishStartedAtMs = 0;\n        this.lastRoomStartEventAtMs = 0;\n        this.localStreamStatsCount = 0;\n        this.firstNonZeroSentFrameRateAtMs = 0;\n        this.lastSentResolution = \"\";\n        this.lastReceivedResolution = \"\";\n        this.clearVideoContainers();\n        this.emitState();\n        this.log(\"info\", this.i18n.t(\"rtc.engineDestroyed\"));\n      }\n    })();\n\n    try {\n      await this.leaveTask;\n    } finally {\n      this.leaveTask = null;\n    }\n  }\n\n  /** Subscribe to the remote output stream before start. */\n  async prepareRemoteVideoForGeneration(): Promise<void> {\n    const botUserId = this.currentJoinInfo?.botName?.trim();\n    if (!botUserId || !this.engine || !this.joined) {\n      return;\n    }\n\n    this.pendingRemoteVideoUserId = botUserId;\n    this.pendingRemoteVideoMediaType = MediaType.VIDEO;\n    await this.ensureRemoteStreamSubscribed(botUserId, MediaType.VIDEO);\n  }\n\n  async sendRoomEvent(event: unknown): Promise<void> {\n    this.ensureReadyForMessaging();\n    const eventName = typeof event === \"object\" && event !== null && \"event\" in event\n      ? String((event as { event?: unknown }).event ?? \"unknown\")\n      : \"unknown\";\n\n    if (eventName === \"start\") {\n      this.lastRoomStartEventAtMs = performance.now();\n    }\n    try {\n      const payload = JSON.stringify(event);\n      if (eventName === \"start\") {\n        const params = (event as { params?: Record<string, unknown> }).params;\n        const fields = params\n          ? Object.keys(params).filter(key => ['prompt', 'ref_image_path', 'static_generate', 'static_image_path'].includes(key)).join(',')\n          : undefined;\n        this.diagnostics?.generationSent({\n          generation_id: (event as { uid?: string }).uid ?? null,\n          static_generate: params?.static_generate === true,\n          context_fields: fields,\n        });\n      }\n      const engine = this.engine!;\n      if (eventName === 'stop') {\n        await this.teardownOperation('stop_generation', () => engine.sendRoomMessage(payload));\n      } else {\n        await engine.sendRoomMessage(payload);\n      }\n    } catch (error) {\n      throw normalizeRtcError(error, \"WEB_RTC_ERROR\", \"Failed to send RTC room message\");\n    }\n    this.log(\"success\", this.i18n.t(\"rtc.roomEventSent\"), event);\n  }\n\n  /** Send a control event directly to one user in the current RTC room. */\n  async sendUserEvent(userId: string, event: unknown): Promise<void> {\n    this.ensureReadyForMessaging();\n    const targetUserId = userId.trim();\n    if (!targetUserId) {\n      return;\n    }\n    try {\n      const payload = JSON.stringify(event);\n      await this.engine!.sendUserMessage(targetUserId, payload);\n    } catch (error) {\n      throw normalizeRtcError(error, \"WEB_RTC_ERROR\", \"Failed to send RTC user message\");\n    }\n    this.log(\"success\", this.i18n.t(\"rtc.roomEventSent\"), {\n      targetUserId,\n      event,\n    });\n  }\n\n  /** Best-effort room control message. Returns false instead of throwing or blocking callers. */\n  async trySendRoomEvent(event: unknown): Promise<boolean> {\n    const engine = this.engine;\n    if (!engine || !this.joined) {\n      return false;\n    }\n    try {\n      const payload = JSON.stringify(event);\n      const sendTask = engine.sendRoomMessage(payload);\n      if (!sendTask) {\n        return false;\n      }\n      await sendTask;\n      this.log(\"success\", this.i18n.t(\"rtc.roomEventSent\"), event);\n      return true;\n    } catch (error) {\n      this.log(\"warn\", this.i18n.t(\"rtc.roomEventSent\"), { event, error });\n      return false;\n    }\n  }\n\n  /** Best-effort direct control message. Returns false instead of throwing or blocking callers. */\n  async trySendUserEvent(userId: string, event: unknown): Promise<boolean> {\n    const engine = this.engine;\n    const targetUserId = userId.trim();\n    if (!engine || !this.joined || !targetUserId) {\n      return false;\n    }\n    try {\n      const payload = JSON.stringify(event);\n      const sendTask = engine.sendUserMessage(targetUserId, payload);\n      if (!sendTask) {\n        return false;\n      }\n      await sendTask;\n      this.log(\"success\", this.i18n.t(\"rtc.roomEventSent\"), {\n        targetUserId,\n        event,\n      });\n      return true;\n    } catch (error) {\n      this.log(\"warn\", this.i18n.t(\"rtc.roomEventSent\"), {\n        targetUserId,\n        event,\n        error,\n      });\n      return false;\n    }\n  }\n\n  clearRemoteVideo(options?: { preserveDom?: boolean }): void {\n    this.stopRemoteFrameWatch();\n    if (!options?.preserveDom && !this.preserveRemoteDom) {\n      this.clearContainer(this.remoteVideoContainer);\n    }\n    if (this.remoteVideoUserId) {\n      this.pendingRemoteVideoUserId = this.remoteVideoUserId;\n      this.remoteVideoUserId = null;\n      this.emitState();\n    }\n  }\n\n  async refreshRemoteVideoBinding(options?: { force?: boolean }): Promise<void> {\n    const targetUserId = this.remoteVideoUserId ?? this.pendingRemoteVideoUserId;\n    if (!this.engine || !targetUserId || !this.remoteVideoContainer) {\n      return;\n    }\n\n    await this.ensureRemoteStreamSubscribed(targetUserId, this.pendingRemoteVideoMediaType);\n\n    if (!this.canRenderRemoteVideo(targetUserId)) {\n      this.debugLog(\"refreshRemoteVideoBinding blocked by SEI gate\", {\n        targetUserId,\n        expectedRemoteSei: this.expectedRemoteSei,\n        lastRemoteSei: this.lastRemoteSei,\n      });\n      return;\n    }\n\n    if (\n      !options?.force &&\n      this.remoteVideoUserId === targetUserId &&\n      this.remoteVideoContainer &&\n      this.remoteVideoContainer.childElementCount > 0\n    ) {\n      this.debugLog(\"refreshRemoteVideoBinding skipped (already mounted)\", { targetUserId });\n      return;\n    }\n\n    try {\n      await this.mountRemoteVideoPlayer(\n        targetUserId,\n        this.remoteVideoContainer,\n        this.pendingRemoteVideoMediaType,\n        options?.force,\n      );\n      this.remoteVideoUserId = targetUserId;\n      this.pendingRemoteVideoUserId = null;\n      this.emitState();\n      this.startRemoteFrameWatch(targetUserId);\n      this.emitRemotePlayerMounted();\n      this.log(\"info\", this.i18n.t(\"rtc.remotePlayerRefreshed\", { userId: targetUserId }));\n    } catch (error) {\n      this.log(\"warn\", this.i18n.t(\"rtc.remotePlayerRefreshFailed\"), error);\n      throw normalizeRtcError(error, \"WEB_RTC_ERROR\", \"Failed to refresh RTC remote video binding\");\n    }\n  }\n\n  private refreshRemoteVideoBindingBestEffort(options?: { force?: boolean }): void {\n    void this.refreshRemoteVideoBinding(options).catch((error) => {\n      this.log(\"warn\", this.i18n.t(\"rtc.remotePlayerRefreshFailed\"), error);\n    });\n  }\n\n  private attachRemoteVideoBestEffort(userId: string, mediaType: MediaType): void {\n    void this.attachRemoteVideo(userId, mediaType).catch((error) => {\n      this.log(\"warn\", this.i18n.t(\"rtc.remotePlayerRefreshFailed\"), error);\n    });\n  }\n\n  private bindEngineEvents(engine: IRTCEngine): void {\n    const roomMessageHandler = (payload: unknown) => {\n      const event = this.parseRoomEventPayload(payload);\n      this.debugLog(\"room message received\", {\n        raw: payload,\n        parsed: event,\n      });\n      if (event) {\n        this.recordGenerationAckFromRoomEvent(event);\n        this.onRoomEvent?.(event);\n      }\n    };\n    const roomMessageEventNames = new Set<string>([\n      \"onRoomMessageReceived\",\n      \"onUserMessageReceived\",\n    ]);\n    const sdkRoomMessageEventName = (VERTC.events as Record<string, string>).onRoomMessageReceived;\n    if (sdkRoomMessageEventName) {\n      roomMessageEventNames.add(sdkRoomMessageEventName);\n    }\n    roomMessageEventNames.forEach((eventName) => {\n      engine.on(eventName as any, roomMessageHandler);\n    });\n\n    engine.on(VERTC.events.onUserJoined, (event) => {\n      const userId = event.userInfo.userId;\n      this.users.add(userId);\n      this.emitState();\n      try {\n        this.onUserJoined?.(userId);\n      } catch {\n        // Consumer callbacks must not interrupt RTC event processing.\n      }\n      this.log(\"success\", this.i18n.t(\"rtc.userJoined\", { userId }), event);\n      this.log(\"info\", this.i18n.t(\"rtc.roomUsers\", { users: this.snapshot.users.join(\", \") }), this.snapshot.users);\n    });\n\n    engine.on(VERTC.events.onUserLeave, (event) => {\n      this.recordRemoteState(event.userInfo.userId, 'left', undefined, event.reason);\n      this.users.delete(event.userInfo.userId);\n      if (this.remoteVideoUserId === event.userInfo.userId) {\n        this.remoteVideoUserId = null;\n        this.clearContainer(this.remoteVideoContainer);\n      }\n      if (this.pendingRemoteVideoUserId === event.userInfo.userId) {\n        this.pendingRemoteVideoUserId = null;\n      }\n      this.emitState();\n      this.log(\"warn\", this.i18n.t(\"rtc.userLeft\", { userId: event.userInfo.userId }), event);\n      this.log(\"info\", this.i18n.t(\"rtc.roomUsers\", { users: this.snapshot.users.join(\", \") }), this.snapshot.users);\n    });\n\n    engine.on(VERTC.events.onConnectionStateChanged, (event) => {\n      if (this.engine !== engine) return;\n      this.handleConnectionStateChange(event);\n      this.log(\"info\", this.i18n.t(\"rtc.connectionStateChanged\"), event);\n    });\n\n    engine.on(VERTC.events.onNetworkQuality, (up, down) => {\n      this.diagnostics?.updateStats({ up_network_quality: up, down_network_quality: down });\n    });\n\n    engine.on(VERTC.events.onTokenWillExpire, () => {\n      this.diagnostics?.record('sdk_rtc_token_state_change', { scope: 'room', state: 'will_expire' });\n    });\n    engine.on(VERTC.events.onTokenPublishPrivilegeWillExpire, () => {\n      this.diagnostics?.record('sdk_rtc_token_state_change', { scope: 'publish', state: 'will_expire' });\n    });\n    engine.on(VERTC.events.onTokenSubscribePrivilegeWillExpire, () => {\n      this.diagnostics?.record('sdk_rtc_token_state_change', { scope: 'subscribe', state: 'will_expire' });\n    });\n    engine.on(VERTC.events.onTokenPublishPrivilegeDidExpired, event => {\n      this.diagnostics?.record('sdk_rtc_token_state_change', { scope: 'publish', state: 'expired', rtc_error_code: event.errorCode });\n    });\n    engine.on(VERTC.events.onTokenSubscribePrivilegeDidExpired, event => {\n      this.diagnostics?.record('sdk_rtc_token_state_change', { scope: 'subscribe', state: 'expired', rtc_error_code: event.errorCode });\n    });\n\n    engine.on(VERTC.events.onUserPublishStream, (event) => {\n      if (this.supportsVideo(event.mediaType)) this.recordRemoteState(event.userId, 'published', event.mediaType);\n      if (this.isRemoteSeiUser(event.userId)) this.diagnostics?.mark('remote_published');\n      this.log(\"success\", this.i18n.t(\"rtc.userPublished\", { userId: event.userId }), event);\n      if (this.supportsVideo(event.mediaType)) {\n        this.attachRemoteVideoBestEffort(event.userId, event.mediaType);\n      }\n    });\n\n    engine.on(VERTC.events.onUserUnpublishStream, (event) => {\n      if (this.supportsVideo(event.mediaType)) this.recordRemoteState(event.userId, 'unpublished', event.mediaType, event.reason);\n      this.log(\"warn\", this.i18n.t(\"rtc.userUnpublished\", { userId: event.userId }), event);\n      this.debugLog(\"onUserUnpublishStream\", {\n        userId: event.userId,\n        mediaType: event.mediaType,\n        remoteVideoUserId: this.remoteVideoUserId,\n        expectedRemoteSei: this.expectedRemoteSei,\n        lastRemoteSei: this.lastRemoteSei,\n      });\n      if (this.remoteVideoUserId === event.userId && this.supportsVideo(event.mediaType)) {\n        this.pendingRemoteVideoUserId = event.userId;\n        this.pendingRemoteVideoMediaType = event.mediaType;\n        this.remoteVideoUserId = null;\n        this.stopRemoteFrameWatch();\n        if (!this.preserveRemoteDom) {\n          this.clearContainer(this.remoteVideoContainer);\n        }\n        this.emitState();\n        return;\n      }\n    });\n\n    engine.on(VERTC.events.onSEIMessageReceived, (event) => {\n      const userId = event.remoteStreamKey.userId;\n      const sei = normalizeSei(decodeSeiMessage(event.sei));\n\n      if (sei && this.isRemoteSeiUser(userId)) {\n        this.onRemoteSeiReceived?.({ sei, userId });\n      }\n\n      this.lastRemoteSei = sei;\n      this.lastRemoteSeiUserId = userId;\n\n      const matched = this.isSeiMatched();\n      const seiStateChanged =\n        this.lastDebugSeiMatched !== matched ||\n        this.lastDebugRemoteSei !== sei;\n\n      if (this.debug && seiStateChanged) {\n        this.debugLog(\"onSEIMessageReceived\", {\n          userId,\n          sei,\n          matched,\n          expectedRemoteSei: this.expectedRemoteSei,\n        });\n        this.lastDebugSeiMatched = matched;\n        this.lastDebugRemoteSei = sei;\n      }\n\n      if (!matched) {\n        this.onSeiGateChange?.({\n          expectedSei: this.expectedRemoteSei,\n          sei,\n          userId,\n          matched: false,\n        });\n        return;\n      }\n\n      // If already matched and waiting for delay, do nothing\n      if (this.seiMatchedDelayTimer !== null) {\n        return;\n      }\n\n      this.clearSeiGateFallbackTimer();\n      this.seiMatchedDelayTimer = setTimeout(() => {\n        this.seiMatchedDelayTimer = null;\n\n        // Double check if it's still matched (in case expectedRemoteSei changed during delay)\n        if (!this.isSeiMatched()) {\n          return;\n        }\n\n        this.onSeiGateChange?.({\n          expectedSei: this.expectedRemoteSei,\n          sei,\n          userId,\n          matched: true,\n        });\n\n        if (this.remoteVideoUserId === userId) {\n          return;\n        }\n\n        this.attachRemoteVideoBestEffort(userId, this.pendingRemoteVideoMediaType);\n      }, RtcManager.SEI_MATCHED_DISPLAY_DELAY_MS);\n    });\n\n    engine.on(VERTC.events.onError, (event) => {\n      this.diagnostics?.updateStats({ rtc_error_code: String(event.errorCode) });\n      const error: RtcAsyncErrorInfo = {\n        errorCode: String(event.errorCode),\n        forbiddenTime: event.forbiddenTime,\n        cause: event,\n      };\n      this.log(\"error\", this.i18n.t(\"rtc.error\", { code: error.errorCode }), event);\n      try {\n        this.onError?.(error);\n      } catch {\n        // Consumer callbacks must not break the RTC event loop.\n      }\n    });\n\n    engine.on(VERTC.events.onPublishResult, (event) => {\n      if (!event.isScreen) {\n        this.diagnostics?.updateStats({ publish_result_code: event.errorCode === undefined ? undefined : String(event.errorCode) });\n        this.diagnostics?.mark('publish_result');\n      }\n      this.debugLog(\"onPublishResult\", {\n        ...event,\n        elapsedSincePublishMs: this.publishStartedAtMs > 0\n          ? Number((performance.now() - this.publishStartedAtMs).toFixed(1))\n          : null,\n      });\n    });\n\n    engine.on(VERTC.events.onRemoteVideoFirstFrame, (event) => {\n      if (event.isScreen || !this.isRemoteSeiUser(event.userId)) {\n        return;\n      }\n      this.emitRemoteVideoFirstFrame({\n        userId: event.userId,\n        width: event.width,\n        height: event.height,\n      });\n    });\n\n    engine.on(VERTC.events.onLocalStreamStats, (stats) => {\n      if (!stats.isScreen) this.recordDiagnosticStats('up', stats.videoStats);\n      this.logLocalStreamStats(stats);\n      if (stats.videoStats) {\n        const videoStats = stats.videoStats as RtcVideoDiagnosticStats;\n        // LocalStreamStats may omit sentResolutionWidth/Height.\n        // Use encodedFrameWidth/encodedFrameHeight as fallback.\n        const width = readRtcVideoStat(videoStats, [\"sentResolutionWidth\", \"encodedFrameWidth\", \"width\"]);\n        const height = readRtcVideoStat(videoStats, [\"sentResolutionHeight\", \"encodedFrameHeight\", \"height\"]);\n        const sentFrameRate = readRtcVideoStat(videoStats, [\"sentFrameRate\", \"encodeFrameRate\"]);\n\n        this.logVideoFrameDiagnostics(\"send\", width, height, sentFrameRate, undefined, {\n          configuredFrameRate: this.localVideoFrameRate,\n          inputFrameRate: readRtcVideoStat(videoStats, [\"inputFrameRate\"]),\n          encoderOutputFrameRate: readRtcVideoStat(videoStats, [\"encoderOutputFrameRate\", \"encodeFrameRate\"]),\n          sentKBitrate: readRtcVideoStat(videoStats, [\"sentKBitrate\"]),\n          targetKBitrate: readRtcVideoStat(videoStats, [\"targetKBitrate\"]),\n          encodedBitrate: readRtcVideoStat(videoStats, [\"encodedBitrate\"]),\n          videoLossRate: readRtcVideoStat(videoStats, [\"videoLossRate\"]),\n          rtt: readRtcVideoStat(videoStats, [\"rtt\"]),\n          statsInterval: readRtcVideoStat(videoStats, [\"statsInterval\"]),\n          elapsedSincePublishMs: this.publishStartedAtMs > 0\n            ? Number((performance.now() - this.publishStartedAtMs).toFixed(1))\n            : 0,\n        });\n\n        const res = `${width}x${height}`;\n        if (width > 0 && height > 0 && res !== this.lastSentResolution) {\n          this.lastSentResolution = res;\n        }\n      }\n    });\n\n    engine.on(VERTC.events.onRemoteStreamStats, (stats: any) => {\n      if (this.qualityHadFrame && stats && !stats.isScreen && stats.userId === this.qualityUserId && stats.videoStats) {\n        this.remoteQuality.sample(stats.userId, stats.videoStats, performance.now());\n      }\n      if (stats && !stats.isScreen && typeof stats.userId === 'string' && this.isRemoteSeiUser(stats.userId)) this.recordDiagnosticStats('down', stats.videoStats, stats.audioStats);\n      if (stats?.videoStats) {\n        const videoStats = stats.videoStats as RtcVideoDiagnosticStats;\n        const w = readRtcVideoStat(videoStats, [\"width\", \"receivedResolutionWidth\", \"decodedFrameWidth\"]);\n        const h = readRtcVideoStat(videoStats, [\"height\", \"receivedResolutionHeight\", \"decodedFrameHeight\"]);\n        const receivedFrameRate = readRtcVideoStat(videoStats, [\"receivedFrameRate\", \"decoderOutputFrameRate\", \"renderFrameRate\"]);\n        const renderedFrameRate = readRtcVideoStat(videoStats, [\"rendererOutputFrameRate\", \"renderFrameRate\"]);\n\n        this.logVideoFrameDiagnostics(\"receive\", w, h, receivedFrameRate, stats?.userId);\n\n        // Some mobile browser builds can omit the dedicated first-frame event. The\n        // vendor's positive renderer FPS is an equivalent non-DOM confirmation.\n        if (\n          !stats.isScreen\n          && typeof stats.userId === \"string\"\n          && this.isRemoteSeiUser(stats.userId)\n          && renderedFrameRate > 0\n        ) {\n          this.emitRemoteVideoFirstFrame({ userId: stats.userId, width: w, height: h }, 'render_stats');\n        }\n\n        const res = `${w}x${h}`;\n        if (w > 0 && h > 0 && res !== this.lastReceivedResolution) {\n          this.lastReceivedResolution = res;\n        }\n      }\n    });\n\n    engine.on(VERTC.events.onLocalStatsException, (exception) => {\n      this.debugLog(\"onLocalStatsException\", {\n        exception,\n        elapsedSincePublishMs: this.publishStartedAtMs > 0\n          ? Number((performance.now() - this.publishStartedAtMs).toFixed(1))\n          : null,\n      });\n    });\n\n    engine.on(VERTC.events.onTrackMute, (event) => {\n      this.debugLog(\"onTrackMute\", event);\n    });\n\n    engine.on(VERTC.events.onTrackUnmute, (event) => {\n      this.debugLog(\"onTrackUnmute\", event);\n    });\n  }\n\n  private emitState(): void {\n    this.onStateChange?.(this.snapshot);\n  }\n\n  private ensureReadyForMessaging(): void {\n    if (!this.engine || !this.joined) {\n      throw new XmaxSdkError(\n        \"SESSION_ERROR\",\n        this.i18n.t(\"errors.rtcNotJoinedForMessaging\"),\n      );\n    }\n  }\n\n  private bindLocalVideoPlayer(force = false): void {\n    if (!this.localVideoContainer) {\n      return;\n    }\n    const container = this.getRequiredContainer(this.localVideoContainer, \"local\");\n    if (!force && container.childElementCount > 0) {\n      this.bindUploadPreviewLayout(container);\n      return;\n    }\n    container.replaceChildren();\n    // Mirroring is applied once by RealtimeRenderSetting; keep the RTC renderer unmirrored.\n    this.engine?.setLocalVideoMirrorType(MirrorType.MIRROR_TYPE_NONE);\n    this.engine?.setLocalVideoPlayer(StreamIndex.STREAM_INDEX_MAIN, {\n      renderDom: container,\n      renderMode: resolveVideoRenderMode(container, this.renderFit),\n    });\n    this.bindUploadPreviewLayout(container);\n  }\n\n  private bindUploadPreviewLayout(container: HTMLElement): void {\n    this.uploadPreviewLayoutObserverStop?.();\n    this.uploadPreviewLayoutObserverStop = null;\n    applyUploadPreviewMediaLayout(container);\n    this.uploadPreviewLayoutObserverStop = observeUploadPreviewMediaLayout(container);\n  }\n\n  private clearUploadPreviewLayoutObserver(): void {\n    this.uploadPreviewLayoutObserverStop?.();\n    this.uploadPreviewLayoutObserverStop = null;\n  }\n\n  /** Re-bind local preview after the container becomes visible or is resized. */\n  refreshLocalVideoPreview(options?: { force?: boolean }): void {\n    if (!this.engine || !this.localVideoPublished || !this.localVideoContainer) {\n      return;\n    }\n    this.bindLocalVideoPlayer(options?.force);\n  }\n\n  getLastObservedSentFrameRate(): number {\n    return this.lastObservedSentFrameRate;\n  }\n\n  waitForLocalOutboundVideoReady(options?: {\n    timeoutMs?: number;\n    minPositiveSamples?: number;\n    timeoutMessage?: string;\n  }): Promise<void> {\n    const timeoutMs = options?.timeoutMs ?? 10000;\n    const minPositiveSamples = Math.max(1, options?.minPositiveSamples ?? 2);\n    if (this.lastObservedSentFrameRate > 0 && minPositiveSamples === 1) {\n      return Promise.resolve();\n    }\n\n    return new Promise<void>((resolve, reject) => {\n      const waiter: LocalOutboundReadyWaiter = {\n        positiveSamples: 0,\n        minPositiveSamples,\n        resolve: () => {\n          clearTimeout(waiter.timeoutId);\n          this.localOutboundReadyWaiters.delete(waiter);\n          resolve();\n        },\n        reject: (error) => {\n          clearTimeout(waiter.timeoutId);\n          this.localOutboundReadyWaiters.delete(waiter);\n          reject(error);\n        },\n        timeoutId: setTimeout(() => {\n          waiter.reject(new XmaxSdkError(\n            \"WEB_RTC_ERROR\",\n            options?.timeoutMessage ?? \"Local video publish produced no outbound frames\",\n          ));\n        }, timeoutMs),\n      };\n      this.localOutboundReadyWaiters.add(waiter);\n    });\n  }\n\n  private rejectLocalOutboundReadyWaiters(message: string): void {\n    if (this.localOutboundReadyWaiters.size === 0) {\n      return;\n    }\n    const error = new XmaxSdkError('WEB_RTC_ERROR', message);\n    Array.from(this.localOutboundReadyWaiters).forEach((waiter) => waiter.reject(error));\n  }\n\n  /** Immediately abandon a wedged engine without awaiting unpublish/leave promises. */\n  forceDestroy(options?: { preserveExternalTrack?: boolean }): void {\n    this.tearingDown = true;\n    clearTimeout(this.reconnectTimer);\n    const engine = this.engine;\n    this.engine = null;\n    try {\n      engine?.destroy();\n      this.diagnostics?.record('sdk_rtc_teardown', { operation: 'destroy_engine', outcome: 'success', forced: true });\n    } catch {\n      this.diagnostics?.record('sdk_rtc_teardown', { operation: 'destroy_engine', outcome: 'error', forced: true });\n    }\n\n    if (!options?.preserveExternalTrack) {\n      try {\n        this.externalVideoTrack?.stop();\n      } catch {\n      }\n      try {\n        this.externalAudioTrack?.stop();\n      } catch {\n      }\n    }\n\n    this.rejectLocalOutboundReadyWaiters(\"RTC engine was destroyed\");\n    this.nativeSampler?.stop();\n    this.nativeSampler = undefined;\n    this.stopRemoteQualityWatch();\n    this.clearRemoteFirstOutputWatch();\n    this.clearLocalOutboundWatch();\n    this.stopRemoteFrameWatch();\n    this.seiSender.stop();\n    this.clearSeiGateFallbackTimer();\n    this.clearSeiMatchedDelayTimer();\n    this.clearUploadPreviewLayoutObserver();\n    this.users.clear();\n    this.currentJoinInfo = null;\n    this.joined = false;\n    this.localVideoPublished = false;\n    this.localAudioPublished = false;\n    this.internalVideoCaptureStarted = false;\n    this.internalAudioCaptureStarted = false;\n    this.localVideoDegradationPreference = null;\n    this.localVideoSourceType = VideoSourceType.VIDEO_SOURCE_TYPE_INTERNAL;\n    this.externalVideoTrack = null;\n    this.externalAudioTrack = null;\n    this.remoteVideoUserId = null;\n    this.pendingRemoteVideoUserId = null;\n    this.pendingRemoteVideoMediaType = MediaType.VIDEO;\n    this.subscribedRemoteUserId = null;\n    this.subscribedRemoteMediaType = MediaType.VIDEO;\n    this.joinedAtMs = 0;\n    this.publishStartedAtMs = 0;\n    this.lastRoomStartEventAtMs = 0;\n    this.localStreamStatsCount = 0;\n    this.firstNonZeroSentFrameRateAtMs = 0;\n    this.lastObservedSentFrameRate = 0;\n    this.lastSentResolution = \"\";\n    this.lastReceivedResolution = \"\";\n    this.clearVideoContainers();\n    this.emitState();\n  }\n\n  private async switchToExternalVideoSource(track: MediaStreamTrack): Promise<void> {\n    if (!this.engine) {\n      return;\n    }\n\n    this.externalVideoTrack = track;\n    await this.engine.setVideoSourceType(StreamIndex.STREAM_INDEX_MAIN, VideoSourceType.VIDEO_SOURCE_TYPE_EXTERNAL);\n    await this.engine.setExternalVideoTrack(StreamIndex.STREAM_INDEX_MAIN, track);\n    this.localVideoSourceType = VideoSourceType.VIDEO_SOURCE_TYPE_EXTERNAL;\n  }\n\n  private async switchToExternalAudioSource(track: MediaStreamTrack): Promise<void> {\n    if (!this.engine) {\n      return;\n    }\n    const engine = this.engine as unknown as {\n      setAudioSourceType?: (streamIndex: StreamIndex, sourceType: AudioSourceType) => Promise<void> | void;\n      setExternalAudioTrack?: (streamIndex: StreamIndex, track: MediaStreamTrack) => Promise<void> | void;\n    };\n    if (typeof engine.setAudioSourceType !== \"function\") {\n      this.log(\"warn\", \"[Xmax][RTC] setAudioSourceType API is unavailable\");\n      return;\n    }\n    if (typeof engine.setExternalAudioTrack !== \"function\") {\n      this.log(\"warn\", \"[Xmax][RTC] setExternalAudioTrack API is unavailable\");\n      return;\n    }\n    await engine.setAudioSourceType(\n      StreamIndex.STREAM_INDEX_MAIN,\n      AudioSourceType.AUDIO_SOURCE_TYPE_EXTERNAL,\n    );\n    this.externalAudioTrack = track;\n    await engine.setExternalAudioTrack(StreamIndex.STREAM_INDEX_MAIN, track);\n    this.log(\"info\", \"[Xmax][RTC] external audio track attached\", {\n      readyState: track.readyState,\n      enabled: track.enabled,\n      muted: track.muted,\n    });\n  }\n\n  private async switchToInternalAudioSource(): Promise<void> {\n    if (!this.engine) {\n      return;\n    }\n    const engine = this.engine as unknown as {\n      setAudioSourceType?: (streamIndex: StreamIndex, sourceType: AudioSourceType) => Promise<void> | void;\n    };\n    if (typeof engine.setAudioSourceType !== \"function\") {\n      return;\n    }\n    await engine.setAudioSourceType(\n      StreamIndex.STREAM_INDEX_MAIN,\n      AudioSourceType.AUDIO_SOURCE_TYPE_INTERNAL,\n    );\n  }\n\n  private async switchToInternalVideoSource(shouldSetConfig = true): Promise<void> {\n    const engine = this.engine;\n    if (!engine) {\n      return;\n    }\n\n    if (this.localVideoSourceType === VideoSourceType.VIDEO_SOURCE_TYPE_INTERNAL) {\n      return;\n    }\n\n    await engine.setVideoSourceType(StreamIndex.STREAM_INDEX_MAIN, VideoSourceType.VIDEO_SOURCE_TYPE_INTERNAL);\n    if (this.engine !== engine) return;\n    this.localVideoSourceType = VideoSourceType.VIDEO_SOURCE_TYPE_INTERNAL;\n    if (shouldSetConfig && this.externalVideoTrack) {\n      this.externalVideoTrack = null;\n    }\n  }\n\n  private async applyVideoEncoderPreference(\n    size: VideoSize,\n    publishOptions: RtcVideoEncoderPreferenceOptions,\n    options?: { throwOnFailure?: boolean },\n  ): Promise<boolean> {\n    if (!this.engine) {\n      return false;\n    }\n\n    const width = size[0];\n    const height = size[1];\n    const frameRate = publishOptions.fps ?? 24;\n    const maxKbps = publishOptions.maxKbps ?? DEFAULT_REALTIME_STREAM_MAX_KBPS;\n    const contentHint = publishOptions.contentHint ?? DEFAULT_REALTIME_STREAM_CONTENT_HINT;\n    const diagnostics = {\n      width,\n      height,\n      frameRate,\n      maxKbps,\n      contentHint,\n      preferCodecName: VideoCodecType.H264,\n    };\n\n    try {\n      await this.engine.setVideoEncoderConfig({\n        width,\n        height,\n        frameRate,\n        maxKbps,\n        contentHint,\n        preferCodecName: VideoCodecType.H264,\n      });\n      this.localVideoDegradationPreference = contentHint === \"motion\"\n        ? \"maintain-framerate\"\n        : \"maintain-resolution\";\n\n      this.log(\"info\", this.i18n.t(\"rtc.encoderPreferenceSet\"), size);\n      return true;\n    } catch (error) {\n      this.log(\"warn\", this.i18n.t(\"rtc.encoderPreferenceFailed\"), error);\n      this.log(\"error\", \"[Xmax][RTC] setVideoEncoderConfig failed\", {\n        ...diagnostics,\n        error,\n      });\n      if (options?.throwOnFailure) {\n        throw normalizeRtcError(\n          error,\n          \"WEB_RTC_ERROR\",\n          \"Failed to configure RTC video encoder\",\n        );\n      }\n      return false;\n    }\n  }\n\n  /** Explicitly apply the content-hint degradation preference to the active WebRTC sender. */\n  private async applyLocalVideoDegradationPreference(track: MediaStreamTrack): Promise<void> {\n    const preference = this.localVideoDegradationPreference;\n    const peerConnection = this.engine?.peerConnection;\n    if (!preference || !peerConnection) {\n      this.debugLog(\"local video degradation preference unavailable\", {\n        preference,\n        hasPeerConnection: Boolean(peerConnection),\n      });\n      return;\n    }\n\n    try {\n      const senders = peerConnection.getSenders();\n      const sender = senders.find((candidate) => candidate.track === track)\n        ?? senders.find((candidate) => candidate.track?.kind === \"video\");\n      if (!sender) {\n        this.debugLog(\"local video sender unavailable\", { preference });\n        return;\n      }\n\n      const parameters = sender.getParameters();\n      if (parameters.degradationPreference === preference) {\n        return;\n      }\n      parameters.degradationPreference = preference;\n      await sender.setParameters(parameters);\n      this.log(\"info\", \"[Xmax][RTC] Local video degradation preference set\", {\n        preference,\n      });\n    } catch (error) {\n      // Browser support differs; contentHint remains the standards-based fallback.\n      this.log(\"warn\", \"[Xmax][RTC] Failed to set local video degradation preference\", {\n        preference,\n        error,\n      });\n    }\n  }\n\n  private async attachRemoteVideo(userId: string, mediaType: MediaType): Promise<void> {\n    if (!this.engine || !this.currentJoinInfo) {\n      return;\n    }\n\n    const preferredBotUserId = this.currentJoinInfo.botName?.trim() || null;\n    const shouldReplaceCurrent =\n      this.remoteVideoUserId === null ||\n      userId === preferredBotUserId ||\n      this.remoteVideoUserId !== preferredBotUserId;\n\n    if (!shouldReplaceCurrent) {\n      return;\n    }\n\n    const subscriptionMediaType = this.resolveRemoteSubscriptionMediaType(mediaType);\n    this.pendingRemoteVideoUserId = userId;\n    this.pendingRemoteVideoMediaType = subscriptionMediaType;\n\n    // Subscribe immediately so frames are not dropped while SEI gate delays render.\n    await this.ensureRemoteStreamSubscribed(userId, subscriptionMediaType);\n\n    if (!this.canRenderRemoteVideo(userId)) {\n      this.log(\"info\", this.i18n.t(\"rtc.remoteWaitSei\", { userId }), {\n        expectedRemoteSei: this.expectedRemoteSei,\n        lastRemoteSei: this.lastRemoteSei,\n        lastRemoteSeiUserId: this.lastRemoteSeiUserId,\n      });\n      return;\n    }\n\n    const container = this.remoteVideoContainer;\n    if (!container) {\n      this.log(\"warn\", this.i18n.t(\"rtc.remoteContainerNotReady\"), { userId, mediaType });\n      return;\n    }\n    await this.mountRemoteVideoPlayer(userId, container, subscriptionMediaType);\n    this.remoteVideoUserId = userId;\n    this.pendingRemoteVideoUserId = null;\n    this.emitState();\n    this.startRemoteFrameWatch(userId);\n    this.emitRemotePlayerMounted();\n    this.log(\"success\", this.i18n.t(\"rtc.remotePlayerBound\", { userId }));\n  }\n\n  private async ensureRemoteStreamSubscribed(userId: string, mediaType: MediaType): Promise<void> {\n    if (!this.engine) {\n      return;\n    }\n    const sameUserSubscribed = this.subscribedRemoteUserId === userId;\n    if (sameUserSubscribed && this.isSubscriptionCovered(this.subscribedRemoteMediaType, mediaType)) {\n      return;\n    }\n\n    const subscribeStartedAt = performance.now();\n    try {\n      await this.engine.subscribeStream(userId, mediaType);\n    } catch (error) {\n      throw normalizeRtcError(error, \"WEB_RTC_ERROR\", \"Failed to subscribe to RTC stream\");\n    }\n    this.subscribedRemoteUserId = userId;\n    this.subscribedRemoteMediaType = mediaType;\n    this.diagnostics?.record('sdk_rtc_subscribe_remote_track', {\n      track_kind: this.supportsVideo(mediaType) ? 'video' : 'audio',\n      subscribe_duration_ms: Math.round(performance.now() - subscribeStartedAt),\n    });\n    this.debugLog(\"ensureRemoteStreamSubscribed\", { userId, mediaType });\n  }\n\n  private bindRemoteVideoPlayerToContainer(userId: string, container: HTMLElement): void {\n    if (!this.engine) {\n      return;\n    }\n\n    try {\n      this.engine.setRemoteVideoPlayer(StreamIndex.STREAM_INDEX_MAIN, {\n        userId,\n        renderDom: container,\n        renderMode: resolveVideoRenderMode(container, this.renderFit),\n      });\n    } catch (error) {\n      throw normalizeRtcError(error, \"WEB_RTC_ERROR\", \"Failed to bind RTC remote video player\");\n    }\n    this.bindUploadPreviewLayout(container);\n  }\n\n  private async mountRemoteVideoPlayer(\n    userId: string,\n    container: HTMLElement,\n    mediaType: MediaType,\n    force = false,\n  ): Promise<void> {\n    if (!this.engine) {\n      return;\n    }\n    if (\n      !force &&\n      this.remoteVideoUserId === userId &&\n      container === this.remoteVideoContainer &&\n      container.childElementCount > 0\n    ) {\n      this.debugLog(\"mountRemoteVideoPlayer skipped (already mounted)\", { userId });\n      return;\n    }\n    this.debugLog(force ? \"mountRemoteVideoPlayer (force)\" : \"mountRemoteVideoPlayer\", {\n      userId,\n      mediaType,\n      childCountBefore: container.childElementCount,\n    });\n    this.stopRemoteFrameWatch();\n    container.replaceChildren();\n    await this.ensureRemoteStreamSubscribed(userId, mediaType);\n    this.bindRemoteVideoPlayerToContainer(userId, container);\n  }\n\n  private startRemoteFrameWatch(userId: string): void {\n    this.stopRemoteFrameWatch();\n\n    let lastFrameAt = 0;\n    let hadFirstFrame = false;\n    let rvfcHandle: number | null = null;\n    let watchedVideo: HTMLVideoElement | null = null;\n    const onVisibility = () => { if (hadFirstFrame) lastFrameAt = performance.now() };\n    if (typeof document !== 'undefined') document.addEventListener?.('visibilitychange', onVisibility);\n\n    const onFrame = () => {\n      lastFrameAt = performance.now();\n      if (watchedVideo && 'requestVideoFrameCallback' in watchedVideo) this.remoteQuality.presented(lastFrameAt);\n      if (!hadFirstFrame) {\n        this.emitRemoteVideoFirstFrame({\n          userId,\n          width: watchedVideo?.videoWidth ?? 0,\n          height: watchedVideo?.videoHeight ?? 0,\n        }, watchedVideo && 'requestVideoFrameCallback' in watchedVideo ? 'video_frame_callback' : 'timeupdate');\n      }\n      hadFirstFrame = true;\n    };\n\n    const bindRvfc = (video: HTMLVideoElement) => {\n      if (watchedVideo === video && rvfcHandle !== null) {\n        return;\n      }\n      if (watchedVideo && watchedVideo !== video) {\n        watchedVideo.removeEventListener(\"timeupdate\", onFrame);\n        if (rvfcHandle !== null) (watchedVideo as VideoWithFrameCallback).cancelVideoFrameCallback?.(rvfcHandle);\n        rvfcHandle = null;\n      }\n      watchedVideo = video;\n      const rvfcVideo = video as VideoWithFrameCallback;\n      if (rvfcVideo.requestVideoFrameCallback) {\n        const schedule = () => {\n          if (this.remoteVideoUserId !== userId || watchedVideo !== video) {\n            return;\n          }\n          rvfcHandle = rvfcVideo.requestVideoFrameCallback!(() => {\n            if (watchedVideo !== video) return;\n            onFrame();\n            schedule();\n          });\n        };\n        schedule();\n        return;\n      }\n      video.addEventListener(\"timeupdate\", onFrame);\n    };\n\n    const bindCurrentVideo = () => {\n      if (!this.remoteVideoContainer) {\n        return;\n      }\n      const video = this.remoteVideoContainer instanceof HTMLVideoElement\n        ? this.remoteVideoContainer\n        : this.remoteVideoContainer.querySelector(\"video\");\n      if (video) {\n        bindRvfc(video);\n      }\n    };\n\n    bindCurrentVideo();\n\n    const pollTimer = setInterval(() => {\n      if (this.reconnectStartedAt !== undefined) {\n        lastFrameAt = performance.now();\n        return;\n      }\n      if (hadFirstFrame) lastFrameAt = Math.max(lastFrameAt, this.connectionRecoveredAt);\n      if (typeof document !== 'undefined' && document.visibilityState === 'hidden') {\n        lastFrameAt = performance.now();\n        return;\n      }\n      if (this.remoteVideoUserId !== userId || !this.remoteVideoContainer) {\n        return;\n      }\n\n      bindCurrentVideo();\n\n      if (!hadFirstFrame || lastFrameAt === 0) {\n        return;\n      }\n\n      const now = performance.now();\n      const stallMs = now - lastFrameAt;\n      if (stallMs < REMOTE_OUTPUT_STALL_MS) {\n        return;\n      }\n\n      if (now < this.remoteOutputRecoveryCooldownUntil) {\n        return;\n      }\n\n      this.remoteOutputRecoveryCooldownUntil = now + REMOTE_OUTPUT_RECOVERY_COOLDOWN_MS;\n      this.debugLog(\"remote output stalled\", { userId, stallMs });\n      this.log(\"warn\", this.i18n.t(\"rtc.remoteOutputStalled\"), { userId, stallMs });\n      this.onRemoteOutputStalled?.({ userId, stallMs });\n\n      hadFirstFrame = false;\n      lastFrameAt = 0;\n    }, 3000);\n\n    this.remoteFrameWatchStop = () => {\n      if (typeof document !== 'undefined') document.removeEventListener?.('visibilitychange', onVisibility);\n      clearInterval(pollTimer);\n      if (watchedVideo) {\n        watchedVideo.removeEventListener(\"timeupdate\", onFrame);\n      }\n      if (rvfcHandle !== null && watchedVideo) {\n        const rvfcVideo = watchedVideo as VideoWithFrameCallback;\n        rvfcVideo.cancelVideoFrameCallback?.(rvfcHandle);\n      }\n      rvfcHandle = null;\n      watchedVideo = null;\n    };\n  }\n\n  private stopRemoteFrameWatch(): void {\n    this.remoteFrameWatchStop?.();\n    this.remoteFrameWatchStop = null;\n  }\n\n  private isRemoteSeiUser(userId: string): boolean {\n    const localUserId = this.currentJoinInfo?.userId?.trim();\n    if (localUserId && userId === localUserId) {\n      return false;\n    }\n\n    const botUserId = this.currentJoinInfo?.botName?.trim();\n    if (botUserId) {\n      return userId === botUserId;\n    }\n\n    return true;\n  }\n  \n  /** Always mount remote player — SEI gate only affects display matching, not subscription. */\n  private canRenderRemoteVideo(_userId: string): boolean {\n    return true;\n  }\n\n  /** Whether remote SEI matches the active task (display gate). */\n  private isSeiMatched(): boolean {\n    if (this.seiSupport === \"unsupported\") {\n      return true;\n    }\n    if (!this.expectedRemoteSei) {\n      return true;\n    }\n    return this.lastRemoteSei === this.expectedRemoteSei;\n  }\n\n  /** Detect whether the browser can send and receive H.264 SEI messages. */\n  private ensureSeiSupport(): void {\n    if (this.seiSupport !== \"unknown\") {\n      return;\n    }\n\n    void VERTC.getSupportedCodecs()\n      .then((codecs) => {\n        const supported = codecs.some((c) => c.toLowerCase() === \"h264\" || c.toLowerCase() === \"h.264\");\n        this.seiSupport = supported ? \"supported\" : \"unsupported\";\n\n        if (this.seiSupport === \"unsupported\" && !this.hasLoggedSeiUnsupported) {\n          this.hasLoggedSeiUnsupported = true;\n          this.log(\"warn\", this.i18n.t(\"rtc.seiUnsupported\"), codecs);\n        }\n\n        if (this.seiSupport === \"unsupported\") {\n          this.expectedRemoteSei = null;\n          this.emitSeiGateState();\n          this.refreshRemoteVideoBindingBestEffort();\n        } else if (this.seiSender.configured) {\n          this.seiSender.start();\n          this.emitSeiGateState();\n          this.refreshRemoteVideoBindingBestEffort();\n        }\n      })\n      .catch((error) => {\n        this.seiSupport = \"unsupported\";\n        if (!this.hasLoggedSeiUnsupported) {\n          this.hasLoggedSeiUnsupported = true;\n          this.log(\"warn\", this.i18n.t(\"rtc.getCodecsFailed\"), error);\n        }\n        this.expectedRemoteSei = null;\n        this.emitSeiGateState();\n        this.refreshRemoteVideoBindingBestEffort();\n      });\n  }\n\n  private supportsVideo(mediaType: MediaType): boolean {\n    return mediaType === MediaType.VIDEO || mediaType === MediaType.AUDIO_AND_VIDEO;\n  }\n  private supportsAudio(mediaType: MediaType): boolean {\n    return mediaType === MediaType.AUDIO || mediaType === MediaType.AUDIO_AND_VIDEO;\n  }\n  private resolveRemoteSubscriptionMediaType(publishedMediaType: MediaType): MediaType {\n    if (this.playRemoteAudio || !this.supportsAudio(publishedMediaType)) {\n      return publishedMediaType;\n    }\n    return MediaType.VIDEO;\n  }\n  private isSubscriptionCovered(current: MediaType, requested: MediaType): boolean {\n    const currentHasVideo = this.supportsVideo(current);\n    const currentHasAudio = this.supportsAudio(current);\n    const requestedHasVideo = this.supportsVideo(requested);\n    const requestedHasAudio = this.supportsAudio(requested);\n    return (!requestedHasVideo || currentHasVideo) && (!requestedHasAudio || currentHasAudio);\n  }\n  private clearVideoContainers(): void {\n    this.stopRemoteFrameWatch();\n    this.clearContainer(this.localVideoContainer);\n    this.clearContainer(this.remoteVideoContainer);\n  }\n\n  private clearContainer(container: HTMLElement | null): void {\n    container?.replaceChildren();\n  }\n\n  private getRequiredContainer(\n    container: HTMLElement | null,\n    containerType: \"local\" | \"remote\",\n  ): HTMLElement {\n    if (!container) {\n      throw new XmaxSdkError(\n        \"INVALID_INPUT\",\n        `missing ${containerType} video container`,\n      );\n    }\n    return container;\n  }\n\n  private emitRemotePlayerMounted(): void {\n    this.onRemotePlayerMounted?.();\n  }\n\n  private parseRoomEventPayload(payload: unknown): Record<string, unknown> | null {\n    const getMessageText = (input: unknown): string | null => {\n      if (typeof input === \"string\") {\n        return input.trim() || null;\n      }\n      if (!input || typeof input !== \"object\") {\n        return null;\n      }\n      const obj = input as Record<string, unknown>;\n      const direct = obj.message ?? obj.msg ?? obj.data ?? obj.payload;\n      if (typeof direct === \"string\") {\n        return direct.trim() || null;\n      }\n      return null;\n    };\n\n    const text = getMessageText(payload);\n    if (!text) {\n      return null;\n    }\n\n    try {\n      const parsed = JSON.parse(text);\n      if (!parsed || typeof parsed !== \"object\") {\n        return null;\n      }\n      return parsed as Record<string, unknown>;\n    } catch {\n      return null;\n    }\n  }\n\n  private recordGenerationAckFromRoomEvent(event: Record<string, unknown>): void {\n    if (event.event !== \"video_started\") {\n      return;\n    }\n    const generationId = typeof event.uid === \"string\"\n      ? event.uid.trim()\n      : typeof event.session_uid === \"string\"\n        ? event.session_uid.trim()\n        : \"\";\n    if (!generationId || generationId !== this.activeGenerationId) {\n      return;\n    }\n    this.diagnostics?.generationAckReceived(generationId, {\n      ok: true,\n      source_event: \"video_started\",\n    });\n  }\n\n  private log(level: RtcLogEntry[\"level\"], message: string, data?: unknown): void {\n    this.onLog?.({ level, message, data });\n  }\n\n  private logTiming(\n    stage: string,\n    startedAt: number,\n    data?: Record<string, unknown>,\n  ): void {\n    if (!ENABLE_RTC_TIMING_LOGS) {\n      return;\n    }\n    this.log(\"info\", `[RTC Timing] ${stage}`, {\n      elapsedMs: Number((performance.now() - startedAt).toFixed(1)),\n      ...data,\n    });\n  }\n\n  /** RTC stream stats are emitted about every two seconds, so this does not log per frame. */\n  private logVideoFrameDiagnostics(\n    direction: \"send\" | \"receive\",\n    width: number,\n    height: number,\n    frameRate: number,\n    userId?: string,\n    details?: Record<string, number>,\n  ): void {\n    const label = direction === \"send\" ? \"Send\" : \"Receive\";\n    const resolution = width > 0 && height > 0 ? `${width}x${height}` : \"unknown\";\n    const fps = Number(frameRate.toFixed(2));\n    this.log(\"info\", `[Xmax][RTC] ${label} video: ${resolution} @ ${fps} fps`, {\n      direction,\n      width,\n      height,\n      frameRate: fps,\n      ...(userId ? { userId } : {}),\n      ...details,\n    });\n  }\n\n  private logLocalStreamStats(stats: LocalStreamStats): void {\n    if (!this.localVideoPublished) {\n      return;\n    }\n\n    this.localStreamStatsCount += 1;\n    const nowMs = performance.now();\n    const sentFrameRate = stats.videoStats?.sentFrameRate ?? 0;\n\n    if (sentFrameRate > 0 && this.firstNonZeroSentFrameRateAtMs === 0) {\n      this.firstNonZeroSentFrameRateAtMs = nowMs;\n    }\n\n    this.lastObservedSentFrameRate = sentFrameRate;\n    this.localOutboundReadyWaiters.forEach((waiter) => {\n      if (sentFrameRate > 0) {\n        waiter.positiveSamples += 1;\n        if (waiter.positiveSamples >= waiter.minPositiveSamples) {\n          waiter.resolve();\n        }\n        return;\n      }\n      waiter.positiveSamples = 0;\n    });\n    this.evaluateLocalOutboundWatch(sentFrameRate, nowMs);\n  }\n\n  private evaluateLocalOutboundWatch(sentFrameRate: number, nowMs: number): void {\n    const state = this.localOutboundWatch;\n    if (!state || state.triggered) {\n      return;\n    }\n\n    if (typeof document !== \"undefined\" && document.visibilityState === \"hidden\") {\n      state.consecutiveZeroStats = 0;\n      return;\n    }\n\n    if (sentFrameRate > 0) {\n      state.consecutiveZeroStats = 0;\n      state.lastPositiveAtMs = nowMs;\n      return;\n    }\n\n    if (nowMs < state.graceUntilMs) {\n      state.consecutiveZeroStats = 0;\n      return;\n    }\n\n    state.consecutiveZeroStats += 1;\n    const stallMs = nowMs - state.lastPositiveAtMs;\n    if (\n      state.consecutiveZeroStats >= state.minZeroSamples &&\n      stallMs >= state.minStallMs\n    ) {\n      this.triggerLocalOutboundStall(\"zero-sent-frame-rate\");\n    }\n  }\n\n  private triggerLocalOutboundStall(\n    reason: LocalOutboundStallInfo[\"reason\"],\n  ): void {\n    const state = this.localOutboundWatch;\n    if (!state || state.triggered || this.reconnectStartedAt !== undefined) {\n      return;\n    }\n\n    state.triggered = true;\n    const nowMs = performance.now();\n    const info: LocalOutboundStallInfo = {\n      reason,\n      consecutiveZeroStats: state.consecutiveZeroStats,\n      stallMs: Math.max(0, Math.round(nowMs - state.lastPositiveAtMs)),\n      lastSentFrameRate: this.lastObservedSentFrameRate,\n    };\n    this.debugLog(\"local outbound stalled\", info);\n    state.onStalled(info);\n  }\n\n  private debugLog(message: string, data?: unknown): void {\n    if (!this.debug) {\n      return;\n    }\n    this.log(\"info\", `[debug] ${message}`, data);\n  }\n}\n","import type { RealtimeContentHint } from './types'\n\n\n/**\n * @brief 实时媒体流的默认最大编码码率。\n * 单位为 Kbps；RTC 会根据网络和设备状态在该上限内动态调整实际发送码率。\n */\nexport const DEFAULT_REALTIME_STREAM_MAX_KBPS = 1200\n\nexport const DEFAULT_MOBILE_REALTIME_STREAM_MAX_KBPS = 3000\n\n\n/**\n * @brief 实时媒体流的默认视频内容类型。\n * `detail` 表示优先保留图片、文字和复杂纹理的画面细节。\n */\nexport const DEFAULT_REALTIME_STREAM_CONTENT_HINT: RealtimeContentHint = 'detail'\n\n\n/** 实时会话的默认心跳间隔，单位为 ms。 */\nexport const DEFAULT_REALTIME_HEARTBEAT_INTERVAL_MS = 10_000\n\n\n/** 读取外部 MediaStream 视频元数据的默认等待时间，单位为 ms。 */\nexport const DEFAULT_METADATA_TIMEOUT_MS = 1000\n\n\n/** 实时连接完成后默认立即开始生成。 */\nexport const DEFAULT_REALTIME_AUTO_START = true\n\n\n/** Start 事件使用的默认内部模型名称。 */\nexport const DEFAULT_REALTIME_START_EVENT_MODEL = 'default'\n\n\n/** SDK 托管媒体的默认播放设置。 */\nexport const DEFAULT_REALTIME_PLAYBACK_SETTING = {\n  playbackRate: 1,\n}\n\n\n/** SDK 托管视图和拖拽交互的默认设置。 */\nexport const DEFAULT_REALTIME_RENDER_SETTING = {\n  mirror: false,\n  dragEnabled: true,\n}\n\n\n/**\n * @brief SDK 托管摄像头实时连接的环境默认设置。\n * 桌面端使用 `1472 × 832 @ 24fps`，移动端使用 `960 × 1280 @ 24fps`。\n */\nexport const DEFAULT_CAMERA_REALTIME_SETTINGS = {\n  desktop: {\n    width: 1472,\n    height: 832,\n    fps: 24,\n    maxKbps: DEFAULT_REALTIME_STREAM_MAX_KBPS,\n    contentHint: DEFAULT_REALTIME_STREAM_CONTENT_HINT,\n  },\n  mobile: {\n    width: 960,\n    height: 1280,\n    fps: 24,\n    maxKbps: DEFAULT_MOBILE_REALTIME_STREAM_MAX_KBPS,\n    contentHint: DEFAULT_REALTIME_STREAM_CONTENT_HINT,\n  },\n}\n","import { XmaxSdkError } from '../shared/sdk-error'\n\nexport const APPLE_MOBILE_VIDEO_CONNECT_TIMEOUT_MS = 35_000\nexport const APPLE_MOBILE_VIDEO_JOIN_TIMEOUT_MS = 15_000\nexport const APPLE_MOBILE_VIDEO_SOURCE_TIMEOUT_MS = 8_000\nexport const APPLE_MOBILE_VIDEO_ENCODER_TIMEOUT_MS = 8_000\nexport const APPLE_MOBILE_VIDEO_PUBLISH_TIMEOUT_MS = 15_000\nexport const APPLE_MOBILE_VIDEO_OUTBOUND_TIMEOUT_MS = 10_000\nexport const APPLE_MOBILE_VIDEO_START_SEND_TIMEOUT_MS = 5_000\n\nexport class AppleMobileVideoStageTimeoutError extends XmaxSdkError {\n  constructor(message: string) {\n    super('WEB_RTC_ERROR', message)\n    this.name = 'AppleMobileVideoStageTimeoutError'\n  }\n}\n\nexport async function withAppleMobileVideoStageTimeout<T>(\n  operation: () => Promise<T>,\n  options: {\n    stage: string\n    timeoutMs: number\n    message: string\n  },\n): Promise<T> {\n  let timeoutId: ReturnType<typeof setTimeout> | null = null\n  const timeout = new Promise<never>((_resolve, reject) => {\n    timeoutId = setTimeout(() => {\n      reject(new AppleMobileVideoStageTimeoutError(\n        options.message,\n      ))\n    }, options.timeoutMs)\n  })\n\n  try {\n    return await Promise.race([operation(), timeout])\n  } finally {\n    if (timeoutId !== null) {\n      clearTimeout(timeoutId)\n    }\n  }\n}\n","export const PREVIEW_UPLOAD_LAYOUT_ATTR = 'data-preview-upload-layout'\n\n/** Legacy upload orientation marker; retained for render-mode compatibility. */\nexport const PREVIEW_UPLOAD_FIT_ATTR = 'data-preview-upload-fit'\n\nexport const PREVIEW_OUTPUT_LAYOUT_ATTR = 'data-preview-output-layout'\n\nexport const PREVIEW_CONTAIN_ATTR = 'data-preview-contain'\n\nexport const PREVIEW_COVER_ATTR = 'data-preview-cover'\n\nfunction hasFitPreviewLayout(container: HTMLElement): boolean {\n  return (\n    container.hasAttribute(PREVIEW_UPLOAD_LAYOUT_ATTR)\n    || container.hasAttribute(PREVIEW_OUTPUT_LAYOUT_ATTR)\n    || container.hasAttribute(PREVIEW_CONTAIN_ATTR)\n    || container.closest(`[${PREVIEW_UPLOAD_LAYOUT_ATTR}]`) !== null\n    || container.closest(`[${PREVIEW_OUTPUT_LAYOUT_ATTR}]`) !== null\n    || container.closest(`[${PREVIEW_CONTAIN_ATTR}]`) !== null\n  )\n}\n\nfunction hasCoverPreviewLayout(container: HTMLElement): boolean {\n  return (\n    container.hasAttribute(PREVIEW_COVER_ATTR)\n    || container.closest(`[${PREVIEW_COVER_ATTR}]`) !== null\n  )\n}\n\n/** Apply true contain rendering for every uploaded-media aspect ratio. */\nexport function applyUploadPreviewMediaLayout(container: HTMLElement): void {\n  if (hasCoverPreviewLayout(container)) {\n    return\n  }\n\n  if (!hasFitPreviewLayout(container)) {\n    return\n  }\n\n  container.style.overflow = 'hidden'\n  container.style.display = 'flex'\n  container.style.alignItems = 'center'\n  container.style.justifyContent = 'center'\n\n  container.querySelectorAll('div').forEach((node) => {\n    if (node === container) {\n      return\n    }\n    const el = node as HTMLElement\n    el.style.width = '100%'\n    el.style.height = '100%'\n    el.style.display = 'flex'\n    el.style.alignItems = 'center'\n    el.style.justifyContent = 'center'\n    el.style.overflow = 'hidden'\n  })\n\n  container.querySelectorAll('video, canvas').forEach((node) => {\n    const el = node as HTMLElement\n    el.style.display = 'block'\n    el.style.objectFit = 'contain'\n    el.style.objectPosition = 'center'\n    el.style.position = 'relative'\n    el.style.left = 'auto'\n    el.style.right = 'auto'\n    el.style.top = 'auto'\n    el.style.bottom = 'auto'\n    el.style.transform = 'none'\n    el.style.width = '100%'\n    el.style.height = '100%'\n    el.style.maxWidth = 'none'\n    el.style.maxHeight = 'none'\n    el.style.margin = '0'\n  })\n}\n\nexport function observeUploadPreviewMediaLayout(container: HTMLElement): () => void {\n  if (!hasFitPreviewLayout(container) && !hasCoverPreviewLayout(container)) {\n    return () => {}\n  }\n\n  let rafId: number | null = null\n  const apply = () => applyUploadPreviewMediaLayout(container)\n  const scheduleApply = () => {\n    if (rafId !== null) {\n      return\n    }\n    rafId = requestAnimationFrame(() => {\n      rafId = null\n      apply()\n    })\n  }\n\n  apply()\n  const observer = new MutationObserver(() => scheduleApply())\n  observer.observe(container, {\n    childList: true,\n    subtree: true,\n    attributes: true,\n  })\n  return () => {\n    if (rafId !== null) {\n      cancelAnimationFrame(rafId)\n    }\n    observer.disconnect()\n  }\n}\n","export type RemoteSeiReceivedPayload = {\n  sei: string\n  userId: string\n}\n\nexport type SeiGateState = {\n  expectedSei: string | null\n  sei: string | null\n  userId: string | null\n  matched: boolean\n}\n\nexport type RtcSessionSeiOptions = {\n  repeatCount?: number\n}\n\ntype RtcSeiSenderOptions = {\n  canSend: () => boolean\n  send: (message: string, repeatCount: number) => unknown\n  onError: (error: unknown) => void\n}\n\n/** Refresh repeated SEI coverage at a moderate cadence. */\nconst SESSION_SEI_INTERVAL_MS = 200\nconst DEFAULT_SEI_REPEAT_COUNT = 4\n/** Matches @volcengine/rtc SEI_TIME_OUT; keep the console filter until in-flight timeouts settle. */\nconst SEI_TIMEOUT_MS = 2000\nconst SEI_TIMEOUT_CONSOLE_PATTERN = /timeout for sei message/i\n\nlet seiTimeoutConsoleFilterDepth = 0\nlet originalConsoleError: ((...args: unknown[]) => void) | null = null\n\n/**\n * Mute Volcengine's hard-coded `console.error` for SEI send timeouts.\n * `setLogConfig` does not cover this path — the SDK logs it directly.\n */\nfunction acquireSeiTimeoutConsoleFilter(): () => void {\n  if (seiTimeoutConsoleFilterDepth === 0) {\n    originalConsoleError = console.error.bind(console)\n    console.error = (...args: unknown[]) => {\n      const first = args[0]\n      if (typeof first === 'string' && SEI_TIMEOUT_CONSOLE_PATTERN.test(first)) {\n        return\n      }\n      originalConsoleError?.(...args)\n    }\n  }\n  seiTimeoutConsoleFilterDepth += 1\n\n  let released = false\n  return () => {\n    if (released) {\n      return\n    }\n    released = true\n    seiTimeoutConsoleFilterDepth = Math.max(0, seiTimeoutConsoleFilterDepth - 1)\n    if (seiTimeoutConsoleFilterDepth === 0 && originalConsoleError) {\n      console.error = originalConsoleError as typeof console.error\n      originalConsoleError = null\n    }\n  }\n}\n\n/** Normalize task ids so local and remote SEI values use the same representation. */\nexport function normalizeSei(value: string | null | undefined): string | null {\n  const normalized = value?.trim()\n  if (!normalized) {\n    return null\n  }\n  return normalized.startsWith('task-') ? normalized.slice('task-'.length) : normalized\n}\n\n/** Decode an RTC SEI payload without allowing malformed data to break event handling. */\nexport function decodeSeiMessage(sei: Uint8Array): string | null {\n  try {\n    return new TextDecoder().decode(sei)\n  } catch {\n    return null\n  }\n}\n\n/** Keep local task SEI sending separate from RTC room and rendering responsibilities. */\nexport class RtcSeiSender {\n  private message: string | null = null\n  private repeatCount = DEFAULT_SEI_REPEAT_COUNT\n  private timer: ReturnType<typeof setInterval> | null = null\n  private hasReportedError = false\n  private sendEpoch = 0\n  private releaseConsoleFilter: (() => void) | null = null\n  private releaseConsoleFilterTimer: ReturnType<typeof setTimeout> | null = null\n\n  /** Create a sender backed by the owning RTC manager's readiness and send operations. */\n  constructor(private readonly options: RtcSeiSenderOptions) {}\n\n  /** Replace the active task message and stop any timer that belonged to the previous task. */\n  configure(message: string | null, options: RtcSessionSeiOptions, frameRate: number): void {\n    this.stop()\n    this.message = message\n    this.repeatCount = resolveRepeatCount(options.repeatCount, frameRate)\n    this.hasReportedError = false\n  }\n\n  /** Whether a task message is currently configured for sending. */\n  get configured(): boolean {\n    return this.message !== null\n  }\n\n  /** Start sending immediately and continue at the configured cadence. */\n  start(): void {\n    this.stop()\n    if (!this.message) {\n      return\n    }\n\n    this.holdSeiTimeoutConsoleFilter()\n    this.timer = setInterval(() => this.sendIfReady(), SESSION_SEI_INTERVAL_MS)\n    this.sendIfReady()\n  }\n\n  /** Stop future sends without changing the configured task message. */\n  stop(): void {\n    this.sendEpoch++\n    if (this.timer !== null) {\n      clearInterval(this.timer)\n      this.timer = null\n    }\n    this.scheduleReleaseSeiTimeoutConsoleFilter()\n  }\n\n  /** Send only while ready; handle both thrown errors and returned promise rejections. */\n  private sendIfReady(): void {\n    if (!this.message || !this.options.canSend()) {\n      return\n    }\n\n    const epoch = this.sendEpoch\n    const failed = (error: unknown) => {\n      if (epoch !== this.sendEpoch) return\n      if (!this.hasReportedError) {\n        this.hasReportedError = true\n        this.options.onError(error)\n      }\n      this.stop()\n    }\n    try {\n      const result = this.options.send(this.message, this.repeatCount)\n      if (result && typeof (result as PromiseLike<unknown>).then === 'function') {\n        void Promise.resolve(result).catch(failed)\n      }\n    } catch (error) { failed(error) }\n  }\n\n  private holdSeiTimeoutConsoleFilter(): void {\n    if (this.releaseConsoleFilterTimer !== null) {\n      clearTimeout(this.releaseConsoleFilterTimer)\n      this.releaseConsoleFilterTimer = null\n    }\n    if (!this.releaseConsoleFilter) {\n      this.releaseConsoleFilter = acquireSeiTimeoutConsoleFilter()\n    }\n  }\n\n  private scheduleReleaseSeiTimeoutConsoleFilter(): void {\n    if (!this.releaseConsoleFilter || this.releaseConsoleFilterTimer !== null) {\n      return\n    }\n    this.releaseConsoleFilterTimer = setTimeout(() => {\n      this.releaseConsoleFilterTimer = null\n      this.releaseConsoleFilter?.()\n      this.releaseConsoleFilter = null\n    }, SEI_TIMEOUT_MS)\n  }\n}\n\n/** Clamp repeatCount to the range accepted by the RTC SDK for the configured frame rate. */\nfunction resolveRepeatCount(value: number | undefined, frameRate: number): number {\n  const maxRepeatCount = Math.min(30, Math.max(0, Math.floor(frameRate * 2)))\n  if (typeof value !== 'number' || !Number.isFinite(value)) {\n    return Math.min(DEFAULT_SEI_REPEAT_COUNT, maxRepeatCount)\n  }\n  return Math.max(0, Math.min(maxRepeatCount, Math.floor(value)))\n}\n","// Stable public API\nexport { configureXmaxTelemetry } from './telemetry/collector'\nexport type { XmaxReportSource, XmaxTelemetryOptions, XmaxTelemetryParams, XmaxTelemetryEvent, XmaxTelemetryEventName } from './telemetry/collector'\nexport {\n  XMAX_TELEMETRY_CONFIG_ENDPOINTS,\n  XMAX_TELEMETRY_DEFAULT_CONFIG_ENDPOINT,\n} from './telemetry/probe-config'\nexport type { ResolvedXmaxProbeConfig, XmaxProbeOptions } from './telemetry/probe-config'\nexport { XMAX_DISCONNECT_REASON_CODES } from './telemetry/startup'\nexport type { XmaxDisconnectReasonCode } from './telemetry/startup'\nexport { isTelemetryEndpointConfigured, XMAX_TELEMETRY_DEFAULT_ENDPOINT, XMAX_TELEMETRY_ENDPOINTS } from './telemetry/backend'\nexport type {\n  XmaxTelemetryDeviceMeta,\n  XmaxTelemetryEnvelope,\n  XmaxTelemetryMeta,\n  XmaxTelemetryNetworkMeta,\n  XmaxTelemetryPayload,\n  XmaxTelemetryProbeMeta,\n  XmaxTelemetryRtcStats,\n  XmaxTelemetryWireEvent,\n} from './telemetry/backend'\nexport * from './api/client'\nexport * from './rtc/rtc-events'\nexport * from './rtc/rtc-manager'\nexport type { RemoteSeiReceivedPayload, SeiGateState } from './rtc/sei'\nexport * from './rtc/media/video-file-stream'\nexport * from './rtc/media/media-file-stream'\nexport * from './rtc/media/reference-video-size'\nexport * from './rtc/media/camera-errors'\nexport * from './files/ref-image'\nexport * from './files/download'\nexport * from './rtc/media/publish-fps'\nexport * from './rtc/render/preview-media-layout'\nexport * from './i18n'\nexport { XmaxSdkError, isXmaxSdkError } from './shared/sdk-error'\nexport type { XmaxErrorCode } from './shared/sdk-error'\nexport type { XmaxErrorDetails } from './shared/error-details'\nexport type { XmaxErrorNotifier } from './shared/error-utils'\nexport {\n  XMAX_MIN_RECOMMENDED_INPUT_SHORT_EDGE,\n  type XmaxLowInputResolutionNotice,\n  type XmaxNoticeCode,\n  type XmaxNoticeInputKind,\n  type XmaxNoticeNotifier,\n  type XmaxSdkNotice,\n} from './shared/sdk-notice'\nexport type { ModelDefinition } from './shared/model'\n\nexport { createXmaxClient } from './client/create-client'\nexport type { XmaxClient, XmaxClientOptions } from './client/types'\nexport type { FileClient } from './files/client'\nexport {\n  DEFAULT_OFFLINE_POLL_INTERVAL_MS,\n  DEFAULT_OFFLINE_POLL_TIMEOUT_MS,\n  XMAX_OFFLINE_API_BASE_URLS,\n  XMAX_OFFLINE_API_PRODUCTION_BASE_URL,\n} from './offline/client'\nexport type { OfflineClient } from './offline/types'\nexport type * from './offline/types'\nexport { OFFLINE_TASK_SUPPORTED_FPS } from './offline/types'\nexport { models, type Models } from './realtime/models'\nexport {\n  DEFAULT_CAMERA_REALTIME_SETTINGS,\n  DEFAULT_REALTIME_STREAM_CONTENT_HINT,\n  DEFAULT_REALTIME_STREAM_MAX_KBPS,\n} from './realtime/default'\nexport { resolveDefaultCameraRealtimeSetting } from './realtime/camera'\nexport type { RealtimeClient } from './realtime/client'\nexport type { RealtimeSession } from './realtime/session'\nexport type * from './realtime/types'\n\nexport { createDragTrackController, type DragTrackControllerOptions } from './drag/drag-track-controller'\nexport type { DragTrackController } from './drag/drag-track-controller'\nexport {\n  mapTargetPointToCanvas,\n  mapViewportPointToCoordinateSpace,\n} from './drag/map-viewport'\nexport { createRemoteViewHost, type RemoteViewHost } from './drag/remote-view-host'\nexport {\n  observeDragSurfaceVideoSync,\n  syncDragSurfaceToVideo,\n} from './drag/drag-video-sync'\n","import { createSDKI18n } from '../../i18n'\nimport { XmaxSdkError } from '../../shared/sdk-error'\nimport {\n  createImageFileStream,\n  type ImageFileStreamOptions,\n} from './image-file-stream'\nimport {\n  normalizeHeicImageFile,\n} from './heic-image'\nimport type { VideoFileStream } from './video-file-stream'\n\nexport {\n  createImageFileStream,\n  type ImageFileStreamOptions,\n} from './image-file-stream'\nexport {\n  isHeicImageFile,\n  normalizeHeicImageFile,\n  type NormalizeHeicImageOptions,\n} from './heic-image'\n\nexport function isImageMediaFile(file: Blob | string): boolean {\n  if (typeof file === 'string') {\n    return /\\.(png|jpe?g|webp|gif|bmp|heic|heif)$/i.test(file.split('?')[0])\n  }\n  if (file.type.startsWith('image/')) {\n    return true\n  }\n  const name = 'name' in file && typeof file.name === 'string' ? file.name.toLowerCase() : ''\n  return /\\.(png|jpe?g|webp|gif|bmp|heic|heif)$/.test(name)\n}\n\nexport function isVideoMediaFile(file: Blob | string): boolean {\n  if (typeof file === 'string') {\n    return /\\.(mp4|mov|webm|m4v|avi|mkv)$/i.test(file.split('?')[0])\n  }\n  if (file.type.startsWith('video/')) {\n    return true\n  }\n  const name = 'name' in file && typeof file.name === 'string' ? file.name.toLowerCase() : ''\n  return /\\.(mp4|mov|webm|m4v|avi|mkv)$/.test(name)\n}\n\nexport async function createMediaFileStream(\n  fileOrUrl: Blob | string,\n  options: ImageFileStreamOptions = {},\n): Promise<VideoFileStream> {\n  const normalizedFileOrUrl = typeof fileOrUrl === 'string'\n    ? fileOrUrl\n    : (typeof File !== 'undefined' && fileOrUrl instanceof File\n        ? await normalizeHeicImageFile(fileOrUrl)\n        : fileOrUrl)\n\n  if (isImageMediaFile(normalizedFileOrUrl)) {\n    return createImageFileStream(normalizedFileOrUrl, options)\n  }\n  if (isVideoMediaFile(normalizedFileOrUrl)) {\n    const { createVideoFileStream } = await import('./video-file-stream')\n    return createVideoFileStream(normalizedFileOrUrl, options)\n  }\n\n  const i18n = options.i18n ?? createSDKI18n()\n  const typeStr = typeof normalizedFileOrUrl === 'string'\n    ? 'url'\n    : (normalizedFileOrUrl.type || 'unknown')\n  throw new XmaxSdkError(\n    'UNSUPPORTED_MEDIA',\n    i18n.t('errors.invalidMediaFileType', { type: typeStr }),\n  )\n}\n","import { createSDKI18n, type SDKI18n } from '../../i18n'\nimport { XmaxSdkError } from '../../shared/sdk-error'\nimport { resolveUploadVideoSize } from './reference-video-size'\nimport type { VideoFileStream, VideoFileStreamOptions } from './video-file-stream'\nimport { createCanvasPosterUrl, drawSourceCover } from '../canvas/canvas-frame-draw'\n\nimport { resolveRtcPublishFps } from './publish-fps'\n\nexport type ImageFileStreamOptions = VideoFileStreamOptions\n\nfunction loadImageElement(url: string, crossOrigin: boolean): Promise<HTMLImageElement> {\n  return new Promise((resolve, reject) => {\n    const image = new Image()\n    if (crossOrigin) {\n      image.crossOrigin = 'anonymous'\n    }\n    image.onload = () => resolve(image)\n    image.onerror = () => reject(new Error('failed to load image'))\n    image.src = url\n  })\n}\n\nexport async function createImageFileStream(\n  fileOrUrl: Blob | string,\n  options: ImageFileStreamOptions = {},\n): Promise<VideoFileStream> {\n  const i18n = options.i18n ?? createSDKI18n()\n  const isUrl = typeof fileOrUrl === 'string'\n  const url = isUrl ? fileOrUrl : URL.createObjectURL(fileOrUrl)\n\n  let imageEl: HTMLImageElement\n  try {\n    imageEl = await loadImageElement(url, isUrl)\n  } catch {\n    if (!isUrl) URL.revokeObjectURL(url)\n    throw new XmaxSdkError('MEDIA_PROCESSING_ERROR', i18n.t('errors.imageLoadFailed'))\n  }\n\n  const sourceWidth = imageEl.naturalWidth || imageEl.width || 0\n  const sourceHeight = imageEl.naturalHeight || imageEl.height || 0\n  if (!sourceWidth || !sourceHeight) {\n    if (!isUrl) URL.revokeObjectURL(url)\n    throw new XmaxSdkError('MEDIA_PROCESSING_ERROR', i18n.t('errors.imageTrackMissing'))\n  }\n\n  const [outputWidth, outputHeight] = options.targetSize\n    ?? resolveUploadVideoSize(sourceWidth, sourceHeight)\n\n  const canvas = document.createElement('canvas')\n  canvas.width = outputWidth\n  canvas.height = outputHeight\n  const ctx = canvas.getContext('2d')\n  if (!ctx) {\n    if (!isUrl) URL.revokeObjectURL(url)\n    throw new XmaxSdkError('UNSUPPORTED_MEDIA', i18n.t('errors.captureStreamUnsupported'))\n  }\n\n  const fps = resolveRtcPublishFps({ mobile: options.mobile, fps: options.fps })\n  const frameIntervalMs = Math.max(1, Math.round(1000 / fps))\n  const captureStreamFn =\n    (canvas as HTMLCanvasElement & { captureStream?: (frameRate?: number) => MediaStream }).captureStream ??\n    (canvas as HTMLCanvasElement & { mozCaptureStream?: (frameRate?: number) => MediaStream }).mozCaptureStream\n\n  if (!captureStreamFn) {\n    if (!isUrl) URL.revokeObjectURL(url)\n    throw new XmaxSdkError('UNSUPPORTED_MEDIA', i18n.t('errors.captureStreamUnsupported'))\n  }\n\n  const previewStream = captureStreamFn.call(canvas, fps)\n  const videoTrack = previewStream.getVideoTracks()[0]\n\n  if (!videoTrack) {\n    if (!isUrl) URL.revokeObjectURL(url)\n    throw new XmaxSdkError('MEDIA_PROCESSING_ERROR', i18n.t('errors.imageTrackMissing'))\n  }\n\n  let intervalId: ReturnType<typeof setInterval> | null = null\n  let destroyed = false\n\n  const drawFrame = () => {\n    if (destroyed) {\n      return\n    }\n    drawSourceCover(\n      ctx,\n      imageEl,\n      outputWidth,\n      outputHeight,\n      sourceWidth,\n      sourceHeight,\n      options.backgroundColor,\n    )\n  }\n\n  drawFrame()\n  const posterUrl = await createCanvasPosterUrl(canvas, options.poster)\n  intervalId = setInterval(drawFrame, frameIntervalMs)\n\n  const videoEl = document.createElement('video')\n  videoEl.muted = true\n  videoEl.playsInline = true\n\n  const destroy = () => {\n    destroyed = true\n\n    if (intervalId !== null) {\n      clearInterval(intervalId)\n      intervalId = null\n    }\n\n    try {\n      videoTrack.stop()\n    } catch {\n    }\n\n    try {\n      previewStream.getTracks().forEach((track) => {\n        if (track.readyState !== 'ended') {\n          track.stop()\n        }\n      })\n    } catch {\n    }\n\n    try {\n      imageEl.src = ''\n    } catch {\n    }\n\n    try {\n      videoEl.remove()\n    } catch {\n    }\n\n    if (posterUrl) {\n      URL.revokeObjectURL(posterUrl)\n    }\n    if (!isUrl) URL.revokeObjectURL(url)\n  }\n\n  return {\n    url,\n    ...(posterUrl ? { posterUrl } : {}),\n    previewStream,\n    videoEl,\n    videoTrack,\n    fps,\n    width: outputWidth,\n    height: outputHeight,\n    sourceWidth,\n    sourceHeight,\n    destroy,\n  }\n}\n","import { toXmaxSdkError, XmaxSdkError } from '../../shared/sdk-error'\n\nconst HEIC_EXTENSION_RE = /\\.(?:heic|heif)$/i\nconst HEIC_MIME_TYPES = new Set([\n  'image/heic',\n  'image/heif',\n  'image/heic-sequence',\n  'image/heif-sequence',\n])\n\nconst HEIF_BRANDS = new Set([\n  'heic',\n  'heix',\n  'hevc',\n  'hevx',\n  'heim',\n  'heis',\n  'hevm',\n  'hevs',\n  'mif1',\n  'msf1',\n])\n\nfunction readAscii(bytes: Uint8Array, offset: number, length: number): string {\n  let value = ''\n  for (let index = offset; index < offset + length && index < bytes.length; index += 1) {\n    value += String.fromCharCode(bytes[index])\n  }\n  return value\n}\n\nasync function hasHeifFileSignature(file: File): Promise<boolean> {\n  const bytes = new Uint8Array(await file.slice(0, 64).arrayBuffer())\n  if (bytes.length < 12 || readAscii(bytes, 4, 4) !== 'ftyp') {\n    return false\n  }\n\n  const brands: string[] = []\n  for (let offset = 8; offset + 4 <= bytes.length; offset += 4) {\n    brands.push(readAscii(bytes, offset, 4).toLowerCase())\n  }\n\n  // AVIF also uses the ISO BMFF container and can advertise mif1. Do not\n  // accidentally send it through the HEVC decoder.\n  if (brands.includes('avif') || brands.includes('avis')) {\n    return false\n  }\n\n  return brands.some((brand) => HEIF_BRANDS.has(brand))\n}\n\n/** Detect HEIC/HEIF even when a browser supplies an empty or generic MIME type. */\nexport async function isHeicImageFile(file: File): Promise<boolean> {\n  const mime = file.type.toLowerCase()\n  if (HEIC_EXTENSION_RE.test(file.name) || HEIC_MIME_TYPES.has(mime)) {\n    return true\n  }\n\n  return hasHeifFileSignature(file)\n}\n\nexport type NormalizeHeicImageOptions = {\n  /** JPEG quality used for browser-compatible output. Defaults to 0.9. */\n  quality?: number\n}\n\n/**\n * Convert HEIC/HEIF to JPEG before browser preview, Canvas, RTC, or upload.\n * Every other file is returned unchanged and does not load the WASM decoder.\n */\nexport async function normalizeHeicImageFile(\n  file: File,\n  options: NormalizeHeicImageOptions = {},\n): Promise<File> {\n  try {\n    if (!(await isHeicImageFile(file))) {\n      return file\n    }\n\n    const { heicTo, isHeic } = await import('heic-to/csp')\n    if (!(await isHeic(file))) {\n      throw new XmaxSdkError('INVALID_INPUT', 'The selected file is not a valid HEIC/HEIF image')\n    }\n\n    const blob = await heicTo({\n      blob: file,\n      type: 'image/jpeg',\n      quality: options.quality ?? 0.9,\n    })\n    const baseName = file.name.replace(/\\.(?:heic|heif)$/i, '') || 'image'\n\n    return new File([blob], `${baseName}.jpg`, {\n      type: 'image/jpeg',\n      lastModified: file.lastModified,\n    })\n  } catch (error) {\n    throw toXmaxSdkError(error, {\n      code: 'MEDIA_PROCESSING_ERROR',\n      message: 'Failed to decode HEIC/HEIF image',\n    })\n  }\n}\n","const CAMERA_ACCESS_ERROR_NAMES = new Set([\n  'NotFoundError',\n  'NotAllowedError',\n  'PermissionDeniedError',\n  'NotReadableError',\n  'OverconstrainedError',\n  'ConstraintNotSatisfiedError',\n  'AbortError',\n  'SecurityError',\n])\n\nexport type CameraEnvironmentIssue = 'insecure-context' | 'api-unavailable'\n\n/** Detect browser conditions that prevent RTC from opening the camera. */\nexport function getCameraEnvironmentIssue(): CameraEnvironmentIssue | null {\n  if (typeof window === 'undefined') {\n    return 'api-unavailable'\n  }\n  if (!window.isSecureContext) {\n    return 'insecure-context'\n  }\n  if (typeof navigator?.mediaDevices !== 'object') {\n    return 'api-unavailable'\n  }\n  return null\n}\n\nexport type CameraAccessErrorKind =\n  | 'not-found'\n  | 'not-allowed'\n  | 'permission-denied'\n  | 'in-use'\n  | 'overconstrained'\n  | 'unsupported'\n  | 'capture-unsupported'\n  | 'generic'\n\n/** True for camera failures that should prompt the user to open or allow the device camera. */\nexport function isCameraAccessError(error: unknown): boolean {\n  return classifyCameraAccessError(error) !== null\n}\n\n/** Map browser or RTC camera failures to a stable category for user-facing copy. */\nexport function classifyCameraAccessError(error: unknown): CameraAccessErrorKind | null {\n  if (error instanceof DOMException) {\n    switch (error.name) {\n      case 'NotFoundError':\n        return 'not-found'\n      case 'NotAllowedError':\n        return 'not-allowed'\n      case 'PermissionDeniedError':\n        return 'permission-denied'\n      case 'NotReadableError':\n        return 'in-use'\n      case 'OverconstrainedError':\n      case 'ConstraintNotSatisfiedError':\n        return 'overconstrained'\n      case 'TypeError':\n      case 'AbortError':\n      case 'SecurityError':\n        return 'generic'\n      default:\n        return CAMERA_ACCESS_ERROR_NAMES.has(error.name) ? 'generic' : null\n    }\n  }\n\n  if (error instanceof Error) {\n    if (error.message.includes('Camera is not supported')) {\n      return 'unsupported'\n    }\n    if (error.message.includes('captureStream is not supported')) {\n      return 'capture-unsupported'\n    }\n    if (error.message.includes('No active video track')) {\n      return 'in-use'\n    }\n  }\n\n  return null\n}\n","import type { XmaxOpenClient } from '../api/client'\nimport { toXmaxSdkError, XmaxSdkError } from '../shared/sdk-error'\n\nexport async function resolveRefImageUrl(\n  client: XmaxOpenClient,\n  input: File | string,\n): Promise<string> {\n  if (input instanceof File) {\n    return (await client.uploadImage(input)).url\n  }\n\n  const raw = input.trim()\n  if (!raw) {\n    return ''\n  }\n\n  if (/^https?:\\/\\//i.test(raw)) {\n    return raw\n  }\n\n  let res: Response\n  try {\n    res = await fetch(raw)\n  } catch (error) {\n    throw toXmaxSdkError(error, {\n      code: 'MEDIA_PROCESSING_ERROR',\n      message: 'Failed to load ref image',\n    })\n  }\n  if (!res.ok) {\n    throw new XmaxSdkError('MEDIA_PROCESSING_ERROR', `Failed to load ref image: ${res.status}`)\n  }\n\n  let blob: Blob\n  try {\n    blob = await res.blob()\n  } catch (error) {\n    throw toXmaxSdkError(error, {\n      code: 'MEDIA_PROCESSING_ERROR',\n      message: 'Failed to read ref image response',\n    })\n  }\n  const mime = blob.type || 'image/png'\n  const ext =\n    mime === 'image/jpeg' ? 'jpg' :\n    mime === 'image/webp' ? 'webp' :\n    mime === 'image/gif' ? 'gif' :\n    'png'\n  const file = new File([blob], `ref.${ext}`, { type: mime })\n  return (await client.uploadImage(file)).url\n}\n","export type DownloadRemoteFileOptions = {\n  filename?: string\n  /** @deprecated Direct attachment downloads do not use the system share sheet. */\n  preferShare?: boolean\n}\n\n/**\n * @deprecated Direct attachment downloads need no browser-side prefetch.\n * Kept as a compatibility no-op for existing SDK consumers.\n */\nexport async function prefetchRemoteFile(url: string): Promise<boolean> {\n  return Boolean(url.trim())\n}\n\n/** @deprecated Direct attachment downloads are ready as soon as their URL exists. */\nexport function isRemoteFilePrefetched(url: string): boolean {\n  return Boolean(url.trim())\n}\n\n/** @deprecated Direct attachment downloads keep no browser-side cache. */\nexport function clearPrefetchedRemoteFile(_url?: string): void {\n}\n\n/**\n * Navigate directly to a remote download URL. The remote server must return\n * `Content-Disposition: attachment`; this keeps large files out of page memory\n * and lets the browser or operating-system download manager stream the response.\n */\nexport async function downloadRemoteFile(\n  url: string,\n  options: DownloadRemoteFileOptions = {},\n): Promise<boolean> {\n  const trimmed = url.trim()\n  if (!trimmed || typeof document === 'undefined') {\n    return false\n  }\n  const anchor = document.createElement('a')\n  anchor.href = trimmed\n  anchor.rel = 'noopener'\n  const filename = options.filename?.trim()\n  if (filename) {\n    // Same-origin browsers may honor this hint; cross-origin downloads use the\n    // response header or URL path for their filename.\n    anchor.download = filename\n  }\n  anchor.style.display = 'none'\n  document.body.appendChild(anchor)\n  anchor.click()\n  anchor.remove()\n  return true\n}\n","export const XMAX_MIN_RECOMMENDED_INPUT_SHORT_EDGE = 480 as const\n\nexport type XmaxNoticeCode = 'LOW_INPUT_RESOLUTION'\n\nexport type XmaxNoticeInputKind = 'camera' | 'image' | 'video' | 'stream'\n\nexport type XmaxLowInputResolutionNotice = {\n  readonly code: 'LOW_INPUT_RESOLUTION'\n  readonly message: string\n  readonly details: {\n    readonly inputKind: XmaxNoticeInputKind\n    readonly width: number\n    readonly height: number\n    readonly shortEdge: number\n    readonly minimumShortEdge: typeof XMAX_MIN_RECOMMENDED_INPUT_SHORT_EDGE\n  }\n}\n\nexport type XmaxSdkNotice = XmaxLowInputResolutionNotice\n\n/** Non-fatal SDK notice callback. The notice never interrupts the active operation. */\nexport type XmaxNoticeNotifier = (notice: XmaxSdkNotice) => void\n\nexport function createLowInputResolutionNotice(input: {\n  inputKind: XmaxNoticeInputKind\n  width: number\n  height: number\n  message: string\n}): XmaxLowInputResolutionNotice | null {\n  const { inputKind, width, height, message } = input\n  if (\n    !Number.isFinite(width)\n    || !Number.isFinite(height)\n    || width <= 0\n    || height <= 0\n  ) {\n    return null\n  }\n\n  const shortEdge = Math.min(width, height)\n  if (shortEdge > XMAX_MIN_RECOMMENDED_INPUT_SHORT_EDGE) {\n    return null\n  }\n\n  return Object.freeze({\n    code: 'LOW_INPUT_RESOLUTION',\n    message,\n    details: Object.freeze({\n      inputKind,\n      width,\n      height,\n      shortEdge,\n      minimumShortEdge: XMAX_MIN_RECOMMENDED_INPUT_SHORT_EDGE,\n    }),\n  })\n}\n\n/** Schedule a consumer notice without delaying or failing the SDK operation. */\nexport function notifyNotice(\n  notice: XmaxSdkNotice,\n  notifier: XmaxNoticeNotifier | undefined,\n): void {\n  if (!notifier) {\n    return\n  }\n\n  const run = () => {\n    try {\n      notifier(notice)\n    } catch {\n      // Consumer notice handlers must never interrupt media connection or publishing.\n    }\n  }\n\n  if (typeof queueMicrotask === 'function') {\n    queueMicrotask(run)\n    return\n  }\n  void Promise.resolve().then(run)\n}\n","import type {\n  RequestOptions,\n  UploadImageResult,\n  UploadVideoResult,\n  XmaxOpenClient,\n} from '../api/client'\n\nexport type FileClient = {\n  /** Upload an image file and return its remote URL metadata. Accepts an optional abort signal. */\n  uploadImage: (file: File, options?: RequestOptions) => Promise<UploadImageResult>\n  /** Upload a video file and return its remote URL metadata. Accepts an optional abort signal. */\n  uploadVideo: (file: File, options?: RequestOptions) => Promise<UploadVideoResult>\n  /** Alias of `uploadImage()` retained by the file client. */\n  upload: (file: File, options?: RequestOptions) => Promise<UploadImageResult>\n  /**\n   * Upload then run `/cos/image/check`.\n   * Returns the upload metadata with the checked image URL.\n   *\n   * @example\n   * ```ts\n   * const result = await client.files.uploadAndCheckImage(file)\n   * await session.set({\n   *   prompt: session.context.prompt,\n   *   refImageUrl: result.url,\n   * })\n   * ```\n   */\n  uploadAndCheckImage: (file: File, options?: RequestOptions) => Promise<UploadImageResult>\n}\n\n/** @internal Create the file capability exposed by {@link XmaxClient.files}. */\nexport function createFileClient(client: XmaxOpenClient): FileClient {\n  return {\n    uploadImage: (file: File, options?: RequestOptions) => options\n      ? client.uploadImage(file, options)\n      : client.uploadImage(file),\n    uploadVideo: (file: File, options?: RequestOptions) => options\n      ? client.uploadVideo(file, options)\n      : client.uploadVideo(file),\n    upload: (file: File, options?: RequestOptions) => options\n      ? client.uploadImage(file, options)\n      : client.uploadImage(file),\n    uploadAndCheckImage: (file: File, options?: RequestOptions) => options\n      ? client.uploadAndCheckImage(file, options)\n      : client.uploadAndCheckImage(file),\n  }\n}\n","import {\n  toXmaxSdkError,\n  XmaxSdkError,\n} from '../../shared/sdk-error'\n\nexport type CameraPreflightOptions = {\n  facingMode?: 'user' | 'environment'\n  width: number\n  height: number\n  frameRate: number\n}\n\nfunction isOverconstrainedError(error: unknown): boolean {\n  if (!error || typeof error !== 'object') {\n    return false\n  }\n  const name = (error as { name?: unknown }).name\n  return name === 'OverconstrainedError' || name === 'ConstraintNotSatisfiedError'\n}\n\nfunction stopStreamTracks(stream: MediaStream | null): void {\n  if (!stream) {\n    return\n  }\n  stream.getTracks().forEach((track) => {\n    try {\n      track.stop()\n    } catch {\n      // A failed cleanup must not hide the original camera access result.\n    }\n  })\n}\n\nfunction createPreferredConstraints(options: CameraPreflightOptions): MediaStreamConstraints {\n  const video: MediaTrackConstraints = {\n    width: { ideal: options.width },\n    height: { ideal: options.height },\n    frameRate: { ideal: options.frameRate },\n  }\n  if (options.facingMode) {\n    video.facingMode = { ideal: options.facingMode }\n  }\n  return {\n    video,\n    // Camera availability is the gate. Microphone capture remains owned by the RTC flow.\n    audio: false,\n  }\n}\n\n/**\n * Open and immediately release a browser camera before a billable Session is created.\n * This performs no frame polling, timers, or persistent rendering work.\n */\nexport async function preflightCameraAccess(options: CameraPreflightOptions): Promise<void> {\n  if (\n    typeof navigator === 'undefined'\n    || !navigator.mediaDevices\n    || typeof navigator.mediaDevices.getUserMedia !== 'function'\n  ) {\n    throw new XmaxSdkError('CAMERA_ERROR', 'Camera is not supported in this browser')\n  }\n\n  let stream: MediaStream | null = null\n  try {\n    try {\n      stream = await navigator.mediaDevices.getUserMedia(createPreferredConstraints(options))\n    } catch (error) {\n      if (!isOverconstrainedError(error)) {\n        throw error\n      }\n      // Older and embedded browsers can reject otherwise valid ideal constraints.\n      stream = await navigator.mediaDevices.getUserMedia({ video: true, audio: false })\n    }\n\n    const videoTrack = stream.getVideoTracks()[0]\n    if (!videoTrack || videoTrack.readyState !== 'live') {\n      throw new XmaxSdkError('CAMERA_ERROR', 'No active video track')\n    }\n  } catch (error) {\n    throw toXmaxSdkError(error, {\n      code: 'CAMERA_ERROR',\n      message: 'Failed to access camera',\n    })\n  } finally {\n    stopStreamTracks(stream)\n  }\n}\n","import type { XmaxClientOptions } from '../client/types'\nimport { apiHost, telemetryEnvironment, telemetryReportSource } from '../telemetry/collector'\nimport { beginStartup, diagnosticError, disconnectReasonForStage, STARTUP_TRACE, type WithStartupTrace } from '../telemetry/startup'\nimport { safeMd5Hex } from '../telemetry/md5'\nimport { XMAX_OPEN_API_PRODUCTION_BASE_URL } from '../api/client'\nimport { preflightCameraAccess } from '../rtc/media/camera-preflight'\nimport { createMediaFileStream, isImageMediaFile } from '../rtc/media/media-file-stream'\nimport { createSDKI18n } from '../i18n'\nimport { notifyError } from '../shared/error-utils'\nimport { XmaxSdkError, attachPublicErrorDetails, toXmaxSdkError } from '../shared/sdk-error'\nimport { isInstantPrompt } from './instant'\nimport { findUploadedAsset, replayUploadedAssetEvents } from '../telemetry/assets'\nimport {\n  RealtimeSessionImpl,\n  type PreparedRealtimeMedia,\n  type RealtimeSession,\n  withPreparedRealtimeMedia,\n} from './session'\nimport { resolveCameraRealtimeStreamSetting } from './camera'\nimport { DEFAULT_REALTIME_PLAYBACK_SETTING } from './default'\nimport { readMediaStreamSourceSetting } from './utils'\nimport type {\n  RealtimeConnectCameraOptions,\n  RealtimeConnectMediaOptions,\n  RealtimeConnectOptions,\n} from './types'\n\nfunction getFirstLiveAudioTrack(stream: MediaStream): MediaStreamTrack | undefined {\n  return stream.getAudioTracks().find((track) => track.readyState === 'live')\n}\n\n/**\n * @brief 实时生成能力入口。\n * 提供摄像头连接、媒体文件连接和自有 MediaStream 连接三种接入方式。\n */\nexport type RealtimeClient = {\n\n  /**\n   * @brief 采集浏览器摄像头并建立实时会话。\n   * @param options 摄像头采集、RTC 编码、渲染和生成设置。\n   * @returns 已建立的实时会话；SDK 拥有并负责释放摄像头媒体。\n   */\n  connectCamera: (options: RealtimeConnectCameraOptions) => Promise<RealtimeSession>\n\n  /**\n   * @brief 将图片、视频 Blob 或远程 URL 作为输入建立实时会话。\n   * @param source 媒体 Blob（File 继承自 Blob）或可访问的媒体 URL。\n   * @param options 媒体播放、RTC 编码、渲染和生成设置。\n   * @returns 已建立的实时会话；SDK 负责释放内部创建的媒体资源。\n   */\n  connectMedia: (\n    source: Blob | string,\n    options: RealtimeConnectMediaOptions,\n  ) => Promise<RealtimeSession>\n\n  /**\n   * @brief 使用调用方已有的 MediaStream 建立实时会话。\n   * @param stream 至少包含一条可用视频轨道的 MediaStream。\n   * @param options RTC 编码、渲染和生成设置。\n   * @returns 已建立的实时会话。\n   * @notes MediaStream 的所有权仍属于调用方；disconnect 不会停止其中的 MediaStreamTrack。\n   */\n  connect: (stream: MediaStream, options: RealtimeConnectOptions) => Promise<RealtimeSession>\n}\n\nconst CONNECT_PREPARED_REALTIME_MEDIA = Symbol('connectPreparedRealtimeMedia')\n\ntype InternalRealtimeClient = RealtimeClient & {\n  [CONNECT_PREPARED_REALTIME_MEDIA]: (\n    prepared: PreparedRealtimeMedia,\n    options: RealtimeConnectOptions,\n  ) => Promise<RealtimeSession>\n}\n\n/** @internal Preserve file-media ownership and kind when Playground already built the stream. */\nexport function connectPreparedRealtimeMediaInternal(\n  client: RealtimeClient,\n  prepared: PreparedRealtimeMedia,\n  options: RealtimeConnectOptions,\n): Promise<RealtimeSession> {\n  const connectPrepared = (client as InternalRealtimeClient)[CONNECT_PREPARED_REALTIME_MEDIA]\n  if (typeof connectPrepared !== 'function') {\n    throw new XmaxSdkError('INVALID_INPUT', 'Expected an SDK RealtimeClient')\n  }\n  return connectPrepared(prepared, options)\n}\n\n/** @internal Create the realtime capability exposed by {@link XmaxClient.realtime}. */\nexport function createRealtimeClient(clientOptions: XmaxClientOptions): RealtimeClient {\n  const i18n = clientOptions.i18n ?? createSDKI18n({ locale: clientOptions.locale })\n  const telemetryBaseUrl = clientOptions.baseUrl ?? XMAX_OPEN_API_PRODUCTION_BASE_URL\n  const apiKeyMd5 = clientOptions.telemetry === false\n    ? undefined\n    : safeMd5Hex(clientOptions.apiKey ?? clientOptions.authToken ?? '')\n\n  const realtimeClient: InternalRealtimeClient = {\n    [CONNECT_PREPARED_REALTIME_MEDIA]: async (\n      prepared: PreparedRealtimeMedia,\n      connectOptions: RealtimeConnectOptions,\n    ) => RealtimeSessionImpl.connect(\n      prepared.stream,\n      withPreparedRealtimeMedia(connectOptions, prepared),\n      clientOptions,\n    ),\n    connectCamera: async (connectOptions: RealtimeConnectCameraOptions) => {\n      const trace = (connectOptions as WithStartupTrace)[STARTUP_TRACE]\n      try {\n        const streamSetting = resolveCameraRealtimeStreamSetting(connectOptions)\n        const captureStartedAt = performance.now()\n        trace?.enter('camera_capture')\n        trace?.record('sdk_capture_get_user_media_start', {\n          requested_width: streamSetting.width,\n          requested_height: streamSetting.height,\n          requested_fps: streamSetting.fps,\n          facing_mode: connectOptions.facingMode,\n        })\n        try {\n          await preflightCameraAccess({\n            facingMode: connectOptions.facingMode,\n            width: streamSetting.width,\n            height: streamSetting.height,\n            frameRate: streamSetting.fps,\n          })\n          trace?.record('sdk_capture_get_user_media_end', {\n            ok: true,\n            duration_ms: Math.round(performance.now() - captureStartedAt),\n          })\n          trace?.enter('media_prepare')\n        } catch (error) {\n          trace?.record('sdk_capture_get_user_media_end', {\n            ok: false,\n            duration_ms: Math.round(performance.now() - captureStartedAt),\n            ...diagnosticError(error),\n          })\n          throw error\n        }\n        const stream = new MediaStream()\n        const withAudio = connectOptions.audio?.publish !== false\n        const preparedOptions = withPreparedRealtimeMedia({\n          ...connectOptions,\n          stream: streamSetting,\n        }, {\n          kind: 'camera',\n          stream,\n          // Replaced with the actual settings returned by startVideoCapture during bootstrap.\n          sourceSetting: streamSetting,\n          internalCamera: {\n            facingMode: connectOptions.facingMode,\n            withAudio,\n            // Camera defaults to the front-facing device when facingMode is omitted.\n            mirrorInput: connectOptions.facingMode !== 'environment',\n          },\n          owned: true,\n        })\n        return await RealtimeSessionImpl.connect(stream, preparedOptions, clientOptions)\n      } catch (error) {\n        const resolved = toXmaxSdkError(error, { code: 'CAMERA_ERROR', message: 'Failed to connect RTC camera' })\n        attachPublicErrorDetails(resolved, { reason_code: 'camera_capture_failed', failure_stage: 'camera_capture', trace_id: trace?.traceId })\n        throw notifyError(\n          resolved,\n          connectOptions.onError ?? clientOptions.onError,\n          {\n            code: 'CAMERA_ERROR',\n            message: 'Failed to connect RTC camera',\n          },\n        )\n      }\n    },\n    connectMedia: async (source: Blob | string, connectOptions: RealtimeConnectMediaOptions) => {\n      let mediaStream: Awaited<ReturnType<typeof createMediaFileStream>> | null = null\n      try {\n        const kind = isImageMediaFile(source) ? 'image' : 'video'\n        mediaStream = await createMediaFileStream(source, {\n          i18n,\n          playbackRate: connectOptions.playback?.playbackRate\n            ?? DEFAULT_REALTIME_PLAYBACK_SETTING.playbackRate,\n          backgroundColor: connectOptions.render?.backgroundColor,\n          poster: kind === 'image' && isInstantPrompt(connectOptions.context?.prompt ?? '')\n            ? { type: 'image/jpeg', quality: 0.9 }\n            : undefined,\n        })\n        const prepared = mediaStream\n        const preparedOptions = withPreparedRealtimeMedia(connectOptions, {\n          kind,\n          posterUrl: prepared.posterUrl,\n          stream: prepared.previewStream,\n          publishTrack: prepared.videoTrack,\n          publishAudioTrack: connectOptions.audio?.publish !== false\n            ? prepared.audioTrack\n            : undefined,\n          sourceSetting: {\n            width: prepared.sourceWidth,\n            height: prepared.sourceHeight,\n            fps: prepared.fps,\n          },\n          owned: true,\n          cleanup: () => prepared.destroy(),\n          appleMobileVideoFileCompatibility: kind === 'video' && typeof source !== 'string',\n        })\n        return await RealtimeSessionImpl.connect(prepared.previewStream, preparedOptions, clientOptions)\n      } catch (error) {\n        mediaStream?.destroy()\n        const resolved = toXmaxSdkError(error, { code: 'MEDIA_PROCESSING_ERROR', message: 'Failed to connect media' })\n        attachPublicErrorDetails(resolved, { reason_code: 'media_prepare_failed', failure_stage: 'media_prepare',\n          trace_id: (connectOptions as WithStartupTrace)[STARTUP_TRACE]?.traceId })\n        throw notifyError(\n          resolved,\n          connectOptions.onError ?? clientOptions.onError,\n          {\n            code: 'MEDIA_PROCESSING_ERROR',\n            message: 'Failed to connect media',\n          },\n        )\n      }\n    },\n    connect: async (stream: MediaStream, connectOptions: RealtimeConnectOptions) => {\n      const publishTrack = stream.getVideoTracks()[0]\n      const sourceSetting = publishTrack\n        ? await readMediaStreamSourceSetting(publishTrack)\n        : undefined\n      const preparedOptions = withPreparedRealtimeMedia(connectOptions, {\n        kind: 'stream',\n        stream,\n        publishTrack,\n        publishAudioTrack: connectOptions.audio?.publish !== false\n          ? getFirstLiveAudioTrack(stream)\n          : undefined,\n        sourceSetting,\n        owned: false,\n      })\n      return RealtimeSessionImpl.connect(stream, preparedOptions, clientOptions)\n    },\n  }\n\n  async function observe<T extends RealtimeConnectOptions>(\n    kind: string,\n    options: T,\n    operation: (options: T) => Promise<RealtimeSession>,\n    mediaBytes?: number,\n  ): Promise<RealtimeSession> {\n    const uploadedAsset = findUploadedAsset(options.context?.refImageUrl)\n    const reportSource = telemetryReportSource(clientOptions.reportSource)\n    const trace = beginStartup(clientOptions.telemetry, {\n      media_kind: kind,\n      media_bytes: mediaBytes,\n      api_host: apiHost(telemetryBaseUrl),\n      api_key_md5: apiKeyMd5,\n      env: telemetryEnvironment(reportSource),\n      report_source: reportSource,\n      model: options.model.name,\n      auto_start: options.autoStart !== false,\n      entry_point: 'connect',\n      asset_operation_id: uploadedAsset?.operationId,\n      asset_age_ms: uploadedAsset ? Math.max(0, performance.now() - uploadedAsset.completedAtMonotonicMs) : undefined,\n    }, clientOptions.probe)\n    if (trace && uploadedAsset) replayUploadedAssetEvents(trace, uploadedAsset)\n    try { return await operation(Object.assign({}, options, { [STARTUP_TRACE]: trace })) }\n    catch (error) {\n      trace?.finish('error', {\n        failure_reason: disconnectReasonForStage(trace.currentStage),\n        failure_stage: trace.currentStage,\n        ...diagnosticError(error),\n      })\n      throw error\n    }\n  }\n\n  const observed: InternalRealtimeClient = {\n    [CONNECT_PREPARED_REALTIME_MEDIA]: (prepared, options) => observe(prepared.kind, options, value => realtimeClient[CONNECT_PREPARED_REALTIME_MEDIA](prepared, value)),\n    connectCamera: options => observe('camera', options, value => realtimeClient.connectCamera(value)),\n    connectMedia: (source, options) => observe(isImageMediaFile(source) ? 'image' : 'video', options, value => realtimeClient.connectMedia(source, value), typeof source === 'string' ? undefined : source.size),\n    connect: (stream, options) => observe('stream', options, value => realtimeClient.connect(stream, value)),\n  }\n  return observed\n}\n","import type { RealtimePresentationState } from './types'\n\nexport function isInstantPrompt(prompt: string): boolean {\n  return prompt.trim() === '视频中角色跟随拖拽轨迹运动'\n}\n\nexport const DEFAULT_PRESENTATION_STATE: Readonly<RealtimePresentationState> = Object.freeze({\n  instant: false,\n  inputImageUrl: null,\n  showInputImage: false,\n  suppressLoading: false,\n})\n\n/** One event-driven presentation owner for managed and consumer-rendered output. */\nexport class InstantPresentation {\n  private value = DEFAULT_PRESENTATION_STATE\n  private matched = false\n  private dragging = false\n  private idle = false\n  private timer: ReturnType<typeof setTimeout> | null = null\n  private frame: number | null = null\n  private restartTask: Promise<void> | null = null\n  private image: HTMLImageElement | null = null\n\n  constructor(private readonly options: {\n    container?: HTMLElement\n    fit?: 'contain' | 'cover'\n    transitionMs?: number\n    onChange?: (state: Readonly<RealtimePresentationState>) => void\n    restart: () => Promise<void>\n  }) {}\n\n  get state(): Readonly<RealtimePresentationState> { return this.value }\n\n  activate(inputImageUrl: string): void {\n    if (this.value.instant && this.value.inputImageUrl === inputImageUrl) return\n    this.reset()\n    if (this.options.container) {\n      const image = document.createElement('img')\n      image.src = inputImageUrl\n      image.alt = ''\n      image.setAttribute('aria-hidden', 'true')\n      image.setAttribute('data-xmax-instant-image', 'true')\n      image.style.cssText = `position:absolute;inset:0;z-index:30;width:100%;height:100%;object-fit:${this.options.fit ?? 'contain'};object-position:center;pointer-events:none;opacity:0;transition:opacity ${this.options.transitionMs ?? 150}ms cubic-bezier(0.4,0,0.2,1);`\n      this.options.container.appendChild(image)\n      this.image = image\n    }\n    this.publish({ ...DEFAULT_PRESENTATION_STATE, instant: true, inputImageUrl })\n  }\n\n  onGate(matched: boolean): void {\n    if (matched === this.matched) return\n    const justMatched = matched && !this.matched\n    this.matched = matched\n    if (!this.value.instant) return\n    if (justMatched && this.dragging) this.idle = false\n    this.updateVisibility()\n  }\n\n  beginDrag(): void {\n    this.cancelPendingRestart()\n    if (!this.value.instant) return\n    this.dragging = true\n    this.idle = !this.matched\n    this.publish({ ...this.value, suppressLoading: true, showInputImage: this.idle })\n  }\n\n  endDrag(): void {\n    if (!this.value.instant || !this.dragging) return\n    this.cancelPendingRestart()\n    this.timer = setTimeout(() => {\n      this.timer = null\n      this.dragging = false\n      this.idle = true\n      this.updateVisibility()\n      if (!this.value.instant || !this.idle) return\n      // Preserve the platform's paint-before-restart timing. No polling or busy wait.\n      this.frame = requestAnimationFrame(() => {\n        this.frame = requestAnimationFrame(() => {\n          this.frame = null\n          if (this.restartTask || !this.value.instant) return\n          const task = this.options.restart().catch(() => {\n            // Session owns error reporting and disconnect; never reject a pointer handler.\n          })\n          this.restartTask = task\n          void task.finally(() => {\n            if (this.restartTask === task) this.restartTask = null\n          })\n        })\n      })\n    }, 750)\n  }\n\n  reset(): void {\n    this.cancelPendingRestart()\n    this.restartTask = null\n    this.matched = false\n    this.dragging = false\n    this.idle = false\n    this.image?.remove()\n    this.image = null\n    this.publish(DEFAULT_PRESENTATION_STATE)\n  }\n\n  private cancelPendingRestart(): void {\n    if (this.timer !== null) clearTimeout(this.timer)\n    if (this.frame !== null) cancelAnimationFrame(this.frame)\n    this.timer = null\n    this.frame = null\n  }\n\n  private updateVisibility(): void {\n    this.publish({\n      ...this.value,\n      showInputImage: this.value.suppressLoading ? this.idle : this.matched,\n    })\n  }\n\n  private publish(next: Readonly<RealtimePresentationState>): void {\n    if (next.instant === this.value.instant\n      && next.inputImageUrl === this.value.inputImageUrl\n      && next.showInputImage === this.value.showInputImage\n      && next.suppressLoading === this.value.suppressLoading) return\n    this.value = Object.freeze(next)\n    if (this.image) this.image.style.opacity = next.showInputImage ? '1' : '0'\n    try { this.options.onChange?.(this.value) } catch {\n      // Consumer rendering must not interrupt the generation lifecycle.\n    }\n  }\n}\n","type VideoWithFrameCallback = HTMLVideoElement & {\n  requestVideoFrameCallback?: (\n    callback: (\n      now: DOMHighResTimeStamp,\n      metadata: { mediaTime: number },\n    ) => void,\n  ) => number\n  cancelVideoFrameCallback?: (handle: number) => void\n}\n\nexport type CameraFrameReadinessResult = {\n  ready: boolean\n  checkedFrames: number\n  consecutiveReadyFrames: number\n  elapsedMs: number\n  reason: 'visible-frame' | 'timeout' | 'track-ended' | 'play-failed'\n}\n\nconst SAMPLE_SIZE = 16\nconst DEFAULT_CONSECUTIVE_FRAMES = 2\nconst DEFAULT_TIMEOUT_MS = 1000\nconst MIN_AVERAGE_LUMINANCE = 5\nconst MIN_LUMINANCE_DEVIATION = 3\nconst VISIBLE_PIXEL_LUMINANCE = 12\nconst MIN_VISIBLE_PIXEL_RATIO = 0.02\n\n/** Distinguish a real (possibly dark) camera image from a uniform startup black frame. */\nexport function isCameraFrameVisuallyReady(pixels: Uint8ClampedArray): boolean {\n  const pixelCount = Math.floor(pixels.length / 4)\n  if (pixelCount === 0) {\n    return false\n  }\n\n  let luminanceSum = 0\n  let luminanceSquareSum = 0\n  let visiblePixels = 0\n\n  for (let offset = 0; offset < pixelCount * 4; offset += 4) {\n    const luminance =\n      pixels[offset] * 0.2126\n      + pixels[offset + 1] * 0.7152\n      + pixels[offset + 2] * 0.0722\n\n    luminanceSum += luminance\n    luminanceSquareSum += luminance * luminance\n    if (luminance > VISIBLE_PIXEL_LUMINANCE) {\n      visiblePixels += 1\n    }\n  }\n\n  const averageLuminance = luminanceSum / pixelCount\n  const variance = Math.max(\n    0,\n    luminanceSquareSum / pixelCount - averageLuminance * averageLuminance,\n  )\n  const luminanceDeviation = Math.sqrt(variance)\n  const visiblePixelRatio = visiblePixels / pixelCount\n\n  return averageLuminance > MIN_AVERAGE_LUMINANCE\n    || luminanceDeviation > MIN_LUMINANCE_DEVIATION\n    || visiblePixelRatio > MIN_VISIBLE_PIXEL_RATIO\n}\n\n/**\n * Wait until the local camera produces consecutive non-black frames before publishing it.\n * Timeout is deliberately bounded so a covered camera or genuinely dark room cannot block startup.\n */\nexport async function waitForCameraTrackReady(\n  track: MediaStreamTrack,\n  options: { consecutiveFrames?: number; timeoutMs?: number } = {},\n): Promise<CameraFrameReadinessResult> {\n  const requiredFrames = Math.max(\n    1,\n    Math.floor(options.consecutiveFrames ?? DEFAULT_CONSECUTIVE_FRAMES),\n  )\n  const timeoutMs = Math.max(0, options.timeoutMs ?? DEFAULT_TIMEOUT_MS)\n  const startedAt = performance.now()\n\n  if (track.readyState === 'ended') {\n    return {\n      ready: false,\n      checkedFrames: 0,\n      consecutiveReadyFrames: 0,\n      elapsedMs: 0,\n      reason: 'track-ended',\n    }\n  }\n\n  return new Promise((resolve) => {\n    const video = document.createElement('video') as VideoWithFrameCallback\n    const canvas = document.createElement('canvas')\n    const context = canvas.getContext('2d', { willReadFrequently: true })\n    let checkedFrames = 0\n    let consecutiveReadyFrames = 0\n    let settled = false\n    let frameCallbackHandle: number | null = null\n    let animationFrameHandle: number | null = null\n    let lastFallbackMediaTime = -1\n\n    canvas.width = SAMPLE_SIZE\n    canvas.height = SAMPLE_SIZE\n    video.muted = true\n    video.playsInline = true\n    video.autoplay = true\n    video.srcObject = new MediaStream([track])\n    video.style.cssText =\n      'position:fixed;left:-9999px;top:-9999px;width:1px;height:1px;opacity:0;pointer-events:none;'\n    document.body.appendChild(video)\n\n    const finish = (\n      ready: boolean,\n      reason: CameraFrameReadinessResult['reason'],\n    ) => {\n      if (settled) {\n        return\n      }\n      settled = true\n      clearTimeout(timeoutHandle)\n      if (frameCallbackHandle !== null) {\n        video.cancelVideoFrameCallback?.(frameCallbackHandle)\n      }\n      if (animationFrameHandle !== null) {\n        window.cancelAnimationFrame(animationFrameHandle)\n      }\n      video.pause()\n      video.srcObject = null\n      video.remove()\n      resolve({\n        ready,\n        checkedFrames,\n        consecutiveReadyFrames,\n        elapsedMs: Number((performance.now() - startedAt).toFixed(1)),\n        reason,\n      })\n    }\n\n    const inspectFrame = () => {\n      if (!context || video.readyState < HTMLMediaElement.HAVE_CURRENT_DATA) {\n        return\n      }\n\n      try {\n        context.drawImage(video, 0, 0, SAMPLE_SIZE, SAMPLE_SIZE)\n        const pixels = context.getImageData(0, 0, SAMPLE_SIZE, SAMPLE_SIZE).data\n        checkedFrames += 1\n        consecutiveReadyFrames = isCameraFrameVisuallyReady(pixels)\n          ? consecutiveReadyFrames + 1\n          : 0\n        if (consecutiveReadyFrames >= requiredFrames) {\n          finish(true, 'visible-frame')\n        }\n      } catch {\n        // The timeout remains the safe fallback if this browser cannot sample the frame.\n      }\n    }\n\n    const scheduleFrameCheck = () => {\n      if (settled) {\n        return\n      }\n\n      if (video.requestVideoFrameCallback) {\n        frameCallbackHandle = video.requestVideoFrameCallback((_now, metadata) => {\n          lastFallbackMediaTime = metadata.mediaTime\n          inspectFrame()\n          scheduleFrameCheck()\n        })\n        return\n      }\n\n      animationFrameHandle = window.requestAnimationFrame(() => {\n        if (video.currentTime !== lastFallbackMediaTime) {\n          lastFallbackMediaTime = video.currentTime\n          inspectFrame()\n        }\n        scheduleFrameCheck()\n      })\n    }\n\n    const timeoutHandle = window.setTimeout(\n      () => finish(false, 'timeout'),\n      timeoutMs,\n    )\n\n    void video.play()\n      .then(scheduleFrameCheck)\n      .catch(() => finish(false, 'play-failed'))\n  })\n}\n","import {\n  ACTIVE_STATUS,\n  XmaxOpenClient,\n  XMAX_OPEN_API_PRODUCTION_BASE_URL,\n} from '../api/client'\nimport {\n  createChangeConditionRtcRoomEvent,\n  createStartRtcRoomEvent,\n  createStopRtcRoomEvent,\n  createTaskUid,\n  createTracksRtcRoomEvent,\n} from '../rtc/rtc-events'\nimport {\n  RtcManager,\n  type ExternalVideoPublishDeadlines,\n  type RtcAsyncErrorInfo,\n} from '../rtc/rtc-manager'\nimport { waitForCameraTrackReady } from '../rtc/media/camera-frame-readiness'\nimport { isAppleMobileRuntime } from '../rtc/media/mobile-runtime'\nimport { createDragTrackController, type DragTrackController } from '../drag/drag-track-controller'\nimport { createRemoteViewHost, type RemoteViewHost } from '../drag/remote-view-host'\nimport { createSDKI18n } from '../i18n'\nimport { notifyError, type XmaxErrorNotifier } from '../shared/error-utils'\nimport {\n  createLowInputResolutionNotice,\n  notifyNotice,\n  type XmaxNoticeNotifier,\n} from '../shared/sdk-notice'\nimport { XmaxSdkError, attachPublicErrorDetails, toXmaxSdkError } from '../shared/sdk-error'\nimport { createErrorDetails, type XmaxErrorDetails } from '../shared/error-details'\nimport { findUploadedAsset } from '../telemetry/assets'\nimport type { XmaxTelemetryParams } from '../telemetry/collector'\nimport {\n  diagnosticError,\n  disconnectReasonForStage,\n  STARTUP_TRACE,\n  type StartupStage,\n  type StartupTrace,\n  type WithStartupTrace,\n  type XmaxDisconnectReasonCode,\n} from '../telemetry/startup'\nimport { resolveCameraRtcEncoderSize } from './camera'\nimport { mountLocalStreamPreview } from './local-stream-preview'\nimport { DEFAULT_PRESENTATION_STATE, InstantPresentation, isInstantPrompt } from './instant'\nimport { writeRtcLogToConsole } from './rtc-console-log'\nimport type { XmaxClientOptions } from '../client/types'\nimport type {\n  RealtimeConnectOptions,\n  RealtimeContext,\n  RealtimeDisconnectReason,\n  RealtimeDragSetting,\n  RealtimeMedia,\n  RealtimeMediaKind,\n  RealtimeMediaSetting,\n  RealtimeRoomEventPayload,\n  RealtimeRemoteVideoFirstFrameInfo,\n  RealtimeSessionState,\n  RealtimePresentationState,\n} from './types'\nimport {\n  isPositiveFinite,\n  normalizeRealtimeContext,\n  readTrackMediaSetting,\n  resolveRealtimeStreamSetting,\n} from './utils'\nimport {\n  DEFAULT_REALTIME_AUTO_START,\n  DEFAULT_REALTIME_HEARTBEAT_INTERVAL_MS,\n  DEFAULT_REALTIME_RENDER_SETTING,\n  DEFAULT_REALTIME_START_EVENT_MODEL,\n} from './default'\nimport {\n  APPLE_MOBILE_VIDEO_CONNECT_TIMEOUT_MS,\n  APPLE_MOBILE_VIDEO_ENCODER_TIMEOUT_MS,\n  APPLE_MOBILE_VIDEO_JOIN_TIMEOUT_MS,\n  APPLE_MOBILE_VIDEO_OUTBOUND_TIMEOUT_MS,\n  APPLE_MOBILE_VIDEO_PUBLISH_TIMEOUT_MS,\n  APPLE_MOBILE_VIDEO_SOURCE_TIMEOUT_MS,\n  APPLE_MOBILE_VIDEO_START_SEND_TIMEOUT_MS,\n  withAppleMobileVideoStageTimeout,\n} from './mobile-video-publish-compat'\n\nconst ENABLE_REALTIME_TIMING_LOGS = false\n\nexport type InternalRealtimeDisconnectReason =\n  | 'client_disconnect'\n  | 'client_background_timeout'\n  | 'client_session_replaced'\n  | 'client_context_disposed'\n  | 'pagehide'\n  | 'session_error'\n\n/**\n * @brief 已建立的实时生成会话。\n * Session 同时管理生成状态、上下文、媒体输入和 RTC 生命周期。\n * {@link RealtimeSession.stopGeneration} 只停止生成并保留 RTC；{@link RealtimeSession.disconnect} 会彻底释放会话。\n */\nexport interface RealtimeSession {\n\n  /** 当前生成生命周期状态。 */\n  readonly state: RealtimeSessionState\n\n  /** 最近一次成功应用的生成上下文。返回对象只读。 */\n  readonly context: Readonly<RealtimeContext>\n\n  /** 当前发布的输入流及其媒体规格。返回对象只读。 */\n  readonly media: Readonly<RealtimeMedia>\n\n  /** Current display state, including the input image used by Instant. */\n  readonly presentation: Readonly<RealtimePresentationState>\n\n  /** Custom drag surfaces call these at stroke boundaries; SDK-managed surfaces call them automatically. */\n  beginDrag: () => void\n  endDrag: () => void\n\n  /**\n   * @brief 获取服务端会话 ID。\n   * @returns 活跃会话的 ID；断开后返回 `null`。\n   */\n  getSessionUid: () => string | null\n\n  /**\n   * @brief 应用生成上下文。\n   * @param context 生成上下文；`prompt` 必填，`refImageUrl: null` 表示清除参考图。\n   * @returns 应用完成后 resolve。\n   * @notes 运行中发送 `change_condition`；进入、退出或更新 Instant 时发送 `start`，以应用静态图片参数。\n   */\n  set: (context: RealtimeContext) => Promise<void>\n\n  /**\n   * @brief 强制创建新的生成任务。\n   * @param context 可选的生成上下文；传入时 `prompt` 必填，并与当前上下文合并。\n   * @returns Start 事件发送并完成本地启动流程后 resolve。\n   * @notes 无论当前是否正在运行，每次调用都会发送 `start`。\n   */\n  start: (context?: RealtimeContext) => Promise<void>\n\n  /**\n   * @brief 发送一组拖拽轨迹点。\n   * @param tracks 轨迹点数组，每个点为 `[x, y]`，坐标基于 `media.streamSetting` 的像素坐标系。\n   * @returns 轨迹消息提交后 resolve；当前没有活动任务时直接 resolve。\n   */\n  sendTracks: (tracks: Array<[number, number]>) => Promise<void>\n\n  /**\n   * @brief 停止当前生成任务。\n   * @returns Stop 事件处理完成后 resolve。\n   * @notes RTC 房间和输入流保持连接，可再次调用 start。\n   */\n  stopGeneration: () => Promise<void>\n\n  /**\n   * @brief 停止当前会话的本地输入流，同时保持 RTC 房间连接。\n   * @returns 本地采集、预览与发布停止后 resolve。\n   * @notes 当前用于开放平台在停止生成后立即关闭本地输入，同时保持 RTC 房间连接，\n   * 以等待 `video_completed` 等最终事件并向用户提供视频保存。\n   * SDK 管理的输入资源会被释放；调用方传入的原始 Track 不会被停止。\n   * 当前尚未提供在同一会话中恢复本地 Stream 的方法，请谨慎调用；完成结果处理后通常应调用 `disconnect()`。\n   */\n  stopLocalStream: () => Promise<void>\n\n  /**\n   * @brief 彻底断开实时会话。\n   * @returns RTC 离房、服务端会话关闭及 SDK 托管资源释放完成后 resolve。\n   * @notes 调用方通过 connect 传入的 MediaStream 不会由 SDK 停止。\n   */\n  disconnect: () => Promise<void>\n}\n\nfunction getVideoTrack(stream: MediaStream): MediaStreamTrack {\n  const track = stream.getVideoTracks()[0]\n  if (!track) {\n    throw new XmaxSdkError('MEDIA_PROCESSING_ERROR', 'Missing video track in MediaStream')\n  }\n  return track\n}\n\nclass SessionBootstrapCancelledError extends XmaxSdkError {\n  constructor() {\n    super('SESSION_ERROR', 'Realtime bootstrap was cancelled')\n    this.name = 'SessionBootstrapCancelledError'\n  }\n}\n\nfunction getAudioTrack(stream: MediaStream): MediaStreamTrack | undefined {\n  return stream.getAudioTracks().find((track) => track.readyState === 'live')\n}\n\nfunction createManagedLocalVideoHost(wrapper: HTMLElement): HTMLElement {\n  const computed = getComputedStyle(wrapper)\n  if (computed.position === 'static') {\n    wrapper.style.position = 'relative'\n  }\n  wrapper.style.overflow = 'hidden'\n\n  const host = document.createElement('div')\n  host.setAttribute('data-xmax-local-video', 'true')\n  host.style.cssText =\n    'position:relative;width:100%;height:100%;overflow:hidden;display:flex;align-items:center;justify-content:center;'\n  wrapper.replaceChildren(host)\n  return host\n}\n\nfunction observeManagedVideoStyle(\n  host: HTMLElement,\n  fit: 'cover' | 'contain',\n  mirrored: boolean,\n): () => void {\n  host.style.transform = mirrored ? 'scaleX(-1)' : 'none'\n  host.style.transformOrigin = 'center'\n\n  const apply = () => {\n    host.querySelectorAll('video, canvas').forEach((node) => {\n      const element = node as HTMLElement\n      element.style.width = '100%'\n      element.style.height = '100%'\n      element.style.objectFit = fit\n      element.style.objectPosition = 'center'\n    })\n  }\n  apply()\n  const MutationObserverCtor = globalThis.MutationObserver\n  if (!MutationObserverCtor) {\n    return () => {}\n  }\n  const observer = new MutationObserverCtor(apply)\n  observer.observe(host, { childList: true, subtree: true })\n  return () => observer.disconnect()\n}\n\nexport type PreparedRealtimeMedia = {\n  kind: RealtimeMediaKind\n  /** Reuse the composited input image; its lifetime belongs to the prepared media. */\n  posterUrl?: string\n  /** @internal Original source kind used only by non-fatal input notices. */\n  noticeInputKind?: RealtimeMediaKind\n  stream: MediaStream\n  sourceSetting?: RealtimeMediaSetting\n  publishTrack?: MediaStreamTrack\n  publishAudioTrack?: MediaStreamTrack\n  /** Volcengine-managed camera capture; absent for caller-provided tracks and media files. */\n  internalCamera?: {\n    facingMode?: 'user' | 'environment'\n    withAudio?: boolean\n    mirrorInput?: boolean\n  }\n  /** SDK-owned media is disposed with the session. */\n  owned?: boolean\n  cleanup?: () => void\n  /** @internal Limit the WebKit publish recovery path to local video files. */\n  appleMobileVideoFileCompatibility?: boolean\n}\n\nexport type InternalRealtimeStartOptions = {\n  preserveRemoteOutput?: boolean\n}\n\nconst PREPARED_REALTIME_MEDIA = Symbol('preparedRealtimeMedia')\nconst LOCAL_CAMERA_PREVIEW_REVEAL_MS = 300\n\nfunction isLikelyMobileRuntime(): boolean {\n  if (typeof navigator === 'undefined') {\n    return false\n  }\n  const ua = navigator.userAgent || ''\n  if (/iPhone|iPad|iPod|Android/i.test(ua)) {\n    return true\n  }\n  return navigator.maxTouchPoints > 1 && /Macintosh/i.test(ua)\n}\n\ntype InternalRealtimeConnectOptions = RealtimeConnectOptions & {\n  [PREPARED_REALTIME_MEDIA]?: PreparedRealtimeMedia\n}\n\nfunction probeDisconnectReason(reason: RealtimeDisconnectReason): XmaxDisconnectReasonCode {\n  if (reason === 'client') return 'client_disconnect'\n  if (reason === 'error') return 'session_error'\n  if (reason === 'overloaded') return 'remote_output_stalled'\n  return reason\n}\n\nfunction localOutboundDisconnectReason(\n  reason: 'zero-sent-frame-rate' | 'track-ended' | 'track-muted',\n): XmaxDisconnectReasonCode {\n  if (reason === 'track-ended') return 'local_outbound_track_ended'\n  if (reason === 'track-muted') return 'local_outbound_track_muted'\n  return 'local_outbound_zero_sent_frame_rate'\n}\n\n/** @internal Attach an SDK-owned prepared input without expanding the public connect options. */\nexport function withPreparedRealtimeMedia(\n  options: RealtimeConnectOptions,\n  prepared: PreparedRealtimeMedia,\n): RealtimeConnectOptions {\n  return Object.assign({}, options, { [PREPARED_REALTIME_MEDIA]: prepared })\n}\n\nexport class RealtimeSessionImpl implements RealtimeSession {\n  private readonly startup?: StartupTrace\n  private readonly client: XmaxOpenClient\n  private readonly rtc: RtcManager\n  private readonly reportError: (error: unknown, fallbackMessage?: string) => never\n  private readonly notifyUserError: XmaxErrorNotifier | undefined\n  private readonly notifyUserNotice: XmaxNoticeNotifier | undefined\n  private readonly sdkI18n: ReturnType<typeof createSDKI18n>\n  private readonly localElement: HTMLElement | null\n  private readonly remoteElement: HTMLElement | null\n  private readonly onRemoteStream?: (stream: MediaStream) => void\n  private readonly onRemoteVideoFirstFrame?: (info: RealtimeRemoteVideoFirstFrameInfo) => void\n  private readonly onDisconnect?: RealtimeConnectOptions['onDisconnect']\n  private disconnectDetails?: XmaxErrorDetails\n  private operationStage?: StartupStage\n  private readonly onStateChange?: (state: RealtimeSessionState) => void\n  private readonly onPublishPipelineWaitChange?: (waiting: boolean) => void\n  private readonly onRoomEvent?: (event: RealtimeRoomEventPayload) => void\n  private readonly rtcLogEnabled: boolean\n  private readonly ownsMedia: boolean\n  private readonly cleanupMedia?: () => void\n  private readonly localRenderMirror: boolean\n  private readonly renderCleanup: Array<() => void> = []\n\n  private mediaValue: Readonly<RealtimeMedia>\n\n  get media(): Readonly<RealtimeMedia> {\n    return this.mediaValue\n  }\n\n  private sessionUid: string | null = null\n  private taskUid: string | null = null\n  private currentState: RealtimeSessionState = 'idle'\n  private currentContext: Readonly<RealtimeContext> = Object.freeze({ prompt: '' })\n  private runningContext: Readonly<RealtimeContext> | null = null\n  private disconnected = false\n  /** True only after `connect()` bootstrap succeeds — gates `onDisconnect`. */\n  private sessionEstablished = false\n  private disconnectNotified = false\n  private mediaCleaned = false\n  private forceAbortTask: Promise<void> | null = null\n  private heartbeatStarted = false\n  private remoteFirstFrameNotified = false\n  private lowInputResolutionNotified = false\n  private initialRemoteFramePending = false\n  private fatalRtcError: Error | null = null\n  private heartbeatIntervalMs = DEFAULT_REALTIME_HEARTBEAT_INTERVAL_MS\n  private pendingDisconnectReason: RealtimeDisconnectReason = 'client'\n  private remoteViewHost: RemoteViewHost | null = null\n  private dragController: DragTrackController | null = null\n  private dragTrackFitMode: 'contain' | 'cover' = 'cover'\n  private hiddenRemoteElement: HTMLElement | null = null\n  private remoteStreamNotifyTimer: ReturnType<typeof setInterval> | null = null\n  private lastNotifiedRemoteStream: MediaStream | null = null\n  private readonly dragSetting: RealtimeDragSetting | undefined\n  /** change_condition 固定使用首次 start 的分辨率，避免中途被替换。 */\n  private firstStartEventSize: Readonly<[number, number]> | null = null\n  /** Camera mirror state belongs to this Session/RTC room only. */\n  private readonly shouldMirrorCameraInput: boolean\n  private readonly appleMobileVideoUpload: boolean\n  private readonly inputPosterUrl?: string\n  private readonly inputKind: RealtimeMediaKind\n  private readonly onPresentationChange?: RealtimeConnectOptions['onPresentationChange']\n  private readonly inputImageTransitionMs?: number\n  private instant: InstantPresentation | null = null\n  private instantAsset: { source: string; url: Promise<string> } | null = null\n  private instantUploadAbort: AbortController | null = null\n  private generationRevision = 0\n\n  private constructor(\n    client: XmaxOpenClient,\n    rtc: RtcManager,\n    reportError: (error: unknown, fallbackMessage?: string) => never,\n    options: RealtimeConnectOptions,\n    media: RealtimeMedia,\n    prepared: PreparedRealtimeMedia,\n    clientOptions?: Pick<XmaxClientOptions, 'onNotice' | 'onPublishPipelineWaitChange' | 'telemetry'>,\n    notifyUserError?: XmaxErrorNotifier,\n    sdkI18n?: ReturnType<typeof createSDKI18n>,\n  ) {\n    this.client = client\n    this.startup = (options as WithStartupTrace)[STARTUP_TRACE]\n    this.rtc = rtc\n    this.reportError = reportError\n    this.notifyUserError = notifyUserError\n    this.notifyUserNotice = options.onNotice ?? clientOptions?.onNotice\n    this.sdkI18n = sdkI18n ?? createSDKI18n()\n    this.mediaValue = Object.freeze(media)\n    const localContainer = options.render?.localContainer ?? null\n    this.localElement = localContainer ? createManagedLocalVideoHost(localContainer) : null\n    this.localRenderMirror = options.render?.mirror ?? DEFAULT_REALTIME_RENDER_SETTING.mirror\n    this.onRemoteStream = options.onRemoteStream\n    this.onRemoteVideoFirstFrame = options.onRemoteVideoFirstFrame\n    this.onDisconnect = options.onDisconnect\n    this.onStateChange = options.onStateChange\n    this.onPublishPipelineWaitChange = clientOptions?.onPublishPipelineWaitChange\n    this.onRoomEvent = options.onRoomEvent\n    this.rtcLogEnabled = options.log?.rtc === true\n    this.ownsMedia = prepared.owned === true\n    this.appleMobileVideoUpload = prepared.kind === 'video'\n      && prepared.appleMobileVideoFileCompatibility === true\n      && isAppleMobileRuntime()\n    this.shouldMirrorCameraInput = prepared.internalCamera?.mirrorInput === true\n    this.cleanupMedia = prepared.cleanup\n    this.inputPosterUrl = prepared.posterUrl\n    this.inputKind = prepared.noticeInputKind ?? prepared.kind\n    this.onPresentationChange = options.onPresentationChange\n    this.inputImageTransitionMs = options.render?.inputImageTransitionMs\n    this.dragTrackFitMode = options.render?.fit\n      ?? (media.kind === 'image' || media.kind === 'video' ? 'contain' : 'cover')\n    this.dragSetting = options.render?.drag\n\n    if (this.localElement && !prepared.internalCamera) {\n      this.renderCleanup.push(\n        mountLocalStreamPreview(this.localElement, prepared.stream, this.dragTrackFitMode),\n      )\n    }\n\n    this.rtc.setOnRemoteOutputStalled((info) => {\n      this.failOverloaded(info.reason && info.reason !== 'remote_stats_timeout' ? info.reason : 'remote_output_stalled', {\n        detection_source: 'render_frame_watch', ...info.diagnostics,\n        remote_user_id: info.userId, stall_ms: info.stallMs,\n      })\n    })\n    this.rtc.setOnError((error) => this.handleRtcAsyncError(error))\n    this.rtc.setOnRoomEvent((event) => {\n      this.onRoomEvent?.(event as RealtimeRoomEventPayload)\n    })\n    this.rtc.setOnRemoteVideoFirstFrame((info) => this.handleRemoteVideoFirstFrame(info))\n\n    const remoteElement = options.render?.remoteContainer\n    if (remoteElement) {\n      this.remoteElement = remoteElement\n      this.remoteViewHost = createRemoteViewHost(this.remoteElement)\n      this.renderCleanup.push(observeManagedVideoStyle(\n        this.remoteViewHost.videoHost,\n        this.dragTrackFitMode,\n        false,\n      ))\n      if (this.localElement) {\n        this.renderCleanup.push(observeManagedVideoStyle(\n          this.localElement,\n          this.dragTrackFitMode,\n          this.localRenderMirror,\n        ))\n      }\n      return\n    }\n\n    if (options.onRemoteStream) {\n      const hidden = document.createElement('div')\n      hidden.setAttribute('data-Xmax-remote-host', 'true')\n      hidden.style.cssText =\n        'position:fixed;left:-9999px;top:-9999px;width:1px;height:1px;opacity:0;pointer-events:none;overflow:hidden'\n      document.body.appendChild(hidden)\n      this.hiddenRemoteElement = hidden\n      this.remoteElement = hidden\n      this.remoteViewHost = createRemoteViewHost(hidden)\n      if (this.localElement) {\n        this.renderCleanup.push(observeManagedVideoStyle(\n          this.localElement,\n          this.dragTrackFitMode,\n          this.localRenderMirror,\n        ))\n      }\n      this.rtc.setOnRemotePlayerMounted(() => {\n        this.scheduleNotifyRemoteStream()\n      })\n      return\n    }\n\n    this.remoteElement = null\n    if (this.localElement) {\n      this.renderCleanup.push(observeManagedVideoStyle(\n        this.localElement,\n        this.dragTrackFitMode,\n        this.localRenderMirror,\n      ))\n    }\n  }\n\n  private get remoteVideoContainer(): HTMLElement | null {\n    return this.remoteViewHost?.videoHost ?? this.remoteElement\n  }\n\n  get state(): RealtimeSessionState {\n    return this.currentState\n  }\n\n  get context(): Readonly<RealtimeContext> {\n    return this.currentContext\n  }\n\n  get presentation(): Readonly<RealtimePresentationState> {\n    return this.instant?.state ?? DEFAULT_PRESENTATION_STATE\n  }\n\n  beginDrag(): void { this.instant?.beginDrag() }\n  endDrag(): void { this.instant?.endDrag() }\n\n  private instantImage(context: RealtimeContext): string | null {\n    if (!isInstantPrompt(context.prompt)) return null\n    if (this.inputKind === 'image' && !this.inputPosterUrl) {\n      throw new XmaxSdkError('MEDIA_PROCESSING_ERROR', 'Failed to prepare Instant input image')\n    }\n    return this.inputPosterUrl || context.refImageUrl?.trim() || null\n  }\n\n  private prepareInstantImage(source: string): Promise<string> {\n    if (this.instantAsset?.source === source) return this.instantAsset.url\n    this.instantUploadAbort?.abort()\n    const abort = new AbortController()\n    this.instantUploadAbort = abort\n    const url = (async () => {\n      // An explicit remote reference can be sent directly. Prepared posters are uploaded once.\n      if (/^https?:\\/\\//i.test(source)) return source\n      const response = await fetch(source, { signal: abort.signal })\n      if (!response.ok) throw new XmaxSdkError('MEDIA_PROCESSING_ERROR', 'Failed to read Instant input image')\n      const blob = await response.blob()\n      const extension = blob.type === 'image/png' ? 'png' : blob.type === 'image/webp' ? 'webp' : 'jpg'\n      const result = await this.client.uploadImage(\n        new File([blob], `instant-input.${extension}`, { type: blob.type || 'image/jpeg' }),\n        { signal: abort.signal },\n      )\n      return result.url\n    })()\n    this.instantAsset = { source, url }\n    void url.then(() => {\n      if (this.instantUploadAbort === abort) this.instantUploadAbort = null\n    }, () => {\n      if (this.instantUploadAbort === abort) {\n        this.instantAsset = null\n        this.instantUploadAbort = null\n      }\n    })\n    return url\n  }\n\n  private cancelInstant(): void {\n    this.generationRevision = (this.generationRevision ?? 0) + 1\n    this.instant?.reset()\n    if (this.instantUploadAbort) {\n      this.instantUploadAbort.abort()\n      this.instantUploadAbort = null\n      this.instantAsset = null\n    }\n  }\n\n  private logTiming(\n    stage: string,\n    startedAt: number,\n    data?: Record<string, unknown>,\n  ): void {\n    if (!ENABLE_REALTIME_TIMING_LOGS || !this.rtcLogEnabled) {\n      return\n    }\n    console.info(`[Realtime Timing] ${stage}`, {\n      elapsedMs: Number((performance.now() - startedAt).toFixed(1)),\n      ...data,\n    })\n  }\n\n  private hideLocalCameraPreview(): void {\n    if (!this.localElement) {\n      return\n    }\n    this.localElement.style.transition = 'none'\n    this.localElement.style.opacity = '0'\n  }\n\n  private revealLocalCameraPreview(): void {\n    if (!this.localElement) {\n      return\n    }\n    const reduceMotion = window.matchMedia?.('(prefers-reduced-motion: reduce)').matches\n    this.localElement.style.transition = reduceMotion\n      ? 'none'\n      : `opacity ${LOCAL_CAMERA_PREVIEW_REVEAL_MS}ms ease-out`\n    this.localElement.style.opacity = '1'\n  }\n\n  private async measureTiming<T>(\n    stage: string,\n    operation: () => Promise<T>,\n    data?: Record<string, unknown>,\n  ): Promise<T> {\n    const startedAt = performance.now()\n    try {\n      const result = await operation()\n      this.logTiming(stage, startedAt, data)\n      return result\n    } catch (error) {\n      this.logTiming(stage, startedAt, { ...data, failed: true })\n      throw error\n    }\n  }\n\n  private runAppleMobileVideoStage<T>(\n    operation: () => Promise<T>,\n    options: {\n      stage: string\n      timeoutMs: number\n    },\n  ): Promise<T> {\n    if (!this.appleMobileVideoUpload) {\n      return operation()\n    }\n    return withAppleMobileVideoStageTimeout(operation, {\n      ...options,\n      message: this.sdkI18n.t('errors.systemOverloaded'),\n    })\n  }\n\n  private measureStartup<T>(stage: StartupStage, operation: () => Promise<T>): Promise<T> {\n    this.operationStage = stage\n    const context = { failure_stage: stage, generation_id: this.taskUid ?? null, session_id: this.sessionUid ?? null }\n    return (this.startup ? this.startup.measure(stage, operation) : operation()).catch(error => {\n      throw this.withErrorDetails(error, disconnectReasonForStage(stage), context)\n    })\n  }\n\n  private diagnosticDetails(reason: XmaxDisconnectReasonCode, evidence: XmaxTelemetryParams = {}): XmaxErrorDetails {\n    return createErrorDetails({\n      reason_code: reason,\n      failure_stage: this.operationStage ?? this.startup?.currentStage,\n      trace_id: this.startup?.traceId,\n      session_id: this.sessionUid,\n      generation_id: this.taskUid,\n      ...this.rtc?.getConnectionDiagnostics?.(),\n      ...evidence,\n    })\n  }\n\n  private withErrorDetails(error: unknown, reason: XmaxDisconnectReasonCode, evidence: XmaxTelemetryParams = {}): XmaxSdkError {\n    const resolved = toXmaxSdkError(error, { code: 'UNKNOWN_ERROR', message: this.sdkI18n?.t('errors.requestFailed') ?? 'Realtime operation failed' })\n    return attachPublicErrorDetails(resolved, this.diagnosticDetails(reason, { ...diagnosticError(resolved), ...evidence }))\n  }\n\n  private async ensureBootstrapActive(): Promise<void> {\n    if (!this.appleMobileVideoUpload || !this.disconnected) {\n      return\n    }\n    const activeSessionUid = this.sessionUid\n    this.sessionUid = null\n    if (activeSessionUid) {\n      this.client.beginTeardown()\n      try {\n        await this.client.closeSession(activeSessionUid)\n      } catch {\n      } finally {\n        this.client.endTeardown()\n      }\n    }\n    throw new SessionBootstrapCancelledError()\n  }\n\n  private cleanupForceAbortedMedia(): boolean {\n    if (this.mediaCleaned) {\n      return true\n    }\n    this.mediaCleaned = true\n    try {\n      this.cleanupMedia?.()\n      return true\n    } catch {\n      return false\n    }\n  }\n\n  private forceAbortBootstrap(\n    failureReason: XmaxDisconnectReasonCode,\n    diagnostics: XmaxTelemetryParams = {},\n  ): Promise<void> {\n    this.cancelInstant()\n    const startedAt = performance.now()\n    this.disconnectDetails ??= this.diagnosticDetails(failureReason, diagnostics)\n    const { reason_code: _reason, trace_id: _trace, session_id: _session, generation_id: _generation, ...details } = this.disconnectDetails\n    diagnostics = { ...diagnostics, ...details }\n    this.startup?.recordError({ ...diagnostics, failure_reason: failureReason })\n    const mediaCleanupSucceeded = this.cleanupForceAbortedMedia()\n    if (this.forceAbortTask) {\n      return this.forceAbortTask\n    }\n    this.disconnected = true\n    this.initialRemoteFramePending = false\n    const activeSessionUid = this.sessionUid\n    this.sessionUid = null\n    const generationStopAttempted = Boolean(this.taskUid && this.rtc.snapshot.joined)\n\n    if (generationStopAttempted) {\n      void this.rtc.sendRoomEvent(\n        createStopRtcRoomEvent({\n          userId: this.rtc.snapshot.userId ?? undefined,\n          sessionUid: this.taskUid ?? undefined,\n        }),\n      ).catch(() => undefined)\n      this.startup?.setTerminalContext({\n        generation_stop_called: true,\n        generation_stop_outcome: 'best_effort_dispatched',\n        generation_stop_trigger: 'bootstrap_abort',\n        generation_stop_offset_ms: this.startup.offset(),\n      })\n    }\n\n    this.rtc.forceDestroy({ preserveExternalTrack: !this.ownsMedia })\n    this.startup?.setTerminalContext({\n      local_stream_stop_called: true,\n      local_stream_stop_outcome: 'forced',\n      local_stream_stop_trigger: 'bootstrap_abort',\n      local_stream_stop_offset_ms: this.startup.offset(),\n      local_stream_media_cleanup_succeeded: mediaCleanupSucceeded,\n    })\n    this.clearRemoteStreamNotifyTimer()\n    this.lastNotifiedRemoteStream = null\n    try {\n      this.dragController?.destroy()\n    } catch {\n      // Forced teardown must continue to its terminal telemetry event.\n    }\n    this.dragController = null\n    this.renderCleanup.splice(0).forEach((cleanup) => {\n      try { cleanup() } catch { /* Forced teardown continues. */ }\n    })\n    if (this.hiddenRemoteElement) {\n      try { this.hiddenRemoteElement.remove() } catch { /* Forced teardown continues. */ }\n      this.hiddenRemoteElement = null\n    }\n\n    this.runningContext = null\n    this.taskUid = null\n    this.setState('disconnected')\n    this.emitDisconnect('error')\n\n    this.client.beginTeardown()\n    this.forceAbortTask = (async (): Promise<void> => {\n      let serverCloseConfirmed = false\n      if (activeSessionUid) {\n        try {\n          serverCloseConfirmed = (await this.client.closeSession(activeSessionUid)) !== null\n        } catch {\n          serverCloseConfirmed = false\n        }\n      }\n      this.startup?.finish('error', {\n        ...diagnostics,\n        failure_reason: failureReason,\n        close_mode: 'forced',\n        generation_stop_attempted: generationStopAttempted,\n        generation_stop_succeeded: undefined,\n        local_publish_stop_attempted: true,\n        local_publish_stop_succeeded: undefined,\n        rtc_leave_attempted: true,\n        rtc_leave_succeeded: undefined,\n        server_close_attempted: Boolean(activeSessionUid),\n        server_close_confirmed: serverCloseConfirmed,\n        media_cleanup_succeeded: mediaCleanupSucceeded,\n        duration_ms: Math.round(performance.now() - startedAt),\n      })\n    })().finally(() => {\n      this.client.endTeardown()\n    })\n    return this.forceAbortTask\n  }\n\n  static async connect(\n    stream: MediaStream,\n    options: RealtimeConnectOptions,\n    clientOptions: XmaxClientOptions,\n  ): Promise<RealtimeSessionImpl> {\n    const connectStartedAt = performance.now()\n    const trace = (options as WithStartupTrace)[STARTUP_TRACE]\n    trace?.complete('media_prepare', trace.startedAt)\n    const internalOptions = options as InternalRealtimeConnectOptions\n    const internalPrepared = internalOptions[PREPARED_REALTIME_MEDIA]\n    const prepared: PreparedRealtimeMedia = internalPrepared\n      ?? {\n          kind: 'stream',\n          stream,\n          publishTrack: getVideoTrack(stream),\n          publishAudioTrack: getAudioTrack(stream),\n          owned: false,\n        }\n\n    const sdkI18n = clientOptions.i18n ?? createSDKI18n({ locale: clientOptions.locale })\n    // Connect-level onError wins when set; otherwise keep createXmaxClient.onError.\n    const userErrorCallback = options.onError ?? clientOptions.onError\n    const notifyUserError: XmaxErrorNotifier = (message, error) => {\n      if (session) session.withErrorDetails(error, disconnectReasonForStage(session.operationStage ?? trace?.currentStage))\n      userErrorCallback?.(message, error)\n    }\n    const reportError = (error: unknown, fallbackMessage?: string): never => {\n      throw notifyError(error, notifyUserError, {\n        code: 'UNKNOWN_ERROR',\n        message: fallbackMessage ?? sdkI18n.t('errors.requestFailed'),\n      })\n    }\n\n    const modelName = options.model.name.trim()\n    if (!modelName) {\n      prepared.cleanup?.()\n      throw new XmaxSdkError('INVALID_MODEL', 'model.name is required')\n    }\n    let session: RealtimeSessionImpl\n    const client = new XmaxOpenClient({\n      apiKey: clientOptions.apiKey,\n      authToken: clientOptions.authToken,\n      baseUrl: clientOptions.baseUrl ?? XMAX_OPEN_API_PRODUCTION_BASE_URL,\n      i18n: sdkI18n,\n      onError: notifyUserError,\n      telemetry: clientOptions.telemetry,\n      reportSource: clientOptions.reportSource,\n      telemetryContext: () => session?.startup?.params ?? trace?.params,\n      telemetryRecord: (name, params) => (session?.startup ?? trace)?.record(name, params),\n    })\n\n    const rtcLogEnabled = options.log?.rtc === true\n    const rtc = new RtcManager({\n      diagnostics: trace,\n      renderFit: options.render?.fit,\n      playRemoteAudio: options.audio?.subscribe === true,\n      onLog: rtcLogEnabled ? writeRtcLogToConsole : undefined,\n      onRemoteSeiReceived: clientOptions.onRemoteSei,\n      onSeiGateChange: state => {\n        session?.instant?.onGate(state.matched)\n        clientOptions.onSeiGateChange?.(state)\n      },\n      i18n: sdkI18n,\n    })\n\n    const publishTrack = prepared.internalCamera\n      ? undefined\n      : (prepared.publishTrack ?? getVideoTrack(prepared.stream))\n    if (!prepared.sourceSetting && !publishTrack) {\n      throw new XmaxSdkError('INVALID_INPUT', 'Missing media source setting')\n    }\n    const sourceSetting = prepared.sourceSetting ?? readTrackMediaSetting(publishTrack!)\n    const streamSetting = resolveRealtimeStreamSetting(options, sourceSetting)\n    const media: RealtimeMedia = Object.freeze({\n      kind: prepared.kind,\n      stream: prepared.stream,\n      sourceSetting: Object.freeze({ ...sourceSetting }),\n      streamSetting,\n    })\n\n    if (prepared.internalCamera && rtcLogEnabled) {\n      writeRtcLogToConsole({\n        level: 'info',\n        message: '[Xmax][RTC] connection options',\n        data: {\n          facingMode: prepared.internalCamera.facingMode,\n          stream: streamSetting,\n        },\n      })\n    }\n\n    session = new RealtimeSessionImpl(\n      client,\n      rtc,\n      reportError,\n      options,\n      media,\n      prepared,\n      clientOptions,\n      notifyUserError,\n      sdkI18n,\n    )\n\n    if (!prepared.internalCamera) {\n      session.notifyLowInputResolution(\n        prepared.noticeInputKind ?? prepared.kind,\n        sourceSetting,\n      )\n    }\n\n    try {\n      const instantSource = session.instantImage(options.context ?? { prompt: '' })\n      if (instantSource) await session.prepareInstantImage(instantSource)\n      await session.runAppleMobileVideoStage(\n        () => session.bootstrap(\n          prepared,\n          options,\n          modelName,\n          clientOptions.heartbeatIntervalMs ?? DEFAULT_REALTIME_HEARTBEAT_INTERVAL_MS,\n        ),\n        {\n          stage: 'realtime_connect',\n          timeoutMs: APPLE_MOBILE_VIDEO_CONNECT_TIMEOUT_MS,\n        },\n      )\n      if (session.fatalRtcError) {\n        throw session.fatalRtcError\n      }\n      session.sessionEstablished = true\n      trace?.markConnected()\n      session.logTiming('SDK 实时连接总耗时', connectStartedAt, {\n        mediaKind: prepared.kind,\n      })\n      return session\n    } catch (error) {\n      session.logTiming('SDK 实时连接总耗时', connectStartedAt, {\n        mediaKind: prepared.kind,\n        failed: true,\n      })\n      const failureReason = (error instanceof XmaxSdkError ? error.details?.reason_code : undefined)\n        ?? disconnectReasonForStage(session.operationStage ?? trace?.currentStage)\n      error = session.withErrorDetails(error, failureReason)\n      const diagnostics = {\n        failure_stage: trace?.currentStage,\n        ...diagnosticError(error),\n      }\n      if (session.appleMobileVideoUpload) {\n        await session.forceAbortBootstrap(failureReason, diagnostics)\n      } else if (!session.disconnected) {\n        await session.safeDisconnect({\n          reason: 'error',\n          failureReason,\n          diagnostics,\n        })\n      }\n      throw reportError(error)\n    }\n  }\n\n  /** Tear down the session when outbound or first remote frames never become ready. */\n  private failOverloaded(cause: XmaxDisconnectReasonCode, evidence: XmaxTelemetryParams = {}): void {\n    if (this.disconnected) {\n      return\n    }\n    const message = this.sdkI18n.t(cause === 'remote_first_frame_timeout' ? 'errors.systemOverloaded' : 'errors.rtcStreamInterrupted')\n    const error = new XmaxSdkError('WEB_RTC_ERROR', message)\n    const diagnostics = {\n      failure_stage: cause === 'remote_first_frame_timeout' || this.initialRemoteFramePending ? 'wait_first_frame' : 'streaming',\n      error_code: error.code,\n      ...this.startup?.rtcEvidence(),\n      ...evidence,\n    }\n    this.withErrorDetails(error, cause, diagnostics)\n    this.startup?.recordError({ ...diagnostics, failure_reason: cause })\n    if (this.appleMobileVideoUpload) {\n      void this.forceAbortBootstrap(cause, diagnostics)\n    } else {\n      void this.safeDisconnect({ reason: 'overloaded', failureReason: cause, diagnostics })\n    }\n    try {\n      notifyError(error, this.notifyUserError, message)\n    } catch {\n      // Consumer error callbacks must not prevent Session teardown.\n    }\n  }\n\n  /** Forward Volcengine's unrecoverable asynchronous RTC errors, then close the Session. */\n  private handleRtcAsyncError(info: RtcAsyncErrorInfo): void {\n    if (this.disconnected) {\n      return\n    }\n    const message = this.sdkI18n.t('rtc.error', { code: info.errorCode })\n    const error = new XmaxSdkError('WEB_RTC_ERROR', message)\n    this.fatalRtcError = error\n    const diagnostics = {\n      failure_stage: 'rtc',\n      rtc_error_code: info.errorCode,\n      error_code: error.code,\n    }\n    this.withErrorDetails(error, 'rtc_async_error', diagnostics)\n    this.startup?.recordError({ ...diagnostics, failure_reason: 'rtc_async_error' })\n    if (this.appleMobileVideoUpload) {\n      void this.forceAbortBootstrap('rtc_async_error', diagnostics)\n    } else {\n      void this.safeDisconnect({ reason: 'error', failureReason: 'rtc_async_error', diagnostics })\n    }\n    try {\n      notifyError(error, this.notifyUserError, message)\n    } catch {\n      // Consumer error callbacks must not prevent Session teardown.\n    }\n  }\n\n  /**\n   * Any failure that blocks output: send stop (if generation active), leave RTC,\n   * close session, then fire `onDisconnect`.\n   */\n  private failOutputAndDisconnect(\n    error: unknown,\n    failureReason?: XmaxDisconnectReasonCode,\n    operationContext: XmaxTelemetryParams = {},\n  ): Promise<never> | never {\n    const original = error instanceof XmaxSdkError ? error.details : undefined\n    failureReason ??= original?.reason_code ?? disconnectReasonForStage(this.operationStage ?? this.startup?.currentStage)\n    const diagnostics = {\n      failure_stage: original?.failure_stage ?? this.operationStage ?? this.startup?.currentStage,\n      ...diagnosticError(error),\n      ...operationContext,\n    }\n    error = this.withErrorDetails(error, failureReason, diagnostics)\n    this.startup?.recordError({ ...diagnostics, failure_reason: failureReason })\n    if (this.appleMobileVideoUpload) {\n      return this.failAppleMobileVideoAndDisconnect(error, failureReason, diagnostics)\n    }\n    if (!this.disconnected) {\n      void this.safeDisconnect({ reason: 'error', failureReason, diagnostics })\n    }\n    this.reportError(error)\n  }\n\n  private async failAppleMobileVideoAndDisconnect(\n    error: unknown,\n    failureReason: XmaxDisconnectReasonCode,\n    diagnostics: XmaxTelemetryParams = {},\n  ): Promise<never> {\n    await this.forceAbortBootstrap(failureReason, diagnostics)\n    this.reportError(error)\n  }\n\n  private async bootstrap(\n    prepared: PreparedRealtimeMedia,\n    options: RealtimeConnectOptions,\n    modelName: string,\n    heartbeatIntervalMs: number,\n  ): Promise<void> {\n    const createdSession = await this.measureStartup(\n      'session_api',\n      () => this.client.createSession(modelName),\n    )\n    if (!createdSession.sessionUid?.trim()) {\n      throw new XmaxSdkError('SESSION_ERROR', 'Session uid is missing')\n    }\n\n    this.sessionUid = createdSession.sessionUid\n    this.startup?.setContext({\n      session_id: this.sessionUid,\n      stream_width: this.media.streamSetting.width,\n      stream_height: this.media.streamSetting.height,\n      stream_fps: this.media.streamSetting.fps,\n    })\n    if (this.appleMobileVideoUpload) {\n      await this.ensureBootstrapActive()\n    }\n    this.heartbeatIntervalMs = heartbeatIntervalMs\n\n    const joinInfo = this.client.getRtcJoinInfo(createdSession)\n    this.startup?.setContext({ rtc_room_id: joinInfo.roomId })\n    if (prepared.internalCamera) {\n      const internalCamera = prepared.internalCamera\n      const encoderSize = resolveCameraRtcEncoderSize(this.media.streamSetting)\n      this.hideLocalCameraPreview()\n      await this.measureStartup('rtc_prepare', () => this.rtc.prepareEngine(joinInfo))\n\n      if (this.localElement) {\n        this.rtc.setLocalVideoContainer(this.localElement)\n      }\n      if (this.remoteVideoContainer) {\n        this.rtc.setRemoteVideoContainer(this.remoteVideoContainer)\n      }\n\n      const captureSettings = await this.measureStartup(\n        'camera_capture',\n        () => this.rtc.startInternalVideoCapture({\n          encoderSize,\n          encoderFps: this.media.streamSetting.fps,\n          encoderMaxKbps: this.media.streamSetting.maxKbps,\n          encoderContentHint: this.media.streamSetting.contentHint,\n          facingMode: internalCamera.facingMode,\n        }),\n      )\n      this.updateCameraSourceSetting(captureSettings, false)\n      if (internalCamera.withAudio) {\n        await this.measureStartup('camera_audio', () => this.rtc.startInternalAudioCapture())\n      }\n\n      await this.measureStartup('rtc_join', () => this.rtc.joinPreparedRoom())\n\n      this.startup?.enter('camera_ready')\n      const cameraTrack = this.rtc.getInternalVideoTrack()\n      if (!cameraTrack) {\n        throw new XmaxSdkError('CAMERA_ERROR', 'Missing internal camera track')\n      }\n      this.updateCameraSourceSetting(\n        typeof cameraTrack.getSettings === 'function' ? cameraTrack.getSettings() : {},\n      )\n      const cameraReadyStartedAt = performance.now()\n      const cameraReady = await this.measureStartup('camera_ready', () => waitForCameraTrackReady(cameraTrack, {\n        consecutiveFrames: 2,\n        timeoutMs: 1000,\n      }))\n      this.logTiming('等待摄像头画面就绪', cameraReadyStartedAt, cameraReady)\n      this.revealLocalCameraPreview()\n\n      const track = await this.measureStartup('publish', () => this.rtc.publishInternalVideo())\n      prepared.stream.addTrack(track)\n    } else {\n      await this.runAppleMobileVideoStage(\n        () => this.measureStartup('rtc_join', () => this.rtc.join(joinInfo)),\n        {\n          stage: 'rtc_join',\n          timeoutMs: APPLE_MOBILE_VIDEO_JOIN_TIMEOUT_MS,\n        },\n      )\n      if (this.appleMobileVideoUpload) {\n        await this.ensureBootstrapActive()\n      }\n\n      if (this.remoteVideoContainer) {\n        this.rtc.setRemoteVideoContainer(this.remoteVideoContainer)\n      }\n\n      const externalPublishDeadlines: ExternalVideoPublishDeadlines | undefined =\n        this.appleMobileVideoUpload\n          ? {\n              externalSourceMs: APPLE_MOBILE_VIDEO_SOURCE_TIMEOUT_MS,\n              encoderMs: APPLE_MOBILE_VIDEO_ENCODER_TIMEOUT_MS,\n              publishMs: APPLE_MOBILE_VIDEO_PUBLISH_TIMEOUT_MS,\n              timeoutMessage: this.sdkI18n.t('errors.systemOverloaded'),\n            }\n          : undefined\n      await this.measureStartup(\n        'publish',\n        () => this.rtc.startExternalVideoPublishing(\n          prepared.publishTrack ?? getVideoTrack(prepared.stream),\n          [this.media.streamSetting.width, this.media.streamSetting.height],\n          {\n            highQuality: true,\n            fps: this.media.streamSetting.fps,\n            maxKbps: this.media.streamSetting.maxKbps,\n            contentHint: this.media.streamSetting.contentHint,\n            audioTrack: prepared.publishAudioTrack,\n          },\n          externalPublishDeadlines,\n        ),\n      )\n      if (this.appleMobileVideoUpload) {\n        await this.ensureBootstrapActive()\n      }\n\n      if (this.appleMobileVideoUpload) {\n        await this.measureStartup('outbound_ready', () => this.rtc.waitForLocalOutboundVideoReady({\n          timeoutMs: APPLE_MOBILE_VIDEO_OUTBOUND_TIMEOUT_MS,\n          minPositiveSamples: 2,\n          timeoutMessage: this.sdkI18n.t('errors.systemOverloaded'),\n        }))\n        await this.ensureBootstrapActive()\n      }\n    }\n\n    const initialContext = normalizeRealtimeContext(options.context ?? { prompt: '' })\n\n    this.currentContext = initialContext\n\n    if (this.localElement && prepared.internalCamera) {\n      queueMicrotask(() => this.rtc.refreshLocalVideoPreview())\n    }\n\n    const autoStart = options.autoStart ?? DEFAULT_REALTIME_AUTO_START\n    if (autoStart) {\n      await this.runStart({\n        prompt: this.currentContext.prompt,\n        refImage: this.currentContext.refImageUrl ?? undefined,\n      })\n      if (this.appleMobileVideoUpload) {\n        await this.ensureBootstrapActive()\n      }\n      this.runningContext = this.currentContext\n      this.setState('running')\n    }\n\n  }\n\n  /** Replace the provisional camera source metadata with the actual RTC capture result. */\n  private updateCameraSourceSetting(\n    settings: MediaTrackSettings,\n    shouldNotify = true,\n  ): void {\n    const previous = this.media.sourceSetting\n    const sourceSetting = Object.freeze({\n      width: isPositiveFinite(settings.width) ? settings.width : previous.width,\n      height: isPositiveFinite(settings.height) ? settings.height : previous.height,\n      fps: isPositiveFinite(settings.frameRate) ? settings.frameRate : previous.fps,\n    })\n    this.mediaValue = Object.freeze({\n      ...this.media,\n      sourceSetting,\n    })\n    if (shouldNotify) {\n      this.notifyLowInputResolution('camera', sourceSetting)\n    }\n  }\n\n  /** Emit one non-fatal source-resolution notice per Session. */\n  private notifyLowInputResolution(\n    inputKind: RealtimeMediaKind,\n    setting: Pick<RealtimeMediaSetting, 'width' | 'height'>,\n  ): void {\n    if (this.lowInputResolutionNotified) {\n      return\n    }\n\n    const notice = createLowInputResolutionNotice({\n      inputKind,\n      width: setting.width,\n      height: setting.height,\n      message: this.sdkI18n.t(\n        inputKind === 'image'\n          ? 'notices.lowInputImageResolution'\n          : 'notices.lowInputResolution',\n      ),\n    })\n    if (!notice) {\n      return\n    }\n\n    this.lowInputResolutionNotified = true\n    notifyNotice(notice, this.notifyUserNotice)\n  }\n\n  /** Start billing heartbeat once, after the client renders the first remote output frame. */\n  private startHeartbeatAfterFirstRemoteFrame(): void {\n    if (this.heartbeatStarted || this.disconnected || !this.sessionUid || !this.taskUid) {\n      return\n    }\n    this.heartbeatStarted = true\n    this.client.startHeartbeat(\n      this.sessionUid,\n      this.heartbeatIntervalMs,\n      (heartbeatSession, diagnostics) => {\n        if (heartbeatSession.status !== ACTIVE_STATUS) {\n          const allowedReasons = new Set(['idle_timeout', 'duration_limit', 'token_expired', 'quota_exhausted', 'user_closed', 'server_error', 'session_expired'])\n          const rawReason = heartbeatSession.closeReason\n          const closeTime = heartbeatSession.closeTimestamp ? Date.parse(heartbeatSession.closeTimestamp) : NaN\n          void this.safeDisconnect({\n            reason: 'session_inactive',\n            diagnostics: {\n              ...diagnostics, session_status: heartbeatSession.status,\n              server_close_reason: rawReason ? (allowedReasons.has(rawReason) ? rawReason : 'unrecognized') : undefined,\n              server_close_reason_present: Boolean(rawReason),\n              server_close_timestamp_ms: Number.isFinite(closeTime) ? closeTime : undefined,\n              failure_stage: 'heartbeat',\n            },\n          })\n        }\n      },\n      (error, diagnostics) => {\n        void this.safeDisconnect({\n          reason: 'heartbeat_error',\n          diagnostics: { ...diagnosticError(error), ...diagnostics, failure_stage: 'heartbeat' },\n        })\n      },\n    )\n  }\n\n  /** Forward RTC's native first-rendered-frame signal without coupling consumers to the player DOM. */\n  private handleRemoteVideoFirstFrame(info: RealtimeRemoteVideoFirstFrameInfo): void {\n    if (this.disconnected || !this.taskUid || !this.initialRemoteFramePending) {\n      return\n    }\n    this.initialRemoteFramePending = false\n    this.startup?.firstFrame({\n      output_width: info.width,\n      output_height: info.height,\n    })\n    this.rtc.clearRemoteFirstOutputWatch()\n    this.startHeartbeatAfterFirstRemoteFrame()\n    if (this.remoteFirstFrameNotified) {\n      return\n    }\n    this.remoteFirstFrameNotified = true\n    this.rtc.setOnRemoteVideoFirstFrame(undefined)\n    try {\n      this.onRemoteVideoFirstFrame?.(info)\n    } catch {\n      // Consumer callbacks must not break the RTC or Session lifecycle.\n    }\n  }\n\n  private setState(state: RealtimeSessionState): void {\n    if (this.currentState === state) {\n      return\n    }\n    this.currentState = state\n    this.startup?.record('sdk_session_state_change', { state })\n    try {\n      this.onStateChange?.(state)\n    } catch {\n      // Consumer callbacks must not break the session lifecycle.\n    }\n  }\n\n  private assertConnected(): void {\n    if (this.currentState === 'disconnected') {\n      throw new XmaxSdkError('SESSION_ERROR', 'Realtime session is disconnected')\n    }\n  }\n\n  async start(context?: RealtimeContext): Promise<void> {\n    return this.startWithInternalOptions(context)\n  }\n\n  async set(context: RealtimeContext): Promise<void> {\n    this.assertConnected()\n\n    const nextContext = normalizeRealtimeContext({\n      ...this.currentContext,\n      ...context,\n      ...(context.refImageUrl === null ? { refImageUrl: undefined } : {}),\n    })\n    const changesInstant = this.presentation.instant || this.instantUploadAbort || this.instantImage(nextContext)\n    this.cancelInstant()\n    if (changesInstant) {\n      // Preserve explicit null: re-merging a normalized context would restore the old reference.\n      return this.startWithInternalOptions(context)\n    }\n    let revision = this.generationRevision\n    const operationId = globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random()}`\n    const startsGeneration = this.currentState !== 'running'\n    const operationContext = {\n      operation_id: operationId,\n      generation_id: startsGeneration ? null : this.taskUid ?? null,\n    }\n    const setStartedAt = performance.now()\n    const contextFields = Object.keys(context)\n      .filter(key => ['prompt', 'refImageUrl'].includes(key))\n      .join(',')\n    const uploadedAsset = findUploadedAsset(nextContext.refImageUrl)\n    this.startup?.record('sdk_context_set_request', {\n      ...operationContext,\n      context_fields: contextFields,\n      asset_operation_id: uploadedAsset?.operationId,\n      asset_age_ms: uploadedAsset ? Math.max(0, performance.now() - uploadedAsset.completedAtMonotonicMs) : undefined,\n    })\n\n    if (!startsGeneration) {\n      try {\n        await this.measureStartup('context_set', () => this.runChangeCondition({\n          prompt: nextContext.prompt,\n          refImage: nextContext.refImageUrl ?? undefined,\n        }))\n        if (this.disconnected || revision !== this.generationRevision) return\n        this.currentContext = nextContext\n        this.runningContext = nextContext\n        this.setState('running')\n        this.startup?.record('sdk_context_set_response', {\n          ...operationContext,\n          ok: true,\n          duration_ms: Math.round(performance.now() - setStartedAt),\n        })\n      } catch (error) {\n        if (this.disconnected || revision !== this.generationRevision) return\n        this.startup?.record('sdk_context_set_response', {\n          ...operationContext,\n          ok: false,\n          duration_ms: Math.round(performance.now() - setStartedAt),\n          ...diagnosticError(error),\n        })\n        await this.failOutputAndDisconnect(error, undefined, operationContext)\n      }\n      return\n    }\n\n    try {\n      const pendingStart = this.runStart({\n        prompt: nextContext.prompt,\n        refImage: nextContext.refImageUrl ?? undefined,\n      }, taskUid => {\n        operationContext.generation_id = taskUid\n      })\n      revision = this.generationRevision\n      await pendingStart\n      if (this.disconnected || revision !== this.generationRevision) return\n      this.currentContext = nextContext\n      this.runningContext = nextContext\n      this.setState('running')\n      this.startup?.record('sdk_context_set_response', {\n        ...operationContext,\n        ok: true,\n        duration_ms: Math.round(performance.now() - setStartedAt),\n      })\n    } catch (error) {\n      if (this.disconnected || revision !== this.generationRevision) return\n      this.startup?.record('sdk_context_set_response', {\n        ...operationContext,\n        ok: false,\n        duration_ms: Math.round(performance.now() - setStartedAt),\n        ...diagnosticError(error),\n      })\n      throw error\n    }\n  }\n\n  async startWithInternalOptions(\n    context?: RealtimeContext,\n    options: InternalRealtimeStartOptions = {},\n  ): Promise<void> {\n    this.assertConnected()\n    this.cancelInstant()\n    const nextContext = context\n      ? normalizeRealtimeContext({\n          ...this.currentContext,\n          ...context,\n          ...(context.refImageUrl === null ? { refImageUrl: undefined } : {}),\n        })\n      : this.currentContext\n\n    let revision = this.generationRevision\n    try {\n      const pendingStart = this.runStart({\n        prompt: nextContext.prompt,\n        refImage: nextContext.refImageUrl ?? undefined,\n        preserveRemoteOutput: options.preserveRemoteOutput,\n      })\n      revision = this.generationRevision\n      await pendingStart\n      if (this.disconnected || revision !== this.generationRevision) return\n      this.currentContext = nextContext\n      this.runningContext = nextContext\n      this.setState('running')\n    } catch (error) {\n      if (this.disconnected || revision !== this.generationRevision) return\n      await this.failOutputAndDisconnect(error)\n    }\n  }\n\n  async sendTracks(tracks: Array<[number, number]>): Promise<void> {\n    if (!this.rtc.snapshot.joined || !this.taskUid) {\n      return\n    }\n\n    try {\n      await this.rtc.sendRoomEvent(\n        createTracksRtcRoomEvent({\n          userId: this.rtc.snapshot.userId ?? undefined,\n          uid: this.taskUid,\n          sessionUid: this.taskUid,\n          tracks,\n        }),\n      )\n    } catch {\n      // Track sending is best-effort; failures are ignored.\n    }\n  }\n\n  async stopGeneration(): Promise<void> {\n    return this.stopInternal({ trigger: 'client_api' })\n  }\n\n  async stopLocalStream(): Promise<void> {\n    this.cancelInstant()\n    const startedAt = performance.now()\n    if (this.disconnected) {\n      this.startup?.setTerminalContext({\n        local_stream_stop_called: true,\n        local_stream_stop_outcome: 'noop',\n        local_stream_stop_trigger: 'session_already_disconnected',\n        local_stream_stop_offset_ms: this.startup.offset(),\n      })\n      return\n    }\n    const wasPublished = this.rtc.snapshot.localVideoPublished\n    let publishStopSucceeded = true\n    let cleanupSucceeded = true\n    let stopError: unknown\n    if (!this.mediaCleaned) {\n      this.mediaCleaned = true\n      try {\n        this.cleanupMedia?.()\n      } catch (error) {\n        cleanupSucceeded = false\n        stopError = error\n      }\n    }\n    try {\n      await this.rtc.stopVideoPublishing({\n        preserveExternalTrack: !this.ownsMedia,\n        preserveRemote: true,\n      })\n    } catch (error) {\n      publishStopSucceeded = false\n      stopError = error\n    }\n    this.startup?.setTerminalContext({\n      local_stream_stop_called: true,\n      local_stream_stop_outcome: publishStopSucceeded && cleanupSucceeded ? 'success' : 'error',\n      local_stream_stop_trigger: 'client_api',\n      local_stream_stop_offset_ms: this.startup.offset(),\n      local_stream_was_published: wasPublished,\n      local_stream_publish_stop_succeeded: publishStopSucceeded,\n      local_stream_media_cleanup_succeeded: cleanupSucceeded,\n      local_stream_stop_duration_ms: Math.round(performance.now() - startedAt),\n      ...(stopError ? diagnosticError(stopError) : {}),\n    })\n    if (stopError) {\n      this.startup?.recordError({\n        failure_reason: 'local_stream_stop_failed',\n        failure_stage: publishStopSucceeded ? 'media_cleanup' : 'local_publish_stop',\n        ...diagnosticError(stopError),\n      })\n    }\n  }\n\n  private async stopInternal(\n    options?: {\n      preserveRemoteDom?: boolean\n      suppressStateChange?: boolean\n      trigger?: 'client_api' | 'session_disconnect'\n    },\n  ): Promise<void> {\n    this.assertConnected()\n    this.cancelInstant()\n    const startedAt = performance.now()\n    const hadGeneration = Boolean(this.taskUid)\n    const stoppedGenerationId = this.taskUid\n    let stopMessageAttempted = false\n    this.initialRemoteFramePending = false\n    this.rtc.clearRemoteFirstOutputWatch()\n    this.rtc.clearLocalOutboundWatch()\n    this.updateDragController(false)\n\n    const preserveRemoteDom = options?.preserveRemoteDom ?? false\n    if (preserveRemoteDom) {\n      this.rtc.setPreserveRemoteDom(true)\n    }\n\n    // Generation has stopped; keep RTC publishing alive but stop tagging frames\n    // with the completed task id and clear the corresponding remote SEI gate.\n    this.rtc.configureSessionSei(null)\n\n    if (!this.rtc.snapshot.joined) {\n      this.rtc.clearRemoteVideo({ preserveDom: preserveRemoteDom })\n      if (!preserveRemoteDom && this.remoteVideoContainer) {\n        this.rtc.setRemoteVideoContainer(null)\n      }\n      this.taskUid = null\n      this.runningContext = null\n      this.startup?.clearGeneration(stoppedGenerationId)\n      if (!options?.suppressStateChange) {\n        this.setState('idle')\n      }\n      if (preserveRemoteDom) {\n        this.rtc.setPreserveRemoteDom(false)\n      }\n      this.startup?.setTerminalContext({\n        generation_stop_called: true,\n        generation_stop_outcome: hadGeneration ? 'local_cleanup' : 'noop',\n        generation_stop_trigger: options?.trigger ?? 'client_api',\n        generation_stop_offset_ms: this.startup.offset(),\n        generation_stop_had_generation: hadGeneration,\n        generation_stop_message_attempted: false,\n        generation_stop_duration_ms: Math.round(performance.now() - startedAt),\n      })\n      return\n    }\n\n    try {\n      stopMessageAttempted = true\n      await this.rtc.sendRoomEvent(\n        createStopRtcRoomEvent({\n          userId: this.rtc.snapshot.userId ?? undefined,\n          sessionUid: this.taskUid ?? undefined,\n        }),\n      )\n      this.startup?.setTerminalContext({\n        generation_stop_called: true,\n        generation_stop_outcome: 'success',\n        generation_stop_trigger: options?.trigger ?? 'client_api',\n        generation_stop_offset_ms: this.startup.offset(),\n        generation_stop_had_generation: hadGeneration,\n        generation_stop_message_attempted: stopMessageAttempted,\n        generation_stop_duration_ms: Math.round(performance.now() - startedAt),\n      })\n    } catch (error) {\n      this.startup?.recordError({\n        failure_reason: 'generation_stop_failed',\n        generation_id: stoppedGenerationId,\n        failure_stage: 'generation_stop',\n        ...diagnosticError(error),\n      })\n      this.startup?.setTerminalContext({\n        generation_stop_called: true,\n        generation_stop_outcome: 'error',\n        generation_stop_trigger: options?.trigger ?? 'client_api',\n        generation_stop_offset_ms: this.startup.offset(),\n        generation_stop_had_generation: hadGeneration,\n        generation_stop_message_attempted: stopMessageAttempted,\n        generation_stop_duration_ms: Math.round(performance.now() - startedAt),\n        ...diagnosticError(error),\n      })\n      throw error\n    } finally {\n      this.rtc.clearRemoteVideo({ preserveDom: preserveRemoteDom })\n      if (!preserveRemoteDom && this.remoteVideoContainer) {\n        this.rtc.setRemoteVideoContainer(null)\n      }\n      this.taskUid = null\n      this.runningContext = null\n      this.startup?.clearGeneration(stoppedGenerationId)\n      if (!options?.suppressStateChange) {\n        this.setState('idle')\n      }\n      if (preserveRemoteDom) {\n        this.rtc.setPreserveRemoteDom(false)\n      }\n    }\n  }\n\n  async disconnect(reason: InternalRealtimeDisconnectReason = 'client_disconnect'): Promise<void> {\n    if (this.disconnected) {\n      return\n    }\n    this.disconnected = true\n    await this.safeDisconnect({ reason: 'client', failureReason: reason })\n  }\n\n  getSessionUid(): string | null {\n    return this.sessionUid\n  }\n\n  /** Keep change_condition size pinned to the first start event. */\n  private resolveChangeConditionSize(): [number, number] {\n    if (!this.firstStartEventSize) {\n      return [\n        this.media.streamSetting.width,\n        this.media.streamSetting.height,\n      ]\n    }\n    return [this.firstStartEventSize[0], this.firstStartEventSize[1]]\n  }\n\n  private async runStart(options: {\n    prompt?: string\n    refImage?: string\n    preserveRemoteOutput?: boolean\n  }, onGenerationCreated?: (taskUid: string) => void): Promise<void> {\n    if (!this.rtc.snapshot.joined) {\n      return\n    }\n\n    const revision = this.generationRevision = (this.generationRevision ?? 0) + 1\n    const isCurrent = () => !this.disconnected && this.generationRevision === revision\n    const startPrompt = options.prompt ?? this.currentContext.prompt\n    const instantSource = this.instantImage({ prompt: startPrompt, refImageUrl: options.refImage })\n    let staticImagePath: string | undefined\n    if (instantSource) {\n      try {\n        staticImagePath = await this.prepareInstantImage(instantSource)\n      } catch (error) {\n        if (!isCurrent()) return\n        throw error\n      }\n      if (!isCurrent()) return\n      if (!this.instant) {\n        this.instant = new InstantPresentation({\n          container: this.hiddenRemoteElement ? undefined : this.remoteViewHost?.wrapper,\n          fit: this.dragTrackFitMode,\n          transitionMs: this.inputImageTransitionMs,\n          onChange: this.onPresentationChange,\n          restart: () => this.runStart({\n            prompt: this.currentContext.prompt,\n            refImage: this.currentContext.refImageUrl ?? undefined,\n          }),\n        })\n      }\n      this.instant.activate(instantSource)\n    } else {\n      this.instant?.reset()\n    }\n    if (!isCurrent()) return\n\n    let taskUid: string | null = null\n    const preserveRemoteOutput = options.preserveRemoteOutput ?? false\n    if (preserveRemoteOutput) {\n      this.rtc.setPreserveRemoteDom(true)\n    }\n\n    try {\n      if (!preserveRemoteOutput) {\n        this.rtc.setRemoteVideoContainer(null)\n        this.rtc.clearRemoteVideo()\n      }\n\n      const size: [number, number] = [\n        this.media.streamSetting.width,\n        this.media.streamSetting.height,\n      ]\n      if (!this.firstStartEventSize) {\n        this.firstStartEventSize = [size[0], size[1]] as const\n      }\n      taskUid = createTaskUid()\n      this.taskUid = taskUid\n      this.startup?.setGeneration(taskUid)\n      onGenerationCreated?.(taskUid)\n\n      this.rtc.configureSessionSei(taskUid)\n\n      if (this.remoteVideoContainer) {\n        this.rtc.setRemoteVideoContainer(this.remoteVideoContainer)\n      }\n\n      const startRoomEvent = createStartRtcRoomEvent({\n        userId: this.rtc.snapshot.userId ?? undefined,\n        uid: taskUid,\n        sessionUid: taskUid,\n        model: DEFAULT_REALTIME_START_EVENT_MODEL,\n        size,\n        prompt: startPrompt,\n        refImagePath: instantSource ? undefined : options.refImage,\n        staticGenerate: instantSource ? true : undefined,\n        staticImagePath,\n        mirror: this.shouldMirrorCameraInput,\n      })\n\n      // Register the initial-frame expectation before sending start so an immediate\n      // RTC callback cannot be missed while the send promise is resolving.\n      this.initialRemoteFramePending = Boolean(\n        this.remoteVideoContainer && !this.remoteFirstFrameNotified,\n      )\n\n      await this.runAppleMobileVideoStage(\n        () => this.measureStartup(\n          'start_send',\n          () => this.rtc.sendRoomEvent(startRoomEvent),\n        ),\n        {\n          stage: 'start_event_send',\n          timeoutMs: APPLE_MOBILE_VIDEO_START_SEND_TIMEOUT_MS,\n        },\n      )\n      if (!isCurrent()) return\n      if (this.appleMobileVideoUpload) {\n        await this.ensureBootstrapActive()\n      }\n\n      // Only an actually presented initial output completes this deadline. If an\n      // immediate frame arrived while sendRoomEvent was resolving, pending is false.\n      if (this.initialRemoteFramePending) {\n        this.rtc.armRemoteFirstOutputWatch({\n          onTimeout: () => {\n            if (!this.rtc.confirmRemoteVideoFirstFrame()) {\n              this.failOverloaded('remote_first_frame_timeout')\n            }\n          },\n        })\n      }\n\n      const isMobileUploadInput =\n        (this.media.kind === 'video' || this.media.kind === 'image')\n        && isLikelyMobileRuntime()\n      this.rtc.armLocalOutboundWatch({\n        minZeroSamples: isMobileUploadInput ? 5 : 3,\n        minStallMs: isMobileUploadInput ? 12_000 : 6000,\n        startGraceMs: isMobileUploadInput ? 12_000 : 6000,\n        resumeGraceMs: isMobileUploadInput ? 8000 : 5000,\n        onStalled: (info) => {\n          this.failOverloaded(localOutboundDisconnectReason(info.reason), {\n            detection_source: 'local_outbound_watch', stall_ms: info.stallMs,\n            consecutive_zero_samples: info.consecutiveZeroStats, up_fps: info.lastSentFrameRate,\n          })\n        },\n      })\n\n      await this.measureStartup(\n        'remote_bind',\n        () => this.rtc.refreshRemoteVideoBinding({ force: !preserveRemoteOutput }),\n      )\n      if (!isCurrent()) return\n      this.startup?.enter(this.initialRemoteFramePending ? 'wait_first_frame' : 'streaming')\n      if (this.appleMobileVideoUpload) {\n        await this.ensureBootstrapActive()\n      }\n      this.updateDragController(true)\n      this.scheduleNotifyRemoteStream()\n    } catch (error) {\n      if (!isCurrent()) return\n      this.initialRemoteFramePending = false\n      this.rtc.configureSessionSei(null)\n      this.rtc.clearRemoteFirstOutputWatch()\n      this.rtc.clearLocalOutboundWatch()\n      if (this.disconnected && error instanceof SessionBootstrapCancelledError) {\n        throw error\n      }\n      // Publish / start / bind failure all block output — stop + full disconnect.\n      await this.failOutputAndDisconnect(error, undefined, { generation_id: taskUid })\n    } finally {\n      if (preserveRemoteOutput) {\n        this.rtc.setPreserveRemoteDom(false)\n      }\n    }\n  }\n\n  private async runChangeCondition(options: {\n    prompt?: string\n    refImage?: string\n  }): Promise<void> {\n    if (!this.rtc.snapshot.joined) {\n      return\n    }\n\n    const size = this.resolveChangeConditionSize()\n    const changeConditionRoomEvent = createChangeConditionRtcRoomEvent({\n      userId: this.rtc.snapshot.userId ?? undefined,\n      sessionUid: this.taskUid ?? undefined,\n      model: DEFAULT_REALTIME_START_EVENT_MODEL,\n      size,\n      prompt: options.prompt ?? this.currentContext.prompt,\n      refImagePath: options.refImage,\n    })\n\n    await this.measureTiming(\n      '发送切换条件事件',\n      () => this.rtc.sendRoomEvent(changeConditionRoomEvent),\n      {\n        prompt: changeConditionRoomEvent.params.prompt,\n        size: changeConditionRoomEvent.params.size,\n        hasRefImage: Boolean(changeConditionRoomEvent.params.ref_image_path),\n      },\n    )\n  }\n\n  private isDragEnabled(): boolean {\n    return (\n      this.dragSetting?.enabled\n      ?? DEFAULT_REALTIME_RENDER_SETTING.dragEnabled\n    )\n      && Boolean(this.remoteElement && !this.hiddenRemoteElement)\n  }\n\n  private updateDragController(active: boolean): void {\n    const dragHost = this.remoteViewHost?.dragHost\n    if (!dragHost || !active || !this.taskUid || !this.isDragEnabled()) {\n      this.dragController?.setEnabled(false)\n      return\n    }\n\n    const targetSize: [number, number] = [\n      this.media.streamSetting.width,\n      this.media.streamSetting.height,\n    ]\n    if (!this.dragController) {\n      this.dragController = createDragTrackController(dragHost, {\n        targetSize,\n        fitMode: this.dragTrackFitMode,\n        mirrored: false,\n        enabled: true,\n        onTracks: (tracks) => {\n          void this.sendTracks(tracks)\n        },\n        onStrokeStart: () => {\n          this.beginDrag()\n          return this.dragSetting?.onStart?.()\n        },\n        onStrokeEnd: () => {\n          this.endDrag()\n          return this.dragSetting?.onEnd?.()\n        },\n      })\n      return\n    }\n\n    this.dragController.setTargetSize(targetSize)\n    this.dragController.setFitMode(this.dragTrackFitMode)\n    this.dragController.setMirrored(false)\n    this.dragController.setEnabled(true)\n  }\n\n  private scheduleNotifyRemoteStream(): void {\n    if (!this.onRemoteStream) {\n      return\n    }\n\n    this.clearRemoteStreamNotifyTimer()\n    if (this.notifyRemoteStreamOnce()) {\n      return\n    }\n\n    let attempts = 0\n    this.remoteStreamNotifyTimer = setInterval(() => {\n      attempts += 1\n      if (this.notifyRemoteStreamOnce() || attempts >= 60) {\n        this.clearRemoteStreamNotifyTimer()\n      }\n    }, 500)\n  }\n\n  private notifyRemoteStreamOnce(): boolean {\n    const videoRoot = this.remoteVideoContainer\n    if (!this.onRemoteStream || !videoRoot) {\n      return false\n    }\n\n    const video = videoRoot instanceof HTMLVideoElement\n      ? videoRoot\n      : videoRoot.querySelector('video')\n\n    if (!(video instanceof HTMLVideoElement) || !(video.srcObject instanceof MediaStream)) {\n      return false\n    }\n\n    if (this.lastNotifiedRemoteStream === video.srcObject) {\n      return true\n    }\n\n    this.lastNotifiedRemoteStream = video.srcObject\n    this.onRemoteStream(video.srcObject)\n    return true\n  }\n\n  private clearRemoteStreamNotifyTimer(): void {\n    if (this.remoteStreamNotifyTimer !== null) {\n      clearInterval(this.remoteStreamNotifyTimer)\n      this.remoteStreamNotifyTimer = null\n    }\n  }\n\n  private emitDisconnect(reason: RealtimeDisconnectReason): void {\n    if (!this.sessionEstablished || this.disconnectNotified) {\n      return\n    }\n    this.disconnectNotified = true\n    try {\n      const recorded = this.startup?.terminalFailureDetails\n      if (recorded?.failure_reason && this.disconnectDetails\n        && ['client_disconnect', 'client_background_timeout', 'client_session_replaced', 'client_context_disposed', 'pagehide', 'session_error'].includes(this.disconnectDetails.reason_code ?? '')) {\n        this.disconnectDetails = createErrorDetails({ ...this.disconnectDetails, ...recorded, reason_code: recorded.failure_reason })\n      }\n      this.onDisconnect?.(reason, this.disconnectDetails ?? this.diagnosticDetails(probeDisconnectReason(reason)))\n    } catch {\n      // `onDisconnect` errors must not break teardown.\n    }\n  }\n\n  private async safeDisconnect(\n    options?: {\n      reason?: RealtimeDisconnectReason\n      failureReason?: XmaxDisconnectReasonCode\n      diagnostics?: XmaxTelemetryParams\n    },\n  ): Promise<void> {\n    this.cancelInstant()\n    const startedAt = performance.now()\n    const reason = options?.reason ?? this.pendingDisconnectReason\n    const failureReason = options?.failureReason ?? probeDisconnectReason(reason)\n    this.disconnectDetails ??= this.diagnosticDetails(failureReason, options?.diagnostics)\n    const { reason_code: _reason, trace_id: _trace, session_id: _session, generation_id: _generation, ...details } = this.disconnectDetails\n    options = { ...options, diagnostics: { ...options?.diagnostics, ...details } }\n    if (reason !== 'client') {\n      this.startup?.recordError({ ...options?.diagnostics, failure_reason: failureReason })\n    }\n    this.pendingDisconnectReason = reason\n    this.disconnected = true\n    this.initialRemoteFramePending = false\n    this.rtc.beginTeardown()\n\n    this.rtc.clearRemoteFirstOutputWatch()\n    this.rtc.clearLocalOutboundWatch()\n    this.clearRemoteStreamNotifyTimer()\n    this.lastNotifiedRemoteStream = null\n    const activeSessionUid = this.sessionUid\n    this.sessionUid = null\n    const teardownFailures: string[] = []\n    let firstTeardownError: unknown\n    let generationStopAttempted = false\n    let generationStopSucceeded = false\n    let publishStopAttempted = false\n    let publishStopSucceeded = false\n    let rtcLeaveSucceeded = false\n    const serverCloseAttempted = Boolean(activeSessionUid)\n    let serverCloseConfirmed = false\n    let mediaCleanupSucceeded = true\n\n    this.client.beginTeardown()\n\n    // Stop capture immediately; room messaging remains available until leave.\n    publishStopAttempted = this.rtc.snapshot.joined\n    const publishStopResult = publishStopAttempted\n      ? this.rtc.stopVideoPublishing({ preserveExternalTrack: !this.ownsMedia })\n        .then(() => ({ ok: true as const }), error => ({ ok: false as const, error }))\n      : Promise.resolve({ ok: true as const })\n\n    // Send Stop while still joined, then tear down room / HTTP session.\n    const generationActive = !!this.taskUid && this.rtc.snapshot.joined\n    try {\n      if (generationActive) {\n        generationStopAttempted = true\n        await this.stopInternal({\n          suppressStateChange: true,\n          trigger: 'session_disconnect',\n        })\n        generationStopSucceeded = true\n      } else {\n        this.updateDragController(false)\n        this.rtc.clearRemoteVideo()\n        if (this.remoteVideoContainer) {\n          this.rtc.setRemoteVideoContainer(null)\n        }\n        this.taskUid = null\n      }\n    } catch (error) {\n      generationStopSucceeded = false\n      teardownFailures.push('generation_stop')\n      firstTeardownError ??= error\n    }\n\n    try {\n      const result = await publishStopResult\n      if (!result.ok) throw result.error\n      publishStopSucceeded = publishStopAttempted\n    } catch (error) {\n      publishStopSucceeded = false\n      teardownFailures.push('local_publish_stop')\n      firstTeardownError ??= error\n      this.startup?.recordError({\n        failure_reason: 'local_stream_stop_failed',\n        failure_stage: 'local_publish_stop',\n        ...diagnosticError(error),\n      })\n    }\n    try {\n      await this.rtc.leave({ preserveExternalTrack: !this.ownsMedia })\n      rtcLeaveSucceeded = true\n    } catch (error) {\n      rtcLeaveSucceeded = false\n      teardownFailures.push('rtc_leave')\n      firstTeardownError ??= error\n      this.startup?.recordError({\n        failure_reason: 'rtc_leave_failed',\n        failure_stage: 'rtc_leave',\n        ...diagnosticError(error),\n      })\n    }\n\n    if (activeSessionUid) {\n      try {\n        serverCloseConfirmed = (await this.client.closeSession(activeSessionUid)) !== null\n        if (!serverCloseConfirmed) {\n          teardownFailures.push('server_close')\n          this.startup?.recordError({\n            failure_reason: 'session_close_failed',\n            failure_stage: 'server_close',\n            failure_type: 'invalid_response',\n          })\n        }\n      } catch (error) {\n        serverCloseConfirmed = false\n        teardownFailures.push('server_close')\n        firstTeardownError ??= error\n        this.startup?.recordError({\n          failure_reason: 'session_close_failed',\n          failure_stage: 'server_close',\n          ...diagnosticError(error),\n        })\n      }\n    }\n\n    try {\n      this.client.endTeardown()\n    } catch (error) {\n      teardownFailures.push('client_teardown_end')\n      firstTeardownError ??= error\n      this.startup?.recordError({\n        failure_reason: 'session_close_failed',\n        failure_stage: 'client_teardown_end',\n        ...diagnosticError(error),\n      })\n    }\n\n    this.taskUid = null\n    try {\n      this.dragController?.destroy()\n    } catch (error) {\n      teardownFailures.push('drag_cleanup')\n      firstTeardownError ??= error\n      this.startup?.recordError({\n        failure_reason: 'media_cleanup_failed',\n        failure_stage: 'drag_cleanup',\n        ...diagnosticError(error),\n      })\n    }\n    this.dragController = null\n    this.renderCleanup.splice(0).forEach((cleanup) => {\n      try {\n        cleanup()\n      } catch (error) {\n        teardownFailures.push('render_cleanup')\n        firstTeardownError ??= error\n        this.startup?.recordError({\n          failure_reason: 'media_cleanup_failed',\n          failure_stage: 'render_cleanup',\n          ...diagnosticError(error),\n        })\n      }\n    })\n    if (!this.mediaCleaned) {\n      this.mediaCleaned = true\n      try {\n        this.cleanupMedia?.()\n      } catch (error) {\n        mediaCleanupSucceeded = false\n        teardownFailures.push('media_cleanup')\n        firstTeardownError ??= error\n        this.startup?.recordError({\n          failure_reason: 'media_cleanup_failed',\n          failure_stage: 'media_cleanup',\n          ...diagnosticError(error),\n        })\n      }\n    }\n\n    if (this.hiddenRemoteElement) {\n      try {\n        this.hiddenRemoteElement.remove()\n      } catch (error) {\n        teardownFailures.push('remote_element_cleanup')\n        firstTeardownError ??= error\n        this.startup?.recordError({\n          failure_reason: 'media_cleanup_failed',\n          failure_stage: 'remote_element_cleanup',\n          ...diagnosticError(error),\n        })\n      }\n      this.hiddenRemoteElement = null\n    }\n\n    this.runningContext = null\n    this.startup?.clearGeneration()\n    this.setState('disconnected')\n    this.disconnectDetails = createErrorDetails({ ...this.disconnectDetails,\n      teardown_failure_stages: teardownFailures.length ? teardownFailures.join(',') : undefined })\n    this.emitDisconnect(reason)\n    this.startup?.finish(reason === 'client' && failureReason !== 'session_error' ? 'cancelled' : 'error', {\n      ...options?.diagnostics,\n      failure_reason: failureReason,\n      close_mode: 'awaited',\n      generation_stop_attempted: generationStopAttempted,\n      generation_stop_succeeded: generationStopSucceeded,\n      local_publish_stop_attempted: publishStopAttempted,\n      local_publish_stop_succeeded: publishStopSucceeded,\n      rtc_leave_attempted: true,\n      rtc_leave_succeeded: rtcLeaveSucceeded,\n      server_close_attempted: serverCloseAttempted,\n      server_close_confirmed: serverCloseConfirmed,\n      media_cleanup_succeeded: mediaCleanupSucceeded,\n      teardown_failure_stages: teardownFailures.length ? teardownFailures.join(',') : undefined,\n      duration_ms: Math.round(performance.now() - startedAt),\n      ...(firstTeardownError ? { teardown_error_code: diagnosticError(firstTeardownError).error_code, teardown_failure_type: diagnosticError(firstTeardownError).failure_type } : {}),\n    })\n  }\n}\n\nexport function disconnectRealtimeSessionInternal(\n  session: RealtimeSession,\n  reason: InternalRealtimeDisconnectReason,\n): Promise<void> {\n  if (!(session instanceof RealtimeSessionImpl)) {\n    throw new XmaxSdkError('INVALID_INPUT', 'Expected an SDK RealtimeSession')\n  }\n  return session.disconnect(reason)\n}\n\nexport function startRealtimeSessionInternal(\n  session: RealtimeSession,\n  options: InternalRealtimeStartOptions,\n): Promise<void> {\n  if (!(session instanceof RealtimeSessionImpl)) {\n    throw new XmaxSdkError('INVALID_INPUT', 'Expected an SDK RealtimeSession')\n  }\n  return session.startWithInternalOptions(undefined, options)\n}\n","export function clamp(n: number, min: number, max: number) {\n  return Math.min(Math.max(n, min), max)\n}\n\nexport type ContentRect = {\n  left: number\n  top: number\n  width: number\n  height: number\n}\n\nexport type MapViewportOptions = {\n  fitMode?: 'contain' | 'cover'\n  /** Flip X when the output video is horizontally mirrored in CSS. */\n  mirrored?: boolean\n}\n\ntype MappingContext = {\n  content: ContentRect\n  /** Pointer hit-test bounds — inset media uses video rect; fill layout uses container. */\n  hitRect: ContentRect\n  source: 'media' | 'fit'\n}\n\n/** Visible video content box for contain/cover fit. */\nexport function getFitContentRect(\n  rect: Pick<DOMRect, 'left' | 'top' | 'width' | 'height'>,\n  targetSize: [number, number],\n  fitMode: 'contain' | 'cover' = 'contain',\n): ContentRect {\n  const [targetWidth, targetHeight] = targetSize\n  if (!targetWidth || !targetHeight || !rect.width || !rect.height) {\n    return {\n      left: rect.left,\n      top: rect.top,\n      width: rect.width,\n      height: rect.height,\n    }\n  }\n\n  const scale =\n    fitMode === 'cover'\n      ? Math.max(rect.width / targetWidth, rect.height / targetHeight)\n      : Math.min(rect.width / targetWidth, rect.height / targetHeight)\n  const width = targetWidth * scale\n  const height = targetHeight * scale\n\n  return {\n    left: rect.left + (rect.width - width) / 2,\n    top: rect.top + (rect.height - height) / 2,\n    width,\n    height,\n  }\n}\n\nexport function findDragMediaElement(\n  dragSurface: HTMLElement,\n): HTMLVideoElement | HTMLCanvasElement | null {\n  const root = dragSurface.parentElement ?? dragSurface\n  if (typeof root.querySelector !== 'function') {\n    return null\n  }\n  const videoHost = root.querySelector('[data-xmax-remote-video]') ?? root\n  if (typeof videoHost.querySelector !== 'function') {\n    return null\n  }\n  const media = videoHost.querySelector('video, canvas')\n  return (media as HTMLVideoElement | HTMLCanvasElement | null) ?? null\n}\n\nfunction toContentRect(rect: DOMRect): ContentRect {\n  return {\n    left: rect.left,\n    top: rect.top,\n    width: rect.width,\n    height: rect.height,\n  }\n}\n\nfunction isMediaInsetInContainer(mediaRect: DOMRect, containerRect: DOMRect): boolean {\n  if (!mediaRect.width || !mediaRect.height || !containerRect.width || !containerRect.height) {\n    return false\n  }\n  const widthRatio = mediaRect.width / containerRect.width\n  const heightRatio = mediaRect.height / containerRect.height\n  return widthRatio < 0.98 || heightRatio < 0.98\n}\n\n/**\n * Resolve drag mapping bounds.\n * - Upload / h-auto layouts: map to the actual output video element rect.\n * - Camera / cover fill: use container and cover math when video fills the host.\n */\nexport function resolveMappingContext(\n  dragSurface: HTMLElement,\n  targetSize: [number, number],\n  fitMode: 'contain' | 'cover' = 'cover',\n): MappingContext {\n  const containerRect = dragSurface.getBoundingClientRect()\n  const media = findDragMediaElement(dragSurface)\n  if (media) {\n    const mediaRect = media.getBoundingClientRect()\n    if (mediaRect.width > 0 && mediaRect.height > 0 && isMediaInsetInContainer(mediaRect, containerRect)) {\n      const content = toContentRect(mediaRect)\n      return { content, hitRect: content, source: 'media' }\n    }\n  }\n\n  const content = getFitContentRect(containerRect, targetSize, fitMode)\n  return {\n    content,\n    hitRect: toContentRect(containerRect),\n    source: 'fit',\n  }\n}\n\nexport function mapViewportPointToCoordinateSpace(\n  e: Pick<PointerEvent, 'clientX' | 'clientY'>,\n  container: HTMLElement,\n  targetSize: [number, number],\n  options: MapViewportOptions = {},\n): [number, number] | null {\n  const fitMode = options.fitMode ?? 'cover'\n  const mirrored = options.mirrored ?? false\n  const [targetWidth, targetHeight] = targetSize\n\n  if (!targetWidth || !targetHeight) {\n    return null\n  }\n\n  const { content, hitRect } = resolveMappingContext(container, targetSize, fitMode)\n  if (!content.width || !content.height) {\n    return null\n  }\n\n  if (\n    e.clientX < hitRect.left\n    || e.clientY < hitRect.top\n    || e.clientX > hitRect.left + hitRect.width\n    || e.clientY > hitRect.top + hitRect.height\n  ) {\n    return null\n  }\n\n  const x = Math.round(((e.clientX - content.left) * targetWidth) / content.width)\n  const y = Math.round(((e.clientY - content.top) * targetHeight) / content.height)\n  const normalizedX = mirrored ? targetWidth - 1 - x : x\n\n  return [\n    clamp(normalizedX, 0, targetWidth - 1),\n    clamp(y, 0, targetHeight - 1),\n  ]\n}\n\n/** Inverse of mapViewportPointToCoordinateSpace — target coords to canvas pixels (CSS space × dpr). */\nexport function mapTargetPointToCanvas(\n  point: [number, number],\n  container: HTMLElement,\n  targetSize: [number, number],\n  dpr: number,\n  options: MapViewportOptions = {},\n): [number, number] | null {\n  const fitMode = options.fitMode ?? 'cover'\n  const mirrored = options.mirrored ?? false\n  const containerRect = container.getBoundingClientRect()\n  const [targetWidth, targetHeight] = targetSize\n  const { content } = resolveMappingContext(container, targetSize, fitMode)\n\n  if (!targetWidth || !targetHeight || !content.width || !content.height) {\n    return null\n  }\n\n  const displayX = mirrored ? targetWidth - 1 - point[0] : point[0]\n  const originX = (content.left - containerRect.left) * dpr\n  const originY = (content.top - containerRect.top) * dpr\n  const contentW = content.width * dpr\n  const contentH = content.height * dpr\n\n  return [\n    originX + (displayX / targetWidth) * contentW,\n    originY + (point[1] / targetHeight) * contentH,\n  ]\n}\n","import {\n  mapTargetPointToCanvas,\n  mapViewportPointToCoordinateSpace,\n} from './map-viewport'\n\ntype TargetPoint = [number, number]\ntype Segment = { a: TargetPoint; b: TargetPoint }\ntype ActivePointer = {\n  pointerId: number\n  clientX: number\n  clientY: number\n  startTime: number\n}\n\nconst TRAIL_FADE_ALPHA = 0.05\nconst TRAIL_IDLE_FADE_FRAMES = 64\nconst TRAIL_COLOR = { r: 0, g: 255, b: 100 }\nconst TRAIL_CORE_COLOR = { r: 255, g: 255, b: 255 }\n\nconst TRAIL_VISUAL = {\n  outerWidth: 18,\n  outerBlur: 12,\n  outerAlpha: 0.35,\n  middleWidth: 10,\n  middleBlur: 6,\n  middleAlpha: 0.75,\n  coreWidth: 3,\n  headRadius: 5,\n  headGlowRadius: 14,\n  headGlowAlpha: 0.9,\n  ringCount: 2,\n  ringStartRadius: 10,\n  ringSpacing: 14,\n  ringLineWidth: 2,\n  ringPulseSpeed: 1.2,\n  ringMaxAlpha: 0.6,\n  particleCount: 4,\n  particleRadius: 3,\n  particleOrbitRadius: 22,\n  particleSpeed: 0.06,\n  particleAlpha: 0.6,\n} as const\n\nexport type DragTrackControllerOptions = {\n  targetSize: [number, number]\n  fitMode?: 'contain' | 'cover'\n  mirrored?: boolean\n  enabled?: boolean\n  onTracks: (tracks: Array<[number, number]>) => void | Promise<void>\n  /** Fired once when a real drag stroke begins (first pointer down). */\n  onStrokeStart?: () => void | Promise<void>\n  /** Fired once when a real drag stroke ends (pointer up/cancel), not on disable/destroy. */\n  onStrokeEnd?: () => void | Promise<void>\n}\n\nfunction trailRgba(alpha: number): string {\n  return `rgba(${TRAIL_COLOR.r},${TRAIL_COLOR.g},${TRAIL_COLOR.b},${alpha})`\n}\n\nfunction coreRgba(alpha: number): string {\n  return `rgba(${TRAIL_CORE_COLOR.r},${TRAIL_CORE_COLOR.g},${TRAIL_CORE_COLOR.b},${alpha})`\n}\n\nfunction fadeTrailCanvas(ctx: CanvasRenderingContext2D) {\n  ctx.save()\n  ctx.globalCompositeOperation = 'destination-out'\n  ctx.fillStyle = `rgba(0,0,0,${TRAIL_FADE_ALPHA})`\n  ctx.fillRect(0, 0, ctx.canvas.width, ctx.canvas.height)\n  ctx.restore()\n}\n\nfunction drawTrailSegments(\n  ctx: CanvasRenderingContext2D,\n  segs: Segment[],\n  container: HTMLElement,\n  targetSize: [number, number],\n  dpr: number,\n  fitMode: 'contain' | 'cover',\n  mirrored: boolean,\n  fastMode: boolean,\n) {\n  if (segs.length === 0) {\n    return\n  }\n\n  const strokeSegs = (opts: {\n    width: number\n    shadowBlur: number\n    alpha: number\n    color: 'trail' | 'core'\n  }) => {\n    ctx.save()\n    ctx.globalCompositeOperation = 'lighter'\n    ctx.lineCap = 'round'\n    ctx.lineJoin = 'round'\n    ctx.lineWidth = opts.width * dpr\n    ctx.strokeStyle = opts.color === 'core'\n      ? coreRgba(opts.alpha)\n      : trailRgba(opts.alpha)\n    ctx.shadowBlur = fastMode ? 0 : opts.shadowBlur * dpr\n    ctx.shadowColor = fastMode || opts.color === 'core'\n      ? 'transparent'\n      : trailRgba(opts.alpha)\n    ctx.beginPath()\n    for (const seg of segs) {\n      const start = mapTargetPointToCanvas(seg.a, container, targetSize, dpr, { fitMode, mirrored })\n      const end = mapTargetPointToCanvas(seg.b, container, targetSize, dpr, { fitMode, mirrored })\n      if (!start || !end) {\n        continue\n      }\n      ctx.moveTo(start[0], start[1])\n      ctx.lineTo(end[0], end[1])\n    }\n    ctx.stroke()\n    ctx.restore()\n  }\n\n  strokeSegs({\n    width: TRAIL_VISUAL.outerWidth,\n    shadowBlur: TRAIL_VISUAL.outerBlur,\n    alpha: TRAIL_VISUAL.outerAlpha,\n    color: 'trail',\n  })\n  strokeSegs({\n    width: TRAIL_VISUAL.middleWidth,\n    shadowBlur: TRAIL_VISUAL.middleBlur,\n    alpha: TRAIL_VISUAL.middleAlpha,\n    color: 'trail',\n  })\n  strokeSegs({\n    width: TRAIL_VISUAL.coreWidth,\n    shadowBlur: 0,\n    alpha: 1,\n    color: 'core',\n  })\n}\n\nfunction drawHeadGlow(\n  ctx: CanvasRenderingContext2D,\n  x: number,\n  y: number,\n  dpr: number,\n) {\n  const glowRadius = TRAIL_VISUAL.headGlowRadius * dpr\n  const headRadius = TRAIL_VISUAL.headRadius * dpr\n  const gradient = ctx.createRadialGradient(x, y, 0, x, y, glowRadius)\n  gradient.addColorStop(0, trailRgba(TRAIL_VISUAL.headGlowAlpha))\n  gradient.addColorStop(0.4, trailRgba(TRAIL_VISUAL.headGlowAlpha * 0.6))\n  gradient.addColorStop(1, trailRgba(0))\n  ctx.fillStyle = gradient\n  ctx.beginPath()\n  ctx.arc(x, y, glowRadius, 0, Math.PI * 2)\n  ctx.fill()\n\n  ctx.fillStyle = coreRgba(1)\n  ctx.beginPath()\n  ctx.arc(x, y, headRadius, 0, Math.PI * 2)\n  ctx.fill()\n}\n\nfunction drawPulsingRings(\n  ctx: CanvasRenderingContext2D,\n  x: number,\n  y: number,\n  dpr: number,\n  startTime: number,\n  now: number,\n) {\n  const elapsed = (now - startTime) / 1000\n  ctx.lineWidth = TRAIL_VISUAL.ringLineWidth * dpr\n\n  for (let index = 0; index < TRAIL_VISUAL.ringCount; index += 1) {\n    const baseRadius = (\n      TRAIL_VISUAL.ringStartRadius\n      + index * TRAIL_VISUAL.ringSpacing\n    ) * dpr\n    const pulseOffset = elapsed * TRAIL_VISUAL.ringPulseSpeed + index * 0.5\n    const pulse = (Math.sin(pulseOffset * Math.PI * 2) + 1) / 2\n    const radius = baseRadius + pulse * 6 * dpr\n    const alpha = TRAIL_VISUAL.ringMaxAlpha\n      * (1 - index * 0.2)\n      * (0.5 + pulse * 0.5)\n\n    ctx.strokeStyle = trailRgba(alpha)\n    ctx.beginPath()\n    ctx.arc(x, y, radius, 0, Math.PI * 2)\n    ctx.stroke()\n  }\n}\n\nfunction drawOrbitParticles(\n  ctx: CanvasRenderingContext2D,\n  x: number,\n  y: number,\n  dpr: number,\n  startTime: number,\n  now: number,\n) {\n  const elapsed = (now - startTime) / 1000\n  const particleRadius = TRAIL_VISUAL.particleRadius * dpr\n\n  for (let index = 0; index < TRAIL_VISUAL.particleCount; index += 1) {\n    const baseAngle = (index / TRAIL_VISUAL.particleCount) * Math.PI * 2\n    const direction = index % 2 === 0 ? 1 : -1\n    const angle = baseAngle + elapsed * TRAIL_VISUAL.particleSpeed * direction\n    const orbitRadius = TRAIL_VISUAL.particleOrbitRadius * dpr\n    const particleX = x + Math.cos(angle) * orbitRadius\n    const particleY = y + Math.sin(angle) * orbitRadius\n    const alpha = TRAIL_VISUAL.particleAlpha\n      * (0.6 + Math.sin(elapsed * 3 + index) * 0.4)\n    const gradient = ctx.createRadialGradient(\n      particleX,\n      particleY,\n      0,\n      particleX,\n      particleY,\n      particleRadius * 2,\n    )\n    gradient.addColorStop(0, trailRgba(alpha))\n    gradient.addColorStop(1, trailRgba(0))\n    ctx.fillStyle = gradient\n    ctx.beginPath()\n    ctx.arc(particleX, particleY, particleRadius * 2, 0, Math.PI * 2)\n    ctx.fill()\n  }\n}\n\nfunction clearCanvas(ctx: CanvasRenderingContext2D | null): void {\n  if (!ctx) {\n    return\n  }\n  ctx.save()\n  ctx.setTransform(1, 0, 0, 1, 0, 0)\n  ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height)\n  ctx.restore()\n}\n\nexport class DragTrackController {\n  private readonly container: HTMLElement\n  private readonly trailCanvas: HTMLCanvasElement\n  private readonly fxCanvas: HTMLCanvasElement\n  private readonly onTracks: DragTrackControllerOptions['onTracks']\n  private readonly onStrokeStart: DragTrackControllerOptions['onStrokeStart']\n  private readonly onStrokeEnd: DragTrackControllerOptions['onStrokeEnd']\n  private strokeActive = false\n  private hasTrailPixels = false\n  private idleFadeFrames = 0\n  private targetSize: [number, number]\n  private fitMode: 'contain' | 'cover'\n  private mirrored: boolean\n  private enabled: boolean\n  private readonly activePointers = new Map<number, ActivePointer>()\n  private readonly lastTargetPoints = new Map<number, TargetPoint>()\n  private readonly segQueue: Segment[] = []\n  private sampleTimer: number | null = null\n  private sampleInFlight = false\n  private rafId: number | null = null\n  private resizeObserver: ResizeObserver | null = null\n  private readonly onWindowResize: () => void\n  private readonly onPointerDown: (e: PointerEvent) => void\n  private readonly onPointerMove: (e: PointerEvent) => void\n  private readonly onPointerUp: (e: PointerEvent) => void\n  private readonly onPointerCancel: (e: PointerEvent) => void\n\n  constructor(container: HTMLElement, options: DragTrackControllerOptions) {\n    this.container = container\n    this.onTracks = options.onTracks\n    this.onStrokeStart = options.onStrokeStart\n    this.onStrokeEnd = options.onStrokeEnd\n    this.targetSize = options.targetSize\n    this.fitMode = options.fitMode ?? 'cover'\n    this.mirrored = options.mirrored ?? false\n    this.enabled = options.enabled ?? true\n\n    this.trailCanvas = document.createElement('canvas')\n    this.trailCanvas.className = 'Xmax-drag-track-canvas'\n    this.trailCanvas.style.cssText =\n      'position:absolute;inset:0;z-index:21;width:100%;height:100%;pointer-events:none;'\n    container.appendChild(this.trailCanvas)\n\n    this.fxCanvas = document.createElement('canvas')\n    this.fxCanvas.className = 'Xmax-drag-track-fx-canvas'\n    this.fxCanvas.style.cssText =\n      'position:absolute;inset:0;z-index:22;width:100%;height:100%;pointer-events:none;'\n    container.appendChild(this.fxCanvas)\n\n    this.onWindowResize = () => this.resizeCanvas()\n    this.onPointerDown = (e) => this.handlePointerDown(e)\n    this.onPointerMove = (e) => this.handlePointerMove(e)\n    this.onPointerUp = (e) => this.handlePointerUp(e)\n    this.onPointerCancel = (e) => this.handlePointerCancel(e)\n\n    this.resizeCanvas()\n    this.bindResizeObserver()\n    this.bindPointerEvents()\n    this.applyInteractionStyle()\n  }\n\n  setEnabled(enabled: boolean): void {\n    this.enabled = enabled\n    this.applyInteractionStyle()\n    if (!enabled) {\n      this.finishStroke()\n    }\n  }\n\n  setTargetSize(targetSize: [number, number]): void {\n    this.targetSize = targetSize\n  }\n\n  setFitMode(fitMode: 'contain' | 'cover'): void {\n    this.fitMode = fitMode\n  }\n\n  setMirrored(mirrored: boolean): void {\n    this.mirrored = mirrored\n  }\n\n  destroy(): void {\n    this.finishStroke()\n    this.unbindPointerEvents()\n    this.unbindResizeObserver()\n    this.trailCanvas.remove()\n    this.fxCanvas.remove()\n  }\n\n  private applyInteractionStyle(): void {\n    this.container.style.pointerEvents = this.enabled ? 'auto' : 'none'\n    this.container.style.touchAction = this.enabled ? 'none' : 'auto'\n  }\n\n  private bindResizeObserver(): void {\n    const ResizeObserverCtor = globalThis.ResizeObserver\n    if (ResizeObserverCtor) {\n      this.resizeObserver = new ResizeObserverCtor(() => this.resizeCanvas())\n      this.resizeObserver.observe(this.container)\n      return\n    }\n    window.addEventListener('resize', this.onWindowResize)\n  }\n\n  private unbindResizeObserver(): void {\n    this.resizeObserver?.disconnect()\n    this.resizeObserver = null\n    window.removeEventListener('resize', this.onWindowResize)\n  }\n\n  private bindPointerEvents(): void {\n    this.container.addEventListener('pointerdown', this.onPointerDown)\n    this.container.addEventListener('pointermove', this.onPointerMove)\n    this.container.addEventListener('pointerup', this.onPointerUp)\n    this.container.addEventListener('pointercancel', this.onPointerCancel)\n  }\n\n  private unbindPointerEvents(): void {\n    this.container.removeEventListener('pointerdown', this.onPointerDown)\n    this.container.removeEventListener('pointermove', this.onPointerMove)\n    this.container.removeEventListener('pointerup', this.onPointerUp)\n    this.container.removeEventListener('pointercancel', this.onPointerCancel)\n    this.activePointers.clear()\n    this.lastTargetPoints.clear()\n    this.sampleInFlight = false\n  }\n\n  private clearVisuals(): void {\n    clearCanvas(this.trailCanvas.getContext('2d'))\n    clearCanvas(this.fxCanvas.getContext('2d'))\n    this.hasTrailPixels = false\n    this.idleFadeFrames = 0\n  }\n\n  private resizeCanvas(): void {\n    const rect = this.container.getBoundingClientRect()\n    const dpr = window.devicePixelRatio || 1\n    const cssW = Math.max(1, Math.round(rect.width))\n    const cssH = Math.max(1, Math.round(rect.height))\n    const nextW = Math.max(1, Math.round(cssW * dpr))\n    const nextH = Math.max(1, Math.round(cssH * dpr))\n\n    let resized = false\n    for (const canvas of [this.trailCanvas, this.fxCanvas]) {\n      if (canvas.width !== nextW || canvas.height !== nextH) {\n        canvas.width = nextW\n        canvas.height = nextH\n        canvas.style.width = `${cssW}px`\n        canvas.style.height = `${cssH}px`\n        resized = true\n      }\n    }\n    if (resized) {\n      this.clearVisuals()\n    }\n  }\n\n  private toTargetPoint(e: Pick<PointerEvent, 'clientX' | 'clientY'>): TargetPoint | null {\n    return mapViewportPointToCoordinateSpace(e, this.container, this.targetSize, {\n      fitMode: this.fitMode,\n      mirrored: this.mirrored,\n    })\n  }\n\n  private stopDrawLoop(): void {\n    if (this.rafId !== null) {\n      window.cancelAnimationFrame(this.rafId)\n      this.rafId = null\n    }\n  }\n\n  private renderPointerFx(ctx: CanvasRenderingContext2D, dpr: number): void {\n    clearCanvas(ctx)\n    if (this.activePointers.size === 0) {\n      return\n    }\n\n    const now = performance.now()\n    const isMultiTouch = this.activePointers.size > 1\n    ctx.save()\n    ctx.globalCompositeOperation = 'lighter'\n    for (const pointer of Array.from(this.activePointers.values())) {\n      const targetPoint = this.lastTargetPoints.get(pointer.pointerId)\n        ?? this.toTargetPoint(pointer)\n      if (!targetPoint) {\n        continue\n      }\n      const canvasPoint = mapTargetPointToCanvas(\n        targetPoint,\n        this.container,\n        this.targetSize,\n        dpr,\n        { fitMode: this.fitMode, mirrored: this.mirrored },\n      )\n      if (!canvasPoint) {\n        continue\n      }\n\n      if (!isMultiTouch) {\n        drawPulsingRings(\n          ctx,\n          canvasPoint[0],\n          canvasPoint[1],\n          dpr,\n          pointer.startTime,\n          now,\n        )\n        drawOrbitParticles(\n          ctx,\n          canvasPoint[0],\n          canvasPoint[1],\n          dpr,\n          pointer.startTime,\n          now,\n        )\n      }\n      drawHeadGlow(ctx, canvasPoint[0], canvasPoint[1], dpr)\n    }\n    ctx.restore()\n  }\n\n  private startDrawLoop(): void {\n    if (this.rafId !== null) {\n      return\n    }\n\n    const tick = () => {\n      const trailContext = this.trailCanvas.getContext('2d')\n      const fxContext = this.fxCanvas.getContext('2d')\n      if (!trailContext || !fxContext) {\n        this.rafId = null\n        return\n      }\n\n      const dpr = window.devicePixelRatio || 1\n      if (this.hasTrailPixels) {\n        fadeTrailCanvas(trailContext)\n      }\n\n      const segments = this.segQueue.splice(0)\n      if (segments.length > 0) {\n        drawTrailSegments(\n          trailContext,\n          segments,\n          this.container,\n          this.targetSize,\n          dpr,\n          this.fitMode,\n          this.mirrored,\n          this.activePointers.size > 1,\n        )\n        this.hasTrailPixels = true\n        this.idleFadeFrames = 0\n      }\n\n      this.renderPointerFx(fxContext, dpr)\n\n      if (this.activePointers.size > 0) {\n        this.idleFadeFrames = 0\n      } else if (this.hasTrailPixels) {\n        this.idleFadeFrames += 1\n        if (this.idleFadeFrames > TRAIL_IDLE_FADE_FRAMES) {\n          clearCanvas(trailContext)\n          this.hasTrailPixels = false\n          this.idleFadeFrames = 0\n        }\n      }\n\n      if (\n        this.activePointers.size > 0\n        || this.segQueue.length > 0\n        || this.hasTrailPixels\n      ) {\n        this.rafId = window.requestAnimationFrame(tick)\n      } else {\n        this.rafId = null\n      }\n    }\n\n    this.rafId = window.requestAnimationFrame(tick)\n  }\n\n  private stopSampling(): void {\n    if (this.sampleTimer !== null) {\n      window.clearInterval(this.sampleTimer)\n      this.sampleTimer = null\n    }\n  }\n\n  private collectCurrentTracks(): Array<[number, number]> {\n    const tracks: Array<[number, number]> = []\n    for (const pointer of Array.from(this.activePointers.values())) {\n      const point = this.toTargetPoint(pointer)\n      if (point) {\n        tracks.push(point)\n      }\n    }\n    return tracks\n  }\n\n  private flushTracks(): void {\n    if (this.sampleInFlight) {\n      return\n    }\n\n    const tracks = this.collectCurrentTracks()\n    if (!tracks.length) {\n      return\n    }\n\n    this.sampleInFlight = true\n    Promise.resolve(this.onTracks(tracks))\n      .catch(() => {})\n      .finally(() => {\n        this.sampleInFlight = false\n      })\n  }\n\n  private startSampling(): void {\n    if (this.sampleTimer !== null) {\n      return\n    }\n    this.flushTracks()\n    this.sampleTimer = window.setInterval(() => {\n      this.flushTracks()\n    }, 30)\n  }\n\n  private finishStroke(emitEnd = false, preserveTrail = false): void {\n    const wasActive = this.strokeActive\n    this.strokeActive = false\n    this.stopSampling()\n    clearCanvas(this.fxCanvas.getContext('2d'))\n\n    if (preserveTrail) {\n      if (this.segQueue.length > 0 || this.hasTrailPixels) {\n        this.startDrawLoop()\n      } else {\n        this.stopDrawLoop()\n      }\n    } else {\n      this.stopDrawLoop()\n      this.segQueue.length = 0\n      this.activePointers.clear()\n      this.lastTargetPoints.clear()\n      this.clearVisuals()\n    }\n\n    if (emitEnd && wasActive && this.onStrokeEnd) {\n      Promise.resolve(this.onStrokeEnd()).catch(() => {})\n    }\n  }\n\n  private handlePointerDown(e: PointerEvent): void {\n    if (!this.enabled) {\n      return\n    }\n    try {\n      this.container.setPointerCapture(e.pointerId)\n    } catch {\n    }\n    this.resizeCanvas()\n    if (this.activePointers.size === 0) {\n      this.idleFadeFrames = 0\n    }\n    this.activePointers.set(e.pointerId, {\n      pointerId: e.pointerId,\n      clientX: e.clientX,\n      clientY: e.clientY,\n      startTime: performance.now(),\n    })\n    const targetPoint = this.toTargetPoint(e)\n    if (targetPoint) {\n      this.lastTargetPoints.set(e.pointerId, targetPoint)\n    }\n    const strokeWasActive = this.strokeActive\n    this.strokeActive = true\n    if (!strokeWasActive && this.onStrokeStart) {\n      Promise.resolve(this.onStrokeStart()).catch(() => {})\n    }\n    this.startDrawLoop()\n    this.startSampling()\n  }\n\n  private handlePointerMove(e: PointerEvent): void {\n    if (!this.enabled || !this.activePointers.has(e.pointerId)) {\n      return\n    }\n    const activePointer = this.activePointers.get(e.pointerId)\n    const nextTargetPoint = this.toTargetPoint(e)\n    const last = this.lastTargetPoints.get(e.pointerId)\n    if (last && nextTargetPoint) {\n      this.segQueue.push({ a: last, b: nextTargetPoint })\n    }\n    if (nextTargetPoint) {\n      this.lastTargetPoints.set(e.pointerId, nextTargetPoint)\n    }\n    this.activePointers.set(e.pointerId, {\n      pointerId: e.pointerId,\n      clientX: e.clientX,\n      clientY: e.clientY,\n      startTime: activePointer?.startTime ?? performance.now(),\n    })\n  }\n\n  private handlePointerUp(e: PointerEvent): void {\n    if (!this.activePointers.has(e.pointerId)) {\n      return\n    }\n    this.activePointers.delete(e.pointerId)\n    this.lastTargetPoints.delete(e.pointerId)\n    try {\n      this.container.releasePointerCapture(e.pointerId)\n    } catch {\n    }\n    if (this.activePointers.size === 0) {\n      this.finishStroke(true, true)\n    }\n  }\n\n  private handlePointerCancel(e: PointerEvent): void {\n    if (!this.activePointers.has(e.pointerId)) {\n      return\n    }\n    this.activePointers.delete(e.pointerId)\n    this.lastTargetPoints.delete(e.pointerId)\n    if (this.activePointers.size === 0) {\n      this.finishStroke(true, true)\n    }\n  }\n}\n\nexport function createDragTrackController(\n  container: HTMLElement,\n  options: DragTrackControllerOptions,\n): DragTrackController {\n  return new DragTrackController(container, options)\n}\n","export type RemoteViewHost = {\n  wrapper: HTMLElement\n  videoHost: HTMLElement\n  dragHost: HTMLElement\n}\n\nexport function createRemoteViewHost(wrapper: HTMLElement): RemoteViewHost {\n  const computed = getComputedStyle(wrapper)\n  if (computed.position === 'static') {\n    wrapper.style.position = 'relative'\n  }\n\n  const videoHost = document.createElement('div')\n  videoHost.setAttribute('data-xmax-remote-video', 'true')\n  videoHost.style.cssText =\n    'position:relative;z-index:0;width:100%;height:100%;overflow:hidden;display:flex;align-items:center;justify-content:center;'\n\n  const dragHost = document.createElement('div')\n  dragHost.setAttribute('data-xmax-drag-surface', 'true')\n  dragHost.style.cssText =\n    'position:absolute;inset:0;z-index:20;pointer-events:none;touch-action:auto;'\n\n  wrapper.replaceChildren()\n  wrapper.appendChild(videoHost)\n  wrapper.appendChild(dragHost)\n\n  return { wrapper, videoHost, dragHost }\n}\n","import { isMobilePublishEnvironment } from '../rtc/media/publish-fps'\nimport { DEFAULT_CAMERA_REALTIME_SETTINGS } from './default'\nimport { validateRealtimeStreamSetting } from './utils'\nimport type {\n  RealtimeConnectCameraOptions,\n  RealtimeMediaSetting,\n} from './types'\n\n/**\n * @brief 获取当前环境使用的摄像头默认媒体设置。\n * @param mobile 是否使用移动端默认值；省略时由 SDK 根据当前视口自动判断。\n * @returns 一份可独立修改的完整媒体设置。\n */\nexport function resolveDefaultCameraRealtimeSetting(\n  mobile = isMobilePublishEnvironment(),\n): RealtimeMediaSetting {\n  return {\n    ...(mobile\n      ? DEFAULT_CAMERA_REALTIME_SETTINGS.mobile\n      : DEFAULT_CAMERA_REALTIME_SETTINGS.desktop),\n  }\n}\n\n/**\n * @brief 将面向调用方的摄像头发送尺寸转换为火山 RTC 编码尺寸。\n * 火山 RTC 在移动端竖持状态下会将设置的宽高反转后发流，因此 SDK\n * 在移动端预先交换一次，确保实际发送尺寸与调用方配置保持一致。\n * @param setting 调用方期望的实际发送规格。\n * @param mobile 是否为移动端竖持场景。\n * @returns 传给火山 RTC `setVideoEncoderConfig` 的宽高。\n * @internal\n */\nexport function resolveCameraRtcEncoderSize(\n  setting: Pick<RealtimeMediaSetting, 'width' | 'height'>,\n  mobile = isMobilePublishEnvironment(),\n): [number, number] {\n  return mobile\n    ? [setting.height, setting.width]\n    : [setting.width, setting.height]\n}\n\n/**\n * @brief 使用回退值补齐部分媒体设置。\n * @param setting 调用方传入的可选媒体字段。\n * @param fallback 缺失字段使用的完整回退设置。\n * @returns 补齐后的完整媒体设置。\n */\nfunction fillRealtimeMediaSetting(\n  setting: Partial<RealtimeMediaSetting> | undefined,\n  fallback: RealtimeMediaSetting,\n): RealtimeMediaSetting {\n  return {\n    width: setting?.width ?? fallback.width,\n    height: setting?.height ?? fallback.height,\n    fps: setting?.fps ?? fallback.fps,\n    maxKbps: setting?.maxKbps ?? fallback.maxKbps,\n    contentHint: setting?.contentHint ?? fallback.contentHint,\n  }\n}\n\n/**\n * @brief 将摄像头连接的可选编码参数归一化。\n * @param options connectCamera 中的 stream 配置。\n * @param mobile 是否使用移动端默认值；省略时由 SDK 根据当前视口自动判断。\n * @returns 补齐后的完整 RTC 编码设置。\n * @internal\n */\nexport function resolveCameraRealtimeStreamSetting(\n  options: Pick<RealtimeConnectCameraOptions, 'stream'>,\n  mobile = isMobilePublishEnvironment(),\n): RealtimeMediaSetting {\n  validateRealtimeStreamSetting(options.stream)\n\n  const defaults = resolveDefaultCameraRealtimeSetting(mobile)\n  return fillRealtimeMediaSetting(options.stream, defaults)\n}\n","import { DEFAULT_SESSION_TARGET_SIZE, resolveUploadVideoSize } from '../rtc/media/reference-video-size'\nimport { resolveRtcPublishFps } from '../rtc/media/publish-fps'\nimport {\n  DEFAULT_METADATA_TIMEOUT_MS,\n  DEFAULT_REALTIME_STREAM_CONTENT_HINT,\n  DEFAULT_REALTIME_STREAM_MAX_KBPS,\n} from './default'\nimport type { RealtimeContext, RealtimeMediaSetting } from './types'\nimport { XmaxSdkError } from '../shared/sdk-error'\n\n\n/**\n * @brief 规范化实时生成上下文。\n * 对提示词和参考图 URL 执行首尾空白清理；`prompt` 始终保留，空参考图字段会被移除。\n * @param context 需要规范化的生成上下文。\n * @returns 冻结后的上下文快照，调用方不能修改其字段。\n */\nexport function normalizeRealtimeContext(\n  context: RealtimeContext,\n): Readonly<RealtimeContext> {\n  const prompt = context.prompt.trim()\n  const refImageUrl = context.refImageUrl?.trim()\n  return Object.freeze({\n    prompt,\n    ...(refImageUrl ? { refImageUrl } : {}),\n  })\n}\n\n\n/**\n * @brief 比较两个实时生成上下文是否具有相同内容。\n * @param a 第一个生成上下文。\n * @param b 第二个生成上下文。\n * @returns `prompt` 与 `refImageUrl` 均相同时返回 `true`，否则返回 `false`。\n * @notes `refImageUrl` 缺省按空字符串处理；传入未规范化的空白字符串可能影响比较结果。\n */\nexport function isSameRealtimeContext(\n  a: RealtimeContext,\n  b: RealtimeContext,\n): boolean {\n  return a.prompt === b.prompt\n    && (a.refImageUrl ?? '') === (b.refImageUrl ?? '')\n}\n\n\n/**\n * @brief 判断输入是否为大于零的有限数字。\n * @param value 需要检查的任意输入。\n * @returns 输入为有限正数时返回 `true`，并将 TypeScript 类型收窄为 `number`。\n */\nexport function isPositiveFinite(value: unknown): value is number {\n  return typeof value === 'number' && Number.isFinite(value) && value > 0\n}\n\n\n/**\n * @brief 校验并返回一个有限正数。\n * @param value 需要校验的数字。\n * @param name 用于错误信息的字段名称。\n * @returns 校验通过后的原始数字。\n * @throws {XmaxSdkError} 当输入不是有限正数时抛出，`code` 为 `INVALID_INPUT`。\n */\nexport function requirePositive(value: number, name: string): number {\n  if (!isPositiveFinite(value)) {\n    throw new XmaxSdkError('INVALID_INPUT', `${name} must be a positive number`)\n  }\n  return value\n}\n\n\n/**\n * @brief 校验调用方传入的 RTC 编码规格。\n * @param setting 需要校验的可选媒体规格。\n * @throws {XmaxSdkError} 当宽高没有成对提供，或任一已提供字段不合法时抛出。\n */\nexport function validateRealtimeStreamSetting(\n  setting?: Partial<RealtimeMediaSetting>,\n): void {\n  if (!setting) {\n    return\n  }\n\n  const hasWidth = setting.width !== undefined\n  const hasHeight = setting.height !== undefined\n  if (hasWidth !== hasHeight) {\n    throw new XmaxSdkError(\n      'INVALID_INPUT',\n      'stream.width and stream.height must be provided together',\n    )\n  }\n  if (hasWidth && hasHeight) {\n    requirePositive(setting.width as number, 'stream.width')\n    requirePositive(setting.height as number, 'stream.height')\n  }\n  if (setting.fps !== undefined) {\n    requirePositive(setting.fps, 'stream.fps')\n  }\n  if (setting.maxKbps !== undefined) {\n    requirePositive(setting.maxKbps, 'stream.maxKbps')\n  }\n  if (\n    setting.contentHint !== undefined\n    && !['text', 'motion', 'detail'].includes(setting.contentHint)\n  ) {\n    throw new XmaxSdkError(\n      'INVALID_INPUT',\n      \"stream.contentHint must be 'text', 'motion', or 'detail'\",\n    )\n  }\n}\n\n\n/**\n * @brief 读取视频轨道实际生效的媒体规格。\n * @param track 需要读取的浏览器视频轨道。\n * @param fallback 轨道未返回有效字段时使用的可选回退值。\n * @returns 完整的媒体规格；无法取得有效宽高时对应字段返回 `0`。\n */\nexport function readTrackMediaSetting(\n  track: MediaStreamTrack,\n  fallback?: Partial<RealtimeMediaSetting>,\n): RealtimeMediaSetting {\n  const settings = track.getSettings?.()\n  const width = isPositiveFinite(settings?.width)\n    ? settings.width\n    : (isPositiveFinite(fallback?.width) ? fallback.width : 0)\n  const height = isPositiveFinite(settings?.height)\n    ? settings.height\n    : (isPositiveFinite(fallback?.height) ? fallback.height : 0)\n  const fps = isPositiveFinite(settings?.frameRate)\n    ? settings.frameRate\n    : resolveRtcPublishFps({ fps: fallback?.fps })\n\n  return { width, height, fps }\n}\n\n\nexport function applyIntrinsicVideoSize(\n  setting: RealtimeMediaSetting,\n  intrinsic: { width?: number; height?: number },\n): RealtimeMediaSetting {\n  if (\n    !isPositiveFinite(intrinsic.width)\n    || !isPositiveFinite(intrinsic.height)\n  ) {\n    return setting\n  }\n\n  return {\n    ...setting,\n    width: intrinsic.width,\n    height: intrinsic.height,\n  }\n}\n\n\n/**\n * Read the dimensions of actual frames produced by an external MediaStreamTrack.\n * Screen-share track settings may differ from the intrinsic video frame size.\n */\nexport async function readMediaStreamSourceSetting(\n  track: MediaStreamTrack,\n  options: { timeoutMs?: number } = {},\n): Promise<RealtimeMediaSetting> {\n  const fallback = readTrackMediaSetting(track)\n  if (\n    typeof document === 'undefined'\n    || typeof MediaStream === 'undefined'\n    || track.readyState === 'ended'\n  ) {\n    return fallback\n  }\n\n  const timeoutMs = Math.max(0, options.timeoutMs ?? DEFAULT_METADATA_TIMEOUT_MS)\n\n  return new Promise((resolve) => {\n    const video = document.createElement('video')\n    let settled = false\n    let timeoutHandle: number | null = null\n\n    const finish = () => {\n      if (settled) {\n        return\n      }\n      settled = true\n      const intrinsic = {\n        width: video.videoWidth,\n        height: video.videoHeight,\n      }\n      if (timeoutHandle !== null) {\n        window.clearTimeout(timeoutHandle)\n      }\n      video.removeEventListener('loadedmetadata', handleMetadata)\n      video.removeEventListener('resize', handleMetadata)\n      try {\n        video.pause()\n        video.srcObject = null\n      } catch {\n      }\n      video.remove()\n      resolve(applyIntrinsicVideoSize(fallback, intrinsic))\n    }\n\n    const handleMetadata = () => {\n      if (\n        isPositiveFinite(video.videoWidth)\n        && isPositiveFinite(video.videoHeight)\n      ) {\n        finish()\n      }\n    }\n\n    video.autoplay = true\n    video.muted = true\n    video.playsInline = true\n    video.style.cssText =\n      'position:fixed;left:-9999px;top:-9999px;width:1px;height:1px;opacity:0;pointer-events:none;'\n    video.addEventListener('loadedmetadata', handleMetadata)\n    video.addEventListener('resize', handleMetadata)\n    video.srcObject = new MediaStream([track])\n    document.body?.appendChild(video)\n\n    timeoutHandle = window.setTimeout(finish, timeoutMs)\n    void video.play().then(handleMetadata).catch(() => finish())\n    handleMetadata()\n  })\n}\n\n\n/**\n * @brief 解析提交给 RTC 和 Start 事件的完整编码规格。\n * @param options 调用方传入的可选 stream 配置。\n * @param source 媒体源的实际规格。\n * @returns 校验、尺寸适配和帧率补齐后的只读媒体规格。\n */\nexport function resolveRealtimeStreamSetting(\n  options: { stream?: Partial<RealtimeMediaSetting> },\n  source: RealtimeMediaSetting,\n): RealtimeMediaSetting {\n  validateRealtimeStreamSetting(options.stream)\n\n  let size: [number, number]\n  if (options.stream?.width !== undefined && options.stream.height !== undefined) {\n    size = [options.stream.width, options.stream.height]\n  } else if (source.width > 0 && source.height > 0) {\n    size = resolveUploadVideoSize(source.width, source.height)\n  } else {\n    size = DEFAULT_SESSION_TARGET_SIZE\n  }\n\n  const fps = resolveRtcPublishFps({\n    fps: options.stream?.fps ?? source.fps,\n  })\n\n  return Object.freeze({\n    width: size[0],\n    height: size[1],\n    fps,\n    maxKbps: options.stream?.maxKbps ?? DEFAULT_REALTIME_STREAM_MAX_KBPS,\n    contentHint: options.stream?.contentHint ?? DEFAULT_REALTIME_STREAM_CONTENT_HINT,\n  })\n}\n","/**\n * Mount an SDK-managed preview for an external MediaStream.\n *\n * External canvas-backed streams are rendered directly instead of relying on\n * the RTC engine's local player. This keeps `render.localContainer` reliable\n * on browsers where the RTC renderer cannot preview an external canvas track.\n */\nexport function mountLocalStreamPreview(\n  container: HTMLElement,\n  stream: MediaStream,\n  fit: 'cover' | 'contain',\n): () => void {\n  const video = document.createElement('video')\n  video.autoplay = true\n  video.muted = true\n  video.playsInline = true\n  video.style.display = 'block'\n  video.style.width = '100%'\n  video.style.height = '100%'\n  video.style.objectFit = fit\n  video.style.objectPosition = 'center'\n  video.setAttribute('playsinline', 'true')\n  video.setAttribute('aria-hidden', 'true')\n  video.srcObject = stream\n\n  container.replaceChildren(video)\n  void video.play().catch(() => undefined)\n\n  return () => {\n    try {\n      video.pause()\n      if (video.srcObject === stream) {\n        video.srcObject = null\n      }\n    } catch {\n    }\n    video.remove()\n  }\n}\n","import type { RtcLogEntry } from '../rtc/rtc-manager'\n\nconst RTC_CONSOLE_LOG_PREFIX = '[Xmax]'\n\nexport function writeRtcLogToConsole(entry: RtcLogEntry): void {\n  if (!entry.message.startsWith(RTC_CONSOLE_LOG_PREFIX)) {\n    return\n  }\n\n  const args = entry.data === undefined\n    ? [entry.message]\n    : [entry.message, entry.data]\n\n  if (entry.level === 'error') {\n    console.error(...args)\n  } else if (entry.level === 'warn') {\n    console.warn(...args)\n  } else {\n    console.info(...args)\n  }\n}\n","import type { XmaxOpenClient } from '../api/client'\nimport type { FileClient } from '../files/client'\nimport { XMAX_SDK_BUILD_REGION, type XmaxSdkRegion } from '../build-config'\nimport type { SDKI18n } from '../i18n'\nimport { throwIfAborted } from '../shared/abort'\nimport { notifyError, type XmaxErrorNotifier } from '../shared/error-utils'\nimport { XmaxSdkError } from '../shared/sdk-error'\nimport {\n  linkAbortSignal,\n  normalizeUid,\n  resolvePositiveNumber,\n  resolveReferenceImageUrl,\n  resolveSourceUrl,\n  validateSubmitOptions,\n  waitForPollDelay,\n  type ThrowOfflineError,\n} from './client-helpers'\nimport type {\n  OfflineBatchQueryResult,\n  OfflineClient,\n  OfflineGenerateOptions,\n  OfflineListOptions,\n  OfflineRequestOptions,\n  OfflineSubmitOptions,\n  OfflineTask,\n  OfflineTaskPage,\n} from './types'\n\nexport const XMAX_OFFLINE_API_BASE_URLS: Record<XmaxSdkRegion, string> = {\n  cn: 'https://api.xmaxai.com/open/api/v1',\n  global: 'https://api.xmax.ai/open/api/v1',\n}\n\n/** Official Offline Task API URL for the region this package was built for. */\nexport const XMAX_OFFLINE_API_PRODUCTION_BASE_URL =\n  XMAX_OFFLINE_API_BASE_URLS[XMAX_SDK_BUILD_REGION]\n\nexport const DEFAULT_OFFLINE_POLL_INTERVAL_MS = 2_000\nexport const DEFAULT_OFFLINE_POLL_TIMEOUT_MS = 30 * 60 * 1_000\nconst OFFLINE_TASK_STATUSES = new Set(['submitted', 'processing', 'completed', 'error'])\n\ntype OfflineClientContext = {\n  i18n: SDKI18n\n  onError?: XmaxErrorNotifier\n}\n\ntype OfflineSubmitRequest = {\n  prompt: string\n  refVideoPath: string\n  refImagePath?: string\n  quality: NonNullable<OfflineSubmitOptions['quality']>\n  fps?: NonNullable<OfflineSubmitOptions['fps']>\n}\n\n/** @internal Create the offline capability exposed by {@link XmaxClient.offline}. */\nexport function createOfflineClient(\n  apiClient: XmaxOpenClient,\n  files: FileClient,\n  context: OfflineClientContext,\n): OfflineClient {\n  const throwOfflineError: ThrowOfflineError = (code, messageKey, params) => {\n    const error = new XmaxSdkError(code, context.i18n.t(messageKey, params))\n    throw notifyError(error, context.onError, { code, message: error.message })\n  }\n\n  const submit = async (options: OfflineSubmitOptions): Promise<OfflineTask> => {\n    throwIfAborted(options.signal)\n    if (!options.model?.name.trim()) {\n      throwOfflineError('INVALID_MODEL', 'errors.modelEmpty')\n    }\n    validateSubmitOptions(options, throwOfflineError)\n    const prompt = options.context.prompt.trim()\n    if (!prompt || prompt.length > 1_024) {\n      throwOfflineError('INVALID_INPUT', 'errors.offlinePromptInvalid')\n    }\n\n    const uploadOptions = options.signal ? { signal: options.signal } : undefined\n    const [refVideoPath, refImagePath] = await Promise.all([\n      resolveSourceUrl(files, options.source, uploadOptions, throwOfflineError),\n      resolveReferenceImageUrl(\n        files,\n        options.context.refImageUrl,\n        uploadOptions,\n        throwOfflineError,\n      ),\n    ])\n    throwIfAborted(options.signal)\n\n    const body: OfflineSubmitRequest = {\n      prompt,\n      refVideoPath,\n      ...(refImagePath ? { refImagePath } : {}),\n      quality: options.quality ?? 'hd',\n      ...(options.fps === undefined ? {} : { fps: options.fps }),\n    }\n    return apiClient.request<OfflineTask>('POST', '/offline-task', body, {\n      signal: options.signal,\n    })\n  }\n\n  const status = async (\n    taskUid: string,\n    options: OfflineRequestOptions = {},\n  ): Promise<OfflineTask> => {\n    throwIfAborted(options.signal)\n    return apiClient.request<OfflineTask>(\n      'GET',\n      `/offline-task/${encodeURIComponent(normalizeUid(taskUid, throwOfflineError))}`,\n      undefined,\n      options,\n    )\n  }\n\n  const batchQuery = async (\n    taskUids: readonly string[],\n    options: OfflineRequestOptions = {},\n  ): Promise<OfflineBatchQueryResult> => {\n    throwIfAborted(options.signal)\n    const normalized = taskUids.map((taskUid) => normalizeUid(taskUid, throwOfflineError))\n    if (normalized.length === 0 || normalized.length > 100) {\n      throwOfflineError('INVALID_INPUT', 'errors.offlineTaskUidsInvalid')\n    }\n    return apiClient.request<OfflineBatchQueryResult>(\n      'POST',\n      '/offline-task/batch-query',\n      { taskUids: normalized },\n      options,\n    )\n  }\n\n  const list = async (options: OfflineListOptions = {}): Promise<OfflineTaskPage> => {\n    const { pageNumber = 1, pageSize = 10, status: taskStatus, signal } = options\n    throwIfAborted(signal)\n    if (!Number.isInteger(pageNumber) || pageNumber < 1) {\n      throwOfflineError('INVALID_INPUT', 'errors.offlinePageNumberInvalid')\n    }\n    if (!Number.isInteger(pageSize) || pageSize < 1 || pageSize > 100) {\n      throwOfflineError('INVALID_INPUT', 'errors.offlinePageSizeInvalid')\n    }\n    if (taskStatus && !OFFLINE_TASK_STATUSES.has(taskStatus)) {\n      throwOfflineError('INVALID_INPUT', 'errors.offlineStatusInvalid')\n    }\n    const query = new URLSearchParams({\n      pageNumber: String(pageNumber),\n      pageSize: String(pageSize),\n    })\n    if (taskStatus) query.set('status', taskStatus)\n    return apiClient.request<OfflineTaskPage>(\n      'GET',\n      `/offline-task/page?${query.toString()}`,\n      undefined,\n      { signal },\n    )\n  }\n\n  const generate = async (options: OfflineGenerateOptions): Promise<OfflineTask> => {\n    const pollIntervalMs = resolvePositiveNumber(\n      options.pollIntervalMs,\n      DEFAULT_OFFLINE_POLL_INTERVAL_MS,\n      'pollIntervalMs',\n      throwOfflineError,\n    )\n    const timeoutMs = resolvePositiveNumber(\n      options.timeoutMs,\n      DEFAULT_OFFLINE_POLL_TIMEOUT_MS,\n      'timeoutMs',\n      throwOfflineError,\n    )\n    throwIfAborted(options.signal)\n\n    const operationController = new AbortController()\n    let timedOut = false\n    const unlinkSignal = linkAbortSignal(options.signal, operationController)\n    const timeoutId = globalThis.setTimeout(() => {\n      timedOut = true\n      operationController.abort()\n    }, timeoutMs)\n\n    try {\n      let task = await submit({\n        ...options,\n        signal: operationController.signal,\n      })\n      let reportedStatus: OfflineTask['status'] | undefined\n      const reportStatus = () => {\n        if (task.status === reportedStatus) return\n        reportedStatus = task.status\n        options.onStatusChange?.(task)\n      }\n      reportStatus()\n\n      while (task.status !== 'completed' && task.status !== 'error') {\n        await waitForPollDelay(pollIntervalMs, operationController.signal)\n        task = await status(task.uid, { signal: operationController.signal })\n        reportStatus()\n      }\n      return task\n    } catch (error) {\n      if (timedOut && !options.signal?.aborted) {\n        throwOfflineError(\n          'OFFLINE_TASK_TIMEOUT',\n          'errors.offlineTaskTimeout',\n          { timeoutMs },\n        )\n      }\n      throw error\n    } finally {\n      globalThis.clearTimeout(timeoutId)\n      unlinkSignal()\n    }\n  }\n\n  return { generate, submit, status, batchQuery, list }\n}\n","import type { ModelDefinition } from '../shared/model'\n\n/** Status values returned by the Offline Task API. */\nexport type OfflineTaskStatus = 'submitted' | 'processing' | 'completed' | 'error'\n\n/** Output quality accepted by the Offline Task API. */\nexport type OfflineTaskQuality = 'sd' | 'hd'\n\n/** Frame rates accepted by the Offline Task API. */\nexport const OFFLINE_TASK_SUPPORTED_FPS = [\n  8,\n  10,\n  12,\n  15,\n  16,\n  18,\n  20,\n  22,\n  24,\n  25,\n  30,\n  45,\n  48,\n  50,\n  60,\n  72,\n  90,\n  100,\n  120,\n] as const\n\nexport type OfflineTaskFps = (typeof OFFLINE_TASK_SUPPORTED_FPS)[number]\n\n/** @deprecated Use {@link ModelDefinition}. */\nexport type OfflineModel = ModelDefinition\n\n/** Model factory exposed through the shared `models` entry point. */\nexport interface OfflineModels {\n  /** Select a model for offline generation. */\n  offline(name: string): ModelDefinition\n}\n\nexport type OfflineTaskResult = {\n  result_url?: string | null\n  upload_error?: string | null\n  finalize_duration_ms?: number\n  compression_level?: string | null\n  frame_count?: number\n  fps?: number\n  result_duration_ms?: number\n  file_size_bytes?: number\n  upload_status?: string | null\n  dropped_frame_count?: number\n  original_file_size_bytes?: number\n} & Record<string, unknown>\n\n/** Complete task object returned by create, query, batch query, and list calls. */\nexport type OfflineTask = {\n  uid: string\n  userUid?: string\n  prompt: string\n  refImagePath: string | null\n  refVideoPath: string\n  processorId?: string | null\n  quality: OfflineTaskQuality\n  requestedFps?: number | null\n  retryCount?: number\n  resolvedFps?: number\n  videoDurationSeconds?: number\n  billableDurationSeconds?: number\n  chargePoints?: number\n  status: OfflineTaskStatus\n  result: OfflineTaskResult | null\n  processStartTime?: string | null\n  createTimestamp?: string\n  updateTimestamp?: string\n} & Record<string, unknown>\n\n/** A local browser File is uploaded automatically; strings must be Xmax upload URLs. */\nexport type OfflineMediaInput = File | string\n\n/** Generation context for one offline video task. */\nexport type OfflineContext = {\n  /** Generation instructions. Leading/trailing whitespace is removed. */\n  prompt: string\n  /**\n   * Optional reference image. Local Files are uploaded automatically; strings\n   * must be URLs previously returned by `client.files.uploadImage()`.\n   */\n  refImageUrl?: OfflineMediaInput | null\n}\n\nexport type OfflineSubmitOptions = {\n  /** Model definition; this client method runs it as an offline task. */\n  model: ModelDefinition\n  /** Source video File or a URL previously returned by `client.files.uploadVideo()`. */\n  source: OfflineMediaInput\n  /** Generation prompt and optional reference image. */\n  context: OfflineContext\n  /** @default 'hd' */\n  quality?: OfflineTaskQuality\n  /** Omit to use the source video's detected frame rate. */\n  fps?: OfflineTaskFps\n  /** Cancels local upload, request, and polling work. It does not cancel an accepted server task. */\n  signal?: AbortSignal\n}\n\nexport type OfflineGenerateOptions = OfflineSubmitOptions & {\n  /** Called for the submitted task and whenever its status changes. */\n  onStatusChange?: (task: OfflineTask) => void\n  /** Delay between status requests. @default 2000 */\n  pollIntervalMs?: number\n  /** Maximum time for submit plus polling. @default 1800000 (30 minutes) */\n  timeoutMs?: number\n}\n\nexport type OfflineRequestOptions = {\n  signal?: AbortSignal\n}\n\nexport type OfflineBatchQueryResult = {\n  list: OfflineTask[]\n}\n\nexport type OfflineListOptions = OfflineRequestOptions & {\n  /** @default 1 */\n  pageNumber?: number\n  /** @default 10; maximum 100 */\n  pageSize?: number\n  status?: OfflineTaskStatus\n}\n\nexport type OfflineTaskPage = {\n  pageNumber: number\n  pageSize: number\n  total: number\n  list: OfflineTask[]\n}\n\nexport type OfflineClient = {\n  /** Submit a task and poll it until `completed` or `error`. */\n  generate: (options: OfflineGenerateOptions) => Promise<OfflineTask>\n  /** Submit an asynchronous offline video task. Local Files are uploaded first. */\n  submit: (options: OfflineSubmitOptions) => Promise<OfflineTask>\n  /** Retrieve one task by UID. */\n  status: (taskUid: string, options?: OfflineRequestOptions) => Promise<OfflineTask>\n  /** Retrieve up to 100 tasks in one request. */\n  batchQuery: (\n    taskUids: readonly string[],\n    options?: OfflineRequestOptions,\n  ) => Promise<OfflineBatchQueryResult>\n  /** List the current user's tasks. */\n  list: (options?: OfflineListOptions) => Promise<OfflineTaskPage>\n}\n","import type { FileClient } from '../files/client'\nimport { createAbortError, throwIfAborted } from '../shared/abort'\nimport type { XmaxErrorCode } from '../shared/sdk-error'\nimport {\n  OFFLINE_TASK_SUPPORTED_FPS,\n  type OfflineMediaInput,\n  type OfflineRequestOptions,\n  type OfflineSubmitOptions,\n} from './types'\n\nexport type ThrowOfflineError = (\n  code: XmaxErrorCode,\n  messageKey: string,\n  params?: Record<string, string | number>,\n) => never\n\nexport function resolvePositiveNumber(\n  value: number | undefined,\n  fallback: number,\n  label: string,\n  throwOfflineError: ThrowOfflineError,\n): number {\n  const resolved = value ?? fallback\n  if (!Number.isFinite(resolved) || resolved <= 0) {\n    throwOfflineError('INVALID_INPUT', 'errors.offlinePositiveNumber', { label })\n  }\n  return resolved\n}\n\nexport function normalizeUid(\n  taskUid: string,\n  throwOfflineError: ThrowOfflineError,\n): string {\n  const normalized = taskUid.trim()\n  if (!normalized) {\n    throwOfflineError('INVALID_INPUT', 'errors.offlineTaskUidEmpty')\n  }\n  return normalized\n}\n\nfunction normalizeUploadedUrl(\n  value: string,\n  label: string,\n  throwOfflineError: ThrowOfflineError,\n): string {\n  const normalized = value.trim()\n  if (!/^https?:\\/\\//i.test(normalized)) {\n    throwOfflineError(\n      'INVALID_INPUT',\n      'errors.offlineUploadedUrlRequired',\n      { label },\n    )\n  }\n  return normalized\n}\n\nexport function validateSubmitOptions(\n  options: OfflineSubmitOptions,\n  throwOfflineError: ThrowOfflineError,\n): void {\n  if (options.quality !== undefined && options.quality !== 'sd' && options.quality !== 'hd') {\n    throwOfflineError('INVALID_INPUT', 'errors.offlineQualityInvalid')\n  }\n  if (\n    options.fps !== undefined\n    && !(OFFLINE_TASK_SUPPORTED_FPS as readonly number[]).includes(options.fps)\n  ) {\n    throwOfflineError('INVALID_INPUT', 'errors.offlineFpsUnsupported')\n  }\n}\n\nexport async function resolveSourceUrl(\n  files: FileClient,\n  input: OfflineMediaInput,\n  options: OfflineRequestOptions | undefined,\n  throwOfflineError: ThrowOfflineError,\n): Promise<string> {\n  return typeof input === 'string'\n    ? normalizeUploadedUrl(input, 'source', throwOfflineError)\n    : (options\n        ? (await files.uploadVideo(input, options)).url\n        : (await files.uploadVideo(input)).url)\n}\n\nexport async function resolveReferenceImageUrl(\n  files: FileClient,\n  input: OfflineMediaInput | null | undefined,\n  options: OfflineRequestOptions | undefined,\n  throwOfflineError: ThrowOfflineError,\n): Promise<string | undefined> {\n  if (input === null || input === undefined) return undefined\n  return typeof input === 'string'\n    ? normalizeUploadedUrl(input, 'context.refImageUrl', throwOfflineError)\n    : (options\n        ? (await files.uploadImage(input, options)).url\n        : (await files.uploadImage(input)).url)\n}\n\nexport function waitForPollDelay(ms: number, signal: AbortSignal): Promise<void> {\n  throwIfAborted(signal)\n  return new Promise((resolve, reject) => {\n    const timeoutId = globalThis.setTimeout(() => {\n      signal.removeEventListener('abort', onAbort)\n      resolve()\n    }, ms)\n    const onAbort = () => {\n      globalThis.clearTimeout(timeoutId)\n      signal.removeEventListener('abort', onAbort)\n      reject(createAbortError())\n    }\n    signal.addEventListener('abort', onAbort, { once: true })\n  })\n}\n\nexport function linkAbortSignal(\n  source: AbortSignal | undefined,\n  target: AbortController,\n): () => void {\n  if (!source) return () => {}\n  const onAbort = () => target.abort()\n  if (source.aborted) {\n    target.abort()\n    return () => {}\n  }\n  source.addEventListener('abort', onAbort, { once: true })\n  return () => source.removeEventListener('abort', onAbort)\n}\n","import { XMAX_OPEN_API_PRODUCTION_BASE_URL, XmaxOpenClient } from '../api/client'\nimport { createFileClient } from '../files/client'\nimport { createRealtimeClient } from '../realtime/client'\nimport {\n  createOfflineClient,\n  XMAX_OFFLINE_API_PRODUCTION_BASE_URL,\n} from '../offline/client'\nimport { createSDKI18n } from '../i18n'\nimport type { XmaxClient, XmaxClientOptions } from './types'\n\nfunction resolveClientOptions(\n  options: XmaxClientOptions,\n): Required<Pick<XmaxClientOptions, 'baseUrl' | 'offlineBaseUrl'>> & XmaxClientOptions {\n  return {\n    ...options,\n    baseUrl: options.baseUrl?.trim() || XMAX_OPEN_API_PRODUCTION_BASE_URL,\n    offlineBaseUrl: options.offlineBaseUrl?.trim() || XMAX_OFFLINE_API_PRODUCTION_BASE_URL,\n  }\n}\n\nexport function createXmaxClient(options: XmaxClientOptions): XmaxClient {\n  const resolved = resolveClientOptions(options)\n  const i18n = resolved.i18n ?? createSDKI18n({ locale: resolved.locale })\n  const resolvedWithI18n = { ...resolved, i18n }\n  const httpClient = new XmaxOpenClient({\n    apiKey: resolved.apiKey,\n    authToken: resolved.authToken,\n    baseUrl: resolved.baseUrl,\n    i18n,\n    onError: resolved.onError,\n    telemetry: resolved.telemetry,\n    reportSource: resolved.reportSource,\n  })\n  const offlineHttpClient = new XmaxOpenClient({\n    apiKey: resolved.apiKey,\n    authToken: resolved.authToken,\n    baseUrl: resolved.offlineBaseUrl,\n    i18n,\n    onError: resolved.onError,\n    telemetry: resolved.telemetry,\n    reportSource: resolved.reportSource,\n  })\n  const files = createFileClient(httpClient)\n\n  return {\n    files,\n    realtime: createRealtimeClient(resolvedWithI18n),\n    offline: createOfflineClient(offlineHttpClient, files, {\n      i18n,\n      onError: resolved.onError,\n    }),\n  }\n}\n","import type { OfflineModels } from '../offline/types'\nimport type { RealtimeModels } from './types'\n\nexport type Models = RealtimeModels & OfflineModels\n\n/**\n * @brief 生成模型入口。\n * 用于按开放平台公开的模型名称创建实时或离线模型对象。\n * @notes 该入口只负责构造模型对象，不会在本地校验模型名称或账号权限。\n */\nexport const models: Models = {\n\n  /**\n   * @brief 选择一个实时生成模型。\n   * @param name 模型的公开名称，例如 `x2.0`。\n   * @returns 包含原始模型名称的 ModelDefinition。\n   */\n  realtime(name) {\n    return { name }\n  },\n\n  /**\n   * @brief 选择一个离线生成模型。\n   * @param name 模型的公开名称，例如 `x2.0`。\n   * @returns 包含原始模型名称的 ModelDefinition。\n   */\n  offline(name) {\n    return { name }\n  },\n}\n","import { getFitContentRect, type ContentRect } from './map-viewport'\nimport type { RemoteViewHost } from './remote-view-host'\n\nexport const DRAG_SYNCED_ATTR = 'data-xmax-drag-synced'\n\nexport type DragVideoSyncOptions = {\n  getTargetSize: () => [number, number]\n  getFitMode: () => 'contain' | 'cover'\n  onSync?: () => void\n}\n\nexport type RemoteDragLayout = {\n  /** Drawable overlay aligned to the painted RTC media on screen. */\n  overlay: ContentRect\n  /** Pointer → session coordinate mapping bounds. */\n  mapping: ContentRect\n  /** Hit-test bounds inside the preview frame. */\n  hitRect: ContentRect\n  source: 'media' | 'intrinsic' | 'fit'\n}\n\nfunction toContentRect(rect: Pick<DOMRect, 'left' | 'top' | 'width' | 'height'>): ContentRect {\n  return {\n    left: rect.left,\n    top: rect.top,\n    width: rect.width,\n    height: rect.height,\n  }\n}\n\nexport function isMediaInsetInContainer(\n  mediaRect: Pick<DOMRect, 'width' | 'height'>,\n  containerRect: Pick<DOMRect, 'width' | 'height'>,\n): boolean {\n  if (!mediaRect.width || !mediaRect.height || !containerRect.width || !containerRect.height) {\n    return false\n  }\n  const widthRatio = mediaRect.width / containerRect.width\n  const heightRatio = mediaRect.height / containerRect.height\n  return widthRatio < 0.98 || heightRatio < 0.98\n}\n\nexport function intersectContentRects(a: ContentRect, b: ContentRect): ContentRect {\n  const left = Math.max(a.left, b.left)\n  const top = Math.max(a.top, b.top)\n  const right = Math.min(a.left + a.width, b.left + b.width)\n  const bottom = Math.min(a.top + a.height, b.top + b.height)\n  return {\n    left,\n    top,\n    width: Math.max(0, right - left),\n    height: Math.max(0, bottom - top),\n  }\n}\n\nexport function readMediaIntrinsicSize(\n  media: HTMLVideoElement | HTMLCanvasElement,\n): [number, number] | null {\n  const video = media as HTMLVideoElement\n  if ('videoWidth' in video && video.videoWidth > 0 && video.videoHeight > 0) {\n    return [video.videoWidth, video.videoHeight]\n  }\n\n  if (media.width > 0 && media.height > 0) {\n    return [media.width, media.height]\n  }\n  return null\n}\n\nexport function resolveMediaObjectFit(\n  media: HTMLElement,\n  fallback: 'contain' | 'cover',\n): 'contain' | 'cover' | 'fill' {\n  if (typeof getComputedStyle !== 'function') {\n    return fallback\n  }\n\n  const fit = getComputedStyle(media).objectFit\n  if (fit === 'contain' || fit === 'cover' || fit === 'fill') {\n    return fit\n  }\n  return fallback\n}\n\nexport function resolveRemoteDragLayout(input: {\n  wrapperRect: Pick<DOMRect, 'left' | 'top' | 'width' | 'height'>\n  mediaRect: Pick<DOMRect, 'left' | 'top' | 'width' | 'height'>\n  media: HTMLVideoElement | HTMLCanvasElement | null\n  targetSize: [number, number]\n  fitMode: 'contain' | 'cover'\n}): RemoteDragLayout | null {\n  const { wrapperRect, mediaRect, media, targetSize, fitMode } = input\n  if (!wrapperRect.width || !wrapperRect.height || !mediaRect.width || !mediaRect.height) {\n    return null\n  }\n\n  const wrapper = toContentRect(wrapperRect)\n\n  // Upload / RTC FIT: map linearly across the media layout box. Hit-test only\n  // the visible portion inside the preview frame (wide images overflow horizontally).\n  if (fitMode === 'contain') {\n    const overlay = toContentRect(mediaRect)\n    const hitRect = intersectContentRects(overlay, wrapper)\n    const drawable = hitRect.width > 0 && hitRect.height > 0 ? hitRect : wrapper\n    return { overlay: drawable, mapping: overlay, hitRect: drawable, source: 'media' }\n  }\n\n  if (isMediaInsetInContainer(mediaRect, wrapperRect)) {\n    const overlay = toContentRect(mediaRect)\n    return { overlay, mapping: overlay, hitRect: overlay, source: 'media' }\n  }\n\n  const intrinsic = media ? readMediaIntrinsicSize(media) : null\n  const frameSize = intrinsic ?? targetSize\n  const objectFit = media ? resolveMediaObjectFit(media, fitMode) : fitMode\n\n  if (objectFit === 'fill') {\n    const overlay = toContentRect(mediaRect)\n    return { overlay, mapping: overlay, hitRect: wrapper, source: 'intrinsic' }\n  }\n\n  const mapping = getFitContentRect(mediaRect, frameSize, objectFit)\n  const overlay = intersectContentRects(mapping, wrapper)\n  const drawable = overlay.width > 0 && overlay.height > 0 ? overlay : wrapper\n  return {\n    overlay: drawable,\n    mapping,\n    hitRect: wrapper,\n    source: intrinsic ? 'intrinsic' : 'fit',\n  }\n}\n\nfunction resetDragHostFullBleed(dragHost: HTMLElement): void {\n  dragHost.style.inset = '0'\n  dragHost.style.left = ''\n  dragHost.style.top = ''\n  dragHost.style.right = ''\n  dragHost.style.bottom = ''\n  dragHost.style.width = ''\n  dragHost.style.height = ''\n  dragHost.removeAttribute(DRAG_SYNCED_ATTR)\n}\n\n/** Align drag overlay to the painted RTC media region on screen. */\nexport function syncDragHostToVideo(\n  host: RemoteViewHost,\n  targetSize: [number, number],\n  fitMode: 'contain' | 'cover',\n): boolean {\n  const { wrapper, videoHost, dragHost } = host\n  const media = videoHost.querySelector('video, canvas') as HTMLVideoElement | HTMLCanvasElement | null\n  if (!media) {\n    resetDragHostFullBleed(dragHost)\n    return false\n  }\n\n  const wrapperRect = wrapper.getBoundingClientRect()\n  const mediaRect = media.getBoundingClientRect()\n  const layout = resolveRemoteDragLayout({\n    wrapperRect,\n    mediaRect,\n    media,\n    targetSize,\n    fitMode,\n  })\n  if (!layout || !layout.overlay.width || !layout.overlay.height) {\n    resetDragHostFullBleed(dragHost)\n    return false\n  }\n\n  const { overlay } = layout\n  dragHost.style.inset = 'auto'\n  dragHost.style.left = `${overlay.left - wrapperRect.left}px`\n  dragHost.style.top = `${overlay.top - wrapperRect.top}px`\n  dragHost.style.width = `${overlay.width}px`\n  dragHost.style.height = `${overlay.height}px`\n  dragHost.style.right = ''\n  dragHost.style.bottom = ''\n  dragHost.setAttribute(DRAG_SYNCED_ATTR, '')\n  return true\n}\n\nfunction resetDragSurfaceFullBleed(dragSurface: HTMLElement): void {\n  dragSurface.style.inset = '0'\n  dragSurface.style.left = ''\n  dragSurface.style.top = ''\n  dragSurface.style.right = ''\n  dragSurface.style.bottom = ''\n  dragSurface.style.width = ''\n  dragSurface.style.height = ''\n  dragSurface.removeAttribute(DRAG_SYNCED_ATTR)\n}\n\nfunction applyDragSurfaceOverlayStyles(\n  dragSurface: HTMLElement,\n  overlay: ContentRect,\n  wrapperRect: Pick<DOMRect, 'left' | 'top'>,\n): boolean {\n  const nextLeft = `${overlay.left - wrapperRect.left}px`\n  const nextTop = `${overlay.top - wrapperRect.top}px`\n  const nextWidth = `${overlay.width}px`\n  const nextHeight = `${overlay.height}px`\n\n  if (\n    dragSurface.hasAttribute(DRAG_SYNCED_ATTR)\n    && dragSurface.style.inset === 'auto'\n    && dragSurface.style.left === nextLeft\n    && dragSurface.style.top === nextTop\n    && dragSurface.style.width === nextWidth\n    && dragSurface.style.height === nextHeight\n  ) {\n    return false\n  }\n\n  dragSurface.style.inset = 'auto'\n  dragSurface.style.left = nextLeft\n  dragSurface.style.top = nextTop\n  dragSurface.style.width = nextWidth\n  dragSurface.style.height = nextHeight\n  dragSurface.style.right = ''\n  dragSurface.style.bottom = ''\n  dragSurface.setAttribute(DRAG_SYNCED_ATTR, '')\n  return true\n}\n\n/** Align drag overlay to the painted RTC media region. */\nexport function syncDragSurfaceToVideo(\n  dragSurface: HTMLElement,\n  targetSize: [number, number],\n  fitMode: 'contain' | 'cover',\n): boolean {\n  const wrapper = dragSurface.parentElement\n  if (!wrapper) {\n    resetDragSurfaceFullBleed(dragSurface)\n    return false\n  }\n\n  const layout = resolveRemoteDragLayoutFromSurface(dragSurface, targetSize, fitMode)\n  if (!layout || !layout.overlay.width || !layout.overlay.height) {\n    resetDragSurfaceFullBleed(dragSurface)\n    return false\n  }\n\n  const wrapperRect = wrapper.getBoundingClientRect()\n  const { overlay } = layout\n  return applyDragSurfaceOverlayStyles(dragSurface, overlay, wrapperRect)\n}\n\nexport function resolveRemoteDragLayoutFromSurface(\n  dragSurface: HTMLElement,\n  targetSize: [number, number],\n  fitMode: 'contain' | 'cover',\n): RemoteDragLayout | null {\n  const wrapper = dragSurface.parentElement\n  if (!wrapper) {\n    return null\n  }\n\n  const videoHost = wrapper.querySelector('[data-xmax-remote-video]') as HTMLElement | null\n  if (!videoHost) {\n    return null\n  }\n\n  const media = videoHost.querySelector('video, canvas') as HTMLVideoElement | HTMLCanvasElement | null\n  if (!media) {\n    return null\n  }\n\n  return resolveRemoteDragLayout({\n    wrapperRect: wrapper.getBoundingClientRect(),\n    mediaRect: media.getBoundingClientRect(),\n    media,\n    targetSize,\n    fitMode,\n  })\n}\n\nexport function observeDragHostVideoSync(\n  host: RemoteViewHost,\n  options: DragVideoSyncOptions,\n): () => void {\n  const mediaListeners = new Map<EventTarget, Array<() => void>>()\n\n  const bindMediaListeners = () => {\n    const media = host.videoHost.querySelector('video, canvas')\n    if (!media || mediaListeners.has(media)) {\n      return\n    }\n\n    const rerender = () => apply()\n    const bindings: Array<() => void> = []\n    const add = (type: string) => {\n      media.addEventListener(type, rerender)\n      bindings.push(() => media.removeEventListener(type, rerender))\n    }\n\n    add('loadedmetadata')\n    add('loadeddata')\n    add('resize')\n    mediaListeners.set(media, bindings)\n  }\n\n  const apply = () => {\n    syncDragHostToVideo(host, options.getTargetSize(), options.getFitMode())\n    options.onSync?.()\n    bindMediaListeners()\n  }\n\n  apply()\n\n  const resizeObserver = typeof ResizeObserver !== 'undefined'\n    ? new ResizeObserver(() => apply())\n    : null\n  resizeObserver?.observe(host.wrapper)\n  resizeObserver?.observe(host.videoHost)\n\n  const observeMedia = () => {\n    const media = host.videoHost.querySelector('video, canvas')\n    if (media) {\n      resizeObserver?.observe(media)\n    }\n  }\n  observeMedia()\n\n  const mutationObserver = typeof MutationObserver !== 'undefined'\n    ? new MutationObserver(() => {\n      observeMedia()\n      apply()\n    })\n    : null\n  mutationObserver?.observe(host.videoHost, {\n    childList: true,\n    subtree: true,\n    attributes: true,\n    attributeFilter: ['style', 'class', 'width', 'height'],\n  })\n\n  const onWindowChange = () => apply()\n  window.addEventListener('resize', onWindowChange)\n  window.addEventListener('scroll', onWindowChange, true)\n\n  return () => {\n    resizeObserver?.disconnect()\n    mutationObserver?.disconnect()\n    for (const unbind of Array.from(mediaListeners.values())) {\n      unbind.forEach((dispose) => dispose())\n    }\n    mediaListeners.clear()\n    window.removeEventListener('resize', onWindowChange)\n    window.removeEventListener('scroll', onWindowChange, true)\n    resetDragHostFullBleed(host.dragHost)\n  }\n}\n\n/** Keep a drag surface aligned with remote output video layout. */\nexport function observeDragSurfaceVideoSync(\n  dragSurface: HTMLElement,\n  options: DragVideoSyncOptions,\n): () => void {\n  const wrapper = dragSurface.parentElement\n  if (!wrapper) {\n    return () => {}\n  }\n\n  const mediaListeners = new Map<EventTarget, Array<() => void>>()\n  let rafId: number | null = null\n  let observedVideoHost: Element | null = null\n\n  const bindMediaListeners = (media: EventTarget) => {\n    if (mediaListeners.has(media)) {\n      return\n    }\n\n    const rerender = () => scheduleApply()\n    const bindings: Array<() => void> = []\n    const add = (type: string) => {\n      media.addEventListener(type, rerender)\n      bindings.push(() => media.removeEventListener(type, rerender))\n    }\n\n    add('loadedmetadata')\n    add('loadeddata')\n    add('resize')\n    mediaListeners.set(media, bindings)\n  }\n\n  const apply = () => {\n    const changed = syncDragSurfaceToVideo(dragSurface, options.getTargetSize(), options.getFitMode())\n    if (changed) {\n      options.onSync?.()\n    }\n\n    const videoHost = wrapper.querySelector('[data-xmax-remote-video]')\n    const media = videoHost?.querySelector('video, canvas')\n    if (media) {\n      bindMediaListeners(media)\n    }\n  }\n\n  const scheduleApply = () => {\n    if (rafId !== null) {\n      return\n    }\n    rafId = requestAnimationFrame(() => {\n      rafId = null\n      apply()\n    })\n  }\n\n  const bindVideoHostObserver = (videoHostObserver: MutationObserver | null) => {\n    const host = wrapper.querySelector('[data-xmax-remote-video]')\n    if (!host || host === observedVideoHost || !videoHostObserver) {\n      return\n    }\n\n    videoHostObserver.disconnect()\n    observedVideoHost = host\n    videoHostObserver.observe(host, {\n      childList: true,\n      subtree: true,\n      attributes: true,\n      attributeFilter: ['style', 'class', 'width', 'height'],\n    })\n  }\n\n  apply()\n\n  const resizeObserver = typeof ResizeObserver !== 'undefined'\n    ? new ResizeObserver(() => scheduleApply())\n    : null\n  resizeObserver?.observe(wrapper)\n\n  const videoHost = wrapper.querySelector('[data-xmax-remote-video]')\n  if (videoHost) {\n    resizeObserver?.observe(videoHost)\n  }\n\n  const observeMedia = () => {\n    const host = wrapper.querySelector('[data-xmax-remote-video]')\n    const media = host?.querySelector('video, canvas')\n    if (media) {\n      resizeObserver?.observe(media)\n      bindMediaListeners(media)\n    }\n  }\n  observeMedia()\n\n  const videoHostMutationObserver = typeof MutationObserver !== 'undefined'\n    ? new MutationObserver(() => {\n      observeMedia()\n      scheduleApply()\n    })\n    : null\n  bindVideoHostObserver(videoHostMutationObserver)\n\n  // Child-list only on wrapper — never watch dragSurface style (would loop with sync).\n  const wrapperMutationObserver = typeof MutationObserver !== 'undefined'\n    ? new MutationObserver(() => {\n      bindVideoHostObserver(videoHostMutationObserver)\n      observeMedia()\n      scheduleApply()\n    })\n    : null\n  wrapperMutationObserver?.observe(wrapper, {\n    childList: true,\n    subtree: true,\n  })\n\n  const onWindowChange = () => scheduleApply()\n  window.addEventListener('resize', onWindowChange)\n  window.addEventListener('scroll', onWindowChange, true)\n\n  return () => {\n    if (rafId !== null) {\n      cancelAnimationFrame(rafId)\n      rafId = null\n    }\n    resizeObserver?.disconnect()\n    wrapperMutationObserver?.disconnect()\n    videoHostMutationObserver?.disconnect()\n    for (const unbind of Array.from(mediaListeners.values())) {\n      unbind.forEach((dispose) => dispose())\n    }\n    mediaListeners.clear()\n    window.removeEventListener('resize', onWindowChange)\n    window.removeEventListener('scroll', onWindowChange, true)\n    resetDragSurfaceFullBleed(dragSurface)\n  }\n}\n"]}