@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.
- package/lib/src/{CreatedOnBrandCrowd-de-de-C_NzyXvG.js → CreatedOnBrandCrowd-de-de-CtODijXU.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-en-us-DSmpdByg.js → CreatedOnBrandCrowd-en-us-CFOzipix.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-es-es-4O9ttd4y.js → CreatedOnBrandCrowd-es-es-Bed6cQwT.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-fr-fr-DDr8rQHb.js → CreatedOnBrandCrowd-fr-ca-CDtut9SG.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-fr-ca-DDr8rQHb.js → CreatedOnBrandCrowd-fr-fr-CDtut9SG.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-pt-pt-BUTVQ17i.js → CreatedOnBrandCrowd-pt-br-BxubZ9Pn.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-pt-br-BUTVQ17i.js → CreatedOnBrandCrowd-pt-pt-BxubZ9Pn.js} +1 -1
- package/lib/src/{CreatedOnDcom-de-de-thkGl7gg.js → CreatedOnDcom-de-de-Bpi74lME.js} +1 -1
- package/lib/src/{CreatedOnDcom-en-us-DOgnHkVR.js → CreatedOnDcom-en-us-DcV-Kjz6.js} +1 -1
- package/lib/src/{CreatedOnDcom-es-es-NyEB16vO.js → CreatedOnDcom-es-es-G_POK1Z1.js} +1 -1
- package/lib/src/{CreatedOnDcom-fr-ca-Cd6WjWcu.js → CreatedOnDcom-fr-ca-B-6Lowfi.js} +1 -1
- package/lib/src/{CreatedOnDcom-fr-fr-CDKX35U7.js → CreatedOnDcom-fr-fr-Cd3WjtRX.js} +1 -1
- package/lib/src/{CreatedOnDcom-pt-br-PbJzyRNp.js → CreatedOnDcom-pt-br-DuNWZ0KP.js} +1 -1
- package/lib/src/{CreatedOnDcom-pt-pt-tja7jglY.js → CreatedOnDcom-pt-pt-CcPfyNH6.js} +1 -1
- package/lib/src/brand-page/models/index.d.ts +1 -0
- package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.d.ts +2 -0
- package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.js +1 -0
- package/lib/src/brand-page-maker/composables/ai-chat/useAiChat.js +11 -10
- package/lib/src/brand-page-maker/composables/ai-chat/useAiMetadataBuilder.d.ts +1 -1
- package/lib/src/brand-page-maker/composables/ai-chat/useAiMetadataBuilder.js +6 -6
- package/lib/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.d.ts +2 -0
- package/lib/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.js +258 -0
- package/lib/src/brand-page-maker/constants/sidebar-constant.d.ts +1 -0
- package/lib/src/brand-page-maker/constants/sidebar-constant.js +8 -0
- package/lib/src/brand-page-maker/stores/ai-thread/ai-thread-store.d.ts +128 -4
- package/lib/src/brand-page-maker/stores/ai-thread/ai-thread-store.js +8 -0
- package/lib/src/brand-page-maker/stores/ai-thread/ai-website-builder-thread-store.d.ts +16 -0
- package/lib/src/brand-page-maker/stores/ai-thread/ai-website-builder-thread-store.js +14 -0
- package/lib/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.js +2 -0
- package/lib/src/brand-page-maker/stores/index.d.ts +1 -0
- package/lib/src/brand-page-maker/stores/index.js +1 -0
- package/lib/src/brand-page-maker/stores/snapshot/snapshot-store.d.ts +2 -0
- package/lib/src/brand-page-maker/stores/snapshot/snapshot-store.js +9 -0
- package/lib/src/clients/ai-assistant-client.d.ts +8 -0
- package/lib/src/clients/ai-assistant-client.js +11 -1
- package/lib/src/composables/useSnapshot.js +33 -0
- package/lib/src/css/library.brand-page-brandCrowd.min.css +19 -6
- package/lib/src/css/library.brand-page-brandPage.min.css +19 -6
- package/lib/src/css/library.brand-page-designCom.min.css +19 -6
- package/lib/src/css/library.brand-page-preview.min.css +19 -6
- package/lib/src/index.d.ts +1 -0
- package/lib/src/index.mjs +42 -41
- package/lib/src/{lib-DL-13itP.js → lib-BBkLrEZM.js} +29460 -27495
- package/lib/src/lib.js +1 -0
- package/lib/src/metadata-builder/ai-metadata-executor.d.ts +1 -1
- package/lib/src/metadata-builder/ai-metadata-executor.js +68 -7
- package/lib/src/metadata-builder/builders/add-page-builder.d.ts +14 -0
- package/lib/src/metadata-builder/builders/add-page-builder.js +66 -0
- package/lib/src/metadata-builder/builders/remove-page-builder.d.ts +13 -0
- package/lib/src/metadata-builder/builders/remove-page-builder.js +50 -0
- package/lib/src/metadata-builder/builders/section-builders/about-section-builder.d.ts +6 -0
- package/lib/src/metadata-builder/builders/section-builders/about-section-builder.js +17 -0
- package/lib/src/metadata-builder/builders/section-builders/banner-section-builder.d.ts +6 -0
- package/lib/src/metadata-builder/builders/section-builders/banner-section-builder.js +25 -0
- package/lib/src/metadata-builder/builders/section-builders/base-section-builder.d.ts +40 -0
- package/lib/src/metadata-builder/builders/section-builders/base-section-builder.js +108 -0
- package/lib/src/metadata-builder/builders/section-builders/button-section-builder.d.ts +6 -0
- package/lib/src/metadata-builder/builders/section-builders/button-section-builder.js +16 -0
- package/lib/src/metadata-builder/builders/section-builders/contact-form-builder.d.ts +6 -0
- package/lib/src/metadata-builder/builders/section-builders/contact-form-builder.js +27 -0
- package/lib/src/metadata-builder/builders/section-builders/delete-section-builder.d.ts +13 -0
- package/lib/src/metadata-builder/builders/section-builders/delete-section-builder.js +37 -0
- package/lib/src/metadata-builder/builders/section-builders/divider-section-builder.d.ts +6 -0
- package/lib/src/metadata-builder/builders/section-builders/divider-section-builder.js +16 -0
- package/lib/src/metadata-builder/builders/section-builders/image-gallery-builder.d.ts +6 -0
- package/lib/src/metadata-builder/builders/section-builders/image-gallery-builder.js +76 -0
- package/lib/src/metadata-builder/builders/section-builders/image-section-builder.d.ts +6 -0
- package/lib/src/metadata-builder/builders/section-builders/image-section-builder.js +16 -0
- package/lib/src/metadata-builder/builders/section-builders/images-section-builder.d.ts +6 -0
- package/lib/src/metadata-builder/builders/section-builders/images-section-builder.js +158 -0
- package/lib/src/metadata-builder/builders/section-builders/index.d.ts +17 -0
- package/lib/src/metadata-builder/builders/section-builders/index.js +17 -0
- package/lib/src/metadata-builder/builders/section-builders/mailing-list-builder.d.ts +6 -0
- package/lib/src/metadata-builder/builders/section-builders/mailing-list-builder.js +17 -0
- package/lib/src/metadata-builder/builders/section-builders/mailing-list-section-builder.d.ts +6 -0
- package/lib/src/metadata-builder/builders/section-builders/mailing-list-section-builder.js +16 -0
- package/lib/src/metadata-builder/builders/section-builders/move-section-builder.d.ts +15 -0
- package/lib/src/metadata-builder/builders/section-builders/move-section-builder.js +62 -0
- package/lib/src/metadata-builder/builders/section-builders/profile-section-builder.d.ts +6 -0
- package/lib/src/metadata-builder/builders/section-builders/profile-section-builder.js +16 -0
- package/lib/src/metadata-builder/builders/section-builders/shapes-section-builder.d.ts +6 -0
- package/lib/src/metadata-builder/builders/section-builders/shapes-section-builder.js +162 -0
- package/lib/src/metadata-builder/builders/section-builders/social-links-builder.d.ts +6 -0
- package/lib/src/metadata-builder/builders/section-builders/social-links-builder.js +50 -0
- package/lib/src/metadata-builder/builders/section-builders/testimonial-section-builder.d.ts +6 -0
- package/lib/src/metadata-builder/builders/section-builders/testimonial-section-builder.js +133 -0
- package/lib/src/metadata-builder/builders/section-builders/text-section-builder.d.ts +6 -0
- package/lib/src/metadata-builder/builders/section-builders/text-section-builder.js +154 -0
- package/lib/src/metadata-builder/builders/section-content-factory.d.ts +3 -0
- package/lib/src/metadata-builder/builders/section-content-factory.js +13 -0
- package/lib/src/metadata-builder/builders/section-field-maps.d.ts +12 -0
- package/lib/src/metadata-builder/builders/section-field-maps.js +180 -0
- package/lib/src/metadata-builder/builders/section-field-utils.d.ts +11 -0
- package/lib/src/metadata-builder/builders/section-field-utils.js +109 -0
- package/lib/src/metadata-builder/builders/update-content-text-builder.js +0 -5
- package/lib/src/metadata-builder/helpers/rte.helpers.d.ts +6 -0
- package/lib/src/metadata-builder/helpers/rte.helpers.js +16 -1
- package/lib/src/metadata-builder/logger.d.ts +2 -0
- package/lib/src/metadata-builder/logger.js +6 -0
- package/lib/src/metadata-builder/metadata-executor.js +71 -1
- package/lib/src/metadata-builder/models.d.ts +54 -0
- package/lib/src/metadata-builder/models.js +58 -0
- package/lib/src/metadata-builder/parsers/ai-toolcall-parser.d.ts +51 -3
- package/lib/src/metadata-builder/parsers/ai-toolcall-parser.js +110 -13
- package/lib/src/metadata-builder/parsers/section-tool-arguments.d.ts +285 -0
- package/lib/src/metadata-builder/parsers/section-tool-arguments.js +7 -0
- package/lib/src/shared/page-settings/components/delete-page-modal/DeletePageModal.mixin.d.ts +1 -1
- package/lib/src/utils/minify-brand-page-metadata.d.ts +22 -0
- package/lib/src/utils/minify-brand-page-metadata.js +344 -0
- package/package.json +1 -1
- package/src/brand-page/models/index.ts +1 -0
- package/src/brand-page-maker/components/ai-text-edit/AiTextEdit.vue +1 -1
- package/src/brand-page-maker/components/ai-website-builder/AiWebsiteBuilder.vue +80 -0
- package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.ts +4 -0
- package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.vue +9 -2
- package/src/brand-page-maker/composables/ai-chat/useAiChat.ts +16 -17
- package/src/brand-page-maker/composables/ai-chat/useAiMetadataBuilder.ts +6 -6
- package/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.ts +363 -0
- package/src/brand-page-maker/constants/sidebar-constant.ts +8 -0
- package/src/brand-page-maker/stores/ai-thread/ai-thread-store.ts +13 -1
- package/src/brand-page-maker/stores/ai-thread/ai-website-builder-thread-store.ts +19 -0
- package/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.ts +4 -0
- package/src/brand-page-maker/stores/index.ts +1 -0
- package/src/brand-page-maker/stores/snapshot/snapshot-store.ts +12 -0
- package/src/clients/ai-assistant-client.ts +17 -1
- package/src/composables/useSnapshot.ts +47 -0
- package/src/lib.ts +4 -0
- package/src/metadata-builder/ai-metadata-executor.ts +116 -26
- package/src/metadata-builder/builders/add-page-builder.ts +98 -0
- package/src/metadata-builder/builders/remove-page-builder.ts +83 -0
- package/src/metadata-builder/builders/section-builders/about-section-builder.ts +28 -0
- package/src/metadata-builder/builders/section-builders/banner-section-builder.ts +45 -0
- package/src/metadata-builder/builders/section-builders/base-section-builder.ts +160 -0
- package/src/metadata-builder/builders/section-builders/button-section-builder.ts +24 -0
- package/src/metadata-builder/builders/section-builders/contact-form-builder.ts +43 -0
- package/src/metadata-builder/builders/section-builders/delete-section-builder.ts +63 -0
- package/src/metadata-builder/builders/section-builders/divider-section-builder.ts +27 -0
- package/src/metadata-builder/builders/section-builders/image-gallery-builder.ts +111 -0
- package/src/metadata-builder/builders/section-builders/image-section-builder.ts +24 -0
- package/src/metadata-builder/builders/section-builders/images-section-builder.ts +223 -0
- package/src/metadata-builder/builders/section-builders/index.ts +21 -0
- package/src/metadata-builder/builders/section-builders/mailing-list-builder.ts +29 -0
- package/src/metadata-builder/builders/section-builders/mailing-list-section-builder.ts +27 -0
- package/src/metadata-builder/builders/section-builders/move-section-builder.ts +100 -0
- package/src/metadata-builder/builders/section-builders/profile-section-builder.ts +27 -0
- package/src/metadata-builder/builders/section-builders/shapes-section-builder.ts +231 -0
- package/src/metadata-builder/builders/section-builders/social-links-builder.ts +79 -0
- package/src/metadata-builder/builders/section-builders/testimonial-section-builder.ts +194 -0
- package/src/metadata-builder/builders/section-builders/text-section-builder.ts +234 -0
- package/src/metadata-builder/builders/section-content-factory.ts +20 -0
- package/src/metadata-builder/builders/section-field-maps.ts +235 -0
- package/src/metadata-builder/builders/section-field-utils.ts +157 -0
- package/src/metadata-builder/builders/update-content-text-builder.ts +0 -6
- package/src/metadata-builder/helpers/rte.helpers.ts +23 -1
- package/src/metadata-builder/logger.ts +7 -0
- package/src/metadata-builder/metadata-executor.ts +96 -4
- package/src/metadata-builder/models.ts +62 -0
- package/src/metadata-builder/parsers/ai-toolcall-parser.ts +141 -17
- package/src/metadata-builder/parsers/section-tool-arguments.ts +417 -0
- package/src/utils/minify-brand-page-metadata.ts +407 -0
|
@@ -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
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
2
|
-
import {
|
|
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
|
|
9
|
-
const result = await
|
|
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:
|
|
15
|
+
parsedToolCalls: parsed,
|
|
16
16
|
results: result.results.map((x) => {
|
|
17
17
|
return {
|
|
18
18
|
toolId: x.request.id,
|
|
@@ -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,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`),
|