@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
package/src/react-shim.ts CHANGED
@@ -5,15 +5,15 @@
5
5
  */
6
6
 
7
7
  // @ts-expect-error — resolved by the Vite plugin to the real react package
8
- import * as ReactOriginal from 'react-original'
9
- import { createShims } from './compat-shims'
8
+ import * as ReactOriginal from "react-original";
9
+ import { createShims } from "./compat-shims";
10
10
 
11
- const Shimmed = { ...ReactOriginal, ...createShims(ReactOriginal) }
11
+ const Shimmed = { ...ReactOriginal, ...createShims(ReactOriginal) };
12
12
 
13
13
  // React internals required by react-dom
14
14
  export const __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED =
15
15
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
- (ReactOriginal as any).__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED
16
+ (ReactOriginal as any).__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;
17
17
 
18
18
  export const {
19
19
  Children,
@@ -49,6 +49,6 @@ export const {
49
49
  useSyncExternalStore,
50
50
  useTransition,
51
51
  version,
52
- } = Shimmed
52
+ } = Shimmed;
53
53
 
54
- export default Shimmed
54
+ export default Shimmed;
package/src/server/bun.ts CHANGED
@@ -19,7 +19,7 @@
19
19
  * ```
20
20
  */
21
21
 
22
- import { createChatSession, type SessionHandlerOptions } from './core'
22
+ import { createChatSession, type SessionHandlerOptions } from "./core";
23
23
 
24
24
  /**
25
25
  * Create a Bun route handler for the chat session endpoint.
@@ -31,33 +31,33 @@ export function createBunHandler(
31
31
  options:
32
32
  | SessionHandlerOptions
33
33
  | ((
34
- request: Request
35
- ) => SessionHandlerOptions | Promise<SessionHandlerOptions>)
34
+ request: Request,
35
+ ) => SessionHandlerOptions | Promise<SessionHandlerOptions>),
36
36
  ) {
37
37
  return async (request: Request) => {
38
- const projectSlug = request.headers.get('gram-project')
38
+ const projectSlug = request.headers.get("gram-project");
39
39
 
40
40
  if (!projectSlug) {
41
41
  return new Response(
42
- JSON.stringify({ error: 'Missing Gram-Project header' }),
42
+ JSON.stringify({ error: "Missing Gram-Project header" }),
43
43
  {
44
44
  status: 400,
45
- headers: { 'Content-Type': 'application/json' },
46
- }
47
- )
45
+ headers: { "Content-Type": "application/json" },
46
+ },
47
+ );
48
48
  }
49
49
 
50
50
  const sessionOptions =
51
- typeof options === 'function' ? await options(request) : options
51
+ typeof options === "function" ? await options(request) : options;
52
52
 
53
53
  const result = await createChatSession({
54
54
  projectSlug,
55
55
  options: sessionOptions,
56
- })
56
+ });
57
57
 
58
58
  return new Response(result.body, {
59
59
  status: result.status,
60
60
  headers: result.headers,
61
- })
62
- }
61
+ });
62
+ };
63
63
  }
@@ -7,34 +7,34 @@ export interface SessionHandlerOptions {
7
7
  /**
8
8
  * The origin from which the token will be used
9
9
  */
10
- embedOrigin: string
10
+ embedOrigin: string;
11
11
 
12
12
  /**
13
13
  * Free-form user identifier
14
14
  */
15
- userIdentifier: string
15
+ userIdentifier: string;
16
16
 
17
17
  /**
18
18
  * Token expiration in seconds (max / default 3600)
19
19
  * @default 3600
20
20
  */
21
- expiresAfter?: number
21
+ expiresAfter?: number;
22
22
 
23
23
  /**
24
24
  * Gram API key. If not provided, falls back to the `GRAM_API_KEY` environment variable.
25
25
  */
26
- apiKey?: string
26
+ apiKey?: string;
27
27
  }
28
28
 
29
29
  export interface CreateSessionRequest {
30
- projectSlug: string
31
- options: SessionHandlerOptions
30
+ projectSlug: string;
31
+ options: SessionHandlerOptions;
32
32
  }
33
33
 
34
34
  export interface CreateSessionResponse {
35
- status: number
36
- body: string
37
- headers: Record<string, string>
35
+ status: number;
36
+ body: string;
37
+ headers: Record<string, string>;
38
38
  }
39
39
 
40
40
  /**
@@ -42,43 +42,43 @@ export interface CreateSessionResponse {
42
42
  * This is framework-agnostic and can be used by any adapter.
43
43
  */
44
44
  export async function createChatSession(
45
- request: CreateSessionRequest
45
+ request: CreateSessionRequest,
46
46
  ): Promise<CreateSessionResponse> {
47
- const base = process.env.GRAM_API_URL ?? 'https://app.getgram.ai'
47
+ const base = process.env.GRAM_API_URL ?? "https://app.getgram.ai";
48
48
 
49
49
  try {
50
- const response = await fetch(base + '/rpc/chatSessions.create', {
51
- method: 'POST',
50
+ const response = await fetch(base + "/rpc/chatSessions.create", {
51
+ method: "POST",
52
52
  body: JSON.stringify({
53
53
  embed_origin: request.options.embedOrigin,
54
54
  user_identifier: request.options.userIdentifier,
55
55
  expires_after: request.options.expiresAfter,
56
56
  }),
57
57
  headers: {
58
- 'Content-Type': 'application/json',
59
- 'Gram-Project': request.projectSlug,
60
- 'Gram-Key': request.options.apiKey ?? process.env.GRAM_API_KEY ?? '',
58
+ "Content-Type": "application/json",
59
+ "Gram-Project": request.projectSlug,
60
+ "Gram-Key": request.options.apiKey ?? process.env.GRAM_API_KEY ?? "",
61
61
  },
62
- })
62
+ });
63
63
 
64
- const body = await response.text()
64
+ const body = await response.text();
65
65
 
66
66
  return {
67
67
  status: response.status,
68
68
  body,
69
- headers: { 'Content-Type': 'application/json' },
70
- }
69
+ headers: { "Content-Type": "application/json" },
70
+ };
71
71
  } catch (error) {
72
72
  const errorMessage =
73
- error instanceof Error ? error.message : 'Unknown error'
74
- console.error('Failed to create chat session:', error)
73
+ error instanceof Error ? error.message : "Unknown error";
74
+ console.error("Failed to create chat session:", error);
75
75
 
76
76
  return {
77
77
  status: 500,
78
78
  body: JSON.stringify({
79
- error: 'Failed to create chat session: ' + errorMessage,
79
+ error: "Failed to create chat session: " + errorMessage,
80
80
  }),
81
- headers: { 'Content-Type': 'application/json' },
82
- }
81
+ headers: { "Content-Type": "application/json" },
82
+ };
83
83
  }
84
84
  }
@@ -19,8 +19,8 @@
19
19
  * ```
