@gram-ai/elements 1.27.3 → 1.27.5
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 +72 -60
- package/README.typedoc.md +6 -6
- package/bin/cli.js +74 -74
- package/dist/compat-shims-CO9JXXV4.cjs.map +1 -1
- package/dist/{compat-shims-BPJ7Q68c.js → compat-shims-DxtUrORi.js} +4 -2
- package/dist/compat-shims-DxtUrORi.js.map +1 -0
- package/dist/components/ShareButton/index.d.ts +2 -2
- package/dist/components/assistant-ui/message-feedback.d.ts +1 -1
- package/dist/components/assistant-ui/tooltip-icon-button.d.ts +2 -2
- package/dist/components/ui/avatar.d.ts +2 -2
- package/dist/components/ui/button.d.ts +1 -1
- package/dist/components/ui/calendar.d.ts +1 -1
- package/dist/components/ui/collapsible.d.ts +1 -1
- package/dist/components/ui/dialog.d.ts +4 -4
- package/dist/components/ui/popover.d.ts +2 -2
- package/dist/components/ui/skeleton.d.ts +1 -1
- package/dist/components/ui/time-range-picker.d.ts +4 -2
- package/dist/components/ui/tool-ui.d.ts +7 -7
- package/dist/components/ui/tooltip.d.ts +2 -2
- package/dist/contexts/ConnectionStatusContext.d.ts +1 -1
- package/dist/elements.cjs +1 -1
- package/dist/elements.css +1 -1
- package/dist/elements.js +2 -2
- package/dist/hooks/useDensity.d.ts +73 -73
- package/dist/hooks/useMCPTools.d.ts +1 -1
- package/dist/hooks/useRadius.d.ts +1 -1
- package/dist/{index-BpJstUh1.cjs → index-C4bFBGfl.cjs} +4 -4
- package/dist/{index-BpJstUh1.cjs.map → index-C4bFBGfl.cjs.map} +1 -1
- package/dist/{index-CUitXazZ.js → index-D93pV0_o.js} +55 -55
- package/dist/{index-CUitXazZ.js.map → index-D93pV0_o.js.map} +1 -1
- package/dist/{index-DBrhzauj.js → index-DuCQRbcQ.js} +6386 -6337
- package/dist/index-DuCQRbcQ.js.map +1 -0
- package/dist/{index-DxfW52oA.cjs → index-y_PNN5vK.cjs} +64 -46
- package/dist/index-y_PNN5vK.cjs.map +1 -0
- package/dist/lib/cassette.d.ts +4 -4
- package/dist/lib/errorTracking.d.ts +1 -1
- package/dist/lib/messageConverter.d.ts +1 -1
- package/dist/lib/models.d.ts +1 -1
- package/dist/plugins/chart/ui/bar-chart.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/accordion-wrapper.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/accordion.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/action-button.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/alert-wrapper.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/alert.d.ts +4 -4
- package/dist/plugins/generative-ui/ui/avatar.d.ts +5 -5
- package/dist/plugins/generative-ui/ui/badge.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/button-wrapper.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/button.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/card-wrapper.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/card.d.ts +8 -8
- package/dist/plugins/generative-ui/ui/checkbox.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/data-table.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/dialog.d.ts +3 -3
- package/dist/plugins/generative-ui/ui/dropdown-menu.d.ts +3 -3
- package/dist/plugins/generative-ui/ui/grid.d.ts +3 -3
- package/dist/plugins/generative-ui/ui/input-wrapper.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/input.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/label.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/metric.d.ts +3 -3
- package/dist/plugins/generative-ui/ui/pagination.d.ts +6 -6
- package/dist/plugins/generative-ui/ui/popover.d.ts +4 -4
- package/dist/plugins/generative-ui/ui/progress.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/radio-group.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/select.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/separator.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/skeleton.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/stack.d.ts +6 -6
- package/dist/plugins/generative-ui/ui/switch.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/table.d.ts +9 -9
- package/dist/plugins/generative-ui/ui/tabs-wrapper.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/tabs.d.ts +1 -1
- package/dist/plugins/generative-ui/ui/text.d.ts +3 -3
- package/dist/plugins/generative-ui/ui/textarea.d.ts +2 -2
- package/dist/plugins/generative-ui/ui/tooltip.d.ts +1 -1
- package/dist/plugins.cjs +1 -1
- package/dist/plugins.js +1 -1
- package/dist/{profiler-D6ndqfsd.js → profiler-FpBY9eRv.js} +2 -2
- package/dist/{profiler-D6ndqfsd.js.map → profiler-FpBY9eRv.js.map} +1 -1
- package/dist/{profiler-DhnzZ34c.cjs → profiler-_mthyjvo.cjs} +2 -2
- package/dist/{profiler-DhnzZ34c.cjs.map → profiler-_mthyjvo.cjs.map} +1 -1
- package/dist/react-shim.js +1 -1
- package/dist/server/express.cjs.map +1 -1
- package/dist/server/express.js.map +1 -1
- package/dist/{startRecording-BwXmdmy1.cjs → startRecording-NJcpiHw-.cjs} +2 -2
- package/dist/{startRecording-BwXmdmy1.cjs.map → startRecording-NJcpiHw-.cjs.map} +1 -1
- package/dist/{startRecording-B_9CRZ_P.js → startRecording-r5MXQ2Dm.js} +2 -2
- package/dist/{startRecording-B_9CRZ_P.js.map → startRecording-r5MXQ2Dm.js.map} +1 -1
- package/dist/types/index.d.ts +2 -2
- package/package.json +1 -5
- package/src/compat-plugin.ts +14 -14
- package/src/compat-shims.ts +33 -31
- package/src/compat.test.ts +48 -48
- package/src/compat.ts +6 -6
- package/src/components/Chat/index.tsx +17 -17
- package/src/components/Chat/stories/Charts.stories.tsx +98 -98
- package/src/components/Chat/stories/Composer.stories.tsx +15 -15
- package/src/components/Chat/stories/ConnectionConfiguration.stories.tsx +44 -44
- package/src/components/Chat/stories/CustomComponents.stories.tsx +17 -17
- package/src/components/Chat/stories/Density.stories.tsx +20 -20
- package/src/components/Chat/stories/ErrorBoundary.stories.tsx +47 -47
- package/src/components/Chat/stories/FrontendTools.stories.tsx +39 -39
- package/src/components/Chat/stories/GenerativeUI.stories.tsx +48 -48
- package/src/components/Chat/stories/MessageFeedback.stories.tsx +52 -52
- package/src/components/Chat/stories/Modal.stories.tsx +28 -28
- package/src/components/Chat/stories/Model.stories.tsx +11 -11
- package/src/components/Chat/stories/Radius.stories.tsx +20 -20
- package/src/components/Chat/stories/Sidecar.stories.tsx +13 -13
- package/src/components/Chat/stories/StyleIsolation.stories.tsx +11 -11
- package/src/components/Chat/stories/Theme.stories.tsx +25 -25
- package/src/components/Chat/stories/Thread.stories.tsx +25 -25
- package/src/components/Chat/stories/ToolApproval.stories.tsx +55 -55
- package/src/components/Chat/stories/ToolMentions.stories.tsx +17 -17
- package/src/components/Chat/stories/Tools.stories.tsx +88 -88
- package/src/components/Chat/stories/Variants.stories.tsx +32 -32
- package/src/components/Chat/stories/Welcome.stories.tsx +14 -14
- package/src/components/ChatHistory.tsx +7 -7
- package/src/components/FrontendTools/index.tsx +5 -5
- package/src/components/Replay.stories.tsx +157 -157
- package/src/components/Replay.tsx +76 -73
- package/src/components/ShadowRoot.tsx +40 -40
- package/src/components/ShareButton/index.tsx +32 -32
- package/src/components/assistant-ui/assistant-modal.tsx +92 -87
- package/src/components/assistant-ui/assistant-sidecar.tsx +35 -35
- package/src/components/assistant-ui/attachment.tsx +80 -80
- package/src/components/assistant-ui/connection-status-indicator.tsx +33 -33
- package/src/components/assistant-ui/error-boundary.tsx +34 -34
- package/src/components/assistant-ui/follow-on-suggestions.tsx +26 -26
- package/src/components/assistant-ui/markdown-text.tsx +69 -69
- package/src/components/assistant-ui/mentioned-tools-badges.tsx +38 -38
- package/src/components/assistant-ui/message-feedback.tsx +74 -61
- package/src/components/assistant-ui/reasoning.tsx +83 -83
- package/src/components/assistant-ui/thread-list.tsx +45 -45
- package/src/components/assistant-ui/thread.tsx +278 -278
- package/src/components/assistant-ui/tool-fallback.tsx +37 -37
- package/src/components/assistant-ui/tool-group.tsx +26 -26
- package/src/components/assistant-ui/tool-mention-autocomplete.tsx +122 -122
- package/src/components/assistant-ui/tooltip-icon-button.tsx +18 -18
- package/src/components/ui/avatar.tsx +12 -12
- package/src/components/ui/button.tsx +12 -12
- package/src/components/ui/buttonVariants.ts +17 -17
- package/src/components/ui/calendar.tsx +106 -106
- package/src/components/ui/charts.stories.tsx +56 -56
- package/src/components/ui/collapsible.tsx +5 -5
- package/src/components/ui/dialog.tsx +30 -30
- package/src/components/ui/generative-ui.stories.tsx +200 -200
- package/src/components/ui/generative-ui.tsx +26 -26
- package/src/components/ui/popover.tsx +14 -14
- package/src/components/ui/skeleton.tsx +5 -5
- package/src/components/ui/time-range-picker.stories.tsx +80 -80
- package/src/components/ui/time-range-picker.tsx +272 -235
- package/src/components/ui/tool-ui.stories.tsx +37 -37
- package/src/components/ui/tool-ui.tsx +221 -215
- package/src/components/ui/tooltip.tsx +15 -15
- package/src/constants/tailwind.ts +1 -1
- package/src/contexts/ChatIdContext.tsx +7 -7
- package/src/contexts/ConnectionStatusContext.tsx +64 -64
- package/src/contexts/ElementsProvider.tsx +222 -211
- package/src/contexts/ReplayContext.ts +3 -3
- package/src/contexts/ToolApprovalContext.tsx +54 -54
- package/src/contexts/ToolExecutionContext.tsx +34 -34
- package/src/contexts/contexts.ts +7 -7
- package/src/contexts/portal-container-context.ts +2 -2
- package/src/contexts/portal-container.tsx +7 -7
- package/src/embedded.ts +1 -1
- package/src/global.css +25 -25
- package/src/hooks/useAuth.ts +72 -72
- package/src/hooks/useDensity.ts +79 -79
- package/src/hooks/useElements.ts +6 -6
- package/src/hooks/useExpanded.ts +12 -12
- package/src/hooks/useFollowOnSuggestions.ts +87 -82
- package/src/hooks/useGramThreadListAdapter.tsx +99 -99
- package/src/hooks/useMCPTools.ts +47 -47
- package/src/hooks/useModel.ts +14 -14
- package/src/hooks/usePluginComponents.ts +11 -11
- package/src/hooks/usePortalContainer.ts +5 -5
- package/src/hooks/useRadius.ts +23 -23
- package/src/hooks/useRecordCassette.ts +34 -34
- package/src/hooks/useSession.ts +11 -11
- package/src/hooks/useThemeProps.ts +13 -13
- package/src/hooks/useThreadId.ts +4 -4
- package/src/hooks/useToolApproval.ts +7 -7
- package/src/hooks/useToolMentions.ts +40 -40
- package/src/index.ts +26 -26
- package/src/lib/api.test.ts +61 -61
- package/src/lib/api.ts +4 -3
- package/src/lib/auth.ts +13 -13
- package/src/lib/cassette.ts +84 -84
- package/src/lib/easing.ts +1 -1
- package/src/lib/errorTracking.config.ts +5 -5
- package/src/lib/errorTracking.ts +29 -29
- package/src/lib/generative-ui.ts +7 -7
- package/src/lib/humanize.ts +3 -3
- package/src/lib/messageConverter.test.ts +130 -127
- package/src/lib/messageConverter.ts +196 -196
- package/src/lib/models.ts +21 -20
- package/src/lib/token.test.ts +56 -56
- package/src/lib/token.ts +14 -14
- package/src/lib/tool-mentions.ts +45 -45
- package/src/lib/tools.ts +66 -62
- package/src/lib/utils.ts +5 -5
- package/src/lib.d.ts +1 -1
- package/src/plugins/README.md +5 -5
- package/src/plugins/chart/catalog.ts +18 -18
- package/src/plugins/chart/chart.test.ts +31 -31
- package/src/plugins/chart/component.tsx +34 -34
- package/src/plugins/chart/index.ts +4 -4
- package/src/plugins/chart/ui/area-chart.tsx +42 -42
- package/src/plugins/chart/ui/bar-chart.tsx +46 -46
- package/src/plugins/chart/ui/donut-chart.tsx +48 -48
- package/src/plugins/chart/ui/index.ts +7 -7
- package/src/plugins/chart/ui/line-chart.tsx +43 -43
- package/src/plugins/chart/ui/pie-chart.tsx +44 -44
- package/src/plugins/chart/ui/radar-chart.tsx +33 -33
- package/src/plugins/chart/ui/scatter-chart.tsx +43 -43
- package/src/plugins/components/MacOSWindowFrame.tsx +15 -15
- package/src/plugins/components/PluginLoadingState.tsx +10 -10
- package/src/plugins/components/index.ts +1 -1
- package/src/plugins/generative-ui/catalog.ts +54 -54
- package/src/plugins/generative-ui/component.tsx +85 -85
- package/src/plugins/generative-ui/index.ts +4 -4
- package/src/plugins/generative-ui/ui/accordion-wrapper.tsx +16 -16
- package/src/plugins/generative-ui/ui/accordion.tsx +16 -16
- package/src/plugins/generative-ui/ui/action-button.tsx +28 -28
- package/src/plugins/generative-ui/ui/alert-wrapper.tsx +8 -8
- package/src/plugins/generative-ui/ui/alert.tsx +20 -20
- package/src/plugins/generative-ui/ui/avatar-wrapper.tsx +7 -7
- package/src/plugins/generative-ui/ui/avatar.tsx +30 -30
- package/src/plugins/generative-ui/ui/badge.tsx +22 -22
- package/src/plugins/generative-ui/ui/button-wrapper.tsx +12 -12
- package/src/plugins/generative-ui/ui/button.tsx +28 -28
- package/src/plugins/generative-ui/ui/card-wrapper.tsx +8 -8
- package/src/plugins/generative-ui/ui/card.tsx +27 -27
- package/src/plugins/generative-ui/ui/checkbox-wrapper.tsx +9 -9
- package/src/plugins/generative-ui/ui/checkbox.tsx +9 -9
- package/src/plugins/generative-ui/ui/data-table.tsx +8 -8
- package/src/plugins/generative-ui/ui/dialog.tsx +31 -31
- package/src/plugins/generative-ui/ui/dropdown-menu.tsx +44 -44
- package/src/plugins/generative-ui/ui/grid.tsx +12 -12
- package/src/plugins/generative-ui/ui/index.ts +40 -40
- package/src/plugins/generative-ui/ui/input-wrapper.tsx +11 -11
- package/src/plugins/generative-ui/ui/input.tsx +9 -9
- package/src/plugins/generative-ui/ui/label.tsx +8 -8
- package/src/plugins/generative-ui/ui/list.tsx +11 -11
- package/src/plugins/generative-ui/ui/metric.tsx +23 -23
- package/src/plugins/generative-ui/ui/pagination.tsx +28 -28
- package/src/plugins/generative-ui/ui/popover.tsx +21 -21
- package/src/plugins/generative-ui/ui/progress.tsx +13 -13
- package/src/plugins/generative-ui/ui/radio-group.tsx +12 -12
- package/src/plugins/generative-ui/ui/select-wrapper.tsx +7 -7
- package/src/plugins/generative-ui/ui/select.tsx +37 -37
- package/src/plugins/generative-ui/ui/separator.tsx +9 -9
- package/src/plugins/generative-ui/ui/skeleton-wrapper.tsx +10 -10
- package/src/plugins/generative-ui/ui/skeleton.tsx +5 -5
- package/src/plugins/generative-ui/ui/stack.tsx +28 -28
- package/src/plugins/generative-ui/ui/switch.tsx +11 -11
- package/src/plugins/generative-ui/ui/table.tsx +32 -32
- package/src/plugins/generative-ui/ui/tabs-wrapper.tsx +11 -11
- package/src/plugins/generative-ui/ui/tabs.tsx +26 -26
- package/src/plugins/generative-ui/ui/text.tsx +12 -12
- package/src/plugins/generative-ui/ui/textarea.tsx +7 -7
- package/src/plugins/generative-ui/ui/tooltip.tsx +12 -12
- package/src/plugins/index.ts +7 -7
- package/src/react-shim.ts +6 -6
- package/src/server/bun.ts +12 -12
- package/src/server/core.ts +25 -25
- package/src/server/express.ts +17 -15
- package/src/server/fastify.ts +14 -14
- package/src/server/hono.ts +9 -9
- package/src/server/nextjs.ts +12 -12
- package/src/server/tanstack-start.ts +12 -12
- package/src/server.ts +27 -27
- package/src/storybook.d.ts +4 -4
- package/src/types/index.ts +122 -122
- package/src/types/plugins.ts +7 -7
- package/src/vite-env.d.ts +12 -12
- package/dist/compat-shims-BPJ7Q68c.js.map +0 -1
- package/dist/index-DBrhzauj.js.map +0 -1
- package/dist/index-DxfW52oA.cjs.map +0 -1
|
@@ -1,81 +1,81 @@
|
|
|
1
|
-
import { ToolCallMessagePartProps } from
|
|
2
|
-
import type { Meta, StoryFn } from
|
|
3
|
-
import React, { useState, useCallback } from
|
|
4
|
-
import z from
|
|
5
|
-
import { Chat } from
|
|
6
|
-
import { useToolExecution } from
|
|
7
|
-
import { defineFrontendTool } from
|
|
1
|
+
import { ToolCallMessagePartProps } from "@assistant-ui/react";
|
|
2
|
+
import type { Meta, StoryFn } from "@storybook/react-vite";
|
|
3
|
+
import React, { useState, useCallback } from "react";
|
|
4
|
+
import z from "zod";
|
|
5
|
+
import { Chat } from "..";
|
|
6
|
+
import { useToolExecution } from "../../../contexts/ToolExecutionContext";
|
|
7
|
+
import { defineFrontendTool } from "../../../lib/tools";
|
|
8
8
|
|
|
9
9
|
const meta: Meta<typeof Chat> = {
|
|
10
|
-
title:
|
|
10
|
+
title: "Chat/Tools",
|
|
11
11
|
component: Chat,
|
|
12
12
|
parameters: {
|
|
13
|
-
layout:
|
|
13
|
+
layout: "fullscreen",
|
|
14
14
|
},
|
|
15
|
-
} satisfies Meta<typeof Chat
|
|
15
|
+
} satisfies Meta<typeof Chat>;
|
|
16
16
|
|
|
17
|
-
export default meta
|
|
17
|
+
export default meta;
|
|
18
18
|
|
|
19
|
-
type Story = StoryFn<typeof Chat
|
|
19
|
+
type Story = StoryFn<typeof Chat>;
|
|
20
20
|
|
|
21
21
|
const ProductCardComponent = ({ result }: ToolCallMessagePartProps) => {
|
|
22
|
-
const { executeTool, isToolAvailable } = useToolExecution()
|
|
23
|
-
const [isLoading, setIsLoading] = useState(false)
|
|
24
|
-
const [addedToCart, setAddedToCart] = useState(false)
|
|
22
|
+
const { executeTool, isToolAvailable } = useToolExecution();
|
|
23
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
24
|
+
const [addedToCart, setAddedToCart] = useState(false);
|
|
25
25
|
|
|
26
26
|
// Parse the result to get product details
|
|
27
27
|
let product = {
|
|
28
|
-
id:
|
|
29
|
-
name:
|
|
30
|
-
description:
|
|
28
|
+
id: "",
|
|
29
|
+
name: "Loading...",
|
|
30
|
+
description: "",
|
|
31
31
|
price: 0,
|
|
32
|
-
category:
|
|
32
|
+
category: "",
|
|
33
33
|
rating: 0,
|
|
34
34
|
reviewCount: 0,
|
|
35
|
-
imageUrl:
|
|
35
|
+
imageUrl: "",
|
|
36
36
|
inStock: true,
|
|
37
|
-
}
|
|
37
|
+
};
|
|
38
38
|
|
|
39
39
|
try {
|
|
40
40
|
if (result) {
|
|
41
|
-
const parsed = typeof result ===
|
|
41
|
+
const parsed = typeof result === "string" ? JSON.parse(result) : result;
|
|
42
42
|
if (parsed?.content?.[0]?.text) {
|
|
43
|
-
const content = JSON.parse(parsed.content[0].text)
|
|
44
|
-
product = { ...product, ...content }
|
|
43
|
+
const content = JSON.parse(parsed.content[0].text);
|
|
44
|
+
product = { ...product, ...content };
|
|
45
45
|
} else if (parsed?.name) {
|
|
46
|
-
product = { ...product, ...parsed }
|
|
46
|
+
product = { ...product, ...parsed };
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
} catch {
|
|
50
50
|
// Fallback to default
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
-
const canAddToCart = isToolAvailable(
|
|
53
|
+
const canAddToCart = isToolAvailable("ecommerce_api_add_to_cart");
|
|
54
54
|
|
|
55
55
|
const handleAddToCart = useCallback(async () => {
|
|
56
|
-
if (!product.id || !canAddToCart) return
|
|
56
|
+
if (!product.id || !canAddToCart) return;
|
|
57
57
|
|
|
58
|
-
setIsLoading(true)
|
|
58
|
+
setIsLoading(true);
|
|
59
59
|
try {
|
|
60
60
|
// HTTP tools from OpenAPI expect body content wrapped in a 'body' field
|
|
61
|
-
const toolResult = await executeTool(
|
|
61
|
+
const toolResult = await executeTool("ecommerce_api_add_to_cart", {
|
|
62
62
|
body: {
|
|
63
63
|
productId: product.id,
|
|
64
64
|
quantity: 1,
|
|
65
65
|
},
|
|
66
|
-
})
|
|
66
|
+
});
|
|
67
67
|
|
|
68
68
|
if (toolResult.success) {
|
|
69
|
-
setAddedToCart(true)
|
|
69
|
+
setAddedToCart(true);
|
|
70
70
|
} else {
|
|
71
|
-
console.error(
|
|
71
|
+
console.error("[ProductCard] Tool failed:", toolResult.error);
|
|
72
72
|
}
|
|
73
73
|
} catch (err) {
|
|
74
|
-
console.error(
|
|
74
|
+
console.error("[ProductCard] Exception:", err);
|
|
75
75
|
} finally {
|
|
76
|
-
setIsLoading(false)
|
|
76
|
+
setIsLoading(false);
|
|
77
77
|
}
|
|
78
|
-
}, [product.id, canAddToCart, executeTool])
|
|
78
|
+
}, [product.id, canAddToCart, executeTool]);
|
|
79
79
|
|
|
80
80
|
return (
|
|
81
81
|
<div className="my-4 w-80">
|
|
@@ -120,8 +120,8 @@ const ProductCardComponent = ({ result }: ToolCallMessagePartProps) => {
|
|
|
120
120
|
key={star}
|
|
121
121
|
className={
|
|
122
122
|
star <= Math.round(product.rating)
|
|
123
|
-
?
|
|
124
|
-
:
|
|
123
|
+
? "text-yellow-400"
|
|
124
|
+
: "text-slate-300"
|
|
125
125
|
}
|
|
126
126
|
>
|
|
127
127
|
★
|
|
@@ -145,36 +145,36 @@ const ProductCardComponent = ({ result }: ToolCallMessagePartProps) => {
|
|
|
145
145
|
}
|
|
146
146
|
className={`rounded-lg px-4 py-2 text-sm font-semibold text-white transition-colors ${
|
|
147
147
|
addedToCart
|
|
148
|
-
?
|
|
148
|
+
? "bg-green-500"
|
|
149
149
|
: isLoading
|
|
150
|
-
?
|
|
151
|
-
:
|
|
150
|
+
? "bg-indigo-400"
|
|
151
|
+
: "bg-indigo-600 hover:bg-indigo-700"
|
|
152
152
|
} disabled:cursor-not-allowed disabled:opacity-50`}
|
|
153
153
|
>
|
|
154
154
|
{addedToCart
|
|
155
|
-
?
|
|
155
|
+
? "✓ Added"
|
|
156
156
|
: isLoading
|
|
157
|
-
?
|
|
158
|
-
:
|
|
157
|
+
? "Adding..."
|
|
158
|
+
: "Add to Cart"}
|
|
159
159
|
</button>
|
|
160
160
|
</div>
|
|
161
161
|
</div>
|
|
162
162
|
</div>
|
|
163
163
|
</div>
|
|
164
|
-
)
|
|
165
|
-
}
|
|
164
|
+
);
|
|
165
|
+
};
|
|
166
166
|
|
|
167
|
-
export const CustomToolComponent: Story = () => <Chat
|
|
167
|
+
export const CustomToolComponent: Story = () => <Chat />;
|
|
168
168
|
CustomToolComponent.parameters = {
|
|
169
169
|
elements: {
|
|
170
170
|
config: {
|
|
171
|
-
variant:
|
|
171
|
+
variant: "standalone",
|
|
172
172
|
welcome: {
|
|
173
173
|
suggestions: [
|
|
174
174
|
{
|
|
175
|
-
title:
|
|
176
|
-
label:
|
|
177
|
-
prompt:
|
|
175
|
+
title: "Get product details",
|
|
176
|
+
label: "View a product",
|
|
177
|
+
prompt: "List products and then show me details for the first one",
|
|
178
178
|
},
|
|
179
179
|
],
|
|
180
180
|
},
|
|
@@ -185,7 +185,7 @@ CustomToolComponent.parameters = {
|
|
|
185
185
|
},
|
|
186
186
|
},
|
|
187
187
|
},
|
|
188
|
-
}
|
|
188
|
+
};
|
|
189
189
|
|
|
190
190
|
/**
|
|
191
191
|
* Demonstrates the generativeUI plugin which renders `ui` code blocks
|
|
@@ -194,36 +194,36 @@ CustomToolComponent.parameters = {
|
|
|
194
194
|
* The LLM outputs JSON in a ```ui code fence, and the plugin renders it
|
|
195
195
|
* using the built-in component catalog (Card, Grid, Metric, Table, etc.)
|
|
196
196
|
*/
|
|
197
|
-
export const GenerativeUI: Story = () => <Chat
|
|
197
|
+
export const GenerativeUI: Story = () => <Chat />;
|
|
198
198
|
GenerativeUI.parameters = {
|
|
199
199
|
elements: {
|
|
200
200
|
config: {
|
|
201
|
-
variant:
|
|
201
|
+
variant: "standalone",
|
|
202
202
|
welcome: {
|
|
203
|
-
title:
|
|
204
|
-
subtitle:
|
|
203
|
+
title: "Data Explorer",
|
|
204
|
+
subtitle: "Ask questions about your data",
|
|
205
205
|
suggestions: [
|
|
206
206
|
{
|
|
207
|
-
title:
|
|
208
|
-
label:
|
|
207
|
+
title: "Sales metrics",
|
|
208
|
+
label: "This month",
|
|
209
209
|
prompt:
|
|
210
|
-
|
|
210
|
+
"What are our sales numbers this month? Revenue is $125,000, conversion rate is 3.2%, and we have 1,420 orders.",
|
|
211
211
|
},
|
|
212
212
|
{
|
|
213
|
-
title:
|
|
214
|
-
label:
|
|
213
|
+
title: "Team members",
|
|
214
|
+
label: "Directory",
|
|
215
215
|
prompt:
|
|
216
|
-
|
|
216
|
+
"List our team members: Alice (alice@co.com, Admin, Active), Bob (bob@co.com, Editor, Active), Charlie (charlie@co.com, Viewer, Pending)",
|
|
217
217
|
},
|
|
218
218
|
{
|
|
219
|
-
title:
|
|
220
|
-
label:
|
|
219
|
+
title: "Project status",
|
|
220
|
+
label: "Sprint progress",
|
|
221
221
|
prompt:
|
|
222
|
-
|
|
222
|
+
"How is our current sprint going? We have 12 tasks total, 8 completed, 3 in progress, and 1 blocked. The team has 4 developers.",
|
|
223
223
|
},
|
|
224
224
|
{
|
|
225
|
-
title:
|
|
226
|
-
label:
|
|
225
|
+
title: "Website analytics",
|
|
226
|
+
label: "Last 7 days",
|
|
227
227
|
prompt:
|
|
228
228
|
"Show me last week's website stats: 45,000 page views, 2.1% bounce rate, 3m 24s average session, top pages are /home, /pricing, /docs",
|
|
229
229
|
},
|
|
@@ -231,46 +231,46 @@ GenerativeUI.parameters = {
|
|
|
231
231
|
},
|
|
232
232
|
},
|
|
233
233
|
},
|
|
234
|
-
}
|
|
234
|
+
};
|
|
235
235
|
|
|
236
236
|
// Frontend tools for the ActionButton demo
|
|
237
237
|
const ApproveRequestTool = defineFrontendTool<{ id: number }, string>(
|
|
238
238
|
{
|
|
239
|
-
description:
|
|
239
|
+
description: "Approve a pending request",
|
|
240
240
|
parameters: z.object({
|
|
241
|
-
id: z.number().describe(
|
|
241
|
+
id: z.number().describe("The request ID to approve"),
|
|
242
242
|
}),
|
|
243
243
|
execute: async ({ id }) => {
|
|
244
244
|
// Simulate API call
|
|
245
|
-
await new Promise((resolve) => setTimeout(resolve, 500))
|
|
246
|
-
return `Request #${id} has been approved successfully
|
|
245
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
246
|
+
return `Request #${id} has been approved successfully.`;
|
|
247
247
|
},
|
|
248
248
|
},
|
|
249
|
-
|
|
250
|
-
)
|
|
249
|
+
"approve_request",
|
|
250
|
+
);
|
|
251
251
|
|
|
252
252
|
const RejectRequestTool = defineFrontendTool<
|
|
253
253
|
{ id: number; reason?: string },
|
|
254
254
|
string
|
|
255
255
|
>(
|
|
256
256
|
{
|
|
257
|
-
description:
|
|
257
|
+
description: "Reject a pending request",
|
|
258
258
|
parameters: z.object({
|
|
259
|
-
id: z.number().describe(
|
|
260
|
-
reason: z.string().optional().describe(
|
|
259
|
+
id: z.number().describe("The request ID to reject"),
|
|
260
|
+
reason: z.string().optional().describe("Reason for rejection"),
|
|
261
261
|
}),
|
|
262
262
|
execute: async ({ id, reason }) => {
|
|
263
|
-
await new Promise((resolve) => setTimeout(resolve, 500))
|
|
264
|
-
return `Request #${id} has been rejected.${reason ? ` Reason: ${reason}` :
|
|
263
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
264
|
+
return `Request #${id} has been rejected.${reason ? ` Reason: ${reason}` : ""}`;
|
|
265
265
|
},
|
|
266
266
|
},
|
|
267
|
-
|
|
268
|
-
)
|
|
267
|
+
"reject_request",
|
|
268
|
+
);
|
|
269
269
|
|
|
270
270
|
const actionTools = {
|
|
271
271
|
approve_request: ApproveRequestTool,
|
|
272
272
|
reject_request: RejectRequestTool,
|
|
273
|
-
}
|
|
273
|
+
};
|
|
274
274
|
|
|
275
275
|
/**
|
|
276
276
|
* Demonstrates ActionButton in generative UI that triggers tool calls.
|
|
@@ -278,18 +278,18 @@ const actionTools = {
|
|
|
278
278
|
* The LLM generates UI with ActionButton components that, when clicked,
|
|
279
279
|
* directly execute the tool without an LLM roundtrip.
|
|
280
280
|
*/
|
|
281
|
-
export const GenerativeUIWithActions: Story = () => <Chat
|
|
281
|
+
export const GenerativeUIWithActions: Story = () => <Chat />;
|
|
282
282
|
GenerativeUIWithActions.parameters = {
|
|
283
283
|
elements: {
|
|
284
284
|
config: {
|
|
285
|
-
variant:
|
|
285
|
+
variant: "standalone",
|
|
286
286
|
welcome: {
|
|
287
|
-
title:
|
|
288
|
-
subtitle:
|
|
287
|
+
title: "Expense Approvals",
|
|
288
|
+
subtitle: "Review and process pending requests",
|
|
289
289
|
suggestions: [
|
|
290
290
|
{
|
|
291
|
-
title:
|
|
292
|
-
label:
|
|
291
|
+
title: "Pending expenses",
|
|
292
|
+
label: "Needs review",
|
|
293
293
|
prompt: `I need to review these pending expense requests:
|
|
294
294
|
|
|
295
295
|
Request #1247: Sarah Chen submitted $450 for conference registration
|
|
@@ -305,4 +305,4 @@ I need to be able to approve or reject each one.`,
|
|
|
305
305
|
},
|
|
306
306
|
},
|
|
307
307
|
},
|
|
308
|
-
}
|
|
308
|
+
};
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import { Chat } from
|
|
2
|
-
import type { Meta, StoryFn, StoryObj } from
|
|
3
|
-
import { ThreadList } from
|
|
4
|
-
import { ROOT_SELECTOR } from
|
|
1
|
+
import { Chat } from "..";
|
|
2
|
+
import type { Meta, StoryFn, StoryObj } from "@storybook/react-vite";
|
|
3
|
+
import { ThreadList } from "@/components/assistant-ui/thread-list";
|
|
4
|
+
import { ROOT_SELECTOR } from "@/constants/tailwind";
|
|
5
5
|
|
|
6
6
|
const meta: Meta<typeof Chat> = {
|
|
7
|
-
title:
|
|
7
|
+
title: "Chat/Variants",
|
|
8
8
|
component: Chat,
|
|
9
9
|
parameters: {
|
|
10
|
-
layout:
|
|
10
|
+
layout: "fullscreen",
|
|
11
11
|
},
|
|
12
|
-
} satisfies Meta<typeof Chat
|
|
12
|
+
} satisfies Meta<typeof Chat>;
|
|
13
13
|
|
|
14
|
-
export default meta
|
|
14
|
+
export default meta;
|
|
15
15
|
|
|
16
|
-
type Story = StoryFn<typeof Chat
|
|
16
|
+
type Story = StoryFn<typeof Chat>;
|
|
17
17
|
|
|
18
18
|
export const Default: Story = () => (
|
|
19
19
|
<div className="flex h-full w-full flex-col gap-4 p-10">
|
|
@@ -21,30 +21,30 @@ export const Default: Story = () => (
|
|
|
21
21
|
<p>Click the button in the bottom right corner to open the chat.</p>
|
|
22
22
|
<Chat />
|
|
23
23
|
</div>
|
|
24
|
-
)
|
|
24
|
+
);
|
|
25
25
|
|
|
26
|
-
export const Standalone: Story = () => <Chat
|
|
26
|
+
export const Standalone: Story = () => <Chat />;
|
|
27
27
|
Standalone.parameters = {
|
|
28
|
-
elements: { config: { variant:
|
|
29
|
-
}
|
|
28
|
+
elements: { config: { variant: "standalone" } },
|
|
29
|
+
};
|
|
30
30
|
Standalone.decorators = [
|
|
31
31
|
(Story) => (
|
|
32
32
|
<div className="m-auto flex h-screen w-full max-w-3xl flex-col">
|
|
33
33
|
<Story />
|
|
34
34
|
</div>
|
|
35
35
|
),
|
|
36
|
-
]
|
|
36
|
+
];
|
|
37
37
|
|
|
38
38
|
export const StandaloneWithHistory: StoryObj<typeof Chat> = {
|
|
39
|
-
name:
|
|
39
|
+
name: "Standalone with History",
|
|
40
40
|
args: {},
|
|
41
41
|
render: () => (
|
|
42
|
-
<div className="
|
|
42
|
+
<div className="flex h-10/12 max-h-[800px] w-1/2 flex-row gap-4 overflow-hidden rounded-lg border bg-background shadow-xl sm:w-3/4">
|
|
43
43
|
<ThreadList className="w-56 min-w-0 shrink border-r" />
|
|
44
44
|
<Chat className="flex-3 grow" />
|
|
45
45
|
</div>
|
|
46
46
|
),
|
|
47
|
-
}
|
|
47
|
+
};
|
|
48
48
|
StandaloneWithHistory.decorators = [
|
|
49
49
|
(Story) => (
|
|
50
50
|
<div className={ROOT_SELECTOR}>
|
|
@@ -53,19 +53,19 @@ StandaloneWithHistory.decorators = [
|
|
|
53
53
|
</div>
|
|
54
54
|
</div>
|
|
55
55
|
),
|
|
56
|
-
]
|
|
56
|
+
];
|
|
57
57
|
StandaloneWithHistory.parameters = {
|
|
58
58
|
elements: {
|
|
59
59
|
config: {
|
|
60
|
-
variant:
|
|
60
|
+
variant: "standalone",
|
|
61
61
|
history: { enabled: true, showThreadList: true },
|
|
62
62
|
model: { showModelPicker: true },
|
|
63
63
|
tools: {
|
|
64
|
-
toolsRequiringApproval: [
|
|
64
|
+
toolsRequiringApproval: ["ecommerce_api_create_order"],
|
|
65
65
|
},
|
|
66
66
|
},
|
|
67
67
|
},
|
|
68
|
-
}
|
|
68
|
+
};
|
|
69
69
|
|
|
70
70
|
export const Sidecar: Story = () => (
|
|
71
71
|
<div className="mr-[400px] p-10">
|
|
@@ -73,10 +73,10 @@ export const Sidecar: Story = () => (
|
|
|
73
73
|
<p>The sidebar is always visible on the right.</p>
|
|
74
74
|
<Chat />
|
|
75
75
|
</div>
|
|
76
|
-
)
|
|
76
|
+
);
|
|
77
77
|
Sidecar.parameters = {
|
|
78
|
-
elements: { config: { variant:
|
|
79
|
-
}
|
|
78
|
+
elements: { config: { variant: "sidecar" } },
|
|
79
|
+
};
|
|
80
80
|
|
|
81
81
|
export const ModalWithHistory: Story = () => (
|
|
82
82
|
<div className="flex h-full w-full flex-col gap-4 p-10">
|
|
@@ -87,17 +87,17 @@ export const ModalWithHistory: Story = () => (
|
|
|
87
87
|
</p>
|
|
88
88
|
<Chat />
|
|
89
89
|
</div>
|
|
90
|
-
)
|
|
90
|
+
);
|
|
91
91
|
ModalWithHistory.parameters = {
|
|
92
92
|
elements: {
|
|
93
93
|
config: {
|
|
94
|
-
variant:
|
|
94
|
+
variant: "widget",
|
|
95
95
|
modal: {
|
|
96
96
|
defaultOpen: true,
|
|
97
97
|
expandable: true,
|
|
98
98
|
dimensions: {
|
|
99
|
-
default: { width:
|
|
100
|
-
expanded: { width:
|
|
99
|
+
default: { width: "700px", height: "600px", maxHeight: "100vh" },
|
|
100
|
+
expanded: { width: "90vw", height: "90vh" },
|
|
101
101
|
},
|
|
102
102
|
},
|
|
103
103
|
history: {
|
|
@@ -106,7 +106,7 @@ ModalWithHistory.parameters = {
|
|
|
106
106
|
},
|
|
107
107
|
},
|
|
108
108
|
},
|
|
109
|
-
}
|
|
109
|
+
};
|
|
110
110
|
|
|
111
111
|
export const SidecarWithHistory: Story = () => (
|
|
112
112
|
<div className="mr-[600px] p-10">
|
|
@@ -114,15 +114,15 @@ export const SidecarWithHistory: Story = () => (
|
|
|
114
114
|
<p>The sidecar includes a thread list sidebar for chat history.</p>
|
|
115
115
|
<Chat />
|
|
116
116
|
</div>
|
|
117
|
-
)
|
|
117
|
+
);
|
|
118
118
|
SidecarWithHistory.parameters = {
|
|
119
119
|
elements: {
|
|
120
120
|
config: {
|
|
121
|
-
variant:
|
|
121
|
+
variant: "sidecar",
|
|
122
122
|
history: {
|
|
123
123
|
enabled: true,
|
|
124
124
|
showThreadList: true,
|
|
125
125
|
},
|
|
126
126
|
},
|
|
127
127
|
},
|
|
128
|
-
}
|
|
128
|
+
};
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
import type { Meta, StoryFn } from
|
|
2
|
-
import { Chat } from
|
|
1
|
+
import type { Meta, StoryFn } from "@storybook/react-vite";
|
|
2
|
+
import { Chat } from "..";
|
|
3
3
|
|
|
4
4
|
const meta: Meta<typeof Chat> = {
|
|
5
|
-
title:
|
|
5
|
+
title: "Chat/Welcome",
|
|
6
6
|
component: Chat,
|
|
7
7
|
parameters: {
|
|
8
|
-
layout:
|
|
8
|
+
layout: "fullscreen",
|
|
9
9
|
},
|
|
10
|
-
} satisfies Meta<typeof Chat
|
|
10
|
+
} satisfies Meta<typeof Chat>;
|
|
11
11
|
|
|
12
|
-
export default meta
|
|
12
|
+
export default meta;
|
|
13
13
|
|
|
14
|
-
type Story = StoryFn<typeof Chat
|
|
14
|
+
type Story = StoryFn<typeof Chat>;
|
|
15
15
|
|
|
16
|
-
export const CustomMessage: Story = () => <Chat
|
|
16
|
+
export const CustomMessage: Story = () => <Chat />;
|
|
17
17
|
CustomMessage.parameters = {
|
|
18
18
|
elements: {
|
|
19
19
|
config: {
|
|
20
|
-
variant:
|
|
20
|
+
variant: "standalone",
|
|
21
21
|
welcome: {
|
|
22
|
-
title:
|
|
22
|
+
title: "Hello there!",
|
|
23
23
|
subtitle: "How can I serve your organization's needs today?",
|
|
24
24
|
suggestions: [
|
|
25
25
|
{
|
|
26
|
-
title:
|
|
27
|
-
label:
|
|
28
|
-
prompt:
|
|
26
|
+
title: "Write a SQL query",
|
|
27
|
+
label: "to find top customers",
|
|
28
|
+
prompt: "Write a SQL query to find top customers",
|
|
29
29
|
},
|
|
30
30
|
],
|
|
31
31
|
},
|
|
32
32
|
},
|
|
33
33
|
},
|
|
34
|
-
}
|
|
34
|
+
};
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
|
|
1
|
+
"use client";
|
|
2
2
|
|
|
3
|
-
import { ThreadList } from
|
|
4
|
-
import { ShadowRoot } from
|
|
3
|
+
import { ThreadList } from "@/components/assistant-ui/thread-list";
|
|
4
|
+
import { ShadowRoot } from "@/components/ShadowRoot";
|
|
5
5
|
|
|
6
6
|
interface ChatHistoryProps {
|
|
7
|
-
className?: string
|
|
7
|
+
className?: string;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
export const ChatHistory = ({ className }: ChatHistoryProps) => {
|
|
11
11
|
return (
|
|
12
|
-
<ShadowRoot hostStyle={{ height:
|
|
12
|
+
<ShadowRoot hostStyle={{ height: "inherit", width: "inherit" }}>
|
|
13
13
|
<ThreadList className={className} />
|
|
14
14
|
</ShadowRoot>
|
|
15
|
-
)
|
|
16
|
-
}
|
|
15
|
+
);
|
|
16
|
+
};
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { AssistantTool } from
|
|
2
|
-
import type { FrontendTools } from
|
|
1
|
+
import { AssistantTool } from "@assistant-ui/react";
|
|
2
|
+
import type { FrontendTools } from "@/types";
|
|
3
3
|
|
|
4
4
|
export function FrontendTools({
|
|
5
5
|
tools: frontendTools,
|
|
6
6
|
}: {
|
|
7
|
-
tools: FrontendTools
|
|
7
|
+
tools: FrontendTools;
|
|
8
8
|
}) {
|
|
9
9
|
return (
|
|
10
10
|
<>
|
|
11
11
|
{Object.entries(frontendTools).map(([, tool]) =>
|
|
12
|
-
(tool as AssistantTool)({})
|
|
12
|
+
(tool as AssistantTool)({}),
|
|
13
13
|
)}
|
|
14
14
|
</>
|
|
15
|
-
)
|
|
15
|
+
);
|
|
16
16
|
}
|