@gram-ai/elements 1.27.4 → 1.27.6

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 (278) 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.css +1 -1
  23. package/dist/elements.js +2 -2
  24. package/dist/hooks/useDensity.d.ts +73 -73
  25. package/dist/hooks/useMCPTools.d.ts +1 -1
  26. package/dist/hooks/useRadius.d.ts +1 -1
  27. package/dist/{index-KSX4Qjip.cjs → index-A17b62wR.cjs} +10 -10
  28. package/dist/index-A17b62wR.cjs.map +1 -0
  29. package/dist/{index-BpJstUh1.cjs → index-C4bFBGfl.cjs} +4 -4
  30. package/dist/{index-BpJstUh1.cjs.map → index-C4bFBGfl.cjs.map} +1 -1
  31. package/dist/{index-CUitXazZ.js → index-D93pV0_o.js} +55 -55
  32. package/dist/{index-CUitXazZ.js.map → index-D93pV0_o.js.map} +1 -1
  33. package/dist/{index-D0bAYNQy.js → index-Dm2wLFTN.js} +304 -282
  34. package/dist/index-Dm2wLFTN.js.map +1 -0
  35. package/dist/lib/cassette.d.ts +4 -4
  36. package/dist/lib/errorTracking.d.ts +1 -1
  37. package/dist/lib/messageConverter.d.ts +1 -1
  38. package/dist/lib/models.d.ts +1 -1
  39. package/dist/plugins/chart/ui/bar-chart.d.ts +1 -1
  40. package/dist/plugins/generative-ui/ui/accordion-wrapper.d.ts +2 -2
  41. package/dist/plugins/generative-ui/ui/accordion.d.ts +1 -1
  42. package/dist/plugins/generative-ui/ui/action-button.d.ts +2 -2
  43. package/dist/plugins/generative-ui/ui/alert-wrapper.d.ts +1 -1
  44. package/dist/plugins/generative-ui/ui/alert.d.ts +4 -4
  45. package/dist/plugins/generative-ui/ui/avatar.d.ts +5 -5
  46. package/dist/plugins/generative-ui/ui/badge.d.ts +2 -2
  47. package/dist/plugins/generative-ui/ui/button-wrapper.d.ts +2 -2
  48. package/dist/plugins/generative-ui/ui/button.d.ts +2 -2
  49. package/dist/plugins/generative-ui/ui/card-wrapper.d.ts +2 -2
  50. package/dist/plugins/generative-ui/ui/card.d.ts +8 -8
  51. package/dist/plugins/generative-ui/ui/checkbox.d.ts +1 -1
  52. package/dist/plugins/generative-ui/ui/data-table.d.ts +2 -2
  53. package/dist/plugins/generative-ui/ui/dialog.d.ts +3 -3
  54. package/dist/plugins/generative-ui/ui/dropdown-menu.d.ts +3 -3
  55. package/dist/plugins/generative-ui/ui/grid.d.ts +3 -3
  56. package/dist/plugins/generative-ui/ui/input-wrapper.d.ts +1 -1
  57. package/dist/plugins/generative-ui/ui/input.d.ts +2 -2
  58. package/dist/plugins/generative-ui/ui/label.d.ts +1 -1
  59. package/dist/plugins/generative-ui/ui/metric.d.ts +3 -3
  60. package/dist/plugins/generative-ui/ui/pagination.d.ts +6 -6
  61. package/dist/plugins/generative-ui/ui/popover.d.ts +4 -4
  62. package/dist/plugins/generative-ui/ui/progress.d.ts +2 -2
  63. package/dist/plugins/generative-ui/ui/radio-group.d.ts +1 -1
  64. package/dist/plugins/generative-ui/ui/select.d.ts +2 -2
  65. package/dist/plugins/generative-ui/ui/separator.d.ts +1 -1
  66. package/dist/plugins/generative-ui/ui/skeleton.d.ts +1 -1
  67. package/dist/plugins/generative-ui/ui/stack.d.ts +6 -6
  68. package/dist/plugins/generative-ui/ui/switch.d.ts +2 -2
  69. package/dist/plugins/generative-ui/ui/table.d.ts +9 -9
  70. package/dist/plugins/generative-ui/ui/tabs-wrapper.d.ts +1 -1
  71. package/dist/plugins/generative-ui/ui/tabs.d.ts +1 -1
  72. package/dist/plugins/generative-ui/ui/text.d.ts +3 -3
  73. package/dist/plugins/generative-ui/ui/textarea.d.ts +2 -2
  74. package/dist/plugins/generative-ui/ui/tooltip.d.ts +1 -1
  75. package/dist/plugins.cjs +1 -1
  76. package/dist/plugins.js +1 -1
  77. package/dist/{profiler-CyzxBxVz.cjs → profiler-Cbbf4eEX.cjs} +2 -2
  78. package/dist/{profiler-CyzxBxVz.cjs.map → profiler-Cbbf4eEX.cjs.map} +1 -1
  79. package/dist/{profiler-BFkhZRxj.js → profiler-mca4IXaY.js} +2 -2
  80. package/dist/{profiler-BFkhZRxj.js.map → profiler-mca4IXaY.js.map} +1 -1
  81. package/dist/react-shim.js +1 -1
  82. package/dist/server/express.cjs.map +1 -1
  83. package/dist/server/express.js.map +1 -1
  84. package/dist/{startRecording-C-PPAs_Z.js → startRecording-BCafdS7B.js} +2 -2
  85. package/dist/{startRecording-C-PPAs_Z.js.map → startRecording-BCafdS7B.js.map} +1 -1
  86. package/dist/{startRecording-Dq92sEHf.cjs → startRecording-Eb5f7wqP.cjs} +2 -2
  87. package/dist/{startRecording-Dq92sEHf.cjs.map → startRecording-Eb5f7wqP.cjs.map} +1 -1
  88. package/dist/types/index.d.ts +4 -4
  89. package/package.json +1 -5
  90. package/src/compat-plugin.ts +14 -14
  91. package/src/compat-shims.ts +33 -31
  92. package/src/compat.test.ts +48 -48
  93. package/src/compat.ts +6 -6
  94. package/src/components/Chat/index.tsx +17 -17
  95. package/src/components/Chat/stories/Charts.stories.tsx +98 -98
  96. package/src/components/Chat/stories/Composer.stories.tsx +15 -15
  97. package/src/components/Chat/stories/ConnectionConfiguration.stories.tsx +44 -44
  98. package/src/components/Chat/stories/CustomComponents.stories.tsx +17 -17
  99. package/src/components/Chat/stories/Density.stories.tsx +20 -20
  100. package/src/components/Chat/stories/ErrorBoundary.stories.tsx +47 -47
  101. package/src/components/Chat/stories/FrontendTools.stories.tsx +39 -39
  102. package/src/components/Chat/stories/GenerativeUI.stories.tsx +48 -48
  103. package/src/components/Chat/stories/MessageFeedback.stories.tsx +52 -52
  104. package/src/components/Chat/stories/Modal.stories.tsx +28 -28
  105. package/src/components/Chat/stories/Model.stories.tsx +11 -11
  106. package/src/components/Chat/stories/Radius.stories.tsx +20 -20
  107. package/src/components/Chat/stories/Sidecar.stories.tsx +13 -13
  108. package/src/components/Chat/stories/StyleIsolation.stories.tsx +11 -11
  109. package/src/components/Chat/stories/Theme.stories.tsx +25 -25
  110. package/src/components/Chat/stories/Thread.stories.tsx +25 -25
  111. package/src/components/Chat/stories/ToolApproval.stories.tsx +55 -55
  112. package/src/components/Chat/stories/ToolMentions.stories.tsx +17 -17
  113. package/src/components/Chat/stories/Tools.stories.tsx +88 -88
  114. package/src/components/Chat/stories/Variants.stories.tsx +32 -32
  115. package/src/components/Chat/stories/Welcome.stories.tsx +14 -14
  116. package/src/components/ChatHistory.tsx +7 -7
  117. package/src/components/FrontendTools/index.tsx +5 -5
  118. package/src/components/Replay.stories.tsx +157 -157
  119. package/src/components/Replay.tsx +76 -73
  120. package/src/components/ShadowRoot.tsx +40 -40
  121. package/src/components/ShareButton/index.tsx +32 -32
  122. package/src/components/assistant-ui/assistant-modal.tsx +92 -87
  123. package/src/components/assistant-ui/assistant-sidecar.tsx +35 -35
  124. package/src/components/assistant-ui/attachment.tsx +80 -80
  125. package/src/components/assistant-ui/connection-status-indicator.tsx +33 -33
  126. package/src/components/assistant-ui/error-boundary.tsx +34 -34
  127. package/src/components/assistant-ui/follow-on-suggestions.tsx +26 -26
  128. package/src/components/assistant-ui/markdown-text.tsx +69 -69
  129. package/src/components/assistant-ui/mentioned-tools-badges.tsx +38 -38
  130. package/src/components/assistant-ui/message-feedback.tsx +57 -50
  131. package/src/components/assistant-ui/reasoning.tsx +83 -83
  132. package/src/components/assistant-ui/thread-list.tsx +45 -45
  133. package/src/components/assistant-ui/thread.tsx +278 -278
  134. package/src/components/assistant-ui/tool-fallback.tsx +37 -37
  135. package/src/components/assistant-ui/tool-group.tsx +26 -26
  136. package/src/components/assistant-ui/tool-mention-autocomplete.tsx +122 -122
  137. package/src/components/assistant-ui/tooltip-icon-button.tsx +18 -18
  138. package/src/components/ui/avatar.tsx +12 -12
  139. package/src/components/ui/button.tsx +12 -12
  140. package/src/components/ui/buttonVariants.ts +17 -17
  141. package/src/components/ui/calendar.tsx +106 -106
  142. package/src/components/ui/charts.stories.tsx +56 -56
  143. package/src/components/ui/collapsible.tsx +5 -5
  144. package/src/components/ui/dialog.tsx +30 -30
  145. package/src/components/ui/generative-ui.stories.tsx +200 -200
  146. package/src/components/ui/generative-ui.tsx +26 -26
  147. package/src/components/ui/popover.tsx +14 -14
  148. package/src/components/ui/skeleton.tsx +5 -5
  149. package/src/components/ui/time-range-picker.stories.tsx +80 -80
  150. package/src/components/ui/time-range-picker.tsx +248 -246
  151. package/src/components/ui/tool-ui.stories.tsx +37 -37
  152. package/src/components/ui/tool-ui.tsx +221 -215
  153. package/src/components/ui/tooltip.tsx +15 -15
  154. package/src/constants/tailwind.ts +1 -1
  155. package/src/contexts/ChatIdContext.tsx +7 -7
  156. package/src/contexts/ConnectionStatusContext.tsx +64 -64
  157. package/src/contexts/ElementsProvider.tsx +214 -213
  158. package/src/contexts/ReplayContext.ts +3 -3
  159. package/src/contexts/ToolApprovalContext.tsx +54 -54
  160. package/src/contexts/ToolExecutionContext.tsx +34 -34
  161. package/src/contexts/contexts.ts +7 -7
  162. package/src/contexts/portal-container-context.ts +2 -2
  163. package/src/contexts/portal-container.tsx +7 -7
  164. package/src/embedded.ts +1 -1
  165. package/src/global.css +25 -25
  166. package/src/hooks/useAuth.ts +72 -72
  167. package/src/hooks/useDensity.ts +79 -79
  168. package/src/hooks/useElements.ts +6 -6
  169. package/src/hooks/useExpanded.ts +12 -12
  170. package/src/hooks/useFollowOnSuggestions.ts +83 -83
  171. package/src/hooks/useGramThreadListAdapter.tsx +99 -99
  172. package/src/hooks/useMCPTools.ts +47 -47
  173. package/src/hooks/useModel.ts +14 -14
  174. package/src/hooks/usePluginComponents.ts +11 -11
  175. package/src/hooks/usePortalContainer.ts +5 -5
  176. package/src/hooks/useRadius.ts +23 -23
  177. package/src/hooks/useRecordCassette.ts +34 -34
  178. package/src/hooks/useSession.ts +11 -11
  179. package/src/hooks/useThemeProps.ts +13 -13
  180. package/src/hooks/useThreadId.ts +4 -4
  181. package/src/hooks/useToolApproval.ts +7 -7
  182. package/src/hooks/useToolMentions.ts +40 -40
  183. package/src/index.ts +26 -26
  184. package/src/lib/api.test.ts +61 -61
  185. package/src/lib/api.ts +4 -3
  186. package/src/lib/auth.ts +13 -13
  187. package/src/lib/cassette.ts +84 -84
  188. package/src/lib/easing.ts +1 -1
  189. package/src/lib/errorTracking.config.ts +5 -5
  190. package/src/lib/errorTracking.ts +29 -29
  191. package/src/lib/generative-ui.ts +7 -7
  192. package/src/lib/humanize.ts +3 -3
  193. package/src/lib/messageConverter.test.ts +130 -127
  194. package/src/lib/messageConverter.ts +196 -196
  195. package/src/lib/models.ts +28 -20
  196. package/src/lib/token.test.ts +56 -56
  197. package/src/lib/token.ts +14 -14
  198. package/src/lib/tool-mentions.ts +45 -45
  199. package/src/lib/tools.ts +66 -62
  200. package/src/lib/utils.ts +5 -5
  201. package/src/lib.d.ts +1 -1
  202. package/src/plugins/README.md +5 -5
  203. package/src/plugins/chart/catalog.ts +18 -18
  204. package/src/plugins/chart/chart.test.ts +31 -31
  205. package/src/plugins/chart/component.tsx +34 -34
  206. package/src/plugins/chart/index.ts +4 -4
  207. package/src/plugins/chart/ui/area-chart.tsx +42 -42
  208. package/src/plugins/chart/ui/bar-chart.tsx +46 -46
  209. package/src/plugins/chart/ui/donut-chart.tsx +48 -48
  210. package/src/plugins/chart/ui/index.ts +7 -7
  211. package/src/plugins/chart/ui/line-chart.tsx +43 -43
  212. package/src/plugins/chart/ui/pie-chart.tsx +44 -44
  213. package/src/plugins/chart/ui/radar-chart.tsx +33 -33
  214. package/src/plugins/chart/ui/scatter-chart.tsx +43 -43
  215. package/src/plugins/components/MacOSWindowFrame.tsx +15 -15
  216. package/src/plugins/components/PluginLoadingState.tsx +10 -10
  217. package/src/plugins/components/index.ts +1 -1
  218. package/src/plugins/generative-ui/catalog.ts +54 -54
  219. package/src/plugins/generative-ui/component.tsx +85 -85
  220. package/src/plugins/generative-ui/index.ts +4 -4
  221. package/src/plugins/generative-ui/ui/accordion-wrapper.tsx +16 -16
  222. package/src/plugins/generative-ui/ui/accordion.tsx +16 -16
  223. package/src/plugins/generative-ui/ui/action-button.tsx +28 -28
  224. package/src/plugins/generative-ui/ui/alert-wrapper.tsx +8 -8
  225. package/src/plugins/generative-ui/ui/alert.tsx +20 -20
  226. package/src/plugins/generative-ui/ui/avatar-wrapper.tsx +7 -7
  227. package/src/plugins/generative-ui/ui/avatar.tsx +30 -30
  228. package/src/plugins/generative-ui/ui/badge.tsx +22 -22
  229. package/src/plugins/generative-ui/ui/button-wrapper.tsx +12 -12
  230. package/src/plugins/generative-ui/ui/button.tsx +28 -28
  231. package/src/plugins/generative-ui/ui/card-wrapper.tsx +8 -8
  232. package/src/plugins/generative-ui/ui/card.tsx +27 -27
  233. package/src/plugins/generative-ui/ui/checkbox-wrapper.tsx +9 -9
  234. package/src/plugins/generative-ui/ui/checkbox.tsx +9 -9
  235. package/src/plugins/generative-ui/ui/data-table.tsx +8 -8
  236. package/src/plugins/generative-ui/ui/dialog.tsx +31 -31
  237. package/src/plugins/generative-ui/ui/dropdown-menu.tsx +44 -44
  238. package/src/plugins/generative-ui/ui/grid.tsx +12 -12
  239. package/src/plugins/generative-ui/ui/index.ts +40 -40
  240. package/src/plugins/generative-ui/ui/input-wrapper.tsx +11 -11
  241. package/src/plugins/generative-ui/ui/input.tsx +9 -9
  242. package/src/plugins/generative-ui/ui/label.tsx +8 -8
  243. package/src/plugins/generative-ui/ui/list.tsx +11 -11
  244. package/src/plugins/generative-ui/ui/metric.tsx +23 -23
  245. package/src/plugins/generative-ui/ui/pagination.tsx +28 -28
  246. package/src/plugins/generative-ui/ui/popover.tsx +21 -21
  247. package/src/plugins/generative-ui/ui/progress.tsx +13 -13
  248. package/src/plugins/generative-ui/ui/radio-group.tsx +12 -12
  249. package/src/plugins/generative-ui/ui/select-wrapper.tsx +7 -7
  250. package/src/plugins/generative-ui/ui/select.tsx +37 -37
  251. package/src/plugins/generative-ui/ui/separator.tsx +9 -9
  252. package/src/plugins/generative-ui/ui/skeleton-wrapper.tsx +10 -10
  253. package/src/plugins/generative-ui/ui/skeleton.tsx +5 -5
  254. package/src/plugins/generative-ui/ui/stack.tsx +28 -28
  255. package/src/plugins/generative-ui/ui/switch.tsx +11 -11
  256. package/src/plugins/generative-ui/ui/table.tsx +32 -32
  257. package/src/plugins/generative-ui/ui/tabs-wrapper.tsx +11 -11
  258. package/src/plugins/generative-ui/ui/tabs.tsx +26 -26
  259. package/src/plugins/generative-ui/ui/text.tsx +12 -12
  260. package/src/plugins/generative-ui/ui/textarea.tsx +7 -7
  261. package/src/plugins/generative-ui/ui/tooltip.tsx +12 -12
  262. package/src/plugins/index.ts +7 -7
  263. package/src/react-shim.ts +6 -6
  264. package/src/server/bun.ts +12 -12
  265. package/src/server/core.ts +25 -25
  266. package/src/server/express.ts +17 -15
  267. package/src/server/fastify.ts +14 -14
  268. package/src/server/hono.ts +9 -9
  269. package/src/server/nextjs.ts +12 -12
  270. package/src/server/tanstack-start.ts +12 -12
  271. package/src/server.ts +27 -27
  272. package/src/storybook.d.ts +4 -4
  273. package/src/types/index.ts +124 -124
  274. package/src/types/plugins.ts +7 -7
  275. package/src/vite-env.d.ts +12 -12
  276. package/dist/compat-shims-BPJ7Q68c.js.map +0 -1
  277. package/dist/index-D0bAYNQy.js.map +0 -1
  278. package/dist/index-KSX4Qjip.cjs.map +0 -1