20
20
  */
21
21
 
22
- import type { Request, Response } from 'express'
23
- import { createChatSession, type SessionHandlerOptions } from './core'
22
+ import type { Request, Response } from "express";
23
+ import { createChatSession, type SessionHandlerOptions } from "./core";
24
24
 
25
25
  /**
26
26
  * Create an Express request handler for the chat session endpoint.
@@ -31,30 +31,32 @@ import { createChatSession, type SessionHandlerOptions } from './core'
31
31
  export function createExpressHandler(
32
32
  options:
33
33
  | SessionHandlerOptions
34
- | ((req: Request) => SessionHandlerOptions | Promise<SessionHandlerOptions>)
34
+ | ((
35
+ req: Request,
36
+ ) => SessionHandlerOptions | Promise<SessionHandlerOptions>),
35
37
  ) {
36
38
  return async (req: Request, res: Response) => {
37
- const projectSlug = Array.isArray(req.headers['gram-project'])
38
- ? req.headers['gram-project'][0]
39
- : req.headers['gram-project']
39
+ const projectSlug = Array.isArray(req.headers["gram-project"])
40
+ ? req.headers["gram-project"][0]
41
+ : req.headers["gram-project"];
40
42
 
41
43
  if (!projectSlug) {
42
- res.status(400).json({ error: 'Missing Gram-Project header' })
43
- return
44
+ res.status(400).json({ error: "Missing Gram-Project header" });
45
+ return;
44
46
  }
45
47
 
46
48
  const sessionOptions =
47
- typeof options === 'function' ? await options(req) : options
49
+ typeof options === "function" ? await options(req) : options;
48
50
 
49
51
  const result = await createChatSession({
50
52
  projectSlug,
51
53
  options: sessionOptions,
52
- })
54
+ });
53
55
 
54
- res.status(result.status)
56
+ res.status(result.status);
55
57
  Object.entries(result.headers).forEach(([key, value]) => {
56
- res.setHeader(key, value)
57
- })
58
- res.send(result.body)
59
- }
58
+ res.setHeader(key, value);
59
+ });
60
+ res.send(result.body);
61
+ };
60
62
  }
@@ -18,8 +18,8 @@
18
18
  * ```
19
19
  */
