@sinas/sdk 0.2.3 → 0.5.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/{chunk-Z6NVKMMG.js → chunk-IABVF56L.js} +189 -18
- package/dist/chunk-IABVF56L.js.map +1 -0
- package/dist/client.cjs +198 -19
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts +118 -5
- package/dist/client.d.ts +118 -5
- package/dist/client.js +19 -3
- package/dist/index.cjs +331 -102
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +41 -4
- package/dist/index.d.ts +41 -4
- package/dist/index.js +151 -86
- package/dist/index.js.map +1 -1
- package/dist/sinas-sdk.umd.js +321 -101
- package/dist/sinas-sdk.umd.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-Z6NVKMMG.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -1,18 +1,25 @@
|
|
|
1
1
|
import {
|
|
2
2
|
SinasAuthError,
|
|
3
3
|
SinasClient,
|
|
4
|
+
SinasClientAuth,
|
|
4
5
|
SinasError,
|
|
5
6
|
SinasNotFoundError,
|
|
6
7
|
SinasPermissionError,
|
|
7
8
|
SinasTimeoutError,
|
|
8
9
|
approveToolCall,
|
|
10
|
+
checkPermissions,
|
|
9
11
|
createChat,
|
|
10
12
|
executeFunction,
|
|
11
13
|
executeQuery,
|
|
12
14
|
generateFileUrl,
|
|
13
15
|
getChat,
|
|
16
|
+
getInfo,
|
|
17
|
+
getMe,
|
|
14
18
|
listCollections,
|
|
15
19
|
listFiles,
|
|
20
|
+
login,
|
|
21
|
+
logout,
|
|
22
|
+
refresh,
|
|
16
23
|
sendMessage,
|
|
17
24
|
stateDelete,
|
|
18
25
|
stateGet,
|
|
@@ -20,8 +27,9 @@ import {
|
|
|
20
27
|
stateSet,
|
|
21
28
|
streamFromChannel,
|
|
22
29
|
streamMessage,
|
|
23
|
-
uploadFile
|
|
24
|
-
|
|
30
|
+
uploadFile,
|
|
31
|
+
verifyOTP
|
|
32
|
+
} from "./chunk-IABVF56L.js";
|
|
25
33
|
|
|
26
34
|
// src/hooks/useQuery.ts
|
|
27
35
|
import React2 from "react";
|
|
@@ -29,8 +37,14 @@ import React2 from "react";
|
|
|
29
37
|
// src/hooks/context.ts
|
|
30
38
|
import React from "react";
|
|
31
39
|
var SinasContext = React.createContext(null);
|
|
32
|
-
function SinasProvider({ client, children }) {
|
|
33
|
-
const value = React.useMemo(
|
|
40
|
+
function SinasProvider({ client, options, children }) {
|
|
41
|
+
const value = React.useMemo(
|
|
42
|
+
() => client || new SinasClient(options),
|
|
43
|
+
// We intentionally only re-create when `client` reference changes; `options`
|
|
44
|
+
// is expected to be a stable object (callbacks reading from localStorage).
|
|
45
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
46
|
+
[client]
|
|
47
|
+
);
|
|
34
48
|
return React.createElement(SinasContext.Provider, { value }, children);
|
|
35
49
|
}
|
|
36
50
|
function useClient() {
|
|
@@ -210,8 +224,6 @@ function useChat(agentRef, options) {
|
|
|
210
224
|
const abortRef = React5.useRef(null);
|
|
211
225
|
const chatIdRef = React5.useRef(chatId);
|
|
212
226
|
chatIdRef.current = chatId;
|
|
213
|
-
const activeAssistantIdRef = React5.useRef("");
|
|
214
|
-
const activeToolCallMsgIdRef = React5.useRef("");
|
|
215
227
|
React5.useEffect(() => {
|
|
216
228
|
if (!options?.chatId) return;
|
|
217
229
|
let cancelled = false;
|
|
@@ -241,24 +253,34 @@ function useChat(agentRef, options) {
|
|
|
241
253
|
const handleStreamChunks = React5.useCallback(
|
|
242
254
|
(chunk) => {
|
|
243
255
|
if (chunk.event === "message") {
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
(m) => m.id === targetId ? { ...m, content: (m.content || "") + parsed.content } : m
|
|
251
|
-
)
|
|
252
|
-
);
|
|
256
|
+
const newContent = (() => {
|
|
257
|
+
try {
|
|
258
|
+
const parsed = JSON.parse(chunk.data);
|
|
259
|
+
return parsed.content || "";
|
|
260
|
+
} catch {
|
|
261
|
+
return chunk.data;
|
|
253
262
|
}
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
263
|
+
})();
|
|
264
|
+
if (!newContent) return;
|
|
265
|
+
setMessages((prev) => {
|
|
266
|
+
const last = prev[prev.length - 1];
|
|
267
|
+
if (last && last.role === "assistant" && !last.toolCalls && last.streaming) {
|
|
268
|
+
const next = [...prev];
|
|
269
|
+
next[next.length - 1] = { ...last, content: (last.content || "") + newContent };
|
|
270
|
+
return next;
|
|
271
|
+
}
|
|
272
|
+
return [...prev, {
|
|
273
|
+
id: `tmp-text-${Date.now()}`,
|
|
274
|
+
chatId: chatIdRef.current || "",
|
|
275
|
+
role: "assistant",
|
|
276
|
+
content: newContent,
|
|
277
|
+
toolCalls: null,
|
|
278
|
+
toolCallId: null,
|
|
279
|
+
name: null,
|
|
280
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
281
|
+
streaming: true
|
|
282
|
+
}];
|
|
283
|
+
});
|
|
262
284
|
} else if (chunk.event === "tool_start") {
|
|
263
285
|
try {
|
|
264
286
|
const parsed = JSON.parse(chunk.data);
|
|
@@ -266,35 +288,29 @@ function useChat(agentRef, options) {
|
|
|
266
288
|
...prev,
|
|
267
289
|
{ toolCallId: parsed.tool_call_id, name: parsed.name, description: parsed.description, status: "running" }
|
|
268
290
|
]);
|
|
269
|
-
const placeholderId = activeAssistantIdRef.current;
|
|
270
|
-
const toolCallMsg = {
|
|
271
|
-
id: `tmp-tc-${parsed.tool_call_id}`,
|
|
272
|
-
chatId: chatIdRef.current || "",
|
|
273
|
-
role: "assistant",
|
|
274
|
-
content: null,
|
|
275
|
-
toolCalls: [{
|
|
276
|
-
id: parsed.tool_call_id,
|
|
277
|
-
type: "function",
|
|
278
|
-
function: { name: parsed.name, arguments: parsed.arguments || "{}" },
|
|
279
|
-
description: parsed.description
|
|
280
|
-
}],
|
|
281
|
-
toolCallId: null,
|
|
282
|
-
name: null,
|
|
283
|
-
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
284
|
-
streaming: true
|
|
285
|
-
};
|
|
286
291
|
setMessages((prev) => {
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
);
|
|
290
|
-
if (alreadyExists) return prev;
|
|
291
|
-
const idx = prev.findIndex((m) => m.id === placeholderId);
|
|
292
|
-
if (idx >= 0) {
|
|
293
|
-
const next = [...prev];
|
|
294
|
-
next.splice(idx, 0, toolCallMsg);
|
|
295
|
-
return next;
|
|
292
|
+
if (prev.some((m) => m.toolCalls?.some((tc) => tc.id === parsed.tool_call_id))) {
|
|
293
|
+
return prev;
|
|
296
294
|
}
|
|
297
|
-
|
|
295
|
+
const next = prev.map(
|
|
296
|
+
(m, i) => i === prev.length - 1 && m.streaming && m.role === "assistant" && !m.toolCalls ? { ...m, streaming: false } : m
|
|
297
|
+
);
|
|
298
|
+
return [...next, {
|
|
299
|
+
id: `tmp-tc-${parsed.tool_call_id}`,
|
|
300
|
+
chatId: chatIdRef.current || "",
|
|
301
|
+
role: "assistant",
|
|
302
|
+
content: null,
|
|
303
|
+
toolCalls: [{
|
|
304
|
+
id: parsed.tool_call_id,
|
|
305
|
+
type: "function",
|
|
306
|
+
function: { name: parsed.name, arguments: parsed.arguments || "{}" },
|
|
307
|
+
description: parsed.description
|
|
308
|
+
}],
|
|
309
|
+
toolCallId: null,
|
|
310
|
+
name: null,
|
|
311
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
312
|
+
streaming: true
|
|
313
|
+
}];
|
|
298
314
|
});
|
|
299
315
|
} catch {
|
|
300
316
|
}
|
|
@@ -396,20 +412,6 @@ function useChat(agentRef, options) {
|
|
|
396
412
|
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
397
413
|
};
|
|
398
414
|
setMessages((prev) => [...prev, userMsg]);
|
|
399
|
-
const assistantId = `tmp-assistant-${Date.now()}`;
|
|
400
|
-
activeAssistantIdRef.current = assistantId;
|
|
401
|
-
const assistantMsg = {
|
|
402
|
-
id: assistantId,
|
|
403
|
-
chatId: activeChatId,
|
|
404
|
-
role: "assistant",
|
|
405
|
-
content: "",
|
|
406
|
-
toolCalls: null,
|
|
407
|
-
toolCallId: null,
|
|
408
|
-
name: null,
|
|
409
|
-
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
410
|
-
streaming: true
|
|
411
|
-
};
|
|
412
|
-
setMessages((prev) => [...prev, assistantMsg]);
|
|
413
415
|
const controller = streamMessage(
|
|
414
416
|
client,
|
|
415
417
|
activeChatId,
|
|
@@ -418,11 +420,6 @@ function useChat(agentRef, options) {
|
|
|
418
420
|
() => {
|
|
419
421
|
setStreaming(false);
|
|
420
422
|
setToolStatus([]);
|
|
421
|
-
setMessages(
|
|
422
|
-
(prev) => prev.filter(
|
|
423
|
-
(m) => !(m.streaming && m.role === "assistant" && !m.content && !m.toolCalls)
|
|
424
|
-
)
|
|
425
|
-
);
|
|
426
423
|
refreshMessages(activeChatId);
|
|
427
424
|
},
|
|
428
425
|
(err) => {
|
|
@@ -444,22 +441,6 @@ function useChat(agentRef, options) {
|
|
|
444
441
|
setPendingApprovals((prev) => prev.filter((a) => a.toolCallId !== toolCallId));
|
|
445
442
|
setStreaming(true);
|
|
446
443
|
setError(null);
|
|
447
|
-
const assistantId = `tmp-resume-${Date.now()}`;
|
|
448
|
-
activeAssistantIdRef.current = assistantId;
|
|
449
|
-
if (approved) {
|
|
450
|
-
const assistantMsg = {
|
|
451
|
-
id: assistantId,
|
|
452
|
-
chatId: currentChatId,
|
|
453
|
-
role: "assistant",
|
|
454
|
-
content: "",
|
|
455
|
-
toolCalls: null,
|
|
456
|
-
toolCallId: null,
|
|
457
|
-
name: null,
|
|
458
|
-
createdAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
459
|
-
streaming: true
|
|
460
|
-
};
|
|
461
|
-
setMessages((prev) => [...prev, assistantMsg]);
|
|
462
|
-
}
|
|
463
444
|
(async () => {
|
|
464
445
|
try {
|
|
465
446
|
const result = await approveToolCall(client, currentChatId, toolCallId, approved);
|
|
@@ -538,22 +519,104 @@ function useSinas() {
|
|
|
538
519
|
useChat
|
|
539
520
|
};
|
|
540
521
|
}
|
|
522
|
+
|
|
523
|
+
// src/hooks/useAuth.ts
|
|
524
|
+
import React6 from "react";
|
|
525
|
+
function useAuth(options = {}) {
|
|
526
|
+
const { autoRefresh = true } = options;
|
|
527
|
+
const client = useClient();
|
|
528
|
+
const [status, setStatus] = React6.useState("loading");
|
|
529
|
+
const [user, setUser] = React6.useState(null);
|
|
530
|
+
const [info, setInfo] = React6.useState(null);
|
|
531
|
+
const [error, setError] = React6.useState(null);
|
|
532
|
+
const refresh2 = React6.useCallback(async () => {
|
|
533
|
+
setError(null);
|
|
534
|
+
try {
|
|
535
|
+
const [infoResp, meResp] = await Promise.all([
|
|
536
|
+
client.auth.getInfo().catch(() => null),
|
|
537
|
+
client.getAccessToken() ? client.auth.getMe().catch(() => null) : Promise.resolve(null)
|
|
538
|
+
]);
|
|
539
|
+
if (infoResp) setInfo(infoResp);
|
|
540
|
+
if (meResp) {
|
|
541
|
+
setUser(meResp);
|
|
542
|
+
setStatus("authenticated");
|
|
543
|
+
} else {
|
|
544
|
+
setUser(null);
|
|
545
|
+
setStatus("unauthenticated");
|
|
546
|
+
}
|
|
547
|
+
} catch (e) {
|
|
548
|
+
setError(e instanceof Error ? e.message : String(e));
|
|
549
|
+
setStatus("unauthenticated");
|
|
550
|
+
}
|
|
551
|
+
}, [client]);
|
|
552
|
+
React6.useEffect(() => {
|
|
553
|
+
if (autoRefresh) void refresh2();
|
|
554
|
+
}, [autoRefresh, refresh2]);
|
|
555
|
+
const login2 = React6.useCallback(
|
|
556
|
+
async (email, password) => {
|
|
557
|
+
setError(null);
|
|
558
|
+
try {
|
|
559
|
+
return await client.auth.login({ email, password });
|
|
560
|
+
} catch (e) {
|
|
561
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
562
|
+
setError(msg);
|
|
563
|
+
throw e;
|
|
564
|
+
}
|
|
565
|
+
},
|
|
566
|
+
[client]
|
|
567
|
+
);
|
|
568
|
+
const verifyOTP2 = React6.useCallback(
|
|
569
|
+
async (sessionId, otpCode) => {
|
|
570
|
+
setError(null);
|
|
571
|
+
try {
|
|
572
|
+
return await client.auth.verifyOTP({ session_id: sessionId, otp_code: otpCode });
|
|
573
|
+
} catch (e) {
|
|
574
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
575
|
+
setError(msg);
|
|
576
|
+
throw e;
|
|
577
|
+
}
|
|
578
|
+
},
|
|
579
|
+
[client]
|
|
580
|
+
);
|
|
581
|
+
const logout2 = React6.useCallback(
|
|
582
|
+
async (refreshToken) => {
|
|
583
|
+
if (refreshToken) {
|
|
584
|
+
try {
|
|
585
|
+
await client.auth.logout(refreshToken);
|
|
586
|
+
} catch (e) {
|
|
587
|
+
if (!(e instanceof SinasAuthError)) throw e;
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
setUser(null);
|
|
591
|
+
setStatus("unauthenticated");
|
|
592
|
+
},
|
|
593
|
+
[client]
|
|
594
|
+
);
|
|
595
|
+
return { status, user, info, error, refresh: refresh2, login: login2, verifyOTP: verifyOTP2, logout: logout2 };
|
|
596
|
+
}
|
|
541
597
|
export {
|
|
542
598
|
SinasAuthError,
|
|
543
599
|
SinasClient,
|
|
600
|
+
SinasClientAuth,
|
|
544
601
|
SinasError,
|
|
545
602
|
SinasNotFoundError,
|
|
546
603
|
SinasPermissionError,
|
|
547
604
|
SinasProvider,
|
|
548
605
|
SinasTimeoutError,
|
|
549
606
|
approveToolCall,
|
|
607
|
+
checkPermissions,
|
|
550
608
|
createChat,
|
|
551
609
|
executeFunction,
|
|
552
610
|
executeQuery,
|
|
553
611
|
generateFileUrl,
|
|
554
612
|
getChat,
|
|
613
|
+
getInfo,
|
|
614
|
+
getMe,
|
|
555
615
|
listCollections,
|
|
556
616
|
listFiles,
|
|
617
|
+
login,
|
|
618
|
+
logout,
|
|
619
|
+
refresh,
|
|
557
620
|
sendMessage,
|
|
558
621
|
stateDelete,
|
|
559
622
|
stateGet,
|
|
@@ -562,11 +625,13 @@ export {
|
|
|
562
625
|
streamFromChannel,
|
|
563
626
|
streamMessage,
|
|
564
627
|
uploadFile,
|
|
628
|
+
useAuth,
|
|
565
629
|
useChat,
|
|
566
630
|
useClient,
|
|
567
631
|
useExecute,
|
|
568
632
|
useQuery,
|
|
569
633
|
useSinas,
|
|
570
|
-
useStateStore
|
|
634
|
+
useStateStore,
|
|
635
|
+
verifyOTP
|
|
571
636
|
};
|
|
572
637
|
//# sourceMappingURL=index.js.map
|
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 ToolResult {\n content: string;\n name: string;\n}\n\nexport interface ChatSessionMessage extends ChatMessageFull {\n /** True while streaming content is being appended */\n streaming?: boolean;\n /** Inline tool results keyed by tool_call_id (merged from tool_end events) */\n toolResults?: Record<string, ToolResult>;\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 const activeToolCallMsgIdRef = 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 description: parsed.description,\n }],\n toolCallId: null,\n name: null,\n createdAt: new Date().toISOString(),\n streaming: true,\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 // Merge result into the existing tool call message (same bubble)\n if (parsed.result !== undefined) {\n const resultContent = typeof parsed.result === 'string' ? parsed.result : JSON.stringify(parsed.result);\n setMessages((prev) =>\n prev.map((m) => {\n if (m.toolCalls?.some((tc) => tc.id === parsed.tool_call_id)) {\n return {\n ...m,\n toolResults: {\n ...m.toolResults,\n [parsed.tool_call_id]: { content: resultContent, name: parsed.name },\n },\n };\n }\n return m;\n }),\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"]}
|
|
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","../src/hooks/useAuth.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, type SinasClientOptions } from '../client/SinasClient';\n\nconst SinasContext = React.createContext<SinasClient | null>(null);\n\nexport interface SinasProviderProps {\n /** Pre-built client. If provided, options below are ignored. */\n client?: SinasClient;\n /** Standalone-mode options (baseUrl, token callbacks, etc.). */\n options?: SinasClientOptions;\n children: React.ReactNode;\n}\n\nexport function SinasProvider({ client, options, children }: SinasProviderProps) {\n const value = React.useMemo(\n () => client || new SinasClient(options),\n // We intentionally only re-create when `client` reference changes; `options`\n // is expected to be a stable object (callbacks reading from localStorage).\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [client],\n );\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 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 ToolResult {\n content: string;\n name: string;\n}\n\nexport interface ChatSessionMessage extends ChatMessageFull {\n /** True while streaming content is being appended */\n streaming?: boolean;\n /** Inline tool results keyed by tool_call_id (merged from tool_end events) */\n toolResults?: Record<string, ToolResult>;\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\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 // Append text to the last assistant text message, or create a new one.\n const newContent = (() => {\n try {\n const parsed = JSON.parse(chunk.data);\n return parsed.content || '';\n } catch {\n return chunk.data;\n }\n })();\n if (!newContent) return;\n setMessages((prev) => {\n const last = prev[prev.length - 1];\n if (last && last.role === 'assistant' && !last.toolCalls && last.streaming) {\n // Append to existing text message\n const next = [...prev];\n next[next.length - 1] = { ...last, content: (last.content || '') + newContent };\n return next;\n }\n // Create a new text message\n return [...prev, {\n id: `tmp-text-${Date.now()}`,\n chatId: chatIdRef.current || '',\n role: 'assistant' as const,\n content: newContent,\n toolCalls: null,\n toolCallId: null,\n name: null,\n createdAt: new Date().toISOString(),\n streaming: true,\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 setMessages((prev) => {\n if (prev.some((m) => m.toolCalls?.some((tc) => tc.id === parsed.tool_call_id))) {\n return prev;\n }\n // Stop streaming on previous text message (freeze it in place)\n const next = prev.map((m, i) =>\n i === prev.length - 1 && m.streaming && m.role === 'assistant' && !m.toolCalls\n ? { ...m, streaming: false }\n : m,\n );\n return [...next, {\n id: `tmp-tc-${parsed.tool_call_id}`,\n chatId: chatIdRef.current || '',\n role: 'assistant' as const,\n content: null,\n toolCalls: [{\n id: parsed.tool_call_id,\n type: 'function' as const,\n function: { name: parsed.name, arguments: parsed.arguments || '{}' },\n description: parsed.description,\n }],\n toolCallId: null,\n name: null,\n createdAt: new Date().toISOString(),\n streaming: true,\n }];\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 // Merge result into the existing tool call message (same bubble)\n if (parsed.result !== undefined) {\n const resultContent = typeof parsed.result === 'string' ? parsed.result : JSON.stringify(parsed.result);\n setMessages((prev) =>\n prev.map((m) => {\n if (m.toolCalls?.some((tc) => tc.id === parsed.tool_call_id)) {\n return {\n ...m,\n toolResults: {\n ...m.toolResults,\n [parsed.tool_call_id]: { content: resultContent, name: parsed.name },\n },\n };\n }\n return m;\n }),\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 const controller = streamMessage(\n client,\n activeChatId,\n content,\n handleStreamChunks,\n () => {\n setStreaming(false);\n setToolStatus([]);\n // Refresh to get authoritative server state\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 // No placeholder needed — handleStreamChunks creates messages on demand\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","import React from 'react';\nimport { useClient } from './context';\nimport { SinasAuthError } from '../client/errors';\nimport type {\n AuthUser,\n InfoResponse,\n LoginResponse,\n OTPVerifyResponse,\n} from '../client/types';\n\nexport type AuthStatus = 'loading' | 'authenticated' | 'unauthenticated';\n\nexport interface UseAuthResult {\n status: AuthStatus;\n user: AuthUser | null;\n info: InfoResponse | null;\n error: string | null;\n\n /**\n * Refresh the session by calling /auth/me with the current access token.\n * Call this on app boot and after token changes.\n */\n refresh: () => Promise<void>;\n\n /**\n * Start a login. In password-only mode this completes the login and\n * returns access/refresh tokens. In OTP / password+OTP mode the response\n * carries a `session_id` to feed into `verifyOTP`.\n */\n login: (email: string, password?: string) => Promise<LoginResponse>;\n\n /** Second step for OTP / password+OTP. Returns the final tokens. */\n verifyOTP: (sessionId: string, otpCode: string) => Promise<OTPVerifyResponse>;\n\n /** Revoke the refresh token and clear local auth state. */\n logout: (refreshToken?: string) => Promise<void>;\n}\n\nexport interface UseAuthOptions {\n /** Refresh on mount. Default true. */\n autoRefresh?: boolean;\n}\n\n/**\n * React hook for the standalone Sinas login flow. The hosting app is\n * responsible for storing the tokens it receives (typically in localStorage)\n * and wiring `getAccessToken` / `getRefreshToken` / `onTokenRefresh` on the\n * SinasProvider so this hook can read the current session.\n */\nexport function useAuth(options: UseAuthOptions = {}): UseAuthResult {\n const { autoRefresh = true } = options;\n const client = useClient();\n\n const [status, setStatus] = React.useState<AuthStatus>('loading');\n const [user, setUser] = React.useState<AuthUser | null>(null);\n const [info, setInfo] = React.useState<InfoResponse | null>(null);\n const [error, setError] = React.useState<string | null>(null);\n\n const refresh = React.useCallback(async () => {\n setError(null);\n try {\n // Fetch /info in parallel with /me (info is unauthenticated and cheap).\n const [infoResp, meResp] = await Promise.all([\n client.auth.getInfo().catch(() => null),\n client.getAccessToken() ? client.auth.getMe().catch(() => null) : Promise.resolve(null),\n ]);\n if (infoResp) setInfo(infoResp);\n if (meResp) {\n setUser(meResp);\n setStatus('authenticated');\n } else {\n setUser(null);\n setStatus('unauthenticated');\n }\n } catch (e) {\n setError(e instanceof Error ? e.message : String(e));\n setStatus('unauthenticated');\n }\n }, [client]);\n\n React.useEffect(() => {\n if (autoRefresh) void refresh();\n }, [autoRefresh, refresh]);\n\n const login = React.useCallback(\n async (email: string, password?: string) => {\n setError(null);\n try {\n return await client.auth.login({ email, password });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n setError(msg);\n throw e;\n }\n },\n [client],\n );\n\n const verifyOTP = React.useCallback(\n async (sessionId: string, otpCode: string) => {\n setError(null);\n try {\n return await client.auth.verifyOTP({ session_id: sessionId, otp_code: otpCode });\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n setError(msg);\n throw e;\n }\n },\n [client],\n );\n\n const logout = React.useCallback(\n async (refreshToken?: string) => {\n if (refreshToken) {\n try {\n await client.auth.logout(refreshToken);\n } catch (e) {\n if (!(e instanceof SinasAuthError)) throw e;\n }\n }\n setUser(null);\n setStatus('unauthenticated');\n },\n [client],\n );\n\n return { status, user, info, error, refresh, login, verifyOTP, logout };\n}\n"],"mappings":"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","names":["React","React","React","React","React","React","React","React","React","React","refresh","login","verifyOTP","logout"]}
|