@@ -1,7 +1,7 @@
1
- import { createContext, useContext } from 'react'
1
+ import { createContext, useContext } from "react";
2
2
 
3
- export const ReplayContext = createContext<{ isReplay: boolean } | null>(null)
3
+ export const ReplayContext = createContext<{ isReplay: boolean } | null>(null);
4
4
 
5
5
  export function useReplayContext() {
6
- return useContext(ReplayContext)
6
+ return useContext(ReplayContext);
7
7
  }
@@ -1,36 +1,36 @@
1
- import { useState, useCallback, type ReactNode } from 'react'
2
- import { ToolApprovalContext } from './contexts'
1
+ import { useState, useCallback, type ReactNode } from "react";
2
+ import { ToolApprovalContext } from "./contexts";
3
3
 
4
4
  interface PendingApproval {
5
- toolCallId: string
6
- toolName: string
7
- args: unknown
8
- resolve: (approved: boolean) => void
5
+ toolCallId: string;
6
+ toolName: string;
7
+ args: unknown;
8
+ resolve: (approved: boolean) => void;
9
9
  }
10
10
 
11
11
  interface ToolApprovalContextType {
12
- pendingApprovals: Map<string, PendingApproval>
13
- approvedTools: Set<string>
12
+ pendingApprovals: Map<string, PendingApproval>;
13
+ approvedTools: Set<string>;
14
14
  requestApproval: (
15
15
  toolName: string,
16
16
  toolCallId: string,
17
- args: unknown
18
- ) => Promise<boolean>
17
+ args: unknown,
18
+ ) => Promise<boolean>;
19
19
  /** Whitelist a tool name so all future calls are auto-approved */
