@tanstack/ai-react 0.27.3 → 0.29.1
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/esm/chat-ui/create-ui.d.ts +37 -4
- package/dist/esm/chat-ui/create-ui.js +94 -4
- package/dist/esm/chat-ui/create-ui.js.map +1 -1
- package/dist/esm/create-chat-hook.d.ts +8 -4
- package/dist/esm/create-chat-hook.js.map +1 -1
- package/dist/esm/index.d.ts +3 -3
- package/dist/esm/index.js +3 -3
- package/dist/esm/types.d.ts +19 -5
- package/dist/esm/ui.d.ts +1 -1
- package/dist/esm/use-chat.d.ts +3 -1
- package/dist/esm/use-chat.js +1 -0
- package/dist/esm/use-chat.js.map +1 -1
- package/dist/esm/use-web-mcp-tools.d.ts +34 -7
- package/dist/esm/use-web-mcp-tools.js +42 -5
- package/dist/esm/use-web-mcp-tools.js.map +1 -1
- package/package.json +4 -4
- package/src/chat-ui/create-ui.tsx +250 -8
- package/src/create-chat-hook.ts +13 -3
- package/src/index.ts +15 -2
- package/src/types.ts +24 -2
- package/src/ui.ts +2 -0
- package/src/use-chat.ts +11 -4
- package/src/use-web-mcp-tools.ts +69 -10
package/src/use-web-mcp-tools.ts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import { useEffect } from 'react'
|
|
2
|
-
import { registerWebMCPTools } from '@tanstack/ai-client'
|
|
1
|
+
import { useEffect, useRef, useState } from 'react'
|
|
2
|
+
import { registerWebMCPTools, subscribeWebMCPTools } from '@tanstack/ai-client'
|
|
3
3
|
import type {
|
|
4
4
|
AnyClientTool,
|
|
5
5
|
InferredClientContext,
|
|
6
6
|
RegisterWebMCPToolsOptions,
|
|
7
|
+
SubscribeWebMCPToolsOptions,
|
|
7
8
|
} from '@tanstack/ai-client'
|
|
8
9
|
|
|
9
|
-
/** Options for the React {@link
|
|
10
|
-
export type
|
|
10
|
+
/** Options for the React {@link useRegisterWebMCPTools} lifecycle hook. */
|
|
11
|
+
export type UseRegisterWebMCPToolsOptions<
|
|
11
12
|
TTools extends ReadonlyArray<AnyClientTool>,
|
|
12
13
|
TContext = InferredClientContext<TTools>,
|
|
13
14
|
> = Omit<RegisterWebMCPToolsOptions<TTools, TContext>, 'signal'> & {
|
|
@@ -15,13 +16,19 @@ export type UseWebMCPToolsOptions<
|
|
|
15
16
|
onError?: (error: unknown) => void
|
|
16
17
|
}
|
|
17
18
|
|
|
18
|
-
|
|
19
|
+
/** @deprecated Use `UseRegisterWebMCPToolsOptions`. Removed in 1.0.0. */
|
|
20
|
+
export type UseWebMCPToolsOptions<
|
|
21
|
+
TTools extends ReadonlyArray<AnyClientTool>,
|
|
22
|
+
TContext = InferredClientContext<TTools>,
|
|
23
|
+
> = UseRegisterWebMCPToolsOptions<TTools, TContext>
|
|
24
|
+
|
|
25
|
+
type UseRegisterWebMCPToolsArguments<
|
|
19
26
|
TTools extends ReadonlyArray<AnyClientTool>,
|
|
20
27
|
TContext,
|
|
21
28
|
> =
|
|
22
29
|
RegisterWebMCPToolsOptions<TTools, TContext> extends { context: unknown }
|
|
23
|
-
? [options:
|
|
24
|
-
: [options?:
|
|
30
|
+
? [options: UseRegisterWebMCPToolsOptions<TTools, TContext>]
|
|
31
|
+
: [options?: UseRegisterWebMCPToolsOptions<TTools, TContext>]
|
|
25
32
|
|
|
26
33
|
/**
|
|
27
34
|
* Registers client tools with WebMCP for the lifetime of a React component.
|
|
@@ -34,15 +41,18 @@ type UseWebMCPToolsArguments<
|
|
|
34
41
|
*
|
|
35
42
|
* @example
|
|
36
43
|
* ```tsx
|
|
37
|
-
*
|
|
44
|
+
* useRegisterWebMCPTools([searchProducts], {
|
|
38
45
|
* toolOptions: { searchProducts: { title: 'Search products' } },
|
|
39
46
|
* })
|
|
40
47
|
* ```
|
|
41
48
|
*/
|
|
42
|
-
export function
|
|
49
|
+
export function useRegisterWebMCPTools<
|
|
43
50
|
const TTools extends ReadonlyArray<AnyClientTool>,
|
|
44
51
|
TContext = InferredClientContext<TTools>,
|
|
45
|
-
>(
|
|
52
|
+
>(
|
|
53
|
+
tools: TTools,
|
|
54
|
+
...[options]: UseRegisterWebMCPToolsArguments<TTools, TContext>
|
|
55
|
+
) {
|
|
46
56
|
useEffect(() => {
|
|
47
57
|
const controller = new AbortController()
|
|
48
58
|
const { onError, ...registrationOptions } = options ?? {}
|
|
@@ -57,3 +67,52 @@ export function useWebMCPTools<
|
|
|
57
67
|
return () => controller.abort()
|
|
58
68
|
}, [tools, options])
|
|
59
69
|
}
|
|
70
|
+
|
|
71
|
+
/**
|
|
72
|
+
* @deprecated Use `useRegisterWebMCPTools`. Removed in 1.0.0.
|
|
73
|
+
* @alias
|
|
74
|
+
*/
|
|
75
|
+
export const useWebMCPTools = useRegisterWebMCPTools
|
|
76
|
+
|
|
77
|
+
/** Options for {@link usePageWebMCPTools}. */
|
|
78
|
+
export type UsePageWebMCPToolsOptions = Omit<
|
|
79
|
+
SubscribeWebMCPToolsOptions,
|
|
80
|
+
'signal'
|
|
81
|
+
>
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Returns the WebMCP tools on the page as client tools for `useChat`.
|
|
85
|
+
*
|
|
86
|
+
* The list starts empty and updates when the page registers or removes a
|
|
87
|
+
* tool. The hook reads the latest `filter` and `onError` on each update.
|
|
88
|
+
* Unsupported browsers and server rendering return an empty array.
|
|
89
|
+
*
|
|
90
|
+
* @param options - A filter that skips tools, and an error callback.
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* ```tsx
|
|
94
|
+
* const pageTools = usePageWebMCPTools({
|
|
95
|
+
* filter: (tool) => tool.origin === location.origin,
|
|
96
|
+
* })
|
|
97
|
+
* const chat = useChat({ connection, tools: pageTools })
|
|
98
|
+
* ```
|
|
99
|
+
*/
|
|
100
|
+
export function usePageWebMCPTools(
|
|
101
|
+
options?: UsePageWebMCPToolsOptions,
|
|
102
|
+
): Array<AnyClientTool> {
|
|
103
|
+
const [tools, setTools] = useState<Array<AnyClientTool>>([])
|
|
104
|
+
const optionsRef = useRef(options)
|
|
105
|
+
optionsRef.current = options
|
|
106
|
+
|
|
107
|
+
useEffect(() => {
|
|
108
|
+
const controller = new AbortController()
|
|
109
|
+
subscribeWebMCPTools(setTools, {
|
|
110
|
+
signal: controller.signal,
|
|
111
|
+
filter: (tool) => optionsRef.current?.filter?.(tool) ?? true,
|
|
112
|
+
onError: (error) => optionsRef.current?.onError?.(error),
|
|
113
|
+
})
|
|
114
|
+
return () => controller.abort()
|
|
115
|
+
}, [])
|
|
116
|
+
|
|
117
|
+
return tools
|
|
118
|
+
}
|