@agentuity/react 0.0.77 → 0.0.78

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/api.d.ts CHANGED
@@ -8,6 +8,12 @@ export type RouteKey = keyof RouteRegistry;
8
8
  * Extract HTTP method from route key
9
9
  */
10
10
  export type ExtractMethod<TRoute extends RouteKey> = TRoute extends `${infer Method} ${string}` ? Method : never;
11
+ /**
12
+ * Check if a route is a streaming route
13
+ */
14
+ export type RouteIsStream<TRoute extends RouteKey> = TRoute extends keyof RouteRegistry ? RouteRegistry[TRoute] extends {
15
+ stream: true;
16
+ } ? true : false : false;
11
17
  /**
12
18
  * Extract input type for a specific route
13
19
  */
@@ -17,10 +23,20 @@ export type RouteInput<TRoute extends RouteKey> = TRoute extends keyof RouteRegi
17
23
  /**
18
24
  * Extract output type for a specific route
19
25
  * Returns void if no outputSchema is defined (e.g., 204 No Content)
26
+ * For streaming routes, returns T[] (accumulated chunks)
20
27
  */
21
28
  export type RouteOutput<TRoute extends RouteKey> = TRoute extends keyof RouteRegistry ? RouteRegistry[TRoute] extends {
22
29
  outputSchema: infer TSchema;
30
+ stream: true;
31
+ } ? TSchema extends undefined | never ? unknown[] : InferOutput<TSchema>[] : RouteRegistry[TRoute] extends {
32
+ outputSchema: infer TSchema;
23
33
  } ? TSchema extends undefined | never ? void : InferOutput<TSchema> : void : void;
34
+ /**
35
+ * Helper to extract single chunk type from RouteOutput
36
+ */
37
+ type RouteChunkType<TRoute extends RouteKey> = TRoute extends keyof RouteRegistry ? RouteRegistry[TRoute] extends {
38
+ outputSchema: infer TSchema;
39
+ } ? TSchema extends undefined | never ? unknown : InferOutput<TSchema> : unknown : unknown;
24
40
  /**
25
41
  * Common options shared by all UseAPI configurations
26
42
  */
