@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,39 +1,39 @@
|
|
|
1
|
-
import { Chat, ComponentOverrides } from
|
|
2
|
-
import { useAssistantState } from
|
|
3
|
-
import { Meta, StoryFn } from
|
|
1
|
+
import { Chat, ComponentOverrides } from "@/index";
|
|
2
|
+
import { useAssistantState } from "@assistant-ui/react";
|
|
3
|
+
import { Meta, StoryFn } from "@storybook/react-vite";
|
|
4
4
|
|
|
5
5
|
const meta: Meta<typeof Chat> = {
|
|
6
|
-
title:
|
|
6
|
+
title: "Chat/Customization",
|
|
7
7
|
component: Chat,
|
|
8
8
|
parameters: {
|
|
9
|
-
layout:
|
|
9
|
+
layout: "fullscreen",
|
|
10
10
|
},
|
|
11
|
-
} satisfies Meta<typeof Chat
|
|
11
|
+
} satisfies Meta<typeof Chat>;
|
|
12
12
|
|
|
13
|
-
export default meta
|
|
13
|
+
export default meta;
|
|
14
14
|
|
|
15
|
-
type Story = StoryFn<typeof Chat
|
|
15
|
+
type Story = StoryFn<typeof Chat>;
|
|
16
16
|
|
|
17
17
|
const customComponents: ComponentOverrides = {
|
|
18
18
|
Text: () => {
|
|
19
|
-
const message = useAssistantState(({ message }) => message)
|
|
19
|
+
const message = useAssistantState(({ message }) => message);
|
|
20
20
|
return (
|
|
21
21
|
<div className="text-red-500">
|
|
22
22
|
{message.parts
|
|
23
|
-
.map((part) => (part.type ===
|
|
24
|
-
.join(
|
|
23
|
+
.map((part) => (part.type === "text" ? part.text : ""))
|
|
24
|
+
.join("")}
|
|
25
25
|
</div>
|
|
26
|
-
)
|
|
26
|
+
);
|
|
27
27
|
},
|
|
28
|
-
}
|
|
28
|
+
};
|
|
29
29
|
|
|
30
|
-
export const ComponentOverridesStory: Story = () => <Chat
|
|
31
|
-
ComponentOverridesStory.storyName =
|
|
30
|
+
export const ComponentOverridesStory: Story = () => <Chat />;
|
|
31
|
+
ComponentOverridesStory.storyName = "Component Overrides";
|
|
32
32
|
ComponentOverridesStory.parameters = {
|
|
33
33
|
elements: {
|
|
34
34
|
config: {
|
|
35
|
-
variant:
|
|
35
|
+
variant: "standalone",
|
|
36
36
|
components: customComponents,
|
|
37
37
|
},
|
|
38
38
|
},
|
|
39
|
-
}
|
|
39
|
+
};
|
|
@@ -1,45 +1,45 @@
|
|
|
1
|
-
import React from
|
|
2
|
-
import { Chat } from
|
|
3
|
-
import type { Meta, StoryFn } from
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { Chat } from "..";
|
|
3
|
+
import type { Meta, StoryFn } from "@storybook/react-vite";
|
|
4
4
|
|
|
5
5
|
const meta: Meta<typeof Chat> = {
|
|
6
|
-
title:
|
|
6
|
+
title: "Chat/Density",
|
|
7
7
|
component: Chat,
|
|
8
8
|
parameters: {
|
|
9
|
-
layout:
|
|
9
|
+
layout: "fullscreen",
|
|
10
10
|
},
|
|
11
|
-
} satisfies Meta<typeof Chat
|
|
11
|
+
} satisfies Meta<typeof Chat>;
|
|
12
12
|
|
|
13
|
-
export default meta
|
|
13
|
+
export default meta;
|
|
14
14
|
|
|
15
|
-
type Story = StoryFn<typeof Chat
|
|
15
|
+
type Story = StoryFn<typeof Chat>;
|
|
16
16
|
|
|
17
|
-
export const Compact: Story = () => <Chat
|
|
17
|
+
export const Compact: Story = () => <Chat />;
|
|
18
18
|
Compact.parameters = {
|
|
19
19
|
elements: {
|
|
20
20
|
config: {
|
|
21
|
-
variant:
|
|
22
|
-
theme: { density:
|
|
21
|
+
variant: "standalone",
|
|
22
|
+
theme: { density: "compact" },
|
|
23
23
|
},
|
|
24
24
|
},
|
|
25
|
-
}
|
|
25
|
+
};
|
|
26
26
|
|
|
27
|
-
export const Normal: Story = () => <Chat
|
|
27
|
+
export const Normal: Story = () => <Chat />;
|
|
28
28
|
Normal.parameters = {
|
|
29
29
|
elements: {
|
|
30
30
|
config: {
|
|
31
|
-
variant:
|
|
32
|
-
theme: { density:
|
|
31
|
+
variant: "standalone",
|
|
32
|
+
theme: { density: "normal" },
|
|
33
33
|
},
|
|
34
34
|
},
|
|
35
|
-
}
|
|
35
|
+
};
|
|
36
36
|
|
|
37
|
-
export const Spacious: Story = () => <Chat
|
|
37
|
+
export const Spacious: Story = () => <Chat />;
|
|
38
38
|
Spacious.parameters = {
|
|
39
39
|
elements: {
|
|
40
40
|
config: {
|
|
41
|
-
variant:
|
|
42
|
-
theme: { density:
|
|
41
|
+
variant: "standalone",
|
|
42
|
+
theme: { density: "spacious" },
|
|
43
43
|
},
|
|
44
44
|
},
|
|
45
|
-
}
|
|
45
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Meta, StoryFn } from
|
|
1
|
+
import type { Meta, StoryFn } from "@storybook/react-vite";
|
|
2
2
|
import {
|
|
3
3
|
createContext,
|
|
4
4
|
useContext,
|
|
@@ -6,78 +6,78 @@ import {
|
|
|
6
6
|
useState,
|
|
7
7
|
type ComponentType,
|
|
8
8
|
type FC,
|
|
9
|
-
} from
|
|
10
|
-
import { Chat } from
|
|
11
|
-
import { Button } from
|
|
9
|
+
} from "react";
|
|
10
|
+
import { Chat } from "..";
|
|
11
|
+
import { Button } from "../../ui/button";
|
|
12
12
|
|
|
13
13
|
const meta: Meta<typeof Chat> = {
|
|
14
|
-
title:
|
|
14
|
+
title: "Chat/ErrorBoundary",
|
|
15
15
|
component: Chat,
|
|
16
16
|
parameters: {
|
|
17
|
-
layout:
|
|
17
|
+
layout: "fullscreen",
|
|
18
18
|
},
|
|
19
|
-
} satisfies Meta<typeof Chat
|
|
19
|
+
} satisfies Meta<typeof Chat>;
|
|
20
20
|
|
|
21
|
-
export default meta
|
|
21
|
+
export default meta;
|
|
22
22
|
|
|
23
|
-
type Story = StoryFn<typeof Chat
|
|
23
|
+
type Story = StoryFn<typeof Chat>;
|
|
24
24
|
|
|
25
25
|
// Context to trigger errors from outside the component tree
|
|
26
26
|
const ErrorTriggerContext = createContext<{
|
|
27
|
-
shouldThrow: boolean
|
|
28
|
-
resetError: () => void
|
|
27
|
+
shouldThrow: boolean;
|
|
28
|
+
resetError: () => void;
|
|
29
29
|
}>({
|
|
30
30
|
shouldThrow: false,
|
|
31
31
|
resetError: () => {},
|
|
32
|
-
})
|
|
32
|
+
});
|
|
33
33
|
|
|
34
34
|
// Component that throws when context says so - used to override ThreadWelcome
|
|
35
35
|
const ThrowingThreadWelcome: FC = () => {
|
|
36
|
-
const { shouldThrow, resetError } = useContext(ErrorTriggerContext)
|
|
36
|
+
const { shouldThrow, resetError } = useContext(ErrorTriggerContext);
|
|
37
37
|
|
|
38
38
|
// Reset the error state when this component unmounts (happens when "Try again" is clicked)
|
|
39
39
|
useEffect(() => {
|
|
40
40
|
return () => {
|
|
41
|
-
resetError()
|
|
42
|
-
}
|
|
43
|
-
}, [resetError])
|
|
41
|
+
resetError();
|
|
42
|
+
};
|
|
43
|
+
}, [resetError]);
|
|
44
44
|
|
|
45
45
|
if (shouldThrow) {
|
|
46
|
-
throw new Error(
|
|
46
|
+
throw new Error("Simulated error: Failed to load chat interface");
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
// Render a simple welcome that matches the default styling
|
|
50
50
|
return (
|
|
51
51
|
<div className="my-auto flex w-full grow flex-col items-center justify-center gap-4 p-6">
|
|
52
|
-
<h2 className="text-
|
|
52
|
+
<h2 className="text-2xl font-semibold text-foreground">Hello there!</h2>
|
|
53
53
|
<p className="text-muted-foreground">How can I help you today?</p>
|
|
54
|
-
<p className="text-muted-foreground/60
|
|
54
|
+
<p className="mt-4 text-sm text-muted-foreground/60">
|
|
55
55
|
Click "Trigger Error" above to see the error boundary
|
|
56
56
|
</p>
|
|
57
57
|
</div>
|
|
58
|
-
)
|
|
59
|
-
}
|
|
58
|
+
);
|
|
59
|
+
};
|
|
60
60
|
|
|
61
61
|
// Wrapper to provide the error trigger context
|
|
62
62
|
const ErrorTriggerProvider: FC<{
|
|
63
|
-
children: React.ReactNode
|
|
64
|
-
shouldThrow: boolean
|
|
65
|
-
onReset: () => void
|
|
63
|
+
children: React.ReactNode;
|
|
64
|
+
shouldThrow: boolean;
|
|
65
|
+
onReset: () => void;
|
|
66
66
|
}> = ({ children, shouldThrow, onReset }) => {
|
|
67
67
|
return (
|
|
68
68
|
<ErrorTriggerContext.Provider value={{ shouldThrow, resetError: onReset }}>
|
|
69
69
|
{children}
|
|
70
70
|
</ErrorTriggerContext.Provider>
|
|
71
|
-
)
|
|
72
|
-
}
|
|
71
|
+
);
|
|
72
|
+
};
|
|
73
73
|
|
|
74
74
|
// Control bar component for triggering errors
|
|
75
75
|
const ErrorControls: FC<{
|
|
76
|
-
onTriggerError: () => void
|
|
77
|
-
hasError: boolean
|
|
76
|
+
onTriggerError: () => void;
|
|
77
|
+
hasError: boolean;
|
|
78
78
|
}> = ({ onTriggerError, hasError }) => (
|
|
79
|
-
<div className="
|
|
80
|
-
<span className="text-
|
|
79
|
+
<div className="flex items-center gap-3 border-b border-border bg-muted/50 px-4 py-2">
|
|
80
|
+
<span className="text-sm font-medium text-muted-foreground">
|
|
81
81
|
Error Boundary Demo:
|
|
82
82
|
</span>
|
|
83
83
|
<Button
|
|
@@ -89,11 +89,11 @@ const ErrorControls: FC<{
|
|
|
89
89
|
Trigger Error
|
|
90
90
|
</Button>
|
|
91
91
|
</div>
|
|
92
|
-
)
|
|
92
|
+
);
|
|
93
93
|
|
|
94
94
|
// Modal variant story
|
|
95
95
|
export const Modal: Story = () => {
|
|
96
|
-
const [shouldThrow, setShouldThrow] = useState(false)
|
|
96
|
+
const [shouldThrow, setShouldThrow] = useState(false);
|
|
97
97
|
|
|
98
98
|
return (
|
|
99
99
|
<ErrorTriggerProvider
|
|
@@ -115,23 +115,23 @@ export const Modal: Story = () => {
|
|
|
115
115
|
</div>
|
|
116
116
|
</div>
|
|
117
117
|
</ErrorTriggerProvider>
|
|
118
|
-
)
|
|
119
|
-
}
|
|
118
|
+
);
|
|
119
|
+
};
|
|
120
120
|
Modal.parameters = {
|
|
121
121
|
elements: {
|
|
122
122
|
config: {
|
|
123
|
-
variant:
|
|
123
|
+
variant: "widget",
|
|
124
124
|
modal: { defaultOpen: true },
|
|
125
125
|
components: {
|
|
126
126
|
ThreadWelcome: ThrowingThreadWelcome as ComponentType,
|
|
127
127
|
},
|
|
128
128
|
},
|
|
129
129
|
},
|
|
130
|
-
}
|
|
130
|
+
};
|
|
131
131
|
|
|
132
132
|
// Standalone variant story
|
|
133
133
|
export const Standalone: Story = () => {
|
|
134
|
-
const [shouldThrow, setShouldThrow] = useState(false)
|
|
134
|
+
const [shouldThrow, setShouldThrow] = useState(false);
|
|
135
135
|
|
|
136
136
|
return (
|
|
137
137
|
<ErrorTriggerProvider
|
|
@@ -148,22 +148,22 @@ export const Standalone: Story = () => {
|
|
|
148
148
|
</div>
|
|
149
149
|
</div>
|
|
150
150
|
</ErrorTriggerProvider>
|
|
151
|
-
)
|
|
152
|
-
}
|
|
151
|
+
);
|
|
152
|
+
};
|
|
153
153
|
Standalone.parameters = {
|
|
154
154
|
elements: {
|
|
155
155
|
config: {
|
|
156
|
-
variant:
|
|
156
|
+
variant: "standalone",
|
|
157
157
|
components: {
|
|
158
158
|
ThreadWelcome: ThrowingThreadWelcome as ComponentType,
|
|
159
159
|
},
|
|
160
160
|
},
|
|
161
161
|
},
|
|
162
|
-
}
|
|
162
|
+
};
|
|
163
163
|
|
|
164
164
|
// Sidecar variant story
|
|
165
165
|
export const Sidecar: Story = () => {
|
|
166
|
-
const [shouldThrow, setShouldThrow] = useState(false)
|
|
166
|
+
const [shouldThrow, setShouldThrow] = useState(false);
|
|
167
167
|
|
|
168
168
|
return (
|
|
169
169
|
<ErrorTriggerProvider
|
|
@@ -185,18 +185,18 @@ export const Sidecar: Story = () => {
|
|
|
185
185
|
</div>
|
|
186
186
|
</div>
|
|
187
187
|
</ErrorTriggerProvider>
|
|
188
|
-
)
|
|
189
|
-
}
|
|
188
|
+
);
|
|
189
|
+
};
|
|
190
190
|
Sidecar.parameters = {
|
|
191
191
|
elements: {
|
|
192
192
|
config: {
|
|
193
|
-
variant:
|
|
193
|
+
variant: "sidecar",
|
|
194
194
|
sidecar: {
|
|
195
|
-
title:
|
|
195
|
+
title: "Error Boundary Demo",
|
|
196
196
|
},
|
|
197
197
|
components: {
|
|
198
198
|
ThreadWelcome: ThrowingThreadWelcome as ComponentType,
|
|
199
199
|
},
|
|
200
200
|
},
|
|
201
201
|
},
|
|
202
|
-
}
|
|
202
|
+
};
|
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
import { ToolCallMessagePartProps } from
|
|
2
|
-
import type { Meta, StoryFn } from
|
|
3
|
-
import React from
|
|
4
|
-
import z from
|
|
5
|
-
import { Chat } from
|
|
6
|
-
import { defineFrontendTool } from
|
|
1
|
+
import { ToolCallMessagePartProps } from "@assistant-ui/react";
|
|
2
|
+
import type { Meta, StoryFn } from "@storybook/react-vite";
|
|
3
|
+
import React from "react";
|
|
4
|
+
import z from "zod";
|
|
5
|
+
import { Chat } from "..";
|
|
6
|
+
import { defineFrontendTool } from "../../../lib/tools";
|
|
7
7
|
|
|
8
8
|
const meta: Meta<typeof Chat> = {
|
|
9
|
-
title:
|
|
9
|
+
title: "Chat/Frontend Tools",
|
|
10
10
|
component: Chat,
|
|
11
11
|
parameters: {
|
|
12
|
-
layout:
|
|
12
|
+
layout: "fullscreen",
|
|
13
13
|
},
|
|
14
|
-
} satisfies Meta<typeof Chat
|
|
14
|
+
} satisfies Meta<typeof Chat>;
|
|
15
15
|
|
|
16
|
-
export default meta
|
|
16
|
+
export default meta;
|
|
17
17
|
|
|
18
|
-
type Story = StoryFn<typeof Chat
|
|
18
|
+
type Story = StoryFn<typeof Chat>;
|
|
19
19
|
|
|
20
20
|
const FetchTool = defineFrontendTool<{ url: string }, string>(
|
|
21
21
|
{
|
|
22
|
-
description:
|
|
22
|
+
description: "Fetch a URL (supports CORS-enabled URLs like httpbin.org)",
|
|
23
23
|
parameters: z.object({
|
|
24
|
-
url: z.string().describe(
|
|
24
|
+
url: z.string().describe("URL to fetch (must support CORS)"),
|
|
25
25
|
}),
|
|
26
26
|
execute: async ({ url }) => {
|
|
27
27
|
try {
|
|
28
|
-
const response = await fetch(url as string)
|
|
29
|
-
const text = await response.text()
|
|
30
|
-
return text
|
|
28
|
+
const response = await fetch(url as string);
|
|
29
|
+
const text = await response.text();
|
|
30
|
+
return text;
|
|
31
31
|
} catch (error) {
|
|
32
|
-
return `Error fetching ${url}: ${error instanceof Error ? error.message :
|
|
32
|
+
return `Error fetching ${url}: ${error instanceof Error ? error.message : "Unknown error"}. Note: URL must support CORS for browser requests.`;
|
|
33
33
|
}
|
|
34
34
|
},
|
|
35
35
|
},
|
|
36
|
-
|
|
37
|
-
)
|
|
36
|
+
"fetchUrl",
|
|
37
|
+
);
|
|
38
38
|
|
|
39
39
|
const frontendTools = {
|
|
40
40
|
fetchUrl: FetchTool,
|
|
41
|
-
}
|
|
41
|
+
};
|
|
42
42
|
|
|
43
43
|
// Render OS X style browser window with the fetched URL html rendered
|
|
44
44
|
const FetchToolComponent = ({ result, args }: ToolCallMessagePartProps) => {
|
|
45
|
-
const url = (args as { url?: string })?.url ||
|
|
46
|
-
const [isLoading, setIsLoading] = React.useState(true)
|
|
45
|
+
const url = (args as { url?: string })?.url || "about:blank";
|
|
46
|
+
const [isLoading, setIsLoading] = React.useState(true);
|
|
47
47
|
|
|
48
48
|
return (
|
|
49
49
|
<div className="my-5 flex w-full flex-col overflow-hidden rounded-lg border shadow-lg">
|
|
50
50
|
{/* macOS Window Controls Bar */}
|
|
51
|
-
<div className="
|
|
51
|
+
<div className="flex flex-col border-b bg-muted">
|
|
52
52
|
<div className="flex items-center gap-2 px-3 py-2">
|
|
53
53
|
{/* Traffic lights */}
|
|
54
54
|
<div className="flex gap-2">
|
|
@@ -58,9 +58,9 @@ const FetchToolComponent = ({ result, args }: ToolCallMessagePartProps) => {
|
|
|
58
58
|
</div>
|
|
59
59
|
|
|
60
60
|
{/* Address bar */}
|
|
61
|
-
<div className="
|
|
61
|
+
<div className="mx-4 flex flex-1 items-center rounded-md bg-background px-3 py-1">
|
|
62
62
|
<svg
|
|
63
|
-
className="
|
|
63
|
+
className="mr-2 h-4 w-4 text-muted-foreground"
|
|
64
64
|
fill="none"
|
|
65
65
|
viewBox="0 0 24 24"
|
|
66
66
|
stroke="currentColor"
|
|
@@ -72,7 +72,7 @@ const FetchToolComponent = ({ result, args }: ToolCallMessagePartProps) => {
|
|
|
72
72
|
d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"
|
|
73
73
|
/>
|
|
74
74
|
</svg>
|
|
75
|
-
<span className="text-muted-foreground
|
|
75
|
+
<span className="truncate text-sm text-muted-foreground">
|
|
76
76
|
{url}
|
|
77
77
|
</span>
|
|
78
78
|
</div>
|
|
@@ -84,7 +84,7 @@ const FetchToolComponent = ({ result, args }: ToolCallMessagePartProps) => {
|
|
|
84
84
|
<div
|
|
85
85
|
className="h-full w-1/3 animate-pulse bg-blue-500"
|
|
86
86
|
style={{
|
|
87
|
-
animation:
|
|
87
|
+
animation: "slide 1.5s ease-in-out infinite",
|
|
88
88
|
}}
|
|
89
89
|
/>
|
|
90
90
|
</div>
|
|
@@ -92,7 +92,7 @@ const FetchToolComponent = ({ result, args }: ToolCallMessagePartProps) => {
|
|
|
92
92
|
</div>
|
|
93
93
|
|
|
94
94
|
{/* Content */}
|
|
95
|
-
<div className="bg-background
|
|
95
|
+
<div className="h-96 bg-background">
|
|
96
96
|
<iframe
|
|
97
97
|
srcDoc={result as string}
|
|
98
98
|
className="h-full w-full"
|
|
@@ -107,23 +107,23 @@ const FetchToolComponent = ({ result, args }: ToolCallMessagePartProps) => {
|
|
|
107
107
|
}
|
|
108
108
|
`}</style>
|
|
109
109
|
</div>
|
|
110
|
-
)
|
|
111
|
-
}
|
|
110
|
+
);
|
|
111
|
+
};
|
|
112
112
|
|
|
113
|
-
export const FetchUrl: Story = () => <Chat
|
|
114
|
-
FetchUrl.storyName =
|
|
113
|
+
export const FetchUrl: Story = () => <Chat />;
|
|
114
|
+
FetchUrl.storyName = "Fetch URL Tool";
|
|
115
115
|
FetchUrl.parameters = {
|
|
116
116
|
elements: {
|
|
117
117
|
config: {
|
|
118
|
-
variant:
|
|
118
|
+
variant: "standalone",
|
|
119
119
|
welcome: {
|
|
120
|
-
title:
|
|
121
|
-
subtitle:
|
|
120
|
+
title: "",
|
|
121
|
+
subtitle: "",
|
|
122
122
|
suggestions: [
|
|
123
123
|
{
|
|
124
|
-
title:
|
|
125
|
-
label:
|
|
126
|
-
prompt:
|
|
124
|
+
title: "Fetch a URL",
|
|
125
|
+
label: "Fetch a URL",
|
|
126
|
+
prompt: "Fetch https://httpbin.org/html",
|
|
127
127
|
},
|
|
128
128
|
],
|
|
129
129
|
},
|
|
@@ -135,4 +135,4 @@ FetchUrl.parameters = {
|
|
|
135
135
|
},
|
|
136
136
|
},
|
|
137
137
|
},
|
|
138
|
-
}
|
|
138
|
+
};
|
|
@@ -1,113 +1,113 @@
|
|
|
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/Plugins/Generative UI",
|
|
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
16
|
/**
|
|
17
17
|
* E-commerce store assistant with natural task-focused prompts.
|
|
18
18
|
*/
|
|
19
|
-
export const StoreAssistant: Story = () => <Chat
|
|
19
|
+
export const StoreAssistant: Story = () => <Chat />;
|
|
20
20
|
StoreAssistant.parameters = {
|
|
21
21
|
elements: {
|
|
22
22
|
config: {
|
|
23
|
-
variant:
|
|
23
|
+
variant: "standalone",
|
|
24
24
|
welcome: {
|
|
25
|
-
title:
|
|
26
|
-
subtitle:
|
|
25
|
+
title: "Store Assistant",
|
|
26
|
+
subtitle: "How can I help you today?",
|
|
27
27
|
suggestions: [
|
|
28
28
|
{
|
|
29
|
-
title:
|
|
30
|
-
label:
|
|
31
|
-
prompt:
|
|
29
|
+
title: "My Orders",
|
|
30
|
+
label: "View recent orders",
|
|
31
|
+
prompt: "Show me my current orders",
|
|
32
32
|
},
|
|
33
33
|
{
|
|
34
|
-
title:
|
|
34
|
+
title: "Browse Products",
|
|
35
35
|
label: "See what's available",
|
|
36
|
-
prompt:
|
|
36
|
+
prompt: "What products do you have?",
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
|
-
title:
|
|
40
|
-
label:
|
|
41
|
-
prompt:
|
|
39
|
+
title: "Find Deals",
|
|
40
|
+
label: "Best prices",
|
|
41
|
+
prompt: "What are the best deals right now?",
|
|
42
42
|
},
|
|
43
43
|
],
|
|
44
44
|
},
|
|
45
45
|
},
|
|
46
46
|
},
|
|
47
|
-
}
|
|
47
|
+
};
|
|
48
48
|
|
|
49
49
|
/**
|
|
50
50
|
* Shopping assistant for product discovery.
|
|
51
51
|
*/
|
|
52
|
-
export const ShoppingAssistant: Story = () => <Chat
|
|
52
|
+
export const ShoppingAssistant: Story = () => <Chat />;
|
|
53
53
|
ShoppingAssistant.parameters = {
|
|
54
54
|
elements: {
|
|
55
55
|
config: {
|
|
56
|
-
variant:
|
|
56
|
+
variant: "standalone",
|
|
57
57
|
welcome: {
|
|
58
|
-
title:
|
|
59
|
-
subtitle:
|
|
58
|
+
title: "Shopping Assistant",
|
|
59
|
+
subtitle: "Find the perfect product",
|
|
60
60
|
suggestions: [
|
|
61
61
|
{
|
|
62
|
-
title:
|
|
63
|
-
label:
|
|
64
|
-
prompt:
|
|
62
|
+
title: "New Arrivals",
|
|
63
|
+
label: "Latest products",
|
|
64
|
+
prompt: "Show me the newest products",
|
|
65
65
|
},
|
|
66
66
|
{
|
|
67
|
-
title:
|
|
68
|
-
label:
|
|
69
|
-
prompt:
|
|
67
|
+
title: "Gift Ideas",
|
|
68
|
+
label: "Under $50",
|
|
69
|
+
prompt: "I need a gift under $50, what do you recommend?",
|
|
70
70
|
},
|
|
71
71
|
{
|
|
72
|
-
title:
|
|
73
|
-
label:
|
|
74
|
-
prompt:
|
|
72
|
+
title: "Compare Options",
|
|
73
|
+
label: "Help me decide",
|
|
74
|
+
prompt: "Can you compare your top 3 products for me?",
|
|
75
75
|
},
|
|
76
76
|
],
|
|
77
77
|
},
|
|
78
78
|
},
|
|
79
79
|
},
|
|
80
|
-
}
|
|
80
|
+
};
|
|
81
81
|
|
|
82
82
|
/**
|
|
83
83
|
* Store management assistant.
|
|
84
84
|
*/
|
|
85
|
-
export const StoreManager: Story = () => <Chat
|
|
85
|
+
export const StoreManager: Story = () => <Chat />;
|
|
86
86
|
StoreManager.parameters = {
|
|
87
87
|
elements: {
|
|
88
88
|
config: {
|
|
89
|
-
variant:
|
|
89
|
+
variant: "standalone",
|
|
90
90
|
welcome: {
|
|
91
|
-
title:
|
|
92
|
-
subtitle:
|
|
91
|
+
title: "Store Manager",
|
|
92
|
+
subtitle: "Manage your store",
|
|
93
93
|
suggestions: [
|
|
94
94
|
{
|
|
95
|
-
title:
|
|
96
|
-
label:
|
|
97
|
-
prompt:
|
|
95
|
+
title: "Stock Check",
|
|
96
|
+
label: "Inventory status",
|
|
97
|
+
prompt: "Which products are running low on stock?",
|
|
98
98
|
},
|
|
99
99
|
{
|
|
100
|
-
title:
|
|
101
|
-
label:
|
|
102
|
-
prompt:
|
|
100
|
+
title: "Sales Summary",
|
|
101
|
+
label: "How are we doing?",
|
|
102
|
+
prompt: "How are sales looking this month?",
|
|
103
103
|
},
|
|
104
104
|
{
|
|
105
|
-
title:
|
|
106
|
-
label:
|
|
107
|
-
prompt:
|
|
105
|
+
title: "Top Sellers",
|
|
106
|
+
label: "Best performers",
|
|
107
|
+
prompt: "What are our best selling products?",
|
|
108
108
|
},
|
|
109
109
|
],
|
|
110
110
|
},
|
|
111
111
|
},
|
|
112
112
|
},
|
|
113
|
-
}
|
|
113
|
+
};
|