@strapi/content-type-builder 5.25.0 → 5.26.0

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 (328) hide show
  1. package/dist/admin/components/AIChat/Chat.js +431 -0
  2. package/dist/admin/components/AIChat/Chat.js.map +1 -0
  3. package/dist/admin/components/AIChat/Chat.mjs +429 -0
  4. package/dist/admin/components/AIChat/Chat.mjs.map +1 -0
  5. package/dist/admin/components/AIChat/FeedbackModal.js +237 -0
  6. package/dist/admin/components/AIChat/FeedbackModal.js.map +1 -0
  7. package/dist/admin/components/AIChat/FeedbackModal.mjs +233 -0
  8. package/dist/admin/components/AIChat/FeedbackModal.mjs.map +1 -0
  9. package/dist/admin/components/AIChat/UploadCodeModal.js +427 -0
  10. package/dist/admin/components/AIChat/UploadCodeModal.js.map +1 -0
  11. package/dist/admin/components/AIChat/UploadCodeModal.mjs +423 -0
  12. package/dist/admin/components/AIChat/UploadCodeModal.mjs.map +1 -0
  13. package/dist/admin/components/AIChat/UploadFigmaModal.js +377 -0
  14. package/dist/admin/components/AIChat/UploadFigmaModal.js.map +1 -0
  15. package/dist/admin/components/AIChat/UploadFigmaModal.mjs +373 -0
  16. package/dist/admin/components/AIChat/UploadFigmaModal.mjs.map +1 -0
  17. package/dist/admin/components/AIChat/components/Alert.js +46 -0
  18. package/dist/admin/components/AIChat/components/Alert.js.map +1 -0
  19. package/dist/admin/components/AIChat/components/Alert.mjs +44 -0
  20. package/dist/admin/components/AIChat/components/Alert.mjs.map +1 -0
  21. package/dist/admin/components/AIChat/components/AnimatedBox.js +34 -0
  22. package/dist/admin/components/AIChat/components/AnimatedBox.js.map +1 -0
  23. package/dist/admin/components/AIChat/components/AnimatedBox.mjs +32 -0
  24. package/dist/admin/components/AIChat/components/AnimatedBox.mjs.map +1 -0
  25. package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.js +92 -0
  26. package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.js.map +1 -0
  27. package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.mjs +90 -0
  28. package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.mjs.map +1 -0
  29. package/dist/admin/components/AIChat/components/Attachments/components/Attachment.js +100 -0
  30. package/dist/admin/components/AIChat/components/Attachments/components/Attachment.js.map +1 -0
  31. package/dist/admin/components/AIChat/components/Attachments/components/Attachment.mjs +97 -0
  32. package/dist/admin/components/AIChat/components/Attachments/components/Attachment.mjs.map +1 -0
  33. package/dist/admin/components/AIChat/components/Base64Image.js +127 -0
  34. package/dist/admin/components/AIChat/components/Base64Image.js.map +1 -0
  35. package/dist/admin/components/AIChat/components/Base64Image.mjs +125 -0
  36. package/dist/admin/components/AIChat/components/Base64Image.mjs.map +1 -0
  37. package/dist/admin/components/AIChat/components/Collapsible.js +71 -0
  38. package/dist/admin/components/AIChat/components/Collapsible.js.map +1 -0
  39. package/dist/admin/components/AIChat/components/Collapsible.mjs +66 -0
  40. package/dist/admin/components/AIChat/components/Collapsible.mjs.map +1 -0
  41. package/dist/admin/components/AIChat/components/Dropzone.js +172 -0
  42. package/dist/admin/components/AIChat/components/Dropzone.js.map +1 -0
  43. package/dist/admin/components/AIChat/components/Dropzone.mjs +167 -0
  44. package/dist/admin/components/AIChat/components/Dropzone.mjs.map +1 -0
  45. package/dist/admin/components/AIChat/components/FloatingPanel.js +166 -0
  46. package/dist/admin/components/AIChat/components/FloatingPanel.js.map +1 -0
  47. package/dist/admin/components/AIChat/components/FloatingPanel.mjs +163 -0
  48. package/dist/admin/components/AIChat/components/FloatingPanel.mjs.map +1 -0
  49. package/dist/admin/components/AIChat/components/FullScreenImage.js +190 -0
  50. package/dist/admin/components/AIChat/components/FullScreenImage.js.map +1 -0
  51. package/dist/admin/components/AIChat/components/FullScreenImage.mjs +187 -0
  52. package/dist/admin/components/AIChat/components/FullScreenImage.mjs.map +1 -0
  53. package/dist/admin/components/AIChat/components/ImagePreview.js +87 -0
  54. package/dist/admin/components/AIChat/components/ImagePreview.js.map +1 -0
  55. package/dist/admin/components/AIChat/components/ImagePreview.mjs +85 -0
  56. package/dist/admin/components/AIChat/components/ImagePreview.mjs.map +1 -0
  57. package/dist/admin/components/AIChat/components/Input.js +126 -0
  58. package/dist/admin/components/AIChat/components/Input.js.map +1 -0
  59. package/dist/admin/components/AIChat/components/Input.mjs +121 -0
  60. package/dist/admin/components/AIChat/components/Input.mjs.map +1 -0
  61. package/dist/admin/components/AIChat/components/Messages/Marker.js +138 -0
  62. package/dist/admin/components/AIChat/components/Messages/Marker.js.map +1 -0
  63. package/dist/admin/components/AIChat/components/Messages/Marker.mjs +136 -0
  64. package/dist/admin/components/AIChat/components/Messages/Marker.mjs.map +1 -0
  65. package/dist/admin/components/AIChat/components/Messages/Message.js +214 -0
  66. package/dist/admin/components/AIChat/components/Messages/Message.js.map +1 -0
  67. package/dist/admin/components/AIChat/components/Messages/Message.mjs +212 -0
  68. package/dist/admin/components/AIChat/components/Messages/Message.mjs.map +1 -0
  69. package/dist/admin/components/AIChat/components/ResizableTextArea.js +78 -0
  70. package/dist/admin/components/AIChat/components/ResizableTextArea.js.map +1 -0
  71. package/dist/admin/components/AIChat/components/ResizableTextArea.mjs +76 -0
  72. package/dist/admin/components/AIChat/components/ResizableTextArea.mjs.map +1 -0
  73. package/dist/admin/components/AIChat/components/SimpleMenu.js +60 -0
  74. package/dist/admin/components/AIChat/components/SimpleMenu.js.map +1 -0
  75. package/dist/admin/components/AIChat/components/SimpleMenu.mjs +35 -0
  76. package/dist/admin/components/AIChat/components/SimpleMenu.mjs.map +1 -0
  77. package/dist/admin/components/AIChat/components/StepModal.js +175 -0
  78. package/dist/admin/components/AIChat/components/StepModal.js.map +1 -0
  79. package/dist/admin/components/AIChat/components/StepModal.mjs +171 -0
  80. package/dist/admin/components/AIChat/components/StepModal.mjs.map +1 -0
  81. package/dist/admin/components/AIChat/components/animations.js +67 -0
  82. package/dist/admin/components/AIChat/components/animations.js.map +1 -0
  83. package/dist/admin/components/AIChat/components/animations.mjs +65 -0
  84. package/dist/admin/components/AIChat/components/animations.mjs.map +1 -0
  85. package/dist/admin/components/AIChat/components/icons/FigmaIcon.js +50 -0
  86. package/dist/admin/components/AIChat/components/icons/FigmaIcon.js.map +1 -0
  87. package/dist/admin/components/AIChat/components/icons/FigmaIcon.mjs +48 -0
  88. package/dist/admin/components/AIChat/components/icons/FigmaIcon.mjs.map +1 -0
  89. package/dist/admin/components/AIChat/components/icons/StopIcon.js +25 -0
  90. package/dist/admin/components/AIChat/components/icons/StopIcon.js.map +1 -0
  91. package/dist/admin/components/AIChat/components/icons/StopIcon.mjs +23 -0
  92. package/dist/admin/components/AIChat/components/icons/StopIcon.mjs.map +1 -0
  93. package/dist/admin/components/AIChat/hooks/useAIFetch.js +107 -0
  94. package/dist/admin/components/AIChat/hooks/useAIFetch.js.map +1 -0
  95. package/dist/admin/components/AIChat/hooks/useAIFetch.mjs +96 -0
  96. package/dist/admin/components/AIChat/hooks/useAIFetch.mjs.map +1 -0
  97. package/dist/admin/components/AIChat/hooks/useAttachments.js +152 -0
  98. package/dist/admin/components/AIChat/hooks/useAttachments.js.map +1 -0
  99. package/dist/admin/components/AIChat/hooks/useAttachments.mjs +150 -0
  100. package/dist/admin/components/AIChat/hooks/useAttachments.mjs.map +1 -0
  101. package/dist/admin/components/AIChat/hooks/useChatTitle.js +47 -0
  102. package/dist/admin/components/AIChat/hooks/useChatTitle.js.map +1 -0
  103. package/dist/admin/components/AIChat/hooks/useChatTitle.mjs +45 -0
  104. package/dist/admin/components/AIChat/hooks/useChatTitle.mjs.map +1 -0
  105. package/dist/admin/components/AIChat/hooks/useCodeUpload.js +212 -0
  106. package/dist/admin/components/AIChat/hooks/useCodeUpload.js.map +1 -0
  107. package/dist/admin/components/AIChat/hooks/useCodeUpload.mjs +207 -0
  108. package/dist/admin/components/AIChat/hooks/useCodeUpload.mjs.map +1 -0
  109. package/dist/admin/components/AIChat/hooks/useFeedback.js +76 -0
  110. package/dist/admin/components/AIChat/hooks/useFeedback.js.map +1 -0
  111. package/dist/admin/components/AIChat/hooks/useFeedback.mjs +74 -0
  112. package/dist/admin/components/AIChat/hooks/useFeedback.mjs.map +1 -0
  113. package/dist/admin/components/AIChat/hooks/useFigmaUpload.js +206 -0
  114. package/dist/admin/components/AIChat/hooks/useFigmaUpload.js.map +1 -0
  115. package/dist/admin/components/AIChat/hooks/useFigmaUpload.mjs +200 -0
  116. package/dist/admin/components/AIChat/hooks/useFigmaUpload.mjs.map +1 -0
  117. package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.js +115 -0
  118. package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.js.map +1 -0
  119. package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.mjs +113 -0
  120. package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.mjs.map +1 -0
  121. package/dist/admin/components/AIChat/hooks/useTranslations.js +19 -0
  122. package/dist/admin/components/AIChat/hooks/useTranslations.js.map +1 -0
  123. package/dist/admin/components/AIChat/hooks/useTranslations.mjs +17 -0
  124. package/dist/admin/components/AIChat/hooks/useTranslations.mjs.map +1 -0
  125. package/dist/admin/components/AIChat/lib/aiClient.js +168 -0
  126. package/dist/admin/components/AIChat/lib/aiClient.js.map +1 -0
  127. package/dist/admin/components/AIChat/lib/aiClient.mjs +161 -0
  128. package/dist/admin/components/AIChat/lib/aiClient.mjs.map +1 -0
  129. package/dist/admin/components/AIChat/lib/constants.js +16 -0
  130. package/dist/admin/components/AIChat/lib/constants.js.map +1 -0
  131. package/dist/admin/components/AIChat/lib/constants.mjs +10 -0
  132. package/dist/admin/components/AIChat/lib/constants.mjs.map +1 -0
  133. package/dist/admin/components/AIChat/lib/misc.js +8 -0
  134. package/dist/admin/components/AIChat/lib/misc.js.map +1 -0
  135. package/dist/admin/components/AIChat/lib/misc.mjs +6 -0
  136. package/dist/admin/components/AIChat/lib/misc.mjs.map +1 -0
  137. package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.js +46 -0
  138. package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.js.map +1 -0
  139. package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.mjs +44 -0
  140. package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.mjs.map +1 -0
  141. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js +151 -0
  142. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js.map +1 -0
  143. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.mjs +148 -0
  144. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.mjs.map +1 -0
  145. package/dist/admin/components/AIChat/providers/ChatProvider.js +191 -0
  146. package/dist/admin/components/AIChat/providers/ChatProvider.js.map +1 -0
  147. package/dist/admin/components/AIChat/providers/ChatProvider.mjs +187 -0
  148. package/dist/admin/components/AIChat/providers/ChatProvider.mjs.map +1 -0
  149. package/dist/admin/components/AIChat/providers/SchemaProvider.js +90 -0
  150. package/dist/admin/components/AIChat/providers/SchemaProvider.js.map +1 -0
  151. package/dist/admin/components/AIChat/providers/SchemaProvider.mjs +88 -0
  152. package/dist/admin/components/AIChat/providers/SchemaProvider.mjs.map +1 -0
  153. package/dist/admin/components/ComponentList.js +1 -0
  154. package/dist/admin/components/ComponentList.js.map +1 -1
  155. package/dist/admin/components/ComponentList.mjs +1 -0
  156. package/dist/admin/components/ComponentList.mjs.map +1 -1
  157. package/dist/admin/components/DataManager/DataManagerContext.js.map +1 -1
  158. package/dist/admin/components/DataManager/DataManagerContext.mjs.map +1 -1
  159. package/dist/admin/components/DataManager/reducer.js +48 -6
  160. package/dist/admin/components/DataManager/reducer.js.map +1 -1
  161. package/dist/admin/components/DataManager/reducer.mjs +48 -6
  162. package/dist/admin/components/DataManager/reducer.mjs.map +1 -1
  163. package/dist/admin/components/FormModal/utils/canEditContentType.js.map +1 -1
  164. package/dist/admin/components/FormModal/utils/canEditContentType.mjs.map +1 -1
  165. package/dist/admin/pages/App/index.js +60 -29
  166. package/dist/admin/pages/App/index.js.map +1 -1
  167. package/dist/admin/pages/App/index.mjs +62 -31
  168. package/dist/admin/pages/App/index.mjs.map +1 -1
  169. package/dist/admin/pages/ListView/EmptyState.js +75 -9
  170. package/dist/admin/pages/ListView/EmptyState.js.map +1 -1
  171. package/dist/admin/pages/ListView/EmptyState.mjs +77 -11
  172. package/dist/admin/pages/ListView/EmptyState.mjs.map +1 -1
  173. package/dist/admin/src/components/AIChat/Chat.d.ts +2 -0
  174. package/dist/admin/src/components/AIChat/FeedbackModal.d.ts +13 -0
  175. package/dist/admin/src/components/AIChat/UploadCodeModal.d.ts +12 -0
  176. package/dist/admin/src/components/AIChat/UploadFigmaModal.d.ts +12 -0
  177. package/dist/admin/src/components/AIChat/components/Alert.d.ts +6 -0
  178. package/dist/admin/src/components/AIChat/components/AnimatedBox.d.ts +13 -0
  179. package/dist/admin/src/components/AIChat/components/Attachments/AttachmentPreview.d.ts +9 -0
  180. package/dist/admin/src/components/AIChat/components/Attachments/components/Attachment.d.ts +27 -0
  181. package/dist/admin/src/components/AIChat/components/Base64Image.d.ts +9 -0
  182. package/dist/admin/src/components/AIChat/components/Collapsible.d.ts +18 -0
  183. package/dist/admin/src/components/AIChat/components/Dropzone.d.ts +35 -0
  184. package/dist/admin/src/components/AIChat/components/FloatingPanel.d.ts +34 -0
  185. package/dist/admin/src/components/AIChat/components/FullScreenImage.d.ts +20 -0
  186. package/dist/admin/src/components/AIChat/components/ImagePreview.d.ts +8 -0
  187. package/dist/admin/src/components/AIChat/components/ImagePreviewGroup.d.ts +7 -0
  188. package/dist/admin/src/components/AIChat/components/Input.d.ts +43 -0
  189. package/dist/admin/src/components/AIChat/components/Messages/Marker.d.ts +2 -0
  190. package/dist/admin/src/components/AIChat/components/Messages/Message.d.ts +5 -0
  191. package/dist/admin/src/components/AIChat/components/ResizableTextArea.d.ts +9 -0
  192. package/dist/admin/src/components/AIChat/components/SimpleMenu.d.ts +32 -0
  193. package/dist/admin/src/components/AIChat/components/StepModal.d.ts +37 -0
  194. package/dist/admin/src/components/AIChat/components/animations.d.ts +8 -0
  195. package/dist/admin/src/components/AIChat/components/icons/FigmaIcon.d.ts +5 -0
  196. package/dist/admin/src/components/AIChat/components/icons/StopIcon.d.ts +5 -0
  197. package/dist/admin/src/components/AIChat/hooks/useAIFetch.d.ts +147 -0
  198. package/dist/admin/src/components/AIChat/hooks/useAttachments.d.ts +8 -0
  199. package/dist/admin/src/components/AIChat/hooks/useChatTitle.d.ts +13 -0
  200. package/dist/admin/src/components/AIChat/hooks/useCodeUpload.d.ts +31 -0
  201. package/dist/admin/src/components/AIChat/hooks/useFeedback.d.ts +7 -0
  202. package/dist/admin/src/components/AIChat/hooks/useFigmaUpload.d.ts +61 -0
  203. package/dist/admin/src/components/AIChat/hooks/useLastSeenSchemas.d.ts +10 -0
  204. package/dist/admin/src/components/AIChat/hooks/useTranslations.d.ts +3 -0
  205. package/dist/admin/src/components/AIChat/lib/aiClient.d.ts +32 -0
  206. package/dist/admin/src/components/AIChat/lib/constants.d.ts +12 -0
  207. package/dist/admin/src/components/AIChat/lib/fileToAttachment.d.ts +2 -0
  208. package/dist/admin/src/components/AIChat/lib/misc.d.ts +1 -0
  209. package/dist/admin/src/components/AIChat/lib/transforms/schemas/fromCTB.d.ts +3 -0
  210. package/dist/admin/src/components/AIChat/lib/transforms/schemas/toCTB.d.ts +16 -0
  211. package/dist/admin/src/components/AIChat/lib/types/annotations.d.ts +19 -0
  212. package/dist/admin/src/components/AIChat/lib/types/attachments.d.ts +15 -0
  213. package/dist/admin/src/components/AIChat/lib/types/feedback.d.ts +1 -0
  214. package/dist/admin/src/components/AIChat/lib/types/messages.d.ts +26 -0
  215. package/dist/admin/src/components/AIChat/lib/types/schema.d.ts +20 -0
  216. package/dist/admin/src/components/AIChat/providers/ChatProvider.d.ts +30 -0
  217. package/dist/admin/src/components/AIChat/providers/SchemaProvider.d.ts +10 -0
  218. package/dist/admin/src/components/ComponentList.d.ts +1 -1
  219. package/dist/admin/src/components/DataManager/DataManagerContext.d.ts +1 -1
  220. package/dist/admin/translations/ar.json.js +187 -2
  221. package/dist/admin/translations/ar.json.js.map +1 -1
  222. package/dist/admin/translations/ar.json.mjs +187 -3
  223. package/dist/admin/translations/ar.json.mjs.map +1 -1
  224. package/dist/admin/translations/de.json.js +42 -7
  225. package/dist/admin/translations/de.json.js.map +1 -1
  226. package/dist/admin/translations/de.json.mjs +42 -7
  227. package/dist/admin/translations/de.json.mjs.map +1 -1
  228. package/dist/admin/translations/en.json.js +53 -2
  229. package/dist/admin/translations/en.json.js.map +1 -1
  230. package/dist/admin/translations/en.json.mjs +53 -2
  231. package/dist/admin/translations/en.json.mjs.map +1 -1
  232. package/dist/admin/translations/es.json.js +37 -15
  233. package/dist/admin/translations/es.json.js.map +1 -1
  234. package/dist/admin/translations/es.json.mjs +37 -15
  235. package/dist/admin/translations/es.json.mjs.map +1 -1
  236. package/dist/admin/translations/fr.json.js +165 -3
  237. package/dist/admin/translations/fr.json.js.map +1 -1
  238. package/dist/admin/translations/fr.json.mjs +165 -4
  239. package/dist/admin/translations/fr.json.mjs.map +1 -1
  240. package/dist/admin/translations/id.json.js +93 -23
  241. package/dist/admin/translations/id.json.js.map +1 -1
  242. package/dist/admin/translations/id.json.mjs +93 -23
  243. package/dist/admin/translations/id.json.mjs.map +1 -1
  244. package/dist/admin/translations/it.json.js +75 -6
  245. package/dist/admin/translations/it.json.js.map +1 -1
  246. package/dist/admin/translations/it.json.mjs +75 -6
  247. package/dist/admin/translations/it.json.mjs.map +1 -1
  248. package/dist/admin/translations/ja.json.js +191 -5
  249. package/dist/admin/translations/ja.json.js.map +1 -1
  250. package/dist/admin/translations/ja.json.mjs +191 -6
  251. package/dist/admin/translations/ja.json.mjs.map +1 -1
  252. package/dist/admin/translations/ko.json.js +70 -16
  253. package/dist/admin/translations/ko.json.js.map +1 -1
  254. package/dist/admin/translations/ko.json.mjs +70 -16
  255. package/dist/admin/translations/ko.json.mjs.map +1 -1
  256. package/dist/admin/translations/ms.json.js +104 -31
  257. package/dist/admin/translations/ms.json.js.map +1 -1
  258. package/dist/admin/translations/ms.json.mjs +104 -31
  259. package/dist/admin/translations/ms.json.mjs.map +1 -1
  260. package/dist/admin/translations/nl.json.js +95 -15
  261. package/dist/admin/translations/nl.json.js.map +1 -1
  262. package/dist/admin/translations/nl.json.mjs +95 -15
  263. package/dist/admin/translations/nl.json.mjs.map +1 -1
  264. package/dist/admin/translations/pl.json.js +55 -11
  265. package/dist/admin/translations/pl.json.js.map +1 -1
  266. package/dist/admin/translations/pl.json.mjs +55 -11
  267. package/dist/admin/translations/pl.json.mjs.map +1 -1
  268. package/dist/admin/translations/pt-BR.json.js +54 -10
  269. package/dist/admin/translations/pt-BR.json.js.map +1 -1
  270. package/dist/admin/translations/pt-BR.json.mjs +54 -10
  271. package/dist/admin/translations/pt-BR.json.mjs.map +1 -1
  272. package/dist/admin/translations/pt.json.js +187 -2
  273. package/dist/admin/translations/pt.json.js.map +1 -1
  274. package/dist/admin/translations/pt.json.mjs +187 -3
  275. package/dist/admin/translations/pt.json.mjs.map +1 -1
  276. package/dist/admin/translations/ru.json.js +26 -1
  277. package/dist/admin/translations/ru.json.js.map +1 -1
  278. package/dist/admin/translations/ru.json.mjs +26 -1
  279. package/dist/admin/translations/ru.json.mjs.map +1 -1
  280. package/dist/admin/translations/sk.json.js +21 -1
  281. package/dist/admin/translations/sk.json.js.map +1 -1
  282. package/dist/admin/translations/sk.json.mjs +21 -1
  283. package/dist/admin/translations/sk.json.mjs.map +1 -1
  284. package/dist/admin/translations/sv.json.js +21 -1
  285. package/dist/admin/translations/sv.json.js.map +1 -1
  286. package/dist/admin/translations/sv.json.mjs +21 -1
  287. package/dist/admin/translations/sv.json.mjs.map +1 -1
  288. package/dist/admin/translations/th.json.js +21 -1
  289. package/dist/admin/translations/th.json.js.map +1 -1
  290. package/dist/admin/translations/th.json.mjs +21 -1
  291. package/dist/admin/translations/th.json.mjs.map +1 -1
  292. package/dist/admin/translations/tr.json.js +21 -1
  293. package/dist/admin/translations/tr.json.js.map +1 -1
  294. package/dist/admin/translations/tr.json.mjs +21 -1
  295. package/dist/admin/translations/tr.json.mjs.map +1 -1
  296. package/dist/admin/translations/uk.json.js +21 -2
  297. package/dist/admin/translations/uk.json.js.map +1 -1
  298. package/dist/admin/translations/uk.json.mjs +21 -2
  299. package/dist/admin/translations/uk.json.mjs.map +1 -1
  300. package/dist/admin/translations/zh-Hans.json.js +222 -133
  301. package/dist/admin/translations/zh-Hans.json.js.map +1 -1
  302. package/dist/admin/translations/zh-Hans.json.mjs +222 -133
  303. package/dist/admin/translations/zh-Hans.json.mjs.map +1 -1
  304. package/dist/admin/translations/zh.json.js +21 -1
  305. package/dist/admin/translations/zh.json.js.map +1 -1
  306. package/dist/admin/translations/zh.json.mjs +21 -1
  307. package/dist/admin/translations/zh.json.mjs.map +1 -1
  308. package/dist/server/index.js +2 -0
  309. package/dist/server/index.js.map +1 -1
  310. package/dist/server/index.mjs +2 -0
  311. package/dist/server/index.mjs.map +1 -1
  312. package/dist/server/register.js +98 -0
  313. package/dist/server/register.js.map +1 -0
  314. package/dist/server/register.mjs +96 -0
  315. package/dist/server/register.mjs.map +1 -0
  316. package/dist/server/src/controllers/ai/auth.d.ts +1 -0
  317. package/dist/server/src/controllers/ai/auth.d.ts.map +1 -0
  318. package/dist/server/src/controllers/ai/index.d.ts +1 -0
  319. package/dist/server/src/controllers/ai/index.d.ts.map +1 -0
  320. package/dist/server/src/index.d.ts +1 -0
  321. package/dist/server/src/index.d.ts.map +1 -1
  322. package/dist/server/src/register.d.ts +11 -0
  323. package/dist/server/src/register.d.ts.map +1 -0
  324. package/package.json +12 -5
  325. package/dist/admin/components/DataManager/utils/formatSchemas.js +0 -21
  326. package/dist/admin/components/DataManager/utils/formatSchemas.js.map +0 -1
  327. package/dist/admin/components/DataManager/utils/formatSchemas.mjs +0 -18
  328. package/dist/admin/components/DataManager/utils/formatSchemas.mjs.map +0 -1