20
- whitelistTool: (toolName: string) => void
20
+ whitelistTool: (toolName: string) => void;
21
21
  /** Confirm a specific pending tool call approval */
22
- confirmPendingApproval: (toolCallId: string) => void
22
+ confirmPendingApproval: (toolCallId: string) => void;
23
23
  /** Reject a specific pending tool call approval */
24
- rejectPendingApproval: (toolCallId: string) => void
25
- isToolApproved: (toolName: string) => boolean
26
- getPendingApproval: (toolCallId: string) => PendingApproval | undefined
24
+ rejectPendingApproval: (toolCallId: string) => void;
25
+ isToolApproved: (toolName: string) => boolean;
26
+ getPendingApproval: (toolCallId: string) => PendingApproval | undefined;
27
27
  }
28
28
 
29
29
  export function ToolApprovalProvider({ children }: { children: ReactNode }) {
30
30
  const [pendingApprovals, setPendingApprovals] = useState<
31
31
  Map<string, PendingApproval>
32
- >(new Map())
33
- const [approvedTools, setApprovedTools] = useState<Set<string>>(new Set())
32
+ >(new Map());
33
+ const [approvedTools, setApprovedTools] = useState<Set<string>>(new Set());
34
34
 
35
35
  const requestApproval = useCallback(
36
36
  (toolName: string, toolCallId: string, args: unknown): Promise<boolean> => {
@@ -40,64 +40,64 @@ export function ToolApprovalProvider({ children }: { children: ReactNode }) {
40
40
  toolName,
41
41
  args,
42
42
  resolve,
43
- }
43
+ };
44
44
 
45
45
  setPendingApprovals((prev) => {
46
- const next = new Map(prev)
47
- next.set(toolCallId, pending)
48
- return next
49
- })
50
- })
46
+ const next = new Map(prev);
47
+ next.set(toolCallId, pending);
48
+ return next;
49
+ });
50
+ });
51
51
  },
