@anvia/react 0.3.1 → 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/index.d.ts CHANGED
@@ -13,6 +13,81 @@ type ChatMessage = {
13
13
  content: string;
14
14
  metadata?: unknown;
15
15
  };
16
+ type ToolApprovalStatus = "pending" | "approved" | "rejected" | "timed_out";
17
+ type ToolApproval = {
18
+ id: string;
19
+ runId?: string;
20
+ agentId?: string;
21
+ sessionId?: string;
22
+ toolName: string;
23
+ callId?: string;
24
+ internalCallId?: string;
25
+ args?: string;
26
+ status: ToolApprovalStatus;
27
+ requestedAt?: string;
28
+ resolvedAt?: string;
29
+ reason?: string;
30
+ };
31
+ type ToolQuestionStatus = "pending" | "answered";
32
+ type ToolQuestionChoice = {
33
+ label: string;
34
+ value: string;
35
+ };
36
+ type ToolQuestionPrompt = {
37
+ id: string;
38
+ question: string;
39
+ choices: ToolQuestionChoice[];
40
+ };
41
+ type ToolQuestionAnswer = {
42
+ questionId: string;
43
+ answer: string;
44
+ choice?: string;
45
+ custom?: boolean;
46
+ };
47
+ type ToolQuestion = {
48
+ id: string;
49
+ runId?: string;
50
+ agentId?: string;
51
+ sessionId?: string;
52
+ toolName: string;
53
+ callId?: string;
54
+ internalCallId?: string;
55
+ args?: string;
56
+ questions: ToolQuestionPrompt[];
57
+ status: ToolQuestionStatus;
58
+ requestedAt?: string;
59
+ answeredAt?: string;
60
+ answers?: ToolQuestionAnswer[];
61
+ };
62
+ type ToolApprovalDecisionInput = {
63
+ approvalId: string;
64
+ approved: boolean;
65
+ reason?: string;
66
+ approval?: ToolApproval;
67
+ };
68
+ type ToolQuestionAnswerInput = {
69
+ questionId: string;
70
+ answers: ToolQuestionAnswer[];
71
+ question?: ToolQuestion;
72
+ };
73
+ type HumanInputOptions<TEvent = unknown> = {
74
+ endpoint?: string | URL;
75
+ fetch?: typeof fetch;
76
+ eventToApproval?: (event: TEvent) => ToolApproval | undefined;
77
+ eventToQuestion?: (event: TEvent) => ToolQuestion | undefined;
78
+ decideApproval?: (decision: ToolApprovalDecisionInput) => Promise<ToolApproval | undefined>;
79
+ answerQuestion?: (answer: ToolQuestionAnswerInput) => Promise<ToolQuestion | undefined>;
80
+ };
81
+ type HumanInputState = {
82
+ approvals: {
83
+ all: ToolApproval[];
84
+ pending: ToolApproval[];
85
+ };
86
+ questions: {
87
+ all: ToolQuestion[];
88
+ pending: ToolQuestion[];
89
+ };
90
+ };
16
91
  type DefaultChatRequest = {
17
92
  message: string;
18
93
  history: ChatMessage[];
@@ -27,6 +102,7 @@ type UseChatOptions<TRequest = DefaultChatRequest, TEvent = unknown, TMessage ex
27
102
  createRequest?: (input: string, messages: TMessage[]) => TRequest;
28
103
  eventToDelta?: (event: TEvent) => string | undefined;
29
104
  eventToFinal?: (event: TEvent) => string | undefined;
105
+ humanInput?: HumanInputOptions<TEvent>;
30
106
  onEvent?: (event: TEvent) => void;
31
107
  onError?: (error: unknown) => void;
32
108
  };
@@ -41,8 +117,16 @@ type UseChatResult<TEvent = unknown, TMessage extends ChatMessage = ChatMessage>
41
117
  status: UseChatStatus;
42
118
  error: unknown;
43
119
  text: string;
120
+ humanInput: HumanInputState;
121
+ decidingApprovals: Set<string>;
122
+ answeringQuestions: Set<string>;
123
+ approveTool(approvalId: string, reason?: string): Promise<void>;
124
+ rejectTool(approvalId: string, reason?: string): Promise<void>;
125
+ answerToolQuestion(questionId: string, answers: ToolQuestionAnswer[]): Promise<void>;
44
126
  };
45
127
 
