@strapi/content-type-builder 5.24.2 → 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 +14 -7
  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 @@
1
+ {"version":3,"file":"useAttachments.js","sources":["../../../../../admin/src/components/AIChat/hooks/useAttachments.ts"],"sourcesContent":["import { useCallback } from 'react';\n\nimport { useNotification } from '@strapi/admin/strapi-admin';\n\nimport { STRAPI_MAX_ATTACHMENT_SIZE, STRAPI_MAX_ATTACHMENTS } from '../lib/constants';\nimport { generateId } from '../lib/misc';\nimport { useStrapiChat } from '../providers/ChatProvider';\n\nimport { useFetchUploadMedia } from './useAIFetch';\n\nimport type { Attachment } from '../lib/types/attachments';\n\nexport function useAttachments() {\n const { setAttachments, attachments, id: chatId } = useStrapiChat();\n const { toggleNotification } = useNotification();\n\n const { fetch: fetchUploadMedia } = useFetchUploadMedia();\n\n /**\n * Add an attachment directly\n */\n const addAttachments = useCallback(\n (newAttachments: Attachment[]) => {\n // TODO: Limits\n if (!newAttachments) return;\n setAttachments((prev: Attachment[]) => [...prev, ...newAttachments]);\n },\n [setAttachments]\n );\n\n /**\n * Update an attachment\n */\n const updateAttachment = useCallback(\n (attachment: { id: string } & Partial<Attachment>) => {\n setAttachments((prev: Attachment[]) =>\n prev.map((a) => (a.id === attachment.id ? { ...a, ...attachment } : a))\n );\n },\n [setAttachments]\n );\n\n /**\n * Remove an attachment\n */\n const removeAttachment = useCallback(\n (attachment: Attachment) => {\n setAttachments((prev: Attachment[]) => prev.filter((a) => a.id !== attachment.id));\n },\n [setAttachments]\n );\n\n /**\n * Attach files to the chat\n */\n const attachFiles = useCallback(\n async (newFiles: File[], description?: string) => {\n // Attachment number limit\n const attachmentCount = attachments?.length || 0;\n const attachedFileCount = Array.from(newFiles).length;\n let limitedFiles: File[] = newFiles;\n\n if (attachmentCount + attachedFileCount > STRAPI_MAX_ATTACHMENTS) {\n toggleNotification({\n type: 'danger',\n title: 'File limit reached: ',\n message: `You can only upload up to ${STRAPI_MAX_ATTACHMENTS} files`,\n });\n\n // Prune the ones that would exceed the limit\n const limit = STRAPI_MAX_ATTACHMENTS - attachmentCount;\n limitedFiles = newFiles.slice(0, limit);\n }\n\n // Size limit\n for (const file of limitedFiles) {\n if (file.size > STRAPI_MAX_ATTACHMENT_SIZE) {\n toggleNotification({\n type: 'danger',\n title: 'File too large: ',\n message: 'One of the files is too large (15MB limit)',\n });\n // Remove from list\n limitedFiles = limitedFiles.filter((f) => f !== file);\n }\n }\n\n // Upload\n for (const file of limitedFiles) {\n const pendingAttachment: Attachment = {\n id: generateId(),\n type: 'file',\n status: 'loading',\n filename: file.name,\n mediaType: file.type,\n url: '',\n };\n\n // Store the attachment as loading\n setAttachments((prev: Attachment[]) => [...prev, pendingAttachment]);\n\n // Prepare form data\n const formData = new FormData();\n formData.append('file', file);\n formData.append('fileInfo', JSON.stringify({ name: file.name, chatId: chatId }));\n\n // Upload file\n fetchUploadMedia({ formData })\n .then((result) => {\n const attachment = result?.data;\n\n // Remove attachment if there is an error\n if (!result || result.error) {\n toggleNotification({\n type: 'danger',\n title: 'Failed to upload file: ',\n message: result?.error || 'Unknown error',\n timeout: 5000,\n });\n removeAttachment(pendingAttachment);\n return;\n }\n\n // Update the pending attachment\n updateAttachment({\n id: pendingAttachment.id,\n url: attachment?.url || '',\n status: 'ready',\n });\n })\n .catch(() => removeAttachment(pendingAttachment));\n }\n\n if (description) {\n toggleNotification({\n title: 'Files attached',\n message: description,\n });\n }\n },\n [\n attachments,\n setAttachments,\n toggleNotification,\n chatId,\n fetchUploadMedia,\n removeAttachment,\n updateAttachment,\n ]\n );\n\n /**\n * Remove an attachment by index\n */\n const removeAttachmentByIndex = useCallback(\n (index: number) => {\n if (!attachments) return;\n setAttachments(attachments.filter((_, i) => i !== index));\n },\n [setAttachments, attachments]\n );\n\n return { attachments, attachFiles, addAttachments, removeAttachment, removeAttachmentByIndex };\n}\n"],"names":["useAttachments","setAttachments","attachments","id","chatId","useStrapiChat","toggleNotification","useNotification","fetch","fetchUploadMedia","useFetchUploadMedia","addAttachments","useCallback","newAttachments","prev","updateAttachment","attachment","map","a","removeAttachment","filter","attachFiles","newFiles","description","attachmentCount","length","attachedFileCount","Array","from","limitedFiles","STRAPI_MAX_ATTACHMENTS","type","title","message","limit","slice","file","size","STRAPI_MAX_ATTACHMENT_SIZE","f","pendingAttachment","generateId","status","filename","name","mediaType","url","formData","FormData","append","JSON","stringify","then","result","data","error","timeout","catch","removeAttachmentByIndex","index","_","i"],"mappings":"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"}
@@ -0,0 +1,150 @@
1
+ import { useCallback } from 'react';
2
+ import { useNotification } from '@strapi/admin/strapi-admin';
3
+ import { STRAPI_MAX_ATTACHMENTS, STRAPI_MAX_ATTACHMENT_SIZE } from '../lib/constants.mjs';
4
+ import { generateId } from '../lib/misc.mjs';
5
+ import { useStrapiChat } from '../providers/ChatProvider.mjs';
6
+ import { useFetchUploadMedia } from './useAIFetch.mjs';
7
+
8
+ function useAttachments() {
9
+ const { setAttachments, attachments, id: chatId } = useStrapiChat();
10
+ const { toggleNotification } = useNotification();
11
+ const { fetch: fetchUploadMedia } = useFetchUploadMedia();
12
+ /**
13
+ * Add an attachment directly
14
+ */ const addAttachments = useCallback((newAttachments)=>{
15
+ // TODO: Limits
16
+ if (!newAttachments) return;
17
+ setAttachments((prev)=>[
18
+ ...prev,
19
+ ...newAttachments
20
+ ]);
21
+ }, [
22
+ setAttachments
23
+ ]);
24
+ /**
25
+ * Update an attachment
26
+ */ const updateAttachment = useCallback((attachment)=>{
27
+ setAttachments((prev)=>prev.map((a)=>a.id === attachment.id ? {
28
+ ...a,
29
+ ...attachment
30
+ } : a));
31
+ }, [
32
+ setAttachments
33
+ ]);
34
+ /**
35
+ * Remove an attachment
36
+ */ const removeAttachment = useCallback((attachment)=>{
37
+ setAttachments((prev)=>prev.filter((a)=>a.id !== attachment.id));
38
+ }, [
39
+ setAttachments
40
+ ]);
41
+ /**
42
+ * Attach files to the chat
43
+ */ const attachFiles = useCallback(async (newFiles, description)=>{
44
+ // Attachment number limit
45
+ const attachmentCount = attachments?.length || 0;
46
+ const attachedFileCount = Array.from(newFiles).length;
47
+ let limitedFiles = newFiles;
48
+ if (attachmentCount + attachedFileCount > STRAPI_MAX_ATTACHMENTS) {
49
+ toggleNotification({
50
+ type: 'danger',
51
+ title: 'File limit reached: ',
52
+ message: `You can only upload up to ${STRAPI_MAX_ATTACHMENTS} files`
53
+ });
54
+ // Prune the ones that would exceed the limit
55
+ const limit = STRAPI_MAX_ATTACHMENTS - attachmentCount;
56
+ limitedFiles = newFiles.slice(0, limit);
57
+ }
58
+ // Size limit
59
+ for (const file of limitedFiles){
60
+ if (file.size > STRAPI_MAX_ATTACHMENT_SIZE) {
61
+ toggleNotification({
62
+ type: 'danger',
63
+ title: 'File too large: ',
64
+ message: 'One of the files is too large (15MB limit)'
65
+ });
66
+ // Remove from list
67
+ limitedFiles = limitedFiles.filter((f)=>f !== file);
68
+ }
69
+ }
70
+ // Upload
71
+ for (const file of limitedFiles){
72
+ const pendingAttachment = {
73
+ id: generateId(),
74
+ type: 'file',
75
+ status: 'loading',
76
+ filename: file.name,
77
+ mediaType: file.type,
78
+ url: ''
79
+ };
80
+ // Store the attachment as loading
81
+ setAttachments((prev)=>[
82
+ ...prev,
83
+ pendingAttachment
84
+ ]);
85
+ // Prepare form data
86
+ const formData = new FormData();
87
+ formData.append('file', file);
88
+ formData.append('fileInfo', JSON.stringify({
89
+ name: file.name,
90
+ chatId: chatId
91
+ }));
92
+ // Upload file
93
+ fetchUploadMedia({
94
+ formData
95
+ }).then((result)=>{
96
+ const attachment = result?.data;
97
+ // Remove attachment if there is an error
98
+ if (!result || result.error) {
99
+ toggleNotification({
100
+ type: 'danger',
101
+ title: 'Failed to upload file: ',
102
+ message: result?.error || 'Unknown error',
103
+ timeout: 5000
104
+ });
105
+ removeAttachment(pendingAttachment);
106
+ return;
107
+ }
108
+ // Update the pending attachment
109
+ updateAttachment({
110
+ id: pendingAttachment.id,
111
+ url: attachment?.url || '',
112
+ status: 'ready'
113
+ });
114
+ }).catch(()=>removeAttachment(pendingAttachment));
115
+ }
116
+ if (description) {
117
+ toggleNotification({
118
+ title: 'Files attached',
119
+ message: description
120
+ });
121
+ }
122
+ }, [
123
+ attachments,
124
+ setAttachments,
125
+ toggleNotification,
126
+ chatId,
127
+ fetchUploadMedia,
128
+ removeAttachment,
129
+ updateAttachment
130
+ ]);
131
+ /**
132
+ * Remove an attachment by index
133
+ */ const removeAttachmentByIndex = useCallback((index)=>{
134
+ if (!attachments) return;
135
+ setAttachments(attachments.filter((_, i)=>i !== index));
136
+ }, [
137
+ setAttachments,
138
+ attachments
139
+ ]);
140
+ return {
141
+ attachments,
142
+ attachFiles,
143
+ addAttachments,
144
+ removeAttachment,
145
+ removeAttachmentByIndex
146
+ };
147
+ }
148
+
149
+ export { useAttachments };
150
+ //# sourceMappingURL=useAttachments.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAttachments.mjs","sources":["../../../../../admin/src/components/AIChat/hooks/useAttachments.ts"],"sourcesContent":["import { useCallback } from 'react';\n\nimport { useNotification } from '@strapi/admin/strapi-admin';\n\nimport { STRAPI_MAX_ATTACHMENT_SIZE, STRAPI_MAX_ATTACHMENTS } from '../lib/constants';\nimport { generateId } from '../lib/misc';\nimport { useStrapiChat } from '../providers/ChatProvider';\n\nimport { useFetchUploadMedia } from './useAIFetch';\n\nimport type { Attachment } from '../lib/types/attachments';\n\nexport function useAttachments() {\n const { setAttachments, attachments, id: chatId } = useStrapiChat();\n const { toggleNotification } = useNotification();\n\n const { fetch: fetchUploadMedia } = useFetchUploadMedia();\n\n /**\n * Add an attachment directly\n */\n const addAttachments = useCallback(\n (newAttachments: Attachment[]) => {\n // TODO: Limits\n if (!newAttachments) return;\n setAttachments((prev: Attachment[]) => [...prev, ...newAttachments]);\n },\n [setAttachments]\n );\n\n /**\n * Update an attachment\n */\n const updateAttachment = useCallback(\n (attachment: { id: string } & Partial<Attachment>) => {\n setAttachments((prev: Attachment[]) =>\n prev.map((a) => (a.id === attachment.id ? { ...a, ...attachment } : a))\n );\n },\n [setAttachments]\n );\n\n /**\n * Remove an attachment\n */\n const removeAttachment = useCallback(\n (attachment: Attachment) => {\n setAttachments((prev: Attachment[]) => prev.filter((a) => a.id !== attachment.id));\n },\n [setAttachments]\n );\n\n /**\n * Attach files to the chat\n */\n const attachFiles = useCallback(\n async (newFiles: File[], description?: string) => {\n // Attachment number limit\n const attachmentCount = attachments?.length || 0;\n const attachedFileCount = Array.from(newFiles).length;\n let limitedFiles: File[] = newFiles;\n\n if (attachmentCount + attachedFileCount > STRAPI_MAX_ATTACHMENTS) {\n toggleNotification({\n type: 'danger',\n title: 'File limit reached: ',\n message: `You can only upload up to ${STRAPI_MAX_ATTACHMENTS} files`,\n });\n\n // Prune the ones that would exceed the limit\n const limit = STRAPI_MAX_ATTACHMENTS - attachmentCount;\n limitedFiles = newFiles.slice(0, limit);\n }\n\n // Size limit\n for (const file of limitedFiles) {\n if (file.size > STRAPI_MAX_ATTACHMENT_SIZE) {\n toggleNotification({\n type: 'danger',\n title: 'File too large: ',\n message: 'One of the files is too large (15MB limit)',\n });\n // Remove from list\n limitedFiles = limitedFiles.filter((f) => f !== file);\n }\n }\n\n // Upload\n for (const file of limitedFiles) {\n const pendingAttachment: Attachment = {\n id: generateId(),\n type: 'file',\n status: 'loading',\n filename: file.name,\n mediaType: file.type,\n url: '',\n };\n\n // Store the attachment as loading\n setAttachments((prev: Attachment[]) => [...prev, pendingAttachment]);\n\n // Prepare form data\n const formData = new FormData();\n formData.append('file', file);\n formData.append('fileInfo', JSON.stringify({ name: file.name, chatId: chatId }));\n\n // Upload file\n fetchUploadMedia({ formData })\n .then((result) => {\n const attachment = result?.data;\n\n // Remove attachment if there is an error\n if (!result || result.error) {\n toggleNotification({\n type: 'danger',\n title: 'Failed to upload file: ',\n message: result?.error || 'Unknown error',\n timeout: 5000,\n });\n removeAttachment(pendingAttachment);\n return;\n }\n\n // Update the pending attachment\n updateAttachment({\n id: pendingAttachment.id,\n url: attachment?.url || '',\n status: 'ready',\n });\n })\n .catch(() => removeAttachment(pendingAttachment));\n }\n\n if (description) {\n toggleNotification({\n title: 'Files attached',\n message: description,\n });\n }\n },\n [\n attachments,\n setAttachments,\n toggleNotification,\n chatId,\n fetchUploadMedia,\n removeAttachment,\n updateAttachment,\n ]\n );\n\n /**\n * Remove an attachment by index\n */\n const removeAttachmentByIndex = useCallback(\n (index: number) => {\n if (!attachments) return;\n setAttachments(attachments.filter((_, i) => i !== index));\n },\n [setAttachments, attachments]\n );\n\n return { attachments, attachFiles, addAttachments, removeAttachment, removeAttachmentByIndex };\n}\n"],"names":["useAttachments","setAttachments","attachments","id","chatId","useStrapiChat","toggleNotification","useNotification","fetch","fetchUploadMedia","useFetchUploadMedia","addAttachments","useCallback","newAttachments","prev","updateAttachment","attachment","map","a","removeAttachment","filter","attachFiles","newFiles","description","attachmentCount","length","attachedFileCount","Array","from","limitedFiles","STRAPI_MAX_ATTACHMENTS","type","title","message","limit","slice","file","size","STRAPI_MAX_ATTACHMENT_SIZE","f","pendingAttachment","generateId","status","filename","name","mediaType","url","formData","FormData","append","JSON","stringify","then","result","data","error","timeout","catch","removeAttachmentByIndex","index","_","i"],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var useAIFetch = require('./useAIFetch.js');
5
+
6
+ const useChatTitle = ({ chatId, messages })=>{
7
+ const [title, setTitle] = React.useState(undefined);
8
+ // Use the endpoint-specific hook
9
+ const { fetch: fetchGenerateTitle, error, isPending: isGenerating } = useAIFetch.useFetchGenerateTitle();
10
+ const generateTitle = React.useCallback(async ()=>{
11
+ const firstMessage = messages.at(0);
12
+ // Only generate title if there are messages and no title yet
13
+ if (!firstMessage || title || isGenerating || error) {
14
+ return;
15
+ }
16
+ const firstMessageContent = firstMessage.parts.map((content)=>content.type === 'text' ? content.text : '').join('\n');
17
+ const result = await fetchGenerateTitle({
18
+ body: {
19
+ chatId,
20
+ message: firstMessageContent
21
+ }
22
+ });
23
+ if (result?.data) {
24
+ setTitle(result.data.title);
25
+ }
26
+ }, [
27
+ messages,
28
+ title,
29
+ isGenerating,
30
+ error,
31
+ fetchGenerateTitle,
32
+ chatId
33
+ ]);
34
+ const resetTitle = React.useCallback(()=>{
35
+ setTitle(undefined);
36
+ }, []);
37
+ return {
38
+ title,
39
+ isGenerating,
40
+ error,
41
+ generateTitle,
42
+ resetTitle
43
+ };
44
+ };
45
+
46
+ exports.useChatTitle = useChatTitle;
47
+ //# sourceMappingURL=useChatTitle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChatTitle.js","sources":["../../../../../admin/src/components/AIChat/hooks/useChatTitle.ts"],"sourcesContent":["/**\n * Hook that requests a new title based on the first message\n */\nimport { useState, useCallback } from 'react';\n\nimport { useFetchGenerateTitle } from './useAIFetch';\n\nimport type { UIMessage } from '@ai-sdk/react';\n\ninterface UseChatTitleProps {\n chatId: string;\n messages: UIMessage[];\n}\n\nexport const useChatTitle = ({ chatId, messages }: UseChatTitleProps) => {\n const [title, setTitle] = useState<string | undefined>(undefined);\n\n // Use the endpoint-specific hook\n const { fetch: fetchGenerateTitle, error, isPending: isGenerating } = useFetchGenerateTitle();\n\n const generateTitle = useCallback(async () => {\n const firstMessage = messages.at(0);\n\n // Only generate title if there are messages and no title yet\n if (!firstMessage || title || isGenerating || error) {\n return;\n }\n\n const firstMessageContent = firstMessage.parts\n .map((content) => (content.type === 'text' ? content.text : ''))\n .join('\\n');\n\n const result = await fetchGenerateTitle({\n body: { chatId, message: firstMessageContent },\n });\n\n if (result?.data) {\n setTitle(result.data.title);\n }\n }, [messages, title, isGenerating, error, fetchGenerateTitle, chatId]);\n\n const resetTitle = useCallback(() => {\n setTitle(undefined);\n }, []);\n\n return {\n title,\n isGenerating,\n error,\n generateTitle,\n resetTitle,\n };\n};\n"],"names":["useChatTitle","chatId","messages","title","setTitle","useState","undefined","fetch","fetchGenerateTitle","error","isPending","isGenerating","useFetchGenerateTitle","generateTitle","useCallback","firstMessage","at","firstMessageContent","parts","map","content","type","text","join","result","body","message","data","resetTitle"],"mappings":";;;;;MAcaA,YAAe,GAAA,CAAC,EAAEC,MAAM,EAAEC,QAAQ,EAAqB,GAAA;AAClE,IAAA,MAAM,CAACC,KAAAA,EAAOC,QAAS,CAAA,GAAGC,cAA6BC,CAAAA,SAAAA,CAAAA;;IAGvD,MAAM,EAAEC,OAAOC,kBAAkB,EAAEC,KAAK,EAAEC,SAAAA,EAAWC,YAAY,EAAE,GAAGC,gCAAAA,EAAAA;AAEtE,IAAA,MAAMC,gBAAgBC,iBAAY,CAAA,UAAA;QAChC,MAAMC,YAAAA,GAAeb,QAASc,CAAAA,EAAE,CAAC,CAAA,CAAA;;AAGjC,QAAA,IAAI,CAACD,YAAAA,IAAgBZ,KAASQ,IAAAA,YAAAA,IAAgBF,KAAO,EAAA;AACnD,YAAA;AACF;AAEA,QAAA,MAAMQ,sBAAsBF,YAAaG,CAAAA,KAAK,CAC3CC,GAAG,CAAC,CAACC,OAAAA,GAAaA,OAAQC,CAAAA,IAAI,KAAK,MAASD,GAAAA,OAAAA,CAAQE,IAAI,GAAG,EAAA,CAAA,CAC3DC,IAAI,CAAC,IAAA,CAAA;QAER,MAAMC,MAAAA,GAAS,MAAMhB,kBAAmB,CAAA;YACtCiB,IAAM,EAAA;AAAExB,gBAAAA,MAAAA;gBAAQyB,OAAST,EAAAA;AAAoB;AAC/C,SAAA,CAAA;AAEA,QAAA,IAAIO,QAAQG,IAAM,EAAA;YAChBvB,QAASoB,CAAAA,MAAAA,CAAOG,IAAI,CAACxB,KAAK,CAAA;AAC5B;KACC,EAAA;AAACD,QAAAA,QAAAA;AAAUC,QAAAA,KAAAA;AAAOQ,QAAAA,YAAAA;AAAcF,QAAAA,KAAAA;AAAOD,QAAAA,kBAAAA;AAAoBP,QAAAA;AAAO,KAAA,CAAA;AAErE,IAAA,MAAM2B,aAAad,iBAAY,CAAA,IAAA;QAC7BV,QAASE,CAAAA,SAAAA,CAAAA;AACX,KAAA,EAAG,EAAE,CAAA;IAEL,OAAO;AACLH,QAAAA,KAAAA;AACAQ,QAAAA,YAAAA;AACAF,QAAAA,KAAAA;AACAI,QAAAA,aAAAA;AACAe,QAAAA;AACF,KAAA;AACF;;;;"}
@@ -0,0 +1,45 @@
1
+ import { useState, useCallback } from 'react';
2
+ import { useFetchGenerateTitle } from './useAIFetch.mjs';
3
+
4
+ const useChatTitle = ({ chatId, messages })=>{
5
+ const [title, setTitle] = useState(undefined);
6
+ // Use the endpoint-specific hook
7
+ const { fetch: fetchGenerateTitle, error, isPending: isGenerating } = useFetchGenerateTitle();
8
+ const generateTitle = useCallback(async ()=>{
9
+ const firstMessage = messages.at(0);
10
+ // Only generate title if there are messages and no title yet
11
+ if (!firstMessage || title || isGenerating || error) {
12
+ return;
13
+ }
14
+ const firstMessageContent = firstMessage.parts.map((content)=>content.type === 'text' ? content.text : '').join('\n');
15
+ const result = await fetchGenerateTitle({
16
+ body: {
17
+ chatId,
18
+ message: firstMessageContent
19
+ }
20
+ });
21
+ if (result?.data) {
22
+ setTitle(result.data.title);
23
+ }
24
+ }, [
25
+ messages,
26
+ title,
27
+ isGenerating,
28
+ error,
29
+ fetchGenerateTitle,
30
+ chatId
31
+ ]);
32
+ const resetTitle = useCallback(()=>{
33
+ setTitle(undefined);
34
+ }, []);
35
+ return {
36
+ title,
37
+ isGenerating,
38
+ error,
39
+ generateTitle,
40
+ resetTitle
41
+ };
42
+ };
43
+
44
+ export { useChatTitle };
45
+ //# sourceMappingURL=useChatTitle.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useChatTitle.mjs","sources":["../../../../../admin/src/components/AIChat/hooks/useChatTitle.ts"],"sourcesContent":["/**\n * Hook that requests a new title based on the first message\n */\nimport { useState, useCallback } from 'react';\n\nimport { useFetchGenerateTitle } from './useAIFetch';\n\nimport type { UIMessage } from '@ai-sdk/react';\n\ninterface UseChatTitleProps {\n chatId: string;\n messages: UIMessage[];\n}\n\nexport const useChatTitle = ({ chatId, messages }: UseChatTitleProps) => {\n const [title, setTitle] = useState<string | undefined>(undefined);\n\n // Use the endpoint-specific hook\n const { fetch: fetchGenerateTitle, error, isPending: isGenerating } = useFetchGenerateTitle();\n\n const generateTitle = useCallback(async () => {\n const firstMessage = messages.at(0);\n\n // Only generate title if there are messages and no title yet\n if (!firstMessage || title || isGenerating || error) {\n return;\n }\n\n const firstMessageContent = firstMessage.parts\n .map((content) => (content.type === 'text' ? content.text : ''))\n .join('\\n');\n\n const result = await fetchGenerateTitle({\n body: { chatId, message: firstMessageContent },\n });\n\n if (result?.data) {\n setTitle(result.data.title);\n }\n }, [messages, title, isGenerating, error, fetchGenerateTitle, chatId]);\n\n const resetTitle = useCallback(() => {\n setTitle(undefined);\n }, []);\n\n return {\n title,\n isGenerating,\n error,\n generateTitle,\n resetTitle,\n };\n};\n"],"names":["useChatTitle","chatId","messages","title","setTitle","useState","undefined","fetch","fetchGenerateTitle","error","isPending","isGenerating","useFetchGenerateTitle","generateTitle","useCallback","firstMessage","at","firstMessageContent","parts","map","content","type","text","join","result","body","message","data","resetTitle"],"mappings":";;;MAcaA,YAAe,GAAA,CAAC,EAAEC,MAAM,EAAEC,QAAQ,EAAqB,GAAA;AAClE,IAAA,MAAM,CAACC,KAAAA,EAAOC,QAAS,CAAA,GAAGC,QAA6BC,CAAAA,SAAAA,CAAAA;;IAGvD,MAAM,EAAEC,OAAOC,kBAAkB,EAAEC,KAAK,EAAEC,SAAAA,EAAWC,YAAY,EAAE,GAAGC,qBAAAA,EAAAA;AAEtE,IAAA,MAAMC,gBAAgBC,WAAY,CAAA,UAAA;QAChC,MAAMC,YAAAA,GAAeb,QAASc,CAAAA,EAAE,CAAC,CAAA,CAAA;;AAGjC,QAAA,IAAI,CAACD,YAAAA,IAAgBZ,KAASQ,IAAAA,YAAAA,IAAgBF,KAAO,EAAA;AACnD,YAAA;AACF;AAEA,QAAA,MAAMQ,sBAAsBF,YAAaG,CAAAA,KAAK,CAC3CC,GAAG,CAAC,CAACC,OAAAA,GAAaA,OAAQC,CAAAA,IAAI,KAAK,MAASD,GAAAA,OAAAA,CAAQE,IAAI,GAAG,EAAA,CAAA,CAC3DC,IAAI,CAAC,IAAA,CAAA;QAER,MAAMC,MAAAA,GAAS,MAAMhB,kBAAmB,CAAA;YACtCiB,IAAM,EAAA;AAAExB,gBAAAA,MAAAA;gBAAQyB,OAAST,EAAAA;AAAoB;AAC/C,SAAA,CAAA;AAEA,QAAA,IAAIO,QAAQG,IAAM,EAAA;YAChBvB,QAASoB,CAAAA,MAAAA,CAAOG,IAAI,CAACxB,KAAK,CAAA;AAC5B;KACC,EAAA;AAACD,QAAAA,QAAAA;AAAUC,QAAAA,KAAAA;AAAOQ,QAAAA,YAAAA;AAAcF,QAAAA,KAAAA;AAAOD,QAAAA,kBAAAA;AAAoBP,QAAAA;AAAO,KAAA,CAAA;AAErE,IAAA,MAAM2B,aAAad,WAAY,CAAA,IAAA;QAC7BV,QAASE,CAAAA,SAAAA,CAAAA;AACX,KAAA,EAAG,EAAE,CAAA;IAEL,OAAO;AACLH,QAAAA,KAAAA;AACAQ,QAAAA,YAAAA;AACAF,QAAAA,KAAAA;AACAI,QAAAA,aAAAA;AACAe,QAAAA;AACF,KAAA;AACF;;;;"}
@@ -0,0 +1,212 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var JSZip = require('jszip');
5
+ var micromatch = require('micromatch');
6
+ var misc = require('../lib/misc.js');
7
+ var ChatProvider = require('../providers/ChatProvider.js');
8
+ var useAIFetch = require('./useAIFetch.js');
9
+
10
+ const ALLOWED_EXTENSIONS = [
11
+ '.ts',
12
+ '.tsx',
13
+ '.js',
14
+ '.jsx',
15
+ '.md',
16
+ '.json'
17
+ ];
18
+ const MAX_LINES_PER_FILE = 5000; // Maximum number of lines per file
19
+ // Common patterns to ignore
20
+ const DEFAULT_IGNORE_PATTERNS = [
21
+ '**/node_modules/**',
22
+ '**/.git/**',
23
+ '**/.next/**',
24
+ '**/dist/**',
25
+ '**/build/**',
26
+ '**/.cache/**',
27
+ '**/coverage/**',
28
+ '**/test/**',
29
+ '**/__tests__/**',
30
+ '**/*.test.*',
31
+ '**/*.spec.*'
32
+ ];
33
+ const isAllowedFile = (filename, ignorePatterns = [])=>{
34
+ // Check if file matches any ignore pattern
35
+ if (micromatch.isMatch(filename, [
36
+ ...DEFAULT_IGNORE_PATTERNS,
37
+ ...ignorePatterns
38
+ ])) {
39
+ return false;
40
+ }
41
+ // Check if file has allowed extension
42
+ return ALLOWED_EXTENSIONS.some((ext)=>filename.toLowerCase().endsWith(ext));
43
+ };
44
+ /**
45
+ * Prunes file content if it exceeds MAX_LINES
46
+ */ const pruneFileContent = (content)=>{
47
+ const lines = content.split('\n');
48
+ if (lines.length <= MAX_LINES_PER_FILE) {
49
+ return content;
50
+ }
51
+ const truncated = lines.slice(0, MAX_LINES_PER_FILE).join('\n');
52
+ return `${truncated}\n\n// ... [${lines.length - MAX_LINES_PER_FILE} lines truncated, file too long] ...\n\n`;
53
+ };
54
+ /* -------------------------------------------------------------------------------------------------
55
+ * Zip file processing
56
+ * -----------------------------------------------------------------------------------------------*/ async function openZipFile(file, options = {}) {
57
+ const zip = new JSZip();
58
+ const contents = await zip.loadAsync(file);
59
+ const processedFiles = [];
60
+ // Process all files in parallel
61
+ await Promise.all(Object.keys(contents.files).map(async (filename)=>{
62
+ const zipEntry = contents.files[filename];
63
+ // Skip directories and non-allowed files
64
+ if (zipEntry.dir || !isAllowedFile(filename, options.ignorePatterns)) {
65
+ return;
66
+ }
67
+ try {
68
+ const content = await zipEntry.async('string');
69
+ processedFiles.push({
70
+ path: filename,
71
+ content: pruneFileContent(content)
72
+ });
73
+ } catch (err) {
74
+ console.warn(`Failed to read file ${filename}:`, err);
75
+ }
76
+ }));
77
+ // Sort files by path for consistency
78
+ return processedFiles.sort((a, b)=>a.path.localeCompare(b.path));
79
+ }
80
+ /* -------------------------------------------------------------------------------------------------
81
+ * Folder processing
82
+ * -----------------------------------------------------------------------------------------------*/ async function processFolder(files, options = {}) {
83
+ const processedFiles = [];
84
+ let folderName = 'Project';
85
+ // Extract folder name from the first file's path
86
+ if (files.length > 0) {
87
+ const firstFile = files[0];
88
+ const folderPath = firstFile.webkitRelativePath || '';
89
+ const pathParts = folderPath.split('/');
90
+ if (pathParts.length > 0 && pathParts[0]) {
91
+ folderName = pathParts[0];
92
+ }
93
+ }
94
+ // Process all files in parallel
95
+ await Promise.all(Array.from(files).map(async (file)=>{
96
+ const filePath = file.webkitRelativePath || file.name;
97
+ // Skip non-allowed files
98
+ if (!isAllowedFile(filePath, options.ignorePatterns)) {
99
+ return;
100
+ }
101
+ try {
102
+ const content = await file.text();
103
+ processedFiles.push({
104
+ // Remove the root folder name from the path
105
+ path: filePath.includes('/') ? filePath.substring(filePath.indexOf('/') + 1) : filePath,
106
+ content: pruneFileContent(content)
107
+ });
108
+ } catch (err) {
109
+ console.warn(`Failed to read file ${filePath}:`, err);
110
+ }
111
+ }));
112
+ // Sort files by path for consistency
113
+ return {
114
+ files: processedFiles.sort((a, b)=>a.path.localeCompare(b.path)),
115
+ projectName: folderName
116
+ };
117
+ }
118
+ /* -------------------------------------------------------------------------------------------------
119
+ * Zip file processing
120
+ * -----------------------------------------------------------------------------------------------*/ async function processZipFile(file, options = {}) {
121
+ const projectName = file.name.replace('.zip', '');
122
+ const files = await openZipFile(file, options);
123
+ return {
124
+ files,
125
+ projectName
126
+ };
127
+ }
128
+ function useCodeUpload({ onSuccess, onError } = {}) {
129
+ const [error, setError] = React.useState(null);
130
+ const [isProcessing, setIsProcessing] = React.useState(false);
131
+ const { fetch: fetchUploadProject, isPending: isFetching, error: fetchError } = useAIFetch.useFetchUploadProject();
132
+ const { id: chatId } = ChatProvider.useStrapiChat();
133
+ /**
134
+ * Upload processed files to the server
135
+ */ const processFiles = async (projectName, processedFiles)=>{
136
+ // Upload to server
137
+ const result = await fetchUploadProject({
138
+ body: {
139
+ chatId,
140
+ name: projectName,
141
+ type: 'code',
142
+ files: processedFiles
143
+ }
144
+ });
145
+ if (!result?.data) {
146
+ throw new Error('Failed to upload project');
147
+ }
148
+ return result.data;
149
+ };
150
+ const handleZipFile = async (file)=>{
151
+ try {
152
+ setError(null);
153
+ setIsProcessing(true);
154
+ const { files: processedFiles, projectName } = await processZipFile(file, {
155
+ ignorePatterns: [
156
+ '**/node_modules/**'
157
+ ]
158
+ });
159
+ const projectAttachment = await processFiles(projectName, processedFiles);
160
+ onSuccess?.({
161
+ ...projectAttachment,
162
+ id: misc.generateId(),
163
+ status: 'ready'
164
+ }, projectName);
165
+ return projectAttachment;
166
+ } catch (err) {
167
+ setError('Failed to process zip file');
168
+ onError?.('Failed to process zip file');
169
+ console.error('Error processing zip:', err);
170
+ throw err;
171
+ } finally{
172
+ setIsProcessing(false);
173
+ }
174
+ };
175
+ const handleFolder = async (files)=>{
176
+ try {
177
+ setError(null);
178
+ setIsProcessing(true);
179
+ const { files: processedFiles, projectName } = await processFolder(files, {
180
+ ignorePatterns: [
181
+ '**/node_modules/**'
182
+ ]
183
+ });
184
+ const projectAttachment = await processFiles(projectName, processedFiles);
185
+ onSuccess?.({
186
+ ...projectAttachment,
187
+ id: misc.generateId(),
188
+ status: 'ready'
189
+ }, projectName);
190
+ return projectAttachment;
191
+ } catch (err) {
192
+ setError('Failed to process folder');
193
+ onError?.('Failed to process folder');
194
+ console.error('Error processing folder:', err);
195
+ throw err;
196
+ } finally{
197
+ setIsProcessing(false);
198
+ }
199
+ };
200
+ return {
201
+ processZipFile: handleZipFile,
202
+ processFolder: handleFolder,
203
+ isLoading: isProcessing || isFetching,
204
+ error: fetchError || error
205
+ };
206
+ }
207
+
208
+ exports.openZipFile = openZipFile;
209
+ exports.processFolder = processFolder;
210
+ exports.processZipFile = processZipFile;
211
+ exports.useCodeUpload = useCodeUpload;
212
+ //# sourceMappingURL=useCodeUpload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCodeUpload.js","sources":["../../../../../admin/src/components/AIChat/hooks/useCodeUpload.ts"],"sourcesContent":["import { useState } from 'react';\n\nimport JSZip from 'jszip';\nimport micromatch from 'micromatch';\n\nimport { generateId } from '../lib/misc';\nimport { Attachment } from '../lib/types/attachments';\nimport { useStrapiChat } from '../providers/ChatProvider';\n\nimport { useFetchUploadProject } from './useAIFetch';\n\nexport interface ProjectFile {\n path: string;\n content: string;\n}\n\nconst ALLOWED_EXTENSIONS = ['.ts', '.tsx', '.js', '.jsx', '.md', '.json'];\nconst MAX_LINES_PER_FILE = 5000; // Maximum number of lines per file\n\n// Common patterns to ignore\nconst DEFAULT_IGNORE_PATTERNS = [\n '**/node_modules/**',\n '**/.git/**',\n '**/.next/**',\n '**/dist/**',\n '**/build/**',\n '**/.cache/**',\n '**/coverage/**',\n '**/test/**',\n '**/__tests__/**',\n '**/*.test.*',\n '**/*.spec.*',\n];\n\nconst isAllowedFile = (filename: string, ignorePatterns: string[] = []) => {\n // Check if file matches any ignore pattern\n if (micromatch.isMatch(filename, [...DEFAULT_IGNORE_PATTERNS, ...ignorePatterns])) {\n return false;\n }\n\n // Check if file has allowed extension\n return ALLOWED_EXTENSIONS.some((ext) => filename.toLowerCase().endsWith(ext));\n};\n\n/**\n * Prunes file content if it exceeds MAX_LINES\n */\nconst pruneFileContent = (content: string): string => {\n const lines = content.split('\\n');\n\n if (lines.length <= MAX_LINES_PER_FILE) {\n return content;\n }\n\n const truncated = lines.slice(0, MAX_LINES_PER_FILE).join('\\n');\n\n return `${truncated}\\n\\n// ... [${lines.length - MAX_LINES_PER_FILE} lines truncated, file too long] ...\\n\\n`;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * File processing options\n * -----------------------------------------------------------------------------------------------*/\nexport interface ProcessOptions {\n /**\n * Additional glob patterns to ignore\n */\n ignorePatterns?: string[];\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Zip file processing\n * -----------------------------------------------------------------------------------------------*/\nexport async function openZipFile(\n file: File,\n options: ProcessOptions = {}\n): Promise<ProjectFile[]> {\n const zip = new JSZip();\n const contents = await zip.loadAsync(file);\n const processedFiles: ProjectFile[] = [];\n\n // Process all files in parallel\n await Promise.all(\n Object.keys(contents.files).map(async (filename) => {\n const zipEntry = contents.files[filename];\n\n // Skip directories and non-allowed files\n if (zipEntry.dir || !isAllowedFile(filename, options.ignorePatterns)) {\n return;\n }\n\n try {\n const content = await zipEntry.async('string');\n processedFiles.push({\n path: filename,\n content: pruneFileContent(content),\n });\n } catch (err) {\n console.warn(`Failed to read file ${filename}:`, err);\n }\n })\n );\n\n // Sort files by path for consistency\n return processedFiles.sort((a, b) => a.path.localeCompare(b.path));\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Folder processing\n * -----------------------------------------------------------------------------------------------*/\nexport async function processFolder(\n files: FileList | File[],\n options: ProcessOptions = {}\n): Promise<{ files: ProjectFile[]; projectName: string }> {\n const processedFiles: ProjectFile[] = [];\n let folderName = 'Project';\n\n // Extract folder name from the first file's path\n if (files.length > 0) {\n const firstFile = files[0];\n const folderPath = firstFile.webkitRelativePath || '';\n const pathParts = folderPath.split('/');\n if (pathParts.length > 0 && pathParts[0]) {\n folderName = pathParts[0];\n }\n }\n\n // Process all files in parallel\n await Promise.all(\n Array.from(files).map(async (file) => {\n const filePath = file.webkitRelativePath || file.name;\n\n // Skip non-allowed files\n if (!isAllowedFile(filePath, options.ignorePatterns)) {\n return;\n }\n\n try {\n const content = await file.text();\n processedFiles.push({\n // Remove the root folder name from the path\n path: filePath.includes('/') ? filePath.substring(filePath.indexOf('/') + 1) : filePath,\n content: pruneFileContent(content),\n });\n } catch (err) {\n console.warn(`Failed to read file ${filePath}:`, err);\n }\n })\n );\n\n // Sort files by path for consistency\n return {\n files: processedFiles.sort((a, b) => a.path.localeCompare(b.path)),\n projectName: folderName,\n };\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Zip file processing\n * -----------------------------------------------------------------------------------------------*/\nexport async function processZipFile(\n file: File,\n options: ProcessOptions = {}\n): Promise<{ files: ProjectFile[]; projectName: string }> {\n const projectName = file.name.replace('.zip', '');\n const files = await openZipFile(file, options);\n\n return {\n files,\n projectName,\n };\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Upload files\n * -----------------------------------------------------------------------------------------------*/\n\ninterface UseCodeUploadOptions {\n onSuccess?: (attachment: Attachment, projectName: string) => void;\n onError?: (error: string) => void;\n}\n\nexport function useCodeUpload({ onSuccess, onError }: UseCodeUploadOptions = {}) {\n const [error, setError] = useState<string | null>(null);\n const [isProcessing, setIsProcessing] = useState(false);\n const {\n fetch: fetchUploadProject,\n isPending: isFetching,\n error: fetchError,\n } = useFetchUploadProject();\n const { id: chatId } = useStrapiChat();\n\n /**\n * Upload processed files to the server\n */\n const processFiles = async (projectName: string, processedFiles: ProjectFile[]) => {\n // Upload to server\n const result = await fetchUploadProject({\n body: {\n chatId,\n name: projectName,\n type: 'code',\n files: processedFiles,\n },\n });\n\n if (!result?.data) {\n throw new Error('Failed to upload project');\n }\n\n return result.data;\n };\n\n const handleZipFile = async (file: File) => {\n try {\n setError(null);\n setIsProcessing(true);\n\n const { files: processedFiles, projectName } = await processZipFile(file, {\n ignorePatterns: ['**/node_modules/**'],\n });\n\n const projectAttachment = await processFiles(projectName, processedFiles);\n\n onSuccess?.({ ...projectAttachment, id: generateId(), status: 'ready' }, projectName);\n return projectAttachment;\n } catch (err) {\n setError('Failed to process zip file');\n onError?.('Failed to process zip file');\n console.error('Error processing zip:', err);\n throw err;\n } finally {\n setIsProcessing(false);\n }\n };\n\n const handleFolder = async (files: FileList | File[]) => {\n try {\n setError(null);\n setIsProcessing(true);\n\n const { files: processedFiles, projectName } = await processFolder(files, {\n ignorePatterns: ['**/node_modules/**'],\n });\n\n const projectAttachment = await processFiles(projectName, processedFiles);\n\n onSuccess?.({ ...projectAttachment, id: generateId(), status: 'ready' }, projectName);\n return projectAttachment;\n } catch (err) {\n setError('Failed to process folder');\n onError?.('Failed to process folder');\n console.error('Error processing folder:', err);\n throw err;\n } finally {\n setIsProcessing(false);\n }\n };\n\n return {\n processZipFile: handleZipFile,\n processFolder: handleFolder,\n isLoading: isProcessing || isFetching,\n error: fetchError || error,\n };\n}\n"],"names":["ALLOWED_EXTENSIONS","MAX_LINES_PER_FILE","DEFAULT_IGNORE_PATTERNS","isAllowedFile","filename","ignorePatterns","micromatch","isMatch","some","ext","toLowerCase","endsWith","pruneFileContent","content","lines","split","length","truncated","slice","join","openZipFile","file","options","zip","JSZip","contents","loadAsync","processedFiles","Promise","all","Object","keys","files","map","zipEntry","dir","async","push","path","err","console","warn","sort","a","b","localeCompare","processFolder","folderName","firstFile","folderPath","webkitRelativePath","pathParts","Array","from","filePath","name","text","includes","substring","indexOf","projectName","processZipFile","replace","useCodeUpload","onSuccess","onError","error","setError","useState","isProcessing","setIsProcessing","fetch","fetchUploadProject","isPending","isFetching","fetchError","useFetchUploadProject","id","chatId","useStrapiChat","processFiles","result","body","type","data","Error","handleZipFile","projectAttachment","generateId","status","handleFolder","isLoading"],"mappings":"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"}