@mcp-use/client 2.0.0-beta.4 → 2.0.0-beta.5

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.
@@ -1473,7 +1473,7 @@ var HttpConnector = class extends BaseConnector {
1473
1473
  };
1474
1474
 
1475
1475
  // src/utils/version.ts
1476
- var VERSION = "2.0.0-beta.3";
1476
+ var VERSION = "2.0.0-beta.4";
1477
1477
  function getPackageVersion() {
1478
1478
  return VERSION;
1479
1479
  }
@@ -2370,62 +2370,6 @@ async function telFetch(url, init) {
2370
2370
  }
2371
2371
  var POSTHOG_HOST = "https://eu.i.posthog.com";
2372
2372
  var POSTHOG_API_KEY = "phc_lyTtbYwvkdSbrcMQNPiKiiRWrrM1seyKIMjycSvItEI";
2373
- var SCARF_GATEWAY_URL = "https://mcpuse.gateway.scarf.sh/events-ts";
2374
- var SCARF_GATEWAY_BEACON_URL = "https://mcpuse.gateway.scarf.sh/simple/";
2375
- var SCARF_BEACON_MAX_URL = 1800;
2376
- var SCARF_BEACON_TRUNCATED_KEYS = /* @__PURE__ */ new Set(["query", "response", "messages"]);
2377
- function stringifyScarfValue(value) {
2378
- if (value === null || value === void 0) return "";
2379
- if (typeof value === "string") return value;
2380
- if (typeof value === "number" || typeof value === "boolean") {
2381
- return String(value);
2382
- }
2383
- try {
2384
- return JSON.stringify(value);
2385
- } catch {
2386
- return String(value);
2387
- }
2388
- }
2389
- function buildScarfBeaconUrl(properties, baseUrl = SCARF_GATEWAY_BEACON_URL) {
2390
- const params = new URLSearchParams();
2391
- for (const [key, value] of Object.entries(properties)) {
2392
- let serialized = stringifyScarfValue(value);
2393
- if (SCARF_BEACON_TRUNCATED_KEYS.has(key) && serialized.length > 120) {
2394
- serialized = `${serialized.slice(0, 117)}...`;
2395
- }
2396
- if (serialized !== "") params.set(key, serialized);
2397
- }
2398
- let url = `${baseUrl}${baseUrl.includes("?") ? "&" : "?"}${params.toString()}`;
2399
- if (url.length <= SCARF_BEACON_MAX_URL) return url;
2400
- const keys = [...params.keys()].sort(
2401
- (a, b) => (params.get(b)?.length ?? 0) - (params.get(a)?.length ?? 0)
2402
- );
2403
- for (const key of keys) {
2404
- if (url.length <= SCARF_BEACON_MAX_URL) break;
2405
- if (key === "event" || key === "user_id") continue;
2406
- params.delete(key);
2407
- url = `${baseUrl}${baseUrl.includes("?") ? "&" : "?"}${params.toString()}`;
2408
- }
2409
- return url.slice(0, SCARF_BEACON_MAX_URL);
2410
- }
2411
- function captureScarfPost(properties, endpoint) {
2412
- return telFetch(endpoint, {
2413
- method: "POST",
2414
- headers: { "Content-Type": "application/json" },
2415
- keepalive: true,
2416
- body: JSON.stringify(properties)
2417
- });
2418
- }
2419
- function captureScarfBeacon(properties, endpoint) {
2420
- try {
2421
- const url = buildScarfBeaconUrl(properties, endpoint);
2422
- const img = new Image();
2423
- img.referrerPolicy = "no-referrer-when-downgrade";
2424
- img.src = url;
2425
- } catch {
2426
- }
2427
- return Promise.resolve();
2428
- }
2429
2373
  function capturePostHog(params) {
2430
2374
  const host = params.host ?? POSTHOG_HOST;
2431
2375
  const apiKey = params.apiKey ?? POSTHOG_API_KEY;
@@ -2442,13 +2386,6 @@ function capturePostHog(params) {
2442
2386
  })
2443
2387
  });
2444
2388
  }
2445
- function captureScarf(properties, endpoint = SCARF_GATEWAY_URL) {
2446
- if (typeof window !== "undefined") {
2447
- const beaconEndpoint = endpoint === SCARF_GATEWAY_URL ? SCARF_GATEWAY_BEACON_URL : endpoint;
2448
- return captureScarfBeacon(properties, beaconEndpoint);
2449
- }
2450
- return captureScarfPost(properties, endpoint);
2451
- }
2452
2389
 