20
20
 
21
- import type { FastifyRequest, FastifyReply } from 'fastify'
22
- import { createChatSession, type SessionHandlerOptions } from './core'
21
+ import type { FastifyRequest, FastifyReply } from "fastify";
22
+ import { createChatSession, type SessionHandlerOptions } from "./core";
23
23
 
24
24
  /**
25
25
  * Create a Fastify route handler for the chat session endpoint.
@@ -31,31 +31,31 @@ export function createFastifyHandler(
31
31
  options:
32
32
  | SessionHandlerOptions
33
33
  | ((
34
- request: FastifyRequest
35
- ) => SessionHandlerOptions | Promise<SessionHandlerOptions>)
34
+ request: FastifyRequest,
35
+ ) => SessionHandlerOptions | Promise<SessionHandlerOptions>),
36
36
  ) {
37
37
  return async (request: FastifyRequest, reply: FastifyReply) => {
38
- const projectSlug = Array.isArray(request.headers['gram-project'])
39
- ? request.headers['gram-project'][0]
40
- : request.headers['gram-project']
38
+ const projectSlug = Array.isArray(request.headers["gram-project"])
39
+ ? request.headers["gram-project"][0]
40
+ : request.headers["gram-project"];
41
41
 
42
42
  if (!projectSlug) {
43
- reply.code(400).send({ error: 'Missing Gram-Project header' })
44
- return
43
+ reply.code(400).send({ error: "Missing Gram-Project header" });
44
+ return;
45
45
  }
46
46
 
47
47
  const sessionOptions =
48
- typeof options === 'function' ? await options(request) : options
48
+ typeof options === "function" ? await options(request) : options;
49
49
 
50
50
  const result = await createChatSession({
51
51
  projectSlug,
52
52
  options: sessionOptions,
53
- })
53
+ });
54
54
 
55
55
  reply
56
56
  .code(result.status)
57
57
  .headers(result.headers)
58
- .type('application/json')
59
- .send(result.body)
60
- }
58
+ .type("application/json")
59
+ .send(result.body);
60
+ };
61
61
  }
@@ -18,8 +18,8 @@
18
18
  * ```
19
19
  */
20
20
 
21
- import type { Context } from 'hono'
22
- import { createChatSession, type SessionHandlerOptions } from './core'
21
+ import type { Context } from "hono";
22
+ import { createChatSession, type SessionHandlerOptions } from "./core";
23
23
 
24
24
  /**
25
25
  * Create a Hono route handler for the chat session endpoint.
@@ -30,26 +30,26 @@ import { createChatSession, type SessionHandlerOptions } from './core'
30
30
  export function createHonoHandler(
31
31
  options:
32
32
  | SessionHandlerOptions
33
- | ((c: Context) => SessionHandlerOptions | Promise<SessionHandlerOptions>)
33
+ | ((c: Context) => SessionHandlerOptions | Promise<SessionHandlerOptions>),
34
34
  ) {
35
35
  return async (c: Context) => {
36
- const projectSlug = c.req.header('gram-project')
36
+ const projectSlug = c.req.header("gram-project");
37
37
 
38
38
  if (!projectSlug) {
39
- return c.json({ error: 'Missing Gram-Project header' }, 400)
39
+ return c.json({ error: "Missing Gram-Project header" }, 400);
40
40
  }
41
41
 
42
42
  const sessionOptions =
43
- typeof options === 'function' ? await options(c) : options
43
+ typeof options === "function" ? await options(c) : options;
44
44
 
45
45
  const result = await createChatSession({
46
46
  projectSlug,
47
47
  options: sessionOptions,
48
- })
48
+ });
49
49
 
50
50
  return new Response(result.body, {
51
51
  status: result.status,
52
52
  headers: result.headers,
53
- })
54
- }
53
+ });
54
+ };
55
55
  }
@@ -14,7 +14,7 @@
14
14
  * ```
15
15
  */
