@personaai/react 0.1.2 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/context/PersonaContext.tsx","../src/hooks/useChat.ts","../src/hooks/useMemory.ts","../src/hooks/useThreads.ts","../src/hooks/useFiles.ts","../src/hooks/useAgents.ts","../src/hooks/useConnection.ts"],"sourcesContent":["export * from './types.js';\nexport * from './context/PersonaContext.js';\nexport * from './hooks/useChat.js';\nexport * from './hooks/useMemory.js';\nexport * from './hooks/useThreads.js';\nexport * from './hooks/useFiles.js';\nexport * from './hooks/useAgents.js';\nexport * from './hooks/useConnection.js';\n\nexport const VERSION = '0.1.2';\n","'use client';\n\nimport React, { createContext, useContext, useMemo } from 'react';\nimport type { PersonaProviderProps } from '../types.js';\n\ninterface PersonaContextValue {\n baseUrl: string;\n getAuthToken?: () => Promise<string | null | undefined> | string | null | undefined;\n defaultAgentId?: string;\n fetchWithAuth: (path: string, init?: RequestInit) => Promise<Response>;\n}\n\nconst PersonaContext = createContext<PersonaContextValue | null>(null);\n\nexport function PersonaProvider({\n baseUrl,\n getAuthToken,\n defaultAgentId,\n children,\n}: PersonaProviderProps) {\n const normalizedBaseUrl = useMemo(() => baseUrl.replace(/\\/+$/, ''), [baseUrl]);\n\n const value = useMemo<PersonaContextValue>(() => {\n async function fetchWithAuth(path: string, init: RequestInit = {}): Promise<Response> {\n const token = getAuthToken ? await getAuthToken() : null;\n const headers = new Headers(init.headers || {});\n if (token) {\n headers.set('Authorization', `Bearer ${token}`);\n }\n\n const cleanPath = path.startsWith('/') ? path : `/${path}`;\n const url = `${normalizedBaseUrl}${cleanPath}`;\n\n return fetch(url, {\n ...init,\n headers,\n });\n }\n\n return {\n baseUrl: normalizedBaseUrl,\n getAuthToken,\n defaultAgentId,\n fetchWithAuth,\n };\n }, [normalizedBaseUrl, getAuthToken, defaultAgentId]);\n\n return <PersonaContext.Provider value={value}>{children}</PersonaContext.Provider>;\n}\n\nexport function usePersonaContext(): PersonaContextValue {\n const context = useContext(PersonaContext);\n if (!context) {\n throw new Error('usePersonaContext must be used within a <PersonaProvider>');\n }\n return context;\n}\n","'use client';\n\nimport { useCallback, useRef, useState } from 'react';\nimport { usePersonaContext } from '../context/PersonaContext.js';\nimport type { PersonaMessage, PersonaStreamingEvent, PersonaToolCall, UseChatOptions } from '../types.js';\n\nexport function useChat(options: UseChatOptions = {}) {\n const { defaultAgentId, fetchWithAuth } = usePersonaContext();\n const agentId = options.agentId || defaultAgentId;\n\n const [messages, setMessages] = useState<PersonaMessage[]>(options.initialMessages || []);\n const [input, setInput] = useState('');\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const stop = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n setIsStreaming(false);\n }\n }, []);\n\n const clear = useCallback(() => {\n stop();\n setMessages([]);\n setError(null);\n }, [stop]);\n\n const sendMessage = useCallback(\n async (contentToSend?: string, overrideOptions?: { agentId?: string; threadId?: string }) => {\n const prompt = (contentToSend ?? input).trim();\n if (!prompt || isStreaming) return;\n\n const targetAgentId = overrideOptions?.agentId || agentId;\n if (!targetAgentId) {\n const err = new Error('No Agent ID specified for useChat.');\n setError(err);\n options.onError?.(err);\n return;\n }\n\n const userMessage: PersonaMessage = {\n id: `user-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`,\n role: 'user',\n content: prompt,\n createdAt: new Date(),\n };\n\n const assistantMessageId = `assistant-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;\n const placeholderAssistant: PersonaMessage = {\n id: assistantMessageId,\n role: 'assistant',\n content: '',\n createdAt: new Date(),\n isStreaming: true,\n toolCalls: [],\n };\n\n const nextMessages = [...messages, userMessage];\n setMessages([...nextMessages, placeholderAssistant]);\n setInput('');\n setIsStreaming(true);\n setError(null);\n\n const controller = new AbortController();\n abortControllerRef.current = controller;\n\n try {\n const payloadMessages = nextMessages.map((m) => ({\n role: m.role === 'assistant' ? ('assistant' as const) : ('user' as const),\n content: m.content,\n }));\n\n const response = await fetchWithAuth('/chat', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n agentId: targetAgentId,\n messages: payloadMessages,\n threadId: overrideOptions?.threadId || options.threadId,\n }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const errText = await response.text().catch(() => 'Stream failed');\n throw new Error(`Chat error (${response.status}): ${errText}`);\n }\n\n if (!response.body) {\n throw new Error('No response body received for streaming.');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n let accumulatedText = '';\n const toolCallsMap = new Map<string, PersonaToolCall>();\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || !trimmed.startsWith('data:')) continue;\n\n const raw = trimmed.replace(/^data:\\s*/, '');\n if (raw === '[DONE]') break;\n\n try {\n const event = JSON.parse(raw) as PersonaStreamingEvent;\n options.onEvent?.(event);\n\n if (event.type === 'TEXT_MESSAGE_CHUNK' && event.delta) {\n accumulatedText += event.delta;\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === assistantMessageId\n ? {\n ...msg,\n content: accumulatedText,\n isStreaming: true,\n toolCalls: Array.from(toolCallsMap.values()),\n }\n : msg\n )\n );\n } else if (event.type === 'TOOL_CALL_START') {\n toolCallsMap.set(event.toolCallId, {\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n args: '',\n });\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === assistantMessageId\n ? { ...msg, toolCalls: Array.from(toolCallsMap.values()) }\n : msg\n )\n );\n } else if (event.type === 'TOOL_CALL_ARGS') {\n const existing = toolCallsMap.get(event.toolCallId);\n if (existing) {\n existing.args = (existing.args || '') + event.delta;\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === assistantMessageId\n ? { ...msg, toolCalls: Array.from(toolCallsMap.values()) }\n : msg\n )\n );\n }\n } else if (event.type === 'TOOL_CALL_RESULT') {\n const existing = toolCallsMap.get(event.toolCallId);\n if (existing) {\n existing.result = event.result;\n existing.isError = event.isError;\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === assistantMessageId\n ? { ...msg, toolCalls: Array.from(toolCallsMap.values()) }\n : msg\n )\n );\n }\n } else if (event.type === 'RUN_ERROR') {\n throw new Error(event.message || 'Stream error from agent');\n }\n } catch (e) {\n if (e instanceof Error && e.message.startsWith('Stream error')) {\n throw e;\n }\n }\n }\n }\n\n const finalMessage: PersonaMessage = {\n id: assistantMessageId,\n role: 'assistant',\n content: accumulatedText,\n createdAt: new Date(),\n isStreaming: false,\n toolCalls: Array.from(toolCallsMap.values()),\n };\n\n setMessages((prev) =>\n prev.map((msg) => (msg.id === assistantMessageId ? finalMessage : msg))\n );\n\n options.onFinish?.(finalMessage);\n } catch (err) {\n if (controller.signal.aborted) {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === assistantMessageId ? { ...msg, isStreaming: false } : msg\n )\n );\n return;\n }\n\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setError(errorObj);\n options.onError?.(errorObj);\n\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === assistantMessageId\n ? {\n ...msg,\n content:\n msg.content || `⚠️ Error: ${errorObj.message || 'Failed to get response.'}`,\n isStreaming: false,\n }\n : msg\n )\n );\n } finally {\n setIsStreaming(false);\n abortControllerRef.current = null;\n }\n },\n [agentId, fetchWithAuth, input, isStreaming, messages, options]\n );\n\n const handleInputChange = useCallback((e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n setInput(e.target.value);\n }, []);\n\n const handleSubmit = useCallback(\n (e?: React.FormEvent) => {\n if (e) e.preventDefault();\n void sendMessage();\n },\n [sendMessage]\n );\n\n const reload = useCallback(() => {\n if (messages.length === 0 || isStreaming) return;\n let lastUserIndex = -1;\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role === 'user') {\n lastUserIndex = i;\n break;\n }\n }\n if (lastUserIndex === -1) return;\n\n const lastUserMessage = messages[lastUserIndex];\n setMessages(messages.slice(0, lastUserIndex));\n void sendMessage(lastUserMessage.content);\n }, [isStreaming, messages, sendMessage]);\n\n return {\n messages,\n input,\n setInput,\n handleInputChange,\n handleSubmit,\n sendMessage,\n isStreaming,\n isLoading: isStreaming,\n error,\n stop,\n reload,\n clear,\n setMessages,\n };\n}\n","'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { usePersonaContext } from '../context/PersonaContext.js';\nimport type { PersonaMemoryFile, PersonaMemoryList } from '../types.js';\n\nexport function useMemory(autoFetch = true) {\n const { fetchWithAuth } = usePersonaContext();\n const [memory, setMemory] = useState<PersonaMemoryList>({ user: [], agents: {} });\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchMemory = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetchWithAuth('/memory');\n if (!res.ok) {\n throw new Error(`Failed to fetch memory: ${res.statusText}`);\n }\n const data = (await res.json()) as PersonaMemoryList;\n setMemory(data);\n return data;\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setError(errorObj);\n return { user: [], agents: {} };\n } finally {\n setIsLoading(false);\n }\n }, [fetchWithAuth]);\n\n const getFile = useCallback(\n async (params: { path: string; scope?: 'user' | 'agent'; agentId?: string }) => {\n const query = new URLSearchParams({ path: params.path });\n if (params.scope) query.set('scope', params.scope);\n if (params.agentId) query.set('agentId', params.agentId);\n\n const res = await fetchWithAuth(`/memory/file?${query.toString()}`);\n if (!res.ok) throw new Error(`Failed to get memory file: ${res.statusText}`);\n return (await res.json()) as PersonaMemoryFile;\n },\n [fetchWithAuth]\n );\n\n const writeFile = useCallback(\n async (params: { path: string; content: string; scope?: 'user' | 'agent'; agentId?: string }) => {\n const res = await fetchWithAuth('/memory/file', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(params),\n });\n if (!res.ok) throw new Error(`Failed to write memory file: ${res.statusText}`);\n const updated = (await res.json()) as PersonaMemoryFile;\n void fetchMemory();\n return updated;\n },\n [fetchWithAuth, fetchMemory]\n );\n\n const deleteFile = useCallback(\n async (params: { path: string; scope?: 'user' | 'agent'; agentId?: string }) => {\n const query = new URLSearchParams({ path: params.path });\n if (params.scope) query.set('scope', params.scope);\n if (params.agentId) query.set('agentId', params.agentId);\n\n const res = await fetchWithAuth(`/memory/file?${query.toString()}`, {\n method: 'DELETE',\n });\n if (!res.ok) throw new Error(`Failed to delete memory file: ${res.statusText}`);\n void fetchMemory();\n },\n [fetchWithAuth, fetchMemory]\n );\n\n useEffect(() => {\n if (autoFetch) {\n void fetchMemory();\n }\n }, [autoFetch, fetchMemory]);\n\n return {\n memory,\n isLoading,\n error,\n refetch: fetchMemory,\n getFile,\n writeFile,\n deleteFile,\n };\n}\n","'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { usePersonaContext } from '../context/PersonaContext.js';\nimport type { PersonaThread } from '../types.js';\n\nexport function useThreads(autoFetch = true) {\n const { fetchWithAuth, defaultAgentId } = usePersonaContext();\n const [threads, setThreads] = useState<PersonaThread[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchThreads = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetchWithAuth('/threads');\n if (!res.ok) throw new Error(`Failed to list threads: ${res.statusText}`);\n const data = await res.json();\n const items = Array.isArray(data) ? data : data?.threads || data?.items || [];\n setThreads(items);\n return items;\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setError(errorObj);\n return [];\n } finally {\n setIsLoading(false);\n }\n }, [fetchWithAuth]);\n\n const createThread = useCallback(\n async (agentId?: string) => {\n const targetAgentId = agentId || defaultAgentId;\n const res = await fetchWithAuth('/threads', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ agentId: targetAgentId }),\n });\n if (!res.ok) throw new Error(`Failed to create thread: ${res.statusText}`);\n const created = (await res.json()) as PersonaThread;\n void fetchThreads();\n return created;\n },\n [fetchWithAuth, defaultAgentId, fetchThreads]\n );\n\n const deleteThread = useCallback(\n async (threadId: string) => {\n const res = await fetchWithAuth(`/threads/${threadId}`, { method: 'DELETE' });\n if (!res.ok) throw new Error(`Failed to delete thread: ${res.statusText}`);\n setThreads((prev) => prev.filter((t) => t._id !== threadId));\n },\n [fetchWithAuth]\n );\n\n useEffect(() => {\n if (autoFetch) {\n void fetchThreads();\n }\n }, [autoFetch, fetchThreads]);\n\n return {\n threads,\n isLoading,\n error,\n refetch: fetchThreads,\n createThread,\n deleteThread,\n };\n}\n","'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { usePersonaContext } from '../context/PersonaContext.js';\n\nexport interface PersonaFileItem {\n _id: string;\n filename: string;\n contentType?: string;\n sizeBytes?: number;\n createdAt: string;\n}\n\nexport function useFiles(autoFetch = true) {\n const { fetchWithAuth } = usePersonaContext();\n const [files, setFiles] = useState<PersonaFileItem[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isUploading, setIsUploading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchFiles = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetchWithAuth('/files');\n if (!res.ok) throw new Error(`Failed to list files: ${res.statusText}`);\n const data = await res.json();\n const items = Array.isArray(data) ? data : data?.files || data?.items || [];\n setFiles(items);\n return items;\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setError(errorObj);\n return [];\n } finally {\n setIsLoading(false);\n }\n }, [fetchWithAuth]);\n\n const uploadFile = useCallback(\n async (fileOrFormData: FormData | { name: string; uri: string; type?: string }) => {\n setIsUploading(true);\n setError(null);\n try {\n let body: FormData;\n if (fileOrFormData instanceof FormData) {\n body = fileOrFormData;\n } else {\n // React Native FormData support\n body = new FormData();\n body.append('file', fileOrFormData as unknown as Blob);\n }\n\n const res = await fetchWithAuth('/files', {\n method: 'POST',\n body,\n });\n\n if (!res.ok) {\n const errText = await res.text().catch(() => 'Upload failed');\n throw new Error(`Upload error (${res.status}): ${errText}`);\n }\n\n const uploaded = (await res.json()) as PersonaFileItem;\n void fetchFiles();\n return uploaded;\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setError(errorObj);\n throw errorObj;\n } finally {\n setIsUploading(false);\n }\n },\n [fetchWithAuth, fetchFiles]\n );\n\n const deleteFile = useCallback(\n async (fileId: string) => {\n const res = await fetchWithAuth(`/files/${fileId}`, { method: 'DELETE' });\n if (!res.ok) throw new Error(`Failed to delete file: ${res.statusText}`);\n setFiles((prev) => prev.filter((f) => f._id !== fileId));\n },\n [fetchWithAuth]\n );\n\n const getDownloadUrl = useCallback(\n (fileId: string) => {\n return `/files/${fileId}`;\n },\n []\n );\n\n useEffect(() => {\n if (autoFetch) {\n void fetchFiles();\n }\n }, [autoFetch, fetchFiles]);\n\n return {\n files,\n isLoading,\n isUploading,\n error,\n refetch: fetchFiles,\n uploadFile,\n deleteFile,\n getDownloadUrl,\n };\n}\n","'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { usePersonaContext } from '../context/PersonaContext.js';\n\nexport interface PersonaAgentSummary {\n _id: string;\n name: string;\n description?: string;\n avatarUrl?: string;\n}\n\nexport function useAgents(autoFetch = true) {\n const { fetchWithAuth } = usePersonaContext();\n const [agents, setAgents] = useState<PersonaAgentSummary[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchAgents = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetchWithAuth('/agents');\n if (!res.ok) throw new Error(`Failed to list agents: ${res.statusText}`);\n const data = await res.json();\n const items = Array.isArray(data) ? data : data?.agents || data?.items || [];\n setAgents(items);\n return items;\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setError(errorObj);\n return [];\n } finally {\n setIsLoading(false);\n }\n }, [fetchWithAuth]);\n\n useEffect(() => {\n if (autoFetch) {\n void fetchAgents();\n }\n }, [autoFetch, fetchAgents]);\n\n return {\n agents,\n isLoading,\n error,\n refetch: fetchAgents,\n };\n}\n","'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { usePersonaContext } from '../context/PersonaContext.js';\n\nexport interface PersonaHealthInfo {\n status: string;\n version?: string;\n capabilities?: Record<string, boolean>;\n}\n\nexport function useConnection(autoCheck = true) {\n const { fetchWithAuth } = usePersonaContext();\n const [health, setHealth] = useState<PersonaHealthInfo | null>(null);\n const [isConnected, setIsConnected] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n\n const checkHealth = useCallback(async () => {\n setIsLoading(true);\n try {\n const res = await fetchWithAuth('/health');\n if (res.ok) {\n const data = (await res.json()) as PersonaHealthInfo;\n setHealth(data);\n setIsConnected(true);\n return data;\n }\n setIsConnected(false);\n return null;\n } catch {\n setIsConnected(false);\n return null;\n } finally {\n setIsLoading(false);\n }\n }, [fetchWithAuth]);\n\n useEffect(() => {\n if (autoCheck) {\n void checkHealth();\n }\n }, [autoCheck, checkHealth]);\n\n return {\n isConnected,\n health,\n isLoading,\n checkHealth,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,mBAA0D;AA6CjD;AAnCT,IAAM,qBAAiB,4BAA0C,IAAI;AAE9D,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,wBAAoB,sBAAQ,MAAM,QAAQ,QAAQ,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC;AAE9E,QAAM,YAAQ,sBAA6B,MAAM;AAC/C,mBAAe,cAAc,MAAc,OAAoB,CAAC,GAAsB;AACpF,YAAM,QAAQ,eAAe,MAAM,aAAa,IAAI;AACpD,YAAM,UAAU,IAAI,QAAQ,KAAK,WAAW,CAAC,CAAC;AAC9C,UAAI,OAAO;AACT,gBAAQ,IAAI,iBAAiB,UAAU,KAAK,EAAE;AAAA,MAChD;AAEA,YAAM,YAAY,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI;AACxD,YAAM,MAAM,GAAG,iBAAiB,GAAG,SAAS;AAE5C,aAAO,MAAM,KAAK;AAAA,QAChB,GAAG;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,mBAAmB,cAAc,cAAc,CAAC;AAEpD,SAAO,4CAAC,eAAe,UAAf,EAAwB,OAAe,UAAS;AAC1D;AAEO,SAAS,oBAAyC;AACvD,QAAM,cAAU,yBAAW,cAAc;AACzC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC7E;AACA,SAAO;AACT;;;ACtDA,IAAAA,gBAA8C;AAIvC,SAAS,QAAQ,UAA0B,CAAC,GAAG;AACpD,QAAM,EAAE,gBAAgB,cAAc,IAAI,kBAAkB;AAC5D,QAAM,UAAU,QAAQ,WAAW;AAEnC,QAAM,CAAC,UAAU,WAAW,QAAI,wBAA2B,QAAQ,mBAAmB,CAAC,CAAC;AACxF,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAS,EAAE;AACrC,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,KAAK;AACpD,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AAErD,QAAM,yBAAqB,sBAA+B,IAAI;AAE9D,QAAM,WAAO,2BAAY,MAAM;AAC7B,QAAI,mBAAmB,SAAS;AAC9B,yBAAmB,QAAQ,MAAM;AACjC,yBAAmB,UAAU;AAC7B,qBAAe,KAAK;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,YAAQ,2BAAY,MAAM;AAC9B,SAAK;AACL,gBAAY,CAAC,CAAC;AACd,aAAS,IAAI;AAAA,EACf,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,kBAAc;AAAA,IAClB,OAAO,eAAwB,oBAA8D;AAC3F,YAAM,UAAU,iBAAiB,OAAO,KAAK;AAC7C,UAAI,CAAC,UAAU,YAAa;AAE5B,YAAM,gBAAgB,iBAAiB,WAAW;AAClD,UAAI,CAAC,eAAe;AAClB,cAAM,MAAM,IAAI,MAAM,oCAAoC;AAC1D,iBAAS,GAAG;AACZ,gBAAQ,UAAU,GAAG;AACrB;AAAA,MACF;AAEA,YAAM,cAA8B;AAAA,QAClC,IAAI,QAAQ,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,QAChE,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW,oBAAI,KAAK;AAAA,MACtB;AAEA,YAAM,qBAAqB,aAAa,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAC5F,YAAM,uBAAuC;AAAA,QAC3C,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW,oBAAI,KAAK;AAAA,QACpB,aAAa;AAAA,QACb,WAAW,CAAC;AAAA,MACd;AAEA,YAAM,eAAe,CAAC,GAAG,UAAU,WAAW;AAC9C,kBAAY,CAAC,GAAG,cAAc,oBAAoB,CAAC;AACnD,eAAS,EAAE;AACX,qBAAe,IAAI;AACnB,eAAS,IAAI;AAEb,YAAM,aAAa,IAAI,gBAAgB;AACvC,yBAAmB,UAAU;AAE7B,UAAI;AACF,cAAM,kBAAkB,aAAa,IAAI,CAAC,OAAO;AAAA,UAC/C,MAAM,EAAE,SAAS,cAAe,cAAyB;AAAA,UACzD,SAAS,EAAE;AAAA,QACb,EAAE;AAEF,cAAM,WAAW,MAAM,cAAc,SAAS;AAAA,UAC5C,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,UAClB;AAAA,UACA,MAAM,KAAK,UAAU;AAAA,YACnB,SAAS;AAAA,YACT,UAAU;AAAA,YACV,UAAU,iBAAiB,YAAY,QAAQ;AAAA,UACjD,CAAC;AAAA,UACD,QAAQ,WAAW;AAAA,QACrB,CAAC;AAED,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,UAAU,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,eAAe;AACjE,gBAAM,IAAI,MAAM,eAAe,SAAS,MAAM,MAAM,OAAO,EAAE;AAAA,QAC/D;AAEA,YAAI,CAAC,SAAS,MAAM;AAClB,gBAAM,IAAI,MAAM,0CAA0C;AAAA,QAC5D;AAEA,cAAM,SAAS,SAAS,KAAK,UAAU;AACvC,cAAM,UAAU,IAAI,YAAY,OAAO;AACvC,YAAI,SAAS;AACb,YAAI,kBAAkB;AACtB,cAAM,eAAe,oBAAI,IAA6B;AAEtD,eAAO,MAAM;AACX,gBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,cAAI,KAAM;AAEV,oBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,gBAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,mBAAS,MAAM,IAAI,KAAK;AAExB,qBAAW,QAAQ,OAAO;AACxB,kBAAM,UAAU,KAAK,KAAK;AAC1B,gBAAI,CAAC,WAAW,CAAC,QAAQ,WAAW,OAAO,EAAG;AAE9C,kBAAM,MAAM,QAAQ,QAAQ,aAAa,EAAE;AAC3C,gBAAI,QAAQ,SAAU;AAEtB,gBAAI;AACF,oBAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,sBAAQ,UAAU,KAAK;AAEvB,kBAAI,MAAM,SAAS,wBAAwB,MAAM,OAAO;AACtD,mCAAmB,MAAM;AACzB;AAAA,kBAAY,CAAC,SACX,KAAK;AAAA,oBAAI,CAAC,QACR,IAAI,OAAO,qBACP;AAAA,sBACE,GAAG;AAAA,sBACH,SAAS;AAAA,sBACT,aAAa;AAAA,sBACb,WAAW,MAAM,KAAK,aAAa,OAAO,CAAC;AAAA,oBAC7C,IACA;AAAA,kBACN;AAAA,gBACF;AAAA,cACF,WAAW,MAAM,SAAS,mBAAmB;AAC3C,6BAAa,IAAI,MAAM,YAAY;AAAA,kBACjC,YAAY,MAAM;AAAA,kBAClB,UAAU,MAAM;AAAA,kBAChB,MAAM;AAAA,gBACR,CAAC;AACD;AAAA,kBAAY,CAAC,SACX,KAAK;AAAA,oBAAI,CAAC,QACR,IAAI,OAAO,qBACP,EAAE,GAAG,KAAK,WAAW,MAAM,KAAK,aAAa,OAAO,CAAC,EAAE,IACvD;AAAA,kBACN;AAAA,gBACF;AAAA,cACF,WAAW,MAAM,SAAS,kBAAkB;AAC1C,sBAAM,WAAW,aAAa,IAAI,MAAM,UAAU;AAClD,oBAAI,UAAU;AACZ,2BAAS,QAAQ,SAAS,QAAQ,MAAM,MAAM;AAC9C;AAAA,oBAAY,CAAC,SACX,KAAK;AAAA,sBAAI,CAAC,QACR,IAAI,OAAO,qBACP,EAAE,GAAG,KAAK,WAAW,MAAM,KAAK,aAAa,OAAO,CAAC,EAAE,IACvD;AAAA,oBACN;AAAA,kBACF;AAAA,gBACF;AAAA,cACF,WAAW,MAAM,SAAS,oBAAoB;AAC5C,sBAAM,WAAW,aAAa,IAAI,MAAM,UAAU;AAClD,oBAAI,UAAU;AACZ,2BAAS,SAAS,MAAM;AACxB,2BAAS,UAAU,MAAM;AACzB;AAAA,oBAAY,CAAC,SACX,KAAK;AAAA,sBAAI,CAAC,QACR,IAAI,OAAO,qBACP,EAAE,GAAG,KAAK,WAAW,MAAM,KAAK,aAAa,OAAO,CAAC,EAAE,IACvD;AAAA,oBACN;AAAA,kBACF;AAAA,gBACF;AAAA,cACF,WAAW,MAAM,SAAS,aAAa;AACrC,sBAAM,IAAI,MAAM,MAAM,WAAW,yBAAyB;AAAA,cAC5D;AAAA,YACF,SAAS,GAAG;AACV,kBAAI,aAAa,SAAS,EAAE,QAAQ,WAAW,cAAc,GAAG;AAC9D,sBAAM;AAAA,cACR;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,cAAM,eAA+B;AAAA,UACnC,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,WAAW,oBAAI,KAAK;AAAA,UACpB,aAAa;AAAA,UACb,WAAW,MAAM,KAAK,aAAa,OAAO,CAAC;AAAA,QAC7C;AAEA;AAAA,UAAY,CAAC,SACX,KAAK,IAAI,CAAC,QAAS,IAAI,OAAO,qBAAqB,eAAe,GAAI;AAAA,QACxE;AAEA,gBAAQ,WAAW,YAAY;AAAA,MACjC,SAAS,KAAK;AACZ,YAAI,WAAW,OAAO,SAAS;AAC7B;AAAA,YAAY,CAAC,SACX,KAAK;AAAA,cAAI,CAAC,QACR,IAAI,OAAO,qBAAqB,EAAE,GAAG,KAAK,aAAa,MAAM,IAAI;AAAA,YACnE;AAAA,UACF;AACA;AAAA,QACF;AAEA,cAAM,WAAW,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACnE,iBAAS,QAAQ;AACjB,gBAAQ,UAAU,QAAQ;AAE1B;AAAA,UAAY,CAAC,SACX,KAAK;AAAA,YAAI,CAAC,QACR,IAAI,OAAO,qBACP;AAAA,cACE,GAAG;AAAA,cACH,SACE,IAAI,WAAW,uBAAa,SAAS,WAAW,yBAAyB;AAAA,cAC3E,aAAa;AAAA,YACf,IACA;AAAA,UACN;AAAA,QACF;AAAA,MACF,UAAE;AACA,uBAAe,KAAK;AACpB,2BAAmB,UAAU;AAAA,MAC/B;AAAA,IACF;AAAA,IACA,CAAC,SAAS,eAAe,OAAO,aAAa,UAAU,OAAO;AAAA,EAChE;AAEA,QAAM,wBAAoB,2BAAY,CAAC,MAAiE;AACtG,aAAS,EAAE,OAAO,KAAK;AAAA,EACzB,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAe;AAAA,IACnB,CAAC,MAAwB;AACvB,UAAI,EAAG,GAAE,eAAe;AACxB,WAAK,YAAY;AAAA,IACnB;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,aAAS,2BAAY,MAAM;AAC/B,QAAI,SAAS,WAAW,KAAK,YAAa;AAC1C,QAAI,gBAAgB;AACpB,aAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC7C,UAAI,SAAS,CAAC,EAAE,SAAS,QAAQ;AAC/B,wBAAgB;AAChB;AAAA,MACF;AAAA,IACF;AACA,QAAI,kBAAkB,GAAI;AAE1B,UAAM,kBAAkB,SAAS,aAAa;AAC9C,gBAAY,SAAS,MAAM,GAAG,aAAa,CAAC;AAC5C,SAAK,YAAY,gBAAgB,OAAO;AAAA,EAC1C,GAAG,CAAC,aAAa,UAAU,WAAW,CAAC;AAEvC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACnRA,IAAAC,gBAAiD;AAI1C,SAAS,UAAU,YAAY,MAAM;AAC1C,QAAM,EAAE,cAAc,IAAI,kBAAkB;AAC5C,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAA4B,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;AAChF,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AAErD,QAAM,kBAAc,2BAAY,YAAY;AAC1C,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,QAAI;AACF,YAAM,MAAM,MAAM,cAAc,SAAS;AACzC,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,IAAI,MAAM,2BAA2B,IAAI,UAAU,EAAE;AAAA,MAC7D;AACA,YAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,gBAAU,IAAI;AACd,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,YAAM,WAAW,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACnE,eAAS,QAAQ;AACjB,aAAO,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,IAChC,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,cAAU;AAAA,IACd,OAAO,WAAyE;AAC9E,YAAM,QAAQ,IAAI,gBAAgB,EAAE,MAAM,OAAO,KAAK,CAAC;AACvD,UAAI,OAAO,MAAO,OAAM,IAAI,SAAS,OAAO,KAAK;AACjD,UAAI,OAAO,QAAS,OAAM,IAAI,WAAW,OAAO,OAAO;AAEvD,YAAM,MAAM,MAAM,cAAc,gBAAgB,MAAM,SAAS,CAAC,EAAE;AAClE,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,8BAA8B,IAAI,UAAU,EAAE;AAC3E,aAAQ,MAAM,IAAI,KAAK;AAAA,IACzB;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,gBAAY;AAAA,IAChB,OAAO,WAA0F;AAC/F,YAAM,MAAM,MAAM,cAAc,gBAAgB;AAAA,QAC9C,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,MAAM;AAAA,MAC7B,CAAC;AACD,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,gCAAgC,IAAI,UAAU,EAAE;AAC7E,YAAM,UAAW,MAAM,IAAI,KAAK;AAChC,WAAK,YAAY;AACjB,aAAO;AAAA,IACT;AAAA,IACA,CAAC,eAAe,WAAW;AAAA,EAC7B;AAEA,QAAM,iBAAa;AAAA,IACjB,OAAO,WAAyE;AAC9E,YAAM,QAAQ,IAAI,gBAAgB,EAAE,MAAM,OAAO,KAAK,CAAC;AACvD,UAAI,OAAO,MAAO,OAAM,IAAI,SAAS,OAAO,KAAK;AACjD,UAAI,OAAO,QAAS,OAAM,IAAI,WAAW,OAAO,OAAO;AAEvD,YAAM,MAAM,MAAM,cAAc,gBAAgB,MAAM,SAAS,CAAC,IAAI;AAAA,QAClE,QAAQ;AAAA,MACV,CAAC;AACD,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,iCAAiC,IAAI,UAAU,EAAE;AAC9E,WAAK,YAAY;AAAA,IACnB;AAAA,IACA,CAAC,eAAe,WAAW;AAAA,EAC7B;AAEA,+BAAU,MAAM;AACd,QAAI,WAAW;AACb,WAAK,YAAY;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,WAAW,WAAW,CAAC;AAE3B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACxFA,IAAAC,gBAAiD;AAI1C,SAAS,WAAW,YAAY,MAAM;AAC3C,QAAM,EAAE,eAAe,eAAe,IAAI,kBAAkB;AAC5D,QAAM,CAAC,SAAS,UAAU,QAAI,wBAA0B,CAAC,CAAC;AAC1D,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AAErD,QAAM,mBAAe,2BAAY,YAAY;AAC3C,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,QAAI;AACF,YAAM,MAAM,MAAM,cAAc,UAAU;AAC1C,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,2BAA2B,IAAI,UAAU,EAAE;AACxE,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,YAAM,QAAQ,MAAM,QAAQ,IAAI,IAAI,OAAO,MAAM,WAAW,MAAM,SAAS,CAAC;AAC5E,iBAAW,KAAK;AAChB,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,YAAM,WAAW,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACnE,eAAS,QAAQ;AACjB,aAAO,CAAC;AAAA,IACV,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,mBAAe;AAAA,IACnB,OAAO,YAAqB;AAC1B,YAAM,gBAAgB,WAAW;AACjC,YAAM,MAAM,MAAM,cAAc,YAAY;AAAA,QAC1C,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,EAAE,SAAS,cAAc,CAAC;AAAA,MACjD,CAAC;AACD,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,4BAA4B,IAAI,UAAU,EAAE;AACzE,YAAM,UAAW,MAAM,IAAI,KAAK;AAChC,WAAK,aAAa;AAClB,aAAO;AAAA,IACT;AAAA,IACA,CAAC,eAAe,gBAAgB,YAAY;AAAA,EAC9C;AAEA,QAAM,mBAAe;AAAA,IACnB,OAAO,aAAqB;AAC1B,YAAM,MAAM,MAAM,cAAc,YAAY,QAAQ,IAAI,EAAE,QAAQ,SAAS,CAAC;AAC5E,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,4BAA4B,IAAI,UAAU,EAAE;AACzE,iBAAW,CAAC,SAAS,KAAK,OAAO,CAAC,MAAM,EAAE,QAAQ,QAAQ,CAAC;AAAA,IAC7D;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEA,+BAAU,MAAM;AACd,QAAI,WAAW;AACb,WAAK,aAAa;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,WAAW,YAAY,CAAC;AAE5B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF;AACF;;;ACpEA,IAAAC,gBAAiD;AAW1C,SAAS,SAAS,YAAY,MAAM;AACzC,QAAM,EAAE,cAAc,IAAI,kBAAkB;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAA4B,CAAC,CAAC;AACxD,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,KAAK;AACpD,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AAErD,QAAM,iBAAa,2BAAY,YAAY;AACzC,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,QAAI;AACF,YAAM,MAAM,MAAM,cAAc,QAAQ;AACxC,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,yBAAyB,IAAI,UAAU,EAAE;AACtE,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,YAAM,QAAQ,MAAM,QAAQ,IAAI,IAAI,OAAO,MAAM,SAAS,MAAM,SAAS,CAAC;AAC1E,eAAS,KAAK;AACd,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,YAAM,WAAW,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACnE,eAAS,QAAQ;AACjB,aAAO,CAAC;AAAA,IACV,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,iBAAa;AAAA,IACjB,OAAO,mBAA4E;AACjF,qBAAe,IAAI;AACnB,eAAS,IAAI;AACb,UAAI;AACF,YAAI;AACJ,YAAI,0BAA0B,UAAU;AACtC,iBAAO;AAAA,QACT,OAAO;AAEL,iBAAO,IAAI,SAAS;AACpB,eAAK,OAAO,QAAQ,cAAiC;AAAA,QACvD;AAEA,cAAM,MAAM,MAAM,cAAc,UAAU;AAAA,UACxC,QAAQ;AAAA,UACR;AAAA,QACF,CAAC;AAED,YAAI,CAAC,IAAI,IAAI;AACX,gBAAM,UAAU,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,eAAe;AAC5D,gBAAM,IAAI,MAAM,iBAAiB,IAAI,MAAM,MAAM,OAAO,EAAE;AAAA,QAC5D;AAEA,cAAM,WAAY,MAAM,IAAI,KAAK;AACjC,aAAK,WAAW;AAChB,eAAO;AAAA,MACT,SAAS,KAAK;AACZ,cAAM,WAAW,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACnE,iBAAS,QAAQ;AACjB,cAAM;AAAA,MACR,UAAE;AACA,uBAAe,KAAK;AAAA,MACtB;AAAA,IACF;AAAA,IACA,CAAC,eAAe,UAAU;AAAA,EAC5B;AAEA,QAAM,iBAAa;AAAA,IACjB,OAAO,WAAmB;AACxB,YAAM,MAAM,MAAM,cAAc,UAAU,MAAM,IAAI,EAAE,QAAQ,SAAS,CAAC;AACxE,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,0BAA0B,IAAI,UAAU,EAAE;AACvE,eAAS,CAAC,SAAS,KAAK,OAAO,CAAC,MAAM,EAAE,QAAQ,MAAM,CAAC;AAAA,IACzD;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,qBAAiB;AAAA,IACrB,CAAC,WAAmB;AAClB,aAAO,UAAU,MAAM;AAAA,IACzB;AAAA,IACA,CAAC;AAAA,EACH;AAEA,+BAAU,MAAM;AACd,QAAI,WAAW;AACb,WAAK,WAAW;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,UAAU,CAAC;AAE1B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC3GA,IAAAC,gBAAiD;AAU1C,SAAS,UAAU,YAAY,MAAM;AAC1C,QAAM,EAAE,cAAc,IAAI,kBAAkB;AAC5C,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAgC,CAAC,CAAC;AAC9D,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AAErD,QAAM,kBAAc,2BAAY,YAAY;AAC1C,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,QAAI;AACF,YAAM,MAAM,MAAM,cAAc,SAAS;AACzC,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,0BAA0B,IAAI,UAAU,EAAE;AACvE,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,YAAM,QAAQ,MAAM,QAAQ,IAAI,IAAI,OAAO,MAAM,UAAU,MAAM,SAAS,CAAC;AAC3E,gBAAU,KAAK;AACf,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,YAAM,WAAW,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACnE,eAAS,QAAQ;AACjB,aAAO,CAAC;AAAA,IACV,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAElB,+BAAU,MAAM;AACd,QAAI,WAAW;AACb,WAAK,YAAY;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,WAAW,WAAW,CAAC;AAE3B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,EACX;AACF;;;AC/CA,IAAAC,gBAAiD;AAS1C,SAAS,cAAc,YAAY,MAAM;AAC9C,QAAM,EAAE,cAAc,IAAI,kBAAkB;AAC5C,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAmC,IAAI;AACnE,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,KAAK;AACpD,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAEhD,QAAM,kBAAc,2BAAY,YAAY;AAC1C,iBAAa,IAAI;AACjB,QAAI;AACF,YAAM,MAAM,MAAM,cAAc,SAAS;AACzC,UAAI,IAAI,IAAI;AACV,cAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,kBAAU,IAAI;AACd,uBAAe,IAAI;AACnB,eAAO;AAAA,MACT;AACA,qBAAe,KAAK;AACpB,aAAO;AAAA,IACT,QAAQ;AACN,qBAAe,KAAK;AACpB,aAAO;AAAA,IACT,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAElB,+BAAU,MAAM;AACd,QAAI,WAAW;AACb,WAAK,YAAY;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,WAAW,WAAW,CAAC;AAE3B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;APxCO,IAAM,UAAU;","names":["import_react","import_react","import_react","import_react","import_react","import_react"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/context/PersonaContext.tsx","../src/hooks/useChat.ts","../src/hooks/useMemory.ts","../src/hooks/useThreads.ts","../src/hooks/useFiles.ts","../src/hooks/useAgents.ts","../src/hooks/useConnection.ts"],"sourcesContent":["export * from './types.js';\nexport * from './context/PersonaContext.js';\nexport * from './hooks/useChat.js';\nexport * from './hooks/useMemory.js';\nexport * from './hooks/useThreads.js';\nexport * from './hooks/useFiles.js';\nexport * from './hooks/useAgents.js';\nexport * from './hooks/useConnection.js';\n\nexport const VERSION = '0.2.0';\n","'use client';\n\nimport React, { createContext, useContext, useMemo } from 'react';\nimport type { PersonaProviderProps } from '../types.js';\n\ninterface PersonaContextValue {\n baseUrl: string;\n getAuthToken?: () => Promise<string | null | undefined> | string | null | undefined;\n defaultAgentId?: string;\n fetchWithAuth: (path: string, init?: RequestInit) => Promise<Response>;\n}\n\nconst PersonaContext = createContext<PersonaContextValue | null>(null);\n\nexport function PersonaProvider({\n baseUrl,\n getAuthToken,\n defaultAgentId,\n children,\n}: PersonaProviderProps) {\n const normalizedBaseUrl = useMemo(() => baseUrl.replace(/\\/+$/, ''), [baseUrl]);\n\n const value = useMemo<PersonaContextValue>(() => {\n async function fetchWithAuth(path: string, init: RequestInit = {}): Promise<Response> {\n const token = getAuthToken ? await getAuthToken() : null;\n const headers = new Headers(init.headers || {});\n if (token) {\n headers.set('Authorization', `Bearer ${token}`);\n }\n\n const cleanPath = path.startsWith('/') ? path : `/${path}`;\n const url = `${normalizedBaseUrl}${cleanPath}`;\n\n return fetch(url, {\n ...init,\n headers,\n });\n }\n\n return {\n baseUrl: normalizedBaseUrl,\n getAuthToken,\n defaultAgentId,\n fetchWithAuth,\n };\n }, [normalizedBaseUrl, getAuthToken, defaultAgentId]);\n\n return <PersonaContext.Provider value={value}>{children}</PersonaContext.Provider>;\n}\n\nexport function usePersonaContext(): PersonaContextValue {\n const context = useContext(PersonaContext);\n if (!context) {\n throw new Error('usePersonaContext must be used within a <PersonaProvider>');\n }\n return context;\n}\n","'use client';\n\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { usePersonaContext } from '../context/PersonaContext.js';\nimport type {\n PersonaInterrupt,\n PersonaMessage,\n PersonaPresentedFile,\n PersonaResumeValue,\n PersonaStreamingEvent,\n PersonaSubagentActivityEntry,\n PersonaTodo,\n PersonaToolCall,\n PersonaWorkspaceFile,\n SendMessageOverride,\n UseChatOptions,\n} from '../types.js';\n\n// A failed tool call's TOOL_CALL_RESULT content is a JSON envelope\n// (`{status:'error',message}`, see aguiTranslator.js's buildToolErrorContent)\n// rather than a separate boolean field on the event itself.\nfunction isErrorToolContent(content: string): boolean {\n if (typeof content !== 'string' || !content.trim().startsWith('{')) return false;\n try {\n return JSON.parse(content)?.status === 'error';\n } catch {\n return false;\n }\n}\n\n// present_file's result is `{status:'success', filePath, title, description}`\n// (see present.tool.js) — a signal to highlight that path in the workspace\n// files panel, not something meant to render as a generic tool-result blob.\nfunction parsePresentedFile(content: string): PersonaPresentedFile | null {\n try {\n const parsed = JSON.parse(content);\n if (parsed?.status !== 'success' || typeof parsed.filePath !== 'string') return null;\n return {\n path: parsed.filePath,\n title: typeof parsed.title === 'string' ? parsed.title : parsed.filePath,\n description: typeof parsed.description === 'string' ? parsed.description : '',\n };\n } catch {\n return null;\n }\n}\n\n// checkpointService.getMessages() wraps a paused thread's interrupt as\n// `{ kind, value }` (see checkpoint.service.js) — the same envelope shape\n// the live hitl_request/clarification_request CUSTOM events carry, just\n// nested one level deeper. Flatten both into the same PersonaInterrupt shape.\nfunction normalizePendingInterrupt(pending: unknown): PersonaInterrupt | null {\n if (!pending || typeof pending !== 'object') return null;\n const p = pending as { kind?: string; value?: Record<string, unknown> };\n if (p.kind === 'hitl') {\n return {\n kind: 'hitl',\n actionRequests: (p.value?.actionRequests ?? []) as Extract<\n PersonaInterrupt,\n { kind: 'hitl' }\n >['actionRequests'],\n reviewConfigs: (p.value?.reviewConfigs ?? []) as unknown[],\n };\n }\n if (p.kind === 'clarification') {\n return {\n kind: 'clarification',\n questions: (p.value?.questions ?? []) as Extract<PersonaInterrupt, { kind: 'clarification' }>['questions'],\n };\n }\n return null;\n}\n\nexport function useChat(options: UseChatOptions = {}) {\n const { defaultAgentId, fetchWithAuth } = usePersonaContext();\n const agentId = options.agentId || defaultAgentId;\n const threadId = options.threadId;\n\n const [messages, setMessages] = useState<PersonaMessage[]>(options.initialMessages || []);\n const [input, setInput] = useState('');\n const [isStreaming, setIsStreaming] = useState(false);\n const [isLoadingHistory, setIsLoadingHistory] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const [interrupt, setInterrupt] = useState<PersonaInterrupt | null>(null);\n const [files, setFiles] = useState<Record<string, PersonaWorkspaceFile>>({});\n const [todos, setTodos] = useState<PersonaTodo[]>([]);\n const [presentedFile, setPresentedFile] = useState<PersonaPresentedFile | null>(null);\n\n const abortControllerRef = useRef<AbortController | null>(null);\n const loadedThreadIdRef = useRef<string | undefined>(undefined);\n\n const stop = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n setIsStreaming(false);\n }\n }, []);\n\n const clear = useCallback(() => {\n stop();\n setMessages([]);\n setError(null);\n setInterrupt(null);\n setFiles({});\n setTodos([]);\n setPresentedFile(null);\n }, [stop]);\n\n const loadThreadMessages = useCallback(\n async (id: string) => {\n setIsLoadingHistory(true);\n setError(null);\n try {\n const res = await fetchWithAuth(`/threads/${id}/messages`);\n if (!res.ok) throw new Error(`Failed to load thread history: ${res.statusText}`);\n const body = await res.json();\n const data = body?.data ?? body;\n const raw = (data?.messages ?? []) as Array<{\n id?: string;\n role: PersonaMessage['role'];\n content: string;\n toolCalls?: PersonaToolCall[];\n }>;\n const loaded: PersonaMessage[] = raw.map((m, i) => ({\n id: m.id || `history-${id}-${i}`,\n role: m.role,\n content: m.content,\n createdAt: new Date(),\n toolCalls: m.toolCalls,\n }));\n setMessages(loaded);\n // Re-show the approval/clarification card on reload if this thread\n // is currently paused — otherwise it wouldn't reappear until the\n // next live stream re-surfaces it.\n setInterrupt(normalizePendingInterrupt(data?.pendingInterrupt));\n // Restore the workspace files/todos this thread already had (same\n // cleaned shape checkpoint.service.js now derives via\n // buildFilesTodosSnapshot, matching the live STATE_SNAPSHOT event).\n setFiles((data?.state?.files ?? {}) as Record<string, PersonaWorkspaceFile>);\n setTodos((data?.state?.todos ?? []) as PersonaTodo[]);\n return loaded;\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setError(errorObj);\n return [];\n } finally {\n setIsLoadingHistory(false);\n }\n },\n [fetchWithAuth]\n );\n\n // Auto-load history the first time a thread with no in-memory messages is\n // selected (switching threads in the sidebar). Skipped for a thread whose\n // messages already live in state — e.g. one just created by handleSend,\n // which sets its placeholder messages in the same render batch as the\n // threadId change, so `messages` there is never empty at effect time.\n useEffect(() => {\n if (!threadId || isStreaming) return;\n if (loadedThreadIdRef.current === threadId) return;\n if (messages.length > 0) return;\n loadedThreadIdRef.current = threadId;\n void loadThreadMessages(threadId);\n }, [threadId, isStreaming, messages.length, loadThreadMessages]);\n\n const sendMessage = useCallback(\n async (contentToSend?: string, overrideOptions?: SendMessageOverride) => {\n const prompt = (contentToSend ?? input).trim();\n if (!prompt || isStreaming) return;\n\n const targetAgentId = overrideOptions?.agentId || agentId;\n if (!targetAgentId) {\n const err = new Error('No Agent ID specified for useChat.');\n setError(err);\n options.onError?.(err);\n return;\n }\n\n const userMessage: PersonaMessage = {\n id: `user-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`,\n role: 'user',\n content: prompt,\n createdAt: new Date(),\n };\n\n const assistantMessageId = `assistant-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;\n const placeholderAssistant: PersonaMessage = {\n id: assistantMessageId,\n role: 'assistant',\n content: '',\n createdAt: new Date(),\n isStreaming: true,\n toolCalls: [],\n };\n\n const nextMessages = [...messages, userMessage];\n setMessages([...nextMessages, placeholderAssistant]);\n setInput('');\n setIsStreaming(true);\n setError(null);\n setInterrupt(null);\n\n const controller = new AbortController();\n abortControllerRef.current = controller;\n\n try {\n const payloadMessages = nextMessages.map((m) => ({\n role: m.role === 'assistant' ? ('assistant' as const) : ('user' as const),\n content: m.content,\n }));\n\n const response = await fetchWithAuth('/chat', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n agentId: targetAgentId,\n messages: payloadMessages,\n threadId: overrideOptions?.threadId || options.threadId,\n resume: overrideOptions?.resume,\n }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const errText = await response.text().catch(() => 'Stream failed');\n throw new Error(`Chat error (${response.status}): ${errText}`);\n }\n\n if (!response.body) {\n throw new Error('No response body received for streaming.');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n let accumulatedText = '';\n let accumulatedReasoning = '';\n const toolCallsMap = new Map<string, PersonaToolCall>();\n\n const patchAssistant = (patch: Partial<PersonaMessage>) => {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === assistantMessageId\n ? { ...msg, toolCalls: Array.from(toolCallsMap.values()), ...patch }\n : msg\n )\n );\n };\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || !trimmed.startsWith('data:')) continue;\n\n const raw = trimmed.replace(/^data:\\s*/, '');\n if (raw === '[DONE]') break;\n\n try {\n const event = JSON.parse(raw) as PersonaStreamingEvent;\n options.onEvent?.(event);\n\n if (event.type === 'TEXT_MESSAGE_CHUNK' && event.delta) {\n accumulatedText += event.delta;\n patchAssistant({ content: accumulatedText, isStreaming: true });\n } else if (event.type === 'TOOL_CALL_CHUNK' && event.toolCallId) {\n // The backend streams tool calls as accumulating chunks\n // (id/name arrive on the first chunk, args stream in pieces\n // across subsequent ones) rather than separate start/args\n // events.\n const existing = toolCallsMap.get(event.toolCallId);\n if (existing) {\n existing.args = (existing.args || '') + (event.delta || '');\n } else {\n toolCallsMap.set(event.toolCallId, {\n toolCallId: event.toolCallId,\n toolName: event.toolCallName || '',\n args: event.delta || '',\n });\n }\n patchAssistant({});\n } else if (event.type === 'TOOL_CALL_RESULT') {\n const existing = toolCallsMap.get(event.toolCallId);\n if (existing) {\n existing.result = event.content;\n existing.isError = isErrorToolContent(event.content);\n if (existing.toolName === 'present_file' && !existing.isError) {\n const presented = parsePresentedFile(event.content);\n if (presented) setPresentedFile(presented);\n }\n patchAssistant({});\n }\n } else if (event.type === 'STATE_SNAPSHOT') {\n setFiles(event.snapshot.files);\n setTodos(event.snapshot.todos);\n } else if (event.type === 'REASONING_MESSAGE_CONTENT') {\n accumulatedReasoning += event.delta;\n patchAssistant({ reasoning: accumulatedReasoning, isReasoning: true });\n } else if (event.type === 'REASONING_END') {\n patchAssistant({ isReasoning: false });\n } else if (event.type === 'CUSTOM') {\n if (event.name === 'hitl_request') {\n const value = event.value as Extract<PersonaInterrupt, { kind: 'hitl' }>;\n setInterrupt({\n kind: 'hitl',\n actionRequests: value.actionRequests,\n reviewConfigs: value.reviewConfigs,\n });\n } else if (event.name === 'clarification_request') {\n const value = event.value as Extract<PersonaInterrupt, { kind: 'clarification' }>;\n setInterrupt({ kind: 'clarification', questions: value.questions });\n } else if (event.name === 'subagent_activity') {\n const { toolCallId, ...entry } = event.value as { toolCallId: string } & PersonaSubagentActivityEntry;\n const existing = toolCallsMap.get(toolCallId);\n if (existing) {\n existing.subagentActivity = [...(existing.subagentActivity || []), entry];\n patchAssistant({});\n }\n }\n // 'mcp_app' custom events carry no chat-transcript UI here —\n // consumers that render MCP widgets read them via onEvent.\n } else if (event.type === 'RUN_ERROR') {\n throw new Error(event.message || 'Stream error from agent');\n }\n } catch (e) {\n if (e instanceof Error && e.message.startsWith('Stream error')) {\n throw e;\n }\n }\n }\n }\n\n const finalMessage: PersonaMessage = {\n id: assistantMessageId,\n role: 'assistant',\n content: accumulatedText,\n createdAt: new Date(),\n isStreaming: false,\n toolCalls: Array.from(toolCallsMap.values()),\n ...(accumulatedReasoning ? { reasoning: accumulatedReasoning, isReasoning: false } : {}),\n };\n\n setMessages((prev) =>\n prev.map((msg) => (msg.id === assistantMessageId ? finalMessage : msg))\n );\n\n options.onFinish?.(finalMessage);\n } catch (err) {\n if (controller.signal.aborted) {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === assistantMessageId ? { ...msg, isStreaming: false } : msg\n )\n );\n return;\n }\n\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setError(errorObj);\n options.onError?.(errorObj);\n\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === assistantMessageId\n ? {\n ...msg,\n content:\n msg.content || `⚠️ Error: ${errorObj.message || 'Failed to get response.'}`,\n isStreaming: false,\n }\n : msg\n )\n );\n } finally {\n setIsStreaming(false);\n abortControllerRef.current = null;\n }\n },\n [agentId, fetchWithAuth, input, isStreaming, messages, options]\n );\n\n const handleInputChange = useCallback((e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n setInput(e.target.value);\n }, []);\n\n const handleSubmit = useCallback(\n (e?: React.FormEvent) => {\n if (e) e.preventDefault();\n void sendMessage();\n },\n [sendMessage]\n );\n\n const reload = useCallback(() => {\n if (messages.length === 0 || isStreaming) return;\n let lastUserIndex = -1;\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role === 'user') {\n lastUserIndex = i;\n break;\n }\n }\n if (lastUserIndex === -1) return;\n\n const lastUserMessage = messages[lastUserIndex];\n setMessages(messages.slice(0, lastUserIndex));\n void sendMessage(lastUserMessage.content);\n }, [isStreaming, messages, sendMessage]);\n\n // Unpauses a paused HITL/clarification run. `displayContent` becomes the\n // visible user-turn bubble (e.g. \"Approved\", or the typed clarification\n // answer) — the server resolves the actual resume value from `resume`\n // itself, `displayContent` is only ever used for its own transcript text.\n const resumeInterrupt = useCallback(\n (resume: PersonaResumeValue, displayContent: string) => sendMessage(displayContent, { resume }),\n [sendMessage]\n );\n\n const dismissPresentedFile = useCallback(() => setPresentedFile(null), []);\n\n return {\n messages,\n input,\n setInput,\n handleInputChange,\n handleSubmit,\n sendMessage,\n isStreaming,\n isLoading: isStreaming,\n isLoadingHistory,\n error,\n interrupt,\n resumeInterrupt,\n files,\n todos,\n presentedFile,\n dismissPresentedFile,\n stop,\n reload,\n clear,\n setMessages,\n loadThreadMessages,\n };\n}\n","'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { usePersonaContext } from '../context/PersonaContext.js';\nimport type { PersonaMemoryFile, PersonaMemoryList } from '../types.js';\n\nexport function useMemory(autoFetch = true) {\n const { fetchWithAuth } = usePersonaContext();\n const [memory, setMemory] = useState<PersonaMemoryList>({ userFiles: [], agentMemories: [] });\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchMemory = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetchWithAuth('/memory');\n if (!res.ok) {\n throw new Error(`Failed to fetch memory: ${res.statusText}`);\n }\n const data = (await res.json()) as PersonaMemoryList;\n setMemory(data);\n return data;\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setError(errorObj);\n return { userFiles: [], agentMemories: [] };\n } finally {\n setIsLoading(false);\n }\n }, [fetchWithAuth]);\n\n const getFile = useCallback(\n async (params: { path: string; scope?: 'user' | 'agent'; agentId?: string }) => {\n const query = new URLSearchParams({ path: params.path });\n if (params.scope) query.set('scope', params.scope);\n if (params.agentId) query.set('agentId', params.agentId);\n\n const res = await fetchWithAuth(`/memory/file?${query.toString()}`);\n if (!res.ok) throw new Error(`Failed to get memory file: ${res.statusText}`);\n return (await res.json()) as PersonaMemoryFile;\n },\n [fetchWithAuth]\n );\n\n const writeFile = useCallback(\n async (params: { path: string; content: string; scope?: 'user' | 'agent'; agentId?: string }) => {\n const res = await fetchWithAuth('/memory/file', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(params),\n });\n if (!res.ok) throw new Error(`Failed to write memory file: ${res.statusText}`);\n const updated = (await res.json()) as PersonaMemoryFile;\n void fetchMemory();\n return updated;\n },\n [fetchWithAuth, fetchMemory]\n );\n\n const deleteFile = useCallback(\n async (params: { path: string; scope?: 'user' | 'agent'; agentId?: string }) => {\n const query = new URLSearchParams({ path: params.path });\n if (params.scope) query.set('scope', params.scope);\n if (params.agentId) query.set('agentId', params.agentId);\n\n const res = await fetchWithAuth(`/memory/file?${query.toString()}`, {\n method: 'DELETE',\n });\n if (!res.ok) throw new Error(`Failed to delete memory file: ${res.statusText}`);\n void fetchMemory();\n },\n [fetchWithAuth, fetchMemory]\n );\n\n useEffect(() => {\n if (autoFetch) {\n void fetchMemory();\n }\n }, [autoFetch, fetchMemory]);\n\n return {\n memory,\n isLoading,\n error,\n refetch: fetchMemory,\n getFile,\n writeFile,\n deleteFile,\n };\n}\n","'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { usePersonaContext } from '../context/PersonaContext.js';\nimport type { PersonaThread } from '../types.js';\n\nexport function useThreads(autoFetch = true) {\n const { fetchWithAuth, defaultAgentId } = usePersonaContext();\n const [threads, setThreads] = useState<PersonaThread[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchThreads = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetchWithAuth('/threads');\n if (!res.ok) throw new Error(`Failed to list threads: ${res.statusText}`);\n const data = await res.json();\n // Real shape is { items, pagination }. Bare array / `.data` / `.threads`\n // are defensive fallbacks for other deployments, not the actual contract.\n const items: PersonaThread[] = Array.isArray(data)\n ? data\n : data?.items || data?.threads || (Array.isArray(data?.data) ? data.data : undefined) || [];\n setThreads(items);\n return items;\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setError(errorObj);\n return [];\n } finally {\n setIsLoading(false);\n }\n }, [fetchWithAuth]);\n\n const createThread = useCallback(\n async (agentId?: string) => {\n const targetAgentId = agentId || defaultAgentId;\n const res = await fetchWithAuth('/threads', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ agentId: targetAgentId }),\n });\n if (!res.ok) throw new Error(`Failed to create thread: ${res.statusText}`);\n const data = await res.json();\n const created = (data?.data ?? data) as PersonaThread;\n void fetchThreads();\n return created;\n },\n [fetchWithAuth, defaultAgentId, fetchThreads]\n );\n\n const deleteThread = useCallback(\n async (threadId: string) => {\n const res = await fetchWithAuth(`/threads/${threadId}`, { method: 'DELETE' });\n if (!res.ok) throw new Error(`Failed to delete thread: ${res.statusText}`);\n setThreads((prev) => prev.filter((t) => t._id !== threadId));\n },\n [fetchWithAuth]\n );\n\n // Best-effort batch delete — no not-found id aborts the rest. Up to 100\n // ids per call, matching the server's own limit.\n const bulkDeleteThreads = useCallback(\n async (threadIds: string[]) => {\n const res = await fetchWithAuth('/threads/bulk-delete', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ ids: threadIds }),\n });\n if (!res.ok) throw new Error(`Failed to bulk-delete threads: ${res.statusText}`);\n const data = await res.json();\n const result = (data?.data ?? data) as { deleted: string[]; failed: Array<{ id: string; reason: string }> };\n const deletedSet = new Set(result.deleted);\n setThreads((prev) => prev.filter((t) => !deletedSet.has(t._id)));\n return result;\n },\n [fetchWithAuth]\n );\n\n // Convenience wrapper: there is no server-side \"delete everything\"\n // endpoint, only bulk-delete-by-id — so this bulk-deletes every\n // currently-loaded thread (up to 100 per call, chunked if there are more).\n const deleteAllThreads = useCallback(async () => {\n const ids = threads.map((t) => t._id);\n for (let i = 0; i < ids.length; i += 100) {\n await bulkDeleteThreads(ids.slice(i, i + 100));\n }\n }, [threads, bulkDeleteThreads]);\n\n // General-purpose update — { title?, isArchived? }.\n const updateThread = useCallback(\n async (threadId: string, input: { title?: string; isArchived?: boolean }) => {\n const res = await fetchWithAuth(`/threads/${threadId}`, {\n method: 'PATCH',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(input),\n });\n if (!res.ok) throw new Error(`Failed to update thread: ${res.statusText}`);\n const data = await res.json();\n const updated = (data?.data ?? data) as PersonaThread;\n setThreads((prev) => prev.map((t) => (t._id === threadId ? { ...t, ...updated } : t)));\n return updated;\n },\n [fetchWithAuth]\n );\n\n const renameThread = useCallback(\n (threadId: string, title: string) => updateThread(threadId, { title }),\n [updateThread]\n );\n\n const getThread = useCallback(\n async (threadId: string) => {\n const res = await fetchWithAuth(`/threads/${threadId}`);\n if (!res.ok) throw new Error(`Failed to fetch thread: ${res.statusText}`);\n const data = await res.json();\n return (data?.data ?? data) as PersonaThread;\n },\n [fetchWithAuth]\n );\n\n useEffect(() => {\n if (autoFetch) {\n void fetchThreads();\n }\n }, [autoFetch, fetchThreads]);\n\n return {\n threads,\n isLoading,\n error,\n refetch: fetchThreads,\n createThread,\n deleteThread,\n bulkDeleteThreads,\n deleteAllThreads,\n updateThread,\n renameThread,\n getThread,\n };\n}\n","'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { usePersonaContext } from '../context/PersonaContext.js';\nimport type { PersonaFileItem } from '../types.js';\n\nexport type { PersonaFileItem };\n\nexport function useFiles(autoFetch = true) {\n const { fetchWithAuth } = usePersonaContext();\n const [files, setFiles] = useState<PersonaFileItem[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isUploading, setIsUploading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchFiles = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetchWithAuth('/files');\n if (!res.ok) throw new Error(`Failed to list files: ${res.statusText}`);\n const data = await res.json();\n // Real shape is { items, pagination } — bare array/`.files` are\n // defensive fallbacks, not the actual wire contract.\n const items: PersonaFileItem[] = Array.isArray(data)\n ? data\n : data?.items || data?.files || [];\n setFiles(items);\n return items;\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setError(errorObj);\n return [];\n } finally {\n setIsLoading(false);\n }\n }, [fetchWithAuth]);\n\n const uploadFile = useCallback(\n async (fileOrFormData: FormData | { name: string; uri: string; type?: string }) => {\n setIsUploading(true);\n setError(null);\n try {\n let body: FormData;\n if (fileOrFormData instanceof FormData) {\n body = fileOrFormData;\n } else {\n // React Native FormData support\n body = new FormData();\n body.append('file', fileOrFormData as unknown as Blob);\n }\n\n const res = await fetchWithAuth('/files', {\n method: 'POST',\n body,\n });\n\n if (!res.ok) {\n const errText = await res.text().catch(() => 'Upload failed');\n throw new Error(`Upload error (${res.status}): ${errText}`);\n }\n\n const uploaded = (await res.json()) as PersonaFileItem;\n void fetchFiles();\n return uploaded;\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setError(errorObj);\n throw errorObj;\n } finally {\n setIsUploading(false);\n }\n },\n [fetchWithAuth, fetchFiles]\n );\n\n const deleteFile = useCallback(\n async (fileId: string) => {\n const res = await fetchWithAuth(`/files/${fileId}`, { method: 'DELETE' });\n if (!res.ok) throw new Error(`Failed to delete file: ${res.statusText}`);\n setFiles((prev) => prev.filter((f) => f.id !== fileId));\n },\n [fetchWithAuth]\n );\n\n const bulkDeleteFiles = useCallback(\n async (fileIds: string[]) => {\n const res = await fetchWithAuth('/files/bulk-delete', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ ids: fileIds }),\n });\n if (!res.ok) throw new Error(`Failed to bulk-delete files: ${res.statusText}`);\n const idSet = new Set(fileIds);\n setFiles((prev) => prev.filter((f) => !idSet.has(f.id)));\n return (await res.json()) as { deleted: string[]; failed: Array<{ id: string; reason: string }> };\n },\n [fetchWithAuth]\n );\n\n const getDownloadUrl = useCallback(\n (fileId: string) => {\n return `/files/${fileId}`;\n },\n []\n );\n\n useEffect(() => {\n if (autoFetch) {\n void fetchFiles();\n }\n }, [autoFetch, fetchFiles]);\n\n return {\n files,\n isLoading,\n isUploading,\n error,\n refetch: fetchFiles,\n uploadFile,\n deleteFile,\n bulkDeleteFiles,\n getDownloadUrl,\n };\n}\n","'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { usePersonaContext } from '../context/PersonaContext.js';\n\nexport interface PersonaAgentSummary {\n _id: string;\n name: string;\n slug: string;\n description?: string;\n tagline?: string;\n avatar?: string;\n}\n\nexport function useAgents(autoFetch = true) {\n const { fetchWithAuth } = usePersonaContext();\n const [agents, setAgents] = useState<PersonaAgentSummary[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchAgents = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetchWithAuth('/agents');\n if (!res.ok) throw new Error(`Failed to list agents: ${res.statusText}`);\n const data = await res.json();\n // Real shape is { items, pagination }.\n const items: PersonaAgentSummary[] = Array.isArray(data)\n ? data\n : data?.items || data?.agents || [];\n setAgents(items);\n return items;\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setError(errorObj);\n return [];\n } finally {\n setIsLoading(false);\n }\n }, [fetchWithAuth]);\n\n useEffect(() => {\n if (autoFetch) {\n void fetchAgents();\n }\n }, [autoFetch, fetchAgents]);\n\n return {\n agents,\n isLoading,\n error,\n refetch: fetchAgents,\n };\n}\n","'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { usePersonaContext } from '../context/PersonaContext.js';\n\nexport interface PersonaHealthInfo {\n status: string;\n version?: string;\n capabilities?: Record<string, boolean>;\n}\n\nexport function useConnection(autoCheck = true) {\n const { fetchWithAuth } = usePersonaContext();\n const [health, setHealth] = useState<PersonaHealthInfo | null>(null);\n const [isConnected, setIsConnected] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n\n const checkHealth = useCallback(async () => {\n setIsLoading(true);\n try {\n const res = await fetchWithAuth('/health');\n if (res.ok) {\n const data = (await res.json()) as PersonaHealthInfo;\n setHealth(data);\n setIsConnected(true);\n return data;\n }\n setIsConnected(false);\n return null;\n } catch {\n setIsConnected(false);\n return null;\n } finally {\n setIsLoading(false);\n }\n }, [fetchWithAuth]);\n\n useEffect(() => {\n if (autoCheck) {\n void checkHealth();\n }\n }, [autoCheck, checkHealth]);\n\n return {\n isConnected,\n health,\n isLoading,\n checkHealth,\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACEA,mBAA0D;AA6CjD;AAnCT,IAAM,qBAAiB,4BAA0C,IAAI;AAE9D,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAyB;AACvB,QAAM,wBAAoB,sBAAQ,MAAM,QAAQ,QAAQ,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC;AAE9E,QAAM,YAAQ,sBAA6B,MAAM;AAC/C,mBAAe,cAAc,MAAc,OAAoB,CAAC,GAAsB;AACpF,YAAM,QAAQ,eAAe,MAAM,aAAa,IAAI;AACpD,YAAM,UAAU,IAAI,QAAQ,KAAK,WAAW,CAAC,CAAC;AAC9C,UAAI,OAAO;AACT,gBAAQ,IAAI,iBAAiB,UAAU,KAAK,EAAE;AAAA,MAChD;AAEA,YAAM,YAAY,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI;AACxD,YAAM,MAAM,GAAG,iBAAiB,GAAG,SAAS;AAE5C,aAAO,MAAM,KAAK;AAAA,QAChB,GAAG;AAAA,QACH;AAAA,MACF,CAAC;AAAA,IACH;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF,GAAG,CAAC,mBAAmB,cAAc,cAAc,CAAC;AAEpD,SAAO,4CAAC,eAAe,UAAf,EAAwB,OAAe,UAAS;AAC1D;AAEO,SAAS,oBAAyC;AACvD,QAAM,cAAU,yBAAW,cAAc;AACzC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,2DAA2D;AAAA,EAC7E;AACA,SAAO;AACT;;;ACtDA,IAAAA,gBAAyD;AAmBzD,SAAS,mBAAmB,SAA0B;AACpD,MAAI,OAAO,YAAY,YAAY,CAAC,QAAQ,KAAK,EAAE,WAAW,GAAG,EAAG,QAAO;AAC3E,MAAI;AACF,WAAO,KAAK,MAAM,OAAO,GAAG,WAAW;AAAA,EACzC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAKA,SAAS,mBAAmB,SAA8C;AACxE,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,QAAI,QAAQ,WAAW,aAAa,OAAO,OAAO,aAAa,SAAU,QAAO;AAChF,WAAO;AAAA,MACL,MAAM,OAAO;AAAA,MACb,OAAO,OAAO,OAAO,UAAU,WAAW,OAAO,QAAQ,OAAO;AAAA,MAChE,aAAa,OAAO,OAAO,gBAAgB,WAAW,OAAO,cAAc;AAAA,IAC7E;AAAA,EACF,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAMA,SAAS,0BAA0B,SAA2C;AAC5E,MAAI,CAAC,WAAW,OAAO,YAAY,SAAU,QAAO;AACpD,QAAM,IAAI;AACV,MAAI,EAAE,SAAS,QAAQ;AACrB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,gBAAiB,EAAE,OAAO,kBAAkB,CAAC;AAAA,MAI7C,eAAgB,EAAE,OAAO,iBAAiB,CAAC;AAAA,IAC7C;AAAA,EACF;AACA,MAAI,EAAE,SAAS,iBAAiB;AAC9B,WAAO;AAAA,MACL,MAAM;AAAA,MACN,WAAY,EAAE,OAAO,aAAa,CAAC;AAAA,IACrC;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,QAAQ,UAA0B,CAAC,GAAG;AACpD,QAAM,EAAE,gBAAgB,cAAc,IAAI,kBAAkB;AAC5D,QAAM,UAAU,QAAQ,WAAW;AACnC,QAAM,WAAW,QAAQ;AAEzB,QAAM,CAAC,UAAU,WAAW,QAAI,wBAA2B,QAAQ,mBAAmB,CAAC,CAAC;AACxF,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAS,EAAE;AACrC,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,KAAK;AACpD,QAAM,CAAC,kBAAkB,mBAAmB,QAAI,wBAAS,KAAK;AAC9D,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AACrD,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAkC,IAAI;AACxE,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAA+C,CAAC,CAAC;AAC3E,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAwB,CAAC,CAAC;AACpD,QAAM,CAAC,eAAe,gBAAgB,QAAI,wBAAsC,IAAI;AAEpF,QAAM,yBAAqB,sBAA+B,IAAI;AAC9D,QAAM,wBAAoB,sBAA2B,MAAS;AAE9D,QAAM,WAAO,2BAAY,MAAM;AAC7B,QAAI,mBAAmB,SAAS;AAC9B,yBAAmB,QAAQ,MAAM;AACjC,yBAAmB,UAAU;AAC7B,qBAAe,KAAK;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,YAAQ,2BAAY,MAAM;AAC9B,SAAK;AACL,gBAAY,CAAC,CAAC;AACd,aAAS,IAAI;AACb,iBAAa,IAAI;AACjB,aAAS,CAAC,CAAC;AACX,aAAS,CAAC,CAAC;AACX,qBAAiB,IAAI;AAAA,EACvB,GAAG,CAAC,IAAI,CAAC;AAET,QAAM,yBAAqB;AAAA,IACzB,OAAO,OAAe;AACpB,0BAAoB,IAAI;AACxB,eAAS,IAAI;AACb,UAAI;AACF,cAAM,MAAM,MAAM,cAAc,YAAY,EAAE,WAAW;AACzD,YAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,kCAAkC,IAAI,UAAU,EAAE;AAC/E,cAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,cAAM,OAAO,MAAM,QAAQ;AAC3B,cAAM,MAAO,MAAM,YAAY,CAAC;AAMhC,cAAM,SAA2B,IAAI,IAAI,CAAC,GAAG,OAAO;AAAA,UAClD,IAAI,EAAE,MAAM,WAAW,EAAE,IAAI,CAAC;AAAA,UAC9B,MAAM,EAAE;AAAA,UACR,SAAS,EAAE;AAAA,UACX,WAAW,oBAAI,KAAK;AAAA,UACpB,WAAW,EAAE;AAAA,QACf,EAAE;AACF,oBAAY,MAAM;AAIlB,qBAAa,0BAA0B,MAAM,gBAAgB,CAAC;AAI9D,iBAAU,MAAM,OAAO,SAAS,CAAC,CAA0C;AAC3E,iBAAU,MAAM,OAAO,SAAS,CAAC,CAAmB;AACpD,eAAO;AAAA,MACT,SAAS,KAAK;AACZ,cAAM,WAAW,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACnE,iBAAS,QAAQ;AACjB,eAAO,CAAC;AAAA,MACV,UAAE;AACA,4BAAoB,KAAK;AAAA,MAC3B;AAAA,IACF;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAOA,+BAAU,MAAM;AACd,QAAI,CAAC,YAAY,YAAa;AAC9B,QAAI,kBAAkB,YAAY,SAAU;AAC5C,QAAI,SAAS,SAAS,EAAG;AACzB,sBAAkB,UAAU;AAC5B,SAAK,mBAAmB,QAAQ;AAAA,EAClC,GAAG,CAAC,UAAU,aAAa,SAAS,QAAQ,kBAAkB,CAAC;AAE/D,QAAM,kBAAc;AAAA,IAClB,OAAO,eAAwB,oBAA0C;AACvE,YAAM,UAAU,iBAAiB,OAAO,KAAK;AAC7C,UAAI,CAAC,UAAU,YAAa;AAE5B,YAAM,gBAAgB,iBAAiB,WAAW;AAClD,UAAI,CAAC,eAAe;AAClB,cAAM,MAAM,IAAI,MAAM,oCAAoC;AAC1D,iBAAS,GAAG;AACZ,gBAAQ,UAAU,GAAG;AACrB;AAAA,MACF;AAEA,YAAM,cAA8B;AAAA,QAClC,IAAI,QAAQ,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAAA,QAChE,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW,oBAAI,KAAK;AAAA,MACtB;AAEA,YAAM,qBAAqB,aAAa,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,CAAC,CAAC;AAC5F,YAAM,uBAAuC;AAAA,QAC3C,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,SAAS;AAAA,QACT,WAAW,oBAAI,KAAK;AAAA,QACpB,aAAa;AAAA,QACb,WAAW,CAAC;AAAA,MACd;AAEA,YAAM,eAAe,CAAC,GAAG,UAAU,WAAW;AAC9C,kBAAY,CAAC,GAAG,cAAc,oBAAoB,CAAC;AACnD,eAAS,EAAE;AACX,qBAAe,IAAI;AACnB,eAAS,IAAI;AACb,mBAAa,IAAI;AAEjB,YAAM,aAAa,IAAI,gBAAgB;AACvC,yBAAmB,UAAU;AAE7B,UAAI;AACF,cAAM,kBAAkB,aAAa,IAAI,CAAC,OAAO;AAAA,UAC/C,MAAM,EAAE,SAAS,cAAe,cAAyB;AAAA,UACzD,SAAS,EAAE;AAAA,QACb,EAAE;AAEF,cAAM,WAAW,MAAM,cAAc,SAAS;AAAA,UAC5C,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,gBAAgB;AAAA,UAClB;AAAA,UACA,MAAM,KAAK,UAAU;AAAA,YACnB,SAAS;AAAA,YACT,UAAU;AAAA,YACV,UAAU,iBAAiB,YAAY,QAAQ;AAAA,YAC/C,QAAQ,iBAAiB;AAAA,UAC3B,CAAC;AAAA,UACD,QAAQ,WAAW;AAAA,QACrB,CAAC;AAED,YAAI,CAAC,SAAS,IAAI;AAChB,gBAAM,UAAU,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,eAAe;AACjE,gBAAM,IAAI,MAAM,eAAe,SAAS,MAAM,MAAM,OAAO,EAAE;AAAA,QAC/D;AAEA,YAAI,CAAC,SAAS,MAAM;AAClB,gBAAM,IAAI,MAAM,0CAA0C;AAAA,QAC5D;AAEA,cAAM,SAAS,SAAS,KAAK,UAAU;AACvC,cAAM,UAAU,IAAI,YAAY,OAAO;AACvC,YAAI,SAAS;AACb,YAAI,kBAAkB;AACtB,YAAI,uBAAuB;AAC3B,cAAM,eAAe,oBAAI,IAA6B;AAEtD,cAAM,iBAAiB,CAAC,UAAmC;AACzD;AAAA,YAAY,CAAC,SACX,KAAK;AAAA,cAAI,CAAC,QACR,IAAI,OAAO,qBACP,EAAE,GAAG,KAAK,WAAW,MAAM,KAAK,aAAa,OAAO,CAAC,GAAG,GAAG,MAAM,IACjE;AAAA,YACN;AAAA,UACF;AAAA,QACF;AAEA,eAAO,MAAM;AACX,gBAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,cAAI,KAAM;AAEV,oBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAChD,gBAAM,QAAQ,OAAO,MAAM,IAAI;AAC/B,mBAAS,MAAM,IAAI,KAAK;AAExB,qBAAW,QAAQ,OAAO;AACxB,kBAAM,UAAU,KAAK,KAAK;AAC1B,gBAAI,CAAC,WAAW,CAAC,QAAQ,WAAW,OAAO,EAAG;AAE9C,kBAAM,MAAM,QAAQ,QAAQ,aAAa,EAAE;AAC3C,gBAAI,QAAQ,SAAU;AAEtB,gBAAI;AACF,oBAAM,QAAQ,KAAK,MAAM,GAAG;AAC5B,sBAAQ,UAAU,KAAK;AAEvB,kBAAI,MAAM,SAAS,wBAAwB,MAAM,OAAO;AACtD,mCAAmB,MAAM;AACzB,+BAAe,EAAE,SAAS,iBAAiB,aAAa,KAAK,CAAC;AAAA,cAChE,WAAW,MAAM,SAAS,qBAAqB,MAAM,YAAY;AAK/D,sBAAM,WAAW,aAAa,IAAI,MAAM,UAAU;AAClD,oBAAI,UAAU;AACZ,2BAAS,QAAQ,SAAS,QAAQ,OAAO,MAAM,SAAS;AAAA,gBAC1D,OAAO;AACL,+BAAa,IAAI,MAAM,YAAY;AAAA,oBACjC,YAAY,MAAM;AAAA,oBAClB,UAAU,MAAM,gBAAgB;AAAA,oBAChC,MAAM,MAAM,SAAS;AAAA,kBACvB,CAAC;AAAA,gBACH;AACA,+BAAe,CAAC,CAAC;AAAA,cACnB,WAAW,MAAM,SAAS,oBAAoB;AAC5C,sBAAM,WAAW,aAAa,IAAI,MAAM,UAAU;AAClD,oBAAI,UAAU;AACZ,2BAAS,SAAS,MAAM;AACxB,2BAAS,UAAU,mBAAmB,MAAM,OAAO;AACnD,sBAAI,SAAS,aAAa,kBAAkB,CAAC,SAAS,SAAS;AAC7D,0BAAM,YAAY,mBAAmB,MAAM,OAAO;AAClD,wBAAI,UAAW,kBAAiB,SAAS;AAAA,kBAC3C;AACA,iCAAe,CAAC,CAAC;AAAA,gBACnB;AAAA,cACF,WAAW,MAAM,SAAS,kBAAkB;AAC1C,yBAAS,MAAM,SAAS,KAAK;AAC7B,yBAAS,MAAM,SAAS,KAAK;AAAA,cAC/B,WAAW,MAAM,SAAS,6BAA6B;AACrD,wCAAwB,MAAM;AAC9B,+BAAe,EAAE,WAAW,sBAAsB,aAAa,KAAK,CAAC;AAAA,cACvE,WAAW,MAAM,SAAS,iBAAiB;AACzC,+BAAe,EAAE,aAAa,MAAM,CAAC;AAAA,cACvC,WAAW,MAAM,SAAS,UAAU;AAClC,oBAAI,MAAM,SAAS,gBAAgB;AACjC,wBAAMC,SAAQ,MAAM;AACpB,+BAAa;AAAA,oBACX,MAAM;AAAA,oBACN,gBAAgBA,OAAM;AAAA,oBACtB,eAAeA,OAAM;AAAA,kBACvB,CAAC;AAAA,gBACH,WAAW,MAAM,SAAS,yBAAyB;AACjD,wBAAMA,SAAQ,MAAM;AACpB,+BAAa,EAAE,MAAM,iBAAiB,WAAWA,OAAM,UAAU,CAAC;AAAA,gBACpE,WAAW,MAAM,SAAS,qBAAqB;AAC7C,wBAAM,EAAE,YAAY,GAAG,MAAM,IAAI,MAAM;AACvC,wBAAM,WAAW,aAAa,IAAI,UAAU;AAC5C,sBAAI,UAAU;AACZ,6BAAS,mBAAmB,CAAC,GAAI,SAAS,oBAAoB,CAAC,GAAI,KAAK;AACxE,mCAAe,CAAC,CAAC;AAAA,kBACnB;AAAA,gBACF;AAAA,cAGF,WAAW,MAAM,SAAS,aAAa;AACrC,sBAAM,IAAI,MAAM,MAAM,WAAW,yBAAyB;AAAA,cAC5D;AAAA,YACF,SAAS,GAAG;AACV,kBAAI,aAAa,SAAS,EAAE,QAAQ,WAAW,cAAc,GAAG;AAC9D,sBAAM;AAAA,cACR;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,cAAM,eAA+B;AAAA,UACnC,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,SAAS;AAAA,UACT,WAAW,oBAAI,KAAK;AAAA,UACpB,aAAa;AAAA,UACb,WAAW,MAAM,KAAK,aAAa,OAAO,CAAC;AAAA,UAC3C,GAAI,uBAAuB,EAAE,WAAW,sBAAsB,aAAa,MAAM,IAAI,CAAC;AAAA,QACxF;AAEA;AAAA,UAAY,CAAC,SACX,KAAK,IAAI,CAAC,QAAS,IAAI,OAAO,qBAAqB,eAAe,GAAI;AAAA,QACxE;AAEA,gBAAQ,WAAW,YAAY;AAAA,MACjC,SAAS,KAAK;AACZ,YAAI,WAAW,OAAO,SAAS;AAC7B;AAAA,YAAY,CAAC,SACX,KAAK;AAAA,cAAI,CAAC,QACR,IAAI,OAAO,qBAAqB,EAAE,GAAG,KAAK,aAAa,MAAM,IAAI;AAAA,YACnE;AAAA,UACF;AACA;AAAA,QACF;AAEA,cAAM,WAAW,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACnE,iBAAS,QAAQ;AACjB,gBAAQ,UAAU,QAAQ;AAE1B;AAAA,UAAY,CAAC,SACX,KAAK;AAAA,YAAI,CAAC,QACR,IAAI,OAAO,qBACP;AAAA,cACE,GAAG;AAAA,cACH,SACE,IAAI,WAAW,uBAAa,SAAS,WAAW,yBAAyB;AAAA,cAC3E,aAAa;AAAA,YACf,IACA;AAAA,UACN;AAAA,QACF;AAAA,MACF,UAAE;AACA,uBAAe,KAAK;AACpB,2BAAmB,UAAU;AAAA,MAC/B;AAAA,IACF;AAAA,IACA,CAAC,SAAS,eAAe,OAAO,aAAa,UAAU,OAAO;AAAA,EAChE;AAEA,QAAM,wBAAoB,2BAAY,CAAC,MAAiE;AACtG,aAAS,EAAE,OAAO,KAAK;AAAA,EACzB,GAAG,CAAC,CAAC;AAEL,QAAM,mBAAe;AAAA,IACnB,CAAC,MAAwB;AACvB,UAAI,EAAG,GAAE,eAAe;AACxB,WAAK,YAAY;AAAA,IACnB;AAAA,IACA,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,aAAS,2BAAY,MAAM;AAC/B,QAAI,SAAS,WAAW,KAAK,YAAa;AAC1C,QAAI,gBAAgB;AACpB,aAAS,IAAI,SAAS,SAAS,GAAG,KAAK,GAAG,KAAK;AAC7C,UAAI,SAAS,CAAC,EAAE,SAAS,QAAQ;AAC/B,wBAAgB;AAChB;AAAA,MACF;AAAA,IACF;AACA,QAAI,kBAAkB,GAAI;AAE1B,UAAM,kBAAkB,SAAS,aAAa;AAC9C,gBAAY,SAAS,MAAM,GAAG,aAAa,CAAC;AAC5C,SAAK,YAAY,gBAAgB,OAAO;AAAA,EAC1C,GAAG,CAAC,aAAa,UAAU,WAAW,CAAC;AAMvC,QAAM,sBAAkB;AAAA,IACtB,CAAC,QAA4B,mBAA2B,YAAY,gBAAgB,EAAE,OAAO,CAAC;AAAA,IAC9F,CAAC,WAAW;AAAA,EACd;AAEA,QAAM,2BAAuB,2BAAY,MAAM,iBAAiB,IAAI,GAAG,CAAC,CAAC;AAEzE,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AClcA,IAAAC,gBAAiD;AAI1C,SAAS,UAAU,YAAY,MAAM;AAC1C,QAAM,EAAE,cAAc,IAAI,kBAAkB;AAC5C,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAA4B,EAAE,WAAW,CAAC,GAAG,eAAe,CAAC,EAAE,CAAC;AAC5F,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AAErD,QAAM,kBAAc,2BAAY,YAAY;AAC1C,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,QAAI;AACF,YAAM,MAAM,MAAM,cAAc,SAAS;AACzC,UAAI,CAAC,IAAI,IAAI;AACX,cAAM,IAAI,MAAM,2BAA2B,IAAI,UAAU,EAAE;AAAA,MAC7D;AACA,YAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,gBAAU,IAAI;AACd,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,YAAM,WAAW,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACnE,eAAS,QAAQ;AACjB,aAAO,EAAE,WAAW,CAAC,GAAG,eAAe,CAAC,EAAE;AAAA,IAC5C,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,cAAU;AAAA,IACd,OAAO,WAAyE;AAC9E,YAAM,QAAQ,IAAI,gBAAgB,EAAE,MAAM,OAAO,KAAK,CAAC;AACvD,UAAI,OAAO,MAAO,OAAM,IAAI,SAAS,OAAO,KAAK;AACjD,UAAI,OAAO,QAAS,OAAM,IAAI,WAAW,OAAO,OAAO;AAEvD,YAAM,MAAM,MAAM,cAAc,gBAAgB,MAAM,SAAS,CAAC,EAAE;AAClE,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,8BAA8B,IAAI,UAAU,EAAE;AAC3E,aAAQ,MAAM,IAAI,KAAK;AAAA,IACzB;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,gBAAY;AAAA,IAChB,OAAO,WAA0F;AAC/F,YAAM,MAAM,MAAM,cAAc,gBAAgB;AAAA,QAC9C,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,MAAM;AAAA,MAC7B,CAAC;AACD,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,gCAAgC,IAAI,UAAU,EAAE;AAC7E,YAAM,UAAW,MAAM,IAAI,KAAK;AAChC,WAAK,YAAY;AACjB,aAAO;AAAA,IACT;AAAA,IACA,CAAC,eAAe,WAAW;AAAA,EAC7B;AAEA,QAAM,iBAAa;AAAA,IACjB,OAAO,WAAyE;AAC9E,YAAM,QAAQ,IAAI,gBAAgB,EAAE,MAAM,OAAO,KAAK,CAAC;AACvD,UAAI,OAAO,MAAO,OAAM,IAAI,SAAS,OAAO,KAAK;AACjD,UAAI,OAAO,QAAS,OAAM,IAAI,WAAW,OAAO,OAAO;AAEvD,YAAM,MAAM,MAAM,cAAc,gBAAgB,MAAM,SAAS,CAAC,IAAI;AAAA,QAClE,QAAQ;AAAA,MACV,CAAC;AACD,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,iCAAiC,IAAI,UAAU,EAAE;AAC9E,WAAK,YAAY;AAAA,IACnB;AAAA,IACA,CAAC,eAAe,WAAW;AAAA,EAC7B;AAEA,+BAAU,MAAM;AACd,QAAI,WAAW;AACb,WAAK,YAAY;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,WAAW,WAAW,CAAC;AAE3B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;ACxFA,IAAAC,gBAAiD;AAI1C,SAAS,WAAW,YAAY,MAAM;AAC3C,QAAM,EAAE,eAAe,eAAe,IAAI,kBAAkB;AAC5D,QAAM,CAAC,SAAS,UAAU,QAAI,wBAA0B,CAAC,CAAC;AAC1D,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AAErD,QAAM,mBAAe,2BAAY,YAAY;AAC3C,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,QAAI;AACF,YAAM,MAAM,MAAM,cAAc,UAAU;AAC1C,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,2BAA2B,IAAI,UAAU,EAAE;AACxE,YAAM,OAAO,MAAM,IAAI,KAAK;AAG5B,YAAM,QAAyB,MAAM,QAAQ,IAAI,IAC7C,OACA,MAAM,SAAS,MAAM,YAAY,MAAM,QAAQ,MAAM,IAAI,IAAI,KAAK,OAAO,WAAc,CAAC;AAC5F,iBAAW,KAAK;AAChB,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,YAAM,WAAW,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACnE,eAAS,QAAQ;AACjB,aAAO,CAAC;AAAA,IACV,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,mBAAe;AAAA,IACnB,OAAO,YAAqB;AAC1B,YAAM,gBAAgB,WAAW;AACjC,YAAM,MAAM,MAAM,cAAc,YAAY;AAAA,QAC1C,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,EAAE,SAAS,cAAc,CAAC;AAAA,MACjD,CAAC;AACD,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,4BAA4B,IAAI,UAAU,EAAE;AACzE,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,YAAM,UAAW,MAAM,QAAQ;AAC/B,WAAK,aAAa;AAClB,aAAO;AAAA,IACT;AAAA,IACA,CAAC,eAAe,gBAAgB,YAAY;AAAA,EAC9C;AAEA,QAAM,mBAAe;AAAA,IACnB,OAAO,aAAqB;AAC1B,YAAM,MAAM,MAAM,cAAc,YAAY,QAAQ,IAAI,EAAE,QAAQ,SAAS,CAAC;AAC5E,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,4BAA4B,IAAI,UAAU,EAAE;AACzE,iBAAW,CAAC,SAAS,KAAK,OAAO,CAAC,MAAM,EAAE,QAAQ,QAAQ,CAAC;AAAA,IAC7D;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAIA,QAAM,wBAAoB;AAAA,IACxB,OAAO,cAAwB;AAC7B,YAAM,MAAM,MAAM,cAAc,wBAAwB;AAAA,QACtD,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,EAAE,KAAK,UAAU,CAAC;AAAA,MACzC,CAAC;AACD,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,kCAAkC,IAAI,UAAU,EAAE;AAC/E,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,YAAM,SAAU,MAAM,QAAQ;AAC9B,YAAM,aAAa,IAAI,IAAI,OAAO,OAAO;AACzC,iBAAW,CAAC,SAAS,KAAK,OAAO,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,GAAG,CAAC,CAAC;AAC/D,aAAO;AAAA,IACT;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAKA,QAAM,uBAAmB,2BAAY,YAAY;AAC/C,UAAM,MAAM,QAAQ,IAAI,CAAC,MAAM,EAAE,GAAG;AACpC,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,KAAK;AACxC,YAAM,kBAAkB,IAAI,MAAM,GAAG,IAAI,GAAG,CAAC;AAAA,IAC/C;AAAA,EACF,GAAG,CAAC,SAAS,iBAAiB,CAAC;AAG/B,QAAM,mBAAe;AAAA,IACnB,OAAO,UAAkB,UAAoD;AAC3E,YAAM,MAAM,MAAM,cAAc,YAAY,QAAQ,IAAI;AAAA,QACtD,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,KAAK;AAAA,MAC5B,CAAC;AACD,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,4BAA4B,IAAI,UAAU,EAAE;AACzE,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,YAAM,UAAW,MAAM,QAAQ;AAC/B,iBAAW,CAAC,SAAS,KAAK,IAAI,CAAC,MAAO,EAAE,QAAQ,WAAW,EAAE,GAAG,GAAG,GAAG,QAAQ,IAAI,CAAE,CAAC;AACrF,aAAO;AAAA,IACT;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,mBAAe;AAAA,IACnB,CAAC,UAAkB,UAAkB,aAAa,UAAU,EAAE,MAAM,CAAC;AAAA,IACrE,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,gBAAY;AAAA,IAChB,OAAO,aAAqB;AAC1B,YAAM,MAAM,MAAM,cAAc,YAAY,QAAQ,EAAE;AACtD,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,2BAA2B,IAAI,UAAU,EAAE;AACxE,YAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,aAAQ,MAAM,QAAQ;AAAA,IACxB;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEA,+BAAU,MAAM;AACd,QAAI,WAAW;AACb,WAAK,aAAa;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,WAAW,YAAY,CAAC;AAE5B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC3IA,IAAAC,gBAAiD;AAM1C,SAAS,SAAS,YAAY,MAAM;AACzC,QAAM,EAAE,cAAc,IAAI,kBAAkB;AAC5C,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAA4B,CAAC,CAAC;AACxD,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,KAAK;AACpD,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AAErD,QAAM,iBAAa,2BAAY,YAAY;AACzC,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,QAAI;AACF,YAAM,MAAM,MAAM,cAAc,QAAQ;AACxC,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,yBAAyB,IAAI,UAAU,EAAE;AACtE,YAAM,OAAO,MAAM,IAAI,KAAK;AAG5B,YAAM,QAA2B,MAAM,QAAQ,IAAI,IAC/C,OACA,MAAM,SAAS,MAAM,SAAS,CAAC;AACnC,eAAS,KAAK;AACd,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,YAAM,WAAW,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACnE,eAAS,QAAQ;AACjB,aAAO,CAAC;AAAA,IACV,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,iBAAa;AAAA,IACjB,OAAO,mBAA4E;AACjF,qBAAe,IAAI;AACnB,eAAS,IAAI;AACb,UAAI;AACF,YAAI;AACJ,YAAI,0BAA0B,UAAU;AACtC,iBAAO;AAAA,QACT,OAAO;AAEL,iBAAO,IAAI,SAAS;AACpB,eAAK,OAAO,QAAQ,cAAiC;AAAA,QACvD;AAEA,cAAM,MAAM,MAAM,cAAc,UAAU;AAAA,UACxC,QAAQ;AAAA,UACR;AAAA,QACF,CAAC;AAED,YAAI,CAAC,IAAI,IAAI;AACX,gBAAM,UAAU,MAAM,IAAI,KAAK,EAAE,MAAM,MAAM,eAAe;AAC5D,gBAAM,IAAI,MAAM,iBAAiB,IAAI,MAAM,MAAM,OAAO,EAAE;AAAA,QAC5D;AAEA,cAAM,WAAY,MAAM,IAAI,KAAK;AACjC,aAAK,WAAW;AAChB,eAAO;AAAA,MACT,SAAS,KAAK;AACZ,cAAM,WAAW,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACnE,iBAAS,QAAQ;AACjB,cAAM;AAAA,MACR,UAAE;AACA,uBAAe,KAAK;AAAA,MACtB;AAAA,IACF;AAAA,IACA,CAAC,eAAe,UAAU;AAAA,EAC5B;AAEA,QAAM,iBAAa;AAAA,IACjB,OAAO,WAAmB;AACxB,YAAM,MAAM,MAAM,cAAc,UAAU,MAAM,IAAI,EAAE,QAAQ,SAAS,CAAC;AACxE,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,0BAA0B,IAAI,UAAU,EAAE;AACvE,eAAS,CAAC,SAAS,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,MAAM,CAAC;AAAA,IACxD;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,sBAAkB;AAAA,IACtB,OAAO,YAAsB;AAC3B,YAAM,MAAM,MAAM,cAAc,sBAAsB;AAAA,QACpD,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,EAAE,KAAK,QAAQ,CAAC;AAAA,MACvC,CAAC;AACD,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,gCAAgC,IAAI,UAAU,EAAE;AAC7E,YAAM,QAAQ,IAAI,IAAI,OAAO;AAC7B,eAAS,CAAC,SAAS,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC,CAAC;AACvD,aAAQ,MAAM,IAAI,KAAK;AAAA,IACzB;AAAA,IACA,CAAC,aAAa;AAAA,EAChB;AAEA,QAAM,qBAAiB;AAAA,IACrB,CAAC,WAAmB;AAClB,aAAO,UAAU,MAAM;AAAA,IACzB;AAAA,IACA,CAAC;AAAA,EACH;AAEA,+BAAU,MAAM;AACd,QAAI,WAAW;AACb,WAAK,WAAW;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,WAAW,UAAU,CAAC;AAE1B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AC1HA,IAAAC,gBAAiD;AAY1C,SAAS,UAAU,YAAY,MAAM;AAC1C,QAAM,EAAE,cAAc,IAAI,kBAAkB;AAC5C,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAgC,CAAC,CAAC;AAC9D,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAChD,QAAM,CAAC,OAAO,QAAQ,QAAI,wBAAuB,IAAI;AAErD,QAAM,kBAAc,2BAAY,YAAY;AAC1C,iBAAa,IAAI;AACjB,aAAS,IAAI;AACb,QAAI;AACF,YAAM,MAAM,MAAM,cAAc,SAAS;AACzC,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,0BAA0B,IAAI,UAAU,EAAE;AACvE,YAAM,OAAO,MAAM,IAAI,KAAK;AAE5B,YAAM,QAA+B,MAAM,QAAQ,IAAI,IACnD,OACA,MAAM,SAAS,MAAM,UAAU,CAAC;AACpC,gBAAU,KAAK;AACf,aAAO;AAAA,IACT,SAAS,KAAK;AACZ,YAAM,WAAW,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC;AACnE,eAAS,QAAQ;AACjB,aAAO,CAAC;AAAA,IACV,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAElB,+BAAU,MAAM;AACd,QAAI,WAAW;AACb,WAAK,YAAY;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,WAAW,WAAW,CAAC;AAE3B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,EACX;AACF;;;ACpDA,IAAAC,gBAAiD;AAS1C,SAAS,cAAc,YAAY,MAAM;AAC9C,QAAM,EAAE,cAAc,IAAI,kBAAkB;AAC5C,QAAM,CAAC,QAAQ,SAAS,QAAI,wBAAmC,IAAI;AACnE,QAAM,CAAC,aAAa,cAAc,QAAI,wBAAS,KAAK;AACpD,QAAM,CAAC,WAAW,YAAY,QAAI,wBAAS,KAAK;AAEhD,QAAM,kBAAc,2BAAY,YAAY;AAC1C,iBAAa,IAAI;AACjB,QAAI;AACF,YAAM,MAAM,MAAM,cAAc,SAAS;AACzC,UAAI,IAAI,IAAI;AACV,cAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,kBAAU,IAAI;AACd,uBAAe,IAAI;AACnB,eAAO;AAAA,MACT;AACA,qBAAe,KAAK;AACpB,aAAO;AAAA,IACT,QAAQ;AACN,qBAAe,KAAK;AACpB,aAAO;AAAA,IACT,UAAE;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,aAAa,CAAC;AAElB,+BAAU,MAAM;AACd,QAAI,WAAW;AACb,WAAK,YAAY;AAAA,IACnB;AAAA,EACF,GAAG,CAAC,WAAW,WAAW,CAAC;AAE3B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;APxCO,IAAM,UAAU;","names":["import_react","value","import_react","import_react","import_react","import_react","import_react"]}
package/dist/index.d.cts CHANGED
@@ -2,12 +2,22 @@ import * as react from 'react';
2
2
  import react__default, { ReactNode } from 'react';
3
3
 
4
4
  type PersonaRole = 'user' | 'assistant' | 'system';
5
+ /** One live update on a running `task` (subagent) tool call's timeline. */
6
+ interface PersonaSubagentActivityEntry {
7
+ kind: 'text' | 'tool_start' | 'tool_result';
8
+ toolName?: string;
9
+ args?: string;
10
+ result?: string;
11
+ delta?: string;
12
+ }
5
13
  interface PersonaToolCall {
6
14
  toolCallId: string;
7
15
  toolName: string;
8
16
  args?: string;
9
17
  result?: string;
10
18
  isError?: boolean;
19
+ /** Nested activity timeline — only present on `task` (subagent) tool calls. */
20
+ subagentActivity?: PersonaSubagentActivityEntry[];
11
21
  }
12
22
  interface PersonaMessage {
13
23
  id: string;
@@ -16,6 +26,61 @@ interface PersonaMessage {
16
26
  createdAt: Date;
17
27
  isStreaming?: boolean;
18
28
  toolCalls?: PersonaToolCall[];
29
+ /** Model reasoning/thinking text streamed ahead of the final answer, when the provider exposes it. */
30
+ reasoning?: string;
31
+ isReasoning?: boolean;
32
+ }
33
+ interface PersonaHitlActionRequest {
34
+ name: string;
35
+ args?: unknown;
36
+ }
37
+ interface PersonaClarificationQuestion {
38
+ id: string;
39
+ text: string;
40
+ options: string[];
41
+ required: boolean;
42
+ allowCustom: boolean;
43
+ }
44
+ /** A paused human-in-the-loop tool approval, or a paused clarification question. */
45
+ type PersonaInterrupt = {
46
+ kind: 'hitl';
47
+ actionRequests: PersonaHitlActionRequest[];
48
+ reviewConfigs: unknown[];
49
+ } | {
50
+ kind: 'clarification';
51
+ questions: PersonaClarificationQuestion[];
52
+ };
53
+ /** What to send back in `sendMessage(content, { resume })` to unpause a paused run. */
54
+ type PersonaResumeValue = {
55
+ decisions: Array<{
56
+ type: 'approve' | 'reject';
57
+ message?: string;
58
+ }>;
59
+ } | {
60
+ answers: unknown[];
61
+ text?: string;
62
+ };
63
+ /**
64
+ * A file in the agent's own virtual workspace (deepagents' state-backed
65
+ * filesystem — `write_file`/`read_file` tool calls, distinct from
66
+ * `PersonaFileItem` uploads). Populated from `STATE_SNAPSHOT` events, or
67
+ * from a reloaded thread's persisted state.
68
+ */
69
+ interface PersonaWorkspaceFile {
70
+ content: string;
71
+ size: number;
72
+ createdAt: string | null;
73
+ modifiedAt: string | null;
74
+ }
75
+ interface PersonaTodo {
76
+ content: string;
77
+ status: string;
78
+ }
79
+ /** Set when the agent calls `present_file` to highlight a workspace file. */
80
+ interface PersonaPresentedFile {
81
+ path: string;
82
+ title: string;
83
+ description: string;
19
84
  }
20
85
  interface PersonaProviderProps {
21
86
  /** Base URL where the Persona runtime / adapter is mounted, e.g. "http://localhost:4000/api/persona" */
@@ -28,73 +93,127 @@ interface PersonaProviderProps {
28
93
  }
29
94
  interface PersonaThread {
30
95
  _id: string;
31
- agentId: string;
96
+ /** A bare id string on create()/get(); populated as an object on list(). */
97
+ agentId: string | {
98
+ _id: string;
99
+ name: string;
100
+ avatar?: string;
101
+ slug: string;
102
+ };
32
103
  title?: string;
33
104
  isArchived?: boolean;
34
105
  createdAt: string;
35
106
  updatedAt: string;
36
107
  }
108
+ /** Mirrors the wire shape of `GET/POST /files` — `id`, not `_id`. */
109
+ interface PersonaFileItem {
110
+ id: string;
111
+ originalName: string;
112
+ mimeType: string;
113
+ /** Bytes. */
114
+ size: number;
115
+ agentId: string | null;
116
+ threadId: string | null;
117
+ createdAt: string;
118
+ }
37
119
  interface PersonaMemoryFile {
120
+ scope?: 'user' | 'agent';
121
+ agentId?: string;
38
122
  path: string;
39
123
  content: string;
124
+ mimeType?: string;
125
+ createdAt?: string;
40
126
  updatedAt?: string;
41
127
  }
128
+ /** One agent's group of agent-scoped memory files, as returned by `GET /memory`. */
129
+ interface PersonaMemoryAgentGroup {
130
+ agentId: string;
131
+ /** `null` if the agent no longer exists. */
132
+ agentName: string | null;
133
+ files: PersonaMemoryFile[];
134
+ }
42
135
  interface PersonaMemoryList {
43
- user: Array<{
44
- path: string;
45
- size?: number;
46
- updatedAt?: string;
47
- }>;
48
- agents: Record<string, Array<{
49
- path: string;
50
- size?: number;
51
- updatedAt?: string;
52
- }>>;
136
+ userFiles: PersonaMemoryFile[];
137
+ agentMemories: PersonaMemoryAgentGroup[];
53
138
  }
54
- /** AG-UI Streaming Protocol Event types emitted during streaming */
139
+ /**
140
+ * AG-UI protocol events emitted during streaming — mirrors exactly what
141
+ * `aguiTranslator.js` produces server-side (verified against that file, not
142
+ * guessed from the AG-UI spec: this backend only emits a subset, and uses
143
+ * `TOOL_CALL_CHUNK` rather than separate START/ARGS events for tool calls,
144
+ * and `REASONING_END` rather than `REASONING_MESSAGE_END`).
145
+ */
55
146
  type PersonaStreamingEvent = {
56
147
  type: 'TEXT_MESSAGE_CHUNK';
57
148
  delta: string;
58
149
  messageId?: string;
150
+ role?: 'assistant';
59
151
  } | {
60
- type: 'TOOL_CALL_START';
61
- toolCallId: string;
62
- toolName: string;
152
+ type: 'TOOL_CALL_CHUNK';
153
+ toolCallId?: string;
154
+ toolCallName?: string;
155
+ delta?: string;
63
156
  parentMessageId?: string;
64
- } | {
65
- type: 'TOOL_CALL_ARGS';
66
- toolCallId: string;
67
- delta: string;
68
157
  } | {
69
158
  type: 'TOOL_CALL_RESULT';
70
159
  toolCallId: string;
71
- result: string;
72
- isError?: boolean;
160
+ content: string;
161
+ messageId?: string;
162
+ role?: 'tool';
163
+ structuredContent?: unknown;
73
164
  } | {
74
- type: 'RUN_STARTED';
75
- runId: string;
76
- threadId?: string;
165
+ type: 'REASONING_MESSAGE_START';
166
+ messageId: string;
77
167
  } | {
78
- type: 'RUN_FINISHED';
79
- runId: string;
80
- tokenUsage?: {
81
- promptTokens?: number;
82
- completionTokens?: number;
168
+ type: 'REASONING_MESSAGE_CONTENT';
169
+ messageId: string;
170
+ delta: string;
171
+ } | {
172
+ type: 'REASONING_END';
173
+ } | {
174
+ type: 'STATE_SNAPSHOT';
175
+ snapshot: {
176
+ files: Record<string, PersonaWorkspaceFile>;
177
+ todos: PersonaTodo[];
83
178
  };
84
179
  } | {
85
180
  type: 'RUN_ERROR';
86
181
  code: string;
87
182
  message: string;
183
+ retryable?: boolean;
184
+ providerName?: string;
88
185
  } | {
89
- type: 'STEP_STARTED';
90
- stepName: string;
186
+ type: 'CUSTOM';
187
+ name: 'hitl_request';
188
+ value: {
189
+ actionRequests: PersonaHitlActionRequest[];
190
+ reviewConfigs: unknown[];
191
+ };
91
192
  } | {
92
- type: 'STEP_FINISHED';
93
- stepName: string;
193
+ type: 'CUSTOM';
194
+ name: 'clarification_request';
195
+ value: {
196
+ questions: PersonaClarificationQuestion[];
197
+ currentIndex: number;
198
+ };
94
199
  } | {
95
200
  type: 'CUSTOM';
96
- name: string;
97
- payload: unknown;
201
+ name: 'subagent_activity';
202
+ value: {
203
+ toolCallId: string;
204
+ } & PersonaSubagentActivityEntry;
205
+ } | {
206
+ type: 'CUSTOM';
207
+ name: 'mcp_app';
208
+ value: {
209
+ toolCallId: string;
210
+ resourceUri: string;
211
+ mcpId: string;
212
+ };
213
+ } | {
214
+ type: 'CUSTOM';
215
+ name: string & {};
216
+ value: unknown;
98
217
  };
99
218
  interface UseChatOptions {
100
219
  agentId?: string;
@@ -105,6 +224,12 @@ interface UseChatOptions {
105
224
  /** Hook for receiving every low-level AG-UI streaming event (tool calls, steps, subagents) */
106
225
  onEvent?: (event: PersonaStreamingEvent) => void;
107
226
  }
227
+ interface SendMessageOverride {
228
+ agentId?: string;
229
+ threadId?: string;
230
+ /** Answers/approves a paused interrupt from a previous turn instead of starting a fresh one. */
231
+ resume?: PersonaResumeValue;
232
+ }
108
233
 
109
234
  interface PersonaContextValue {
110
235
  baseUrl: string;
@@ -121,17 +246,22 @@ declare function useChat(options?: UseChatOptions): {
121
246
  setInput: react.Dispatch<react.SetStateAction<string>>;
122
247
  handleInputChange: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
123
248
  handleSubmit: (e?: React.FormEvent) => void;
124
- sendMessage: (contentToSend?: string, overrideOptions?: {
125
- agentId?: string;
126
- threadId?: string;
127
- }) => Promise<void>;
249
+ sendMessage: (contentToSend?: string, overrideOptions?: SendMessageOverride) => Promise<void>;
128
250
  isStreaming: boolean;
129
251
  isLoading: boolean;
252
+ isLoadingHistory: boolean;
130
253
  error: Error | null;
254
+ interrupt: PersonaInterrupt | null;
255
+ resumeInterrupt: (resume: PersonaResumeValue, displayContent: string) => Promise<void>;
256
+ files: Record<string, PersonaWorkspaceFile>;
257
+ todos: PersonaTodo[];
258
+ presentedFile: PersonaPresentedFile | null;
259
+ dismissPresentedFile: () => void;
131
260
  stop: () => void;
132
261
  reload: () => void;
133
262
  clear: () => void;
134
263
  setMessages: react.Dispatch<react.SetStateAction<PersonaMessage[]>>;
264
+ loadThreadMessages: (id: string) => Promise<PersonaMessage[]>;
135
265
  };
136
266
 
137
267
  declare function useMemory(autoFetch?: boolean): {
@@ -161,44 +291,60 @@ declare function useThreads(autoFetch?: boolean): {
161
291
  threads: PersonaThread[];
162
292
  isLoading: boolean;
163
293
  error: Error | null;
164
- refetch: () => Promise<any>;
294
+ refetch: () => Promise<PersonaThread[]>;
165
295
  createThread: (agentId?: string) => Promise<PersonaThread>;
166
296
  deleteThread: (threadId: string) => Promise<void>;
297
+ bulkDeleteThreads: (threadIds: string[]) => Promise<{
298
+ deleted: string[];
299
+ failed: Array<{
300
+ id: string;
301
+ reason: string;
302
+ }>;
303
+ }>;
304
+ deleteAllThreads: () => Promise<void>;
305
+ updateThread: (threadId: string, input: {
306
+ title?: string;
307
+ isArchived?: boolean;
308
+ }) => Promise<PersonaThread>;
309
+ renameThread: (threadId: string, title: string) => Promise<PersonaThread>;
310
+ getThread: (threadId: string) => Promise<PersonaThread>;
167
311
  };
168
312
 
169
- interface PersonaFileItem {
170
- _id: string;
171
- filename: string;
172
- contentType?: string;
173
- sizeBytes?: number;
174
- createdAt: string;
175
- }
176
313
  declare function useFiles(autoFetch?: boolean): {
177
314
  files: PersonaFileItem[];
178
315
  isLoading: boolean;
179
316
  isUploading: boolean;
180
317
  error: Error | null;
181
- refetch: () => Promise<any>;
318
+ refetch: () => Promise<PersonaFileItem[]>;
182
319
  uploadFile: (fileOrFormData: FormData | {
183
320
  name: string;
184
321
  uri: string;
185
322
  type?: string;
186
323
  }) => Promise<PersonaFileItem>;
187
324
  deleteFile: (fileId: string) => Promise<void>;
325
+ bulkDeleteFiles: (fileIds: string[]) => Promise<{
326
+ deleted: string[];
327
+ failed: Array<{
328
+ id: string;
329
+ reason: string;
330
+ }>;
331
+ }>;
188
332
  getDownloadUrl: (fileId: string) => string;
189
333
  };
190
334
 
191
335
  interface PersonaAgentSummary {
192
336
  _id: string;
193
337
  name: string;
338
+ slug: string;
194
339
  description?: string;
195
- avatarUrl?: string;
340
+ tagline?: string;
341
+ avatar?: string;
196
342
  }
197
343
  declare function useAgents(autoFetch?: boolean): {
198
344
  agents: PersonaAgentSummary[];
199
345
  isLoading: boolean;
200
346
  error: Error | null;
201
- refetch: () => Promise<any>;
347
+ refetch: () => Promise<PersonaAgentSummary[]>;
202
348
  };
203
349
 
204
350
  interface PersonaHealthInfo {
@@ -213,6 +359,6 @@ declare function useConnection(autoCheck?: boolean): {
213
359
  checkHealth: () => Promise<PersonaHealthInfo | null>;
214
360
  };
215
361
 
216
- declare const VERSION = "0.1.2";
362
+ declare const VERSION = "0.2.0";
217
363
 
218
- export { type PersonaAgentSummary, type PersonaFileItem, type PersonaHealthInfo, type PersonaMemoryFile, type PersonaMemoryList, type PersonaMessage, PersonaProvider, type PersonaProviderProps, type PersonaRole, type PersonaStreamingEvent, type PersonaThread, type PersonaToolCall, type UseChatOptions, VERSION, useAgents, useChat, useConnection, useFiles, useMemory, usePersonaContext, useThreads };
364
+ export { type PersonaAgentSummary, type PersonaClarificationQuestion, type PersonaFileItem, type PersonaHealthInfo, type PersonaHitlActionRequest, type PersonaInterrupt, type PersonaMemoryAgentGroup, type PersonaMemoryFile, type PersonaMemoryList, type PersonaMessage, type PersonaPresentedFile, PersonaProvider, type PersonaProviderProps, type PersonaResumeValue, type PersonaRole, type PersonaStreamingEvent, type PersonaSubagentActivityEntry, type PersonaThread, type PersonaTodo, type PersonaToolCall, type PersonaWorkspaceFile, type SendMessageOverride, type UseChatOptions, VERSION, useAgents, useChat, useConnection, useFiles, useMemory, usePersonaContext, useThreads };