@gram-ai/elements 1.27.4 → 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.
Files changed (277) hide show
  1. package/README.md +72 -60
  2. package/README.typedoc.md +6 -6
  3. package/bin/cli.js +74 -74
  4. package/dist/compat-shims-CO9JXXV4.cjs.map +1 -1
  5. package/dist/{compat-shims-BPJ7Q68c.js → compat-shims-DxtUrORi.js} +4 -2
  6. package/dist/compat-shims-DxtUrORi.js.map +1 -0
  7. package/dist/components/ShareButton/index.d.ts +2 -2
  8. package/dist/components/assistant-ui/message-feedback.d.ts +1 -1
  9. package/dist/components/assistant-ui/tooltip-icon-button.d.ts +2 -2
  10. package/dist/components/ui/avatar.d.ts +2 -2
  11. package/dist/components/ui/button.d.ts +1 -1
  12. package/dist/components/ui/calendar.d.ts +1 -1
  13. package/dist/components/ui/collapsible.d.ts +1 -1
  14. package/dist/components/ui/dialog.d.ts +4 -4
  15. package/dist/components/ui/popover.d.ts +2 -2
  16. package/dist/components/ui/skeleton.d.ts +1 -1
  17. package/dist/components/ui/time-range-picker.d.ts +1 -1
  18. package/dist/components/ui/tool-ui.d.ts +7 -7
  19. package/dist/components/ui/tooltip.d.ts +2 -2
  20. package/dist/contexts/ConnectionStatusContext.d.ts +1 -1
  21. package/dist/elements.cjs +1 -1
  22. package/dist/elements.js +2 -2
  23. package/dist/hooks/useDensity.d.ts +73 -73
  24. package/dist/hooks/useMCPTools.d.ts +1 -1
  25. package/dist/hooks/useRadius.d.ts +1 -1
  26. package/dist/{index-BpJstUh1.cjs → index-C4bFBGfl.cjs} +4 -4
  27. package/dist/{index-BpJstUh1.cjs.map → index-C4bFBGfl.cjs.map} +1 -1
  28. package/dist/{index-CUitXazZ.js → index-D93pV0_o.js} +55 -55
  29. package/dist/{index-CUitXazZ.js.map → index-D93pV0_o.js.map} +1 -1
  30. package/dist/{index-D0bAYNQy.js → index-DuCQRbcQ.js} +279 -265
  31. package/dist/index-DuCQRbcQ.js.map +1 -0
  32. package/dist/{index-KSX4Qjip.cjs → index-y_PNN5vK.cjs} +10 -10
  33. package/dist/index-y_PNN5vK.cjs.map +1 -0
  34. package/dist/lib/cassette.d.ts +4 -4
  35. package/dist/lib/errorTracking.d.ts +1 -1
  36. package/dist/lib/messageConverter.d.ts +1 -1
  37. package/dist/lib/models.d.ts +1 -1
  38. package/dist/plugins/chart/ui/bar-chart.d.ts +1 -1
  39. package/dist/plugins/generative-ui/ui/accordion-wrapper.d.ts +2 -2
  40. package/dist/plugins/generative-ui/ui/accordion.d.ts +1 -1
  41. package/dist/plugins/generative-ui/ui/action-button.d.ts +2 -2
  42. package/dist/plugins/generative-ui/ui/alert-wrapper.d.ts +1 -1
  43. package/dist/plugins/generative-ui/ui/alert.d.ts +4 -4
  44. package/dist/plugins/generative-ui/ui/avatar.d.ts +5 -5
  45. package/dist/plugins/generative-ui/ui/badge.d.ts +2 -2
  46. package/dist/plugins/generative-ui/ui/button-wrapper.d.ts +2 -2
  47. package/dist/plugins/generative-ui/ui/button.d.ts +2 -2
  48. package/dist/plugins/generative-ui/ui/card-wrapper.d.ts +2 -2
  49. package/dist/plugins/generative-ui/ui/card.d.ts +8 -8
  50. package/dist/plugins/generative-ui/ui/checkbox.d.ts +1 -1
  51. package/dist/plugins/generative-ui/ui/data-table.d.ts +2 -2
  52. package/dist/plugins/generative-ui/ui/dialog.d.ts +3 -3
  53. package/dist/plugins/generative-ui/ui/dropdown-menu.d.ts +3 -3
  54. package/dist/plugins/generative-ui/ui/grid.d.ts +3 -3
  55. package/dist/plugins/generative-ui/ui/input-wrapper.d.ts +1 -1
  56. package/dist/plugins/generative-ui/ui/input.d.ts +2 -2
  57. package/dist/plugins/generative-ui/ui/label.d.ts +1 -1
  58. package/dist/plugins/generative-ui/ui/metric.d.ts +3 -3
  59. package/dist/plugins/generative-ui/ui/pagination.d.ts +6 -6
  60. package/dist/plugins/generative-ui/ui/popover.d.ts +4 -4
  61. package/dist/plugins/generative-ui/ui/progress.d.ts +2 -2
  62. package/dist/plugins/generative-ui/ui/radio-group.d.ts +1 -1
  63. package/dist/plugins/generative-ui/ui/select.d.ts +2 -2
  64. package/dist/plugins/generative-ui/ui/separator.d.ts +1 -1
  65. package/dist/plugins/generative-ui/ui/skeleton.d.ts +1 -1
  66. package/dist/plugins/generative-ui/ui/stack.d.ts +6 -6
  67. package/dist/plugins/generative-ui/ui/switch.d.ts +2 -2
  68. package/dist/plugins/generative-ui/ui/table.d.ts +9 -9
  69. package/dist/plugins/generative-ui/ui/tabs-wrapper.d.ts +1 -1
  70. package/dist/plugins/generative-ui/ui/tabs.d.ts +1 -1
  71. package/dist/plugins/generative-ui/ui/text.d.ts +3 -3
  72. package/dist/plugins/generative-ui/ui/textarea.d.ts +2 -2
  73. package/dist/plugins/generative-ui/ui/tooltip.d.ts +1 -1
  74. package/dist/plugins.cjs +1 -1
  75. package/dist/plugins.js +1 -1
  76. package/dist/{profiler-BFkhZRxj.js → profiler-FpBY9eRv.js} +2 -2
  77. package/dist/{profiler-BFkhZRxj.js.map → profiler-FpBY9eRv.js.map} +1 -1
  78. package/dist/{profiler-CyzxBxVz.cjs → profiler-_mthyjvo.cjs} +2 -2
  79. package/dist/{profiler-CyzxBxVz.cjs.map → profiler-_mthyjvo.cjs.map} +1 -1
  80. package/dist/react-shim.js +1 -1
  81. package/dist/server/express.cjs.map +1 -1
  82. package/dist/server/express.js.map +1 -1
  83. package/dist/{startRecording-Dq92sEHf.cjs → startRecording-NJcpiHw-.cjs} +2 -2
  84. package/dist/{startRecording-Dq92sEHf.cjs.map → startRecording-NJcpiHw-.cjs.map} +1 -1
  85. package/dist/{startRecording-C-PPAs_Z.js → startRecording-r5MXQ2Dm.js} +2 -2
  86. package/dist/{startRecording-C-PPAs_Z.js.map → startRecording-r5MXQ2Dm.js.map} +1 -1
  87. package/dist/types/index.d.ts +2 -2
  88. package/package.json +1 -5
  89. package/src/compat-plugin.ts +14 -14
  90. package/src/compat-shims.ts +33 -31
  91. package/src/compat.test.ts +48 -48
  92. package/src/compat.ts +6 -6
  93. package/src/components/Chat/index.tsx +17 -17
  94. package/src/components/Chat/stories/Charts.stories.tsx +98 -98
  95. package/src/components/Chat/stories/Composer.stories.tsx +15 -15
  96. package/src/components/Chat/stories/ConnectionConfiguration.stories.tsx +44 -44
  97. package/src/components/Chat/stories/CustomComponents.stories.tsx +17 -17
  98. package/src/components/Chat/stories/Density.stories.tsx +20 -20
  99. package/src/components/Chat/stories/ErrorBoundary.stories.tsx +47 -47
  100. package/src/components/Chat/stories/FrontendTools.stories.tsx +39 -39
  101. package/src/components/Chat/stories/GenerativeUI.stories.tsx +48 -48
  102. package/src/components/Chat/stories/MessageFeedback.stories.tsx +52 -52
  103. package/src/components/Chat/stories/Modal.stories.tsx +28 -28
  104. package/src/components/Chat/stories/Model.stories.tsx +11 -11
  105. package/src/components/Chat/stories/Radius.stories.tsx +20 -20
  106. package/src/components/Chat/stories/Sidecar.stories.tsx +13 -13
  107. package/src/components/Chat/stories/StyleIsolation.stories.tsx +11 -11
  108. package/src/components/Chat/stories/Theme.stories.tsx +25 -25
  109. package/src/components/Chat/stories/Thread.stories.tsx +25 -25
  110. package/src/components/Chat/stories/ToolApproval.stories.tsx +55 -55
  111. package/src/components/Chat/stories/ToolMentions.stories.tsx +17 -17
  112. package/src/components/Chat/stories/Tools.stories.tsx +88 -88
  113. package/src/components/Chat/stories/Variants.stories.tsx +32 -32
  114. package/src/components/Chat/stories/Welcome.stories.tsx +14 -14
  115. package/src/components/ChatHistory.tsx +7 -7
  116. package/src/components/FrontendTools/index.tsx +5 -5
  117. package/src/components/Replay.stories.tsx +157 -157
  118. package/src/components/Replay.tsx +76 -73
  119. package/src/components/ShadowRoot.tsx +40 -40
  120. package/src/components/ShareButton/index.tsx +32 -32
  121. package/src/components/assistant-ui/assistant-modal.tsx +92 -87
  122. package/src/components/assistant-ui/assistant-sidecar.tsx +35 -35
  123. package/src/components/assistant-ui/attachment.tsx +80 -80
  124. package/src/components/assistant-ui/connection-status-indicator.tsx +33 -33
  125. package/src/components/assistant-ui/error-boundary.tsx +34 -34
  126. package/src/components/assistant-ui/follow-on-suggestions.tsx +26 -26
  127. package/src/components/assistant-ui/markdown-text.tsx +69 -69
  128. package/src/components/assistant-ui/mentioned-tools-badges.tsx +38 -38
  129. package/src/components/assistant-ui/message-feedback.tsx +57 -50
  130. package/src/components/assistant-ui/reasoning.tsx +83 -83
  131. package/src/components/assistant-ui/thread-list.tsx +45 -45
  132. package/src/components/assistant-ui/thread.tsx +278 -278
  133. package/src/components/assistant-ui/tool-fallback.tsx +37 -37
  134. package/src/components/assistant-ui/tool-group.tsx +26 -26
  135. package/src/components/assistant-ui/tool-mention-autocomplete.tsx +122 -122
  136. package/src/components/assistant-ui/tooltip-icon-button.tsx +18 -18
  137. package/src/components/ui/avatar.tsx +12 -12
  138. package/src/components/ui/button.tsx +12 -12
  139. package/src/components/ui/buttonVariants.ts +17 -17
  140. package/src/components/ui/calendar.tsx +106 -106
  141. package/src/components/ui/charts.stories.tsx +56 -56
  142. package/src/components/ui/collapsible.tsx +5 -5
  143. package/src/components/ui/dialog.tsx +30 -30
  144. package/src/components/ui/generative-ui.stories.tsx +200 -200
  145. package/src/components/ui/generative-ui.tsx +26 -26
  146. package/src/components/ui/popover.tsx +14 -14
  147. package/src/components/ui/skeleton.tsx +5 -5
  148. package/src/components/ui/time-range-picker.stories.tsx +80 -80
  149. package/src/components/ui/time-range-picker.tsx +245 -244
  150. package/src/components/ui/tool-ui.stories.tsx +37 -37
  151. package/src/components/ui/tool-ui.tsx +221 -215
  152. package/src/components/ui/tooltip.tsx +15 -15
  153. package/src/constants/tailwind.ts +1 -1
  154. package/src/contexts/ChatIdContext.tsx +7 -7
  155. package/src/contexts/ConnectionStatusContext.tsx +64 -64
  156. package/src/contexts/ElementsProvider.tsx +214 -213
  157. package/src/contexts/ReplayContext.ts +3 -3
  158. package/src/contexts/ToolApprovalContext.tsx +54 -54
  159. package/src/contexts/ToolExecutionContext.tsx +34 -34
  160. package/src/contexts/contexts.ts +7 -7
  161. package/src/contexts/portal-container-context.ts +2 -2
  162. package/src/contexts/portal-container.tsx +7 -7
  163. package/src/embedded.ts +1 -1
  164. package/src/global.css +25 -25
  165. package/src/hooks/useAuth.ts +72 -72
  166. package/src/hooks/useDensity.ts +79 -79
  167. package/src/hooks/useElements.ts +6 -6
  168. package/src/hooks/useExpanded.ts +12 -12
  169. package/src/hooks/useFollowOnSuggestions.ts +83 -83
  170. package/src/hooks/useGramThreadListAdapter.tsx +99 -99
  171. package/src/hooks/useMCPTools.ts +47 -47
  172. package/src/hooks/useModel.ts +14 -14
  173. package/src/hooks/usePluginComponents.ts +11 -11
  174. package/src/hooks/usePortalContainer.ts +5 -5
  175. package/src/hooks/useRadius.ts +23 -23
  176. package/src/hooks/useRecordCassette.ts +34 -34
  177. package/src/hooks/useSession.ts +11 -11
  178. package/src/hooks/useThemeProps.ts +13 -13
  179. package/src/hooks/useThreadId.ts +4 -4
  180. package/src/hooks/useToolApproval.ts +7 -7
  181. package/src/hooks/useToolMentions.ts +40 -40
  182. package/src/index.ts +26 -26
  183. package/src/lib/api.test.ts +61 -61
  184. package/src/lib/api.ts +4 -3
  185. package/src/lib/auth.ts +13 -13
  186. package/src/lib/cassette.ts +84 -84
  187. package/src/lib/easing.ts +1 -1
  188. package/src/lib/errorTracking.config.ts +5 -5
  189. package/src/lib/errorTracking.ts +29 -29
  190. package/src/lib/generative-ui.ts +7 -7
  191. package/src/lib/humanize.ts +3 -3
  192. package/src/lib/messageConverter.test.ts +130 -127
  193. package/src/lib/messageConverter.ts +196 -196
  194. package/src/lib/models.ts +21 -20
  195. package/src/lib/token.test.ts +56 -56
  196. package/src/lib/token.ts +14 -14
  197. package/src/lib/tool-mentions.ts +45 -45
  198. package/src/lib/tools.ts +66 -62
  199. package/src/lib/utils.ts +5 -5
  200. package/src/lib.d.ts +1 -1
  201. package/src/plugins/README.md +5 -5
  202. package/src/plugins/chart/catalog.ts +18 -18
  203. package/src/plugins/chart/chart.test.ts +31 -31
  204. package/src/plugins/chart/component.tsx +34 -34
  205. package/src/plugins/chart/index.ts +4 -4
  206. package/src/plugins/chart/ui/area-chart.tsx +42 -42
  207. package/src/plugins/chart/ui/bar-chart.tsx +46 -46
  208. package/src/plugins/chart/ui/donut-chart.tsx +48 -48
  209. package/src/plugins/chart/ui/index.ts +7 -7
  210. package/src/plugins/chart/ui/line-chart.tsx +43 -43
  211. package/src/plugins/chart/ui/pie-chart.tsx +44 -44
  212. package/src/plugins/chart/ui/radar-chart.tsx +33 -33
  213. package/src/plugins/chart/ui/scatter-chart.tsx +43 -43
  214. package/src/plugins/components/MacOSWindowFrame.tsx +15 -15
  215. package/src/plugins/components/PluginLoadingState.tsx +10 -10
  216. package/src/plugins/components/index.ts +1 -1
  217. package/src/plugins/generative-ui/catalog.ts +54 -54
  218. package/src/plugins/generative-ui/component.tsx +85 -85
  219. package/src/plugins/generative-ui/index.ts +4 -4
  220. package/src/plugins/generative-ui/ui/accordion-wrapper.tsx +16 -16
  221. package/src/plugins/generative-ui/ui/accordion.tsx +16 -16
  222. package/src/plugins/generative-ui/ui/action-button.tsx +28 -28
  223. package/src/plugins/generative-ui/ui/alert-wrapper.tsx +8 -8
  224. package/src/plugins/generative-ui/ui/alert.tsx +20 -20
  225. package/src/plugins/generative-ui/ui/avatar-wrapper.tsx +7 -7
  226. package/src/plugins/generative-ui/ui/avatar.tsx +30 -30
  227. package/src/plugins/generative-ui/ui/badge.tsx +22 -22
  228. package/src/plugins/generative-ui/ui/button-wrapper.tsx +12 -12
  229. package/src/plugins/generative-ui/ui/button.tsx +28 -28
  230. package/src/plugins/generative-ui/ui/card-wrapper.tsx +8 -8
  231. package/src/plugins/generative-ui/ui/card.tsx +27 -27
  232. package/src/plugins/generative-ui/ui/checkbox-wrapper.tsx +9 -9
  233. package/src/plugins/generative-ui/ui/checkbox.tsx +9 -9
  234. package/src/plugins/generative-ui/ui/data-table.tsx +8 -8
  235. package/src/plugins/generative-ui/ui/dialog.tsx +31 -31
  236. package/src/plugins/generative-ui/ui/dropdown-menu.tsx +44 -44
  237. package/src/plugins/generative-ui/ui/grid.tsx +12 -12
  238. package/src/plugins/generative-ui/ui/index.ts +40 -40
  239. package/src/plugins/generative-ui/ui/input-wrapper.tsx +11 -11
  240. package/src/plugins/generative-ui/ui/input.tsx +9 -9
  241. package/src/plugins/generative-ui/ui/label.tsx +8 -8
  242. package/src/plugins/generative-ui/ui/list.tsx +11 -11
  243. package/src/plugins/generative-ui/ui/metric.tsx +23 -23
  244. package/src/plugins/generative-ui/ui/pagination.tsx +28 -28
  245. package/src/plugins/generative-ui/ui/popover.tsx +21 -21
  246. package/src/plugins/generative-ui/ui/progress.tsx +13 -13
  247. package/src/plugins/generative-ui/ui/radio-group.tsx +12 -12
  248. package/src/plugins/generative-ui/ui/select-wrapper.tsx +7 -7
  249. package/src/plugins/generative-ui/ui/select.tsx +37 -37
  250. package/src/plugins/generative-ui/ui/separator.tsx +9 -9
  251. package/src/plugins/generative-ui/ui/skeleton-wrapper.tsx +10 -10
  252. package/src/plugins/generative-ui/ui/skeleton.tsx +5 -5
  253. package/src/plugins/generative-ui/ui/stack.tsx +28 -28
  254. package/src/plugins/generative-ui/ui/switch.tsx +11 -11
  255. package/src/plugins/generative-ui/ui/table.tsx +32 -32
  256. package/src/plugins/generative-ui/ui/tabs-wrapper.tsx +11 -11
  257. package/src/plugins/generative-ui/ui/tabs.tsx +26 -26
  258. package/src/plugins/generative-ui/ui/text.tsx +12 -12
  259. package/src/plugins/generative-ui/ui/textarea.tsx +7 -7
  260. package/src/plugins/generative-ui/ui/tooltip.tsx +12 -12
  261. package/src/plugins/index.ts +7 -7
  262. package/src/react-shim.ts +6 -6
  263. package/src/server/bun.ts +12 -12
  264. package/src/server/core.ts +25 -25
  265. package/src/server/express.ts +17 -15
  266. package/src/server/fastify.ts +14 -14
  267. package/src/server/hono.ts +9 -9
  268. package/src/server/nextjs.ts +12 -12
  269. package/src/server/tanstack-start.ts +12 -12
  270. package/src/server.ts +27 -27
  271. package/src/storybook.d.ts +4 -4
  272. package/src/types/index.ts +122 -122
  273. package/src/types/plugins.ts +7 -7
  274. package/src/vite-env.d.ts +12 -12
  275. package/dist/compat-shims-BPJ7Q68c.js.map +0 -1
  276. package/dist/index-D0bAYNQy.js.map +0 -1
  277. package/dist/index-KSX4Qjip.cjs.map +0 -1
