@chatsdk-dev/elements 0.0.1 → 0.1.3

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 (329) hide show
  1. package/README.md +3 -3
  2. package/dist/api-CIYPz72L.d.ts +10 -0
  3. package/dist/api-CIYPz72L.d.ts.map +1 -0
  4. package/dist/callbacks-PIvHXeEI.d.ts +24 -0
  5. package/dist/callbacks-PIvHXeEI.d.ts.map +1 -0
  6. package/dist/chat-element-CCsDDFif.js +441 -0
  7. package/dist/chat-element-CCsDDFif.js.map +1 -0
  8. package/dist/chat-element-CSpa62Te.d.ts +53 -0
  9. package/dist/chat-element-CSpa62Te.d.ts.map +1 -0
  10. package/dist/chatsdk-provider-BhlChLFd.d.ts +15 -0
  11. package/dist/chatsdk-provider-BhlChLFd.d.ts.map +1 -0
  12. package/dist/common/utils.d.ts +14 -0
  13. package/dist/common/utils.d.ts.map +1 -0
  14. package/dist/common/utils.js +26 -0
  15. package/dist/common/utils.js.map +1 -0
  16. package/dist/components/info-card.d.ts +20 -11
  17. package/dist/components/info-card.d.ts.map +1 -0
  18. package/dist/components/info-card.js +38 -1
  19. package/dist/components/info-card.js.map +1 -0
  20. package/dist/config-BigIL6TQ.js +29 -0
  21. package/dist/config-BigIL6TQ.js.map +1 -0
  22. package/dist/config-CqihvSgz.d.ts +150 -0
  23. package/dist/config-CqihvSgz.d.ts.map +1 -0
  24. package/dist/config-D_jVTH_D.d.ts +58 -0
  25. package/dist/config-D_jVTH_D.d.ts.map +1 -0
  26. package/dist/context-aSaHw-ac.d.ts +13 -0
  27. package/dist/context-aSaHw-ac.d.ts.map +1 -0
  28. package/dist/element-provider-C_nBsftD.d.ts +40 -0
  29. package/dist/element-provider-C_nBsftD.d.ts.map +1 -0
  30. package/dist/features/chat/chat-card.d.ts +5 -3
  31. package/dist/features/chat/chat-card.d.ts.map +1 -0
  32. package/dist/features/chat/chat-card.js +2 -14
  33. package/dist/features/chat/chat-element.d.ts +2 -0
  34. package/dist/features/chat/chat-element.js +2 -0
  35. package/dist/features/chat/chat-header/chat-header.d.ts +8 -4
  36. package/dist/features/chat/chat-header/chat-header.d.ts.map +1 -0
  37. package/dist/features/chat/chat-header/chat-header.js +2 -14
  38. package/dist/features/chat/chat-header/chat-menu.d.ts +5 -3
  39. package/dist/features/chat/chat-header/chat-menu.d.ts.map +1 -0
  40. package/dist/features/chat/chat-header/chat-menu.js +29 -2
  41. package/dist/features/chat/chat-header/chat-menu.js.map +1 -0
  42. package/dist/features/chat/chat-history/chat-history-empty.d.ts +5 -3
  43. package/dist/features/chat/chat-history/chat-history-empty.d.ts.map +1 -0
  44. package/dist/features/chat/chat-history/chat-history-empty.js +24 -1
  45. package/dist/features/chat/chat-history/chat-history-empty.js.map +1 -0
  46. package/dist/features/chat/chat-history/chat-history.d.ts +5 -3
  47. package/dist/features/chat/chat-history/chat-history.d.ts.map +1 -0
  48. package/dist/features/chat/chat-history/chat-history.js +2 -14
  49. package/dist/features/chat/chat-main/chat-main.d.ts +10 -0
  50. package/dist/features/chat/chat-main/chat-main.d.ts.map +1 -0
  51. package/dist/features/chat/chat-main/chat-main.js +3 -0
  52. package/dist/features/chat/chat-main/use-chat.d.ts +23 -0
  53. package/dist/features/chat/chat-main/use-chat.d.ts.map +1 -0
  54. package/dist/features/chat/chat-main/use-chat.js +3 -0
  55. package/dist/features/chat/chat-main/use-initial-messages.d.ts +22 -0
  56. package/dist/features/chat/chat-main/use-initial-messages.d.ts.map +1 -0
  57. package/dist/features/chat/chat-main/use-initial-messages.js +2 -0
  58. package/dist/features/chat/chat-prompt-input.d.ts +20 -12
  59. package/dist/features/chat/chat-prompt-input.d.ts.map +1 -0
  60. package/dist/features/chat/chat-prompt-input.js +3 -14
  61. package/dist/features/chat/chat.context.d.ts +17 -15
  62. package/dist/features/chat/chat.context.d.ts.map +1 -0
  63. package/dist/features/chat/chat.context.js +9 -12
  64. package/dist/features/chat/chat.context.js.map +1 -0
  65. package/dist/features/chat/index.d.ts +2 -14
  66. package/dist/features/chat/index.js +2 -14
  67. package/dist/features/chat/queries/query-keys.d.ts +7 -5
  68. package/dist/features/chat/queries/query-keys.d.ts.map +1 -0
  69. package/dist/features/chat/queries/query-keys.js +19 -1
  70. package/dist/features/chat/queries/query-keys.js.map +1 -0
  71. package/dist/features/chat/queries/use-create-conversation-mutation.d.ts +27 -23
  72. package/dist/features/chat/queries/use-create-conversation-mutation.d.ts.map +1 -0
  73. package/dist/features/chat/queries/use-create-conversation-mutation.js +17 -36
  74. package/dist/features/chat/queries/use-create-conversation-mutation.js.map +1 -0
  75. package/dist/features/chat/queries/use-get-chat-query.d.ts +9 -5
  76. package/dist/features/chat/queries/use-get-chat-query.d.ts.map +1 -0
  77. package/dist/features/chat/queries/use-get-chat-query.js +2 -14
  78. package/dist/features/chat/queries/use-get-conversation-query.d.ts +56 -46
  79. package/dist/features/chat/queries/use-get-conversation-query.d.ts.map +1 -0
  80. package/dist/features/chat/queries/use-get-conversation-query.js +2 -14
  81. package/dist/features/chat/queries/use-list-conversations-query.d.ts +27 -23
  82. package/dist/features/chat/queries/use-list-conversations-query.d.ts.map +1 -0
  83. package/dist/features/chat/queries/use-list-conversations-query.js +2 -14
  84. package/dist/features/chat/store.d.ts +10 -8
  85. package/dist/features/chat/store.d.ts.map +1 -0
  86. package/dist/features/chat/store.js +15 -1
  87. package/dist/features/chat/store.js.map +1 -0
  88. package/dist/features/chat/utils.d.ts +4 -2
  89. package/dist/features/chat/utils.d.ts.map +1 -0
  90. package/dist/features/chat/utils.js +15 -1
  91. package/dist/features/chat/utils.js.map +1 -0
  92. package/dist/features/data-fetching/use-api-client.d.ts +5 -3
  93. package/dist/features/data-fetching/use-api-client.d.ts.map +1 -0
  94. package/dist/features/data-fetching/use-api-client.js +2 -14
  95. package/dist/features/element/chatsdk-provider.d.ts +2 -0
  96. package/dist/features/element/chatsdk-provider.js +23 -0
  97. package/dist/features/element/chatsdk-provider.js.map +1 -0
  98. package/dist/features/element/constants.d.ts +5 -0
  99. package/dist/features/element/constants.d.ts.map +1 -0
  100. package/dist/features/element/constants.js +6 -0
  101. package/dist/features/element/constants.js.map +1 -0
  102. package/dist/features/element/element-provider.d.ts +2 -0
  103. package/dist/features/element/element-provider.js +83 -0
  104. package/dist/features/element/element-provider.js.map +1 -0
  105. package/dist/features/element/store.d.ts +2 -0
  106. package/dist/features/element/store.js +112 -0
  107. package/dist/features/element/store.js.map +1 -0
  108. package/dist/features/element/types/api.d.ts +2 -0
  109. package/dist/features/element/types/api.js +1 -0
  110. package/dist/features/element/types/callbacks.d.ts +2 -0
  111. package/dist/features/element/types/callbacks.js +1 -0
  112. package/dist/features/element/types/config.d.ts +2 -0
  113. package/dist/features/element/types/config.js +1 -0
  114. package/dist/features/element/types/context.d.ts +2 -0
  115. package/dist/features/element/types/context.js +1 -0
  116. package/dist/features/element/types/locale.d.ts +2 -0
  117. package/dist/features/element/types/locale.js +1 -0
  118. package/dist/features/element/types/theme.d.ts +2 -0
  119. package/dist/features/element/types/theme.js +1 -0
  120. package/dist/features/element/types/translations.d.ts +2 -0
  121. package/dist/features/element/types/translations.js +1 -0
  122. package/dist/features/element/use-element-config.d.ts +40 -0
  123. package/dist/features/element/use-element-config.d.ts.map +1 -0
  124. package/dist/features/element/use-element-config.js +39 -0
  125. package/dist/features/element/use-element-config.js.map +1 -0
  126. package/dist/features/element/use-merge-global-config.d.ts +20 -0
  127. package/dist/features/element/use-merge-global-config.d.ts.map +1 -0
  128. package/dist/features/element/use-merge-global-config.js +34 -0
  129. package/dist/features/element/use-merge-global-config.js.map +1 -0
  130. package/dist/features/element/utils.d.ts +2 -0
  131. package/dist/features/element/utils.js +86 -0
  132. package/dist/features/element/utils.js.map +1 -0
  133. package/dist/features/logger/logger.d.ts +2 -9
  134. package/dist/features/logger/logger.js +15 -1
  135. package/dist/features/logger/logger.js.map +1 -0
  136. package/dist/i18n/config.d.ts +2 -61
  137. package/dist/i18n/config.js +2 -1
  138. package/dist/i18n/i18next.d.ts +1382 -10
  139. package/dist/i18n/i18next.d.ts.map +1 -0
  140. package/dist/i18n/i18next.js +27 -2
  141. package/dist/i18n/i18next.js.map +1 -0
  142. package/dist/i18n/utils.d.ts +4 -3
  143. package/dist/i18n/utils.d.ts.map +1 -0
  144. package/dist/i18n/utils.js +10 -3
  145. package/dist/i18n/utils.js.map +1 -0
  146. package/dist/index.d.ts +5 -20
  147. package/dist/index.js +68 -20
  148. package/dist/index.js.map +1 -0
  149. package/dist/locale-W5Kyyi4X.d.ts +11 -0
  150. package/dist/locale-W5Kyyi4X.d.ts.map +1 -0
  151. package/dist/logger-BvmhODdq.d.ts +11 -0
  152. package/dist/logger-BvmhODdq.d.ts.map +1 -0
  153. package/dist/store-CGX9oRlE.d.ts +46 -0
  154. package/dist/store-CGX9oRlE.d.ts.map +1 -0
  155. package/dist/styles.css +1954 -1963
  156. package/dist/theme-Cb-RBWbR.d.ts +38 -0
  157. package/dist/theme-Cb-RBWbR.d.ts.map +1 -0
  158. package/package.json +18 -50
  159. package/dist/chunk-2LHKM7RD.js +0 -14
  160. package/dist/chunk-5UMYP6MD.js +0 -10
  161. package/dist/chunk-AP4MG32M.js +0 -36
  162. package/dist/chunk-CFM57HOS.js +0 -358
  163. package/dist/chunk-EGIUE7H2.js +0 -37
  164. package/dist/chunk-M5OONVIO.js +0 -90
  165. package/dist/chunk-MXTBCHYC.js +0 -31
  166. package/dist/chunk-NIC3MOMY.js +0 -55
  167. package/dist/chunk-QTRMNIG3.js +0 -83
  168. package/dist/chunk-R7G3RQLU.js +0 -36
  169. package/dist/chunk-RJG5D2TM.js +0 -113
  170. package/dist/chunk-SLJNKQ2G.js +0 -125
  171. package/dist/chunk-TDEFIW2L.js +0 -9
  172. package/dist/chunk-TDP6D7U7.js +0 -551
  173. package/dist/chunk-V2ITXC65.js +0 -24
  174. package/dist/chunk-VS55HRUS.js +0 -16
  175. package/dist/chunk-VYDYCGJL.js +0 -25
  176. package/dist/chunk-X5YUF2YM.js +0 -113
  177. package/dist/chunk-YX46JVQN.js +0 -78
  178. package/dist/chunk-YXAMLTTT.js +0 -16
  179. package/dist/chunk-YXFVHSY4.js +0 -51
  180. package/dist/chunk-ZCSZX3OI.js +0 -4
  181. package/dist/common/use-copy-to-clipboard.d.ts +0 -3
  182. package/dist/common/use-copy-to-clipboard.js +0 -33
  183. package/dist/common/utilts.d.ts +0 -8
  184. package/dist/common/utilts.js +0 -28
  185. package/dist/components/ai-elements/actions.d.ts +0 -13
  186. package/dist/components/ai-elements/actions.js +0 -42
  187. package/dist/components/ai-elements/agent.d.ts +0 -31
  188. package/dist/components/ai-elements/agent.js +0 -77
  189. package/dist/components/ai-elements/artifact.d.ts +0 -27
  190. package/dist/components/ai-elements/artifact.js +0 -108
  191. package/dist/components/ai-elements/attachments.d.ts +0 -57
  192. package/dist/components/ai-elements/attachments.js +0 -258
  193. package/dist/components/ai-elements/audio-player.d.ts +0 -33
  194. package/dist/components/ai-elements/audio-player.js +0 -199
  195. package/dist/components/ai-elements/canvas.d.ts +0 -10
  196. package/dist/components/ai-elements/canvas.js +0 -24
  197. package/dist/components/ai-elements/chain-of-thought.d.ts +0 -34
  198. package/dist/components/ai-elements/chain-of-thought.js +0 -159
  199. package/dist/components/ai-elements/checkpoint.d.ts +0 -16
  200. package/dist/components/ai-elements/checkpoint.js +0 -47
  201. package/dist/components/ai-elements/code-block.d.ts +0 -48
  202. package/dist/components/ai-elements/code-block.js +0 -1
  203. package/dist/components/ai-elements/commit.d.ts +0 -68
  204. package/dist/components/ai-elements/commit.js +0 -314
  205. package/dist/components/ai-elements/confirmation.d.ts +0 -52
  206. package/dist/components/ai-elements/confirmation.js +0 -76
  207. package/dist/components/ai-elements/connection.d.ts +0 -5
  208. package/dist/components/ai-elements/connection.js +0 -34
  209. package/dist/components/ai-elements/context.d.ts +0 -36
  210. package/dist/components/ai-elements/context.js +0 -320
  211. package/dist/components/ai-elements/controls.d.ts +0 -8
  212. package/dist/components/ai-elements/controls.js +0 -17
  213. package/dist/components/ai-elements/conversation.d.ts +0 -27
  214. package/dist/components/ai-elements/conversation.js +0 -119
  215. package/dist/components/ai-elements/edge.d.ts +0 -9
  216. package/dist/components/ai-elements/edge.js +0 -111
  217. package/dist/components/ai-elements/environment-variables.d.ts +0 -42
  218. package/dist/components/ai-elements/environment-variables.js +0 -208
  219. package/dist/components/ai-elements/file-tree.d.ts +0 -30
  220. package/dist/components/ai-elements/file-tree.js +0 -212
  221. package/dist/components/ai-elements/image.d.ts +0 -10
  222. package/dist/components/ai-elements/image.js +0 -23
  223. package/dist/components/ai-elements/inline-citation.d.ts +0 -42
  224. package/dist/components/ai-elements/inline-citation.js +0 -203
  225. package/dist/components/ai-elements/jsx-preview.d.ts +0 -33
  226. package/dist/components/ai-elements/jsx-preview.js +0 -206
  227. package/dist/components/ai-elements/loader.d.ts +0 -9
  228. package/dist/components/ai-elements/loader.js +0 -115
  229. package/dist/components/ai-elements/message.d.ts +0 -42
  230. package/dist/components/ai-elements/message.js +0 -259
  231. package/dist/components/ai-elements/mic-selector.d.ts +0 -49
  232. package/dist/components/ai-elements/mic-selector.js +0 -252
  233. package/dist/components/ai-elements/model-selector.d.ts +0 -39
  234. package/dist/components/ai-elements/model-selector.js +0 -73
  235. package/dist/components/ai-elements/node.d.ts +0 -25
  236. package/dist/components/ai-elements/node.js +0 -41
  237. package/dist/components/ai-elements/open-in-chat.d.ts +0 -32
  238. package/dist/components/ai-elements/open-in-chat.js +0 -366
  239. package/dist/components/ai-elements/package-info.d.ts +0 -32
  240. package/dist/components/ai-elements/package-info.js +0 -162
  241. package/dist/components/ai-elements/panel.d.ts +0 -8
  242. package/dist/components/ai-elements/panel.js +0 -17
  243. package/dist/components/ai-elements/persona.d.ts +0 -50
  244. package/dist/components/ai-elements/persona.js +0 -209
  245. package/dist/components/ai-elements/plan.d.ts +0 -29
  246. package/dist/components/ai-elements/plan.js +0 -95
  247. package/dist/components/ai-elements/prompt-input.d.ts +0 -153
  248. package/dist/components/ai-elements/prompt-input.js +0 -939
  249. package/dist/components/ai-elements/queue.d.ts +0 -65
  250. package/dist/components/ai-elements/queue.js +0 -179
  251. package/dist/components/ai-elements/reasoning.d.ts +0 -30
  252. package/dist/components/ai-elements/reasoning.js +0 -161
  253. package/dist/components/ai-elements/response.d.ts +0 -9
  254. package/dist/components/ai-elements/response.js +0 -33
  255. package/dist/components/ai-elements/sandbox.d.ts +0 -28
  256. package/dist/components/ai-elements/sandbox.js +0 -98
  257. package/dist/components/ai-elements/schema-display.d.ts +0 -58
  258. package/dist/components/ai-elements/schema-display.js +0 -313
  259. package/dist/components/ai-elements/shimmer.d.ts +0 -14
  260. package/dist/components/ai-elements/shimmer.js +0 -1
  261. package/dist/components/ai-elements/snippet.d.ts +0 -22
  262. package/dist/components/ai-elements/snippet.js +0 -90
  263. package/dist/components/ai-elements/sources.d.ts +0 -16
  264. package/dist/components/ai-elements/sources.js +0 -62
  265. package/dist/components/ai-elements/speech-input.d.ts +0 -57
  266. package/dist/components/ai-elements/speech-input.js +0 -206
  267. package/dist/components/ai-elements/stack-trace.d.ts +0 -42
  268. package/dist/components/ai-elements/stack-trace.js +0 -377
  269. package/dist/components/ai-elements/suggestion.d.ts +0 -14
  270. package/dist/components/ai-elements/suggestion.js +0 -41
  271. package/dist/components/ai-elements/task.d.ts +0 -18
  272. package/dist/components/ai-elements/task.js +0 -60
  273. package/dist/components/ai-elements/terminal.d.ts +0 -31
  274. package/dist/components/ai-elements/terminal.js +0 -203
  275. package/dist/components/ai-elements/test-results.d.ts +0 -61
  276. package/dist/components/ai-elements/test-results.js +0 -349
  277. package/dist/components/ai-elements/tool.d.ts +0 -35
  278. package/dist/components/ai-elements/tool.js +0 -2
  279. package/dist/components/ai-elements/toolbar.d.ts +0 -8
  280. package/dist/components/ai-elements/toolbar.js +0 -18
  281. package/dist/components/ai-elements/transcription.d.ts +0 -19
  282. package/dist/components/ai-elements/transcription.js +0 -90
  283. package/dist/components/ai-elements/voice-selector.d.ts +0 -66
  284. package/dist/components/ai-elements/voice-selector.js +0 -332
  285. package/dist/components/ai-elements/web-preview.d.ts +0 -38
  286. package/dist/components/ai-elements/web-preview.js +0 -214
  287. package/dist/components/responsive-alert-dialog.d.ts +0 -19
  288. package/dist/components/responsive-alert-dialog.js +0 -1
  289. package/dist/components/responsive-dialog.d.ts +0 -14
  290. package/dist/components/responsive-dialog.js +0 -1
  291. package/dist/config-IcWUmjwj.d.ts +0 -239
  292. package/dist/features/chat/chat-element/chat-element.d.ts +0 -8
  293. package/dist/features/chat/chat-element/chat-element.js +0 -14
  294. package/dist/features/chat/chat-element/use-chat.d.ts +0 -21
  295. package/dist/features/chat/chat-element/use-chat.js +0 -14
  296. package/dist/features/chat/chat-element/use-initial-messages.d.ts +0 -20
  297. package/dist/features/chat/chat-element/use-initial-messages.js +0 -14
  298. package/dist/features/chat/chat-message.d.ts +0 -10
  299. package/dist/features/chat/chat-message.js +0 -1
  300. package/dist/features/chat/chat-molecule.d.ts +0 -35
  301. package/dist/features/chat/chat-molecule.js +0 -14
  302. package/dist/features/molecule/chatsdk-provider.d.ts +0 -19
  303. package/dist/features/molecule/chatsdk-provider.js +0 -26
  304. package/dist/features/molecule/constants.d.ts +0 -3
  305. package/dist/features/molecule/constants.js +0 -1
  306. package/dist/features/molecule/molecule-provider.d.ts +0 -39
  307. package/dist/features/molecule/molecule-provider.js +0 -1
  308. package/dist/features/molecule/store.d.ts +0 -53
  309. package/dist/features/molecule/store.js +0 -3
  310. package/dist/features/molecule/types/api.d.ts +0 -8
  311. package/dist/features/molecule/types/api.js +0 -1
  312. package/dist/features/molecule/types/callbacks.d.ts +0 -22
  313. package/dist/features/molecule/types/callbacks.js +0 -1
  314. package/dist/features/molecule/types/config.d.ts +0 -10
  315. package/dist/features/molecule/types/config.js +0 -1
  316. package/dist/features/molecule/types/context.d.ts +0 -11
  317. package/dist/features/molecule/types/context.js +0 -1
  318. package/dist/features/molecule/types/locale.d.ts +0 -9
  319. package/dist/features/molecule/types/locale.js +0 -1
  320. package/dist/features/molecule/types/theme.d.ts +0 -38
  321. package/dist/features/molecule/types/theme.js +0 -1
  322. package/dist/features/molecule/types/translations.d.ts +0 -10
  323. package/dist/features/molecule/types/translations.js +0 -1
  324. package/dist/features/molecule/use-merge-global-config.d.ts +0 -22
  325. package/dist/features/molecule/use-merge-global-config.js +0 -5
  326. package/dist/features/molecule/use-molecule-config.d.ts +0 -41
  327. package/dist/features/molecule/use-molecule-config.js +0 -6
  328. package/dist/features/molecule/utils.d.ts +0 -10
  329. package/dist/features/molecule/utils.js +0 -1
