@designcrowd/library.brand-page 5.17.28 → 5.18.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 (380) hide show
  1. package/lib/src/{CreatedOnBrandCrowd-de-de-CJZpKPNH.js → CreatedOnBrandCrowd-de-de-xmkupPus.js} +1 -1
  2. package/lib/src/{CreatedOnBrandCrowd-en-us-DkIa7iEb.js → CreatedOnBrandCrowd-en-us-Ck7EdTtb.js} +1 -1
  3. package/lib/src/{CreatedOnBrandCrowd-es-es-CE2p6XHz.js → CreatedOnBrandCrowd-es-es-BC8sJuDH.js} +1 -1
  4. package/lib/src/{CreatedOnBrandCrowd-fr-fr-BBjOZS3M.js → CreatedOnBrandCrowd-fr-ca-CN-UBe1q.js} +1 -1
  5. package/lib/src/{CreatedOnBrandCrowd-fr-ca-BBjOZS3M.js → CreatedOnBrandCrowd-fr-fr-CN-UBe1q.js} +1 -1
  6. package/lib/src/{CreatedOnBrandCrowd-pt-pt-Dayzl4BZ.js → CreatedOnBrandCrowd-pt-br-CajQyNkx.js} +1 -1
  7. package/lib/src/{CreatedOnBrandCrowd-pt-br-Dayzl4BZ.js → CreatedOnBrandCrowd-pt-pt-CajQyNkx.js} +1 -1
  8. package/lib/src/{CreatedOnDcom-de-de-CFzDqfCb.js → CreatedOnDcom-de-de-BRCNMmDq.js} +1 -1
  9. package/lib/src/{CreatedOnDcom-en-us-C2jIPBDY.js → CreatedOnDcom-en-us-BzQDtZhc.js} +1 -1
  10. package/lib/src/{CreatedOnDcom-es-es-qejpzqho.js → CreatedOnDcom-es-es-D-qAM4Cd.js} +1 -1
  11. package/lib/src/{CreatedOnDcom-fr-ca-DMO9Ld7K.js → CreatedOnDcom-fr-ca-CZ1irFOc.js} +1 -1
  12. package/lib/src/{CreatedOnDcom-fr-fr-BFWN9qTP.js → CreatedOnDcom-fr-fr-Gb5BCF0N.js} +1 -1
  13. package/lib/src/{CreatedOnDcom-pt-br-CneD3ghF.js → CreatedOnDcom-pt-br-CAQV0q6o.js} +1 -1
  14. package/lib/src/{CreatedOnDcom-pt-pt-Cg1B7s0o.js → CreatedOnDcom-pt-pt-D6tQdQFh.js} +1 -1
  15. package/lib/src/brand-page/components/image-gallery/ImageGalleryModal.mixin.js +2 -2
  16. package/lib/src/brand-page/models/brand-page-context.model.d.ts +0 -2
  17. package/lib/src/brand-page/models/brand-page-context.model.js +1 -11
  18. package/lib/src/brand-page/models/index.d.ts +1 -0
  19. package/lib/src/brand-page/models/index.js +1 -0
  20. package/lib/src/brand-page/utils/color.util.js +23 -3
  21. package/lib/src/brand-page/utils/raygun.util.d.ts +5 -1
  22. package/lib/src/brand-page/utils/raygun.util.js +7 -2
  23. package/lib/src/brand-page/utils/svg-color.util.js +1 -2
  24. package/lib/src/brand-page/utils/view-model.util.js +1 -1
  25. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.d.ts +1 -31
  26. package/lib/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-page-examples.js +0 -2
  27. package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.d.ts +2 -31
  28. package/lib/src/brand-page-maker/components/preview/Preview.mixin.d.ts +0 -14
  29. package/lib/src/brand-page-maker/components/quick-link-bar/QuickLinkBar.mixin.d.ts +0 -28
  30. package/lib/src/brand-page-maker/components/seo-settings/SeoPageSettings.mixin.d.ts +0 -28
  31. package/lib/src/brand-page-maker/components/seo-settings/UrlSettings.mixin.d.ts +0 -28
  32. package/lib/src/brand-page-maker/components/seo-settings/UseExistingDomainModal.mixin.d.ts +0 -28
  33. package/lib/src/brand-page-maker/components/template-preview/TemplatePreview.mixin.d.ts +0 -28
  34. package/lib/src/brand-page-maker/components/upgrade-to-premium-button/UpgradeToPremiumButton.mixin.d.ts +0 -28
  35. package/lib/src/brand-page-maker/composables/ai-chat/aiErrorCopy.d.ts +35 -0
  36. package/lib/src/brand-page-maker/composables/ai-chat/aiErrorCopy.js +108 -0
  37. package/lib/src/brand-page-maker/composables/ai-chat/{useAiChat.d.ts → types.d.ts} +5 -13
  38. package/lib/src/brand-page-maker/composables/ai-chat/types.js +1 -0
  39. package/lib/src/brand-page-maker/composables/ai-chat/useAiMetadataBuilder.d.ts +19 -0
  40. package/lib/src/brand-page-maker/composables/ai-chat/useAiMetadataBuilder.js +1 -0
  41. package/lib/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.d.ts +1 -1
  42. package/lib/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.js +488 -82
  43. package/lib/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.js +5 -5
  44. package/lib/src/brand-page-maker/composables/useEventTracker.d.ts +6 -16
  45. package/lib/src/brand-page-maker/composables/useEventTracker.js +19 -21
  46. package/lib/src/brand-page-maker/constants/sidebar-constant.d.ts +0 -1
  47. package/lib/src/brand-page-maker/constants/sidebar-constant.js +7 -15
  48. package/lib/src/brand-page-maker/convertors/image-aspect-ratio.convertor.js +2 -2
  49. package/lib/src/brand-page-maker/convertors/text-size-value.convertor.js +3 -1
  50. package/lib/src/brand-page-maker/stores/ai-checkpoint/ai-checkpoint-store.d.ts +30660 -0
  51. package/lib/src/brand-page-maker/stores/ai-checkpoint/ai-checkpoint-store.js +34 -0
  52. package/lib/src/brand-page-maker/stores/ai-thread/ai-website-builder-thread-store.d.ts +1 -1
  53. package/lib/src/brand-page-maker/stores/brandpage-container/brand-page-container-store.d.ts +0 -28
  54. package/lib/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.js +42 -2
  55. package/lib/src/brand-page-maker/stores/index.d.ts +1 -1
  56. package/lib/src/brand-page-maker/stores/index.js +1 -1
  57. package/lib/src/brand-page-maker/stores/user/user-store.js +0 -1
  58. package/lib/src/bundled-translations-CnareLWC.js +175 -0
  59. package/lib/src/bundled-translations.de-DE-2Ys7epLO.js +175 -0
  60. package/lib/src/bundled-translations.es-ES-Cjp-G8rT.js +175 -0
  61. package/lib/src/bundled-translations.fr-CA-CsaW4Oae.js +175 -0
  62. package/lib/src/bundled-translations.fr-FR-DIT2dd8J.js +175 -0
  63. package/lib/src/bundled-translations.pt-BR-BamoBpDW.js +175 -0
  64. package/lib/src/bundled-translations.pt-PT-C9A4hY_e.js +175 -0
  65. package/lib/src/bundles/bundled-translations.de-DE.json +1 -20
  66. package/lib/src/bundles/bundled-translations.es-ES.json +1 -20
  67. package/lib/src/bundles/bundled-translations.fr-CA.json +1 -20
  68. package/lib/src/bundles/bundled-translations.fr-FR.json +1 -20
  69. package/lib/src/bundles/bundled-translations.json +1 -20
  70. package/lib/src/bundles/bundled-translations.pt-BR.json +1 -20
  71. package/lib/src/bundles/bundled-translations.pt-PT.json +1 -20
  72. package/lib/src/clients/ai-assistant-client.d.ts +30 -29
  73. package/lib/src/clients/ai-assistant-client.js +16 -16
  74. package/lib/src/clients/design-template-client.d.ts +0 -2
  75. package/lib/src/clients/design-template-client.js +0 -38
  76. package/lib/src/clients/websocket-gateway-client.d.ts +9 -1
  77. package/lib/src/composables/useTranslate.d.ts +2 -1
  78. package/lib/src/composables/useTranslate.js +2 -1
  79. package/lib/src/constants/ui.d.ts +0 -1
  80. package/lib/src/css/library.brand-page-brandCrowd.min.css +225 -134
  81. package/lib/src/css/library.brand-page-brandPage.min.css +227 -121
  82. package/lib/src/css/library.brand-page-designCom.min.css +225 -134
  83. package/lib/src/css/library.brand-page-preview.min.css +225 -118
  84. package/lib/src/index.d.ts +1 -1
  85. package/lib/src/index.mjs +1 -1
  86. package/lib/src/{lib-33w_DBny.js → lib-CSRUPpSo.js} +30887 -29395
  87. package/lib/src/metadata-builder/ai-metadata-executor.d.ts +21 -0
  88. package/lib/src/metadata-builder/ai-metadata-executor.js +56 -3
  89. package/lib/src/metadata-builder/builders/add-page-builder.d.ts +2 -4
  90. package/lib/src/metadata-builder/builders/add-page-builder.js +5 -8
  91. package/lib/src/metadata-builder/builders/footer-builder.d.ts +11 -0
  92. package/lib/src/metadata-builder/builders/footer-builder.js +151 -0
  93. package/lib/src/metadata-builder/builders/global-styles-builder.d.ts +15 -0
  94. package/lib/src/metadata-builder/builders/global-styles-builder.js +129 -0
  95. package/lib/src/metadata-builder/builders/header-builder.d.ts +11 -0
  96. package/lib/src/metadata-builder/builders/header-builder.js +167 -0
  97. package/lib/src/metadata-builder/builders/rename-page-builder.d.ts +12 -0
  98. package/lib/src/metadata-builder/builders/rename-page-builder.js +49 -0
  99. package/lib/src/metadata-builder/builders/section-builders/about-section-builder.d.ts +2 -0
  100. package/lib/src/metadata-builder/builders/section-builders/about-section-builder.js +44 -4
  101. package/lib/src/metadata-builder/builders/section-builders/banner-section-builder.d.ts +2 -0
  102. package/lib/src/metadata-builder/builders/section-builders/banner-section-builder.js +70 -6
  103. package/lib/src/metadata-builder/builders/section-builders/base-section-builder.d.ts +36 -4
  104. package/lib/src/metadata-builder/builders/section-builders/base-section-builder.js +102 -12
  105. package/lib/src/metadata-builder/builders/section-builders/booking-section-builder.d.ts +8 -0
  106. package/lib/src/metadata-builder/builders/section-builders/booking-section-builder.js +50 -0
  107. package/lib/src/metadata-builder/builders/section-builders/button-section-builder.d.ts +2 -0
  108. package/lib/src/metadata-builder/builders/section-builders/button-section-builder.js +5 -1
  109. package/lib/src/metadata-builder/builders/section-builders/contact-form-builder.d.ts +2 -0
  110. package/lib/src/metadata-builder/builders/section-builders/contact-form-builder.js +47 -3
  111. package/lib/src/metadata-builder/builders/section-builders/delete-section-builder.d.ts +2 -1
  112. package/lib/src/metadata-builder/builders/section-builders/delete-section-builder.js +5 -2
  113. package/lib/src/metadata-builder/builders/section-builders/divider-section-builder.d.ts +2 -0
  114. package/lib/src/metadata-builder/builders/section-builders/divider-section-builder.js +11 -1
  115. package/lib/src/metadata-builder/builders/section-builders/image-gallery-builder.d.ts +2 -0
  116. package/lib/src/metadata-builder/builders/section-builders/image-gallery-builder.js +52 -13
  117. package/lib/src/metadata-builder/builders/section-builders/images-section-builder.d.ts +2 -0
  118. package/lib/src/metadata-builder/builders/section-builders/images-section-builder.js +47 -17
  119. package/lib/src/metadata-builder/builders/section-builders/index.d.ts +1 -0
  120. package/lib/src/metadata-builder/builders/section-builders/index.js +1 -0
  121. package/lib/src/metadata-builder/builders/section-builders/mailing-list-builder.d.ts +2 -0
  122. package/lib/src/metadata-builder/builders/section-builders/mailing-list-builder.js +20 -2
  123. package/lib/src/metadata-builder/builders/section-builders/mailing-list-section-builder.d.ts +2 -0
  124. package/lib/src/metadata-builder/builders/section-builders/mailing-list-section-builder.js +20 -2
  125. package/lib/src/metadata-builder/builders/section-builders/profile-section-builder.d.ts +2 -0
  126. package/lib/src/metadata-builder/builders/section-builders/profile-section-builder.js +36 -2
  127. package/lib/src/metadata-builder/builders/section-builders/shapes-section-builder.d.ts +2 -0
  128. package/lib/src/metadata-builder/builders/section-builders/shapes-section-builder.js +70 -27
  129. package/lib/src/metadata-builder/builders/section-builders/social-links-builder.d.ts +2 -0
  130. package/lib/src/metadata-builder/builders/section-builders/social-links-builder.js +7 -2
  131. package/lib/src/metadata-builder/builders/section-builders/testimonial-section-builder.d.ts +2 -0
  132. package/lib/src/metadata-builder/builders/section-builders/testimonial-section-builder.js +91 -26
  133. package/lib/src/metadata-builder/builders/section-builders/text-section-builder.d.ts +2 -0
  134. package/lib/src/metadata-builder/builders/section-builders/text-section-builder.js +69 -31
  135. package/lib/src/metadata-builder/builders/section-content-factory.d.ts +2 -2
  136. package/lib/src/metadata-builder/builders/section-content-factory.js +8 -2
  137. package/lib/src/metadata-builder/builders/section-field-maps.js +30 -2
  138. package/lib/src/metadata-builder/builders/section-field-utils.d.ts +46 -7
  139. package/lib/src/metadata-builder/builders/section-field-utils.js +86 -62
  140. package/lib/src/metadata-builder/builders/section-rules/about-section.rules.d.ts +2 -0
  141. package/lib/src/metadata-builder/builders/section-rules/about-section.rules.js +20 -0
  142. package/lib/src/metadata-builder/builders/section-rules/add-page.rules.d.ts +7 -0
  143. package/lib/src/metadata-builder/builders/section-rules/add-page.rules.js +8 -0
  144. package/lib/src/metadata-builder/builders/section-rules/banner-section.rules.d.ts +2 -0
  145. package/lib/src/metadata-builder/builders/section-rules/banner-section.rules.js +27 -0
  146. package/lib/src/metadata-builder/builders/section-rules/booking-section.rules.d.ts +2 -0
  147. package/lib/src/metadata-builder/builders/section-rules/booking-section.rules.js +16 -0
  148. package/lib/src/metadata-builder/builders/section-rules/button-section.rules.d.ts +2 -0
  149. package/lib/src/metadata-builder/builders/section-rules/button-section.rules.js +13 -0
  150. package/lib/src/metadata-builder/builders/section-rules/contact-form.rules.d.ts +2 -0
  151. package/lib/src/metadata-builder/builders/section-rules/contact-form.rules.js +16 -0
  152. package/lib/src/metadata-builder/builders/section-rules/divider-section.rules.d.ts +2 -0
  153. package/lib/src/metadata-builder/builders/section-rules/divider-section.rules.js +7 -0
  154. package/lib/src/metadata-builder/builders/section-rules/footer.rules.d.ts +4 -0
  155. package/lib/src/metadata-builder/builders/section-rules/footer.rules.js +5 -0
  156. package/lib/src/metadata-builder/builders/section-rules/global-styles.rules.d.ts +6 -0
  157. package/lib/src/metadata-builder/builders/section-rules/global-styles.rules.js +26 -0
  158. package/lib/src/metadata-builder/builders/section-rules/header.rules.d.ts +4 -0
  159. package/lib/src/metadata-builder/builders/section-rules/header.rules.js +41 -0
  160. package/lib/src/metadata-builder/builders/section-rules/image-gallery.rules.d.ts +2 -0
  161. package/lib/src/metadata-builder/builders/section-rules/image-gallery.rules.js +10 -0
  162. package/lib/src/metadata-builder/builders/section-rules/images-section.rules.d.ts +2 -0
  163. package/lib/src/metadata-builder/builders/section-rules/images-section.rules.js +31 -0
  164. package/lib/src/metadata-builder/builders/section-rules/mailing-list.rules.d.ts +2 -0
  165. package/lib/src/metadata-builder/builders/section-rules/mailing-list.rules.js +11 -0
  166. package/lib/src/metadata-builder/builders/section-rules/profile.rules.d.ts +2 -0
  167. package/lib/src/metadata-builder/builders/section-rules/profile.rules.js +14 -0
  168. package/lib/src/metadata-builder/builders/section-rules/rename-page.rules.d.ts +7 -0
  169. package/lib/src/metadata-builder/builders/section-rules/rename-page.rules.js +8 -0
  170. package/lib/src/metadata-builder/builders/section-rules/shapes-section.rules.d.ts +2 -0
  171. package/lib/src/metadata-builder/builders/section-rules/shapes-section.rules.js +27 -0
  172. package/lib/src/metadata-builder/builders/section-rules/social-links.rules.d.ts +2 -0
  173. package/lib/src/metadata-builder/builders/section-rules/social-links.rules.js +9 -0
  174. package/lib/src/metadata-builder/builders/section-rules/testimonial-section.rules.d.ts +7 -0
  175. package/lib/src/metadata-builder/builders/section-rules/testimonial-section.rules.js +26 -0
  176. package/lib/src/metadata-builder/builders/section-rules/text-section.rules.d.ts +2 -0
  177. package/lib/src/metadata-builder/builders/section-rules/text-section.rules.js +14 -0
  178. package/lib/src/metadata-builder/builders/shape-color-utils.d.ts +26 -0
  179. package/lib/src/metadata-builder/builders/shape-color-utils.js +52 -0
  180. package/lib/src/metadata-builder/builders/undo-builder.d.ts +48 -0
  181. package/lib/src/metadata-builder/builders/undo-builder.js +58 -0
  182. package/lib/src/metadata-builder/builders/update-content-text-style-builder.js +5 -1
  183. package/lib/src/metadata-builder/helpers/rte.helpers.d.ts +15 -4
  184. package/lib/src/metadata-builder/helpers/rte.helpers.js +24 -10
  185. package/lib/src/metadata-builder/metadata-executor.d.ts +2 -1
  186. package/lib/src/metadata-builder/metadata-executor.js +32 -5
  187. package/lib/src/metadata-builder/models.d.ts +26 -1
  188. package/lib/src/metadata-builder/models.js +14 -1
  189. package/lib/src/metadata-builder/parsers/ai-toolcall-parser.d.ts +144 -0
  190. package/lib/src/metadata-builder/parsers/ai-toolcall-parser.js +17 -0
  191. package/lib/src/metadata-builder/parsers/section-tool-arguments.d.ts +113 -24
  192. package/lib/src/metadata-builder/parsers/section-tool-arguments.js +5 -1
  193. package/lib/src/metadata-builder/sanitizers/rte-schema-check.d.ts +22 -0
  194. package/lib/src/metadata-builder/sanitizers/rte-schema-check.js +84 -0
  195. package/lib/src/metadata-builder/sanitizers/sanitizer-rules.d.ts +47 -0
  196. package/lib/src/metadata-builder/sanitizers/sanitizer-rules.js +60 -0
  197. package/lib/src/metadata-builder/sanitizers/section-args-validator.d.ts +41 -0
  198. package/lib/src/metadata-builder/sanitizers/section-args-validator.js +274 -0
  199. package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.d.ts +2 -1
  200. package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.js +2 -16
  201. package/lib/src/shared/content-settings/components/content-settings/ContentSettings.stories.js +0 -1
  202. package/lib/src/shared/content-settings/components/content-settings/ReplaceImageSettingsForContent.mixin.d.ts +2 -1
  203. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItem.mixin.d.ts +2 -3
  204. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.d.ts +0 -4
  205. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.js +6 -8
  206. package/lib/src/shared/content-settings/components/payment-config-field/PaymentConfigField.mixin.d.ts +0 -28
  207. package/lib/src/shared/logo-settings/components/EditLogoSettings.mixin.d.ts +2 -1
  208. package/lib/src/shared/logo-settings/components/LogoSettings.mixin.d.ts +0 -28
  209. package/lib/src/shared/navigation-style-settings/store/index.js +1 -0
  210. package/lib/src/shared/page-navigation/store/page-navigation-store.js +1 -20
  211. package/lib/src/shared/page-navigation/utils/nav-order-utils.d.ts +3 -0
  212. package/lib/src/shared/page-navigation/utils/nav-order-utils.js +20 -0
  213. package/lib/src/shared/page-settings/components/page-settings/PageSettings.mixin.d.ts +2 -30
  214. package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.d.ts +0 -28
  215. package/lib/src/shared/publish-brand-page-with-state/PublishBrandPageModalWithState.mixin.d.ts +2 -43
  216. package/lib/src/shared/side-bar/components/SideBar.mixin.d.ts +0 -30
  217. package/lib/src/shared/side-bar/components/SideBarTabButton.mixin.d.ts +2 -3
  218. package/lib/src/shared/side-bar/store/side-bar-store.d.ts +0 -12
  219. package/lib/src/shared/side-bar/store/side-bar-store.js +0 -7
  220. package/lib/src/shared/style-settings/components/StyleSettings.mixin.d.ts +2 -29
  221. package/lib/src/shared/template-settings/components/TemplatesSettings.mixin.d.ts +2 -1
  222. package/lib/src/utils/build-asset-manifest.d.ts +26 -0
  223. package/lib/src/utils/build-asset-manifest.js +114 -0
  224. package/lib/src/utils/minify-brand-page-metadata.d.ts +49 -1
  225. package/lib/src/utils/minify-brand-page-metadata.js +216 -129
  226. package/package.json +1 -1
  227. package/src/brand-page/components/banner-section/BannerSection.vue +1 -1
  228. package/src/brand-page/components/contact-form/ContactForm.vue +29 -26
  229. package/src/brand-page/components/image-gallery/ImageGalleryModal.mixin.ts +6 -2
  230. package/src/brand-page/components/text-media-section/TextMediaSection.vue +1 -5
  231. package/src/brand-page/models/brand-page-context.model.ts +1 -25
  232. package/src/brand-page/models/index.ts +1 -0
  233. package/src/brand-page/utils/color.util.test.ts +48 -0
  234. package/src/brand-page/utils/color.util.ts +29 -4
  235. package/src/brand-page/utils/raygun.util.ts +11 -2
  236. package/src/brand-page/utils/svg-color.util.ts +1 -3
  237. package/src/brand-page/utils/view-model.util.ts +1 -4
  238. package/src/brand-page-maker/components/ai-text-edit/AiChatbox.vue +2 -2
  239. package/src/brand-page-maker/components/ai-text-edit/AiProgressFeed.vue +162 -0
  240. package/src/brand-page-maker/components/ai-text-edit/TextBubble.vue +57 -5
  241. package/src/brand-page-maker/components/ai-text-edit/i18n/generate-ai.de-DE.json +0 -20
  242. package/src/brand-page-maker/components/ai-text-edit/i18n/generate-ai.es-ES.json +0 -20
  243. package/src/brand-page-maker/components/ai-text-edit/i18n/generate-ai.fr-CA.json +0 -20
  244. package/src/brand-page-maker/components/ai-text-edit/i18n/generate-ai.fr-FR.json +0 -20
  245. package/src/brand-page-maker/components/ai-text-edit/i18n/generate-ai.json +0 -20
  246. package/src/brand-page-maker/components/ai-text-edit/i18n/generate-ai.pt-BR.json +0 -20
  247. package/src/brand-page-maker/components/ai-text-edit/i18n/generate-ai.pt-PT.json +0 -20
  248. package/src/brand-page-maker/components/ai-website-builder/AiWebsiteBuilder.vue +1 -2
  249. package/src/brand-page-maker/components/ai-website-builder/i18n/ai-website-builder.de-DE.json +3 -0
  250. package/src/brand-page-maker/components/ai-website-builder/i18n/ai-website-builder.es-ES.json +3 -0
  251. package/src/brand-page-maker/components/ai-website-builder/i18n/ai-website-builder.fr-CA.json +3 -0
  252. package/src/brand-page-maker/components/ai-website-builder/i18n/ai-website-builder.fr-FR.json +3 -0
  253. package/src/brand-page-maker/components/ai-website-builder/i18n/ai-website-builder.json +3 -0
  254. package/src/brand-page-maker/components/ai-website-builder/i18n/ai-website-builder.pt-BR.json +3 -0
  255. package/src/brand-page-maker/components/ai-website-builder/i18n/ai-website-builder.pt-PT.json +3 -0
  256. package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.vue +3 -28
  257. package/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-page-examples.ts +0 -2
  258. package/src/brand-page-maker/composables/ai-chat/aiErrorCopy.test.ts +229 -0
  259. package/src/brand-page-maker/composables/ai-chat/aiErrorCopy.ts +164 -0
  260. package/src/brand-page-maker/composables/ai-chat/types.ts +49 -0
  261. package/src/brand-page-maker/composables/ai-chat/useAiMetadataBuilder.ts +20 -0
  262. package/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.ts +651 -94
  263. package/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.ts +9 -9
  264. package/src/brand-page-maker/composables/useEventTracker.ts +31 -25
  265. package/src/brand-page-maker/constants/sidebar-constant.ts +7 -15
  266. package/src/brand-page-maker/convertors/image-aspect-ratio.convertor.ts +2 -2
  267. package/src/brand-page-maker/convertors/text-size-value.convertor.ts +3 -3
  268. package/src/brand-page-maker/stores/ai-checkpoint/ai-checkpoint-store.ts +54 -0
  269. package/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.ts +76 -0
  270. package/src/brand-page-maker/stores/index.ts +1 -1
  271. package/src/brand-page-maker/stores/user/user-store.ts +0 -1
  272. package/src/bundles/bundled-translations.de-DE.json +1 -20
  273. package/src/bundles/bundled-translations.es-ES.json +1 -20
  274. package/src/bundles/bundled-translations.fr-CA.json +1 -20
  275. package/src/bundles/bundled-translations.fr-FR.json +1 -20
  276. package/src/bundles/bundled-translations.json +1 -20
  277. package/src/bundles/bundled-translations.pt-BR.json +1 -20
  278. package/src/bundles/bundled-translations.pt-PT.json +1 -20
  279. package/src/clients/ai-assistant-client.ts +59 -46
  280. package/src/clients/design-template-client.ts +0 -66
  281. package/src/clients/websocket-gateway-client.ts +17 -1
  282. package/src/composables/useTranslate.ts +3 -0
  283. package/src/constants/ui.ts +0 -1
  284. package/src/lib.ts +1 -0
  285. package/src/metadata-builder/ai-metadata-executor.ts +94 -1
  286. package/src/metadata-builder/builders/add-page-builder.ts +9 -13
  287. package/src/metadata-builder/builders/footer-builder.test.ts +76 -0
  288. package/src/metadata-builder/builders/footer-builder.ts +226 -0
  289. package/src/metadata-builder/builders/global-styles-builder.ts +187 -0
  290. package/src/metadata-builder/builders/header-builder.test.ts +106 -0
  291. package/src/metadata-builder/builders/header-builder.ts +254 -0
  292. package/src/metadata-builder/builders/rename-page-builder.ts +79 -0
  293. package/src/metadata-builder/builders/section-builders/about-section-builder.ts +73 -5
  294. package/src/metadata-builder/builders/section-builders/banner-section-builder.ts +112 -7
  295. package/src/metadata-builder/builders/section-builders/base-section-builder.ts +149 -11
  296. package/src/metadata-builder/builders/section-builders/booking-section-builder.ts +87 -0
  297. package/src/metadata-builder/builders/section-builders/button-section-builder.ts +6 -1
  298. package/src/metadata-builder/builders/section-builders/contact-form-builder.ts +74 -4
  299. package/src/metadata-builder/builders/section-builders/delete-section-builder.ts +15 -1
  300. package/src/metadata-builder/builders/section-builders/divider-section-builder.ts +13 -1
  301. package/src/metadata-builder/builders/section-builders/image-gallery-builder.ts +91 -31
  302. package/src/metadata-builder/builders/section-builders/images-section-builder.ts +102 -48
  303. package/src/metadata-builder/builders/section-builders/index.ts +1 -0
  304. package/src/metadata-builder/builders/section-builders/mailing-list-builder.ts +38 -2
  305. package/src/metadata-builder/builders/section-builders/mailing-list-section-builder.ts +38 -2
  306. package/src/metadata-builder/builders/section-builders/profile-section-builder.ts +55 -3
  307. package/src/metadata-builder/builders/section-builders/shapes-section-builder.ts +170 -77
  308. package/src/metadata-builder/builders/section-builders/social-links-builder.test.ts +119 -0
  309. package/src/metadata-builder/builders/section-builders/social-links-builder.ts +13 -2
  310. package/src/metadata-builder/builders/section-builders/testimonial-section-builder.ts +178 -57
  311. package/src/metadata-builder/builders/section-builders/text-section-builder.ts +130 -30
  312. package/src/metadata-builder/builders/section-content-factory.ts +15 -2
  313. package/src/metadata-builder/builders/section-field-maps.ts +34 -1
  314. package/src/metadata-builder/builders/section-field-utils.ts +131 -72
  315. package/src/metadata-builder/builders/section-rules/about-section.rules.ts +38 -0
  316. package/src/metadata-builder/builders/section-rules/add-page.rules.ts +17 -0
  317. package/src/metadata-builder/builders/section-rules/banner-section.rules.ts +49 -0
  318. package/src/metadata-builder/builders/section-rules/booking-section.rules.ts +34 -0
  319. package/src/metadata-builder/builders/section-rules/button-section.rules.ts +22 -0
  320. package/src/metadata-builder/builders/section-rules/contact-form.rules.ts +30 -0
  321. package/src/metadata-builder/builders/section-rules/divider-section.rules.ts +17 -0
  322. package/src/metadata-builder/builders/section-rules/footer.rules.ts +21 -0
  323. package/src/metadata-builder/builders/section-rules/global-styles.rules.ts +44 -0
  324. package/src/metadata-builder/builders/section-rules/header.rules.ts +75 -0
  325. package/src/metadata-builder/builders/section-rules/image-gallery.rules.ts +22 -0
  326. package/src/metadata-builder/builders/section-rules/images-section.rules.ts +55 -0
  327. package/src/metadata-builder/builders/section-rules/mailing-list.rules.ts +21 -0
  328. package/src/metadata-builder/builders/section-rules/profile.rules.ts +27 -0
  329. package/src/metadata-builder/builders/section-rules/rename-page.rules.ts +17 -0
  330. package/src/metadata-builder/builders/section-rules/shapes-section.rules.ts +51 -0
  331. package/src/metadata-builder/builders/section-rules/social-links.rules.ts +27 -0
  332. package/src/metadata-builder/builders/section-rules/testimonial-section.rules.ts +48 -0
  333. package/src/metadata-builder/builders/section-rules/text-section.rules.ts +28 -0
  334. package/src/metadata-builder/builders/shape-color-utils.test.ts +115 -0
  335. package/src/metadata-builder/builders/shape-color-utils.ts +75 -0
  336. package/src/metadata-builder/builders/undo-builder.ts +105 -0
  337. package/src/metadata-builder/builders/update-content-text-style-builder.ts +4 -1
  338. package/src/metadata-builder/helpers/rte.helpers.ts +27 -13
  339. package/src/metadata-builder/metadata-executor.ts +42 -2
  340. package/src/metadata-builder/models.ts +39 -1
  341. package/src/metadata-builder/parsers/ai-toolcall-parser.ts +152 -0
  342. package/src/metadata-builder/parsers/section-tool-arguments.ts +138 -24
  343. package/src/metadata-builder/sanitizers/__tests__/section-args-validator.test.ts +659 -0
  344. package/src/metadata-builder/sanitizers/rte-schema-check.ts +99 -0
  345. package/src/metadata-builder/sanitizers/sanitizer-rules.ts +97 -0
  346. package/src/metadata-builder/sanitizers/section-args-validator.ts +445 -0
  347. package/src/shared/content-settings/components/content-settings/ContentSettings.mixin.ts +10 -16
  348. package/src/shared/content-settings/components/content-settings/ContentSettings.stories.ts +0 -1
  349. package/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.ts +6 -10
  350. package/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.vue +1 -23
  351. package/src/shared/content-settings/components/testimonial-items-field/TestimonialItemsField.vue +0 -15
  352. package/src/shared/content-settings/components/text-items-field/TextItemsField.vue +0 -15
  353. package/src/shared/navigation-style-settings/store/index.ts +5 -0
  354. package/src/shared/page-navigation/store/page-navigation-store.ts +4 -31
  355. package/src/shared/page-navigation/utils/nav-order-utils.ts +32 -0
  356. package/src/shared/side-bar/components/SideBar.vue +14 -1
  357. package/src/shared/side-bar/store/side-bar-store.ts +0 -20
  358. package/src/utils/build-asset-manifest.ts +153 -0
  359. package/src/utils/minify-brand-page-metadata.ts +362 -130
  360. package/lib/src/brand-page-maker/composables/ai-chat/useAiChat.js +0 -368
  361. package/lib/src/brand-page-maker/composables/ai-chat/useAiTextEditPrompts.d.ts +0 -18
  362. package/lib/src/brand-page-maker/composables/ai-chat/useAiTextEditPrompts.js +0 -144
  363. package/lib/src/brand-page-maker/stores/ai-thread/ai-thread-store.d.ts +0 -155
  364. package/lib/src/brand-page-maker/stores/ai-thread/ai-thread-store.js +0 -25
  365. package/lib/src/brand-page-maker/utils/mixpanel.util.d.ts +0 -1
  366. package/lib/src/brand-page-maker/utils/mixpanel.util.js +0 -29
  367. package/lib/src/bundled-translations-CNK7l6_v.js +0 -173
  368. package/lib/src/bundled-translations.de-DE-BLE4_y0H.js +0 -173
  369. package/lib/src/bundled-translations.es-ES-thO9osbg.js +0 -173
  370. package/lib/src/bundled-translations.fr-CA-BZkhiNgU.js +0 -173
  371. package/lib/src/bundled-translations.fr-FR-bhDLPKgZ.js +0 -173
  372. package/lib/src/bundled-translations.pt-BR-CI9a5Bq1.js +0 -173
  373. package/lib/src/bundled-translations.pt-PT-DBoErBaq.js +0 -173
  374. package/src/brand-page-maker/components/ai-text-edit/AiTextEdit.vue +0 -154
  375. package/src/brand-page-maker/composables/ai-chat/useAiChat.ts +0 -562
  376. package/src/brand-page-maker/composables/ai-chat/useAiTextEditPrompts.ts +0 -196
  377. package/src/brand-page-maker/stores/ai-thread/ai-thread-store.ts +0 -31
  378. package/src/brand-page-maker/utils/mixpanel.util.ts +0 -42
  379. package/src/shared/content-settings/components/generate-ai-button/GenerateAiButton.vue +0 -114
  380. package/src/shared/content-settings/components/generate-ai-modal/GenerateAiModal.vue +0 -761