16
16
 
17
- import { createChatSession, type SessionHandlerOptions } from './core'
17
+ import { createChatSession, type SessionHandlerOptions } from "./core";
18
18
 
19
19
  /**
20
20
  * Create a Next.js App Router route handler for the chat session endpoint.
@@ -26,33 +26,33 @@ export function createNextHandler(
26
26
  options:
27
27
  | SessionHandlerOptions
28
28
  | ((
29
- request: Request
30
- ) => SessionHandlerOptions | Promise<SessionHandlerOptions>)
29
+ request: Request,
30
+ ) => SessionHandlerOptions | Promise<SessionHandlerOptions>),
31
31
  ) {
32
32
  return async (request: Request) => {
33
- const projectSlug = request.headers.get('gram-project')
33
+ const projectSlug = request.headers.get("gram-project");
34
34
 
35
35
  if (!projectSlug) {
36
36
  return new Response(
37
- JSON.stringify({ error: 'Missing Gram-Project header' }),
37
+ JSON.stringify({ error: "Missing Gram-Project header" }),
38
38
  {
39
39
  status: 400,
40
- headers: { 'Content-Type': 'application/json' },
41
- }
42
- )
40
+ headers: { "Content-Type": "application/json" },
41
+ },
42
+ );
43
43
  }
44
44
 
45
45
  const sessionOptions =
46
- typeof options === 'function' ? await options(request) : options
46
+ typeof options === "function" ? await options(request) : options;
47
47
 
48
48
  const result = await createChatSession({
49
49
  projectSlug,
50
50
  options: sessionOptions,
51
- })
51
+ });
52
52
 
53
53
  return new Response(result.body, {
54
54
  status: result.status,
55
55
  headers: result.headers,
56
- })
57
- }
56
+ });
57
+ };
58
58
  }
@@ -30,7 +30,7 @@
30
30
  * ```
31
31
  */
32
32
 
33
- import { createChatSession, type SessionHandlerOptions } from './core'
33
+ import { createChatSession, type SessionHandlerOptions } from "./core";
34
34
 
35
35
  /**
36
36
  * Create a TanStack Start server route handler for the chat session endpoint.
@@ -45,33 +45,33 @@ export function createTanStackStartHandler(
45
45
  options:
46
46
  | SessionHandlerOptions
47
47
  | ((
48
- request: Request
49
- ) => SessionHandlerOptions | Promise<SessionHandlerOptions>)
48
+ request: Request,
49
+ ) => SessionHandlerOptions | Promise<SessionHandlerOptions>),
50
50
  ) {
51
51
  return async (request: Request) => {
52
- const projectSlug = request.headers.get('gram-project')
52
+ const projectSlug = request.headers.get("gram-project");
53
53
 
54
54
  if (!projectSlug) {
55
55
  return new Response(
56
- JSON.stringify({ error: 'Missing Gram-Project header' }),
56
+ JSON.stringify({ error: "Missing Gram-Project header" }),
57
57
  {
58
58
  status: 400,
59
- headers: { 'Content-Type': 'application/json' },
60
- }
61
- )
59
+ headers: { "Content-Type": "application/json" },
60
+ },
61
+ );
62
62
  }
63
63
 
64
64
  const sessionOptions =
65
- typeof options === 'function' ? await options(request) : options
65
+ typeof options === "function" ? await options(request) : options;
66
66
 
67
67
  const result = await createChatSession({
68
68
  projectSlug,
69
69
  options: sessionOptions,
70
- })
70
+ });
71
71
 
72
72
  return new Response(result.body, {
73
73
  status: result.status,
74
74
  headers: result.headers,
75
- })
76
- }
75
+ });
76
+ };
77
77
  }
package/src/server.ts CHANGED
@@ -1,11 +1,11 @@
1
- import { IncomingMessage, ServerResponse } from 'node:http'
2
- import { createChatSession, type SessionHandlerOptions } from './server/core'
1
+ import { IncomingMessage, ServerResponse } from "node:http";
2
+ import { createChatSession, type SessionHandlerOptions } from "./server/core";
3
3
 
4
4
  type ServerHandler<T> = (
5
5
  req: IncomingMessage,
6
6
  res: ServerResponse,
7
- options?: T
8
- ) => Promise<void>
7
+ options?: T,
8
+ ) => Promise<void>;
9
9
 
10
10
  interface ServerHandlers {
11
11
  /**
@@ -21,7 +21,7 @@ interface ServerHandlers {
21
21
  * app.listen(3000)
22
22
  * ```
23
23
  */