@@ -0,0 +1,214 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var designSystem = require('@strapi/design-system');
5
+ var Icons = require('@strapi/icons');
6
+ var Markdown = require('react-markdown');
7
+ var styledComponents = require('styled-components');
8
+ var FeedbackModal = require('../../FeedbackModal.js');
9
+ var useFeedback = require('../../hooks/useFeedback.js');
10
+ var AnimatedBox = require('../AnimatedBox.js');
11
+ var AttachmentPreview = require('../Attachments/AttachmentPreview.js');
12
+ var Marker = require('./Marker.js');
13
+
14
+ const MarkdownStyles = styledComponents.styled(designSystem.Typography)`
15
+ max-width: 65ch;
16
+ margin: 0 auto;
17
+
18
+ h1,
19
+ h2,
20
+ h3,
21
+ h4,
22
+ h5,
23
+ h6 {
24
+ margin-top: 1.25em;
25
+ margin-bottom: 0.5em;
26
+ font-weight: bold;
27
+ }
28
+
29
+ p {
30
+ margin-bottom: 1em;
31
+ }
32
+
33
+ ul,
34
+ ol {
35
+ padding-left: 1.5em; /* indentation for bullet points */
36
+ margin-bottom: 1em;
37
+ }
38
+
39
+ li {
40
+ margin-bottom: 0.5em;
41
+ list-style-type: disc; /* or whatever style you prefer */
42
+ }
43
+
44
+ strong {
45
+ font-weight: bold;
46
+ }
47
+
48
+ /* code blocks, blockquotes, etc. */
49
+ code {
50
+ background-color: ${({ theme })=>theme.colors.neutral100};
51
+ padding: 0.2em 0.4em;
52
+ border-radius: ${({ theme })=>theme.borderRadius};
53
+ border-color: ${({ theme })=>theme.colors.neutral150};
54
+ border-style: solid;
55
+ font-family: 'SF Mono', SFMono-Regular, ui-monospace, 'DejaVu Sans Mono', Menlo, Consolas,
56
+ monospace;
57
+ }
58
+
59
+ /* links */
60
+ a {
61
+ color: ${({ theme })=>theme.colors.primary500};
62
+ background-color: ${({ theme })=>theme.colors.neutral100};
63
+ padding: 0.2em 0.4em;
64
+ border-radius: ${({ theme })=>theme.borderRadius};
65
+ border-color: ${({ theme })=>theme.colors.neutral150};
66
+ border-style: solid;
67
+ text-decoration: none;
68
+
69
+ &:hover {
70
+ text-decoration: underline;
71
+ }
72
+ }
73
+ `;
74
+ const isSchemaToolPart = (part)=>part && typeof part === 'object' && part.type === 'tool-schemaGenerationTool';
75
+ const capitalize = (s)=>s ? s.charAt(0).toUpperCase() + s.slice(1) : '';
76
+ const getSchemaLink = (schema)=>{
77
+ const isComponent = (schema.kind ?? schema.modelType) === 'component';
78
+ if (!schema.uid) return undefined;
79
+ return isComponent ? `/plugins/content-type-builder/component-categories/${schema.category ?? ''}/${schema.uid}` : `/plugins/content-type-builder/content-types/${schema.uid}`;
80
+ };
81
+ const toMarkerFromSchemaTool = (part)=>{
82
+ const outSchemas = part.output?.schemas ?? [];
83
+ const inSchemas = part.input?.schemas ?? [];
84
+ const schemas = outSchemas.length ? outSchemas : inSchemas;
85
+ const numSchemas = schemas.length;
86
+ const state = part.output ? part.output.error ? 'error' : 'success' : 'loading';
87
+ const steps = schemas.map((schema, index)=>({
88
+ id: `${part.toolCallId ?? 'schemaGenerationTool'}-${schema.uid ?? schema.name ?? index}`,
89
+ description: capitalize(schema.name ?? schema.uid ?? 'Schema'),
90
+ status: schema.action === 'create' || schema.action === 'update' || schema.action === 'remove' ? schema.action : 'update',
91
+ link: getSchemaLink(schema)
92
+ }));
93
+ const title = state === 'success' ? `Updated ${numSchemas} schema${numSchemas === 1 ? '' : 's'}` : state === 'error' ? `Failed to update schema${numSchemas === 1 ? '' : 's'}` : 'Updating schemas';
94
+ return {
95
+ type: 'marker',
96
+ title,
97
+ state,
98
+ steps
99
+ };
100
+ };
101
+ const MessageContent = ({ part })=>{
102
+ if (part.type === 'text') {
103
+ return /*#__PURE__*/ jsxRuntime.jsx(MarkdownStyles, {
104
+ children: /*#__PURE__*/ jsxRuntime.jsx(Markdown, {
105
+ components: {
106
+ a: ({ node, ...props })=>/*#__PURE__*/ jsxRuntime.jsx("a", {
107
+ target: "_blank",
108
+ rel: "noopener noreferrer",
109
+ ...props
110
+ })
111
+ },
112
+ children: part.text
113
+ })
114
+ });
115
+ }
116
+ if (isSchemaToolPart(part)) {
117
+ const marker = toMarkerFromSchemaTool(part);
118
+ return /*#__PURE__*/ jsxRuntime.jsx(Marker.Marker, {
119
+ ...marker
120
+ });
121
+ }
122
+ return null;
123
+ };
124
+ const UserMessage = ({ message })=>{
125
+ const hasText = message.parts.some((content)=>content.type === 'text' && content.text.trim() !== '');
126
+ const attachments = message.parts.filter((content)=>content.type === 'file');
127
+ return /*#__PURE__*/ jsxRuntime.jsxs(AnimatedBox.AnimatedBox, {
128
+ as: designSystem.Flex,
129
+ direction: "column",
130
+ alignItems: "flex-end",
131
+ style: {
132
+ alignSelf: 'flex-end'
133
+ },
134
+ gap: 2,
135
+ maxWidth: "80%",
136
+ children: [
137
+ hasText ? /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
138
+ background: "neutral150",
139
+ borderStyle: "none",
140
+ padding: [
141
+ '10px',
142
+ '16px'
143
+ ],
144
+ hasRadius: true,
145
+ children: message.parts.map((content, index)=>{
146
+ if (content.type !== 'text') return null;
147
+ return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
148
+ children: content.text
149
+ }, index);
150
+ })
151
+ }) : null,
152
+ attachments.map((attachment, idx)=>/*#__PURE__*/ jsxRuntime.jsx(AttachmentPreview.AttachmentPreview, {
153
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
154
+ attachment: {
155
+ ...attachment,
156
+ status: 'ready'
157
+ }
158
+ }, `${attachment.type === 'file' ? attachment.filename : attachment.type}-${idx}`))
159
+ ]
160
+ });
161
+ };
162
+ const AssistantMessage = ({ message, isLoading })=>{
163
+ const { upvoteMessage } = useFeedback.useFeedback();
164
+ const { openFeedbackModal } = FeedbackModal.useFeedbackModal();
165
+ return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Box, {
166
+ style: {
167
+ alignSelf: 'flex-start'
168
+ },
169
+ maxWidth: "90%",
170
+ children: [
171
+ message.parts.map((content, index)=>/*#__PURE__*/ jsxRuntime.jsx(MessageContent, {
172
+ part: content
173
+ }, index)),
174
+ isLoading ? /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
175
+ gap: 1,
176
+ children: [
177
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
178
+ label: "Upvote",
179
+ size: "XS",
180
+ variant: "ghost",
181
+ onClick: ()=>upvoteMessage(message.id),
182
+ children: /*#__PURE__*/ jsxRuntime.jsx(Icons.ThumbUp, {})
183
+ }),
184
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
185
+ label: "Downvote",
186
+ size: "XS",
187
+ variant: "ghost",
188
+ // For downvoting, user must provide specific feedback
189
+ onClick: ()=>openFeedbackModal(message.id),
190
+ children: /*#__PURE__*/ jsxRuntime.jsx(Icons.ThumbDown, {})
191
+ })
192
+ ]
193
+ }) : null
194
+ ]
195
+ });
196
+ };
197
+ const ChatMessage = ({ message, isLoading })=>{
198
+ /**
199
+ * IMPORTANT: Messages are rendered using react-markdown (heavy compute)
200
+ * Component re-renders on each message update, but AI SDK v5 provides
201
+ * throttling (experimental_throttle: 100ms) which batches updates and reduces
202
+ * re-render frequency during streaming.
203
+ */ if (message.role === 'user') {
204
+ return /*#__PURE__*/ jsxRuntime.jsx(UserMessage, {
205
+ message: message
206
+ });
207
+ }
208
+ return /*#__PURE__*/ jsxRuntime.jsx(AssistantMessage, {
209
+ message: message
210
+ });
211
+ };
212
+
213
+ exports.ChatMessage = ChatMessage;
214
+ //# sourceMappingURL=Message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Message.js","sources":["../../../../../../admin/src/components/AIChat/components/Messages/Message.tsx"],"sourcesContent":["import { Typography, Box, IconButton, Flex } from '@strapi/design-system';\nimport { ThumbUp, ThumbDown } from '@strapi/icons';\nimport Markdown from 'react-markdown';\nimport { styled } from 'styled-components';\n\nimport { useFeedbackModal } from '../../FeedbackModal';\nimport { useFeedback } from '../../hooks/useFeedback';\nimport {\n AIMessage,\n type UserMessage as UserMessageType,\n AssistantMessage as AssistantMessageType,\n type MarkerContent as MarkerContentType,\n} from '../../lib/types/messages';\nimport { AnimatedBox } from '../AnimatedBox';\nimport { AttachmentPreview } from '../Attachments/AttachmentPreview';\n\nimport { Marker } from './Marker';\n\nconst MarkdownStyles = styled(Typography)`\n max-width: 65ch;\n margin: 0 auto;\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n margin-top: 1.25em;\n margin-bottom: 0.5em;\n font-weight: bold;\n }\n\n p {\n margin-bottom: 1em;\n }\n\n ul,\n ol {\n padding-left: 1.5em; /* indentation for bullet points */\n margin-bottom: 1em;\n }\n\n li {\n margin-bottom: 0.5em;\n list-style-type: disc; /* or whatever style you prefer */\n }\n\n strong {\n font-weight: bold;\n }\n\n /* code blocks, blockquotes, etc. */\n code {\n background-color: ${({ theme }) => theme.colors.neutral100};\n padding: 0.2em 0.4em;\n border-radius: ${({ theme }) => theme.borderRadius};\n border-color: ${({ theme }) => theme.colors.neutral150};\n border-style: solid;\n font-family: 'SF Mono', SFMono-Regular, ui-monospace, 'DejaVu Sans Mono', Menlo, Consolas,\n monospace;\n }\n\n /* links */\n a {\n color: ${({ theme }) => theme.colors.primary500};\n background-color: ${({ theme }) => theme.colors.neutral100};\n padding: 0.2em 0.4em;\n border-radius: ${({ theme }) => theme.borderRadius};\n border-color: ${({ theme }) => theme.colors.neutral150};\n border-style: solid;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n`;\n\n// ---------------------------\n// Tool: schemaGenerationTool helpers\n// ---------------------------\n\ntype SchemaToolSchema = {\n action?: 'create' | 'update' | 'remove';\n uid?: string;\n name?: string;\n category?: string;\n kind?: 'collectionType' | 'singleType' | 'component';\n modelType?: 'component' | 'collectionType' | 'singleType';\n};\n\ntype SchemaToolPart = {\n type: 'tool-schemaGenerationTool';\n input?: { schemas?: SchemaToolSchema[] };\n output?: { schemas?: SchemaToolSchema[]; error?: unknown };\n toolCallId?: string;\n};\n\nconst isSchemaToolPart = (part: any): part is SchemaToolPart =>\n part && typeof part === 'object' && part.type === 'tool-schemaGenerationTool';\n\nconst capitalize = (s?: string) => (s ? s.charAt(0).toUpperCase() + s.slice(1) : '');\n\nconst getSchemaLink = (schema: SchemaToolSchema): string | undefined => {\n const isComponent = (schema.kind ?? schema.modelType) === 'component';\n if (!schema.uid) return undefined;\n return isComponent\n ? `/plugins/content-type-builder/component-categories/${schema.category ?? ''}/${schema.uid}`\n : `/plugins/content-type-builder/content-types/${schema.uid}`;\n};\n\nconst toMarkerFromSchemaTool = (part: SchemaToolPart): MarkerContentType => {\n const outSchemas = part.output?.schemas ?? [];\n const inSchemas = part.input?.schemas ?? [];\n\n const schemas = (outSchemas.length ? outSchemas : inSchemas) as SchemaToolSchema[];\n const numSchemas = schemas.length;\n\n const state: 'loading' | 'success' | 'error' = part.output\n ? part.output.error\n ? 'error'\n : 'success'\n : 'loading';\n\n const steps = schemas.map((schema, index) => ({\n id: `${part.toolCallId ?? 'schemaGenerationTool'}-${schema.uid ?? schema.name ?? index}`,\n description: capitalize(schema.name ?? schema.uid ?? 'Schema'),\n status:\n schema.action === 'create' || schema.action === 'update' || schema.action === 'remove'\n ? schema.action\n : ('update' as const),\n link: getSchemaLink(schema),\n }));\n\n const title =\n state === 'success'\n ? `Updated ${numSchemas} schema${numSchemas === 1 ? '' : 's'}`\n : state === 'error'\n ? `Failed to update schema${numSchemas === 1 ? '' : 's'}`\n : 'Updating schemas';\n\n return {\n type: 'marker',\n title,\n state,\n steps,\n };\n};\n\nconst MessageContent = ({\n part,\n}: {\n part: AIMessage['parts'][number];\n status?: 'loading' | 'success' | 'error';\n}) => {\n if (part.type === 'text') {\n return (\n <MarkdownStyles>\n <Markdown\n components={{\n a: ({ node, ...props }) => <a target=\"_blank\" rel=\"noopener noreferrer\" {...props} />,\n }}\n >\n {part.text}\n </Markdown>\n </MarkdownStyles>\n );\n }\n\n if (isSchemaToolPart(part)) {\n const marker = toMarkerFromSchemaTool(part);\n return <Marker {...marker} />;\n }\n\n return null;\n};\n\nconst UserMessage = ({ message }: { message: UserMessageType }) => {\n const hasText = message.parts.some(\n (content) => content.type === 'text' && content.text.trim() !== ''\n );\n const attachments = message.parts.filter((content) => content.type === 'file');\n\n return (\n <AnimatedBox\n as={Flex}\n direction=\"column\"\n alignItems=\"flex-end\"\n style={{ alignSelf: 'flex-end' }}\n gap={2}\n maxWidth=\"80%\"\n >\n {hasText ? (\n <Box background=\"neutral150\" borderStyle=\"none\" padding={['10px', '16px']} hasRadius>\n {message.parts.map((content, index) => {\n if (content.type !== 'text') return null;\n return <Typography key={index}>{content.text}</Typography>;\n })}\n </Box>\n ) : null}\n\n {/* Attachments */}\n {attachments.map((attachment, idx) => (\n <AttachmentPreview\n key={`${attachment.type === 'file' ? attachment.filename : attachment.type}-${idx}`}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n attachment={{ ...attachment, status: 'ready' } as any}\n />\n ))}\n </AnimatedBox>\n );\n};\n\nconst AssistantMessage = ({\n message,\n isLoading,\n}: {\n message: AssistantMessageType;\n isLoading?: boolean;\n}) => {\n const { upvoteMessage } = useFeedback();\n const { openFeedbackModal } = useFeedbackModal();\n\n return (\n <Box style={{ alignSelf: 'flex-start' }} maxWidth=\"90%\">\n {message.parts.map((content, index) => (\n <MessageContent key={index} part={content} />\n ))}\n {isLoading ? (\n <Flex gap={1}>\n <IconButton\n label=\"Upvote\"\n size=\"XS\"\n variant=\"ghost\"\n onClick={() => upvoteMessage(message.id)}\n >\n <ThumbUp />\n </IconButton>\n <IconButton\n label=\"Downvote\"\n size=\"XS\"\n variant=\"ghost\"\n // For downvoting, user must provide specific feedback\n onClick={() => openFeedbackModal(message.id)}\n >\n <ThumbDown />\n </IconButton>\n </Flex>\n ) : null}\n </Box>\n );\n};\n\nexport const ChatMessage = ({\n message,\n isLoading,\n}: {\n message: AIMessage;\n isLoading?: boolean;\n}) => {\n /**\n * IMPORTANT: Messages are rendered using react-markdown (heavy compute)\n * Component re-renders on each message update, but AI SDK v5 provides\n * throttling (experimental_throttle: 100ms) which batches updates and reduces\n * re-render frequency during streaming.\n */\n if (message.role === 'user') {\n return <UserMessage message={message as UserMessageType} />;\n }\n return <AssistantMessage message={message as AssistantMessageType} />;\n};\n"],"names":["MarkdownStyles","styled","Typography","theme","colors","neutral100","borderRadius","neutral150","primary500","isSchemaToolPart","part","type","capitalize","s","charAt","toUpperCase","slice","getSchemaLink","schema","isComponent","kind","modelType","uid","undefined","category","toMarkerFromSchemaTool","outSchemas","output","schemas","inSchemas","input","length","numSchemas","state","error","steps","map","index","id","toolCallId","name","description","status","action","link","title","MessageContent","_jsx","Markdown","components","a","node","props","target","rel","text","marker","Marker","UserMessage","message","hasText","parts","some","content","trim","attachments","filter","_jsxs","AnimatedBox","as","Flex","direction","alignItems","style","alignSelf","gap","maxWidth","Box","background","borderStyle","padding","hasRadius","attachment","idx","AttachmentPreview","filename","AssistantMessage","isLoading","upvoteMessage","useFeedback","openFeedbackModal","useFeedbackModal","IconButton","label","size","variant","onClick","ThumbUp","ThumbDown","ChatMessage","role"],"mappings":";;;;;;;;;;;;;AAkBA,MAAMA,cAAAA,GAAiBC,uBAAOC,CAAAA,uBAAAA,CAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sBAoCnB,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAMC,CAAAA,MAAM,CAACC,UAAU,CAAC;;AAE5C,mBAAA,EAAE,CAAC,EAAEF,KAAK,EAAE,GAAKA,KAAAA,CAAMG,YAAY,CAAC;kBACrC,EAAE,CAAC,EAAEH,KAAK,EAAE,GAAKA,KAAMC,CAAAA,MAAM,CAACG,UAAU,CAAC;;;;;;;;WAQhD,EAAE,CAAC,EAAEJ,KAAK,EAAE,GAAKA,KAAMC,CAAAA,MAAM,CAACI,UAAU,CAAC;sBAC9B,EAAE,CAAC,EAAEL,KAAK,EAAE,GAAKA,KAAMC,CAAAA,MAAM,CAACC,UAAU,CAAC;;AAE5C,mBAAA,EAAE,CAAC,EAAEF,KAAK,EAAE,GAAKA,KAAAA,CAAMG,YAAY,CAAC;kBACrC,EAAE,CAAC,EAAEH,KAAK,EAAE,GAAKA,KAAMC,CAAAA,MAAM,CAACG,UAAU,CAAC;;;;;;;;AAQ3D,CAAC;AAsBD,MAAME,gBAAAA,GAAmB,CAACC,IACxBA,GAAAA,IAAAA,IAAQ,OAAOA,IAAS,KAAA,QAAA,IAAYA,IAAKC,CAAAA,IAAI,KAAK,2BAAA;AAEpD,MAAMC,UAAa,GAAA,CAACC,CAAgBA,GAAAA,CAAAA,GAAIA,CAAEC,CAAAA,MAAM,CAAC,CAAA,CAAA,CAAGC,WAAW,EAAA,GAAKF,CAAEG,CAAAA,KAAK,CAAC,CAAK,CAAA,GAAA,EAAA;AAEjF,MAAMC,gBAAgB,CAACC,MAAAA,GAAAA;IACrB,MAAMC,WAAAA,GAAc,CAACD,MAAAA,CAAOE,IAAI,IAAIF,MAAAA,CAAOG,SAAQ,MAAO,WAAA;AAC1D,IAAA,IAAI,CAACH,MAAAA,CAAOI,GAAG,EAAE,OAAOC,SAAAA;IACxB,OAAOJ,WAAAA,GACH,CAAC,mDAAmD,EAAED,OAAOM,QAAQ,IAAI,GAAG,CAAC,EAAEN,OAAOI,GAAG,CAAC,CAAC,GAC3F,CAAC,4CAA4C,EAAEJ,MAAAA,CAAOI,GAAG,CAAC,CAAC;AACjE,CAAA;AAEA,MAAMG,yBAAyB,CAACf,IAAAA,GAAAA;AAC9B,IAAA,MAAMgB,UAAahB,GAAAA,IAAAA,CAAKiB,MAAM,EAAEC,WAAW,EAAE;AAC7C,IAAA,MAAMC,SAAYnB,GAAAA,IAAAA,CAAKoB,KAAK,EAAEF,WAAW,EAAE;AAE3C,IAAA,MAAMA,OAAWF,GAAAA,UAAAA,CAAWK,MAAM,GAAGL,UAAaG,GAAAA,SAAAA;IAClD,MAAMG,UAAAA,GAAaJ,QAAQG,MAAM;IAEjC,MAAME,KAAAA,GAAyCvB,IAAKiB,CAAAA,MAAM,GACtDjB,IAAAA,CAAKiB,MAAM,CAACO,KAAK,GACf,OAAA,GACA,SACF,GAAA,SAAA;AAEJ,IAAA,MAAMC,QAAQP,OAAQQ,CAAAA,GAAG,CAAC,CAAClB,MAAAA,EAAQmB,SAAW;AAC5CC,YAAAA,EAAAA,EAAI,CAAC,EAAE5B,IAAK6B,CAAAA,UAAU,IAAI,sBAAuB,CAAA,CAAC,EAAErB,MAAAA,CAAOI,GAAG,IAAIJ,MAAAA,CAAOsB,IAAI,IAAIH,MAAM,CAAC;AACxFI,YAAAA,WAAAA,EAAa7B,WAAWM,MAAOsB,CAAAA,IAAI,IAAItB,MAAAA,CAAOI,GAAG,IAAI,QAAA,CAAA;AACrDoB,YAAAA,MAAAA,EACExB,MAAOyB,CAAAA,MAAM,KAAK,QAAA,IAAYzB,OAAOyB,MAAM,KAAK,QAAYzB,IAAAA,MAAAA,CAAOyB,MAAM,KAAK,QAC1EzB,GAAAA,MAAAA,CAAOyB,MAAM,GACZ,QAAA;AACPC,YAAAA,IAAAA,EAAM3B,aAAcC,CAAAA,MAAAA;SACtB,CAAA,CAAA;IAEA,MAAM2B,KAAAA,GACJZ,KAAU,KAAA,SAAA,GACN,CAAC,QAAQ,EAAED,UAAW,CAAA,OAAO,EAAEA,UAAAA,KAAe,CAAI,GAAA,EAAA,GAAK,IAAI,CAAC,GAC5DC,KAAU,KAAA,OAAA,GACR,CAAC,uBAAuB,EAAED,UAAAA,KAAe,CAAI,GAAA,EAAA,GAAK,GAAI,CAAA,CAAC,GACvD,kBAAA;IAER,OAAO;QACLrB,IAAM,EAAA,QAAA;AACNkC,QAAAA,KAAAA;AACAZ,QAAAA,KAAAA;AACAE,QAAAA;AACF,KAAA;AACF,CAAA;AAEA,MAAMW,cAAiB,GAAA,CAAC,EACtBpC,IAAI,EAIL,GAAA;IACC,IAAIA,IAAAA,CAAKC,IAAI,KAAK,MAAQ,EAAA;AACxB,QAAA,qBACEoC,cAAC/C,CAAAA,cAAAA,EAAAA;AACC,YAAA,QAAA,gBAAA+C,cAACC,CAAAA,QAAAA,EAAAA;gBACCC,UAAY,EAAA;AACVC,oBAAAA,CAAAA,EAAG,CAAC,EAAEC,IAAI,EAAE,GAAGC,KAAAA,EAAO,iBAAKL,cAACG,CAAAA,GAAAA,EAAAA;4BAAEG,MAAO,EAAA,QAAA;4BAASC,GAAI,EAAA,qBAAA;AAAuB,4BAAA,GAAGF;;AAC9E,iBAAA;AAEC1C,gBAAAA,QAAAA,EAAAA,IAAAA,CAAK6C;;;AAId;AAEA,IAAA,IAAI9C,iBAAiBC,IAAO,CAAA,EAAA;AAC1B,QAAA,MAAM8C,SAAS/B,sBAAuBf,CAAAA,IAAAA,CAAAA;AACtC,QAAA,qBAAOqC,cAACU,CAAAA,aAAAA,EAAAA;AAAQ,YAAA,GAAGD;;AACrB;IAEA,OAAO,IAAA;AACT,CAAA;AAEA,MAAME,WAAc,GAAA,CAAC,EAAEC,OAAO,EAAgC,GAAA;AAC5D,IAAA,MAAMC,UAAUD,OAAQE,CAAAA,KAAK,CAACC,IAAI,CAChC,CAACC,OAAAA,GAAYA,OAAQpD,CAAAA,IAAI,KAAK,MAAUoD,IAAAA,OAAAA,CAAQR,IAAI,CAACS,IAAI,EAAO,KAAA,EAAA,CAAA;IAElE,MAAMC,WAAAA,GAAcN,OAAQE,CAAAA,KAAK,CAACK,MAAM,CAAC,CAACH,OAAAA,GAAYA,OAAQpD,CAAAA,IAAI,KAAK,MAAA,CAAA;AAEvE,IAAA,qBACEwD,eAACC,CAAAA,uBAAAA,EAAAA;QACCC,EAAIC,EAAAA,iBAAAA;QACJC,SAAU,EAAA,QAAA;QACVC,UAAW,EAAA,UAAA;QACXC,KAAO,EAAA;YAAEC,SAAW,EAAA;AAAW,SAAA;QAC/BC,GAAK,EAAA,CAAA;QACLC,QAAS,EAAA,KAAA;;AAERhB,YAAAA,OAAAA,iBACCb,cAAC8B,CAAAA,gBAAAA,EAAAA;gBAAIC,UAAW,EAAA,YAAA;gBAAaC,WAAY,EAAA,MAAA;gBAAOC,OAAS,EAAA;AAAC,oBAAA,MAAA;AAAQ,oBAAA;AAAO,iBAAA;gBAAEC,SAAS,EAAA,IAAA;AACjFtB,gBAAAA,QAAAA,EAAAA,OAAAA,CAAQE,KAAK,CAACzB,GAAG,CAAC,CAAC2B,OAAS1B,EAAAA,KAAAA,GAAAA;AAC3B,oBAAA,IAAI0B,OAAQpD,CAAAA,IAAI,KAAK,MAAA,EAAQ,OAAO,IAAA;AACpC,oBAAA,qBAAOoC,cAAC7C,CAAAA,uBAAAA,EAAAA;AAAwB6D,wBAAAA,QAAAA,EAAAA,OAAAA,CAAQR;AAAhBlB,qBAAAA,EAAAA,KAAAA,CAAAA;AAC1B,iBAAA;AAEA,aAAA,CAAA,GAAA,IAAA;AAGH4B,YAAAA,WAAAA,CAAY7B,GAAG,CAAC,CAAC8C,UAAAA,EAAYC,oBAC5BpC,cAACqC,CAAAA,mCAAAA,EAAAA;;oBAGCF,UAAY,EAAA;AAAE,wBAAA,GAAGA,UAAU;wBAAExC,MAAQ,EAAA;AAAQ;AAFxC,iBAAA,EAAA,CAAC,EAAEwC,UAAAA,CAAWvE,IAAI,KAAK,SAASuE,UAAWG,CAAAA,QAAQ,GAAGH,UAAAA,CAAWvE,IAAI,CAAC,CAAC,EAAEwE,IAAI,CAAC,CAAA;;;AAO7F,CAAA;AAEA,MAAMG,mBAAmB,CAAC,EACxB3B,OAAO,EACP4B,SAAS,EAIV,GAAA;IACC,MAAM,EAAEC,aAAa,EAAE,GAAGC,uBAAAA,EAAAA;IAC1B,MAAM,EAAEC,iBAAiB,EAAE,GAAGC,8BAAAA,EAAAA;AAE9B,IAAA,qBACExB,eAACU,CAAAA,gBAAAA,EAAAA;QAAIJ,KAAO,EAAA;YAAEC,SAAW,EAAA;AAAa,SAAA;QAAGE,QAAS,EAAA,KAAA;;AAC/CjB,YAAAA,OAAAA,CAAQE,KAAK,CAACzB,GAAG,CAAC,CAAC2B,OAAAA,EAAS1B,sBAC3BU,cAACD,CAAAA,cAAAA,EAAAA;oBAA2BpC,IAAMqD,EAAAA;AAAb1B,iBAAAA,EAAAA,KAAAA,CAAAA,CAAAA;AAEtBkD,YAAAA,SAAAA,iBACCpB,eAACG,CAAAA,iBAAAA,EAAAA;gBAAKK,GAAK,EAAA,CAAA;;kCACT5B,cAAC6C,CAAAA,uBAAAA,EAAAA;wBACCC,KAAM,EAAA,QAAA;wBACNC,IAAK,EAAA,IAAA;wBACLC,OAAQ,EAAA,OAAA;wBACRC,OAAS,EAAA,IAAMR,aAAc7B,CAAAA,OAAAA,CAAQrB,EAAE,CAAA;AAEvC,wBAAA,QAAA,gBAAAS,cAACkD,CAAAA,aAAAA,EAAAA,EAAAA;;kCAEHlD,cAAC6C,CAAAA,uBAAAA,EAAAA;wBACCC,KAAM,EAAA,UAAA;wBACNC,IAAK,EAAA,IAAA;wBACLC,OAAQ,EAAA,OAAA;;wBAERC,OAAS,EAAA,IAAMN,iBAAkB/B,CAAAA,OAAAA,CAAQrB,EAAE,CAAA;AAE3C,wBAAA,QAAA,gBAAAS,cAACmD,CAAAA,eAAAA,EAAAA,EAAAA;;;AAGH,aAAA,CAAA,GAAA;;;AAGV,CAAA;MAEaC,WAAc,GAAA,CAAC,EAC1BxC,OAAO,EACP4B,SAAS,EAIV,GAAA;AACC;;;;;AAKC,MACD,IAAI5B,OAAAA,CAAQyC,IAAI,KAAK,MAAQ,EAAA;AAC3B,QAAA,qBAAOrD,cAACW,CAAAA,WAAAA,EAAAA;YAAYC,OAASA,EAAAA;;AAC/B;AACA,IAAA,qBAAOZ,cAACuC,CAAAA,gBAAAA,EAAAA;QAAiB3B,OAASA,EAAAA;;AACpC;;;;"}
@@ -0,0 +1,212 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { Typography, Flex, Box, IconButton } from '@strapi/design-system';
3
+ import { ThumbUp, ThumbDown } from '@strapi/icons';
4
+ import Markdown from 'react-markdown';
5
+ import { styled } from 'styled-components';
6
+ import { useFeedbackModal } from '../../FeedbackModal.mjs';
7
+ import { useFeedback } from '../../hooks/useFeedback.mjs';
8
+ import { AnimatedBox } from '../AnimatedBox.mjs';
9
+ import { AttachmentPreview } from '../Attachments/AttachmentPreview.mjs';
10
+ import { Marker } from './Marker.mjs';
11
+
12
+ const MarkdownStyles = styled(Typography)`
13
+ max-width: 65ch;
14
+ margin: 0 auto;
15
+
16
+ h1,
17
+ h2,
18
+ h3,
19
+ h4,
20
+ h5,
21
+ h6 {
22
+ margin-top: 1.25em;
23
+ margin-bottom: 0.5em;
24
+ font-weight: bold;
25
+ }
26
+
27
+ p {
28
+ margin-bottom: 1em;
29
+ }
30
+
31
+ ul,
32
+ ol {
33
+ padding-left: 1.5em; /* indentation for bullet points */
34
+ margin-bottom: 1em;
35
+ }
36
+
37
+ li {
38
+ margin-bottom: 0.5em;
39
+ list-style-type: disc; /* or whatever style you prefer */
40
+ }
41
+
42
+ strong {
43
+ font-weight: bold;
44
+ }
45
+
46
+ /* code blocks, blockquotes, etc. */
47
+ code {
48
+ background-color: ${({ theme })=>theme.colors.neutral100};
49
+ padding: 0.2em 0.4em;
50
+ border-radius: ${({ theme })=>theme.borderRadius};
51
+ border-color: ${({ theme })=>theme.colors.neutral150};
52
+ border-style: solid;
53
+ font-family: 'SF Mono', SFMono-Regular, ui-monospace, 'DejaVu Sans Mono', Menlo, Consolas,
54
+ monospace;
55
+ }
56
+
57
+ /* links */
58
+ a {
59
+ color: ${({ theme })=>theme.colors.primary500};
60
+ background-color: ${({ theme })=>theme.colors.neutral100};
61
+ padding: 0.2em 0.4em;
62
+ border-radius: ${({ theme })=>theme.borderRadius};
63
+ border-color: ${({ theme })=>theme.colors.neutral150};
64
+ border-style: solid;
65
+ text-decoration: none;
66
+
67
+ &:hover {
68
+ text-decoration: underline;
69
+ }
70
+ }
71
+ `;
72
+ const isSchemaToolPart = (part)=>part && typeof part === 'object' && part.type === 'tool-schemaGenerationTool';
73
+ const capitalize = (s)=>s ? s.charAt(0).toUpperCase() + s.slice(1) : '';
74
+ const getSchemaLink = (schema)=>{
75
+ const isComponent = (schema.kind ?? schema.modelType) === 'component';
76
+ if (!schema.uid) return undefined;
77
+ return isComponent ? `/plugins/content-type-builder/component-categories/${schema.category ?? ''}/${schema.uid}` : `/plugins/content-type-builder/content-types/${schema.uid}`;
78
+ };
79
+ const toMarkerFromSchemaTool = (part)=>{
80
+ const outSchemas = part.output?.schemas ?? [];
81
+ const inSchemas = part.input?.schemas ?? [];
82
+ const schemas = outSchemas.length ? outSchemas : inSchemas;
83
+ const numSchemas = schemas.length;
84
+ const state = part.output ? part.output.error ? 'error' : 'success' : 'loading';
85
+ const steps = schemas.map((schema, index)=>({
86
+ id: `${part.toolCallId ?? 'schemaGenerationTool'}-${schema.uid ?? schema.name ?? index}`,
87
+ description: capitalize(schema.name ?? schema.uid ?? 'Schema'),
88
+ status: schema.action === 'create' || schema.action === 'update' || schema.action === 'remove' ? schema.action : 'update',
89
+ link: getSchemaLink(schema)
90
+ }));
91
+ const title = state === 'success' ? `Updated ${numSchemas} schema${numSchemas === 1 ? '' : 's'}` : state === 'error' ? `Failed to update schema${numSchemas === 1 ? '' : 's'}` : 'Updating schemas';
92
+ return {
93
+ type: 'marker',
94
+ title,
95
+ state,
96
+ steps
97
+ };
98
+ };
99
+ const MessageContent = ({ part })=>{
100
+ if (part.type === 'text') {
101
+ return /*#__PURE__*/ jsx(MarkdownStyles, {
102
+ children: /*#__PURE__*/ jsx(Markdown, {
103
+ components: {
104
+ a: ({ node, ...props })=>/*#__PURE__*/ jsx("a", {
105
+ target: "_blank",
106
+ rel: "noopener noreferrer",
107
+ ...props
108
+ })
109
+ },
110
+ children: part.text
111
+ })
112
+ });
113
+ }
114
+ if (isSchemaToolPart(part)) {
115
+ const marker = toMarkerFromSchemaTool(part);
116
+ return /*#__PURE__*/ jsx(Marker, {
117
+ ...marker
118
+ });
119
+ }
120
+ return null;
121
+ };
122
+ const UserMessage = ({ message })=>{
123
+ const hasText = message.parts.some((content)=>content.type === 'text' && content.text.trim() !== '');
124
+ const attachments = message.parts.filter((content)=>content.type === 'file');
125
+ return /*#__PURE__*/ jsxs(AnimatedBox, {
126
+ as: Flex,
127
+ direction: "column",
128
+ alignItems: "flex-end",
129
+ style: {
130
+ alignSelf: 'flex-end'
131
+ },
132
+ gap: 2,
133
+ maxWidth: "80%",
134
+ children: [
135
+ hasText ? /*#__PURE__*/ jsx(Box, {
136
+ background: "neutral150",
137
+ borderStyle: "none",
138
+ padding: [
139
+ '10px',
140
+ '16px'
141
+ ],
142
+ hasRadius: true,
143
+ children: message.parts.map((content, index)=>{
144
+ if (content.type !== 'text') return null;
145
+ return /*#__PURE__*/ jsx(Typography, {
146
+ children: content.text
147
+ }, index);
148
+ })
149
+ }) : null,
150
+ attachments.map((attachment, idx)=>/*#__PURE__*/ jsx(AttachmentPreview, {
151
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
152
+ attachment: {
153
+ ...attachment,
154
+ status: 'ready'
155
+ }
156
+ }, `${attachment.type === 'file' ? attachment.filename : attachment.type}-${idx}`))
157
+ ]
158
+ });
159
+ };
160
+ const AssistantMessage = ({ message, isLoading })=>{
161
+ const { upvoteMessage } = useFeedback();
162
+ const { openFeedbackModal } = useFeedbackModal();
163
+ return /*#__PURE__*/ jsxs(Box, {
164
+ style: {
165
+ alignSelf: 'flex-start'
166
+ },
167
+ maxWidth: "90%",
168
+ children: [
169
+ message.parts.map((content, index)=>/*#__PURE__*/ jsx(MessageContent, {
170
+ part: content
171
+ }, index)),
172
+ isLoading ? /*#__PURE__*/ jsxs(Flex, {
173
+ gap: 1,
174
+ children: [
175
+ /*#__PURE__*/ jsx(IconButton, {
176
+ label: "Upvote",
177
+ size: "XS",
178
+ variant: "ghost",
179
+ onClick: ()=>upvoteMessage(message.id),
180
+ children: /*#__PURE__*/ jsx(ThumbUp, {})
181
+ }),
182
+ /*#__PURE__*/ jsx(IconButton, {
183
+ label: "Downvote",
184
+ size: "XS",
185
+ variant: "ghost",
186
+ // For downvoting, user must provide specific feedback
187
+ onClick: ()=>openFeedbackModal(message.id),
188
+ children: /*#__PURE__*/ jsx(ThumbDown, {})
189
+ })
190
+ ]
191
+ }) : null
192
+ ]
193
+ });
194
+ };
195
+ const ChatMessage = ({ message, isLoading })=>{
196
+ /**
197
+ * IMPORTANT: Messages are rendered using react-markdown (heavy compute)
198
+ * Component re-renders on each message update, but AI SDK v5 provides
199
+ * throttling (experimental_throttle: 100ms) which batches updates and reduces
200
+ * re-render frequency during streaming.
201
+ */ if (message.role === 'user') {
202
+ return /*#__PURE__*/ jsx(UserMessage, {
203
+ message: message
204
+ });
205
+ }
206
+ return /*#__PURE__*/ jsx(AssistantMessage, {
207
+ message: message
208
+ });
209
+ };
210
+
211
+ export { ChatMessage };
212
+ //# sourceMappingURL=Message.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Message.mjs","sources":["../../../../../../admin/src/components/AIChat/components/Messages/Message.tsx"],"sourcesContent":["import { Typography, Box, IconButton, Flex } from '@strapi/design-system';\nimport { ThumbUp, ThumbDown } from '@strapi/icons';\nimport Markdown from 'react-markdown';\nimport { styled } from 'styled-components';\n\nimport { useFeedbackModal } from '../../FeedbackModal';\nimport { useFeedback } from '../../hooks/useFeedback';\nimport {\n AIMessage,\n type UserMessage as UserMessageType,\n AssistantMessage as AssistantMessageType,\n type MarkerContent as MarkerContentType,\n} from '../../lib/types/messages';\nimport { AnimatedBox } from '../AnimatedBox';\nimport { AttachmentPreview } from '../Attachments/AttachmentPreview';\n\nimport { Marker } from './Marker';\n\nconst MarkdownStyles = styled(Typography)`\n max-width: 65ch;\n margin: 0 auto;\n\n h1,\n h2,\n h3,\n h4,\n h5,\n h6 {\n margin-top: 1.25em;\n margin-bottom: 0.5em;\n font-weight: bold;\n }\n\n p {\n margin-bottom: 1em;\n }\n\n ul,\n ol {\n padding-left: 1.5em; /* indentation for bullet points */\n margin-bottom: 1em;\n }\n\n li {\n margin-bottom: 0.5em;\n list-style-type: disc; /* or whatever style you prefer */\n }\n\n strong {\n font-weight: bold;\n }\n\n /* code blocks, blockquotes, etc. */\n code {\n background-color: ${({ theme }) => theme.colors.neutral100};\n padding: 0.2em 0.4em;\n border-radius: ${({ theme }) => theme.borderRadius};\n border-color: ${({ theme }) => theme.colors.neutral150};\n border-style: solid;\n font-family: 'SF Mono', SFMono-Regular, ui-monospace, 'DejaVu Sans Mono', Menlo, Consolas,\n monospace;\n }\n\n /* links */\n a {\n color: ${({ theme }) => theme.colors.primary500};\n background-color: ${({ theme }) => theme.colors.neutral100};\n padding: 0.2em 0.4em;\n border-radius: ${({ theme }) => theme.borderRadius};\n border-color: ${({ theme }) => theme.colors.neutral150};\n border-style: solid;\n text-decoration: none;\n\n &:hover {\n text-decoration: underline;\n }\n }\n`;\n\n// ---------------------------\n// Tool: schemaGenerationTool helpers\n// ---------------------------\n\ntype SchemaToolSchema = {\n action?: 'create' | 'update' | 'remove';\n uid?: string;\n name?: string;\n category?: string;\n kind?: 'collectionType' | 'singleType' | 'component';\n modelType?: 'component' | 'collectionType' | 'singleType';\n};\n\ntype SchemaToolPart = {\n type: 'tool-schemaGenerationTool';\n input?: { schemas?: SchemaToolSchema[] };\n output?: { schemas?: SchemaToolSchema[]; error?: unknown };\n toolCallId?: string;\n};\n\nconst isSchemaToolPart = (part: any): part is SchemaToolPart =>\n part && typeof part === 'object' && part.type === 'tool-schemaGenerationTool';\n\nconst capitalize = (s?: string) => (s ? s.charAt(0).toUpperCase() + s.slice(1) : '');\n\nconst getSchemaLink = (schema: SchemaToolSchema): string | undefined => {\n const isComponent = (schema.kind ?? schema.modelType) === 'component';\n if (!schema.uid) return undefined;\n return isComponent\n ? `/plugins/content-type-builder/component-categories/${schema.category ?? ''}/${schema.uid}`\n : `/plugins/content-type-builder/content-types/${schema.uid}`;\n};\n\nconst toMarkerFromSchemaTool = (part: SchemaToolPart): MarkerContentType => {\n const outSchemas = part.output?.schemas ?? [];\n const inSchemas = part.input?.schemas ?? [];\n\n const schemas = (outSchemas.length ? outSchemas : inSchemas) as SchemaToolSchema[];\n const numSchemas = schemas.length;\n\n const state: 'loading' | 'success' | 'error' = part.output\n ? part.output.error\n ? 'error'\n : 'success'\n : 'loading';\n\n const steps = schemas.map((schema, index) => ({\n id: `${part.toolCallId ?? 'schemaGenerationTool'}-${schema.uid ?? schema.name ?? index}`,\n description: capitalize(schema.name ?? schema.uid ?? 'Schema'),\n status:\n schema.action === 'create' || schema.action === 'update' || schema.action === 'remove'\n ? schema.action\n : ('update' as const),\n link: getSchemaLink(schema),\n }));\n\n const title =\n state === 'success'\n ? `Updated ${numSchemas} schema${numSchemas === 1 ? '' : 's'}`\n : state === 'error'\n ? `Failed to update schema${numSchemas === 1 ? '' : 's'}`\n : 'Updating schemas';\n\n return {\n type: 'marker',\n title,\n state,\n steps,\n };\n};\n\nconst MessageContent = ({\n part,\n}: {\n part: AIMessage['parts'][number];\n status?: 'loading' | 'success' | 'error';\n}) => {\n if (part.type === 'text') {\n return (\n <MarkdownStyles>\n <Markdown\n components={{\n a: ({ node, ...props }) => <a target=\"_blank\" rel=\"noopener noreferrer\" {...props} />,\n }}\n >\n {part.text}\n </Markdown>\n </MarkdownStyles>\n );\n }\n\n if (isSchemaToolPart(part)) {\n const marker = toMarkerFromSchemaTool(part);\n return <Marker {...marker} />;\n }\n\n return null;\n};\n\nconst UserMessage = ({ message }: { message: UserMessageType }) => {\n const hasText = message.parts.some(\n (content) => content.type === 'text' && content.text.trim() !== ''\n );\n const attachments = message.parts.filter((content) => content.type === 'file');\n\n return (\n <AnimatedBox\n as={Flex}\n direction=\"column\"\n alignItems=\"flex-end\"\n style={{ alignSelf: 'flex-end' }}\n gap={2}\n maxWidth=\"80%\"\n >\n {hasText ? (\n <Box background=\"neutral150\" borderStyle=\"none\" padding={['10px', '16px']} hasRadius>\n {message.parts.map((content, index) => {\n if (content.type !== 'text') return null;\n return <Typography key={index}>{content.text}</Typography>;\n })}\n </Box>\n ) : null}\n\n {/* Attachments */}\n {attachments.map((attachment, idx) => (\n <AttachmentPreview\n key={`${attachment.type === 'file' ? attachment.filename : attachment.type}-${idx}`}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n attachment={{ ...attachment, status: 'ready' } as any}\n />\n ))}\n </AnimatedBox>\n );\n};\n\nconst AssistantMessage = ({\n message,\n isLoading,\n}: {\n message: AssistantMessageType;\n isLoading?: boolean;\n}) => {\n const { upvoteMessage } = useFeedback();\n const { openFeedbackModal } = useFeedbackModal();\n\n return (\n <Box style={{ alignSelf: 'flex-start' }} maxWidth=\"90%\">\n {message.parts.map((content, index) => (\n <MessageContent key={index} part={content} />\n ))}\n {isLoading ? (\n <Flex gap={1}>\n <IconButton\n label=\"Upvote\"\n size=\"XS\"\n variant=\"ghost\"\n onClick={() => upvoteMessage(message.id)}\n >\n <ThumbUp />\n </IconButton>\n <IconButton\n label=\"Downvote\"\n size=\"XS\"\n variant=\"ghost\"\n // For downvoting, user must provide specific feedback\n onClick={() => openFeedbackModal(message.id)}\n >\n <ThumbDown />\n </IconButton>\n </Flex>\n ) : null}\n </Box>\n );\n};\n\nexport const ChatMessage = ({\n message,\n isLoading,\n}: {\n message: AIMessage;\n isLoading?: boolean;\n}) => {\n /**\n * IMPORTANT: Messages are rendered using react-markdown (heavy compute)\n * Component re-renders on each message update, but AI SDK v5 provides\n * throttling (experimental_throttle: 100ms) which batches updates and reduces\n * re-render frequency during streaming.\n */\n if (message.role === 'user') {\n return <UserMessage message={message as UserMessageType} />;\n }\n return <AssistantMessage message={message as AssistantMessageType} />;\n};\n"],"names":["MarkdownStyles","styled","Typography","theme","colors","neutral100","borderRadius","neutral150","primary500","isSchemaToolPart","part","type","capitalize","s","charAt","toUpperCase","slice","getSchemaLink","schema","isComponent","kind","modelType","uid","undefined","category","toMarkerFromSchemaTool","outSchemas","output","schemas","inSchemas","input","length","numSchemas","state","error","steps","map","index","id","toolCallId","name","description","status","action","link","title","MessageContent","_jsx","Markdown","components","a","node","props","target","rel","text","marker","Marker","UserMessage","message","hasText","parts","some","content","trim","attachments","filter","_jsxs","AnimatedBox","as","Flex","direction","alignItems","style","alignSelf","gap","maxWidth","Box","background","borderStyle","padding","hasRadius","attachment","idx","AttachmentPreview","filename","AssistantMessage","isLoading","upvoteMessage","useFeedback","openFeedbackModal","useFeedbackModal","IconButton","label","size","variant","onClick","ThumbUp","ThumbDown","ChatMessage","role"],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var designSystem = require('@strapi/design-system');
6
+ var styledComponents = require('styled-components');
7
+
8
+ const TextAreaElement = styledComponents.styled(designSystem.Box).attrs({
9
+ as: 'textarea'
10
+ })`
11
+ border: none;
12
+ resize: none;
13
+ background: transparent;
14
+ outline: none !important;
15
+ width: 100%;
16
+ min-height: 44px;
17
+ max-height: 160px;
18
+ line-height: ${({ theme })=>theme.lineHeights[4]};
19
+ font-size: ${({ theme })=>theme.fontSizes[2]};
20
+ color: ${({ theme })=>theme.colors.neutral800};
21
+ padding-bottom: ${({ theme })=>theme.spaces[1]};
22
+ overflow-y: auto;
23
+
24
+ /* Show partial lines when content exceeds visible area */
25
+ height: ${({ rows, theme })=>rows === 5 ? `calc(${rows} * ${theme.lineHeights[4]} * 1em + 0.7em)` : `calc(${rows} * ${theme.lineHeights[4]} * 1em)`};
26
+
27
+ &:disabled,
28
+ &::placeholder {
29
+ color: ${({ theme })=>theme.colors.neutral600};
30
+ }
31
+ `;
32
+ const ResizableTextArea = ({ value, onChange, onSubmit, placeholder })=>{
33
+ const textareaRef = React.useRef(null);
34
+ const [rows, setRows] = React.useState(1);
35
+ const calculateRows = (text)=>{
36
+ if (!text) return 1;
37
+ // Count newlines in the text
38
+ const lineCount = (text.match(/\n/g) || []).length + 1;
39
+ // Limit to a maximum of 5 rows
40
+ return Math.min(lineCount, 5);
41
+ };
42
+ // Update rows when value changes
43
+ React.useEffect(()=>{
44
+ setRows(calculateRows(value));
45
+ }, [
46
+ value
47
+ ]);
48
+ const handleKeyDown = (e)=>{
49
+ if (!textareaRef.current?.value.trim()) {
50
+ return;
51
+ }
52
+ if (e.key === 'Enter' && !e.shiftKey && onSubmit) {
53
+ e.preventDefault();
54
+ onSubmit(e);
55
+ // Ensure focus is maintained after submission using a small delay
56
+ // This helps ensure the focus happens after any other effects from submission
57
+ setTimeout(()=>{
58
+ textareaRef.current?.focus();
59
+ }, 10);
60
+ }
61
+ };
62
+ React.useEffect(()=>{
63
+ textareaRef.current?.focus();
64
+ }, [
65
+ textareaRef
66
+ ]);
67
+ return /*#__PURE__*/ jsxRuntime.jsx(TextAreaElement, {
68
+ ref: textareaRef,
69
+ value: value,
70
+ onChange: onChange,
71
+ onKeyDown: handleKeyDown,
72
+ placeholder: placeholder,
73
+ rows: rows
74
+ });
75
+ };
76
+
77
+ exports.ResizableTextArea = ResizableTextArea;
78
+ //# sourceMappingURL=ResizableTextArea.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ResizableTextArea.js","sources":["../../../../../admin/src/components/AIChat/components/ResizableTextArea.tsx"],"sourcesContent":["import { useRef, useEffect, useState } from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\ninterface TextAreaProps {\n value: string;\n onChange: (e: React.ChangeEvent<HTMLTextAreaElement>) => void;\n onSubmit?: (e: React.FormEvent<HTMLFormElement>) => void;\n placeholder?: string;\n}\n\nconst TextAreaElement = styled(Box).attrs({ as: 'textarea' })`\n border: none;\n resize: none;\n background: transparent;\n outline: none !important;\n width: 100%;\n min-height: 44px;\n max-height: 160px;\n line-height: ${({ theme }) => theme.lineHeights[4]};\n font-size: ${({ theme }) => theme.fontSizes[2]};\n color: ${({ theme }) => theme.colors.neutral800};\n padding-bottom: ${({ theme }) => theme.spaces[1]};\n overflow-y: auto;\n\n /* Show partial lines when content exceeds visible area */\n height: ${({ rows, theme }) =>\n rows === 5\n ? `calc(${rows} * ${theme.lineHeights[4]} * 1em + 0.7em)`\n : `calc(${rows} * ${theme.lineHeights[4]} * 1em)`};\n\n &:disabled,\n &::placeholder {\n color: ${({ theme }) => theme.colors.neutral600};\n }\n`;\n\nexport const ResizableTextArea = ({ value, onChange, onSubmit, placeholder }: TextAreaProps) => {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const [rows, setRows] = useState(1);\n\n const calculateRows = (text: string) => {\n if (!text) return 1;\n // Count newlines in the text\n const lineCount = (text.match(/\\n/g) || []).length + 1;\n // Limit to a maximum of 5 rows\n return Math.min(lineCount, 5);\n };\n\n // Update rows when value changes\n useEffect(() => {\n setRows(calculateRows(value));\n }, [value]);\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (!textareaRef.current?.value.trim()) {\n return;\n }\n\n if (e.key === 'Enter' && !e.shiftKey && onSubmit) {\n e.preventDefault();\n onSubmit(e as unknown as React.FormEvent<HTMLFormElement>);\n // Ensure focus is maintained after submission using a small delay\n // This helps ensure the focus happens after any other effects from submission\n setTimeout(() => {\n textareaRef.current?.focus();\n }, 10);\n }\n };\n\n useEffect(() => {\n textareaRef.current?.focus();\n }, [textareaRef]);\n\n return (\n <TextAreaElement\n ref={textareaRef}\n value={value}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n rows={rows}\n />\n );\n};\n"],"names":["TextAreaElement","styled","Box","attrs","as","theme","lineHeights","fontSizes","colors","neutral800","spaces","rows","neutral600","ResizableTextArea","value","onChange","onSubmit","placeholder","textareaRef","useRef","setRows","useState","calculateRows","text","lineCount","match","length","Math","min","useEffect","handleKeyDown","e","current","trim","key","shiftKey","preventDefault","setTimeout","focus","_jsx","ref","onKeyDown"],"mappings":";;;;;;;AAYA,MAAMA,eAAkBC,GAAAA,uBAAAA,CAAOC,gBAAKC,CAAAA,CAAAA,KAAK,CAAC;IAAEC,EAAI,EAAA;AAAW,CAAA,CAAE;;;;;;;;eAQ9C,EAAE,CAAC,EAAEC,KAAK,EAAE,GAAKA,KAAMC,CAAAA,WAAW,CAAC,CAAA,CAAE,CAAC;aACxC,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAME,CAAAA,SAAS,CAAC,CAAA,CAAE,CAAC;SACxC,EAAE,CAAC,EAAEF,KAAK,EAAE,GAAKA,KAAMG,CAAAA,MAAM,CAACC,UAAU,CAAC;kBAChC,EAAE,CAAC,EAAEJ,KAAK,EAAE,GAAKA,KAAMK,CAAAA,MAAM,CAAC,CAAA,CAAE,CAAC;;;;AAIzC,UAAA,EAAE,CAAC,EAAEC,IAAI,EAAEN,KAAK,EAAE,GACxBM,IAAAA,KAAS,CACL,GAAA,CAAC,KAAK,EAAEA,IAAAA,CAAK,GAAG,EAAEN,MAAMC,WAAW,CAAC,CAAE,CAAA,CAAC,eAAe,CAAC,GACvD,CAAC,KAAK,EAAEK,IAAK,CAAA,GAAG,EAAEN,KAAAA,CAAMC,WAAW,CAAC,CAAA,CAAE,CAAC,OAAO,CAAC,CAAC;;;;WAI7C,EAAE,CAAC,EAAED,KAAK,EAAE,GAAKA,KAAMG,CAAAA,MAAM,CAACI,UAAU,CAAC;;AAEpD,CAAC;AAEM,MAAMC,iBAAoB,GAAA,CAAC,EAAEC,KAAK,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,WAAW,EAAiB,GAAA;AACzF,IAAA,MAAMC,cAAcC,YAA4B,CAAA,IAAA,CAAA;AAChD,IAAA,MAAM,CAACR,IAAAA,EAAMS,OAAQ,CAAA,GAAGC,cAAS,CAAA,CAAA,CAAA;AAEjC,IAAA,MAAMC,gBAAgB,CAACC,IAAAA,GAAAA;QACrB,IAAI,CAACA,MAAM,OAAO,CAAA;;QAElB,MAAMC,SAAAA,GAAY,CAACD,IAAKE,CAAAA,KAAK,CAAC,KAAA,CAAA,IAAU,EAAC,EAAGC,MAAM,GAAG,CAAA;;QAErD,OAAOC,IAAAA,CAAKC,GAAG,CAACJ,SAAW,EAAA,CAAA,CAAA;AAC7B,KAAA;;IAGAK,eAAU,CAAA,IAAA;AACRT,QAAAA,OAAAA,CAAQE,aAAcR,CAAAA,KAAAA,CAAAA,CAAAA;KACrB,EAAA;AAACA,QAAAA;AAAM,KAAA,CAAA;AAEV,IAAA,MAAMgB,gBAAgB,CAACC,CAAAA,GAAAA;AACrB,QAAA,IAAI,CAACb,WAAAA,CAAYc,OAAO,EAAElB,MAAMmB,IAAQ,EAAA,EAAA;AACtC,YAAA;AACF;QAEA,IAAIF,CAAAA,CAAEG,GAAG,KAAK,OAAA,IAAW,CAACH,CAAEI,CAAAA,QAAQ,IAAInB,QAAU,EAAA;AAChDe,YAAAA,CAAAA,CAAEK,cAAc,EAAA;YAChBpB,QAASe,CAAAA,CAAAA,CAAAA;;;YAGTM,UAAW,CAAA,IAAA;AACTnB,gBAAAA,WAAAA,CAAYc,OAAO,EAAEM,KAAAA,EAAAA;aACpB,EAAA,EAAA,CAAA;AACL;AACF,KAAA;IAEAT,eAAU,CAAA,IAAA;AACRX,QAAAA,WAAAA,CAAYc,OAAO,EAAEM,KAAAA,EAAAA;KACpB,EAAA;AAACpB,QAAAA;AAAY,KAAA,CAAA;AAEhB,IAAA,qBACEqB,cAACvC,CAAAA,eAAAA,EAAAA;QACCwC,GAAKtB,EAAAA,WAAAA;QACLJ,KAAOA,EAAAA,KAAAA;QACPC,QAAUA,EAAAA,QAAAA;QACV0B,SAAWX,EAAAA,aAAAA;QACXb,WAAaA,EAAAA,WAAAA;QACbN,IAAMA,EAAAA;;AAGZ;;;;"}
@@ -0,0 +1,76 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { useRef, useState, useEffect } from 'react';
3
+ import { Box } from '@strapi/design-system';
4
+ import { styled } from 'styled-components';
5
+
6
+ const TextAreaElement = styled(Box).attrs({
7
+ as: 'textarea'
8
+ })`
9
+ border: none;
10
+ resize: none;
11
+ background: transparent;
12
+ outline: none !important;
13
+ width: 100%;
14
+ min-height: 44px;
15
+ max-height: 160px;
16
+ line-height: ${({ theme })=>theme.lineHeights[4]};
17
+ font-size: ${({ theme })=>theme.fontSizes[2]};
18
+ color: ${({ theme })=>theme.colors.neutral800};
19
+ padding-bottom: ${({ theme })=>theme.spaces[1]};
20
+ overflow-y: auto;
21
+
22
+ /* Show partial lines when content exceeds visible area */
23
+ height: ${({ rows, theme })=>rows === 5 ? `calc(${rows} * ${theme.lineHeights[4]} * 1em + 0.7em)` : `calc(${rows} * ${theme.lineHeights[4]} * 1em)`};
24
+
25
+ &:disabled,
26
+ &::placeholder {
27
+ color: ${({ theme })=>theme.colors.neutral600};
28
+ }
29
+ `;
30
+ const ResizableTextArea = ({ value, onChange, onSubmit, placeholder })=>{
31
+ const textareaRef = useRef(null);
32
+ const [rows, setRows] = useState(1);
33
+ const calculateRows = (text)=>{
34
+ if (!text) return 1;
35
+ // Count newlines in the text
36
+ const lineCount = (text.match(/\n/g) || []).length + 1;
37
+ // Limit to a maximum of 5 rows
38
+ return Math.min(lineCount, 5);
39
+ };
40
+ // Update rows when value changes
41
+ useEffect(()=>{
42
+ setRows(calculateRows(value));
43
+ }, [
44
+ value
45
+ ]);
46
+ const handleKeyDown = (e)=>{
47
+ if (!textareaRef.current?.value.trim()) {
48
+ return;
49
+ }
50
+ if (e.key === 'Enter' && !e.shiftKey && onSubmit) {
51
+ e.preventDefault();
52
+ onSubmit(e);
53
+ // Ensure focus is maintained after submission using a small delay
54
+ // This helps ensure the focus happens after any other effects from submission
55
+ setTimeout(()=>{
56
+ textareaRef.current?.focus();
57
+ }, 10);
58
+ }
59
+ };
60
+ useEffect(()=>{
61
+ textareaRef.current?.focus();
62
+ }, [
63
+ textareaRef
64
+ ]);
65
+ return /*#__PURE__*/ jsx(TextAreaElement, {
66
+ ref: textareaRef,
67
+ value: value,
68
+ onChange: onChange,
69
+ onKeyDown: handleKeyDown,
70
+ placeholder: placeholder,
71
+ rows: rows
72
+ });
73
+ };
74
+
75
+ export { ResizableTextArea };
76
+ //# sourceMappingURL=ResizableTextArea.mjs.map