@personaai/react 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,599 @@
1
+ // src/context/PersonaContext.tsx
2
+ import { createContext, useContext, useMemo } from "react";
3
+ import { jsx } from "react/jsx-runtime";
4
+ var PersonaContext = createContext(null);
5
+ function PersonaProvider({
6
+ baseUrl,
7
+ getAuthToken,
8
+ defaultAgentId,
9
+ children
10
+ }) {
11
+ const normalizedBaseUrl = useMemo(() => baseUrl.replace(/\/+$/, ""), [baseUrl]);
12
+ const value = useMemo(() => {
13
+ async function fetchWithAuth(path, init = {}) {
14
+ const token = getAuthToken ? await getAuthToken() : null;
15
+ const headers = new Headers(init.headers || {});
16
+ if (token) {
17
+ headers.set("Authorization", `Bearer ${token}`);
18
+ }
19
+ const cleanPath = path.startsWith("/") ? path : `/${path}`;
20
+ const url = `${normalizedBaseUrl}${cleanPath}`;
21
+ return fetch(url, {
22
+ ...init,
23
+ headers
24
+ });
25
+ }
26
+ return {
27
+ baseUrl: normalizedBaseUrl,
28
+ getAuthToken,
29
+ defaultAgentId,
30
+ fetchWithAuth
31
+ };
32
+ }, [normalizedBaseUrl, getAuthToken, defaultAgentId]);
33
+ return /* @__PURE__ */ jsx(PersonaContext.Provider, { value, children });
34
+ }
35
+ function usePersonaContext() {
36
+ const context = useContext(PersonaContext);
37
+ if (!context) {
38
+ throw new Error("usePersonaContext must be used within a <PersonaProvider>");
39
+ }
40
+ return context;
41
+ }
42
+
43
+ // src/hooks/useChat.ts
44
+ import { useCallback, useRef, useState } from "react";
45
+ function useChat(options = {}) {
46
+ const { defaultAgentId, fetchWithAuth } = usePersonaContext();
47
+ const agentId = options.agentId || defaultAgentId;
48
+ const [messages, setMessages] = useState(options.initialMessages || []);
49
+ const [input, setInput] = useState("");
50
+ const [isStreaming, setIsStreaming] = useState(false);
51
+ const [error, setError] = useState(null);
52
+ const abortControllerRef = useRef(null);
53
+ const stop = useCallback(() => {
54
+ if (abortControllerRef.current) {
55
+ abortControllerRef.current.abort();
56
+ abortControllerRef.current = null;
57
+ setIsStreaming(false);
58
+ }
59
+ }, []);
60
+ const clear = useCallback(() => {
61
+ stop();
62
+ setMessages([]);
63
+ setError(null);
64
+ }, [stop]);
65
+ const sendMessage = useCallback(
66
+ async (contentToSend, overrideOptions) => {
67
+ const prompt = (contentToSend ?? input).trim();
68
+ if (!prompt || isStreaming) return;
69
+ const targetAgentId = overrideOptions?.agentId || agentId;
70
+ if (!targetAgentId) {
71
+ const err = new Error("No Agent ID specified for useChat.");
72
+ setError(err);
73
+ options.onError?.(err);
74
+ return;
75
+ }
76
+ const userMessage = {
77
+ id: `user-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`,
78
+ role: "user",
79
+ content: prompt,
80
+ createdAt: /* @__PURE__ */ new Date()
81
+ };
82
+ const assistantMessageId = `assistant-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;
83
+ const placeholderAssistant = {
84
+ id: assistantMessageId,
85
+ role: "assistant",
86
+ content: "",
87
+ createdAt: /* @__PURE__ */ new Date(),
88
+ isStreaming: true,
89
+ toolCalls: []
90
+ };
91
+ const nextMessages = [...messages, userMessage];
92
+ setMessages([...nextMessages, placeholderAssistant]);
93
+ setInput("");
94
+ setIsStreaming(true);
95
+ setError(null);
96
+ const controller = new AbortController();
97
+ abortControllerRef.current = controller;
98
+ try {
99
+ const payloadMessages = nextMessages.map((m) => ({
100
+ role: m.role === "assistant" ? "assistant" : "user",
101
+ content: m.content
102
+ }));
103
+ const response = await fetchWithAuth("/chat", {
104
+ method: "POST",
105
+ headers: {
106
+ "Content-Type": "application/json"
107
+ },
108
+ body: JSON.stringify({
109
+ agentId: targetAgentId,
110
+ messages: payloadMessages,
111
+ threadId: overrideOptions?.threadId || options.threadId
112
+ }),
113
+ signal: controller.signal
114
+ });
115
+ if (!response.ok) {
116
+ const errText = await response.text().catch(() => "Stream failed");
117
+ throw new Error(`Chat error (${response.status}): ${errText}`);
118
+ }
119
+ if (!response.body) {
120
+ throw new Error("No response body received for streaming.");
121
+ }
122
+ const reader = response.body.getReader();
123
+ const decoder = new TextDecoder("utf-8");
124
+ let buffer = "";
125
+ let accumulatedText = "";
126
+ const toolCallsMap = /* @__PURE__ */ new Map();
127
+ while (true) {
128
+ const { done, value } = await reader.read();
129
+ if (done) break;
130
+ buffer += decoder.decode(value, { stream: true });
131
+ const lines = buffer.split("\n");
132
+ buffer = lines.pop() ?? "";
133
+ for (const line of lines) {
134
+ const trimmed = line.trim();
135
+ if (!trimmed || !trimmed.startsWith("data:")) continue;
136
+ const raw = trimmed.replace(/^data:\s*/, "");
137
+ if (raw === "[DONE]") break;
138
+ try {
139
+ const event = JSON.parse(raw);
140
+ options.onEvent?.(event);
141
+ if (event.type === "TEXT_MESSAGE_CHUNK" && event.delta) {
142
+ accumulatedText += event.delta;
143
+ setMessages(
144
+ (prev) => prev.map(
145
+ (msg) => msg.id === assistantMessageId ? {
146
+ ...msg,
147
+ content: accumulatedText,
148
+ isStreaming: true,
149
+ toolCalls: Array.from(toolCallsMap.values())
150
+ } : msg
151
+ )
152
+ );
153
+ } else if (event.type === "TOOL_CALL_START") {
154
+ toolCallsMap.set(event.toolCallId, {
155
+ toolCallId: event.toolCallId,
156
+ toolName: event.toolName,
157
+ args: ""
158
+ });
159
+ setMessages(
160
+ (prev) => prev.map(
161
+ (msg) => msg.id === assistantMessageId ? { ...msg, toolCalls: Array.from(toolCallsMap.values()) } : msg
162
+ )
163
+ );
164
+ } else if (event.type === "TOOL_CALL_ARGS") {
165
+ const existing = toolCallsMap.get(event.toolCallId);
166
+ if (existing) {
167
+ existing.args = (existing.args || "") + event.delta;
168
+ setMessages(
169
+ (prev) => prev.map(
170
+ (msg) => msg.id === assistantMessageId ? { ...msg, toolCalls: Array.from(toolCallsMap.values()) } : msg
171
+ )
172
+ );
173
+ }
174
+ } else if (event.type === "TOOL_CALL_RESULT") {
175
+ const existing = toolCallsMap.get(event.toolCallId);
176
+ if (existing) {
177
+ existing.result = event.result;
178
+ existing.isError = event.isError;
179
+ setMessages(
180
+ (prev) => prev.map(
181
+ (msg) => msg.id === assistantMessageId ? { ...msg, toolCalls: Array.from(toolCallsMap.values()) } : msg
182
+ )
183
+ );
184
+ }
185
+ } else if (event.type === "RUN_ERROR") {
186
+ throw new Error(event.message || "Stream error from agent");
187
+ }
188
+ } catch (e) {
189
+ if (e instanceof Error && e.message.startsWith("Stream error")) {
190
+ throw e;
191
+ }
192
+ }
193
+ }
194
+ }
195
+ const finalMessage = {
196
+ id: assistantMessageId,
197
+ role: "assistant",
198
+ content: accumulatedText,
199
+ createdAt: /* @__PURE__ */ new Date(),
200
+ isStreaming: false,
201
+ toolCalls: Array.from(toolCallsMap.values())
202
+ };
203
+ setMessages(
204
+ (prev) => prev.map((msg) => msg.id === assistantMessageId ? finalMessage : msg)
205
+ );
206
+ options.onFinish?.(finalMessage);
207
+ } catch (err) {
208
+ if (controller.signal.aborted) {
209
+ setMessages(
210
+ (prev) => prev.map(
211
+ (msg) => msg.id === assistantMessageId ? { ...msg, isStreaming: false } : msg
212
+ )
213
+ );
214
+ return;
215
+ }
216
+ const errorObj = err instanceof Error ? err : new Error(String(err));
217
+ setError(errorObj);
218
+ options.onError?.(errorObj);
219
+ setMessages(
220
+ (prev) => prev.map(
221
+ (msg) => msg.id === assistantMessageId ? {
222
+ ...msg,
223
+ content: msg.content || `\u26A0\uFE0F Error: ${errorObj.message || "Failed to get response."}`,
224
+ isStreaming: false
225
+ } : msg
226
+ )
227
+ );
228
+ } finally {
229
+ setIsStreaming(false);
230
+ abortControllerRef.current = null;
231
+ }
232
+ },
233
+ [agentId, fetchWithAuth, input, isStreaming, messages, options]
234
+ );
235
+ const handleInputChange = useCallback((e) => {
236
+ setInput(e.target.value);
237
+ }, []);
238
+ const handleSubmit = useCallback(
239
+ (e) => {
240
+ if (e) e.preventDefault();
241
+ void sendMessage();
242
+ },
243
+ [sendMessage]
244
+ );
245
+ const reload = useCallback(() => {
246
+ if (messages.length === 0 || isStreaming) return;
247
+ let lastUserIndex = -1;
248
+ for (let i = messages.length - 1; i >= 0; i--) {
249
+ if (messages[i].role === "user") {
250
+ lastUserIndex = i;
251
+ break;
252
+ }
253
+ }
254
+ if (lastUserIndex === -1) return;
255
+ const lastUserMessage = messages[lastUserIndex];
256
+ setMessages(messages.slice(0, lastUserIndex));
257
+ void sendMessage(lastUserMessage.content);
258
+ }, [isStreaming, messages, sendMessage]);
259
+ return {
260
+ messages,
261
+ input,
262
+ setInput,
263
+ handleInputChange,
264
+ handleSubmit,
265
+ sendMessage,
266
+ isStreaming,
267
+ isLoading: isStreaming,
268
+ error,
269
+ stop,
270
+ reload,
271
+ clear,
272
+ setMessages
273
+ };
274
+ }
275
+
276
+ // src/hooks/useMemory.ts
277
+ import { useCallback as useCallback2, useEffect, useState as useState2 } from "react";
278
+ function useMemory(autoFetch = true) {
279
+ const { fetchWithAuth } = usePersonaContext();
280
+ const [memory, setMemory] = useState2({ user: [], agents: {} });
281
+ const [isLoading, setIsLoading] = useState2(false);
282
+ const [error, setError] = useState2(null);
283
+ const fetchMemory = useCallback2(async () => {
284
+ setIsLoading(true);
285
+ setError(null);
286
+ try {
287
+ const res = await fetchWithAuth("/memory");
288
+ if (!res.ok) {
289
+ throw new Error(`Failed to fetch memory: ${res.statusText}`);
290
+ }
291
+ const data = await res.json();
292
+ setMemory(data);
293
+ return data;
294
+ } catch (err) {
295
+ const errorObj = err instanceof Error ? err : new Error(String(err));
296
+ setError(errorObj);
297
+ return { user: [], agents: {} };
298
+ } finally {
299
+ setIsLoading(false);
300
+ }
301
+ }, [fetchWithAuth]);
302
+ const getFile = useCallback2(
303
+ async (params) => {
304
+ const query = new URLSearchParams({ path: params.path });
305
+ if (params.scope) query.set("scope", params.scope);
306
+ if (params.agentId) query.set("agentId", params.agentId);
307
+ const res = await fetchWithAuth(`/memory/file?${query.toString()}`);
308
+ if (!res.ok) throw new Error(`Failed to get memory file: ${res.statusText}`);
309
+ return await res.json();
310
+ },
311
+ [fetchWithAuth]
312
+ );
313
+ const writeFile = useCallback2(
314
+ async (params) => {
315
+ const res = await fetchWithAuth("/memory/file", {
316
+ method: "PUT",
317
+ headers: { "Content-Type": "application/json" },
318
+ body: JSON.stringify(params)
319
+ });
320
+ if (!res.ok) throw new Error(`Failed to write memory file: ${res.statusText}`);
321
+ const updated = await res.json();
322
+ void fetchMemory();
323
+ return updated;
324
+ },
325
+ [fetchWithAuth, fetchMemory]
326
+ );
327
+ const deleteFile = useCallback2(
328
+ async (params) => {
329
+ const query = new URLSearchParams({ path: params.path });
330
+ if (params.scope) query.set("scope", params.scope);
331
+ if (params.agentId) query.set("agentId", params.agentId);
332
+ const res = await fetchWithAuth(`/memory/file?${query.toString()}`, {
333
+ method: "DELETE"
334
+ });
335
+ if (!res.ok) throw new Error(`Failed to delete memory file: ${res.statusText}`);
336
+ void fetchMemory();
337
+ },
338
+ [fetchWithAuth, fetchMemory]
339
+ );
340
+ useEffect(() => {
341
+ if (autoFetch) {
342
+ void fetchMemory();
343
+ }
344
+ }, [autoFetch, fetchMemory]);
345
+ return {
346
+ memory,
347
+ isLoading,
348
+ error,
349
+ refetch: fetchMemory,
350
+ getFile,
351
+ writeFile,
352
+ deleteFile
353
+ };
354
+ }
355
+
356
+ // src/hooks/useThreads.ts
357
+ import { useCallback as useCallback3, useEffect as useEffect2, useState as useState3 } from "react";
358
+ function useThreads(autoFetch = true) {
359
+ const { fetchWithAuth, defaultAgentId } = usePersonaContext();
360
+ const [threads, setThreads] = useState3([]);
361
+ const [isLoading, setIsLoading] = useState3(false);
362
+ const [error, setError] = useState3(null);
363
+ const fetchThreads = useCallback3(async () => {
364
+ setIsLoading(true);
365
+ setError(null);
366
+ try {
367
+ const res = await fetchWithAuth("/threads");
368
+ if (!res.ok) throw new Error(`Failed to list threads: ${res.statusText}`);
369
+ const data = await res.json();
370
+ const items = Array.isArray(data) ? data : data?.threads || data?.items || [];
371
+ setThreads(items);
372
+ return items;
373
+ } catch (err) {
374
+ const errorObj = err instanceof Error ? err : new Error(String(err));
375
+ setError(errorObj);
376
+ return [];
377
+ } finally {
378
+ setIsLoading(false);
379
+ }
380
+ }, [fetchWithAuth]);
381
+ const createThread = useCallback3(
382
+ async (agentId) => {
383
+ const targetAgentId = agentId || defaultAgentId;
384
+ const res = await fetchWithAuth("/threads", {
385
+ method: "POST",
386
+ headers: { "Content-Type": "application/json" },
387
+ body: JSON.stringify({ agentId: targetAgentId })
388
+ });
389
+ if (!res.ok) throw new Error(`Failed to create thread: ${res.statusText}`);
390
+ const created = await res.json();
391
+ void fetchThreads();
392
+ return created;
393
+ },
394
+ [fetchWithAuth, defaultAgentId, fetchThreads]
395
+ );
396
+ const deleteThread = useCallback3(
397
+ async (threadId) => {
398
+ const res = await fetchWithAuth(`/threads/${threadId}`, { method: "DELETE" });
399
+ if (!res.ok) throw new Error(`Failed to delete thread: ${res.statusText}`);
400
+ setThreads((prev) => prev.filter((t) => t._id !== threadId));
401
+ },
402
+ [fetchWithAuth]
403
+ );
404
+ useEffect2(() => {
405
+ if (autoFetch) {
406
+ void fetchThreads();
407
+ }
408
+ }, [autoFetch, fetchThreads]);
409
+ return {
410
+ threads,
411
+ isLoading,
412
+ error,
413
+ refetch: fetchThreads,
414
+ createThread,
415
+ deleteThread
416
+ };
417
+ }
418
+
419
+ // src/hooks/useFiles.ts
420
+ import { useCallback as useCallback4, useEffect as useEffect3, useState as useState4 } from "react";
421
+ function useFiles(autoFetch = true) {
422
+ const { fetchWithAuth } = usePersonaContext();
423
+ const [files, setFiles] = useState4([]);
424
+ const [isLoading, setIsLoading] = useState4(false);
425
+ const [isUploading, setIsUploading] = useState4(false);
426
+ const [error, setError] = useState4(null);
427
+ const fetchFiles = useCallback4(async () => {
428
+ setIsLoading(true);
429
+ setError(null);
430
+ try {
431
+ const res = await fetchWithAuth("/files");
432
+ if (!res.ok) throw new Error(`Failed to list files: ${res.statusText}`);
433
+ const data = await res.json();
434
+ const items = Array.isArray(data) ? data : data?.files || data?.items || [];
435
+ setFiles(items);
436
+ return items;
437
+ } catch (err) {
438
+ const errorObj = err instanceof Error ? err : new Error(String(err));
439
+ setError(errorObj);
440
+ return [];
441
+ } finally {
442
+ setIsLoading(false);
443
+ }
444
+ }, [fetchWithAuth]);
445
+ const uploadFile = useCallback4(
446
+ async (fileOrFormData) => {
447
+ setIsUploading(true);
448
+ setError(null);
449
+ try {
450
+ let body;
451
+ if (fileOrFormData instanceof FormData) {
452
+ body = fileOrFormData;
453
+ } else {
454
+ body = new FormData();
455
+ body.append("file", fileOrFormData);
456
+ }
457
+ const res = await fetchWithAuth("/files", {
458
+ method: "POST",
459
+ body
460
+ });
461
+ if (!res.ok) {
462
+ const errText = await res.text().catch(() => "Upload failed");
463
+ throw new Error(`Upload error (${res.status}): ${errText}`);
464
+ }
465
+ const uploaded = await res.json();
466
+ void fetchFiles();
467
+ return uploaded;
468
+ } catch (err) {
469
+ const errorObj = err instanceof Error ? err : new Error(String(err));
470
+ setError(errorObj);
471
+ throw errorObj;
472
+ } finally {
473
+ setIsUploading(false);
474
+ }
475
+ },
476
+ [fetchWithAuth, fetchFiles]
477
+ );
478
+ const deleteFile = useCallback4(
479
+ async (fileId) => {
480
+ const res = await fetchWithAuth(`/files/${fileId}`, { method: "DELETE" });
481
+ if (!res.ok) throw new Error(`Failed to delete file: ${res.statusText}`);
482
+ setFiles((prev) => prev.filter((f) => f._id !== fileId));
483
+ },
484
+ [fetchWithAuth]
485
+ );
486
+ const getDownloadUrl = useCallback4(
487
+ (fileId) => {
488
+ return `/files/${fileId}`;
489
+ },
490
+ []
491
+ );
492
+ useEffect3(() => {
493
+ if (autoFetch) {
494
+ void fetchFiles();
495
+ }
496
+ }, [autoFetch, fetchFiles]);
497
+ return {
498
+ files,
499
+ isLoading,
500
+ isUploading,
501
+ error,
502
+ refetch: fetchFiles,
503
+ uploadFile,
504
+ deleteFile,
505
+ getDownloadUrl
506
+ };
507
+ }
508
+
509
+ // src/hooks/useAgents.ts
510
+ import { useCallback as useCallback5, useEffect as useEffect4, useState as useState5 } from "react";
511
+ function useAgents(autoFetch = true) {
512
+ const { fetchWithAuth } = usePersonaContext();
513
+ const [agents, setAgents] = useState5([]);
514
+ const [isLoading, setIsLoading] = useState5(false);
515
+ const [error, setError] = useState5(null);
516
+ const fetchAgents = useCallback5(async () => {
517
+ setIsLoading(true);
518
+ setError(null);
519
+ try {
520
+ const res = await fetchWithAuth("/agents");
521
+ if (!res.ok) throw new Error(`Failed to list agents: ${res.statusText}`);
522
+ const data = await res.json();
523
+ const items = Array.isArray(data) ? data : data?.agents || data?.items || [];
524
+ setAgents(items);
525
+ return items;
526
+ } catch (err) {
527
+ const errorObj = err instanceof Error ? err : new Error(String(err));
528
+ setError(errorObj);
529
+ return [];
530
+ } finally {
531
+ setIsLoading(false);
532
+ }
533
+ }, [fetchWithAuth]);
534
+ useEffect4(() => {
535
+ if (autoFetch) {
536
+ void fetchAgents();
537
+ }
538
+ }, [autoFetch, fetchAgents]);
539
+ return {
540
+ agents,
541
+ isLoading,
542
+ error,
543
+ refetch: fetchAgents
544
+ };
545
+ }
546
+
547
+ // src/hooks/useConnection.ts
548
+ import { useCallback as useCallback6, useEffect as useEffect5, useState as useState6 } from "react";
549
+ function useConnection(autoCheck = true) {
550
+ const { fetchWithAuth } = usePersonaContext();
551
+ const [health, setHealth] = useState6(null);
552
+ const [isConnected, setIsConnected] = useState6(false);
553
+ const [isLoading, setIsLoading] = useState6(false);
554
+ const checkHealth = useCallback6(async () => {
555
+ setIsLoading(true);
556
+ try {
557
+ const res = await fetchWithAuth("/health");
558
+ if (res.ok) {
559
+ const data = await res.json();
560
+ setHealth(data);
561
+ setIsConnected(true);
562
+ return data;
563
+ }
564
+ setIsConnected(false);
565
+ return null;
566
+ } catch {
567
+ setIsConnected(false);
568
+ return null;
569
+ } finally {
570
+ setIsLoading(false);
571
+ }
572
+ }, [fetchWithAuth]);
573
+ useEffect5(() => {
574
+ if (autoCheck) {
575
+ void checkHealth();
576
+ }
577
+ }, [autoCheck, checkHealth]);
578
+ return {
579
+ isConnected,
580
+ health,
581
+ isLoading,
582
+ checkHealth
583
+ };
584
+ }
585
+
586
+ // src/index.ts
587
+ var VERSION = "0.1.2";
588
+ export {
589
+ PersonaProvider,
590
+ VERSION,
591
+ useAgents,
592
+ useChat,
593
+ useConnection,
594
+ useFiles,
595
+ useMemory,
596
+ usePersonaContext,
597
+ useThreads
598
+ };
599
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/context/PersonaContext.tsx","../src/hooks/useChat.ts","../src/hooks/useMemory.ts","../src/hooks/useThreads.ts","../src/hooks/useFiles.ts","../src/hooks/useAgents.ts","../src/hooks/useConnection.ts","../src/index.ts"],"sourcesContent":["'use client';\n\nimport React, { createContext, useContext, useMemo } from 'react';\nimport type { PersonaProviderProps } from '../types.js';\n\ninterface PersonaContextValue {\n baseUrl: string;\n getAuthToken?: () => Promise<string | null | undefined> | string | null | undefined;\n defaultAgentId?: string;\n fetchWithAuth: (path: string, init?: RequestInit) => Promise<Response>;\n}\n\nconst PersonaContext = createContext<PersonaContextValue | null>(null);\n\nexport function PersonaProvider({\n baseUrl,\n getAuthToken,\n defaultAgentId,\n children,\n}: PersonaProviderProps) {\n const normalizedBaseUrl = useMemo(() => baseUrl.replace(/\\/+$/, ''), [baseUrl]);\n\n const value = useMemo<PersonaContextValue>(() => {\n async function fetchWithAuth(path: string, init: RequestInit = {}): Promise<Response> {\n const token = getAuthToken ? await getAuthToken() : null;\n const headers = new Headers(init.headers || {});\n if (token) {\n headers.set('Authorization', `Bearer ${token}`);\n }\n\n const cleanPath = path.startsWith('/') ? path : `/${path}`;\n const url = `${normalizedBaseUrl}${cleanPath}`;\n\n return fetch(url, {\n ...init,\n headers,\n });\n }\n\n return {\n baseUrl: normalizedBaseUrl,\n getAuthToken,\n defaultAgentId,\n fetchWithAuth,\n };\n }, [normalizedBaseUrl, getAuthToken, defaultAgentId]);\n\n return <PersonaContext.Provider value={value}>{children}</PersonaContext.Provider>;\n}\n\nexport function usePersonaContext(): PersonaContextValue {\n const context = useContext(PersonaContext);\n if (!context) {\n throw new Error('usePersonaContext must be used within a <PersonaProvider>');\n }\n return context;\n}\n","'use client';\n\nimport { useCallback, useRef, useState } from 'react';\nimport { usePersonaContext } from '../context/PersonaContext.js';\nimport type { PersonaMessage, PersonaStreamingEvent, PersonaToolCall, UseChatOptions } from '../types.js';\n\nexport function useChat(options: UseChatOptions = {}) {\n const { defaultAgentId, fetchWithAuth } = usePersonaContext();\n const agentId = options.agentId || defaultAgentId;\n\n const [messages, setMessages] = useState<PersonaMessage[]>(options.initialMessages || []);\n const [input, setInput] = useState('');\n const [isStreaming, setIsStreaming] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const abortControllerRef = useRef<AbortController | null>(null);\n\n const stop = useCallback(() => {\n if (abortControllerRef.current) {\n abortControllerRef.current.abort();\n abortControllerRef.current = null;\n setIsStreaming(false);\n }\n }, []);\n\n const clear = useCallback(() => {\n stop();\n setMessages([]);\n setError(null);\n }, [stop]);\n\n const sendMessage = useCallback(\n async (contentToSend?: string, overrideOptions?: { agentId?: string; threadId?: string }) => {\n const prompt = (contentToSend ?? input).trim();\n if (!prompt || isStreaming) return;\n\n const targetAgentId = overrideOptions?.agentId || agentId;\n if (!targetAgentId) {\n const err = new Error('No Agent ID specified for useChat.');\n setError(err);\n options.onError?.(err);\n return;\n }\n\n const userMessage: PersonaMessage = {\n id: `user-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`,\n role: 'user',\n content: prompt,\n createdAt: new Date(),\n };\n\n const assistantMessageId = `assistant-${Date.now()}-${Math.random().toString(36).slice(2, 7)}`;\n const placeholderAssistant: PersonaMessage = {\n id: assistantMessageId,\n role: 'assistant',\n content: '',\n createdAt: new Date(),\n isStreaming: true,\n toolCalls: [],\n };\n\n const nextMessages = [...messages, userMessage];\n setMessages([...nextMessages, placeholderAssistant]);\n setInput('');\n setIsStreaming(true);\n setError(null);\n\n const controller = new AbortController();\n abortControllerRef.current = controller;\n\n try {\n const payloadMessages = nextMessages.map((m) => ({\n role: m.role === 'assistant' ? ('assistant' as const) : ('user' as const),\n content: m.content,\n }));\n\n const response = await fetchWithAuth('/chat', {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n agentId: targetAgentId,\n messages: payloadMessages,\n threadId: overrideOptions?.threadId || options.threadId,\n }),\n signal: controller.signal,\n });\n\n if (!response.ok) {\n const errText = await response.text().catch(() => 'Stream failed');\n throw new Error(`Chat error (${response.status}): ${errText}`);\n }\n\n if (!response.body) {\n throw new Error('No response body received for streaming.');\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n let accumulatedText = '';\n const toolCallsMap = new Map<string, PersonaToolCall>();\n\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || !trimmed.startsWith('data:')) continue;\n\n const raw = trimmed.replace(/^data:\\s*/, '');\n if (raw === '[DONE]') break;\n\n try {\n const event = JSON.parse(raw) as PersonaStreamingEvent;\n options.onEvent?.(event);\n\n if (event.type === 'TEXT_MESSAGE_CHUNK' && event.delta) {\n accumulatedText += event.delta;\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === assistantMessageId\n ? {\n ...msg,\n content: accumulatedText,\n isStreaming: true,\n toolCalls: Array.from(toolCallsMap.values()),\n }\n : msg\n )\n );\n } else if (event.type === 'TOOL_CALL_START') {\n toolCallsMap.set(event.toolCallId, {\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n args: '',\n });\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === assistantMessageId\n ? { ...msg, toolCalls: Array.from(toolCallsMap.values()) }\n : msg\n )\n );\n } else if (event.type === 'TOOL_CALL_ARGS') {\n const existing = toolCallsMap.get(event.toolCallId);\n if (existing) {\n existing.args = (existing.args || '') + event.delta;\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === assistantMessageId\n ? { ...msg, toolCalls: Array.from(toolCallsMap.values()) }\n : msg\n )\n );\n }\n } else if (event.type === 'TOOL_CALL_RESULT') {\n const existing = toolCallsMap.get(event.toolCallId);\n if (existing) {\n existing.result = event.result;\n existing.isError = event.isError;\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === assistantMessageId\n ? { ...msg, toolCalls: Array.from(toolCallsMap.values()) }\n : msg\n )\n );\n }\n } else if (event.type === 'RUN_ERROR') {\n throw new Error(event.message || 'Stream error from agent');\n }\n } catch (e) {\n if (e instanceof Error && e.message.startsWith('Stream error')) {\n throw e;\n }\n }\n }\n }\n\n const finalMessage: PersonaMessage = {\n id: assistantMessageId,\n role: 'assistant',\n content: accumulatedText,\n createdAt: new Date(),\n isStreaming: false,\n toolCalls: Array.from(toolCallsMap.values()),\n };\n\n setMessages((prev) =>\n prev.map((msg) => (msg.id === assistantMessageId ? finalMessage : msg))\n );\n\n options.onFinish?.(finalMessage);\n } catch (err) {\n if (controller.signal.aborted) {\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === assistantMessageId ? { ...msg, isStreaming: false } : msg\n )\n );\n return;\n }\n\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setError(errorObj);\n options.onError?.(errorObj);\n\n setMessages((prev) =>\n prev.map((msg) =>\n msg.id === assistantMessageId\n ? {\n ...msg,\n content:\n msg.content || `⚠️ Error: ${errorObj.message || 'Failed to get response.'}`,\n isStreaming: false,\n }\n : msg\n )\n );\n } finally {\n setIsStreaming(false);\n abortControllerRef.current = null;\n }\n },\n [agentId, fetchWithAuth, input, isStreaming, messages, options]\n );\n\n const handleInputChange = useCallback((e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => {\n setInput(e.target.value);\n }, []);\n\n const handleSubmit = useCallback(\n (e?: React.FormEvent) => {\n if (e) e.preventDefault();\n void sendMessage();\n },\n [sendMessage]\n );\n\n const reload = useCallback(() => {\n if (messages.length === 0 || isStreaming) return;\n let lastUserIndex = -1;\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role === 'user') {\n lastUserIndex = i;\n break;\n }\n }\n if (lastUserIndex === -1) return;\n\n const lastUserMessage = messages[lastUserIndex];\n setMessages(messages.slice(0, lastUserIndex));\n void sendMessage(lastUserMessage.content);\n }, [isStreaming, messages, sendMessage]);\n\n return {\n messages,\n input,\n setInput,\n handleInputChange,\n handleSubmit,\n sendMessage,\n isStreaming,\n isLoading: isStreaming,\n error,\n stop,\n reload,\n clear,\n setMessages,\n };\n}\n","'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { usePersonaContext } from '../context/PersonaContext.js';\nimport type { PersonaMemoryFile, PersonaMemoryList } from '../types.js';\n\nexport function useMemory(autoFetch = true) {\n const { fetchWithAuth } = usePersonaContext();\n const [memory, setMemory] = useState<PersonaMemoryList>({ user: [], agents: {} });\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchMemory = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetchWithAuth('/memory');\n if (!res.ok) {\n throw new Error(`Failed to fetch memory: ${res.statusText}`);\n }\n const data = (await res.json()) as PersonaMemoryList;\n setMemory(data);\n return data;\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setError(errorObj);\n return { user: [], agents: {} };\n } finally {\n setIsLoading(false);\n }\n }, [fetchWithAuth]);\n\n const getFile = useCallback(\n async (params: { path: string; scope?: 'user' | 'agent'; agentId?: string }) => {\n const query = new URLSearchParams({ path: params.path });\n if (params.scope) query.set('scope', params.scope);\n if (params.agentId) query.set('agentId', params.agentId);\n\n const res = await fetchWithAuth(`/memory/file?${query.toString()}`);\n if (!res.ok) throw new Error(`Failed to get memory file: ${res.statusText}`);\n return (await res.json()) as PersonaMemoryFile;\n },\n [fetchWithAuth]\n );\n\n const writeFile = useCallback(\n async (params: { path: string; content: string; scope?: 'user' | 'agent'; agentId?: string }) => {\n const res = await fetchWithAuth('/memory/file', {\n method: 'PUT',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(params),\n });\n if (!res.ok) throw new Error(`Failed to write memory file: ${res.statusText}`);\n const updated = (await res.json()) as PersonaMemoryFile;\n void fetchMemory();\n return updated;\n },\n [fetchWithAuth, fetchMemory]\n );\n\n const deleteFile = useCallback(\n async (params: { path: string; scope?: 'user' | 'agent'; agentId?: string }) => {\n const query = new URLSearchParams({ path: params.path });\n if (params.scope) query.set('scope', params.scope);\n if (params.agentId) query.set('agentId', params.agentId);\n\n const res = await fetchWithAuth(`/memory/file?${query.toString()}`, {\n method: 'DELETE',\n });\n if (!res.ok) throw new Error(`Failed to delete memory file: ${res.statusText}`);\n void fetchMemory();\n },\n [fetchWithAuth, fetchMemory]\n );\n\n useEffect(() => {\n if (autoFetch) {\n void fetchMemory();\n }\n }, [autoFetch, fetchMemory]);\n\n return {\n memory,\n isLoading,\n error,\n refetch: fetchMemory,\n getFile,\n writeFile,\n deleteFile,\n };\n}\n","'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { usePersonaContext } from '../context/PersonaContext.js';\nimport type { PersonaThread } from '../types.js';\n\nexport function useThreads(autoFetch = true) {\n const { fetchWithAuth, defaultAgentId } = usePersonaContext();\n const [threads, setThreads] = useState<PersonaThread[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchThreads = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetchWithAuth('/threads');\n if (!res.ok) throw new Error(`Failed to list threads: ${res.statusText}`);\n const data = await res.json();\n const items = Array.isArray(data) ? data : data?.threads || data?.items || [];\n setThreads(items);\n return items;\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setError(errorObj);\n return [];\n } finally {\n setIsLoading(false);\n }\n }, [fetchWithAuth]);\n\n const createThread = useCallback(\n async (agentId?: string) => {\n const targetAgentId = agentId || defaultAgentId;\n const res = await fetchWithAuth('/threads', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ agentId: targetAgentId }),\n });\n if (!res.ok) throw new Error(`Failed to create thread: ${res.statusText}`);\n const created = (await res.json()) as PersonaThread;\n void fetchThreads();\n return created;\n },\n [fetchWithAuth, defaultAgentId, fetchThreads]\n );\n\n const deleteThread = useCallback(\n async (threadId: string) => {\n const res = await fetchWithAuth(`/threads/${threadId}`, { method: 'DELETE' });\n if (!res.ok) throw new Error(`Failed to delete thread: ${res.statusText}`);\n setThreads((prev) => prev.filter((t) => t._id !== threadId));\n },\n [fetchWithAuth]\n );\n\n useEffect(() => {\n if (autoFetch) {\n void fetchThreads();\n }\n }, [autoFetch, fetchThreads]);\n\n return {\n threads,\n isLoading,\n error,\n refetch: fetchThreads,\n createThread,\n deleteThread,\n };\n}\n","'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { usePersonaContext } from '../context/PersonaContext.js';\n\nexport interface PersonaFileItem {\n _id: string;\n filename: string;\n contentType?: string;\n sizeBytes?: number;\n createdAt: string;\n}\n\nexport function useFiles(autoFetch = true) {\n const { fetchWithAuth } = usePersonaContext();\n const [files, setFiles] = useState<PersonaFileItem[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [isUploading, setIsUploading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchFiles = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetchWithAuth('/files');\n if (!res.ok) throw new Error(`Failed to list files: ${res.statusText}`);\n const data = await res.json();\n const items = Array.isArray(data) ? data : data?.files || data?.items || [];\n setFiles(items);\n return items;\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setError(errorObj);\n return [];\n } finally {\n setIsLoading(false);\n }\n }, [fetchWithAuth]);\n\n const uploadFile = useCallback(\n async (fileOrFormData: FormData | { name: string; uri: string; type?: string }) => {\n setIsUploading(true);\n setError(null);\n try {\n let body: FormData;\n if (fileOrFormData instanceof FormData) {\n body = fileOrFormData;\n } else {\n // React Native FormData support\n body = new FormData();\n body.append('file', fileOrFormData as unknown as Blob);\n }\n\n const res = await fetchWithAuth('/files', {\n method: 'POST',\n body,\n });\n\n if (!res.ok) {\n const errText = await res.text().catch(() => 'Upload failed');\n throw new Error(`Upload error (${res.status}): ${errText}`);\n }\n\n const uploaded = (await res.json()) as PersonaFileItem;\n void fetchFiles();\n return uploaded;\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setError(errorObj);\n throw errorObj;\n } finally {\n setIsUploading(false);\n }\n },\n [fetchWithAuth, fetchFiles]\n );\n\n const deleteFile = useCallback(\n async (fileId: string) => {\n const res = await fetchWithAuth(`/files/${fileId}`, { method: 'DELETE' });\n if (!res.ok) throw new Error(`Failed to delete file: ${res.statusText}`);\n setFiles((prev) => prev.filter((f) => f._id !== fileId));\n },\n [fetchWithAuth]\n );\n\n const getDownloadUrl = useCallback(\n (fileId: string) => {\n return `/files/${fileId}`;\n },\n []\n );\n\n useEffect(() => {\n if (autoFetch) {\n void fetchFiles();\n }\n }, [autoFetch, fetchFiles]);\n\n return {\n files,\n isLoading,\n isUploading,\n error,\n refetch: fetchFiles,\n uploadFile,\n deleteFile,\n getDownloadUrl,\n };\n}\n","'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { usePersonaContext } from '../context/PersonaContext.js';\n\nexport interface PersonaAgentSummary {\n _id: string;\n name: string;\n description?: string;\n avatarUrl?: string;\n}\n\nexport function useAgents(autoFetch = true) {\n const { fetchWithAuth } = usePersonaContext();\n const [agents, setAgents] = useState<PersonaAgentSummary[]>([]);\n const [isLoading, setIsLoading] = useState(false);\n const [error, setError] = useState<Error | null>(null);\n\n const fetchAgents = useCallback(async () => {\n setIsLoading(true);\n setError(null);\n try {\n const res = await fetchWithAuth('/agents');\n if (!res.ok) throw new Error(`Failed to list agents: ${res.statusText}`);\n const data = await res.json();\n const items = Array.isArray(data) ? data : data?.agents || data?.items || [];\n setAgents(items);\n return items;\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error(String(err));\n setError(errorObj);\n return [];\n } finally {\n setIsLoading(false);\n }\n }, [fetchWithAuth]);\n\n useEffect(() => {\n if (autoFetch) {\n void fetchAgents();\n }\n }, [autoFetch, fetchAgents]);\n\n return {\n agents,\n isLoading,\n error,\n refetch: fetchAgents,\n };\n}\n","'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { usePersonaContext } from '../context/PersonaContext.js';\n\nexport interface PersonaHealthInfo {\n status: string;\n version?: string;\n capabilities?: Record<string, boolean>;\n}\n\nexport function useConnection(autoCheck = true) {\n const { fetchWithAuth } = usePersonaContext();\n const [health, setHealth] = useState<PersonaHealthInfo | null>(null);\n const [isConnected, setIsConnected] = useState(false);\n const [isLoading, setIsLoading] = useState(false);\n\n const checkHealth = useCallback(async () => {\n setIsLoading(true);\n try {\n const res = await fetchWithAuth('/health');\n if (res.ok) {\n const data = (await res.json()) as PersonaHealthInfo;\n setHealth(data);\n setIsConnected(true);\n return data;\n }\n setIsConnected(false);\n return null;\n } catch {\n setIsConnected(false);\n return null;\n } finally {\n setIsLoading(false);\n }\n }, [fetchWithAuth]);\n\n useEffect(() => {\n if (autoCheck) {\n void checkHealth();\n }\n }, [autoCheck, checkHealth]);\n\n return {\n isConnected,\n health,\n isLoading,\n checkHealth,\n };\n}\n","export * from './types.js';\nexport * from './context/PersonaContext.js';\nexport * from './hooks/useChat.js';\nexport * from './hooks/useMemory.js';\nexport * from './hooks/useThreads.js';\nexport * from './hooks/useFiles.js';\nexport * from './hooks/useAgents.js';\nexport * from './hooks/useConnection.js';\n\nexport const VERSION = '0.1.2';\n"],"mappings":"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","names":["useCallback","useState","useState","useCallback","useCallback","useEffect","useState","useState","useCallback","useEffect","useCallback","useEffect","useState","useState","useCallback","useEffect","useCallback","useEffect","useState","useState","useCallback","useEffect","useCallback","useEffect","useState","useState","useCallback","useEffect"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@personaai/react",
3
- "version": "0.1.0",
3
+ "version": "0.1.2",
4
4
  "description": "React hooks and state management library for the Persona AI agent runtime. Client-side only.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",