2453
2390
  // src/telemetry/telemetry.ts
2454
2391
  function generateUUID() {
@@ -2459,18 +2396,6 @@ function secureRandomString() {
2459
2396
  globalThis.crypto.getRandomValues(array);
2460
2397
  return Array.from(array, (v) => v.toString(16).padStart(2, "0")).join("");
2461
2398
  }
2462
- function isVersionGreater(a, b) {
2463
- const parse = (v) => v.split("-")[0].split(".").map((n) => parseInt(n, 10) || 0);
2464
- const pa = parse(a);
2465
- const pb = parse(b);
2466
- const len = Math.max(pa.length, pb.length);
2467
- for (let i = 0; i < len; i++) {
2468
- const da = pa[i] ?? 0;
2469
- const db = pb[i] ?? 0;
2470
- if (da !== db) return da > db;
2471
- }
2472
- return false;
2473
- }
2474
2399
  var USER_ID_STORAGE_KEY = "mcp_use_user_id";
2475
2400
  var PROJECT_API_KEY = "phc_lyTtbYwvkdSbrcMQNPiKiiRWrrM1seyKIMjycSvItEI";
2476
2401
  var HOST = "https://eu.i.posthog.com";
@@ -2499,10 +2424,7 @@ function createLocalStorageBackend() {
2499
2424
  localStorage.setItem(USER_ID_STORAGE_KEY, id);
2500
2425
  } catch {
2501
2426
  }
2502
- },
2503
- // Package-download dedup is node/Scarf-oriented; localStorage unused.
2504
- getDownloadedVersion: () => null,
2505
- setDownloadedVersion: () => void 0
2427
+ }
2506
2428
  };
2507
2429
  }
