{"version":3,"file":"index.cjs","names":["StreamdownText","Animated","styles","View","StyleSheet","TIMESTAMP_COLOR","View","styles","Text","StyleSheet","View","styles","Text","StyleSheet","FlatList","View","styles","Text","Pressable","TextInput","TouchableOpacity","KeyboardAvoidingView","Platform","StyleSheet","BottomSheetBackdrop","BottomSheet","BottomSheetView","BottomSheetFlatList","StyleSheet"],"sources":["../../src/components/Markdown.tsx","../../src/components/messages/TypingIndicator.tsx","../../src/components/messages/utils.ts","../../src/components/messages/AssistantMessage.tsx","../../src/components/messages/UserMessage.tsx","../../src/components/CopilotChat.tsx","../../src/components/CopilotModal.tsx"],"sourcesContent":["import React, { useMemo } from \"react\";\nimport { StreamdownText } from \"react-native-streamdown\";\n\n/**\n * Style object accepted by `react-native-enriched-markdown` (and therefore\n * `react-native-streamdown`).  Each key targets a markdown element; the\n * available properties vary per element — see the enriched-markdown style\n * reference for the full list.\n */\nexport type MarkdownStyle = Record<string, Record<string, unknown>>;\n\n/**\n * Props for the CopilotMarkdown component.\n */\nexport interface CopilotMarkdownProps {\n  /** Markdown string to render. */\n  content: string;\n  /** Optional style overrides merged on top of the defaults. */\n  style?: MarkdownStyle;\n  /** Whether to enable the streaming fade-in animation (default: true). */\n  streamingAnimation?: boolean;\n}\n\n/**\n * Default markdown styles tuned for chat bubble display.\n *\n * Exported so consumers can spread and extend:\n * ```ts\n * import { defaultMarkdownStyles } from \"@copilotkit/react-native\";\n * const custom = { ...defaultMarkdownStyles, h1: { fontSize: 28 } };\n * ```\n */\nexport const defaultMarkdownStyles: MarkdownStyle = {\n  paragraph: {\n    fontSize: 16,\n    lineHeight: 24,\n    color: \"#1a1a1a\",\n    marginTop: 4,\n    marginBottom: 4,\n  },\n  h1: {\n    fontSize: 24,\n    fontWeight: \"bold\",\n    marginTop: 12,\n    marginBottom: 8,\n    color: \"#111111\",\n  },\n  h2: {\n    fontSize: 20,\n    fontWeight: \"bold\",\n    marginTop: 10,\n    marginBottom: 6,\n    color: \"#111111\",\n  },\n  h3: {\n    fontSize: 18,\n    fontWeight: \"600\",\n    marginTop: 8,\n    marginBottom: 4,\n    color: \"#222222\",\n  },\n  strong: {\n    fontWeight: \"bold\",\n  },\n  em: {\n    fontStyle: \"italic\",\n  },\n  link: {\n    color: \"#0066cc\",\n    underline: true,\n  },\n  blockquote: {\n    backgroundColor: \"#f5f5f5\",\n    borderWidth: 4,\n    borderColor: \"#cccccc\",\n    gapWidth: 12,\n  },\n  code: {\n    backgroundColor: \"#f0f0f0\",\n    fontFamily: \"monospace\",\n    fontSize: 14,\n  },\n  codeBlock: {\n    backgroundColor: \"#f0f0f0\",\n    borderRadius: 8,\n    padding: 12,\n    fontFamily: \"monospace\",\n    fontSize: 14,\n  },\n  list: {\n    marginTop: 4,\n    marginBottom: 4,\n  },\n};\n\n/**\n * Renders markdown content using `react-native-streamdown` with\n * pre-configured styles suited for CopilotKit chat bubbles.\n *\n * `react-native-streamdown` processes incomplete streaming markdown in the\n * background, rendering incrementally without visual glitches — ideal for\n * displaying LLM output as it arrives.\n *\n * Custom styles are merged on top of the defaults so callers only need\n * to override what they want to change.\n */\nexport function CopilotMarkdown({\n  content,\n  style,\n  streamingAnimation = true,\n}: CopilotMarkdownProps) {\n  const mergedStyles = useMemo(() => {\n    if (!style) return defaultMarkdownStyles;\n    return { ...defaultMarkdownStyles, ...style };\n  }, [style]);\n\n  return (\n    <StreamdownText\n      markdown={content}\n      markdownStyle={mergedStyles}\n      streamingAnimation={streamingAnimation}\n    />\n  );\n}\n","import React, { useEffect, useRef } from \"react\";\nimport { View, Animated, StyleSheet } from \"react-native\";\nimport type { ViewStyle } from \"react-native\";\n\n/**\n * Props for the TypingIndicator component.\n */\nexport interface TypingIndicatorProps {\n  /** Optional style override for the container */\n  style?: ViewStyle;\n}\n\nconst DOT_SIZE = 6;\nconst DOT_SPACING = 4;\nconst ANIMATION_DURATION = 400;\n\n/**\n * Three animated dots that pulse in sequence, suitable for embedding\n * inside an AssistantMessage to indicate the AI is still generating.\n *\n * Uses React Native's built-in `Animated` API (no Reanimated dependency).\n */\nexport function TypingIndicator({ style }: TypingIndicatorProps) {\n  const dot1 = useRef(new Animated.Value(0)).current;\n  const dot2 = useRef(new Animated.Value(0)).current;\n  const dot3 = useRef(new Animated.Value(0)).current;\n\n  useEffect(() => {\n    const createPulse = (dot: Animated.Value, delay: number) =>\n      Animated.sequence([\n        Animated.delay(delay),\n        Animated.loop(\n          Animated.sequence([\n            Animated.timing(dot, {\n              toValue: 1,\n              duration: ANIMATION_DURATION,\n              useNativeDriver: true,\n            }),\n            Animated.timing(dot, {\n              toValue: 0,\n              duration: ANIMATION_DURATION,\n              useNativeDriver: true,\n            }),\n          ]),\n        ),\n      ]);\n\n    const animation = Animated.parallel([\n      createPulse(dot1, 0),\n      createPulse(dot2, ANIMATION_DURATION * 0.33),\n      createPulse(dot3, ANIMATION_DURATION * 0.66),\n    ]);\n\n    animation.start();\n\n    return () => {\n      animation.stop();\n    };\n  }, [dot1, dot2, dot3]);\n\n  const dotStyle = (animatedValue: Animated.Value) => ({\n    ...styles.dot,\n    opacity: animatedValue.interpolate({\n      inputRange: [0, 1],\n      outputRange: [0.3, 1],\n    }),\n    transform: [\n      {\n        scale: animatedValue.interpolate({\n          inputRange: [0, 1],\n          outputRange: [0.8, 1.2],\n        }),\n      },\n    ],\n  });\n\n  return (\n    <View\n      testID=\"copilot-loading-cursor\"\n      style={[styles.container, style]}\n      accessibilityLabel=\"Typing indicator\"\n      accessibilityRole=\"text\"\n    >\n      <Animated.View style={dotStyle(dot1)} />\n      <Animated.View style={dotStyle(dot2)} />\n      <Animated.View style={dotStyle(dot3)} />\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flexDirection: \"row\",\n    alignItems: \"center\",\n    paddingVertical: 4,\n    paddingHorizontal: 2,\n  },\n  dot: {\n    width: DOT_SIZE,\n    height: DOT_SIZE,\n    borderRadius: DOT_SIZE / 2,\n    backgroundColor: \"#999999\",\n    marginHorizontal: DOT_SPACING / 2,\n  },\n});\n","/**\n * Format a Date as a 12-hour time string (e.g. \"2:05 PM\").\n */\nexport function formatTimestamp(date: Date): string {\n  const hours = date.getHours();\n  const minutes = date.getMinutes();\n  const ampm = hours >= 12 ? \"PM\" : \"AM\";\n  const displayHours = hours % 12 || 12;\n  const displayMinutes = minutes.toString().padStart(2, \"0\");\n  return `${displayHours}:${displayMinutes} ${ampm}`;\n}\n","import React from \"react\";\nimport { View, Text, StyleSheet, type ViewStyle } from \"react-native\";\nimport { CopilotMarkdown } from \"../Markdown\";\nimport { TypingIndicator } from \"./TypingIndicator\";\nimport { formatTimestamp } from \"./utils\";\n\n// ─── Colors ──────────────────────────────────────────────────────────────────\nconst ASSISTANT_BUBBLE_BG = \"#F0F0F0\";\nconst ASSISTANT_TEXT_COLOR = \"#1A1A1A\";\nconst TIMESTAMP_COLOR = \"#999999\";\n\n/**\n * Props for the AssistantMessage component.\n */\nexport interface AssistantMessageProps {\n  /** Markdown content to render inside the bubble */\n  content: string;\n  /** When true, shows a typing indicator instead of content */\n  isLoading?: boolean;\n  /** Optional timestamp displayed below the bubble */\n  timestamp?: Date;\n  /** Optional style override for the outer container */\n  style?: ViewStyle;\n}\n\n/**\n * Left-aligned chat bubble for AI assistant responses.\n *\n * Renders markdown content via `CopilotMarkdown` and shows an animated\n * typing indicator when `isLoading` is true.\n */\nexport function AssistantMessage({\n  content,\n  isLoading = false,\n  timestamp,\n  style,\n}: AssistantMessageProps) {\n  return (\n    <View style={[styles.container, style]}>\n      <View style={styles.bubble}>\n        {content ? <CopilotMarkdown content={content} /> : null}\n        {isLoading ? <TypingIndicator /> : null}\n      </View>\n      {timestamp && (\n        <Text style={styles.timestamp}>{formatTimestamp(timestamp)}</Text>\n      )}\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    alignItems: \"flex-start\",\n    marginVertical: 4,\n    paddingHorizontal: 12,\n  },\n  bubble: {\n    backgroundColor: ASSISTANT_BUBBLE_BG,\n    borderTopLeftRadius: 16,\n    borderTopRightRadius: 16,\n    borderBottomRightRadius: 16,\n    borderBottomLeftRadius: 4,\n    paddingHorizontal: 12,\n    paddingVertical: 8,\n    maxWidth: \"80%\",\n  },\n  timestamp: {\n    color: TIMESTAMP_COLOR,\n    fontSize: 11,\n    marginTop: 2,\n    marginLeft: 4,\n  },\n});\n","import React from \"react\";\nimport { View, Text, StyleSheet, type ViewStyle } from \"react-native\";\nimport { formatTimestamp } from \"./utils\";\n\n// ─── Colors ──────────────────────────────────────────────────────────────────\nconst USER_BUBBLE_BG = \"#0066CC\";\nconst USER_TEXT_COLOR = \"#FFFFFF\";\nconst TIMESTAMP_COLOR = \"#999999\";\n\n/**\n * Props for the UserMessage component.\n */\nexport interface UserMessageProps {\n  /** Plain text content to display */\n  content: string;\n  /** Optional timestamp displayed below the bubble */\n  timestamp?: Date;\n  /** Optional style override for the outer container */\n  style?: ViewStyle;\n}\n\n/**\n * Right-aligned chat bubble for user messages.\n *\n * Renders plain text (no markdown) with a primary-color background\n * and white text. Optionally displays a subtle timestamp below.\n */\nexport function UserMessage({ content, timestamp, style }: UserMessageProps) {\n  return (\n    <View style={[styles.container, style]}>\n      <View style={styles.bubble}>\n        <Text style={styles.text}>{content}</Text>\n      </View>\n      {timestamp && (\n        <Text style={styles.timestamp}>{formatTimestamp(timestamp)}</Text>\n      )}\n    </View>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    alignItems: \"flex-end\",\n    marginVertical: 4,\n    paddingHorizontal: 12,\n  },\n  bubble: {\n    backgroundColor: USER_BUBBLE_BG,\n    borderTopLeftRadius: 16,\n    borderTopRightRadius: 16,\n    borderBottomLeftRadius: 16,\n    borderBottomRightRadius: 4,\n    paddingHorizontal: 12,\n    paddingVertical: 8,\n    maxWidth: \"80%\",\n  },\n  text: {\n    color: USER_TEXT_COLOR,\n    fontSize: 16,\n    lineHeight: 22,\n  },\n  timestamp: {\n    color: TIMESTAMP_COLOR,\n    fontSize: 11,\n    marginTop: 2,\n    marginRight: 4,\n  },\n});\n","import React, { useCallback, useMemo, useRef, useState } from \"react\";\nimport {\n  FlatList,\n  KeyboardAvoidingView,\n  Platform,\n  Pressable,\n  StyleSheet,\n  Text,\n  TextInput,\n  TouchableOpacity,\n  View,\n} from \"react-native\";\nimport type { ListRenderItemInfo, ViewStyle } from \"react-native\";\nimport {\n  useAgent,\n  useRenderToolCall,\n} from \"@copilotkit/react-core/v2/headless\";\nimport { useCopilotKit } from \"@copilotkit/react-core/v2/context\";\nimport { AssistantMessage } from \"./messages/AssistantMessage\";\nimport { UserMessage } from \"./messages/UserMessage\";\nimport type { Message } from \"@copilotkit/shared\";\nimport type { ToolMessage } from \"@ag-ui/client\";\n\n/** Shape of an assistant message with optional tool calls. */\ninterface AssistantMessageShape {\n  id: string;\n  role: \"assistant\";\n  content?: string;\n  toolCalls?: Array<{\n    id: string;\n    type: \"function\";\n    function: { name: string; arguments: string };\n  }>;\n}\n\nexport interface CopilotChatProps {\n  /** Agent ID to connect to. Defaults to 'default'. */\n  agentName?: string;\n  /** Placeholder text for the input field. */\n  placeholder?: string;\n  /** Suggestion pills shown in the empty state. */\n  initialMessages?: string[];\n  /** Title shown when there are no messages. */\n  emptyStateTitle?: string;\n  /** Subtitle shown when there are no messages. */\n  emptyStateSubtitle?: string;\n  /** Title for the optional header bar. */\n  headerTitle?: string;\n  /** Whether to show the header bar. Defaults to true. */\n  showHeader?: boolean;\n  /** Style override for the outermost container. */\n  style?: ViewStyle;\n  /** Style override for the message list container. */\n  messageContainerStyle?: ViewStyle;\n  /** Style override for the input bar container. */\n  inputContainerStyle?: ViewStyle;\n  /** Callback fired when the user sends a message. */\n  onSendMessage?: (text: string) => void;\n  /** Custom FlatList component (e.g. BottomSheetFlatList for use inside a bottom sheet). */\n  FlatListComponent?: React.ComponentType<any>;\n  /** When true, skip the KeyboardAvoidingView wrapper (useful when a parent already handles keyboard). */\n  disableKeyboardAvoiding?: boolean;\n}\n\ninterface ChatListItem {\n  id: string;\n  type: \"user\" | \"assistant\" | \"tool-call\" | \"loading\";\n  content?: string;\n  toolCalls?: Array<{\n    id: string;\n    type: \"function\";\n    function: { name: string; arguments: string };\n  }>;\n}\n\n/**\n * Lightweight content fingerprint for an agent's message list.\n *\n * The identity of `agent.messages` is NOT a reliable change signal, and it fails\n * in BOTH directions:\n *\n * - It changes on paths that have nothing to do with what is read below.\n *   `@ag-ui/client`'s apply pipeline REASSIGNS the array\n *   (`AbstractAgent.processApplyEvents` does `this.messages = applied.messages`),\n *   so a streaming run hands down a fresh array — and fresh message, `toolCall`\n *   and `function` objects — on every applied delta.\n * - It does NOT change on the paths these memos exist to serve. Core inserts\n *   tool results by mutating in place —\n *   `agent.messages.splice(insertAt, 0, toolMessage)`\n *   (packages/core/src/core/run-handler.ts:931, :1080) —\n *   `AbstractAgent.addMessage` is a `this.messages.push(...)`, and `useAgent`\n *   re-renders with a bare `forceUpdate()` rather than a new array.\n *\n * (Grepping `packages/core/src` for a `.messages` assignment finds test files\n * only, but that proves nothing about identity: the reassignment lives in\n * `@ag-ui/client`, outside that tree.)\n *\n * So anything derived from messages must depend on their CONTENT, not on the\n * array reference.\n *\n * Captures exactly what the derivations below read — id, role, content size,\n * `toolCallId` (so an inserted tool result is visible), and each tool call's id\n * plus argument length (so streaming args advance).\n *\n * String and array content contribute their LENGTH rather than their value, so\n * large text and base64 attachment payloads are never re-serialized on every\n * render. Object content is the deliberate exception and IS serialized: a\n * length-based key is a constant 0 for every object, so an in-place content\n * replacement that keeps the same message id would otherwise be invisible to\n * every memo below.\n *\n * That object branch is convergence, not a fix for a reachable stale render: the\n * producer of same-id object content is an ACTIVITY_SNAPSHOT replace, and\n * `role: \"activity\"` never reaches `listItems`, which builds rows for `user` and\n * `assistant` only. It follows the SHAPE of react-core's `messagesMemoKey`\n * (react-core #6325). The two are independent implementations of the same idea —\n * a change to that key does not propagate here on its own, so treat this as a\n * documented parallel rather than a mirror.\n */\nfunction messagesFingerprint(messages: readonly unknown[]): string {\n  return messages\n    .map((msg) => {\n      const m = msg as {\n        id?: string;\n        role?: string;\n        content?: unknown;\n        toolCallId?: string;\n        toolCalls?: Array<{ id: string; function?: { arguments?: string } }>;\n      };\n      const content = m.content;\n      const contentKey =\n        typeof content === \"string\" || Array.isArray(content)\n          ? content.length\n          : content && typeof content === \"object\"\n            ? objectContentKey(content)\n            : 0;\n      const toolCallsKey = Array.isArray(m.toolCalls)\n        ? m.toolCalls\n            .map((tc) => `${tc.id}:${tc.function?.arguments?.length ?? 0}`)\n            .join(\";\")\n        : \"\";\n      return `${m.id}:${m.role}:${contentKey}:${m.toolCallId ?? \"\"}:${toolCallsKey}`;\n    })\n    .join(\",\");\n}\n\n/**\n * Serializes object content for the fingerprint above.\n *\n * Guarded because `JSON.stringify` THROWS on a circular structure and\n * `messagesFingerprint` runs on EVERY render, so a bare call would take the whole\n * chat down on content this component is explicitly required to tolerate —\n * `toolResultContent` below documents why non-string content reaches RN at all,\n * and \"does not throw on tool content that cannot be JSON-serialised\" pins that a\n * circular tool result must still render.\n *\n * The fallback is a constant, which means a circular object is invisible to the\n * memo exactly as every object used to be. That is the correct trade: it confines\n * the old always-equal behaviour to the pathological case instead of letting it\n * decide the common one. NOTE: this guard is a deliberate divergence from\n * react-core's `messagesMemoKey`, which stringifies unguarded.\n */\nfunction objectContentKey(content: object): string {\n  try {\n    return JSON.stringify(content) ?? \"\";\n  } catch {\n    return \"[unserializable]\";\n  }\n}\n\n/**\n * Coerces a tool message's `content` to the `string` the renderer contract\n * requires (`ReactToolCallRenderer`'s Complete branch declares `result: string`)\n * WITHOUT inventing an empty result.\n *\n * Tool content is a string by construction across the stack: `ToolMessageSchema`\n * declares `content: z.string()`, the SSE transport zod-parses every\n * TOOL_CALL_RESULT before it reaches `agent.messages`, and core stringifies\n * non-string handler results itself (`JSON.stringify(result)` in run-handler)\n * before inserting the tool message. Non-string content is only reachable from a\n * producer that skipped that validation — restored thread history, a non-SSE\n * transport, or app code casting on `addMessage`. Core hedges against exactly\n * that case too (`normalizeToolResultContent` in run-handler accepts `unknown`\n * and handles arrays of text parts), so this must not answer it with `\"\"`:\n * an empty string is a LEGITIMATE tool result, which makes a dropped result\n * indistinguishable from an empty one. Serialise faithfully — the same\n * representation core uses for non-string results — and warn in dev.\n */\nfunction toolResultContent(content: unknown, toolCallId: string): string {\n  if (typeof content === \"string\") return content;\n\n  // null/undefined carry no payload, so \"\" loses nothing — but the message is\n  // still malformed, so it warns below rather than passing silently.\n  let serialized = \"\";\n  if (content !== null && content !== undefined) {\n    try {\n      serialized =\n        JSON.stringify(content) ?? Object.prototype.toString.call(content);\n    } catch {\n      // Circular or otherwise non-serialisable: keep SOMETHING over dropping\n      // the result, and never throw from a render path.\n      serialized = Object.prototype.toString.call(content);\n    }\n  }\n\n  if (typeof __DEV__ === \"undefined\" || __DEV__) {\n    console.warn(\n      `[CopilotChat] Tool message for tool call \"${toolCallId}\" had non-string ` +\n        `content (${content === null ? \"null\" : typeof content}), but renderers ` +\n        `receive \\`result: string\\`. Rendering a serialized form instead of ` +\n        `dropping it: ${serialized === \"\" ? \"<empty>\" : serialized}`,\n    );\n  }\n\n  return serialized;\n}\n\n/**\n * Full-screen chat UI component for React Native.\n *\n * Connects to a CopilotKit agent via `useAgent` and renders messages\n * using platform-appropriate AssistantMessage / UserMessage components.\n *\n * Usage:\n * ```tsx\n * <CopilotChat agentName=\"my-agent\" headerTitle=\"Assistant\" />\n * ```\n */\nexport function CopilotChat({\n  agentName = \"default\",\n  placeholder = \"Type a message...\",\n  initialMessages = [],\n  emptyStateTitle = \"How can I help?\",\n  emptyStateSubtitle = \"Ask me anything or try a suggestion below.\",\n  headerTitle = \"Chat\",\n  showHeader = true,\n  style,\n  messageContainerStyle,\n  inputContainerStyle,\n  onSendMessage,\n  FlatListComponent = FlatList,\n  disableKeyboardAvoiding = false,\n}: CopilotChatProps) {\n  const [inputText, setInputText] = useState(\"\");\n  const [error, setError] = useState<string | null>(null);\n  const flatListRef = useRef<FlatList>(null);\n  const messageIdCounter = useRef(0);\n\n  const { copilotkit } = useCopilotKit();\n  const { agent } = useAgent({ agentId: agentName });\n\n  const messages = agent.messages ?? [];\n  const isRunning = agent.isRunning;\n\n  const renderToolCall = useRenderToolCall();\n\n  // Recomputed every render — cheap, and the only honest dependency for the\n  // message-derived memos below. See `messagesFingerprint` for why the array\n  // reference cannot be trusted as one.\n  const messagesKey = messagesFingerprint(messages);\n\n  // toolCallId -> tool result message. react-core's renderer reports\n  // status \"complete\" with `result` when a tool message exists; RN's chat\n  // previously never correlated these, so `result` was always undefined.\n  const toolMessages = useMemo(() => {\n    const byId = new Map<string, ToolMessage>();\n    for (const msg of messages) {\n      const m = msg as {\n        role?: string;\n        id?: string;\n        toolCallId?: string;\n        content?: unknown;\n      };\n      if (m.role === \"tool\" && m.toolCallId) {\n        byId.set(m.toolCallId, {\n          id: m.id ?? m.toolCallId,\n          role: \"tool\",\n          toolCallId: m.toolCallId,\n          content: toolResultContent(m.content, m.toolCallId),\n        });\n      }\n    }\n    return byId;\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [messagesKey]);\n\n  // Build flat list items from messages\n  const listItems: ChatListItem[] = useMemo(() => {\n    const items: ChatListItem[] = [];\n\n    for (const msg of messages) {\n      if (msg.role === \"user\") {\n        items.push({\n          id: msg.id,\n          type: \"user\",\n          content: typeof msg.content === \"string\" ? msg.content : \"\",\n        });\n      } else if (msg.role === \"assistant\") {\n        const assistantMsg = msg as AssistantMessageShape;\n        // Add text content if present\n        if (assistantMsg.content) {\n          items.push({\n            id: msg.id,\n            type: \"assistant\",\n            content: assistantMsg.content,\n          });\n        }\n        // Add tool calls if present\n        if (assistantMsg.toolCalls && assistantMsg.toolCalls.length > 0) {\n          for (const tc of assistantMsg.toolCalls) {\n            items.push({\n              id: `${msg.id}-tc-${tc.id}`,\n              type: \"tool-call\",\n              toolCalls: [tc],\n            });\n          }\n        }\n      }\n    }\n\n    // Show loading indicator when agent is running and the last message\n    // is not already the assistant streaming\n    if (isRunning) {\n      const lastItem = items[items.length - 1];\n      if (!lastItem || lastItem.type !== \"assistant\") {\n        items.push({ id: \"__loading__\", type: \"loading\" });\n      }\n    }\n\n    return items;\n    // Same reasoning as `toolMessages`: keyed on message CONTENT, because the\n    // array reference does not track content in either direction — core's\n    // in-place `splice` and `addMessage`'s push leave it untouched, while the\n    // AG-UI apply pipeline replaces it on every delta. Without this, an\n    // assistant message or tool call appended mid-run never reaches the list.\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [messagesKey, isRunning]);\n\n  // Id of the trailing row. renderItem needs \"is this the last row?\" to place\n  // the streaming indicator; deriving it here keeps that a named scalar instead\n  // of renderItem closing over `listItems` and index-reading its tail.\n  const lastItemId = useMemo(\n    () => listItems[listItems.length - 1]?.id,\n    [listItems],\n  );\n\n  // extraData defeats FlatList's PureComponent shallow-compare for the values\n  // renderItem CLOSES OVER, as opposed to the ones it receives per row. Those\n  // are exactly the four below, and they mirror renderItem's dependency array —\n  // keep the two in sync. `listItems` is deliberately absent: renderItem's only\n  // read of it is the tail id, now passed as `lastItemId`, and the array itself\n  // is already the `data` prop, which invalidates cells on its own (every\n  // rebuild allocates fresh item objects, so each cell's `item` prop differs).\n  const extraData = useMemo(\n    () => ({ isRunning, lastItemId, renderToolCall, toolMessages }),\n    [isRunning, lastItemId, renderToolCall, toolMessages],\n  );\n\n  // Shared logic for sending a message to the agent\n  const sendMessage = useCallback(\n    async (text: string) => {\n      if (!text || isRunning || !agent) return;\n\n      setError(null);\n      onSendMessage?.(text);\n\n      const id = `user-${++messageIdCounter.current}`;\n      agent.addMessage({\n        id,\n        role: \"user\",\n        content: text,\n      } as Message);\n\n      try {\n        await copilotkit.runAgent({ agent });\n      } catch (err) {\n        const message =\n          err instanceof Error ? err.message : \"An unexpected error occurred\";\n        console.error(\"[CopilotChat] runAgent failed:\", err);\n        setError(message);\n      }\n    },\n    [isRunning, agent, copilotkit, onSendMessage],\n  );\n\n  // Send from the input field\n  const handleSend = useCallback(async () => {\n    const text = inputText.trim();\n    if (!text) return;\n    setInputText(\"\");\n    await sendMessage(text);\n  }, [inputText, sendMessage]);\n\n  // Handle suggestion pill press\n  const handleSuggestion = useCallback(\n    (text: string) => {\n      void sendMessage(text);\n    },\n    [sendMessage],\n  );\n\n  // Auto-scroll when content changes\n  const handleContentSizeChange = useCallback(() => {\n    flatListRef.current?.scrollToEnd({ animated: true });\n  }, []);\n\n  // Render a single list item\n  const renderItem = useCallback(\n    ({ item }: ListRenderItemInfo<ChatListItem>) => {\n      if (item.type === \"user\") {\n        return <UserMessage content={item.content ?? \"\"} />;\n      }\n\n      if (item.type === \"assistant\") {\n        return (\n          <AssistantMessage\n            content={item.content ?? \"\"}\n            isLoading={isRunning && item.id === lastItemId}\n          />\n        );\n      }\n\n      if (item.type === \"tool-call\" && item.toolCalls) {\n        const tc = item.toolCalls[0];\n        // Partial-parses streaming args, resolves the renderer (exact name ->\n        // agent-scoped -> wildcard \"*\") and derives status — all in react-core,\n        // shared with web. Returns ReactElement | null, which is what\n        // renderItem requires.\n        const rendered = renderToolCall({\n          toolCall: tc,\n          toolMessage: toolMessages.get(tc.id),\n        });\n        if (rendered) return <>{rendered}</>;\n\n        // Subtle indicator for unregistered tool calls\n        return (\n          <View style={styles.toolCallIndicator}>\n            <Text style={styles.toolCallText}>Called: {tc.function.name}</Text>\n          </View>\n        );\n      }\n\n      if (item.type === \"loading\") {\n        return <AssistantMessage content=\"\" isLoading />;\n      }\n\n      return null;\n    },\n    [isRunning, lastItemId, renderToolCall, toolMessages],\n  );\n\n  const keyExtractor = useCallback((item: ChatListItem) => item.id, []);\n\n  // Empty state component\n  const emptyComponent = useMemo(\n    () => (\n      <View style={styles.emptyState}>\n        <Text style={styles.emptyTitle}>{emptyStateTitle}</Text>\n        <Text style={styles.emptySubtitle}>{emptyStateSubtitle}</Text>\n        {initialMessages.map((suggestion, i) => (\n          <Pressable\n            key={`suggestion-${i}`}\n            style={styles.suggestionPill}\n            onPress={() => handleSuggestion(suggestion)}\n          >\n            <Text style={styles.suggestionText}>{suggestion}</Text>\n          </Pressable>\n        ))}\n      </View>\n    ),\n    [emptyStateTitle, emptyStateSubtitle, initialMessages, handleSuggestion],\n  );\n\n  const sendDisabled = !inputText.trim() || isRunning;\n\n  const content = (\n    <>\n      {showHeader && (\n        <View style={styles.header}>\n          <Text style={styles.headerTitle}>{headerTitle}</Text>\n        </View>\n      )}\n\n      <FlatListComponent\n        ref={flatListRef}\n        data={listItems}\n        renderItem={renderItem}\n        keyExtractor={keyExtractor}\n        extraData={extraData}\n        contentContainerStyle={[styles.messageList, messageContainerStyle]}\n        onContentSizeChange={handleContentSizeChange}\n        ListEmptyComponent={emptyComponent}\n      />\n\n      {error && (\n        <View style={styles.errorContainer} testID=\"error-message\">\n          <Text style={styles.errorText}>{error}</Text>\n        </View>\n      )}\n\n      <View style={[styles.inputContainer, inputContainerStyle]}>\n        <TextInput\n          style={styles.input}\n          value={inputText}\n          onChangeText={setInputText}\n          placeholder={placeholder}\n          placeholderTextColor=\"#999\"\n          multiline\n          numberOfLines={4}\n          returnKeyType=\"send\"\n          onSubmitEditing={handleSend}\n        />\n        <TouchableOpacity\n          style={[styles.sendButton, sendDisabled && styles.sendButtonDisabled]}\n          onPress={handleSend}\n          disabled={sendDisabled}\n          testID=\"send-button\"\n        >\n          <Text style={styles.sendButtonIcon}>{\"↑\"}</Text>\n        </TouchableOpacity>\n      </View>\n    </>\n  );\n\n  if (disableKeyboardAvoiding) {\n    return <View style={[styles.container, style]}>{content}</View>;\n  }\n\n  return (\n    <KeyboardAvoidingView\n      style={[styles.container, style]}\n      behavior={Platform.OS === \"ios\" ? \"padding\" : \"height\"}\n      keyboardVerticalOffset={0}\n    >\n      {content}\n    </KeyboardAvoidingView>\n  );\n}\n\nconst styles = StyleSheet.create({\n  container: {\n    flex: 1,\n    backgroundColor: \"#FFFFFF\",\n  },\n  header: {\n    height: 56,\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    borderBottomWidth: StyleSheet.hairlineWidth,\n    borderBottomColor: \"#E0E0E0\",\n    backgroundColor: \"#FFFFFF\",\n  },\n  headerTitle: {\n    fontSize: 17,\n    fontWeight: \"600\",\n    color: \"#1A1A1A\",\n  },\n  messageList: {\n    paddingHorizontal: 16,\n    flexGrow: 1,\n  },\n  inputContainer: {\n    flexDirection: \"row\",\n    alignItems: \"flex-end\",\n    paddingHorizontal: 8,\n    paddingVertical: 8,\n    borderTopWidth: StyleSheet.hairlineWidth,\n    borderTopColor: \"#E0E0E0\",\n    backgroundColor: \"#FFFFFF\",\n  },\n  input: {\n    flex: 1,\n    backgroundColor: \"#F5F5F5\",\n    borderRadius: 20,\n    paddingHorizontal: 12,\n    paddingVertical: 8,\n    fontSize: 15,\n    maxHeight: 100,\n    color: \"#1A1A1A\",\n  },\n  sendButton: {\n    width: 36,\n    height: 36,\n    borderRadius: 18,\n    backgroundColor: \"#0066CC\",\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    marginLeft: 8,\n  },\n  sendButtonDisabled: {\n    opacity: 0.4,\n  },\n  sendButtonIcon: {\n    color: \"#FFFFFF\",\n    fontSize: 18,\n    fontWeight: \"700\",\n  },\n  emptyState: {\n    flex: 1,\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    paddingTop: 100,\n    gap: 12,\n  },\n  emptyTitle: {\n    fontSize: 22,\n    fontWeight: \"700\",\n    color: \"#1A1A1A\",\n    marginBottom: 4,\n  },\n  emptySubtitle: {\n    fontSize: 15,\n    color: \"#666666\",\n    marginBottom: 16,\n  },\n  suggestionPill: {\n    backgroundColor: \"#E8F0FE\",\n    borderRadius: 20,\n    paddingHorizontal: 16,\n    paddingVertical: 10,\n  },\n  suggestionText: {\n    color: \"#0066CC\",\n    fontWeight: \"600\",\n    fontSize: 14,\n  },\n  toolCallIndicator: {\n    alignSelf: \"flex-start\",\n    backgroundColor: \"#F0F0F0\",\n    borderRadius: 12,\n    paddingHorizontal: 12,\n    paddingVertical: 6,\n    marginBottom: 8,\n  },\n  toolCallText: {\n    fontSize: 12,\n    color: \"#999999\",\n    fontStyle: \"italic\",\n  },\n  errorContainer: {\n    backgroundColor: \"#FEE2E2\",\n    paddingHorizontal: 12,\n    paddingVertical: 8,\n    marginHorizontal: 8,\n    borderRadius: 8,\n  },\n  errorText: {\n    color: \"#DC2626\",\n    fontSize: 13,\n  },\n});\n","/**\n * CopilotModal — a bottom-sheet chat overlay for React Native.\n *\n * Mobile equivalent of CopilotPopup on web. Wraps CopilotChat inside\n * @gorhom/bottom-sheet so the chat can slide up over any screen.\n */\nimport React, {\n  forwardRef,\n  useCallback,\n  useEffect,\n  useImperativeHandle,\n  useMemo,\n  useRef,\n} from \"react\";\nimport { StyleSheet, View } from \"react-native\";\nimport BottomSheet, {\n  BottomSheetBackdrop,\n  BottomSheetFlatList,\n  BottomSheetView,\n} from \"@gorhom/bottom-sheet\";\nimport type { BottomSheetBackdropProps } from \"@gorhom/bottom-sheet\";\nimport { CopilotChat } from \"./CopilotChat\";\nimport type { CopilotChatProps } from \"./CopilotChat\";\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport interface CopilotModalProps {\n  /** Controlled visibility — when true the sheet opens, when false it closes. */\n  visible?: boolean;\n\n  /** Called when the sheet is dismissed (via backdrop tap, swipe-down, or close()). */\n  onDismiss?: () => void;\n\n  /**\n   * Bottom-sheet snap points.\n   * @default ['50%', '90%']\n   */\n  snapPoints?: (string | number)[];\n\n  /**\n   * Which snap-point index to open at.\n   * @default 0\n   */\n  initialSnapIndex?: number;\n\n  /**\n   * Whether closing the sheet fires onDismiss.\n   * @default true\n   */\n  enableDismissOnClose?: boolean;\n\n  /**\n   * Backdrop opacity when the sheet is open.\n   * @default 0.5\n   */\n  backdropOpacity?: number;\n\n  // -- Pass-through to CopilotChat ------------------------------------------\n\n  /** Which agent to connect to. */\n  agentName?: string;\n\n  /** Input placeholder text. */\n  placeholder?: string;\n\n  /** Seed messages shown on first render. */\n  initialMessages?: string[];\n\n  /** Title shown in the CopilotChat header area. */\n  headerTitle?: string;\n}\n\n/** Imperative handle exposed via ref. */\nexport interface CopilotModalRef {\n  /** Programmatically open the bottom sheet. */\n  open: () => void;\n  /** Programmatically close the bottom sheet. */\n  close: () => void;\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport const CopilotModal = forwardRef<CopilotModalRef, CopilotModalProps>(\n  function CopilotModal(\n    {\n      visible,\n      onDismiss,\n      snapPoints: snapPointsProp,\n      initialSnapIndex = 0,\n      enableDismissOnClose = true,\n      backdropOpacity = 0.5,\n      agentName,\n      placeholder,\n      initialMessages,\n      headerTitle,\n    },\n    ref,\n  ) {\n    const bottomSheetRef = useRef<BottomSheet>(null);\n\n    // Stable snap-points array\n    const snapPoints = useMemo(\n      () => snapPointsProp ?? [\"50%\", \"90%\"],\n      [snapPointsProp],\n    );\n\n    // ── Imperative API ────────────────────────────────────────────────────\n    useImperativeHandle(\n      ref,\n      () => ({\n        open() {\n          bottomSheetRef.current?.snapToIndex(initialSnapIndex);\n        },\n        close() {\n          bottomSheetRef.current?.close();\n        },\n      }),\n      [initialSnapIndex],\n    );\n\n    // ── Controlled visibility ─────────────────────────────────────────────\n    useEffect(() => {\n      if (visible === undefined) return;\n      if (visible) {\n        bottomSheetRef.current?.snapToIndex(initialSnapIndex);\n      } else {\n        bottomSheetRef.current?.close();\n      }\n    }, [visible, initialSnapIndex]);\n\n    // ── Backdrop renderer ─────────────────────────────────────────────────\n    const renderBackdrop = useCallback(\n      (props: BottomSheetBackdropProps) => (\n        <BottomSheetBackdrop\n          {...props}\n          disappearsOnIndex={-1}\n          appearsOnIndex={0}\n          opacity={backdropOpacity}\n          pressBehavior=\"close\"\n        />\n      ),\n      [backdropOpacity],\n    );\n\n    // ── Sheet close handler ───────────────────────────────────────────────\n    const handleClose = useCallback(() => {\n      if (enableDismissOnClose) {\n        onDismiss?.();\n      }\n    }, [enableDismissOnClose, onDismiss]);\n\n    // ── Build CopilotChat props ───────────────────────────────────────────\n    const chatProps = useMemo(() => {\n      const props: Partial<CopilotChatProps> = {};\n      if (agentName !== undefined) props.agentName = agentName;\n      if (placeholder !== undefined) props.placeholder = placeholder;\n      if (initialMessages !== undefined)\n        props.initialMessages = initialMessages;\n      if (headerTitle !== undefined) props.headerTitle = headerTitle;\n      return props;\n    }, [agentName, placeholder, initialMessages, headerTitle]);\n\n    return (\n      <BottomSheet\n        ref={bottomSheetRef}\n        index={-1}\n        snapPoints={snapPoints}\n        enablePanDownToClose\n        backdropComponent={renderBackdrop}\n        onClose={handleClose}\n        keyboardBehavior=\"interactive\"\n        keyboardBlurBehavior=\"restore\"\n        backgroundStyle={styles.sheetBackground}\n        handleIndicatorStyle={styles.handleIndicator}\n      >\n        <BottomSheetView style={styles.contentContainer}>\n          <CopilotChat\n            {...chatProps}\n            FlatListComponent={BottomSheetFlatList}\n            disableKeyboardAvoiding\n          />\n        </BottomSheetView>\n      </BottomSheet>\n    );\n  },\n);\n\n// ---------------------------------------------------------------------------\n// Styles\n// ---------------------------------------------------------------------------\n\nconst styles = StyleSheet.create({\n  sheetBackground: {\n    backgroundColor: \"#FFFFFF\",\n    borderTopLeftRadius: 16,\n    borderTopRightRadius: 16,\n  },\n  handleIndicator: {\n    width: 40,\n    height: 4,\n    backgroundColor: \"#DDDDDD\",\n  },\n  contentContainer: {\n    flex: 1,\n  },\n});\n"],"mappings":"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"}