{"version":3,"sources":["../src/index.ts","../src/util.ts","../src/queue.ts","../src/store.ts","../src/types.ts","../src/client.ts","../src/theme.ts","../src/react/context.tsx","../src/react/hooks.ts"],"sourcesContent":["export { WherdClient } from \"./client\";\nexport type { WherdClientOptions, SubmitResult } from \"./client\";\nexport { OfflineQueue } from \"./queue\";\nexport type { QueuedAction } from \"./queue\";\nexport { Store } from \"./store\";\nexport type { WherdState } from \"./store\";\nexport { resolveTheme } from \"./theme\";\nexport type { ResolvedTheme } from \"./theme\";\nexport { uid, timeAgo, formatMessageTime } from \"./util\";\n\nexport type {\n  ActivationConfig,\n  AutoShowConfig,\n  Announcement,\n  AnnouncementSeverity,\n  AnnouncementsResponse,\n  ChangelogEntry,\n  ChangelogResponse,\n  FeatureRequest,\n  FeatureRequestStatus,\n  IdentifyResponse,\n  MessageAuthor,\n  MessageReply,\n  MessageThread,\n  MessagesResponse,\n  MessageType,\n  StartMessageResponse,\n  WherdUser,\n  WherdView,\n  ThemeTokens,\n  WidgetConfig,\n} from \"./types\";\nexport {\n  activationConfigSchema,\n  themeTokensSchema,\n  widgetConfigSchema,\n} from \"./types\";\n\nexport type {\n  DeviceAdapter,\n  EventSourceAdapter,\n  PlatformAdapters,\n  ShakeAdapter,\n  StorageAdapter,\n} from \"./adapters\";\n\nexport { WherdCoreProvider, useWherdClient } from \"./react/context\";\nexport {\n  useActivation,\n  useAnnouncements,\n  useChangelog,\n  useComposer,\n  useFeatureRequests,\n  useMessages,\n  useShakeHint,\n  useWherd,\n  useWherdState,\n  useResolvedTheme,\n  useUnreadChangelog,\n  useUnreadMessages,\n} from \"./react/hooks\";\n","// Prefer crypto.randomUUID when available (web + modern RN via Hermes),\n// fall back to a timestamp + random string otherwise.\nexport function uid(prefix = \"\"): string {\n  const g = globalThis as { crypto?: { randomUUID?: () => string } };\n  if (g.crypto?.randomUUID) return prefix + g.crypto.randomUUID();\n  return (\n    prefix +\n    Date.now().toString(36) +\n    Math.random().toString(36).slice(2, 10)\n  );\n}\n\n// Compact \"time since\" for tight spots like the thread-list preview:\n// \"now\", \"5m\", \"3h\", \"2d\", then falls back to an abbreviated date.\nexport function timeAgo(iso: string): string {\n  const then = new Date(iso).getTime();\n  if (Number.isNaN(then)) return \"\";\n  const secs = Math.max(0, Math.round((Date.now() - then) / 1000));\n  if (secs < 45) return \"now\";\n  const mins = Math.round(secs / 60);\n  if (mins < 60) return `${mins}m`;\n  const hours = Math.round(mins / 60);\n  if (hours < 24) return `${hours}h`;\n  const days = Math.round(hours / 24);\n  if (days < 7) return `${days}d`;\n  return new Date(iso).toLocaleDateString(undefined, { month: \"short\", day: \"numeric\" });\n}\n\n// Fuller timestamp for inside a conversation: the clock time for today, or\n// \"Jun 12, 3:42 PM\" once it's an older day (year added when not the current one).\nexport function formatMessageTime(iso: string): string {\n  const date = new Date(iso);\n  if (Number.isNaN(date.getTime())) return \"\";\n  const now = new Date();\n  const time = date.toLocaleTimeString(undefined, { hour: \"numeric\", minute: \"2-digit\" });\n  if (date.toDateString() === now.toDateString()) return time;\n  const day = date.toLocaleDateString(undefined, {\n    month: \"short\",\n    day: \"numeric\",\n    ...(date.getFullYear() === now.getFullYear() ? {} : { year: \"numeric\" }),\n  });\n  return `${day}, ${time}`;\n}\n","import type { StorageAdapter } from \"./adapters\";\nimport { uid } from \"./util\";\n\nexport interface QueuedAction {\n  id: string;\n  // Queue endpoint segment under /v1/* (e.g. \"messages\").\n  type: \"messages\";\n  payload: Record<string, unknown>;\n  createdAt: number;\n}\n\nconst QUEUE_KEY = \"wherd:queue\";\n\n// Durable FIFO queue so feedback submitted offline is retried later.\nexport class OfflineQueue {\n  private items: QueuedAction[] = [];\n  private loaded = false;\n\n  constructor(private readonly storage: StorageAdapter) {}\n\n  async load(): Promise<void> {\n    if (this.loaded) return;\n    const raw = await this.storage.getItem(QUEUE_KEY);\n    if (raw) {\n      try {\n        this.items = JSON.parse(raw) as QueuedAction[];\n      } catch {\n        this.items = [];\n      }\n    }\n    this.loaded = true;\n  }\n\n  private async persist(): Promise<void> {\n    await this.storage.setItem(QUEUE_KEY, JSON.stringify(this.items));\n  }\n\n  async enqueue(type: QueuedAction[\"type\"], payload: Record<string, unknown>): Promise<QueuedAction> {\n    await this.load();\n    const action: QueuedAction = { id: uid(), type, payload, createdAt: Date.now() };\n    this.items.push(action);\n    await this.persist();\n    return action;\n  }\n\n  async remove(id: string): Promise<void> {\n    await this.load();\n    this.items = this.items.filter((a) => a.id !== id);\n    await this.persist();\n  }\n\n  async list(): Promise<QueuedAction[]> {\n    await this.load();\n    return [...this.items];\n  }\n}\n","import type {\n  ActivationConfig,\n  Announcement,\n  MessageThread,\n  WherdUser,\n  WherdView,\n  ThemeTokens,\n  WidgetConfig,\n} from \"./types\";\n\nexport interface WherdState {\n  /** True once init() (config load + identity) has completed. */\n  ready: boolean;\n  isOpen: boolean;\n  view: WherdView;\n  config: WidgetConfig | null;\n  /** Theme passed by the developer via the Provider — overrides server config. */\n  localTheme: ThemeTokens | null;\n  /** Activation overrides from the Provider — override server config (fab/shake). */\n  localActivation: Partial<ActivationConfig> | null;\n  user: WherdUser | null;\n  verified: boolean;\n  /** Unread changelog count — drives the \"What's New\" badge app-wide. */\n  changelogUnread: number;\n  /** The user's message threads (shared so live updates reach every view). */\n  messages: MessageThread[];\n  /** Unread admin replies across the user's message threads. */\n  messagesUnread: number;\n  /** Active, non-dismissed announcements (banners). */\n  announcements: Announcement[];\n  /** Bumped on each live feature-request event so list hooks refetch. */\n  featureRequestsRevision: number;\n}\n\n// Minimal observable store, compatible with React's useSyncExternalStore.\nexport class Store {\n  private state: WherdState;\n  private listeners = new Set<() => void>();\n\n  constructor(initial: WherdState) {\n    this.state = initial;\n  }\n\n  getSnapshot = (): WherdState => this.state;\n\n  subscribe = (listener: () => void): (() => void) => {\n    this.listeners.add(listener);\n    return () => this.listeners.delete(listener);\n  };\n\n  set(patch: Partial<WherdState>): void {\n    this.state = { ...this.state, ...patch };\n    for (const l of this.listeners) l();\n  }\n}\n","import { z } from \"zod\";\n\n// ---- Server-driven widget config (mirrors the API's /v1/config response) ----\n\nexport const themeTokensSchema = z\n  .object({\n    colorScheme: z.enum([\"light\", \"dark\", \"system\"]).optional(),\n    colors: z.record(z.string(), z.string().optional()).optional(),\n    radius: z.number().optional(),\n    typography: z\n      .record(z.string(), z.union([z.string(), z.number()]).optional())\n      .optional(),\n  })\n  .nullable();\nexport type ThemeTokens = z.infer<typeof themeTokensSchema>;\n\nexport const activationConfigSchema = z.object({\n  fab: z.boolean(),\n  shake: z.boolean(),\n  programmatic: z.boolean(),\n});\nexport type ActivationConfig = z.infer<typeof activationConfigSchema>;\n\nexport const widgetConfigSchema = z.object({\n  theme: themeTokensSchema,\n  enabledModules: z.object({\n    messages: z.boolean(),\n    featureRequests: z.boolean(),\n    changelog: z.boolean(),\n  }),\n  copy: z.record(z.string(), z.string().optional()).nullable(),\n  activation: activationConfigSchema,\n  autoShow: z\n    .object({\n      announcements: z.boolean(),\n      changelog: z.boolean(),\n      messages: z.boolean().optional(),\n    })\n    .optional(),\n});\nexport type WidgetConfig = z.infer<typeof widgetConfigSchema>;\n\nexport interface AutoShowConfig {\n  announcements: boolean;\n  changelog: boolean;\n  /** Auto-open the panel to a thread when there's a new unread admin reply. */\n  messages: boolean;\n}\n\n// ---- Identity ----\n\nexport interface WherdUser {\n  /** Your stable user id (becomes externalId server-side). */\n  id: string;\n  email?: string;\n  name?: string;\n  /** HMAC-SHA256(id, secretKey) computed on your server — marks identity verified. */\n  userHash?: string;\n  traits?: Record<string, unknown>;\n}\n\n// ---- Views the widget can show ----\n\nexport type WherdView = \"messages\" | \"changelog\" | \"featureRequests\";\n\n/** Message category shown as chips when starting a new thread. */\nexport type MessageType = \"idea\" | \"issue\" | \"other\";\n\n// ---- API response shapes ----\n\nexport interface IdentifyResponse {\n  endUserId: string;\n  verified: boolean;\n}\n\nexport interface StartMessageResponse {\n  id: string;\n  createdAt: string;\n}\n\n// ---- Messages (two-way threads) ----\n\nexport type MessageAuthor = \"user\" | \"admin\";\n\nexport interface MessageReply {\n  author: MessageAuthor;\n  body: string;\n  createdAt: string;\n}\n\nexport interface MessageThread {\n  id: string;\n  /** Who opened the thread. Defaults to \"user\"; \"admin\" means an operator\n   * reached out first, so the opening body renders as their message. */\n  origin?: MessageAuthor;\n  body: string;\n  createdAt: string;\n  /** Admin replies the end-user hasn't read yet. */\n  unread: number;\n  replies: MessageReply[];\n}\n\nexport interface MessagesResponse {\n  threads: MessageThread[];\n  unreadTotal: number;\n}\n\n// ---- Announcements (broadcasts) ----\n\nexport type AnnouncementSeverity = \"info\" | \"warning\" | \"critical\";\n\nexport interface Announcement {\n  id: string;\n  title: string;\n  body: string;\n  severity: AnnouncementSeverity;\n  publishedAt: string | null;\n}\n\nexport interface AnnouncementsResponse {\n  announcements: Announcement[];\n}\n\nexport interface ChangelogEntry {\n  id: string;\n  title: string;\n  body: string;\n  publishedAt: string | null;\n  read: boolean;\n}\n\nexport interface ChangelogResponse {\n  entries: ChangelogEntry[];\n  unreadCount: number;\n}\n\nexport type FeatureRequestStatus = \"open\" | \"planned\" | \"in_progress\" | \"done\";\n\nexport interface FeatureRequest {\n  id: string;\n  title: string;\n  body: string | null;\n  status: FeatureRequestStatus;\n  voteCount: number;\n  createdAt: string;\n  hasVoted: boolean;\n}\n","import type { PlatformAdapters } from \"./adapters\";\nimport { OfflineQueue } from \"./queue\";\nimport { Store } from \"./store\";\nimport {\n  type ActivationConfig,\n  type AutoShowConfig,\n  type AnnouncementsResponse,\n  type ChangelogEntry,\n  type ChangelogResponse,\n  type FeatureRequest,\n  type IdentifyResponse,\n  type MessagesResponse,\n  type StartMessageResponse,\n  type WherdUser,\n  type WherdView,\n  type ThemeTokens,\n  widgetConfigSchema,\n} from \"./types\";\nimport { uid } from \"./util\";\n\nexport interface WherdClientOptions {\n  /** The project's publishable public key (pk_...). */\n  publicKey: string;\n  /** Wherd API base URL. Defaults to the hosted API; override only for local dev. */\n  apiUrl?: string;\n  user?: WherdUser;\n  /** Developer theme override, merged over server config. */\n  theme?: ThemeTokens;\n  /** Activation overrides (fab/shake), merged over server config. */\n  activation?: Partial<ActivationConfig>;\n  /** Auto-show overrides (announcements/changelog), merged over server config. */\n  autoShow?: Partial<AutoShowConfig>;\n  adapters: PlatformAdapters;\n}\n\nexport interface SubmitResult {\n  ok: boolean;\n  queued: boolean;\n  id?: string;\n  error?: string;\n}\n\nconst ANON_KEY = \"wherd:anonymousId\";\nconst CHANGELOG_SEEN_KEY = \"wherd:changelogAutoShown\";\nconst ANNOUNCEMENT_SEEN_KEY = \"wherd:announcementAutoShown\";\nconst ANNOUNCEMENT_DISMISSED_KEY = \"wherd:announcementsDismissed\";\nconst MESSAGE_SEEN_KEY = \"wherd:messagesAutoShown\";\nconst SHAKE_HINT_KEY = \"wherd:shakeHintShown\";\nconst DEFAULT_API_URL = \"https://api.wherd.io\";\nconst AUTO_SHOW_DEFAULTS: AutoShowConfig = { announcements: true, changelog: false, messages: false };\n\n// The headless brain: identity, config, feedback submission, offline queue,\n// and the observable UI store. UI packages render from this; they hold no logic.\nexport class WherdClient {\n  readonly store: Store;\n  readonly queue: OfflineQueue;\n\n  private readonly adapters: PlatformAdapters;\n  private readonly publicKey: string;\n  private readonly apiUrl: string;\n  private anonymousId = \"\";\n  private user: WherdUser | null;\n  private readonly localAutoShow: Partial<AutoShowConfig> | null;\n  // Announcement IDs the user has dismissed; persisted so they never reshow\n  // after a reload or new session. Hydrated from storage in init().\n  private dismissedAnnouncements = new Set<string>();\n  // Closes the live (SSE) connection when set; null when not connected.\n  private liveDispose: (() => void) | null = null;\n\n  constructor(opts: WherdClientOptions) {\n    this.publicKey = opts.publicKey;\n    this.apiUrl = (opts.apiUrl ?? DEFAULT_API_URL).replace(/\\/$/, \"\");\n    this.adapters = opts.adapters;\n    this.user = opts.user ?? null;\n    this.localAutoShow = opts.autoShow ?? null;\n    this.queue = new OfflineQueue(opts.adapters.storage);\n    this.store = new Store({\n      ready: false,\n      isOpen: false,\n      view: \"messages\",\n      config: null,\n      localTheme: opts.theme ?? null,\n      localActivation: opts.activation ?? null,\n      user: this.user,\n      verified: false,\n      changelogUnread: 0,\n      messages: [],\n      messagesUnread: 0,\n      announcements: [],\n      featureRequestsRevision: 0,\n    });\n  }\n\n  async init(): Promise<void> {\n    let anon = await this.adapters.storage.getItem(ANON_KEY);\n    if (!anon) {\n      anon = uid(\"anon_\");\n      await this.adapters.storage.setItem(ANON_KEY, anon);\n    }\n    this.anonymousId = anon;\n\n    const dismissed = await this.adapters.storage.getItem(ANNOUNCEMENT_DISMISSED_KEY);\n    if (dismissed) {\n      try {\n        const ids = JSON.parse(dismissed) as string[];\n        for (const id of ids) this.dismissedAnnouncements.add(id);\n      } catch {\n        // corrupt value — start fresh\n      }\n    }\n\n    await this.refreshConfig();\n    await this.flush();\n    if (this.user) await this.identify(this.user);\n    const changelog = await this.refreshChangelog();\n    const messages = await this.refreshMessages();\n    await this.refreshAnnouncements();\n\n    this.store.set({ ready: true });\n\n    // Auto-surface new broadcasts once (config-driven; see autoShow()).\n    await this.maybeAutoShowAnnouncement();\n    await this.maybeAutoShowChangelog(changelog.entries);\n    await this.maybeAutoShowMessages(messages);\n  }\n\n  // Effective auto-show: server config overridden by the Provider's `autoShow`.\n  private autoShow(): AutoShowConfig {\n    const cfg = this.store.getSnapshot().config?.autoShow ?? AUTO_SHOW_DEFAULTS;\n    // Defaults first so every key stays a boolean even when the server config\n    // (or local override) omits the newer `messages` flag.\n    return { ...AUTO_SHOW_DEFAULTS, ...cfg, ...(this.localAutoShow ?? {}) };\n  }\n\n  // Auto-open the widget when a new active announcement is available (once per\n  // announcement). On by default — announcements are time-sensitive.\n  private async maybeAutoShowAnnouncement(): Promise<void> {\n    if (!this.autoShow().announcements) return;\n    const active = this.store.getSnapshot().announcements;\n    const newest = active[0];\n    if (!newest) return;\n    const marker = newest.publishedAt ?? newest.id;\n    const seen = await this.adapters.storage.getItem(ANNOUNCEMENT_SEEN_KEY);\n    if (seen === marker) return;\n    await this.adapters.storage.setItem(ANNOUNCEMENT_SEEN_KEY, marker);\n    this.open();\n  }\n\n  // Opens \"What's New\" automatically the first time a newer published entry is\n  // seen. Off by default (changelog is less urgent); enable via autoShow.\n  private async maybeAutoShowChangelog(entries: ChangelogEntry[]): Promise<void> {\n    if (!this.autoShow().changelog) return;\n    const newest = entries.find((e) => e.publishedAt) ?? entries[0];\n    if (!newest) return;\n    const marker = newest.publishedAt ?? newest.id;\n    const seen = await this.adapters.storage.getItem(CHANGELOG_SEEN_KEY);\n    if (seen === marker) return;\n    await this.adapters.storage.setItem(CHANGELOG_SEEN_KEY, marker);\n    // Only interrupt the user when there's genuinely something unread.\n    if (this.store.getSnapshot().changelogUnread > 0) this.open(\"changelog\");\n  }\n\n  // Auto-open the panel to messages when a new unread admin reply arrives.\n  // Off by default (opt-in via autoShow) — a reply is a direct response, so the\n  // interrupt is warranted, but only once per reply. The marker is the newest\n  // reply timestamp, so it re-fires when a genuinely newer reply lands.\n  private async maybeAutoShowMessages(data: MessagesResponse): Promise<void> {\n    if (!this.autoShow().messages) return;\n    if (data.unreadTotal <= 0) return;\n    let marker = \"\";\n    for (const thread of data.threads) {\n      for (const reply of thread.replies) {\n        if (reply.createdAt > marker) marker = reply.createdAt;\n      }\n    }\n    if (!marker) return;\n    const seen = await this.adapters.storage.getItem(MESSAGE_SEEN_KEY);\n    if (seen === marker) return;\n    await this.adapters.storage.setItem(MESSAGE_SEEN_KEY, marker);\n    this.open(\"messages\");\n  }\n\n  // Open a live (SSE) connection so data updates push in real time. Idempotent:\n  // re-opening closes any prior connection (used to re-key on identity change).\n  // No-op when no eventSource adapter is wired (the SDK stays pull-only).\n  // Returns an unsubscribe that closes the connection.\n  subscribeLive(): () => void {\n    this.disconnectLive();\n    const adapter = this.adapters.eventSource;\n    if (!adapter) return () => {};\n    const params = new URLSearchParams({\n      key: this.publicKey,\n      anonymousId: this.anonymousId,\n    });\n    if (this.user?.id) params.set(\"externalId\", this.user.id);\n    this.liveDispose = adapter.connect(\n      `${this.apiUrl}/v1/stream?${params.toString()}`,\n      (type) => void this.handleLiveEvent(type),\n    );\n    return () => this.disconnectLive();\n  }\n\n  disconnectLive(): void {\n    this.liveDispose?.();\n    this.liveDispose = null;\n  }\n\n  // React to a live signal by refetching the named resource (and re-running\n  // auto-show, mirroring the foreground path).\n  private async handleLiveEvent(type: string): Promise<void> {\n    switch (type) {\n      case \"messages\": {\n        const data = await this.refreshMessages();\n        await this.maybeAutoShowMessages(data);\n        break;\n      }\n      case \"announcements\": {\n        await this.refreshAnnouncements();\n        await this.maybeAutoShowAnnouncement();\n        break;\n      }\n      case \"changelog\": {\n        const data = await this.refreshChangelog();\n        await this.maybeAutoShowChangelog(data.entries);\n        break;\n      }\n      case \"featureRequests\": {\n        const rev = this.store.getSnapshot().featureRequestsRevision + 1;\n        this.store.set({ featureRequestsRevision: rev });\n        break;\n      }\n      // \"ping\" (heartbeat) and unknown types are ignored.\n    }\n  }\n\n  // Refetch everything the store tracks (messages, announcements, changelog)\n  // and re-run auto-show. Called on app foreground so all data catches up — and\n  // auto-opens if a new item warrants it — after the app was backgrounded.\n  async foregroundRefresh(): Promise<void> {\n    const [messages, changelog] = await Promise.all([\n      this.refreshMessages(),\n      this.refreshChangelog(),\n      this.refreshAnnouncements(),\n    ]);\n    await this.maybeAutoShowAnnouncement();\n    await this.maybeAutoShowChangelog(changelog.entries);\n    await this.maybeAutoShowMessages(messages);\n  }\n\n  // One-time shake-to-open hint persistence (used by the RN widget).\n  async shouldShowShakeHint(): Promise<boolean> {\n    return (await this.adapters.storage.getItem(SHAKE_HINT_KEY)) == null;\n  }\n  async dismissShakeHint(): Promise<void> {\n    await this.adapters.storage.setItem(SHAKE_HINT_KEY, \"1\");\n  }\n\n  private headers(): Record<string, string> {\n    return {\n      \"Content-Type\": \"application/json\",\n      Authorization: `Bearer ${this.publicKey}`,\n    };\n  }\n\n  getAnonymousId(): string {\n    return this.anonymousId;\n  }\n\n  async refreshConfig(): Promise<void> {\n    try {\n      const res = await fetch(`${this.apiUrl}/v1/config`, { headers: this.headers() });\n      if (res.ok) {\n        const config = widgetConfigSchema.parse(await res.json());\n        this.store.set({ config });\n      }\n    } catch {\n      // Config is best-effort; UI falls back to its own defaults.\n    }\n  }\n\n  async identify(user: WherdUser): Promise<void> {\n    this.user = user;\n    this.store.set({ user });\n    try {\n      const res = await fetch(`${this.apiUrl}/v1/identify`, {\n        method: \"POST\",\n        headers: this.headers(),\n        body: JSON.stringify({\n          anonymousId: this.anonymousId,\n          externalId: user.id,\n          email: user.email,\n          name: user.name,\n          traits: user.traits,\n          userHash: user.userHash,\n        }),\n      });\n      if (res.ok) {\n        const json = (await res.json()) as IdentifyResponse;\n        this.store.set({ verified: json.verified });\n      }\n    } catch {\n      // Identity is non-fatal; feedback still works anonymously.\n    }\n    // Re-key the live stream to the new identity if it's already open.\n    if (this.liveDispose) this.subscribeLive();\n  }\n\n  // ---- Messages (two-way threads) ----\n\n  // Start a new thread (formerly submitFeedback).\n  async startMessage(input: {\n    body: string;\n    metadata?: Record<string, unknown>;\n  }): Promise<SubmitResult> {\n    const payload: Record<string, unknown> = {\n      anonymousId: this.anonymousId,\n      externalId: this.user?.id,\n      body: input.body,\n      metadata: { ...this.adapters.device.getMetadata(), ...(input.metadata ?? {}) },\n    };\n\n    try {\n      const res = await fetch(`${this.apiUrl}/v1/messages`, {\n        method: \"POST\",\n        headers: this.headers(),\n        body: JSON.stringify(payload),\n      });\n      if (res.ok) {\n        const json = (await res.json()) as StartMessageResponse;\n        void this.refreshMessages();\n        return { ok: true, queued: false, id: json.id };\n      }\n      // Client errors (4xx) are not retryable — surface them.\n      if (res.status < 500) {\n        return { ok: false, queued: false, error: `Request failed (${res.status})` };\n      }\n      // Server errors → queue for retry.\n      await this.queue.enqueue(\"messages\", payload);\n      return { ok: true, queued: true };\n    } catch {\n      // Offline / network error → queue for retry.\n      await this.queue.enqueue(\"messages\", payload);\n      return { ok: true, queued: true };\n    }\n  }\n\n  // The end-user's own threads (+ unread admin replies). Updates the badge.\n  async refreshMessages(): Promise<MessagesResponse> {\n    try {\n      const res = await fetch(`${this.apiUrl}/v1/messages?${this.identityQuery()}`, {\n        headers: this.headers(),\n      });\n      if (res.ok) {\n        const data = (await res.json()) as MessagesResponse;\n        this.store.set({ messages: data.threads, messagesUnread: data.unreadTotal });\n        return data;\n      }\n    } catch {\n      // offline — keep last known threads + unread count\n    }\n    const snap = this.store.getSnapshot();\n    return { threads: snap.messages, unreadTotal: snap.messagesUnread };\n  }\n\n  async replyToMessage(messageId: string, body: string): Promise<boolean> {\n    try {\n      const res = await fetch(`${this.apiUrl}/v1/messages/${messageId}/replies`, {\n        method: \"POST\",\n        headers: this.headers(),\n        body: JSON.stringify({\n          anonymousId: this.anonymousId,\n          externalId: this.user?.id,\n          body,\n        }),\n      });\n      return res.ok;\n    } catch {\n      return false;\n    }\n  }\n\n  async markMessageRead(messageId: string): Promise<void> {\n    try {\n      await fetch(`${this.apiUrl}/v1/messages/${messageId}/read`, {\n        method: \"POST\",\n        headers: this.headers(),\n        body: JSON.stringify({\n          anonymousId: this.anonymousId,\n          externalId: this.user?.id,\n        }),\n      });\n      void this.refreshMessages();\n    } catch {\n      // ignore — reconciles on next refresh\n    }\n  }\n\n  // ---- Announcements ----\n\n  async refreshAnnouncements(): Promise<void> {\n    try {\n      const res = await fetch(\n        `${this.apiUrl}/v1/announcements?${this.identityQuery()}`,\n        { headers: this.headers() },\n      );\n      if (res.ok) {\n        const data = (await res.json()) as AnnouncementsResponse;\n        this.store.set({\n          announcements: data.announcements.filter(\n            (a) => !this.dismissedAnnouncements.has(a.id),\n          ),\n        });\n      }\n    } catch {\n      // offline — keep last known announcements\n    }\n  }\n\n  async dismissAnnouncement(announcementId: string): Promise<void> {\n    // Optimistically remove from the banner stack.\n    this.store.set({\n      announcements: this.store\n        .getSnapshot()\n        .announcements.filter((a) => a.id !== announcementId),\n    });\n    // Remember the dismissal locally so it stays hidden across reloads even if\n    // the server keeps returning it (e.g. anonymous identity not yet linked).\n    this.dismissedAnnouncements.add(announcementId);\n    await this.adapters.storage.setItem(\n      ANNOUNCEMENT_DISMISSED_KEY,\n      JSON.stringify([...this.dismissedAnnouncements]),\n    );\n    try {\n      await fetch(`${this.apiUrl}/v1/announcements/${announcementId}/dismiss`, {\n        method: \"POST\",\n        headers: this.headers(),\n        body: JSON.stringify({\n          anonymousId: this.anonymousId,\n          externalId: this.user?.id,\n        }),\n      });\n    } catch {\n      // ignore — already removed locally\n    }\n  }\n\n  // ---- Feature requests ----\n\n  private identityQuery(): string {\n    const params = new URLSearchParams({ anonymousId: this.anonymousId });\n    if (this.user?.id) params.set(\"externalId\", this.user.id);\n    return params.toString();\n  }\n\n  async listFeatureRequests(): Promise<FeatureRequest[]> {\n    try {\n      const res = await fetch(\n        `${this.apiUrl}/v1/feature-requests?${this.identityQuery()}`,\n        { headers: this.headers() },\n      );\n      if (res.ok) return (await res.json()) as FeatureRequest[];\n    } catch {\n      // offline — return empty; UI can show a retry.\n    }\n    return [];\n  }\n\n  async createFeatureRequest(input: {\n    title: string;\n    body?: string;\n  }): Promise<FeatureRequest | null> {\n    try {\n      const res = await fetch(`${this.apiUrl}/v1/feature-requests`, {\n        method: \"POST\",\n        headers: this.headers(),\n        body: JSON.stringify({\n          anonymousId: this.anonymousId,\n          externalId: this.user?.id,\n          ...input,\n        }),\n      });\n      if (res.ok) return (await res.json()) as FeatureRequest;\n    } catch {\n      // ignore\n    }\n    return null;\n  }\n\n  async voteFeatureRequest(\n    requestId: string,\n    voted: boolean,\n  ): Promise<{ voted: boolean; voteCount: number } | null> {\n    try {\n      const res = await fetch(\n        `${this.apiUrl}/v1/feature-requests/${requestId}/vote`,\n        {\n          method: voted ? \"POST\" : \"DELETE\",\n          headers: this.headers(),\n          body: JSON.stringify({\n            anonymousId: this.anonymousId,\n            externalId: this.user?.id,\n          }),\n        },\n      );\n      if (res.ok) return (await res.json()) as { voted: boolean; voteCount: number };\n    } catch {\n      // ignore\n    }\n    return null;\n  }\n\n  // ---- Changelog / What's New ----\n\n  async refreshChangelog(): Promise<ChangelogResponse> {\n    try {\n      const res = await fetch(\n        `${this.apiUrl}/v1/changelog?${this.identityQuery()}`,\n        { headers: this.headers() },\n      );\n      if (res.ok) {\n        const data = (await res.json()) as ChangelogResponse;\n        this.store.set({ changelogUnread: data.unreadCount });\n        return data;\n      }\n    } catch {\n      // offline — keep last known unread count\n    }\n    return { entries: [], unreadCount: this.store.getSnapshot().changelogUnread };\n  }\n\n  async markChangelogRead(entryId: string): Promise<void> {\n    try {\n      await fetch(`${this.apiUrl}/v1/changelog/${entryId}/read`, {\n        method: \"POST\",\n        headers: this.headers(),\n        body: JSON.stringify({\n          anonymousId: this.anonymousId,\n          externalId: this.user?.id,\n        }),\n      });\n    } catch {\n      // ignore — will reconcile on next refresh\n    }\n  }\n\n  async flush(): Promise<void> {\n    const items = await this.queue.list();\n    for (const item of items) {\n      try {\n        const res = await fetch(`${this.apiUrl}/v1/${item.type}`, {\n          method: \"POST\",\n          headers: this.headers(),\n          body: JSON.stringify(item.payload),\n        });\n        if (res.ok || (res.status >= 400 && res.status < 500)) {\n          // Success or permanently-rejected → drop from queue.\n          await this.queue.remove(item.id);\n        }\n      } catch {\n        // Still offline — stop and retry on next flush.\n        break;\n      }\n    }\n  }\n\n  open(view?: WherdView): void {\n    this.store.set({ isOpen: true, view: view ?? this.store.getSnapshot().view });\n  }\n\n  close(): void {\n    this.store.set({ isOpen: false });\n  }\n\n  setView(view: WherdView): void {\n    this.store.set({ view });\n  }\n\n  // Update the developer theme override at runtime (e.g. the host app toggled\n  // its own light/dark appearance). Re-resolves on the next render.\n  setTheme(theme: ThemeTokens | null): void {\n    this.store.set({ localTheme: theme });\n  }\n}\n","import type { ThemeTokens } from \"./types\";\n\nexport interface ResolvedTheme {\n  colorScheme: \"light\" | \"dark\";\n  colors: {\n    primary: string;\n    primaryForeground: string;\n    background: string;\n    foreground: string;\n    muted: string;\n    mutedForeground: string;\n    border: string;\n  };\n  radius: number;\n  fontFamily?: string;\n}\n\nconst LIGHT: ResolvedTheme[\"colors\"] = {\n  primary: \"#6366f1\",\n  primaryForeground: \"#ffffff\",\n  background: \"#ffffff\",\n  foreground: \"#0e1525\",\n  muted: \"#f1f5f9\",\n  mutedForeground: \"#5b6678\",\n  border: \"#eef1f6\",\n};\n\nconst DARK: ResolvedTheme[\"colors\"] = {\n  // Keep the accent vivid with a white foreground in both modes — the FAB is a\n  // saturated brand-colored circle, so its icon should always read white.\n  primary: \"#6366f1\",\n  primaryForeground: \"#ffffff\",\n  background: \"#14161d\",\n  foreground: \"#f3f4f8\",\n  muted: \"#232733\",\n  mutedForeground: \"#9aa3b2\",\n  border: \"#262a35\",\n};\n\n// Merge precedence (lowest → highest): platform defaults, server config,\n// developer theme prop. Returns concrete tokens the UI can render directly.\nexport function resolveTheme(\n  server: ThemeTokens | null | undefined,\n  local: ThemeTokens | null | undefined,\n  systemColorScheme: \"light\" | \"dark\" = \"light\",\n): ResolvedTheme {\n  // Default to light: the host page's appearance is not the OS appearance, so\n  // following the OS by default causes a light page + dark widget mismatch.\n  // Developers opt into auto via colorScheme: \"system\".\n  const requested = local?.colorScheme ?? server?.colorScheme ?? \"light\";\n  const colorScheme: \"light\" | \"dark\" =\n    requested === \"system\" ? systemColorScheme : requested;\n\n  const base = colorScheme === \"dark\" ? DARK : LIGHT;\n  const merged = {\n    ...base,\n    ...stripUndefined(server?.colors),\n    ...stripUndefined(local?.colors),\n  };\n\n  return {\n    colorScheme,\n    colors: merged,\n    radius: local?.radius ?? server?.radius ?? 12,\n    fontFamily:\n      (local?.typography?.fontFamily as string | undefined) ??\n      (server?.typography?.fontFamily as string | undefined),\n  };\n}\n\nfunction stripUndefined(\n  obj: Record<string, string | undefined> | undefined,\n): Record<string, string> {\n  if (!obj) return {};\n  const out: Record<string, string> = {};\n  for (const [k, v] of Object.entries(obj)) if (v != null) out[k] = v;\n  return out;\n}\n","import { createContext, useContext, useEffect, type ReactNode } from \"react\";\nimport type { WherdClient } from \"../client\";\n\nconst WherdContext = createContext<WherdClient | null>(null);\n\n// Core provider — takes a pre-built client (the platform packages build it with\n// their own storage/device/shake adapters and wrap this).\nexport function WherdCoreProvider({\n  client,\n  children,\n}: {\n  client: WherdClient;\n  children: ReactNode;\n}) {\n  useEffect(() => {\n    let active = true;\n    client\n      .init()\n      .then(() => {\n        // Open the live (SSE) connection once identity + anonymousId are ready.\n        if (active) client.subscribeLive();\n      })\n      .catch(() => {\n        // init failures are non-fatal; the SDK still works pull-only.\n      });\n    return () => {\n      active = false;\n      client.disconnectLive();\n    };\n  }, [client]);\n\n  return <WherdContext.Provider value={client}>{children}</WherdContext.Provider>;\n}\n\nexport function useWherdClient(): WherdClient {\n  const ctx = useContext(WherdContext);\n  if (!ctx) {\n    throw new Error(\"Wherd hooks must be used within <WherdProvider>\");\n  }\n  return ctx;\n}\n","import { useCallback, useEffect, useRef, useState, useSyncExternalStore } from \"react\";\nimport type { SubmitResult } from \"../client\";\nimport type { WherdState } from \"../store\";\nimport { resolveTheme, type ResolvedTheme } from \"../theme\";\nimport type { ActivationConfig, Announcement, ChangelogEntry, FeatureRequest, MessageThread, MessageType, WherdUser, WherdView } from \"../types\";\nimport { useWherdClient } from \"./context\";\n\n// Subscribes to the observable store. Re-renders on any state change.\nexport function useWherdState(): WherdState {\n  const client = useWherdClient();\n  return useSyncExternalStore(\n    client.store.subscribe,\n    client.store.getSnapshot,\n    client.store.getSnapshot,\n  );\n}\n\n// Imperative API + reactive state — the main hook for custom UIs.\nexport function useWherd() {\n  const client = useWherdClient();\n  const state = useWherdState();\n\n  return {\n    ...state,\n    open: useCallback((view?: WherdView) => client.open(view), [client]),\n    close: useCallback(() => client.close(), [client]),\n    setView: useCallback((view: WherdView) => client.setView(view), [client]),\n    identify: useCallback((user: WherdUser) => client.identify(user), [client]),\n    start: useCallback(\n      (input: { body: string; metadata?: Record<string, unknown> }) =>\n        client.startMessage(input),\n      [client],\n    ),\n  };\n}\n\n// Headless composer for starting a new message thread — manages draft/submit/\n// error state. The prebuilt widget is built on this, so custom UIs have parity.\nexport function useComposer() {\n  const client = useWherdClient();\n  const [body, setBody] = useState(\"\");\n  const [type, setType] = useState<MessageType>(\"idea\");\n  const [email, setEmail] = useState(\"\");\n  const [submitting, setSubmitting] = useState(false);\n  const [submitted, setSubmitted] = useState(false);\n  const [queued, setQueued] = useState(false);\n  const [error, setError] = useState<string | null>(null);\n\n  const submit = useCallback(async (): Promise<SubmitResult | undefined> => {\n    if (!body.trim()) {\n      setError(\"Please enter a message\");\n      return;\n    }\n    setSubmitting(true);\n    setError(null);\n    const res = await client.startMessage({\n      body: body.trim(),\n      metadata: {\n        type,\n        ...(email.trim() ? { email: email.trim() } : {}),\n      },\n    });\n    setSubmitting(false);\n    if (res.ok) {\n      setSubmitted(true);\n      setQueued(res.queued);\n      setBody(\"\");\n    } else {\n      setError(res.error ?? \"Something went wrong\");\n    }\n    return res;\n  }, [client, body, type, email]);\n\n  const reset = useCallback(() => {\n    setSubmitted(false);\n    setQueued(false);\n    setError(null);\n    setBody(\"\");\n  }, []);\n\n  return { body, setBody, type, setType, email, setEmail, submit, submitting, submitted, queued, error, reset };\n}\n\n// The end-user's own message threads (with replies + unread admin replies).\nexport function useMessages() {\n  const client = useWherdClient();\n  const state = useWherdState();\n  // Threads are store-backed so every refresh (a reply here, an SSE event, or a\n  // panel re-open elsewhere) updates one source and re-renders all views live.\n  const threads = state.messages;\n  const unreadTotal = state.messagesUnread;\n  const isOpen = state.isOpen;\n  const [loading, setLoading] = useState(true);\n\n  const refresh = useCallback(async () => {\n    setLoading(true);\n    await client.refreshMessages();\n    setLoading(false);\n  }, [client]);\n\n  useEffect(() => {\n    void refresh();\n  }, [refresh]);\n\n  // The widget mounts once and stays mounted, so re-opening the panel wouldn't\n  // otherwise refetch. Pull fresh threads on each open→true edge so admin\n  // replies (and the unread badge) are current whenever the panel is shown.\n  const wasOpen = useRef(false);\n  useEffect(() => {\n    if (isOpen && !wasOpen.current) void refresh();\n    wasOpen.current = isOpen;\n  }, [isOpen, refresh]);\n\n  const reply = useCallback(\n    async (id: string, body: string) => {\n      const ok = await client.replyToMessage(id, body);\n      if (ok) await refresh();\n      return ok;\n    },\n    [client, refresh],\n  );\n\n  const markRead = useCallback(\n    async (id: string) => {\n      await client.markMessageRead(id);\n      await refresh();\n    },\n    [client, refresh],\n  );\n\n  return { threads, unreadTotal, loading, refresh, reply, markRead };\n}\n\n// Cheap reactive unread-replies count (for a badge).\nexport function useUnreadMessages(): number {\n  return useWherdState().messagesUnread;\n}\n\n// Active announcement banners + dismissal.\nexport function useAnnouncements() {\n  const client = useWherdClient();\n  const announcements: Announcement[] = useWherdState().announcements;\n  const dismiss = useCallback(\n    (id: string) => client.dismissAnnouncement(id),\n    [client],\n  );\n  return { announcements, dismiss };\n}\n\n// Feature requests list + optimistic voting + create. Powers <FeatureBoard/>.\nexport function useFeatureRequests() {\n  const client = useWherdClient();\n  const revision = useWherdState().featureRequestsRevision;\n  const [requests, setRequests] = useState<FeatureRequest[]>([]);\n  const [loading, setLoading] = useState(true);\n\n  const refresh = useCallback(async () => {\n    setLoading(true);\n    setRequests(await client.listFeatureRequests());\n    setLoading(false);\n  }, [client]);\n\n  useEffect(() => {\n    void refresh();\n  }, [refresh]);\n\n  // Refetch when a live feature-request event bumps the revision.\n  const firstRev = useRef(true);\n  useEffect(() => {\n    if (firstRev.current) {\n      firstRev.current = false;\n      return;\n    }\n    void refresh();\n  }, [revision, refresh]);\n\n  const vote = useCallback(\n    async (id: string, next: boolean) => {\n      // Optimistic update, reconciled with the server's authoritative count.\n      setRequests((prev) =>\n        prev.map((r) =>\n          r.id === id\n            ? { ...r, hasVoted: next, voteCount: r.voteCount + (next ? 1 : -1) }\n            : r,\n        ),\n      );\n      const result = await client.voteFeatureRequest(id, next);\n      if (result) {\n        setRequests((prev) =>\n          prev.map((r) =>\n            r.id === id ? { ...r, hasVoted: result.voted, voteCount: result.voteCount } : r,\n          ),\n        );\n      }\n    },\n    [client],\n  );\n\n  const create = useCallback(\n    async (input: { title: string; body?: string }) => {\n      const created = await client.createFeatureRequest(input);\n      if (created) setRequests((prev) => [...prev, created]);\n      return created;\n    },\n    [client],\n  );\n\n  return { requests, loading, refresh, vote, create };\n}\n\n// Unread changelog badge count (reactive, app-wide). Cheap to use anywhere.\nexport function useUnreadChangelog(): number {\n  return useWherdState().changelogUnread;\n}\n\n// Effective activation: server config overridden by the Provider's `activation`\n// prop (fab/shake/programmatic). Drives whether the FAB renders and shake is on.\nexport function useActivation(): ActivationConfig {\n  const { config, localActivation } = useWherdState();\n  const base = config?.activation ?? { fab: true, shake: false, programmatic: true };\n  return { ...base, ...(localActivation ?? {}) };\n}\n\n// One-time \"shake to open\" hint. Returns visible=true the first time the app\n// runs with shake enabled; call dismiss() to persist that it's been seen.\nexport function useShakeHint(): { visible: boolean; dismiss: () => void } {\n  const client = useWherdClient();\n  const { shake } = useActivation();\n  const ready = useWherdState().ready;\n  const [visible, setVisible] = useState(false);\n\n  useEffect(() => {\n    let active = true;\n    if (ready && shake) {\n      void client.shouldShowShakeHint().then((show) => {\n        if (active && show) setVisible(true);\n      });\n    }\n    return () => {\n      active = false;\n    };\n  }, [client, ready, shake]);\n\n  const dismiss = useCallback(() => {\n    setVisible(false);\n    void client.dismissShakeHint();\n  }, [client]);\n\n  return { visible, dismiss };\n}\n\n// Changelog list + read tracking. Powers <WhatsNew/>.\nexport function useChangelog() {\n  const client = useWherdClient();\n  const [entries, setEntries] = useState<ChangelogEntry[]>([]);\n  const [loading, setLoading] = useState(true);\n\n  const refresh = useCallback(async () => {\n    setLoading(true);\n    const data = await client.refreshChangelog();\n    setEntries(data.entries);\n    setLoading(false);\n  }, [client]);\n\n  useEffect(() => {\n    void refresh();\n  }, [refresh]);\n\n  const markRead = useCallback(\n    async (id: string) => {\n      setEntries((prev) => prev.map((e) => (e.id === id ? { ...e, read: true } : e)));\n      await client.markChangelogRead(id);\n      await client.refreshChangelog();\n    },\n    [client],\n  );\n\n  const markAllRead = useCallback(async () => {\n    const unread = entries.filter((e) => !e.read);\n    setEntries((prev) => prev.map((e) => ({ ...e, read: true })));\n    await Promise.all(unread.map((e) => client.markChangelogRead(e.id)));\n    await client.refreshChangelog();\n  }, [client, entries]);\n\n  return { entries, loading, refresh, markRead, markAllRead };\n}\n\n// Resolved theme tokens (defaults ← server config ← developer prop).\n// Pass the platform's current system color scheme for \"system\" mode.\nexport function useResolvedTheme(\n  systemColorScheme: \"light\" | \"dark\" = \"light\",\n): ResolvedTheme {\n  const { config, localTheme } = useWherdState();\n  return resolveTheme(config?.theme, localTheme, systemColorScheme);\n}\n"],"mappings":"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","names":["import_react"]}