52
- []
53
- )
52
+ [],
53
+ );
54
54
  const whitelistTool = useCallback((toolName: string) => {
55
55
  setApprovedTools((prev) => {
56
- const next = new Set(prev)
57
- next.add(toolName)
58
- return next
59
- })
60
- }, [])
56
+ const next = new Set(prev);
57
+ next.add(toolName);
58
+ return next;
59
+ });
60
+ }, []);
61
61
 
62
62
  const confirmPendingApproval = useCallback((toolCallId: string) => {
63
63
  setPendingApprovals((prev) => {
64
- const pending = prev.get(toolCallId)
64
+ const pending = prev.get(toolCallId);
65
65
  if (pending) {
66
- pending.resolve(true)
67
- const next = new Map(prev)
68
- next.delete(toolCallId)
69
- return next
66
+ pending.resolve(true);
67
+ const next = new Map(prev);
68
+ next.delete(toolCallId);
69
+ return next;
70
70
  }
71
- return prev
72
- })
73
- }, [])
71
+ return prev;
72
+ });
73
+ }, []);
74
74
 
75
75
  const rejectPendingApproval = useCallback((toolCallId: string) => {
76
76
  setPendingApprovals((prev) => {
77
- const pending = prev.get(toolCallId)
77
+ const pending = prev.get(toolCallId);
78
78
  if (pending) {
79
- pending.resolve(false)
80
- const next = new Map(prev)
81
- next.delete(toolCallId)
82
- return next
79
+ pending.resolve(false);
80
+ const next = new Map(prev);
81
+ next.delete(toolCallId);
82
+ return next;
83
83
  }
84
- return prev
85
- })
86
- }, [])
84
+ return prev;
85
+ });
86
+ }, []);
87
87
 