@@ -1,81 +1,81 @@
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'
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: 'Chat/Tools',
10
+ title: "Chat/Tools",
11
11
  component: Chat,
12
12
  parameters: {
13
- layout: 'fullscreen',
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: 'Loading...',
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 === 'string' ? JSON.parse(result) : 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('ecommerce_api_add_to_cart')
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('ecommerce_api_add_to_cart', {
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('[ProductCard] Tool failed:', toolResult.error)
71
+ console.error("[ProductCard] Tool failed:", toolResult.error);
72
72
  }
73
73
  } catch (err) {
74
- console.error('[ProductCard] Exception:', err)
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
- ? 'text-yellow-400'
124
- : 'text-slate-300'
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
- ? 'bg-green-500'
148
+ ? "bg-green-500"
149
149
  : isLoading
150
- ? 'bg-indigo-400'
151
- : 'bg-indigo-600 hover:bg-indigo-700'
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
- ? '✓ Added'
155
+ ? "✓ Added"
156
156
  : isLoading
157
- ? 'Adding...'
158
- : 'Add to Cart'}
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: 'standalone',
171
+ variant: "standalone",
172
172
  welcome: {
173
173
  suggestions: [
174
174
  {
175
- title: 'Get product details',
176
- label: 'View a product',
177
- prompt: 'List products and then show me details for the first one',
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: 'standalone',
201
+ variant: "standalone",
202
202
  welcome: {
203
- title: 'Data Explorer',
204
- subtitle: 'Ask questions about your data',
203
+ title: "Data Explorer",
204
+ subtitle: "Ask questions about your data",
205
205
  suggestions: [
206
206
  {
207
- title: 'Sales metrics',
208
- label: 'This month',
207
+ title: "Sales metrics",
208
+ label: "This month",
209
209
  prompt:
210
- 'What are our sales numbers this month? Revenue is $125,000, conversion rate is 3.2%, and we have 1,420 orders.',
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: 'Team members',
214
- label: 'Directory',
213
+ title: "Team members",
214
+ label: "Directory",
215
215
  prompt:
216
- 'List our team members: Alice (alice@co.com, Admin, Active), Bob (bob@co.com, Editor, Active), Charlie (charlie@co.com, Viewer, Pending)',
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: 'Project status',
220
- label: 'Sprint progress',
219
+ title: "Project status",
220
+ label: "Sprint progress",
221
221
  prompt:
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.',
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: 'Website analytics',
226
- label: 'Last 7 days',
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: 'Approve a pending request',
239
+ description: "Approve a pending request",
240
240
  parameters: z.object({
241
- id: z.number().describe('The request ID to approve'),
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
- 'approve_request'
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: 'Reject a pending request',
257
+ description: "Reject a pending request",
258
258
  parameters: z.object({
259
- id: z.number().describe('The request ID to reject'),
260
- reason: z.string().optional().describe('Reason for rejection'),
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
- 'reject_request'
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: 'standalone',
285
+ variant: "standalone",
286
286
  welcome: {
287
- title: 'Expense Approvals',
288
- subtitle: 'Review and process pending requests',
287
+ title: "Expense Approvals",
288
+ subtitle: "Review and process pending requests",
289
289
  suggestions: [
290
290
  {
291
- title: 'Pending expenses',
292
- label: 'Needs review',
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 '@storybook/react-vite'
3
- import { ThreadList } from '@/components/assistant-ui/thread-list'
4
- import { ROOT_SELECTOR } from '@/constants/tailwind'
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: 'Chat/Variants',
7
+ title: "Chat/Variants",
8
8
  component: Chat,
9
9
  parameters: {
10
- layout: 'fullscreen',
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: 'standalone' } },
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: 'Standalone with History',
39
+ name: "Standalone with History",
40
40
  args: {},
41
41
  render: () => (
42
- <div className="bg-background flex h-10/12 max-h-[800px] w-1/2 flex-row gap-4 overflow-hidden rounded-lg border shadow-xl sm:w-3/4">
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: 'standalone',
60
+ variant: "standalone",
61
61
  history: { enabled: true, showThreadList: true },
62
62
  model: { showModelPicker: true },
63
63
  tools: {
64
- toolsRequiringApproval: ['ecommerce_api_create_order'],
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: 'sidecar' } },
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: 'widget',
94
+ variant: "widget",
95
95
  modal: {
96
96
  defaultOpen: true,
97
97
  expandable: true,
98
98
  dimensions: {
99
- default: { width: '700px', height: '600px', maxHeight: '100vh' },
100
- expanded: { width: '90vw', height: '90vh' },
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: 'sidecar',
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 '@storybook/react-vite'
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: 'Chat/Welcome',
5
+ title: "Chat/Welcome",
6
6
  component: Chat,
7
7
  parameters: {
8
- layout: 'fullscreen',
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: 'standalone',
20
+ variant: "standalone",
21
21
  welcome: {
22
- title: 'Hello there!',
22
+ title: "Hello there!",
23
23
  subtitle: "How can I serve your organization's needs today?",
24
24
  suggestions: [
25
25
  {
26
- title: 'Write a SQL query',
27
- label: 'to find top customers',
28
- prompt: 'Write a SQL query to find top customers',
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
- 'use client'
1
+ "use client";
2
2
 
3
- import { ThreadList } from '@/components/assistant-ui/thread-list'
4
- import { ShadowRoot } from '@/components/ShadowRoot'
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: 'inherit', width: 'inherit' }}>
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 '@assistant-ui/react'
2
- import type { FrontendTools } from '@/types'
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
  }