@xmaxai/sdk 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
- import { XmaxOpenClient, XMAX_OPEN_API_PRODUCTION_BASE_URL, RtcManager, ACTIVE_STATUS, createNativeCameraStream, createTracksRtcRoomEvent, createStopRtcRoomEvent, createTaskUid, createStartRtcRoomEvent, createDragTrackController, notifyError, getFitContentRect } from './chunk-M5QA6LWS.js';
2
- import { createSDKI18n, resolveUploadVideoSize, DEFAULT_SESSION_TARGET_SIZE, resolveRtcPublishFps, resolveSessionTargetSize } from './chunk-PLU2YVAS.js';
1
+ import { XmaxOpenClient, XMAX_OPEN_API_PRODUCTION_BASE_URL, RtcManager, ACTIVE_STATUS, createNativeCameraStream, createTracksRtcRoomEvent, createStopRtcRoomEvent, createTaskUid, createStartRtcRoomEvent, createDragTrackController, notifyError, getFitContentRect } from './chunk-V4NR6CPP.js';
2
+ import { createSDKI18n, resolveUploadVideoSize, DEFAULT_SESSION_TARGET_SIZE, resolveRtcPublishFps, resolveSessionTargetSize } from './chunk-LCPC56BK.js';
3
3
 
4
4
  // src/drag/remote-view-host.ts
