@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.
- package/dist/admin/components/AIChat/Chat.js +431 -0
- package/dist/admin/components/AIChat/Chat.js.map +1 -0
- package/dist/admin/components/AIChat/Chat.mjs +429 -0
- package/dist/admin/components/AIChat/Chat.mjs.map +1 -0
- package/dist/admin/components/AIChat/FeedbackModal.js +237 -0
- package/dist/admin/components/AIChat/FeedbackModal.js.map +1 -0
- package/dist/admin/components/AIChat/FeedbackModal.mjs +233 -0
- package/dist/admin/components/AIChat/FeedbackModal.mjs.map +1 -0
- package/dist/admin/components/AIChat/UploadCodeModal.js +427 -0
- package/dist/admin/components/AIChat/UploadCodeModal.js.map +1 -0
- package/dist/admin/components/AIChat/UploadCodeModal.mjs +423 -0
- package/dist/admin/components/AIChat/UploadCodeModal.mjs.map +1 -0
- package/dist/admin/components/AIChat/UploadFigmaModal.js +377 -0
- package/dist/admin/components/AIChat/UploadFigmaModal.js.map +1 -0
- package/dist/admin/components/AIChat/UploadFigmaModal.mjs +373 -0
- package/dist/admin/components/AIChat/UploadFigmaModal.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Alert.js +46 -0
- package/dist/admin/components/AIChat/components/Alert.js.map +1 -0
- package/dist/admin/components/AIChat/components/Alert.mjs +44 -0
- package/dist/admin/components/AIChat/components/Alert.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/AnimatedBox.js +34 -0
- package/dist/admin/components/AIChat/components/AnimatedBox.js.map +1 -0
- package/dist/admin/components/AIChat/components/AnimatedBox.mjs +32 -0
- package/dist/admin/components/AIChat/components/AnimatedBox.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.js +92 -0
- package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.js.map +1 -0
- package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.mjs +90 -0
- package/dist/admin/components/AIChat/components/Attachments/AttachmentPreview.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Attachments/components/Attachment.js +100 -0
- package/dist/admin/components/AIChat/components/Attachments/components/Attachment.js.map +1 -0
- package/dist/admin/components/AIChat/components/Attachments/components/Attachment.mjs +97 -0
- package/dist/admin/components/AIChat/components/Attachments/components/Attachment.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Base64Image.js +127 -0
- package/dist/admin/components/AIChat/components/Base64Image.js.map +1 -0
- package/dist/admin/components/AIChat/components/Base64Image.mjs +125 -0
- package/dist/admin/components/AIChat/components/Base64Image.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Collapsible.js +71 -0
- package/dist/admin/components/AIChat/components/Collapsible.js.map +1 -0
- package/dist/admin/components/AIChat/components/Collapsible.mjs +66 -0
- package/dist/admin/components/AIChat/components/Collapsible.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Dropzone.js +172 -0
- package/dist/admin/components/AIChat/components/Dropzone.js.map +1 -0
- package/dist/admin/components/AIChat/components/Dropzone.mjs +167 -0
- package/dist/admin/components/AIChat/components/Dropzone.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/FloatingPanel.js +166 -0
- package/dist/admin/components/AIChat/components/FloatingPanel.js.map +1 -0
- package/dist/admin/components/AIChat/components/FloatingPanel.mjs +163 -0
- package/dist/admin/components/AIChat/components/FloatingPanel.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/FullScreenImage.js +190 -0
- package/dist/admin/components/AIChat/components/FullScreenImage.js.map +1 -0
- package/dist/admin/components/AIChat/components/FullScreenImage.mjs +187 -0
- package/dist/admin/components/AIChat/components/FullScreenImage.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/ImagePreview.js +87 -0
- package/dist/admin/components/AIChat/components/ImagePreview.js.map +1 -0
- package/dist/admin/components/AIChat/components/ImagePreview.mjs +85 -0
- package/dist/admin/components/AIChat/components/ImagePreview.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Input.js +126 -0
- package/dist/admin/components/AIChat/components/Input.js.map +1 -0
- package/dist/admin/components/AIChat/components/Input.mjs +121 -0
- package/dist/admin/components/AIChat/components/Input.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Messages/Marker.js +138 -0
- package/dist/admin/components/AIChat/components/Messages/Marker.js.map +1 -0
- package/dist/admin/components/AIChat/components/Messages/Marker.mjs +136 -0
- package/dist/admin/components/AIChat/components/Messages/Marker.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/Messages/Message.js +214 -0
- package/dist/admin/components/AIChat/components/Messages/Message.js.map +1 -0
- package/dist/admin/components/AIChat/components/Messages/Message.mjs +212 -0
- package/dist/admin/components/AIChat/components/Messages/Message.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/ResizableTextArea.js +78 -0
- package/dist/admin/components/AIChat/components/ResizableTextArea.js.map +1 -0
- package/dist/admin/components/AIChat/components/ResizableTextArea.mjs +76 -0
- package/dist/admin/components/AIChat/components/ResizableTextArea.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/SimpleMenu.js +60 -0
- package/dist/admin/components/AIChat/components/SimpleMenu.js.map +1 -0
- package/dist/admin/components/AIChat/components/SimpleMenu.mjs +35 -0
- package/dist/admin/components/AIChat/components/SimpleMenu.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/StepModal.js +175 -0
- package/dist/admin/components/AIChat/components/StepModal.js.map +1 -0
- package/dist/admin/components/AIChat/components/StepModal.mjs +171 -0
- package/dist/admin/components/AIChat/components/StepModal.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/animations.js +67 -0
- package/dist/admin/components/AIChat/components/animations.js.map +1 -0
- package/dist/admin/components/AIChat/components/animations.mjs +65 -0
- package/dist/admin/components/AIChat/components/animations.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/icons/FigmaIcon.js +50 -0
- package/dist/admin/components/AIChat/components/icons/FigmaIcon.js.map +1 -0
- package/dist/admin/components/AIChat/components/icons/FigmaIcon.mjs +48 -0
- package/dist/admin/components/AIChat/components/icons/FigmaIcon.mjs.map +1 -0
- package/dist/admin/components/AIChat/components/icons/StopIcon.js +25 -0
- package/dist/admin/components/AIChat/components/icons/StopIcon.js.map +1 -0
- package/dist/admin/components/AIChat/components/icons/StopIcon.mjs +23 -0
- package/dist/admin/components/AIChat/components/icons/StopIcon.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useAIFetch.js +107 -0
- package/dist/admin/components/AIChat/hooks/useAIFetch.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useAIFetch.mjs +96 -0
- package/dist/admin/components/AIChat/hooks/useAIFetch.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useAttachments.js +152 -0
- package/dist/admin/components/AIChat/hooks/useAttachments.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useAttachments.mjs +150 -0
- package/dist/admin/components/AIChat/hooks/useAttachments.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useChatTitle.js +47 -0
- package/dist/admin/components/AIChat/hooks/useChatTitle.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useChatTitle.mjs +45 -0
- package/dist/admin/components/AIChat/hooks/useChatTitle.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useCodeUpload.js +212 -0
- package/dist/admin/components/AIChat/hooks/useCodeUpload.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useCodeUpload.mjs +207 -0
- package/dist/admin/components/AIChat/hooks/useCodeUpload.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useFeedback.js +76 -0
- package/dist/admin/components/AIChat/hooks/useFeedback.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useFeedback.mjs +74 -0
- package/dist/admin/components/AIChat/hooks/useFeedback.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useFigmaUpload.js +206 -0
- package/dist/admin/components/AIChat/hooks/useFigmaUpload.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useFigmaUpload.mjs +200 -0
- package/dist/admin/components/AIChat/hooks/useFigmaUpload.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.js +115 -0
- package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.mjs +113 -0
- package/dist/admin/components/AIChat/hooks/useLastSeenSchemas.mjs.map +1 -0
- package/dist/admin/components/AIChat/hooks/useTranslations.js +19 -0
- package/dist/admin/components/AIChat/hooks/useTranslations.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/useTranslations.mjs +17 -0
- package/dist/admin/components/AIChat/hooks/useTranslations.mjs.map +1 -0
- package/dist/admin/components/AIChat/lib/aiClient.js +168 -0
- package/dist/admin/components/AIChat/lib/aiClient.js.map +1 -0
- package/dist/admin/components/AIChat/lib/aiClient.mjs +161 -0
- package/dist/admin/components/AIChat/lib/aiClient.mjs.map +1 -0
- package/dist/admin/components/AIChat/lib/constants.js +16 -0
- package/dist/admin/components/AIChat/lib/constants.js.map +1 -0
- package/dist/admin/components/AIChat/lib/constants.mjs +10 -0
- package/dist/admin/components/AIChat/lib/constants.mjs.map +1 -0
- package/dist/admin/components/AIChat/lib/misc.js +8 -0
- package/dist/admin/components/AIChat/lib/misc.js.map +1 -0
- package/dist/admin/components/AIChat/lib/misc.mjs +6 -0
- package/dist/admin/components/AIChat/lib/misc.mjs.map +1 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.js +46 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.js.map +1 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.mjs +44 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/fromCTB.mjs.map +1 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js +151 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js.map +1 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.mjs +148 -0
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.mjs.map +1 -0
- package/dist/admin/components/AIChat/providers/ChatProvider.js +191 -0
- package/dist/admin/components/AIChat/providers/ChatProvider.js.map +1 -0
- package/dist/admin/components/AIChat/providers/ChatProvider.mjs +187 -0
- package/dist/admin/components/AIChat/providers/ChatProvider.mjs.map +1 -0
- package/dist/admin/components/AIChat/providers/SchemaProvider.js +90 -0
- package/dist/admin/components/AIChat/providers/SchemaProvider.js.map +1 -0
- package/dist/admin/components/AIChat/providers/SchemaProvider.mjs +88 -0
- package/dist/admin/components/AIChat/providers/SchemaProvider.mjs.map +1 -0
- package/dist/admin/components/ComponentList.js +1 -0
- package/dist/admin/components/ComponentList.js.map +1 -1
- package/dist/admin/components/ComponentList.mjs +1 -0
- package/dist/admin/components/ComponentList.mjs.map +1 -1
- package/dist/admin/components/DataManager/DataManagerContext.js.map +1 -1
- package/dist/admin/components/DataManager/DataManagerContext.mjs.map +1 -1
- package/dist/admin/components/DataManager/reducer.js +48 -6
- package/dist/admin/components/DataManager/reducer.js.map +1 -1
- package/dist/admin/components/DataManager/reducer.mjs +48 -6
- package/dist/admin/components/DataManager/reducer.mjs.map +1 -1
- package/dist/admin/components/FormModal/utils/canEditContentType.js.map +1 -1
- package/dist/admin/components/FormModal/utils/canEditContentType.mjs.map +1 -1
- package/dist/admin/pages/App/index.js +60 -29
- package/dist/admin/pages/App/index.js.map +1 -1
- package/dist/admin/pages/App/index.mjs +62 -31
- package/dist/admin/pages/App/index.mjs.map +1 -1
- package/dist/admin/pages/ListView/EmptyState.js +75 -9
- package/dist/admin/pages/ListView/EmptyState.js.map +1 -1
- package/dist/admin/pages/ListView/EmptyState.mjs +77 -11
- package/dist/admin/pages/ListView/EmptyState.mjs.map +1 -1
- package/dist/admin/src/components/AIChat/Chat.d.ts +2 -0
- package/dist/admin/src/components/AIChat/FeedbackModal.d.ts +13 -0
- package/dist/admin/src/components/AIChat/UploadCodeModal.d.ts +12 -0
- package/dist/admin/src/components/AIChat/UploadFigmaModal.d.ts +12 -0
- package/dist/admin/src/components/AIChat/components/Alert.d.ts +6 -0
- package/dist/admin/src/components/AIChat/components/AnimatedBox.d.ts +13 -0
- package/dist/admin/src/components/AIChat/components/Attachments/AttachmentPreview.d.ts +9 -0
- package/dist/admin/src/components/AIChat/components/Attachments/components/Attachment.d.ts +27 -0
- package/dist/admin/src/components/AIChat/components/Base64Image.d.ts +9 -0
- package/dist/admin/src/components/AIChat/components/Collapsible.d.ts +18 -0
- package/dist/admin/src/components/AIChat/components/Dropzone.d.ts +35 -0
- package/dist/admin/src/components/AIChat/components/FloatingPanel.d.ts +34 -0
- package/dist/admin/src/components/AIChat/components/FullScreenImage.d.ts +20 -0
- package/dist/admin/src/components/AIChat/components/ImagePreview.d.ts +8 -0
- package/dist/admin/src/components/AIChat/components/ImagePreviewGroup.d.ts +7 -0
- package/dist/admin/src/components/AIChat/components/Input.d.ts +43 -0
- package/dist/admin/src/components/AIChat/components/Messages/Marker.d.ts +2 -0
- package/dist/admin/src/components/AIChat/components/Messages/Message.d.ts +5 -0
- package/dist/admin/src/components/AIChat/components/ResizableTextArea.d.ts +9 -0
- package/dist/admin/src/components/AIChat/components/SimpleMenu.d.ts +32 -0
- package/dist/admin/src/components/AIChat/components/StepModal.d.ts +37 -0
- package/dist/admin/src/components/AIChat/components/animations.d.ts +8 -0
- package/dist/admin/src/components/AIChat/components/icons/FigmaIcon.d.ts +5 -0
- package/dist/admin/src/components/AIChat/components/icons/StopIcon.d.ts +5 -0
- package/dist/admin/src/components/AIChat/hooks/useAIFetch.d.ts +147 -0
- package/dist/admin/src/components/AIChat/hooks/useAttachments.d.ts +8 -0
- package/dist/admin/src/components/AIChat/hooks/useChatTitle.d.ts +13 -0
- package/dist/admin/src/components/AIChat/hooks/useCodeUpload.d.ts +31 -0
- package/dist/admin/src/components/AIChat/hooks/useFeedback.d.ts +7 -0
- package/dist/admin/src/components/AIChat/hooks/useFigmaUpload.d.ts +61 -0
- package/dist/admin/src/components/AIChat/hooks/useLastSeenSchemas.d.ts +10 -0
- package/dist/admin/src/components/AIChat/hooks/useTranslations.d.ts +3 -0
- package/dist/admin/src/components/AIChat/lib/aiClient.d.ts +32 -0
- package/dist/admin/src/components/AIChat/lib/constants.d.ts +12 -0
- package/dist/admin/src/components/AIChat/lib/fileToAttachment.d.ts +2 -0
- package/dist/admin/src/components/AIChat/lib/misc.d.ts +1 -0
- package/dist/admin/src/components/AIChat/lib/transforms/schemas/fromCTB.d.ts +3 -0
- package/dist/admin/src/components/AIChat/lib/transforms/schemas/toCTB.d.ts +16 -0
- package/dist/admin/src/components/AIChat/lib/types/annotations.d.ts +19 -0
- package/dist/admin/src/components/AIChat/lib/types/attachments.d.ts +15 -0
- package/dist/admin/src/components/AIChat/lib/types/feedback.d.ts +1 -0
- package/dist/admin/src/components/AIChat/lib/types/messages.d.ts +26 -0
- package/dist/admin/src/components/AIChat/lib/types/schema.d.ts +20 -0
- package/dist/admin/src/components/AIChat/providers/ChatProvider.d.ts +30 -0
- package/dist/admin/src/components/AIChat/providers/SchemaProvider.d.ts +10 -0
- package/dist/admin/src/components/ComponentList.d.ts +1 -1
- package/dist/admin/src/components/DataManager/DataManagerContext.d.ts +1 -1
- package/dist/admin/translations/ar.json.js +187 -2
- package/dist/admin/translations/ar.json.js.map +1 -1
- package/dist/admin/translations/ar.json.mjs +187 -3
- package/dist/admin/translations/ar.json.mjs.map +1 -1
- package/dist/admin/translations/de.json.js +42 -7
- package/dist/admin/translations/de.json.js.map +1 -1
- package/dist/admin/translations/de.json.mjs +42 -7
- package/dist/admin/translations/de.json.mjs.map +1 -1
- package/dist/admin/translations/en.json.js +53 -2
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +53 -2
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/es.json.js +37 -15
- package/dist/admin/translations/es.json.js.map +1 -1
- package/dist/admin/translations/es.json.mjs +37 -15
- package/dist/admin/translations/es.json.mjs.map +1 -1
- package/dist/admin/translations/fr.json.js +165 -3
- package/dist/admin/translations/fr.json.js.map +1 -1
- package/dist/admin/translations/fr.json.mjs +165 -4
- package/dist/admin/translations/fr.json.mjs.map +1 -1
- package/dist/admin/translations/id.json.js +93 -23
- package/dist/admin/translations/id.json.js.map +1 -1
- package/dist/admin/translations/id.json.mjs +93 -23
- package/dist/admin/translations/id.json.mjs.map +1 -1
- package/dist/admin/translations/it.json.js +75 -6
- package/dist/admin/translations/it.json.js.map +1 -1
- package/dist/admin/translations/it.json.mjs +75 -6
- package/dist/admin/translations/it.json.mjs.map +1 -1
- package/dist/admin/translations/ja.json.js +191 -5
- package/dist/admin/translations/ja.json.js.map +1 -1
- package/dist/admin/translations/ja.json.mjs +191 -6
- package/dist/admin/translations/ja.json.mjs.map +1 -1
- package/dist/admin/translations/ko.json.js +70 -16
- package/dist/admin/translations/ko.json.js.map +1 -1
- package/dist/admin/translations/ko.json.mjs +70 -16
- package/dist/admin/translations/ko.json.mjs.map +1 -1
- package/dist/admin/translations/ms.json.js +104 -31
- package/dist/admin/translations/ms.json.js.map +1 -1
- package/dist/admin/translations/ms.json.mjs +104 -31
- package/dist/admin/translations/ms.json.mjs.map +1 -1
- package/dist/admin/translations/nl.json.js +95 -15
- package/dist/admin/translations/nl.json.js.map +1 -1
- package/dist/admin/translations/nl.json.mjs +95 -15
- package/dist/admin/translations/nl.json.mjs.map +1 -1
- package/dist/admin/translations/pl.json.js +55 -11
- package/dist/admin/translations/pl.json.js.map +1 -1
- package/dist/admin/translations/pl.json.mjs +55 -11
- package/dist/admin/translations/pl.json.mjs.map +1 -1
- package/dist/admin/translations/pt-BR.json.js +54 -10
- package/dist/admin/translations/pt-BR.json.js.map +1 -1
- package/dist/admin/translations/pt-BR.json.mjs +54 -10
- package/dist/admin/translations/pt-BR.json.mjs.map +1 -1
- package/dist/admin/translations/pt.json.js +187 -2
- package/dist/admin/translations/pt.json.js.map +1 -1
- package/dist/admin/translations/pt.json.mjs +187 -3
- package/dist/admin/translations/pt.json.mjs.map +1 -1
- package/dist/admin/translations/ru.json.js +26 -1
- package/dist/admin/translations/ru.json.js.map +1 -1
- package/dist/admin/translations/ru.json.mjs +26 -1
- package/dist/admin/translations/ru.json.mjs.map +1 -1
- package/dist/admin/translations/sk.json.js +21 -1
- package/dist/admin/translations/sk.json.js.map +1 -1
- package/dist/admin/translations/sk.json.mjs +21 -1
- package/dist/admin/translations/sk.json.mjs.map +1 -1
- package/dist/admin/translations/sv.json.js +21 -1
- package/dist/admin/translations/sv.json.js.map +1 -1
- package/dist/admin/translations/sv.json.mjs +21 -1
- package/dist/admin/translations/sv.json.mjs.map +1 -1
- package/dist/admin/translations/th.json.js +21 -1
- package/dist/admin/translations/th.json.js.map +1 -1
- package/dist/admin/translations/th.json.mjs +21 -1
- package/dist/admin/translations/th.json.mjs.map +1 -1
- package/dist/admin/translations/tr.json.js +21 -1
- package/dist/admin/translations/tr.json.js.map +1 -1
- package/dist/admin/translations/tr.json.mjs +21 -1
- package/dist/admin/translations/tr.json.mjs.map +1 -1
- package/dist/admin/translations/uk.json.js +21 -2
- package/dist/admin/translations/uk.json.js.map +1 -1
- package/dist/admin/translations/uk.json.mjs +21 -2
- package/dist/admin/translations/uk.json.mjs.map +1 -1
- package/dist/admin/translations/zh-Hans.json.js +222 -133
- package/dist/admin/translations/zh-Hans.json.js.map +1 -1
- package/dist/admin/translations/zh-Hans.json.mjs +222 -133
- package/dist/admin/translations/zh-Hans.json.mjs.map +1 -1
- package/dist/admin/translations/zh.json.js +21 -1
- package/dist/admin/translations/zh.json.js.map +1 -1
- package/dist/admin/translations/zh.json.mjs +21 -1
- package/dist/admin/translations/zh.json.mjs.map +1 -1
- package/dist/server/index.js +2 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +2 -0
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/register.js +98 -0
- package/dist/server/register.js.map +1 -0
- package/dist/server/register.mjs +96 -0
- package/dist/server/register.mjs.map +1 -0
- package/dist/server/src/controllers/ai/auth.d.ts +1 -0
- package/dist/server/src/controllers/ai/auth.d.ts.map +1 -0
- package/dist/server/src/controllers/ai/index.d.ts +1 -0
- package/dist/server/src/controllers/ai/index.d.ts.map +1 -0
- package/dist/server/src/index.d.ts +1 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/register.d.ts +11 -0
- package/dist/server/src/register.d.ts.map +1 -0
- package/package.json +12 -5
- package/dist/admin/components/DataManager/utils/formatSchemas.js +0 -21
- package/dist/admin/components/DataManager/utils/formatSchemas.js.map +0 -1
- package/dist/admin/components/DataManager/utils/formatSchemas.mjs +0 -18
- 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":";;;;;;;AAYO,SAASA,cAAAA,GAAAA;IACd,MAAM,EAAEC,cAAc,EAAEC,WAAW,EAAEC,EAAIC,EAAAA,MAAM,EAAE,GAAGC,aAAAA,EAAAA;IACpD,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,eAAAA,EAAAA;AAE/B,IAAA,MAAM,EAAEC,KAAAA,EAAOC,gBAAgB,EAAE,GAAGC,mBAAAA,EAAAA;AAEpC;;MAGA,MAAMC,cAAiBC,GAAAA,WAAAA,CACrB,CAACC,cAAAA,GAAAA;;AAEC,QAAA,IAAI,CAACA,cAAgB,EAAA;AACrBZ,QAAAA,cAAAA,CAAe,CAACa,IAAuB,GAAA;AAAIA,gBAAAA,GAAAA,IAAAA;AAASD,gBAAAA,GAAAA;AAAe,aAAA,CAAA;KAErE,EAAA;AAACZ,QAAAA;AAAe,KAAA,CAAA;AAGlB;;MAGA,MAAMc,gBAAmBH,GAAAA,WAAAA,CACvB,CAACI,UAAAA,GAAAA;AACCf,QAAAA,cAAAA,CAAe,CAACa,IAAAA,GACdA,IAAKG,CAAAA,GAAG,CAAC,CAACC,CAAOA,GAAAA,CAAAA,CAAEf,EAAE,KAAKa,UAAWb,CAAAA,EAAE,GAAG;AAAE,oBAAA,GAAGe,CAAC;AAAE,oBAAA,GAAGF;iBAAeE,GAAAA,CAAAA,CAAAA,CAAAA;KAGxE,EAAA;AAACjB,QAAAA;AAAe,KAAA,CAAA;AAGlB;;MAGA,MAAMkB,gBAAmBP,GAAAA,WAAAA,CACvB,CAACI,UAAAA,GAAAA;QACCf,cAAe,CAAA,CAACa,IAAuBA,GAAAA,IAAAA,CAAKM,MAAM,CAAC,CAACF,CAAAA,GAAMA,CAAEf,CAAAA,EAAE,KAAKa,UAAAA,CAAWb,EAAE,CAAA,CAAA;KAElF,EAAA;AAACF,QAAAA;AAAe,KAAA,CAAA;AAGlB;;AAEC,MACD,MAAMoB,WAAAA,GAAcT,WAClB,CAAA,OAAOU,QAAkBC,EAAAA,WAAAA,GAAAA;;QAEvB,MAAMC,eAAAA,GAAkBtB,aAAauB,MAAU,IAAA,CAAA;AAC/C,QAAA,MAAMC,iBAAoBC,GAAAA,KAAAA,CAAMC,IAAI,CAACN,UAAUG,MAAM;AACrD,QAAA,IAAII,YAAuBP,GAAAA,QAAAA;QAE3B,IAAIE,eAAAA,GAAkBE,oBAAoBI,sBAAwB,EAAA;YAChExB,kBAAmB,CAAA;gBACjByB,IAAM,EAAA,QAAA;gBACNC,KAAO,EAAA,sBAAA;AACPC,gBAAAA,OAAAA,EAAS,CAAC,0BAA0B,EAAEH,sBAAAA,CAAuB,MAAM;AACrE,aAAA,CAAA;;AAGA,YAAA,MAAMI,QAAQJ,sBAAyBN,GAAAA,eAAAA;YACvCK,YAAeP,GAAAA,QAAAA,CAASa,KAAK,CAAC,CAAGD,EAAAA,KAAAA,CAAAA;AACnC;;QAGA,KAAK,MAAME,QAAQP,YAAc,CAAA;YAC/B,IAAIO,IAAAA,CAAKC,IAAI,GAAGC,0BAA4B,EAAA;gBAC1ChC,kBAAmB,CAAA;oBACjByB,IAAM,EAAA,QAAA;oBACNC,KAAO,EAAA,kBAAA;oBACPC,OAAS,EAAA;AACX,iBAAA,CAAA;;AAEAJ,gBAAAA,YAAAA,GAAeA,YAAaT,CAAAA,MAAM,CAAC,CAACmB,IAAMA,CAAMH,KAAAA,IAAAA,CAAAA;AAClD;AACF;;QAGA,KAAK,MAAMA,QAAQP,YAAc,CAAA;AAC/B,YAAA,MAAMW,iBAAgC,GAAA;gBACpCrC,EAAIsC,EAAAA,UAAAA,EAAAA;gBACJV,IAAM,EAAA,MAAA;gBACNW,MAAQ,EAAA,SAAA;AACRC,gBAAAA,QAAAA,EAAUP,KAAKQ,IAAI;AACnBC,gBAAAA,SAAAA,EAAWT,KAAKL,IAAI;gBACpBe,GAAK,EAAA;AACP,aAAA;;AAGA7C,YAAAA,cAAAA,CAAe,CAACa,IAAuB,GAAA;AAAIA,oBAAAA,GAAAA,IAAAA;AAAM0B,oBAAAA;AAAkB,iBAAA,CAAA;;AAGnE,YAAA,MAAMO,WAAW,IAAIC,QAAAA,EAAAA;YACrBD,QAASE,CAAAA,MAAM,CAAC,MAAQb,EAAAA,IAAAA,CAAAA;AACxBW,YAAAA,QAAAA,CAASE,MAAM,CAAC,UAAYC,EAAAA,IAAAA,CAAKC,SAAS,CAAC;AAAEP,gBAAAA,IAAAA,EAAMR,KAAKQ,IAAI;gBAAExC,MAAQA,EAAAA;AAAO,aAAA,CAAA,CAAA;;YAG7EK,gBAAiB,CAAA;AAAEsC,gBAAAA;aAChBK,CAAAA,CAAAA,IAAI,CAAC,CAACC,MAAAA,GAAAA;AACL,gBAAA,MAAMrC,aAAaqC,MAAQC,EAAAA,IAAAA;;AAG3B,gBAAA,IAAI,CAACD,MAAAA,IAAUA,MAAOE,CAAAA,KAAK,EAAE;oBAC3BjD,kBAAmB,CAAA;wBACjByB,IAAM,EAAA,QAAA;wBACNC,KAAO,EAAA,yBAAA;AACPC,wBAAAA,OAAAA,EAASoB,QAAQE,KAAS,IAAA,eAAA;wBAC1BC,OAAS,EAAA;AACX,qBAAA,CAAA;oBACArC,gBAAiBqB,CAAAA,iBAAAA,CAAAA;AACjB,oBAAA;AACF;;gBAGAzB,gBAAiB,CAAA;AACfZ,oBAAAA,EAAAA,EAAIqC,kBAAkBrC,EAAE;AACxB2C,oBAAAA,GAAAA,EAAK9B,YAAY8B,GAAO,IAAA,EAAA;oBACxBJ,MAAQ,EAAA;AACV,iBAAA,CAAA;aAEDe,CAAAA,CAAAA,KAAK,CAAC,IAAMtC,gBAAiBqB,CAAAA,iBAAAA,CAAAA,CAAAA;AAClC;AAEA,QAAA,IAAIjB,WAAa,EAAA;YACfjB,kBAAmB,CAAA;gBACjB0B,KAAO,EAAA,gBAAA;gBACPC,OAASV,EAAAA;AACX,aAAA,CAAA;AACF;KAEF,EAAA;AACErB,QAAAA,WAAAA;AACAD,QAAAA,cAAAA;AACAK,QAAAA,kBAAAA;AACAF,QAAAA,MAAAA;AACAK,QAAAA,gBAAAA;AACAU,QAAAA,gBAAAA;AACAJ,QAAAA;AACD,KAAA,CAAA;AAGH;;MAGA,MAAM2C,uBAA0B9C,GAAAA,WAAAA,CAC9B,CAAC+C,KAAAA,GAAAA;AACC,QAAA,IAAI,CAACzD,WAAa,EAAA;AAClBD,QAAAA,cAAAA,CAAeC,YAAYkB,MAAM,CAAC,CAACwC,CAAAA,EAAGC,IAAMA,CAAMF,KAAAA,KAAAA,CAAAA,CAAAA;KAEpD,EAAA;AAAC1D,QAAAA,cAAAA;AAAgBC,QAAAA;AAAY,KAAA,CAAA;IAG/B,OAAO;AAAEA,QAAAA,WAAAA;AAAamB,QAAAA,WAAAA;AAAaV,QAAAA,cAAAA;AAAgBQ,QAAAA,gBAAAA;AAAkBuC,QAAAA;AAAwB,KAAA;AAC/F;;;;"}
|
|
@@ -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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"}
|