2508
2430
  function detectRuntimeEnvironment() {
@@ -2570,17 +2492,13 @@ var Telemetry = class _Telemetry {
2570
2492
  _currUserId = null;
2571
2493
  _telemetryEnabled = false;
2572
2494
  _pending = /* @__PURE__ */ new Set();
2573
- _scarfEnabled = false;
2574
2495
  _runtimeEnvironment;
2575
2496
  _storageCapability;
2576
2497
  _storage;
2577
- /** True when node entry installed fs storage (package-download dedup). */
2578
- _fsBacked;
2579
2498
  _source;
2580
2499
  _productVersion;
2581
2500
  constructor() {
2582
2501
  this._runtimeEnvironment = detectRuntimeEnvironment();
2583
- this._fsBacked = configuredStorage !== null;
2584
2502
  this._storage = configuredStorage ?? createLocalStorageBackend() ?? null;
2585
2503
  this._storageCapability = this._storage ? "persistent" : "session-only";
2586
2504
  this._source = readSourceHint() || this._runtimeEnvironment;
@@ -2599,14 +2517,6 @@ var Telemetry = class _Telemetry {
2599
2517
  "Anonymized telemetry enabled. Set MCP_USE_ANONYMIZED_TELEMETRY=false to disable."
2600
2518
  );
2601
2519
  this._telemetryEnabled = true;
2602
- this._scarfEnabled = true;
2603
- if (this._fsBacked) {
2604
- setTimeout(() => {
2605
- this.trackPackageDownload({ triggered_by: "initialization" }).catch(
2606
- (e) => logger.debug(`Failed to track package download: ${e}`)
2607
- );
2608
- }, 0);
2609
- }
2610
2520
  }
2611
2521
  }
2612
2522
  get runtimeEnvironment() {
@@ -2638,7 +2548,7 @@ var Telemetry = class _Telemetry {
2638
2548
  this._productVersion = version;
2639
2549
  }
2640
2550
  get isEnabled() {
2641
- return this._telemetryEnabled || this._scarfEnabled;
2551
+ return this._telemetryEnabled;
2642
2552
  }
2643
2553
  get userId() {
2644
2554
  if (this._currUserId) return this._currUserId;
@@ -2661,7 +2571,7 @@ var Telemetry = class _Telemetry {
2661
2571
  return this._currUserId;
2662
2572
  }
2663
2573
  async capture(event) {
2664
- if (!this._telemetryEnabled && !this._scarfEnabled) return;
2574
+ if (!this._telemetryEnabled) return;
2665
2575
  const currentUserId = this.userId;
2666
2576
  const properties = {
2667
2577
  ...event.properties,
@@ -2670,52 +2580,15 @@ var Telemetry = class _Telemetry {
2670
2580
  source: this._source,
2671
2581
  runtime: this._runtimeEnvironment
2672
2582
  };
2673
- if (this._telemetryEnabled) {
2674
- const p = capturePostHog({
2675
- host: HOST,
2676
- apiKey: PROJECT_API_KEY,
2677
- event: event.name,
2678
- distinctId: currentUserId,
2679
- properties
2680
- });
2681
- this._pending.add(p);
2682
- void p.finally(() => this._pending.delete(p));
2683
- }
2684
- if (this._scarfEnabled) {
2685
- const p = captureScarf({
2686
- ...properties,
2687
- user_id: currentUserId,
2688
- event: event.name
2689
- });
2690
- this._pending.add(p);
2691
- void p.finally(() => this._pending.delete(p));
2692
- }
2693
- }
2694
- async trackPackageDownload(properties) {
2695
- if (!this._scarfEnabled || !this._fsBacked || !this._storage) return;
2696
- const currentVersion = getPackageVersion();
2697
- const saved = this._storage.getDownloadedVersion();
2698
- let firstDownload = false;
2699
- let shouldTrack = false;
2700
- if (!saved) {
2701
- shouldTrack = true;
2702
- firstDownload = true;
2703
- this._storage.setDownloadedVersion(currentVersion);
2704
- } else if (isVersionGreater(currentVersion, saved)) {
2705
- shouldTrack = true;
2706
- this._storage.setDownloadedVersion(currentVersion);
2707
- }
2708
- if (!shouldTrack) return;
2709
- await captureScarf({
2710
- ...properties || {},
2711
- mcp_use_version: currentVersion,
2712
- user_id: this.userId,
2713
- event: "package_download",
2714
- first_download: firstDownload,
2715
- language: "typescript",
2716
- source: this._source,
2717
- runtime: this._runtimeEnvironment
2583
+ const p = capturePostHog({
2584
+ host: HOST,
2585
+ apiKey: PROJECT_API_KEY,
2586
+ event: event.name,
2587
+ distinctId: currentUserId,
2588
+ properties
2718
2589
  });
2590
+ this._pending.add(p);
2591
+ void p.finally(() => this._pending.delete(p));
2719
2592
  }
2720
2593
  async trackAgentExecution(data) {
2721
2594
  if (!this.isEnabled) return;
@@ -6881,6 +6754,7 @@ import React2, {
6881
6754
  memo,
6882
6755
  useCallback as useCallback6,
6883
6756
  useEffect as useEffect5,
6757
+ useMemo as useMemo3,
6884
6758
  useRef as useRef4,
6885
6759
  useState as useState4
6886
6760
  } from "react";
@@ -7299,9 +7173,9 @@ function buildSandboxProxyBlobHtml(search) {
7299
7173
  // src/react/view/use-display-mode.ts
7300
7174
  import { useCallback as useCallback5, useEffect as useEffect4 } from "react";
7301
7175
  var SHELL_BASE = "w-full h-full min-h-0 bg-background flex flex-col [&:fullscreen]:h-full [&:fullscreen]:w-full [&:fullscreen]:bg-background";
7302
- var WIDGET_FULLSCREEN_OVERLAY_CLASSES = `fixed inset-0 z-[100] ${SHELL_BASE}`;
7176
+ var WIDGET_FULLSCREEN_OVERLAY_CLASSES = `fixed inset-0 z-[200] ${SHELL_BASE}`;
7303
7177
  var WIDGET_PIP_SHELL_CLASSES = [
7304
- "fixed top-4 left-1/2 -translate-x-1/2 z-[100]",
7178
+ "fixed top-4 left-1/2 -translate-x-1/2 z-[200]",
7305
7179
  "rounded-3xl w-full min-w-[300px] h-[400px]",
7306
7180
  "shadow-2xl border overflow-hidden",
7307
7181
  "bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/80",
@@ -7359,7 +7233,8 @@ function useViewDisplayModeControls({
7359
7233
  }
7360
7234
  var VIEW_DIMENSIONS = {
7361
7235
  PIP_MAX_WIDTH: 700,
7362
- DEFAULT_HEIGHT: 400
7236
+ DEFAULT_HEIGHT: 400,
7237
+ FULLSCREEN_HEADER_HEIGHT: 50
7363
7238
  };
7364
7239
 
7365
7240
  // src/react/view/view-detection.ts
@@ -7390,6 +7265,24 @@ var DEFAULT_HOST_CAPABILITIES = {
7390
7265
  // ponytail: always advertised; bridge.onmessage no-ops when onMessage unset
7391
7266
  message: { text: {} }
7392
7267
  };
7268
+ function CloseIcon() {
7269
+ return /* @__PURE__ */ React2.createElement(
7270
+ "svg",
7271
+ {
7272
+ width: "14",
7273
+ height: "14",
7274
+ viewBox: "0 0 24 24",
7275
+ fill: "none",
7276
+ stroke: "currentColor",
7277
+ strokeWidth: "2",
7278
+ strokeLinecap: "round",
7279
+ strokeLinejoin: "round",
7280
+ "aria-hidden": true
7281
+ },
7282
+ /* @__PURE__ */ React2.createElement("path", { d: "M18 6 6 18" }),
7283
+ /* @__PURE__ */ React2.createElement("path", { d: "m6 6 12 12" })
7284
+ );
7285
+ }
7393
7286
  function waitForSandboxProxyReady(iframe) {
7394
7287
  return new Promise((resolve) => {
7395
7288
  const listener = (event) => {
@@ -7451,6 +7344,9 @@ function ViewRendererBase({
7451
7344
  wrapTransport,
7452
7345
  toolCallTimeout = DEFAULT_TOOL_CALL_TIMEOUT,
7453
7346
  mockOpenAiFileApis = false,
7347
+ onInlineHeightChange,
7348
+ fullscreenHeader,
7349
+ renderFullscreenClose,
7454
7350
  className,
7455
7351
  testId = "mcp-app-frame",
7456
7352
  invoking,
@@ -7472,8 +7368,13 @@ function ViewRendererBase({
7472
7368
  );
7473
7369
  const [internalDisplayMode, setInternalDisplayMode] = useState4("inline");
7474
7370
  const displayMode = displayModeProp ?? internalDisplayMode;
7475
- const hostContextRef = useRef4(hostContext);
7476
- hostContextRef.current = hostContext;
7371
+ const effectiveHostContext = useMemo3(() => {
7372
+ if (!hostContext) return hostContext;
7373
+ if (hostContext.displayMode === displayMode) return hostContext;
7374
+ return { ...hostContext, displayMode };
7375
+ }, [hostContext, displayMode]);
7376
+ const hostContextRef = useRef4(effectiveHostContext);
7377
+ hostContextRef.current = effectiveHostContext;
7477
7378
  const onMessageRef = useRef4(onMessage);
7478
7379
  onMessageRef.current = onMessage;
7479
7380
  const toolInputRef = useRef4(toolInput);
@@ -7498,6 +7399,8 @@ function ViewRendererBase({
7498
7399
  onReadyRef.current = onReady;
7499
7400
  const onLifecycleChangeRef = useRef4(onLifecycleChange);
7500
7401
  onLifecycleChangeRef.current = onLifecycleChange;
7402
+ const onInlineHeightChangeRef = useRef4(onInlineHeightChange);
7403
+ onInlineHeightChangeRef.current = onInlineHeightChange;
7501
7404
  const sandboxUrlRef = useRef4(sandboxUrl);
7502
7405
  sandboxUrlRef.current = sandboxUrl;
7503
7406
  const cspModeRef = useRef4(cspMode);
@@ -7757,7 +7660,10 @@ function ViewRendererBase({
7757
7660
  height
7758
7661
  }) => {
7759
7662
  if (displayModeRef.current !== "inline") return;
7760
- if (height !== void 0) setInlineHeight(height);
7663
+ if (height !== void 0) {
7664
+ setInlineHeight(height);
7665
+ onInlineHeightChangeRef.current?.(height);
7666
+ }
7761
7667
  };
7762
7668
  const initPromise = hookInitialized(bridge);
7763
7669
  let transport = new PostMessageTransport(
@@ -7844,9 +7750,9 @@ function ViewRendererBase({
7844
7750
  ]);
7845
7751
  useEffect5(() => {
7846
7752
  const bridge = bridgeRef.current;
7847
- if (!bridge || initCount === 0 || !hostContext) return;
7848
- bridge.setHostContext(hostContext);
7849
- }, [hostContext, initCount]);
7753
+ if (!bridge || initCount === 0 || !effectiveHostContext) return;
7754
+ bridge.setHostContext(effectiveHostContext);
7755
+ }, [effectiveHostContext, initCount]);
7850
7756
  useEffect5(() => {
7851
7757
  const bridge = bridgeRef.current;
7852
7758
  if (!bridge || initCount === 0 || !partialToolInput) return;
@@ -7884,6 +7790,7 @@ function ViewRendererBase({
7884
7790
  const timer = setTimeout(() => setShowSpinner(false), 300);
7885
7791
  return () => clearTimeout(timer);
7886
7792
  }, [initCount, showSpinner]);
7793
+ const showHostBorder = resolved !== null && resolved.prefersBorder && displayMode !== "fullscreen";
7887
7794
  if (loadError) {
7888
7795
  return /* @__PURE__ */ React2.createElement("div", { className }, /* @__PURE__ */ React2.createElement("div", { className: "border border-red-200/50 dark:border-red-800/50 bg-red-50/30 dark:bg-red-950/20 rounded-lg p-4" }, /* @__PURE__ */ React2.createElement("p", { className: "text-sm text-red-600 dark:text-red-400" }, "Failed to load view: ", loadError)));
7889
7796
  }
@@ -7901,29 +7808,69 @@ function ViewRendererBase({
7901
7808
  "div",
7902
7809
  {
7903
7810
  ref: containerRef,
7904
- className: containerClassName,
7811
+ className: isFullscreen ? `${containerClassName} flex flex-col` : containerClassName,
7905
7812
  style: isPip ? {
7906
7813
  height: VIEW_DIMENSIONS.DEFAULT_HEIGHT,
7907
7814
  maxWidth: VIEW_DIMENSIONS.PIP_MAX_WIDTH,
7908
7815
  zIndex: 100
7909
7816
  } : isFullscreen ? { zIndex: 100 } : void 0
7910
7817
  },
7911
- (isFullscreen || isPip) && /* @__PURE__ */ React2.createElement(
7818
+ isFullscreen && // ponytail: inspector Tailwind may not emit client arbitrary classes
7819
+ // (h-[50px], grid-cols-[auto_1fr_auto]) — use inline layout instead.
7820
+ /* @__PURE__ */ React2.createElement(
7821
+ "header",
7822
+ {
7823
+ className: "grid shrink-0 items-center border-b border-zinc-200 bg-background px-3 dark:border-zinc-700",
7824
+ style: {
7825
+ height: VIEW_DIMENSIONS.FULLSCREEN_HEADER_HEIGHT,
7826
+ gridTemplateColumns: "auto 1fr auto"
7827
+ }
7828
+ },
7829
+ renderFullscreenClose ? renderFullscreenClose({
7830
+ onClick: () => void handleDisplayModeChange("inline"),
7831
+ "data-testid": "debugger-exit-fullscreen-button",
7832
+ "aria-label": "Exit fullscreen"
7833
+ }) : /* @__PURE__ */ React2.createElement(
7834
+ "button",
7835
+ {
7836
+ type: "button",
7837
+ "data-testid": "debugger-exit-fullscreen-button",
7838
+ "aria-label": "Exit fullscreen",
7839
+ className: "flex size-8 cursor-pointer items-center justify-center rounded-full border border-zinc-200 bg-background text-foreground shadow-sm hover:bg-muted dark:border-zinc-700",
7840
+ onClick: () => void handleDisplayModeChange("inline")
7841
+ },
7842
+ /* @__PURE__ */ React2.createElement(CloseIcon, null)
7843
+ ),
7844
+ /* @__PURE__ */ React2.createElement("div", { className: "flex min-w-0 items-center justify-center gap-2 px-2" }, fullscreenHeader?.iconUrl ? /* @__PURE__ */ React2.createElement(
7845
+ "img",
7846
+ {
7847
+ src: fullscreenHeader.iconUrl,
7848
+ alt: "",
7849
+ className: "size-6 shrink-0 rounded-md object-contain"
7850
+ }
7851
+ ) : null, /* @__PURE__ */ React2.createElement("span", { className: "truncate text-sm font-medium text-foreground" }, fullscreenHeader?.title ?? toolName)),
7852
+ /* @__PURE__ */ React2.createElement("div", { className: "size-8 shrink-0", "aria-hidden": true })
7853
+ ),
7854
+ isPip && (renderFullscreenClose ? /* @__PURE__ */ React2.createElement("div", { className: "absolute right-3 top-3", style: { zIndex: 110 } }, renderFullscreenClose({
7855
+ onClick: () => void handleDisplayModeChange("inline"),
7856
+ "data-testid": "debugger-exit-pip-button",
7857
+ "aria-label": "Exit picture-in-picture"
7858
+ })) : /* @__PURE__ */ React2.createElement(
7912
7859
  "button",
7913
7860
  {
7914
7861
  type: "button",
7915
- "data-testid": isFullscreen ? "debugger-exit-fullscreen-button" : "debugger-exit-pip-button",
7916
- "aria-label": isFullscreen ? "Exit fullscreen" : "Exit picture-in-picture",
7917
- className: "absolute right-3 top-3 z-[110] flex size-8 items-center justify-center rounded-full border border-border bg-background/90 text-lg leading-none text-foreground shadow-sm backdrop-blur-sm hover:bg-background",
7862
+ "data-testid": "debugger-exit-pip-button",
7863
+ "aria-label": "Exit picture-in-picture",
7864
+ className: "absolute right-3 top-3 z-[110] flex size-8 cursor-pointer items-center justify-center rounded-full border border-border bg-background/90 text-foreground shadow-sm backdrop-blur-sm hover:bg-background",
7918
7865
  style: { zIndex: 110 },
7919
7866
  onClick: () => void handleDisplayModeChange("inline")
7920
7867
  },
7921
- "\xD7"
7922
- ),
7868
+ /* @__PURE__ */ React2.createElement(CloseIcon, null)
7869
+ )),
7923
7870
  /* @__PURE__ */ React2.createElement(
7924
7871
  "div",
7925
7872
  {
7926
- className: isFullscreen || isPip ? "relative w-full h-full min-h-0 flex flex-1 flex-col" : "relative w-full flex flex-1 justify-center items-center"
7873
+ className: isFullscreen ? "relative flex min-h-0 w-full flex-1 flex-col" : isPip ? "relative w-full h-full min-h-0 flex flex-1 flex-col" : "relative w-full flex flex-1 justify-center items-center"
7927
7874
  },
7928
7875
  showSpinner && /* @__PURE__ */ React2.createElement("div", { className: "flex absolute inset-0 items-center justify-center z-10" }, /* @__PURE__ */ React2.createElement("span", { className: "text-sm text-muted-foreground" }, "Loading\u2026")),
7929
7876
  !isPip && !isFullscreen && (invoking || invoked) && /* @__PURE__ */ React2.createElement("div", { className: "absolute -top-8 left-2 z-10 whitespace-nowrap pointer-events-none text-xs text-muted-foreground" }, invoking && !toolOutput ? invoking : invoked),
@@ -7940,10 +7887,7 @@ function ViewRendererBase({
7940
7887
  {
7941
7888
  ref: iframeRef,
7942
7889
  title: `MCP App: ${toolName}`,
7943
- className: "w-full h-full border-0 bg-transparent",
7944
- style: {
7945
- border: resolved.prefersBorder && displayMode !== "fullscreen" ? void 0 : "none"
7946
- }
7890
+ className: showHostBorder ? "w-full h-full bg-transparent border border-border rounded-xl" : "w-full h-full bg-transparent border-0"
7947
7891
  }
7948
7892
  )
7949
7893
  )
@@ -7965,6 +7909,9 @@ function viewRendererAreEqual(prev, next) {
7965
7909
  if (prev.hostCapabilities !== next.hostCapabilities) return false;
7966
7910
  if (prev.cspMode !== next.cspMode) return false;
7967
7911
  if (prev.mockOpenAiFileApis !== next.mockOpenAiFileApis) return false;
7912
+ if (prev.onInlineHeightChange !== next.onInlineHeightChange) return false;
7913
+ if (prev.fullscreenHeader !== next.fullscreenHeader) return false;
7914
+ if (prev.renderFullscreenClose !== next.renderFullscreenClose) return false;
7968
7915
  if (prev.className !== next.className) return false;
7969
7916
  if (prev.onReady !== next.onReady) return false;
7970
7917
  if (prev.onLifecycleChange !== next.onLifecycleChange) return false;