@@ -39,7 +55,12 @@ type UseAPICommonOptions<TRoute extends RouteKey> = {
39
55
  onSuccess?: (data: RouteOutput<TRoute>) => void;
40
56
  /** Callback when request fails */
41
57
  onError?: (error: Error) => void;
42
- } & (ExtractMethod<TRoute> extends 'GET' ? {
58
+ } & (RouteIsStream<TRoute> extends true ? {
59
+ /** Delimiter for splitting stream chunks (default: \n for JSON lines) */
60
+ delimiter?: string;
61
+ /** Optional transform callback for each chunk */
62
+ onChunk?: (chunk: RouteChunkType<TRoute>) => Promise<RouteChunkType<TRoute>> | RouteChunkType<TRoute>;
63
+ } : Record<string, never>) & (ExtractMethod<TRoute> extends 'GET' ? {
43
64
  /** GET requests cannot have input (use query params instead) */
44
65
  input?: never;
45
66
  } : {
package/dist/api.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
package/dist/api.js CHANGED
@@ -23,6 +23,95 @@ function toSearchParams(query) {
23
23
  return query;
24
24
  return new URLSearchParams(query);
25
25
  }
26
+ /**
27
+ * Process ReadableStream with delimiter-based parsing
28
+ */
29
+ async function processStream(stream, options) {
30
+ const { delimiter, onChunk, onData, onError, mountedRef } = options;
31
+ const reader = stream.getReader();
32
+ const decoder = new TextDecoder();
33
+ let buffer = '';
34
+ try {
35
+ while (true) {
36
+ const { done, value } = await reader.read();
37
+ if (!mountedRef.current) {
38
+ reader.cancel();
39
+ return false;
40
+ }
41
+ if (done)
42
+ break;
43
+ buffer += decoder.decode(value, { stream: true });
44
+ const parts = buffer.split(delimiter);
45
+ buffer = parts.pop() || '';
46
+ for (const part of parts) {
47
+ if (!part.trim())
48
+ continue;
49
+ try {
50
+ // Try JSON parsing first, fall back to plain string for text streams
51
+ let parsed;
52
+ try {
53
+ parsed = JSON.parse(part);
54
+ }
55
+ catch {
56
+ // Not valid JSON - treat as plain string
57
+ parsed = part;
58
+ }
59
+ if (onChunk) {
60
+ parsed = await Promise.resolve(onChunk(parsed));
61
+ }
62
+ if (!mountedRef.current) {
63
+ reader.cancel();
64
+ return false;
65
+ }
66
+ onData(parsed);
67
+ }
68
+ catch (err) {
69
+ if (!mountedRef.current) {
70
+ reader.cancel();
71
+ return false;
72
+ }
73
+ const error = err instanceof Error ? err : new Error(String(err));
74
+ onError(error);
75
+ return false;
76
+ }
77
+ }
78
+ }
79
+ if (buffer.trim()) {
80
+ try {
81
+ // Try JSON parsing first, fall back to plain string for text streams
82
+ let parsed;
83
+ try {
84
+ parsed = JSON.parse(buffer);
85
+ }
86
+ catch {
87
+ // Not valid JSON - treat as plain string
88
+ parsed = buffer;
89
+ }
90
+ if (onChunk) {
91
+ parsed = await Promise.resolve(onChunk(parsed));
92
+ }
93
+ if (mountedRef.current) {
94
+ onData(parsed);
95
+ }
96
+ }
97
+ catch (err) {
98
+ if (!mountedRef.current)
99
+ return false;
100
+ const error = err instanceof Error ? err : new Error(String(err));
101
+ onError(error);
102
+ return false;
103
+ }
104
+ }
105
+ }
106
+ catch (err) {
107
+ if (!mountedRef.current)
108
+ return false;
109
+ const error = err instanceof Error ? err : new Error(String(err));
110
+ onError(error);
111
+ return false;
112
+ }
113
+ return true;
114
+ }
26
115
  /**
27
116
  * Type-safe API client hook with TanStack Query-inspired features.
28
117
  *
@@ -97,6 +186,8 @@ export function useAPI(routeOrOptions) {
97
186
  : routeOrOptions;
98
187
  const context = useContext(AgentuityContext);
99
188
  const { input, query, headers, enabled, staleTime = 0, refetchInterval, onSuccess, onError, } = options;
189
+ const delimiter = 'delimiter' in options ? (options.delimiter ?? '\n') : '\n';
190
+ const onChunk = 'onChunk' in options ? options.onChunk : undefined;
100
191
  if (!context) {
101
192
  throw new Error('useAPI must be used within AgentuityProvider');
102
193
  }
@@ -130,6 +221,14 @@ export function useAPI(routeOrOptions) {
130
221
  mountedRef.current = false;
131
222
  };
132
223
  }, []);
224
+ // Use refs to store latest delimiter/onChunk values to avoid stale closures
225
+ // without causing infinite loops in useCallback dependencies
226
+ const delimiterRef = useRef(delimiter);
227
+ const onChunkRef = useRef(onChunk);
228
+ useEffect(() => {
229
+ delimiterRef.current = delimiter;
230
+ onChunkRef.current = onChunk;
231
+ });
133
232
  const fetchData = useCallback(async () => {
134
233
  if (!mountedRef.current)
135
234
  return;
@@ -171,7 +270,43 @@ export function useAPI(routeOrOptions) {
171
270
  }
172
271
  else {
173
272
  const contentType = response.headers.get('Content-Type') || '';
174
- if (contentType.includes('application/json')) {
273
+ if (contentType.includes('text/event-stream') ||
274
+ contentType.includes('application/octet-stream')) {
275
+ if (!response.body) {
276
+ throw new Error('Response body is null for streaming response');
277
+ }
278
+ setData([]);
279
+ // Track accumulated chunks locally to avoid stale closure
280
+ const accumulatedChunks = [];
281
+ const success = await processStream(response.body, {
282
+ delimiter: delimiterRef.current,
283
+ onChunk: onChunkRef.current,
284
+ onData: (chunk) => {
285
+ if (!mountedRef.current)
286
+ return;
287
+ accumulatedChunks.push(chunk);
288
+ setData([...accumulatedChunks]);
289
+ },
290
+ onError: (err) => {
291
+ if (!mountedRef.current)
292
+ return;
293
+ setError(err);
294
+ setIsError(true);
295
+ onError?.(err);
296
+ },
297
+ mountedRef,
298
+ });
299
+ if (!mountedRef.current)
300
+ return;
301
+ if (success) {
302
+ setIsSuccess(true);
303
+ lastFetchTimeRef.current = Date.now();
304
+ const finalData = accumulatedChunks;
305
+ onSuccess?.(finalData);
306
+ }
307
+ return;
308
+ }
309
+ else if (contentType.includes('application/json')) {
175
310
  responseData = await response.json();
176
311
  }
177
312
  else {
@@ -279,7 +414,49 @@ export function useAPI(routeOrOptions) {
279
414
  }
280
415
  else {
281
416
  const contentType = response.headers.get('Content-Type') || '';
282
- if (contentType.includes('application/json')) {
417
+ if (contentType.includes('text/event-stream') ||
418
+ contentType.includes('application/octet-stream')) {
419
+ if (!response.body) {
420
+ throw new Error('Response body is null for streaming response');
421
+ }
422
+ setData([]);
423
+ // Track accumulated chunks locally to avoid stale closure
424
+ const accumulatedChunks = [];
425
+ let streamError = undefined;
426
+ const success = await processStream(response.body, {
427
+ delimiter: delimiterRef.current,
428
+ onChunk: onChunkRef.current,
429
+ onData: (chunk) => {
430
+ if (!mountedRef.current)
431
+ return;
432
+ accumulatedChunks.push(chunk);
433
+ setData([...accumulatedChunks]);
434
+ },
435
+ onError: (err) => {
436
+ if (!mountedRef.current)
437
+ return;
438
+ streamError = err;
439
+ setError(err);
440
+ setIsError(true);
441
+ onError?.(err);
442
+ },
443
+ mountedRef,
444
+ });
445
+ if (!mountedRef.current)
446
+ return accumulatedChunks;
447
+ if (!success && streamError) {
448
+ throw streamError;
449
+ }
450
+ if (success) {
451
+ setIsSuccess(true);
452
+ lastFetchTimeRef.current = Date.now();
453
+ const finalData = accumulatedChunks;
454
+ onSuccess?.(finalData);
455
+ return finalData;
456
+ }
457
+ return accumulatedChunks;
458
+ }
459
+ else if (contentType.includes('application/json')) {
283
460
  responseData = await response.json();
284
461
  }
285
462
  else {
package/dist/api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentuity/react",
3
- "version": "0.0.77",
3
+ "version": "0.0.78",
4
4
  "license": "Apache-2.0",
5
5
  "author": "Agentuity employees and contributors",
6
6
  "type": "module",
@@ -26,7 +26,7 @@
26
26
  "prepublishOnly": "bun run clean && bun run build"
27
27
  },
28
28
  "dependencies": {
29
- "@agentuity/core": "0.0.77"
29
+ "@agentuity/core": "0.0.78"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@types/bun": "latest",
package/src/api.ts CHANGED
@@ -18,6 +18,15 @@ export type ExtractMethod<TRoute extends RouteKey> = TRoute extends `${infer Met
18
18
  ? Method
19
19
  : never;
20
20
 
21
+ /**
22
+ * Check if a route is a streaming route
23
+ */
24
+ export type RouteIsStream<TRoute extends RouteKey> = TRoute extends keyof RouteRegistry
25
+ ? RouteRegistry[TRoute] extends { stream: true }
26
+ ? true
27
+ : false
28
+ : false;
29
+
21
30
  /**
22
31
  * Extract input type for a specific route
23
32
  */
@@ -30,14 +39,30 @@ export type RouteInput<TRoute extends RouteKey> = TRoute extends keyof RouteRegi
30
39
  /**
31
40
  * Extract output type for a specific route
32
41
  * Returns void if no outputSchema is defined (e.g., 204 No Content)
42
+ * For streaming routes, returns T[] (accumulated chunks)
33
43
  */
34
44
  export type RouteOutput<TRoute extends RouteKey> = TRoute extends keyof RouteRegistry
45
+ ? RouteRegistry[TRoute] extends { outputSchema: infer TSchema; stream: true }
46
+ ? TSchema extends undefined | never
47
+ ? unknown[]
48
+ : InferOutput<TSchema>[]
49
+ : RouteRegistry[TRoute] extends { outputSchema: infer TSchema }
50
+ ? TSchema extends undefined | never
51
+ ? void
52
+ : InferOutput<TSchema>
53
+ : void
54
+ : void;
55
+
56
+ /**
57
+ * Helper to extract single chunk type from RouteOutput
58
+ */
59
+ type RouteChunkType<TRoute extends RouteKey> = TRoute extends keyof RouteRegistry
35
60
  ? RouteRegistry[TRoute] extends { outputSchema: infer TSchema }
36
61
  ? TSchema extends undefined | never
37
- ? void
62
+ ? unknown
38
63
  : InferOutput<TSchema>
39
- : void
40
- : void;
64
+ : unknown
65
+ : unknown;
41
66
 
42
67
  /**
43
68
  * Common options shared by all UseAPI configurations
@@ -57,15 +82,25 @@ type UseAPICommonOptions<TRoute extends RouteKey> = {
57
82
  onSuccess?: (data: RouteOutput<TRoute>) => void;
58
83
  /** Callback when request fails */
59
84
  onError?: (error: Error) => void;
60
- } & (ExtractMethod<TRoute> extends 'GET'
85
+ } & (RouteIsStream<TRoute> extends true
61
86
  ? {
62
- /** GET requests cannot have input (use query params instead) */
63
- input?: never;
87
+ /** Delimiter for splitting stream chunks (default: \n for JSON lines) */
88
+ delimiter?: string;
89
+ /** Optional transform callback for each chunk */
90
+ onChunk?: (
91
+ chunk: RouteChunkType<TRoute>
92
+ ) => Promise<RouteChunkType<TRoute>> | RouteChunkType<TRoute>;
64
93
  }
65
- : {
66
- /** Input data for the request (required for POST/PUT/PATCH/DELETE) */
67
- input?: RouteInput<TRoute>;
68
- });
94
+ : Record<string, never>) &
95
+ (ExtractMethod<TRoute> extends 'GET'
96
+ ? {
97
+ /** GET requests cannot have input (use query params instead) */
98
+ input?: never;
99
+ }
100
+ : {
101
+ /** Input data for the request (required for POST/PUT/PATCH/DELETE) */
102
+ input?: RouteInput<TRoute>;
103
+ });
69
104
 
70
105
  /**
71
106
  * Options with route property (e.g., { route: 'GET /users' })
@@ -187,6 +222,113 @@ function toSearchParams(
187
222
  return new URLSearchParams(query);
188
223
  }
189
224
 
225
+ /**
226
+ * Process ReadableStream with delimiter-based parsing
227
+ */
228
+ async function processStream<T>(
229
+ stream: ReadableStream<Uint8Array>,
230
+ options: {
231
+ delimiter: string;
232
+ onChunk?: (chunk: T) => Promise<T> | T;
233
+ onData: (chunk: T) => void;
234
+ onError: (error: Error) => void;
235
+ mountedRef: React.MutableRefObject<boolean>;
236
+ }
237
+ ): Promise<boolean> {
238
+ const { delimiter, onChunk, onData, onError, mountedRef } = options;
239
+ const reader = stream.getReader();
240
+ const decoder = new TextDecoder();
241
+ let buffer = '';
242
+
243
+ try {
244
+ while (true) {
245
+ const { done, value } = await reader.read();
246
+
247
+ if (!mountedRef.current) {
248
+ reader.cancel();
249
+ return false;
250
+ }
251
+
252
+ if (done) break;
253
+
254
+ buffer += decoder.decode(value, { stream: true });
255
+
256
+ const parts = buffer.split(delimiter);
257
+ buffer = parts.pop() || '';
258
+
259
+ for (const part of parts) {
260
+ if (!part.trim()) continue;
261
+
262
+ try {
263
+ // Try JSON parsing first, fall back to plain string for text streams
264
+ let parsed: T;
265
+ try {
266
+ parsed = JSON.parse(part) as T;
267
+ } catch {
268
+ // Not valid JSON - treat as plain string
269
+ parsed = part as T;
270
+ }
271
+
272
+ if (onChunk) {
273
+ parsed = await Promise.resolve(onChunk(parsed));
274
+ }
275
+
276
+ if (!mountedRef.current) {
277
+ reader.cancel();
278
+ return false;
279
+ }
280
+
281
+ onData(parsed);
282
+ } catch (err) {
283
+ if (!mountedRef.current) {
284
+ reader.cancel();
285
+ return false;
286
+ }
287
+
288
+ const error = err instanceof Error ? err : new Error(String(err));
289
+ onError(error);
290
+ return false;
291
+ }
292
+ }
293
+ }
294
+
295
+ if (buffer.trim()) {
296
+ try {
297
+ // Try JSON parsing first, fall back to plain string for text streams
298
+ let parsed: T;
299
+ try {
300
+ parsed = JSON.parse(buffer) as T;
301
+ } catch {
302
+ // Not valid JSON - treat as plain string
303
+ parsed = buffer as T;
304
+ }
305
+
306
+ if (onChunk) {
307
+ parsed = await Promise.resolve(onChunk(parsed));
308
+ }
309
+
310
+ if (mountedRef.current) {
311
+ onData(parsed);
312
+ }
313
+ } catch (err) {
314
+ if (!mountedRef.current) return false;
315
+
316
+ const error = err instanceof Error ? err : new Error(String(err));
317
+ onError(error);
318
+ return false;
319
+ }
320
+ }
321
+ } catch (err) {
322
+ if (!mountedRef.current) return false;
323
+
324
+ const error = err instanceof Error ? err : new Error(String(err));
325
+ onError(error);
326
+ return false;
327
+ }
328
+
329
+ return true;
330
+ }
331
+
190
332
  /**
191
333
  * Type-safe API client hook with TanStack Query-inspired features.
192
334
  *
@@ -274,6 +416,9 @@ export function useAPI<TRoute extends RouteKey>(
274
416
  onError,
275
417
  } = options;
276
418
 
419
+ const delimiter = 'delimiter' in options ? (options.delimiter ?? '\n') : '\n';
420
+ const onChunk = 'onChunk' in options ? options.onChunk : undefined;
421
+
277
422
  if (!context) {
278
423
  throw new Error('useAPI must be used within AgentuityProvider');
279
424
  }
@@ -310,6 +455,16 @@ export function useAPI<TRoute extends RouteKey>(
310
455
  };
311
456
  }, []);
312
457
 
458
+ // Use refs to store latest delimiter/onChunk values to avoid stale closures
459
+ // without causing infinite loops in useCallback dependencies
460
+ const delimiterRef = useRef(delimiter);
461
+ const onChunkRef = useRef(onChunk);
462
+
463
+ useEffect(() => {
464
+ delimiterRef.current = delimiter;
465
+ onChunkRef.current = onChunk;
466
+ });
467
+
313
468
  const fetchData = useCallback(async () => {
314
469
  if (!mountedRef.current) return;
315
470
 
@@ -360,7 +515,49 @@ export function useAPI<TRoute extends RouteKey>(
360
515
  responseData = undefined;
361
516
  } else {
362
517
  const contentType = response.headers.get('Content-Type') || '';
363
- if (contentType.includes('application/json')) {
518
+
519
+ if (
520
+ contentType.includes('text/event-stream') ||
521
+ contentType.includes('application/octet-stream')
522
+ ) {
523
+ if (!response.body) {
524
+ throw new Error('Response body is null for streaming response');
525
+ }
526
+
527
+ setData([] as unknown as RouteOutput<TRoute>);
528
+
529
+ // Track accumulated chunks locally to avoid stale closure
530
+ const accumulatedChunks: RouteChunkType<TRoute>[] = [];
531
+
532
+ const success = await processStream<RouteChunkType<TRoute>>(response.body, {
533
+ delimiter: delimiterRef.current,
534
+ onChunk: onChunkRef.current as any,
535
+ onData: (chunk) => {
536
+ if (!mountedRef.current) return;
537
+
538
+ accumulatedChunks.push(chunk);
539
+ setData([...accumulatedChunks] as unknown as RouteOutput<TRoute>);
540
+ },
541
+ onError: (err) => {
542
+ if (!mountedRef.current) return;
543
+ setError(err);
544
+ setIsError(true);
545
+ onError?.(err);
546
+ },
547
+ mountedRef,
548
+ });
549
+
550
+ if (!mountedRef.current) return;
551
+
552
+ if (success) {
553
+ setIsSuccess(true);
554
+ lastFetchTimeRef.current = Date.now();
555
+
556
+ const finalData = accumulatedChunks as unknown as RouteOutput<TRoute>;
557
+ onSuccess?.(finalData);
558
+ }
559
+ return;
560
+ } else if (contentType.includes('application/json')) {
364
561
  responseData = await response.json();
365
562
  } else {
366
563
  const text = await response.text();
@@ -481,7 +678,58 @@ export function useAPI<TRoute extends RouteKey>(
481
678
  responseData = undefined;
482
679
  } else {
483
680
  const contentType = response.headers.get('Content-Type') || '';
484
- if (contentType.includes('application/json')) {
681
+
682
+ if (
683
+ contentType.includes('text/event-stream') ||
684
+ contentType.includes('application/octet-stream')
685
+ ) {
686
+ if (!response.body) {
687
+ throw new Error('Response body is null for streaming response');
688
+ }
689
+
690
+ setData([] as unknown as RouteOutput<TRoute>);
691
+
692
+ // Track accumulated chunks locally to avoid stale closure
693
+ const accumulatedChunks: RouteChunkType<TRoute>[] = [];
694
+ let streamError: any = undefined;
695
+
696
+ const success = await processStream<RouteChunkType<TRoute>>(response.body, {
697
+ delimiter: delimiterRef.current,
698
+ onChunk: onChunkRef.current as any,
699
+ onData: (chunk) => {
700
+ if (!mountedRef.current) return;
701
+
702
+ accumulatedChunks.push(chunk);
703
+ setData([...accumulatedChunks] as unknown as RouteOutput<TRoute>);
704
+ },
705
+ onError: (err) => {
706
+ if (!mountedRef.current) return;
707
+ streamError = err;
708
+ setError(err);
709
+ setIsError(true);
710
+ onError?.(err);
711
+ },
712
+ mountedRef,
713
+ });
714
+
715
+ if (!mountedRef.current)
716
+ return accumulatedChunks as unknown as RouteOutput<TRoute>;
717
+
718
+ if (!success && streamError) {
719
+ throw streamError;
720
+ }
721
+
722
+ if (success) {
723
+ setIsSuccess(true);
724
+ lastFetchTimeRef.current = Date.now();
725
+
726
+ const finalData = accumulatedChunks as unknown as RouteOutput<TRoute>;
727
+ onSuccess?.(finalData);
728
+ return finalData;
729
+ }
730
+
731
+ return accumulatedChunks as unknown as RouteOutput<TRoute>;
732
+ } else if (contentType.includes('application/json')) {
485
733
  responseData = await response.json();
486
734
  } else {
487
735
  const text = await response.text();
package/src/types.ts CHANGED
@@ -5,7 +5,7 @@
5
5
  // eslint-disable-next-line @typescript-eslint/no-empty-object-type
6
6
  export interface RouteRegistry {
7
7
  // Will be augmented by generated code
8
- // Format: 'METHOD /path': { inputSchema: ..., outputSchema: ... }
8
+ // Format: 'METHOD /path': { inputSchema: ..., outputSchema: ..., stream?: boolean }
9
9
  }
10
10
 
11
11
  /**