@sinas/sdk 0.2.1 → 0.2.2
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.
- package/dist/{chunk-EV5ARSUJ.js → chunk-HIZX5BQ5.js} +9 -2
- package/dist/chunk-HIZX5BQ5.js.map +1 -0
- package/dist/client.cjs +8 -1
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts +1 -0
- package/dist/client.d.ts +1 -0
- package/dist/client.js +1 -1
- package/dist/index.cjs +47 -26
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +40 -26
- package/dist/index.js.map +1 -1
- package/dist/sinas-sdk.umd.js +47 -26
- package/dist/sinas-sdk.umd.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-EV5ARSUJ.js.map +0 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/client/errors.ts","../src/client/SinasClient.ts","../src/client/queries.ts","../src/client/functions.ts","../src/client/states.ts","../src/client/chat.ts","../src/client/collections.ts","../src/hooks/useQuery.ts","../src/hooks/context.ts","../src/hooks/useExecute.ts","../src/hooks/useStateStore.ts","../src/hooks/useChat.ts","../src/hooks/useSinas.ts"],"sourcesContent":["// Client\nexport { SinasClient } from './client/SinasClient';\nexport { executeQuery } from './client/queries';\nexport { executeFunction } from './client/functions';\nexport { stateGet, stateSet, stateDelete, stateList } from './client/states';\nexport { createChat, sendMessage, streamMessage, getChat, approveToolCall, streamFromChannel } from './client/chat';\nexport { listCollections, listFiles } from './client/collections';\nexport {\n SinasError,\n SinasAuthError,\n SinasPermissionError,\n SinasNotFoundError,\n SinasTimeoutError,\n} from './client/errors';\n\n// Hooks\nexport { useQuery } from './hooks/useQuery';\nexport { useExecute } from './hooks/useExecute';\nexport { useStateStore } from './hooks/useStateStore';\nexport { useChat } from './hooks/useChat';\nexport { useSinas } from './hooks/useSinas';\nexport { SinasProvider } from './hooks/context';\n\n// Types\nexport type {\n SinasConfig,\n QueryResult,\n FunctionResult,\n StateGetResult,\n StateListResult,\n ChatCreateResult,\n ChatMessage,\n ChatMessageFull,\n ToolCallInfo,\n ChatDetail,\n ApprovalRequest,\n ApprovalResult,\n ContentPart,\n TextContentPart,\n ImageContentPart,\n AudioContentPart,\n FileContentPart,\n ComponentContentPart,\n MessageContent,\n SSEChunk,\n Collection,\n FileInfo,\n} from './client/types';\nexport type { UseQueryOptions, UseQueryResult } from './hooks/useQuery';\nexport type { UseExecuteResult } from './hooks/useExecute';\nexport type { UseStateStoreResult, UseStateStoreOptions } from './hooks/useStateStore';\nexport type { ChatSessionMessage, ToolStatus, UseChatResult, UseChatOptions } from './hooks/useChat';\nexport type { UseSinasResult } from './hooks/useSinas';\nexport type { SinasProviderProps } from './hooks/context';\n","export class SinasError extends Error {\n public readonly status: number;\n public readonly detail: string;\n\n constructor(message: string, status: number = 0, detail?: string) {\n super(message);\n this.name = 'SinasError';\n this.status = status;\n this.detail = detail || message;\n }\n}\n\nexport class SinasAuthError extends SinasError {\n constructor(message: string = 'Authentication required') {\n super(message, 401);\n this.name = 'SinasAuthError';\n }\n}\n\nexport class SinasPermissionError extends SinasError {\n constructor(message: string = 'Permission denied') {\n super(message, 403);\n this.name = 'SinasPermissionError';\n }\n}\n\nexport class SinasNotFoundError extends SinasError {\n constructor(resource: string) {\n super(`${resource} not found`, 404);\n this.name = 'SinasNotFoundError';\n }\n}\n\nexport class SinasTimeoutError extends SinasError {\n constructor(message: string = 'Request timed out') {\n super(message, 408);\n this.name = 'SinasTimeoutError';\n }\n}\n","import { SinasError, SinasAuthError, SinasPermissionError, SinasNotFoundError } from './errors';\nimport type { SinasConfig } from './types';\n\ndeclare global {\n interface Window {\n __SINAS_CONFIG__?: SinasConfig;\n __SINAS_AUTH_TOKEN__?: string | null;\n }\n}\n\nexport class SinasClient {\n private configOverride?: SinasConfig;\n\n constructor(config?: SinasConfig) {\n this.configOverride = config;\n }\n\n getConfig(): SinasConfig {\n const config = this.configOverride || window.__SINAS_CONFIG__;\n if (!config) {\n return {\n apiBase: '',\n component: { namespace: '', name: '', version: '' },\n resources: {\n enabledAgents: [],\n enabledFunctions: [],\n enabledQueries: [],\n enabledComponents: [],\n stateNamespacesReadonly: [],\n stateNamespacesReadwrite: [],\n },\n input: {},\n };\n }\n return config;\n }\n\n getInput(): Record<string, unknown> {\n return this.getConfig().input || {};\n }\n\n getAuthHeaders(): Record<string, string> {\n const token = window.__SINAS_AUTH_TOKEN__;\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n return headers;\n }\n\n getProxyBase(): string {\n const config = this.getConfig();\n const comp = config.component;\n return `${config.apiBase}/components/${comp.namespace}/${comp.name}/proxy`;\n }\n\n async fetch(url: string, options: RequestInit = {}): Promise<Response> {\n const res = await fetch(url, {\n ...options,\n headers: {\n ...this.getAuthHeaders(),\n ...(options.headers as Record<string, string> || {}),\n },\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({ detail: res.statusText }));\n const message = body.detail || body.message || res.statusText;\n\n if (res.status === 401) throw new SinasAuthError(message);\n if (res.status === 403) throw new SinasPermissionError(message);\n if (res.status === 404) throw new SinasNotFoundError(message);\n throw new SinasError(message, res.status);\n }\n\n return res;\n }\n}\n","import type { SinasClient } from './SinasClient';\nimport type { QueryResult } from './types';\n\nfunction parseRef(ref: string): [string, string] {\n const parts = ref.split('/');\n if (parts.length !== 2) {\n throw new Error(`Invalid query ref \"${ref}\": expected \"namespace/name\"`);\n }\n return [parts[0], parts[1]];\n}\n\nexport async function executeQuery(\n client: SinasClient,\n ref: string,\n input: Record<string, unknown> = {}\n): Promise<QueryResult> {\n const [ns, name] = parseRef(ref);\n const base = client.getProxyBase();\n const res = await client.fetch(`${base}/queries/${ns}/${name}/execute`, {\n method: 'POST',\n body: JSON.stringify({ input }),\n });\n const data = await res.json();\n return {\n success: data.success,\n operation: data.operation,\n data: data.data,\n rowCount: data.row_count,\n affectedRows: data.affected_rows,\n durationMs: data.duration_ms,\n };\n}\n","import type { SinasClient } from './SinasClient';\nimport type { FunctionResult } from './types';\n\nfunction parseRef(ref: string): [string, string] {\n const parts = ref.split('/');\n if (parts.length !== 2) {\n throw new Error(`Invalid function ref \"${ref}\": expected \"namespace/name\"`);\n }\n return [parts[0], parts[1]];\n}\n\nexport async function executeFunction(\n client: SinasClient,\n ref: string,\n input: Record<string, unknown> = {},\n timeout?: number\n): Promise<FunctionResult> {\n const [ns, name] = parseRef(ref);\n const base = client.getProxyBase();\n const body: Record<string, unknown> = { input };\n if (timeout !== undefined) {\n body.timeout = timeout;\n }\n const res = await client.fetch(`${base}/functions/${ns}/${name}/execute`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n const data = await res.json();\n return {\n status: data.status,\n executionId: data.execution_id,\n result: data.result,\n error: data.error,\n };\n}\n","import type { SinasClient } from './SinasClient';\nimport type { StateGetResult, StateListResult } from './types';\n\nexport async function stateGet(\n client: SinasClient,\n ns: string,\n key: string\n): Promise<StateGetResult> {\n const base = client.getProxyBase();\n const res = await client.fetch(`${base}/states/${ns}`, {\n method: 'POST',\n body: JSON.stringify({ action: 'get', key }),\n });\n return res.json();\n}\n\nexport async function stateSet(\n client: SinasClient,\n ns: string,\n key: string,\n value: unknown,\n visibility: 'private' | 'shared' = 'private'\n): Promise<void> {\n const base = client.getProxyBase();\n await client.fetch(`${base}/states/${ns}`, {\n method: 'POST',\n body: JSON.stringify({ action: 'set', key, value, visibility }),\n });\n}\n\nexport async function stateDelete(\n client: SinasClient,\n ns: string,\n key: string\n): Promise<void> {\n const base = client.getProxyBase();\n await client.fetch(`${base}/states/${ns}`, {\n method: 'POST',\n body: JSON.stringify({ action: 'delete', key }),\n });\n}\n\nexport async function stateList(\n client: SinasClient,\n ns: string\n): Promise<StateListResult> {\n const base = client.getProxyBase();\n const res = await client.fetch(`${base}/states/${ns}`, {\n method: 'POST',\n body: JSON.stringify({ action: 'list' }),\n });\n return res.json();\n}\n","import type { SinasClient } from './SinasClient';\nimport type { ChatCreateResult, ChatMessage, ChatDetail, ChatMessageFull, ApprovalResult, SSEChunk, MessageContent } from './types';\n\nexport async function createChat(\n client: SinasClient,\n agentRef: string,\n input?: Record<string, unknown>\n): Promise<ChatCreateResult> {\n const [ns, name] = agentRef.split('/');\n if (!ns || !name) {\n throw new Error(`Invalid agent ref \"${agentRef}\": expected \"namespace/name\"`);\n }\n const config = client.getConfig();\n const res = await client.fetch(`${config.apiBase}/agents/${ns}/${name}/chats`, {\n method: 'POST',\n body: JSON.stringify({ input: input || {} }),\n });\n const data = await res.json();\n return {\n id: data.id,\n agentNamespace: data.agent_namespace,\n agentName: data.agent_name,\n title: data.title,\n };\n}\n\nexport async function sendMessage(\n client: SinasClient,\n chatId: string,\n content: MessageContent\n): Promise<ChatMessage> {\n const config = client.getConfig();\n const res = await client.fetch(`${config.apiBase}/chats/${chatId}/messages`, {\n method: 'POST',\n body: JSON.stringify({ content }),\n });\n const data = await res.json();\n return {\n id: data.id,\n chatId: data.chat_id,\n role: data.role,\n content: data.content,\n createdAt: data.created_at,\n };\n}\n\nfunction mapMessage(data: Record<string, unknown>): ChatMessageFull {\n const toolCalls = data.tool_calls as ChatMessageFull['toolCalls'] | undefined;\n return {\n id: data.id as string,\n chatId: data.chat_id as string,\n role: data.role as ChatMessageFull['role'],\n content: (data.content as string) ?? null,\n toolCalls: toolCalls ?? null,\n toolCallId: (data.tool_call_id as string) ?? null,\n name: (data.name as string) ?? null,\n createdAt: data.created_at as string,\n };\n}\n\nexport async function getChat(\n client: SinasClient,\n chatId: string,\n): Promise<ChatDetail> {\n const config = client.getConfig();\n const res = await client.fetch(`${config.apiBase}/chats/${chatId}`);\n const data = await res.json();\n return {\n id: data.id,\n agentNamespace: data.agent_namespace,\n agentName: data.agent_name,\n title: data.title,\n messages: (data.messages || []).map(mapMessage),\n };\n}\n\nexport async function approveToolCall(\n client: SinasClient,\n chatId: string,\n toolCallId: string,\n approved: boolean,\n): Promise<ApprovalResult> {\n const config = client.getConfig();\n const res = await client.fetch(\n `${config.apiBase}/chats/${chatId}/approve-tool/${toolCallId}`,\n { method: 'POST', body: JSON.stringify({ approved }) },\n );\n const data = await res.json();\n return {\n status: data.status,\n toolCallId: data.tool_call_id,\n channelId: data.channel_id,\n };\n}\n\nexport function streamFromChannel(\n client: SinasClient,\n chatId: string,\n channelId: string,\n onChunk: (chunk: SSEChunk) => void,\n onDone?: () => void,\n onError?: (error: Error) => void,\n): AbortController {\n const controller = new AbortController();\n const config = client.getConfig();\n\n (async () => {\n try {\n const res = await fetch(\n `${config.apiBase}/chats/${chatId}/stream/${channelId}?last_id=0`,\n { headers: client.getAuthHeaders(), signal: controller.signal },\n );\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({ detail: res.statusText }));\n throw new Error(body.detail || 'Stream reconnect failed');\n }\n\n const reader = res.body!.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\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 { chunks, remaining } = parseSSE(buffer);\n buffer = remaining;\n\n for (const chunk of chunks) {\n onChunk(chunk);\n if (chunk.event === 'done') {\n onDone?.();\n return;\n }\n }\n }\n\n if (buffer.trim()) {\n const { chunks } = parseSSE(buffer + '\\n\\n');\n for (const chunk of chunks) {\n onChunk(chunk);\n }\n }\n\n onDone?.();\n } catch (err) {\n if ((err as Error).name === 'AbortError') return;\n onError?.(err as Error);\n }\n })();\n\n return controller;\n}\n\nfunction parseSSE(buffer: string): { chunks: SSEChunk[]; remaining: string } {\n const chunks: SSEChunk[] = [];\n const lines = buffer.split('\\n');\n let event = '';\n let data = '';\n let remaining = '';\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n // If last line and doesn't end with newline, it's incomplete\n if (i === lines.length - 1 && !buffer.endsWith('\\n')) {\n remaining = line;\n break;\n }\n\n if (line.startsWith('event:')) {\n event = line.slice(6).trim();\n } else if (line.startsWith('data:')) {\n data = line.slice(5).trim();\n } else if (line === '') {\n if (event || data) {\n chunks.push({ event: event || 'message', data });\n event = '';\n data = '';\n }\n }\n }\n\n return { chunks, remaining };\n}\n\nexport function streamMessage(\n client: SinasClient,\n chatId: string,\n content: MessageContent,\n onChunk: (chunk: SSEChunk) => void,\n onDone?: () => void,\n onError?: (error: Error) => void\n): AbortController {\n const controller = new AbortController();\n const config = client.getConfig();\n\n (async () => {\n try {\n const res = await fetch(`${config.apiBase}/chats/${chatId}/messages/stream`, {\n method: 'POST',\n headers: client.getAuthHeaders(),\n body: JSON.stringify({ content }),\n signal: controller.signal,\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({ detail: res.statusText }));\n throw new Error(body.detail || 'Stream request failed');\n }\n\n const reader = res.body!.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\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 { chunks, remaining } = parseSSE(buffer);\n buffer = remaining;\n\n for (const chunk of chunks) {\n onChunk(chunk);\n if (chunk.event === 'done') {\n onDone?.();\n return;\n }\n }\n }\n\n // Process any remaining buffer\n if (buffer.trim()) {\n const { chunks } = parseSSE(buffer + '\\n\\n');\n for (const chunk of chunks) {\n onChunk(chunk);\n }\n }\n\n onDone?.();\n } catch (err) {\n if ((err as Error).name === 'AbortError') return;\n onError?.(err as Error);\n }\n })();\n\n return controller;\n}\n","import type { SinasClient } from './SinasClient';\nimport type { Collection, FileInfo } from './types';\n\nexport async function listCollections(client: SinasClient): Promise<Collection[]> {\n const base = client.getProxyBase();\n const res = await client.fetch(`${base}/collections`);\n return res.json();\n}\n\nexport async function listFiles(\n client: SinasClient,\n namespace: string,\n collection: string\n): Promise<FileInfo[]> {\n const base = client.getProxyBase();\n const res = await client.fetch(`${base}/files/${namespace}/${collection}`);\n return res.json();\n}\n","import React from 'react';\nimport { executeQuery } from '../client/queries';\nimport { useClient } from './context';\nimport type { QueryResult } from '../client/types';\n\nexport interface UseQueryOptions {\n enabled?: boolean;\n refetchInterval?: number | null;\n}\n\nexport interface UseQueryResult {\n data: Record<string, unknown>[] | null;\n loading: boolean;\n error: string | null;\n rowCount: number | null;\n refetch: (overrideInput?: Record<string, unknown>) => Promise<QueryResult | undefined>;\n}\n\nexport function useQuery(\n ref: string,\n input: Record<string, unknown> = {},\n options: UseQueryOptions = {}\n): UseQueryResult {\n const client = useClient();\n const { enabled = true, refetchInterval = null } = options;\n\n const [data, setData] = React.useState<Record<string, unknown>[] | null>(null);\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const [rowCount, setRowCount] = React.useState<number | null>(null);\n\n const abortRef = React.useRef<AbortController | null>(null);\n const inputJson = JSON.stringify(input);\n\n const execute = React.useCallback(\n async (overrideInput?: Record<string, unknown>) => {\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n\n setLoading(true);\n setError(null);\n try {\n const result = await executeQuery(\n client,\n ref,\n overrideInput || JSON.parse(inputJson)\n );\n if (!controller.signal.aborted) {\n setData(result.data || null);\n setRowCount(result.rowCount ?? result.affectedRows ?? null);\n }\n return result;\n } catch (e) {\n if (!controller.signal.aborted) {\n setError((e as Error).message);\n }\n } finally {\n if (!controller.signal.aborted) {\n setLoading(false);\n }\n }\n },\n [client, ref, inputJson]\n );\n\n React.useEffect(() => {\n if (enabled) {\n execute();\n }\n return () => {\n abortRef.current?.abort();\n };\n }, [enabled, execute]);\n\n React.useEffect(() => {\n if (refetchInterval && enabled) {\n const id = setInterval(execute, refetchInterval);\n return () => clearInterval(id);\n }\n }, [refetchInterval, enabled, execute]);\n\n return { data, loading, error, rowCount, refetch: execute };\n}\n","import React from 'react';\nimport { SinasClient } from '../client/SinasClient';\n\nconst SinasContext = React.createContext<SinasClient | null>(null);\n\nexport interface SinasProviderProps {\n client?: SinasClient;\n children: React.ReactNode;\n}\n\nexport function SinasProvider({ client, children }: SinasProviderProps) {\n const value = React.useMemo(() => client || new SinasClient(), [client]);\n return React.createElement(SinasContext.Provider, { value }, children);\n}\n\nexport function useClient(): SinasClient {\n const client = React.useContext(SinasContext);\n if (client) return client;\n // Fallback: create a default client using window globals\n return defaultClient;\n}\n\nconst defaultClient = new SinasClient();\n","import React from 'react';\nimport { executeFunction } from '../client/functions';\nimport { useClient } from './context';\nimport type { FunctionResult } from '../client/types';\n\nexport interface UseExecuteResult {\n execute: (input?: Record<string, unknown>, timeout?: number) => Promise<FunctionResult | undefined>;\n result: unknown;\n loading: boolean;\n error: string | null;\n executionId: string | null;\n}\n\nexport function useExecute(ref: string): UseExecuteResult {\n const client = useClient();\n\n const [result, setResult] = React.useState<unknown>(null);\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const [executionId, setExecutionId] = React.useState<string | null>(null);\n\n const execute = React.useCallback(\n async (input: Record<string, unknown> = {}, timeout?: number) => {\n setLoading(true);\n setError(null);\n try {\n const data = await executeFunction(client, ref, input, timeout);\n setResult(data.result);\n setExecutionId(data.executionId);\n if (data.status === 'error') {\n setError(data.error || 'Function execution failed');\n } else if (data.status === 'timeout') {\n setError('Function execution timed out');\n }\n return data;\n } catch (e) {\n setError((e as Error).message);\n } finally {\n setLoading(false);\n }\n },\n [client, ref]\n );\n\n return { execute, result, loading, error, executionId };\n}\n","import React from 'react';\nimport { stateGet, stateSet, stateDelete, stateList } from '../client/states';\nimport { useClient } from './context';\nimport type { StateListResult } from '../client/types';\n\nexport interface UseStateStoreOptions {\n visibility?: 'private' | 'shared';\n}\n\nexport interface UseStateStoreResult {\n value: unknown;\n loading: boolean;\n error: string | null;\n save: (value: unknown, opts?: UseStateStoreOptions) => Promise<void>;\n remove: () => Promise<void>;\n refetch: () => Promise<void>;\n list: () => Promise<StateListResult | undefined>;\n}\n\nexport function useStateStore(ns: string, key?: string): UseStateStoreResult {\n const client = useClient();\n\n const [value, setValue] = React.useState<unknown>(null);\n const [loading, setLoading] = React.useState(true);\n const [error, setError] = React.useState<string | null>(null);\n\n const load = React.useCallback(async () => {\n if (!key) {\n setLoading(false);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const result = await stateGet(client, ns, key);\n if (result.found) {\n setValue(result.value);\n } else {\n setValue(null);\n }\n } catch (e) {\n setError((e as Error).message);\n } finally {\n setLoading(false);\n }\n }, [client, ns, key]);\n\n const save = React.useCallback(\n async (newValue: unknown, opts?: UseStateStoreOptions) => {\n if (!key) throw new Error('Cannot save without a key');\n setValue(newValue);\n setError(null);\n try {\n await stateSet(client, ns, key, newValue, opts?.visibility);\n } catch (e) {\n setError((e as Error).message);\n throw e;\n }\n },\n [client, ns, key]\n );\n\n const remove = React.useCallback(async () => {\n if (!key) throw new Error('Cannot delete without a key');\n setValue(null);\n setError(null);\n try {\n await stateDelete(client, ns, key);\n } catch (e) {\n setError((e as Error).message);\n throw e;\n }\n }, [client, ns, key]);\n\n const list = React.useCallback(async () => {\n setError(null);\n try {\n return await stateList(client, ns);\n } catch (e) {\n setError((e as Error).message);\n }\n }, [client, ns]);\n\n React.useEffect(() => {\n load();\n }, [load]);\n\n return { value, loading, error, save, remove, refetch: load, list };\n}\n","import React from 'react';\nimport { createChat, getChat, streamMessage, approveToolCall, streamFromChannel } from '../client/chat';\nimport { useClient } from './context';\nimport type { ChatMessageFull, ApprovalRequest, SSEChunk, MessageContent } from '../client/types';\n\nexport interface ChatSessionMessage extends ChatMessageFull {\n /** True while streaming content is being appended */\n streaming?: boolean;\n}\n\nexport interface ToolStatus {\n toolCallId: string;\n name: string;\n description: string;\n status: 'running' | 'complete';\n}\n\nexport interface UseChatResult {\n chatId: string | null;\n messages: ChatSessionMessage[];\n loading: boolean;\n streaming: boolean;\n error: string | null;\n pendingApprovals: ApprovalRequest[];\n toolStatus: ToolStatus[];\n send: (content: MessageContent) => void;\n approve: (toolCallId: string) => void;\n reject: (toolCallId: string) => void;\n stop: () => void;\n clearError: () => void;\n}\n\nexport interface UseChatOptions {\n chatId?: string;\n input?: Record<string, unknown>;\n}\n\nexport function useChat(\n agentRef: string,\n options?: UseChatOptions,\n): UseChatResult {\n const client = useClient();\n\n const [chatId, setChatId] = React.useState<string | null>(options?.chatId ?? null);\n const [messages, setMessages] = React.useState<ChatSessionMessage[]>([]);\n const [loading, setLoading] = React.useState(false);\n const [streaming, setStreaming] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const [pendingApprovals, setPendingApprovals] = React.useState<ApprovalRequest[]>([]);\n const [toolStatus, setToolStatus] = React.useState<ToolStatus[]>([]);\n\n const abortRef = React.useRef<AbortController | null>(null);\n const chatIdRef = React.useRef<string | null>(chatId);\n chatIdRef.current = chatId;\n const activeAssistantIdRef = React.useRef<string>('');\n\n // Load existing chat on mount if chatId provided\n React.useEffect(() => {\n if (!options?.chatId) return;\n let cancelled = false;\n\n setLoading(true);\n getChat(client, options.chatId)\n .then((detail) => {\n if (cancelled) return;\n setChatId(detail.id);\n setMessages(detail.messages);\n })\n .catch((e) => {\n if (cancelled) return;\n setError((e as Error).message);\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n\n return () => { cancelled = true; };\n }, [client, options?.chatId]);\n\n // Cleanup on unmount\n React.useEffect(() => {\n return () => {\n abortRef.current?.abort();\n };\n }, []);\n\n const handleStreamChunks = React.useCallback(\n (chunk: SSEChunk) => {\n if (chunk.event === 'message') {\n try {\n const parsed = JSON.parse(chunk.data);\n if (parsed.content) {\n const targetId = activeAssistantIdRef.current;\n setMessages((prev) =>\n prev.map((m) =>\n m.id === targetId\n ? { ...m, content: (m.content || '') + parsed.content }\n : m,\n ),\n );\n }\n } catch {\n // Non-JSON content chunk — append raw data\n const targetId = activeAssistantIdRef.current;\n setMessages((prev) =>\n prev.map((m) =>\n m.id === targetId\n ? { ...m, content: (m.content || '') + chunk.data }\n : m,\n ),\n );\n }\n } else if (chunk.event === 'tool_start') {\n try {\n const parsed = JSON.parse(chunk.data);\n setToolStatus((prev) => [\n ...prev,\n { toolCallId: parsed.tool_call_id, name: parsed.name, description: parsed.description, status: 'running' },\n ]);\n // Remove the empty streaming placeholder and inject tool call message\n const placeholderId = activeAssistantIdRef.current;\n const toolCallMsg: ChatSessionMessage = {\n id: `tmp-tc-${parsed.tool_call_id}`,\n chatId: chatIdRef.current || '',\n role: 'assistant',\n content: null,\n toolCalls: [{\n id: parsed.tool_call_id,\n type: 'function',\n function: { name: parsed.name, arguments: parsed.arguments || '{}' },\n }],\n toolCallId: null,\n name: null,\n createdAt: new Date().toISOString(),\n };\n setMessages((prev) => {\n // Remove empty placeholder (no content accumulated yet)\n const filtered = prev.filter((m) =>\n !(m.id === placeholderId && m.streaming && !m.content),\n );\n return [...filtered, toolCallMsg];\n });\n } catch {\n // ignore malformed tool_start events\n }\n } else if (chunk.event === 'tool_end') {\n try {\n const parsed = JSON.parse(chunk.data);\n setToolStatus((prev) =>\n prev.map((t) => t.toolCallId === parsed.tool_call_id ? { ...t, status: 'complete' } : t),\n );\n // Inject tool result message into messages\n if (parsed.result !== undefined) {\n const toolResultMsg: ChatSessionMessage = {\n id: `tmp-tr-${parsed.tool_call_id}`,\n chatId: chatIdRef.current || '',\n role: 'tool',\n content: typeof parsed.result === 'string' ? parsed.result : JSON.stringify(parsed.result),\n toolCalls: null,\n toolCallId: parsed.tool_call_id,\n name: parsed.name,\n createdAt: new Date().toISOString(),\n };\n setMessages((prev) => [...prev, toolResultMsg]);\n }\n // Create new assistant message for follow-up LLM content after tool execution\n setToolStatus((currentStatus) => {\n const stillRunning = currentStatus.filter((t) => t.status === 'running');\n if (stillRunning.length === 0) {\n const newAssistantId = `tmp-assistant-${Date.now()}`;\n activeAssistantIdRef.current = newAssistantId;\n const newMsg: ChatSessionMessage = {\n id: newAssistantId,\n chatId: chatIdRef.current || '',\n role: 'assistant',\n content: '',\n toolCalls: null,\n toolCallId: null,\n name: null,\n createdAt: new Date().toISOString(),\n streaming: true,\n };\n setMessages((prev) => [...prev, newMsg]);\n }\n return currentStatus;\n });\n } catch {\n // ignore malformed tool_end events\n }\n } else if (chunk.event === 'approval_required') {\n try {\n const parsed = JSON.parse(chunk.data) as ApprovalRequest;\n setPendingApprovals((prev) => [...prev, parsed]);\n } catch {\n // ignore malformed approval events\n }\n } else if (chunk.event === 'error') {\n try {\n const parsed = JSON.parse(chunk.data);\n setError(parsed.error || 'Stream error');\n } catch {\n setError(chunk.data || 'Stream error');\n }\n }\n },\n [],\n );\n\n const refreshMessages = React.useCallback(\n async (id: string) => {\n try {\n const detail = await getChat(client, id);\n setMessages(detail.messages);\n } catch {\n // Refresh is best-effort — streaming content already visible\n }\n },\n [client],\n );\n\n const send = React.useCallback(\n (content: MessageContent) => {\n const doSend = async () => {\n let activeChatId = chatIdRef.current;\n\n // Auto-create chat on first send\n if (!activeChatId) {\n setLoading(true);\n setError(null);\n try {\n const result = await createChat(client, agentRef, options?.input);\n activeChatId = result.id;\n setChatId(result.id);\n chatIdRef.current = result.id;\n } catch (e) {\n setError((e as Error).message);\n setLoading(false);\n return;\n }\n setLoading(false);\n }\n\n abortRef.current?.abort();\n setStreaming(true);\n setError(null);\n setPendingApprovals([]);\n setToolStatus([]);\n\n // Add user message optimistically\n const displayContent = typeof content === 'string' ? content : JSON.stringify(content);\n const userMsg: ChatSessionMessage = {\n id: `tmp-user-${Date.now()}`,\n chatId: activeChatId,\n role: 'user',\n content: displayContent,\n toolCalls: null,\n toolCallId: null,\n name: null,\n createdAt: new Date().toISOString(),\n };\n setMessages((prev) => [...prev, userMsg]);\n\n // Add empty assistant message to accumulate streaming content\n const assistantId = `tmp-assistant-${Date.now()}`;\n activeAssistantIdRef.current = assistantId;\n const assistantMsg: ChatSessionMessage = {\n id: assistantId,\n chatId: activeChatId,\n role: 'assistant',\n content: '',\n toolCalls: null,\n toolCallId: null,\n name: null,\n createdAt: new Date().toISOString(),\n streaming: true,\n };\n setMessages((prev) => [...prev, assistantMsg]);\n\n const controller = streamMessage(\n client,\n activeChatId,\n content,\n handleStreamChunks,\n () => {\n setStreaming(false);\n setToolStatus([]);\n // Refresh to get authoritative server state (tool calls, tool responses)\n refreshMessages(activeChatId!);\n },\n (err: Error) => {\n setError(err.message);\n setStreaming(false);\n setToolStatus([]);\n },\n );\n\n abortRef.current = controller;\n };\n\n doSend();\n },\n [client, agentRef, options?.input, handleStreamChunks, refreshMessages],\n );\n\n const handleApproval = React.useCallback(\n (toolCallId: string, approved: boolean) => {\n const currentChatId = chatIdRef.current;\n if (!currentChatId) return;\n\n setPendingApprovals((prev) => prev.filter((a) => a.toolCallId !== toolCallId));\n setStreaming(true);\n setError(null);\n\n // Add placeholder assistant message for the resumed stream\n const assistantId = `tmp-resume-${Date.now()}`;\n activeAssistantIdRef.current = assistantId;\n if (approved) {\n const assistantMsg: ChatSessionMessage = {\n id: assistantId,\n chatId: currentChatId,\n role: 'assistant',\n content: '',\n toolCalls: null,\n toolCallId: null,\n name: null,\n createdAt: new Date().toISOString(),\n streaming: true,\n };\n setMessages((prev) => [...prev, assistantMsg]);\n }\n\n (async () => {\n try {\n const result = await approveToolCall(client, currentChatId, toolCallId, approved);\n\n if (!approved) {\n setStreaming(false);\n refreshMessages(currentChatId);\n return;\n }\n\n // Connect to resume stream\n const controller = streamFromChannel(\n client,\n currentChatId,\n result.channelId,\n handleStreamChunks,\n () => {\n setStreaming(false);\n setToolStatus([]);\n refreshMessages(currentChatId);\n },\n (err: Error) => {\n setError(err.message);\n setStreaming(false);\n setToolStatus([]);\n },\n );\n\n abortRef.current = controller;\n } catch (e) {\n setError((e as Error).message);\n setStreaming(false);\n }\n })();\n },\n [client, handleStreamChunks, refreshMessages],\n );\n\n const approve = React.useCallback(\n (toolCallId: string) => handleApproval(toolCallId, true),\n [handleApproval],\n );\n\n const reject = React.useCallback(\n (toolCallId: string) => handleApproval(toolCallId, false),\n [handleApproval],\n );\n\n const stop = React.useCallback(() => {\n abortRef.current?.abort();\n abortRef.current = null;\n setStreaming(false);\n }, []);\n\n const clearError = React.useCallback(() => {\n setError(null);\n }, []);\n\n return {\n chatId,\n messages,\n loading,\n streaming,\n error,\n pendingApprovals,\n toolStatus,\n send,\n approve,\n reject,\n stop,\n clearError,\n };\n}\n","import { useClient } from './context';\nimport { useQuery } from './useQuery';\nimport { useExecute } from './useExecute';\nimport { useStateStore } from './useStateStore';\nimport { useChat } from './useChat';\nimport type { SinasConfig } from '../client/types';\nimport type { SinasClient } from '../client/SinasClient';\n\nexport interface UseSinasResult {\n config: SinasConfig;\n input: Record<string, unknown>;\n client: SinasClient;\n useQuery: typeof useQuery;\n useExecute: typeof useExecute;\n useStateStore: typeof useStateStore;\n useChat: typeof useChat;\n}\n\nexport function useSinas(): UseSinasResult {\n const client = useClient();\n\n return {\n config: client.getConfig(),\n input: client.getInput(),\n client,\n useQuery,\n useExecute,\n useStateStore,\n useChat,\n };\n}\n"],"mappings":"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","names":["parseRef","import_react","React","React","import_react","React","import_react","React","import_react","React"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/client/errors.ts","../src/client/SinasClient.ts","../src/client/queries.ts","../src/client/functions.ts","../src/client/states.ts","../src/client/chat.ts","../src/client/collections.ts","../src/hooks/useQuery.ts","../src/hooks/context.ts","../src/hooks/useExecute.ts","../src/hooks/useStateStore.ts","../src/hooks/useChat.ts","../src/hooks/useSinas.ts"],"sourcesContent":["// Client\nexport { SinasClient } from './client/SinasClient';\nexport { executeQuery } from './client/queries';\nexport { executeFunction } from './client/functions';\nexport { stateGet, stateSet, stateDelete, stateList } from './client/states';\nexport { createChat, sendMessage, streamMessage, getChat, approveToolCall, streamFromChannel } from './client/chat';\nexport { listCollections, listFiles } from './client/collections';\nexport {\n SinasError,\n SinasAuthError,\n SinasPermissionError,\n SinasNotFoundError,\n SinasTimeoutError,\n} from './client/errors';\n\n// Hooks\nexport { useQuery } from './hooks/useQuery';\nexport { useExecute } from './hooks/useExecute';\nexport { useStateStore } from './hooks/useStateStore';\nexport { useChat } from './hooks/useChat';\nexport { useSinas } from './hooks/useSinas';\nexport { SinasProvider } from './hooks/context';\n\n// Types\nexport type {\n SinasConfig,\n QueryResult,\n FunctionResult,\n StateGetResult,\n StateListResult,\n ChatCreateResult,\n ChatMessage,\n ChatMessageFull,\n ToolCallInfo,\n ChatDetail,\n ApprovalRequest,\n ApprovalResult,\n ContentPart,\n TextContentPart,\n ImageContentPart,\n AudioContentPart,\n FileContentPart,\n ComponentContentPart,\n MessageContent,\n SSEChunk,\n Collection,\n FileInfo,\n} from './client/types';\nexport type { UseQueryOptions, UseQueryResult } from './hooks/useQuery';\nexport type { UseExecuteResult } from './hooks/useExecute';\nexport type { UseStateStoreResult, UseStateStoreOptions } from './hooks/useStateStore';\nexport type { ChatSessionMessage, ToolStatus, UseChatResult, UseChatOptions } from './hooks/useChat';\nexport type { UseSinasResult } from './hooks/useSinas';\nexport type { SinasProviderProps } from './hooks/context';\n","export class SinasError extends Error {\n public readonly status: number;\n public readonly detail: string;\n\n constructor(message: string, status: number = 0, detail?: string) {\n super(message);\n this.name = 'SinasError';\n this.status = status;\n this.detail = detail || message;\n }\n}\n\nexport class SinasAuthError extends SinasError {\n constructor(message: string = 'Authentication required') {\n super(message, 401);\n this.name = 'SinasAuthError';\n }\n}\n\nexport class SinasPermissionError extends SinasError {\n constructor(message: string = 'Permission denied') {\n super(message, 403);\n this.name = 'SinasPermissionError';\n }\n}\n\nexport class SinasNotFoundError extends SinasError {\n constructor(resource: string) {\n super(`${resource} not found`, 404);\n this.name = 'SinasNotFoundError';\n }\n}\n\nexport class SinasTimeoutError extends SinasError {\n constructor(message: string = 'Request timed out') {\n super(message, 408);\n this.name = 'SinasTimeoutError';\n }\n}\n","import { SinasError, SinasAuthError, SinasPermissionError, SinasNotFoundError } from './errors';\nimport type { SinasConfig } from './types';\n\ndeclare global {\n interface Window {\n __SINAS_CONFIG__?: SinasConfig;\n __SINAS_AUTH_TOKEN__?: string | null;\n }\n}\n\nexport class SinasClient {\n private configOverride?: SinasConfig;\n\n constructor(config?: SinasConfig) {\n this.configOverride = config;\n }\n\n getConfig(): SinasConfig {\n const config = this.configOverride || window.__SINAS_CONFIG__;\n if (!config) {\n return {\n apiBase: '',\n component: { namespace: '', name: '', version: '' },\n resources: {\n enabledAgents: [],\n enabledFunctions: [],\n enabledQueries: [],\n enabledComponents: [],\n stateNamespacesReadonly: [],\n stateNamespacesReadwrite: [],\n },\n input: {},\n };\n }\n return config;\n }\n\n getInput(): Record<string, unknown> {\n return this.getConfig().input || {};\n }\n\n getAuthHeaders(): Record<string, string> {\n const token = window.__SINAS_AUTH_TOKEN__;\n const headers: Record<string, string> = { 'Content-Type': 'application/json' };\n if (token) {\n headers['Authorization'] = `Bearer ${token}`;\n }\n return headers;\n }\n\n getProxyBase(): string {\n const config = this.getConfig();\n const comp = config.component;\n return `${config.apiBase}/components/${comp.namespace}/${comp.name}/proxy`;\n }\n\n async fetch(url: string, options: RequestInit = {}): Promise<Response> {\n const res = await fetch(url, {\n ...options,\n headers: {\n ...this.getAuthHeaders(),\n ...(options.headers as Record<string, string> || {}),\n },\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({ detail: res.statusText }));\n const message = body.detail || body.message || res.statusText;\n\n if (res.status === 401) throw new SinasAuthError(message);\n if (res.status === 403) throw new SinasPermissionError(message);\n if (res.status === 404) throw new SinasNotFoundError(message);\n throw new SinasError(message, res.status);\n }\n\n return res;\n }\n}\n","import type { SinasClient } from './SinasClient';\nimport type { QueryResult } from './types';\n\nfunction parseRef(ref: string): [string, string] {\n const parts = ref.split('/');\n if (parts.length !== 2) {\n throw new Error(`Invalid query ref \"${ref}\": expected \"namespace/name\"`);\n }\n return [parts[0], parts[1]];\n}\n\nexport async function executeQuery(\n client: SinasClient,\n ref: string,\n input: Record<string, unknown> = {}\n): Promise<QueryResult> {\n const [ns, name] = parseRef(ref);\n const base = client.getProxyBase();\n const res = await client.fetch(`${base}/queries/${ns}/${name}/execute`, {\n method: 'POST',\n body: JSON.stringify({ input }),\n });\n const data = await res.json();\n return {\n success: data.success,\n operation: data.operation,\n data: data.data,\n rowCount: data.row_count,\n affectedRows: data.affected_rows,\n durationMs: data.duration_ms,\n };\n}\n","import type { SinasClient } from './SinasClient';\nimport type { FunctionResult } from './types';\n\nfunction parseRef(ref: string): [string, string] {\n const parts = ref.split('/');\n if (parts.length !== 2) {\n throw new Error(`Invalid function ref \"${ref}\": expected \"namespace/name\"`);\n }\n return [parts[0], parts[1]];\n}\n\nexport async function executeFunction(\n client: SinasClient,\n ref: string,\n input: Record<string, unknown> = {},\n timeout?: number\n): Promise<FunctionResult> {\n const [ns, name] = parseRef(ref);\n const base = client.getProxyBase();\n const body: Record<string, unknown> = { input };\n if (timeout !== undefined) {\n body.timeout = timeout;\n }\n const res = await client.fetch(`${base}/functions/${ns}/${name}/execute`, {\n method: 'POST',\n body: JSON.stringify(body),\n });\n const data = await res.json();\n return {\n status: data.status,\n executionId: data.execution_id,\n result: data.result,\n error: data.error,\n };\n}\n","import type { SinasClient } from './SinasClient';\nimport type { StateGetResult, StateListResult } from './types';\n\nexport async function stateGet(\n client: SinasClient,\n ns: string,\n key: string\n): Promise<StateGetResult> {\n const base = client.getProxyBase();\n const res = await client.fetch(`${base}/states/${ns}`, {\n method: 'POST',\n body: JSON.stringify({ action: 'get', key }),\n });\n return res.json();\n}\n\nexport async function stateSet(\n client: SinasClient,\n ns: string,\n key: string,\n value: unknown,\n visibility: 'private' | 'shared' = 'private'\n): Promise<void> {\n const base = client.getProxyBase();\n await client.fetch(`${base}/states/${ns}`, {\n method: 'POST',\n body: JSON.stringify({ action: 'set', key, value, visibility }),\n });\n}\n\nexport async function stateDelete(\n client: SinasClient,\n ns: string,\n key: string\n): Promise<void> {\n const base = client.getProxyBase();\n await client.fetch(`${base}/states/${ns}`, {\n method: 'POST',\n body: JSON.stringify({ action: 'delete', key }),\n });\n}\n\nexport async function stateList(\n client: SinasClient,\n ns: string\n): Promise<StateListResult> {\n const base = client.getProxyBase();\n const res = await client.fetch(`${base}/states/${ns}`, {\n method: 'POST',\n body: JSON.stringify({ action: 'list' }),\n });\n return res.json();\n}\n","import type { SinasClient } from './SinasClient';\nimport type { ChatCreateResult, ChatMessage, ChatDetail, ChatMessageFull, ApprovalRequest, ApprovalResult, SSEChunk, MessageContent } from './types';\n\nexport async function createChat(\n client: SinasClient,\n agentRef: string,\n input?: Record<string, unknown>\n): Promise<ChatCreateResult> {\n const [ns, name] = agentRef.split('/');\n if (!ns || !name) {\n throw new Error(`Invalid agent ref \"${agentRef}\": expected \"namespace/name\"`);\n }\n const config = client.getConfig();\n const res = await client.fetch(`${config.apiBase}/agents/${ns}/${name}/chats`, {\n method: 'POST',\n body: JSON.stringify({ input: input || {} }),\n });\n const data = await res.json();\n return {\n id: data.id,\n agentNamespace: data.agent_namespace,\n agentName: data.agent_name,\n title: data.title,\n };\n}\n\nexport async function sendMessage(\n client: SinasClient,\n chatId: string,\n content: MessageContent\n): Promise<ChatMessage> {\n const config = client.getConfig();\n const res = await client.fetch(`${config.apiBase}/chats/${chatId}/messages`, {\n method: 'POST',\n body: JSON.stringify({ content }),\n });\n const data = await res.json();\n return {\n id: data.id,\n chatId: data.chat_id,\n role: data.role,\n content: data.content,\n createdAt: data.created_at,\n };\n}\n\nfunction mapMessage(data: Record<string, unknown>): ChatMessageFull {\n const toolCalls = data.tool_calls as ChatMessageFull['toolCalls'] | undefined;\n return {\n id: data.id as string,\n chatId: data.chat_id as string,\n role: data.role as ChatMessageFull['role'],\n content: (data.content as string) ?? null,\n toolCalls: toolCalls ?? null,\n toolCallId: (data.tool_call_id as string) ?? null,\n name: (data.name as string) ?? null,\n createdAt: data.created_at as string,\n };\n}\n\nexport async function getChat(\n client: SinasClient,\n chatId: string,\n): Promise<ChatDetail> {\n const config = client.getConfig();\n const res = await client.fetch(`${config.apiBase}/chats/${chatId}`);\n const data = await res.json();\n return {\n id: data.id,\n agentNamespace: data.agent_namespace,\n agentName: data.agent_name,\n title: data.title,\n messages: (data.messages || []).map(mapMessage),\n pendingApprovals: (data.pending_approvals || []).map((pa: Record<string, unknown>): ApprovalRequest => ({\n type: 'approval_required',\n toolCallId: pa.tool_call_id as string,\n functionNamespace: pa.function_namespace as string,\n functionName: pa.function_name as string,\n arguments: (pa.arguments as Record<string, unknown>) || {},\n })),\n };\n}\n\nexport async function approveToolCall(\n client: SinasClient,\n chatId: string,\n toolCallId: string,\n approved: boolean,\n): Promise<ApprovalResult> {\n const config = client.getConfig();\n const res = await client.fetch(\n `${config.apiBase}/chats/${chatId}/approve-tool/${toolCallId}`,\n { method: 'POST', body: JSON.stringify({ approved }) },\n );\n const data = await res.json();\n return {\n status: data.status,\n toolCallId: data.tool_call_id,\n channelId: data.channel_id,\n };\n}\n\nexport function streamFromChannel(\n client: SinasClient,\n chatId: string,\n channelId: string,\n onChunk: (chunk: SSEChunk) => void,\n onDone?: () => void,\n onError?: (error: Error) => void,\n): AbortController {\n const controller = new AbortController();\n const config = client.getConfig();\n\n (async () => {\n try {\n const res = await fetch(\n `${config.apiBase}/chats/${chatId}/stream/${channelId}?last_id=0`,\n { headers: client.getAuthHeaders(), signal: controller.signal },\n );\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({ detail: res.statusText }));\n throw new Error(body.detail || 'Stream reconnect failed');\n }\n\n const reader = res.body!.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\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 { chunks, remaining } = parseSSE(buffer);\n buffer = remaining;\n\n for (const chunk of chunks) {\n onChunk(chunk);\n if (chunk.event === 'done') {\n onDone?.();\n return;\n }\n }\n }\n\n if (buffer.trim()) {\n const { chunks } = parseSSE(buffer + '\\n\\n');\n for (const chunk of chunks) {\n onChunk(chunk);\n }\n }\n\n onDone?.();\n } catch (err) {\n if ((err as Error).name === 'AbortError') return;\n onError?.(err as Error);\n }\n })();\n\n return controller;\n}\n\nfunction parseSSE(buffer: string): { chunks: SSEChunk[]; remaining: string } {\n const chunks: SSEChunk[] = [];\n const lines = buffer.split('\\n');\n let event = '';\n let data = '';\n let remaining = '';\n\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n\n // If last line and doesn't end with newline, it's incomplete\n if (i === lines.length - 1 && !buffer.endsWith('\\n')) {\n remaining = line;\n break;\n }\n\n if (line.startsWith('event:')) {\n event = line.slice(6).trim();\n } else if (line.startsWith('data:')) {\n data = line.slice(5).trim();\n } else if (line === '') {\n if (event || data) {\n chunks.push({ event: event || 'message', data });\n event = '';\n data = '';\n }\n }\n }\n\n return { chunks, remaining };\n}\n\nexport function streamMessage(\n client: SinasClient,\n chatId: string,\n content: MessageContent,\n onChunk: (chunk: SSEChunk) => void,\n onDone?: () => void,\n onError?: (error: Error) => void\n): AbortController {\n const controller = new AbortController();\n const config = client.getConfig();\n\n (async () => {\n try {\n const res = await fetch(`${config.apiBase}/chats/${chatId}/messages/stream`, {\n method: 'POST',\n headers: client.getAuthHeaders(),\n body: JSON.stringify({ content }),\n signal: controller.signal,\n });\n\n if (!res.ok) {\n const body = await res.json().catch(() => ({ detail: res.statusText }));\n throw new Error(body.detail || 'Stream request failed');\n }\n\n const reader = res.body!.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\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 { chunks, remaining } = parseSSE(buffer);\n buffer = remaining;\n\n for (const chunk of chunks) {\n onChunk(chunk);\n if (chunk.event === 'done') {\n onDone?.();\n return;\n }\n }\n }\n\n // Process any remaining buffer\n if (buffer.trim()) {\n const { chunks } = parseSSE(buffer + '\\n\\n');\n for (const chunk of chunks) {\n onChunk(chunk);\n }\n }\n\n onDone?.();\n } catch (err) {\n if ((err as Error).name === 'AbortError') return;\n onError?.(err as Error);\n }\n })();\n\n return controller;\n}\n","import type { SinasClient } from './SinasClient';\nimport type { Collection, FileInfo } from './types';\n\nexport async function listCollections(client: SinasClient): Promise<Collection[]> {\n const base = client.getProxyBase();\n const res = await client.fetch(`${base}/collections`);\n return res.json();\n}\n\nexport async function listFiles(\n client: SinasClient,\n namespace: string,\n collection: string\n): Promise<FileInfo[]> {\n const base = client.getProxyBase();\n const res = await client.fetch(`${base}/files/${namespace}/${collection}`);\n return res.json();\n}\n","import React from 'react';\nimport { executeQuery } from '../client/queries';\nimport { useClient } from './context';\nimport type { QueryResult } from '../client/types';\n\nexport interface UseQueryOptions {\n enabled?: boolean;\n refetchInterval?: number | null;\n}\n\nexport interface UseQueryResult {\n data: Record<string, unknown>[] | null;\n loading: boolean;\n error: string | null;\n rowCount: number | null;\n refetch: (overrideInput?: Record<string, unknown>) => Promise<QueryResult | undefined>;\n}\n\nexport function useQuery(\n ref: string,\n input: Record<string, unknown> = {},\n options: UseQueryOptions = {}\n): UseQueryResult {\n const client = useClient();\n const { enabled = true, refetchInterval = null } = options;\n\n const [data, setData] = React.useState<Record<string, unknown>[] | null>(null);\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const [rowCount, setRowCount] = React.useState<number | null>(null);\n\n const abortRef = React.useRef<AbortController | null>(null);\n const inputJson = JSON.stringify(input);\n\n const execute = React.useCallback(\n async (overrideInput?: Record<string, unknown>) => {\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n\n setLoading(true);\n setError(null);\n try {\n const result = await executeQuery(\n client,\n ref,\n overrideInput || JSON.parse(inputJson)\n );\n if (!controller.signal.aborted) {\n setData(result.data || null);\n setRowCount(result.rowCount ?? result.affectedRows ?? null);\n }\n return result;\n } catch (e) {\n if (!controller.signal.aborted) {\n setError((e as Error).message);\n }\n } finally {\n if (!controller.signal.aborted) {\n setLoading(false);\n }\n }\n },\n [client, ref, inputJson]\n );\n\n React.useEffect(() => {\n if (enabled) {\n execute();\n }\n return () => {\n abortRef.current?.abort();\n };\n }, [enabled, execute]);\n\n React.useEffect(() => {\n if (refetchInterval && enabled) {\n const id = setInterval(execute, refetchInterval);\n return () => clearInterval(id);\n }\n }, [refetchInterval, enabled, execute]);\n\n return { data, loading, error, rowCount, refetch: execute };\n}\n","import React from 'react';\nimport { SinasClient } from '../client/SinasClient';\n\nconst SinasContext = React.createContext<SinasClient | null>(null);\n\nexport interface SinasProviderProps {\n client?: SinasClient;\n children: React.ReactNode;\n}\n\nexport function SinasProvider({ client, children }: SinasProviderProps) {\n const value = React.useMemo(() => client || new SinasClient(), [client]);\n return React.createElement(SinasContext.Provider, { value }, children);\n}\n\nexport function useClient(): SinasClient {\n const client = React.useContext(SinasContext);\n if (client) return client;\n // Fallback: create a default client using window globals\n return defaultClient;\n}\n\nconst defaultClient = new SinasClient();\n","import React from 'react';\nimport { executeFunction } from '../client/functions';\nimport { useClient } from './context';\nimport type { FunctionResult } from '../client/types';\n\nexport interface UseExecuteResult {\n execute: (input?: Record<string, unknown>, timeout?: number) => Promise<FunctionResult | undefined>;\n result: unknown;\n loading: boolean;\n error: string | null;\n executionId: string | null;\n}\n\nexport function useExecute(ref: string): UseExecuteResult {\n const client = useClient();\n\n const [result, setResult] = React.useState<unknown>(null);\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const [executionId, setExecutionId] = React.useState<string | null>(null);\n\n const execute = React.useCallback(\n async (input: Record<string, unknown> = {}, timeout?: number) => {\n setLoading(true);\n setError(null);\n try {\n const data = await executeFunction(client, ref, input, timeout);\n setResult(data.result);\n setExecutionId(data.executionId);\n if (data.status === 'error') {\n setError(data.error || 'Function execution failed');\n } else if (data.status === 'timeout') {\n setError('Function execution timed out');\n }\n return data;\n } catch (e) {\n setError((e as Error).message);\n } finally {\n setLoading(false);\n }\n },\n [client, ref]\n );\n\n return { execute, result, loading, error, executionId };\n}\n","import React from 'react';\nimport { stateGet, stateSet, stateDelete, stateList } from '../client/states';\nimport { useClient } from './context';\nimport type { StateListResult } from '../client/types';\n\nexport interface UseStateStoreOptions {\n visibility?: 'private' | 'shared';\n}\n\nexport interface UseStateStoreResult {\n value: unknown;\n loading: boolean;\n error: string | null;\n save: (value: unknown, opts?: UseStateStoreOptions) => Promise<void>;\n remove: () => Promise<void>;\n refetch: () => Promise<void>;\n list: () => Promise<StateListResult | undefined>;\n}\n\nexport function useStateStore(ns: string, key?: string): UseStateStoreResult {\n const client = useClient();\n\n const [value, setValue] = React.useState<unknown>(null);\n const [loading, setLoading] = React.useState(true);\n const [error, setError] = React.useState<string | null>(null);\n\n const load = React.useCallback(async () => {\n if (!key) {\n setLoading(false);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const result = await stateGet(client, ns, key);\n if (result.found) {\n setValue(result.value);\n } else {\n setValue(null);\n }\n } catch (e) {\n setError((e as Error).message);\n } finally {\n setLoading(false);\n }\n }, [client, ns, key]);\n\n const save = React.useCallback(\n async (newValue: unknown, opts?: UseStateStoreOptions) => {\n if (!key) throw new Error('Cannot save without a key');\n setValue(newValue);\n setError(null);\n try {\n await stateSet(client, ns, key, newValue, opts?.visibility);\n } catch (e) {\n setError((e as Error).message);\n throw e;\n }\n },\n [client, ns, key]\n );\n\n const remove = React.useCallback(async () => {\n if (!key) throw new Error('Cannot delete without a key');\n setValue(null);\n setError(null);\n try {\n await stateDelete(client, ns, key);\n } catch (e) {\n setError((e as Error).message);\n throw e;\n }\n }, [client, ns, key]);\n\n const list = React.useCallback(async () => {\n setError(null);\n try {\n return await stateList(client, ns);\n } catch (e) {\n setError((e as Error).message);\n }\n }, [client, ns]);\n\n React.useEffect(() => {\n load();\n }, [load]);\n\n return { value, loading, error, save, remove, refetch: load, list };\n}\n","import React from 'react';\nimport { createChat, getChat, streamMessage, approveToolCall, streamFromChannel } from '../client/chat';\nimport { useClient } from './context';\nimport type { ChatMessageFull, ApprovalRequest, SSEChunk, MessageContent } from '../client/types';\n\nexport interface ChatSessionMessage extends ChatMessageFull {\n /** True while streaming content is being appended */\n streaming?: boolean;\n}\n\nexport interface ToolStatus {\n toolCallId: string;\n name: string;\n description: string;\n status: 'running' | 'complete';\n}\n\nexport interface UseChatResult {\n chatId: string | null;\n messages: ChatSessionMessage[];\n loading: boolean;\n streaming: boolean;\n error: string | null;\n pendingApprovals: ApprovalRequest[];\n toolStatus: ToolStatus[];\n send: (content: MessageContent) => void;\n approve: (toolCallId: string) => void;\n reject: (toolCallId: string) => void;\n stop: () => void;\n clearError: () => void;\n}\n\nexport interface UseChatOptions {\n chatId?: string;\n input?: Record<string, unknown>;\n}\n\nexport function useChat(\n agentRef: string,\n options?: UseChatOptions,\n): UseChatResult {\n const client = useClient();\n\n const [chatId, setChatId] = React.useState<string | null>(options?.chatId ?? null);\n const [messages, setMessages] = React.useState<ChatSessionMessage[]>([]);\n const [loading, setLoading] = React.useState(false);\n const [streaming, setStreaming] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const [pendingApprovals, setPendingApprovals] = React.useState<ApprovalRequest[]>([]);\n const [toolStatus, setToolStatus] = React.useState<ToolStatus[]>([]);\n\n const abortRef = React.useRef<AbortController | null>(null);\n const chatIdRef = React.useRef<string | null>(chatId);\n chatIdRef.current = chatId;\n const activeAssistantIdRef = React.useRef<string>('');\n\n // Load existing chat on mount if chatId provided\n React.useEffect(() => {\n if (!options?.chatId) return;\n let cancelled = false;\n\n setLoading(true);\n getChat(client, options.chatId)\n .then((detail) => {\n if (cancelled) return;\n setChatId(detail.id);\n setMessages(detail.messages);\n if (detail.pendingApprovals?.length) {\n setPendingApprovals(detail.pendingApprovals);\n }\n })\n .catch((e) => {\n if (cancelled) return;\n setError((e as Error).message);\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n\n return () => { cancelled = true; };\n }, [client, options?.chatId]);\n\n // Cleanup on unmount\n React.useEffect(() => {\n return () => {\n abortRef.current?.abort();\n };\n }, []);\n\n const handleStreamChunks = React.useCallback(\n (chunk: SSEChunk) => {\n if (chunk.event === 'message') {\n try {\n const parsed = JSON.parse(chunk.data);\n if (parsed.content) {\n const targetId = activeAssistantIdRef.current;\n setMessages((prev) =>\n prev.map((m) =>\n m.id === targetId\n ? { ...m, content: (m.content || '') + parsed.content }\n : m,\n ),\n );\n }\n } catch {\n // Non-JSON content chunk — append raw data\n const targetId = activeAssistantIdRef.current;\n setMessages((prev) =>\n prev.map((m) =>\n m.id === targetId\n ? { ...m, content: (m.content || '') + chunk.data }\n : m,\n ),\n );\n }\n } else if (chunk.event === 'tool_start') {\n try {\n const parsed = JSON.parse(chunk.data);\n setToolStatus((prev) => [\n ...prev,\n { toolCallId: parsed.tool_call_id, name: parsed.name, description: parsed.description, status: 'running' },\n ]);\n // Insert tool call message before the streaming placeholder so\n // the \"Thinking...\" / status text stays at the bottom during execution.\n const placeholderId = activeAssistantIdRef.current;\n const toolCallMsg: ChatSessionMessage = {\n id: `tmp-tc-${parsed.tool_call_id}`,\n chatId: chatIdRef.current || '',\n role: 'assistant',\n content: null,\n toolCalls: [{\n id: parsed.tool_call_id,\n type: 'function',\n function: { name: parsed.name, arguments: parsed.arguments || '{}' },\n }],\n toolCallId: null,\n name: null,\n createdAt: new Date().toISOString(),\n };\n setMessages((prev) => {\n // Skip if a message for this tool call already exists (e.g. after approval\n // refresh replaced tmp IDs with server IDs, but tool call content is the same)\n const alreadyExists = prev.some((m) =>\n m.toolCalls?.some((tc) => tc.id === parsed.tool_call_id),\n );\n if (alreadyExists) return prev;\n const idx = prev.findIndex((m) => m.id === placeholderId);\n if (idx >= 0) {\n const next = [...prev];\n next.splice(idx, 0, toolCallMsg);\n return next;\n }\n return [...prev, toolCallMsg];\n });\n } catch {\n // ignore malformed tool_start events\n }\n } else if (chunk.event === 'tool_end') {\n try {\n const parsed = JSON.parse(chunk.data);\n setToolStatus((prev) =>\n prev.map((t) => t.toolCallId === parsed.tool_call_id ? { ...t, status: 'complete' } : t),\n );\n // Inject tool result message before the streaming placeholder\n if (parsed.result !== undefined) {\n const placeholderId = activeAssistantIdRef.current;\n const toolResultMsg: ChatSessionMessage = {\n id: `tmp-tr-${parsed.tool_call_id}`,\n chatId: chatIdRef.current || '',\n role: 'tool',\n content: typeof parsed.result === 'string' ? parsed.result : JSON.stringify(parsed.result),\n toolCalls: null,\n toolCallId: parsed.tool_call_id,\n name: parsed.name,\n createdAt: new Date().toISOString(),\n };\n setMessages((prev) => {\n const idx = prev.findIndex((m) => m.id === placeholderId);\n if (idx >= 0) {\n const next = [...prev];\n next.splice(idx, 0, toolResultMsg);\n return next;\n }\n return [...prev, toolResultMsg];\n });\n }\n } catch {\n // ignore malformed tool_end events\n }\n } else if (chunk.event === 'approval_required') {\n try {\n const raw = JSON.parse(chunk.data);\n const parsed: ApprovalRequest = {\n type: raw.type,\n toolCallId: raw.tool_call_id,\n functionNamespace: raw.function_namespace,\n functionName: raw.function_name,\n arguments: raw.arguments,\n };\n setPendingApprovals((prev) => [...prev, parsed]);\n } catch {\n // ignore malformed approval events\n }\n } else if (chunk.event === 'error') {\n try {\n const parsed = JSON.parse(chunk.data);\n setError(parsed.error || 'Stream error');\n } catch {\n setError(chunk.data || 'Stream error');\n }\n }\n },\n [],\n );\n\n const refreshMessages = React.useCallback(\n async (id: string) => {\n try {\n const detail = await getChat(client, id);\n setMessages(detail.messages);\n if (detail.pendingApprovals?.length) {\n setPendingApprovals(detail.pendingApprovals);\n }\n } catch {\n // Refresh is best-effort — streaming content already visible\n }\n },\n [client],\n );\n\n const send = React.useCallback(\n (content: MessageContent) => {\n const doSend = async () => {\n let activeChatId = chatIdRef.current;\n\n // Auto-create chat on first send\n if (!activeChatId) {\n setLoading(true);\n setError(null);\n try {\n const result = await createChat(client, agentRef, options?.input);\n activeChatId = result.id;\n setChatId(result.id);\n chatIdRef.current = result.id;\n } catch (e) {\n setError((e as Error).message);\n setLoading(false);\n return;\n }\n setLoading(false);\n }\n\n abortRef.current?.abort();\n setStreaming(true);\n setError(null);\n setPendingApprovals([]);\n setToolStatus([]);\n\n // Add user message optimistically\n const displayContent = typeof content === 'string' ? content : JSON.stringify(content);\n const userMsg: ChatSessionMessage = {\n id: `tmp-user-${Date.now()}`,\n chatId: activeChatId,\n role: 'user',\n content: displayContent,\n toolCalls: null,\n toolCallId: null,\n name: null,\n createdAt: new Date().toISOString(),\n };\n setMessages((prev) => [...prev, userMsg]);\n\n // Add empty assistant message to accumulate streaming content\n const assistantId = `tmp-assistant-${Date.now()}`;\n activeAssistantIdRef.current = assistantId;\n const assistantMsg: ChatSessionMessage = {\n id: assistantId,\n chatId: activeChatId,\n role: 'assistant',\n content: '',\n toolCalls: null,\n toolCallId: null,\n name: null,\n createdAt: new Date().toISOString(),\n streaming: true,\n };\n setMessages((prev) => [...prev, assistantMsg]);\n\n const controller = streamMessage(\n client,\n activeChatId,\n content,\n handleStreamChunks,\n () => {\n setStreaming(false);\n setToolStatus([]);\n // Remove empty streaming placeholders before server refresh replaces everything\n setMessages((prev) =>\n prev.filter(\n (m) => !(m.streaming && m.role === 'assistant' && !m.content && !m.toolCalls),\n ),\n );\n // Refresh to get authoritative server state (tool calls, tool responses)\n refreshMessages(activeChatId!);\n },\n (err: Error) => {\n setError(err.message);\n setStreaming(false);\n setToolStatus([]);\n },\n );\n\n abortRef.current = controller;\n };\n\n doSend();\n },\n [client, agentRef, options?.input, handleStreamChunks, refreshMessages],\n );\n\n const handleApproval = React.useCallback(\n (toolCallId: string, approved: boolean) => {\n const currentChatId = chatIdRef.current;\n if (!currentChatId) return;\n\n setPendingApprovals((prev) => prev.filter((a) => a.toolCallId !== toolCallId));\n setStreaming(true);\n setError(null);\n\n // Add placeholder assistant message for the resumed stream\n const assistantId = `tmp-resume-${Date.now()}`;\n activeAssistantIdRef.current = assistantId;\n if (approved) {\n const assistantMsg: ChatSessionMessage = {\n id: assistantId,\n chatId: currentChatId,\n role: 'assistant',\n content: '',\n toolCalls: null,\n toolCallId: null,\n name: null,\n createdAt: new Date().toISOString(),\n streaming: true,\n };\n setMessages((prev) => [...prev, assistantMsg]);\n }\n\n (async () => {\n try {\n const result = await approveToolCall(client, currentChatId, toolCallId, approved);\n\n if (!approved) {\n setStreaming(false);\n refreshMessages(currentChatId);\n return;\n }\n\n // Connect to resume stream\n const controller = streamFromChannel(\n client,\n currentChatId,\n result.channelId,\n handleStreamChunks,\n () => {\n setStreaming(false);\n setToolStatus([]);\n refreshMessages(currentChatId);\n },\n (err: Error) => {\n setError(err.message);\n setStreaming(false);\n setToolStatus([]);\n },\n );\n\n abortRef.current = controller;\n } catch (e) {\n setError((e as Error).message);\n setStreaming(false);\n }\n })();\n },\n [client, handleStreamChunks, refreshMessages],\n );\n\n const approve = React.useCallback(\n (toolCallId: string) => handleApproval(toolCallId, true),\n [handleApproval],\n );\n\n const reject = React.useCallback(\n (toolCallId: string) => handleApproval(toolCallId, false),\n [handleApproval],\n );\n\n const stop = React.useCallback(() => {\n abortRef.current?.abort();\n abortRef.current = null;\n setStreaming(false);\n }, []);\n\n const clearError = React.useCallback(() => {\n setError(null);\n }, []);\n\n return {\n chatId,\n messages,\n loading,\n streaming,\n error,\n pendingApprovals,\n toolStatus,\n send,\n approve,\n reject,\n stop,\n clearError,\n };\n}\n","import { useClient } from './context';\nimport { useQuery } from './useQuery';\nimport { useExecute } from './useExecute';\nimport { useStateStore } from './useStateStore';\nimport { useChat } from './useChat';\nimport type { SinasConfig } from '../client/types';\nimport type { SinasClient } from '../client/SinasClient';\n\nexport interface UseSinasResult {\n config: SinasConfig;\n input: Record<string, unknown>;\n client: SinasClient;\n useQuery: typeof useQuery;\n useExecute: typeof useExecute;\n useStateStore: typeof useStateStore;\n useChat: typeof useChat;\n}\n\nexport function useSinas(): UseSinasResult {\n const client = useClient();\n\n return {\n config: client.getConfig(),\n input: client.getInput(),\n client,\n useQuery,\n useExecute,\n useStateStore,\n useChat,\n };\n}\n"],"mappings":"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","names":["parseRef","import_react","React","React","import_react","React","import_react","React","import_react","React"]}
|
package/dist/index.js
CHANGED
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
stateSet,
|
|
20
20
|
streamFromChannel,
|
|
21
21
|
streamMessage
|
|
22
|
-
} from "./chunk-
|
|
22
|
+
} from "./chunk-HIZX5BQ5.js";
|
|
23
23
|
|
|
24
24
|
// src/hooks/useQuery.ts
|
|
25
25
|
import React2 from "react";
|
|
@@ -217,6 +217,9 @@ function useChat(agentRef, options) {
|
|
|
217
217
|
if (cancelled) return;
|
|
218
218
|
setChatId(detail.id);
|
|
219
219
|
setMessages(detail.messages);
|
|
220
|
+
if (detail.pendingApprovals?.length) {
|
|
221
|
+
setPendingApprovals(detail.pendingApprovals);
|
|
222
|
+
}
|
|
220
223
|
}).catch((e) => {
|
|
221
224
|
if (cancelled) return;
|
|
222
225
|
setError(e.message);
|
|
@@ -276,10 +279,17 @@ function useChat(agentRef, options) {
|
|
|
276
279
|
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
277
280
|
};
|
|
278
281
|
setMessages((prev) => {
|
|
279
|
-
const
|
|
280
|
-
(m) =>
|
|
282
|
+
const alreadyExists = prev.some(
|
|
283
|
+
(m) => m.toolCalls?.some((tc) => tc.id === parsed.tool_call_id)
|
|
281
284
|
);
|
|
282
|
-
return
|
|
285
|
+
if (alreadyExists) return prev;
|
|
286
|
+
const idx = prev.findIndex((m) => m.id === placeholderId);
|
|
287
|
+
if (idx >= 0) {
|
|
288
|
+
const next = [...prev];
|
|
289
|
+
next.splice(idx, 0, toolCallMsg);
|
|
290
|
+
return next;
|
|
291
|
+
}
|
|
292
|
+
return [...prev, toolCallMsg];
|
|
283
293
|
});
|
|
284
294
|
} catch {
|
|
285
295
|
}
|
|
@@ -290,6 +300,7 @@ function useChat(agentRef, options) {
|
|
|
290
300
|
(prev) => prev.map((t) => t.toolCallId === parsed.tool_call_id ? { ...t, status: "complete" } : t)
|
|
291
301
|
);
|
|
292
302
|
if (parsed.result !== void 0) {
|
|
303
|
+
const placeholderId = activeAssistantIdRef.current;
|
|
293
304
|
const toolResultMsg = {
|
|
294
305
|
id: `tmp-tr-${parsed.tool_call_id}`,
|
|
295
306
|
chatId: chatIdRef.current || "",
|
|
@@ -300,33 +311,28 @@ function useChat(agentRef, options) {
|
|
|
300
311
|
name: parsed.name,
|
|
301
312
|
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
302
313
|
};
|
|
303
|
-
setMessages((prev) =>
|
|
314
|
+
setMessages((prev) => {
|
|
315
|
+
const idx = prev.findIndex((m) => m.id === placeholderId);
|
|
316
|
+
if (idx >= 0) {
|
|
317
|
+
const next = [...prev];
|
|
318
|
+
next.splice(idx, 0, toolResultMsg);
|
|
319
|
+
return next;
|
|
320
|
+
}
|
|
321
|
+
return [...prev, toolResultMsg];
|
|
322
|
+
});
|
|
304
323
|
}
|
|
305
|
-
setToolStatus((currentStatus) => {
|
|
306
|
-
const stillRunning = currentStatus.filter((t) => t.status === "running");
|
|
307
|
-
if (stillRunning.length === 0) {
|
|
308
|
-
const newAssistantId = `tmp-assistant-${Date.now()}`;
|
|
309
|
-
activeAssistantIdRef.current = newAssistantId;
|
|
310
|
-
const newMsg = {
|
|
311
|
-
id: newAssistantId,
|
|
312
|
-
chatId: chatIdRef.current || "",
|
|
313
|
-
role: "assistant",
|
|
314
|
-
content: "",
|
|
315
|
-
toolCalls: null,
|
|
316
|
-
toolCallId: null,
|
|
317
|
-
name: null,
|
|
318
|
-
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
319
|
-
streaming: true
|
|
320
|
-
};
|
|
321
|
-
setMessages((prev) => [...prev, newMsg]);
|
|
322
|
-
}
|
|
323
|
-
return currentStatus;
|
|
324
|
-
});
|
|
325
324
|
} catch {
|
|
326
325
|
}
|
|
327
326
|
} else if (chunk.event === "approval_required") {
|
|
328
327
|
try {
|
|
329
|
-
const
|
|
328
|
+
const raw = JSON.parse(chunk.data);
|
|
329
|
+
const parsed = {
|
|
330
|
+
type: raw.type,
|
|
331
|
+
toolCallId: raw.tool_call_id,
|
|
332
|
+
functionNamespace: raw.function_namespace,
|
|
333
|
+
functionName: raw.function_name,
|
|
334
|
+
arguments: raw.arguments
|
|
335
|
+
};
|
|
330
336
|
setPendingApprovals((prev) => [...prev, parsed]);
|
|
331
337
|
} catch {
|
|
332
338
|
}
|
|
@@ -346,6 +352,9 @@ function useChat(agentRef, options) {
|
|
|
346
352
|
try {
|
|
347
353
|
const detail = await getChat(client, id);
|
|
348
354
|
setMessages(detail.messages);
|
|
355
|
+
if (detail.pendingApprovals?.length) {
|
|
356
|
+
setPendingApprovals(detail.pendingApprovals);
|
|
357
|
+
}
|
|
349
358
|
} catch {
|
|
350
359
|
}
|
|
351
360
|
},
|
|
@@ -409,6 +418,11 @@ function useChat(agentRef, options) {
|
|
|
409
418
|
() => {
|
|
410
419
|
setStreaming(false);
|
|
411
420
|
setToolStatus([]);
|
|
421
|
+
setMessages(
|
|
422
|
+
(prev) => prev.filter(
|
|
423
|
+
(m) => !(m.streaming && m.role === "assistant" && !m.content && !m.toolCalls)
|
|
424
|
+
)
|
|
425
|
+
);
|
|
412
426
|
refreshMessages(activeChatId);
|
|
413
427
|
},
|
|
414
428
|
(err) => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/useQuery.ts","../src/hooks/context.ts","../src/hooks/useExecute.ts","../src/hooks/useStateStore.ts","../src/hooks/useChat.ts","../src/hooks/useSinas.ts"],"sourcesContent":["import React from 'react';\nimport { executeQuery } from '../client/queries';\nimport { useClient } from './context';\nimport type { QueryResult } from '../client/types';\n\nexport interface UseQueryOptions {\n enabled?: boolean;\n refetchInterval?: number | null;\n}\n\nexport interface UseQueryResult {\n data: Record<string, unknown>[] | null;\n loading: boolean;\n error: string | null;\n rowCount: number | null;\n refetch: (overrideInput?: Record<string, unknown>) => Promise<QueryResult | undefined>;\n}\n\nexport function useQuery(\n ref: string,\n input: Record<string, unknown> = {},\n options: UseQueryOptions = {}\n): UseQueryResult {\n const client = useClient();\n const { enabled = true, refetchInterval = null } = options;\n\n const [data, setData] = React.useState<Record<string, unknown>[] | null>(null);\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const [rowCount, setRowCount] = React.useState<number | null>(null);\n\n const abortRef = React.useRef<AbortController | null>(null);\n const inputJson = JSON.stringify(input);\n\n const execute = React.useCallback(\n async (overrideInput?: Record<string, unknown>) => {\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n\n setLoading(true);\n setError(null);\n try {\n const result = await executeQuery(\n client,\n ref,\n overrideInput || JSON.parse(inputJson)\n );\n if (!controller.signal.aborted) {\n setData(result.data || null);\n setRowCount(result.rowCount ?? result.affectedRows ?? null);\n }\n return result;\n } catch (e) {\n if (!controller.signal.aborted) {\n setError((e as Error).message);\n }\n } finally {\n if (!controller.signal.aborted) {\n setLoading(false);\n }\n }\n },\n [client, ref, inputJson]\n );\n\n React.useEffect(() => {\n if (enabled) {\n execute();\n }\n return () => {\n abortRef.current?.abort();\n };\n }, [enabled, execute]);\n\n React.useEffect(() => {\n if (refetchInterval && enabled) {\n const id = setInterval(execute, refetchInterval);\n return () => clearInterval(id);\n }\n }, [refetchInterval, enabled, execute]);\n\n return { data, loading, error, rowCount, refetch: execute };\n}\n","import React from 'react';\nimport { SinasClient } from '../client/SinasClient';\n\nconst SinasContext = React.createContext<SinasClient | null>(null);\n\nexport interface SinasProviderProps {\n client?: SinasClient;\n children: React.ReactNode;\n}\n\nexport function SinasProvider({ client, children }: SinasProviderProps) {\n const value = React.useMemo(() => client || new SinasClient(), [client]);\n return React.createElement(SinasContext.Provider, { value }, children);\n}\n\nexport function useClient(): SinasClient {\n const client = React.useContext(SinasContext);\n if (client) return client;\n // Fallback: create a default client using window globals\n return defaultClient;\n}\n\nconst defaultClient = new SinasClient();\n","import React from 'react';\nimport { executeFunction } from '../client/functions';\nimport { useClient } from './context';\nimport type { FunctionResult } from '../client/types';\n\nexport interface UseExecuteResult {\n execute: (input?: Record<string, unknown>, timeout?: number) => Promise<FunctionResult | undefined>;\n result: unknown;\n loading: boolean;\n error: string | null;\n executionId: string | null;\n}\n\nexport function useExecute(ref: string): UseExecuteResult {\n const client = useClient();\n\n const [result, setResult] = React.useState<unknown>(null);\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const [executionId, setExecutionId] = React.useState<string | null>(null);\n\n const execute = React.useCallback(\n async (input: Record<string, unknown> = {}, timeout?: number) => {\n setLoading(true);\n setError(null);\n try {\n const data = await executeFunction(client, ref, input, timeout);\n setResult(data.result);\n setExecutionId(data.executionId);\n if (data.status === 'error') {\n setError(data.error || 'Function execution failed');\n } else if (data.status === 'timeout') {\n setError('Function execution timed out');\n }\n return data;\n } catch (e) {\n setError((e as Error).message);\n } finally {\n setLoading(false);\n }\n },\n [client, ref]\n );\n\n return { execute, result, loading, error, executionId };\n}\n","import React from 'react';\nimport { stateGet, stateSet, stateDelete, stateList } from '../client/states';\nimport { useClient } from './context';\nimport type { StateListResult } from '../client/types';\n\nexport interface UseStateStoreOptions {\n visibility?: 'private' | 'shared';\n}\n\nexport interface UseStateStoreResult {\n value: unknown;\n loading: boolean;\n error: string | null;\n save: (value: unknown, opts?: UseStateStoreOptions) => Promise<void>;\n remove: () => Promise<void>;\n refetch: () => Promise<void>;\n list: () => Promise<StateListResult | undefined>;\n}\n\nexport function useStateStore(ns: string, key?: string): UseStateStoreResult {\n const client = useClient();\n\n const [value, setValue] = React.useState<unknown>(null);\n const [loading, setLoading] = React.useState(true);\n const [error, setError] = React.useState<string | null>(null);\n\n const load = React.useCallback(async () => {\n if (!key) {\n setLoading(false);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const result = await stateGet(client, ns, key);\n if (result.found) {\n setValue(result.value);\n } else {\n setValue(null);\n }\n } catch (e) {\n setError((e as Error).message);\n } finally {\n setLoading(false);\n }\n }, [client, ns, key]);\n\n const save = React.useCallback(\n async (newValue: unknown, opts?: UseStateStoreOptions) => {\n if (!key) throw new Error('Cannot save without a key');\n setValue(newValue);\n setError(null);\n try {\n await stateSet(client, ns, key, newValue, opts?.visibility);\n } catch (e) {\n setError((e as Error).message);\n throw e;\n }\n },\n [client, ns, key]\n );\n\n const remove = React.useCallback(async () => {\n if (!key) throw new Error('Cannot delete without a key');\n setValue(null);\n setError(null);\n try {\n await stateDelete(client, ns, key);\n } catch (e) {\n setError((e as Error).message);\n throw e;\n }\n }, [client, ns, key]);\n\n const list = React.useCallback(async () => {\n setError(null);\n try {\n return await stateList(client, ns);\n } catch (e) {\n setError((e as Error).message);\n }\n }, [client, ns]);\n\n React.useEffect(() => {\n load();\n }, [load]);\n\n return { value, loading, error, save, remove, refetch: load, list };\n}\n","import React from 'react';\nimport { createChat, getChat, streamMessage, approveToolCall, streamFromChannel } from '../client/chat';\nimport { useClient } from './context';\nimport type { ChatMessageFull, ApprovalRequest, SSEChunk, MessageContent } from '../client/types';\n\nexport interface ChatSessionMessage extends ChatMessageFull {\n /** True while streaming content is being appended */\n streaming?: boolean;\n}\n\nexport interface ToolStatus {\n toolCallId: string;\n name: string;\n description: string;\n status: 'running' | 'complete';\n}\n\nexport interface UseChatResult {\n chatId: string | null;\n messages: ChatSessionMessage[];\n loading: boolean;\n streaming: boolean;\n error: string | null;\n pendingApprovals: ApprovalRequest[];\n toolStatus: ToolStatus[];\n send: (content: MessageContent) => void;\n approve: (toolCallId: string) => void;\n reject: (toolCallId: string) => void;\n stop: () => void;\n clearError: () => void;\n}\n\nexport interface UseChatOptions {\n chatId?: string;\n input?: Record<string, unknown>;\n}\n\nexport function useChat(\n agentRef: string,\n options?: UseChatOptions,\n): UseChatResult {\n const client = useClient();\n\n const [chatId, setChatId] = React.useState<string | null>(options?.chatId ?? null);\n const [messages, setMessages] = React.useState<ChatSessionMessage[]>([]);\n const [loading, setLoading] = React.useState(false);\n const [streaming, setStreaming] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const [pendingApprovals, setPendingApprovals] = React.useState<ApprovalRequest[]>([]);\n const [toolStatus, setToolStatus] = React.useState<ToolStatus[]>([]);\n\n const abortRef = React.useRef<AbortController | null>(null);\n const chatIdRef = React.useRef<string | null>(chatId);\n chatIdRef.current = chatId;\n const activeAssistantIdRef = React.useRef<string>('');\n\n // Load existing chat on mount if chatId provided\n React.useEffect(() => {\n if (!options?.chatId) return;\n let cancelled = false;\n\n setLoading(true);\n getChat(client, options.chatId)\n .then((detail) => {\n if (cancelled) return;\n setChatId(detail.id);\n setMessages(detail.messages);\n })\n .catch((e) => {\n if (cancelled) return;\n setError((e as Error).message);\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n\n return () => { cancelled = true; };\n }, [client, options?.chatId]);\n\n // Cleanup on unmount\n React.useEffect(() => {\n return () => {\n abortRef.current?.abort();\n };\n }, []);\n\n const handleStreamChunks = React.useCallback(\n (chunk: SSEChunk) => {\n if (chunk.event === 'message') {\n try {\n const parsed = JSON.parse(chunk.data);\n if (parsed.content) {\n const targetId = activeAssistantIdRef.current;\n setMessages((prev) =>\n prev.map((m) =>\n m.id === targetId\n ? { ...m, content: (m.content || '') + parsed.content }\n : m,\n ),\n );\n }\n } catch {\n // Non-JSON content chunk — append raw data\n const targetId = activeAssistantIdRef.current;\n setMessages((prev) =>\n prev.map((m) =>\n m.id === targetId\n ? { ...m, content: (m.content || '') + chunk.data }\n : m,\n ),\n );\n }\n } else if (chunk.event === 'tool_start') {\n try {\n const parsed = JSON.parse(chunk.data);\n setToolStatus((prev) => [\n ...prev,\n { toolCallId: parsed.tool_call_id, name: parsed.name, description: parsed.description, status: 'running' },\n ]);\n // Remove the empty streaming placeholder and inject tool call message\n const placeholderId = activeAssistantIdRef.current;\n const toolCallMsg: ChatSessionMessage = {\n id: `tmp-tc-${parsed.tool_call_id}`,\n chatId: chatIdRef.current || '',\n role: 'assistant',\n content: null,\n toolCalls: [{\n id: parsed.tool_call_id,\n type: 'function',\n function: { name: parsed.name, arguments: parsed.arguments || '{}' },\n }],\n toolCallId: null,\n name: null,\n createdAt: new Date().toISOString(),\n };\n setMessages((prev) => {\n // Remove empty placeholder (no content accumulated yet)\n const filtered = prev.filter((m) =>\n !(m.id === placeholderId && m.streaming && !m.content),\n );\n return [...filtered, toolCallMsg];\n });\n } catch {\n // ignore malformed tool_start events\n }\n } else if (chunk.event === 'tool_end') {\n try {\n const parsed = JSON.parse(chunk.data);\n setToolStatus((prev) =>\n prev.map((t) => t.toolCallId === parsed.tool_call_id ? { ...t, status: 'complete' } : t),\n );\n // Inject tool result message into messages\n if (parsed.result !== undefined) {\n const toolResultMsg: ChatSessionMessage = {\n id: `tmp-tr-${parsed.tool_call_id}`,\n chatId: chatIdRef.current || '',\n role: 'tool',\n content: typeof parsed.result === 'string' ? parsed.result : JSON.stringify(parsed.result),\n toolCalls: null,\n toolCallId: parsed.tool_call_id,\n name: parsed.name,\n createdAt: new Date().toISOString(),\n };\n setMessages((prev) => [...prev, toolResultMsg]);\n }\n // Create new assistant message for follow-up LLM content after tool execution\n setToolStatus((currentStatus) => {\n const stillRunning = currentStatus.filter((t) => t.status === 'running');\n if (stillRunning.length === 0) {\n const newAssistantId = `tmp-assistant-${Date.now()}`;\n activeAssistantIdRef.current = newAssistantId;\n const newMsg: ChatSessionMessage = {\n id: newAssistantId,\n chatId: chatIdRef.current || '',\n role: 'assistant',\n content: '',\n toolCalls: null,\n toolCallId: null,\n name: null,\n createdAt: new Date().toISOString(),\n streaming: true,\n };\n setMessages((prev) => [...prev, newMsg]);\n }\n return currentStatus;\n });\n } catch {\n // ignore malformed tool_end events\n }\n } else if (chunk.event === 'approval_required') {\n try {\n const parsed = JSON.parse(chunk.data) as ApprovalRequest;\n setPendingApprovals((prev) => [...prev, parsed]);\n } catch {\n // ignore malformed approval events\n }\n } else if (chunk.event === 'error') {\n try {\n const parsed = JSON.parse(chunk.data);\n setError(parsed.error || 'Stream error');\n } catch {\n setError(chunk.data || 'Stream error');\n }\n }\n },\n [],\n );\n\n const refreshMessages = React.useCallback(\n async (id: string) => {\n try {\n const detail = await getChat(client, id);\n setMessages(detail.messages);\n } catch {\n // Refresh is best-effort — streaming content already visible\n }\n },\n [client],\n );\n\n const send = React.useCallback(\n (content: MessageContent) => {\n const doSend = async () => {\n let activeChatId = chatIdRef.current;\n\n // Auto-create chat on first send\n if (!activeChatId) {\n setLoading(true);\n setError(null);\n try {\n const result = await createChat(client, agentRef, options?.input);\n activeChatId = result.id;\n setChatId(result.id);\n chatIdRef.current = result.id;\n } catch (e) {\n setError((e as Error).message);\n setLoading(false);\n return;\n }\n setLoading(false);\n }\n\n abortRef.current?.abort();\n setStreaming(true);\n setError(null);\n setPendingApprovals([]);\n setToolStatus([]);\n\n // Add user message optimistically\n const displayContent = typeof content === 'string' ? content : JSON.stringify(content);\n const userMsg: ChatSessionMessage = {\n id: `tmp-user-${Date.now()}`,\n chatId: activeChatId,\n role: 'user',\n content: displayContent,\n toolCalls: null,\n toolCallId: null,\n name: null,\n createdAt: new Date().toISOString(),\n };\n setMessages((prev) => [...prev, userMsg]);\n\n // Add empty assistant message to accumulate streaming content\n const assistantId = `tmp-assistant-${Date.now()}`;\n activeAssistantIdRef.current = assistantId;\n const assistantMsg: ChatSessionMessage = {\n id: assistantId,\n chatId: activeChatId,\n role: 'assistant',\n content: '',\n toolCalls: null,\n toolCallId: null,\n name: null,\n createdAt: new Date().toISOString(),\n streaming: true,\n };\n setMessages((prev) => [...prev, assistantMsg]);\n\n const controller = streamMessage(\n client,\n activeChatId,\n content,\n handleStreamChunks,\n () => {\n setStreaming(false);\n setToolStatus([]);\n // Refresh to get authoritative server state (tool calls, tool responses)\n refreshMessages(activeChatId!);\n },\n (err: Error) => {\n setError(err.message);\n setStreaming(false);\n setToolStatus([]);\n },\n );\n\n abortRef.current = controller;\n };\n\n doSend();\n },\n [client, agentRef, options?.input, handleStreamChunks, refreshMessages],\n );\n\n const handleApproval = React.useCallback(\n (toolCallId: string, approved: boolean) => {\n const currentChatId = chatIdRef.current;\n if (!currentChatId) return;\n\n setPendingApprovals((prev) => prev.filter((a) => a.toolCallId !== toolCallId));\n setStreaming(true);\n setError(null);\n\n // Add placeholder assistant message for the resumed stream\n const assistantId = `tmp-resume-${Date.now()}`;\n activeAssistantIdRef.current = assistantId;\n if (approved) {\n const assistantMsg: ChatSessionMessage = {\n id: assistantId,\n chatId: currentChatId,\n role: 'assistant',\n content: '',\n toolCalls: null,\n toolCallId: null,\n name: null,\n createdAt: new Date().toISOString(),\n streaming: true,\n };\n setMessages((prev) => [...prev, assistantMsg]);\n }\n\n (async () => {\n try {\n const result = await approveToolCall(client, currentChatId, toolCallId, approved);\n\n if (!approved) {\n setStreaming(false);\n refreshMessages(currentChatId);\n return;\n }\n\n // Connect to resume stream\n const controller = streamFromChannel(\n client,\n currentChatId,\n result.channelId,\n handleStreamChunks,\n () => {\n setStreaming(false);\n setToolStatus([]);\n refreshMessages(currentChatId);\n },\n (err: Error) => {\n setError(err.message);\n setStreaming(false);\n setToolStatus([]);\n },\n );\n\n abortRef.current = controller;\n } catch (e) {\n setError((e as Error).message);\n setStreaming(false);\n }\n })();\n },\n [client, handleStreamChunks, refreshMessages],\n );\n\n const approve = React.useCallback(\n (toolCallId: string) => handleApproval(toolCallId, true),\n [handleApproval],\n );\n\n const reject = React.useCallback(\n (toolCallId: string) => handleApproval(toolCallId, false),\n [handleApproval],\n );\n\n const stop = React.useCallback(() => {\n abortRef.current?.abort();\n abortRef.current = null;\n setStreaming(false);\n }, []);\n\n const clearError = React.useCallback(() => {\n setError(null);\n }, []);\n\n return {\n chatId,\n messages,\n loading,\n streaming,\n error,\n pendingApprovals,\n toolStatus,\n send,\n approve,\n reject,\n stop,\n clearError,\n };\n}\n","import { useClient } from './context';\nimport { useQuery } from './useQuery';\nimport { useExecute } from './useExecute';\nimport { useStateStore } from './useStateStore';\nimport { useChat } from './useChat';\nimport type { SinasConfig } from '../client/types';\nimport type { SinasClient } from '../client/SinasClient';\n\nexport interface UseSinasResult {\n config: SinasConfig;\n input: Record<string, unknown>;\n client: SinasClient;\n useQuery: typeof useQuery;\n useExecute: typeof useExecute;\n useStateStore: typeof useStateStore;\n useChat: typeof useChat;\n}\n\nexport function useSinas(): UseSinasResult {\n const client = useClient();\n\n return {\n config: client.getConfig(),\n input: client.getInput(),\n client,\n useQuery,\n useExecute,\n useStateStore,\n useChat,\n };\n}\n"],"mappings":"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","names":["React","React","React","React","React","React","React","React"]}
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useQuery.ts","../src/hooks/context.ts","../src/hooks/useExecute.ts","../src/hooks/useStateStore.ts","../src/hooks/useChat.ts","../src/hooks/useSinas.ts"],"sourcesContent":["import React from 'react';\nimport { executeQuery } from '../client/queries';\nimport { useClient } from './context';\nimport type { QueryResult } from '../client/types';\n\nexport interface UseQueryOptions {\n enabled?: boolean;\n refetchInterval?: number | null;\n}\n\nexport interface UseQueryResult {\n data: Record<string, unknown>[] | null;\n loading: boolean;\n error: string | null;\n rowCount: number | null;\n refetch: (overrideInput?: Record<string, unknown>) => Promise<QueryResult | undefined>;\n}\n\nexport function useQuery(\n ref: string,\n input: Record<string, unknown> = {},\n options: UseQueryOptions = {}\n): UseQueryResult {\n const client = useClient();\n const { enabled = true, refetchInterval = null } = options;\n\n const [data, setData] = React.useState<Record<string, unknown>[] | null>(null);\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const [rowCount, setRowCount] = React.useState<number | null>(null);\n\n const abortRef = React.useRef<AbortController | null>(null);\n const inputJson = JSON.stringify(input);\n\n const execute = React.useCallback(\n async (overrideInput?: Record<string, unknown>) => {\n abortRef.current?.abort();\n const controller = new AbortController();\n abortRef.current = controller;\n\n setLoading(true);\n setError(null);\n try {\n const result = await executeQuery(\n client,\n ref,\n overrideInput || JSON.parse(inputJson)\n );\n if (!controller.signal.aborted) {\n setData(result.data || null);\n setRowCount(result.rowCount ?? result.affectedRows ?? null);\n }\n return result;\n } catch (e) {\n if (!controller.signal.aborted) {\n setError((e as Error).message);\n }\n } finally {\n if (!controller.signal.aborted) {\n setLoading(false);\n }\n }\n },\n [client, ref, inputJson]\n );\n\n React.useEffect(() => {\n if (enabled) {\n execute();\n }\n return () => {\n abortRef.current?.abort();\n };\n }, [enabled, execute]);\n\n React.useEffect(() => {\n if (refetchInterval && enabled) {\n const id = setInterval(execute, refetchInterval);\n return () => clearInterval(id);\n }\n }, [refetchInterval, enabled, execute]);\n\n return { data, loading, error, rowCount, refetch: execute };\n}\n","import React from 'react';\nimport { SinasClient } from '../client/SinasClient';\n\nconst SinasContext = React.createContext<SinasClient | null>(null);\n\nexport interface SinasProviderProps {\n client?: SinasClient;\n children: React.ReactNode;\n}\n\nexport function SinasProvider({ client, children }: SinasProviderProps) {\n const value = React.useMemo(() => client || new SinasClient(), [client]);\n return React.createElement(SinasContext.Provider, { value }, children);\n}\n\nexport function useClient(): SinasClient {\n const client = React.useContext(SinasContext);\n if (client) return client;\n // Fallback: create a default client using window globals\n return defaultClient;\n}\n\nconst defaultClient = new SinasClient();\n","import React from 'react';\nimport { executeFunction } from '../client/functions';\nimport { useClient } from './context';\nimport type { FunctionResult } from '../client/types';\n\nexport interface UseExecuteResult {\n execute: (input?: Record<string, unknown>, timeout?: number) => Promise<FunctionResult | undefined>;\n result: unknown;\n loading: boolean;\n error: string | null;\n executionId: string | null;\n}\n\nexport function useExecute(ref: string): UseExecuteResult {\n const client = useClient();\n\n const [result, setResult] = React.useState<unknown>(null);\n const [loading, setLoading] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const [executionId, setExecutionId] = React.useState<string | null>(null);\n\n const execute = React.useCallback(\n async (input: Record<string, unknown> = {}, timeout?: number) => {\n setLoading(true);\n setError(null);\n try {\n const data = await executeFunction(client, ref, input, timeout);\n setResult(data.result);\n setExecutionId(data.executionId);\n if (data.status === 'error') {\n setError(data.error || 'Function execution failed');\n } else if (data.status === 'timeout') {\n setError('Function execution timed out');\n }\n return data;\n } catch (e) {\n setError((e as Error).message);\n } finally {\n setLoading(false);\n }\n },\n [client, ref]\n );\n\n return { execute, result, loading, error, executionId };\n}\n","import React from 'react';\nimport { stateGet, stateSet, stateDelete, stateList } from '../client/states';\nimport { useClient } from './context';\nimport type { StateListResult } from '../client/types';\n\nexport interface UseStateStoreOptions {\n visibility?: 'private' | 'shared';\n}\n\nexport interface UseStateStoreResult {\n value: unknown;\n loading: boolean;\n error: string | null;\n save: (value: unknown, opts?: UseStateStoreOptions) => Promise<void>;\n remove: () => Promise<void>;\n refetch: () => Promise<void>;\n list: () => Promise<StateListResult | undefined>;\n}\n\nexport function useStateStore(ns: string, key?: string): UseStateStoreResult {\n const client = useClient();\n\n const [value, setValue] = React.useState<unknown>(null);\n const [loading, setLoading] = React.useState(true);\n const [error, setError] = React.useState<string | null>(null);\n\n const load = React.useCallback(async () => {\n if (!key) {\n setLoading(false);\n return;\n }\n setLoading(true);\n setError(null);\n try {\n const result = await stateGet(client, ns, key);\n if (result.found) {\n setValue(result.value);\n } else {\n setValue(null);\n }\n } catch (e) {\n setError((e as Error).message);\n } finally {\n setLoading(false);\n }\n }, [client, ns, key]);\n\n const save = React.useCallback(\n async (newValue: unknown, opts?: UseStateStoreOptions) => {\n if (!key) throw new Error('Cannot save without a key');\n setValue(newValue);\n setError(null);\n try {\n await stateSet(client, ns, key, newValue, opts?.visibility);\n } catch (e) {\n setError((e as Error).message);\n throw e;\n }\n },\n [client, ns, key]\n );\n\n const remove = React.useCallback(async () => {\n if (!key) throw new Error('Cannot delete without a key');\n setValue(null);\n setError(null);\n try {\n await stateDelete(client, ns, key);\n } catch (e) {\n setError((e as Error).message);\n throw e;\n }\n }, [client, ns, key]);\n\n const list = React.useCallback(async () => {\n setError(null);\n try {\n return await stateList(client, ns);\n } catch (e) {\n setError((e as Error).message);\n }\n }, [client, ns]);\n\n React.useEffect(() => {\n load();\n }, [load]);\n\n return { value, loading, error, save, remove, refetch: load, list };\n}\n","import React from 'react';\nimport { createChat, getChat, streamMessage, approveToolCall, streamFromChannel } from '../client/chat';\nimport { useClient } from './context';\nimport type { ChatMessageFull, ApprovalRequest, SSEChunk, MessageContent } from '../client/types';\n\nexport interface ChatSessionMessage extends ChatMessageFull {\n /** True while streaming content is being appended */\n streaming?: boolean;\n}\n\nexport interface ToolStatus {\n toolCallId: string;\n name: string;\n description: string;\n status: 'running' | 'complete';\n}\n\nexport interface UseChatResult {\n chatId: string | null;\n messages: ChatSessionMessage[];\n loading: boolean;\n streaming: boolean;\n error: string | null;\n pendingApprovals: ApprovalRequest[];\n toolStatus: ToolStatus[];\n send: (content: MessageContent) => void;\n approve: (toolCallId: string) => void;\n reject: (toolCallId: string) => void;\n stop: () => void;\n clearError: () => void;\n}\n\nexport interface UseChatOptions {\n chatId?: string;\n input?: Record<string, unknown>;\n}\n\nexport function useChat(\n agentRef: string,\n options?: UseChatOptions,\n): UseChatResult {\n const client = useClient();\n\n const [chatId, setChatId] = React.useState<string | null>(options?.chatId ?? null);\n const [messages, setMessages] = React.useState<ChatSessionMessage[]>([]);\n const [loading, setLoading] = React.useState(false);\n const [streaming, setStreaming] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const [pendingApprovals, setPendingApprovals] = React.useState<ApprovalRequest[]>([]);\n const [toolStatus, setToolStatus] = React.useState<ToolStatus[]>([]);\n\n const abortRef = React.useRef<AbortController | null>(null);\n const chatIdRef = React.useRef<string | null>(chatId);\n chatIdRef.current = chatId;\n const activeAssistantIdRef = React.useRef<string>('');\n\n // Load existing chat on mount if chatId provided\n React.useEffect(() => {\n if (!options?.chatId) return;\n let cancelled = false;\n\n setLoading(true);\n getChat(client, options.chatId)\n .then((detail) => {\n if (cancelled) return;\n setChatId(detail.id);\n setMessages(detail.messages);\n if (detail.pendingApprovals?.length) {\n setPendingApprovals(detail.pendingApprovals);\n }\n })\n .catch((e) => {\n if (cancelled) return;\n setError((e as Error).message);\n })\n .finally(() => {\n if (!cancelled) setLoading(false);\n });\n\n return () => { cancelled = true; };\n }, [client, options?.chatId]);\n\n // Cleanup on unmount\n React.useEffect(() => {\n return () => {\n abortRef.current?.abort();\n };\n }, []);\n\n const handleStreamChunks = React.useCallback(\n (chunk: SSEChunk) => {\n if (chunk.event === 'message') {\n try {\n const parsed = JSON.parse(chunk.data);\n if (parsed.content) {\n const targetId = activeAssistantIdRef.current;\n setMessages((prev) =>\n prev.map((m) =>\n m.id === targetId\n ? { ...m, content: (m.content || '') + parsed.content }\n : m,\n ),\n );\n }\n } catch {\n // Non-JSON content chunk — append raw data\n const targetId = activeAssistantIdRef.current;\n setMessages((prev) =>\n prev.map((m) =>\n m.id === targetId\n ? { ...m, content: (m.content || '') + chunk.data }\n : m,\n ),\n );\n }\n } else if (chunk.event === 'tool_start') {\n try {\n const parsed = JSON.parse(chunk.data);\n setToolStatus((prev) => [\n ...prev,\n { toolCallId: parsed.tool_call_id, name: parsed.name, description: parsed.description, status: 'running' },\n ]);\n // Insert tool call message before the streaming placeholder so\n // the \"Thinking...\" / status text stays at the bottom during execution.\n const placeholderId = activeAssistantIdRef.current;\n const toolCallMsg: ChatSessionMessage = {\n id: `tmp-tc-${parsed.tool_call_id}`,\n chatId: chatIdRef.current || '',\n role: 'assistant',\n content: null,\n toolCalls: [{\n id: parsed.tool_call_id,\n type: 'function',\n function: { name: parsed.name, arguments: parsed.arguments || '{}' },\n }],\n toolCallId: null,\n name: null,\n createdAt: new Date().toISOString(),\n };\n setMessages((prev) => {\n // Skip if a message for this tool call already exists (e.g. after approval\n // refresh replaced tmp IDs with server IDs, but tool call content is the same)\n const alreadyExists = prev.some((m) =>\n m.toolCalls?.some((tc) => tc.id === parsed.tool_call_id),\n );\n if (alreadyExists) return prev;\n const idx = prev.findIndex((m) => m.id === placeholderId);\n if (idx >= 0) {\n const next = [...prev];\n next.splice(idx, 0, toolCallMsg);\n return next;\n }\n return [...prev, toolCallMsg];\n });\n } catch {\n // ignore malformed tool_start events\n }\n } else if (chunk.event === 'tool_end') {\n try {\n const parsed = JSON.parse(chunk.data);\n setToolStatus((prev) =>\n prev.map((t) => t.toolCallId === parsed.tool_call_id ? { ...t, status: 'complete' } : t),\n );\n // Inject tool result message before the streaming placeholder\n if (parsed.result !== undefined) {\n const placeholderId = activeAssistantIdRef.current;\n const toolResultMsg: ChatSessionMessage = {\n id: `tmp-tr-${parsed.tool_call_id}`,\n chatId: chatIdRef.current || '',\n role: 'tool',\n content: typeof parsed.result === 'string' ? parsed.result : JSON.stringify(parsed.result),\n toolCalls: null,\n toolCallId: parsed.tool_call_id,\n name: parsed.name,\n createdAt: new Date().toISOString(),\n };\n setMessages((prev) => {\n const idx = prev.findIndex((m) => m.id === placeholderId);\n if (idx >= 0) {\n const next = [...prev];\n next.splice(idx, 0, toolResultMsg);\n return next;\n }\n return [...prev, toolResultMsg];\n });\n }\n } catch {\n // ignore malformed tool_end events\n }\n } else if (chunk.event === 'approval_required') {\n try {\n const raw = JSON.parse(chunk.data);\n const parsed: ApprovalRequest = {\n type: raw.type,\n toolCallId: raw.tool_call_id,\n functionNamespace: raw.function_namespace,\n functionName: raw.function_name,\n arguments: raw.arguments,\n };\n setPendingApprovals((prev) => [...prev, parsed]);\n } catch {\n // ignore malformed approval events\n }\n } else if (chunk.event === 'error') {\n try {\n const parsed = JSON.parse(chunk.data);\n setError(parsed.error || 'Stream error');\n } catch {\n setError(chunk.data || 'Stream error');\n }\n }\n },\n [],\n );\n\n const refreshMessages = React.useCallback(\n async (id: string) => {\n try {\n const detail = await getChat(client, id);\n setMessages(detail.messages);\n if (detail.pendingApprovals?.length) {\n setPendingApprovals(detail.pendingApprovals);\n }\n } catch {\n // Refresh is best-effort — streaming content already visible\n }\n },\n [client],\n );\n\n const send = React.useCallback(\n (content: MessageContent) => {\n const doSend = async () => {\n let activeChatId = chatIdRef.current;\n\n // Auto-create chat on first send\n if (!activeChatId) {\n setLoading(true);\n setError(null);\n try {\n const result = await createChat(client, agentRef, options?.input);\n activeChatId = result.id;\n setChatId(result.id);\n chatIdRef.current = result.id;\n } catch (e) {\n setError((e as Error).message);\n setLoading(false);\n return;\n }\n setLoading(false);\n }\n\n abortRef.current?.abort();\n setStreaming(true);\n setError(null);\n setPendingApprovals([]);\n setToolStatus([]);\n\n // Add user message optimistically\n const displayContent = typeof content === 'string' ? content : JSON.stringify(content);\n const userMsg: ChatSessionMessage = {\n id: `tmp-user-${Date.now()}`,\n chatId: activeChatId,\n role: 'user',\n content: displayContent,\n toolCalls: null,\n toolCallId: null,\n name: null,\n createdAt: new Date().toISOString(),\n };\n setMessages((prev) => [...prev, userMsg]);\n\n // Add empty assistant message to accumulate streaming content\n const assistantId = `tmp-assistant-${Date.now()}`;\n activeAssistantIdRef.current = assistantId;\n const assistantMsg: ChatSessionMessage = {\n id: assistantId,\n chatId: activeChatId,\n role: 'assistant',\n content: '',\n toolCalls: null,\n toolCallId: null,\n name: null,\n createdAt: new Date().toISOString(),\n streaming: true,\n };\n setMessages((prev) => [...prev, assistantMsg]);\n\n const controller = streamMessage(\n client,\n activeChatId,\n content,\n handleStreamChunks,\n () => {\n setStreaming(false);\n setToolStatus([]);\n // Remove empty streaming placeholders before server refresh replaces everything\n setMessages((prev) =>\n prev.filter(\n (m) => !(m.streaming && m.role === 'assistant' && !m.content && !m.toolCalls),\n ),\n );\n // Refresh to get authoritative server state (tool calls, tool responses)\n refreshMessages(activeChatId!);\n },\n (err: Error) => {\n setError(err.message);\n setStreaming(false);\n setToolStatus([]);\n },\n );\n\n abortRef.current = controller;\n };\n\n doSend();\n },\n [client, agentRef, options?.input, handleStreamChunks, refreshMessages],\n );\n\n const handleApproval = React.useCallback(\n (toolCallId: string, approved: boolean) => {\n const currentChatId = chatIdRef.current;\n if (!currentChatId) return;\n\n setPendingApprovals((prev) => prev.filter((a) => a.toolCallId !== toolCallId));\n setStreaming(true);\n setError(null);\n\n // Add placeholder assistant message for the resumed stream\n const assistantId = `tmp-resume-${Date.now()}`;\n activeAssistantIdRef.current = assistantId;\n if (approved) {\n const assistantMsg: ChatSessionMessage = {\n id: assistantId,\n chatId: currentChatId,\n role: 'assistant',\n content: '',\n toolCalls: null,\n toolCallId: null,\n name: null,\n createdAt: new Date().toISOString(),\n streaming: true,\n };\n setMessages((prev) => [...prev, assistantMsg]);\n }\n\n (async () => {\n try {\n const result = await approveToolCall(client, currentChatId, toolCallId, approved);\n\n if (!approved) {\n setStreaming(false);\n refreshMessages(currentChatId);\n return;\n }\n\n // Connect to resume stream\n const controller = streamFromChannel(\n client,\n currentChatId,\n result.channelId,\n handleStreamChunks,\n () => {\n setStreaming(false);\n setToolStatus([]);\n refreshMessages(currentChatId);\n },\n (err: Error) => {\n setError(err.message);\n setStreaming(false);\n setToolStatus([]);\n },\n );\n\n abortRef.current = controller;\n } catch (e) {\n setError((e as Error).message);\n setStreaming(false);\n }\n })();\n },\n [client, handleStreamChunks, refreshMessages],\n );\n\n const approve = React.useCallback(\n (toolCallId: string) => handleApproval(toolCallId, true),\n [handleApproval],\n );\n\n const reject = React.useCallback(\n (toolCallId: string) => handleApproval(toolCallId, false),\n [handleApproval],\n );\n\n const stop = React.useCallback(() => {\n abortRef.current?.abort();\n abortRef.current = null;\n setStreaming(false);\n }, []);\n\n const clearError = React.useCallback(() => {\n setError(null);\n }, []);\n\n return {\n chatId,\n messages,\n loading,\n streaming,\n error,\n pendingApprovals,\n toolStatus,\n send,\n approve,\n reject,\n stop,\n clearError,\n };\n}\n","import { useClient } from './context';\nimport { useQuery } from './useQuery';\nimport { useExecute } from './useExecute';\nimport { useStateStore } from './useStateStore';\nimport { useChat } from './useChat';\nimport type { SinasConfig } from '../client/types';\nimport type { SinasClient } from '../client/SinasClient';\n\nexport interface UseSinasResult {\n config: SinasConfig;\n input: Record<string, unknown>;\n client: SinasClient;\n useQuery: typeof useQuery;\n useExecute: typeof useExecute;\n useStateStore: typeof useStateStore;\n useChat: typeof useChat;\n}\n\nexport function useSinas(): UseSinasResult {\n const client = useClient();\n\n return {\n config: client.getConfig(),\n input: client.getInput(),\n client,\n useQuery,\n useExecute,\n useStateStore,\n useChat,\n };\n}\n"],"mappings":"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","names":["React","React","React","React","React","React","React","React"]}
|