88
88
  const isToolApproved = useCallback(
89
89
  (toolName: string) => {
90
- return approvedTools.has(toolName)
90
+ return approvedTools.has(toolName);
91
91
  },
92
- [approvedTools]
93
- )
92
+ [approvedTools],
93
+ );
94
94
 
95
95
  const getPendingApproval = useCallback(
96
96
  (toolCallId: string) => {
97
- return pendingApprovals.get(toolCallId)
97
+ return pendingApprovals.get(toolCallId);
98
98
  },
99
- [pendingApprovals]
100
- )
99
+ [pendingApprovals],
100
+ );
101
101
 
102
102
  return (
103
103
  <ToolApprovalContext.Provider
@@ -114,7 +114,7 @@ export function ToolApprovalProvider({ children }: { children: ReactNode }) {
114
114
  >
115
115
  {children}
116
116
  </ToolApprovalContext.Provider>
117
- )
117
+ );
118
118
  }
119
119
 
120
- export type { ToolApprovalContextType }
120
+ export type { ToolApprovalContextType };
@@ -1,36 +1,36 @@
1
- 'use client'
1
+ "use client";
2
2
 
3
- import { createContext, useContext, useCallback, ReactNode } from 'react'
3
+ import { createContext, useContext, useCallback, ReactNode } from "react";
4
4
 