24
- session: ServerHandler<SessionHandlerOptions>
24
+ session: ServerHandler<SessionHandlerOptions>;
25
25
  }
26
26
 
27
27
  /**
@@ -35,43 +35,43 @@ interface ServerHandlers {
35
35
  export const createElementsServerHandlers = (): ServerHandlers => {
36
36
  return {
37
37
  session: sessionHandler,
38
- }
39
- }
38
+ };
39
+ };
40
40
 
41
- export type { SessionHandlerOptions }
41
+ export type { SessionHandlerOptions };
42
42
 
43
43
  const sessionHandler: ServerHandler<SessionHandlerOptions> = async (
44
44
  req,
45
45
  res,
46
- options
46
+ options,
47
47
  ) => {
48
- if (req.method !== 'POST') {
49
- res.writeHead(405, { 'Content-Type': 'application/json' })
50
- res.end(JSON.stringify({ error: 'Method not allowed' }))
51
- return
48
+ if (req.method !== "POST") {
49
+ res.writeHead(405, { "Content-Type": "application/json" });
50
+ res.end(JSON.stringify({ error: "Method not allowed" }));
51
+ return;
52
52
  }
53
53
 
54
- const projectSlug = Array.isArray(req.headers['gram-project'])
55
- ? req.headers['gram-project'][0]
56
- : req.headers['gram-project']
54
+ const projectSlug = Array.isArray(req.headers["gram-project"])
55
+ ? req.headers["gram-project"][0]
56
+ : req.headers["gram-project"];
57
57
 
58
- if (!projectSlug || typeof projectSlug !== 'string') {
59
- res.writeHead(400, { 'Content-Type': 'application/json' })
60
- res.end(JSON.stringify({ error: 'Missing Gram-Project header' }))
61
- return
58
+ if (!projectSlug || typeof projectSlug !== "string") {
59
+ res.writeHead(400, { "Content-Type": "application/json" });
60
+ res.end(JSON.stringify({ error: "Missing Gram-Project header" }));
61
+ return;
62
62
  }
63
63
 
64
64
  if (!options) {
65
- res.writeHead(400, { 'Content-Type': 'application/json' })
66
- res.end(JSON.stringify({ error: 'Missing session options' }))
67
- return
65
+ res.writeHead(400, { "Content-Type": "application/json" });
66
+ res.end(JSON.stringify({ error: "Missing session options" }));
67
+ return;
68
68
  }
69
69
 
70
70
  const result = await createChatSession({
71
71
  projectSlug,
72
72
  options,
73
- })
73
+ });
74
74
 
75
- res.writeHead(result.status, result.headers)
76
- res.end(result.body)
77
- }
75
+ res.writeHead(result.status, result.headers);
76
+ res.end(result.body);
77
+ };
@@ -4,7 +4,7 @@
4
4
  * This file extends Storybook's Parameters interface to provide
5
5
  * type safety for the `elements` parameter used in stories.
6
6
  */
7
- import type { ElementsConfig } from './types'
7
+ import type { ElementsConfig } from "./types";
8
8
 
9
9
  /**
10
10
  * Configuration for the elements decorator in Storybook stories.
@@ -14,15 +14,15 @@ export interface ElementsParameters {
14
14
  * Partial configuration that will be merged with the default Elements config.
15
15
  * Use this to override specific config values per-story.
16
16
  */
17
- config?: Partial<ElementsConfig>
17
+ config?: Partial<ElementsConfig>;
18
18
  }
19
19
 
20
- declare module 'storybook/internal/csf' {
20
+ declare module "storybook/internal/csf" {
21
21
  interface Parameters {
22
22
  /**
23
23
  * Custom parameters for the Gram Elements decorator.
24
24
  * The config is passed to ElementsProvider and merged with defaults.
25
25
  */
26
- elements?: ElementsParameters
26
+ elements?: ElementsParameters;
27
27
  }
28
28
  }