{"version":3,"file":"index.cjs","names":["FileSystem","DocumentPicker","DEFAULT_AGENT_ID","Animated","Pressable","styles","View","Text","StyleSheet","TouchableOpacity","Text","Modal","Pressable","View","StyleSheet"],"sources":["../src/hooks/use-attachments.ts","../src/CopilotChat.tsx","../src/CopilotModal.tsx","../src/CopilotSidebar.tsx","../src/CopilotPopup.tsx"],"sourcesContent":["// packages/react-native/src/hooks/use-attachments.ts\nimport { useCallback, useRef, useState } from \"react\";\nimport {\n  randomUUID,\n  getModalityFromMimeType,\n  formatFileSize,\n} from \"@copilotkit/shared\";\nimport type {\n  Attachment,\n  AttachmentUploadResult,\n  AttachmentUploadErrorReason,\n} from \"@copilotkit/shared\";\nimport * as DocumentPicker from \"expo-document-picker\";\nimport * as FileSystem from \"expo-file-system\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\n/**\n * Platform-neutral file descriptor for React Native.\n * Replaces the web `File` object in all attachment APIs.\n */\nexport interface NativeFileInput {\n  /** Local file URI (e.g. `file:///path/to/file`). */\n  uri: string;\n  /** Filename with extension. */\n  name: string;\n  /** File size in bytes. */\n  size: number;\n  /** MIME type (e.g. `\"image/jpeg\"`). */\n  mimeType: string;\n}\n\n/**\n * React Native variant of AttachmentsConfig.\n * Identical to the shared AttachmentsConfig except `onUpload` receives\n * a `NativeFileInput` instead of a web `File`.\n */\nexport interface NativeAttachmentsConfig {\n  /** Enable file attachments in the chat input. */\n  enabled: boolean;\n  /** MIME type filter for the file picker, default all files. */\n  accept?: string;\n  /** Maximum file size in bytes, default 20MB (20 * 1024 * 1024). */\n  maxSize?: number;\n  /** Custom upload handler. Receives the native file descriptor. */\n  onUpload?: (\n    file: NativeFileInput,\n  ) => AttachmentUploadResult | Promise<AttachmentUploadResult>;\n  /** Called when an attachment fails validation or upload. */\n  onUploadFailed?: (error: {\n    reason: AttachmentUploadErrorReason;\n    file: NativeFileInput;\n    message: string;\n  }) => void;\n}\n\nexport interface UseNativeAttachmentsProps {\n  config?: NativeAttachmentsConfig;\n}\n\nexport interface UseNativeAttachmentsReturn {\n  /** Currently selected attachments (uploading + ready). */\n  attachments: Attachment[];\n  /** Whether attachments are enabled. */\n  enabled: boolean;\n  /** Open the native document picker. */\n  openPicker: () => Promise<void>;\n  /** Process an array of NativeFileInput objects (validate, read, add to state). */\n  processFiles: (files: NativeFileInput[]) => Promise<void>;\n  /** Remove an attachment by ID. */\n  removeAttachment: (id: string) => void;\n  /** Consume ready attachments and clear the queue. Returns the consumed attachments. */\n  consumeAttachments: () => Attachment[];\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst DEFAULT_MAX_SIZE = 20 * 1024 * 1024; // 20 MB\n\n// ---------------------------------------------------------------------------\n// Hook\n// ---------------------------------------------------------------------------\n\n/**\n * React Native hook that manages file attachment state -- picking, uploading,\n * and lifecycle. All returned callbacks are referentially stable via useCallback.\n *\n * This is the RN counterpart of the web `useAttachments` hook from\n * `@copilotkit/react-core`. It replaces web APIs (FileReader, DragEvent,\n * HTMLInputElement) with Expo modules (expo-document-picker, expo-file-system).\n */\nexport function useAttachments({\n  config,\n}: UseNativeAttachmentsProps): UseNativeAttachmentsReturn {\n  const enabled = config?.enabled ?? false;\n\n  const [attachments, setAttachments] = useState<Attachment[]>([]);\n\n  // Refs for stable callbacks to read latest values\n  const configRef = useRef(config);\n  configRef.current = config;\n  const attachmentsRef = useRef<Attachment[]>([]);\n  attachmentsRef.current = attachments;\n\n  /**\n   * Simple MIME accept filter for NativeFileInput.\n   * Handles wildcards like \"image/*\" and exact types like \"application/pdf\".\n   * Comma-separated lists are supported.\n   */\n  const matchesAccept = useCallback(\n    (file: NativeFileInput, accept: string): boolean => {\n      if (!accept || accept === \"*/*\") return true;\n      const filters = accept.split(\",\").map((f) => f.trim());\n      return filters.some((filter) => {\n        if (filter.startsWith(\".\")) {\n          return file.name.toLowerCase().endsWith(filter.toLowerCase());\n        }\n        if (filter.endsWith(\"/*\")) {\n          const prefix = filter.slice(0, -2);\n          return file.mimeType.startsWith(prefix + \"/\");\n        }\n        return file.mimeType === filter;\n      });\n    },\n    [],\n  );\n\n  const processFiles = useCallback(\n    async (files: NativeFileInput[]) => {\n      const cfg = configRef.current;\n      const accept = cfg?.accept ?? \"*/*\";\n      const maxSize = cfg?.maxSize ?? DEFAULT_MAX_SIZE;\n\n      // Filter by accept type\n      const rejectedFiles = files.filter((f) => !matchesAccept(f, accept));\n      for (const file of rejectedFiles) {\n        cfg?.onUploadFailed?.({\n          reason: \"invalid-type\",\n          file,\n          message: `File \"${file.name}\" is not accepted. Supported types: ${accept}`,\n        });\n      }\n\n      const validFiles = files.filter((f) => matchesAccept(f, accept));\n\n      for (const file of validFiles) {\n        // Size check\n        if (file.size > maxSize) {\n          cfg?.onUploadFailed?.({\n            reason: \"file-too-large\",\n            file,\n            message: `File \"${file.name}\" exceeds the maximum size of ${formatFileSize(maxSize)}`,\n          });\n          continue;\n        }\n\n        const modality = getModalityFromMimeType(file.mimeType);\n        const placeholderId = randomUUID();\n        const placeholder: Attachment = {\n          id: placeholderId,\n          type: modality,\n          source: { type: \"data\", value: \"\", mimeType: file.mimeType },\n          filename: file.name,\n          size: file.size,\n          status: \"uploading\",\n        };\n\n        setAttachments((prev) => [...prev, placeholder]);\n\n        try {\n          let source: Attachment[\"source\"];\n          let uploadMetadata: Record<string, unknown> | undefined;\n\n          if (cfg?.onUpload) {\n            const { metadata: meta, ...uploadSource } =\n              await cfg.onUpload(file);\n            source = uploadSource;\n            uploadMetadata = meta;\n          } else {\n            // Default: read file as base64 via expo-file-system\n            const base64 = await FileSystem.readAsStringAsync(file.uri, {\n              encoding: FileSystem.EncodingType.Base64,\n            });\n            source = { type: \"data\", value: base64, mimeType: file.mimeType };\n          }\n\n          setAttachments((prev) =>\n            prev.map((att) =>\n              att.id === placeholderId\n                ? {\n                    ...att,\n                    source,\n                    status: \"ready\" as const,\n                    metadata: uploadMetadata,\n                  }\n                : att,\n            ),\n          );\n        } catch (error) {\n          // Remove placeholder on failure\n          setAttachments((prev) =>\n            prev.filter((att) => att.id !== placeholderId),\n          );\n          console.error(`[CopilotKit] Failed to upload \"${file.name}\":`, error);\n          cfg?.onUploadFailed?.({\n            reason: \"upload-failed\",\n            file,\n            message:\n              error instanceof Error\n                ? error.message\n                : `Failed to upload \"${file.name}\"`,\n          });\n        }\n      }\n    },\n    [matchesAccept],\n  );\n\n  const openPicker = useCallback(async () => {\n    const cfg = configRef.current;\n    const accept = cfg?.accept ?? \"*/*\";\n\n    // Convert accept string to array for DocumentPicker\n    const typeArray = accept\n      .split(\",\")\n      .map((t) => t.trim())\n      .filter(Boolean);\n\n    try {\n      const result = await DocumentPicker.getDocumentAsync({\n        type: typeArray.length > 0 ? typeArray : [\"*/*\"],\n        copyToCacheDirectory: true,\n        multiple: true,\n      });\n\n      if (result.canceled || !result.assets?.length) return;\n\n      const nativeFiles: NativeFileInput[] = result.assets.map((asset) => ({\n        uri: asset.uri,\n        name: asset.name ?? \"unknown\",\n        size: asset.size ?? 0,\n        mimeType: asset.mimeType ?? \"application/octet-stream\",\n      }));\n\n      await processFiles(nativeFiles);\n    } catch (error) {\n      console.error(\"[CopilotKit] Document picker error:\", error);\n    }\n  }, [processFiles]);\n\n  const removeAttachment = useCallback((id: string) => {\n    setAttachments((prev) => prev.filter((a) => a.id !== id));\n  }, []);\n\n  const consumeAttachments = useCallback(() => {\n    const ready = attachmentsRef.current.filter((a) => a.status === \"ready\");\n    if (ready.length === 0) return ready;\n    setAttachments((prev) => prev.filter((a) => a.status !== \"ready\"));\n    return ready;\n  }, []);\n\n  return {\n    attachments,\n    enabled,\n    openPicker,\n    processFiles,\n    removeAttachment,\n    consumeAttachments,\n  };\n}\n","import React, {\n  createContext,\n  useCallback,\n  useContext,\n  useEffect,\n  useRef,\n} from \"react\";\nimport type { ReactNode } from \"react\";\nimport { useAgent } from \"@copilotkit/react-core/v2/headless\";\nimport { useCopilotKit } from \"@copilotkit/react-core/v2/context\";\nimport { DEFAULT_AGENT_ID, randomUUID } from \"@copilotkit/shared\";\nimport type { InputContent } from \"@copilotkit/shared\";\nimport type { CopilotKitCoreErrorCode } from \"@copilotkit/core\";\nimport { useAttachments } from \"./hooks/use-attachments\";\nimport type { NativeAttachmentsConfig } from \"./hooks/use-attachments\";\nimport type { Attachment } from \"@copilotkit/shared\";\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\nexport interface CopilotChatContextValue {\n  /** The resolved agent instance. */\n  agent: any;\n  /** Whether the agent is currently running. */\n  isRunning: boolean;\n  /** Current messages in the conversation. */\n  messages: any[];\n  /** Currently selected attachments (uploading + ready). */\n  attachments: Attachment[];\n  /** Whether attachments are enabled. */\n  attachmentsEnabled: boolean;\n  /** Open the native document picker to add files. */\n  openPicker: () => Promise<void>;\n  /** Remove an attachment by ID. */\n  removeAttachment: (id: string) => void;\n  /**\n   * Submit a message with optional attachments.\n   * Handles consuming ready attachments, building InputContent[],\n   * calling agent.addMessage, and running the agent.\n   */\n  submitMessage: (text: string) => Promise<void>;\n}\n\nconst CopilotChatCtx = createContext<CopilotChatContextValue | null>(null);\n\n/**\n * Hook to access the CopilotChat context from child components.\n * Must be called inside a `<CopilotChat>` component tree.\n */\nexport function useCopilotChatContext(): CopilotChatContextValue {\n  const ctx = useContext(CopilotChatCtx);\n  if (!ctx) {\n    throw new Error(\n      \"useCopilotChatContext must be used within a <CopilotChat> component\",\n    );\n  }\n  return ctx;\n}\n\n// ---------------------------------------------------------------------------\n// Props\n// ---------------------------------------------------------------------------\n\nexport interface CopilotChatBaseProps {\n  /**\n   * The agent ID to use for this chat session.\n   * Matches the web SDK's CopilotChat `agentId` prop.\n   *\n   * Resolution order: `agentId` > `agentName` > `\"default\"`\n   */\n  agentId?: string;\n\n  /**\n   * @deprecated Use `agentId` instead. `agentName` is kept for backwards\n   * compatibility and will be removed in a future release.\n   */\n  agentName?: string;\n\n  /**\n   * Thread ID for this chat session. When provided, the chat will resume\n   * the specified thread. Matches the web SDK's CopilotChat `threadId` prop.\n   */\n  threadId?: string;\n\n  /**\n   * Error handler scoped to this chat's agent. Fires in addition to the\n   * provider-level onError (does not suppress it). Receives only errors\n   * whose context.agentId matches this chat's agent.\n   */\n  onError?: (event: {\n    error: Error;\n    code: CopilotKitCoreErrorCode;\n    context: Record<string, any>;\n  }) => void | Promise<void>;\n\n  /**\n   * Throttle interval (in milliseconds) for re-renders triggered by message\n   * change notifications. Overrides the provider-level `defaultThrottleMs`\n   * for this chat instance. Forwarded to the internal `useAgent()` hook.\n   *\n   * @default undefined -- inherits from provider `defaultThrottleMs`;\n   * if that is also unset, re-renders are unthrottled.\n   */\n  throttleMs?: number;\n\n  /**\n   * Enable multimodal file attachments (images, audio, video, documents).\n   * Pass a NativeAttachmentsConfig object to configure file picking behavior.\n   */\n  attachments?: NativeAttachmentsConfig;\n\n  /**\n   * Optional children rendered inside the chat context.\n   */\n  children?: ReactNode;\n}\n\nexport interface CopilotChatProps extends CopilotChatBaseProps {\n  /** Passthrough props are forwarded to consumers via the agent context. */\n  [key: string]: unknown;\n}\n\n/**\n * Headless CopilotChat component for React Native.\n *\n * Wires up the `useAgent` hook with `agentId` resolution and renders children.\n * Unlike the web SDK's CopilotChat, this component does not render any UI\n * elements -- consumers provide their own React Native views.\n *\n * Children can access chat state via `useCopilotChatContext()`.\n *\n * ```tsx\n * import { CopilotChat, useCopilotChatContext } from \"@copilotkit/react-native\";\n *\n * function MyChatUI() {\n *   const { messages, submitMessage, attachments, openPicker } = useCopilotChatContext();\n *   // ... render your UI\n * }\n *\n * <CopilotChat agentId=\"my-agent\" attachments={{ enabled: true }}>\n *   <MyChatUI />\n * </CopilotChat>\n * ```\n */\nexport function CopilotChat({\n  agentId,\n  agentName,\n  threadId,\n  onError,\n  throttleMs,\n  attachments: attachmentsConfig,\n  children,\n  ..._rest\n}: CopilotChatProps) {\n  const resolvedAgentId = agentId ?? agentName ?? DEFAULT_AGENT_ID;\n\n  // Deprecation warning (dev only, fires once per mount)\n  const warnedRef = useRef(false);\n  useEffect(() => {\n    if (\n      agentName !== undefined &&\n      agentId === undefined &&\n      !warnedRef.current\n    ) {\n      warnedRef.current = true;\n      if (typeof __DEV__ === \"undefined\" || __DEV__) {\n        console.warn(\n          \"[CopilotKit] agentName is deprecated, use agentId instead\",\n        );\n      }\n    }\n  }, [agentName, agentId]);\n\n  const { agent } = useAgent({ agentId: resolvedAgentId, throttleMs });\n\n  // Set threadId on the agent when provided\n  useEffect(() => {\n    if (threadId) {\n      agent.threadId = threadId;\n    }\n  }, [agent, threadId]);\n\n  // onError subscription -- forward core errors scoped to this chat's agent\n  const { copilotkit } = useCopilotKit();\n  const onErrorRef = useRef(onError);\n  useEffect(() => {\n    onErrorRef.current = onError;\n  }, [onError]);\n\n  useEffect(() => {\n    if (!onErrorRef.current) return;\n\n    const subscription = copilotkit.subscribe({\n      onError: (event) => {\n        // Only forward errors that match this chat's agent\n        if (\n          event.context?.agentId === resolvedAgentId ||\n          !event.context?.agentId\n        ) {\n          onErrorRef.current?.({\n            error: event.error,\n            code: event.code,\n            context: event.context,\n          });\n        }\n      },\n    });\n\n    return () => {\n      subscription.unsubscribe();\n    };\n  }, [copilotkit, resolvedAgentId]);\n\n  // Attachments\n  const {\n    attachments: selectedAttachments,\n    enabled: attachmentsEnabled,\n    openPicker,\n    removeAttachment,\n    consumeAttachments,\n  } = useAttachments({ config: attachmentsConfig });\n\n  // Submit handler -- mirrors web CopilotChat.tsx lines 234-288\n  const submitMessage = useCallback(\n    async (value: string) => {\n      // Block if uploads in progress\n      const hasUploading = selectedAttachments.some(\n        (a) => a.status === \"uploading\",\n      );\n      if (hasUploading) {\n        console.error(\n          \"[CopilotKit] Cannot send while attachments are uploading\",\n        );\n        return;\n      }\n\n      const readyAttachments = consumeAttachments();\n\n      if (readyAttachments.length > 0) {\n        const contentParts: InputContent[] = [];\n        if (value.trim()) {\n          contentParts.push({ type: \"text\", text: value });\n        }\n        for (const att of readyAttachments) {\n          contentParts.push({\n            type: att.type,\n            source: att.source,\n            metadata: {\n              ...(att.filename ? { filename: att.filename } : {}),\n              ...att.metadata,\n            },\n          } as InputContent);\n        }\n        agent.addMessage({\n          id: randomUUID(),\n          role: \"user\",\n          content: contentParts,\n        });\n      } else {\n        agent.addMessage({\n          id: randomUUID(),\n          role: \"user\",\n          content: value,\n        });\n      }\n\n      try {\n        await copilotkit.runAgent({ agent });\n      } catch (error) {\n        console.error(\"CopilotChat: runAgent failed\", error);\n      }\n    },\n    // copilotkit is intentionally excluded -- it is a stable ref that never changes.\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [agent, selectedAttachments, consumeAttachments],\n  );\n\n  const contextValue: CopilotChatContextValue = {\n    agent,\n    isRunning: agent.isRunning,\n    messages: agent.messages,\n    attachments: selectedAttachments,\n    attachmentsEnabled,\n    openPicker,\n    removeAttachment,\n    submitMessage,\n  };\n\n  return (\n    <CopilotChatCtx.Provider value={contextValue}>\n      {children}\n    </CopilotChatCtx.Provider>\n  );\n}\n","import React, { type ReactNode } from \"react\";\nimport { CopilotChat, type CopilotChatProps } from \"./CopilotChat\";\n\nexport interface CopilotModalProps extends CopilotChatProps {\n  /**\n   * Optional children rendered inside the modal context.\n   */\n  children?: ReactNode;\n}\n\n/**\n * Headless CopilotModal component for React Native.\n *\n * A thin wrapper around CopilotChat that mirrors the web SDK's CopilotModal\n * API surface. On React Native, modal presentation is handled by the consumer\n * (e.g. React Native's `Modal` component) -- this component only provides\n * the agent wiring and prop resolution.\n *\n * ```tsx\n * import { CopilotModal } from \"@copilotkit/react-native\";\n * import { Modal } from \"react-native\";\n *\n * <Modal visible={isOpen}>\n *   <CopilotModal agentId=\"my-agent\">\n *     <MyChatUI />\n *   </CopilotModal>\n * </Modal>\n * ```\n */\nexport function CopilotModal({ children, ...props }: CopilotModalProps) {\n  return <CopilotChat {...props}>{children}</CopilotChat>;\n}\n","import React, {\n  forwardRef,\n  useCallback,\n  useEffect,\n  useImperativeHandle,\n  useRef,\n  useState,\n} from \"react\";\nimport type { ReactNode } from \"react\";\nimport {\n  Animated,\n  Dimensions,\n  Pressable,\n  StyleSheet,\n  Text,\n  useWindowDimensions,\n  View,\n} from \"react-native\";\nimport type { ViewStyle } from \"react-native\";\nimport { CopilotChat } from \"./CopilotChat\";\nimport type { CopilotChatBaseProps } from \"./CopilotChat\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface CopilotSidebarHandle {\n  /** Slide the drawer open. */\n  open(): void;\n  /** Slide the drawer closed. */\n  close(): void;\n  /** Toggle the drawer open/closed. */\n  toggle(): void;\n}\n\nexport interface CopilotSidebarProps extends Omit<\n  CopilotChatBaseProps,\n  \"children\"\n> {\n  /**\n   * Start the drawer in the open position.\n   * @default false\n   */\n  defaultOpen?: boolean;\n\n  /**\n   * Width of the drawer panel. Accepts a number (points) or a percentage\n   * string (e.g. `\"85%\"`). Defaults to 85% of the screen width.\n   */\n  width?: number | string;\n\n  /**\n   * Title displayed in the drawer header bar.\n   * @default \"Copilot\"\n   */\n  headerTitle?: string;\n\n  /**\n   * Show a floating action button to toggle the drawer.\n   * @default true\n   */\n  showToggleButton?: boolean;\n\n  /** Called after the drawer finishes opening. */\n  onOpen?: () => void;\n\n  /** Called after the drawer finishes closing. */\n  onClose?: () => void;\n\n  /** Custom style applied to the drawer container. */\n  style?: ViewStyle;\n\n  /** Content rendered inside the drawer below the chat area. */\n  children?: ReactNode;\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst ANIMATION_DURATION_MS = 300;\nconst DEFAULT_HEADER_TITLE = \"Copilot\";\nconst BACKDROP_OPACITY = 0.4;\nconst FAB_SIZE = 56;\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\n/**\n * CopilotSidebar -- a slide-in drawer from the right edge of the screen\n * that wraps CopilotChat for React Native.\n *\n * ```tsx\n * import { CopilotSidebar } from \"@copilotkit/react-native\";\n *\n * const ref = useRef<CopilotSidebarHandle>(null);\n *\n * <CopilotSidebar\n *   ref={ref}\n *   agentId=\"my-agent\"\n *   headerTitle=\"Assistant\"\n *   defaultOpen={false}\n * />\n * ```\n */\nexport const CopilotSidebar = forwardRef<\n  CopilotSidebarHandle,\n  CopilotSidebarProps\n>(function CopilotSidebar(\n  {\n    agentId,\n    agentName,\n    threadId,\n    onError,\n    throttleMs,\n    defaultOpen = false,\n    width: widthProp,\n    headerTitle = DEFAULT_HEADER_TITLE,\n    showToggleButton = true,\n    onOpen,\n    onClose,\n    style,\n    children,\n    ...rest\n  },\n  ref,\n) {\n  const { width: screenWidth } = useWindowDimensions();\n\n  // Resolve drawer width ---------------------------------------------------\n  const drawerWidth = resolveWidth(widthProp, screenWidth);\n\n  // Animation & open state -------------------------------------------------\n  const [isOpen, setIsOpen] = useState(defaultOpen);\n  const slideAnim = useRef(\n    new Animated.Value(defaultOpen ? 0 : drawerWidth),\n  ).current;\n\n  // Keep the animated value in sync when drawerWidth changes while closed\n  useEffect(() => {\n    if (!isOpen) {\n      slideAnim.setValue(drawerWidth);\n    }\n  }, [drawerWidth, isOpen, slideAnim]);\n\n  const animateTo = useCallback(\n    (toValue: number, cb?: () => void) => {\n      Animated.timing(slideAnim, {\n        toValue,\n        duration: ANIMATION_DURATION_MS,\n        useNativeDriver: true,\n      }).start(({ finished }) => {\n        if (finished) cb?.();\n      });\n    },\n    [slideAnim],\n  );\n\n  const open = useCallback(() => {\n    setIsOpen(true);\n    animateTo(0, onOpen);\n  }, [animateTo, onOpen]);\n\n  const close = useCallback(() => {\n    animateTo(drawerWidth, () => {\n      setIsOpen(false);\n      onClose?.();\n    });\n  }, [animateTo, drawerWidth, onClose]);\n\n  const toggle = useCallback(() => {\n    if (isOpen) {\n      close();\n    } else {\n      open();\n    }\n  }, [isOpen, open, close]);\n\n  useImperativeHandle(ref, () => ({ open, close, toggle }), [\n    open,\n    close,\n    toggle,\n  ]);\n\n  // Callbacks stored in refs for stable animation closures -----------------\n  const onOpenRef = useRef(onOpen);\n  const onCloseRef = useRef(onClose);\n  useEffect(() => {\n    onOpenRef.current = onOpen;\n  }, [onOpen]);\n  useEffect(() => {\n    onCloseRef.current = onClose;\n  }, [onClose]);\n\n  // -----------------------------------------------------------------------\n  // Render\n  // -----------------------------------------------------------------------\n  return (\n    <>\n      {/* Backdrop */}\n      {isOpen && (\n        <Pressable\n          style={styles.backdrop}\n          onPress={close}\n          accessibilityRole=\"button\"\n          accessibilityLabel=\"Close sidebar\"\n          testID=\"copilot-sidebar-backdrop\"\n        />\n      )}\n\n      {/* Drawer */}\n      {isOpen && (\n        <Animated.View\n          style={[\n            styles.drawer,\n            { width: drawerWidth, transform: [{ translateX: slideAnim }] },\n            style,\n          ]}\n          testID=\"copilot-sidebar-drawer\"\n        >\n          {/* Header */}\n          <View style={styles.header}>\n            <Text style={styles.headerTitle}>{headerTitle}</Text>\n            <Pressable\n              onPress={close}\n              accessibilityRole=\"button\"\n              accessibilityLabel=\"Close\"\n              hitSlop={8}\n              testID=\"copilot-sidebar-close\"\n            >\n              <Text style={styles.closeButton}>{\"✕\"}</Text>\n            </Pressable>\n          </View>\n\n          {/* Chat area */}\n          <View style={styles.chatContainer}>\n            <CopilotChat\n              agentId={agentId}\n              agentName={agentName}\n              threadId={threadId}\n              onError={onError}\n              throttleMs={throttleMs}\n              {...rest}\n            >\n              {children}\n            </CopilotChat>\n          </View>\n        </Animated.View>\n      )}\n\n      {/* Floating action button */}\n      {showToggleButton && !isOpen && (\n        <Pressable\n          style={styles.fab}\n          onPress={open}\n          accessibilityRole=\"button\"\n          accessibilityLabel=\"Open sidebar\"\n          testID=\"copilot-sidebar-fab\"\n        >\n          <Text style={styles.fabIcon}>{\"💬\"}</Text>\n        </Pressable>\n      )}\n    </>\n  );\n});\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nfunction resolveWidth(\n  widthProp: number | string | undefined,\n  screenWidth: number,\n): number {\n  if (widthProp === undefined) {\n    return Math.round(screenWidth * 0.85);\n  }\n  if (typeof widthProp === \"number\") {\n    return widthProp;\n  }\n  // Percentage string, e.g. \"85%\"\n  const pctMatch = String(widthProp).match(/^(\\d+(?:\\.\\d+)?)%$/);\n  if (pctMatch) {\n    return Math.round(screenWidth * (parseFloat(pctMatch[1]) / 100));\n  }\n  // Fallback: try parsing as number\n  const parsed = parseFloat(widthProp);\n  return isNaN(parsed) ? Math.round(screenWidth * 0.85) : parsed;\n}\n\n// ---------------------------------------------------------------------------\n// Styles\n// ---------------------------------------------------------------------------\n\nconst styles = StyleSheet.create({\n  backdrop: {\n    ...StyleSheet.absoluteFill,\n    backgroundColor: `rgba(0, 0, 0, ${BACKDROP_OPACITY})`,\n    zIndex: 999,\n  },\n  drawer: {\n    position: \"absolute\",\n    top: 0,\n    right: 0,\n    bottom: 0,\n    backgroundColor: \"#ffffff\",\n    zIndex: 1000,\n    shadowColor: \"#000\",\n    shadowOffset: { width: -2, height: 0 },\n    shadowOpacity: 0.25,\n    shadowRadius: 8,\n    elevation: 16,\n  },\n  header: {\n    flexDirection: \"row\",\n    alignItems: \"center\",\n    justifyContent: \"space-between\",\n    paddingHorizontal: 16,\n    paddingVertical: 12,\n    borderBottomWidth: StyleSheet.hairlineWidth,\n    borderBottomColor: \"#e0e0e0\",\n  },\n  headerTitle: {\n    fontSize: 18,\n    fontWeight: \"600\",\n    color: \"#1a1a1a\",\n  },\n  closeButton: {\n    fontSize: 20,\n    color: \"#666\",\n    padding: 4,\n  },\n  chatContainer: {\n    flex: 1,\n  },\n  fab: {\n    position: \"absolute\",\n    bottom: 24,\n    right: 24,\n    width: FAB_SIZE,\n    height: FAB_SIZE,\n    borderRadius: FAB_SIZE / 2,\n    backgroundColor: \"#007AFF\",\n    alignItems: \"center\",\n    justifyContent: \"center\",\n    shadowColor: \"#000\",\n    shadowOffset: { width: 0, height: 2 },\n    shadowOpacity: 0.3,\n    shadowRadius: 4,\n    elevation: 8,\n    zIndex: 998,\n  },\n  fabIcon: {\n    fontSize: 24,\n  },\n});\n","// NOTE: This component needs to be exported from index.ts\n// e.g. export { CopilotPopup } from \"./CopilotPopup\";\n//      export type { CopilotPopupProps, CopilotPopupHandle } from \"./CopilotPopup\";\n\nimport React, {\n  forwardRef,\n  useCallback,\n  useEffect,\n  useImperativeHandle,\n  useRef,\n  useState,\n} from \"react\";\nimport type { ReactNode } from \"react\";\nimport {\n  Modal,\n  Pressable,\n  StyleSheet,\n  Text,\n  TouchableOpacity,\n  View,\n  useWindowDimensions,\n} from \"react-native\";\nimport type { ViewStyle } from \"react-native\";\nimport { CopilotChat } from \"./CopilotChat\";\nimport type { NativeAttachmentsConfig } from \"./hooks/use-attachments\";\nimport type { CopilotKitCoreErrorCode } from \"@copilotkit/core\";\n\nexport interface CopilotPopupProps {\n  /**\n   * The agent ID to use for this chat session.\n   * Passed through to CopilotChat.\n   */\n  agentId?: string;\n\n  /**\n   * @deprecated Use `agentId` instead.\n   */\n  agentName?: string;\n\n  /**\n   * Thread ID for this chat session.\n   */\n  threadId?: string;\n\n  /**\n   * Throttle interval (ms) for re-renders.\n   */\n  throttleMs?: number;\n\n  /**\n   * Whether the popup starts in the open state.\n   * @default false\n   */\n  defaultOpen?: boolean;\n\n  /**\n   * Height of the popup card. Accepts a number (points) or a percentage\n   * string (e.g. \"60%\") relative to the screen height.\n   * @default \"60%\"\n   */\n  height?: number | string;\n\n  /**\n   * Error handler scoped to this popup's chat agent.\n   */\n  onError?: (error: Error) => void;\n\n  /**\n   * Title displayed in the popup header bar.\n   * @default \"CopilotKit\"\n   */\n  headerTitle?: string;\n\n  /**\n   * Enable multimodal file attachments. Forwarded to the internal CopilotChat.\n   * Children access attachment state via `useCopilotChatContext()`.\n   */\n  attachments?: NativeAttachmentsConfig;\n\n  /**\n   * Optional children rendered below the CopilotChat content\n   * inside the popup card.\n   */\n  children?: ReactNode;\n\n  /**\n   * Callback fired when the popup opens.\n   */\n  onOpen?: () => void;\n\n  /**\n   * Callback fired when the popup closes.\n   */\n  onClose?: () => void;\n\n  /**\n   * Whether tapping the semi-transparent backdrop dismisses the popup.\n   * Equivalent to web SDK's `clickOutsideToClose`.\n   * @default true\n   */\n  dismissOnBackdropPress?: boolean;\n\n  /**\n   * Whether to show the floating action button (FAB) that toggles the popup.\n   * @default true\n   */\n  showToggleButton?: boolean;\n\n  /**\n   * Custom styles applied to the popup card container.\n   */\n  style?: ViewStyle;\n}\n\n/**\n * Imperative handle exposed via ref for controlling the popup programmatically.\n */\nexport interface CopilotPopupHandle {\n  open: () => void;\n  close: () => void;\n  toggle: () => void;\n}\n\n/**\n * CopilotPopup for React Native.\n *\n * A floating action button (FAB) that opens a modal chat overlay.\n * The popup appears as a card floating above content with rounded corners,\n * a shadow, and a semi-transparent backdrop.\n *\n * ```tsx\n * import { CopilotPopup } from \"@copilotkit/react-native\";\n *\n * const popupRef = useRef<CopilotPopupHandle>(null);\n *\n * <CopilotPopup\n *   ref={popupRef}\n *   agentId=\"my-agent\"\n *   headerTitle=\"Chat\"\n *   defaultOpen={false}\n * />\n * ```\n */\nexport const CopilotPopup = forwardRef<CopilotPopupHandle, CopilotPopupProps>(\n  function CopilotPopup(\n    {\n      agentId,\n      agentName,\n      threadId,\n      throttleMs,\n      defaultOpen = false,\n      height = \"60%\",\n      onError,\n      headerTitle = \"CopilotKit\",\n      attachments: attachmentsConfig,\n      children,\n      onOpen,\n      onClose,\n      dismissOnBackdropPress = true,\n      showToggleButton = true,\n      style,\n    }: CopilotPopupProps,\n    ref: React.Ref<CopilotPopupHandle>,\n  ) {\n    const [visible, setVisible] = useState(defaultOpen);\n    const { height: screenHeight } = useWindowDimensions();\n\n    // Stable refs for callbacks to avoid effect churn\n    const onOpenRef = useRef(onOpen);\n    const onCloseRef = useRef(onClose);\n    useEffect(() => {\n      onOpenRef.current = onOpen;\n    }, [onOpen]);\n    useEffect(() => {\n      onCloseRef.current = onClose;\n    }, [onClose]);\n\n    const handleOpen = useCallback(() => {\n      setVisible(true);\n      onOpenRef.current?.();\n    }, []);\n\n    const handleClose = useCallback(() => {\n      setVisible(false);\n      onCloseRef.current?.();\n    }, []);\n\n    const handleToggle = useCallback(() => {\n      setVisible((prev) => {\n        const next = !prev;\n        if (next) {\n          onOpenRef.current?.();\n        } else {\n          onCloseRef.current?.();\n        }\n        return next;\n      });\n    }, []);\n\n    // Expose imperative methods\n    useImperativeHandle(\n      ref,\n      () => ({\n        open: handleOpen,\n        close: handleClose,\n        toggle: handleToggle,\n      }),\n      [handleOpen, handleClose, handleToggle],\n    );\n\n    // Resolve popup height\n    const resolvedHeight =\n      typeof height === \"string\" && height.endsWith(\"%\")\n        ? (parseFloat(height) / 100) * screenHeight\n        : typeof height === \"number\"\n          ? height\n          : 0.6 * screenHeight;\n\n    // Wrap onError to match CopilotChat's expected signature\n    const chatOnError = onError\n      ? (event: {\n          error: Error;\n          code: CopilotKitCoreErrorCode;\n          context: Record<string, any>;\n        }) => onError(event.error)\n      : undefined;\n\n    return (\n      <>\n        {/* Floating Action Button */}\n        {showToggleButton && !visible && (\n          <TouchableOpacity\n            testID=\"copilot-popup-fab\"\n            style={styles.fab}\n            onPress={handleToggle}\n            activeOpacity={0.8}\n            accessibilityLabel=\"Open chat\"\n            accessibilityRole=\"button\"\n          >\n            <Text style={styles.fabIcon}>💬</Text>\n          </TouchableOpacity>\n        )}\n\n        {/* Modal Overlay */}\n        <Modal\n          testID=\"copilot-popup-modal\"\n          visible={visible}\n          transparent\n          animationType=\"slide\"\n          onRequestClose={handleClose}\n        >\n          {/* Backdrop */}\n          <Pressable\n            testID=\"copilot-popup-backdrop\"\n            style={styles.backdrop}\n            onPress={dismissOnBackdropPress ? handleClose : undefined}\n          >\n            {/* Card — stop propagation so tapping the card doesn't dismiss */}\n            <Pressable\n              testID=\"copilot-popup-card\"\n              style={[styles.card, { height: resolvedHeight }, style]}\n              onPress={() => {\n                // Prevent backdrop press from firing\n              }}\n            >\n              {/* Header */}\n              <View style={styles.header}>\n                <Text style={styles.headerTitle}>{headerTitle}</Text>\n                <TouchableOpacity\n                  testID=\"copilot-popup-close\"\n                  onPress={handleClose}\n                  hitSlop={{ top: 8, bottom: 8, left: 8, right: 8 }}\n                  accessibilityLabel=\"Close chat\"\n                  accessibilityRole=\"button\"\n                >\n                  <Text style={styles.closeButton}>✕</Text>\n                </TouchableOpacity>\n              </View>\n\n              {/* Chat Content */}\n              <View style={styles.chatContainer}>\n                <CopilotChat\n                  agentId={agentId}\n                  agentName={agentName}\n                  threadId={threadId}\n                  throttleMs={throttleMs}\n                  onError={chatOnError}\n                  attachments={attachmentsConfig}\n                >\n                  {children}\n                </CopilotChat>\n              </View>\n            </Pressable>\n          </Pressable>\n        </Modal>\n      </>\n    );\n  },\n);\n\nconst styles = StyleSheet.create({\n  fab: {\n    position: \"absolute\",\n    bottom: 24,\n    right: 24,\n    width: 56,\n    height: 56,\n    borderRadius: 28,\n    backgroundColor: \"#6366f1\",\n    alignItems: \"center\",\n    justifyContent: \"center\",\n    elevation: 6,\n    shadowColor: \"#000\",\n    shadowOffset: { width: 0, height: 3 },\n    shadowOpacity: 0.27,\n    shadowRadius: 4.65,\n  },\n  fabIcon: {\n    fontSize: 24,\n  },\n  backdrop: {\n    flex: 1,\n    backgroundColor: \"rgba(0, 0, 0, 0.4)\",\n    justifyContent: \"flex-end\",\n  },\n  card: {\n    backgroundColor: \"#ffffff\",\n    borderTopLeftRadius: 16,\n    borderTopRightRadius: 16,\n    overflow: \"hidden\",\n    elevation: 10,\n    shadowColor: \"#000\",\n    shadowOffset: { width: 0, height: -3 },\n    shadowOpacity: 0.25,\n    shadowRadius: 8,\n  },\n  header: {\n    flexDirection: \"row\",\n    alignItems: \"center\",\n    justifyContent: \"space-between\",\n    paddingHorizontal: 16,\n    paddingVertical: 12,\n    borderBottomWidth: StyleSheet.hairlineWidth,\n    borderBottomColor: \"#e5e7eb\",\n  },\n  headerTitle: {\n    fontSize: 17,\n    fontWeight: \"600\",\n    color: \"#111827\",\n  },\n  closeButton: {\n    fontSize: 18,\n    color: \"#6b7280\",\n    fontWeight: \"500\",\n  },\n  chatContainer: {\n    flex: 1,\n  },\n});\n"],"mappings":"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"}