128
+ declare function createDirectTransport<TRequest, TEvent>(handler: (request: TRequest) => AsyncIterable<TEvent>): EventTransport<TRequest, TEvent>;
129
+
46
130
  type FetchEventStreamOptions = Omit<RequestInit, "headers"> & {
47
131
  format?: EventStreamFormat;
48
132
  fetch?: typeof fetch;
@@ -73,4 +157,31 @@ declare function createChatTransport<TRequest, TEvent = unknown>(options: Create
73
157
 
74
158
  declare function useChat<TRequest = DefaultChatRequest, TEvent = unknown, TMessage extends ChatMessage = ChatMessage>(options?: UseChatOptions<TRequest, TEvent, TMessage>): UseChatResult<TEvent, TMessage>;
75
159
 
76
- export { type ChatMessage, type ChatRole, type CreateFetchTransportOptions, type DefaultChatRequest, type EventStreamFormat, EventStreamHttpError, type EventTransport, type FetchEventStreamOptions, type TransportOptions, type UseChatOptions, type UseChatResult, type UseChatStatus, createChatTransport, createFetchTransport, fetchEventStream, readJsonlStream, readSseStream, useChat };
160
+ type UseCompletionRequest = {
161
+ prompt: string;
162
+ stream: true;
163
+ };
164
+ type UseCompletionStatus = "idle" | "streaming" | "error";
165
+ type UseCompletionOptions<TEvent = unknown> = {
166
+ transport?: EventTransport<UseCompletionRequest, TEvent>;
167
+ endpoint?: string | URL;
168
+ format?: EventStreamFormat;
169
+ initialCompletion?: string;
170
+ eventToDelta?: (event: TEvent) => string | undefined;
171
+ eventToFinal?: (event: TEvent) => string | undefined;
172
+ onEvent?: (event: TEvent) => void;
173
+ onError?: (error: unknown) => void;
174
+ };
175
+ type UseCompletionResult = {
176
+ completion: string;
177
+ input: string;
178
+ setInput(input: string): void;
179
+ complete(prompt?: string): Promise<void>;
180
+ stop(): void;
181
+ reset(completion?: string): void;
182
+ status: UseCompletionStatus;
183
+ error: unknown;
184
+ };
185
+ declare function useCompletion<TEvent = unknown>(options?: UseCompletionOptions<TEvent>): UseCompletionResult;
186
+
187
+ export { type ChatMessage, type ChatRole, type CreateFetchTransportOptions, type DefaultChatRequest, type EventStreamFormat, EventStreamHttpError, type EventTransport, type FetchEventStreamOptions, type HumanInputOptions, type HumanInputState, type ToolApproval, type ToolApprovalDecisionInput, type ToolApprovalStatus, type ToolQuestion, type ToolQuestionAnswer, type ToolQuestionAnswerInput, type ToolQuestionChoice, type ToolQuestionPrompt, type ToolQuestionStatus, type TransportOptions, type UseChatOptions, type UseChatResult, type UseChatStatus, type UseCompletionOptions, type UseCompletionRequest, type UseCompletionResult, type UseCompletionStatus, createChatTransport, createDirectTransport, createFetchTransport, fetchEventStream, readJsonlStream, readSseStream, useChat, useCompletion };
package/dist/index.js CHANGED
@@ -1,3 +1,27 @@
1
+ // src/direct.ts
2
+ function createDirectTransport(handler) {
3
+ return {
4
+ async *send(request, options) {
5
+ const iterable = handler(request);
6
+ const iterator = iterable[Symbol.asyncIterator]();
7
+ try {
8
+ while (true) {
9
+ if (options?.signal?.aborted) {
10
+ break;
11
+ }
12
+ const next = await iterator.next();
13
+ if (next.done) {
14
+ break;
15
+ }
16
+ yield next.value;
17
+ }
18
+ } finally {
19
+ await iterator.return?.();
20
+ }
21
+ }
22
+ };
23
+ }
24
+
1
25
  // src/streams.ts
2
26
  async function* readJsonlStream(stream) {
3
27
  const reader = stream.getReader();
@@ -225,6 +249,117 @@ function isRecord(value) {
225
249
  return typeof value === "object" && value !== null;
226
250
  }
227
251
 
252
+ // src/human-input.ts
253
+ function defaultEventToApproval(event) {
254
+ if (!isRecord2(event)) {
255
+ return void 0;
256
+ }
257
+ if (event.type !== "tool_approval_request" && event.type !== "tool_approval_result") {
258
+ return void 0;
259
+ }
260
+ return isToolApproval(event.approval) ? event.approval : void 0;
261
+ }
262
+ function defaultEventToQuestion(event) {
263
+ if (!isRecord2(event)) {
264
+ return void 0;
265
+ }
266
+ if (event.type !== "tool_question_request" && event.type !== "tool_question_result") {
267
+ return void 0;
268
+ }
269
+ return isToolQuestion(event.question) ? event.question : void 0;
270
+ }
271
+ async function defaultDecideApproval(input, options) {
272
+ const endpoint = requireEndpoint(options.endpoint, "decideApproval");
273
+ const fetchImpl = options.fetch ?? globalThis.fetch;
274
+ if (fetchImpl === void 0) {
275
+ throw new Error("humanInput approval decisions require a fetch implementation");
276
+ }
277
+ const response = await fetchImpl(
278
+ endpointUrl(endpoint, `approvals/${input.approvalId}/decision`),
279
+ {
280
+ method: "POST",
281
+ headers: { "content-type": "application/json" },
282
+ body: JSON.stringify({
283
+ approved: input.approved,
284
+ ...input.reason === void 0 ? {} : { reason: input.reason }
285
+ })
286
+ }
287
+ );
288
+ if (!response.ok) {
289
+ throw new Error(`Tool approval decision failed with status ${response.status}`);
290
+ }
291
+ return responseJson(response);
292
+ }
293
+ async function defaultAnswerQuestion(input, options) {
294
+ const endpoint = requireEndpoint(options.endpoint, "answerQuestion");
295
+ const fetchImpl = options.fetch ?? globalThis.fetch;
296
+ if (fetchImpl === void 0) {
297
+ throw new Error("humanInput question answers require a fetch implementation");
298
+ }
299
+ const response = await fetchImpl(endpointUrl(endpoint, `questions/${input.questionId}/answer`), {
300
+ method: "POST",
301
+ headers: { "content-type": "application/json" },
302
+ body: JSON.stringify({ answers: input.answers })
303
+ });
304
+ if (!response.ok) {
305
+ throw new Error(`Tool question answer failed with status ${response.status}`);
306
+ }
307
+ return responseJson(response);
308
+ }
309
+ function upsertById(items, item) {
310
+ const index = items.findIndex((current) => current.id === item.id);
311
+ if (index === -1) {
312
+ return [...items, item];
313
+ }
314
+ const next = [...items];
315
+ next[index] = item;
316
+ return next;
317
+ }
318
+ function requireEndpoint(endpoint, operation) {
319
+ if (endpoint === void 0) {
320
+ throw new Error(`humanInput.${operation} requires endpoint or a custom handler`);
321
+ }
322
+ return endpoint;
323
+ }
324
+ function endpointUrl(endpoint, path) {
325
+ const suffix = path.replace(/^\/+/, "");
326
+ if (endpoint instanceof URL) {
327
+ const url = new URL(endpoint.toString());
328
+ url.pathname = joinPath(url.pathname, suffix);
329
+ return url;
330
+ }
331
+ if (/^[a-z][a-z\d+\-.]*:\/\//i.test(endpoint)) {
332
+ const url = new URL(endpoint);
333
+ url.pathname = joinPath(url.pathname, suffix);
334
+ return url.toString();
335
+ }
336
+ return joinPath(endpoint, suffix);
337
+ }
338
+ function joinPath(base, suffix) {
339
+ const trimmedBase = base.replace(/\/+$/, "");
340
+ const trimmedSuffix = suffix.replace(/^\/+/, "");
341
+ if (trimmedBase.length === 0) {
342
+ return `/${trimmedSuffix}`;
343
+ }
344
+ return `${trimmedBase}/${trimmedSuffix}`;
345
+ }
346
+ async function responseJson(response) {
347
+ const text = await response.text();
348
+ if (text.trim().length === 0) {
349
+ return void 0;
350
+ }
351
+ return JSON.parse(text);
352
+ }
353
+ function isToolApproval(value) {
354
+ return isRecord2(value) && typeof value.id === "string" && typeof value.toolName === "string" && typeof value.status === "string";
355
+ }
356
+ function isToolQuestion(value) {
357
+ return isRecord2(value) && typeof value.id === "string" && typeof value.toolName === "string" && typeof value.status === "string" && Array.isArray(value.questions);
358
+ }
359
+ function isRecord2(value) {
360
+ return typeof value === "object" && value !== null;
361
+ }
362
+
228
363
  // src/use-chat.ts
229
364
  function useChat(options = {}) {
230
365
  const [messages, setMessages] = useState(() => [...options.initialMessages ?? []]);
@@ -232,11 +367,31 @@ function useChat(options = {}) {
232
367
  const [input, setInput] = useState("");
233
368
  const [status, setStatus] = useState("idle");
234
369
  const [error, setError] = useState();
370
+ const [approvals, setApprovals] = useState([]);
371
+ const [questions, setQuestions] = useState([]);
372
+ const [decidingApprovals, setDecidingApprovals] = useState(() => /* @__PURE__ */ new Set());
373
+ const [answeringQuestions, setAnsweringQuestions] = useState(() => /* @__PURE__ */ new Set());
235
374
  const abortRef = useRef(void 0);
236
375
  const messagesRef = useRef(messages);
376
+ const approvalsRef = useRef(approvals);
377
+ const questionsRef = useRef(questions);
378
+ const decidingApprovalsRef = useRef(decidingApprovals);
379
+ const answeringQuestionsRef = useRef(answeringQuestions);
237
380
  useEffect(() => {
238
381
  messagesRef.current = messages;
239
382
  }, [messages]);
383
+ useEffect(() => {
384
+ approvalsRef.current = approvals;
385
+ }, [approvals]);
386
+ useEffect(() => {
387
+ questionsRef.current = questions;
388
+ }, [questions]);
389
+ useEffect(() => {
390
+ decidingApprovalsRef.current = decidingApprovals;
391
+ }, [decidingApprovals]);
392
+ useEffect(() => {
393
+ answeringQuestionsRef.current = answeringQuestions;
394
+ }, [answeringQuestions]);
240
395
  useEffect(() => {
241
396
  return () => {
242
397
  abortRef.current?.abort();
@@ -257,6 +412,33 @@ function useChat(options = {}) {
257
412
  const createRequest = options.createRequest ?? defaultCreateRequest;
258
413
  const eventToDelta = options.eventToDelta ?? defaultEventToDelta;
259
414
  const eventToFinal = options.eventToFinal ?? defaultEventToFinal;
415
+ const humanInputOptions = options.humanInput;
416
+ const eventToApproval = humanInputOptions?.eventToApproval ?? defaultEventToApproval;
417
+ const eventToQuestion = humanInputOptions?.eventToQuestion ?? defaultEventToQuestion;
418
+ const updateApproval = useCallback((approval) => {
419
+ setApprovals((current) => {
420
+ const next = upsertById(current, approval);
421
+ approvalsRef.current = next;
422
+ return next;
423
+ });
424
+ }, []);
425
+ const updateQuestion = useCallback((question) => {
426
+ setQuestions((current) => {
427
+ const next = upsertById(current, question);
428
+ questionsRef.current = next;
429
+ return next;
430
+ });
431
+ }, []);
432
+ const clearHumanInput = useCallback(() => {
433
+ approvalsRef.current = [];
434
+ questionsRef.current = [];
435
+ decidingApprovalsRef.current = /* @__PURE__ */ new Set();
436
+ answeringQuestionsRef.current = /* @__PURE__ */ new Set();
437
+ setApprovals([]);
438
+ setQuestions([]);
439
+ setDecidingApprovals(/* @__PURE__ */ new Set());
440
+ setAnsweringQuestions(/* @__PURE__ */ new Set());
441
+ }, []);
260
442
  const appendAssistantText = useCallback((assistantId, text2) => {
261
443
  setMessages(
262
444
  (current) => current.map(
@@ -291,10 +473,21 @@ function useChat(options = {}) {
291
473
  setError(void 0);
292
474
  setStatus("streaming");
293
475
  setEvents([]);
476
+ clearHumanInput();
294
477
  setMessages([...requestMessages, assistantMessage]);
295
478
  try {
296
479
  for await (const event of transport.send(request, { signal: abortController.signal })) {
297
480
  setEvents((current) => [...current, event]);
481
+ if (humanInputOptions !== void 0) {
482
+ const approval = eventToApproval(event);
483
+ if (approval !== void 0) {
484
+ updateApproval(approval);
485
+ }
486
+ const question = eventToQuestion(event);
487
+ if (question !== void 0) {
488
+ updateQuestion(question);
489
+ }
490
+ }
298
491
  options.onEvent?.(event);
299
492
  const delta = eventToDelta(event);
300
493
  if (delta !== void 0 && delta.length > 0) {
@@ -325,30 +518,115 @@ function useChat(options = {}) {
325
518
  [
326
519
  appendAssistantText,
327
520
  createRequest,
521
+ clearHumanInput,
328
522
  eventToDelta,
329
523
  eventToFinal,
524
+ eventToApproval,
525
+ eventToQuestion,
526
+ humanInputOptions,
330
527
  input,
331
528
  options,
332
529
  replaceAssistantText,
333
- transport
530
+ transport,
531
+ updateApproval,
532
+ updateQuestion
334
533
  ]
335
534
  );
535
+ const decideToolApproval = useCallback(
536
+ async (approvalId, approved, reason) => {
537
+ if (humanInputOptions === void 0) {
538
+ throw new Error("useChat humanInput is not configured");
539
+ }
540
+ if (decidingApprovalsRef.current.has(approvalId)) {
541
+ return;
542
+ }
543
+ const nextDeciding = new Set(decidingApprovalsRef.current).add(approvalId);
544
+ decidingApprovalsRef.current = nextDeciding;
545
+ setDecidingApprovals(nextDeciding);
546
+ try {
547
+ const approval = approvalsRef.current.find((item) => item.id === approvalId);
548
+ const input2 = {
549
+ approvalId,
550
+ approved,
551
+ ...reason === void 0 ? {} : { reason },
552
+ ...approval === void 0 ? {} : { approval }
553
+ };
554
+ const result = humanInputOptions.decideApproval === void 0 ? await defaultDecideApproval(input2, humanInputOptions) : await humanInputOptions.decideApproval(input2);
555
+ if (result !== void 0) {
556
+ updateApproval(result);
557
+ }
558
+ } finally {
559
+ const next = new Set(decidingApprovalsRef.current);
560
+ next.delete(approvalId);
561
+ decidingApprovalsRef.current = next;
562
+ setDecidingApprovals(next);
563
+ }
564
+ },
565
+ [humanInputOptions, updateApproval]
566
+ );
567
+ const approveTool = useCallback(
568
+ async (approvalId, reason) => {
569
+ await decideToolApproval(approvalId, true, reason);
570
+ },
571
+ [decideToolApproval]
572
+ );
573
+ const rejectTool = useCallback(
574
+ async (approvalId, reason) => {
575
+ await decideToolApproval(approvalId, false, reason);
576
+ },
577
+ [decideToolApproval]
578
+ );
579
+ const answerToolQuestion = useCallback(
580
+ async (questionId, answers) => {
581
+ if (humanInputOptions === void 0) {
582
+ throw new Error("useChat humanInput is not configured");
583
+ }
584
+ if (answeringQuestionsRef.current.has(questionId)) {
585
+ return;
586
+ }
587
+ const nextAnswering = new Set(answeringQuestionsRef.current).add(questionId);
588
+ answeringQuestionsRef.current = nextAnswering;
589
+ setAnsweringQuestions(nextAnswering);
590
+ try {
591
+ const question = questionsRef.current.find((item) => item.id === questionId);
592
+ const input2 = {
593
+ questionId,
594
+ answers,
595
+ ...question === void 0 ? {} : { question }
596
+ };
597
+ const result = humanInputOptions.answerQuestion === void 0 ? await defaultAnswerQuestion(input2, humanInputOptions) : await humanInputOptions.answerQuestion(input2);
598
+ if (result !== void 0) {
599
+ updateQuestion(result);
600
+ }
601
+ } finally {
602
+ const next = new Set(answeringQuestionsRef.current);
603
+ next.delete(questionId);
604
+ answeringQuestionsRef.current = next;
605
+ setAnsweringQuestions(next);
606
+ }
607
+ },
608
+ [humanInputOptions, updateQuestion]
609
+ );
336
610
  const stop = useCallback(() => {
337
611
  abortRef.current?.abort();
338
612
  abortRef.current = void 0;
339
613
  setStatus("idle");
340
614
  }, []);
341
- const reset = useCallback((nextMessages) => {
342
- const resetMessages = nextMessages ?? [];
343
- messagesRef.current = resetMessages;
344
- abortRef.current?.abort();
345
- abortRef.current = void 0;
346
- setMessages(resetMessages);
347
- setEvents([]);
348
- setError(void 0);
349
- setInput("");
350
- setStatus("idle");
351
- }, []);
615
+ const reset = useCallback(
616
+ (nextMessages) => {
617
+ const resetMessages = nextMessages ?? [];
618
+ messagesRef.current = resetMessages;
619
+ abortRef.current?.abort();
620
+ abortRef.current = void 0;
621
+ setMessages(resetMessages);
622
+ setEvents([]);
623
+ clearHumanInput();
624
+ setError(void 0);
625
+ setInput("");
626
+ setStatus("idle");
627
+ },
628
+ [clearHumanInput]
629
+ );
352
630
  const text = messages.filter((message) => message.role === "assistant").map((message) => message.content).join("");
353
631
  return {
354
632
  messages,
@@ -360,19 +638,172 @@ function useChat(options = {}) {
360
638
  reset,
361
639
  status,
362
640
  error,
363
- text
641
+ text,
642
+ humanInput: {
643
+ approvals: {
644
+ all: approvals,
645
+ pending: approvals.filter((approval) => approval.status === "pending")
646
+ },
647
+ questions: {
648
+ all: questions,
649
+ pending: questions.filter((question) => question.status === "pending")
650
+ }
651
+ },
652
+ decidingApprovals,
653
+ answeringQuestions,
654
+ approveTool,
655
+ rejectTool,
656
+ answerToolQuestion
364
657
  };
365
658
  }
366
659
  function isAbortError(error) {
367
660
  return error instanceof DOMException && error.name === "AbortError";
368
661
  }
662
+
663
+ // src/use-completion.ts
664
+ import { useCallback as useCallback2, useEffect as useEffect2, useMemo as useMemo2, useRef as useRef2, useState as useState2 } from "react";
665
+
666
+ // src/completion-defaults.ts
667
+ function defaultCompletionEventToDelta(event) {
668
+ if (!isRecord3(event)) {
669
+ return void 0;
670
+ }
671
+ return event.type === "text_delta" && typeof event.delta === "string" ? event.delta : void 0;
672
+ }
673
+ function defaultCompletionEventToFinal(event) {
674
+ if (!isRecord3(event) || event.type !== "final") {
675
+ return void 0;
676
+ }
677
+ const response = event.response;
678
+ if (!isRecord3(response) || !Array.isArray(response.choice)) {
679
+ return void 0;
680
+ }
681
+ const parts = [];
682
+ for (const item of response.choice) {
683
+ if (isRecord3(item) && item.type === "text" && typeof item.text === "string") {
684
+ parts.push(item.text);
685
+ }
686
+ }
687
+ return parts.length > 0 ? parts.join("") : void 0;
688
+ }
689
+ function isRecord3(value) {
690
+ return typeof value === "object" && value !== null;
691
+ }
692
+
693
+ // src/use-completion.ts
694
+ function useCompletion(options = {}) {
695
+ const [completion, setCompletion] = useState2(options.initialCompletion ?? "");
696
+ const [input, setInput] = useState2("");
697
+ const [status, setStatus] = useState2("idle");
698
+ const [error, setError] = useState2();
699
+ const abortRef = useRef2(void 0);
700
+ const completionRef = useRef2(completion);
701
+ useEffect2(() => {
702
+ completionRef.current = completion;
703
+ }, [completion]);
704
+ useEffect2(() => {
705
+ return () => {
706
+ abortRef.current?.abort();
707
+ };
708
+ }, []);
709
+ const transport = useMemo2(() => {
710
+ if (options.transport !== void 0) {
711
+ return options.transport;
712
+ }
713
+ if (options.endpoint === void 0) {
714
+ return void 0;
715
+ }
716
+ return createFetchTransport({
717
+ endpoint: options.endpoint,
718
+ format: options.format ?? "jsonl"
719
+ });
720
+ }, [options.transport, options.endpoint, options.format]);
721
+ const eventToDelta = options.eventToDelta ?? defaultCompletionEventToDelta;
722
+ const eventToFinal = options.eventToFinal ?? defaultCompletionEventToFinal;
723
+ const complete = useCallback2(
724
+ async (nextInput) => {
725
+ if (transport === void 0) {
726
+ throw new Error("useCompletion requires either transport or endpoint");
727
+ }
728
+ const prompt = nextInput ?? input;
729
+ if (prompt.trim().length === 0) {
730
+ return;
731
+ }
732
+ abortRef.current?.abort();
733
+ const abortController = new AbortController();
734
+ abortRef.current = abortController;
735
+ const request = { prompt, stream: true };
736
+ setInput("");
737
+ setError(void 0);
738
+ setStatus("streaming");
739
+ setCompletion("");
740
+ try {
741
+ for await (const event of transport.send(request, { signal: abortController.signal })) {
742
+ options.onEvent?.(event);
743
+ const delta = eventToDelta(event);
744
+ if (delta !== void 0 && delta.length > 0) {
745
+ setCompletion((current) => `${current}${delta}`);
746
+ }
747
+ const final = eventToFinal(event);
748
+ if (final !== void 0) {
749
+ setCompletion(final);
750
+ }
751
+ }
752
+ if (!abortController.signal.aborted) {
753
+ setStatus("idle");
754
+ }
755
+ } catch (caught) {
756
+ if (isAbortError2(caught)) {
757
+ setStatus("idle");
758
+ return;
759
+ }
760
+ setError(caught);
761
+ setStatus("error");
762
+ options.onError?.(caught);
763
+ } finally {
764
+ if (abortRef.current === abortController) {
765
+ abortRef.current = void 0;
766
+ }
767
+ }
768
+ },
769
+ [eventToDelta, eventToFinal, input, options, transport]
770
+ );
771
+ const stop = useCallback2(() => {
772
+ abortRef.current?.abort();
773
+ abortRef.current = void 0;
774
+ setStatus("idle");
775
+ }, []);
776
+ const reset = useCallback2((nextCompletion) => {
777
+ abortRef.current?.abort();
778
+ abortRef.current = void 0;
779
+ setCompletion(nextCompletion ?? "");
780
+ setError(void 0);
781
+ setInput("");
782
+ setStatus("idle");
783
+ }, []);
784
+ return {
785
+ completion,
786
+ input,
787
+ setInput,
788
+ complete,
789
+ stop,
790
+ reset,
791
+ status,
792
+ error
793
+ };
794
+ }
795
+ function isAbortError2(error) {
796
+ return error instanceof DOMException && error.name === "AbortError";
797
+ }
369
798
  export {
370
799
  EventStreamHttpError,
371
800
  createChatTransport,
801
+ createDirectTransport,
372
802
  createFetchTransport,
373
803
  fetchEventStream,
374
804
  readJsonlStream,
375
805
  readSseStream,
376
- useChat
806
+ useChat,
807
+ useCompletion
377
808
  };
378
809
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/streams.ts","../src/fetch.ts","../src/transport.ts","../src/use-chat.ts","../src/chat-defaults.ts"],"sourcesContent":["export async function* readJsonlStream<TEvent>(\n stream: ReadableStream<Uint8Array>,\n): AsyncIterable<TEvent> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const next = await reader.read();\n if (next.done === true) {\n break;\n }\n\n buffer += decoder.decode(next.value, { stream: true });\n const lines = buffer.split(/\\r?\\n/);\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.length > 0) {\n yield JSON.parse(trimmed) as TEvent;\n }\n }\n }\n\n buffer += decoder.decode();\n const trimmed = buffer.trim();\n if (trimmed.length > 0) {\n yield JSON.parse(trimmed) as TEvent;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport async function* readSseStream<TEvent>(\n stream: ReadableStream<Uint8Array>,\n): AsyncIterable<TEvent> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n let event = createEmptySseEvent();\n\n try {\n while (true) {\n const next = await reader.read();\n if (next.done === true) {\n break;\n }\n\n buffer += decoder.decode(next.value, { stream: true });\n const lines = buffer.split(/\\r?\\n/);\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const parsed = parseSseLine(line, event);\n event = parsed.event;\n if (parsed.complete === true && parsed.data !== undefined) {\n yield JSON.parse(parsed.data) as TEvent;\n }\n }\n }\n\n buffer += decoder.decode();\n if (buffer.length > 0) {\n const parsed = parseSseLine(buffer, event);\n event = parsed.event;\n if (parsed.complete === true && parsed.data !== undefined) {\n yield JSON.parse(parsed.data) as TEvent;\n }\n }\n const data = flushSseEvent(event);\n if (data !== undefined) {\n yield JSON.parse(data) as TEvent;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction createEmptySseEvent(): { data: string[] } {\n return { data: [] };\n}\n\nfunction parseSseLine(\n line: string,\n event: { data: string[] },\n): { event: { data: string[] }; complete?: true; data?: string } {\n if (line === \"\") {\n const data = flushSseEvent(event);\n return data === undefined\n ? { event: createEmptySseEvent(), complete: true }\n : { event: createEmptySseEvent(), complete: true, data };\n }\n\n if (line.startsWith(\":\")) {\n return { event };\n }\n\n const separator = line.indexOf(\":\");\n const field = separator === -1 ? line : line.slice(0, separator);\n const value = separator === -1 ? \"\" : line.slice(separator + 1).replace(/^ /, \"\");\n\n if (field === \"data\") {\n event.data.push(value);\n }\n\n return { event };\n}\n\nfunction flushSseEvent(event: { data: string[] }): string | undefined {\n if (event.data.length === 0) {\n return undefined;\n }\n\n return event.data.join(\"\\n\");\n}\n","import { readJsonlStream, readSseStream } from \"./streams\";\nimport type { EventStreamFormat } from \"./types\";\n\nexport type FetchEventStreamOptions = Omit<RequestInit, \"headers\"> & {\n format?: EventStreamFormat;\n fetch?: typeof fetch;\n headers?: HeadersInit;\n};\n\nexport class EventStreamHttpError extends Error {\n constructor(\n readonly response: Response,\n readonly body: string,\n ) {\n super(`Event stream request failed with status ${response.status}`);\n this.name = \"EventStreamHttpError\";\n }\n}\n\nexport async function* fetchEventStream<TEvent>(\n input: string | URL | Request,\n options: FetchEventStreamOptions = {},\n): AsyncIterable<TEvent> {\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (fetchImpl === undefined) {\n throw new Error(\"fetchEventStream requires a fetch implementation\");\n }\n\n const response = await fetchImpl(input, fetchOptions(options));\n if (!response.ok) {\n throw new EventStreamHttpError(response, await response.text());\n }\n if (response.body === null) {\n throw new Error(\"Event stream response does not include a body\");\n }\n\n const format = options.format ?? inferEventStreamFormat(response.headers.get(\"content-type\"));\n if (format === \"sse\") {\n yield* readSseStream<TEvent>(response.body);\n return;\n }\n\n yield* readJsonlStream<TEvent>(response.body);\n}\n\nfunction fetchOptions(options: FetchEventStreamOptions): RequestInit {\n const { format: _format, fetch: _fetch, ...init } = options;\n return init;\n}\n\nfunction inferEventStreamFormat(contentType: string | null): EventStreamFormat {\n return contentType?.toLowerCase().includes(\"text/event-stream\") ? \"sse\" : \"jsonl\";\n}\n","import { type FetchEventStreamOptions, fetchEventStream } from \"./fetch\";\nimport type { EventStreamFormat, EventTransport } from \"./types\";\n\nexport type CreateFetchTransportOptions<TRequest, TEvent> = {\n endpoint: string | URL | ((request: TRequest) => string | URL);\n method?: string;\n format?: EventStreamFormat;\n fetch?: typeof fetch;\n headers?: HeadersInit | ((request: TRequest) => HeadersInit | Promise<HeadersInit>);\n body?: (request: TRequest) => BodyInit | null | undefined | Promise<BodyInit | null | undefined>;\n init?: Omit<RequestInit, \"body\" | \"headers\" | \"method\" | \"signal\">;\n mapEvent?: (event: unknown) => TEvent;\n};\n\nexport function createFetchTransport<TRequest, TEvent = unknown>(\n options: CreateFetchTransportOptions<TRequest, TEvent>,\n): EventTransport<TRequest, TEvent> {\n return {\n async *send(request, transportOptions = {}) {\n const endpoint =\n typeof options.endpoint === \"function\" ? options.endpoint(request) : options.endpoint;\n const requestHeaders = await resolveHeaders(options.headers, request);\n const headers = mergeHeaders(requestHeaders, transportOptions.headers);\n const method = options.method ?? \"POST\";\n const body = await resolveBody(options.body, request, headers);\n const init: FetchEventStreamOptions = {\n ...(options.init ?? {}),\n method,\n headers,\n format: options.format ?? \"jsonl\",\n };\n\n if (body !== undefined) {\n init.body = body;\n }\n if (transportOptions.signal !== undefined) {\n init.signal = transportOptions.signal;\n }\n if (options.fetch !== undefined) {\n init.fetch = options.fetch;\n }\n\n for await (const event of fetchEventStream<unknown>(endpoint, init)) {\n yield options.mapEvent === undefined ? (event as TEvent) : options.mapEvent(event);\n }\n },\n };\n}\n\nexport function createChatTransport<TRequest, TEvent = unknown>(\n options: CreateFetchTransportOptions<TRequest, TEvent>,\n): EventTransport<TRequest, TEvent> {\n return createFetchTransport(options);\n}\n\nasync function resolveHeaders<TRequest>(\n headers: CreateFetchTransportOptions<TRequest, unknown>[\"headers\"],\n request: TRequest,\n): Promise<HeadersInit | undefined> {\n return typeof headers === \"function\" ? headers(request) : headers;\n}\n\nasync function resolveBody<TRequest>(\n body: CreateFetchTransportOptions<TRequest, unknown>[\"body\"],\n request: TRequest,\n headers: Headers,\n): Promise<BodyInit | null | undefined> {\n if (body !== undefined) {\n return body(request);\n }\n\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\");\n }\n\n return JSON.stringify(request);\n}\n\nfunction mergeHeaders(...values: (HeadersInit | undefined)[]): Headers {\n const headers = new Headers();\n\n for (const value of values) {\n if (value === undefined) {\n continue;\n }\n new Headers(value).forEach((headerValue, key) => {\n headers.set(key, headerValue);\n });\n }\n\n return headers;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport {\n createMessage,\n defaultCreateRequest,\n defaultEventToDelta,\n defaultEventToFinal,\n} from \"./chat-defaults\";\nimport { createChatTransport } from \"./transport\";\nimport type { ChatMessage, DefaultChatRequest, UseChatOptions, UseChatResult } from \"./types\";\n\nexport function useChat<\n TRequest = DefaultChatRequest,\n TEvent = unknown,\n TMessage extends ChatMessage = ChatMessage,\n>(options: UseChatOptions<TRequest, TEvent, TMessage> = {}): UseChatResult<TEvent, TMessage> {\n const [messages, setMessages] = useState<TMessage[]>(() => [...(options.initialMessages ?? [])]);\n const [events, setEvents] = useState<TEvent[]>([]);\n const [input, setInput] = useState(\"\");\n const [status, setStatus] = useState<UseChatResult<TEvent, TMessage>[\"status\"]>(\"idle\");\n const [error, setError] = useState<unknown>();\n const abortRef = useRef<AbortController | undefined>(undefined);\n const messagesRef = useRef(messages);\n\n useEffect(() => {\n messagesRef.current = messages;\n }, [messages]);\n\n useEffect(() => {\n return () => {\n abortRef.current?.abort();\n };\n }, []);\n\n const transport = useMemo(() => {\n if (options.transport !== undefined) {\n return options.transport;\n }\n if (options.endpoint === undefined) {\n return undefined;\n }\n\n return createChatTransport<TRequest, TEvent>({\n endpoint: options.endpoint,\n format: options.format ?? \"jsonl\",\n });\n }, [options.transport, options.endpoint, options.format]);\n\n const createRequest = options.createRequest ?? defaultCreateRequest<TRequest, TMessage>;\n const eventToDelta = options.eventToDelta ?? defaultEventToDelta<TEvent>;\n const eventToFinal = options.eventToFinal ?? defaultEventToFinal<TEvent>;\n\n const appendAssistantText = useCallback((assistantId: string, text: string) => {\n setMessages((current) =>\n current.map((message) =>\n message.id === assistantId\n ? ({ ...message, content: `${message.content}${text}` } as TMessage)\n : message,\n ),\n );\n }, []);\n\n const replaceAssistantText = useCallback((assistantId: string, text: string) => {\n setMessages((current) =>\n current.map((message) =>\n message.id === assistantId ? ({ ...message, content: text } as TMessage) : message,\n ),\n );\n }, []);\n\n const send = useCallback(\n async (nextInput?: string) => {\n if (transport === undefined) {\n throw new Error(\"useChat requires either transport or endpoint\");\n }\n\n const content = nextInput ?? input;\n if (content.trim().length === 0) {\n return;\n }\n\n abortRef.current?.abort();\n const abortController = new AbortController();\n abortRef.current = abortController;\n\n const userMessage = createMessage<TMessage>(\"user\", content);\n const assistantMessage = createMessage<TMessage>(\"assistant\", \"\");\n const requestMessages = [...messagesRef.current, userMessage];\n const request = createRequest(content, requestMessages);\n\n setInput(\"\");\n setError(undefined);\n setStatus(\"streaming\");\n setEvents([]);\n setMessages([...requestMessages, assistantMessage]);\n\n try {\n for await (const event of transport.send(request, { signal: abortController.signal })) {\n setEvents((current) => [...current, event]);\n options.onEvent?.(event);\n\n const delta = eventToDelta(event);\n if (delta !== undefined && delta.length > 0) {\n appendAssistantText(assistantMessage.id, delta);\n }\n\n const final = eventToFinal(event);\n if (final !== undefined) {\n replaceAssistantText(assistantMessage.id, final);\n }\n }\n\n if (!abortController.signal.aborted) {\n setStatus(\"idle\");\n }\n } catch (caught) {\n if (isAbortError(caught)) {\n setStatus(\"idle\");\n return;\n }\n\n setError(caught);\n setStatus(\"error\");\n options.onError?.(caught);\n } finally {\n if (abortRef.current === abortController) {\n abortRef.current = undefined;\n }\n }\n },\n [\n appendAssistantText,\n createRequest,\n eventToDelta,\n eventToFinal,\n input,\n options,\n replaceAssistantText,\n transport,\n ],\n );\n\n const stop = useCallback(() => {\n abortRef.current?.abort();\n abortRef.current = undefined;\n setStatus(\"idle\");\n }, []);\n\n const reset = useCallback((nextMessages?: TMessage[]) => {\n const resetMessages = nextMessages ?? [];\n messagesRef.current = resetMessages;\n abortRef.current?.abort();\n abortRef.current = undefined;\n setMessages(resetMessages);\n setEvents([]);\n setError(undefined);\n setInput(\"\");\n setStatus(\"idle\");\n }, []);\n\n const text = messages\n .filter((message) => message.role === \"assistant\")\n .map((message) => message.content)\n .join(\"\");\n\n return {\n messages,\n events,\n input,\n setInput,\n send,\n stop,\n reset,\n status,\n error,\n text,\n };\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof DOMException && error.name === \"AbortError\";\n}\n","import type { ChatMessage, ChatRole, DefaultChatRequest } from \"./types\";\n\nexport function defaultCreateRequest<TRequest, TMessage extends ChatMessage>(\n input: string,\n messages: TMessage[],\n): TRequest {\n return {\n message: input,\n history: messages.slice(0, -1),\n stream: true,\n } as DefaultChatRequest as TRequest;\n}\n\nexport function createMessage<TMessage extends ChatMessage>(\n role: ChatRole,\n content: string,\n): TMessage {\n return {\n id: createId(),\n role,\n content,\n } as TMessage;\n}\n\nexport function defaultEventToDelta<TEvent>(event: TEvent): string | undefined {\n if (!isRecord(event)) {\n return undefined;\n }\n\n return event.type === \"text_delta\" && typeof event.delta === \"string\" ? event.delta : undefined;\n}\n\nexport function defaultEventToFinal<TEvent>(event: TEvent): string | undefined {\n if (!isRecord(event)) {\n return undefined;\n }\n\n return event.type === \"final\" && typeof event.output === \"string\" ? event.output : undefined;\n}\n\nfunction createId(): string {\n return globalThis.crypto?.randomUUID?.() ?? Math.random().toString(36).slice(2);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n"],"mappings":"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","names":["trimmed","text"]}
1
+ {"version":3,"sources":["../src/direct.ts","../src/streams.ts","../src/fetch.ts","../src/transport.ts","../src/use-chat.ts","../src/chat-defaults.ts","../src/human-input.ts","../src/use-completion.ts","../src/completion-defaults.ts"],"sourcesContent":["import type { EventTransport } from \"./types\";\n\nexport function createDirectTransport<TRequest, TEvent>(\n handler: (request: TRequest) => AsyncIterable<TEvent>,\n): EventTransport<TRequest, TEvent> {\n return {\n async *send(request, options) {\n const iterable = handler(request);\n const iterator = iterable[Symbol.asyncIterator]();\n try {\n while (true) {\n if (options?.signal?.aborted) {\n break;\n }\n\n const next = await iterator.next();\n if (next.done) {\n break;\n }\n\n yield next.value;\n }\n } finally {\n await iterator.return?.();\n }\n },\n };\n}\n","export async function* readJsonlStream<TEvent>(\n stream: ReadableStream<Uint8Array>,\n): AsyncIterable<TEvent> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const next = await reader.read();\n if (next.done === true) {\n break;\n }\n\n buffer += decoder.decode(next.value, { stream: true });\n const lines = buffer.split(/\\r?\\n/);\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.length > 0) {\n yield JSON.parse(trimmed) as TEvent;\n }\n }\n }\n\n buffer += decoder.decode();\n const trimmed = buffer.trim();\n if (trimmed.length > 0) {\n yield JSON.parse(trimmed) as TEvent;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport async function* readSseStream<TEvent>(\n stream: ReadableStream<Uint8Array>,\n): AsyncIterable<TEvent> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n let event = createEmptySseEvent();\n\n try {\n while (true) {\n const next = await reader.read();\n if (next.done === true) {\n break;\n }\n\n buffer += decoder.decode(next.value, { stream: true });\n const lines = buffer.split(/\\r?\\n/);\n buffer = lines.pop() ?? \"\";\n\n for (const line of lines) {\n const parsed = parseSseLine(line, event);\n event = parsed.event;\n if (parsed.complete === true && parsed.data !== undefined) {\n yield JSON.parse(parsed.data) as TEvent;\n }\n }\n }\n\n buffer += decoder.decode();\n if (buffer.length > 0) {\n const parsed = parseSseLine(buffer, event);\n event = parsed.event;\n if (parsed.complete === true && parsed.data !== undefined) {\n yield JSON.parse(parsed.data) as TEvent;\n }\n }\n const data = flushSseEvent(event);\n if (data !== undefined) {\n yield JSON.parse(data) as TEvent;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction createEmptySseEvent(): { data: string[] } {\n return { data: [] };\n}\n\nfunction parseSseLine(\n line: string,\n event: { data: string[] },\n): { event: { data: string[] }; complete?: true; data?: string } {\n if (line === \"\") {\n const data = flushSseEvent(event);\n return data === undefined\n ? { event: createEmptySseEvent(), complete: true }\n : { event: createEmptySseEvent(), complete: true, data };\n }\n\n if (line.startsWith(\":\")) {\n return { event };\n }\n\n const separator = line.indexOf(\":\");\n const field = separator === -1 ? line : line.slice(0, separator);\n const value = separator === -1 ? \"\" : line.slice(separator + 1).replace(/^ /, \"\");\n\n if (field === \"data\") {\n event.data.push(value);\n }\n\n return { event };\n}\n\nfunction flushSseEvent(event: { data: string[] }): string | undefined {\n if (event.data.length === 0) {\n return undefined;\n }\n\n return event.data.join(\"\\n\");\n}\n","import { readJsonlStream, readSseStream } from \"./streams\";\nimport type { EventStreamFormat } from \"./types\";\n\nexport type FetchEventStreamOptions = Omit<RequestInit, \"headers\"> & {\n format?: EventStreamFormat;\n fetch?: typeof fetch;\n headers?: HeadersInit;\n};\n\nexport class EventStreamHttpError extends Error {\n constructor(\n readonly response: Response,\n readonly body: string,\n ) {\n super(`Event stream request failed with status ${response.status}`);\n this.name = \"EventStreamHttpError\";\n }\n}\n\nexport async function* fetchEventStream<TEvent>(\n input: string | URL | Request,\n options: FetchEventStreamOptions = {},\n): AsyncIterable<TEvent> {\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (fetchImpl === undefined) {\n throw new Error(\"fetchEventStream requires a fetch implementation\");\n }\n\n const response = await fetchImpl(input, fetchOptions(options));\n if (!response.ok) {\n throw new EventStreamHttpError(response, await response.text());\n }\n if (response.body === null) {\n throw new Error(\"Event stream response does not include a body\");\n }\n\n const format = options.format ?? inferEventStreamFormat(response.headers.get(\"content-type\"));\n if (format === \"sse\") {\n yield* readSseStream<TEvent>(response.body);\n return;\n }\n\n yield* readJsonlStream<TEvent>(response.body);\n}\n\nfunction fetchOptions(options: FetchEventStreamOptions): RequestInit {\n const { format: _format, fetch: _fetch, ...init } = options;\n return init;\n}\n\nfunction inferEventStreamFormat(contentType: string | null): EventStreamFormat {\n return contentType?.toLowerCase().includes(\"text/event-stream\") ? \"sse\" : \"jsonl\";\n}\n","import { type FetchEventStreamOptions, fetchEventStream } from \"./fetch\";\nimport type { EventStreamFormat, EventTransport } from \"./types\";\n\nexport type CreateFetchTransportOptions<TRequest, TEvent> = {\n endpoint: string | URL | ((request: TRequest) => string | URL);\n method?: string;\n format?: EventStreamFormat;\n fetch?: typeof fetch;\n headers?: HeadersInit | ((request: TRequest) => HeadersInit | Promise<HeadersInit>);\n body?: (request: TRequest) => BodyInit | null | undefined | Promise<BodyInit | null | undefined>;\n init?: Omit<RequestInit, \"body\" | \"headers\" | \"method\" | \"signal\">;\n mapEvent?: (event: unknown) => TEvent;\n};\n\nexport function createFetchTransport<TRequest, TEvent = unknown>(\n options: CreateFetchTransportOptions<TRequest, TEvent>,\n): EventTransport<TRequest, TEvent> {\n return {\n async *send(request, transportOptions = {}) {\n const endpoint =\n typeof options.endpoint === \"function\" ? options.endpoint(request) : options.endpoint;\n const requestHeaders = await resolveHeaders(options.headers, request);\n const headers = mergeHeaders(requestHeaders, transportOptions.headers);\n const method = options.method ?? \"POST\";\n const body = await resolveBody(options.body, request, headers);\n const init: FetchEventStreamOptions = {\n ...(options.init ?? {}),\n method,\n headers,\n format: options.format ?? \"jsonl\",\n };\n\n if (body !== undefined) {\n init.body = body;\n }\n if (transportOptions.signal !== undefined) {\n init.signal = transportOptions.signal;\n }\n if (options.fetch !== undefined) {\n init.fetch = options.fetch;\n }\n\n for await (const event of fetchEventStream<unknown>(endpoint, init)) {\n yield options.mapEvent === undefined ? (event as TEvent) : options.mapEvent(event);\n }\n },\n };\n}\n\nexport function createChatTransport<TRequest, TEvent = unknown>(\n options: CreateFetchTransportOptions<TRequest, TEvent>,\n): EventTransport<TRequest, TEvent> {\n return createFetchTransport(options);\n}\n\nasync function resolveHeaders<TRequest>(\n headers: CreateFetchTransportOptions<TRequest, unknown>[\"headers\"],\n request: TRequest,\n): Promise<HeadersInit | undefined> {\n return typeof headers === \"function\" ? headers(request) : headers;\n}\n\nasync function resolveBody<TRequest>(\n body: CreateFetchTransportOptions<TRequest, unknown>[\"body\"],\n request: TRequest,\n headers: Headers,\n): Promise<BodyInit | null | undefined> {\n if (body !== undefined) {\n return body(request);\n }\n\n if (!headers.has(\"content-type\")) {\n headers.set(\"content-type\", \"application/json\");\n }\n\n return JSON.stringify(request);\n}\n\nfunction mergeHeaders(...values: (HeadersInit | undefined)[]): Headers {\n const headers = new Headers();\n\n for (const value of values) {\n if (value === undefined) {\n continue;\n }\n new Headers(value).forEach((headerValue, key) => {\n headers.set(key, headerValue);\n });\n }\n\n return headers;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport {\n createMessage,\n defaultCreateRequest,\n defaultEventToDelta,\n defaultEventToFinal,\n} from \"./chat-defaults\";\nimport {\n defaultAnswerQuestion,\n defaultDecideApproval,\n defaultEventToApproval,\n defaultEventToQuestion,\n upsertById,\n} from \"./human-input\";\nimport { createChatTransport } from \"./transport\";\nimport type {\n ChatMessage,\n DefaultChatRequest,\n ToolApproval,\n ToolQuestion,\n ToolQuestionAnswer,\n UseChatOptions,\n UseChatResult,\n} from \"./types\";\n\nexport function useChat<\n TRequest = DefaultChatRequest,\n TEvent = unknown,\n TMessage extends ChatMessage = ChatMessage,\n>(options: UseChatOptions<TRequest, TEvent, TMessage> = {}): UseChatResult<TEvent, TMessage> {\n const [messages, setMessages] = useState<TMessage[]>(() => [...(options.initialMessages ?? [])]);\n const [events, setEvents] = useState<TEvent[]>([]);\n const [input, setInput] = useState(\"\");\n const [status, setStatus] = useState<UseChatResult<TEvent, TMessage>[\"status\"]>(\"idle\");\n const [error, setError] = useState<unknown>();\n const [approvals, setApprovals] = useState<ToolApproval[]>([]);\n const [questions, setQuestions] = useState<ToolQuestion[]>([]);\n const [decidingApprovals, setDecidingApprovals] = useState<Set<string>>(() => new Set());\n const [answeringQuestions, setAnsweringQuestions] = useState<Set<string>>(() => new Set());\n const abortRef = useRef<AbortController | undefined>(undefined);\n const messagesRef = useRef(messages);\n const approvalsRef = useRef(approvals);\n const questionsRef = useRef(questions);\n const decidingApprovalsRef = useRef(decidingApprovals);\n const answeringQuestionsRef = useRef(answeringQuestions);\n\n useEffect(() => {\n messagesRef.current = messages;\n }, [messages]);\n\n useEffect(() => {\n approvalsRef.current = approvals;\n }, [approvals]);\n\n useEffect(() => {\n questionsRef.current = questions;\n }, [questions]);\n\n useEffect(() => {\n decidingApprovalsRef.current = decidingApprovals;\n }, [decidingApprovals]);\n\n useEffect(() => {\n answeringQuestionsRef.current = answeringQuestions;\n }, [answeringQuestions]);\n\n useEffect(() => {\n return () => {\n abortRef.current?.abort();\n };\n }, []);\n\n const transport = useMemo(() => {\n if (options.transport !== undefined) {\n return options.transport;\n }\n if (options.endpoint === undefined) {\n return undefined;\n }\n\n return createChatTransport<TRequest, TEvent>({\n endpoint: options.endpoint,\n format: options.format ?? \"jsonl\",\n });\n }, [options.transport, options.endpoint, options.format]);\n\n const createRequest = options.createRequest ?? defaultCreateRequest<TRequest, TMessage>;\n const eventToDelta = options.eventToDelta ?? defaultEventToDelta<TEvent>;\n const eventToFinal = options.eventToFinal ?? defaultEventToFinal<TEvent>;\n const humanInputOptions = options.humanInput;\n const eventToApproval = humanInputOptions?.eventToApproval ?? defaultEventToApproval<TEvent>;\n const eventToQuestion = humanInputOptions?.eventToQuestion ?? defaultEventToQuestion<TEvent>;\n\n const updateApproval = useCallback((approval: ToolApproval) => {\n setApprovals((current) => {\n const next = upsertById(current, approval);\n approvalsRef.current = next;\n return next;\n });\n }, []);\n\n const updateQuestion = useCallback((question: ToolQuestion) => {\n setQuestions((current) => {\n const next = upsertById(current, question);\n questionsRef.current = next;\n return next;\n });\n }, []);\n\n const clearHumanInput = useCallback(() => {\n approvalsRef.current = [];\n questionsRef.current = [];\n decidingApprovalsRef.current = new Set();\n answeringQuestionsRef.current = new Set();\n setApprovals([]);\n setQuestions([]);\n setDecidingApprovals(new Set());\n setAnsweringQuestions(new Set());\n }, []);\n\n const appendAssistantText = useCallback((assistantId: string, text: string) => {\n setMessages((current) =>\n current.map((message) =>\n message.id === assistantId\n ? ({ ...message, content: `${message.content}${text}` } as TMessage)\n : message,\n ),\n );\n }, []);\n\n const replaceAssistantText = useCallback((assistantId: string, text: string) => {\n setMessages((current) =>\n current.map((message) =>\n message.id === assistantId ? ({ ...message, content: text } as TMessage) : message,\n ),\n );\n }, []);\n\n const send = useCallback(\n async (nextInput?: string) => {\n if (transport === undefined) {\n throw new Error(\"useChat requires either transport or endpoint\");\n }\n\n const content = nextInput ?? input;\n if (content.trim().length === 0) {\n return;\n }\n\n abortRef.current?.abort();\n const abortController = new AbortController();\n abortRef.current = abortController;\n\n const userMessage = createMessage<TMessage>(\"user\", content);\n const assistantMessage = createMessage<TMessage>(\"assistant\", \"\");\n const requestMessages = [...messagesRef.current, userMessage];\n const request = createRequest(content, requestMessages);\n\n setInput(\"\");\n setError(undefined);\n setStatus(\"streaming\");\n setEvents([]);\n clearHumanInput();\n setMessages([...requestMessages, assistantMessage]);\n\n try {\n for await (const event of transport.send(request, { signal: abortController.signal })) {\n setEvents((current) => [...current, event]);\n if (humanInputOptions !== undefined) {\n const approval = eventToApproval(event);\n if (approval !== undefined) {\n updateApproval(approval);\n }\n const question = eventToQuestion(event);\n if (question !== undefined) {\n updateQuestion(question);\n }\n }\n options.onEvent?.(event);\n\n const delta = eventToDelta(event);\n if (delta !== undefined && delta.length > 0) {\n appendAssistantText(assistantMessage.id, delta);\n }\n\n const final = eventToFinal(event);\n if (final !== undefined) {\n replaceAssistantText(assistantMessage.id, final);\n }\n }\n\n if (!abortController.signal.aborted) {\n setStatus(\"idle\");\n }\n } catch (caught) {\n if (isAbortError(caught)) {\n setStatus(\"idle\");\n return;\n }\n\n setError(caught);\n setStatus(\"error\");\n options.onError?.(caught);\n } finally {\n if (abortRef.current === abortController) {\n abortRef.current = undefined;\n }\n }\n },\n [\n appendAssistantText,\n createRequest,\n clearHumanInput,\n eventToDelta,\n eventToFinal,\n eventToApproval,\n eventToQuestion,\n humanInputOptions,\n input,\n options,\n replaceAssistantText,\n transport,\n updateApproval,\n updateQuestion,\n ],\n );\n\n const decideToolApproval = useCallback(\n async (approvalId: string, approved: boolean, reason?: string) => {\n if (humanInputOptions === undefined) {\n throw new Error(\"useChat humanInput is not configured\");\n }\n if (decidingApprovalsRef.current.has(approvalId)) {\n return;\n }\n\n const nextDeciding = new Set(decidingApprovalsRef.current).add(approvalId);\n decidingApprovalsRef.current = nextDeciding;\n setDecidingApprovals(nextDeciding);\n try {\n const approval = approvalsRef.current.find((item) => item.id === approvalId);\n const input = {\n approvalId,\n approved,\n ...(reason === undefined ? {} : { reason }),\n ...(approval === undefined ? {} : { approval }),\n };\n const result =\n humanInputOptions.decideApproval === undefined\n ? await defaultDecideApproval(input, humanInputOptions)\n : await humanInputOptions.decideApproval(input);\n if (result !== undefined) {\n updateApproval(result);\n }\n } finally {\n const next = new Set(decidingApprovalsRef.current);\n next.delete(approvalId);\n decidingApprovalsRef.current = next;\n setDecidingApprovals(next);\n }\n },\n [humanInputOptions, updateApproval],\n );\n\n const approveTool = useCallback(\n async (approvalId: string, reason?: string) => {\n await decideToolApproval(approvalId, true, reason);\n },\n [decideToolApproval],\n );\n\n const rejectTool = useCallback(\n async (approvalId: string, reason?: string) => {\n await decideToolApproval(approvalId, false, reason);\n },\n [decideToolApproval],\n );\n\n const answerToolQuestion = useCallback(\n async (questionId: string, answers: ToolQuestionAnswer[]) => {\n if (humanInputOptions === undefined) {\n throw new Error(\"useChat humanInput is not configured\");\n }\n if (answeringQuestionsRef.current.has(questionId)) {\n return;\n }\n\n const nextAnswering = new Set(answeringQuestionsRef.current).add(questionId);\n answeringQuestionsRef.current = nextAnswering;\n setAnsweringQuestions(nextAnswering);\n try {\n const question = questionsRef.current.find((item) => item.id === questionId);\n const input = {\n questionId,\n answers,\n ...(question === undefined ? {} : { question }),\n };\n const result =\n humanInputOptions.answerQuestion === undefined\n ? await defaultAnswerQuestion(input, humanInputOptions)\n : await humanInputOptions.answerQuestion(input);\n if (result !== undefined) {\n updateQuestion(result);\n }\n } finally {\n const next = new Set(answeringQuestionsRef.current);\n next.delete(questionId);\n answeringQuestionsRef.current = next;\n setAnsweringQuestions(next);\n }\n },\n [humanInputOptions, updateQuestion],\n );\n\n const stop = useCallback(() => {\n abortRef.current?.abort();\n abortRef.current = undefined;\n setStatus(\"idle\");\n }, []);\n\n const reset = useCallback(\n (nextMessages?: TMessage[]) => {\n const resetMessages = nextMessages ?? [];\n messagesRef.current = resetMessages;\n abortRef.current?.abort();\n abortRef.current = undefined;\n setMessages(resetMessages);\n setEvents([]);\n clearHumanInput();\n setError(undefined);\n setInput(\"\");\n setStatus(\"idle\");\n },\n [clearHumanInput],\n );\n\n const text = messages\n .filter((message) => message.role === \"assistant\")\n .map((message) => message.content)\n .join(\"\");\n\n return {\n messages,\n events,\n input,\n setInput,\n send,\n stop,\n reset,\n status,\n error,\n text,\n humanInput: {\n approvals: {\n all: approvals,\n pending: approvals.filter((approval) => approval.status === \"pending\"),\n },\n questions: {\n all: questions,\n pending: questions.filter((question) => question.status === \"pending\"),\n },\n },\n decidingApprovals,\n answeringQuestions,\n approveTool,\n rejectTool,\n answerToolQuestion,\n };\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof DOMException && error.name === \"AbortError\";\n}\n","import type { ChatMessage, ChatRole, DefaultChatRequest } from \"./types\";\n\nexport function defaultCreateRequest<TRequest, TMessage extends ChatMessage>(\n input: string,\n messages: TMessage[],\n): TRequest {\n return {\n message: input,\n history: messages.slice(0, -1),\n stream: true,\n } as DefaultChatRequest as TRequest;\n}\n\nexport function createMessage<TMessage extends ChatMessage>(\n role: ChatRole,\n content: string,\n): TMessage {\n return {\n id: createId(),\n role,\n content,\n } as TMessage;\n}\n\nexport function defaultEventToDelta<TEvent>(event: TEvent): string | undefined {\n if (!isRecord(event)) {\n return undefined;\n }\n\n return event.type === \"text_delta\" && typeof event.delta === \"string\" ? event.delta : undefined;\n}\n\nexport function defaultEventToFinal<TEvent>(event: TEvent): string | undefined {\n if (!isRecord(event)) {\n return undefined;\n }\n\n return event.type === \"final\" && typeof event.output === \"string\" ? event.output : undefined;\n}\n\nfunction createId(): string {\n return globalThis.crypto?.randomUUID?.() ?? Math.random().toString(36).slice(2);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n","import type {\n ToolApproval,\n ToolApprovalDecisionInput,\n ToolQuestion,\n ToolQuestionAnswerInput,\n} from \"./types\";\n\ntype HumanInputEndpointOptions = {\n endpoint?: string | URL;\n fetch?: typeof fetch;\n};\n\nexport function defaultEventToApproval<TEvent>(event: TEvent): ToolApproval | undefined {\n if (!isRecord(event)) {\n return undefined;\n }\n if (event.type !== \"tool_approval_request\" && event.type !== \"tool_approval_result\") {\n return undefined;\n }\n return isToolApproval(event.approval) ? event.approval : undefined;\n}\n\nexport function defaultEventToQuestion<TEvent>(event: TEvent): ToolQuestion | undefined {\n if (!isRecord(event)) {\n return undefined;\n }\n if (event.type !== \"tool_question_request\" && event.type !== \"tool_question_result\") {\n return undefined;\n }\n return isToolQuestion(event.question) ? event.question : undefined;\n}\n\nexport async function defaultDecideApproval(\n input: ToolApprovalDecisionInput,\n options: HumanInputEndpointOptions,\n): Promise<ToolApproval | undefined> {\n const endpoint = requireEndpoint(options.endpoint, \"decideApproval\");\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (fetchImpl === undefined) {\n throw new Error(\"humanInput approval decisions require a fetch implementation\");\n }\n\n const response = await fetchImpl(\n endpointUrl(endpoint, `approvals/${input.approvalId}/decision`),\n {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n approved: input.approved,\n ...(input.reason === undefined ? {} : { reason: input.reason }),\n }),\n },\n );\n if (!response.ok) {\n throw new Error(`Tool approval decision failed with status ${response.status}`);\n }\n return responseJson<ToolApproval>(response);\n}\n\nexport async function defaultAnswerQuestion(\n input: ToolQuestionAnswerInput,\n options: HumanInputEndpointOptions,\n): Promise<ToolQuestion | undefined> {\n const endpoint = requireEndpoint(options.endpoint, \"answerQuestion\");\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (fetchImpl === undefined) {\n throw new Error(\"humanInput question answers require a fetch implementation\");\n }\n\n const response = await fetchImpl(endpointUrl(endpoint, `questions/${input.questionId}/answer`), {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ answers: input.answers }),\n });\n if (!response.ok) {\n throw new Error(`Tool question answer failed with status ${response.status}`);\n }\n return responseJson<ToolQuestion>(response);\n}\n\nexport function upsertById<TItem extends { id: string }>(items: TItem[], item: TItem): TItem[] {\n const index = items.findIndex((current) => current.id === item.id);\n if (index === -1) {\n return [...items, item];\n }\n const next = [...items];\n next[index] = item;\n return next;\n}\n\nfunction requireEndpoint(\n endpoint: HumanInputEndpointOptions[\"endpoint\"],\n operation: \"decideApproval\" | \"answerQuestion\",\n): string | URL {\n if (endpoint === undefined) {\n throw new Error(`humanInput.${operation} requires endpoint or a custom handler`);\n }\n return endpoint;\n}\n\nfunction endpointUrl(endpoint: string | URL, path: string): string | URL {\n const suffix = path.replace(/^\\/+/, \"\");\n if (endpoint instanceof URL) {\n const url = new URL(endpoint.toString());\n url.pathname = joinPath(url.pathname, suffix);\n return url;\n }\n if (/^[a-z][a-z\\d+\\-.]*:\\/\\//i.test(endpoint)) {\n const url = new URL(endpoint);\n url.pathname = joinPath(url.pathname, suffix);\n return url.toString();\n }\n return joinPath(endpoint, suffix);\n}\n\nfunction joinPath(base: string, suffix: string): string {\n const trimmedBase = base.replace(/\\/+$/, \"\");\n const trimmedSuffix = suffix.replace(/^\\/+/, \"\");\n if (trimmedBase.length === 0) {\n return `/${trimmedSuffix}`;\n }\n return `${trimmedBase}/${trimmedSuffix}`;\n}\n\nasync function responseJson<T>(response: Response): Promise<T | undefined> {\n const text = await response.text();\n if (text.trim().length === 0) {\n return undefined;\n }\n return JSON.parse(text) as T;\n}\n\nfunction isToolApproval(value: unknown): value is ToolApproval {\n return (\n isRecord(value) &&\n typeof value.id === \"string\" &&\n typeof value.toolName === \"string\" &&\n typeof value.status === \"string\"\n );\n}\n\nfunction isToolQuestion(value: unknown): value is ToolQuestion {\n return (\n isRecord(value) &&\n typeof value.id === \"string\" &&\n typeof value.toolName === \"string\" &&\n typeof value.status === \"string\" &&\n Array.isArray(value.questions)\n );\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport {\n defaultCompletionEventToDelta,\n defaultCompletionEventToFinal,\n} from \"./completion-defaults\";\nimport { createFetchTransport } from \"./transport\";\nimport type { EventStreamFormat, EventTransport } from \"./types\";\n\nexport type UseCompletionRequest = {\n prompt: string;\n stream: true;\n};\n\nexport type UseCompletionStatus = \"idle\" | \"streaming\" | \"error\";\n\nexport type UseCompletionOptions<TEvent = unknown> = {\n transport?: EventTransport<UseCompletionRequest, TEvent>;\n endpoint?: string | URL;\n format?: EventStreamFormat;\n initialCompletion?: string;\n eventToDelta?: (event: TEvent) => string | undefined;\n eventToFinal?: (event: TEvent) => string | undefined;\n onEvent?: (event: TEvent) => void;\n onError?: (error: unknown) => void;\n};\n\nexport type UseCompletionResult = {\n completion: string;\n input: string;\n setInput(input: string): void;\n complete(prompt?: string): Promise<void>;\n stop(): void;\n reset(completion?: string): void;\n status: UseCompletionStatus;\n error: unknown;\n};\n\nexport function useCompletion<TEvent = unknown>(\n options: UseCompletionOptions<TEvent> = {},\n): UseCompletionResult {\n const [completion, setCompletion] = useState(options.initialCompletion ?? \"\");\n const [input, setInput] = useState(\"\");\n const [status, setStatus] = useState<UseCompletionStatus>(\"idle\");\n const [error, setError] = useState<unknown>();\n const abortRef = useRef<AbortController | undefined>(undefined);\n const completionRef = useRef(completion);\n\n useEffect(() => {\n completionRef.current = completion;\n }, [completion]);\n\n useEffect(() => {\n return () => {\n abortRef.current?.abort();\n };\n }, []);\n\n const transport = useMemo(() => {\n if (options.transport !== undefined) {\n return options.transport;\n }\n if (options.endpoint === undefined) {\n return undefined;\n }\n\n return createFetchTransport<UseCompletionRequest, TEvent>({\n endpoint: options.endpoint,\n format: options.format ?? \"jsonl\",\n });\n }, [options.transport, options.endpoint, options.format]);\n\n const eventToDelta = options.eventToDelta ?? defaultCompletionEventToDelta<TEvent>;\n const eventToFinal = options.eventToFinal ?? defaultCompletionEventToFinal<TEvent>;\n\n const complete = useCallback(\n async (nextInput?: string) => {\n if (transport === undefined) {\n throw new Error(\"useCompletion requires either transport or endpoint\");\n }\n\n const prompt = nextInput ?? input;\n if (prompt.trim().length === 0) {\n return;\n }\n\n abortRef.current?.abort();\n const abortController = new AbortController();\n abortRef.current = abortController;\n\n const request: UseCompletionRequest = { prompt, stream: true };\n\n setInput(\"\");\n setError(undefined);\n setStatus(\"streaming\");\n setCompletion(\"\");\n\n try {\n for await (const event of transport.send(request, { signal: abortController.signal })) {\n options.onEvent?.(event);\n\n const delta = eventToDelta(event);\n if (delta !== undefined && delta.length > 0) {\n setCompletion((current) => `${current}${delta}`);\n }\n\n const final = eventToFinal(event);\n if (final !== undefined) {\n setCompletion(final);\n }\n }\n\n if (!abortController.signal.aborted) {\n setStatus(\"idle\");\n }\n } catch (caught) {\n if (isAbortError(caught)) {\n setStatus(\"idle\");\n return;\n }\n\n setError(caught);\n setStatus(\"error\");\n options.onError?.(caught);\n } finally {\n if (abortRef.current === abortController) {\n abortRef.current = undefined;\n }\n }\n },\n [eventToDelta, eventToFinal, input, options, transport],\n );\n\n const stop = useCallback(() => {\n abortRef.current?.abort();\n abortRef.current = undefined;\n setStatus(\"idle\");\n }, []);\n\n const reset = useCallback((nextCompletion?: string) => {\n abortRef.current?.abort();\n abortRef.current = undefined;\n setCompletion(nextCompletion ?? \"\");\n setError(undefined);\n setInput(\"\");\n setStatus(\"idle\");\n }, []);\n\n return {\n completion,\n input,\n setInput,\n complete,\n stop,\n reset,\n status,\n error,\n };\n}\n\nfunction isAbortError(error: unknown): boolean {\n return error instanceof DOMException && error.name === \"AbortError\";\n}\n","export function defaultCompletionEventToDelta<TEvent>(event: TEvent): string | undefined {\n if (!isRecord(event)) {\n return undefined;\n }\n\n return event.type === \"text_delta\" && typeof event.delta === \"string\" ? event.delta : undefined;\n}\n\nexport function defaultCompletionEventToFinal<TEvent>(event: TEvent): string | undefined {\n if (!isRecord(event) || event.type !== \"final\") {\n return undefined;\n }\n\n const response = event.response;\n if (!isRecord(response) || !Array.isArray(response.choice)) {\n return undefined;\n }\n\n const parts: string[] = [];\n for (const item of response.choice) {\n if (isRecord(item) && item.type === \"text\" && typeof item.text === \"string\") {\n parts.push(item.text);\n }\n }\n\n return parts.length > 0 ? parts.join(\"\") : undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n"],"mappings":"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","names":["trimmed","isRecord","text","input","useCallback","useEffect","useMemo","useRef","useState","isRecord","useState","useRef","useEffect","useMemo","useCallback","isAbortError"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anvia/react",
3
- "version": "0.3.1",
3
+ "version": "0.5.0",
4
4
  "description": "React hooks and client transports for Anvia applications.",
5
5
  "author": "anvia",
6
6
  "maintainer": "Indra Zulfi",