@raisindb/client 0.1.16 → 0.1.18

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.
Files changed (44) hide show
  1. package/README.md +281 -70
  2. package/dist/chunk-DJDP5CX6.mjs +866 -0
  3. package/dist/chunk-DJDP5CX6.mjs.map +1 -0
  4. package/dist/chunk-JRFBP4WK.mjs +170 -0
  5. package/dist/chunk-JRFBP4WK.mjs.map +1 -0
  6. package/dist/chunk-OLJOZIIU.mjs +1348 -0
  7. package/dist/chunk-OLJOZIIU.mjs.map +1 -0
  8. package/dist/chunk-T2ZSNYFG.mjs +248 -0
  9. package/dist/chunk-T2ZSNYFG.mjs.map +1 -0
  10. package/dist/chunk-VZX3ACSO.mjs +190 -0
  11. package/dist/chunk-VZX3ACSO.mjs.map +1 -0
  12. package/dist/chunk-WFBAWOVM.mjs +532 -0
  13. package/dist/chunk-WFBAWOVM.mjs.map +1 -0
  14. package/dist/conversation-list-store-CNcVagmw.d.mts +6120 -0
  15. package/dist/conversation-list-store-CNcVagmw.d.ts +6120 -0
  16. package/dist/index-DQjE-4Oj.d.ts +301 -0
  17. package/dist/index-FkFH4HHQ.d.mts +301 -0
  18. package/dist/index.d.mts +66 -6108
  19. package/dist/index.d.ts +66 -6108
  20. package/dist/index.js +859 -109
  21. package/dist/index.js.map +1 -0
  22. package/dist/index.mjs +639 -3108
  23. package/dist/index.mjs.map +1 -0
  24. package/dist/react.d.mts +4 -0
  25. package/dist/react.d.ts +4 -0
  26. package/dist/react.js +2500 -0
  27. package/dist/react.js.map +1 -0
  28. package/dist/react.mjs +9 -0
  29. package/dist/react.mjs.map +1 -0
  30. package/dist/svelte-sql-62EaYoeM.d.ts +52 -0
  31. package/dist/svelte-sql-CgT-Ij-P.d.mts +52 -0
  32. package/dist/svelte.d.mts +288 -0
  33. package/dist/svelte.d.ts +288 -0
  34. package/dist/svelte.js +2413 -0
  35. package/dist/svelte.js.map +1 -0
  36. package/dist/svelte.mjs +25 -0
  37. package/dist/svelte.mjs.map +1 -0
  38. package/dist/vue.d.mts +197 -0
  39. package/dist/vue.d.ts +197 -0
  40. package/dist/vue.js +1441 -0
  41. package/dist/vue.js.map +1 -0
  42. package/dist/vue.mjs +9 -0
  43. package/dist/vue.mjs.map +1 -0
  44. package/package.json +18 -3
