@tanstack/ai-octane 0.5.4 → 0.6.3
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/package.json +5 -4
- package/src/index.ts +15 -2
- package/src/use-web-mcp-tools.tsrx +65 -11
- package/src/use-web-mcp-tools.tsrx.d.ts +44 -8
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/ai-octane",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.3",
|
|
4
4
|
"description": "Octane bindings for TanStack AI streaming chat, structured outputs, and media generation.",
|
|
5
5
|
"author": "Dominic Gannaway",
|
|
6
6
|
"license": "MIT",
|
|
@@ -48,11 +48,11 @@
|
|
|
48
48
|
],
|
|
49
49
|
"//lint": "The .tsrx.d.ts companions are generated declaration emits of the .tsrx implementations, so they are not hand-formatted and are excluded from lint rather than edited in place (a regeneration would undo any fix).",
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"@tanstack/ai-client": "0.
|
|
51
|
+
"@tanstack/ai-client": "0.36.0"
|
|
52
52
|
},
|
|
53
53
|
"peerDependencies": {
|
|
54
54
|
"octane": "^0.1.17",
|
|
55
|
-
"@tanstack/ai": "^0.
|
|
55
|
+
"@tanstack/ai": "^0.63.0"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
58
|
"@octanejs/testing-library": "0.1.14",
|
|
@@ -63,11 +63,12 @@
|
|
|
63
63
|
"octane": "0.1.17",
|
|
64
64
|
"vite": "^8.2.1",
|
|
65
65
|
"zod": "^4.2.0",
|
|
66
|
-
"@tanstack/ai": "0.
|
|
66
|
+
"@tanstack/ai": "0.63.0"
|
|
67
67
|
},
|
|
68
68
|
"scripts": {
|
|
69
69
|
"lint:fix": "oxlint src --type-aware --ignore-pattern '**/*.tsrx.d.ts' --fix",
|
|
70
70
|
"test:oxlint": "oxlint src --type-aware --ignore-pattern '**/*.tsrx.d.ts'",
|
|
71
|
+
"test:coverage": "vitest run --coverage --coverage.include='src/**' --coverage.reporter=text-summary --coverage.reporter=json-summary",
|
|
71
72
|
"test:lib": "vitest run",
|
|
72
73
|
"test:lib:dev": "pnpm test:lib --watch",
|
|
73
74
|
"test:types": "tsc && tsc -p typetests/tsconfig.json"
|
package/src/index.ts
CHANGED
|
@@ -3,8 +3,16 @@ export { createChatHook } from './create-chat-hook'
|
|
|
3
3
|
export { useRealtimeChat } from './use-realtime-chat.tsrx'
|
|
4
4
|
export { useMcpAppBridge } from './use-mcp-app-bridge.tsrx'
|
|
5
5
|
export type { UseMcpAppBridgeOptions } from './use-mcp-app-bridge.tsrx'
|
|
6
|
-
export {
|
|
7
|
-
|
|
6
|
+
export {
|
|
7
|
+
usePageWebMCPTools,
|
|
8
|
+
useRegisterWebMCPTools,
|
|
9
|
+
useWebMCPTools,
|
|
10
|
+
} from './use-web-mcp-tools.tsrx'
|
|
11
|
+
export type {
|
|
12
|
+
UsePageWebMCPToolsOptions,
|
|
13
|
+
UseRegisterWebMCPToolsOptions,
|
|
14
|
+
UseWebMCPToolsOptions,
|
|
15
|
+
} from './use-web-mcp-tools.tsrx'
|
|
8
16
|
export type {
|
|
9
17
|
DeepPartial,
|
|
10
18
|
UseChatOptions,
|
|
@@ -99,6 +107,11 @@ export {
|
|
|
99
107
|
PartialJSONParser,
|
|
100
108
|
defaultJSONParser,
|
|
101
109
|
registerWebMCPTools,
|
|
110
|
+
getWebMCPTools,
|
|
111
|
+
subscribeWebMCPTools,
|
|
112
|
+
type GetWebMCPToolsOptions,
|
|
113
|
+
type SubscribeWebMCPToolsOptions,
|
|
114
|
+
type WebMCPPageTool,
|
|
102
115
|
clientTools,
|
|
103
116
|
webSocket,
|
|
104
117
|
fetchServerSentEvents,
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import { useEffect } from 'octane'
|
|
2
|
-
import { registerWebMCPTools } from '@tanstack/ai-client'
|
|
1
|
+
import { useEffect, useRef, useState } from 'octane'
|
|
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 Octane {@link
|
|
10
|
-
export type
|
|
10
|
+
/** Options for the Octane {@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,12 +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
|
-
> =
|
|
22
|
-
|
|
23
|
-
|
|
28
|
+
> =
|
|
29
|
+
RegisterWebMCPToolsOptions<TTools, TContext> extends { context: unknown }
|
|
30
|
+
? [options: UseRegisterWebMCPToolsOptions<TTools, TContext>]
|
|
31
|
+
: [options?: UseRegisterWebMCPToolsOptions<TTools, TContext>]
|
|
24
32
|
|
|
25
33
|
/**
|
|
26
34
|
* Registers client tools with WebMCP for the lifetime of an Octane component.
|
|
@@ -33,17 +41,17 @@ type UseWebMCPToolsArguments<
|
|
|
33
41
|
*
|
|
34
42
|
* @example
|
|
35
43
|
* ```tsx
|
|
36
|
-
*
|
|
44
|
+
* useRegisterWebMCPTools([searchProducts], {
|
|
37
45
|
* toolOptions: { searchProducts: { title: 'Search products' } },
|
|
38
46
|
* })
|
|
39
47
|
* ```
|
|
40
48
|
*/
|
|
41
|
-
export function
|
|
49
|
+
export function useRegisterWebMCPTools<
|
|
42
50
|
const TTools extends ReadonlyArray<AnyClientTool>,
|
|
43
51
|
TContext = InferredClientContext<TTools>,
|
|
44
52
|
>(
|
|
45
53
|
tools: TTools,
|
|
46
|
-
...[options]:
|
|
54
|
+
...[options]: UseRegisterWebMCPToolsArguments<TTools, TContext>
|
|
47
55
|
) {
|
|
48
56
|
useEffect(() => {
|
|
49
57
|
const controller = new AbortController()
|
|
@@ -59,3 +67,49 @@ export function useWebMCPTools<
|
|
|
59
67
|
return () => controller.abort()
|
|
60
68
|
}, [tools, options])
|
|
61
69
|
}
|
|
70
|
+
|
|
71
|
+
/** @deprecated Use `useRegisterWebMCPTools`. Removed in 1.0.0. */
|
|
72
|
+
export const useWebMCPTools = useRegisterWebMCPTools
|
|
73
|
+
|
|
74
|
+
/** Options for {@link usePageWebMCPTools}. */
|
|
75
|
+
export type UsePageWebMCPToolsOptions = Omit<
|
|
76
|
+
SubscribeWebMCPToolsOptions,
|
|
77
|
+
'signal'
|
|
78
|
+
>
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Returns the WebMCP tools on the page as client tools for `useChat`.
|
|
82
|
+
*
|
|
83
|
+
* The list starts empty and updates when the page registers or removes a
|
|
84
|
+
* tool. The hook reads the latest `filter` and `onError` on each update.
|
|
85
|
+
* Unsupported browsers and server rendering return an empty array.
|
|
86
|
+
*
|
|
87
|
+
* @param options - A filter that skips tools, and an error callback.
|
|
88
|
+
*
|
|
89
|
+
* @example
|
|
90
|
+
* ```tsx
|
|
91
|
+
* const pageTools = usePageWebMCPTools({
|
|
92
|
+
* filter: (tool) => tool.origin === location.origin,
|
|
93
|
+
* })
|
|
94
|
+
* const chat = useChat({ connection, tools: pageTools })
|
|
95
|
+
* ```
|
|
96
|
+
*/
|
|
97
|
+
export function usePageWebMCPTools(
|
|
98
|
+
options?: UsePageWebMCPToolsOptions,
|
|
99
|
+
): Array<AnyClientTool> {
|
|
100
|
+
const [tools, setTools] = useState<Array<AnyClientTool>>([])
|
|
101
|
+
const optionsRef = useRef(options)
|
|
102
|
+
optionsRef.current = options
|
|
103
|
+
|
|
104
|
+
useEffect(() => {
|
|
105
|
+
const controller = new AbortController()
|
|
106
|
+
subscribeWebMCPTools(setTools, {
|
|
107
|
+
signal: controller.signal,
|
|
108
|
+
filter: (tool) => optionsRef.current?.filter?.(tool) ?? true,
|
|
109
|
+
onError: (error) => optionsRef.current?.onError?.(error),
|
|
110
|
+
})
|
|
111
|
+
return () => controller.abort()
|
|
112
|
+
}, [])
|
|
113
|
+
|
|
114
|
+
return tools
|
|
115
|
+
}
|
|
@@ -3,23 +3,29 @@ import type {
|
|
|
3
3
|
AnyClientTool,
|
|
4
4
|
InferredClientContext,
|
|
5
5
|
RegisterWebMCPToolsOptions,
|
|
6
|
+
SubscribeWebMCPToolsOptions,
|
|
6
7
|
} from '@tanstack/ai-client'
|
|
7
8
|
|
|
8
|
-
/** Options for the Octane {@link
|
|
9
|
-
export type
|
|
9
|
+
/** Options for the Octane {@link useRegisterWebMCPTools} lifecycle hook. */
|
|
10
|
+
export type UseRegisterWebMCPToolsOptions<
|
|
10
11
|
TTools extends ReadonlyArray<AnyClientTool>,
|
|
11
12
|
TContext = InferredClientContext<TTools>,
|
|
12
13
|
> = Omit<RegisterWebMCPToolsOptions<TTools, TContext>, 'signal'> & {
|
|
13
14
|
/** Receives an asynchronous registration failure. */
|
|
14
15
|
onError?: (error: unknown) => void
|
|
15
16
|
}
|
|
16
|
-
|
|
17
|
+
/** @deprecated Use `UseRegisterWebMCPToolsOptions`. Removed in 1.0.0. */
|
|
18
|
+
export type UseWebMCPToolsOptions<
|
|
19
|
+
TTools extends ReadonlyArray<AnyClientTool>,
|
|
20
|
+
TContext = InferredClientContext<TTools>,
|
|
21
|
+
> = UseRegisterWebMCPToolsOptions<TTools, TContext>
|
|
22
|
+
type UseRegisterWebMCPToolsArguments<
|
|
17
23
|
TTools extends ReadonlyArray<AnyClientTool>,
|
|
18
24
|
TContext,
|
|
19
25
|
> =
|
|
20
26
|
RegisterWebMCPToolsOptions<TTools, TContext> extends { context: unknown }
|
|
21
|
-
? [options:
|
|
22
|
-
: [options?:
|
|
27
|
+
? [options: UseRegisterWebMCPToolsOptions<TTools, TContext>]
|
|
28
|
+
: [options?: UseRegisterWebMCPToolsOptions<TTools, TContext>]
|
|
23
29
|
/**
|
|
24
30
|
* Registers client tools with WebMCP for the lifetime of an Octane component.
|
|
25
31
|
*
|
|
@@ -31,12 +37,42 @@ type UseWebMCPToolsArguments<
|
|
|
31
37
|
*
|
|
32
38
|
* @example
|
|
33
39
|
* ```tsx
|
|
34
|
-
*
|
|
40
|
+
* useRegisterWebMCPTools([searchProducts], {
|
|
35
41
|
* toolOptions: { searchProducts: { title: 'Search products' } },
|
|
36
42
|
* })
|
|
37
43
|
* ```
|
|
38
44
|
*/
|
|
39
|
-
export declare function
|
|
45
|
+
export declare function useRegisterWebMCPTools<
|
|
40
46
|
const TTools extends ReadonlyArray<AnyClientTool>,
|
|
41
47
|
TContext = InferredClientContext<TTools>,
|
|
42
|
-
>(
|
|
48
|
+
>(
|
|
49
|
+
tools: TTools,
|
|
50
|
+
...[options]: UseRegisterWebMCPToolsArguments<TTools, TContext>
|
|
51
|
+
): void
|
|
52
|
+
/** @deprecated Use `useRegisterWebMCPTools`. Removed in 1.0.0. */
|
|
53
|
+
export declare const useWebMCPTools: typeof useRegisterWebMCPTools
|
|
54
|
+
/** Options for {@link usePageWebMCPTools}. */
|
|
55
|
+
export type UsePageWebMCPToolsOptions = Omit<
|
|
56
|
+
SubscribeWebMCPToolsOptions,
|
|
57
|
+
'signal'
|
|
58
|
+
>
|
|
59
|
+
/**
|
|
60
|
+
* Returns the WebMCP tools on the page as client tools for `useChat`.
|
|
61
|
+
*
|
|
62
|
+
* The list starts empty and updates when the page registers or removes a
|
|
63
|
+
* tool. The hook reads the latest `filter` and `onError` on each update.
|
|
64
|
+
* Unsupported browsers and server rendering return an empty array.
|
|
65
|
+
*
|
|
66
|
+
* @param options - A filter that skips tools, and an error callback.
|
|
67
|
+
*
|
|
68
|
+
* @example
|
|
69
|
+
* ```tsx
|
|
70
|
+
* const pageTools = usePageWebMCPTools({
|
|
71
|
+
* filter: (tool) => tool.origin === location.origin,
|
|
72
|
+
* })
|
|
73
|
+
* const chat = useChat({ connection, tools: pageTools })
|
|
74
|
+
* ```
|
|
75
|
+
*/
|
|
76
|
+
export declare function usePageWebMCPTools(
|
|
77
|
+
options?: UsePageWebMCPToolsOptions,
|
|
78
|
+
): Array<AnyClientTool>
|