{"version":3,"sources":["../../src/env.ts","../../src/bridge.ts","../../src/types.ts","../../src/client.ts","../../src/react/provider.tsx","../../src/react/hooks.ts","../../src/token.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import type { CherryPlatform, CherryEnvironment } from './types';\n\nexport interface DetectPlatformOptions {\n  /**\n   * When `true`, only Cherry-injected signals are accepted:\n   *   - `window.__cherry` for mobile WebView\n   *   - `cherry_embed=1` query parameter for web iframe\n   *\n   * Fallbacks (`ReactNativeWebView`, plain `window.parent !== window`) are\n   * disabled. Use this once all Cherry hosts you target have been updated to\n   * inject the new signals, to eliminate false positives (e.g. wallet\n   * in-app browsers that also run inside a WebView).\n   *\n   * Default: `false` (fallbacks enabled for backward compatibility).\n   */\n  strict?: boolean;\n}\n\n/**\n * Detect whether we're running inside Cherry messenger.\n *\n * WebView (mobile):\n *   - Primary:  `window.__cherry` — injected by Cherry before page loads\n *   - Fallback: `ReactNativeWebView` — present in any RN WebView (for older\n *               Cherry builds that don't inject `__cherry` yet)\n *               Disabled when `strict: true`.\n *\n * iframe (web):\n *   - Primary:  `cherry_embed=1` query parameter (set by Cherry host)\n *   - Fallback: plain `window.parent !== window` (for older Cherry builds\n *               that don't set the param yet)\n *               Disabled when `strict: true`.\n *\n * The fallback paths will be removed in a future major version once all\n * Cherry hosts are updated.\n */\nexport function detectPlatform(options: DetectPlatformOptions = {}): CherryPlatform {\n  const { strict = false } = options;\n\n  if (typeof window === 'undefined') return 'standalone';\n\n  // Cherry-injected primary signals (fast path, no ambiguity).\n  if ((window as unknown as { __cherry?: boolean }).__cherry) return 'webview';\n  if (new URLSearchParams(window.location.search).get('cherry_embed') === '1') return 'iframe';\n\n  if (strict) return 'standalone';\n\n  // Fallback heuristics — order matters:\n  // 1) Any nested iframe is iframe transport. This MUST run before the\n  //    ReactNativeWebView check, otherwise Phantom mobile in-app browser\n  //    (a RN WebView that injects window.ReactNativeWebView and then loads\n  //    Cherry, which loads our miniapp inside an iframe) gets misclassified\n  //    as a Cherry-mobile RN host and the SDK posts to the native bridge\n  //    instead of the parent frame.\n  if (window.parent !== window) return 'iframe';\n  // 2) Top frame with a RN WebView bridge — this is the real Cherry-mobile\n  //    case (miniapp loaded directly by the RN host, no iframe in between).\n  if ((window as unknown as { ReactNativeWebView?: unknown }).ReactNativeWebView) return 'webview';\n\n  return 'standalone';\n}\n\nexport function isInsideCherry(options: DetectPlatformOptions = {}): boolean {\n  return detectPlatform(options) !== 'standalone';\n}\n\nexport function getCherryEnvironment(options: DetectPlatformOptions = {}): CherryEnvironment {\n  const platform = detectPlatform(options);\n  return {\n    isEmbedded: platform !== 'standalone',\n    platform,\n  };\n}\n","import { detectPlatform } from './env';\nimport type {\n  BridgeMessage,\n  BridgeRequest,\n  BridgeResponse,\n  BridgeEvent,\n} from './types';\n\nconst REQUEST_TIMEOUT_MS = 120_000;\n\ninterface PendingRequest {\n  resolve: (result: unknown) => void;\n  reject: (error: Error) => void;\n  timer: ReturnType<typeof setTimeout>;\n}\n\ntype MessageHandler = (message: BridgeMessage) => void;\n\nexport class Bridge {\n  private readonly pending = new Map<string, PendingRequest>();\n  private readonly handlers: MessageHandler[] = [];\n  private readonly listener: (event: MessageEvent) => void;\n\n  /**\n   * Buffer for cherry:init — if the host sends it before any handler is\n   * registered (i.e. before cherry.init() is called), we keep it here so\n   * waitForInit() can resolve immediately instead of timing out.\n   */\n  private _bufferedInit: BridgeMessage | null = null;\n\n  constructor() {\n    this.listener = (event: MessageEvent) => {\n      let data: unknown = event.data;\n\n      // WebView sometimes delivers a serialized string\n      if (typeof data === 'string') {\n        try {\n          data = JSON.parse(data) as unknown;\n        } catch {\n          return;\n        }\n      }\n\n      if (!isObject(data) || typeof data['type'] !== 'string') return;\n      const message = data as BridgeMessage;\n\n      // Resolve pending request if this is a response\n      if (message['type'] === 'cherry:response') {\n        const response = message as unknown as BridgeResponse;\n        const pending = this.pending.get(response.id);\n        if (pending) {\n          this.pending.delete(response.id);\n          clearTimeout(pending.timer);\n          if (response.error) {\n            const err = response.error;\n            // Handle both string and { code, message } error formats\n            if (typeof err === 'string') {\n              pending.reject(new BridgeError(err, 'UNKNOWN'));\n            } else {\n              pending.reject(new BridgeError(err.message ?? 'Unknown error', err.code ?? 'UNKNOWN'));\n            }\n          } else {\n            pending.resolve(response.result);\n          }\n          return;\n        }\n      }\n\n      // Buffer cherry:init if no handlers are registered yet, so it is not lost\n      if (message['type'] === 'cherry:init' && this.handlers.length === 0) {\n        this._bufferedInit = message;\n        return;\n      }\n\n      for (const handler of this.handlers) {\n        handler(message);\n      }\n    };\n\n    window.addEventListener('message', this.listener);\n  }\n\n  /**\n   * Returns a previously buffered cherry:init message (if any) and clears the\n   * buffer. Called by waitForInit() to handle the case where the host sent\n   * cherry:init before the SDK called init().\n   */\n  consumeBufferedInit(): BridgeMessage | null {\n    const msg = this._bufferedInit;\n    this._bufferedInit = null;\n    return msg;\n  }\n\n  sendToHost(message: BridgeMessage): void {\n    const platform = detectPlatform();\n    if (platform === 'webview') {\n      const rnw = (window as unknown as { ReactNativeWebView?: { postMessage(data: string): void } })\n        .ReactNativeWebView;\n      rnw?.postMessage(JSON.stringify(message));\n      return;\n    }\n    // Forward transient user activation to the host so wallets that require\n    // a user gesture actually display the approval prompt. The options bag\n    // is the only way to do that, but several wallet in-app browsers run on\n    // customised WebViews where options-bag postMessage either throws\n    // synchronously or — worse — is silently dropped. We detect known wallet\n    // WebViews by UA and use the legacy string-targetOrigin form for them;\n    // Cherry-host renders an explicit confirmation overlay for these wallets,\n    // so activation forwarding is not required.\n    const ua = typeof navigator !== 'undefined' ? navigator.userAgent || '' : '';\n    const isWalletInApp =\n      /\\b(Phantom(Browser)?|Solflare(Wallet)?|Backpack|CoinbaseWallet|CipherBrowser|Trust(Wallet)?)\\/\\d/i.test(ua);\n    if (!isWalletInApp) {\n      try {\n        window.parent.postMessage(message, {\n          targetOrigin: '*',\n          transferUserActivation: true,\n        } as WindowPostMessageOptions);\n        return;\n      } catch {\n        // Old browsers don't support the options bag — fall through.\n      }\n    }\n    window.parent.postMessage(message, '*');\n  }\n\n  startListening(handler: MessageHandler): () => void {\n    this.handlers.push(handler);\n    return () => {\n      const idx = this.handlers.indexOf(handler);\n      if (idx !== -1) this.handlers.splice(idx, 1);\n    };\n  }\n\n  request(method: string, params?: Record<string, unknown>): Promise<unknown> {\n    return new Promise<unknown>((resolve, reject) => {\n      const id = generateId();\n      const timer = setTimeout(() => {\n        this.pending.delete(id);\n        reject(new BridgeError(`Request timed out: ${method}`, 'TIMEOUT'));\n      }, REQUEST_TIMEOUT_MS);\n\n      this.pending.set(id, { resolve, reject, timer });\n\n      const msg: BridgeRequest = {\n        type: 'cherry:request',\n        id,\n        method,\n        ...(params !== undefined ? { params } : {}),\n      };\n      this.sendToHost(msg);\n    });\n  }\n\n  destroy(): void {\n    window.removeEventListener('message', this.listener);\n    for (const [id, pending] of this.pending) {\n      clearTimeout(pending.timer);\n      pending.reject(new BridgeError('Bridge destroyed', 'DESTROYED'));\n      this.pending.delete(id);\n    }\n    this.handlers.length = 0;\n  }\n}\n\nexport class BridgeError extends Error {\n  constructor(\n    message: string,\n    public readonly code: string,\n  ) {\n    super(message);\n    this.name = 'BridgeError';\n  }\n}\n\n// Module-level singleton — shared between CherryMiniApp and CherryWalletAdapter\nlet _sharedBridge: Bridge | null = null;\n\nexport function getSharedBridge(): Bridge {\n  if (!_sharedBridge) {\n    _sharedBridge = new Bridge();\n  }\n  return _sharedBridge;\n}\n\nexport function destroySharedBridge(): void {\n  _sharedBridge?.destroy();\n  _sharedBridge = null;\n}\n\n// ---- helpers ----\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n  return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction generateId(): string {\n  if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n    return crypto.randomUUID();\n  }\n  // Fallback for older environments\n  return `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;\n}\n\nexport type { BridgeEvent };\n","export const BRIDGE_VERSION = 2;\n\nexport interface BridgeMessage {\n  type: string;\n  [key: string]: unknown;\n}\n\nexport interface BridgeInitMessage extends BridgeMessage {\n  type: 'cherry:init';\n  version: number;\n  token: string;\n  capabilities: string[];\n}\n\nexport interface BridgeReadyMessage extends BridgeMessage {\n  type: 'cherry:ready';\n  version: number;\n}\n\nexport interface BridgeRequest extends BridgeMessage {\n  type: 'cherry:request';\n  id: string;\n  method: string;\n  params?: Record<string, unknown>;\n}\n\nexport interface BridgeResponse extends BridgeMessage {\n  type: 'cherry:response';\n  id: string;\n  result?: unknown;\n  error?: { code: string; message: string };\n}\n\nexport interface BridgeEvent extends BridgeMessage {\n  type: 'cherry:event';\n  event: string;\n  data?: unknown;\n}\n\nexport type CherryPlatform = 'webview' | 'iframe' | 'standalone';\n\nexport interface CherryEnvironment {\n  isEmbedded: boolean;\n  platform: CherryPlatform;\n}\n\nexport interface LaunchTokenPayload {\n  sub: string;\n  app_id: string;\n  room_id: string;\n  origin: string;\n  user: {\n    display_name: string;\n    avatar_url: string;\n  };\n  room: {\n    title: string;\n    member_count: number;\n  };\n  iat: number;\n  exp: number;\n  jti: string;\n\n  // ── Inline / blink claims ─────────────────────────────────────────────────\n  // Present on inline-blink and fullscreen launch tokens (NOT on the legacy\n  // embed `cherry:init` token, where `user`/`room`/`origin` are populated\n  // instead). A miniapp can read these from the verified token — including\n  // **server-side (SSR)**, since the token rides in the launch URL's query\n  // string (`/inline?token=...`). This lets the miniapp render the blink and\n  // bind data to `message_id` *before* the client mounts.\n\n  /** Token scope — `'inline'` (blink card) or `'fullscreen'` (runner). */\n  scope?: 'inline' | 'fullscreen' | string;\n  /** Render mode — mirrors `scope` for the host bridge. */\n  mode?: 'inline' | 'fullscreen' | string;\n  /** Mini-app this token renders (absent on bot-hosted `url` blinks). */\n  mini_app_id?: string;\n  /**\n   * Unique id of the blink message this token is bound to. Use it as the\n   * stable key to look up / bind per-message state at (or before) render.\n   */\n  message_id?: string;\n  /** Route within the miniapp the blink should open. */\n  route?: string;\n  /** Snapshot payload baked into the token at send time (tamper-proof). */\n  params?: Record<string, unknown>;\n  /** Inline render height bucket. */\n  height?: 'compact' | 'medium' | 'tall' | string;\n  /**\n   * Explicit initial render height (CSS px) the host opens the card at, so it\n   * doesn't jump before the first `host.resize`. Bounded by the `height`\n   * bucket. Read it to render the blink at exactly the declared height.\n   */\n  initial_height?: number;\n  /** Whether the blink is interactive (false for read-only snapshots). */\n  interactive?: boolean;\n  /** `'user_share'` for user-shared read-only snapshots (no bot behind it). */\n  source?: string;\n  /** Wallet that sent the blink (message author — bot wallet or sharer). */\n  sender?: string;\n  /** Bot-hosted blink URL (only on `type: 'url'` blinks). */\n  blink_url?: string;\n  /** Viewer wallet, for fullscreen `launch-as-viewer` tokens. */\n  viewer_wallet?: string;\n}\n\n/**\n * Resolved context for an inline blink — the unique identity + payload of the\n * specific interactive message the mini-app is rendering. Available via\n * `CherryMiniApp.blink` / `useCherryBlink()` only when launched as an inline\n * blink (`mode=inline`); `null` otherwise.\n */\nexport interface CherryBlinkContext {\n  /** Unique id of this blink message — distinct per sent blink. */\n  messageId: string;\n  /** Room the blink lives in. */\n  roomId: string;\n  /**\n   * Wallet currently viewing the blink. Note this is whoever has the chat open\n   * — it equals `sender` when the author views their own shared message, and\n   * the other participant when they view it.\n   */\n  viewerWallet: string;\n  /** Wallet that sent the blink (message author), if known. */\n  sender: string | null;\n  /** Mini-app being rendered (absent on bot-hosted `url` blinks). */\n  miniAppId: string | null;\n  /** Owning embed app id, if any. */\n  appId: string | null;\n  /** Route opened within the mini-app. */\n  route: string;\n  /** Snapshot payload baked into this blink (read-only). */\n  params: Record<string, unknown>;\n  /** Inline render height bucket. */\n  height: 'compact' | 'medium' | 'tall' | string;\n  /**\n   * Explicit initial render height (CSS px) the host opens the card at, or\n   * `null` when the sender didn't pin one (the host then uses the bucket\n   * height). Render the blink at this height to avoid a layout jump.\n   */\n  initialHeight: number | null;\n  /** False for read-only shared snapshots. */\n  interactive: boolean;\n  /** `'user_share'` for user-shared snapshots, otherwise the bot source. */\n  source: string | null;\n  /**\n   * True when this is a non-interactive PREVIEW render shown in the share\n   * picker, before the message exists. In preview mode `messageId`/`roomId`\n   * are empty — render purely from `params` (don't rely on per-message state);\n   * that's what keeps the preview consistent with the eventual shared blink.\n   */\n  isPreview: boolean;\n  /** Monotonic version of `params` (bumped by `bot:blink_update`). */\n  blinkParamsVersion: number | null;\n  /** Launch-token unix timestamps. */\n  issuedAt: number | null;\n  expiresAt: number | null;\n  /** Launch-token unique id. */\n  jti: string | null;\n}\n\nexport interface CherryUser {\n  publicKey: string;\n  displayName: string;\n  avatarUrl: string;\n}\n\nexport interface CherryRoom {\n  id: string;\n  title: string;\n  memberCount: number;\n}\n\nexport interface CherryNavigate {\n  /** Open user profile by wallet address, domain (e.g. \"alice.sol\"), or @handle */\n  userProfile(identifier: string): Promise<void>;\n  /** Open room by roomId or @handle (e.g. \"@mygroup\") */\n  openRoom(identifier: string): Promise<void>;\n}\n\n/**\n * Options for `CherryMiniApp.share` — hand a \"result\" snapshot to the Cherry\n * host so the user can share it into a DM or group as an interactive blink.\n *\n * The miniapp does NOT name itself: the host derives the miniapp identity from\n * the current session's launch token, so a miniapp can only ever share itself.\n * The shared blink is rendered read-only on the receiver side.\n */\nexport interface ShareBlinkOptions {\n  /** Route within this miniapp the receiver opens (defaults to \"/\"). */\n  route?: string;\n  /** Snapshot payload the receiver's miniapp renders (<= 4 KB JSON, depth <= 8). */\n  params?: Record<string, unknown>;\n  /** Inline render height bucket. */\n  height?: 'compact' | 'medium' | 'tall';\n  /**\n   * Explicit initial render height (CSS px) the receiver's card opens at, so it\n   * doesn't jump. Must be <= the `height` bucket max (compact 96 / medium 220 /\n   * tall 420). Omit to start at the bucket height.\n   */\n  initialHeight?: number;\n  /** Optional caption shown alongside the blink card. */\n  caption?: string;\n  /**\n   * Declare that this miniapp can render a live, read-only PREVIEW of the\n   * shared result from `route` + `params` alone. When true, the Cherry host\n   * shows a real preview in the share picker (launched with `mode=preview`,\n   * `cherry.blink.isPreview === true`); when false/omitted it shows a generic\n   * skeleton. Only set this if your `route` renders correctly from `params`\n   * without a real `messageId`/room.\n   */\n  previewable?: boolean;\n}\n\nexport interface ShareBlinkResult {\n  /** True when the user picked a recipient and the share was sent. */\n  shared: boolean;\n  /** The room the blink was shared into (present only when `shared` is true). */\n  roomId?: string;\n  /**\n   * Unique id of the created blink message (present only when `shared` is true).\n   * Record it to correlate later callbacks / `bot:blink_update` events back to\n   * what this miniapp sent.\n   */\n  messageId?: string;\n}\n\nexport interface CherryWallet {\n  publicKey: string;\n  /** Signs a transaction. Accepts Transaction, VersionedTransaction, Uint8Array, or base64 string. Returns signed bytes. */\n  signTransaction(transaction: unknown): Promise<Uint8Array>;\n  /** Signs all transactions in a single batch request. Returns array of signed bytes. */\n  signAllTransactions(transactions: unknown[]): Promise<Uint8Array[]>;\n  /** Signs and sends a transaction. Returns signature string. */\n  signAndSendTransaction(transaction: unknown): Promise<string>;\n  /** Signs an arbitrary message. Returns signature bytes. */\n  signMessage(message: Uint8Array): Promise<Uint8Array>;\n}\n","import { decodeJwt } from 'jose';\nimport { Bridge, getSharedBridge, destroySharedBridge } from './bridge';\nimport type { BridgeEvent } from './bridge';\nimport {\n  BRIDGE_VERSION,\n  type BridgeMessage,\n  type BridgeInitMessage,\n  type BridgeReadyMessage,\n  type CherryUser,\n  type CherryRoom,\n  type CherryNavigate,\n  type LaunchTokenPayload,\n  type CherryBlinkContext,\n  type ShareBlinkOptions,\n  type ShareBlinkResult,\n} from './types';\n\nexport type CherryMiniAppEvent =\n  | 'suspended'\n  | 'resumed'\n  | 'walletDisconnected'\n  /** Inline blink params were updated by the bot (`answerCallback.updateBlink`). */\n  | 'blink:update';\n\ntype EventListener<T = unknown> = (data: T) => void;\n\nexport interface CherryMiniAppOptions {\n  /** Milliseconds to wait for cherry:init from the host. Default: 10_000 */\n  initTimeout?: number;\n  /**\n   * When `true`, only Cherry-injected signals are used for environment\n   * detection (`window.__cherry` / `cherry_embed=1`). Fallbacks such as\n   * `ReactNativeWebView` or `window.parent !== window` are disabled.\n   *\n   * Use once all Cherry hosts you target have been updated to inject the\n   * new signals, to prevent false positives in wallet in-app browsers.\n   * Default: `false`.\n   */\n  strict?: boolean;\n}\n\nexport class CherryMiniApp {\n  private readonly bridge: Bridge;\n  private readonly eventListeners = new Map<string, Set<EventListener>>();\n  private removeHostListener: (() => void) | null = null;\n  private _isReady = false;\n  private _user: CherryUser | null = null;\n  private _room: CherryRoom | null = null;\n  private _launchToken: string | null = null;\n  private _publicKey: string | null = null;\n  private _blink: CherryBlinkContext | null = null;\n  private readonly initTimeout: number;\n\n  constructor(options: CherryMiniAppOptions = {}) {\n    this.bridge = getSharedBridge();\n    this.initTimeout = options.initTimeout ?? 10_000;\n  }\n\n  // ---- public state ----\n\n  get isReady(): boolean {\n    return this._isReady;\n  }\n\n  get user(): CherryUser {\n    this.assertReady();\n    return this._user!;\n  }\n\n  get room(): CherryRoom {\n    this.assertReady();\n    return this._room!;\n  }\n\n  get launchToken(): string {\n    this.assertReady();\n    return this._launchToken!;\n  }\n\n  /**\n   * Inline blink context (messageId, sender, viewer, params, …) — populated\n   * only when launched as an inline blink. `null` for fullscreen/embed.\n   */\n  get blink(): CherryBlinkContext | null {\n    return this._blink;\n  }\n\n  // ---- init ----\n\n  async init(): Promise<void> {\n    if (this._isReady) return;\n\n    // Inline blink bootstrap. The inline host (a chat-bubble card) does NOT\n    // push `cherry:init`; it answers a `host.init` request and supplies the\n    // viewer wallet + room/message context. Detected via `mode=inline` in the\n    // launch URL (query or fragment). Fullscreen / embed keep the cherry:init\n    // handshake below.\n    const mode = readLaunchParam('mode');\n    if (mode === 'inline' || mode === 'preview') {\n      // `preview` is a non-interactive render shown in the share picker before\n      // the message exists — same bootstrap as inline, but read-only and\n      // without a real messageId/room.\n      await this.initInline(mode === 'preview');\n      return;\n    }\n\n    const initMessage = await this.waitForInit();\n\n    // Decode JWT without verification (verification is server-side)\n    const payload = decodeJwt(initMessage.token) as unknown as LaunchTokenPayload;\n\n    this._launchToken = initMessage.token;\n    this._publicKey = payload.sub;\n\n    this._user = {\n      publicKey: payload.sub,\n      displayName: payload.user.display_name,\n      avatarUrl: payload.user.avatar_url,\n    };\n\n    this._room = {\n      id: payload.room_id,\n      title: payload.room.title,\n      memberCount: payload.room.member_count,\n    };\n\n    // Send ready acknowledgement\n    const readyMsg: BridgeReadyMessage = {\n      type: 'cherry:ready',\n      version: BRIDGE_VERSION,\n    };\n    this.bridge.sendToHost(readyMsg);\n\n    // Subscribe to host events (suspended, resumed, walletDisconnected, etc.)\n    this.removeHostListener = this.bridge.startListening((message: BridgeMessage) => {\n      if (message['type'] === 'cherry:event') {\n        const evt = message as unknown as BridgeEvent;\n        // Host events carry their payload under `payload` (e.g. blink:update);\n        // fall back to `data` for older/host-agnostic shapes.\n        this.emit(\n          evt.event as CherryMiniAppEvent,\n          (evt as { payload?: unknown }).payload ?? evt.data,\n        );\n      }\n    });\n\n    this._isReady = true;\n  }\n\n  /**\n   * Inline-mode bootstrap. Reads the launch token from the URL and pulls the\n   * viewer/room context from the host via a `host.init` bridge request (the\n   * inline host has no user-bearing token to push, so identity comes from the\n   * host, not the token). The blink's `params`/`messageId`/`route` are also\n   * available on the host.init response and via the launch token claims.\n   */\n  private async initInline(isPreview = false): Promise<void> {\n    const token = readLaunchParam('token');\n\n    let ctx: Record<string, unknown> = {};\n    try {\n      ctx = (await this.bridge.request('host.init', {})) as Record<\n        string,\n        unknown\n      >;\n    } catch {\n      // Host didn't answer host.init — leave ctx empty; we still expose\n      // whatever the token carries so the app can render in a degraded state.\n    }\n\n    const viewerWallet =\n      typeof ctx['viewerWallet'] === 'string' ? (ctx['viewerWallet'] as string) : '';\n    let roomId = typeof ctx['roomId'] === 'string' ? (ctx['roomId'] as string) : '';\n    const ctxMessageId =\n      typeof ctx['messageId'] === 'string' ? (ctx['messageId'] as string) : '';\n    const ctxRoute = typeof ctx['route'] === 'string' ? (ctx['route'] as string) : '';\n    const ctxParams =\n      ctx['params'] && typeof ctx['params'] === 'object'\n        ? (ctx['params'] as Record<string, unknown>)\n        : {};\n    const ctxHeight =\n      typeof ctx['height'] === 'string' ? (ctx['height'] as string) : 'medium';\n    const ctxInitialHeight =\n      typeof ctx['initialHeight'] === 'number'\n        ? (ctx['initialHeight'] as number)\n        : null;\n    const ctxParamsVersion =\n      typeof ctx['blink_params_version'] === 'number'\n        ? (ctx['blink_params_version'] as number)\n        : null;\n\n    this._launchToken = token ?? null;\n    this._publicKey = viewerWallet || null;\n\n    // Decode the launch token for claims the host.init response doesn't carry\n    // (sender, miniAppId/appId, source, interactive, token timing).\n    let claims: Partial<LaunchTokenPayload> = {};\n    if (token) {\n      try {\n        claims = decodeJwt(token) as unknown as LaunchTokenPayload;\n        if (!roomId) roomId = String(claims.room_id ?? '');\n      } catch {\n        // opaque token — ignore\n      }\n    }\n\n    this._user = {\n      publicKey: viewerWallet,\n      displayName: '',\n      avatarUrl: '',\n    };\n    this._room = {\n      id: roomId,\n      title: '',\n      memberCount: 0,\n    };\n\n    this._blink = {\n      messageId: ctxMessageId || String(claims.message_id ?? ''),\n      roomId,\n      viewerWallet,\n      sender: isPreview\n        ? viewerWallet || null\n        : claims.sender\n          ? String(claims.sender)\n          : null,\n      miniAppId: claims.mini_app_id ? String(claims.mini_app_id) : null,\n      appId: claims.app_id ? String(claims.app_id) : null,\n      route: ctxRoute || String(claims.route ?? '/'),\n      params: ctxParams,\n      height: ctxHeight,\n      // Host.init carries the resolved initial height; fall back to the token\n      // claim (`initial_height`) for SSR / before the bridge answers.\n      initialHeight:\n        ctxInitialHeight ??\n        (typeof claims.initial_height === 'number'\n          ? claims.initial_height\n          : null),\n      // Preview is always read-only; the eventual shared blink's author is the\n      // viewer doing the sharing, so report them as `sender` in preview.\n      interactive: isPreview ? false : claims.interactive !== false,\n      source: isPreview ? 'preview' : claims.source ? String(claims.source) : null,\n      isPreview,\n      blinkParamsVersion: ctxParamsVersion,\n      issuedAt: typeof claims.iat === 'number' ? claims.iat : null,\n      expiresAt: typeof claims.exp === 'number' ? claims.exp : null,\n      jti: claims.jti ? String(claims.jti) : null,\n    };\n\n    // Subscribe to host events (blink:update, suspended, etc.).\n    this.removeHostListener = this.bridge.startListening(\n      (message: BridgeMessage) => {\n        if (message['type'] === 'cherry:event') {\n          const evt = message as unknown as BridgeEvent;\n          this.emit(\n            evt.event as CherryMiniAppEvent,\n            (evt as { payload?: unknown }).payload ?? evt.data,\n          );\n        }\n      },\n    );\n\n    this._isReady = true;\n  }\n\n  private waitForInit(): Promise<BridgeInitMessage> {\n    // Check if cherry:init was already received before init() was called\n    const buffered = this.bridge.consumeBufferedInit();\n    if (buffered && buffered['type'] === 'cherry:init') {\n      return Promise.resolve(buffered as unknown as BridgeInitMessage);\n    }\n\n    return new Promise<BridgeInitMessage>((resolve, reject) => {\n      const timer = setTimeout(() => {\n        cleanup();\n        reject(new Error(`cherry:init not received within ${this.initTimeout}ms`));\n      }, this.initTimeout);\n\n      const cleanup = this.bridge.startListening((message: BridgeMessage) => {\n        if (message['type'] === 'cherry:init') {\n          clearTimeout(timer);\n          cleanup();\n          resolve(message as unknown as BridgeInitMessage);\n        }\n      });\n    });\n  }\n\n  // ---- wallet ----\n\n  /**\n   * Returns a stable wallet facade. Methods are arrow functions bound to the\n   * outer CherryMiniApp instance so `this` always resolves correctly.\n   * `publicKey` is a getter that reads the live `_publicKey` field.\n   */\n  get wallet(): {\n    readonly publicKey: string | null;\n    signTransaction(transaction: unknown): Promise<unknown>;\n    signAllTransactions(transactions: unknown[]): Promise<Uint8Array[]>;\n    signAndSendTransaction(transaction: unknown): Promise<string>;\n    signMessage(message: Uint8Array): Promise<Uint8Array>;\n  } {\n    // eslint-disable-next-line @typescript-eslint/no-this-alias\n    const self = this;\n    return {\n      get publicKey(): string | null {\n        return self._publicKey;\n      },\n      signTransaction(transaction: unknown): Promise<Uint8Array> {\n        self.assertReady();\n        return self.bridge\n          .request('wallet.signTransaction', {\n            transaction: serializeTxToBase64(transaction),\n          })\n          .then((result) => {\n            const tx = (result as Record<string, unknown>)?.['transaction'] ?? result;\n            return base64ToUint8Array(tx as string);\n          });\n      },\n      signAllTransactions(transactions: unknown[]): Promise<Uint8Array[]> {\n        self.assertReady();\n        const base64Txs = transactions.map(serializeTxToBase64);\n        return self.bridge\n          .request('wallet.signTransactions', { transactions: base64Txs })\n          .then((result) => {\n            const signedArray = (result as Record<string, unknown>)?.['transactions'] ?? result;\n            return (signedArray as string[]).map((tx) => base64ToUint8Array(tx));\n          });\n      },\n      signAndSendTransaction(transaction: unknown): Promise<string> {\n        self.assertReady();\n        return self.bridge.request('wallet.signAndSendTransaction', {\n          transaction: serializeTxToBase64(transaction),\n        }).then((result) => {\n          const sig = (result as Record<string, unknown>)?.['signature'] ?? result;\n          return sig as string;\n        });\n      },\n      signMessage(message: Uint8Array): Promise<Uint8Array> {\n        self.assertReady();\n        const base64 = uint8ArrayToBase64(message);\n        return self.bridge\n          .request('wallet.signMessage', { message: base64 })\n          .then((result) => {\n            const sig = (result as Record<string, unknown>)?.['signature'] ?? result;\n            return base64ToUint8Array(sig as string);\n          });\n      },\n    };\n  }\n\n  getPublicKey(): string | null {\n    return this._publicKey;\n  }\n\n  // ---- navigate ----\n\n  readonly navigate: CherryNavigate = {\n    userProfile: (identifier: string): Promise<void> => {\n      this.assertReady();\n      return this.bridge.request('navigate.userProfile', { identifier }) as Promise<void>;\n    },\n\n    openRoom: (identifier: string): Promise<void> => {\n      this.assertReady();\n      return this.bridge.request('navigate.openRoom', { identifier }) as Promise<void>;\n    },\n  };\n\n  // ---- share ----\n\n  /**\n   * Hand a \"result\" snapshot to the Cherry host so the user can share it into\n   * a DM or group as an interactive blink. The host opens a recipient picker\n   * with a preview; the returned promise resolves once the user picks a\n   * recipient (or cancels). The miniapp identity is taken from the current\n   * session — a miniapp can only share itself, read-only.\n   */\n  share(options: ShareBlinkOptions = {}): Promise<ShareBlinkResult> {\n    this.assertReady();\n    return this.bridge.request('host.share', {\n      ...(options.route !== undefined ? { route: options.route } : {}),\n      ...(options.params !== undefined ? { params: options.params } : {}),\n      ...(options.height !== undefined ? { height: options.height } : {}),\n      ...(options.initialHeight !== undefined\n        ? { initialHeight: options.initialHeight }\n        : {}),\n      ...(options.caption !== undefined ? { caption: options.caption } : {}),\n      ...(options.previewable !== undefined\n        ? { previewable: options.previewable }\n        : {}),\n    }) as Promise<ShareBlinkResult>;\n  }\n\n  // ---- event emitter ----\n\n  on(event: CherryMiniAppEvent, listener: EventListener): void {\n    let set = this.eventListeners.get(event);\n    if (!set) {\n      set = new Set();\n      this.eventListeners.set(event, set);\n    }\n    set.add(listener);\n  }\n\n  off(event: CherryMiniAppEvent, listener: EventListener): void {\n    this.eventListeners.get(event)?.delete(listener);\n  }\n\n  private emit(event: string, data?: unknown): void {\n    const set = this.eventListeners.get(event);\n    if (!set) return;\n    for (const listener of set) {\n      try {\n        listener(data);\n      } catch {\n        // Swallow listener errors to avoid disrupting the SDK\n      }\n    }\n  }\n\n  // ---- cleanup ----\n\n  destroy(): void {\n    this.removeHostListener?.();\n    this.removeHostListener = null;\n    this.eventListeners.clear();\n    this._isReady = false;\n    this._blink = null;\n    destroySharedBridge();\n  }\n\n  // ---- private helpers ----\n\n  private assertReady(): void {\n    if (!this._isReady) {\n      throw new Error('CherryMiniApp is not ready. Call init() first.');\n    }\n  }\n}\n\n// ---- launch URL helpers ----\n\n/**\n * Read a launch parameter from the current URL — checks the query string first,\n * then the fragment (`#...`). Inline blinks carry `token`/`mode`/`route` in the\n * fragment and `cherry_embed=1` in the query; this reads either location.\n */\nfunction readLaunchParam(name: string): string | null {\n  if (typeof window === 'undefined') return null;\n  try {\n    const fromSearch = new URLSearchParams(window.location.search).get(name);\n    if (fromSearch !== null) return fromSearch;\n    const hash = window.location.hash.replace(/^#/, '');\n    return new URLSearchParams(hash).get(name);\n  } catch {\n    return null;\n  }\n}\n\n// ---- transaction helpers ----\n\nfunction serializeTxToBase64(tx: unknown): string {\n  if (typeof tx === 'string') return tx; // already base64\n  if (tx instanceof Uint8Array) return uint8ArrayToBase64(tx); // raw bytes\n  if (isSerializableTx(tx)) {\n    return uint8ArrayToBase64((tx as { serialize(opts?: { requireAllSignatures?: boolean }): Uint8Array }).serialize({ requireAllSignatures: false }));\n  }\n  throw new TypeError('Transaction must be a Uint8Array, base64 string, or have a serialize() method');\n}\n\nfunction isSerializableTx(tx: unknown): boolean {\n  if (typeof tx !== 'object' || tx === null) return false;\n  return typeof (tx as Record<string, unknown>)['serialize'] === 'function';\n}\n\nfunction uint8ArrayToBase64(arr: Uint8Array): string {\n  let binary = '';\n  for (let i = 0; i < arr.length; i++) {\n    binary += String.fromCharCode(arr[i]!);\n  }\n  return btoa(binary);\n}\n\nfunction base64ToUint8Array(base64: string): Uint8Array {\n  const binary = atob(base64);\n  const bytes = new Uint8Array(binary.length);\n  for (let i = 0; i < binary.length; i++) {\n    bytes[i] = binary.charCodeAt(i);\n  }\n  return bytes;\n}\n","import React, {\n  createContext,\n  useContext,\n  useEffect,\n  useRef,\n  useState,\n  type ReactNode,\n} from 'react';\nimport { CherryMiniApp, type CherryMiniAppOptions } from '../client';\nimport type { CherryUser, CherryRoom } from '../types';\n\n// ---- context shape ----\n\ninterface CherryMiniAppContextValue {\n  app: CherryMiniApp | null;\n  isReady: boolean;\n  user: CherryUser | null;\n  room: CherryRoom | null;\n  launchToken: string | null;\n  error: Error | null;\n}\n\nconst CherryMiniAppContext = createContext<CherryMiniAppContextValue | null>(null);\n\n// ---- provider ----\n\nexport interface CherryMiniAppProviderProps extends CherryMiniAppOptions {\n  children: ReactNode;\n}\n\nexport function CherryMiniAppProvider({\n  children,\n  initTimeout,\n  strict,\n}: CherryMiniAppProviderProps): React.JSX.Element {\n  const appRef = useRef<CherryMiniApp | null>(null);\n  const [isReady, setIsReady] = useState(false);\n  const [user, setUser] = useState<CherryUser | null>(null);\n  const [room, setRoom] = useState<CherryRoom | null>(null);\n  const [launchToken, setLaunchToken] = useState<string | null>(null);\n  const [error, setError] = useState<Error | null>(null);\n\n  useEffect(() => {\n    const opts: import('../client').CherryMiniAppOptions = {};\n    if (initTimeout !== undefined) opts.initTimeout = initTimeout;\n    if (strict !== undefined) opts.strict = strict;\n    const app = new CherryMiniApp(opts);\n    appRef.current = app;\n\n    app\n      .init()\n      .then(() => {\n        setUser(app.user);\n        setRoom(app.room);\n        setLaunchToken(app.launchToken);\n        setIsReady(true);\n      })\n      .catch((err: unknown) => {\n        setError(err instanceof Error ? err : new Error(String(err)));\n      });\n\n    return () => {\n      app.destroy();\n      appRef.current = null;\n    };\n  // initTimeout is intentionally not in deps — only used at construction time\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, []);\n\n  const value: CherryMiniAppContextValue = {\n    app: appRef.current,\n    isReady,\n    user,\n    room,\n    launchToken,\n    error,\n  };\n\n  return (\n    <CherryMiniAppContext.Provider value={value}>\n      {children}\n    </CherryMiniAppContext.Provider>\n  );\n}\n\n// ---- internal hook (used by public hooks) ----\n\nexport function useCherryMiniAppContext(): CherryMiniAppContextValue {\n  const ctx = useContext(CherryMiniAppContext);\n  if (ctx === null) {\n    throw new Error(\n      'useCherryMiniApp* hooks must be used inside <CherryMiniAppProvider>',\n    );\n  }\n  return ctx;\n}\n","import { useMemo, useCallback } from 'react';\nimport { useCherryMiniAppContext } from './provider';\nimport { getCherryEnvironment, type DetectPlatformOptions } from '../env';\nimport type {\n  CherryUser,\n  CherryRoom,\n  CherryEnvironment,\n  CherryNavigate,\n  CherryBlinkContext,\n  ShareBlinkOptions,\n  ShareBlinkResult,\n} from '../types';\n\n// ---- useCherryMiniApp ----\n\nexport interface UseCherryMiniAppResult {\n  user: CherryUser | null;\n  room: CherryRoom | null;\n  launchToken: string | null;\n  isReady: boolean;\n  error: Error | null;\n}\n\nexport function useCherryMiniApp(): UseCherryMiniAppResult {\n  const { user, room, launchToken, isReady, error } = useCherryMiniAppContext();\n  return { user, room, launchToken, isReady, error };\n}\n\n// ---- useCherryApp (access CherryMiniApp instance for kit signer etc.) ----\n\nexport function useCherryApp() {\n  const { app } = useCherryMiniAppContext();\n  return app;\n}\n\n// ---- useCherryWallet ----\n\nexport interface UseCherryWalletResult {\n  publicKey: string | null;\n  connected: boolean;\n  signTransaction(transaction: unknown): Promise<unknown>;\n  signAllTransactions(transactions: unknown[]): Promise<Uint8Array[]>;\n  signMessage(message: Uint8Array): Promise<Uint8Array>;\n  signAndSendTransaction(transaction: unknown): Promise<string>;\n}\n\nexport function useCherryWallet(): UseCherryWalletResult {\n  const { app, user, isReady } = useCherryMiniAppContext();\n\n  return useMemo<UseCherryWalletResult>(\n    () => ({\n      publicKey: user?.publicKey ?? null,\n      connected: isReady && user !== null,\n\n      signTransaction(transaction: unknown): Promise<unknown> {\n        if (!app) {\n          return Promise.reject(new Error('CherryMiniApp not initialised'));\n        }\n        return app.wallet.signTransaction(transaction);\n      },\n\n      signAllTransactions(transactions: unknown[]): Promise<Uint8Array[]> {\n        if (!app) {\n          return Promise.reject(new Error('CherryMiniApp not initialised'));\n        }\n        return app.wallet.signAllTransactions(transactions);\n      },\n\n      signMessage(message: Uint8Array): Promise<Uint8Array> {\n        if (!app) {\n          return Promise.reject(new Error('CherryMiniApp not initialised'));\n        }\n        return app.wallet.signMessage(message);\n      },\n\n      signAndSendTransaction(transaction: unknown): Promise<string> {\n        if (!app) {\n          return Promise.reject(new Error('CherryMiniApp not initialised'));\n        }\n        return app.wallet.signAndSendTransaction(transaction);\n      },\n    }),\n    // Rebuild only when app / user readiness changes\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [app, isReady, user?.publicKey],\n  );\n}\n\n// ---- useCherryNavigate ----\n\nexport function useCherryNavigate(): CherryNavigate {\n  const { app } = useCherryMiniAppContext();\n\n  const userProfile = useCallback(\n    (publicKey: string) => {\n      if (!app) return Promise.reject(new Error('CherryMiniApp not initialised'));\n      return app.navigate.userProfile(publicKey);\n    },\n    [app],\n  );\n\n  const openRoom = useCallback(\n    (roomId: string) => {\n      if (!app) return Promise.reject(new Error('CherryMiniApp not initialised'));\n      return app.navigate.openRoom(roomId);\n    },\n    [app],\n  );\n\n  return useMemo(() => ({ userProfile, openRoom }), [userProfile, openRoom]);\n}\n\n// ---- useCherryBlink ----\n\n/**\n * Returns the inline blink context (messageId, sender, viewer, params, …) when\n * the mini-app is rendered as an inline blink, or `null` otherwise. Use it to\n * render per-message (\"unique blink\") state.\n */\nexport function useCherryBlink(): CherryBlinkContext | null {\n  const { app, isReady } = useCherryMiniAppContext();\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  return useMemo(() => app?.blink ?? null, [app, isReady]);\n}\n\n// ---- useCherryShare ----\n\n/**\n * Returns a `share` function that hands a \"result\" snapshot to the Cherry host\n * so the user can reshare it into a DM or group as a read-only blink. Resolves\n * once the user picks a recipient (or cancels).\n */\nexport function useCherryShare(): (\n  options?: ShareBlinkOptions,\n) => Promise<ShareBlinkResult> {\n  const { app } = useCherryMiniAppContext();\n  return useCallback(\n    (options: ShareBlinkOptions = {}) => {\n      if (!app) return Promise.reject(new Error('CherryMiniApp not initialised'));\n      return app.share(options);\n    },\n    [app],\n  );\n}\n\n// ---- useCherryEnvironment ----\n\n/**\n * Synchronous — does NOT require CherryMiniAppProvider.\n * Safe to call at the top of any component before the provider tree is mounted.\n *\n * Pass `{ strict: true }` to disable fallback detection and only accept\n * Cherry-injected signals (`window.__cherry` / `cherry_embed=1`).\n */\nexport function useCherryEnvironment(options: DetectPlatformOptions = {}): CherryEnvironment {\n  const { strict } = options;\n  // Stable reference: environment detection never changes after page load.\n  // strict is captured once at mount — changing it at runtime is not supported.\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  return useMemo(() => getCherryEnvironment(strict !== undefined ? { strict } : {}), []);\n}\n","import * as jose from 'jose';\nimport type { LaunchTokenPayload } from './types';\n\nconst DEFAULT_JWKS_URL = 'https://chat.cherry.fun/.well-known/jwks.json';\n\nexport async function verifyLaunchToken(\n  token: string,\n  options: {\n    jwksUrl?: string;\n    expectedAppId: string;\n    expectedOrigin?: string;\n  },\n): Promise<LaunchTokenPayload> {\n  const jwks = jose.createRemoteJWKSet(new URL(options.jwksUrl ?? DEFAULT_JWKS_URL));\n  const { payload } = await jose.jwtVerify(token, jwks, {\n    algorithms: ['RS256'],\n  });\n\n  if (payload['app_id'] !== options.expectedAppId) {\n    throw new Error(\n      `Token app_id mismatch: expected ${options.expectedAppId}, got ${String(payload['app_id'])}`,\n    );\n  }\n  if (options.expectedOrigin && payload['origin'] !== options.expectedOrigin) {\n    throw new Error(\n      `Token origin mismatch: expected ${options.expectedOrigin}, got ${String(payload['origin'])}`,\n    );\n  }\n\n  return payload as unknown as LaunchTokenPayload;\n}\n"]}