@@ -0,0 +1,532 @@
1
+ import {
2
+ FlowClient
3
+ } from "./chunk-DJDP5CX6.mjs";
4
+ import {
5
+ ConversationListStore,
6
+ ConversationStore
7
+ } from "./chunk-OLJOZIIU.mjs";
8
+
9
+ // src/integrations/react/use-auth.ts
10
+ function createUseAuth(react, context) {
11
+ return function useAuth() {
12
+ const { useState, useEffect, useRef, useCallback, useContext } = react;
13
+ const ctx = useContext(context);
14
+ if (!ctx) {
15
+ throw new Error("useAuth must be used within a <RaisinProvider>");
16
+ }
17
+ const { client } = ctx;
18
+ const [user, setUser] = useState(client.getStoredUser());
19
+ const [isLoading, setIsLoading] = useState(false);
20
+ const mountedRef = useRef(true);
21
+ useEffect(() => {
22
+ mountedRef.current = true;
23
+ const unsubAuth = client.onAuthStateChange(({ event, session }) => {
24
+ if (!mountedRef.current) return;
25
+ if (event === "SIGNED_IN" || event === "TOKEN_REFRESHED" || event === "USER_UPDATED") {
26
+ setUser(session.user);
27
+ } else if (event === "SIGNED_OUT" || event === "SESSION_EXPIRED") {
28
+ setUser(null);
29
+ }
30
+ });
31
+ const unsubUser = client.onUserChange(({ node }) => {
32
+ if (!mountedRef.current) return;
33
+ setUser((prev) => {
34
+ if (!prev) return prev;
35
+ return {
36
+ ...prev,
37
+ home: node.path,
38
+ displayName: node.properties.display_name ?? prev.displayName,
39
+ avatarUrl: node.properties.avatar_url ?? prev.avatarUrl
40
+ };
41
+ });
42
+ });
43
+ return () => {
44
+ mountedRef.current = false;
45
+ unsubAuth();
46
+ unsubUser();
47
+ };
48
+ }, [client]);
49
+ const login = useCallback(async (email, password, repository) => {
50
+ setIsLoading(true);
51
+ try {
52
+ const result = await client.loginWithEmail(email, password, repository);
53
+ return result;
54
+ } finally {
55
+ if (mountedRef.current) setIsLoading(false);
56
+ }
57
+ }, [client]);
58
+ const register = useCallback(async (email, password, repository, displayName) => {
59
+ setIsLoading(true);
60
+ try {
61
+ const result = await client.registerWithEmail(email, password, repository, displayName);
62
+ return result;
63
+ } finally {
64
+ if (mountedRef.current) setIsLoading(false);
65
+ }
66
+ }, [client]);
67
+ const logout = useCallback(async (options) => {
68
+ setIsLoading(true);
69
+ try {
70
+ await client.logout(options);
71
+ } finally {
72
+ if (mountedRef.current) setIsLoading(false);
73
+ }
74
+ }, [client]);
75
+ const initSession = useCallback(async (repository) => {
76
+ setIsLoading(true);
77
+ try {
78
+ const result = await client.initSession(repository);
79
+ return result;
80
+ } finally {
81
+ if (mountedRef.current) setIsLoading(false);
82
+ }
83
+ }, [client]);
84
+ return {
85
+ user,
86
+ isAuthenticated: user !== null,
87
+ isLoading,
88
+ login,
89
+ register,
90
+ logout,
91
+ initSession
92
+ };
93
+ };
94
+ }
95
+
96
+ // src/integrations/react/use-connection.ts
97
+ function createUseConnection(react, context) {
98
+ return function useConnection() {
99
+ const { useState, useEffect, useCallback, useContext } = react;
100
+ const ctx = useContext(context);
101
+ if (!ctx) {
102
+ throw new Error("useConnection must be used within a <RaisinProvider>");
103
+ }
104
+ const { client } = ctx;
105
+ const [state, setState] = useState(client.getConnectionState());
106
+ const [isReady, setIsReady] = useState(client.isReady());
107
+ useEffect(() => {
108
+ const unsubConn = client.onConnectionStateChange((newState) => {
109
+ setState(newState);
110
+ });
111
+ const unsubReady = client.onReadyStateChange((ready) => {
112
+ setIsReady(ready);
113
+ });
114
+ return () => {
115
+ unsubConn();
116
+ unsubReady();
117
+ };
118
+ }, [client]);
119
+ const connect = useCallback(async () => {
120
+ await client.connect();
121
+ }, [client]);
122
+ const disconnect = useCallback(() => {
123
+ client.disconnect();
124
+ }, [client]);
125
+ return {
126
+ state,
127
+ isConnected: state === "connected" /* Connected */,
128
+ isReady,
129
+ connect,
130
+ disconnect
131
+ };
132
+ };
133
+ }
134
+
135
+ // src/integrations/react/use-sql.ts
136
+ function rowsToObjects(result) {
137
+ return result.rows;
138
+ }
139
+ function createUseSql(react, context) {
140
+ return function useSql(sql, params, options) {
141
+ const { useState, useEffect, useRef, useCallback, useContext } = react;
142
+ const ctx = useContext(context);
143
+ if (!ctx) {
144
+ throw new Error("useSql must be used within a <RaisinProvider>");
145
+ }
146
+ const { client, repository: defaultRepo } = ctx;
147
+ const [data, setData] = useState(null);
148
+ const [isLoading, setIsLoading] = useState(false);
149
+ const [error, setError] = useState(null);
150
+ const mountedRef = useRef(true);
151
+ const enabled = options?.enabled !== false;
152
+ const repo = options?.repository ?? defaultRepo;
153
+ const refetchOnReconnect = options?.refetchOnReconnect !== false;
154
+ const realtime = options?.realtime;
155
+ const paramsKey = params ? JSON.stringify(params) : "";
156
+ const fetchData = useCallback(async () => {
157
+ if (!repo) return;
158
+ setIsLoading(true);
159
+ setError(null);
160
+ try {
161
+ const db = client.database(repo);
162
+ const result = await db.executeSql(sql, params);
163
+ if (mountedRef.current) {
164
+ setData(rowsToObjects(result));
165
+ }
166
+ } catch (err) {
167
+ if (mountedRef.current) {
168
+ setError(err instanceof Error ? err : new Error(String(err)));
169
+ }
170
+ } finally {
171
+ if (mountedRef.current) {
172
+ setIsLoading(false);
173
+ }
174
+ }
175
+ }, [client, repo, sql, paramsKey]);
176
+ useEffect(() => {
177
+ mountedRef.current = true;
178
+ if (enabled) {
179
+ fetchData();
180
+ }
181
+ return () => {
182
+ mountedRef.current = false;
183
+ };
184
+ }, [enabled, fetchData]);
185
+ useEffect(() => {
186
+ if (!enabled || !refetchOnReconnect) return;
187
+ const unsub = client.onReconnected(() => {
188
+ fetchData();
189
+ });
190
+ return unsub;
191
+ }, [client, enabled, refetchOnReconnect, fetchData]);
192
+ useEffect(() => {
193
+ if (!enabled || !realtime || !repo) return;
194
+ const db = client.database(repo);
195
+ let unsubscribe;
196
+ db.events().subscribe(
197
+ {
198
+ workspace: realtime.workspace,
199
+ event_types: realtime.eventTypes,
200
+ path: realtime.path,
201
+ node_type: realtime.nodeType
202
+ },
203
+ () => {
204
+ fetchData();
205
+ }
206
+ ).then((sub) => {
207
+ unsubscribe = () => sub.unsubscribe();
208
+ });
209
+ return () => {
210
+ unsubscribe?.();
211
+ };
212
+ }, [client, enabled, repo, realtime?.workspace, realtime?.path, realtime?.nodeType, fetchData]);
213
+ return {
214
+ data,
215
+ isLoading,
216
+ error,
217
+ refetch: fetchData
218
+ };
219
+ };
220
+ }
221
+
222
+ // src/integrations/react/use-subscription.ts
223
+ function createUseSubscription(react, context) {
224
+ return function useSubscription(options, callback) {
225
+ const { useEffect, useRef, useContext } = react;
226
+ const ctx = useContext(context);
227
+ if (!ctx) {
228
+ throw new Error("useSubscription must be used within a <RaisinProvider>");
229
+ }
230
+ const { client, repository } = ctx;
231
+ const callbackRef = useRef(callback);
232
+ callbackRef.current = callback;
233
+ const enabled = options.enabled !== false;
234
+ useEffect(() => {
235
+ if (!enabled || !repository || !options.workspace) return;
236
+ const db = client.database(repository);
237
+ let unsubscribe;
238
+ let cancelled = false;
239
+ db.events().subscribe(
240
+ {
241
+ workspace: options.workspace,
242
+ event_types: options.event_types,
243
+ path: options.path,
244
+ node_type: options.node_type,
245
+ include_node: options.include_node
246
+ },
247
+ (event) => {
248
+ if (!cancelled) {
249
+ callbackRef.current(event);
250
+ }
251
+ }
252
+ ).then((sub) => {
253
+ if (cancelled) {
254
+ sub.unsubscribe();
255
+ } else {
256
+ unsubscribe = () => sub.unsubscribe();
257
+ }
258
+ });
259
+ return () => {
260
+ cancelled = true;
261
+ unsubscribe?.();
262
+ };
263
+ }, [client, repository, enabled, options.workspace, options.path, options.node_type, options.include_node]);
264
+ };
265
+ }
266
+
267
+ // src/integrations/react-conversation.ts
268
+ var INITIAL_SNAPSHOT = {
269
+ conversation: null,
270
+ messages: [],
271
+ isStreaming: false,
272
+ isWaiting: false,
273
+ streamingText: "",
274
+ error: null,
275
+ activeToolCalls: [],
276
+ plans: [],
277
+ isLoading: false,
278
+ conversationPath: null
279
+ };
280
+ function useConversation(react, options) {
281
+ const { useState, useEffect, useRef, useCallback } = react;
282
+ const [snapshot, setSnapshot] = useState(INITIAL_SNAPSHOT);
283
+ const storeRef = useRef(null);
284
+ useEffect(() => {
285
+ const store = new ConversationStore(options);
286
+ storeRef.current = store;
287
+ const unsubscribe = store.subscribe((next) => setSnapshot(next));
288
+ return () => {
289
+ unsubscribe();
290
+ store.destroy();
291
+ storeRef.current = null;
292
+ };
293
+ }, [options.conversationPath]);
294
+ const sendMessage = useCallback(async (content) => {
295
+ await storeRef.current?.sendMessage(content);
296
+ }, []);
297
+ const approvePlan = useCallback(async (planPath) => {
298
+ await storeRef.current?.approvePlan(planPath);
299
+ }, []);
300
+ const rejectPlan = useCallback(async (planPath, feedback) => {
301
+ await storeRef.current?.rejectPlan(planPath, feedback);
302
+ }, []);
303
+ const stop = useCallback(() => {
304
+ storeRef.current?.stop();
305
+ }, []);
306
+ const loadMessages = useCallback(async () => {
307
+ return await storeRef.current?.loadMessages() ?? [];
308
+ }, []);
309
+ return {
310
+ ...snapshot,
311
+ sendMessage,
312
+ approvePlan,
313
+ rejectPlan,
314
+ stop,
315
+ loadMessages
316
+ };
317
+ }
318
+ var INITIAL_LIST_SNAPSHOT = {
319
+ conversations: [],
320
+ totalUnreadCount: 0,
321
+ isLoading: true,
322
+ error: null
323
+ };
324
+ function useConversationList(react, options) {
325
+ const { useState, useEffect, useRef, useCallback } = react;
326
+ const [snapshot, setSnapshot] = useState(INITIAL_LIST_SNAPSHOT);
327
+ const storeRef = useRef(null);
328
+ useEffect(() => {
329
+ const store = new ConversationListStore(options);
330
+ storeRef.current = store;
331
+ const unsubscribe = store.subscribe((next) => setSnapshot(next));
332
+ store.load();
333
+ return () => {
334
+ unsubscribe();
335
+ store.destroy();
336
+ storeRef.current = null;
337
+ };
338
+ }, [options.type, options.realtime]);
339
+ const createConversation = useCallback(async (opts) => {
340
+ return storeRef.current.createConversation(opts);
341
+ }, []);
342
+ const deleteConversation = useCallback(async (conversationPath) => {
343
+ await storeRef.current?.deleteConversation(conversationPath);
344
+ }, []);
345
+ const markAsRead = useCallback(async (conversationPath) => {
346
+ await storeRef.current?.markAsRead(conversationPath);
347
+ }, []);
348
+ return {
349
+ ...snapshot,
350
+ createConversation,
351
+ deleteConversation,
352
+ markAsRead
353
+ };
354
+ }
355
+
356
+ // src/integrations/react-flow.ts
357
+ function useFlow(react, options) {
358
+ const { useState, useEffect, useRef, useCallback } = react;
359
+ const [events, setEvents] = useState([]);
360
+ const [status, setStatus] = useState("idle");
361
+ const [error, setError] = useState(null);
362
+ const [output, setOutput] = useState(null);
363
+ const [instanceId, setInstanceId] = useState(null);
364
+ const clientRef = useRef(null);
365
+ const abortRef = useRef(false);
366
+ useEffect(() => {
367
+ if (options.database) {
368
+ clientRef.current = options.database.flow;
369
+ } else if (options.baseUrl && options.repository && options.authManager) {
370
+ clientRef.current = new FlowClient(
371
+ options.baseUrl,
372
+ options.repository,
373
+ options.authManager,
374
+ options.clientOptions,
375
+ options.flowsApi
376
+ );
377
+ }
378
+ return () => {
379
+ abortRef.current = true;
380
+ clientRef.current = null;
381
+ };
382
+ }, [options.database, options.baseUrl, options.repository]);
383
+ const run = useCallback(async (flowPath, input = {}) => {
384
+ const client = clientRef.current;
385
+ if (!client) return;
386
+ abortRef.current = false;
387
+ setEvents([]);
388
+ setError(null);
389
+ setOutput(null);
390
+ setStatus("running");
391
+ try {
392
+ const result = await client.run(flowPath, input);
393
+ setInstanceId(result.instance_id);
394
+ for await (const event of client.streamEvents(result.instance_id)) {
395
+ if (abortRef.current) break;
396
+ setEvents((prev) => [...prev, event]);
397
+ if (event.type === "flow_waiting") {
398
+ setStatus("waiting");
399
+ } else if (event.type === "flow_completed") {
400
+ setOutput(event.output);
401
+ setStatus("completed");
402
+ } else if (event.type === "flow_failed") {
403
+ setError(event.error);
404
+ setStatus("failed");
405
+ }
406
+ }
407
+ } catch (err) {
408
+ setError(err instanceof Error ? err.message : String(err));
409
+ setStatus("failed");
410
+ }
411
+ }, []);
412
+ const resume = useCallback(async (data) => {
413
+ const client = clientRef.current;
414
+ if (!client || !instanceId) return;
415
+ setStatus("running");
416
+ setError(null);
417
+ try {
418
+ const stream = await client.createEventStream(instanceId);
419
+ await client.resume(instanceId, data);
420
+ for await (const event of stream.events) {
421
+ if (abortRef.current) break;
422
+ setEvents((prev) => [...prev, event]);
423
+ if (event.type === "flow_waiting") {
424
+ setStatus("waiting");
425
+ stream.close();
426
+ return;
427
+ } else if (event.type === "flow_completed") {
428
+ setOutput(event.output);
429
+ setStatus("completed");
430
+ stream.close();
431
+ return;
432
+ } else if (event.type === "flow_failed") {
433
+ setError(event.error);
434
+ setStatus("failed");
435
+ stream.close();
436
+ return;
437
+ }
438
+ }
439
+ stream.close();
440
+ } catch (err) {
441
+ setError(err instanceof Error ? err.message : String(err));
442
+ setStatus("failed");
443
+ }
444
+ }, [instanceId]);
445
+ const reset = useCallback(() => {
446
+ abortRef.current = true;
447
+ setEvents([]);
448
+ setStatus("idle");
449
+ setError(null);
450
+ setOutput(null);
451
+ setInstanceId(null);
452
+ }, []);
453
+ return {
454
+ events,
455
+ status,
456
+ isRunning: status === "running",
457
+ error,
458
+ output,
459
+ instanceId,
460
+ run,
461
+ resume,
462
+ reset
463
+ };
464
+ }
465
+
466
+ // src/integrations/react/index.ts
467
+ function createRaisinReact(react) {
468
+ const RaisinContext = react.createContext(null);
469
+ function RaisinProvider(props) {
470
+ const { client, repository, children } = props;
471
+ const value = react.useMemo(
472
+ () => ({ client, repository }),
473
+ [client, repository]
474
+ );
475
+ return react.createElement(
476
+ RaisinContext.Provider,
477
+ { value },
478
+ children
479
+ );
480
+ }
481
+ function useRaisinClient() {
482
+ const ctx = react.useContext(RaisinContext);
483
+ if (!ctx) {
484
+ throw new Error("useRaisinClient must be used within a <RaisinProvider>");
485
+ }
486
+ return ctx.client;
487
+ }
488
+ function useDatabase(repository) {
489
+ const ctx = react.useContext(RaisinContext);
490
+ if (!ctx) {
491
+ throw new Error("useDatabase must be used within a <RaisinProvider>");
492
+ }
493
+ const repo = repository ?? ctx.repository;
494
+ if (!repo) {
495
+ throw new Error("useDatabase requires a repository \u2014 pass it as an argument or set it on <RaisinProvider>");
496
+ }
497
+ return react.useMemo(() => ctx.client.database(repo), [ctx.client, repo]);
498
+ }
499
+ const useAuth = createUseAuth(react, RaisinContext);
500
+ const useConnection = createUseConnection(react, RaisinContext);
501
+ const useSql = createUseSql(react, RaisinContext);
502
+ const useSubscription = createUseSubscription(react, RaisinContext);
503
+ function useConversation2(options) {
504
+ return useConversation(react, options);
505
+ }
506
+ function useConversationList2(options) {
507
+ return useConversationList(react, options);
508
+ }
509
+ function useFlow2(options) {
510
+ return useFlow(react, options);
511
+ }
512
+ return {
513
+ RaisinProvider,
514
+ useRaisinClient,
515
+ useDatabase,
516
+ useAuth,
517
+ useConnection,
518
+ useSql,
519
+ useSubscription,
520
+ useConversation: useConversation2,
521
+ useConversationList: useConversationList2,
522
+ useFlow: useFlow2
523
+ };
524
+ }
525
+
526
+ export {
527
+ useConversation,
528
+ useConversationList,
529
+ useFlow,
530
+ createRaisinReact
531
+ };
532
+ //# sourceMappingURL=chunk-WFBAWOVM.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/integrations/react/use-auth.ts","../src/integrations/react/use-connection.ts","../src/integrations/react/use-sql.ts","../src/integrations/react/use-subscription.ts","../src/integrations/react-conversation.ts","../src/integrations/react-flow.ts","../src/integrations/react/index.ts"],"sourcesContent":["import type { ReactLikeWithContext, ReactContext, RaisinContextValue, UseAuthReturn } from './types';\nimport type { IdentityUser } from '../../auth';\n\nexport function createUseAuth(\n react: ReactLikeWithContext,\n context: ReactContext<RaisinContextValue | null>,\n): () => UseAuthReturn {\n return function useAuth(): UseAuthReturn {\n const { useState, useEffect, useRef, useCallback, useContext } = react;\n\n const ctx = useContext(context);\n if (!ctx) {\n throw new Error('useAuth must be used within a <RaisinProvider>');\n }\n const { client } = ctx;\n\n const [user, setUser] = useState<IdentityUser | null>(client.getStoredUser());\n const [isLoading, setIsLoading] = useState(false);\n const mountedRef = useRef(true);\n\n useEffect(() => {\n mountedRef.current = true;\n\n const unsubAuth = client.onAuthStateChange(({ event, session }) => {\n if (!mountedRef.current) return;\n if (event === 'SIGNED_IN' || event === 'TOKEN_REFRESHED' || event === 'USER_UPDATED') {\n setUser(session.user);\n } else if (event === 'SIGNED_OUT' || event === 'SESSION_EXPIRED') {\n setUser(null);\n }\n });\n\n const unsubUser = client.onUserChange(({ node }) => {\n if (!mountedRef.current) return;\n // Update user with the latest node properties\n setUser((prev) => {\n if (!prev) return prev;\n return {\n ...prev,\n home: node.path,\n displayName: (node.properties.display_name as string) ?? prev.displayName,\n avatarUrl: (node.properties.avatar_url as string) ?? prev.avatarUrl,\n };\n });\n });\n\n return () => {\n mountedRef.current = false;\n unsubAuth();\n unsubUser();\n };\n }, [client]);\n\n const login = useCallback(async (email: string, password: string, repository: string) => {\n setIsLoading(true);\n try {\n const result = await client.loginWithEmail(email, password, repository);\n return result;\n } finally {\n if (mountedRef.current) setIsLoading(false);\n }\n }, [client]);\n\n const register = useCallback(async (email: string, password: string, repository: string, displayName?: string) => {\n setIsLoading(true);\n try {\n const result = await client.registerWithEmail(email, password, repository, displayName);\n return result;\n } finally {\n if (mountedRef.current) setIsLoading(false);\n }\n }, [client]);\n\n const logout = useCallback(async (options?: { disconnect?: boolean; reconnect?: boolean }) => {\n setIsLoading(true);\n try {\n await client.logout(options);\n } finally {\n if (mountedRef.current) setIsLoading(false);\n }\n }, [client]);\n\n const initSession = useCallback(async (repository: string) => {\n setIsLoading(true);\n try {\n const result = await client.initSession(repository);\n return result;\n } finally {\n if (mountedRef.current) setIsLoading(false);\n }\n }, [client]);\n\n return {\n user,\n isAuthenticated: user !== null,\n isLoading,\n login,\n register,\n logout,\n initSession,\n };\n };\n}\n","import type { ReactLikeWithContext, ReactContext, RaisinContextValue, UseConnectionReturn } from './types';\nimport { ConnectionState } from '../../connection';\n\nexport function createUseConnection(\n react: ReactLikeWithContext,\n context: ReactContext<RaisinContextValue | null>,\n): () => UseConnectionReturn {\n return function useConnection(): UseConnectionReturn {\n const { useState, useEffect, useCallback, useContext } = react;\n\n const ctx = useContext(context);\n if (!ctx) {\n throw new Error('useConnection must be used within a <RaisinProvider>');\n }\n const { client } = ctx;\n\n const [state, setState] = useState<ConnectionState>(client.getConnectionState());\n const [isReady, setIsReady] = useState(client.isReady());\n\n useEffect(() => {\n const unsubConn = client.onConnectionStateChange((newState) => {\n setState(newState);\n });\n\n const unsubReady = client.onReadyStateChange((ready) => {\n setIsReady(ready);\n });\n\n return () => {\n unsubConn();\n unsubReady();\n };\n }, [client]);\n\n const connect = useCallback(async () => {\n await client.connect();\n }, [client]);\n\n const disconnect = useCallback(() => {\n client.disconnect();\n }, [client]);\n\n return {\n state,\n isConnected: state === ConnectionState.Connected,\n isReady,\n connect,\n disconnect,\n };\n };\n}\n","import type { ReactLikeWithContext, ReactContext, RaisinContextValue, UseSqlOptions, UseSqlReturn } from './types';\nimport type { SqlResult } from '../../protocol';\n\nfunction rowsToObjects<T>(result: SqlResult): T[] {\n return result.rows as T[];\n}\n\nexport function createUseSql(\n react: ReactLikeWithContext,\n context: ReactContext<RaisinContextValue | null>,\n): <T = Record<string, unknown>>(sql: string, params?: unknown[], options?: UseSqlOptions) => UseSqlReturn<T> {\n return function useSql<T = Record<string, unknown>>(\n sql: string,\n params?: unknown[],\n options?: UseSqlOptions,\n ): UseSqlReturn<T> {\n const { useState, useEffect, useRef, useCallback, useContext } = react;\n\n const ctx = useContext(context);\n if (!ctx) {\n throw new Error('useSql must be used within a <RaisinProvider>');\n }\n const { client, repository: defaultRepo } = ctx;\n\n const [data, setData] = useState<T[] | null>(null);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n const mountedRef = useRef(true);\n\n const enabled = options?.enabled !== false;\n const repo = options?.repository ?? defaultRepo;\n const refetchOnReconnect = options?.refetchOnReconnect !== false;\n const realtime = options?.realtime;\n\n // Serialize params for dependency comparison\n const paramsKey = params ? JSON.stringify(params) : '';\n\n const fetchData = useCallback(async () => {\n if (!repo) return;\n setIsLoading(true);\n setError(null);\n try {\n const db = client.database(repo);\n const result = await db.executeSql(sql, params);\n if (mountedRef.current) {\n setData(rowsToObjects<T>(result));\n }\n } catch (err) {\n if (mountedRef.current) {\n setError(err instanceof Error ? err : new Error(String(err)));\n }\n } finally {\n if (mountedRef.current) {\n setIsLoading(false);\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, repo, sql, paramsKey]);\n\n // Initial fetch and re-fetch on query/params change\n useEffect(() => {\n mountedRef.current = true;\n if (enabled) {\n fetchData();\n }\n return () => {\n mountedRef.current = false;\n };\n }, [enabled, fetchData]);\n\n // Refetch on reconnect\n useEffect(() => {\n if (!enabled || !refetchOnReconnect) return;\n\n const unsub = client.onReconnected(() => {\n fetchData();\n });\n return unsub;\n }, [client, enabled, refetchOnReconnect, fetchData]);\n\n // Realtime subscription: refetch on matching events\n useEffect(() => {\n if (!enabled || !realtime || !repo) return;\n\n const db = client.database(repo);\n let unsubscribe: (() => Promise<void>) | undefined;\n\n db.events().subscribe(\n {\n workspace: realtime.workspace,\n event_types: realtime.eventTypes,\n path: realtime.path,\n node_type: realtime.nodeType,\n },\n () => {\n fetchData();\n },\n ).then((sub) => {\n unsubscribe = () => sub.unsubscribe();\n });\n\n return () => {\n unsubscribe?.();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, enabled, repo, realtime?.workspace, realtime?.path, realtime?.nodeType, fetchData]);\n\n return {\n data,\n isLoading,\n error,\n refetch: fetchData,\n };\n };\n}\n","import type { ReactLikeWithContext, ReactContext, RaisinContextValue, UseSubscriptionOptions } from './types';\nimport type { EventMessage } from '../../protocol';\n\nexport function createUseSubscription(\n react: ReactLikeWithContext,\n context: ReactContext<RaisinContextValue | null>,\n): (options: UseSubscriptionOptions, callback: (event: EventMessage) => void) => void {\n return function useSubscription(\n options: UseSubscriptionOptions,\n callback: (event: EventMessage) => void,\n ): void {\n const { useEffect, useRef, useContext } = react;\n\n const ctx = useContext(context);\n if (!ctx) {\n throw new Error('useSubscription must be used within a <RaisinProvider>');\n }\n const { client, repository } = ctx;\n\n // callbackRef pattern: avoid re-subscribing when callback identity changes\n const callbackRef = useRef(callback);\n callbackRef.current = callback;\n\n const enabled = options.enabled !== false;\n\n useEffect(() => {\n if (!enabled || !repository || !options.workspace) return;\n\n const db = client.database(repository);\n let unsubscribe: (() => Promise<void>) | undefined;\n let cancelled = false;\n\n db.events().subscribe(\n {\n workspace: options.workspace,\n event_types: options.event_types,\n path: options.path,\n node_type: options.node_type,\n include_node: options.include_node,\n },\n (event) => {\n if (!cancelled) {\n callbackRef.current(event);\n }\n },\n ).then((sub) => {\n if (cancelled) {\n sub.unsubscribe();\n } else {\n unsubscribe = () => sub.unsubscribe();\n }\n });\n\n return () => {\n cancelled = true;\n unsubscribe?.();\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, repository, enabled, options.workspace, options.path, options.node_type, options.include_node]);\n };\n}\n","/**\n * React adapters for the RaisinDB conversation stores.\n *\n * Since the SDK does not depend on React, the hooks accept React as a\n * parameter to avoid a hard dependency while providing full type safety.\n *\n * @example\n * ```tsx\n * import React from 'react';\n * import { useConversation, useConversationList } from '@raisindb/client';\n *\n * function Chat() {\n * const chat = useConversation(React, {\n * database: db,\n * conversationPath: '/...',\n * });\n * return (\n * <div>\n * {chat.messages.map((m, i) => <div key={i}>{m.content}</div>)}\n * {chat.isStreaming && <p>{chat.streamingText}</p>}\n * </div>\n * );\n * }\n * ```\n */\n\nimport {\n ConversationStore,\n type ConversationStoreOptions,\n type ConversationStoreSnapshot,\n} from '../stores/conversation-store';\nimport {\n ConversationListStore,\n type ConversationListStoreOptions,\n type ConversationListSnapshot,\n} from '../stores/conversation-list-store';\nimport type { ChatMessage, ConversationListItem } from '../types/chat';\n\n/** Minimal subset of the React API needed by the hooks */\nexport interface ReactLike {\n useState<T>(initial: T | (() => T)): [T, (value: T | ((prev: T) => T)) => void];\n useEffect(effect: () => void | (() => void), deps?: unknown[]): void;\n useRef<T>(initial: T): { current: T };\n useCallback<T extends (...args: never[]) => unknown>(fn: T, deps: unknown[]): T;\n}\n\n// ---------------------------------------------------------------------------\n// useConversation\n// ---------------------------------------------------------------------------\n\nconst INITIAL_SNAPSHOT: ConversationStoreSnapshot = {\n conversation: null,\n messages: [],\n isStreaming: false,\n isWaiting: false,\n streamingText: '',\n error: null,\n activeToolCalls: [],\n plans: [],\n isLoading: false,\n conversationPath: null,\n};\n\nexport interface UseConversationReturn extends ConversationStoreSnapshot {\n sendMessage: (content: string) => Promise<void>;\n approvePlan: (planPath: string) => Promise<void>;\n rejectPlan: (planPath: string, feedback?: string) => Promise<void>;\n stop: () => void;\n loadMessages: () => Promise<ChatMessage[]>;\n}\n\nexport function useConversation(\n react: ReactLike,\n options: ConversationStoreOptions,\n): UseConversationReturn {\n const { useState, useEffect, useRef, useCallback } = react;\n\n const [snapshot, setSnapshot] = useState<ConversationStoreSnapshot>(INITIAL_SNAPSHOT);\n const storeRef = useRef<ConversationStore | null>(null);\n\n useEffect(() => {\n const store = new ConversationStore(options);\n storeRef.current = store;\n\n const unsubscribe = store.subscribe((next) => setSnapshot(next));\n\n return () => {\n unsubscribe();\n store.destroy();\n storeRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [options.conversationPath]);\n\n const sendMessage = useCallback(async (content: string) => {\n await storeRef.current?.sendMessage(content);\n }, []);\n\n const approvePlan = useCallback(async (planPath: string) => {\n await storeRef.current?.approvePlan(planPath);\n }, []);\n\n const rejectPlan = useCallback(async (planPath: string, feedback?: string) => {\n await storeRef.current?.rejectPlan(planPath, feedback);\n }, []);\n\n const stop = useCallback(() => { storeRef.current?.stop(); }, []);\n\n const loadMessages = useCallback(async () => {\n return (await storeRef.current?.loadMessages()) ?? [];\n }, []);\n\n return {\n ...snapshot,\n sendMessage,\n approvePlan,\n rejectPlan,\n stop,\n loadMessages,\n };\n}\n\n// ---------------------------------------------------------------------------\n// useConversationList\n// ---------------------------------------------------------------------------\n\n// isLoading starts TRUE: the hook always calls store.load() in its mount\n// effect, but the first render happens before that effect runs — reporting\n// \"not loading\" there makes consumers mis-resolve an empty list as \"loaded,\n// no conversations\" (e.g. failing to resume the latest conversation).\nconst INITIAL_LIST_SNAPSHOT: ConversationListSnapshot = {\n conversations: [],\n totalUnreadCount: 0,\n isLoading: true,\n error: null,\n};\n\nexport interface UseConversationListReturn extends ConversationListSnapshot {\n createConversation: (options: { participant: string; subject?: string }) => Promise<ConversationListItem>;\n deleteConversation: (conversationPath: string) => Promise<void>;\n markAsRead: (conversationPath: string) => Promise<void>;\n}\n\nexport function useConversationList(\n react: ReactLike,\n options: ConversationListStoreOptions,\n): UseConversationListReturn {\n const { useState, useEffect, useRef, useCallback } = react;\n\n const [snapshot, setSnapshot] = useState<ConversationListSnapshot>(INITIAL_LIST_SNAPSHOT);\n const storeRef = useRef<ConversationListStore | null>(null);\n\n useEffect(() => {\n const store = new ConversationListStore(options);\n storeRef.current = store;\n\n const unsubscribe = store.subscribe((next) => setSnapshot(next));\n store.load();\n\n return () => {\n unsubscribe();\n store.destroy();\n storeRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [options.type, options.realtime]);\n\n const createConversation = useCallback(async (opts: { participant: string; subject?: string }) => {\n return storeRef.current!.createConversation(opts);\n }, []);\n\n const deleteConversation = useCallback(async (conversationPath: string) => {\n await storeRef.current?.deleteConversation(conversationPath);\n }, []);\n\n const markAsRead = useCallback(async (conversationPath: string) => {\n await storeRef.current?.markAsRead(conversationPath);\n }, []);\n\n return {\n ...snapshot,\n createConversation,\n deleteConversation,\n markAsRead,\n };\n}\n","/**\n * React flow adapter for RaisinDB.\n *\n * Provides a `useFlow` hook that wraps the FlowClient for executing\n * and monitoring RaisinDB flows in React applications. Returns reactive\n * state tracking flow events, status, and providing control actions.\n *\n * Since this SDK package does not depend on React, the hook accepts\n * React as a parameter via the `ReactLike` interface.\n *\n * @example\n * ```tsx\n * import React from 'react';\n * import { useFlow } from '@raisindb/client';\n *\n * function OrderProcessor() {\n * const flow = useFlow(React, {\n * baseUrl: 'http://localhost:8081',\n * repository: 'my-repo',\n * authManager,\n * });\n *\n * const handleRun = async () => {\n * await flow.run('/flows/process-order', { orderId: 'ord-123' });\n * };\n *\n * return (\n * <div>\n * <button onClick={handleRun} disabled={flow.isRunning}>Run</button>\n * <p>Status: {flow.status}</p>\n * {flow.events.map((e, i) => <div key={i}>{e.type}</div>)}\n * {flow.error && <p className=\"error\">{flow.error}</p>}\n * </div>\n * );\n * }\n * ```\n */\n\nimport { FlowClient } from '../flow-client';\nimport type { FlowClientOptions } from '../flow-client';\nimport type { AuthManager } from '../auth';\nimport type { FlowsApi } from '../flows';\nimport type { Database } from '../database';\nimport type { FlowExecutionEvent } from '../types/flow';\nimport type { ReactLike } from './react-conversation';\n\n/** Options for creating the FlowClient within useFlow */\nexport interface UseFlowOptions {\n /**\n * Pre-configured Database instance (from `client.database()`).\n * When provided, `baseUrl`, `repository`, `authManager`, and `flowsApi` are derived\n * automatically — no manual wiring needed.\n */\n database?: Database;\n /** Base HTTP URL of the RaisinDB server */\n baseUrl?: string;\n /** Repository name */\n repository?: string;\n /** Auth manager for token access */\n authManager?: AuthManager;\n /** Additional FlowClient options */\n clientOptions?: FlowClientOptions;\n /** Optional FlowsApi for WebSocket-based flow operations */\n flowsApi?: FlowsApi;\n}\n\n/** Flow execution status */\nexport type FlowStatus = 'idle' | 'running' | 'waiting' | 'completed' | 'failed';\n\n/** Return value from the useFlow hook */\nexport interface UseFlowReturn {\n /** Collected flow execution events */\n events: FlowExecutionEvent[];\n /** Current flow status */\n status: FlowStatus;\n /** Whether a flow is currently running */\n isRunning: boolean;\n /** Current error, if any */\n error: string | null;\n /** Output from the completed flow */\n output: unknown | null;\n /** Current flow instance ID, if running */\n instanceId: string | null;\n /** Run a flow by path with optional input data */\n run: (flowPath: string, input?: Record<string, unknown>) => Promise<void>;\n /** Resume a waiting flow with data */\n resume: (data: unknown) => Promise<void>;\n /** Reset the hook state (clear events, status, error) */\n reset: () => void;\n}\n\n/**\n * React hook for executing and monitoring RaisinDB flows.\n *\n * Manages the full lifecycle: starting a flow, streaming events,\n * resuming waiting flows, and tracking completion status.\n * Auto-cleans up on component unmount.\n *\n * @param react - The React instance (pass `React` or `{ useState, useEffect, useRef, useCallback }`)\n * @param options - Flow client options (baseUrl, repository, authManager, etc.)\n * @returns Reactive flow state and action functions\n *\n * @example\n * ```tsx\n * import React from 'react';\n * import { useFlow } from '@raisindb/client';\n *\n * function DataPipeline() {\n * const flow = useFlow(React, {\n * baseUrl: 'http://localhost:8081',\n * repository: 'my-repo',\n * authManager,\n * });\n *\n * return (\n * <div>\n * <button onClick={() => flow.run('/flows/etl', { source: 'api' })}>\n * Start Pipeline\n * </button>\n * <p>Status: {flow.status}</p>\n * <p>Events: {flow.events.length}</p>\n * {flow.status === 'waiting' && (\n * <button onClick={() => flow.resume({ approved: true })}>\n * Approve\n * </button>\n * )}\n * {flow.output && <pre>{JSON.stringify(flow.output, null, 2)}</pre>}\n * </div>\n * );\n * }\n * ```\n */\nexport function useFlow(react: ReactLike, options: UseFlowOptions): UseFlowReturn {\n const { useState, useEffect, useRef, useCallback } = react;\n\n const [events, setEvents] = useState<FlowExecutionEvent[]>([]);\n const [status, setStatus] = useState<FlowStatus>('idle');\n const [error, setError] = useState<string | null>(null);\n const [output, setOutput] = useState<unknown | null>(null);\n const [instanceId, setInstanceId] = useState<string | null>(null);\n\n const clientRef = useRef<FlowClient | null>(null);\n const abortRef = useRef(false);\n\n // Create the FlowClient once\n useEffect(() => {\n if (options.database) {\n clientRef.current = options.database.flow;\n } else if (options.baseUrl && options.repository && options.authManager) {\n clientRef.current = new FlowClient(\n options.baseUrl,\n options.repository,\n options.authManager,\n options.clientOptions,\n options.flowsApi,\n );\n }\n\n return () => {\n abortRef.current = true;\n clientRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [options.database, options.baseUrl, options.repository]);\n\n const run = useCallback(async (flowPath: string, input: Record<string, unknown> = {}) => {\n const client = clientRef.current;\n if (!client) return;\n\n // Reset state\n abortRef.current = false;\n setEvents([]);\n setError(null);\n setOutput(null);\n setStatus('running');\n\n try {\n const result = await client.run(flowPath, input);\n setInstanceId(result.instance_id);\n\n for await (const event of client.streamEvents(result.instance_id)) {\n if (abortRef.current) break;\n\n setEvents((prev) => [...prev, event]);\n\n if (event.type === 'flow_waiting') {\n setStatus('waiting');\n } else if (event.type === 'flow_completed') {\n setOutput(event.output);\n setStatus('completed');\n } else if (event.type === 'flow_failed') {\n setError(event.error);\n setStatus('failed');\n }\n }\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n setStatus('failed');\n }\n }, []);\n\n const resume = useCallback(async (data: unknown) => {\n const client = clientRef.current;\n if (!client || !instanceId) return;\n\n setStatus('running');\n setError(null);\n\n try {\n // Open event stream before resuming to avoid missing events\n const stream = await client.createEventStream(instanceId);\n await client.resume(instanceId, data);\n\n for await (const event of stream.events) {\n if (abortRef.current) break;\n\n setEvents((prev) => [...prev, event]);\n\n if (event.type === 'flow_waiting') {\n setStatus('waiting');\n stream.close();\n return;\n } else if (event.type === 'flow_completed') {\n setOutput(event.output);\n setStatus('completed');\n stream.close();\n return;\n } else if (event.type === 'flow_failed') {\n setError(event.error);\n setStatus('failed');\n stream.close();\n return;\n }\n }\n\n stream.close();\n } catch (err) {\n setError(err instanceof Error ? err.message : String(err));\n setStatus('failed');\n }\n }, [instanceId]);\n\n const reset = useCallback(() => {\n abortRef.current = true;\n setEvents([]);\n setStatus('idle');\n setError(null);\n setOutput(null);\n setInstanceId(null);\n }, []);\n\n return {\n events,\n status,\n isRunning: status === 'running',\n error,\n output,\n instanceId,\n run,\n resume,\n reset,\n };\n}\n","/**\n * React integration layer for RaisinDB.\n *\n * Provides a `createRaisinReact(React)` factory that returns a Provider\n * component and hooks for auth, connection, queries, and subscriptions.\n *\n * Uses the \"bring your own React\" pattern to avoid a peer dependency.\n *\n * @example\n * ```ts\n * import React from 'react';\n * import { RaisinClient, LocalStorageTokenStorage, createRaisinReact } from '@raisindb/client';\n *\n * const client = new RaisinClient('wss://localhost:8443/sys/default/myrepo', {\n * tokenStorage: new LocalStorageTokenStorage('myrepo'),\n * });\n *\n * export const {\n * RaisinProvider, useAuth, useConnection, useDatabase,\n * useSql, useSubscription, useConversation, useFlow,\n * } = createRaisinReact(React);\n * ```\n */\n\nimport type {\n ReactLikeWithContext,\n RaisinProviderProps,\n RaisinContextValue,\n UseAuthReturn,\n UseConnectionReturn,\n UseSqlOptions,\n UseSqlReturn,\n UseSubscriptionOptions,\n} from './types';\n\nimport type { RaisinClient } from '../../client';\nimport type { Database } from '../../database';\nimport type { EventMessage } from '../../protocol';\nimport type {\n ConversationStoreOptions,\n} from '../../stores/conversation-store';\nimport type { ConversationListStoreOptions } from '../../stores/conversation-list-store';\n\nimport { createUseAuth } from './use-auth';\nimport { createUseConnection } from './use-connection';\nimport { createUseSql } from './use-sql';\nimport { createUseSubscription } from './use-subscription';\n\nimport {\n useConversation as rawUseConversation,\n useConversationList as rawUseConversationList,\n type UseConversationReturn,\n type UseConversationListReturn,\n} from '../react-conversation';\nimport {\n useFlow as rawUseFlow,\n type UseFlowOptions,\n type UseFlowReturn,\n} from '../react-flow';\n\nexport interface RaisinReact {\n RaisinProvider: (props: RaisinProviderProps) => any;\n useRaisinClient: () => RaisinClient;\n useDatabase: (repository?: string) => Database;\n useAuth: () => UseAuthReturn;\n useConnection: () => UseConnectionReturn;\n useSql: <T = Record<string, unknown>>(sql: string, params?: unknown[], options?: UseSqlOptions) => UseSqlReturn<T>;\n useSubscription: (options: UseSubscriptionOptions, callback: (event: EventMessage) => void) => void;\n useConversation: (options: ConversationStoreOptions) => UseConversationReturn;\n useConversationList: (options: ConversationListStoreOptions) => UseConversationListReturn;\n useFlow: (options: UseFlowOptions) => UseFlowReturn;\n}\n\n/**\n * Create the full React integration for RaisinDB.\n *\n * Accepts a React instance and returns a Provider component plus hooks.\n * The React instance must include `createContext`, `useContext`, `useMemo`,\n * and `createElement` in addition to the base `ReactLike` interface.\n *\n * @param react - The React instance\n * @returns Provider component and hooks\n */\nexport function createRaisinReact(react: ReactLikeWithContext): RaisinReact {\n const RaisinContext = react.createContext<RaisinContextValue | null>(null);\n\n // --- Provider ---\n function RaisinProvider(props: RaisinProviderProps): any {\n const { client, repository, children } = props;\n\n const value = react.useMemo(\n () => ({ client, repository }),\n [client, repository],\n );\n\n return react.createElement(\n RaisinContext.Provider as unknown,\n { value },\n children,\n );\n }\n\n // --- Context accessors ---\n function useRaisinClient(): RaisinClient {\n const ctx = react.useContext(RaisinContext);\n if (!ctx) {\n throw new Error('useRaisinClient must be used within a <RaisinProvider>');\n }\n return ctx.client;\n }\n\n function useDatabase(repository?: string): Database {\n const ctx = react.useContext(RaisinContext);\n if (!ctx) {\n throw new Error('useDatabase must be used within a <RaisinProvider>');\n }\n const repo = repository ?? ctx.repository;\n if (!repo) {\n throw new Error('useDatabase requires a repository — pass it as an argument or set it on <RaisinProvider>');\n }\n return react.useMemo(() => ctx.client.database(repo), [ctx.client, repo]);\n }\n\n // --- Core hooks ---\n const useAuth = createUseAuth(react, RaisinContext);\n const useConnection = createUseConnection(react, RaisinContext);\n const useSql = createUseSql(react, RaisinContext);\n const useSubscription = createUseSubscription(react, RaisinContext);\n\n // --- Pre-bound existing hooks ---\n function useConversation(options: ConversationStoreOptions): UseConversationReturn {\n return rawUseConversation(react, options);\n }\n\n function useConversationList(options: ConversationListStoreOptions): UseConversationListReturn {\n return rawUseConversationList(react, options);\n }\n\n function useFlow(options: UseFlowOptions): UseFlowReturn {\n return rawUseFlow(react, options);\n }\n\n return {\n RaisinProvider,\n useRaisinClient,\n useDatabase,\n useAuth,\n useConnection,\n useSql,\n useSubscription,\n useConversation,\n useConversationList,\n useFlow,\n };\n}\n\n// Re-export types\nexport type {\n ReactLikeWithContext,\n RaisinProviderProps,\n RaisinContextValue,\n UseAuthReturn,\n UseConnectionReturn,\n UseSqlOptions,\n UseSqlReturn,\n UseSubscriptionOptions,\n} from './types';\n\n// Hook return/option types (parity with the @raisindb/client/vue subpath):\n// apps need these to type props that carry a hook's return value around.\nexport type {\n ReactLike,\n UseConversationReturn,\n UseConversationListReturn,\n} from '../react-conversation';\nexport type { UseFlowOptions, UseFlowReturn, FlowStatus } from '../react-flow';\nexport type {\n ConversationStoreOptions,\n ConversationStoreSnapshot,\n ToolCallInfo,\n} from '../../stores/conversation-store';\nexport type {\n ConversationListStoreOptions,\n ConversationListSnapshot,\n} from '../../stores/conversation-list-store';\nexport type { PlanProjection, PlanProjectionTask } from '../../utils/plan-projection';\nexport type { ChatMessage, ConversationListItem } from '../../types/chat';\n"],"mappings":"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","names":["useConversation","useConversationList","useFlow"]}