{"version":3,"sources":["../../src/hooks/useSoma.ts","../../src/hooks/api.ts"],"names":["ws","useState","useCallback","useEffect"],"mappings":"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","file":"index.mjs","sourcesContent":["'use client'\n\nimport { useState, useRef, useEffect, useCallback } from 'react'\nimport type { UseSomaOptions, UseSomaReturn, SomaMessage, SomaStreamEvent } from '../types'\n\nexport function useSoma(options: UseSomaOptions): UseSomaReturn {\n  const {\n    agentId,\n    conversationId = `dm:${agentId}`,\n    apiKey,\n    baseUrl = '',\n    onDelta, onThinking, onTool, onDone, onCancelled, onError,\n  } = options\n\n  const wsRef = useRef<WebSocket | null>(null)\n  const readyRef = useRef(false)\n  const pendingRef = useRef<string[]>([])\n  const optionsRef = useRef(options)\n  optionsRef.current = options\n\n  const [messages, setMessages] = useState<SomaMessage[]>([])\n  const [isConnected, setIsConnected] = useState(false)\n  const [isStreaming, setIsStreaming] = useState(false)\n  const [streamContent, setStreamContent] = useState('')\n  const streamRef = useRef('')\n  const historyLoaded = useRef(false)\n\n  const wsUrl = baseUrl\n    ? `${baseUrl.replace('https', 'wss').replace('http', 'ws')}${options.wsPath || '/agent-ws'}`\n    : `${typeof window !== 'undefined' && window.location.protocol === 'https:' ? 'wss' : 'ws'}://${typeof window !== 'undefined' ? window.location.host : 'localhost'}${options.wsPath || '/agent-ws'}`\n\n  const contentRef = useRef('')\n  const thinkingRef = useRef('')\n\n  const connect = useCallback(() => {\n    if (wsRef.current?.readyState === WebSocket.OPEN) return\n    const ws = new WebSocket(wsUrl)\n    // Ensure we receive ArrayBuffer (not Blob) for binary frames\n    ws.binaryType = 'arraybuffer'\n\n    ws.onopen = () => {\n      console.log('[useSoma] ws open → sending init')\n      ws.send(JSON.stringify({ type: 'init', uid: agentId, cid: conversationId, token: apiKey || '' }))\n    }\n\n    ws.onmessage = (event) => {\n      try {\n        // Handle text, ArrayBuffer, and Blob WebSocket messages\n        let raw: string\n        if (typeof event.data === 'string') {\n          raw = event.data\n        } else if (event.data instanceof ArrayBuffer) {\n          raw = new TextDecoder().decode(event.data)\n        } else if (event.data instanceof Blob) {\n          // Blob fallback — should not happen with binaryType='arraybuffer',\n          // but handle it gracefully instead of failing silently.\n          event.data.text().then((text: string) => {\n            processMessage(text, ws)\n          }).catch(() => {})\n          return\n        } else {\n          console.warn('[useSoma] unknown message type:', typeof event.data, event.data)\n          return\n        }\n        processMessage(raw, ws)\n      } catch (e) {\n        console.error('[useSoma] onmessage error:', e, 'raw type:', typeof event.data)\n      }\n    }\n\n    function processMessage(raw: string, ws: WebSocket) {\n      const d: SomaStreamEvent = JSON.parse(raw)\n      switch (d.type) {\n        case 'ready':\n          readyRef.current = true\n          setIsConnected(true)\n          console.log('[useSoma] ← ready, pending:', pendingRef.current.length)\n          for (const t of pendingRef.current) {\n            ws.send(JSON.stringify({ type: 'prompt', text: t }))\n          }\n          pendingRef.current = []\n          break\n        case 'thinking_start':\n          setIsStreaming(true)\n          thinkingRef.current = ''\n          break\n        case 'thinking':\n          thinkingRef.current += d.text\n          onThinking?.(d.text)\n          break\n        case 'thinking_end':\n          break\n        case 'delta':\n          streamRef.current += d.text\n          contentRef.current = streamRef.current\n          setStreamContent(streamRef.current)\n          onDelta?.(d.text)\n          break\n        case 'tool':\n          onTool?.(d.name, d.input)\n          break\n        case 'done': {\n          setIsStreaming(false)\n          // contentRef mirrors streamRef — always synchronous, never stale.\n          const content = contentRef.current || streamRef.current\n          console.log('[useSoma] ← done, content length:', content.length, 'contentRef:', !!contentRef.current, 'streamRef:', !!streamRef.current)\n          const thinking = thinkingRef.current.trim() || undefined\n          console.log('[useSoma] ← done, content:', content.length, 'thinking:', (thinking || '').length, 'contentRef:', !!contentRef.current)\n          if (content || thinking) {\n            setMessages(prev => [...prev, {\n              id: crypto.randomUUID(),\n              role: 'assistant',\n              content: content || '(sin respuesta)',\n              thinking,\n              timestamp: new Date(),\n            }])\n            contentRef.current = ''\n            streamRef.current = ''\n            thinkingRef.current = ''\n            setStreamContent('')\n          } else {\n            console.warn('[useSoma] ← done but NO content accumulated — message lost')\n          }\n          onDone?.()\n          break\n        }\n        case 'cancelled': {\n          setIsStreaming(false)\n          const content = contentRef.current || streamRef.current || ''\n          if (content) {\n            setMessages(prev => [...prev, {\n              id: crypto.randomUUID(),\n              role: 'assistant',\n              content: content + '\\n\\n_⏹️ Cancelado_',\n              thinking: thinkingRef.current.trim() || undefined,\n              timestamp: new Date(),\n            }])\n            contentRef.current = ''\n            streamRef.current = ''\n            thinkingRef.current = ''\n            setStreamContent('')\n          }\n          onCancelled?.()\n          break\n        }\n        case 'error':\n          setIsStreaming(false)\n          console.error('[useSoma] ← error:', d.message)\n          onError?.(d.message)\n          break\n      }\n    }\n\n    ws.onclose = () => { setIsConnected(false); console.log('[useSoma] ws closed') }\n    ws.onerror = () => { console.error('[useSoma] ws error'); onError?.('Connection error') }\n    wsRef.current = ws\n  }, [wsUrl, agentId, conversationId])\n\n  useEffect(() => {\n    // Cargar historial antes de conectar\n    if (!historyLoaded.current && apiKey && conversationId) {\n      historyLoaded.current = true\n      const api = baseUrl ? `${baseUrl}/api/conversations/${encodeURIComponent(conversationId)}` : ''\n      if (api) {\n        fetch(api, { headers: { Authorization: `Bearer ${apiKey}` } })\n          .then(r => r.json())\n          .then(d => {\n            if (d.messages?.length) setMessages(d.messages.map((m: any) => ({\n              id: m.id || crypto.randomUUID(),\n              role: m.role,\n              content: m.content,\n              thinking: m.thinking,\n              tools: m.tools,\n              timestamp: new Date(m.timestamp || Date.now()),\n            })))\n          })\n          .catch(() => {})\n      }\n    }\n    connect()\n    return () => { wsRef.current?.close() }\n  }, [agentId, conversationId])\n\n  const send = useCallback((text: string) => {\n    setMessages(prev => [...prev, {\n      id: crypto.randomUUID(), role: 'user', content: text, timestamp: new Date(),\n    }])\n    if (readyRef.current && wsRef.current?.readyState === WebSocket.OPEN) {\n      wsRef.current.send(JSON.stringify({ type: 'prompt', text }))\n    } else {\n      pendingRef.current.push(text)\n      connect()\n    }\n  }, [connect])\n\n  const cancel = useCallback(() => {\n    wsRef.current?.send(JSON.stringify({ type: 'cancel' }))\n  }, [])\n\n  const reconnect = useCallback(() => {\n    wsRef.current?.close()\n    connect()\n  }, [connect])\n\n  return { send, cancel, isConnected, isStreaming, messages, streamContent, reconnect }\n}\n","'use client'\n\nimport { useState, useEffect, useCallback } from 'react'\nimport type { SomaConversation, SomaFile, SomaSkill, SomaAgent } from '../types'\n\nconst apiFetch = (url: string, token: string, options: RequestInit = {}) =>\n  fetch(url, {\n    ...options,\n    headers: {\n      'Authorization': `Bearer ${token}`,\n      'Content-Type': 'application/json',\n      ...options.headers as Record<string, string>,\n    }\n  })\n\n// ── Conversations ──────────────────────────────\n\nexport function useSomaConversations(token: string, baseUrl = '') {\n  const [conversations, setConversations] = useState<SomaConversation[]>([])\n  const [loading, setLoading] = useState(true)\n  const api = `${baseUrl || ''}/api/v1`\n\n  const refresh = useCallback(async () => {\n    try {\n      const res = await apiFetch(`${api}/conversations`, token)\n      if (res.ok) {\n        const { data } = await res.json()\n        setConversations(data)\n      }\n    } catch { /* offline */ }\n    setLoading(false)\n  }, [api, token])\n\n  useEffect(() => { refresh() }, [refresh])\n\n  return { conversations, loading, refresh }\n}\n\n// ── Files ─────────────────────────────────────\n\nexport function useSomaFiles(token: string, baseUrl = '') {\n  const [files, setFiles] = useState<SomaFile[]>([])\n  const [loading, setLoading] = useState(true)\n  const api = `${baseUrl || ''}/api/v1`\n\n  const refresh = useCallback(async (subpath = '') => {\n    setLoading(true)\n    try {\n      const res = await apiFetch(`${api}/files?path=${encodeURIComponent(subpath)}`, token)\n      if (res.ok) {\n        const { files: data } = await res.json()\n        setFiles(data)\n      }\n    } catch { /* offline */ }\n    setLoading(false)\n  }, [api, token])\n\n  useEffect(() => { refresh() }, [refresh])\n\n  const upload = async (name: string, data: string, path = '') => {\n    const res = await apiFetch(`${api}/files/upload`, token, {\n      method: 'POST',\n      body: JSON.stringify({ name, data, path })\n    })\n    if (res.ok) refresh(path)\n    return res.ok\n  }\n\n  const mkdir = async (path: string) => {\n    const res = await apiFetch(`${api}/files/mkdir`, token, {\n      method: 'POST',\n      body: JSON.stringify({ path })\n    })\n    if (res.ok) refresh()\n  }\n\n  const remove = async (path: string) => {\n    await apiFetch(`${api}/files?path=${encodeURIComponent(path)}`, token, { method: 'DELETE' })\n    refresh()\n  }\n\n  const rename = async (path: string, newName: string) => {\n    const res = await apiFetch(`${api}/files/rename`, token, {\n      method: 'PUT',\n      body: JSON.stringify({ path, newName })\n    })\n    if (res.ok) refresh()\n  }\n\n  return { files, loading, refresh, upload, mkdir, remove, rename }\n}\n\n// ── File Content ────────────────────────────\n\nexport function useSomaFileContent(token: string, baseUrl = '') {\n  const [content, setContent] = useState<string | null>(null)\n  const [loading, setLoading] = useState(false)\n  const [error, setError] = useState<string | null>(null)\n  const api = `${baseUrl || ''}/api/v1`\n\n  const readFile = useCallback(async (path: string) => {\n    setLoading(true)\n    setError(null)\n    try {\n      const res = await apiFetch(`${api}/files/content?path=${encodeURIComponent(path)}`, token)\n      if (!res.ok) throw new Error(`HTTP ${res.status}`)\n      const text = await res.text()\n      setContent(text)\n      return text\n    } catch (e: any) {\n      setError(e.message)\n      setContent(null)\n      return null\n    } finally {\n      setLoading(false)\n    }\n  }, [api, token])\n\n  const clear = useCallback(() => { setContent(null); setError(null) }, [])\n\n  return { content, loading, error, readFile, clear }\n}\n\n// ── Skills ────────────────────────────────────\n\nexport function useSomaSkills(token: string, baseUrl = '') {\n  const [skills, setSkills] = useState<SomaSkill[]>([])\n  const [loading, setLoading] = useState(true)\n  const api = `${baseUrl || ''}/api/v1`\n\n  const refresh = useCallback(async () => {\n    try {\n      const res = await apiFetch(`${api}/skills`, token)\n      if (res.ok) {\n        const { data } = await res.json()\n        setSkills(data)\n      }\n    } catch { /* offline */ }\n    setLoading(false)\n  }, [api, token])\n\n  useEffect(() => { refresh() }, [refresh])\n\n  const create = async (name: string, content: string) => {\n    const res = await apiFetch(`${api}/skills`, token, {\n      method: 'POST',\n      body: JSON.stringify({ name, content })\n    })\n    if (res.ok) refresh()\n    return res.ok\n  }\n\n  const deleteSkill = async (name: string) => {\n    await apiFetch(`${api}/skills/${name}`, token, { method: 'DELETE' })\n    refresh()\n  }\n\n  const assignToAgents = async (skillName: string, agentIds: string[]) => {\n    const res = await apiFetch(`${api}/skills/${skillName}/agents`, token, {\n      method: 'PUT',\n      body: JSON.stringify({ agentIds }),\n    })\n    if (res.ok) refresh()\n    return res.ok\n  }\n\n  const getAgentSkills = async (agentId: string): Promise<string[]> => {\n    try {\n      const res = await apiFetch(`${api}/agents/${agentId}/skills`, token)\n      if (res.ok) {\n        const { data } = await res.json()\n        return Array.isArray(data) ? data.map((s: any) => typeof s === 'string' ? s : s.name) : []\n      }\n    } catch { /* offline */ }\n    return []\n  }\n\n  const getContent = async (skillName: string): Promise<string | null> => {\n    try {\n      const res = await apiFetch(`${api}/skills/${skillName}`, token)\n      if (res.ok) {\n        const { data } = await res.json()\n        return data?.content || null\n      }\n    } catch { /* offline */ }\n    return null\n  }\n\n  return { skills, loading, refresh, create, deleteSkill, assignToAgents, getAgentSkills, getContent }\n}\n\n// ── Agents ────────────────────────────────────\n\nexport function useSomaAgents(token: string, baseUrl = '') {\n  const [agents, setAgents] = useState<SomaAgent[]>([])\n  const [loading, setLoading] = useState(true)\n  const api = `${baseUrl || ''}/api/v1`\n\n  const refresh = useCallback(async () => {\n    try {\n      const res = await apiFetch(`${api}/agents`, token)\n      if (res.ok) {\n        const { data } = await res.json()\n        setAgents(data)\n      }\n    } catch { /* offline */ }\n    setLoading(false)\n  }, [api, token])\n\n  useEffect(() => { refresh() }, [refresh])\n\n  const createAgent = async (data: { name: string; email: string; password: string; skills?: string[]; system_prompt?: string }) => {\n    const res = await apiFetch(`${api}/agents`, token, {\n      method: 'POST',\n      body: JSON.stringify(data)\n    })\n    if (!res.ok) {\n      const err = await res.json().catch(() => ({}))\n      throw new Error(err.error || `HTTP ${res.status}`)\n    }\n    const { data: agent } = await res.json()\n    setAgents(prev => [...prev, agent])\n    return agent\n  }\n\n  return { agents, loading, refresh, createAgent }\n}\n"]}