5
5
  // Define a minimal tool type for direct execution
6
6
  // This avoids strict AI SDK type requirements while still being type-safe
7
7
  interface ExecutableTool {
8
- execute?: (args: unknown, options?: unknown) => Promise<unknown>
8
+ execute?: (args: unknown, options?: unknown) => Promise<unknown>;
9
9
  }
10
10
 
11
- type ExecutableToolSet = Record<string, ExecutableTool | undefined>
11
+ type ExecutableToolSet = Record<string, ExecutableTool | undefined>;
12
12
 
13
13
  export interface ToolExecutionResult {
14
- success: boolean
15
- result?: unknown
16
- error?: string
14
+ success: boolean;
15
+ result?: unknown;
16
+ error?: string;
17
17
  }
18
18
 
19
19
  interface ToolExecutionContextValue {
20
20
  executeTool: (
21
21
  toolName: string,
22
- args: Record<string, unknown>
23
- ) => Promise<ToolExecutionResult>
24
- isToolAvailable: (toolName: string) => boolean
22
+ args: Record<string, unknown>,
23
+ ) => Promise<ToolExecutionResult>;
24
+ isToolAvailable: (toolName: string) => boolean;
25
25
  }
26
26
 
27
27
  const ToolExecutionContext = createContext<ToolExecutionContextValue | null>(
28
- null
29
- )
28
+ null,
29
+ );
30
30
 
31
31
  interface ToolExecutionProviderProps {
32
- children: ReactNode
33
- tools: ExecutableToolSet | undefined
32
+ children: ReactNode;
33
+ tools: ExecutableToolSet | undefined;
34
34
  }
35
35
 
