@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 +112 -1
- package/dist/index.js +445 -14
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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
|
-
|
|
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(
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
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"]}
|