@sinas/sdk 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -5,16 +5,21 @@ import {
5
5
  SinasNotFoundError,
6
6
  SinasPermissionError,
7
7
  SinasTimeoutError,
8
+ approveToolCall,
8
9
  createChat,
9
10
  executeFunction,
10
11
  executeQuery,
12
+ getChat,
13
+ listCollections,
14
+ listFiles,
11
15
  sendMessage,
12
16
  stateDelete,
13
17
  stateGet,
14
18
  stateList,
15
19
  stateSet,
20
+ streamFromChannel,
16
21
  streamMessage
17
- } from "./chunk-M7YHE5Y6.js";
22
+ } from "./chunk-EV5ARSUJ.js";
18
23
 
19
24
  // src/hooks/useQuery.ts
20
25
  import React2 from "react";
@@ -191,125 +196,235 @@ function useStateStore(ns, key) {
191
196
 
192
197
  // src/hooks/useChat.ts
193
198
  import React5 from "react";
194
- function useChat(agentRef) {
199
+ function useChat(agentRef, options) {
195
200
  const client = useClient();
196
- const [chatId, setChatId] = React5.useState(null);
201
+ const [chatId, setChatId] = React5.useState(options?.chatId ?? null);
197
202
  const [messages, setMessages] = React5.useState([]);
198
203
  const [loading, setLoading] = React5.useState(false);
199
204
  const [streaming, setStreaming] = React5.useState(false);
200
205
  const [error, setError] = React5.useState(null);
206
+ const [pendingApprovals, setPendingApprovals] = React5.useState([]);
201
207
  const abortRef = React5.useRef(null);
208
+ const chatIdRef = React5.useRef(chatId);
209
+ chatIdRef.current = chatId;
210
+ React5.useEffect(() => {
211
+ if (!options?.chatId) return;
212
+ let cancelled = false;
213
+ setLoading(true);
214
+ getChat(client, options.chatId).then((detail) => {
215
+ if (cancelled) return;
216
+ setChatId(detail.id);
217
+ setMessages(detail.messages);
218
+ }).catch((e) => {
219
+ if (cancelled) return;
220
+ setError(e.message);
221
+ }).finally(() => {
222
+ if (!cancelled) setLoading(false);
223
+ });
224
+ return () => {
225
+ cancelled = true;
226
+ };
227
+ }, [client, options?.chatId]);
202
228
  React5.useEffect(() => {
203
229
  return () => {
204
230
  abortRef.current?.abort();
205
231
  };
206
232
  }, []);
207
- const doCreateChat = React5.useCallback(
208
- async (input) => {
209
- setLoading(true);
210
- setError(null);
211
- try {
212
- const result = await createChat(client, agentRef, input);
213
- setChatId(result.id);
214
- setMessages([]);
215
- return result.id;
216
- } catch (e) {
217
- setError(e.message);
218
- } finally {
219
- setLoading(false);
233
+ const handleStreamChunks = React5.useCallback(
234
+ (assistantId) => (chunk) => {
235
+ if (chunk.event === "message") {
236
+ try {
237
+ const parsed = JSON.parse(chunk.data);
238
+ if (parsed.content) {
239
+ setMessages(
240
+ (prev) => prev.map(
241
+ (m) => m.id === assistantId ? { ...m, content: (m.content || "") + parsed.content } : m
242
+ )
243
+ );
244
+ }
245
+ } catch {
246
+ setMessages(
247
+ (prev) => prev.map(
248
+ (m) => m.id === assistantId ? { ...m, content: (m.content || "") + chunk.data } : m
249
+ )
250
+ );
251
+ }
252
+ } else if (chunk.event === "approval_required") {
253
+ try {
254
+ const parsed = JSON.parse(chunk.data);
255
+ setPendingApprovals((prev) => [...prev, parsed]);
256
+ } catch {
257
+ }
258
+ } else if (chunk.event === "error") {
259
+ try {
260
+ const parsed = JSON.parse(chunk.data);
261
+ setError(parsed.error || "Stream error");
262
+ } catch {
263
+ setError(chunk.data || "Stream error");
264
+ }
220
265
  }
221
266
  },
222
- [client, agentRef]
267
+ []
223
268
  );
224
- const doSendMessage = React5.useCallback(
225
- async (content) => {
226
- if (!chatId) {
227
- setError("No active chat. Call createChat first.");
228
- return;
229
- }
230
- setLoading(true);
231
- setError(null);
232
- const userMsg = {
233
- id: `tmp-${Date.now()}`,
234
- chatId,
235
- role: "user",
236
- content,
237
- createdAt: (/* @__PURE__ */ new Date()).toISOString()
238
- };
239
- setMessages((prev) => [...prev, userMsg]);
269
+ const refreshMessages = React5.useCallback(
270
+ async (id) => {
240
271
  try {
241
- const msg = await sendMessage(client, chatId, content);
242
- setMessages((prev) => [...prev, msg]);
243
- return msg;
244
- } catch (e) {
245
- setError(e.message);
246
- } finally {
247
- setLoading(false);
272
+ const detail = await getChat(client, id);
273
+ setMessages(detail.messages);
274
+ } catch {
248
275
  }
249
276
  },
250
- [client, chatId]
277
+ [client]
251
278
  );
252
- const doStreamMessage = React5.useCallback(
279
+ const send = React5.useCallback(
253
280
  (content) => {
254
- if (!chatId) {
255
- setError("No active chat. Call createChat first.");
256
- return;
257
- }
258
- abortRef.current?.abort();
281
+ const doSend = async () => {
282
+ let activeChatId = chatIdRef.current;
283
+ if (!activeChatId) {
284
+ setLoading(true);
285
+ setError(null);
286
+ try {
287
+ const result = await createChat(client, agentRef, options?.input);
288
+ activeChatId = result.id;
289
+ setChatId(result.id);
290
+ chatIdRef.current = result.id;
291
+ } catch (e) {
292
+ setError(e.message);
293
+ setLoading(false);
294
+ return;
295
+ }
296
+ setLoading(false);
297
+ }
298
+ abortRef.current?.abort();
299
+ setStreaming(true);
300
+ setError(null);
301
+ setPendingApprovals([]);
302
+ const displayContent = typeof content === "string" ? content : JSON.stringify(content);
303
+ const userMsg = {
304
+ id: `tmp-user-${Date.now()}`,
305
+ chatId: activeChatId,
306
+ role: "user",
307
+ content: displayContent,
308
+ toolCalls: null,
309
+ toolCallId: null,
310
+ name: null,
311
+ createdAt: (/* @__PURE__ */ new Date()).toISOString()
312
+ };
313
+ setMessages((prev) => [...prev, userMsg]);
314
+ const assistantId = `tmp-assistant-${Date.now()}`;
315
+ const assistantMsg = {
316
+ id: assistantId,
317
+ chatId: activeChatId,
318
+ role: "assistant",
319
+ content: "",
320
+ toolCalls: null,
321
+ toolCallId: null,
322
+ name: null,
323
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
324
+ streaming: true
325
+ };
326
+ setMessages((prev) => [...prev, assistantMsg]);
327
+ const controller = streamMessage(
328
+ client,
329
+ activeChatId,
330
+ content,
331
+ handleStreamChunks(assistantId),
332
+ () => {
333
+ setStreaming(false);
334
+ refreshMessages(activeChatId);
335
+ },
336
+ (err) => {
337
+ setError(err.message);
338
+ setStreaming(false);
339
+ }
340
+ );
341
+ abortRef.current = controller;
342
+ };
343
+ doSend();
344
+ },
345
+ [client, agentRef, options?.input, handleStreamChunks, refreshMessages]
346
+ );
347
+ const handleApproval = React5.useCallback(
348
+ (toolCallId, approved) => {
349
+ const currentChatId = chatIdRef.current;
350
+ if (!currentChatId) return;
351
+ setPendingApprovals((prev) => prev.filter((a) => a.toolCallId !== toolCallId));
259
352
  setStreaming(true);
260
353
  setError(null);
261
- const userMsg = {
262
- id: `tmp-${Date.now()}`,
263
- chatId,
264
- role: "user",
265
- content,
266
- createdAt: (/* @__PURE__ */ new Date()).toISOString()
267
- };
268
- setMessages((prev) => [...prev, userMsg]);
269
- const assistantId = `stream-${Date.now()}`;
270
- const assistantMsg = {
271
- id: assistantId,
272
- chatId,
273
- role: "assistant",
274
- content: "",
275
- createdAt: (/* @__PURE__ */ new Date()).toISOString()
276
- };
277
- setMessages((prev) => [...prev, assistantMsg]);
278
- const controller = streamMessage(
279
- client,
280
- chatId,
281
- content,
282
- (chunk) => {
283
- if (chunk.event === "content" || chunk.event === "message") {
284
- setMessages(
285
- (prev) => prev.map(
286
- (m) => m.id === assistantId ? { ...m, content: m.content + chunk.data } : m
287
- )
288
- );
354
+ const assistantId = `tmp-resume-${Date.now()}`;
355
+ if (approved) {
356
+ const assistantMsg = {
357
+ id: assistantId,
358
+ chatId: currentChatId,
359
+ role: "assistant",
360
+ content: "",
361
+ toolCalls: null,
362
+ toolCallId: null,
363
+ name: null,
364
+ createdAt: (/* @__PURE__ */ new Date()).toISOString(),
365
+ streaming: true
366
+ };
367
+ setMessages((prev) => [...prev, assistantMsg]);
368
+ }
369
+ (async () => {
370
+ try {
371
+ const result = await approveToolCall(client, currentChatId, toolCallId, approved);
372
+ if (!approved) {
373
+ setStreaming(false);
374
+ refreshMessages(currentChatId);
375
+ return;
289
376
  }
290
- },
291
- () => {
292
- setStreaming(false);
293
- },
294
- (err) => {
295
- setError(err.message);
377
+ const controller = streamFromChannel(
378
+ client,
379
+ currentChatId,
380
+ result.channelId,
381
+ handleStreamChunks(assistantId),
382
+ () => {
383
+ setStreaming(false);
384
+ refreshMessages(currentChatId);
385
+ },
386
+ (err) => {
387
+ setError(err.message);
388
+ setStreaming(false);
389
+ }
390
+ );
391
+ abortRef.current = controller;
392
+ } catch (e) {
393
+ setError(e.message);
296
394
  setStreaming(false);
297
395
  }
298
- );
299
- abortRef.current = controller;
300
- return controller;
396
+ })();
301
397
  },
302
- [client, chatId]
398
+ [client, handleStreamChunks, refreshMessages]
399
+ );
400
+ const approve = React5.useCallback(
401
+ (toolCallId) => handleApproval(toolCallId, true),
402
+ [handleApproval]
403
+ );
404
+ const reject = React5.useCallback(
405
+ (toolCallId) => handleApproval(toolCallId, false),
406
+ [handleApproval]
303
407
  );
408
+ const stop = React5.useCallback(() => {
409
+ abortRef.current?.abort();
410
+ abortRef.current = null;
411
+ setStreaming(false);
412
+ }, []);
413
+ const clearError = React5.useCallback(() => {
414
+ setError(null);
415
+ }, []);
304
416
  return {
305
417
  chatId,
306
418
  messages,
307
419
  loading,
308
420
  streaming,
309
421
  error,
310
- createChat: doCreateChat,
311
- sendMessage: doSendMessage,
312
- streamMessage: doStreamMessage
422
+ pendingApprovals,
423
+ send,
424
+ approve,
425
+ reject,
426
+ stop,
427
+ clearError
313
428
  };
314
429
  }
315
430
 
@@ -334,14 +449,19 @@ export {
334
449
  SinasPermissionError,
335
450
  SinasProvider,
336
451
  SinasTimeoutError,
452
+ approveToolCall,
337
453
  createChat,
338
454
  executeFunction,
339
455
  executeQuery,
456
+ getChat,
457
+ listCollections,
458
+ listFiles,
340
459
  sendMessage,
341
460
  stateDelete,
342
461
  stateGet,
343
462
  stateList,
344
463
  stateSet,
464
+ streamFromChannel,
345
465
  streamMessage,
346
466
  useChat,
347
467
  useExecute,
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, sendMessage, streamMessage } from '../client/chat';\nimport { useClient } from './context';\nimport type { ChatMessage, SSEChunk } from '../client/types';\n\nexport interface UseChatResult {\n chatId: string | null;\n messages: ChatMessage[];\n loading: boolean;\n streaming: boolean;\n error: string | null;\n createChat: (input?: Record<string, unknown>) => Promise<string | undefined>;\n sendMessage: (content: string) => Promise<ChatMessage | undefined>;\n streamMessage: (content: string) => AbortController | undefined;\n}\n\nexport function useChat(agentRef: string): UseChatResult {\n const client = useClient();\n\n const [chatId, setChatId] = React.useState<string | null>(null);\n const [messages, setMessages] = React.useState<ChatMessage[]>([]);\n const [loading, setLoading] = React.useState(false);\n const [streaming, setStreaming] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n\n const abortRef = React.useRef<AbortController | null>(null);\n\n // Cleanup on unmount\n React.useEffect(() => {\n return () => {\n abortRef.current?.abort();\n };\n }, []);\n\n const doCreateChat = React.useCallback(\n async (input?: Record<string, unknown>) => {\n setLoading(true);\n setError(null);\n try {\n const result = await createChat(client, agentRef, input);\n setChatId(result.id);\n setMessages([]);\n return result.id;\n } catch (e) {\n setError((e as Error).message);\n } finally {\n setLoading(false);\n }\n },\n [client, agentRef]\n );\n\n const doSendMessage = React.useCallback(\n async (content: string) => {\n if (!chatId) {\n setError('No active chat. Call createChat first.');\n return;\n }\n setLoading(true);\n setError(null);\n\n // Add user message optimistically\n const userMsg: ChatMessage = {\n id: `tmp-${Date.now()}`,\n chatId,\n role: 'user',\n content,\n createdAt: new Date().toISOString(),\n };\n setMessages(prev => [...prev, userMsg]);\n\n try {\n const msg = await sendMessage(client, chatId, content);\n setMessages(prev => [...prev, msg]);\n return msg;\n } catch (e) {\n setError((e as Error).message);\n } finally {\n setLoading(false);\n }\n },\n [client, chatId]\n );\n\n const doStreamMessage = React.useCallback(\n (content: string) => {\n if (!chatId) {\n setError('No active chat. Call createChat first.');\n return;\n }\n\n abortRef.current?.abort();\n setStreaming(true);\n setError(null);\n\n // Add user message optimistically\n const userMsg: ChatMessage = {\n id: `tmp-${Date.now()}`,\n chatId,\n role: 'user',\n content,\n createdAt: new Date().toISOString(),\n };\n setMessages(prev => [...prev, userMsg]);\n\n // Add empty assistant message to accumulate chunks\n const assistantId = `stream-${Date.now()}`;\n const assistantMsg: ChatMessage = {\n id: assistantId,\n chatId,\n role: 'assistant',\n content: '',\n createdAt: new Date().toISOString(),\n };\n setMessages(prev => [...prev, assistantMsg]);\n\n const controller = streamMessage(\n client,\n chatId,\n content,\n (chunk: SSEChunk) => {\n if (chunk.event === 'content' || chunk.event === 'message') {\n setMessages(prev =>\n prev.map(m =>\n m.id === assistantId ? { ...m, content: m.content + chunk.data } : m\n )\n );\n }\n },\n () => {\n setStreaming(false);\n },\n (err: Error) => {\n setError(err.message);\n setStreaming(false);\n }\n );\n\n abortRef.current = controller;\n return controller;\n },\n [client, chatId]\n );\n\n return {\n chatId,\n messages,\n loading,\n streaming,\n error,\n createChat: doCreateChat,\n sendMessage: doSendMessage,\n streamMessage: doStreamMessage,\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":";;;;;;;;;;;;;;;;;;;AAAA,OAAOA,YAAW;;;ACAlB,OAAO,WAAW;AAGlB,IAAM,eAAe,MAAM,cAAkC,IAAI;AAO1D,SAAS,cAAc,EAAE,QAAQ,SAAS,GAAuB;AACtE,QAAM,QAAQ,MAAM,QAAQ,MAAM,UAAU,IAAI,YAAY,GAAG,CAAC,MAAM,CAAC;AACvE,SAAO,MAAM,cAAc,aAAa,UAAU,EAAE,MAAM,GAAG,QAAQ;AACvE;AAEO,SAAS,YAAyB;AACvC,QAAM,SAAS,MAAM,WAAW,YAAY;AAC5C,MAAI,OAAQ,QAAO;AAEnB,SAAO;AACT;AAEA,IAAM,gBAAgB,IAAI,YAAY;;;ADJ/B,SAAS,SACd,KACA,QAAiC,CAAC,GAClC,UAA2B,CAAC,GACZ;AAChB,QAAM,SAAS,UAAU;AACzB,QAAM,EAAE,UAAU,MAAM,kBAAkB,KAAK,IAAI;AAEnD,QAAM,CAAC,MAAM,OAAO,IAAIC,OAAM,SAA2C,IAAI;AAC7E,QAAM,CAAC,SAAS,UAAU,IAAIA,OAAM,SAAS,KAAK;AAClD,QAAM,CAAC,OAAO,QAAQ,IAAIA,OAAM,SAAwB,IAAI;AAC5D,QAAM,CAAC,UAAU,WAAW,IAAIA,OAAM,SAAwB,IAAI;AAElE,QAAM,WAAWA,OAAM,OAA+B,IAAI;AAC1D,QAAM,YAAY,KAAK,UAAU,KAAK;AAEtC,QAAM,UAAUA,OAAM;AAAA,IACpB,OAAO,kBAA4C;AACjD,eAAS,SAAS,MAAM;AACxB,YAAM,aAAa,IAAI,gBAAgB;AACvC,eAAS,UAAU;AAEnB,iBAAW,IAAI;AACf,eAAS,IAAI;AACb,UAAI;AACF,cAAM,SAAS,MAAM;AAAA,UACnB;AAAA,UACA;AAAA,UACA,iBAAiB,KAAK,MAAM,SAAS;AAAA,QACvC;AACA,YAAI,CAAC,WAAW,OAAO,SAAS;AAC9B,kBAAQ,OAAO,QAAQ,IAAI;AAC3B,sBAAY,OAAO,YAAY,OAAO,gBAAgB,IAAI;AAAA,QAC5D;AACA,eAAO;AAAA,MACT,SAAS,GAAG;AACV,YAAI,CAAC,WAAW,OAAO,SAAS;AAC9B,mBAAU,EAAY,OAAO;AAAA,QAC/B;AAAA,MACF,UAAE;AACA,YAAI,CAAC,WAAW,OAAO,SAAS;AAC9B,qBAAW,KAAK;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,KAAK,SAAS;AAAA,EACzB;AAEA,EAAAA,OAAM,UAAU,MAAM;AACpB,QAAI,SAAS;AACX,cAAQ;AAAA,IACV;AACA,WAAO,MAAM;AACX,eAAS,SAAS,MAAM;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,SAAS,OAAO,CAAC;AAErB,EAAAA,OAAM,UAAU,MAAM;AACpB,QAAI,mBAAmB,SAAS;AAC9B,YAAM,KAAK,YAAY,SAAS,eAAe;AAC/C,aAAO,MAAM,cAAc,EAAE;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,iBAAiB,SAAS,OAAO,CAAC;AAEtC,SAAO,EAAE,MAAM,SAAS,OAAO,UAAU,SAAS,QAAQ;AAC5D;;;AEnFA,OAAOC,YAAW;AAaX,SAAS,WAAW,KAA+B;AACxD,QAAM,SAAS,UAAU;AAEzB,QAAM,CAAC,QAAQ,SAAS,IAAIC,OAAM,SAAkB,IAAI;AACxD,QAAM,CAAC,SAAS,UAAU,IAAIA,OAAM,SAAS,KAAK;AAClD,QAAM,CAAC,OAAO,QAAQ,IAAIA,OAAM,SAAwB,IAAI;AAC5D,QAAM,CAAC,aAAa,cAAc,IAAIA,OAAM,SAAwB,IAAI;AAExE,QAAM,UAAUA,OAAM;AAAA,IACpB,OAAO,QAAiC,CAAC,GAAG,YAAqB;AAC/D,iBAAW,IAAI;AACf,eAAS,IAAI;AACb,UAAI;AACF,cAAM,OAAO,MAAM,gBAAgB,QAAQ,KAAK,OAAO,OAAO;AAC9D,kBAAU,KAAK,MAAM;AACrB,uBAAe,KAAK,WAAW;AAC/B,YAAI,KAAK,WAAW,SAAS;AAC3B,mBAAS,KAAK,SAAS,2BAA2B;AAAA,QACpD,WAAW,KAAK,WAAW,WAAW;AACpC,mBAAS,8BAA8B;AAAA,QACzC;AACA,eAAO;AAAA,MACT,SAAS,GAAG;AACV,iBAAU,EAAY,OAAO;AAAA,MAC/B,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,GAAG;AAAA,EACd;AAEA,SAAO,EAAE,SAAS,QAAQ,SAAS,OAAO,YAAY;AACxD;;;AC7CA,OAAOC,YAAW;AAmBX,SAAS,cAAc,IAAY,KAAmC;AAC3E,QAAM,SAAS,UAAU;AAEzB,QAAM,CAAC,OAAO,QAAQ,IAAIC,OAAM,SAAkB,IAAI;AACtD,QAAM,CAAC,SAAS,UAAU,IAAIA,OAAM,SAAS,IAAI;AACjD,QAAM,CAAC,OAAO,QAAQ,IAAIA,OAAM,SAAwB,IAAI;AAE5D,QAAM,OAAOA,OAAM,YAAY,YAAY;AACzC,QAAI,CAAC,KAAK;AACR,iBAAW,KAAK;AAChB;AAAA,IACF;AACA,eAAW,IAAI;AACf,aAAS,IAAI;AACb,QAAI;AACF,YAAM,SAAS,MAAM,SAAS,QAAQ,IAAI,GAAG;AAC7C,UAAI,OAAO,OAAO;AAChB,iBAAS,OAAO,KAAK;AAAA,MACvB,OAAO;AACL,iBAAS,IAAI;AAAA,MACf;AAAA,IACF,SAAS,GAAG;AACV,eAAU,EAAY,OAAO;AAAA,IAC/B,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC;AAEpB,QAAM,OAAOA,OAAM;AAAA,IACjB,OAAO,UAAmB,SAAgC;AACxD,UAAI,CAAC,IAAK,OAAM,IAAI,MAAM,2BAA2B;AACrD,eAAS,QAAQ;AACjB,eAAS,IAAI;AACb,UAAI;AACF,cAAM,SAAS,QAAQ,IAAI,KAAK,UAAU,MAAM,UAAU;AAAA,MAC5D,SAAS,GAAG;AACV,iBAAU,EAAY,OAAO;AAC7B,cAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,IAAI,GAAG;AAAA,EAClB;AAEA,QAAM,SAASA,OAAM,YAAY,YAAY;AAC3C,QAAI,CAAC,IAAK,OAAM,IAAI,MAAM,6BAA6B;AACvD,aAAS,IAAI;AACb,aAAS,IAAI;AACb,QAAI;AACF,YAAM,YAAY,QAAQ,IAAI,GAAG;AAAA,IACnC,SAAS,GAAG;AACV,eAAU,EAAY,OAAO;AAC7B,YAAM;AAAA,IACR;AAAA,EACF,GAAG,CAAC,QAAQ,IAAI,GAAG,CAAC;AAEpB,QAAM,OAAOA,OAAM,YAAY,YAAY;AACzC,aAAS,IAAI;AACb,QAAI;AACF,aAAO,MAAM,UAAU,QAAQ,EAAE;AAAA,IACnC,SAAS,GAAG;AACV,eAAU,EAAY,OAAO;AAAA,IAC/B;AAAA,EACF,GAAG,CAAC,QAAQ,EAAE,CAAC;AAEf,EAAAA,OAAM,UAAU,MAAM;AACpB,SAAK;AAAA,EACP,GAAG,CAAC,IAAI,CAAC;AAET,SAAO,EAAE,OAAO,SAAS,OAAO,MAAM,QAAQ,SAAS,MAAM,KAAK;AACpE;;;ACxFA,OAAOC,YAAW;AAgBX,SAAS,QAAQ,UAAiC;AACvD,QAAM,SAAS,UAAU;AAEzB,QAAM,CAAC,QAAQ,SAAS,IAAIC,OAAM,SAAwB,IAAI;AAC9D,QAAM,CAAC,UAAU,WAAW,IAAIA,OAAM,SAAwB,CAAC,CAAC;AAChE,QAAM,CAAC,SAAS,UAAU,IAAIA,OAAM,SAAS,KAAK;AAClD,QAAM,CAAC,WAAW,YAAY,IAAIA,OAAM,SAAS,KAAK;AACtD,QAAM,CAAC,OAAO,QAAQ,IAAIA,OAAM,SAAwB,IAAI;AAE5D,QAAM,WAAWA,OAAM,OAA+B,IAAI;AAG1D,EAAAA,OAAM,UAAU,MAAM;AACpB,WAAO,MAAM;AACX,eAAS,SAAS,MAAM;AAAA,IAC1B;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,eAAeA,OAAM;AAAA,IACzB,OAAO,UAAoC;AACzC,iBAAW,IAAI;AACf,eAAS,IAAI;AACb,UAAI;AACF,cAAM,SAAS,MAAM,WAAW,QAAQ,UAAU,KAAK;AACvD,kBAAU,OAAO,EAAE;AACnB,oBAAY,CAAC,CAAC;AACd,eAAO,OAAO;AAAA,MAChB,SAAS,GAAG;AACV,iBAAU,EAAY,OAAO;AAAA,MAC/B,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,QAAQ;AAAA,EACnB;AAEA,QAAM,gBAAgBA,OAAM;AAAA,IAC1B,OAAO,YAAoB;AACzB,UAAI,CAAC,QAAQ;AACX,iBAAS,wCAAwC;AACjD;AAAA,MACF;AACA,iBAAW,IAAI;AACf,eAAS,IAAI;AAGb,YAAM,UAAuB;AAAA,QAC3B,IAAI,OAAO,KAAK,IAAI,CAAC;AAAA,QACrB;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC;AACA,kBAAY,UAAQ,CAAC,GAAG,MAAM,OAAO,CAAC;AAEtC,UAAI;AACF,cAAM,MAAM,MAAM,YAAY,QAAQ,QAAQ,OAAO;AACrD,oBAAY,UAAQ,CAAC,GAAG,MAAM,GAAG,CAAC;AAClC,eAAO;AAAA,MACT,SAAS,GAAG;AACV,iBAAU,EAAY,OAAO;AAAA,MAC/B,UAAE;AACA,mBAAW,KAAK;AAAA,MAClB;AAAA,IACF;AAAA,IACA,CAAC,QAAQ,MAAM;AAAA,EACjB;AAEA,QAAM,kBAAkBA,OAAM;AAAA,IAC5B,CAAC,YAAoB;AACnB,UAAI,CAAC,QAAQ;AACX,iBAAS,wCAAwC;AACjD;AAAA,MACF;AAEA,eAAS,SAAS,MAAM;AACxB,mBAAa,IAAI;AACjB,eAAS,IAAI;AAGb,YAAM,UAAuB;AAAA,QAC3B,IAAI,OAAO,KAAK,IAAI,CAAC;AAAA,QACrB;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC;AACA,kBAAY,UAAQ,CAAC,GAAG,MAAM,OAAO,CAAC;AAGtC,YAAM,cAAc,UAAU,KAAK,IAAI,CAAC;AACxC,YAAM,eAA4B;AAAA,QAChC,IAAI;AAAA,QACJ;AAAA,QACA,MAAM;AAAA,QACN,SAAS;AAAA,QACT,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC;AACA,kBAAY,UAAQ,CAAC,GAAG,MAAM,YAAY,CAAC;AAE3C,YAAM,aAAa;AAAA,QACjB;AAAA,QACA;AAAA,QACA;AAAA,QACA,CAAC,UAAoB;AACnB,cAAI,MAAM,UAAU,aAAa,MAAM,UAAU,WAAW;AAC1D;AAAA,cAAY,UACV,KAAK;AAAA,gBAAI,OACP,EAAE,OAAO,cAAc,EAAE,GAAG,GAAG,SAAS,EAAE,UAAU,MAAM,KAAK,IAAI;AAAA,cACrE;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,MAAM;AACJ,uBAAa,KAAK;AAAA,QACpB;AAAA,QACA,CAAC,QAAe;AACd,mBAAS,IAAI,OAAO;AACpB,uBAAa,KAAK;AAAA,QACpB;AAAA,MACF;AAEA,eAAS,UAAU;AACnB,aAAO;AAAA,IACT;AAAA,IACA,CAAC,QAAQ,MAAM;AAAA,EACjB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,eAAe;AAAA,EACjB;AACF;;;ACxIO,SAAS,WAA2B;AACzC,QAAM,SAAS,UAAU;AAEzB,SAAO;AAAA,IACL,QAAQ,OAAO,UAAU;AAAA,IACzB,OAAO,OAAO,SAAS;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;","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 UseChatResult {\n chatId: string | null;\n messages: ChatSessionMessage[];\n loading: boolean;\n streaming: boolean;\n error: string | null;\n pendingApprovals: ApprovalRequest[];\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\n const abortRef = React.useRef<AbortController | null>(null);\n const chatIdRef = React.useRef<string | null>(chatId);\n chatIdRef.current = chatId;\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 (assistantId: string) => (chunk: SSEChunk) => {\n if (chunk.event === 'message') {\n try {\n const parsed = JSON.parse(chunk.data);\n if (parsed.content) {\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantId\n ? { ...m, content: (m.content || '') + parsed.content }\n : m,\n ),\n );\n }\n } catch {\n // Non-JSON content chunk — append raw data\n setMessages((prev) =>\n prev.map((m) =>\n m.id === assistantId\n ? { ...m, content: (m.content || '') + chunk.data }\n : m,\n ),\n );\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\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 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(assistantId),\n () => {\n setStreaming(false);\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 },\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 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(assistantId),\n () => {\n setStreaming(false);\n refreshMessages(currentChatId);\n },\n (err: Error) => {\n setError(err.message);\n setStreaming(false);\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 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"]}