package/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # @chatsdk-dev/elements
1
+ # Elements
2
2
 
3
3
  AI components for ChatSDK
4
4
 
@@ -18,7 +18,7 @@ import "@chatsdk-dev/elements/styles.css";
18
18
 
19
19
  function App() {
20
20
  return (
21
- <MoleculeProvider
21
+ <ChatSDKProvider
22
22
  config={{
23
23
  api: {
24
24
  convexUrl: process.env.NEXT_PUBLIC_CONVEX_CLOUD_URL,
@@ -26,7 +26,7 @@ function App() {
26
26
  }}
27
27
  >
28
28
  <Chat />
29
- </MoleculeProvider>
29
+ </ChatSDKProvider>
30
30
  );
31
31
  }
32
32
  ```
@@ -0,0 +1,10 @@
1
+ import { Config } from "@chatsdk-dev/api-client";
2
+
3
+ //#region src/features/element/types/api.d.ts
4
+ type APIOptions = Omit<Config, "headers"> & {
5
+ version?: "internal" | "v1";
6
+ headers?: Record<string, string>;
7
+ } & Omit<RequestInit, "headers">;
8
+ //#endregion
9
+ export { APIOptions as t };
10
+ //# sourceMappingURL=api-CIYPz72L.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-CIYPz72L.d.ts","names":[],"sources":["../src/features/element/types/api.ts"],"mappings":";;;KAEY,UAAA,GAAa,IAAA,CAAK,MAAA;EAC5B,OAAA;EACA,OAAA,GAAU,MAAA;AAAA,IACR,IAAA,CAAK,WAAA"}
@@ -0,0 +1,24 @@
1
+ //#region src/features/element/types/callbacks.d.ts
2
+ interface Callbacks<T> {
3
+ /** Callback function called when the component's query is loading (in flight)
4
+ * @type function
5
+ * @category Callbacks
6
+ * @details () => void
7
+ */
8
+ onloading?: () => void;
9
+ /** Callback function called when the component's query is successful, will receive the data as an argument that is forwarded to the rendering client as an argument
10
+ * @type function
11
+ * @category Callbacks
12
+ * @details (data: T) => void
13
+ */
14
+ onsuccess?: (data: T) => void;
15
+ /** Callback function called when the component's query is unsuccessful, will receive the error as an argument
16
+ * @type function
17
+ * @category Callbacks
18
+ * @details (error: string) => void
19
+ */
20
+ onerror?: (error: string) => void;
21
+ }
22
+ //#endregion
23
+ export { Callbacks as t };
24
+ //# sourceMappingURL=callbacks-PIvHXeEI.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callbacks-PIvHXeEI.d.ts","names":[],"sources":["../src/features/element/types/callbacks.tsx"],"mappings":";UAAiB,SAAA;EAAA;;;;;EAMf,SAAA;EAMA;;;;;EAAA,SAAA,IAAa,IAAA,EAAM,CAAA;EAMK;;;;;EAAxB,OAAA,IAAW,KAAA;AAAA"}
@@ -0,0 +1,441 @@
1
+ import { createElementContext } from "./features/element/element-provider.js";
2
+ import { useMergeElementConfig } from "./features/element/use-element-config.js";
3
+ import { chatQueryKeys } from "./features/chat/queries/query-keys.js";
4
+ import { useChatStore } from "./features/chat/store.js";
5
+ import { ChatMenu } from "./features/chat/chat-header/chat-menu.js";
6
+ import { renderRelativeTime } from "./common/utils.js";
7
+ import { ChatHistoryEmpty } from "./features/chat/chat-history/chat-history-empty.js";
8
+ import { getInitialMessagesFromStrings } from "./features/chat/utils.js";
9
+ import { ArrowLeft, CheckIcon, GlobeIcon, Plus } from "lucide-react";
10
+ import { Fragment, useEffect, useMemo, useRef, useState } from "react";
11
+ import { jsx, jsxs } from "react/jsx-runtime";
12
+ import { useQuery, useQueryClient } from "@tanstack/react-query";
13
+ import { useTranslation } from "react-i18next";
14
+ import { Card, CardHeader, CardTitle } from "@chatsdk-dev/ui/atoms/card";
15
+ import { DotsLoader } from "@chatsdk-dev/ui/atoms/dots-loader";
16
+ import { Text } from "@chatsdk-dev/ui/atoms/typography/text";
17
+ import { Button } from "@chatsdk-dev/ui/atoms/button";
18
+ import { getClient } from "@chatsdk-dev/api-client";
19
+ import { Conversation, ConversationContent, ConversationScrollButton } from "@chatsdk-dev/ui/molecules/ai/conversation";
20
+ import { ChatMessage } from "@chatsdk-dev/ui/molecules/chat-message";
21
+ import { PromptInput, PromptInputButton, PromptInputSubmit, PromptInputTextarea, PromptInputTools } from "@chatsdk-dev/ui/molecules/ai/prompt-input";
22
+ import { ModelSelector, ModelSelectorContent, ModelSelectorEmpty, ModelSelectorGroup, ModelSelectorInput, ModelSelectorItem, ModelSelectorList, ModelSelectorLogo, ModelSelectorLogoGroup, ModelSelectorName, ModelSelectorTrigger } from "@chatsdk-dev/ui/molecules/ai/model-selector";
23
+ import { useChat } from "@ai-sdk/react";
24
+ import { DefaultChatTransport } from "ai";
25
+ //#region src/features/data-fetching/use-api-client.ts
26
+ function useApiClient() {
27
+ const { api } = useElementConfig();
28
+ return getClient(api ?? {});
29
+ }
30
+ //#endregion
31
+ //#region src/features/chat/queries/use-get-chat-query.ts
32
+ function useGetChatQuery({ chatId }) {
33
+ const client = useApiClient();
34
+ return useQuery({
35
+ queryKey: chatQueryKeys.get(chatId),
36
+ queryFn: async () => {
37
+ const { data, error } = await client.chats.get({ path: { chatId } });
38
+ if (error) throw new Error("error" in error ? error.error : "Failed to fetch chat");
39
+ return data;
40
+ },
41
+ enabled: !!chatId
42
+ });
43
+ }
44
+ //#endregion
45
+ //#region src/features/chat/chat-header/chat-header.tsx
46
+ function ChatHeader({ chatId }) {
47
+ const { t } = useTranslation();
48
+ const { tab, setTab } = useChatStore();
49
+ const { data } = useGetChatQuery({ chatId });
50
+ const [_, setImgLoaded] = useState(false);
51
+ const name = data?.chatAppearanceSettings?.displayName;
52
+ const iconUrl = data?.chatAppearanceSettings?.icon?.url;
53
+ return /* @__PURE__ */ jsxs(CardHeader, {
54
+ className: "flex justify-between items-center h-14 bg-slate-900 dark:bg-zinc-400 rounded-t-lg px-4!",
55
+ children: [/* @__PURE__ */ jsxs(CardTitle, { children: [tab === "chat" && /* @__PURE__ */ jsxs("div", {
56
+ className: "flex items-center gap-2",
57
+ children: [iconUrl && /* @__PURE__ */ jsx("img", {
58
+ src: iconUrl,
59
+ alt: "Chat Icon",
60
+ className: "inline-block w-4 h-4",
61
+ onLoad: () => setImgLoaded(true)
62
+ }), /* @__PURE__ */ jsx(Text, {
63
+ variant: "h1",
64
+ className: "text-sm text-background flex items-center gap-2",
65
+ children: name
66
+ })]
67
+ }), tab === "history" && /* @__PURE__ */ jsxs("div", {
68
+ className: "flex items-center gap-2",
69
+ children: [/* @__PURE__ */ jsx(Button, {
70
+ onClick: () => setTab("chat"),
71
+ variant: "transparent",
72
+ className: "p-0!",
73
+ children: /* @__PURE__ */ jsx(ArrowLeft, { className: "size-4" })
74
+ }), /* @__PURE__ */ jsx(Text, {
75
+ variant: "h1",
76
+ className: "text-sm text-background flex items-center gap-2",
77
+ children: t("header.history-tab-label")
78
+ })]
79
+ })] }), tab === "chat" && /* @__PURE__ */ jsx(ChatMenu, {})]
80
+ });
81
+ }
82
+ //#endregion
83
+ //#region src/features/chat/queries/use-list-conversations-query.ts
84
+ function useListConversationsQuery({ chatId }) {
85
+ const client = useApiClient();
86
+ const { context } = useElementConfig();
87
+ return useQuery({
88
+ queryKey: chatQueryKeys.listConversations(chatId),
89
+ queryFn: async () => {
90
+ const { data, error } = await client.chats.conversations.list({
91
+ path: { chatId },
92
+ query: { actorId: context?.actor?.id ?? "" }
93
+ });
94
+ if (error) throw new Error("error" in error ? error.error : "Failed to fetch conversations");
95
+ return data.conversations.reverse();
96
+ },
97
+ enabled: !!chatId
98
+ });
99
+ }
100
+ //#endregion
101
+ //#region src/features/chat/chat-history/chat-history.tsx
102
+ function ChatHistory() {
103
+ const { t, i18n } = useTranslation("chat", { keyPrefix: "history" });
104
+ const queryClient = useQueryClient();
105
+ const { chatId } = useElementComponent();
106
+ const { data, isLoading } = useListConversationsQuery({ chatId });
107
+ const { setSelectedConversationId, setTab, setConversationType } = useChatStore();
108
+ if (isLoading) return /* @__PURE__ */ jsx("div", {
109
+ className: "w-full h-full flex items-center justify-center",
110
+ children: /* @__PURE__ */ jsx(DotsLoader, {})
111
+ });
112
+ return /* @__PURE__ */ jsxs("div", {
113
+ className: "flex-1 min-h-0 flex flex-col gap-1 overflow-y-auto gap-2 p-2",
114
+ children: [data?.length === 0 ? /* @__PURE__ */ jsx(ChatHistoryEmpty, {}) : data?.map((conversation, index) => /* @__PURE__ */ jsxs(Button, {
115
+ variant: "ghost",
116
+ className: "flex flex-col items-start justify-center gap-2 px-3 py-2 h-auto text-left",
117
+ onClick: () => {
118
+ queryClient.invalidateQueries({ queryKey: chatQueryKeys.conversation(chatId, conversation._id) });
119
+ setSelectedConversationId(conversation._id);
120
+ setTab("chat");
121
+ setConversationType("history");
122
+ },
123
+ children: [/* @__PURE__ */ jsxs("div", {
124
+ className: "self-stretch flex justify-between gap-1",
125
+ children: [/* @__PURE__ */ jsxs(Text, {
126
+ className: "truncate text-sm",
127
+ children: [
128
+ data.length - index,
129
+ ":",
130
+ " ",
131
+ conversation.title ?? t("unitled-conversation")
132
+ ]
133
+ }), /* @__PURE__ */ jsx(Text, {
134
+ variant: "tiny",
135
+ color: "muted",
136
+ children: renderRelativeTime({
137
+ date: conversation._creationTime,
138
+ locale: i18n.language
139
+ })
140
+ })]
141
+ }), /* @__PURE__ */ jsx(Text, {
142
+ className: "flex-1 min-w-0 max-w-full truncate",
143
+ variant: "paragraph2",
144
+ color: "muted",
145
+ children: conversation.summary
146
+ })]
147
+ }, conversation._id)), /* @__PURE__ */ jsxs(Button, {
148
+ className: "absolute bottom-6 left-1/2 -translate-x-1/2",
149
+ onClick: () => {
150
+ setConversationType("new");
151
+ setSelectedConversationId();
152
+ setTab("chat");
153
+ },
154
+ children: [/* @__PURE__ */ jsx(Plus, { className: "size-4" }), t("new-conversation")]
155
+ })]
156
+ });
157
+ }
158
+ //#endregion
159
+ //#region src/features/chat/chat-prompt-input.tsx
160
+ function ChatPromptInput({ chatId, onSubmit, onModelChange, status, ref }) {
161
+ const { data } = useGetChatQuery({ chatId });
162
+ const defaultModel = data?.chatModelSettings?.defaultModel;
163
+ const allowedModels = data?.chatModelSettings?.allowedModels;
164
+ const [input, setInput] = useState("");
165
+ const [model, setModel] = useState(defaultModel?.name);
166
+ const [modelSelectorOpen, setModelSelectorOpen] = useState(false);
167
+ const [webSearch, setWebSearch] = useState(false);
168
+ const selectedModel = allowedModels?.find((m) => m.name === model);
169
+ const modelGroups = allowedModels?.map((m) => m.chef);
170
+ const hasMultipleModels = allowedModels && allowedModels.length > 1;
171
+ const hasActions = hasMultipleModels || true;
172
+ return /* @__PURE__ */ jsxs("div", {
173
+ className: "flex flex-col gap-1",
174
+ children: [/* @__PURE__ */ jsxs(PromptInput, {
175
+ onSubmit: (message, event) => {
176
+ onSubmit(message, event);
177
+ setInput("");
178
+ },
179
+ children: [/* @__PURE__ */ jsx(PromptInputTextarea, {
180
+ ref,
181
+ placeholder: data?.chatBaseSettings?.inputPlaceholder,
182
+ onChange: (e) => setInput(e.target.value),
183
+ value: input
184
+ }), /* @__PURE__ */ jsx(PromptInputSubmit, {
185
+ className: "m-1.5 self-end",
186
+ disabled: !input,
187
+ status
188
+ })]
189
+ }), hasActions && /* @__PURE__ */ jsxs(PromptInputTools, { children: [/* @__PURE__ */ jsxs(PromptInputButton, {
190
+ variant: webSearch ? "primary" : "ghost",
191
+ onClick: () => setWebSearch(!webSearch),
192
+ children: [/* @__PURE__ */ jsx(GlobeIcon, { size: 16 }), /* @__PURE__ */ jsx("span", { children: "Search" })]
193
+ }), hasMultipleModels && /* @__PURE__ */ jsxs(ModelSelector, {
194
+ onOpenChange: setModelSelectorOpen,
195
+ open: modelSelectorOpen,
196
+ children: [/* @__PURE__ */ jsx(ModelSelectorTrigger, { children: /* @__PURE__ */ jsxs(PromptInputButton, { children: [selectedModel?.chefSlug && /* @__PURE__ */ jsx(ModelSelectorLogo, { provider: selectedModel.chefSlug }), /* @__PURE__ */ jsx(ModelSelectorName, { children: selectedModel?.name })] }) }), /* @__PURE__ */ jsxs(ModelSelectorContent, { children: [/* @__PURE__ */ jsx(ModelSelectorInput, { placeholder: "Search models..." }), /* @__PURE__ */ jsxs(ModelSelectorList, { children: [/* @__PURE__ */ jsx(ModelSelectorEmpty, { children: "No models found." }), modelGroups?.map((chef) => /* @__PURE__ */ jsx(ModelSelectorGroup, {
197
+ heading: chef,
198
+ children: allowedModels.filter((m) => m.chef === chef).map((m) => /* @__PURE__ */ jsxs(ModelSelectorItem, {
199
+ onSelect: () => {
200
+ setModel(m.name);
201
+ onModelChange?.(m);
202
+ setModelSelectorOpen(false);
203
+ },
204
+ value: m.name,
205
+ children: [
206
+ /* @__PURE__ */ jsx(ModelSelectorLogo, { provider: m.chefSlug }),
207
+ /* @__PURE__ */ jsx(ModelSelectorName, { children: m.name }),
208
+ /* @__PURE__ */ jsx(ModelSelectorLogoGroup, { children: m.providers.map((provider) => /* @__PURE__ */ jsx(ModelSelectorLogo, { provider }, provider)) }),
209
+ selectedModel?.name === m.name ? /* @__PURE__ */ jsx(CheckIcon, { className: "ml-auto size-4" }) : /* @__PURE__ */ jsx("div", { className: "ml-auto size-4" })
210
+ ]
211
+ }, m.name))
212
+ }, chef))] })] })]
213
+ })] })]
214
+ });
215
+ }
216
+ //#endregion
217
+ //#region src/features/chat/queries/use-get-conversation-query.ts
218
+ async function getConversation({ client, chatId, actorId, conversationId }) {
219
+ if (!conversationId) {
220
+ const { data: newConversation, error } = await client.chats.conversations.create({
221
+ path: { chatId },
222
+ body: { actorId }
223
+ });
224
+ if (error) throw new Error("error" in error ? error.error : "Failed to create conversation");
225
+ useChatStore.setState({
226
+ ...useChatStore.getState(),
227
+ selectedConversationId: newConversation._id
228
+ });
229
+ return newConversation;
230
+ }
231
+ const { data, error } = await client.chats.conversations.get({ path: {
232
+ chatId,
233
+ conversationId
234
+ } });
235
+ if (error) throw new Error("error" in error ? error.error : "Failed to fetch conversation");
236
+ return data;
237
+ }
238
+ function getConversationQueryConfig({ chatId, conversationId, client, actorId }) {
239
+ return {
240
+ queryKey: chatQueryKeys.conversation(chatId, conversationId),
241
+ queryFn: () => getConversation({
242
+ client,
243
+ chatId,
244
+ conversationId,
245
+ actorId
246
+ })
247
+ };
248
+ }
249
+ function useGetConversationQuery({ chatId, conversationId }) {
250
+ const client = useApiClient();
251
+ const { context } = useElementConfig();
252
+ return useQuery({
253
+ ...getConversationQueryConfig({
254
+ chatId,
255
+ conversationId,
256
+ client,
257
+ actorId: context?.actor?.id ?? ""
258
+ }),
259
+ enabled: !!chatId,
260
+ staleTime: 200
261
+ });
262
+ }
263
+ //#endregion
264
+ //#region src/features/chat/chat-main/use-initial-messages.tsx
265
+ function useInitialMessages() {
266
+ const { selectedConversationId } = useChatStore();
267
+ const { chatId } = useElementComponent();
268
+ const { data } = useGetChatQuery({ chatId });
269
+ const { data: conversation } = useGetConversationQuery({
270
+ chatId,
271
+ conversationId: selectedConversationId
272
+ });
273
+ const conversationMessages = useMemo(() => {
274
+ if (!selectedConversationId) return void 0;
275
+ return conversation?.messages?.map((msg) => {
276
+ return {
277
+ id: msg.id,
278
+ role: msg.role,
279
+ parts: msg.parts.map((p) => ({
280
+ type: "text",
281
+ text: p.text ?? ""
282
+ })),
283
+ metadata: msg
284
+ };
285
+ });
286
+ }, [conversation, selectedConversationId]);
287
+ return useMemo(() => {
288
+ return [...getInitialMessagesFromStrings(data?.chatBaseSettings?.initialChatMessages ?? []), ...conversationMessages ?? []];
289
+ }, [data?.chatBaseSettings?.initialChatMessages, conversationMessages]);
290
+ }
291
+ //#endregion
292
+ //#region src/features/chat/chat-main/use-chat.tsx
293
+ function useChat$1() {
294
+ const client = useApiClient();
295
+ const { config, component } = useElement();
296
+ const { selectedConversationId, conversationType } = useChatStore();
297
+ const initialMessages = useInitialMessages();
298
+ const useChatResult = useChat({
299
+ messages: initialMessages,
300
+ transport: new DefaultChatTransport({
301
+ prepareSendMessagesRequest: ({ body, headers, credentials, id, messages, trigger, messageId }) => {
302
+ return {
303
+ api: client.getUrl("chats.conversations.completion", {
304
+ chatId: component.chatId,
305
+ conversationId: body?.conversationId || "new"
306
+ }),
307
+ body: {
308
+ ...body,
309
+ id,
310
+ messages,
311
+ trigger,
312
+ messageId
313
+ },
314
+ headers,
315
+ credentials
316
+ };
317
+ },
318
+ headers: { ...config.api?.headers }
319
+ })
320
+ });
321
+ useEffect(() => {
322
+ if (conversationType === "history" || !selectedConversationId) {
323
+ useChatResult.stop();
324
+ useChatResult.setMessages(initialMessages);
325
+ }
326
+ }, [
327
+ conversationType,
328
+ selectedConversationId,
329
+ initialMessages
330
+ ]);
331
+ return useChatResult;
332
+ }
333
+ //#endregion
334
+ //#region src/features/chat/chat-main/chat-main.tsx
335
+ function ChatMain() {
336
+ const queryClient = useQueryClient();
337
+ const client = useApiClient();
338
+ const { chatId } = useElementComponent();
339
+ const { context } = useElementConfig();
340
+ const { selectedConversationId } = useChatStore();
341
+ const { data: conversation } = useGetConversationQuery({
342
+ chatId,
343
+ conversationId: selectedConversationId
344
+ });
345
+ const { messages, sendMessage, status } = useChat$1();
346
+ const promptInputRef = useRef(null);
347
+ useEffect(() => {
348
+ promptInputRef.current?.focus();
349
+ }, [selectedConversationId]);
350
+ const handleSubmit = async (message) => {
351
+ let conversationId = conversation?._id;
352
+ if (!conversation) conversationId = (await queryClient.fetchQuery({ ...getConversationQueryConfig({
353
+ chatId,
354
+ conversationId: selectedConversationId,
355
+ client,
356
+ actorId: context?.actor?.id ?? ""
357
+ }) }))._id;
358
+ sendMessage({ text: message.text }, { body: { conversationId } });
359
+ };
360
+ const lastMessage = messages[messages.length - 1];
361
+ const isWaitingForContent = status === "submitted" || status === "streaming" && lastMessage?.role === "assistant" && !lastMessage.parts.some((part) => part.type === "text" && part.text.length > 0);
362
+ return /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsxs(Conversation, { children: [/* @__PURE__ */ jsxs(ConversationContent, { children: [/* @__PURE__ */ jsx(ChatMessage, {
363
+ messages,
364
+ status
365
+ }), isWaitingForContent && /* @__PURE__ */ jsx(DotsLoader, {})] }), /* @__PURE__ */ jsx(ConversationScrollButton, {})] }), /* @__PURE__ */ jsx("div", {
366
+ className: "m-4 my-2",
367
+ children: /* @__PURE__ */ jsx(ChatPromptInput, {
368
+ ref: promptInputRef,
369
+ chatId,
370
+ onSubmit: handleSubmit,
371
+ status
372
+ })
373
+ })] });
374
+ }
375
+ ChatMain.displayName = "ChatMain";
376
+ //#endregion
377
+ //#region src/features/chat/chat-card.tsx
378
+ function ChatCard() {
379
+ const { t } = useTranslation();
380
+ const { chatId } = useElementComponent();
381
+ const { tab, selectedConversationId, conversationType } = useChatStore();
382
+ useListConversationsQuery({ chatId });
383
+ const { isLoading, data: chat } = useGetChatQuery({ chatId });
384
+ const { isLoading: isConversationLoading } = useGetConversationQuery({
385
+ chatId,
386
+ conversationId: selectedConversationId
387
+ });
388
+ const canCreateMessage = chat?.chatModelSettings?.allowedModels && chat?.chatModelSettings?.allowedModels.length > 0;
389
+ if (!canCreateMessage && chat?.chatBaseSettings?.hideChatWhenInsufficientCredits) return null;
390
+ return /* @__PURE__ */ jsxs(Card, {
391
+ className: "min-w-[320px] h-[640px] w-[400px] flex flex-col relative p-0 rounded-lg gap-0",
392
+ children: [
393
+ isLoading && /* @__PURE__ */ jsx("div", {
394
+ className: "absolute inset-0 flex items-center justify-center z-10 bg-card rounded-lg",
395
+ children: /* @__PURE__ */ jsx(DotsLoader, {})
396
+ }),
397
+ /* @__PURE__ */ jsx(ChatHeader, { chatId }),
398
+ conversationType === "history" && isConversationLoading && /* @__PURE__ */ jsx("div", {
399
+ className: "flex-1 flex items-center justify-center z-10 bg-card rounded-lg",
400
+ children: /* @__PURE__ */ jsx(DotsLoader, {})
401
+ }),
402
+ !isLoading && (conversationType === "new" || !isConversationLoading) && /* @__PURE__ */ jsxs("div", {
403
+ className: tab !== "chat" ? "hidden" : "flex flex-col flex-1 min-h-0",
404
+ children: [conversationType === "history" && isConversationLoading && /* @__PURE__ */ jsx("div", {
405
+ className: "absolute inset-0 flex items-center justify-center z-10 bg-card rounded-lg",
406
+ children: /* @__PURE__ */ jsx(DotsLoader, {})
407
+ }), canCreateMessage ? /* @__PURE__ */ jsx(ChatMain, {}) : /* @__PURE__ */ jsx("div", {
408
+ className: "m-4 h-full flex items-center justify-center",
409
+ children: /* @__PURE__ */ jsx(Text, {
410
+ variant: "paragraph1",
411
+ color: "muted",
412
+ className: "text-center font-light italic",
413
+ children: t("chat-card.insufficient-credits-error")
414
+ })
415
+ })]
416
+ }),
417
+ !isLoading && tab === "history" && /* @__PURE__ */ jsx(ChatHistory, {})
418
+ ]
419
+ });
420
+ }
421
+ //#endregion
422
+ //#region src/features/chat/chat-element.tsx
423
+ const { ElementProvider, useElement, useElementConfig, useElementComponent, useElementCallbacks } = createElementContext({ name: "ChatSDK.Chat" });
424
+ function ChatElement(props) {
425
+ const { config, callbacks, ...componentProps } = useMergeElementConfig({
426
+ props,
427
+ name: "ChatSDK.Chat"
428
+ });
429
+ if (!componentProps.chatId) return null;
430
+ return /* @__PURE__ */ jsx(ElementProvider, {
431
+ config,
432
+ component: componentProps,
433
+ callbacks,
434
+ children: /* @__PURE__ */ jsx(ChatCard, {})
435
+ });
436
+ }
437
+ ChatElement.displayName = "ChatSDK.ChatElement";
438
+ //#endregion
439
+ export { useGetChatQuery as _, useElementComponent as a, ChatMain as c, getConversationQueryConfig as d, useGetConversationQuery as f, ChatHeader as g, useListConversationsQuery as h, useElementCallbacks as i, useChat$1 as l, ChatHistory as m, ElementProvider as n, useElementConfig as o, ChatPromptInput as p, useElement as r, ChatCard as s, ChatElement as t, useInitialMessages as u, useApiClient as v };
440
+
441
+ //# sourceMappingURL=chat-element-CCsDDFif.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-element-CCsDDFif.js","names":["useChat","useAiChat","useChat"],"sources":["../src/features/data-fetching/use-api-client.ts","../src/features/chat/queries/use-get-chat-query.ts","../src/features/chat/chat-header/chat-header.tsx","../src/features/chat/queries/use-list-conversations-query.ts","../src/features/chat/chat-history/chat-history.tsx","../src/features/chat/chat-prompt-input.tsx","../src/features/chat/queries/use-get-conversation-query.ts","../src/features/chat/chat-main/use-initial-messages.tsx","../src/features/chat/chat-main/use-chat.tsx","../src/features/chat/chat-main/chat-main.tsx","../src/features/chat/chat-card.tsx","../src/features/chat/chat-element.tsx"],"sourcesContent":["import { getClient } from \"@chatsdk-dev/api-client\";\nimport { useElementConfig } from \"../chat/chat-element\";\n\nexport function useApiClient() {\n const { api } = useElementConfig();\n return getClient(api ?? {});\n}\n","import { useQuery } from \"@tanstack/react-query\";\n\nimport { useApiClient } from \"../../data-fetching/use-api-client\";\nimport { chatQueryKeys } from \"./query-keys\";\n\ninterface UseGetChatQueryProps {\n chatId?: string;\n}\n\nexport function useGetChatQuery({ chatId }: UseGetChatQueryProps) {\n const client = useApiClient();\n\n return useQuery({\n queryKey: chatQueryKeys.get(chatId),\n queryFn: async () => {\n const { data, error } = await client.chats.get({\n path: { chatId: chatId! },\n });\n\n if (error) {\n throw new Error(\n \"error\" in error ? error.error : \"Failed to fetch chat\",\n );\n }\n\n return data;\n },\n enabled: !!chatId,\n });\n}\n","import { ArrowLeft } from \"lucide-react\";\nimport { useState } from \"react\";\nimport { useTranslation } from \"react-i18next\";\n\nimport { Button } from \"@chatsdk-dev/ui/atoms/button\";\nimport { CardHeader, CardTitle } from \"@chatsdk-dev/ui/atoms/card\";\nimport { Text } from \"@chatsdk-dev/ui/atoms/typography/text\";\n\nimport { useGetChatQuery } from \"../queries/use-get-chat-query\";\nimport { useChatStore } from \"../store\";\nimport { ChatMenu } from \"./chat-menu\";\n\ninterface ChatTitleProps {\n chatId?: string;\n}\n\nexport function ChatHeader({ chatId }: ChatTitleProps) {\n const { t } = useTranslation();\n const { tab, setTab } = useChatStore();\n const { data } = useGetChatQuery({ chatId });\n // TODO: fix initial loading visuals here (uncached image)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [_, setImgLoaded] = useState(false);\n\n const name = data?.chatAppearanceSettings?.displayName;\n const iconUrl = data?.chatAppearanceSettings?.icon?.url;\n\n return (\n <CardHeader className=\"flex justify-between items-center h-14 bg-slate-900 dark:bg-zinc-400 rounded-t-lg px-4!\">\n <CardTitle>\n {tab === \"chat\" && (\n <div className=\"flex items-center gap-2\">\n {iconUrl && (\n <img\n src={iconUrl}\n alt=\"Chat Icon\"\n className=\"inline-block w-4 h-4\"\n onLoad={() => setImgLoaded(true)}\n />\n )}\n <Text\n variant=\"h1\"\n className=\"text-sm text-background flex items-center gap-2\"\n >\n {name}\n </Text>\n </div>\n )}\n {tab === \"history\" && (\n <div className=\"flex items-center gap-2\">\n <Button\n onClick={() => setTab(\"chat\")}\n variant=\"transparent\"\n className=\"p-0!\"\n >\n <ArrowLeft className=\"size-4\" />\n </Button>\n <Text\n variant=\"h1\"\n className=\"text-sm text-background flex items-center gap-2\"\n >\n {t(\"header.history-tab-label\")}\n </Text>\n </div>\n )}\n </CardTitle>\n {tab === \"chat\" && <ChatMenu />}\n </CardHeader>\n );\n}\n","import { useQuery } from \"@tanstack/react-query\";\n\nimport { useApiClient } from \"../../data-fetching/use-api-client\";\nimport { useElementConfig } from \"../chat-element\";\nimport { chatQueryKeys } from \"./query-keys\";\n\ninterface UseListConversationsQueryProps {\n chatId: string;\n}\n\nexport function useListConversationsQuery({\n chatId,\n}: UseListConversationsQueryProps) {\n const client = useApiClient();\n const { context } = useElementConfig();\n\n return useQuery({\n queryKey: chatQueryKeys.listConversations(chatId),\n queryFn: async () => {\n const { data, error } = await client.chats.conversations.list({\n path: { chatId },\n query: { actorId: context?.actor?.id ?? \"\" },\n });\n\n if (error) {\n throw new Error(\n \"error\" in error ? error.error : \"Failed to fetch conversations\",\n );\n }\n\n return data.conversations.reverse();\n },\n enabled: !!chatId,\n });\n}\n","import { useQueryClient } from \"@tanstack/react-query\";\nimport { Plus } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\n\nimport { Button } from \"@chatsdk-dev/ui/atoms/button\";\nimport { DotsLoader } from \"@chatsdk-dev/ui/atoms/dots-loader\";\nimport { Text } from \"@chatsdk-dev/ui/atoms/typography/text\";\n\nimport { renderRelativeTime } from \"../../../common/utils\";\nimport { useElementComponent } from \"../chat-element\";\nimport { chatQueryKeys } from \"../queries/query-keys\";\nimport { useListConversationsQuery } from \"../queries/use-list-conversations-query\";\nimport { useChatStore } from \"../store\";\nimport { ChatHistoryEmpty } from \"./chat-history-empty\";\n\nexport function ChatHistory() {\n const { t, i18n } = useTranslation(\"chat\", { keyPrefix: \"history\" });\n const queryClient = useQueryClient();\n const { chatId } = useElementComponent();\n const { data, isLoading } = useListConversationsQuery({ chatId });\n const { setSelectedConversationId, setTab, setConversationType } =\n useChatStore();\n\n if (isLoading) {\n return (\n <div className=\"w-full h-full flex items-center justify-center\">\n <DotsLoader />\n </div>\n );\n }\n\n return (\n <div className=\"flex-1 min-h-0 flex flex-col gap-1 overflow-y-auto gap-2 p-2\">\n {data?.length === 0 ? (\n <ChatHistoryEmpty />\n ) : (\n data?.map((conversation, index) => (\n <Button\n key={conversation._id}\n variant=\"ghost\"\n className=\"flex flex-col items-start justify-center gap-2 px-3 py-2 h-auto text-left\"\n onClick={() => {\n // invalidate the conversation query to make sure last conversation messages are loaded\n queryClient.invalidateQueries({\n queryKey: chatQueryKeys.conversation(chatId, conversation._id),\n });\n setSelectedConversationId(conversation._id);\n setTab(\"chat\");\n setConversationType(\"history\");\n }}\n >\n <div className=\"self-stretch flex justify-between gap-1\">\n <Text className=\"truncate text-sm\">\n {data.length - index}:{\" \"}\n {conversation.title ?? t(\"unitled-conversation\")}\n </Text>\n <Text variant=\"tiny\" color=\"muted\">\n {renderRelativeTime({\n date: conversation._creationTime,\n locale: i18n.language,\n })}\n </Text>\n </div>\n <Text\n className=\"flex-1 min-w-0 max-w-full truncate\"\n variant=\"paragraph2\"\n color=\"muted\"\n >\n {conversation.summary}\n </Text>\n </Button>\n ))\n )}\n <Button\n className=\"absolute bottom-6 left-1/2 -translate-x-1/2\"\n onClick={() => {\n setConversationType(\"new\");\n setSelectedConversationId();\n setTab(\"chat\");\n }}\n >\n <Plus className=\"size-4\" />\n {t(\"new-conversation\")}\n </Button>\n </div>\n );\n}\n","\"use client\";\n\nimport type { ChatStatus } from \"ai\";\nimport { CheckIcon, GlobeIcon } from \"lucide-react\";\nimport { useState } from \"react\";\n\nimport {\n PromptInput,\n PromptInputButton,\n PromptInputMessage,\n PromptInputSubmit,\n PromptInputTextarea,\n PromptInputTools,\n} from \"@chatsdk-dev/ui/molecules/ai/prompt-input\";\n\nimport type { ChatModelSettings } from \"@chatsdk-dev/api-client\";\nimport {\n ModelSelector,\n ModelSelectorContent,\n ModelSelectorEmpty,\n ModelSelectorGroup,\n ModelSelectorInput,\n ModelSelectorItem,\n ModelSelectorList,\n ModelSelectorLogo,\n ModelSelectorLogoGroup,\n ModelSelectorName,\n ModelSelectorTrigger,\n} from \"@chatsdk-dev/ui/molecules/ai/model-selector\";\n\nimport { useGetChatQuery } from \"./queries/use-get-chat-query\";\n\ninterface ChatPromptInputProps {\n chatId?: string;\n onSubmit: (\n message: PromptInputMessage,\n event: React.SubmitEvent<HTMLFormElement>,\n ) => void;\n onModelChange?: (model: ChatModelSettings[\"defaultModel\"]) => void;\n onWebSearchChange?: (webSearch: boolean) => void;\n status: ChatStatus;\n ref: React.RefObject<HTMLTextAreaElement | null>;\n}\n\nexport function ChatPromptInput({\n chatId,\n onSubmit,\n onModelChange,\n status,\n ref,\n}: ChatPromptInputProps) {\n const { data } = useGetChatQuery({ chatId });\n const defaultModel = data?.chatModelSettings?.defaultModel;\n const allowedModels = data?.chatModelSettings?.allowedModels;\n\n const [input, setInput] = useState(\"\");\n const [model, setModel] = useState<string | undefined>(defaultModel?.name);\n const [modelSelectorOpen, setModelSelectorOpen] = useState(false);\n const [webSearch, setWebSearch] = useState(false);\n\n const selectedModel = allowedModels?.find((m) => m.name === model);\n const modelGroups = allowedModels?.map((m) => m.chef);\n\n const hasMultipleModels = allowedModels && allowedModels.length > 1;\n const hasActions = hasMultipleModels || true; // true because Search is always shown\n\n return (\n <div className=\"flex flex-col gap-1\">\n <PromptInput\n onSubmit={(message, event) => {\n onSubmit(message, event as React.SubmitEvent<HTMLFormElement>);\n setInput(\"\");\n }}\n >\n <PromptInputTextarea\n ref={ref}\n placeholder={data?.chatBaseSettings?.inputPlaceholder}\n onChange={(e) => setInput(e.target.value)}\n value={input}\n />\n <PromptInputSubmit\n className=\"m-1.5 self-end\"\n disabled={!input}\n status={status}\n />\n </PromptInput>\n\n {/* Actions row below the border */}\n {hasActions && (\n <PromptInputTools>\n <PromptInputButton\n variant={webSearch ? \"primary\" : \"ghost\"}\n onClick={() => setWebSearch(!webSearch)}\n >\n <GlobeIcon size={16} />\n <span>Search</span>\n </PromptInputButton>\n {hasMultipleModels && (\n <ModelSelector\n onOpenChange={setModelSelectorOpen}\n open={modelSelectorOpen}\n >\n <ModelSelectorTrigger>\n <PromptInputButton>\n {selectedModel?.chefSlug && (\n <ModelSelectorLogo provider={selectedModel.chefSlug} />\n )}\n <ModelSelectorName>{selectedModel?.name}</ModelSelectorName>\n </PromptInputButton>\n </ModelSelectorTrigger>\n <ModelSelectorContent>\n <ModelSelectorInput placeholder=\"Search models...\" />\n <ModelSelectorList>\n <ModelSelectorEmpty>No models found.</ModelSelectorEmpty>\n {modelGroups?.map((chef) => (\n <ModelSelectorGroup key={chef} heading={chef}>\n {allowedModels\n .filter((m) => m.chef === chef)\n .map((m) => (\n <ModelSelectorItem\n key={m.name}\n onSelect={() => {\n setModel(m.name);\n onModelChange?.(m);\n setModelSelectorOpen(false);\n }}\n value={m.name}\n >\n <ModelSelectorLogo provider={m.chefSlug} />\n <ModelSelectorName>{m.name}</ModelSelectorName>\n <ModelSelectorLogoGroup>\n {m.providers.map((provider) => (\n <ModelSelectorLogo\n key={provider}\n provider={provider}\n />\n ))}\n </ModelSelectorLogoGroup>\n {selectedModel?.name === m.name ? (\n <CheckIcon className=\"ml-auto size-4\" />\n ) : (\n <div className=\"ml-auto size-4\" />\n )}\n </ModelSelectorItem>\n ))}\n </ModelSelectorGroup>\n ))}\n </ModelSelectorList>\n </ModelSelectorContent>\n </ModelSelector>\n )}\n </PromptInputTools>\n )}\n </div>\n );\n}\n","import { useQuery } from \"@tanstack/react-query\";\n\nimport { ChatSDK } from \"@chatsdk-dev/api-client\";\n\nimport { useApiClient } from \"../../data-fetching/use-api-client\";\nimport { useElementConfig } from \"../chat-element\";\nimport { useChatStore } from \"../store\";\nimport { chatQueryKeys } from \"./query-keys\";\n\ninterface GetConversationParams {\n client: ChatSDK;\n chatId: string;\n actorId: string;\n conversationId?: string;\n}\n\nasync function getConversation({\n client,\n chatId,\n actorId,\n conversationId,\n}: GetConversationParams) {\n // create conversation if no conversation id is provided (conversation doesn't exist yet)\n if (!conversationId) {\n const { data: newConversation, error } =\n await client.chats.conversations.create({\n path: { chatId: chatId! },\n body: { actorId },\n });\n if (error) {\n throw new Error(\n \"error\" in error ? error.error : \"Failed to create conversation\",\n );\n }\n useChatStore.setState({\n ...useChatStore.getState(),\n selectedConversationId: newConversation._id,\n });\n return newConversation;\n }\n\n const { data, error } = await client.chats.conversations.get({\n path: { chatId, conversationId },\n });\n\n if (error) {\n throw new Error(\n \"error\" in error ? error.error : \"Failed to fetch conversation\",\n );\n }\n\n return data;\n}\n\ninterface GetConversationQueryConfigParams {\n chatId: string;\n conversationId?: string;\n actorId: string;\n client: ChatSDK;\n}\n\nexport function getConversationQueryConfig({\n chatId,\n conversationId,\n client,\n actorId,\n}: GetConversationQueryConfigParams) {\n return {\n queryKey: chatQueryKeys.conversation(chatId, conversationId),\n queryFn: () => getConversation({ client, chatId, conversationId, actorId }),\n };\n}\n\ninterface UseGetConversationQueryProps {\n chatId?: string;\n conversationId?: string | null;\n}\n\nexport function useGetConversationQuery({\n chatId,\n conversationId,\n}: UseGetConversationQueryProps) {\n const client = useApiClient();\n const { context } = useElementConfig();\n\n return useQuery({\n ...getConversationQueryConfig({\n chatId: chatId!,\n conversationId: conversationId!,\n client,\n actorId: context?.actor?.id ?? \"\",\n }),\n enabled: !!chatId,\n staleTime: 200,\n });\n}\n","import { useMemo } from \"react\";\n\nimport { useElementComponent } from \"../chat-element\";\nimport { useGetChatQuery } from \"../queries/use-get-chat-query\";\nimport { useGetConversationQuery } from \"../queries/use-get-conversation-query\";\nimport { useChatStore } from \"../store\";\nimport { getInitialMessagesFromStrings } from \"../utils\";\n\nexport function useInitialMessages() {\n const { selectedConversationId } = useChatStore();\n const { chatId } = useElementComponent();\n const { data } = useGetChatQuery({ chatId });\n const { data: conversation } = useGetConversationQuery({\n chatId,\n conversationId: selectedConversationId,\n });\n\n const conversationMessages = useMemo(() => {\n if (!selectedConversationId) return undefined;\n\n return conversation?.messages?.map((msg) => {\n return {\n id: msg.id,\n role: msg.role as \"user\" | \"assistant\" | \"system\",\n parts: msg.parts.map((p) => ({\n type: \"text\" as const,\n text: p.text ?? \"\",\n })),\n metadata: msg,\n };\n });\n }, [conversation, selectedConversationId]);\n\n const initialMessages = useMemo(() => {\n const initialChatMessages = getInitialMessagesFromStrings(\n data?.chatBaseSettings?.initialChatMessages ?? [],\n );\n\n return [...initialChatMessages, ...(conversationMessages ?? [])];\n }, [data?.chatBaseSettings?.initialChatMessages, conversationMessages]);\n\n return initialMessages;\n}\n","\"use client\";\n\nimport { useChat as useAiChat } from \"@ai-sdk/react\";\nimport { DefaultChatTransport } from \"ai\";\nimport { useEffect } from \"react\";\n\nimport { useApiClient } from \"../../data-fetching/use-api-client\";\nimport { useElement } from \"../chat-element\";\nimport { useChatStore } from \"../store\";\nimport { useInitialMessages } from \"./use-initial-messages\";\n\nexport function useChat() {\n const client = useApiClient();\n const { config, component } = useElement();\n const { selectedConversationId, conversationType } = useChatStore();\n\n const initialMessages = useInitialMessages();\n\n const useChatResult = useAiChat({\n messages: initialMessages,\n\n transport: new DefaultChatTransport({\n prepareSendMessagesRequest: ({\n body,\n headers,\n credentials,\n id,\n messages,\n trigger,\n messageId,\n }) => {\n return {\n api: client.getUrl(\"chats.conversations.completion\", {\n chatId: component.chatId,\n conversationId: body?.conversationId || \"new\",\n }),\n body: {\n ...body,\n id,\n messages,\n trigger,\n messageId,\n },\n headers,\n credentials,\n };\n },\n headers: {\n ...config.api?.headers,\n },\n }),\n });\n\n useEffect(() => {\n if (conversationType === \"history\" || !selectedConversationId) {\n useChatResult.stop();\n useChatResult.setMessages(initialMessages);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [conversationType, selectedConversationId, initialMessages]);\n\n return useChatResult;\n}\n","\"use client\";\n\nimport { useQueryClient } from \"@tanstack/react-query\";\nimport { Fragment, useEffect, useRef } from \"react\";\n\nimport { DotsLoader } from \"@chatsdk-dev/ui/atoms/dots-loader\";\nimport {\n Conversation,\n ConversationContent,\n ConversationScrollButton,\n} from \"@chatsdk-dev/ui/molecules/ai/conversation\";\nimport type { PromptInputMessage } from \"@chatsdk-dev/ui/molecules/ai/prompt-input\";\nimport { ChatMessage } from \"@chatsdk-dev/ui/molecules/chat-message\";\n\nimport { useApiClient } from \"../../data-fetching/use-api-client\";\nimport { useElementComponent, useElementConfig } from \"../chat-element\";\nimport { ChatPromptInput } from \"../chat-prompt-input\";\nimport {\n getConversationQueryConfig,\n useGetConversationQuery,\n} from \"../queries/use-get-conversation-query\";\nimport { useChatStore } from \"../store\";\nimport { useChat } from \"./use-chat\";\n\nexport function ChatMain() {\n const queryClient = useQueryClient();\n const client = useApiClient();\n\n const { chatId } = useElementComponent();\n const { context } = useElementConfig();\n const { selectedConversationId } = useChatStore();\n const { data: conversation } = useGetConversationQuery({\n chatId,\n conversationId: selectedConversationId,\n });\n const { messages, sendMessage, status } = useChat();\n\n const promptInputRef = useRef<HTMLTextAreaElement>(null);\n\n // Focus when user starts a new conversation within the same chat\n useEffect(() => {\n promptInputRef.current?.focus();\n }, [selectedConversationId]);\n\n const handleSubmit = async (message: PromptInputMessage) => {\n let conversationId = conversation?._id;\n if (!conversation) {\n const newConversation = await queryClient.fetchQuery({\n ...getConversationQueryConfig({\n chatId,\n conversationId: selectedConversationId,\n client,\n actorId: context?.actor?.id ?? \"\",\n }),\n });\n conversationId = newConversation._id;\n }\n sendMessage({ text: message.text }, { body: { conversationId } });\n };\n\n // loading state until the last assistant message has some content\n const lastMessage = messages[messages.length - 1];\n const isWaitingForContent =\n status === \"submitted\" ||\n (status === \"streaming\" &&\n lastMessage?.role === \"assistant\" &&\n !lastMessage.parts.some(\n (part) => part.type === \"text\" && part.text.length > 0,\n ));\n\n return (\n <Fragment>\n <Conversation>\n <ConversationContent>\n <ChatMessage messages={messages} status={status} />\n {isWaitingForContent && <DotsLoader />}\n </ConversationContent>\n <ConversationScrollButton />\n </Conversation>\n <div className=\"m-4 my-2\">\n <ChatPromptInput\n ref={promptInputRef}\n chatId={chatId}\n onSubmit={handleSubmit}\n status={status}\n />\n </div>\n </Fragment>\n );\n}\n\nChatMain.displayName = \"ChatMain\";\n","import { useTranslation } from \"react-i18next\";\n\nimport { Card } from \"@chatsdk-dev/ui/atoms/card\";\nimport { DotsLoader } from \"@chatsdk-dev/ui/atoms/dots-loader\";\nimport { Text } from \"@chatsdk-dev/ui/atoms/typography/text\";\n\nimport { useElementComponent } from \"./chat-element\";\nimport { ChatHeader } from \"./chat-header/chat-header\";\nimport { ChatHistory } from \"./chat-history/chat-history\";\nimport { ChatMain } from \"./chat-main/chat-main\";\nimport { useGetChatQuery } from \"./queries/use-get-chat-query\";\nimport { useGetConversationQuery } from \"./queries/use-get-conversation-query\";\nimport { useListConversationsQuery } from \"./queries/use-list-conversations-query\";\nimport { useChatStore } from \"./store\";\n\nexport function ChatCard() {\n const { t } = useTranslation();\n const { chatId } = useElementComponent();\n const { tab, selectedConversationId, conversationType } = useChatStore();\n\n useListConversationsQuery({ chatId });\n const { isLoading, data: chat } = useGetChatQuery({ chatId });\n const { isLoading: isConversationLoading } = useGetConversationQuery({\n chatId,\n conversationId: selectedConversationId,\n });\n\n const canCreateMessage =\n chat?.chatModelSettings?.allowedModels &&\n chat?.chatModelSettings?.allowedModels.length > 0;\n\n if (\n !canCreateMessage &&\n chat?.chatBaseSettings?.hideChatWhenInsufficientCredits\n ) {\n return null;\n }\n\n return (\n <Card className=\"min-w-[320px] h-[640px] w-[400px] flex flex-col relative p-0 rounded-lg gap-0\">\n {isLoading && (\n <div className=\"absolute inset-0 flex items-center justify-center z-10 bg-card rounded-lg\">\n <DotsLoader />\n </div>\n )}\n\n <ChatHeader chatId={chatId} />\n {conversationType === \"history\" && isConversationLoading && (\n <div className=\"flex-1 flex items-center justify-center z-10 bg-card rounded-lg\">\n <DotsLoader />\n </div>\n )}\n {!isLoading && (conversationType === \"new\" || !isConversationLoading) && (\n <div\n className={tab !== \"chat\" ? \"hidden\" : \"flex flex-col flex-1 min-h-0\"}\n >\n {conversationType === \"history\" && isConversationLoading && (\n <div className=\"absolute inset-0 flex items-center justify-center z-10 bg-card rounded-lg\">\n <DotsLoader />\n </div>\n )}\n {canCreateMessage ? (\n <ChatMain />\n ) : (\n <div className=\"m-4 h-full flex items-center justify-center\">\n <Text\n variant=\"paragraph1\"\n color=\"muted\"\n className=\"text-center font-light italic\"\n >\n {t(\"chat-card.insufficient-credits-error\")}\n </Text>\n </div>\n )}\n </div>\n )}\n {!isLoading && tab === \"history\" && <ChatHistory />}\n </Card>\n );\n}\n","import { createElementContext } from \"../element/element-provider\";\nimport type { ElementConfig } from \"../element/types/config\";\nimport { useMergeElementConfig } from \"../element/use-element-config\";\nimport { ChatCard } from \"./chat-card\";\n\ntype ChatProps = { chatId: string };\ntype ChatData = { chatId: string };\ntype ChatElementProps = ElementConfig<ChatProps, ChatData>;\n\nexport const {\n ElementProvider,\n useElement,\n useElementConfig,\n useElementComponent,\n useElementCallbacks,\n} = createElementContext<ChatProps, ChatData>({ name: \"ChatSDK.Chat\" });\n\nexport function ChatElement(props: ChatElementProps) {\n const { config, callbacks, ...componentProps } = useMergeElementConfig({\n props,\n name: \"ChatSDK.Chat\",\n });\n\n if (!componentProps.chatId) {\n // TODO: log here\n return null;\n }\n\n return (\n <ElementProvider\n config={config}\n component={componentProps}\n callbacks={callbacks}\n >\n <ChatCard />\n </ElementProvider>\n );\n}\n\nChatElement.displayName = \"ChatSDK.ChatElement\";\n"],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import { t as Callbacks } from "./callbacks-PIvHXeEI.js";
2
+ import { r as RootConfig, t as ElementConfig } from "./config-CqihvSgz.js";
3
+ import { n as ElementProviderProps, t as ElementContextType } from "./element-provider-C_nBsftD.js";
4
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
5
+ import { UIMessage } from "ai";
6
+
7
+ //#region ../ui/src/molecules/chat-message.d.ts
8
+ interface ChatMessageProps {
9
+ messages: UIMessage[];
10
+ withAvatar?: boolean;
11
+ /** From `useChat().status` — controls reasoning streaming UI */
12
+ status?: string;
13
+ }
14
+ declare function ChatMessage({
15
+ messages,
16
+ withAvatar,
17
+ status
18
+ }: ChatMessageProps): (react_jsx_runtime0.JSX.Element | null)[];
19
+ //#endregion
20
+ //#region src/index.d.ts
21
+ type ChatSDKWindowApi = {
22
+ setConfig: (config: Partial<RootConfig>, merge?: boolean) => void;
23
+ };
24
+ declare global {
25
+ interface Window {
26
+ chatsdk?: ChatSDKWindowApi;
27
+ }
28
+ }
29
+ //#endregion
30
+ //#region src/features/chat/chat-element.d.ts
31
+ type ChatProps = {
32
+ chatId: string;
33
+ };
34
+ type ChatData = {
35
+ chatId: string;
36
+ };
37
+ type ChatElementProps = ElementConfig<ChatProps, ChatData>;
38
+ declare const ElementProvider: {
39
+ ({
40
+ config,
41
+ component,
42
+ callbacks,
43
+ children
44
+ }: ElementProviderProps<ChatProps, ChatData>): react_jsx_runtime0.JSX.Element;
45
+ displayName: string;
46
+ }, useElement: () => ElementContextType<ChatProps, ChatData>, useElementConfig: () => RootConfig, useElementComponent: () => ChatProps, useElementCallbacks: () => Callbacks<ChatData>;
47
+ declare function ChatElement(props: ChatElementProps): react_jsx_runtime0.JSX.Element | null;
48
+ declare namespace ChatElement {
49
+ var displayName: string;
50
+ }
51
+ //#endregion
52
+ export { useElementComponent as a, ChatMessage as c, useElementCallbacks as i, ElementProvider as n, useElementConfig as o, useElement as r, ChatSDKWindowApi as s, ChatElement as t };
53
+ //# sourceMappingURL=chat-element-CSpa62Te.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-element-CSpa62Te.d.ts","names":[],"sources":["../../ui/src/molecules/chat-message.tsx","../src/index.ts","../src/features/chat/chat-element.tsx"],"mappings":";;;;;;;UAsBU,gBAAA;EACR,QAAA,EAAU,SAAA;EACV,UAAA;;EAEA,MAAA;AAAA;AAAA,iBAGc,WAAA,CAAA;EACd,QAAA;EACA,UAAA;EACA;AAAA,GACC,gBAAA,IAAgB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;KCzBP,gBAAA;EACV,SAAA,GAAY,MAAA,EAAQ,OAAA,CAAQ,UAAA,GAAa,KAAA;AAAA;AAAA,QAGnC,MAAA;EAAA,UACI,MAAA;IACR,OAAA,GAAU,gBAAA;EAAA;AAAA;;;KCTT,SAAA;EAAc,MAAA;AAAA;AAAA,KACd,QAAA;EAAa,MAAA;AAAA;AAAA,KACb,gBAAA,GAAmB,aAAA,CAAc,SAAA,EAAW,QAAA;AAAA,cAG/C,eAAA;IAAA;;;;;;;uBACU,kBAAA,CAAA,SAAA,EAAA,QAAA,GAAA,gBAAA,QAAA,UAAA,EAAA,mBAAA,QAES,SAAA,EAAA,mBAAA,QACA,SAAA,CAAA,QAAA;AAAA,iBAGL,WAAA,CAAY,KAAA,EAAO,gBAAA,GAAgB,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,kBAAnC,WAAA;EAAA,IAAW,WAAA;AAAA"}