36
36
  export function ToolExecutionProvider({
@@ -40,62 +40,62 @@ export function ToolExecutionProvider({
40
40
  const executeTool = useCallback(
41
41
  async (
42
42
  toolName: string,
43
- args: Record<string, unknown>
43
+ args: Record<string, unknown>,
44
44
  ): Promise<ToolExecutionResult> => {
45
45
  if (!tools) {
46
- return { success: false, error: 'Tools not available' }
46
+ return { success: false, error: "Tools not available" };
47
47
  }
48
48
 
49
- const tool = tools[toolName]
49
+ const tool = tools[toolName];
50
50
  if (!tool) {
51
- return { success: false, error: `Tool "${toolName}" not found` }
51
+ return { success: false, error: `Tool "${toolName}" not found` };
52
52
  }
53
53
 
54
54
  if (!tool.execute) {
55
55
  return {
56
56
  success: false,
57
57
  error: `Tool "${toolName}" has no execute function`,
58
- }
58
+ };
59
59
  }
60
60
 
61
61
  try {
62
62
  // Generate a unique toolCallId for this execution
63
- const toolCallId = `action-${Date.now()}-${Math.random().toString(36).slice(2)}`
64
- const result = await tool.execute(args, { toolCallId, messages: [] })
65
- return { success: true, result }
63
+ const toolCallId = `action-${Date.now()}-${Math.random().toString(36).slice(2)}`;
64
+ const result = await tool.execute(args, { toolCallId, messages: [] });
65
+ return { success: true, result };
66
66
  } catch (err) {
67
67
  const errorMessage =
68
- err instanceof Error ? err.message : 'Unknown error'
69
- return { success: false, error: errorMessage }
68
+ err instanceof Error ? err.message : "Unknown error";
69
+ return { success: false, error: errorMessage };
70
70
  }
71
71
  },
72
- [tools]
73
- )
72
+ [tools],
73
+ );
74
74
 
75
75
  const isToolAvailable = useCallback(
76
76
  (toolName: string): boolean => {
77
- return !!tools?.[toolName]?.execute
77
+ return !!tools?.[toolName]?.execute;
78
78
  },
79
- [tools]
80
- )
79
+ [tools],
80
+ );
81
81
 
82
82
  return (
83
83
  <ToolExecutionContext.Provider value={{ executeTool, isToolAvailable }}>
84
84
  {children}
85
85
  </ToolExecutionContext.Provider>
86
- )
86
+ );
87
87
  }
88
88
 
89
89
  export function useToolExecution(): ToolExecutionContextValue {
90
- const context = useContext(ToolExecutionContext)
90
+ const context = useContext(ToolExecutionContext);
91
91
  if (!context) {
92
92
  return {
93
93
  executeTool: async (): Promise<ToolExecutionResult> => ({
94
94
  success: false,
95
- error: 'ToolExecutionProvider not found',
95
+ error: "ToolExecutionProvider not found",
96
96
  }),
97
97
  isToolAvailable: () => false,
98
- }
98
+ };
99
99
  }
100
- return context
100
+ return context;
101
101
  }
@@ -1,12 +1,12 @@
1
- import { createContext } from 'react'
2
- import type { ElementsContextType } from '@/types'
3
- import { ToolApprovalContextType } from './ToolApprovalContext'
1
+ import { createContext } from "react";
2
+ import type { ElementsContextType } from "@/types";
3
+ import { ToolApprovalContextType } from "./ToolApprovalContext";
4
4
 
5
5
  export const ElementsContext = createContext<ElementsContextType | undefined>(
6
- undefined
7
- )
6
+ undefined,
7
+ );
8
8
 
9
9
  export const ToolApprovalContext =
10
- createContext<ToolApprovalContextType | null>(null)
10
+ createContext<ToolApprovalContextType | null>(null);
11
11
 
12
- export { useChatId } from './ChatIdContext'
12
+ export { useChatId } from "./ChatIdContext";
@@ -1,4 +1,4 @@
1
- import { createContext, type RefObject } from 'react'
1
+ import { createContext, type RefObject } from "react";
2
2
 
3
3
  export const PortalContainerContext =
4
- createContext<RefObject<HTMLElement | null> | null>(null)
4
+ createContext<RefObject<HTMLElement | null> | null>(null);
@@ -1,20 +1,20 @@
1
- 'use client'
1
+ "use client";
2
2
 
3
- import { type RefObject } from 'react'
4
- import { PortalContainerContext } from './portal-container-context'
3
+ import { type RefObject } from "react";
4
+ import { PortalContainerContext } from "./portal-container-context";
5
5
 
6
- export { PortalContainerContext }
6
+ export { PortalContainerContext };
7
7
 
8
8
  export function PortalContainerProvider({
9
9
  containerRef,
10
10
  children,
11
11
  }: {
12
- containerRef: RefObject<HTMLElement | null>
13
- children: React.ReactNode
12
+ containerRef: RefObject<HTMLElement | null>;
13
+ children: React.ReactNode;
14
14
  }) {
15
15
  return (
16
16
  <PortalContainerContext.Provider value={containerRef}>
17
17
  {children}
18
18
  </PortalContainerContext.Provider>
19
- )
19
+ );
20
20
  }
package/src/embedded.ts CHANGED
@@ -1,3 +1,3 @@
1
1
  // Side-effect import to include embedded CSS in build
2
2
  // Use this CSS for embedding elements in apps that already have Tailwind CSS
