@designcrowd/library.brand-page 5.17.4 → 5.17.5-ai-tab-1

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 (160) hide show
  1. package/lib/src/{CreatedOnBrandCrowd-de-de-C_NzyXvG.js → CreatedOnBrandCrowd-de-de-CtODijXU.js} +1 -1
  2. package/lib/src/{CreatedOnBrandCrowd-en-us-DSmpdByg.js → CreatedOnBrandCrowd-en-us-CFOzipix.js} +1 -1
  3. package/lib/src/{CreatedOnBrandCrowd-es-es-4O9ttd4y.js → CreatedOnBrandCrowd-es-es-Bed6cQwT.js} +1 -1
  4. package/lib/src/{CreatedOnBrandCrowd-fr-fr-DDr8rQHb.js → CreatedOnBrandCrowd-fr-ca-CDtut9SG.js} +1 -1
  5. package/lib/src/{CreatedOnBrandCrowd-fr-ca-DDr8rQHb.js → CreatedOnBrandCrowd-fr-fr-CDtut9SG.js} +1 -1
  6. package/lib/src/{CreatedOnBrandCrowd-pt-pt-BUTVQ17i.js → CreatedOnBrandCrowd-pt-br-BxubZ9Pn.js} +1 -1
  7. package/lib/src/{CreatedOnBrandCrowd-pt-br-BUTVQ17i.js → CreatedOnBrandCrowd-pt-pt-BxubZ9Pn.js} +1 -1
  8. package/lib/src/{CreatedOnDcom-de-de-thkGl7gg.js → CreatedOnDcom-de-de-Bpi74lME.js} +1 -1
  9. package/lib/src/{CreatedOnDcom-en-us-DOgnHkVR.js → CreatedOnDcom-en-us-DcV-Kjz6.js} +1 -1
  10. package/lib/src/{CreatedOnDcom-es-es-NyEB16vO.js → CreatedOnDcom-es-es-G_POK1Z1.js} +1 -1
  11. package/lib/src/{CreatedOnDcom-fr-ca-Cd6WjWcu.js → CreatedOnDcom-fr-ca-B-6Lowfi.js} +1 -1
  12. package/lib/src/{CreatedOnDcom-fr-fr-CDKX35U7.js → CreatedOnDcom-fr-fr-Cd3WjtRX.js} +1 -1
  13. package/lib/src/{CreatedOnDcom-pt-br-PbJzyRNp.js → CreatedOnDcom-pt-br-DuNWZ0KP.js} +1 -1
  14. package/lib/src/{CreatedOnDcom-pt-pt-tja7jglY.js → CreatedOnDcom-pt-pt-CcPfyNH6.js} +1 -1
  15. package/lib/src/brand-page/models/index.d.ts +1 -0
  16. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.d.ts +2 -0
  17. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.js +1 -0
  18. package/lib/src/brand-page-maker/composables/ai-chat/useAiChat.js +11 -10
  19. package/lib/src/brand-page-maker/composables/ai-chat/useAiMetadataBuilder.d.ts +1 -1
  20. package/lib/src/brand-page-maker/composables/ai-chat/useAiMetadataBuilder.js +6 -6
  21. package/lib/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.d.ts +2 -0
  22. package/lib/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.js +258 -0
  23. package/lib/src/brand-page-maker/constants/sidebar-constant.d.ts +1 -0
  24. package/lib/src/brand-page-maker/constants/sidebar-constant.js +8 -0
  25. package/lib/src/brand-page-maker/stores/ai-thread/ai-thread-store.d.ts +128 -4
  26. package/lib/src/brand-page-maker/stores/ai-thread/ai-thread-store.js +8 -0
  27. package/lib/src/brand-page-maker/stores/ai-thread/ai-website-builder-thread-store.d.ts +16 -0
  28. package/lib/src/brand-page-maker/stores/ai-thread/ai-website-builder-thread-store.js +14 -0
  29. package/lib/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.js +2 -0
  30. package/lib/src/brand-page-maker/stores/index.d.ts +1 -0
  31. package/lib/src/brand-page-maker/stores/index.js +1 -0
  32. package/lib/src/brand-page-maker/stores/snapshot/snapshot-store.d.ts +2 -0
  33. package/lib/src/brand-page-maker/stores/snapshot/snapshot-store.js +9 -0
  34. package/lib/src/clients/ai-assistant-client.d.ts +8 -0
  35. package/lib/src/clients/ai-assistant-client.js +11 -1
  36. package/lib/src/composables/useSnapshot.js +33 -0
  37. package/lib/src/css/library.brand-page-brandCrowd.min.css +19 -6
  38. package/lib/src/css/library.brand-page-brandPage.min.css +19 -6
  39. package/lib/src/css/library.brand-page-designCom.min.css +19 -6
  40. package/lib/src/css/library.brand-page-preview.min.css +19 -6
  41. package/lib/src/index.d.ts +1 -0
  42. package/lib/src/index.mjs +42 -41
  43. package/lib/src/{lib-DL-13itP.js → lib-BBkLrEZM.js} +29460 -27495
  44. package/lib/src/lib.js +1 -0
  45. package/lib/src/metadata-builder/ai-metadata-executor.d.ts +1 -1
  46. package/lib/src/metadata-builder/ai-metadata-executor.js +68 -7
  47. package/lib/src/metadata-builder/builders/add-page-builder.d.ts +14 -0
  48. package/lib/src/metadata-builder/builders/add-page-builder.js +66 -0
  49. package/lib/src/metadata-builder/builders/remove-page-builder.d.ts +13 -0
  50. package/lib/src/metadata-builder/builders/remove-page-builder.js +50 -0
  51. package/lib/src/metadata-builder/builders/section-builders/about-section-builder.d.ts +6 -0
  52. package/lib/src/metadata-builder/builders/section-builders/about-section-builder.js +17 -0
  53. package/lib/src/metadata-builder/builders/section-builders/banner-section-builder.d.ts +6 -0
  54. package/lib/src/metadata-builder/builders/section-builders/banner-section-builder.js +25 -0
  55. package/lib/src/metadata-builder/builders/section-builders/base-section-builder.d.ts +40 -0
  56. package/lib/src/metadata-builder/builders/section-builders/base-section-builder.js +108 -0
  57. package/lib/src/metadata-builder/builders/section-builders/button-section-builder.d.ts +6 -0
  58. package/lib/src/metadata-builder/builders/section-builders/button-section-builder.js +16 -0
  59. package/lib/src/metadata-builder/builders/section-builders/contact-form-builder.d.ts +6 -0
  60. package/lib/src/metadata-builder/builders/section-builders/contact-form-builder.js +27 -0
  61. package/lib/src/metadata-builder/builders/section-builders/delete-section-builder.d.ts +13 -0
  62. package/lib/src/metadata-builder/builders/section-builders/delete-section-builder.js +37 -0
  63. package/lib/src/metadata-builder/builders/section-builders/divider-section-builder.d.ts +6 -0
  64. package/lib/src/metadata-builder/builders/section-builders/divider-section-builder.js +16 -0
  65. package/lib/src/metadata-builder/builders/section-builders/image-gallery-builder.d.ts +6 -0
  66. package/lib/src/metadata-builder/builders/section-builders/image-gallery-builder.js +76 -0
  67. package/lib/src/metadata-builder/builders/section-builders/image-section-builder.d.ts +6 -0
  68. package/lib/src/metadata-builder/builders/section-builders/image-section-builder.js +16 -0
  69. package/lib/src/metadata-builder/builders/section-builders/images-section-builder.d.ts +6 -0
  70. package/lib/src/metadata-builder/builders/section-builders/images-section-builder.js +158 -0
  71. package/lib/src/metadata-builder/builders/section-builders/index.d.ts +17 -0
  72. package/lib/src/metadata-builder/builders/section-builders/index.js +17 -0
  73. package/lib/src/metadata-builder/builders/section-builders/mailing-list-builder.d.ts +6 -0
  74. package/lib/src/metadata-builder/builders/section-builders/mailing-list-builder.js +17 -0
  75. package/lib/src/metadata-builder/builders/section-builders/mailing-list-section-builder.d.ts +6 -0
  76. package/lib/src/metadata-builder/builders/section-builders/mailing-list-section-builder.js +16 -0
  77. package/lib/src/metadata-builder/builders/section-builders/move-section-builder.d.ts +15 -0
  78. package/lib/src/metadata-builder/builders/section-builders/move-section-builder.js +62 -0
  79. package/lib/src/metadata-builder/builders/section-builders/profile-section-builder.d.ts +6 -0
  80. package/lib/src/metadata-builder/builders/section-builders/profile-section-builder.js +16 -0
  81. package/lib/src/metadata-builder/builders/section-builders/shapes-section-builder.d.ts +6 -0
  82. package/lib/src/metadata-builder/builders/section-builders/shapes-section-builder.js +162 -0
  83. package/lib/src/metadata-builder/builders/section-builders/social-links-builder.d.ts +6 -0
  84. package/lib/src/metadata-builder/builders/section-builders/social-links-builder.js +50 -0
  85. package/lib/src/metadata-builder/builders/section-builders/testimonial-section-builder.d.ts +6 -0
  86. package/lib/src/metadata-builder/builders/section-builders/testimonial-section-builder.js +133 -0
  87. package/lib/src/metadata-builder/builders/section-builders/text-section-builder.d.ts +6 -0
  88. package/lib/src/metadata-builder/builders/section-builders/text-section-builder.js +154 -0
  89. package/lib/src/metadata-builder/builders/section-content-factory.d.ts +3 -0
  90. package/lib/src/metadata-builder/builders/section-content-factory.js +13 -0
  91. package/lib/src/metadata-builder/builders/section-field-maps.d.ts +12 -0
  92. package/lib/src/metadata-builder/builders/section-field-maps.js +180 -0
  93. package/lib/src/metadata-builder/builders/section-field-utils.d.ts +11 -0
  94. package/lib/src/metadata-builder/builders/section-field-utils.js +109 -0
  95. package/lib/src/metadata-builder/builders/update-content-text-builder.js +0 -5
  96. package/lib/src/metadata-builder/helpers/rte.helpers.d.ts +6 -0
  97. package/lib/src/metadata-builder/helpers/rte.helpers.js +16 -1
  98. package/lib/src/metadata-builder/logger.d.ts +2 -0
  99. package/lib/src/metadata-builder/logger.js +6 -0
  100. package/lib/src/metadata-builder/metadata-executor.js +71 -1
  101. package/lib/src/metadata-builder/models.d.ts +54 -0
  102. package/lib/src/metadata-builder/models.js +58 -0
  103. package/lib/src/metadata-builder/parsers/ai-toolcall-parser.d.ts +51 -3
  104. package/lib/src/metadata-builder/parsers/ai-toolcall-parser.js +110 -13
  105. package/lib/src/metadata-builder/parsers/section-tool-arguments.d.ts +285 -0
  106. package/lib/src/metadata-builder/parsers/section-tool-arguments.js +7 -0
  107. package/lib/src/shared/page-settings/components/delete-page-modal/DeletePageModal.mixin.d.ts +1 -1
  108. package/lib/src/utils/minify-brand-page-metadata.d.ts +22 -0
  109. package/lib/src/utils/minify-brand-page-metadata.js +344 -0
  110. package/package.json +1 -1
  111. package/src/brand-page/models/index.ts +1 -0
  112. package/src/brand-page-maker/components/ai-text-edit/AiTextEdit.vue +1 -1
  113. package/src/brand-page-maker/components/ai-website-builder/AiWebsiteBuilder.vue +80 -0
  114. package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.ts +4 -0
  115. package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.vue +9 -2
  116. package/src/brand-page-maker/composables/ai-chat/useAiChat.ts +16 -17
  117. package/src/brand-page-maker/composables/ai-chat/useAiMetadataBuilder.ts +6 -6
  118. package/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.ts +363 -0
  119. package/src/brand-page-maker/constants/sidebar-constant.ts +8 -0
  120. package/src/brand-page-maker/stores/ai-thread/ai-thread-store.ts +13 -1
  121. package/src/brand-page-maker/stores/ai-thread/ai-website-builder-thread-store.ts +19 -0
  122. package/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.ts +4 -0
  123. package/src/brand-page-maker/stores/index.ts +1 -0
  124. package/src/brand-page-maker/stores/snapshot/snapshot-store.ts +12 -0
  125. package/src/clients/ai-assistant-client.ts +17 -1
  126. package/src/composables/useSnapshot.ts +47 -0
  127. package/src/lib.ts +4 -0
  128. package/src/metadata-builder/ai-metadata-executor.ts +116 -26
  129. package/src/metadata-builder/builders/add-page-builder.ts +98 -0
  130. package/src/metadata-builder/builders/remove-page-builder.ts +83 -0
  131. package/src/metadata-builder/builders/section-builders/about-section-builder.ts +28 -0
  132. package/src/metadata-builder/builders/section-builders/banner-section-builder.ts +45 -0
  133. package/src/metadata-builder/builders/section-builders/base-section-builder.ts +160 -0
  134. package/src/metadata-builder/builders/section-builders/button-section-builder.ts +24 -0
  135. package/src/metadata-builder/builders/section-builders/contact-form-builder.ts +43 -0
  136. package/src/metadata-builder/builders/section-builders/delete-section-builder.ts +63 -0
  137. package/src/metadata-builder/builders/section-builders/divider-section-builder.ts +27 -0
  138. package/src/metadata-builder/builders/section-builders/image-gallery-builder.ts +111 -0
  139. package/src/metadata-builder/builders/section-builders/image-section-builder.ts +24 -0
  140. package/src/metadata-builder/builders/section-builders/images-section-builder.ts +223 -0
  141. package/src/metadata-builder/builders/section-builders/index.ts +21 -0
  142. package/src/metadata-builder/builders/section-builders/mailing-list-builder.ts +29 -0
  143. package/src/metadata-builder/builders/section-builders/mailing-list-section-builder.ts +27 -0
  144. package/src/metadata-builder/builders/section-builders/move-section-builder.ts +100 -0
  145. package/src/metadata-builder/builders/section-builders/profile-section-builder.ts +27 -0
  146. package/src/metadata-builder/builders/section-builders/shapes-section-builder.ts +231 -0
  147. package/src/metadata-builder/builders/section-builders/social-links-builder.ts +79 -0
  148. package/src/metadata-builder/builders/section-builders/testimonial-section-builder.ts +194 -0
  149. package/src/metadata-builder/builders/section-builders/text-section-builder.ts +234 -0
  150. package/src/metadata-builder/builders/section-content-factory.ts +20 -0
  151. package/src/metadata-builder/builders/section-field-maps.ts +235 -0
  152. package/src/metadata-builder/builders/section-field-utils.ts +157 -0
  153. package/src/metadata-builder/builders/update-content-text-builder.ts +0 -6
  154. package/src/metadata-builder/helpers/rte.helpers.ts +23 -1
  155. package/src/metadata-builder/logger.ts +7 -0
  156. package/src/metadata-builder/metadata-executor.ts +96 -4
  157. package/src/metadata-builder/models.ts +62 -0
  158. package/src/metadata-builder/parsers/ai-toolcall-parser.ts +141 -17
  159. package/src/metadata-builder/parsers/section-tool-arguments.ts +417 -0
  160. package/src/utils/minify-brand-page-metadata.ts +407 -0
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-DL-13itP.js";
2
+ import { _ as t } from "./lib-BBkLrEZM.js";
3
3
  const i = {}, h = {
4
4
  width: "275",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-DL-13itP.js";
2
+ import { _ as t } from "./lib-BBkLrEZM.js";
3
3
  const i = {}, h = {
4
4
  width: "251",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-DL-13itP.js";
2
+ import { _ as t } from "./lib-BBkLrEZM.js";
3
3
  const i = {}, h = {
4
4
  width: "250",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-DL-13itP.js";
2
+ import { _ as t } from "./lib-BBkLrEZM.js";
3
3
  const i = {}, h = {
4
4
  width: "237",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-DL-13itP.js";
2
+ import { _ as t } from "./lib-BBkLrEZM.js";
3
3
  const i = {}, h = {
4
4
  width: "237",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-DL-13itP.js";
2
+ import { _ as t } from "./lib-BBkLrEZM.js";
3
3
  const i = {}, h = {
4
4
  width: "263",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-DL-13itP.js";
2
+ import { _ as t } from "./lib-BBkLrEZM.js";
3
3
  const i = {}, h = {
4
4
  width: "263",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as e } from "./lib-DL-13itP.js";
2
+ import { _ as e } from "./lib-BBkLrEZM.js";
3
3
  const M = {}, Z = {
4
4
  width: "242",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as e } from "./lib-DL-13itP.js";
2
+ import { _ as e } from "./lib-BBkLrEZM.js";
3
3
  const i = {}, M = {
4
4
  width: "231",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as e } from "./lib-DL-13itP.js";
2
+ import { _ as e } from "./lib-BBkLrEZM.js";
3
3
  const M = {}, Z = {
4
4
  width: "230",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as e } from "./lib-DL-13itP.js";
2
+ import { _ as e } from "./lib-BBkLrEZM.js";
3
3
  const i = {}, l = {
4
4
  width: "216",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as e } from "./lib-DL-13itP.js";
2
+ import { _ as e } from "./lib-BBkLrEZM.js";
3
3
  const i = {}, l = {
4
4
  width: "216",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as M } from "./lib-DL-13itP.js";
2
+ import { _ as M } from "./lib-BBkLrEZM.js";
3
3
  const Z = {}, e = {
4
4
  width: "232",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as M } from "./lib-DL-13itP.js";
2
+ import { _ as M } from "./lib-BBkLrEZM.js";
3
3
  const Z = {}, e = {
4
4
  width: "232",
5
5
  height: "36",
@@ -297,6 +297,7 @@ export interface TextMediaItem extends ImageItem {
297
297
  }
298
298
  export interface TextShapeItem extends TextMediaItem {
299
299
  colorReplacements: ColorReplacement[];
300
+ keepColor?: boolean;
300
301
  aspectRatio?: number | null;
301
302
  }
302
303
  export interface ShapeItem extends ImageItem {
@@ -1183,6 +1183,8 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
1183
1183
  setBase64Snapshot(base64: string | null): void;
1184
1184
  setIsCapturing(isCapturing: boolean): void;
1185
1185
  clearSnapshot(): void;
1186
+ registerCaptureCallback(callback: () => Promise<void>): void;
1187
+ refreshSnapshotAsync(): Promise<void>;
1186
1188
  }>;
1187
1189
  captureSnapshot: (element: HTMLElement | null) => Promise<string | null>;
1188
1190
  videoStore: import("pinia").Store<"video", import("@brand-page-maker/stores").videoStoreState, {
@@ -200,6 +200,7 @@ export default defineComponent({
200
200
  document.body.classList.remove('sb-main-padded');
201
201
  }
202
202
  fontLoaderUtil.loadAllFonts();
203
+ this.snapshotStore.registerCaptureCallback(() => this.handleCaptureSnapshot());
203
204
  this.setUiScreenSizeModeBasedOnDeviceWidth();
204
205
  if (this.isBrandPageOrIsBrandContact) {
205
206
  this.brandPageMakerStore.setViewport({ viewport: VIEWPORTS.mobile });
@@ -1,6 +1,7 @@
1
1
  import { ref, computed, watch, nextTick, } from 'vue';
2
2
  import { getInstance as getAiAssistantClient, AI_ASSISTANT_AGENT_TYPES, buildWebsiteTextElementMessage, } from '../../../clients/ai-assistant-client';
3
3
  import { getCurrentLocale } from '../../../composables/useTranslate';
4
+ import { storeToRefs } from 'pinia';
4
5
  import { useSnapshotStore, useAiThreadStore } from '../../stores';
5
6
  import { useBrandPageMakerStore } from '../../stores';
6
7
  import { useUiPageSettingsStore } from '../../../shared/page-settings/store';
@@ -22,24 +23,22 @@ export const createWelcomeMessage = (currentValue) => ({
22
23
  : 'What would you like to generate?',
23
24
  timestamp: new Date(),
24
25
  });
25
- const aiLogger = new Logger();
26
26
  export function useAiChat(options) {
27
27
  const aiThreadStore = useAiThreadStore();
28
28
  const snapshotStore = useSnapshotStore();
29
29
  const brandPageMakerStore = useBrandPageMakerStore();
30
30
  const pageSettingsStore = useUiPageSettingsStore();
31
+ const aiLogger = new Logger(!brandPageMakerStore.isProduction);
31
32
  const aiMetadataBuilder = useAiMetadataBuilder(aiLogger);
32
33
  const hasStoredMessages = aiThreadStore.messages.length > 0;
33
- const threadItems = ref(aiThreadStore.messages.length > 0
34
- ? aiThreadStore.messages
35
- : [createWelcomeMessage(options?.currentValue || '')]);
34
+ if (!hasStoredMessages) {
35
+ aiThreadStore.addThreadItem(createWelcomeMessage(options?.currentValue || ''));
36
+ }
37
+ const { messages: threadItems } = storeToRefs(aiThreadStore);
36
38
  const isProcessing = ref(false);
37
39
  watch(isProcessing, (newValue) => {
38
40
  aiThreadStore.isProcessing = newValue;
39
41
  });
40
- watch(threadItems, (newMessages) => {
41
- aiThreadStore.messages = newMessages;
42
- }, { deep: true });
43
42
  const currentTypingMessageId = ref(null);
44
43
  const isStopped = ref(false);
45
44
  const generatedText = ref(null);
@@ -82,7 +81,7 @@ export function useAiChat(options) {
82
81
  };
83
82
  });
84
83
  updateResult.parsedToolCalls.forEach((toolCall) => {
85
- const { message } = toolCall.arguments;
84
+ const message = toolCall.arguments.message;
86
85
  if (message) {
87
86
  aiMessage = aiMessage ? `${aiMessage} ${message}` : message;
88
87
  }
@@ -90,6 +89,8 @@ export function useAiChat(options) {
90
89
  await brandPageMakerStore.initialiseStoresByBrandPageModelAsync(updateResult.model);
91
90
  // Allow Vue to process reactive updates
92
91
  await nextTick();
92
+ // Re-capture snapshot so subsequent messages reflect the updated page
93
+ await snapshotStore.refreshSnapshotAsync();
93
94
  return {
94
95
  shouldContinue: toolResults.length > 0 && aiThreadStore.runId !== null,
95
96
  toolResults,
@@ -245,7 +246,7 @@ export function useAiChat(options) {
245
246
  text: text || '',
246
247
  timestamp: new Date(),
247
248
  };
248
- threadItems.value.push(userMessage);
249
+ aiThreadStore.addThreadItem(userMessage);
249
250
  const agentMessageId = (Date.now() + 1).toString();
250
251
  currentTypingMessageId.value = agentMessageId;
251
252
  const agentMessage = {
@@ -256,7 +257,7 @@ export function useAiChat(options) {
256
257
  isTyping: true,
257
258
  timestamp: new Date(),
258
259
  };
259
- threadItems.value.push(agentMessage);
260
+ aiThreadStore.addThreadItem(agentMessage);
260
261
  try {
261
262
  aiLogger.log('sendMessageAsync', {
262
263
  messageOptions,
@@ -11,7 +11,7 @@ export interface AiMetadataBuilderResult {
11
11
  parsedToolCalls: ParsedToolCall[];
12
12
  }
13
13
  export declare function useAiMetadataBuilder(logger: Logger): {
14
- applyAiToolCallsAsync: (model: BrandPageModel, aiAssistantToolCall: AiAssistantToolCall[], options: {
14
+ applyAiToolCallsAsync: (model: BrandPageModel, aiAssistantToolCall: AiAssistantToolCall[], options?: {
15
15
  maxCharacters?: number;
16
16
  }) => Promise<AiMetadataBuilderResult>;
17
17
  };
@@ -1,18 +1,18 @@
1
- import { executeAiToolUseAsync } from '../../../metadata-builder/ai-metadata-executor';
2
- import { parseAiToolcall, } from '../../../metadata-builder/parsers/ai-toolcall-parser';
1
+ import { executeToolCallsAsync } from '../../../metadata-builder/ai-metadata-executor';
2
+ import { parseToolCalls, } from '../../../metadata-builder/parsers/ai-toolcall-parser';
3
3
  export function useAiMetadataBuilder(logger) {
4
4
  // Debug purpose
5
5
  window.aiLogger = logger;
6
- const applyAiToolCallsAsync = async (model, aiAssistantToolCall, options) => {
6
+ const applyAiToolCallsAsync = async (model, aiAssistantToolCall, options = {}) => {
7
7
  try {
8
- const requests = parseAiToolcall(aiAssistantToolCall);
9
- const result = await executeAiToolUseAsync(model, requests, {
8
+ const parsed = parseToolCalls(aiAssistantToolCall);
9
+ const result = await executeToolCallsAsync(model, parsed, {
10
10
  ...options,
11
11
  logger,
12
12
  });
13
13
  return {
14
14
  model: result.model,
15
- parsedToolCalls: requests,
15
+ parsedToolCalls: parsed,
16
16
  results: result.results.map((x) => {
17
17
  return {
18
18
  toolId: x.request.id,
@@ -0,0 +1,2 @@
1
+ import type { UseAiChatResult } from './useAiChat';
2
+ export declare function useAiWebsiteBuilderChat(): UseAiChatResult;
@@ -0,0 +1,258 @@
1
+ import { ref, computed, watch, nextTick } from 'vue';
2
+ import { getInstance as getAiAssistantClient, AI_ASSISTANT_AGENT_TYPES, buildWebsiteBuilderMessage, } from '../../../clients/ai-assistant-client';
3
+ import { minifyBrandPageMetadata } from '../../../utils/minify-brand-page-metadata';
4
+ import { useSnapshotStore, useAiWebsiteBuilderThreadStore } from '../../stores';
5
+ import { useBrandPageMakerStore } from '../../stores';
6
+ import { useUiPageSettingsStore } from '../../../shared/page-settings/store';
7
+ import { useAiMetadataBuilder } from './useAiMetadataBuilder';
8
+ import { Logger } from '../../../metadata-builder/logger';
9
+ const MAX_TOOL_CALL_ITERATIONS = 5;
10
+ const aiLogger = new Logger();
11
+ export function useAiWebsiteBuilderChat() {
12
+ const aiThreadStore = useAiWebsiteBuilderThreadStore();
13
+ const snapshotStore = useSnapshotStore();
14
+ const brandPageMakerStore = useBrandPageMakerStore();
15
+ const pageSettingsStore = useUiPageSettingsStore();
16
+ const aiMetadataBuilder = useAiMetadataBuilder(aiLogger);
17
+ const hasStoredMessages = aiThreadStore.messages.length > 0;
18
+ const threadItems = ref(aiThreadStore.messages.length > 0
19
+ ? aiThreadStore.messages
20
+ : [
21
+ {
22
+ id: '1',
23
+ type: 'text',
24
+ role: 'agent',
25
+ text: 'What changes would you like to make to your website?',
26
+ timestamp: new Date(),
27
+ },
28
+ ]);
29
+ const isProcessing = ref(false);
30
+ watch(isProcessing, (newValue) => {
31
+ aiThreadStore.isProcessing = newValue;
32
+ });
33
+ watch(threadItems, (newMessages) => {
34
+ aiThreadStore.messages = newMessages;
35
+ }, { deep: true });
36
+ const currentTypingMessageId = ref(null);
37
+ const isStopped = ref(false);
38
+ const generatedText = ref(null);
39
+ const generatedStyle = ref(null);
40
+ const buildMessage = (userPrompt) => {
41
+ const minified = minifyBrandPageMetadata(brandPageMakerStore.brandPageData);
42
+ return buildWebsiteBuilderMessage(userPrompt, minified);
43
+ };
44
+ const applyToolCallsAsync = async (response) => {
45
+ let aiMessage = response.message || '';
46
+ const modelToUpdate = brandPageMakerStore.brandPageData;
47
+ const updateResult = await aiMetadataBuilder.applyAiToolCallsAsync(modelToUpdate, response.toolCalls || []);
48
+ const toolResults = updateResult.results.map((x) => {
49
+ return {
50
+ toolId: x.toolId,
51
+ success: x.errors && x.errors.length > 0 ? 'failed' : 'success',
52
+ };
53
+ });
54
+ updateResult.parsedToolCalls.forEach((toolCall) => {
55
+ const args = toolCall.arguments;
56
+ if (args.message) {
57
+ aiMessage = aiMessage ? `${aiMessage} ${args.message}` : args.message;
58
+ }
59
+ });
60
+ console.log('updateResult.model', JSON.parse(JSON.stringify(updateResult.model)));
61
+ await brandPageMakerStore.initialiseStoresByBrandPageModelAsync(updateResult.model);
62
+ await nextTick();
63
+ // Re-capture snapshot so subsequent messages reflect the updated page
64
+ await snapshotStore.refreshSnapshotAsync();
65
+ return {
66
+ shouldContinue: toolResults.length > 0 && aiThreadStore.runId !== null,
67
+ toolResults,
68
+ aiMessage,
69
+ };
70
+ };
71
+ const submitToolResults = async (toolResults) => {
72
+ if (!aiThreadStore.threadId || !aiThreadStore.runId || !toolResults.length)
73
+ return null;
74
+ const client = getAiAssistantClient();
75
+ const { response } = await client.submitWebsiteToolCallOutputAsync(aiThreadStore.threadId, {
76
+ runId: aiThreadStore.runId,
77
+ toolCalls: toolResults,
78
+ agentType: AI_ASSISTANT_AGENT_TYPES.WEBSITE_BUILDER,
79
+ websiteSnapshot: snapshotStore.snapshotBase64 || undefined,
80
+ });
81
+ return response;
82
+ };
83
+ const callApiAsync = async (userPrompt) => {
84
+ generatedText.value = null;
85
+ generatedStyle.value = null;
86
+ const client = getAiAssistantClient();
87
+ let aiAssistantResponse = {};
88
+ if (!aiThreadStore.threadId) {
89
+ const { response } = await client.createWebsiteThreadAndSendMessageAsync({
90
+ message: buildMessage(userPrompt || ''),
91
+ websiteSnapshot: snapshotStore.snapshotBase64 || undefined,
92
+ agentType: AI_ASSISTANT_AGENT_TYPES.WEBSITE_BUILDER,
93
+ });
94
+ aiAssistantResponse = response;
95
+ aiThreadStore.threadId = response.threadId;
96
+ aiThreadStore.runId = response.runId || null;
97
+ }
98
+ else {
99
+ const { response } = await client.sendWebsiteMessageAsync(aiThreadStore.threadId, {
100
+ message: buildMessage(userPrompt),
101
+ websiteSnapshot: snapshotStore.snapshotBase64 || undefined,
102
+ agentType: AI_ASSISTANT_AGENT_TYPES.WEBSITE_BUILDER,
103
+ });
104
+ aiAssistantResponse = response;
105
+ }
106
+ aiLogger.log('callApiAsync response', { aiAssistantResponse });
107
+ if (isStopped.value)
108
+ return null;
109
+ const handledResponse = await handleAiResponseAsync(aiAssistantResponse);
110
+ return (handledResponse.aiMessage ||
111
+ 'I was unable to make the changes. Please try again.');
112
+ };
113
+ const handleToolResponseAsync = async (response) => {
114
+ let { shouldContinue, toolResults, aiMessage } = await applyToolCallsAsync(response);
115
+ let iterations = 0;
116
+ while (shouldContinue && iterations < MAX_TOOL_CALL_ITERATIONS) {
117
+ if (isStopped.value)
118
+ return { aiMessage: '' };
119
+ const nextResponse = await submitToolResults(toolResults);
120
+ aiLogger.log('handleToolResponseAsync submitToolResults', {
121
+ toolResults,
122
+ nextResponse,
123
+ });
124
+ if (!nextResponse)
125
+ break;
126
+ const retryResult = await applyToolCallsAsync(nextResponse);
127
+ shouldContinue = retryResult.shouldContinue;
128
+ toolResults = retryResult.toolResults;
129
+ aiMessage = retryResult.aiMessage || aiMessage;
130
+ iterations += 1;
131
+ }
132
+ return { aiMessage };
133
+ };
134
+ const handleAiResponseAsync = async (response) => {
135
+ const aiMessageResult = response.message || '';
136
+ if (response.toolCalls && response.toolCalls.length > 0) {
137
+ const toolResult = await handleToolResponseAsync(response);
138
+ // Todo: For now dont show tool result message as it is not functional
139
+ // aiMessageResult = toolResult.aiMessage || aiMessageResult;
140
+ aiLogger.log('handleAiResponseAsync toolResult', { toolResult });
141
+ }
142
+ return { aiMessage: aiMessageResult };
143
+ };
144
+ const sendMessageAsync = async (messageOptions) => {
145
+ const { text, images } = messageOptions;
146
+ if (!text?.trim() && (!images || images.length === 0))
147
+ return;
148
+ isStopped.value = false;
149
+ isProcessing.value = true;
150
+ const userMessage = images
151
+ ? {
152
+ id: Date.now().toString(),
153
+ type: 'image',
154
+ role: 'user',
155
+ images,
156
+ text,
157
+ timestamp: new Date(),
158
+ }
159
+ : {
160
+ id: Date.now().toString(),
161
+ type: 'text',
162
+ role: 'user',
163
+ text: text || '',
164
+ timestamp: new Date(),
165
+ };
166
+ threadItems.value.push(userMessage);
167
+ const agentMessageId = (Date.now() + 1).toString();
168
+ currentTypingMessageId.value = agentMessageId;
169
+ const agentMessage = {
170
+ id: agentMessageId,
171
+ type: 'text',
172
+ role: 'agent',
173
+ text: '',
174
+ isTyping: true,
175
+ timestamp: new Date(),
176
+ };
177
+ threadItems.value.push(agentMessage);
178
+ try {
179
+ aiLogger.log('sendMessageAsync', { messageOptions });
180
+ const responseText = await callApiAsync(text || '');
181
+ if (isStopped.value)
182
+ return;
183
+ const messageIndex = threadItems.value.findIndex((msg) => msg.id === agentMessageId);
184
+ if (messageIndex !== -1) {
185
+ if (responseText) {
186
+ threadItems.value[messageIndex].text = responseText;
187
+ threadItems.value[messageIndex].isTyping = false;
188
+ }
189
+ else {
190
+ threadItems.value[messageIndex].text =
191
+ 'Failed to apply changes. Please try again.';
192
+ threadItems.value[messageIndex].isTyping = false;
193
+ threadItems.value[messageIndex].isError = true;
194
+ }
195
+ }
196
+ }
197
+ catch (error) {
198
+ if (isStopped.value)
199
+ return;
200
+ const messageIndex = threadItems.value.findIndex((msg) => msg.id === agentMessageId);
201
+ if (messageIndex !== -1) {
202
+ threadItems.value[messageIndex].text =
203
+ error?.response?.data?.error ||
204
+ 'An error occurred. Please try again.';
205
+ threadItems.value[messageIndex].isTyping = false;
206
+ threadItems.value[messageIndex].isError = true;
207
+ }
208
+ }
209
+ finally {
210
+ currentTypingMessageId.value = null;
211
+ isProcessing.value = false;
212
+ }
213
+ console.log('aiLogger', aiLogger);
214
+ };
215
+ const deleteMessage = (messageId) => {
216
+ const index = threadItems.value.findIndex((msg) => msg.id === messageId);
217
+ if (index !== -1) {
218
+ threadItems.value.splice(index, 1);
219
+ }
220
+ };
221
+ const stopGenerationAsync = async () => {
222
+ isStopped.value = true;
223
+ if (currentTypingMessageId.value) {
224
+ deleteMessage(currentTypingMessageId.value);
225
+ currentTypingMessageId.value = null;
226
+ }
227
+ isProcessing.value = false;
228
+ };
229
+ const formattedMessages = computed(() => {
230
+ const initialMessageCount = hasStoredMessages
231
+ ? aiThreadStore.messages.length
232
+ : 1;
233
+ return threadItems.value.map((msg, index) => ({
234
+ type: msg.type,
235
+ props: {
236
+ ...(msg.type === 'text' && { text: msg.text }),
237
+ ...(msg.type === 'image' && { images: msg.images, text: msg.text }),
238
+ isUser: msg.role === 'user',
239
+ isAi: msg.role === 'agent',
240
+ showIcon: msg.role === 'agent',
241
+ isTyping: msg.isTyping,
242
+ isResponse: index >= 1,
243
+ disableAnimation: index < initialMessageCount,
244
+ },
245
+ }));
246
+ });
247
+ return {
248
+ threadItems,
249
+ isProcessing,
250
+ currentTypingMessageId,
251
+ generatedText,
252
+ generatedStyle,
253
+ sendMessageAsync,
254
+ deleteMessage,
255
+ stopGenerationAsync,
256
+ formattedMessages,
257
+ };
258
+ }
@@ -10,5 +10,6 @@ export declare const SIDE_BAR_TAB_NAMES: {
10
10
  STYLE_SETTINGS: string;
11
11
  BRANDPAGE_SETTINGS: string;
12
12
  AI_TEXT_EDIT: string;
13
+ AI_WEBSITE_BUILDER: string;
13
14
  };
14
15
  export declare const DEFAULT_SIDE_BAR_TABS: () => SideBarTab[];
@@ -10,6 +10,7 @@ export const SIDE_BAR_TAB_NAMES = {
10
10
  STYLE_SETTINGS: 'StyleSettings',
11
11
  BRANDPAGE_SETTINGS: 'BrandPageSettings',
12
12
  AI_TEXT_EDIT: 'AiTextEdit',
13
+ AI_WEBSITE_BUILDER: 'AiWebsiteBuilder',
13
14
  };
14
15
  export const DEFAULT_SIDE_BAR_TABS = () => [
15
16
  {
@@ -42,6 +43,13 @@ export const DEFAULT_SIDE_BAR_TABS = () => [
42
43
  accessibleDisplayName: 'AI Text Edit',
43
44
  isVisible: false,
44
45
  },
46
+ {
47
+ name: SIDE_BAR_TAB_NAMES.AI_WEBSITE_BUILDER,
48
+ displayName: 'AI Builder',
49
+ iconName: 'ai',
50
+ accessibleDisplayName: 'AI Website Builder',
51
+ isVisible: true,
52
+ },
45
53
  {
46
54
  name: SIDE_BAR_TAB_NAMES.BACKGROUND_SETTINGS,
47
55
  displayName: constantsTr(`backgroundDisplayName`),