@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,151 @@
1
+ 'use strict';
2
+
3
+ var isEqual = require('lodash/isEqual');
4
+ var omit = require('lodash/omit');
5
+ var pluralize = require('pluralize');
6
+
7
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
8
+ const ACTION_TO_STATUS = {
9
+ create: 'NEW',
10
+ remove: 'REMOVED',
11
+ update: 'CHANGED'
12
+ };
13
+ /**
14
+ * Creates a new attribute with the specified status
15
+ */ const createAttributeWithStatus = (name, attributeData, status)=>({
16
+ ...attributeData,
17
+ name,
18
+ status
19
+ });
20
+ /**
21
+ * Determines the status of an attribute by comparing new and old versions
22
+ */ const determineAttributeStatus = (newAttr, oldAttr, oldSchema)=>{
23
+ if (!oldAttr) {
24
+ return 'NEW';
25
+ }
26
+ // If the schema was already new, don't mark attributes as changed, keep them as new.
27
+ if (oldSchema?.status === 'NEW') {
28
+ return 'NEW';
29
+ }
30
+ // Compare attributes without the status field to determine if they've changed
31
+ const newAttrWithoutStatus = omit(newAttr, [
32
+ 'status'
33
+ ]);
34
+ const oldAttrWithoutStatus = omit(oldAttr, [
35
+ 'status'
36
+ ]);
37
+ if (!isEqual(newAttrWithoutStatus, oldAttrWithoutStatus)) {
38
+ return 'CHANGED';
39
+ }
40
+ // If unchanged, keep the previous status
41
+ return oldAttr.status;
42
+ };
43
+ /**
44
+ * Determines the status of a schema by comparing action and checking if oldSchema exists
45
+ */ const transformStatusFromChatToCTB = (schema, oldSchema)=>{
46
+ // If schema has an action, use the mapped status
47
+ if (schema.action) {
48
+ return ACTION_TO_STATUS[schema.action];
49
+ }
50
+ // If oldSchema doesn't exist, it's a new schema
51
+ if (!oldSchema) {
52
+ return 'NEW';
53
+ }
54
+ // If no action is specified and oldSchema exists, keep the existing status
55
+ return oldSchema.status;
56
+ };
57
+ /**
58
+ * Transform attributes from Chat format to CTB format
59
+ * Also performs a diff to determine the status of each attribute
60
+ */ const transformAttributesFromChatToCTB = ({ action, attributes }, oldSchema)=>{
61
+ // If it's a new schema or no oldAttributes provided, all attributes are NEW
62
+ if (action === 'create' || !oldSchema) {
63
+ return Object.entries(attributes).map(([name, attribute])=>createAttributeWithStatus(name, attribute, 'NEW'));
64
+ }
65
+ // Convert old attributes array to a lookup map for faster access
66
+ const oldAttributesMap = oldSchema.attributes.reduce((acc, attr)=>({
67
+ ...acc,
68
+ [attr.name]: attr
69
+ }), {});
70
+ // Process current attributes (new and changed)
71
+ const processedAttributes = Object.entries(attributes).map(([name, attr])=>{
72
+ const oldAttr = oldAttributesMap[name];
73
+ const status = determineAttributeStatus({
74
+ ...attr,
75
+ name
76
+ }, oldAttr, oldSchema);
77
+ return createAttributeWithStatus(name, attr, status);
78
+ });
79
+ // No need to mark removed attributes if the old schema is new, just remove it from the list
80
+ // TODO: Else a validation error occurs on the backend side.
81
+ if (oldSchema?.status === 'NEW') {
82
+ return processedAttributes;
83
+ }
84
+ // Find removed attributes (exist in old but not in new)
85
+ const removedAttributes = Object.entries(oldAttributesMap).filter(([name])=>!attributes[name]).map(([name, oldAttr])=>createAttributeWithStatus(name, oldAttr, 'REMOVED'));
86
+ // Combine both sets of attributes
87
+ return [
88
+ ...processedAttributes,
89
+ ...removedAttributes
90
+ ];
91
+ };
92
+ /**
93
+ * Transform schema format
94
+ * AI chat -> CTB
95
+ *
96
+ * The AI chat returns a simplified format, and this layer transforms it to be compatible with the CTB reducer.
97
+ *
98
+ * We need to keep track of which changes have been made
99
+ */ const transformChatToCTB = (schema, oldSchema)=>{
100
+ const singularName = pluralize.singular(schema.name).toLowerCase().replace(/ /g, '-');
101
+ const pluralName = pluralize.plural(schema.name).toLowerCase().replace(/ /g, '-');
102
+ if (schema.modelType === 'component') {
103
+ return {
104
+ category: schema.category || 'default',
105
+ modelName: singularName,
106
+ attributes: transformAttributesFromChatToCTB(schema, oldSchema),
107
+ info: {
108
+ displayName: schema.name,
109
+ description: schema.description
110
+ },
111
+ modelType: schema.modelType,
112
+ uid: schema.uid,
113
+ collectionName: pluralName,
114
+ status: transformStatusFromChatToCTB(schema, oldSchema),
115
+ globalId: singularName
116
+ };
117
+ }
118
+ return {
119
+ uid: schema.uid,
120
+ modelType: schema.modelType,
121
+ modelName: singularName,
122
+ kind: schema.kind,
123
+ info: {
124
+ displayName: schema.name.charAt(0).toUpperCase() + schema.name.slice(1),
125
+ // Always keep the old by default
126
+ // @ts-expect-error - not in types
127
+ singularName: oldSchema?.info?.singularName || singularName,
128
+ // Always keep the old by default
129
+ // @ts-expect-error - not in types
130
+ pluralName: oldSchema?.info?.pluralName || pluralName
131
+ },
132
+ collectionName: pluralName,
133
+ attributes: transformAttributesFromChatToCTB(schema, oldSchema),
134
+ options: {
135
+ draftAndPublish: schema.options?.draftAndPublish ?? false
136
+ },
137
+ pluginOptions: {
138
+ i18n: {
139
+ localized: schema.options?.localized ?? false
140
+ }
141
+ },
142
+ visible: true,
143
+ status: transformStatusFromChatToCTB(schema, oldSchema),
144
+ globalId: singularName,
145
+ restrictRelationsTo: null
146
+ };
147
+ };
148
+
149
+ exports.transformAttributesFromChatToCTB = transformAttributesFromChatToCTB;
150
+ exports.transformChatToCTB = transformChatToCTB;
151
+ //# sourceMappingURL=toCTB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toCTB.js","sources":["../../../../../../../admin/src/components/AIChat/lib/transforms/schemas/toCTB.ts"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\nimport isEqual from 'lodash/isEqual';\nimport omit from 'lodash/omit';\nimport pluralize from 'pluralize';\n\nimport { Schema } from '../../types/schema';\n\nimport type { ContentType, Component, AnyAttribute } from '../../../../../types';\n\nconst ACTION_TO_STATUS: Record<Schema['action'], ContentType['status']> = {\n create: 'NEW',\n remove: 'REMOVED',\n update: 'CHANGED',\n};\n\n/**\n * Creates a new attribute with the specified status\n */\nconst createAttributeWithStatus = (\n name: string,\n attributeData: Record<string, any>,\n status: AnyAttribute['status']\n): AnyAttribute =>\n ({\n ...attributeData,\n name,\n status,\n }) as AnyAttribute;\n\n/**\n * Determines the status of an attribute by comparing new and old versions\n */\nconst determineAttributeStatus = (\n newAttr: Record<string, any>,\n oldAttr?: AnyAttribute,\n oldSchema?: ContentType | Component\n): AnyAttribute['status'] => {\n if (!oldAttr) {\n return 'NEW';\n }\n\n // If the schema was already new, don't mark attributes as changed, keep them as new.\n if (oldSchema?.status === 'NEW') {\n return 'NEW';\n }\n\n // Compare attributes without the status field to determine if they've changed\n const newAttrWithoutStatus = omit(newAttr, ['status']);\n const oldAttrWithoutStatus = omit(oldAttr, ['status']);\n\n if (!isEqual(newAttrWithoutStatus, oldAttrWithoutStatus)) {\n return 'CHANGED';\n }\n\n // If unchanged, keep the previous status\n return oldAttr.status;\n};\n\n/**\n * Determines the status of a schema by comparing action and checking if oldSchema exists\n */\nconst transformStatusFromChatToCTB = (\n schema: Schema,\n oldSchema?: ContentType | Component\n): ContentType['status'] => {\n // If schema has an action, use the mapped status\n if (schema.action) {\n return ACTION_TO_STATUS[schema.action];\n }\n\n // If oldSchema doesn't exist, it's a new schema\n if (!oldSchema) {\n return 'NEW';\n }\n\n // If no action is specified and oldSchema exists, keep the existing status\n return oldSchema.status;\n};\n\n/**\n * Transform attributes from Chat format to CTB format\n * Also performs a diff to determine the status of each attribute\n */\nexport const transformAttributesFromChatToCTB = (\n { action, attributes }: Schema,\n oldSchema?: ContentType | Component\n): AnyAttribute[] => {\n // If it's a new schema or no oldAttributes provided, all attributes are NEW\n if (action === 'create' || !oldSchema) {\n return Object.entries(attributes).map(([name, attribute]) =>\n createAttributeWithStatus(name, attribute, 'NEW')\n );\n }\n\n // Convert old attributes array to a lookup map for faster access\n const oldAttributesMap = oldSchema.attributes.reduce(\n (acc, attr) => ({ ...acc, [attr.name]: attr }),\n {} as Record<string, AnyAttribute>\n );\n\n // Process current attributes (new and changed)\n const processedAttributes = Object.entries(attributes).map(([name, attr]) => {\n const oldAttr = oldAttributesMap[name];\n const status = determineAttributeStatus({ ...attr, name }, oldAttr, oldSchema);\n\n return createAttributeWithStatus(name, attr, status);\n });\n\n // No need to mark removed attributes if the old schema is new, just remove it from the list\n // TODO: Else a validation error occurs on the backend side.\n if (oldSchema?.status === 'NEW') {\n return processedAttributes;\n }\n\n // Find removed attributes (exist in old but not in new)\n const removedAttributes = Object.entries(oldAttributesMap)\n .filter(([name]) => !attributes[name])\n .map(([name, oldAttr]) => createAttributeWithStatus(name, oldAttr, 'REMOVED'));\n\n // Combine both sets of attributes\n return [...processedAttributes, ...removedAttributes];\n};\n\n/**\n * Transform schema format\n * AI chat -> CTB\n *\n * The AI chat returns a simplified format, and this layer transforms it to be compatible with the CTB reducer.\n *\n * We need to keep track of which changes have been made\n */\nexport const transformChatToCTB = (\n schema: Schema,\n oldSchema?: ContentType | Component\n): ContentType | Component => {\n const singularName = pluralize.singular(schema.name).toLowerCase().replace(/ /g, '-');\n const pluralName = pluralize.plural(schema.name).toLowerCase().replace(/ /g, '-');\n\n if (schema.modelType === 'component') {\n return {\n category: schema.category || 'default',\n modelName: singularName,\n attributes: transformAttributesFromChatToCTB(schema, oldSchema),\n info: {\n displayName: schema.name,\n description: schema.description,\n // TODO\n // icon: schema.icon,\n },\n modelType: schema.modelType,\n uid: schema.uid as any,\n collectionName: pluralName,\n status: transformStatusFromChatToCTB(schema, oldSchema),\n globalId: singularName,\n } satisfies Component;\n }\n\n return {\n uid: schema.uid as any,\n modelType: schema.modelType,\n modelName: singularName,\n kind: schema.kind!,\n info: {\n displayName: schema.name.charAt(0).toUpperCase() + schema.name.slice(1),\n // Always keep the old by default\n // @ts-expect-error - not in types\n singularName: oldSchema?.info?.singularName || singularName,\n // Always keep the old by default\n // @ts-expect-error - not in types\n pluralName: oldSchema?.info?.pluralName || pluralName,\n },\n collectionName: pluralName,\n attributes: transformAttributesFromChatToCTB(schema, oldSchema),\n options: {\n draftAndPublish: schema.options?.draftAndPublish ?? false,\n },\n pluginOptions: {\n i18n: {\n localized: schema.options?.localized ?? false,\n },\n },\n visible: true,\n status: transformStatusFromChatToCTB(schema, oldSchema),\n globalId: singularName,\n restrictRelationsTo: null, // TODO: not sure what this is about\n } satisfies ContentType;\n};\n"],"names":["ACTION_TO_STATUS","create","remove","update","createAttributeWithStatus","name","attributeData","status","determineAttributeStatus","newAttr","oldAttr","oldSchema","newAttrWithoutStatus","omit","oldAttrWithoutStatus","isEqual","transformStatusFromChatToCTB","schema","action","transformAttributesFromChatToCTB","attributes","Object","entries","map","attribute","oldAttributesMap","reduce","acc","attr","processedAttributes","removedAttributes","filter","transformChatToCTB","singularName","pluralize","singular","toLowerCase","replace","pluralName","plural","modelType","category","modelName","info","displayName","description","uid","collectionName","globalId","kind","charAt","toUpperCase","slice","options","draftAndPublish","pluginOptions","i18n","localized","visible","restrictRelationsTo"],"mappings":"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"}
@@ -0,0 +1,148 @@
1
+ import isEqual from 'lodash/isEqual';
2
+ import omit from 'lodash/omit';
3
+ import pluralize from 'pluralize';
4
+
5
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
6
+ const ACTION_TO_STATUS = {
7
+ create: 'NEW',
8
+ remove: 'REMOVED',
9
+ update: 'CHANGED'
10
+ };
11
+ /**
12
+ * Creates a new attribute with the specified status
13
+ */ const createAttributeWithStatus = (name, attributeData, status)=>({
14
+ ...attributeData,
15
+ name,
16
+ status
17
+ });
18
+ /**
19
+ * Determines the status of an attribute by comparing new and old versions
20
+ */ const determineAttributeStatus = (newAttr, oldAttr, oldSchema)=>{
21
+ if (!oldAttr) {
22
+ return 'NEW';
23
+ }
24
+ // If the schema was already new, don't mark attributes as changed, keep them as new.
25
+ if (oldSchema?.status === 'NEW') {
26
+ return 'NEW';
27
+ }
28
+ // Compare attributes without the status field to determine if they've changed
29
+ const newAttrWithoutStatus = omit(newAttr, [
30
+ 'status'
31
+ ]);
32
+ const oldAttrWithoutStatus = omit(oldAttr, [
33
+ 'status'
34
+ ]);
35
+ if (!isEqual(newAttrWithoutStatus, oldAttrWithoutStatus)) {
36
+ return 'CHANGED';
37
+ }
38
+ // If unchanged, keep the previous status
39
+ return oldAttr.status;
40
+ };
41
+ /**
42
+ * Determines the status of a schema by comparing action and checking if oldSchema exists
43
+ */ const transformStatusFromChatToCTB = (schema, oldSchema)=>{
44
+ // If schema has an action, use the mapped status
45
+ if (schema.action) {
46
+ return ACTION_TO_STATUS[schema.action];
47
+ }
48
+ // If oldSchema doesn't exist, it's a new schema
49
+ if (!oldSchema) {
50
+ return 'NEW';
51
+ }
52
+ // If no action is specified and oldSchema exists, keep the existing status
53
+ return oldSchema.status;
54
+ };
55
+ /**
56
+ * Transform attributes from Chat format to CTB format
57
+ * Also performs a diff to determine the status of each attribute
58
+ */ const transformAttributesFromChatToCTB = ({ action, attributes }, oldSchema)=>{
59
+ // If it's a new schema or no oldAttributes provided, all attributes are NEW
60
+ if (action === 'create' || !oldSchema) {
61
+ return Object.entries(attributes).map(([name, attribute])=>createAttributeWithStatus(name, attribute, 'NEW'));
62
+ }
63
+ // Convert old attributes array to a lookup map for faster access
64
+ const oldAttributesMap = oldSchema.attributes.reduce((acc, attr)=>({
65
+ ...acc,
66
+ [attr.name]: attr
67
+ }), {});
68
+ // Process current attributes (new and changed)
69
+ const processedAttributes = Object.entries(attributes).map(([name, attr])=>{
70
+ const oldAttr = oldAttributesMap[name];
71
+ const status = determineAttributeStatus({
72
+ ...attr,
73
+ name
74
+ }, oldAttr, oldSchema);
75
+ return createAttributeWithStatus(name, attr, status);
76
+ });
77
+ // No need to mark removed attributes if the old schema is new, just remove it from the list
78
+ // TODO: Else a validation error occurs on the backend side.
79
+ if (oldSchema?.status === 'NEW') {
80
+ return processedAttributes;
81
+ }
82
+ // Find removed attributes (exist in old but not in new)
83
+ const removedAttributes = Object.entries(oldAttributesMap).filter(([name])=>!attributes[name]).map(([name, oldAttr])=>createAttributeWithStatus(name, oldAttr, 'REMOVED'));
84
+ // Combine both sets of attributes
85
+ return [
86
+ ...processedAttributes,
87
+ ...removedAttributes
88
+ ];
89
+ };
90
+ /**
91
+ * Transform schema format
92
+ * AI chat -> CTB
93
+ *
94
+ * The AI chat returns a simplified format, and this layer transforms it to be compatible with the CTB reducer.
95
+ *
96
+ * We need to keep track of which changes have been made
97
+ */ const transformChatToCTB = (schema, oldSchema)=>{
98
+ const singularName = pluralize.singular(schema.name).toLowerCase().replace(/ /g, '-');
99
+ const pluralName = pluralize.plural(schema.name).toLowerCase().replace(/ /g, '-');
100
+ if (schema.modelType === 'component') {
101
+ return {
102
+ category: schema.category || 'default',
103
+ modelName: singularName,
104
+ attributes: transformAttributesFromChatToCTB(schema, oldSchema),
105
+ info: {
106
+ displayName: schema.name,
107
+ description: schema.description
108
+ },
109
+ modelType: schema.modelType,
110
+ uid: schema.uid,
111
+ collectionName: pluralName,
112
+ status: transformStatusFromChatToCTB(schema, oldSchema),
113
+ globalId: singularName
114
+ };
115
+ }
116
+ return {
117
+ uid: schema.uid,
118
+ modelType: schema.modelType,
119
+ modelName: singularName,
120
+ kind: schema.kind,
121
+ info: {
122
+ displayName: schema.name.charAt(0).toUpperCase() + schema.name.slice(1),
123
+ // Always keep the old by default
124
+ // @ts-expect-error - not in types
125
+ singularName: oldSchema?.info?.singularName || singularName,
126
+ // Always keep the old by default
127
+ // @ts-expect-error - not in types
128
+ pluralName: oldSchema?.info?.pluralName || pluralName
129
+ },
130
+ collectionName: pluralName,
131
+ attributes: transformAttributesFromChatToCTB(schema, oldSchema),
132
+ options: {
133
+ draftAndPublish: schema.options?.draftAndPublish ?? false
134
+ },
135
+ pluginOptions: {
136
+ i18n: {
137
+ localized: schema.options?.localized ?? false
138
+ }
139
+ },
140
+ visible: true,
141
+ status: transformStatusFromChatToCTB(schema, oldSchema),
142
+ globalId: singularName,
143
+ restrictRelationsTo: null
144
+ };
145
+ };
146
+
147
+ export { transformAttributesFromChatToCTB, transformChatToCTB };
148
+ //# sourceMappingURL=toCTB.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toCTB.mjs","sources":["../../../../../../../admin/src/components/AIChat/lib/transforms/schemas/toCTB.ts"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\nimport isEqual from 'lodash/isEqual';\nimport omit from 'lodash/omit';\nimport pluralize from 'pluralize';\n\nimport { Schema } from '../../types/schema';\n\nimport type { ContentType, Component, AnyAttribute } from '../../../../../types';\n\nconst ACTION_TO_STATUS: Record<Schema['action'], ContentType['status']> = {\n create: 'NEW',\n remove: 'REMOVED',\n update: 'CHANGED',\n};\n\n/**\n * Creates a new attribute with the specified status\n */\nconst createAttributeWithStatus = (\n name: string,\n attributeData: Record<string, any>,\n status: AnyAttribute['status']\n): AnyAttribute =>\n ({\n ...attributeData,\n name,\n status,\n }) as AnyAttribute;\n\n/**\n * Determines the status of an attribute by comparing new and old versions\n */\nconst determineAttributeStatus = (\n newAttr: Record<string, any>,\n oldAttr?: AnyAttribute,\n oldSchema?: ContentType | Component\n): AnyAttribute['status'] => {\n if (!oldAttr) {\n return 'NEW';\n }\n\n // If the schema was already new, don't mark attributes as changed, keep them as new.\n if (oldSchema?.status === 'NEW') {\n return 'NEW';\n }\n\n // Compare attributes without the status field to determine if they've changed\n const newAttrWithoutStatus = omit(newAttr, ['status']);\n const oldAttrWithoutStatus = omit(oldAttr, ['status']);\n\n if (!isEqual(newAttrWithoutStatus, oldAttrWithoutStatus)) {\n return 'CHANGED';\n }\n\n // If unchanged, keep the previous status\n return oldAttr.status;\n};\n\n/**\n * Determines the status of a schema by comparing action and checking if oldSchema exists\n */\nconst transformStatusFromChatToCTB = (\n schema: Schema,\n oldSchema?: ContentType | Component\n): ContentType['status'] => {\n // If schema has an action, use the mapped status\n if (schema.action) {\n return ACTION_TO_STATUS[schema.action];\n }\n\n // If oldSchema doesn't exist, it's a new schema\n if (!oldSchema) {\n return 'NEW';\n }\n\n // If no action is specified and oldSchema exists, keep the existing status\n return oldSchema.status;\n};\n\n/**\n * Transform attributes from Chat format to CTB format\n * Also performs a diff to determine the status of each attribute\n */\nexport const transformAttributesFromChatToCTB = (\n { action, attributes }: Schema,\n oldSchema?: ContentType | Component\n): AnyAttribute[] => {\n // If it's a new schema or no oldAttributes provided, all attributes are NEW\n if (action === 'create' || !oldSchema) {\n return Object.entries(attributes).map(([name, attribute]) =>\n createAttributeWithStatus(name, attribute, 'NEW')\n );\n }\n\n // Convert old attributes array to a lookup map for faster access\n const oldAttributesMap = oldSchema.attributes.reduce(\n (acc, attr) => ({ ...acc, [attr.name]: attr }),\n {} as Record<string, AnyAttribute>\n );\n\n // Process current attributes (new and changed)\n const processedAttributes = Object.entries(attributes).map(([name, attr]) => {\n const oldAttr = oldAttributesMap[name];\n const status = determineAttributeStatus({ ...attr, name }, oldAttr, oldSchema);\n\n return createAttributeWithStatus(name, attr, status);\n });\n\n // No need to mark removed attributes if the old schema is new, just remove it from the list\n // TODO: Else a validation error occurs on the backend side.\n if (oldSchema?.status === 'NEW') {\n return processedAttributes;\n }\n\n // Find removed attributes (exist in old but not in new)\n const removedAttributes = Object.entries(oldAttributesMap)\n .filter(([name]) => !attributes[name])\n .map(([name, oldAttr]) => createAttributeWithStatus(name, oldAttr, 'REMOVED'));\n\n // Combine both sets of attributes\n return [...processedAttributes, ...removedAttributes];\n};\n\n/**\n * Transform schema format\n * AI chat -> CTB\n *\n * The AI chat returns a simplified format, and this layer transforms it to be compatible with the CTB reducer.\n *\n * We need to keep track of which changes have been made\n */\nexport const transformChatToCTB = (\n schema: Schema,\n oldSchema?: ContentType | Component\n): ContentType | Component => {\n const singularName = pluralize.singular(schema.name).toLowerCase().replace(/ /g, '-');\n const pluralName = pluralize.plural(schema.name).toLowerCase().replace(/ /g, '-');\n\n if (schema.modelType === 'component') {\n return {\n category: schema.category || 'default',\n modelName: singularName,\n attributes: transformAttributesFromChatToCTB(schema, oldSchema),\n info: {\n displayName: schema.name,\n description: schema.description,\n // TODO\n // icon: schema.icon,\n },\n modelType: schema.modelType,\n uid: schema.uid as any,\n collectionName: pluralName,\n status: transformStatusFromChatToCTB(schema, oldSchema),\n globalId: singularName,\n } satisfies Component;\n }\n\n return {\n uid: schema.uid as any,\n modelType: schema.modelType,\n modelName: singularName,\n kind: schema.kind!,\n info: {\n displayName: schema.name.charAt(0).toUpperCase() + schema.name.slice(1),\n // Always keep the old by default\n // @ts-expect-error - not in types\n singularName: oldSchema?.info?.singularName || singularName,\n // Always keep the old by default\n // @ts-expect-error - not in types\n pluralName: oldSchema?.info?.pluralName || pluralName,\n },\n collectionName: pluralName,\n attributes: transformAttributesFromChatToCTB(schema, oldSchema),\n options: {\n draftAndPublish: schema.options?.draftAndPublish ?? false,\n },\n pluginOptions: {\n i18n: {\n localized: schema.options?.localized ?? false,\n },\n },\n visible: true,\n status: transformStatusFromChatToCTB(schema, oldSchema),\n globalId: singularName,\n restrictRelationsTo: null, // TODO: not sure what this is about\n } satisfies ContentType;\n};\n"],"names":["ACTION_TO_STATUS","create","remove","update","createAttributeWithStatus","name","attributeData","status","determineAttributeStatus","newAttr","oldAttr","oldSchema","newAttrWithoutStatus","omit","oldAttrWithoutStatus","isEqual","transformStatusFromChatToCTB","schema","action","transformAttributesFromChatToCTB","attributes","Object","entries","map","attribute","oldAttributesMap","reduce","acc","attr","processedAttributes","removedAttributes","filter","transformChatToCTB","singularName","pluralize","singular","toLowerCase","replace","pluralName","plural","modelType","category","modelName","info","displayName","description","uid","collectionName","globalId","kind","charAt","toUpperCase","slice","options","draftAndPublish","pluginOptions","i18n","localized","visible","restrictRelationsTo"],"mappings":"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"}
@@ -0,0 +1,191 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var React = require('react');
5
+ var strapiAdmin = require('@strapi/admin/strapi-admin');
6
+ var ee = require('@strapi/admin/strapi-admin/ee');
7
+ var useDataManager = require('../../DataManager/useDataManager.js');
8
+ var FeedbackModal = require('../FeedbackModal.js');
9
+ var useAIFetch = require('../hooks/useAIFetch.js');
10
+ var useChatTitle = require('../hooks/useChatTitle.js');
11
+ var useLastSeenSchemas = require('../hooks/useLastSeenSchemas.js');
12
+ var fromCTB = require('../lib/transforms/schemas/fromCTB.js');
13
+ var UploadCodeModal = require('../UploadCodeModal.js');
14
+ var UploadFigmaModal = require('../UploadFigmaModal.js');
15
+ var SchemaProvider = require('./SchemaProvider.js');
16
+
17
+ const ChatContext = /*#__PURE__*/ React.createContext(undefined);
18
+ const generateRandomId = ()=>{
19
+ return Math.random().toString(36).substring(2, 15);
20
+ };
21
+ const BaseChatProvider = ({ children, defaultOpen = false })=>{
22
+ const [chatId, setChatId] = React.useState(generateRandomId());
23
+ const [isChatOpen, setIsChatOpen] = React.useState(defaultOpen);
24
+ const [openCount, setOpenCount] = React.useState(0);
25
+ const [input, setInput] = React.useState('');
26
+ // Files
27
+ const [attachments, setAttachments] = React.useState([]);
28
+ const { trackUsage } = strapiAdmin.useTracking();
29
+ // DataManager
30
+ const { components, contentTypes } = useDataManager.useDataManager();
31
+ // Last user seen schemas
32
+ const { lastSeenSchemas } = useLastSeenSchemas.useLastSeenSchemas();
33
+ // Schemas to be sent to the chat
34
+ const schemas = React.useMemo(()=>{
35
+ return [
36
+ ...Object.values(contentTypes).filter((schema)=>schema.status !== 'REMOVED')// Probably we should still keep this one, not sure
37
+ .filter((schema)=>schema.uid !== 'plugin::users-permissions.user').filter((schema)=>schema.visible).map(fromCTB.transformCTBToChat),
38
+ ...Object.values(components).filter((schema)=>schema.status !== 'REMOVED').map(fromCTB.transformCTBToChat)
39
+ ];
40
+ }, [
41
+ contentTypes,
42
+ components
43
+ ]);
44
+ const { id, messages, sendMessage: _sendMessage, status, stop, ...chat } = useAIFetch.useAIChat({
45
+ id: chatId?.toString(),
46
+ experimental_throttle: 100
47
+ });
48
+ /* -------------------------------------------------------------------------------------------------
49
+ * AI SDK chat overrides
50
+ * -----------------------------------------------------------------------------------------------*/ // NOTE: body is using state variables, so they can not be passed as a prop in useChat
51
+ const sendMessage = async (message, options)=>{
52
+ if (status === 'streaming' || status === 'submitted') {
53
+ return;
54
+ }
55
+ return _sendMessage(message, {
56
+ ...options,
57
+ body: {
58
+ ...options?.body,
59
+ schemas,
60
+ metadata: {
61
+ lastSeenSchemas: lastSeenSchemas.map((schema)=>schema.uid)
62
+ }
63
+ }
64
+ });
65
+ };
66
+ const handleSubmit = (e)=>{
67
+ e.preventDefault();
68
+ if (status === 'streaming' || status === 'submitted') {
69
+ return;
70
+ }
71
+ const readyAttachments = attachments.filter((a)=>a.status !== 'loading');
72
+ if (input.trim().length === 0 && attachments.length === 0) {
73
+ return;
74
+ }
75
+ const files = readyAttachments.map((attachment)=>({
76
+ type: 'file',
77
+ filename: attachment.filename,
78
+ mediaType: attachment.mediaType,
79
+ url: attachment.url
80
+ }));
81
+ sendMessage({
82
+ text: input,
83
+ files
84
+ });
85
+ setInput('');
86
+ setAttachments([]);
87
+ };
88
+ /* -------------------------------------------------------------------------------------------------
89
+ * Chat title
90
+ * -----------------------------------------------------------------------------------------------*/ const { title, generateTitle, resetTitle } = useChatTitle.useChatTitle({
91
+ chatId: id,
92
+ messages
93
+ });
94
+ // Automatically generate title when we have at least 1 message (user query)
95
+ React.useEffect(()=>{
96
+ if (messages.length >= 1 && !title) {
97
+ generateTitle();
98
+ }
99
+ }, [
100
+ messages.length,
101
+ title,
102
+ generateTitle
103
+ ]);
104
+ React.useEffect(()=>{
105
+ if (status === 'error') {
106
+ trackUsage('didAnswerMessage', {
107
+ successful: false
108
+ });
109
+ } else if (status === 'ready' && messages.length > 0 && messages[messages.length - 1]?.role === 'assistant') {
110
+ trackUsage('didAnswerMessage', {
111
+ successful: true
112
+ });
113
+ }
114
+ }, [
115
+ status,
116
+ messages,
117
+ trackUsage
118
+ ]);
119
+ const isChatAvailable = ee.useAIAvailability();
120
+ return /*#__PURE__*/ jsxRuntime.jsx(ChatContext.Provider, {
121
+ value: {
122
+ isChatEnabled: isChatAvailable,
123
+ id,
124
+ status,
125
+ stop,
126
+ sendMessage,
127
+ ...chat,
128
+ messages,
129
+ handleSubmit,
130
+ input,
131
+ setInput,
132
+ handleInputChange: (e)=>setInput(e.target.value),
133
+ reset: ()=>{
134
+ stop();
135
+ setChatId(generateRandomId());
136
+ trackUsage('didStartNewChat');
137
+ resetTitle();
138
+ },
139
+ schemas,
140
+ // Chat
141
+ title,
142
+ isChatOpen,
143
+ openChat: ()=>{
144
+ setIsChatOpen(true);
145
+ // if this is the first open, it's a new chat
146
+ if (openCount === 0) {
147
+ trackUsage('didStartNewChat');
148
+ }
149
+ setOpenCount((prev)=>prev + 1);
150
+ },
151
+ closeChat: ()=>setIsChatOpen(false),
152
+ // Attachments
153
+ attachments,
154
+ setAttachments
155
+ },
156
+ children: children
157
+ });
158
+ };
159
+ const ChatProvider = ({ children, defaultOpen = false })=>{
160
+ return /*#__PURE__*/ jsxRuntime.jsx(BaseChatProvider, {
161
+ defaultOpen: defaultOpen,
162
+ children: /*#__PURE__*/ jsxRuntime.jsx(SchemaProvider.SchemaChatProvider, {
163
+ children: /*#__PURE__*/ jsxRuntime.jsx(UploadCodeModal.UploadProjectToChatProvider, {
164
+ children: /*#__PURE__*/ jsxRuntime.jsx(UploadFigmaModal.UploadFigmaToChatProvider, {
165
+ children: /*#__PURE__*/ jsxRuntime.jsx(FeedbackModal.FeedbackProvider, {
166
+ children: children
167
+ })
168
+ })
169
+ })
170
+ })
171
+ });
172
+ };
173
+ function useStrapiChat() {
174
+ const context = React.useContext(ChatContext);
175
+ if (process.env.NODE_ENV === 'development') {
176
+ // In development, provide a fallback to prevent crashes during hot reloading
177
+ // This allows the app to continue working during HMR updates
178
+ if (context === undefined) {
179
+ console.warn('useStrapiChat was called outside of ChatProvider. This is only allowed in development mode.');
180
+ return {};
181
+ }
182
+ } else if (context === undefined) {
183
+ throw new Error('useStrapiChat must be used within a ChatProvider');
184
+ }
185
+ return context;
186
+ }
187
+
188
+ exports.BaseChatProvider = BaseChatProvider;
189
+ exports.ChatProvider = ChatProvider;
190
+ exports.useStrapiChat = useStrapiChat;
191
+ //# sourceMappingURL=ChatProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatProvider.js","sources":["../../../../../admin/src/components/AIChat/providers/ChatProvider.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n createContext,\n useContext,\n useMemo,\n useState,\n useEffect,\n type ReactNode,\n type ChangeEvent,\n} from 'react';\n\nimport { UIMessage, useChat } from '@ai-sdk/react';\nimport { useTracking } from '@strapi/admin/strapi-admin';\nimport { useAIAvailability } from '@strapi/admin/strapi-admin/ee';\n\nimport { useDataManager } from '../../DataManager/useDataManager';\nimport { FeedbackProvider } from '../FeedbackModal';\nimport { useAIChat } from '../hooks/useAIFetch';\nimport { useChatTitle } from '../hooks/useChatTitle';\nimport { useLastSeenSchemas } from '../hooks/useLastSeenSchemas';\nimport { transformCTBToChat } from '../lib/transforms/schemas/fromCTB';\nimport { Attachment } from '../lib/types/attachments';\nimport { Schema } from '../lib/types/schema';\nimport { UploadProjectToChatProvider } from '../UploadCodeModal';\nimport { UploadFigmaToChatProvider } from '../UploadFigmaModal';\n\nimport { SchemaChatProvider } from './SchemaProvider';\n\ninterface ChatContextType extends Omit<ReturnType<typeof useChat>, 'messages'> {\n isChatEnabled: boolean;\n title?: string;\n messages: UIMessage[];\n handleSubmit: (event: any) => void;\n input: string;\n setInput: React.Dispatch<React.SetStateAction<string>>;\n handleInputChange: (e: ChangeEvent<HTMLInputElement> | ChangeEvent<HTMLTextAreaElement>) => void;\n reset: () => void;\n schemas: Schema[];\n // Chat window\n isChatOpen: boolean;\n openChat: () => void;\n closeChat: () => void;\n // Attachments\n attachments: Attachment[];\n setAttachments: React.Dispatch<React.SetStateAction<Attachment[]>>;\n}\n\nconst ChatContext = createContext<ChatContextType | undefined>(undefined);\n\nconst generateRandomId = () => {\n return Math.random().toString(36).substring(2, 15);\n};\n\nexport const BaseChatProvider = ({\n children,\n defaultOpen = false,\n}: {\n children: ReactNode;\n defaultOpen?: boolean;\n}) => {\n const [chatId, setChatId] = useState<string | undefined>(generateRandomId());\n const [isChatOpen, setIsChatOpen] = useState(defaultOpen);\n const [openCount, setOpenCount] = useState(0);\n const [input, setInput] = useState('');\n\n // Files\n const [attachments, setAttachments] = useState<Attachment[]>([]);\n\n const { trackUsage } = useTracking();\n\n // DataManager\n const { components, contentTypes } = useDataManager();\n\n // Last user seen schemas\n const { lastSeenSchemas } = useLastSeenSchemas();\n\n // Schemas to be sent to the chat\n const schemas = useMemo(() => {\n return [\n ...Object.values(contentTypes)\n .filter((schema) => schema.status !== 'REMOVED')\n // Probably we should still keep this one, not sure\n .filter((schema) => schema.uid !== 'plugin::users-permissions.user')\n .filter((schema) => schema.visible)\n .map(transformCTBToChat as any),\n ...Object.values(components)\n .filter((schema) => schema.status !== 'REMOVED')\n .map(transformCTBToChat as any),\n ] as Schema[];\n }, [contentTypes, components]);\n\n const {\n id,\n messages,\n sendMessage: _sendMessage,\n status,\n stop,\n ...chat\n } = useAIChat({\n id: chatId?.toString(),\n experimental_throttle: 100,\n });\n\n /* -------------------------------------------------------------------------------------------------\n * AI SDK chat overrides\n * -----------------------------------------------------------------------------------------------*/\n\n // NOTE: body is using state variables, so they can not be passed as a prop in useChat\n const sendMessage: typeof _sendMessage = async (message, options) => {\n if (status === 'streaming' || status === 'submitted') {\n return;\n }\n\n return _sendMessage(message, {\n ...options,\n body: {\n ...options?.body,\n schemas,\n metadata: {\n lastSeenSchemas: lastSeenSchemas.map((schema) => schema.uid),\n },\n },\n });\n };\n\n const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n if (status === 'streaming' || status === 'submitted') {\n return;\n }\n\n const readyAttachments = attachments.filter((a) => a.status !== 'loading');\n if (input.trim().length === 0 && attachments.length === 0) {\n return;\n }\n\n const files = readyAttachments.map(\n (attachment) =>\n ({\n type: 'file',\n filename: attachment.filename,\n mediaType: attachment.mediaType,\n url: attachment.url,\n }) as const\n );\n sendMessage({ text: input, files });\n setInput('');\n setAttachments([]);\n };\n\n /* -------------------------------------------------------------------------------------------------\n * Chat title\n * -----------------------------------------------------------------------------------------------*/\n const { title, generateTitle, resetTitle } = useChatTitle({ chatId: id, messages });\n\n // Automatically generate title when we have at least 1 message (user query)\n useEffect(() => {\n if (messages.length >= 1 && !title) {\n generateTitle();\n }\n }, [messages.length, title, generateTitle]);\n\n useEffect(() => {\n if (status === 'error') {\n trackUsage('didAnswerMessage', {\n successful: false,\n });\n } else if (\n status === 'ready' &&\n messages.length > 0 &&\n messages[messages.length - 1]?.role === 'assistant'\n ) {\n trackUsage('didAnswerMessage', {\n successful: true,\n });\n }\n }, [status, messages, trackUsage]);\n\n const isChatAvailable = useAIAvailability();\n\n return (\n <ChatContext.Provider\n value={{\n isChatEnabled: isChatAvailable,\n id,\n status,\n stop,\n sendMessage,\n ...chat,\n messages,\n handleSubmit,\n input,\n setInput,\n handleInputChange: (e) => setInput(e.target.value),\n reset: () => {\n stop();\n setChatId(generateRandomId());\n trackUsage('didStartNewChat');\n resetTitle();\n },\n schemas,\n // Chat\n title,\n isChatOpen,\n openChat: () => {\n setIsChatOpen(true);\n // if this is the first open, it's a new chat\n if (openCount === 0) {\n trackUsage('didStartNewChat');\n }\n setOpenCount((prev) => prev + 1);\n },\n closeChat: () => setIsChatOpen(false),\n // Attachments\n attachments,\n setAttachments,\n }}\n >\n {children}\n </ChatContext.Provider>\n );\n};\n\nexport const ChatProvider = ({\n children,\n defaultOpen = false,\n}: {\n children: React.ReactNode;\n defaultOpen?: boolean;\n}) => {\n return (\n <BaseChatProvider defaultOpen={defaultOpen}>\n <SchemaChatProvider>\n <UploadProjectToChatProvider>\n <UploadFigmaToChatProvider>\n <FeedbackProvider>{children}</FeedbackProvider>\n </UploadFigmaToChatProvider>\n </UploadProjectToChatProvider>\n </SchemaChatProvider>\n </BaseChatProvider>\n );\n};\n\nexport function useStrapiChat() {\n const context = useContext(ChatContext);\n\n if (process.env.NODE_ENV === 'development') {\n // In development, provide a fallback to prevent crashes during hot reloading\n // This allows the app to continue working during HMR updates\n if (context === undefined) {\n console.warn(\n 'useStrapiChat was called outside of ChatProvider. This is only allowed in development mode.'\n );\n return {} as ChatContextType;\n }\n } else if (context === undefined) {\n throw new Error('useStrapiChat must be used within a ChatProvider');\n }\n return context;\n}\n"],"names":["ChatContext","createContext","undefined","generateRandomId","Math","random","toString","substring","BaseChatProvider","children","defaultOpen","chatId","setChatId","useState","isChatOpen","setIsChatOpen","openCount","setOpenCount","input","setInput","attachments","setAttachments","trackUsage","useTracking","components","contentTypes","useDataManager","lastSeenSchemas","useLastSeenSchemas","schemas","useMemo","Object","values","filter","schema","status","uid","visible","map","transformCTBToChat","id","messages","sendMessage","_sendMessage","stop","chat","useAIChat","experimental_throttle","message","options","body","metadata","handleSubmit","e","preventDefault","readyAttachments","a","trim","length","files","attachment","type","filename","mediaType","url","text","title","generateTitle","resetTitle","useChatTitle","useEffect","successful","role","isChatAvailable","useAIAvailability","_jsx","Provider","value","isChatEnabled","handleInputChange","target","reset","openChat","prev","closeChat","ChatProvider","SchemaChatProvider","UploadProjectToChatProvider","UploadFigmaToChatProvider","FeedbackProvider","useStrapiChat","context","useContext","process","env","NODE_ENV","console","warn","Error"],"mappings":";;;;;;;;;;;;;;;;AA+CA,MAAMA,4BAAcC,mBAA2CC,CAAAA,SAAAA,CAAAA;AAE/D,MAAMC,gBAAmB,GAAA,IAAA;IACvB,OAAOC,IAAAA,CAAKC,MAAM,EAAGC,CAAAA,QAAQ,CAAC,EAAIC,CAAAA,CAAAA,SAAS,CAAC,CAAG,EAAA,EAAA,CAAA;AACjD,CAAA;AAEO,MAAMC,mBAAmB,CAAC,EAC/BC,QAAQ,EACRC,WAAAA,GAAc,KAAK,EAIpB,GAAA;AACC,IAAA,MAAM,CAACC,MAAAA,EAAQC,SAAU,CAAA,GAAGC,cAA6BV,CAAAA,gBAAAA,EAAAA,CAAAA;AACzD,IAAA,MAAM,CAACW,UAAAA,EAAYC,aAAc,CAAA,GAAGF,cAASH,CAAAA,WAAAA,CAAAA;AAC7C,IAAA,MAAM,CAACM,SAAAA,EAAWC,YAAa,CAAA,GAAGJ,cAAS,CAAA,CAAA,CAAA;AAC3C,IAAA,MAAM,CAACK,KAAAA,EAAOC,QAAS,CAAA,GAAGN,cAAS,CAAA,EAAA,CAAA;;AAGnC,IAAA,MAAM,CAACO,WAAAA,EAAaC,cAAe,CAAA,GAAGR,eAAuB,EAAE,CAAA;IAE/D,MAAM,EAAES,UAAU,EAAE,GAAGC,uBAAAA,EAAAA;;AAGvB,IAAA,MAAM,EAAEC,UAAU,EAAEC,YAAY,EAAE,GAAGC,6BAAAA,EAAAA;;IAGrC,MAAM,EAAEC,eAAe,EAAE,GAAGC,qCAAAA,EAAAA;;AAG5B,IAAA,MAAMC,UAAUC,aAAQ,CAAA,IAAA;QACtB,OAAO;eACFC,MAAOC,CAAAA,MAAM,CAACP,YAAAA,CAAAA,CACdQ,MAAM,CAAC,CAACC,MAAAA,GAAWA,MAAOC,CAAAA,MAAM,KAAK,SAAA,CACtC;AACCF,aAAAA,MAAM,CAAC,CAACC,MAAWA,GAAAA,MAAAA,CAAOE,GAAG,KAAK,gCAAA,CAAA,CAClCH,MAAM,CAAC,CAACC,MAAWA,GAAAA,MAAAA,CAAOG,OAAO,CAAA,CACjCC,GAAG,CAACC,0BAAAA,CAAAA;AACJR,YAAAA,GAAAA,MAAAA,CAAOC,MAAM,CAACR,UACdS,CAAAA,CAAAA,MAAM,CAAC,CAACC,MAAWA,GAAAA,MAAAA,CAAOC,MAAM,KAAK,SACrCG,CAAAA,CAAAA,GAAG,CAACC,0BAAAA;AACR,SAAA;KACA,EAAA;AAACd,QAAAA,YAAAA;AAAcD,QAAAA;AAAW,KAAA,CAAA;AAE7B,IAAA,MAAM,EACJgB,EAAE,EACFC,QAAQ,EACRC,WAAaC,EAAAA,YAAY,EACzBR,MAAM,EACNS,IAAI,EACJ,GAAGC,IAAAA,EACJ,GAAGC,oBAAU,CAAA;AACZN,QAAAA,EAAAA,EAAI7B,MAAQL,EAAAA,QAAAA,EAAAA;QACZyC,qBAAuB,EAAA;AACzB,KAAA,CAAA;AAEA;;AAEkG;IAGlG,MAAML,WAAAA,GAAmC,OAAOM,OAASC,EAAAA,OAAAA,GAAAA;QACvD,IAAId,MAAAA,KAAW,WAAeA,IAAAA,MAAAA,KAAW,WAAa,EAAA;AACpD,YAAA;AACF;AAEA,QAAA,OAAOQ,aAAaK,OAAS,EAAA;AAC3B,YAAA,GAAGC,OAAO;YACVC,IAAM,EAAA;AACJ,gBAAA,GAAGD,SAASC,IAAI;AAChBrB,gBAAAA,OAAAA;gBACAsB,QAAU,EAAA;AACRxB,oBAAAA,eAAAA,EAAiBA,gBAAgBW,GAAG,CAAC,CAACJ,MAAAA,GAAWA,OAAOE,GAAG;AAC7D;AACF;AACF,SAAA,CAAA;AACF,KAAA;AAEA,IAAA,MAAMgB,eAAe,CAACC,CAAAA,GAAAA;AACpBA,QAAAA,CAAAA,CAAEC,cAAc,EAAA;QAEhB,IAAInB,MAAAA,KAAW,WAAeA,IAAAA,MAAAA,KAAW,WAAa,EAAA;AACpD,YAAA;AACF;QAEA,MAAMoB,gBAAAA,GAAmBnC,YAAYa,MAAM,CAAC,CAACuB,CAAMA,GAAAA,CAAAA,CAAErB,MAAM,KAAK,SAAA,CAAA;QAChE,IAAIjB,KAAAA,CAAMuC,IAAI,EAAGC,CAAAA,MAAM,KAAK,CAAKtC,IAAAA,WAAAA,CAAYsC,MAAM,KAAK,CAAG,EAAA;AACzD,YAAA;AACF;AAEA,QAAA,MAAMC,QAAQJ,gBAAiBjB,CAAAA,GAAG,CAChC,CAACsB,cACE;gBACCC,IAAM,EAAA,MAAA;AACNC,gBAAAA,QAAAA,EAAUF,WAAWE,QAAQ;AAC7BC,gBAAAA,SAAAA,EAAWH,WAAWG,SAAS;AAC/BC,gBAAAA,GAAAA,EAAKJ,WAAWI;aAClB,CAAA,CAAA;QAEJtB,WAAY,CAAA;YAAEuB,IAAM/C,EAAAA,KAAAA;AAAOyC,YAAAA;AAAM,SAAA,CAAA;QACjCxC,QAAS,CAAA,EAAA,CAAA;AACTE,QAAAA,cAAAA,CAAe,EAAE,CAAA;AACnB,KAAA;AAEA;;uGAGA,MAAM,EAAE6C,KAAK,EAAEC,aAAa,EAAEC,UAAU,EAAE,GAAGC,yBAAa,CAAA;QAAE1D,MAAQ6B,EAAAA,EAAAA;AAAIC,QAAAA;AAAS,KAAA,CAAA;;IAGjF6B,eAAU,CAAA,IAAA;AACR,QAAA,IAAI7B,QAASiB,CAAAA,MAAM,IAAI,CAAA,IAAK,CAACQ,KAAO,EAAA;AAClCC,YAAAA,aAAAA,EAAAA;AACF;KACC,EAAA;AAAC1B,QAAAA,QAAAA,CAASiB,MAAM;AAAEQ,QAAAA,KAAAA;AAAOC,QAAAA;AAAc,KAAA,CAAA;IAE1CG,eAAU,CAAA,IAAA;AACR,QAAA,IAAInC,WAAW,OAAS,EAAA;AACtBb,YAAAA,UAAAA,CAAW,kBAAoB,EAAA;gBAC7BiD,UAAY,EAAA;AACd,aAAA,CAAA;AACF,SAAA,MAAO,IACLpC,MAAAA,KAAW,OACXM,IAAAA,QAAAA,CAASiB,MAAM,GAAG,CAAA,IAClBjB,QAAQ,CAACA,SAASiB,MAAM,GAAG,CAAE,CAAA,EAAEc,SAAS,WACxC,EAAA;AACAlD,YAAAA,UAAAA,CAAW,kBAAoB,EAAA;gBAC7BiD,UAAY,EAAA;AACd,aAAA,CAAA;AACF;KACC,EAAA;AAACpC,QAAAA,MAAAA;AAAQM,QAAAA,QAAAA;AAAUnB,QAAAA;AAAW,KAAA,CAAA;AAEjC,IAAA,MAAMmD,eAAkBC,GAAAA,oBAAAA,EAAAA;IAExB,qBACEC,cAAA,CAAC3E,YAAY4E,QAAQ,EAAA;QACnBC,KAAO,EAAA;YACLC,aAAeL,EAAAA,eAAAA;AACfjC,YAAAA,EAAAA;AACAL,YAAAA,MAAAA;AACAS,YAAAA,IAAAA;AACAF,YAAAA,WAAAA;AACA,YAAA,GAAGG,IAAI;AACPJ,YAAAA,QAAAA;AACAW,YAAAA,YAAAA;AACAlC,YAAAA,KAAAA;AACAC,YAAAA,QAAAA;AACA4D,YAAAA,iBAAAA,EAAmB,CAAC1B,CAAMlC,GAAAA,QAAAA,CAASkC,CAAE2B,CAAAA,MAAM,CAACH,KAAK,CAAA;YACjDI,KAAO,EAAA,IAAA;AACLrC,gBAAAA,IAAAA,EAAAA;gBACAhC,SAAUT,CAAAA,gBAAAA,EAAAA,CAAAA;gBACVmB,UAAW,CAAA,iBAAA,CAAA;AACX8C,gBAAAA,UAAAA,EAAAA;AACF,aAAA;AACAvC,YAAAA,OAAAA;;AAEAqC,YAAAA,KAAAA;AACApD,YAAAA,UAAAA;YACAoE,QAAU,EAAA,IAAA;gBACRnE,aAAc,CAAA,IAAA,CAAA;;AAEd,gBAAA,IAAIC,cAAc,CAAG,EAAA;oBACnBM,UAAW,CAAA,iBAAA,CAAA;AACb;gBACAL,YAAa,CAAA,CAACkE,OAASA,IAAO,GAAA,CAAA,CAAA;AAChC,aAAA;AACAC,YAAAA,SAAAA,EAAW,IAAMrE,aAAc,CAAA,KAAA,CAAA;;AAE/BK,YAAAA,WAAAA;AACAC,YAAAA;AACF,SAAA;AAECZ,QAAAA,QAAAA,EAAAA;;AAGP;AAEO,MAAM4E,eAAe,CAAC,EAC3B5E,QAAQ,EACRC,WAAAA,GAAc,KAAK,EAIpB,GAAA;AACC,IAAA,qBACEiE,cAACnE,CAAAA,gBAAAA,EAAAA;QAAiBE,WAAaA,EAAAA,WAAAA;AAC7B,QAAA,QAAA,gBAAAiE,cAACW,CAAAA,iCAAAA,EAAAA;AACC,YAAA,QAAA,gBAAAX,cAACY,CAAAA,2CAAAA,EAAAA;AACC,gBAAA,QAAA,gBAAAZ,cAACa,CAAAA,0CAAAA,EAAAA;AACC,oBAAA,QAAA,gBAAAb,cAACc,CAAAA,8BAAAA,EAAAA;AAAkBhF,wBAAAA,QAAAA,EAAAA;;;;;;AAM/B;AAEO,SAASiF,aAAAA,GAAAA;AACd,IAAA,MAAMC,UAAUC,gBAAW5F,CAAAA,WAAAA,CAAAA;AAE3B,IAAA,IAAI6F,OAAQC,CAAAA,GAAG,CAACC,QAAQ,KAAK,aAAe,EAAA;;;AAG1C,QAAA,IAAIJ,YAAYzF,SAAW,EAAA;AACzB8F,YAAAA,OAAAA,CAAQC,IAAI,CACV,6FAAA,CAAA;AAEF,YAAA,OAAO,EAAC;AACV;KACK,MAAA,IAAIN,YAAYzF,SAAW,EAAA;AAChC,QAAA,MAAM,IAAIgG,KAAM,CAAA,kDAAA,CAAA;AAClB;IACA,OAAOP,OAAAA;AACT;;;;;;"}