UNPKG

@jeanmemory/react

Version:

React SDK for Jean Memory - Build personalized AI chatbots in 5 lines of code

1 lines 61.9 kB
{"version":3,"file":"index.cjs","sources":["../config.ts","../mcp.ts","../provider.tsx","../node_modules/lucide-react/dist/esm/shared/src/utils.js","../node_modules/lucide-react/dist/esm/defaultAttributes.js","../node_modules/lucide-react/dist/esm/Icon.js","../node_modules/lucide-react/dist/esm/createLucideIcon.js","../node_modules/lucide-react/dist/esm/icons/bot.js","../node_modules/lucide-react/dist/esm/icons/log-out.js","../node_modules/lucide-react/dist/esm/icons/moon.js","../node_modules/lucide-react/dist/esm/icons/send.js","../node_modules/lucide-react/dist/esm/icons/sun.js","../node_modules/lucide-react/dist/esm/icons/trash-2.js","../node_modules/lucide-react/dist/esm/icons/user.js","../node_modules/lucide-react/dist/esm/icons/x.js","../JeanChat.tsx","../SignInWithJean.tsx","../useJeanMCP.tsx"],"sourcesContent":["/**\n * Jean Memory React SDK - Configuration\n * Centralized API endpoints\n */\nexport const JEAN_API_BASE = 'https://jean-memory-api-virginia.onrender.com';\nexport const JEAN_OAUTH_BASE = 'https://jeanmemory.com';\n","/**\n * Jean Memory React SDK - MCP Utility\n * Shared logic for making MCP requests\n */\nimport { JEAN_API_BASE } from './config';\n\ninterface MCPRequest {\n  jsonrpc: string;\n  id: number;\n  method: string;\n  params: {\n    name: string;\n    arguments: any;\n  };\n}\n\nexport interface MCPResponse {\n  jsonrpc: string;\n  id: number;\n  result?: {\n    content: Array<{\n      type: string;\n      text: string;\n    }>;\n  };\n  error?: {\n    code: number;\n    message: string;\n  };\n}\n\nlet requestId = 0;\n\nexport async function makeMCPRequest(\n  user: { user_id: string },\n  apiKey: string,\n  toolName: string,\n  arguments_: any,\n  clientName: string = 'react-sdk'\n): Promise<MCPResponse> {\n  const id = ++requestId;\n\n  const mcpRequest: MCPRequest = {\n    jsonrpc: '2.0',\n    id,\n    method: 'tools/call',\n    params: {\n      name: toolName,\n      arguments: arguments_\n    }\n  };\n\n  const response = await fetch(`${JEAN_API_BASE}/mcp/${clientName}/messages/${user.user_id}`, {\n    method: 'POST',\n    headers: {\n      'Content-Type': 'application/json',\n      'X-User-Id': user.user_id,\n      'X-Client-Name': clientName,\n      'X-API-Key': apiKey\n    },\n    body: JSON.stringify(mcpRequest)\n  });\n\n  if (!response.ok) {\n    const errorBody = await response.text();\n    throw new Error(`MCP request failed: ${response.statusText} - ${errorBody}`);\n  }\n\n  return response.json();\n}\n","/**\n * Jean Memory React SDK - Provider Component\n * Manages authentication state and API client\n */\nimport React, { createContext, useContext, useState, useEffect, ReactNode } from 'react';\nimport { JEAN_API_BASE } from './config';\nimport { makeMCPRequest } from './mcp';\n\nconst JEAN_API_BASE_OLD = 'https://jean-memory-api-virginia.onrender.com';\n\nexport interface JeanUser {\n  user_id: string;\n  email: string;\n  name?: string;\n  access_token: string;\n}\n\nexport interface JeanMessage {\n  id: string;\n  role: 'user' | 'assistant';\n  content: string;\n  timestamp: Date;\n}\n\ninterface JeanContextValue {\n  // Essential state\n  isAuthenticated: boolean;\n  isLoading: boolean;\n  user: JeanUser | null;\n  messages: JeanMessage[];\n  error: string | null;\n  \n  // Essential methods\n  signIn: () => void;\n  signOut: () => void;\n  sendMessage: (message: string, options?: MessageOptions) => Promise<void>;\n  storeDocument: (title: string, content: string) => Promise<void>;\n  connect: (service: 'notion' | 'slack' | 'gdrive') => void;\n  clearConversation: () => void;\n  setUser: (user: JeanUser) => void;\n  \n  // Tools for direct memory access\n  tools: {\n    add_memory: (content: string) => Promise<any>;\n    search_memory: (query: string) => Promise<any>;\n  };\n}\n\nexport interface MessageOptions {\n  speed?: 'fast' | 'balanced' | 'comprehensive';\n  tool?: 'jean_memory' | 'search_memory';\n  format?: 'simple' | 'enhanced';\n}\n\nconst JeanContext = createContext<JeanContextValue | null>(null);\n\n// Generate code verifier and challenge for PKCE\nfunction generatePKCE() {\n  const verifier = generateRandomString(128);\n  const encoder = new TextEncoder();\n  const data = encoder.encode(verifier);\n  \n  return crypto.subtle.digest('SHA-256', data).then(digest => {\n    const challenge = btoa(String.fromCharCode(...new Uint8Array(digest)))\n      .replace(/=/g, '')\n      .replace(/\\+/g, '-')\n      .replace(/\\//g, '_');\n    return { verifier, challenge };\n  });\n}\n\nfunction generateRandomString(length: number): string {\n  const charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';\n  const values = crypto.getRandomValues(new Uint8Array(length));\n  return Array.from(values)\n    .map(x => charset[x % charset.length])\n    .join('');\n}\n\ninterface JeanProviderProps {\n  apiKey: string;\n  children: ReactNode;\n}\n\nexport function JeanProvider({ apiKey, children }: JeanProviderProps) {\n  const [user, setUser] = useState<JeanUser | null>(null);\n  const [messages, setMessages] = useState<JeanMessage[]>([]);\n  const [isLoading, setIsLoading] = useState(false);\n  const [rawError, setRawError] = useState<string | null>(null);\n\n  // Validate API key on mount\n  useEffect(() => {\n    if (!apiKey) {\n      setRawError('API key is required');\n      return;\n    }\n    \n    if (!apiKey.startsWith('jean_sk_')) {\n      setRawError('Invalid API key format');\n      return;\n    }\n\n    // API key will be validated on first request\n    console.log('✅ Jean Memory SDK initialized');\n  }, [apiKey]);\n\n  // Load user from localStorage on mount\n  useEffect(() => {\n    const storedUser = localStorage.getItem('jean_user');\n    if (storedUser) {\n      try {\n        setUser(JSON.parse(storedUser));\n      } catch (e) {\n        localStorage.removeItem('jean_user');\n      }\n    }\n  }, []);\n\n  const sendMessage = async (message: string, options: MessageOptions = {}) => {\n    if (!user) {\n      throw new Error('User not authenticated');\n    }\n\n    setIsLoading(true);\n    setRawError(null);\n\n    try {\n      // Add user message to conversation\n      const userMessage: JeanMessage = {\n        id: Date.now().toString(),\n        role: 'user',\n        content: message,\n        timestamp: new Date()\n      };\n      setMessages(prev => [...prev, userMessage]);\n\n      const response = await makeMCPRequest(\n        user,\n        apiKey,\n        options.tool || 'jean_memory',\n        {\n          user_message: message,\n          is_new_conversation: messages.length <= 1,\n          needs_context: true\n        }\n      );\n\n      if (response.error) {\n        throw new Error(response.error.message);\n      }\n      \n      const assistantMessage: JeanMessage = {\n        id: (Date.now() + 1).toString(),\n        role: 'assistant',\n        content: response.result?.content?.[0]?.text || 'I understood and saved that information.',\n        timestamp: new Date()\n      };\n      setMessages(prev => [...prev, assistantMessage]);\n    } catch (err) {\n      const errorMessage = err instanceof Error ? err.message : 'Failed to send message';\n      setRawError(errorMessage);\n      throw err;\n    } finally {\n      setIsLoading(false);\n    }\n  };\n\n  const storeDocument = async (title: string, content: string): Promise<void> => {\n    if (!user) {\n      throw new Error(\"User not authenticated\");\n    }\n    const response = await makeMCPRequest(user, apiKey, 'store_document', {\n      title,\n      content,\n      document_type: 'markdown'\n    });\n    if (response.error) {\n      throw new Error(response.error.message);\n    }\n  };\n\n  const connect = (service: 'notion' | 'slack' | 'gdrive') => {\n    if (!user) {\n      throw new Error('User not authenticated');\n    }\n    \n    // Open OAuth flow for external service integration\n    const integrationUrl = `${JEAN_API_BASE}/api/v1/integrations/${service}/connect?user_token=${user.access_token}`;\n    \n    // Open in new window for better UX\n    const popup = window.open(\n      integrationUrl,\n      `connect-${service}`,\n      'width=600,height=700,scrollbars=yes,resizable=yes'\n    );\n    \n    // Listen for completion\n    const checkClosed = setInterval(() => {\n      if (popup?.closed) {\n        clearInterval(checkClosed);\n        console.log(`${service} integration window closed`);\n        // Could refresh integrations list here\n      }\n    }, 1000);\n  };\n\n\n  const signIn = async () => {\n    setIsLoading(true);\n    \n    try {\n      // Generate PKCE parameters\n      const { verifier, challenge } = await generatePKCE();\n      const state = generateRandomString(32);\n      \n      // Store for callback\n      sessionStorage.setItem('jean_oauth_state', state);\n      sessionStorage.setItem('jean_oauth_verifier', verifier);\n      \n      // Build OAuth URL\n      const params = new URLSearchParams({\n        response_type: 'code',\n        client_id: apiKey || 'default_client',\n        redirect_uri: window.location.origin + window.location.pathname,\n        state,\n        code_challenge: challenge,\n        code_challenge_method: 'S256',\n        scope: 'read write'\n      });\n      \n      // Redirect to OAuth provider\n      window.location.href = `${JEAN_API_BASE}/oauth/authorize?${params.toString()}`;\n    } catch (error) {\n      setIsLoading(false);\n      const errorMessage = error instanceof Error ? error.message : 'Sign in failed';\n      setRawError(errorMessage);\n    }\n  };\n\n  const handleSetUser = (newUser: JeanUser) => {\n    setUser(newUser);\n    localStorage.setItem('jean_user', JSON.stringify(newUser));\n  };\n\n  const signOut = () => {\n    setUser(null);\n    setMessages([]);\n    localStorage.removeItem('jean_user');\n  };\n\n  const clearConversation = () => {\n    setMessages([]);\n  };\n\n  // Direct memory tools\n  const tools = {\n    add_memory: async (content: string) => {\n      if (!user) {\n        throw new Error('User not authenticated');\n      }\n      \n      const response = await makeMCPRequest(\n        user,\n        apiKey,\n        'add_memory',\n        { content }\n      );\n      \n      if (response.error) {\n        throw new Error(response.error.message);\n      }\n      \n      return response.result;\n    },\n    \n    search_memory: async (query: string) => {\n      if (!user) {\n        throw new Error('User not authenticated');\n      }\n      \n      const response = await makeMCPRequest(\n        user,\n        apiKey,\n        'search_memory',\n        { query }\n      );\n      \n      if (response.error) {\n        throw new Error(response.error.message);\n      }\n      \n      return response.result;\n    }\n  };\n\n  const contextValue: JeanContextValue = {\n    // Essential state\n    isAuthenticated: !!user,\n    isLoading,\n    user,\n    messages,\n    error: rawError,\n    \n    // Essential methods\n    signIn,\n    signOut,\n    sendMessage,\n    storeDocument,\n    connect,\n    clearConversation,\n    setUser: handleSetUser,\n    \n    // Tools\n    tools\n  };\n\n  return (\n    <JeanContext.Provider value={contextValue}>\n      {children}\n    </JeanContext.Provider>\n  );\n}\n\nexport function useJean() {\n  const context = useContext(JeanContext);\n  if (!context) {\n    throw new Error('useJean must be used within a JeanProvider');\n  }\n  return context;\n}","/**\n * @license lucide-react v0.395.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n  return Boolean(className) && array.indexOf(className) === index;\n}).join(\" \");\n\nexport { mergeClasses, toKebabCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.395.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n  xmlns: \"http://www.w3.org/2000/svg\",\n  width: 24,\n  height: 24,\n  viewBox: \"0 0 24 24\",\n  fill: \"none\",\n  stroke: \"currentColor\",\n  strokeWidth: 2,\n  strokeLinecap: \"round\",\n  strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.395.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n  ({\n    color = \"currentColor\",\n    size = 24,\n    strokeWidth = 2,\n    absoluteStrokeWidth,\n    className = \"\",\n    children,\n    iconNode,\n    ...rest\n  }, ref) => {\n    return createElement(\n      \"svg\",\n      {\n        ref,\n        ...defaultAttributes,\n        width: size,\n        height: size,\n        stroke: color,\n        strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n        className: mergeClasses(\"lucide\", className),\n        ...rest\n      },\n      [\n        ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n        ...Array.isArray(children) ? children : [children]\n      ]\n    );\n  }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.395.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n  const Component = forwardRef(\n    ({ className, ...props }, ref) => createElement(Icon, {\n      ref,\n      iconNode,\n      className: mergeClasses(`lucide-${toKebabCase(iconName)}`, className),\n      ...props\n    })\n  );\n  Component.displayName = `${iconName}`;\n  return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.395.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Bot = createLucideIcon(\"Bot\", [\n  [\"path\", { d: \"M12 8V4H8\", key: \"hb8ula\" }],\n  [\"rect\", { width: \"16\", height: \"12\", x: \"4\", y: \"8\", rx: \"2\", key: \"enze0r\" }],\n  [\"path\", { d: \"M2 14h2\", key: \"vft8re\" }],\n  [\"path\", { d: \"M20 14h2\", key: \"4cs60a\" }],\n  [\"path\", { d: \"M15 13v2\", key: \"1xurst\" }],\n  [\"path\", { d: \"M9 13v2\", key: \"rq6x2g\" }]\n]);\n\nexport { Bot as default };\n//# sourceMappingURL=bot.js.map\n","/**\n * @license lucide-react v0.395.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst LogOut = createLucideIcon(\"LogOut\", [\n  [\"path\", { d: \"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4\", key: \"1uf3rs\" }],\n  [\"polyline\", { points: \"16 17 21 12 16 7\", key: \"1gabdz\" }],\n  [\"line\", { x1: \"21\", x2: \"9\", y1: \"12\", y2: \"12\", key: \"1uyos4\" }]\n]);\n\nexport { LogOut as default };\n//# sourceMappingURL=log-out.js.map\n","/**\n * @license lucide-react v0.395.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Moon = createLucideIcon(\"Moon\", [\n  [\"path\", { d: \"M12 3a6 6 0 0 0 9 9 9 9 0 1 1-9-9Z\", key: \"a7tn18\" }]\n]);\n\nexport { Moon as default };\n//# sourceMappingURL=moon.js.map\n","/**\n * @license lucide-react v0.395.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Send = createLucideIcon(\"Send\", [\n  [\"path\", { d: \"m22 2-7 20-4-9-9-4Z\", key: \"1q3vgg\" }],\n  [\"path\", { d: \"M22 2 11 13\", key: \"nzbqef\" }]\n]);\n\nexport { Send as default };\n//# sourceMappingURL=send.js.map\n","/**\n * @license lucide-react v0.395.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Sun = createLucideIcon(\"Sun\", [\n  [\"circle\", { cx: \"12\", cy: \"12\", r: \"4\", key: \"4exip2\" }],\n  [\"path\", { d: \"M12 2v2\", key: \"tus03m\" }],\n  [\"path\", { d: \"M12 20v2\", key: \"1lh1kg\" }],\n  [\"path\", { d: \"m4.93 4.93 1.41 1.41\", key: \"149t6j\" }],\n  [\"path\", { d: \"m17.66 17.66 1.41 1.41\", key: \"ptbguv\" }],\n  [\"path\", { d: \"M2 12h2\", key: \"1t8f8n\" }],\n  [\"path\", { d: \"M20 12h2\", key: \"1q8mjw\" }],\n  [\"path\", { d: \"m6.34 17.66-1.41 1.41\", key: \"1m8zz5\" }],\n  [\"path\", { d: \"m19.07 4.93-1.41 1.41\", key: \"1shlcs\" }]\n]);\n\nexport { Sun as default };\n//# sourceMappingURL=sun.js.map\n","/**\n * @license lucide-react v0.395.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Trash2 = createLucideIcon(\"Trash2\", [\n  [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n  [\"path\", { d: \"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\", key: \"4alrt4\" }],\n  [\"path\", { d: \"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\", key: \"v07s0e\" }],\n  [\"line\", { x1: \"10\", x2: \"10\", y1: \"11\", y2: \"17\", key: \"1uufr5\" }],\n  [\"line\", { x1: \"14\", x2: \"14\", y1: \"11\", y2: \"17\", key: \"xtxkd\" }]\n]);\n\nexport { Trash2 as default };\n//# sourceMappingURL=trash-2.js.map\n","/**\n * @license lucide-react v0.395.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst User = createLucideIcon(\"User\", [\n  [\"path\", { d: \"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\", key: \"975kel\" }],\n  [\"circle\", { cx: \"12\", cy: \"7\", r: \"4\", key: \"17ys0d\" }]\n]);\n\nexport { User as default };\n//# sourceMappingURL=user.js.map\n","/**\n * @license lucide-react v0.395.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst X = createLucideIcon(\"X\", [\n  [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n  [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n]);\n\nexport { X as default };\n//# sourceMappingURL=x.js.map\n","/**\n * Jean Memory React SDK - Chat Component\n * Complete chat interface with authentication\n */\nimport React, { useState, useRef, useEffect } from 'react';\nimport { useJean } from './provider';\nimport { SignInWithJean } from './SignInWithJean';\nimport { User, Bot, Send, LogOut, Trash2, X, Sun, Moon } from 'lucide-react';\n\ninterface JeanChatProps {\n  className?: string;\n  showHeader?: boolean;\n  placeholder?: string;\n}\n\nexport function JeanChat({ \n  className = '', \n  showHeader = true,\n  placeholder = 'Type your message...'\n}: JeanChatProps) {\n  const agent = useJean();\n  const [input, setInput] = useState('');\n  const messagesEndRef = useRef<HTMLDivElement>(null);\n  const [isDark, setIsDark] = useState(false);\n\n  const scrollToBottom = () => {\n    messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });\n  };\n\n  useEffect(() => {\n    scrollToBottom();\n  }, [agent.messages]);\n\n  useEffect(() => {\n    if (typeof window !== 'undefined') {\n      const storedTheme = localStorage.getItem('jean-chat-theme');\n      if (storedTheme === 'dark') {\n        setIsDark(true);\n      }\n    }\n  }, []);\n\n  useEffect(() => {\n    if (isDark) {\n      document.documentElement.classList.add('dark');\n      localStorage.setItem('jean-chat-theme', 'dark');\n    } else {\n      document.documentElement.classList.remove('dark');\n      localStorage.setItem('jean-chat-theme', 'light');\n    }\n  }, [isDark]);\n\n  const handleSubmit = async (e: React.FormEvent) => {\n    e.preventDefault();\n    if (!input.trim() || agent.isLoading) return;\n\n    const message = input.trim();\n    setInput('');\n\n    try {\n      await agent.sendMessage(message);\n    } catch (err) {\n      console.error('Failed to send message:', err);\n    }\n  };\n\n  if (!agent.isAuthenticated) {\n    return (\n      <div className={`flex items-center justify-center h-full ${className} bg-gray-50 dark:bg-gray-900`}>\n        <div className=\"text-center p-8 max-w-md w-full\">\n          <div className=\"w-16 h-16 mx-auto mb-6 rounded-2xl bg-white dark:bg-gray-800 flex items-center justify-center border border-gray-200 dark:border-gray-700\">\n            <svg width=\"32\" height=\"32\" viewBox=\"0 0 24 24\" fill=\"none\">\n              <path d=\"M12 2L13.09 8.26L20 9L13.09 15.74L12 22L10.91 15.74L4 9L10.91 8.26L12 2Z\" \n                    stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"\n                    className=\"text-gray-600 dark:text-gray-400\"/>\n            </svg>\n          </div>\n          <h3 className=\"text-xl font-semibold text-gray-900 dark:text-white mb-2\">Connect with Jean Memory</h3>\n          <p className=\"text-gray-600 dark:text-gray-400 text-sm mb-6\">\n            Access your personalized AI assistant with persistent memory across all your applications.\n          </p>\n          <button \n            onClick={agent.signIn}\n            className=\"inline-flex items-center justify-center gap-2.5 px-5 py-2.5 bg-black text-white font-medium text-sm border border-transparent rounded-lg hover:bg-gray-800 transition-all focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-gray-900 dark:bg-white dark:text-black dark:hover:bg-gray-200 dark:focus:ring-gray-300 shadow-md hover:shadow-lg disabled:opacity-60 disabled:cursor-not-allowed\"\n          >\n            <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\n              <path d=\"M12 2L13.09 8.26L20 9L13.09 15.74L12 22L10.91 15.74L4 9L10.91 8.26L12 2Z\" \n                    stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n            </svg>\n            <span>Sign In with Jean</span>\n          </button>\n        </div>\n      </div>\n    );\n  }\n\n  return (\n    <div className={`flex flex-col h-full bg-white dark:bg-gray-900 text-gray-900 dark:text-white ${className}`}>\n      {showHeader && (\n        <div className=\"flex justify-between items-center px-4 py-3 border-b border-gray-200 dark:border-gray-700 bg-gray-50 dark:bg-gray-800\">\n          <div className=\"flex items-center space-x-3\">\n            <div className=\"w-10 h-10 rounded-full bg-gradient-to-br from-blue-400 to-purple-500 flex items-center justify-center\">\n              <Bot size={20} className=\"text-white\" />\n            </div>\n            <div>\n              <h3 className=\"font-semibold\">Jean Memory Assistant</h3>\n              <p className=\"text-xs text-gray-500 dark:text-gray-400\">Connected as {agent.user?.email}</p>\n            </div>\n          </div>\n          <div className=\"flex items-center space-x-2\">\n            <button\n              onClick={() => setIsDark(!isDark)}\n              className=\"p-2 text-gray-500 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 rounded-full transition-colors\"\n            >\n              {isDark ? <Sun size={16} /> : <Moon size={16} />}\n            </button>\n            <button\n              onClick={() => window.location.reload()}\n              disabled={agent.messages.length === 0}\n              className=\"p-2 text-gray-500 dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 rounded-full disabled:opacity-50 disabled:cursor-not-allowed transition-colors\"\n              title=\"Clear Conversation\"\n            >\n              <Trash2 size={16} />\n            </button>\n            <button\n              onClick={agent.signOut}\n              className=\"p-2 text-red-500 hover:bg-red-100 dark:hover:bg-red-900/50 rounded-full transition-colors\"\n              title=\"Sign Out\"\n            >\n              <LogOut size={16} />\n            </button>\n          </div>\n        </div>\n      )}\n\n      {/* Messages */}\n      <div className=\"flex-1 overflow-y-auto p-6 space-y-6\">\n        {agent.messages.length === 0 ? (\n          <div className=\"flex flex-col items-center justify-center h-full text-center text-gray-500 dark:text-gray-400\">\n            <div className=\"w-20 h-20 rounded-full bg-gray-100 dark:bg-gray-800 flex items-center justify-center mb-4\">\n               <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"40\" height=\"40\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className=\"text-gray-400 dark:text-gray-500\">\n                <path d=\"M12 2L13.09 8.26L20 9L13.09 15.74L12 22L10.91 15.74L4 9L10.91 8.26L12 2Z\"></path>\n              </svg>\n            </div>\n            <h3 className=\"text-lg font-medium text-gray-800 dark:text-gray-200 mb-1\">Start a conversation</h3>\n            <p className=\"text-sm max-w-sm\">\n              Ask me anything! I have access to your personal context and can help with a wide range of topics.\n            </p>\n          </div>\n        ) : (\n          <>\n            {agent.messages.map((message: any) => (\n              <div\n                key={message.id}\n                className={`flex items-start gap-3 ${message.role === 'user' ? 'justify-end' : 'justify-start'}`}\n              >\n                {message.role !== 'user' && (\n                  <div className=\"w-8 h-8 rounded-full bg-gradient-to-br from-blue-400 to-purple-500 flex items-center justify-center flex-shrink-0\">\n                    <Bot size={18} className=\"text-white\" />\n                  </div>\n                )}\n                <div className={`max-w-[80%]`}>\n                  <div\n                    className={`px-4 py-2.5 rounded-2xl ${\n                      message.role === 'user'\n                        ? 'bg-blue-600 text-white rounded-br-lg'\n                        : 'bg-gray-100 dark:bg-gray-800 text-gray-900 dark:text-gray-100 rounded-bl-lg'\n                    }`}\n                  >\n                    <p className=\"text-sm whitespace-pre-wrap leading-relaxed\">\n                      {message.content}\n                    </p>\n                  </div>\n                   <div className={`mt-1.5 px-1 ${\n                    message.role === 'user' ? 'text-right' : 'text-left'\n                  }`}>\n                    <span className=\"text-xs text-gray-400 dark:text-gray-500\">\n                      {message.timestamp.toLocaleTimeString([], { \n                        hour: 'numeric', \n                        minute: '2-digit' \n                      })}\n                    </span>\n                  </div>\n                </div>\n                 {message.role === 'user' && (\n                  <div className=\"w-8 h-8 rounded-full bg-gray-200 dark:bg-gray-700 flex items-center justify-center flex-shrink-0\">\n                    <User size={18} className=\"text-gray-600 dark:text-gray-300\" />\n                  </div>\n                )}\n              </div>\n            ))}\n            \n            {agent.isLoading && (\n              <div className=\"flex items-start gap-3 justify-start\">\n                <div className=\"w-8 h-8 rounded-full bg-gradient-to-br from-blue-400 to-purple-500 flex items-center justify-center flex-shrink-0\">\n                  <Bot size={18} className=\"text-white\" />\n                </div>\n                <div className=\"bg-gray-100 dark:bg-gray-800 text-gray-900 dark:text-gray-100 px-4 py-2.5 rounded-2xl rounded-bl-lg\">\n                  <div className=\"flex items-center space-x-2\">\n                    <div className=\"flex space-x-1\">\n                      <div className=\"w-2 h-2 bg-gray-400 rounded-full animate-bounce\"></div>\n                      <div className=\"w-2 h-2 bg-gray-400 rounded-full animate-bounce\" style={{ animationDelay: '0.1s' }}></div>\n                      <div className=\"w-2 h-2 bg-gray-400 rounded-full animate-bounce\" style={{ animationDelay: '0.2s' }}></div>\n                    </div>\n                  </div>\n                </div>\n              </div>\n            )}\n            <div ref={messagesEndRef} />\n          </>\n        )}\n      </div>\n\n      <div className=\"border-t border-gray-200 dark:border-gray-700 p-4 bg-gray-50 dark:bg-gray-800\">\n        {agent.error && (\n          <div className=\"mb-3 p-3 bg-red-100 dark:bg-red-900/30 border border-red-200 dark:border-red-800/50 rounded-lg flex items-start space-x-3\">\n            <div className=\"text-red-600 dark:text-red-400 mt-0.5\">\n              <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n                <circle cx=\"12\" cy=\"12\" r=\"10\"></circle>\n                <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"></line>\n                <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"></line>\n              </svg>\n            </div>\n            <div className=\"flex-1\">\n              <p className=\"text-red-700 dark:text-red-300 text-sm font-medium\">Error</p>\n              <p className=\"text-red-600 dark:text-red-400 text-sm\">{agent.error}</p>\n            </div>\n            <button \n              onClick={() => window.location.reload()} \n              className=\"p-1 text-red-600 dark:text-red-400 hover:bg-red-200 dark:hover:bg-red-900/50 rounded-full\"\n            >\n              <X size={16}/>\n            </button>\n          </div>\n        )}\n        <form onSubmit={handleSubmit} className=\"relative\">\n          <textarea\n            value={input}\n            onChange={(e: React.ChangeEvent<HTMLTextAreaElement>) => setInput(e.target.value)}\n            onKeyDown={(e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n              if (e.key === 'Enter' && !e.shiftKey) {\n                e.preventDefault();\n                handleSubmit(e as any);\n              }\n            }}\n            placeholder={placeholder}\n            disabled={agent.isLoading}\n            className=\"w-full px-4 py-3 pr-12 bg-white dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-2xl focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent disabled:opacity-50 resize-none text-sm\"\n            rows={1}\n          />\n          <button\n            type=\"submit\"\n            disabled={agent.isLoading || !input.trim()}\n            className=\"absolute right-3 top-1/2 -translate-y-1/2 w-8 h-8 bg-blue-600 text-white rounded-full hover:bg-blue-700 disabled:opacity-50 disabled:cursor-not-allowed flex items-center justify-center transition-colors\"\n          >\n            {agent.isLoading ? (\n              <div className=\"w-4 h-4 border-2 border-white border-t-transparent rounded-full animate-spin\"></div>\n            ) : (\n              <Send size={16} />\n            )}\n          </button>\n        </form>\n      </div>\n    </div>\n  );\n}","/**\n * Jean Memory React SDK - Sign In With Jean Component\n * OAuth 2.1 PKCE authentication flow\n */\nimport React, { useEffect, useState } from 'react';\nimport { JEAN_API_BASE, JEAN_OAUTH_BASE } from './config';\n\ninterface SignInWithJeanProps {\n  onSuccess: (user: any) => void;\n  onError?: (error: Error) => void;\n  apiKey?: string;\n  className?: string;\n  children?: React.ReactNode;\n}\n\n// Generate code verifier and challenge for PKCE\nfunction generatePKCE() {\n  const verifier = generateRandomString(128);\n  const encoder = new TextEncoder();\n  const data = encoder.encode(verifier);\n  \n  return crypto.subtle.digest('SHA-256', data).then(digest => {\n    const challenge = btoa(String.fromCharCode(...new Uint8Array(digest)))\n      .replace(/=/g, '')\n      .replace(/\\+/g, '-')\n      .replace(/\\//g, '_');\n    return { verifier, challenge };\n  });\n}\n\nfunction generateRandomString(length: number): string {\n  const charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~';\n  const values = crypto.getRandomValues(new Uint8Array(length));\n  return Array.from(values)\n    .map(x => charset[x % charset.length])\n    .join('');\n}\n\nexport function SignInWithJean({ \n  onSuccess, \n  onError, \n  apiKey,\n  className = '', \n  children \n}: SignInWithJeanProps) {\n  const [isLoading, setIsLoading] = useState(false);\n\n  useEffect(() => {\n    // Handle OAuth callback\n    const params = new URLSearchParams(window.location.search);\n    const code = params.get('code');\n    const state = params.get('state');\n    \n    if (code && state) {\n      handleOAuthCallback(code, state);\n    }\n  }, []);\n\n  const handleOAuthCallback = async (code: string, state: string) => {\n    try {\n      // Retrieve PKCE verifier from sessionStorage\n      const storedState = sessionStorage.getItem('jean_oauth_state');\n      const verifier = sessionStorage.getItem('jean_oauth_verifier');\n      \n      if (state !== storedState) {\n        throw new Error('State mismatch - possible CSRF attack');\n      }\n      \n      if (!verifier) {\n        throw new Error('Missing PKCE verifier');\n      }\n\n      // Exchange code for token\n      const response = await fetch(`${JEAN_API_BASE}/oauth/token`, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json'\n        },\n        body: JSON.stringify({\n          grant_type: 'authorization_code',\n          code,\n          redirect_uri: window.location.origin + window.location.pathname,\n          code_verifier: verifier,\n          client_id: apiKey || 'default_client'\n        })\n      });\n\n      if (!response.ok) {\n        throw new Error('Failed to exchange code for token');\n      }\n\n      const data = await response.json();\n      \n      // Get user info\n      const userResponse = await fetch(`${JEAN_API_BASE}/api/v1/user/me`, {\n        headers: {\n          'Authorization': `Bearer ${data.access_token}`\n        }\n      });\n\n      if (!userResponse.ok) {\n        throw new Error('Failed to get user info');\n      }\n\n      const user = await userResponse.json();\n      user.access_token = data.access_token;\n\n      // Clean up\n      sessionStorage.removeItem('jean_oauth_state');\n      sessionStorage.removeItem('jean_oauth_verifier');\n      \n      // Remove OAuth params from URL\n      const url = new URL(window.location.href);\n      url.searchParams.delete('code');\n      url.searchParams.delete('state');\n      window.history.replaceState({}, '', url.toString());\n\n      onSuccess(user);\n    } catch (error) {\n      console.error('OAuth callback error:', error);\n      if (onError) {\n        onError(error instanceof Error ? error : new Error('OAuth callback failed'));\n      }\n    }\n  };\n\n  const handleSignIn = async () => {\n    setIsLoading(true);\n    \n    try {\n      // Generate PKCE parameters\n      const { verifier, challenge } = await generatePKCE();\n      const state = generateRandomString(32);\n      \n      // Store for callback\n      sessionStorage.setItem('jean_oauth_state', state);\n      sessionStorage.setItem('jean_oauth_verifier', verifier);\n      \n      // Build OAuth URL\n      const params = new URLSearchParams({\n        response_type: 'code',\n        client_id: apiKey || 'default_client',\n        redirect_uri: window.location.origin + window.location.pathname,\n        state,\n        code_challenge: challenge,\n        code_challenge_method: 'S256',\n        scope: 'read write'\n      });\n      \n      // Redirect to OAuth provider\n      window.location.href = `${JEAN_OAUTH_BASE}/oauth/authorize?${params.toString()}`;\n    } catch (error) {\n      setIsLoading(false);\n      console.error('Sign in error:', error);\n      if (onError) {\n        onError(error instanceof Error ? error : new Error('Sign in failed'));\n      }\n    }\n  };\n\n  return (\n    <button\n      onClick={handleSignIn}\n      disabled={isLoading}\n      className={`inline-flex items-center justify-center gap-2.5 px-5 py-2.5 bg-black text-white font-medium text-sm border border-transparent rounded-lg hover:bg-gray-800 transition-all focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-gray-900 dark:bg-white dark:text-black dark:hover:bg-gray-200 dark:focus:ring-gray-300 shadow-md hover:shadow-lg disabled:opacity-60 disabled:cursor-not-allowed ${className}`}\n    >\n      {isLoading ? (\n        <>\n          <div className=\"w-4 h-4 border-2 border-white dark:border-black border-t-transparent rounded-full animate-spin\"></div>\n          <span>Signing in...</span>\n        </>\n      ) : children || (\n        <>\n          <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\">\n            <path d=\"M12 2L13.09 8.26L20 9L13.09 15.74L12 22L10.91 15.74L4 9L10.91 8.26L12 2Z\" \n                  stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"/>\n          </svg>\n          <span>Sign In with Jean</span>\n        </>\n      )}\n    </button>\n  );\n}","/**\n * Jean Memory React SDK - Advanced MCP Hook\n * Direct access to MCP tools for advanced users\n * Uses the jean_memory MCP tool directly (same as Claude Desktop/Cursor)\n */\nimport { useCallback } from 'react';\nimport { JEAN_API_BASE } from './config';\nimport { makeMCPRequest } from './mcp';\n\ninterface JeanUser {\n  user_id: string;\n  email: string;\n  access_token: string;\n}\n\ninterface MCPRequest {\n  jsonrpc: string;\n  id: number;\n  method: string;\n  params: {\n    name: string;\n    arguments: any;\n  };\n}\n\ninterface MCPResponse {\n  jsonrpc: string;\n  id: number;\n  result?: {\n    content: Array<{\n      type: string;\n      text: string;\n    }>;\n  };\n  error?: {\n    code: number;\n    message: string;\n  };\n}\n\ninterface UseJeanMCPOptions {\n  apiKey: string;\n  clientName?: string;\n}\n\ninterface UseJeanMCPReturn {\n  callJeanMemory: (user: JeanUser, message: string, isNewConversation?: boolean) => Promise<string>;\n  addMemory: (user: JeanUser, content: string) => Promise<string>;\n  searchMemory: (user: JeanUser, query: string) => Promise<string>;\n  storeDocument: (user: JeanUser, title: string, content: string, type?: string) => Promise<string>;\n}\n\n/**\n * Advanced hook for direct MCP tool access\n * Use this when you need fine-grained control over Jean Memory tools\n */\nexport function useJeanMCP({ apiKey, clientName = 'react-app' }: UseJeanMCPOptions): UseJeanMCPReturn {\n  const callJeanMemory = useCallback(\n    async (\n      user: JeanUser,\n      message: string,\n      isNewConversation: boolean = false\n    ): Promise<string> => {\n      const response = await makeMCPRequest(\n        user,\n        apiKey,\n        'jean_memory',\n        {\n          user_message: message,\n          is_new_conversation: isNewConversation,\n          needs_context: true\n        },\n        clientName\n      );\n      if (response.error) {\n        throw new Error(`MCP Error: ${response.error.message}`);\n      }\n      return response.result?.content?.[0]?.text || 'No response from tool';\n    },\n    [apiKey, clientName]\n  );\n\n  const addMemory = useCallback(\n    async (user: JeanUser, content: string): Promise<string> => {\n      const response = await makeMCPRequest(\n        user,\n        apiKey,\n        'add_memories',\n        { text: content },\n        clientName\n      );\n      if (response.error) {\n        throw new Error(`MCP Error: ${response.error.message}`);\n      }\n      return response.result?.content?.[0]?.text || 'No response from tool';\n    },\n    [apiKey, clientName]\n  );\n\n  const searchMemory = useCallback(\n    async (user: JeanUser, query: string): Promise<string> => {\n      const response = await makeMCPRequest(\n        user,\n        apiKey,\n        'search_memory',\n        { query },\n        clientName\n      );\n      if (response.error) {\n        throw new Error(`MCP Error: ${response.error.message}`);\n      }\n      return response.result?.content?.[0]?.text || 'No response from tool';\n    },\n    [apiKey, clientName]\n  );\n\n  const storeDocument = useCallback(\n    async (\n      user: JeanUser,\n      title: string,\n      content: string,\n      type: string = 'markdown'\n    ): Promise<string> => {\n      const response = await makeMCPRequest(\n        user,\n        apiKey,\n        'store_document',\n        {\n          title,\n          content,\n          document_type: type\n        },\n        clientName\n      );\n      if (response.error) {\n        throw new Error(`MCP Error: ${response.error.message}`);\n      }\n      return response.result?.content?.[0]?.text || 'No response from tool';\n    },\n    [apiKey, clientName]\n  );\n\n  return {\n    callJeanMemory,\n    addMemory,\n    searchMemory,\n    storeDocument\n  };\n}"],"names":["createContext","generatePKCE","generateRandomString","useState","useEffect","useContext","forwardRef","createElement","useRef","jsx","jsxs","Fragment","useCallback"],"mappings":"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","x_google_ignoreList":[3,4,5,6,7,8,9,10,11,12,13,14]}