@assistant-ui/react 0.15.17 → 0.15.18
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/README.md +1 -1
- package/dist/index.d.ts +6 -3
- package/dist/index.js +4 -2
- package/dist/mcp-apps/McpAppRenderer.d.ts +30 -8
- package/dist/mcp-apps/McpAppRenderer.d.ts.map +1 -1
- package/dist/mcp-apps/McpAppRenderer.js +91 -47
- package/dist/mcp-apps/McpAppRenderer.js.map +1 -1
- package/dist/mcp-apps/app-frame.d.ts.map +1 -1
- package/dist/mcp-apps/app-frame.js +41 -22
- package/dist/mcp-apps/app-frame.js.map +1 -1
- package/dist/mcp-apps/bridge.js +2 -3
- package/dist/mcp-apps/bridge.js.map +1 -1
- package/dist/mcp-apps/index.d.ts +2 -2
- package/dist/primitives/composer/ComposerInputPluginContext.d.ts +1 -2
- package/dist/primitives/composer/ComposerInputPluginContext.d.ts.map +1 -1
- package/dist/primitives/composer/ComposerInputPluginContext.js +1 -6
- package/dist/primitives/composer/ComposerInputPluginContext.js.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverAction.js +46 -15
- package/dist/primitives/composer/trigger/TriggerPopoverAction.js.map +1 -1
- package/dist/primitives/composer/trigger/TriggerPopoverDirective.js +40 -10
- package/dist/primitives/composer/trigger/TriggerPopoverDirective.js.map +1 -1
- package/dist/primitives/composer/trigger/matchesTriggerItemQuery.d.ts +6 -0
- package/dist/primitives/composer/trigger/matchesTriggerItemQuery.d.ts.map +1 -0
- package/dist/primitives/composer/trigger/matchesTriggerItemQuery.js +9 -0
- package/dist/primitives/composer/trigger/matchesTriggerItemQuery.js.map +1 -0
- package/dist/primitives/composer/trigger/triggerNavigationResource.d.ts.map +1 -1
- package/dist/primitives/composer/trigger/triggerNavigationResource.js +3 -5
- package/dist/primitives/composer/trigger/triggerNavigationResource.js.map +1 -1
- package/dist/primitives/messagePart/MessagePartText.d.ts +1 -1
- package/dist/primitives/thread/useThreadViewportAutoScroll.d.ts.map +1 -1
- package/dist/primitives/thread/useThreadViewportAutoScroll.js +3 -3
- package/dist/primitives/thread/useThreadViewportAutoScroll.js.map +1 -1
- package/dist/sandbox-host/SandboxHost.d.ts.map +1 -1
- package/dist/sandbox-host/SandboxHost.js +14 -5
- package/dist/sandbox-host/SandboxHost.js.map +1 -1
- package/dist/unstable/useMentionAdapter.d.ts +9 -3
- package/dist/unstable/useMentionAdapter.d.ts.map +1 -1
- package/dist/unstable/useMentionAdapter.js +50 -43
- package/dist/unstable/useMentionAdapter.js.map +1 -1
- package/dist/unstable/useModelContextSnapshot.d.ts +34 -0
- package/dist/unstable/useModelContextSnapshot.d.ts.map +1 -0
- package/dist/unstable/useModelContextSnapshot.js +61 -0
- package/dist/unstable/useModelContextSnapshot.js.map +1 -0
- package/dist/unstable/useSlashCommandAdapter.d.ts.map +1 -1
- package/dist/unstable/useSlashCommandAdapter.js +2 -8
- package/dist/unstable/useSlashCommandAdapter.js.map +1 -1
- package/dist/unstable/webmcp/WebMcpRegistrationResource.d.ts +14 -0
- package/dist/unstable/webmcp/WebMcpRegistrationResource.d.ts.map +1 -0
- package/dist/unstable/webmcp/WebMcpRegistrationResource.js +85 -0
- package/dist/unstable/webmcp/WebMcpRegistrationResource.js.map +1 -0
- package/dist/unstable/webmcp/convertTools.d.ts +21 -0
- package/dist/unstable/webmcp/convertTools.d.ts.map +1 -0
- package/dist/unstable/webmcp/convertTools.js +110 -0
- package/dist/unstable/webmcp/convertTools.js.map +1 -0
- package/dist/unstable/webmcp/useWebMcpProvider.d.ts +21 -0
- package/dist/unstable/webmcp/useWebMcpProvider.d.ts.map +1 -0
- package/dist/unstable/webmcp/useWebMcpProvider.js +105 -0
- package/dist/unstable/webmcp/useWebMcpProvider.js.map +1 -0
- package/dist/unstable/webmcp/webmcp-host.d.ts +39 -0
- package/dist/unstable/webmcp/webmcp-host.d.ts.map +1 -0
- package/dist/unstable/webmcp/webmcp-host.js +29 -0
- package/dist/unstable/webmcp/webmcp-host.js.map +1 -0
- package/dist/utils/Primitive.d.ts +4 -4
- package/package.json +12 -12
- package/src/index.ts +13 -0
- package/src/mcp-apps/McpAppRenderer.test.tsx +253 -5
- package/src/mcp-apps/McpAppRenderer.tsx +147 -52
- package/src/mcp-apps/app-frame.test.tsx +248 -1
- package/src/mcp-apps/app-frame.tsx +51 -5
- package/src/mcp-apps/bridge.ts +7 -2
- package/src/mcp-apps/index.ts +5 -1
- package/src/primitives/composer/ComposerInputPluginContext.tsx +0 -10
- package/src/primitives/composer/trigger/TriggerPopoverAction.tsx +4 -2
- package/src/primitives/composer/trigger/TriggerPopoverBehavior.test.tsx +109 -0
- package/src/primitives/composer/trigger/TriggerPopoverDirective.tsx +4 -2
- package/src/primitives/composer/trigger/matchesTriggerItemQuery.test.ts +52 -0
- package/src/primitives/composer/trigger/matchesTriggerItemQuery.ts +13 -0
- package/src/primitives/composer/trigger/triggerNavigationResource.ts +3 -10
- package/src/primitives/thread/useThreadViewportAutoScroll.ts +7 -6
- package/src/sandbox-host/SandboxHost.test.tsx +120 -2
- package/src/sandbox-host/SandboxHost.tsx +26 -6
- package/src/unstable/useComposerInputHistory.test.tsx +2 -1
- package/src/unstable/useMentionAdapter.test.tsx +337 -0
- package/src/unstable/useMentionAdapter.ts +94 -57
- package/src/unstable/useModelContextSnapshot.test.tsx +132 -0
- package/src/unstable/useModelContextSnapshot.ts +67 -0
- package/src/unstable/useSlashCommandAdapter.ts +2 -9
- package/src/unstable/webmcp/WebMcpRegistrationResource.ts +92 -0
- package/src/unstable/webmcp/__tests__/webmcp.fake.tsx +168 -0
- package/src/unstable/webmcp/convertTools.test.ts +393 -0
- package/src/unstable/webmcp/convertTools.ts +180 -0
- package/src/unstable/webmcp/useWebMcpProvider.test.tsx +466 -0
- package/src/unstable/webmcp/useWebMcpProvider.ts +150 -0
- package/src/unstable/webmcp/webmcp-host.test.ts +142 -0
- package/src/unstable/webmcp/webmcp-host.ts +83 -0
- package/dist/utils/invokeCallbackSafely.d.ts +0 -5
- package/dist/utils/invokeCallbackSafely.d.ts.map +0 -1
- package/dist/utils/invokeCallbackSafely.js +0 -15
- package/dist/utils/invokeCallbackSafely.js.map +0 -1
- package/dist/utils/useToolArgsFieldStatus.d.ts +0 -19
- package/dist/utils/useToolArgsFieldStatus.d.ts.map +0 -1
- package/dist/utils/useToolArgsFieldStatus.js +0 -23
- package/dist/utils/useToolArgsFieldStatus.js.map +0 -1
- package/src/utils/invokeCallbackSafely.ts +0 -11
- package/src/utils/useToolArgsFieldStatus.ts +0 -18
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
// @vitest-environment jsdom
|
|
2
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
3
|
+
import {
|
|
4
|
+
getDefaultWebMcpHost,
|
|
5
|
+
type WebMcpModelContext,
|
|
6
|
+
type WebMcpToolDescriptor,
|
|
7
|
+
} from "./webmcp-host";
|
|
8
|
+
|
|
9
|
+
type Host = { modelContext?: WebMcpModelContext };
|
|
10
|
+
|
|
11
|
+
const descriptor: WebMcpToolDescriptor = {
|
|
12
|
+
name: "get_weather",
|
|
13
|
+
description: "",
|
|
14
|
+
inputSchema: {},
|
|
15
|
+
execute: async () => ({ content: [] }),
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
const install = (
|
|
19
|
+
context: Partial<WebMcpModelContext>,
|
|
20
|
+
on: "document" | "navigator" = "document",
|
|
21
|
+
) => {
|
|
22
|
+
const host = (on === "document" ? document : navigator) as Host;
|
|
23
|
+
host.modelContext = context as WebMcpModelContext;
|
|
24
|
+
return context;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
afterEach(() => {
|
|
28
|
+
delete (document as Host).modelContext;
|
|
29
|
+
delete (navigator as Host).modelContext;
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
describe("getDefaultWebMcpHost", () => {
|
|
33
|
+
it("reports unavailable when the page exposes no model context", () => {
|
|
34
|
+
const host = getDefaultWebMcpHost();
|
|
35
|
+
expect(host.available).toBe(false);
|
|
36
|
+
expect(() => host.registerTool(descriptor)()).not.toThrow();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it("reports unavailable and warns when the platform property has no registerTool", () => {
|
|
40
|
+
const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
|
|
41
|
+
try {
|
|
42
|
+
install({} as Partial<WebMcpModelContext>);
|
|
43
|
+
const host = getDefaultWebMcpHost();
|
|
44
|
+
expect(host.available).toBe(false);
|
|
45
|
+
expect(() => host.registerTool(descriptor)()).not.toThrow();
|
|
46
|
+
expect(warn).toHaveBeenCalledWith(
|
|
47
|
+
expect.stringContaining("no callable registerTool"),
|
|
48
|
+
);
|
|
49
|
+
} finally {
|
|
50
|
+
warn.mockRestore();
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("falls back to navigator.modelContext, preferring document when both exist", () => {
|
|
55
|
+
const fromNavigator = vi.fn();
|
|
56
|
+
install({ registerTool: fromNavigator }, "navigator");
|
|
57
|
+
expect(getDefaultWebMcpHost().available).toBe(true);
|
|
58
|
+
getDefaultWebMcpHost().registerTool(descriptor);
|
|
59
|
+
expect(fromNavigator).toHaveBeenCalledOnce();
|
|
60
|
+
|
|
61
|
+
const fromDocument = vi.fn();
|
|
62
|
+
install({ registerTool: fromDocument });
|
|
63
|
+
getDefaultWebMcpHost().registerTool(descriptor);
|
|
64
|
+
expect(fromDocument).toHaveBeenCalledOnce();
|
|
65
|
+
expect(fromNavigator).toHaveBeenCalledOnce();
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it("registers with an abort signal and aborts it on dispose", () => {
|
|
69
|
+
const registerTool = vi.fn();
|
|
70
|
+
install({ registerTool });
|
|
71
|
+
|
|
72
|
+
const dispose = getDefaultWebMcpHost().registerTool(descriptor);
|
|
73
|
+
const options = registerTool.mock.calls[0]![1];
|
|
74
|
+
expect(registerTool).toHaveBeenCalledWith(descriptor, expect.anything());
|
|
75
|
+
expect(options.signal.aborted).toBe(false);
|
|
76
|
+
|
|
77
|
+
dispose();
|
|
78
|
+
expect(options.signal.aborted).toBe(true);
|
|
79
|
+
expect(() => dispose()).not.toThrow();
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it("reports a rejected registration to the caller", async () => {
|
|
83
|
+
install({
|
|
84
|
+
registerTool: () => Promise.reject(new Error("already registered")),
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
const onError = vi.fn();
|
|
88
|
+
getDefaultWebMcpHost().registerTool(descriptor, onError);
|
|
89
|
+
await vi.waitFor(() => expect(onError).toHaveBeenCalledOnce());
|
|
90
|
+
expect(onError.mock.calls[0]![0]).toBeInstanceOf(Error);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it("aborts the signal even when the registration was rejected", async () => {
|
|
94
|
+
let options: { signal?: AbortSignal } | undefined;
|
|
95
|
+
install({
|
|
96
|
+
registerTool: (_def, registerOptions) => {
|
|
97
|
+
options = registerOptions;
|
|
98
|
+
return Promise.reject(new Error("already registered"));
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
const onError = vi.fn();
|
|
103
|
+
const dispose = getDefaultWebMcpHost().registerTool(descriptor, onError);
|
|
104
|
+
await vi.waitFor(() => expect(onError).toHaveBeenCalledOnce());
|
|
105
|
+
|
|
106
|
+
dispose();
|
|
107
|
+
expect(options?.signal?.aborted).toBe(true);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
it("lets a synchronous registration failure propagate", () => {
|
|
111
|
+
install({
|
|
112
|
+
registerTool: () => {
|
|
113
|
+
throw new Error("already registered");
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
expect(() => getDefaultWebMcpHost().registerTool(descriptor)).toThrow(
|
|
118
|
+
"already registered",
|
|
119
|
+
);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it("survives a registration that returns a bare thenable", () => {
|
|
123
|
+
install({
|
|
124
|
+
registerTool: () =>
|
|
125
|
+
({
|
|
126
|
+
then: (resolve: () => void) => resolve(),
|
|
127
|
+
}) as unknown as Promise<void>,
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
const dispose = getDefaultWebMcpHost().registerTool(descriptor);
|
|
131
|
+
expect(() => dispose()).not.toThrow();
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
it("survives a registration that returns nothing", () => {
|
|
135
|
+
const registerTool = vi.fn();
|
|
136
|
+
install({ registerTool });
|
|
137
|
+
|
|
138
|
+
const dispose = getDefaultWebMcpHost().registerTool(descriptor);
|
|
139
|
+
dispose();
|
|
140
|
+
expect(registerTool.mock.calls[0]![1].signal.aborted).toBe(true);
|
|
141
|
+
});
|
|
142
|
+
});
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
export type WebMcpContent =
|
|
2
|
+
| { type: "text"; text: string }
|
|
3
|
+
| { type: "image"; data: string; mimeType: string };
|
|
4
|
+
|
|
5
|
+
export type WebMcpCallToolResult = {
|
|
6
|
+
content: WebMcpContent[];
|
|
7
|
+
isError?: boolean;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export type WebMcpToolDescriptor = {
|
|
11
|
+
name: string;
|
|
12
|
+
description: string;
|
|
13
|
+
inputSchema: unknown;
|
|
14
|
+
execute: (
|
|
15
|
+
args: unknown,
|
|
16
|
+
context?: { signal?: AbortSignal },
|
|
17
|
+
) => Promise<WebMcpCallToolResult>;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export type WebMcpModelContext = {
|
|
21
|
+
/**
|
|
22
|
+
* Aborting `options.signal` is what unregisters the tool. The explainer
|
|
23
|
+
* defines no other removal method, and a name-keyed one could not be used
|
|
24
|
+
* safely: a later registration may already hold the name.
|
|
25
|
+
*/
|
|
26
|
+
registerTool(
|
|
27
|
+
tool: WebMcpToolDescriptor,
|
|
28
|
+
options?: { signal?: AbortSignal },
|
|
29
|
+
): Promise<void> | void;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export type WebMcpHost = {
|
|
33
|
+
available: boolean;
|
|
34
|
+
registerTool(
|
|
35
|
+
def: WebMcpToolDescriptor,
|
|
36
|
+
onError?: (error: unknown) => void,
|
|
37
|
+
): () => void;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
type ModelContextHost = { modelContext?: WebMcpModelContext } | undefined;
|
|
41
|
+
|
|
42
|
+
const isThenable = (value: unknown): value is Promise<unknown> =>
|
|
43
|
+
typeof (value as { then?: unknown } | null | undefined)?.then === "function";
|
|
44
|
+
|
|
45
|
+
// The explainer puts modelContext on document; navigator is tolerated for
|
|
46
|
+
// older drafts and extensions that still inject it there.
|
|
47
|
+
const resolveModelContext = (): WebMcpModelContext | undefined => {
|
|
48
|
+
const context =
|
|
49
|
+
(globalThis.document as ModelContextHost)?.modelContext ??
|
|
50
|
+
(globalThis.navigator as ModelContextHost)?.modelContext;
|
|
51
|
+
if (!context) return undefined;
|
|
52
|
+
if (typeof context.registerTool === "function") return context;
|
|
53
|
+
console.warn(
|
|
54
|
+
"[assistant-ui] Ignoring a modelContext with no callable registerTool; WebMCP reports unsupported.",
|
|
55
|
+
);
|
|
56
|
+
return undefined;
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const createHost = (context: WebMcpModelContext): WebMcpHost => ({
|
|
60
|
+
available: true,
|
|
61
|
+
registerTool: (def, onError) => {
|
|
62
|
+
const controller = new AbortController();
|
|
63
|
+
const handle = context.registerTool(def, { signal: controller.signal });
|
|
64
|
+
if (isThenable(handle)) {
|
|
65
|
+
handle.then(
|
|
66
|
+
() => {},
|
|
67
|
+
(error) => onError?.(error),
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
return () => controller.abort();
|
|
71
|
+
},
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
export const getDefaultWebMcpHost = (): WebMcpHost => {
|
|
75
|
+
const context = resolveModelContext();
|
|
76
|
+
if (!context) {
|
|
77
|
+
return {
|
|
78
|
+
available: false,
|
|
79
|
+
registerTool: () => () => {},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return createHost(context);
|
|
83
|
+
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"invokeCallbackSafely.d.ts","names":[],"sources":["../../src/utils/invokeCallbackSafely.ts"],"mappings":";cAAa,uBAAwB,uBAAuB"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
//#region src/utils/invokeCallbackSafely.ts
|
|
2
|
-
const invokeCallbackSafely = (invoke, name) => {
|
|
3
|
-
const reportFailure = (error) => {
|
|
4
|
-
console.error(`[assistant-ui] ${name} callback threw an error`, error);
|
|
5
|
-
};
|
|
6
|
-
try {
|
|
7
|
-
Promise.resolve(invoke()).catch(reportFailure);
|
|
8
|
-
} catch (error) {
|
|
9
|
-
reportFailure(error);
|
|
10
|
-
}
|
|
11
|
-
};
|
|
12
|
-
//#endregion
|
|
13
|
-
export { invokeCallbackSafely };
|
|
14
|
-
|
|
15
|
-
//# sourceMappingURL=invokeCallbackSafely.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"invokeCallbackSafely.js","names":["invokeCallbackSafely","invoke","name","reportFailure","error","console","Promise","resolve","catch"],"sources":["../../src/utils/invokeCallbackSafely.ts"],"sourcesContent":["export const invokeCallbackSafely = (invoke: () => unknown, name: string) => {\n const reportFailure = (error: unknown) => {\n console.error(`[assistant-ui] ${name} callback threw an error`, error);\n };\n\n try {\n void Promise.resolve(invoke()).catch(reportFailure);\n } catch (error) {\n reportFailure(error);\n }\n};\n"],"mappings":";AAAA,MAAaA,wBAAwBC,QAAuBC,SAAiB;CAC3E,MAAMC,iBAAiBC,UAAmB;EACxCC,QAAQD,MAAM,kBAAkBF,KAAI,2BAA4BE,KAAK;CACvE;CAEA,IAAI;EACF,QAAaG,QAAQN,OAAO,CAAC,CAAC,CAACO,MAAML,aAAa;CACpD,SAASC,OAAO;EACdD,cAAcC,KAAK;CACrB;AACF"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
//#region src/utils/useToolArgsFieldStatus.d.ts
|
|
2
|
-
declare const useToolArgsFieldStatus: (fieldPath: (string | number)[]) => {
|
|
3
|
-
type: string;
|
|
4
|
-
} | {
|
|
5
|
-
readonly type: "running";
|
|
6
|
-
} | {
|
|
7
|
-
readonly type: "complete";
|
|
8
|
-
} | {
|
|
9
|
-
readonly type: "incomplete";
|
|
10
|
-
readonly reason: "cancelled" | "length" | "content-filter" | "other" | "error";
|
|
11
|
-
readonly error?: unknown;
|
|
12
|
-
} | {
|
|
13
|
-
readonly type: "incomplete";
|
|
14
|
-
readonly reason: "tool-calls";
|
|
15
|
-
readonly error?: import("assistant-stream/utils").ReadonlyJSONValue;
|
|
16
|
-
};
|
|
17
|
-
//#endregion
|
|
18
|
-
export { useToolArgsFieldStatus };
|
|
19
|
-
//# sourceMappingURL=useToolArgsFieldStatus.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useToolArgsFieldStatus.d.ts","names":[],"sources":["../../src/utils/useToolArgsFieldStatus.ts"],"mappings":";cAKa,yBAA0B"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { c } from "@assistant-ui/tap/react-shim/compiler-runtime";
|
|
2
|
-
import { useAuiState } from "@assistant-ui/store";
|
|
3
|
-
import { getPartialJsonObjectFieldState } from "assistant-stream/utils";
|
|
4
|
-
//#region src/utils/useToolArgsFieldStatus.ts
|
|
5
|
-
const COMPLETE_STATUS = { type: "complete" };
|
|
6
|
-
const useToolArgsFieldStatus = (fieldPath) => {
|
|
7
|
-
const $ = c(2);
|
|
8
|
-
let t0;
|
|
9
|
-
if ($[0] !== fieldPath) {
|
|
10
|
-
t0 = (s) => {
|
|
11
|
-
if (s.part.type !== "tool-call") throw new Error("useToolArgsFieldStatus can only be used inside tool-call message parts");
|
|
12
|
-
if (getPartialJsonObjectFieldState(s.part.args, fieldPath) === "complete" || s.part.status?.type === "requires-action") return COMPLETE_STATUS;
|
|
13
|
-
return s.part.status;
|
|
14
|
-
};
|
|
15
|
-
$[0] = fieldPath;
|
|
16
|
-
$[1] = t0;
|
|
17
|
-
} else t0 = $[1];
|
|
18
|
-
return useAuiState(t0);
|
|
19
|
-
};
|
|
20
|
-
//#endregion
|
|
21
|
-
export { useToolArgsFieldStatus };
|
|
22
|
-
|
|
23
|
-
//# sourceMappingURL=useToolArgsFieldStatus.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useToolArgsFieldStatus.js","names":["getPartialJsonObjectFieldState","useAuiState","COMPLETE_STATUS","type","useToolArgsFieldStatus","fieldPath","$","_c","t0","s","part","Error","state","args","status"],"sources":["../../src/utils/useToolArgsFieldStatus.ts"],"sourcesContent":["import { getPartialJsonObjectFieldState } from \"assistant-stream/utils\";\nimport { useAuiState } from \"@assistant-ui/store\";\n\nconst COMPLETE_STATUS = { type: \"complete\" };\n\nexport const useToolArgsFieldStatus = (fieldPath: (string | number)[]) => {\n return useAuiState((s) => {\n if (s.part.type !== \"tool-call\")\n throw new Error(\n \"useToolArgsFieldStatus can only be used inside tool-call message parts\",\n );\n\n const state = getPartialJsonObjectFieldState(s.part.args, fieldPath);\n if (state === \"complete\" || s.part.status?.type === \"requires-action\")\n return COMPLETE_STATUS;\n return s.part.status;\n });\n};\n"],"mappings":";;;;AAGA,MAAME,kBAAkB,EAAEC,MAAM,WAAW;AAE3C,MAAaC,0BAAyBC,cAAA;CAAA,MAAAC,IAAAC,EAAA,CAAA;CAAA,IAAAC;CAAA,IAAAF,EAAA,OAAAD,WAAA;EACjBG,MAAAC,MAAA;GACjB,IAAIA,EAACC,KAAKP,SAAU,aAClB,MAAM,IAAIQ,MACR,wEACF;GAGF,IADcX,+BAA+BS,EAACC,KAAKG,MAAOR,SACtDO,MAAU,cAAcH,EAACC,KAAKI,QAAaX,SAAK,mBAAiB,OAC5DD;GAAgB,OAClBO,EAACC,KAAKI;EAAO;EACrBR,EAAA,KAAAD;EAAAC,EAAA,KAAAE;CAAA,OAAAA,KAAAF,EAAA;CAAA,OAVML,YAAYO,EAUlB;AAAC"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export const invokeCallbackSafely = (invoke: () => unknown, name: string) => {
|
|
2
|
-
const reportFailure = (error: unknown) => {
|
|
3
|
-
console.error(`[assistant-ui] ${name} callback threw an error`, error);
|
|
4
|
-
};
|
|
5
|
-
|
|
6
|
-
try {
|
|
7
|
-
void Promise.resolve(invoke()).catch(reportFailure);
|
|
8
|
-
} catch (error) {
|
|
9
|
-
reportFailure(error);
|
|
10
|
-
}
|
|
11
|
-
};
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { getPartialJsonObjectFieldState } from "assistant-stream/utils";
|
|
2
|
-
import { useAuiState } from "@assistant-ui/store";
|
|
3
|
-
|
|
4
|
-
const COMPLETE_STATUS = { type: "complete" };
|
|
5
|
-
|
|
6
|
-
export const useToolArgsFieldStatus = (fieldPath: (string | number)[]) => {
|
|
7
|
-
return useAuiState((s) => {
|
|
8
|
-
if (s.part.type !== "tool-call")
|
|
9
|
-
throw new Error(
|
|
10
|
-
"useToolArgsFieldStatus can only be used inside tool-call message parts",
|
|
11
|
-
);
|
|
12
|
-
|
|
13
|
-
const state = getPartialJsonObjectFieldState(s.part.args, fieldPath);
|
|
14
|
-
if (state === "complete" || s.part.status?.type === "requires-action")
|
|
15
|
-
return COMPLETE_STATUS;
|
|
16
|
-
return s.part.status;
|
|
17
|
-
});
|
|
18
|
-
};
|