@@ -1,154 +0,0 @@
1
- <template>
2
- <div class="ai-container">
3
- <div class="tw-px-5">
4
- <SideBarSettingsHeader
5
- title="AI Text Edit"
6
- :show-back-button="true"
7
- @on-back="onBack"
8
- />
9
- </div>
10
- <AiChatbox
11
- v-model="promptText"
12
- :messages="formattedMessages"
13
- :suggested-prompts="suggestedPrompts"
14
- :disabled="isProcessing"
15
- class="tw-flex-1 tw-overflow-hidden tw-px-5"
16
- @send="onSendMessage"
17
- @stop-generation="onStopGeneration"
18
- @prompt-click="onPromptClick"
19
- />
20
- </div>
21
- </template>
22
-
23
- <script setup lang="ts">
24
- import { ref, computed, onMounted } from 'vue';
25
- import SideBarSettingsHeader from '../../../shared/common/SideBarSettingsHeader.vue';
26
- import AiChatbox from './AiChatbox.vue';
27
- import { useUiSideBarStore } from '../../../shared/side-bar/store';
28
- import { useSnapshotStore, useAiThreadStore } from '../../stores';
29
- import { SIDE_BAR_TAB_NAMES } from '../../constants';
30
- import {
31
- useAiChat,
32
- createWelcomeMessage,
33
- } from '../../composables/ai-chat/useAiChat';
34
- import { useAiTextEditPrompts } from '../../composables/ai-chat/useAiTextEditPrompts';
35
- import {
36
- GENERATE_TEXT_CONTINUATION_EVENTS,
37
- useEventTracker,
38
- } from '../../composables/useEventTracker';
39
-
40
- const sideBarStore = useUiSideBarStore();
41
- const snapshotStore = useSnapshotStore();
42
- const eventTracker = useEventTracker();
43
-
44
- const emit = defineEmits<{
45
- back: [];
46
- 'use-text': [text: string];
47
- 'capture-preview-snapshot': [];
48
- }>();
49
-
50
- const promptText = ref('');
51
-
52
- // Get the context from the sidebar store
53
- const aiContext = computed(() => sideBarStore.aiTextEditContext);
54
-
55
- // Computed cta location for event tracking
56
- const ctaLocation = computed(() => aiContext.value?.contentType || '');
57
-
58
- // Computed values that update reactively
59
- const currentValue = computed(() => aiContext.value?.fieldValue || '');
60
-
61
- // Use the AI chat composable
62
- const {
63
- isProcessing,
64
- sendMessageAsync,
65
- formattedMessages,
66
- stopGenerationAsync,
67
- } = useAiChat({
68
- currentValue: currentValue.value,
69
- fieldId: aiContext.value?.fieldId || '',
70
- fieldName: aiContext.value?.fieldName || '',
71
- contentType: aiContext.value?.contentType || '',
72
- maxChars: aiContext.value?.maxChars,
73
- textStyle: aiContext.value?.textStyle,
74
- });
75
-
76
- // Use the prompts composable for suggested prompts
77
- const { suggestedPrompts } = useAiTextEditPrompts({
78
- aiContext,
79
- ctaLocation,
80
- isProcessing,
81
- promptText,
82
- });
83
-
84
- const onBack = () => {
85
- if (ctaLocation.value) {
86
- eventTracker.sendGenerateTextContinuationEvent(
87
- ctaLocation.value,
88
- GENERATE_TEXT_CONTINUATION_EVENTS.EXIT,
89
- );
90
- }
91
-
92
- sideBarStore.clearAiTextEditContext();
93
- sideBarStore.setSelectedTabName({
94
- tabName: SIDE_BAR_TAB_NAMES.CONTENT_SETTINGS,
95
- });
96
- emit('back');
97
- };
98
-
99
- const onSendMessage = async (text: string) => {
100
- eventTracker.sendAiSendPromptEvent(ctaLocation.value);
101
- await sendMessageAsync({ text });
102
- };
103
-
104
- const onStopGeneration = async () => {
105
- if (ctaLocation.value) {
106
- eventTracker.sendAiStopGenerationEvent(ctaLocation.value);
107
- }
108
- await stopGenerationAsync();
109
- };
110
-
111
- const onPromptClick = (prompt: any) => {
112
- if (prompt.handler) {
113
- prompt.handler();
114
- }
115
- };
116
-
117
- // Expose stopGeneration for parent component to call
118
- defineExpose({
119
- stopGeneration: onStopGeneration,
120
- });
121
-
122
- onMounted(() => {
123
- const aiThreadStore = useAiThreadStore();
124
-
125
- // Only add a new welcome message if there are existing messages (conversation has started)
126
- if (aiThreadStore.messages.length > 0) {
127
- const newMessage = createWelcomeMessage(currentValue.value);
128
- const lastMessage =
129
- aiThreadStore.messages[aiThreadStore.messages.length - 1];
130
-
131
- // Only add if the last message is different from the new welcome message
132
- if (lastMessage.text !== newMessage.text) {
133
- aiThreadStore.addThreadItem(newMessage);
134
- }
135
- }
136
-
137
- snapshotStore.clearSnapshot();
138
- setTimeout(() => {
139
- emit('capture-preview-snapshot');
140
- }, 50);
141
- });
142
- </script>
143
- <style>
144
- .ai-container {
145
- height: calc(100dvh - (90px + 58px));
146
- @apply tw-flex tw-flex-col tw--mx-5;
147
- }
148
-
149
- @screen lg {
150
- .ai-container {
151
- height: calc(100dvh - 90px);
152
- }
153
- }
154
- </style>
@@ -1,562 +0,0 @@
1
- import {
2
- ref,
3
- computed,
4
- watch,
5
- nextTick,
6
- type ComputedRef,
7
- type Ref,
8
- } from 'vue';
9
- import {
10
- getInstance as getAiAssistantClient,
11
- AI_ASSISTANT_AGENT_TYPES,
12
- buildWebsiteTextElementMessage,
13
- type AiAssistantResponse,
14
- type AiAssistantToolCall,
15
- type AiAssistantToolResult,
16
- } from '../../../clients/ai-assistant-client';
17
- import { getCurrentLocale } from '../../../composables/useTranslate';
18
- import { storeToRefs } from 'pinia';
19
- import { useSnapshotStore, useAiThreadStore } from '../../stores';
20
- import { useBrandPageMakerStore } from '../../stores';
21
- import { useUiPageSettingsStore } from '../../../shared/page-settings/store';
22
- import { useAiMetadataBuilder } from '../ai-chat/useAiMetadataBuilder';
23
- import { Logger } from '../../../metadata-builder/logger';
24
-
25
- export interface BaseThreadMessage {
26
- id: string;
27
- role: 'user' | 'agent';
28
- isTyping?: boolean;
29
- isError?: boolean;
30
- timestamp: Date;
31
- langChainUrl?: string;
32
- }
33
-
34
- export interface TextThreadMessage extends BaseThreadMessage {
35
- type: 'text';
36
- text: string;
37
- }
38
-
39
- export interface ImageThreadMessage extends BaseThreadMessage {
40
- type: 'image';
41
- images: { url: string; alt?: string }[];
42
- text?: string;
43
- }
44
-
45
- export type ThreadMessage = TextThreadMessage | ImageThreadMessage;
46
-
47
- export interface SendMessageOptions {
48
- text?: string;
49
- images?: { url: string; alt?: string }[];
50
- }
51
-
52
- export interface UseAiChatOptions {
53
- currentValue?: string;
54
- fieldId: string;
55
- fieldName: string;
56
- contentType: string;
57
- maxChars?: number;
58
- textStyle?: BrandPageCssStyle;
59
- onTextUpdate?: (text: string) => void;
60
- onStyleUpdate?: (style: BrandPageCssStyle) => void;
61
- }
62
-
63
- export interface UseAiChatResult {
64
- threadItems: Ref<ThreadMessage[]>;
65
- isProcessing: Ref<boolean>;
66
- currentTypingMessageId: Ref<string | null>;
67
- generatedText: Ref<string | null>;
68
- generatedStyle: Ref<BrandPageCssStyle | null>;
69
- sendMessageAsync: (options: SendMessageOptions) => Promise<void>;
70
- deleteMessage: (messageId: string) => void;
71
- stopGenerationAsync: () => Promise<void>;
72
- formattedMessages: ComputedRef<
73
- {
74
- type: string;
75
- props: Record<string, unknown>;
76
- }[]
77
- >;
78
- }
79
-
80
- const MAX_TOOL_CALL_ITERATIONS = 5;
81
-
82
- const TEXT_DISPLAY_LIMIT = 150;
83
-
84
- const truncateText = (text: string): string => {
85
- if (text.length <= TEXT_DISPLAY_LIMIT) return text;
86
-
87
- return text.substring(0, TEXT_DISPLAY_LIMIT).trimEnd() + '...';
88
- };
89
-
90
- export const createWelcomeMessage = (
91
- currentValue: string,
92
- ): TextThreadMessage => ({
93
- id: `welcome-${Date.now()}`,
94
- type: 'text',
95
- role: 'agent',
96
- text: currentValue
97
- ? `What changes would you like to make to the text?<br><br><strong>Current Text:</strong> "${truncateText(currentValue)}"`
98
- : 'What would you like to generate?',
99
- timestamp: new Date(),
100
- });
101
-
102
- export function useAiChat(options: UseAiChatOptions): UseAiChatResult {
103
- const aiThreadStore = useAiThreadStore();
104
- const snapshotStore = useSnapshotStore();
105
- const brandPageMakerStore = useBrandPageMakerStore();
106
- const pageSettingsStore = useUiPageSettingsStore();
107
- const aiLogger = new Logger(!brandPageMakerStore.isProduction);
108
- const aiMetadataBuilder = useAiMetadataBuilder(aiLogger);
109
-
110
- const hasStoredMessages = aiThreadStore.messages.length > 0;
111
-
112
- if (!hasStoredMessages) {
113
- aiThreadStore.addThreadItem(
114
- createWelcomeMessage(options?.currentValue || ''),
115
- );
116
- }
117
-
118
- const { messages: threadItems } = storeToRefs(aiThreadStore);
119
- const isProcessing = ref(false);
120
-
121
- watch(isProcessing, (newValue) => {
122
- aiThreadStore.isProcessing = newValue;
123
- });
124
-
125
- const currentTypingMessageId = ref<string | null>(null);
126
- const isStopped = ref(false);
127
- const generatedText = ref<string | null>(null);
128
- const generatedStyle = ref<BrandPageCssStyle | null>(null);
129
- const pendingToolCalls = ref<AiAssistantToolCall[]>([]);
130
-
131
- // Sequential queue so the AI thread always sees message → toolCall → message → toolCall.
132
- // Operations that were flagged as stopped are skipped when they reach the front of the queue.
133
- let operationQueue: Promise<void> = Promise.resolve();
134
-
135
- const enqueueOperationAsync = (fn: () => Promise<void>): Promise<void> => {
136
- operationQueue = operationQueue.then(fn, fn);
137
-
138
- return operationQueue;
139
- };
140
-
141
- const buildMessage = (userPrompt: string) => {
142
- return buildWebsiteTextElementMessage({
143
- pageId: pageSettingsStore.currentPage?.id || '',
144
- contentType: options.contentType,
145
- fieldName: options.fieldName,
146
- contentId: options.fieldId,
147
- businessName: brandPageMakerStore.businessName || undefined,
148
- industry: brandPageMakerStore.industry || undefined,
149
- locale: getCurrentLocale(),
150
- maxChars: options.maxChars,
151
- userPrompt,
152
- metadata: {
153
- text: options.currentValue || '',
154
- style: options.textStyle,
155
- },
156
- });
157
- };
158
-
159
- const applyToolCallsAsync = async (response: AiAssistantResponse) => {
160
- let aiMessage: string | null = response.message || '';
161
-
162
- const modelToUpdate = brandPageMakerStore.brandPageData;
163
-
164
- const updateResult = await aiMetadataBuilder.applyAiToolCallsAsync(
165
- modelToUpdate,
166
- response.toolCalls || [],
167
- {
168
- maxCharacters: options.maxChars,
169
- },
170
- );
171
-
172
- const toolResults: AiAssistantToolResult[] = updateResult.results.map(
173
- (x) => {
174
- return {
175
- toolId: x.toolId,
176
- success:
177
- x.errors && x.errors.length > 0 ? x.errors.join(',') : 'success',
178
- };
179
- },
180
- );
181
-
182
- updateResult.parsedToolCalls.forEach((toolCall) => {
183
- const message = toolCall.arguments.message as string | undefined;
184
-
185
- if (message) {
186
- aiMessage = aiMessage ? `${aiMessage} ${message}` : message;
187
- }
188
- });
189
-
190
- await brandPageMakerStore.initialiseStoresByBrandPageModelAsync(
191
- updateResult.model,
192
- );
193
-
194
- // Allow Vue to process reactive updates
195
- await nextTick();
196
-
197
- // Re-capture snapshot so subsequent messages reflect the updated page
198
- await snapshotStore.refreshSnapshotAsync();
199
-
200
- return {
201
- shouldContinue: toolResults.length > 0 && aiThreadStore.runId !== null,
202
- toolResults,
203
- aiMessage,
204
- };
205
- };
206
-
207
- const submitToolResults = async (toolResults: AiAssistantToolResult[]) => {
208
- if (!aiThreadStore.threadId || !aiThreadStore.runId || !toolResults.length)
209
- return null;
210
-
211
- const client = getAiAssistantClient();
212
- const { response } = await client.submitWebsiteToolCallOutputAsync(
213
- aiThreadStore.threadId,
214
- {
215
- runId: aiThreadStore.runId,
216
- toolCalls: toolResults,
217
- agentType: AI_ASSISTANT_AGENT_TYPES.WEBSITE_TEXT_ELEMENT,
218
- websiteSnapshot: snapshotStore.snapshotBase64 || undefined,
219
- },
220
- );
221
-
222
- return response;
223
- };
224
-
225
- /**
226
- * Submit cancellation results for any pending tool calls so the AI run
227
- * does not remain stuck in a "requires_action" state.
228
- */
229
- const submitCancelledToolCallsAsync = async (): Promise<void> => {
230
- const toolCalls = pendingToolCalls.value;
231
-
232
- if (
233
- toolCalls.length === 0 ||
234
- !aiThreadStore.threadId ||
235
- !aiThreadStore.runId
236
- ) {
237
- return;
238
- }
239
-
240
- const cancelledResults: AiAssistantToolResult[] = toolCalls.map((tc) => ({
241
- toolId: tc.toolId,
242
- success: 'success', // Mark as success to prevent retries, even though the tool call was not completed
243
- }));
244
-
245
- pendingToolCalls.value = [];
246
-
247
- try {
248
- const client = getAiAssistantClient();
249
-
250
- await client.submitWebsiteToolCallOutputAsync(aiThreadStore.threadId, {
251
- runId: aiThreadStore.runId,
252
- toolCalls: cancelledResults,
253
- agentType: AI_ASSISTANT_AGENT_TYPES.WEBSITE_TEXT_ELEMENT,
254
- });
255
- } catch {
256
- // Best-effort cancellation – silently ignore submission failures
257
- }
258
- };
259
-
260
- const callApiAsync = async (
261
- userPrompt: string,
262
- ): Promise<{ text: string | null; langChainUrl?: string }> => {
263
- generatedText.value = null;
264
- generatedStyle.value = null;
265
-
266
- const client = getAiAssistantClient();
267
-
268
- let aiAssistantResponse: AiAssistantResponse = {} as AiAssistantResponse;
269
-
270
- if (!aiThreadStore.threadId) {
271
- const { response } = await client.createWebsiteThreadAndSendMessageAsync({
272
- message: buildMessage(userPrompt || ''),
273
- websiteSnapshot: snapshotStore.snapshotBase64 || undefined,
274
- agentType: AI_ASSISTANT_AGENT_TYPES.WEBSITE_TEXT_ELEMENT,
275
- });
276
-
277
- aiAssistantResponse = response;
278
-
279
- aiThreadStore.threadId = response.threadId;
280
- aiThreadStore.runId = response.runId || null;
281
- } else {
282
- const { response } = await client.sendWebsiteMessageAsync(
283
- aiThreadStore.threadId!,
284
- {
285
- message: buildMessage(userPrompt),
286
- websiteSnapshot: snapshotStore.snapshotBase64 || undefined,
287
- agentType: AI_ASSISTANT_AGENT_TYPES.WEBSITE_TEXT_ELEMENT,
288
- },
289
- );
290
-
291
- aiAssistantResponse = response;
292
- }
293
-
294
- aiLogger.log('callApiAsync response', {
295
- aiAssistantResponse,
296
- });
297
-
298
- if (
299
- aiAssistantResponse.toolCalls &&
300
- aiAssistantResponse.toolCalls.length > 0
301
- ) {
302
- pendingToolCalls.value = aiAssistantResponse.toolCalls;
303
- }
304
-
305
- if (isStopped.value) {
306
- await submitCancelledToolCallsAsync();
307
-
308
- return { text: null };
309
- }
310
-
311
- const handledResponse = await handleAiResponseAsync(aiAssistantResponse);
312
-
313
- return {
314
- text:
315
- handledResponse.aiMessage ||
316
- 'I was unable to generate text. Please try again.',
317
- langChainUrl: aiAssistantResponse.langChainUrl,
318
- };
319
- };
320
-
321
- const handleToolResponseAsync = async (
322
- response: AiAssistantResponse,
323
- ): Promise<{
324
- aiMessage: string | null;
325
- }> => {
326
- let { shouldContinue, toolResults, aiMessage } =
327
- await applyToolCallsAsync(response);
328
-
329
- let iterations = 0;
330
-
331
- while (shouldContinue && iterations < MAX_TOOL_CALL_ITERATIONS) {
332
- if (isStopped.value) {
333
- await submitCancelledToolCallsAsync();
334
-
335
- return { aiMessage: '' };
336
- }
337
-
338
- const nextResponse = await submitToolResults(toolResults);
339
-
340
- pendingToolCalls.value = []; // Cleared after successful submission
341
-
342
- aiLogger.log('handleToolResponseAsync submitToolResults', {
343
- toolResults,
344
- nextResponse,
345
- });
346
-
347
- if (!nextResponse) break;
348
-
349
- // Track new pending tool calls from the follow-up response
350
- if (nextResponse.toolCalls && nextResponse.toolCalls.length > 0) {
351
- pendingToolCalls.value = nextResponse.toolCalls;
352
- }
353
-
354
- if (isStopped.value) {
355
- await submitCancelledToolCallsAsync();
356
-
357
- return { aiMessage: '' };
358
- }
359
-
360
- const retryResult = await applyToolCallsAsync(nextResponse);
361
-
362
- shouldContinue = retryResult.shouldContinue;
363
- toolResults = retryResult.toolResults;
364
- aiMessage = retryResult.aiMessage || aiMessage;
365
- iterations += 1;
366
- }
367
-
368
- pendingToolCalls.value = [];
369
-
370
- return {
371
- aiMessage,
372
- };
373
- };
374
-
375
- const handleAiResponseAsync = async (
376
- response: AiAssistantResponse,
377
- ): Promise<{
378
- aiMessage: string | null;
379
- }> => {
380
- let aiMessageResult: string | null = response.message || '';
381
-
382
- if (response.toolCalls && response.toolCalls.length > 0) {
383
- const toolResult = await handleToolResponseAsync(response);
384
-
385
- aiMessageResult = toolResult.aiMessage || aiMessageResult;
386
-
387
- aiLogger.log('handleAiResponseAsync toolResult', {
388
- toolResult,
389
- });
390
- }
391
-
392
- return {
393
- aiMessage: aiMessageResult,
394
- };
395
- };
396
-
397
- const sendMessageAsync = async (
398
- messageOptions: SendMessageOptions,
399
- ): Promise<void> => {
400
- const { text, images } = messageOptions;
401
-
402
- if (!text?.trim() && (!images || images.length === 0)) return;
403
-
404
- await enqueueOperationAsync(async () => {
405
- isStopped.value = false;
406
- isProcessing.value = true;
407
-
408
- const userMessage: ThreadMessage = images
409
- ? {
410
- id: Date.now().toString(),
411
- type: 'image' as const,
412
- role: 'user' as const,
413
- images,
414
- text,
415
- timestamp: new Date(),
416
- }
417
- : {
418
- id: Date.now().toString(),
419
- type: 'text' as const,
420
- role: 'user' as const,
421
- text: text || '',
422
- timestamp: new Date(),
423
- };
424
-
425
- aiThreadStore.addThreadItem(userMessage);
426
-
427
- const agentMessageId = (Date.now() + 1).toString();
428
-
429
- currentTypingMessageId.value = agentMessageId;
430
- const agentMessage: TextThreadMessage = {
431
- id: agentMessageId,
432
- type: 'text' as const,
433
- role: 'agent' as const,
434
- text: '',
435
- isTyping: true,
436
- timestamp: new Date(),
437
- };
438
-
439
- aiThreadStore.addThreadItem(agentMessage);
440
-
441
- try {
442
- aiLogger.startGroup();
443
- aiLogger.log('sendMessageAsync', {
444
- messageOptions,
445
- });
446
-
447
- const apiResult = await callApiAsync(text || '');
448
-
449
- if (isStopped.value) return;
450
-
451
- const messageIndex = threadItems.value.findIndex(
452
- (msg) => msg.id === agentMessageId,
453
- );
454
-
455
- if (messageIndex !== -1) {
456
- if (apiResult.text) {
457
- threadItems.value[messageIndex].text = apiResult.text;
458
- threadItems.value[messageIndex].isTyping = false;
459
- threadItems.value[messageIndex].langChainUrl =
460
- apiResult.langChainUrl;
461
-
462
- if (generatedText.value && options.onTextUpdate) {
463
- options.onTextUpdate(generatedText.value);
464
- }
465
-
466
- if (generatedStyle.value && options.onStyleUpdate) {
467
- options.onStyleUpdate(generatedStyle.value);
468
- }
469
- } else {
470
- threadItems.value[messageIndex].text =
471
- 'Failed to generate text. Please try again.';
472
- threadItems.value[messageIndex].isTyping = false;
473
- threadItems.value[messageIndex].isError = true;
474
- }
475
- }
476
- } catch (error: any) {
477
- if (isStopped.value) return;
478
-
479
- const messageIndex = threadItems.value.findIndex(
480
- (msg) => msg.id === agentMessageId,
481
- );
482
-
483
- if (messageIndex !== -1) {
484
- threadItems.value[messageIndex].text =
485
- error?.response?.data?.error ||
486
- 'An error occurred. Please try again.';
487
- threadItems.value[messageIndex].isTyping = false;
488
- threadItems.value[messageIndex].isError = true;
489
- }
490
- } finally {
491
- currentTypingMessageId.value = null;
492
- isProcessing.value = false;
493
- }
494
- });
495
- };
496
-
497
- const deleteMessage = (messageId: string) => {
498
- const index = threadItems.value.findIndex((msg) => msg.id === messageId);
499
-
500
- if (index !== -1) {
501
- threadItems.value.splice(index, 1);
502
- }
503
- };
504
-
505
- /**
506
- * Stop generation, remove the typing message, and submit cancellation
507
- * for any pending tool calls so the AI run does not throw errors.
508
- */
509
- const stopGenerationAsync = async (): Promise<void> => {
510
- // Set the flag immediately so any in-flight operation can check it
511
- isStopped.value = true;
512
-
513
- if (currentTypingMessageId.value) {
514
- deleteMessage(currentTypingMessageId.value);
515
- currentTypingMessageId.value = null;
516
- }
517
-
518
- isProcessing.value = false;
519
-
520
- // Enqueue cancellation — runs once the in-flight operation bails out via isStopped checks
521
- await enqueueOperationAsync(async () => {
522
- await submitCancelledToolCallsAsync();
523
- });
524
- };
525
-
526
- // Register stopGenerationAsync in the store so parent components
527
- // (e.g. BrandPageMaker overlay) can call it without needing a $ref to AiTextEdit
528
- aiThreadStore.stopGeneration = stopGenerationAsync;
529
-
530
- const formattedMessages = computed(() => {
531
- const initialMessageCount = hasStoredMessages
532
- ? aiThreadStore.messages.length
533
- : 1;
534
-
535
- return threadItems.value.map((msg, index) => ({
536
- type: msg.type,
537
- props: {
538
- ...(msg.type === 'text' && { text: msg.text }),
539
- ...(msg.type === 'image' && { images: msg.images, text: msg.text }),
540
- isUser: msg.role === 'user',
541
- isAi: msg.role === 'agent',
542
- showIcon: msg.role === 'agent',
543
- isTyping: msg.isTyping,
544
- isResponse: index >= 1,
545
- disableAnimation: index < initialMessageCount,
546
- langChainUrl: msg.langChainUrl,
547
- } as Record<string, unknown>,
548
- }));
549
- });
550
-
551
- return {
552
- threadItems,
553
- isProcessing,
554
- currentTypingMessageId,
555
- generatedText,
556
- generatedStyle,
557
- sendMessageAsync,
558
- deleteMessage,
559
- stopGenerationAsync,
560
- formattedMessages,
561
- };
562
- }