3
- import './global-embedded.css'
3
+ import "./global-embedded.css";
package/src/global.css CHANGED
@@ -1,7 +1,7 @@
1
- @import 'tw-animate-css';
2
- @import 'tw-shimmer';
1
+ @import "tw-animate-css";
2
+ @import "tw-shimmer";
3
3
  @layer theme, base, components, utilities;
4
- @import 'tailwindcss/theme.css' layer(theme);
4
+ @import "tailwindcss/theme.css" layer(theme);
5
5
 
6
6
  @custom-variant dark (&:is(.dark *));
7
7
 
@@ -55,8 +55,8 @@
55
55
 
56
56
  /* Scoped preflight/base styles */
57
57
  font-family:
58
- ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
59
- 'Segoe UI Symbol', 'Noto Color Emoji';
58
+ ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
59
+ "Segoe UI Symbol", "Noto Color Emoji";
60
60
  font-feature-settings: normal;
61
61
  font-variation-settings: normal;
62
62
  -webkit-font-smoothing: antialiased;
@@ -215,9 +215,9 @@
215
215
  }
216
216
 
217
217
  button,
218
- input:where([type='button']),
219
- input:where([type='reset']),
220
- input:where([type='submit']) {
218
+ input:where([type="button"]),
219
+ input:where([type="reset"]),
220
+ input:where([type="submit"]) {
221
221
  appearance: button;
222
222
  -webkit-appearance: button;
223
223
  background-color: transparent;
@@ -239,20 +239,20 @@
239
239
  }
240
240
 
241
241
  /* Theme: Radius variants via data attribute - scoped */
242
- .gram-elements[data-radius='sharp'],
243
- [data-radius='sharp'] .gram-elements {
242
+ .gram-elements[data-radius="sharp"],
243
+ [data-radius="sharp"] .gram-elements {
244
244
  --radius: 0.25rem;
245
245
  }
246
- .gram-elements[data-radius='soft'],
247
- [data-radius='soft'] .gram-elements {
246
+ .gram-elements[data-radius="soft"],
247
+ [data-radius="soft"] .gram-elements {
248
248
  --radius: 0.625rem;
249
249
  }
250
- .gram-elements[data-radius='round'],
251
- [data-radius='round'] .gram-elements {
250
+ .gram-elements[data-radius="round"],
251
+ [data-radius="round"] .gram-elements {
252
252
  --radius: 1rem;
253
253
  }
254
- .gram-elements[data-radius='pill'],
255
- [data-radius='pill'] .gram-elements {
254
+ .gram-elements[data-radius="pill"],
255
+ [data-radius="pill"] .gram-elements {
256
256
  --radius: 9999px;
257
257
  }
258
258
 
@@ -263,26 +263,26 @@
263
263
  }
264
264
  }
265
265
 
266
- .gram-elements :where(.aui-md[data-status='running']):empty::after,
266
+ .gram-elements :where(.aui-md[data-status="running"]):empty::after,
267
267
  .gram-elements
268
- :where(.aui-md[data-status='running'])
268
+ :where(.aui-md[data-status="running"])
269
269
  > :where(:not(ol):not(ul):not(pre)):last-child::after,
270
270
  .gram-elements
271
- :where(.aui-md[data-status='running'])
271
+ :where(.aui-md[data-status="running"])
272
272
  > pre:last-child
273
273
  code::after,
274
274
  .gram-elements
275
- :where(.aui-md[data-status='running'])
275
+ :where(.aui-md[data-status="running"])
276
276
  > :where(:is(ol, ul):last-child)
277
277
  > :where(li:last-child:not(:has(* > li)))::after,
278
278
  .gram-elements
279
- :where(.aui-md[data-status='running'])
279
+ :where(.aui-md[data-status="running"])
280
280
  > :where(:is(ol, ul):last-child)
281
281
  > :where(li:last-child)
282
282
  > :where(:is(ol, ul):last-child)
283
283
  > :where(li:last-child:not(:has(* > li)))::after,
284
284
  .gram-elements
285
- :where(.aui-md[data-status='running'])
285
+ :where(.aui-md[data-status="running"])
286
286
  > :where(:is(ol, ul):last-child)
287
287
  > :where(li:last-child)
288
288
  > :where(:is(ol, ul):last-child)
@@ -291,9 +291,9 @@
291
291
  > :where(li:last-child)::after {
292
292
  animation: aui-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
293
293
  font-family:
294
- ui-sans-serif, system-ui, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
295
- 'Segoe UI Symbol', 'Noto Color Emoji';
296
- --aui-content: '\25cf';
294
+ ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji",
295
+ "Segoe UI Symbol", "Noto Color Emoji";
296
+ --aui-content: "\25cf";
297
297
  content: var(--aui-content);
298
298
  margin-left: 0.25rem;
299
299
  margin-right: 0.25rem;