5
5
  function createRemoteViewHost(wrapper) {
@@ -182,7 +182,6 @@ var RealtimeSession = class _RealtimeSession {
182
182
  this.localVideoSize = null;
183
183
  this.currentPrompt = "";
184
184
  this.currentGenerationModel = "";
185
- this.currentStaticGenerate = void 0;
186
185
  this.disconnected = false;
187
186
  this.remoteViewHost = null;
188
187
  this.dragController = null;
@@ -318,7 +317,6 @@ var RealtimeSession = class _RealtimeSession {
318
317
  const initialState = options.initialState;
319
318
  this.currentPrompt = resolvePromptText(initialState?.prompt);
320
319
  this.currentGenerationModel = resolveGenerationModel(initialState?.model);
321
- this.currentStaticGenerate = initialState?.staticGenerate;
322
320
  const publishFpsOptions = {
323
321
  mobile: options.mobile,
324
322
  highQuality: true,
@@ -345,7 +343,8 @@ var RealtimeSession = class _RealtimeSession {
345
343
  model: this.currentGenerationModel || void 0,
346
344
  size: options.size,
347
345
  refImage: initialRefImageUrl,
348
- staticGenerate: this.currentStaticGenerate
346
+ staticGenerate: initialState?.staticGenerate,
347
+ staticImagePath: initialState?.staticImagePath?.trim() || void 0
349
348
  });
350
349
  }
351
350
  }
@@ -424,15 +423,14 @@ var RealtimeSession = class _RealtimeSession {
424
423
  if (options?.model !== void 0) {
425
424
  this.currentGenerationModel = resolveGenerationModel(options.model);
426
425
  }
427
- if (options?.staticGenerate !== void 0) {
428
- this.currentStaticGenerate = options.staticGenerate;
429
- }
430
426
  await this.runStart({
431
427
  prompt: this.currentPrompt || void 0,
432
428
  model: this.currentGenerationModel || void 0,
433
429
  size: options?.size,
434
430
  refImage: resolvedRefImage,
435
- staticGenerate: this.currentStaticGenerate
431
+ staticGenerate: options?.staticGenerate === true ? true : void 0,
432
+ staticImagePath: options?.staticImagePath?.trim() || void 0,
433
+ preserveRemoteOutput: options?.preserveRemoteOutput
436
434
  });
437
435
  } catch (error) {
438
436
  this.reportError(error);
@@ -523,17 +521,20 @@ var RealtimeSession = class _RealtimeSession {
523
521
  if (!this.rtc.snapshot.joined) {
524
522
  return;
525
523
  }
524
+ const preserveRemoteOutput = options.preserveRemoteOutput ?? false;
525
+ if (preserveRemoteOutput) {
526
+ this.rtc.setPreserveRemoteDom(true);
527
+ }
526
528
  const startPrompt = options.prompt?.trim() ?? this.currentPrompt;
527
529
  if (options.model !== void 0) {
528
530
  this.currentGenerationModel = resolveGenerationModel(options.model);
529
531
  }
530
- if (options.staticGenerate !== void 0) {
531
- this.currentStaticGenerate = options.staticGenerate;
532
- }
533
532
  const modelLabel = resolveGenerationModel(this.currentGenerationModel);
534
533
  await this.rtc.ensurePublishedInputBeforeStart();
535
- this.rtc.setRemoteVideoContainer(null);
536
- this.rtc.clearRemoteVideo();
534
+ if (!preserveRemoteOutput) {
535
+ this.rtc.setRemoteVideoContainer(null);
536
+ this.rtc.clearRemoteVideo();
537
+ }
537
538
  const size = resolveSessionTargetSize({
538
539
  localVideoSize: this.localVideoSize,
539
540
  overrideSize: options.size ?? this.sessionSizeOverride
@@ -554,16 +555,21 @@ var RealtimeSession = class _RealtimeSession {
554
555
  size,
555
556
  prompt: startPrompt,
556
557
  refImagePath: resolveRefImagePath(options.refImage),
557
- staticGenerate: this.currentStaticGenerate
558
+ // Never reuse prior start — caller must pass Instant fields each time.
559
+ staticGenerate: options.staticGenerate === true ? true : void 0,
560
+ staticImagePath: options.staticImagePath?.trim() || void 0
558
561
  });
559
- console.log("[Xmax SDK] \u771F\u5B9E\u53D1\u9001 start ->", startRoomEvent);
560
562
  await this.rtc.sendRoomEvent(startRoomEvent);
561
- await this.rtc.refreshRemoteVideoBinding({ force: true });
563
+ await this.rtc.refreshRemoteVideoBinding({ force: !preserveRemoteOutput });
562
564
  this.updateDragController(true);
563
565
  this.scheduleNotifyRemoteStream();
564
566
  } catch (error) {
565
567
  this.rtc.configureSessionSei(null);
566
568
  throw error;
569
+ } finally {
570
+ if (preserveRemoteOutput) {
571
+ this.rtc.setPreserveRemoteDom(false);
572
+ }
567
573
  }
568
574
  }
569
575
  isDragEnabled() {
@@ -690,7 +696,6 @@ var RealtimeSession = class _RealtimeSession {
690
696
  this.taskUid = null;
691
697
  this.currentPrompt = "";
692
698
  this.currentGenerationModel = "";
693
- this.currentStaticGenerate = void 0;
694
699
  this.sessionTargetSize = null;
695
700
  this.dragController?.destroy();
696
701
  this.dragController = null;
@@ -988,5 +993,5 @@ function observeDragSurfaceVideoSync(dragSurface, options) {
988
993
  }
989
994
 
990
995
  export { RealtimePrewarmHandle, RealtimeSession, createRemoteViewHost, createXmaxClient, observeDragSurfaceVideoSync, resolveRefImageUrl, syncDragSurfaceToVideo };
991
- //# sourceMappingURL=chunk-7X7QCO3O.js.map
992
- //# sourceMappingURL=chunk-7X7QCO3O.js.map
996
+ //# sourceMappingURL=chunk-VLJZ56PT.js.map
997
+ //# sourceMappingURL=chunk-VLJZ56PT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/drag/remote-view-host.ts","../src/shared/ref-image.ts","../src/realtime/initial-state.ts","../src/realtime/prewarm.ts","../src/realtime/session.ts","../src/realtime/create-client.ts","../src/drag/drag-video-sync.ts"],"names":["options","overlay","drawable","videoHost"],"mappings":"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","file":"chunk-VLJZ56PT.js","sourcesContent":["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.dataset.XmaxRemoteVideo = '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.dataset.XmaxDragSurface = 'true'\n dragHost.style.cssText =\n 'position:absolute;inset:0;z-index:20;touch-action:none;'\n\n wrapper.replaceChildren()\n wrapper.appendChild(videoHost)\n wrapper.appendChild(dragHost)\n\n return { wrapper, videoHost, dragHost }\n}\n","import type { XmaxOpenClient } from '../sdk/client'\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 const res = await fetch(raw)\n if (!res.ok) {\n throw new Error(`Failed to load ref image: ${res.status}`)\n }\n\n const blob = await res.blob()\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","import type { RealtimeInitialState } from './types'\n\n/** Internal RTC start `params.model` placeholder when the host omits it. */\nexport const DEFAULT_RTC_START_MODEL = 'default'\n\nexport function resolveGenerationModel(model?: string | null): string {\n const trimmed = model?.trim()\n return trimmed || DEFAULT_RTC_START_MODEL\n}\n\nexport function resolvePromptText(prompt: RealtimeInitialState['prompt']): string {\n if (typeof prompt === 'string') {\n return prompt.trim()\n }\n return prompt?.text?.trim() ?? ''\n}\n\nexport function resolveInitialRefImage(initialState?: RealtimeInitialState): string | undefined {\n if (!initialState) {\n return undefined\n }\n if (typeof initialState.refImage === 'string' && initialState.refImage.trim()) {\n return initialState.refImage.trim()\n }\n if (typeof initialState.image === 'string' && initialState.image.trim()) {\n return initialState.image.trim()\n }\n return undefined\n}\n\nexport function shouldAutoStartOnConnect(initialState?: RealtimeInitialState): boolean {\n return initialState?.autoStart === true\n}\n","import {\n ACTIVE_STATUS,\n XmaxOpenClient,\n XMAX_OPEN_API_PRODUCTION_BASE_URL,\n} from '../sdk/client'\nimport { RtcManager } from '../rtc/rtc-manager'\nimport { createSDKI18n } from '../i18n'\nimport type { RealtimeModel, XmaxClientOptions } from './types'\n\nexport type PrewarmedRoomResources = {\n client: XmaxOpenClient\n rtc: RtcManager\n sessionUid: string\n}\n\n/** Holds a joined RTC room before camera input is attached — iOS enterRoom-at-launch equivalent. */\nexport class RealtimePrewarmHandle {\n readonly modelName: string\n\n private consumed = false\n private disposed = false\n\n private constructor(\n readonly client: XmaxOpenClient,\n readonly rtc: RtcManager,\n readonly sessionUid: string,\n modelName: string,\n ) {\n this.modelName = modelName\n }\n\n static async create(\n model: RealtimeModel,\n clientOptions: XmaxClientOptions,\n ): Promise<RealtimePrewarmHandle> {\n const modelName = model.name.trim()\n if (!modelName) {\n throw new Error('model.name is required')\n }\n\n const sdkI18n = createSDKI18n({})\n const client = new XmaxOpenClient({\n apiKey: clientOptions.apiKey,\n authToken: clientOptions.authToken,\n baseUrl: clientOptions.baseUrl ?? XMAX_OPEN_API_PRODUCTION_BASE_URL,\n onError: clientOptions.onError,\n })\n\n const rtc = new RtcManager({\n onLog: (entry) => clientOptions.onLog?.({ scope: 'rtc', ...entry }),\n onRemoteSeiReceived: clientOptions.onRemoteSei,\n onSeiGateChange: clientOptions.onSeiGateChange,\n i18n: sdkI18n,\n })\n\n const createdSession = await client.createSession(modelName)\n const sessionUid = createdSession.sessionUid?.trim()\n if (!sessionUid) {\n throw new Error('Session uid is missing')\n }\n\n const joinInfo = client.getRtcJoinInfo(createdSession)\n await rtc.join(joinInfo)\n\n const handle = new RealtimePrewarmHandle(client, rtc, sessionUid, modelName)\n\n client.startHeartbeat(\n sessionUid,\n clientOptions.heartbeatIntervalMs ?? 10_000,\n (heartbeatSession) => {\n if (heartbeatSession.status !== ACTIVE_STATUS) {\n void handle.cancel()\n }\n },\n () => {\n void handle.cancel()\n },\n )\n\n return handle\n }\n\n consume(expectedModelName: string): PrewarmedRoomResources | null {\n const normalized = expectedModelName.trim()\n if (this.consumed || this.disposed || !normalized || this.modelName !== normalized) {\n return null\n }\n\n this.consumed = true\n return {\n client: this.client,\n rtc: this.rtc,\n sessionUid: this.sessionUid,\n }\n }\n\n async cancel(): Promise<void> {\n if (this.consumed || this.disposed) {\n return\n }\n\n this.disposed = true\n this.client.beginTeardown()\n try {\n await this.client.closeSession(this.sessionUid)\n } catch {\n }\n try {\n await this.rtc.leave()\n } catch {\n }\n this.client.endTeardown()\n }\n}\n","import {\n ACTIVE_STATUS,\n XmaxOpenClient,\n XMAX_OPEN_API_PRODUCTION_BASE_URL,\n} from '../sdk/client'\nimport {\n createStartRtcRoomEvent,\n createStopRtcRoomEvent,\n createTaskUid,\n createTracksRtcRoomEvent,\n} from '../sdk/rtc-events'\nimport { RtcManager } from '../rtc/rtc-manager'\nimport { createNativeCameraStream, type NativeCameraStream } from '../rtc/camera-stream-v2'\nimport { createDragTrackController, type DragTrackController } from '../drag/drag-track-controller'\nimport { createRemoteViewHost, type RemoteViewHost } from '../drag/remote-view-host'\nimport { createSDKI18n } from '../i18n'\nimport { notifyError } from '../shared/error-utils'\nimport { resolveRefImageUrl } from '../shared/ref-image'\nimport { DEFAULT_SESSION_TARGET_SIZE, resolveSessionTargetSize, resolveUploadVideoSize } from '../shared/reference-video-size'\nimport {\n resolveInitialRefImage,\n resolveGenerationModel,\n resolvePromptText,\n shouldAutoStartOnConnect,\n} from './initial-state'\nimport { shouldMirrorInput } from './mirror'\nimport { resolveRtcPublishFps } from '../rtc/publish-fps'\nimport { RealtimePrewarmHandle, type PrewarmedRoomResources } from './prewarm'\nimport type {\n RealtimeConnectOptions,\n RealtimeDisconnectOptions,\n RealtimePromptState,\n RealtimeRestartOptions,\n RealtimeSetImageOptions,\n RealtimeSetInput,\n XmaxClientOptions,\n XmaxRealtimeSession,\n} from './types'\n\nfunction resolvePromptInput(prompt?: string | RealtimePromptState): string {\n if (typeof prompt === 'string') {\n return prompt.trim()\n }\n return prompt?.text?.trim() ?? ''\n}\n\nfunction resolveRefImagePath(refImage?: string | null): string | undefined {\n const trimmed = refImage?.trim()\n return trimmed || undefined\n}\n\nfunction getVideoTrack(stream: MediaStream): MediaStreamTrack {\n const track = stream.getVideoTracks()[0]\n if (!track) {\n throw new Error('Missing video track in MediaStream')\n }\n return track\n}\n\nfunction readVideoSize(track: MediaStreamTrack): { width: number; height: number } | null {\n const settings = track.getSettings?.()\n if (typeof settings?.width === 'number' && settings.width > 0 &&\n typeof settings?.height === 'number' && settings.height > 0) {\n return { width: settings.width, height: settings.height }\n }\n return null\n}\n\nexport class RealtimeSession implements XmaxRealtimeSession {\n private readonly client: XmaxOpenClient\n private readonly rtc: RtcManager\n private readonly reportError: (error: unknown, fallbackMessage?: string) => never\n private readonly remoteElement: HTMLElement | null\n private readonly onRemoteStream?: (stream: MediaStream) => void\n private readonly onPublishPipelineWaitChange?: (waiting: boolean) => void\n\n private sessionUid: string | null = null\n private taskUid: string | null = null\n private localVideoSize: { width: number; height: number } | null = null\n private currentPrompt = ''\n private currentGenerationModel = ''\n private disconnected = false\n private remoteViewHost: RemoteViewHost | null = null\n private dragController: DragTrackController | null = null\n private dragTrackFitMode: 'contain' | 'cover' = 'cover'\n private sessionTargetSize: [number, number] | null = null\n private sessionSizeOverride: [number, number] | undefined\n private mirroredInputStream: NativeCameraStream | null = null\n private hiddenRemoteElement: HTMLElement | null = null\n private remoteStreamNotifyTimer: ReturnType<typeof setInterval> | null = null\n private lastNotifiedRemoteStream: MediaStream | null = null\n private dragOption: boolean | undefined = undefined\n\n constructor(\n client: XmaxOpenClient,\n rtc: RtcManager,\n reportError: (error: unknown, fallbackMessage?: string) => never,\n options: Pick<RealtimeConnectOptions, 'remoteElement' | 'onRemoteStream' | 'drag'>,\n clientOptions?: Pick<XmaxClientOptions, 'onPublishPipelineWaitChange'>,\n ) {\n this.client = client\n this.rtc = rtc\n this.reportError = reportError\n this.onRemoteStream = options.onRemoteStream\n this.onPublishPipelineWaitChange = clientOptions?.onPublishPipelineWaitChange\n\n if (options.remoteElement) {\n this.remoteElement = options.remoteElement\n if (options.drag !== false) {\n this.remoteViewHost = createRemoteViewHost(this.remoteElement)\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 this.rtc.setOnRemotePlayerMounted(() => {\n this.scheduleNotifyRemoteStream()\n })\n return\n }\n\n this.remoteElement = null\n }\n\n private get remoteVideoContainer(): HTMLElement | null {\n return this.remoteViewHost?.videoHost ?? this.remoteElement\n }\n\n static async connect(\n stream: MediaStream,\n options: RealtimeConnectOptions,\n clientOptions: XmaxClientOptions,\n ): Promise<RealtimeSession> {\n const sdkI18n = createSDKI18n({})\n const notifyUserError = clientOptions.onError\n const reportError = (error: unknown, fallbackMessage?: string): never => {\n throw notifyError(error, notifyUserError, fallbackMessage ?? sdkI18n.t('errors.requestFailed'))\n }\n\n const modelName = options.model.name.trim()\n const prewarmed = options.prewarmed instanceof RealtimePrewarmHandle\n ? options.prewarmed.consume(modelName)\n : null\n\n const client = prewarmed?.client ?? new XmaxOpenClient({\n apiKey: clientOptions.apiKey,\n authToken: clientOptions.authToken,\n baseUrl: clientOptions.baseUrl ?? XMAX_OPEN_API_PRODUCTION_BASE_URL,\n onError: notifyUserError,\n })\n\n const rtc = prewarmed?.rtc ?? new RtcManager({\n onLog: (entry) => clientOptions.onLog?.({ scope: 'rtc', ...entry }),\n onRemoteSeiReceived: clientOptions.onRemoteSei,\n onSeiGateChange: clientOptions.onSeiGateChange,\n i18n: sdkI18n,\n })\n\n const session = new RealtimeSession(client, rtc, reportError, options, clientOptions)\n\n try {\n await session.bootstrap(stream, options, clientOptions.heartbeatIntervalMs ?? 10_000, prewarmed)\n return session\n } catch (error) {\n await session.safeDisconnect()\n throw reportError(error)\n }\n }\n\n private async bootstrap(\n stream: MediaStream,\n options: RealtimeConnectOptions,\n heartbeatIntervalMs: number,\n prewarmed: PrewarmedRoomResources | null = null,\n ): Promise<void> {\n this.dragOption = options.drag\n\n const modelName = options.model.name.trim()\n if (!modelName) {\n throw new Error('model.name is required')\n }\n\n if (prewarmed) {\n this.sessionUid = prewarmed.sessionUid\n } else {\n const createdSession = await this.client.createSession(modelName)\n if (!createdSession.sessionUid?.trim()) {\n throw new Error('Session uid is missing')\n }\n\n this.sessionUid = createdSession.sessionUid\n this.client.startHeartbeat(\n createdSession.sessionUid,\n heartbeatIntervalMs,\n (heartbeatSession) => {\n if (heartbeatSession.status !== ACTIVE_STATUS) {\n void this.safeDisconnect()\n }\n },\n () => {\n void this.safeDisconnect()\n },\n )\n\n const joinInfo = this.client.getRtcJoinInfo(createdSession)\n await this.rtc.join(joinInfo)\n }\n\n if (options.localElement) {\n this.rtc.setLocalVideoContainer(options.localElement)\n }\n\n if (this.remoteVideoContainer) {\n this.rtc.setRemoteVideoContainer(this.remoteVideoContainer)\n }\n\n this.sessionSizeOverride = options.size\n\n const videoTrack = getVideoTrack(stream)\n const isFileInput = options.inputKind === 'file'\n this.dragTrackFitMode = isFileInput ? 'contain' : 'cover'\n const rawVideoSize = readVideoSize(videoTrack)\n const publishSize: [number, number] = options.size\n ?? (rawVideoSize\n ? resolveUploadVideoSize(rawVideoSize.width, rawVideoSize.height)\n : DEFAULT_SESSION_TARGET_SIZE)\n\n let publishTrack = videoTrack\n if (isFileInput) {\n if (options.size) {\n this.localVideoSize = { width: options.size[0], height: options.size[1] }\n } else if (rawVideoSize) {\n this.localVideoSize = { width: rawVideoSize.width, height: rawVideoSize.height }\n } else {\n this.localVideoSize = null\n }\n } else if (options.prebuiltCameraStream) {\n this.mirroredInputStream = options.prebuiltCameraStream\n publishTrack = options.prebuiltCameraStream.videoTrack\n this.localVideoSize = {\n width: options.prebuiltCameraStream.width,\n height: options.prebuiltCameraStream.height,\n }\n } else {\n const processedStream = await createNativeCameraStream(stream)\n this.mirroredInputStream = processedStream\n publishTrack = processedStream.videoTrack\n this.localVideoSize = { width: processedStream.width, height: processedStream.height }\n }\n\n const initialState = options.initialState\n this.currentPrompt = resolvePromptText(initialState?.prompt)\n this.currentGenerationModel = resolveGenerationModel(initialState?.model)\n\n const publishFpsOptions = {\n mobile: options.mobile,\n highQuality: true as const,\n fps: isFileInput\n ? options.model.fps\n : resolveRtcPublishFps({ mobile: options.mobile }),\n }\n\n // Publish before ref upload so RTC outbound warms while ref image uploads.\n await this.rtc.startExternalVideoPublishing(publishTrack, publishSize, publishFpsOptions)\n\n let initialRefImageUrl: string | undefined\n const initialRefImage = resolveInitialRefImage(initialState)\n if (initialRefImage) {\n initialRefImageUrl = await resolveRefImageUrl(this.client, initialRefImage)\n } else if (initialState?.image instanceof File) {\n initialRefImageUrl = await resolveRefImageUrl(this.client, initialState.image)\n } else if (initialState?.image instanceof Blob) {\n const mime = initialState.image.type || 'image/png'\n const file = new File([initialState.image], 'ref-image', { type: mime })\n initialRefImageUrl = await resolveRefImageUrl(this.client, file)\n }\n\n if (options.localElement) {\n queueMicrotask(() => this.refreshLocalPreview())\n }\n\n if (shouldAutoStartOnConnect(initialState)) {\n // static_* are never cached — only included when Instant passes them on this start.\n await this.runStart({\n prompt: this.currentPrompt || undefined,\n model: this.currentGenerationModel || undefined,\n size: options.size,\n refImage: initialRefImageUrl,\n staticGenerate: initialState?.staticGenerate,\n staticImagePath: initialState?.staticImagePath?.trim() || undefined,\n })\n }\n }\n\n async setPrompt(\n prompt: string | RealtimePromptState,\n _options?: { enhance?: boolean },\n ): Promise<void> {\n try {\n const promptText = resolvePromptInput(prompt)\n this.currentPrompt = promptText\n if (!this.taskUid) {\n await this.runStart({\n prompt: promptText || undefined,\n })\n return\n }\n await this.restart({ prompt: promptText })\n } catch (error) {\n this.reportError(error)\n }\n }\n\n async set(input: RealtimeSetInput): Promise<void> {\n try {\n let refImage: string | undefined\n if (input.image === null) {\n refImage = undefined\n } else if (input.image !== undefined) {\n refImage = await this.setRefImage(input.image as File | string)\n }\n\n const prompt = input.prompt !== undefined ? resolvePromptInput(input.prompt) : undefined\n if (prompt !== undefined) {\n this.currentPrompt = prompt\n }\n\n await this.restart({\n prompt,\n refImage,\n })\n } catch (error) {\n this.reportError(error)\n }\n }\n\n async setImage(\n image: string | File | Blob,\n options?: RealtimeSetImageOptions,\n ): Promise<void> {\n try {\n const refImage = await this.setRefImage(image as File | string)\n const prompt = options?.prompt ? resolvePromptInput(options.prompt) : undefined\n if (prompt !== undefined) {\n this.currentPrompt = prompt\n }\n await this.restart({\n prompt,\n refImage,\n })\n } catch (error) {\n this.reportError(error)\n }\n }\n\n async setRefImage(input: File | string): Promise<string> {\n try {\n const resolved = await resolveRefImageUrl(this.client, input)\n return resolved\n } catch (error) {\n this.reportError(error)\n }\n }\n\n async restart(options?: RealtimeRestartOptions): Promise<void> {\n try {\n let resolvedRefImage: string | undefined\n if (options && 'refImage' in options) {\n const ref = options.refImage\n if (ref === null || ref === '') {\n resolvedRefImage = undefined\n } else if (typeof ref === 'string' && ref.trim()) {\n resolvedRefImage = await this.setRefImage(ref.trim())\n }\n }\n\n if (options?.prompt !== undefined) {\n this.currentPrompt = options.prompt.trim()\n }\n if (options?.model !== undefined) {\n this.currentGenerationModel = resolveGenerationModel(options.model)\n }\n\n // static_* are never cached — only sent when the caller passes them (Instant only).\n await this.runStart({\n prompt: this.currentPrompt || undefined,\n model: this.currentGenerationModel || undefined,\n size: options?.size,\n refImage: resolvedRefImage,\n staticGenerate: options?.staticGenerate === true ? true : undefined,\n staticImagePath: options?.staticImagePath?.trim() || undefined,\n preserveRemoteOutput: options?.preserveRemoteOutput,\n })\n } catch (error) {\n this.reportError(error)\n }\n }\n\n async setMode(options?: RealtimeRestartOptions): Promise<void> {\n return this.restart(options)\n }\n\n async refreshRemoteOutput(options?: { force?: boolean }): Promise<void> {\n if (!this.remoteVideoContainer) {\n return\n }\n this.rtc.setRemoteVideoContainer(this.remoteVideoContainer)\n await this.rtc.refreshRemoteVideoBinding(options)\n this.scheduleNotifyRemoteStream()\n }\n\n refreshLocalPreview(): void {\n this.rtc.refreshLocalVideoPreview()\n }\n\n getInputPreviewStream(): MediaStream | null {\n return this.mirroredInputStream?.previewStream ?? null\n }\n\n detachRemoteOutput(): void {\n this.rtc.setRemoteVideoContainer(null)\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 for live interaction.\n }\n }\n\n async stop(options?: { preserveRemoteDom?: boolean }): Promise<void> {\n this.updateDragController(false)\n\n const preserveRemoteDom = options?.preserveRemoteDom ?? false\n if (preserveRemoteDom) {\n this.rtc.setPreserveRemoteDom(true)\n }\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 if (preserveRemoteDom) {\n this.rtc.setPreserveRemoteDom(false)\n }\n return\n }\n\n try {\n await this.rtc.sendRoomEvent(\n createStopRtcRoomEvent({\n userId: this.rtc.snapshot.userId ?? undefined,\n sessionUid: this.taskUid ?? undefined,\n }),\n )\n } finally {\n this.rtc.clearRemoteVideo({ preserveDom: preserveRemoteDom })\n if (!preserveRemoteDom && this.remoteVideoContainer) {\n this.rtc.setRemoteVideoContainer(null)\n }\n this.taskUid = null\n if (preserveRemoteDom) {\n this.rtc.setPreserveRemoteDom(false)\n }\n }\n }\n\n async disconnect(options?: RealtimeDisconnectOptions): Promise<void> {\n if (this.disconnected) {\n return\n }\n this.disconnected = true\n await this.safeDisconnect(options)\n }\n\n getSessionUid(): string | null {\n return this.sessionUid\n }\n\n private async runStart(options: {\n prompt?: string\n model?: string\n size?: [number, number]\n refImage?: string\n staticGenerate?: boolean\n staticImagePath?: string\n preserveRemoteOutput?: boolean\n }): Promise<void> {\n if (!this.rtc.snapshot.joined) {\n return\n }\n\n const preserveRemoteOutput = options.preserveRemoteOutput ?? false\n if (preserveRemoteOutput) {\n this.rtc.setPreserveRemoteDom(true)\n }\n\n const startPrompt = options.prompt?.trim() ?? this.currentPrompt\n if (options.model !== undefined) {\n this.currentGenerationModel = resolveGenerationModel(options.model)\n }\n\n const modelLabel = resolveGenerationModel(this.currentGenerationModel)\n\n await this.rtc.ensurePublishedInputBeforeStart()\n\n if (!preserveRemoteOutput) {\n this.rtc.setRemoteVideoContainer(null)\n this.rtc.clearRemoteVideo()\n }\n\n const size = resolveSessionTargetSize({\n localVideoSize: this.localVideoSize,\n overrideSize: options.size ?? this.sessionSizeOverride,\n })\n this.sessionTargetSize = size\n\n const taskUid = createTaskUid()\n this.taskUid = taskUid\n\n this.rtc.configureSessionSei(taskUid)\n\n try {\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: modelLabel,\n size,\n prompt: startPrompt,\n refImagePath: resolveRefImagePath(options.refImage),\n // Never reuse prior start — caller must pass Instant fields each time.\n staticGenerate: options.staticGenerate === true ? true : undefined,\n staticImagePath: options.staticImagePath?.trim() || undefined,\n })\n\n\n await this.rtc.sendRoomEvent(startRoomEvent)\n\n await this.rtc.refreshRemoteVideoBinding({ force: !preserveRemoteOutput })\n this.updateDragController(true)\n this.scheduleNotifyRemoteStream()\n } catch (error) {\n this.rtc.configureSessionSei(null)\n throw error\n } finally {\n if (preserveRemoteOutput) {\n this.rtc.setPreserveRemoteDom(false)\n }\n }\n }\n\n private isDragEnabled(): boolean {\n if (this.dragOption === false) {\n return false\n }\n if (this.dragOption === true) {\n return true\n }\n return 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 = this.sessionTargetSize ?? DEFAULT_SESSION_TARGET_SIZE\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 const media = this.remoteViewHost?.videoHost?.querySelector('video, canvas') as HTMLElement | null\n const mediaRect = media?.getBoundingClientRect()\n const dragRect = dragHost.getBoundingClientRect()\n console.log('[Xmax] sendTracks', {\n taskUid: this.taskUid,\n targetSize: this.sessionTargetSize,\n fitMode: this.dragTrackFitMode,\n tracks,\n dragRect: dragRect ? { w: dragRect.width, h: dragRect.height } : null,\n mediaRect: mediaRect ? { w: mediaRect.width, h: mediaRect.height, l: mediaRect.left, t: mediaRect.top } : null,\n })\n void this.sendTracks(tracks)\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 async safeDisconnect(options?: RealtimeDisconnectOptions): Promise<void> {\n this.clearRemoteStreamNotifyTimer()\n this.lastNotifiedRemoteStream = null\n const activeSessionUid = this.sessionUid\n this.sessionUid = null\n\n this.client.beginTeardown()\n\n if (activeSessionUid) {\n try {\n await this.client.closeSession(activeSessionUid)\n } catch {\n }\n }\n\n const generationActive = !!this.taskUid && this.rtc.snapshot.joined\n try {\n if (generationActive) {\n await this.stop()\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 {\n }\n\n try {\n if (this.rtc.snapshot.joined) {\n await this.rtc.stopVideoPublishing()\n }\n } catch {\n }\n\n try {\n if (this.rtc.snapshot.joined) {\n await this.rtc.leave()\n }\n } catch {\n }\n\n this.client.endTeardown()\n\n this.taskUid = null\n this.currentPrompt = ''\n this.currentGenerationModel = ''\n this.sessionTargetSize = null\n this.dragController?.destroy()\n this.dragController = null\n this.mirroredInputStream?.destroy()\n this.mirroredInputStream = null\n\n if (this.hiddenRemoteElement) {\n this.hiddenRemoteElement.remove()\n this.hiddenRemoteElement = null\n }\n }\n}\n","import { XMAX_OPEN_API_PRODUCTION_BASE_URL, XmaxOpenClient } from '../sdk/client'\nimport { RealtimeSession } from './session'\nimport { RealtimePrewarmHandle } from './prewarm'\nimport type { RealtimeConnectOptions, XmaxClient, XmaxClientOptions } from './types'\n\nfunction resolveClientOptions(options: XmaxClientOptions): Required<Pick<XmaxClientOptions, 'baseUrl'>> & XmaxClientOptions {\n return {\n ...options,\n baseUrl: options.baseUrl?.trim() || XMAX_OPEN_API_PRODUCTION_BASE_URL,\n }\n}\n\nexport function createXmaxClient(options: XmaxClientOptions): XmaxClient {\n const resolved = resolveClientOptions(options)\n const httpClient = new XmaxOpenClient({\n apiKey: resolved.apiKey,\n authToken: resolved.authToken,\n baseUrl: resolved.baseUrl,\n onError: resolved.onError,\n })\n\n return {\n files: {\n uploadImage: (file: File) => httpClient.uploadImage(file),\n uploadVideo: (file: File) => httpClient.uploadVideo(file),\n upload: (file: File) => httpClient.uploadImage(file),\n },\n realtime: {\n prewarm: (options: { model: RealtimeConnectOptions['model'] }) =>\n RealtimePrewarmHandle.create(options.model, resolved),\n connect: (stream: MediaStream, connectOptions: RealtimeConnectOptions) =>\n RealtimeSession.connect(stream, connectOptions, resolved),\n },\n }\n}\n\nexport type {\n RealtimeConnectOptions,\n RealtimeInitialState,\n RealtimeModel,\n RealtimePromptState,\n RealtimeRestartOptions,\n RealtimeSetImageOptions,\n RealtimeSetInput,\n RealtimeSetModeOptions,\n SeiGateState,\n XmaxClient,\n XmaxClientFiles,\n XmaxClientOptions,\n XmaxRealtimeSession,\n} from './types'\n\nexport { models } from './models'\nexport { RealtimeSession } from './session'\nexport { RealtimePrewarmHandle } from './prewarm'\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 (h-full w-auto). 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 app-layer drag overlay to the painted RTC media region (xmax-open-sdk track surface). */\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 an app-layer 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"]}
@@ -547,7 +547,8 @@ var XmaxOpenClient = class {
547
547
  return p.data;
548
548
  }
549
549
  const mappedMessage = resolveApiErrorMessage(p.code, this.i18n.locale);
550
- const errorMessage = mappedMessage ?? this.i18n.t("errors.requestRetry");
550
+ const backendMessage = typeof p.message === "string" && p.message.trim() ? p.message.trim() : void 0;
551
+ const errorMessage = mappedMessage ?? backendMessage ?? this.i18n.t("errors.requestRetry");
551
552
  throw new Error(errorMessage);
552
553
  } catch (error) {
553
554
  if (this.isAbortError(error)) {
@@ -699,6 +700,7 @@ function createStartRtcRoomEvent(input) {
699
700
  const resolvedPrompt = input.prompt?.trim() ?? "";
700
701
  const refImagePath = input.refImagePath?.trim() || input.refImage?.trim() || void 0;
701
702
  const useRefImage = !!refImagePath;
703
+ const staticImagePath = input.staticImagePath?.trim() || void 0;
702
704
  return {
703
705
  event: "start",
704
706
  user_id: input.userId?.trim() || void 0,
@@ -710,7 +712,9 @@ function createStartRtcRoomEvent(input) {
710
712
  prompt: resolvedPrompt,
711
713
  ref_image_path: useRefImage ? refImagePath : void 0,
712
714
  ref_image: useRefImage ? refImagePath : void 0,
713
- static_generate: input.staticGenerate === void 0 ? void 0 : input.staticGenerate,
715
+ // Instant-only omit when false/undefined so non-instant starts never carry leftover flags.
716
+ static_generate: input.staticGenerate === true ? true : void 0,
717
+ static_image_path: staticImagePath,
714
718
  ...input.extraParams ?? {}
715
719
  }
716
720
  };
@@ -1035,7 +1039,7 @@ var _RtcManager = class _RtcManager {
1035
1039
  this.lastRemoteSei = null;
1036
1040
  this.lastRemoteSeiUserId = null;
1037
1041
  this.hasLoggedSeiSendFailure = false;
1038
- if (previousExpectedRemoteSei !== this.expectedRemoteSei && this.remoteVideoUserId) {
1042
+ if (previousExpectedRemoteSei !== this.expectedRemoteSei && this.remoteVideoUserId && !this.preserveRemoteDom) {
1039
1043
  this.pendingRemoteVideoUserId = this.remoteVideoUserId;
1040
1044
  this.remoteVideoUserId = null;
1041
1045
  }
@@ -2538,6 +2542,7 @@ function drawNeon(ctx, segs, container, targetSize, dpr, fitMode, mirrored) {
2538
2542
  }
2539
2543
  var DragTrackController = class {
2540
2544
  constructor(container, options) {
2545
+ this.strokeActive = false;
2541
2546
  this.activePointers = /* @__PURE__ */ new Map();
2542
2547
  this.lastTargetPoints = /* @__PURE__ */ new Map();
2543
2548
  this.segQueue = [];
@@ -2547,6 +2552,8 @@ var DragTrackController = class {
2547
2552
  this.resizeObserver = null;
2548
2553
  this.container = container;
2549
2554
  this.onTracks = options.onTracks;
2555
+ this.onStrokeStart = options.onStrokeStart;
2556
+ this.onStrokeEnd = options.onStrokeEnd;
2550
2557
  this.targetSize = options.targetSize;
2551
2558
  this.fitMode = options.fitMode ?? "cover";
2552
2559
  this.mirrored = options.mirrored ?? false;
@@ -2717,11 +2724,17 @@ var DragTrackController = class {
2717
2724
  this.flushTracks();
2718
2725
  }, 30);
2719
2726
  }
2720
- finishStroke() {
2727
+ finishStroke(emitEnd = false) {
2728
+ const wasActive = this.strokeActive;
2729
+ this.strokeActive = false;
2721
2730
  this.stopSampling();
2722
2731
  this.stopDrawLoop();
2723
2732
  this.segQueue.length = 0;
2724
2733
  this.clearCanvas();
2734
+ if (emitEnd && wasActive && this.onStrokeEnd) {
2735
+ Promise.resolve(this.onStrokeEnd()).catch(() => {
2736
+ });
2737
+ }
2725
2738
  }
2726
2739
  handlePointerDown(e) {
2727
2740
  if (!this.enabled) {
@@ -2745,6 +2758,12 @@ var DragTrackController = class {
2745
2758
  if (targetPoint) {
2746
2759
  this.lastTargetPoints.set(e.pointerId, targetPoint);
2747
2760
  }
2761
+ const strokeWasActive = this.strokeActive;
2762
+ this.strokeActive = true;
2763
+ if (!strokeWasActive && this.onStrokeStart) {
2764
+ Promise.resolve(this.onStrokeStart()).catch(() => {
2765
+ });
2766
+ }
2748
2767
  this.startDrawLoop();
2749
2768
  this.startSampling();
2750
2769
  }
@@ -2777,7 +2796,7 @@ var DragTrackController = class {
2777
2796
  } catch {
2778
2797
  }
2779
2798
  if (this.activePointers.size === 0) {
2780
- this.finishStroke();
2799
+ this.finishStroke(true);
2781
2800
  }
2782
2801
  }
2783
2802
  handlePointerCancel(e) {
@@ -2787,7 +2806,7 @@ var DragTrackController = class {
2787
2806
  this.activePointers.delete(e.pointerId);
2788
2807
  this.lastTargetPoints.delete(e.pointerId);
2789
2808
  if (this.activePointers.size === 0) {
2790
- this.finishStroke();
2809
+ this.finishStroke(true);
2791
2810
  }
2792
2811
  }
2793
2812
  };
@@ -3036,7 +3055,6 @@ var RealtimeSession = class _RealtimeSession {
3036
3055
  this.localVideoSize = null;
3037
3056
  this.currentPrompt = "";
3038
3057
  this.currentGenerationModel = "";
3039
- this.currentStaticGenerate = void 0;
3040
3058
  this.disconnected = false;
3041
3059
  this.remoteViewHost = null;
3042
3060
  this.dragController = null;
@@ -3172,7 +3190,6 @@ var RealtimeSession = class _RealtimeSession {
3172
3190
  const initialState = options.initialState;
3173
3191
  this.currentPrompt = resolvePromptText(initialState?.prompt);
3174
3192
  this.currentGenerationModel = resolveGenerationModel(initialState?.model);
3175
- this.currentStaticGenerate = initialState?.staticGenerate;
3176
3193
  const publishFpsOptions = {
3177
3194
  mobile: options.mobile,
3178
3195
  highQuality: true,
@@ -3199,7 +3216,8 @@ var RealtimeSession = class _RealtimeSession {
3199
3216
  model: this.currentGenerationModel || void 0,
3200
3217
  size: options.size,
3201
3218
  refImage: initialRefImageUrl,
3202
- staticGenerate: this.currentStaticGenerate
3219
+ staticGenerate: initialState?.staticGenerate,
3220
+ staticImagePath: initialState?.staticImagePath?.trim() || void 0
3203
3221
  });
3204
3222
  }
3205
3223
  }
@@ -3278,15 +3296,14 @@ var RealtimeSession = class _RealtimeSession {
3278
3296
  if (options?.model !== void 0) {
3279
3297
  this.currentGenerationModel = resolveGenerationModel(options.model);
3280
3298
  }
3281
- if (options?.staticGenerate !== void 0) {
3282
- this.currentStaticGenerate = options.staticGenerate;
3283
- }
3284
3299
  await this.runStart({
3285
3300
  prompt: this.currentPrompt || void 0,
3286
3301
  model: this.currentGenerationModel || void 0,
3287
3302
  size: options?.size,
3288
3303
  refImage: resolvedRefImage,
3289
- staticGenerate: this.currentStaticGenerate
3304
+ staticGenerate: options?.staticGenerate === true ? true : void 0,
3305
+ staticImagePath: options?.staticImagePath?.trim() || void 0,
3306
+ preserveRemoteOutput: options?.preserveRemoteOutput
3290
3307
  });
3291
3308
  } catch (error) {
3292
3309
  this.reportError(error);
@@ -3377,17 +3394,20 @@ var RealtimeSession = class _RealtimeSession {
3377
3394
  if (!this.rtc.snapshot.joined) {
3378
3395
  return;
3379
3396
  }
3397
+ const preserveRemoteOutput = options.preserveRemoteOutput ?? false;
3398
+ if (preserveRemoteOutput) {
3399
+ this.rtc.setPreserveRemoteDom(true);
3400
+ }
3380
3401
  const startPrompt = options.prompt?.trim() ?? this.currentPrompt;
3381
3402
  if (options.model !== void 0) {
3382
3403
  this.currentGenerationModel = resolveGenerationModel(options.model);
3383
3404
  }
3384
- if (options.staticGenerate !== void 0) {
3385
- this.currentStaticGenerate = options.staticGenerate;
3386
- }
3387
3405
  const modelLabel = resolveGenerationModel(this.currentGenerationModel);
3388
3406
  await this.rtc.ensurePublishedInputBeforeStart();
3389
- this.rtc.setRemoteVideoContainer(null);
3390
- this.rtc.clearRemoteVideo();
3407
+ if (!preserveRemoteOutput) {
3408
+ this.rtc.setRemoteVideoContainer(null);
3409
+ this.rtc.clearRemoteVideo();
3410
+ }
3391
3411
  const size = resolveSessionTargetSize({
3392
3412
  localVideoSize: this.localVideoSize,
3393
3413
  overrideSize: options.size ?? this.sessionSizeOverride
@@ -3408,16 +3428,21 @@ var RealtimeSession = class _RealtimeSession {
3408
3428
  size,
3409
3429
  prompt: startPrompt,
3410
3430
  refImagePath: resolveRefImagePath(options.refImage),
3411
- staticGenerate: this.currentStaticGenerate
3431
+ // Never reuse prior start — caller must pass Instant fields each time.
3432
+ staticGenerate: options.staticGenerate === true ? true : void 0,
3433
+ staticImagePath: options.staticImagePath?.trim() || void 0
3412
3434
  });
3413
- console.log("[Xmax SDK] \u771F\u5B9E\u53D1\u9001 start ->", startRoomEvent);
3414
3435
  await this.rtc.sendRoomEvent(startRoomEvent);
3415
- await this.rtc.refreshRemoteVideoBinding({ force: true });
3436
+ await this.rtc.refreshRemoteVideoBinding({ force: !preserveRemoteOutput });
3416
3437
  this.updateDragController(true);
3417
3438
  this.scheduleNotifyRemoteStream();
3418
3439
  } catch (error) {
3419
3440
  this.rtc.configureSessionSei(null);
3420
3441
  throw error;
3442
+ } finally {
3443
+ if (preserveRemoteOutput) {
3444
+ this.rtc.setPreserveRemoteDom(false);
3445
+ }
3421
3446
  }
3422
3447
  }
3423
3448
  isDragEnabled() {
@@ -3544,7 +3569,6 @@ var RealtimeSession = class _RealtimeSession {
3544
3569
  this.taskUid = null;
3545
3570
  this.currentPrompt = "";
3546
3571
  this.currentGenerationModel = "";
3547
- this.currentStaticGenerate = void 0;
3548
3572
  this.sessionTargetSize = null;
3549
3573
  this.dragController?.destroy();
3550
3574
  this.dragController = null;