@webiny/ai-powerups 6.4.11 → 6.6.0-alpha.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/AiPowerups.js +2 -2
- package/AiPowerups.js.map +1 -1
- package/admin/Extension.js +11 -2
- package/admin/Extension.js.map +1 -1
- package/admin/features/compareEntryRevisions/CompareEntryRevisionsGateway.d.ts +12 -0
- package/admin/features/compareEntryRevisions/CompareEntryRevisionsGateway.js +46 -0
- package/admin/features/compareEntryRevisions/CompareEntryRevisionsGateway.js.map +1 -0
- package/admin/features/compareEntryRevisions/CompareEntryRevisionsRepository.d.ts +11 -0
- package/admin/features/compareEntryRevisions/CompareEntryRevisionsRepository.js +18 -0
- package/admin/features/compareEntryRevisions/CompareEntryRevisionsRepository.js.map +1 -0
- package/admin/features/compareEntryRevisions/CompareEntryRevisionsUseCase.d.ts +11 -0
- package/admin/features/compareEntryRevisions/CompareEntryRevisionsUseCase.js +18 -0
- package/admin/features/compareEntryRevisions/CompareEntryRevisionsUseCase.js.map +1 -0
- package/admin/features/compareEntryRevisions/abstractions.d.ts +32 -0
- package/admin/features/compareEntryRevisions/abstractions.js +7 -0
- package/admin/features/compareEntryRevisions/abstractions.js.map +1 -0
- package/admin/features/compareEntryRevisions/feature.d.ts +1 -0
- package/admin/features/compareEntryRevisions/feature.js +15 -0
- package/admin/features/compareEntryRevisions/feature.js.map +1 -0
- package/admin/features/compareEntryRevisions/index.d.ts +2 -0
- package/admin/features/compareEntryRevisions/index.js +2 -0
- package/admin/features/feature.js +2 -0
- package/admin/features/feature.js.map +1 -1
- package/admin/features/generateEntryContent/GenerateEntryContentGateway.d.ts +12 -0
- package/admin/features/generateEntryContent/GenerateEntryContentGateway.js +45 -0
- package/admin/features/generateEntryContent/GenerateEntryContentGateway.js.map +1 -0
- package/admin/features/generateEntryContent/GenerateEntryContentUseCase.d.ts +11 -0
- package/admin/features/generateEntryContent/GenerateEntryContentUseCase.js +18 -0
- package/admin/features/generateEntryContent/GenerateEntryContentUseCase.js.map +1 -0
- package/admin/features/generateEntryContent/abstractions.d.ts +24 -0
- package/admin/features/generateEntryContent/abstractions.js +6 -0
- package/admin/features/generateEntryContent/abstractions.js.map +1 -0
- package/admin/features/generateEntryContent/feature.d.ts +1 -0
- package/admin/features/generateEntryContent/feature.js +13 -0
- package/admin/features/generateEntryContent/feature.js.map +1 -0
- package/admin/features/generateEntryContent/index.d.ts +3 -0
- package/admin/features/generateEntryContent/index.js +2 -0
- package/admin/features/generatePageContent/GeneratePageContentGateway.js +2 -0
- package/admin/features/generatePageContent/GeneratePageContentGateway.js.map +1 -1
- package/admin/features/generatePageContent/abstractions.d.ts +1 -0
- package/admin/features/generatePageContent/abstractions.js.map +1 -1
- package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPage.d.ts +2 -2
- package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPage.js +3 -4
- package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPage.js.map +1 -1
- package/admin/presentation/AiPromptFormFactory/AiPromptFormFactory.d.ts +20 -0
- package/admin/presentation/AiPromptFormFactory/AiPromptFormFactory.js +108 -0
- package/admin/presentation/AiPromptFormFactory/AiPromptFormFactory.js.map +1 -0
- package/admin/presentation/AiPromptFormFactory/abstractions.d.ts +14 -0
- package/admin/presentation/AiPromptFormFactory/abstractions.js +5 -0
- package/admin/presentation/AiPromptFormFactory/abstractions.js.map +1 -0
- package/admin/presentation/AiPromptFormFactory/feature.d.ts +1 -0
- package/admin/presentation/AiPromptFormFactory/feature.js +11 -0
- package/admin/presentation/AiPromptFormFactory/feature.js.map +1 -0
- package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDialog.d.ts +9 -0
- package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDialog.js +118 -0
- package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDialog.js.map +1 -0
- package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDrawer.d.ts +9 -0
- package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDrawer.js +72 -0
- package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDrawer.js.map +1 -0
- package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsMenuItem.d.ts +4 -0
- package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsMenuItem.js +21 -0
- package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsMenuItem.js.map +1 -0
- package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsOverlays.d.ts +2 -0
- package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsOverlays.js +17 -0
- package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsOverlays.js.map +1 -0
- package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsPresenter.d.ts +25 -0
- package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsPresenter.js +90 -0
- package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsPresenter.js.map +1 -0
- package/admin/presentation/CmsCompareEntryRevisions/Extension.d.ts +2 -0
- package/admin/presentation/CmsCompareEntryRevisions/Extension.js +16 -0
- package/admin/presentation/CmsCompareEntryRevisions/Extension.js.map +1 -0
- package/admin/presentation/CmsCompareEntryRevisions/abstractions.d.ts +29 -0
- package/admin/presentation/CmsCompareEntryRevisions/abstractions.js +5 -0
- package/admin/presentation/CmsCompareEntryRevisions/abstractions.js.map +1 -0
- package/admin/presentation/CmsCompareEntryRevisions/feature.d.ts +3 -0
- package/admin/presentation/CmsCompareEntryRevisions/feature.js +17 -0
- package/admin/presentation/CmsCompareEntryRevisions/feature.js.map +1 -0
- package/admin/presentation/CmsContentGeneration/CmsGenerateContentButton.d.ts +4 -0
- package/admin/presentation/CmsContentGeneration/CmsGenerateContentButton.js +27 -0
- package/admin/presentation/CmsContentGeneration/CmsGenerateContentButton.js.map +1 -0
- package/admin/presentation/CmsContentGeneration/CmsGenerateContentDialog.d.ts +5 -0
- package/admin/presentation/CmsContentGeneration/CmsGenerateContentDialog.js +106 -0
- package/admin/presentation/CmsContentGeneration/CmsGenerateContentDialog.js.map +1 -0
- package/admin/presentation/CmsContentGeneration/CmsGenerateContentPresenter.d.ts +29 -0
- package/admin/presentation/CmsContentGeneration/CmsGenerateContentPresenter.js +120 -0
- package/admin/presentation/CmsContentGeneration/CmsGenerateContentPresenter.js.map +1 -0
- package/admin/presentation/CmsContentGeneration/Extension.d.ts +2 -0
- package/admin/presentation/CmsContentGeneration/Extension.js +27 -0
- package/admin/presentation/CmsContentGeneration/Extension.js.map +1 -0
- package/admin/presentation/CmsContentGeneration/abstractions.d.ts +20 -0
- package/admin/presentation/CmsContentGeneration/abstractions.js +5 -0
- package/admin/presentation/CmsContentGeneration/abstractions.js.map +1 -0
- package/admin/presentation/CmsContentGeneration/feature.d.ts +3 -0
- package/admin/presentation/CmsContentGeneration/feature.js +17 -0
- package/admin/presentation/CmsContentGeneration/feature.js.map +1 -0
- package/admin/presentation/CmsEntryWizard/CmsEntryWizard.d.ts +4 -0
- package/admin/presentation/CmsEntryWizard/CmsEntryWizard.js +113 -0
- package/admin/presentation/CmsEntryWizard/CmsEntryWizard.js.map +1 -0
- package/admin/presentation/CmsEntryWizard/CmsEntryWizardGate.d.ts +4 -0
- package/admin/presentation/CmsEntryWizard/CmsEntryWizardGate.js +19 -0
- package/admin/presentation/CmsEntryWizard/CmsEntryWizardGate.js.map +1 -0
- package/admin/presentation/CmsEntryWizard/Extension.d.ts +2 -0
- package/admin/presentation/CmsEntryWizard/Extension.js +10 -0
- package/admin/presentation/CmsEntryWizard/Extension.js.map +1 -0
- package/admin/presentation/ProjectsSettings.js +4 -4
- package/admin/presentation/ProjectsSettings.js.map +1 -1
- package/admin/presentation/ProvidersSettings.js +1 -1
- package/admin/presentation/ProvidersSettings.js.map +1 -1
- package/admin/presentation/WbContentGeneration/GenerateContentDialog.d.ts +2 -2
- package/admin/presentation/WbContentGeneration/GenerateContentDialog.js +2 -2
- package/admin/presentation/WbContentGeneration/GenerateContentDialog.js.map +1 -1
- package/admin/presentation/WbContentGeneration/GenerateContentPresenter.d.ts +4 -12
- package/admin/presentation/WbContentGeneration/GenerateContentPresenter.js +12 -94
- package/admin/presentation/WbContentGeneration/GenerateContentPresenter.js.map +1 -1
- package/api/Extension.js +13 -3
- package/api/Extension.js.map +1 -1
- package/api/features/AiChatProvider/PowerUpsAiChatProvider.d.ts +24 -0
- package/api/features/AiChatProvider/PowerUpsAiChatProvider.js +31 -0
- package/api/features/AiChatProvider/PowerUpsAiChatProvider.js.map +1 -0
- package/api/features/AiChatProvider/feature.d.ts +9 -0
- package/api/features/AiChatProvider/feature.js +11 -0
- package/api/features/AiChatProvider/feature.js.map +1 -0
- package/api/features/AiChatProvider/index.d.ts +2 -0
- package/api/features/AiChatProvider/index.js +2 -0
- package/api/features/AiImageEnrichment/AiImageEnrichmentStreamRoute.d.ts +36 -0
- package/api/features/AiImageEnrichment/AiImageEnrichmentStreamRoute.js +85 -0
- package/api/features/AiImageEnrichment/AiImageEnrichmentStreamRoute.js.map +1 -0
- package/api/features/AiImageEnrichment/AiImageEnrichmentTask.d.ts +10 -14
- package/api/features/AiImageEnrichment/AiImageEnrichmentTask.js +27 -100
- package/api/features/AiImageEnrichment/AiImageEnrichmentTask.js.map +1 -1
- package/api/features/AiImageEnrichment/ApplyImageEnrichmentUseCase.d.ts +18 -0
- package/api/features/AiImageEnrichment/ApplyImageEnrichmentUseCase.js +50 -0
- package/api/features/AiImageEnrichment/ApplyImageEnrichmentUseCase.js.map +1 -0
- package/api/features/AiImageEnrichment/PrepareImageEnrichmentUseCase.d.ts +19 -0
- package/api/features/AiImageEnrichment/PrepareImageEnrichmentUseCase.js +49 -0
- package/api/features/AiImageEnrichment/PrepareImageEnrichmentUseCase.js.map +1 -0
- package/api/features/AiImageEnrichment/abstractions.d.ts +60 -0
- package/api/features/AiImageEnrichment/abstractions.js +12 -0
- package/api/features/AiImageEnrichment/abstractions.js.map +1 -0
- package/api/features/AiImageEnrichment/buildEnrichmentAiRequest.d.ts +12 -0
- package/api/features/AiImageEnrichment/buildEnrichmentAiRequest.js +30 -0
- package/api/features/AiImageEnrichment/buildEnrichmentAiRequest.js.map +1 -0
- package/api/features/AiImageEnrichment/errors.d.ts +26 -0
- package/api/features/AiImageEnrichment/errors.js +28 -0
- package/api/features/AiImageEnrichment/errors.js.map +1 -0
- package/api/features/AiImageEnrichment/feature.js +9 -0
- package/api/features/AiImageEnrichment/feature.js.map +1 -1
- package/api/features/AiImageEnrichment/imageEnrichmentErrorStatusCode.d.ts +6 -0
- package/api/features/AiImageEnrichment/imageEnrichmentErrorStatusCode.js +9 -0
- package/api/features/AiImageEnrichment/imageEnrichmentErrorStatusCode.js.map +1 -0
- package/api/features/AiImageEnrichment/readEnrichmentPartial.d.ts +8 -0
- package/api/features/AiImageEnrichment/readEnrichmentPartial.js +16 -0
- package/api/features/AiImageEnrichment/readEnrichmentPartial.js.map +1 -0
- package/api/features/AiImageEnrichment/streamEvents.d.ts +36 -0
- package/api/features/AiImageEnrichment/streamEvents.js +0 -0
- package/api/features/AiPromptContext/AiPromptContextBuilder.d.ts +8 -1
- package/api/features/AiPromptContext/AiPromptContextBuilder.js +46 -2
- package/api/features/AiPromptContext/AiPromptContextBuilder.js.map +1 -1
- package/api/features/AiPromptContext/abstractions.d.ts +3 -0
- package/api/features/AiPromptContext/abstractions.js +9 -1
- package/api/features/AiPromptContext/abstractions.js.map +1 -1
- package/api/features/AiPromptContext/index.d.ts +1 -1
- package/api/features/AiPromptContext/index.js +1 -1
- package/api/features/CmsCompareEntryRevisions/CmsCompareEntryRevisionsUseCase.d.ts +22 -0
- package/api/features/CmsCompareEntryRevisions/CmsCompareEntryRevisionsUseCase.js +136 -0
- package/api/features/CmsCompareEntryRevisions/CmsCompareEntryRevisionsUseCase.js.map +1 -0
- package/api/features/CmsCompareEntryRevisions/abstractions.d.ts +18 -0
- package/api/features/CmsCompareEntryRevisions/abstractions.js +5 -0
- package/api/features/CmsCompareEntryRevisions/abstractions.js.map +1 -0
- package/api/features/CmsCompareEntryRevisions/feature.d.ts +4 -0
- package/api/features/CmsCompareEntryRevisions/feature.js +11 -0
- package/api/features/CmsCompareEntryRevisions/feature.js.map +1 -0
- package/api/features/CmsCompareEntryRevisions/index.d.ts +2 -0
- package/api/features/CmsCompareEntryRevisions/index.js +2 -0
- package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentTask.d.ts +33 -0
- package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentTask.js +84 -0
- package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentTask.js.map +1 -0
- package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentUseCase.d.ts +29 -0
- package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentUseCase.js +141 -0
- package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentUseCase.js.map +1 -0
- package/api/features/CmsGenerateEntryContent/abstractions.d.ts +36 -0
- package/api/features/CmsGenerateEntryContent/abstractions.js +5 -0
- package/api/features/CmsGenerateEntryContent/abstractions.js.map +1 -0
- package/api/features/CmsGenerateEntryContent/buildPrompt.d.ts +2 -0
- package/api/features/CmsGenerateEntryContent/buildPrompt.js +61 -0
- package/api/features/CmsGenerateEntryContent/buildPrompt.js.map +1 -0
- package/api/features/CmsGenerateEntryContent/feature.d.ts +4 -0
- package/api/features/CmsGenerateEntryContent/feature.js +13 -0
- package/api/features/CmsGenerateEntryContent/feature.js.map +1 -0
- package/api/features/CmsGenerateEntryContent/index.d.ts +1 -0
- package/api/features/CmsGenerateEntryContent/index.js +1 -0
- package/api/features/CmsGenerateEntryContent/injectDynamicZoneTypenames.d.ts +2 -0
- package/api/features/CmsGenerateEntryContent/injectDynamicZoneTypenames.js +30 -0
- package/api/features/CmsGenerateEntryContent/injectDynamicZoneTypenames.js.map +1 -0
- package/api/features/CmsResolveImageTool/CmsResolveImageTool.d.ts +14 -0
- package/api/features/CmsResolveImageTool/CmsResolveImageTool.js +27 -0
- package/api/features/CmsResolveImageTool/CmsResolveImageTool.js.map +1 -0
- package/api/features/CmsResolveImageTool/feature.d.ts +4 -0
- package/api/features/CmsResolveImageTool/feature.js +11 -0
- package/api/features/CmsResolveImageTool/feature.js.map +1 -0
- package/api/features/GetSettings/GetSettingsUseCase.d.ts +1 -1
- package/api/features/GetSettings/index.d.ts +1 -0
- package/api/features/GetSettings/index.js +1 -0
- package/api/features/Providers/ProvidersHandler.d.ts +1 -3
- package/api/features/Providers/ProvidersHandler.js +2 -15
- package/api/features/Providers/ProvidersHandler.js.map +1 -1
- package/api/features/Providers/types.d.ts +2 -2
- package/api/features/WbGeneratePageContent/WbGeneratePageContentTask.d.ts +4 -3
- package/api/features/WbGeneratePageContent/WbGeneratePageContentTask.js +25 -15
- package/api/features/WbGeneratePageContent/WbGeneratePageContentTask.js.map +1 -1
- package/api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.js +4 -3
- package/api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.js.map +1 -1
- package/api/features/WbGeneratePageContent/abstractions.d.ts +1 -0
- package/api/features/WbGeneratePageContent/abstractions.js.map +1 -1
- package/api/features/WbTranslatePage/LexicalParser.d.ts +10 -0
- package/api/features/WbTranslatePage/LexicalParser.js +37 -0
- package/api/features/WbTranslatePage/LexicalParser.js.map +1 -0
- package/api/features/WbTranslatePage/WbTranslatePageDecorator.d.ts +27 -0
- package/api/features/WbTranslatePage/WbTranslatePageDecorator.js +134 -0
- package/api/features/WbTranslatePage/WbTranslatePageDecorator.js.map +1 -0
- package/api/features/WbTranslatePage/abstractions/LexicalParser.d.ts +7 -0
- package/api/features/WbTranslatePage/abstractions/LexicalParser.js +5 -0
- package/api/features/WbTranslatePage/abstractions/LexicalParser.js.map +1 -0
- package/api/features/WbTranslatePage/feature.d.ts +4 -0
- package/api/features/WbTranslatePage/feature.js +13 -0
- package/api/features/WbTranslatePage/feature.js.map +1 -0
- package/api/features/WbTranslatePage/index.d.ts +2 -0
- package/api/features/WbTranslatePage/index.js +2 -0
- package/api/graphql/BaseGraphQLSchema.d.ts +2 -2
- package/api/graphql/BaseGraphQLSchema.js +45 -6
- package/api/graphql/BaseGraphQLSchema.js.map +1 -1
- package/api/graphql/CmsCompareEntryRevisionsSchema.d.ts +8 -0
- package/api/graphql/CmsCompareEntryRevisionsSchema.js +68 -0
- package/api/graphql/CmsCompareEntryRevisionsSchema.js.map +1 -0
- package/exports/admin/ai-powerups.d.ts +1 -0
- package/exports/admin/ai-powerups.js +1 -0
- package/exports/api/ai-powerups.d.ts +2 -0
- package/exports/api/ai-powerups.js +2 -0
- package/package.json +33 -25
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
|
|
2
|
-
import {
|
|
2
|
+
import { WebsocketsSendToIdentityUseCase } from "@webiny/api-websockets/features/SendToIdentity/abstractions.js";
|
|
3
3
|
import { compress } from "@webiny/utils/features/compression/legacy/gzip.js";
|
|
4
4
|
import { WbGeneratePageContentUseCase } from "./index.js";
|
|
5
5
|
import { IdentityContext } from "@webiny/api-core/exports/api/security.js";
|
|
6
6
|
const WB_GENERATE_PAGE_CONTENT_TASK_ID = "aiPowerUpsGeneratePageContent";
|
|
7
7
|
class WbGeneratePageContentTaskImpl {
|
|
8
|
-
constructor(identityContext, generatePageContent,
|
|
8
|
+
constructor(identityContext, generatePageContent, sendToIdentity){
|
|
9
9
|
this.identityContext = identityContext;
|
|
10
10
|
this.generatePageContent = generatePageContent;
|
|
11
|
-
this.
|
|
11
|
+
this.sendToIdentity = sendToIdentity;
|
|
12
12
|
this.id = WB_GENERATE_PAGE_CONTENT_TASK_ID;
|
|
13
13
|
this.title = "AI Power-Ups - Generate Page Content";
|
|
14
14
|
this.description = "Generates page content using AI based on a user prompt.";
|
|
@@ -18,16 +18,26 @@ class WbGeneratePageContentTaskImpl {
|
|
|
18
18
|
}
|
|
19
19
|
async run({ input, controller }) {
|
|
20
20
|
if (controller.runtime.isAborted()) return controller.response.aborted();
|
|
21
|
-
const result = await this.generatePageContent.execute({
|
|
22
|
-
prompt: input.prompt,
|
|
23
|
-
components: input.components,
|
|
24
|
-
tools: input.tools,
|
|
25
|
-
projectId: input.projectId,
|
|
26
|
-
excludedFileIds: input.excludedFileIds,
|
|
27
|
-
readerPersonaId: input.readerPersonaId,
|
|
28
|
-
writerPersonaId: input.writerPersonaId
|
|
29
|
-
});
|
|
30
21
|
const identity = this.identityContext.getIdentity();
|
|
22
|
+
let result;
|
|
23
|
+
try {
|
|
24
|
+
result = await this.generatePageContent.execute({
|
|
25
|
+
prompt: input.prompt,
|
|
26
|
+
components: input.components,
|
|
27
|
+
tools: input.tools,
|
|
28
|
+
projectId: input.projectId,
|
|
29
|
+
excludedFileIds: input.excludedFileIds,
|
|
30
|
+
readerPersonaId: input.readerPersonaId,
|
|
31
|
+
writerPersonaId: input.writerPersonaId,
|
|
32
|
+
additionalFileIds: input.additionalFileIds
|
|
33
|
+
});
|
|
34
|
+
} catch (err) {
|
|
35
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
36
|
+
await this.sendErrorToUser(identity.id, message);
|
|
37
|
+
return controller.response.error({
|
|
38
|
+
message
|
|
39
|
+
});
|
|
40
|
+
}
|
|
31
41
|
if (result.isFail()) {
|
|
32
42
|
await this.sendErrorToUser(identity.id, result.error.message);
|
|
33
43
|
return controller.response.error({
|
|
@@ -40,7 +50,7 @@ class WbGeneratePageContentTaskImpl {
|
|
|
40
50
|
return controller.response.done("Page content generated successfully.");
|
|
41
51
|
}
|
|
42
52
|
async sendContentToUser(identityId, payload, telemetry) {
|
|
43
|
-
await this.
|
|
53
|
+
await this.sendToIdentity.execute({
|
|
44
54
|
id: identityId
|
|
45
55
|
}, {
|
|
46
56
|
action: "aiPowerUps.generatePageContent.content",
|
|
@@ -52,7 +62,7 @@ class WbGeneratePageContentTaskImpl {
|
|
|
52
62
|
});
|
|
53
63
|
}
|
|
54
64
|
async sendErrorToUser(identityId, message) {
|
|
55
|
-
await this.
|
|
65
|
+
await this.sendToIdentity.execute({
|
|
56
66
|
id: identityId
|
|
57
67
|
}, {
|
|
58
68
|
action: "aiPowerUps.generatePageContent.error",
|
|
@@ -67,7 +77,7 @@ const WbGeneratePageContentTask = TaskDefinition.createImplementation({
|
|
|
67
77
|
dependencies: [
|
|
68
78
|
IdentityContext,
|
|
69
79
|
WbGeneratePageContentUseCase,
|
|
70
|
-
|
|
80
|
+
WebsocketsSendToIdentityUseCase
|
|
71
81
|
]
|
|
72
82
|
});
|
|
73
83
|
export { WB_GENERATE_PAGE_CONTENT_TASK_ID, WbGeneratePageContentTask };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api/features/WbGeneratePageContent/WbGeneratePageContentTask.js","sources":["../../../../src/api/features/WbGeneratePageContent/WbGeneratePageContentTask.ts"],"sourcesContent":["import { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport {
|
|
1
|
+
{"version":3,"file":"api/features/WbGeneratePageContent/WbGeneratePageContentTask.js","sources":["../../../../src/api/features/WbGeneratePageContent/WbGeneratePageContentTask.ts"],"sourcesContent":["import { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { WebsocketsSendToIdentityUseCase } from \"@webiny/api-websockets/features/SendToIdentity/abstractions.js\";\nimport { compress } from \"@webiny/utils/features/compression/legacy/gzip.js\";\nimport { WbGeneratePageContentUseCase } from \"~/api/features/WbGeneratePageContent/index.js\";\nimport type { GenerationTelemetry } from \"~/api/features/WbGeneratePageContent/abstractions.js\";\nimport { IdentityContext } from \"@webiny/api-core/exports/api/security.js\";\n\nexport const WB_GENERATE_PAGE_CONTENT_TASK_ID = \"aiPowerUpsGeneratePageContent\";\n\nexport interface IWbGeneratePageContentTaskInput {\n prompt: string;\n components: unknown;\n tools: unknown;\n projectId?: string | null;\n excludedFileIds?: string[] | null;\n readerPersonaId?: string | null;\n writerPersonaId?: string | null;\n additionalFileIds?: string[] | null;\n}\n\nclass WbGeneratePageContentTaskImpl implements TaskDefinition.Interface<IWbGeneratePageContentTaskInput> {\n id = WB_GENERATE_PAGE_CONTENT_TASK_ID;\n title = \"AI Power-Ups - Generate Page Content\";\n description = \"Generates page content using AI based on a user prompt.\";\n maxIterations = 1;\n isPrivate = true;\n databaseLogs = false;\n\n constructor(\n private identityContext: IdentityContext.Interface,\n private generatePageContent: WbGeneratePageContentUseCase.Interface,\n private sendToIdentity: WebsocketsSendToIdentityUseCase.Interface\n ) {}\n\n async run({\n input,\n controller\n }: TaskDefinition.RunParams<IWbGeneratePageContentTaskInput>): Promise<\n TaskDefinition.Result<IWbGeneratePageContentTaskInput>\n > {\n if (controller.runtime.isAborted()) {\n return controller.response.aborted();\n }\n\n const identity = this.identityContext.getIdentity();\n\n let result;\n try {\n result = await this.generatePageContent.execute({\n prompt: input.prompt,\n components: input.components,\n tools: input.tools,\n projectId: input.projectId,\n excludedFileIds: input.excludedFileIds,\n readerPersonaId: input.readerPersonaId,\n writerPersonaId: input.writerPersonaId,\n additionalFileIds: input.additionalFileIds\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n await this.sendErrorToUser(identity.id, message);\n return controller.response.error({ message });\n }\n\n if (result.isFail()) {\n await this.sendErrorToUser(identity.id, result.error.message);\n\n return controller.response.error({\n message: result.error.message\n });\n }\n\n const compressed = await compress(result.value.output);\n const payload = compressed.toString(\"base64\");\n\n await this.sendContentToUser(identity.id, payload, result.value.telemetry);\n\n return controller.response.done(\"Page content generated successfully.\");\n }\n\n private async sendContentToUser(\n identityId: string,\n payload: string,\n telemetry: GenerationTelemetry\n ) {\n await this.sendToIdentity.execute(\n { id: identityId },\n {\n action: \"aiPowerUps.generatePageContent.content\",\n data: {\n compression: \"gzip\",\n value: payload,\n telemetry\n }\n }\n );\n }\n\n private async sendErrorToUser(identityId: string, message: string) {\n await this.sendToIdentity.execute(\n { id: identityId },\n {\n action: \"aiPowerUps.generatePageContent.error\",\n data: {\n message\n }\n }\n );\n }\n}\n\nexport const WbGeneratePageContentTask = TaskDefinition.createImplementation({\n implementation: WbGeneratePageContentTaskImpl,\n dependencies: [IdentityContext, WbGeneratePageContentUseCase, WebsocketsSendToIdentityUseCase]\n});\n"],"names":["WB_GENERATE_PAGE_CONTENT_TASK_ID","WbGeneratePageContentTaskImpl","identityContext","generatePageContent","sendToIdentity","input","controller","identity","result","err","message","Error","String","compressed","compress","payload","identityId","telemetry","WbGeneratePageContentTask","TaskDefinition","IdentityContext","WbGeneratePageContentUseCase","WebsocketsSendToIdentityUseCase"],"mappings":";;;;;AAOO,MAAMA,mCAAmC;AAahD,MAAMC;IAQF,YACYC,eAA0C,EAC1CC,mBAA2D,EAC3DC,cAAyD,CACnE;aAHUF,eAAe,GAAfA;aACAC,mBAAmB,GAAnBA;aACAC,cAAc,GAAdA;aAVZ,EAAE,GAAGJ;aACL,KAAK,GAAG;aACR,WAAW,GAAG;aACd,aAAa,GAAG;aAChB,SAAS,GAAG;aACZ,YAAY,GAAG;IAMZ;IAEH,MAAM,IAAI,EACNK,KAAK,EACLC,UAAU,EAC8C,EAE1D;QACE,IAAIA,WAAW,OAAO,CAAC,SAAS,IAC5B,OAAOA,WAAW,QAAQ,CAAC,OAAO;QAGtC,MAAMC,WAAW,IAAI,CAAC,eAAe,CAAC,WAAW;QAEjD,IAAIC;QACJ,IAAI;YACAA,SAAS,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC;gBAC5C,QAAQH,MAAM,MAAM;gBACpB,YAAYA,MAAM,UAAU;gBAC5B,OAAOA,MAAM,KAAK;gBAClB,WAAWA,MAAM,SAAS;gBAC1B,iBAAiBA,MAAM,eAAe;gBACtC,iBAAiBA,MAAM,eAAe;gBACtC,iBAAiBA,MAAM,eAAe;gBACtC,mBAAmBA,MAAM,iBAAiB;YAC9C;QACJ,EAAE,OAAOI,KAAK;YACV,MAAMC,UAAUD,eAAeE,QAAQF,IAAI,OAAO,GAAGG,OAAOH;YAC5D,MAAM,IAAI,CAAC,eAAe,CAACF,SAAS,EAAE,EAAEG;YACxC,OAAOJ,WAAW,QAAQ,CAAC,KAAK,CAAC;gBAAEI;YAAQ;QAC/C;QAEA,IAAIF,OAAO,MAAM,IAAI;YACjB,MAAM,IAAI,CAAC,eAAe,CAACD,SAAS,EAAE,EAAEC,OAAO,KAAK,CAAC,OAAO;YAE5D,OAAOF,WAAW,QAAQ,CAAC,KAAK,CAAC;gBAC7B,SAASE,OAAO,KAAK,CAAC,OAAO;YACjC;QACJ;QAEA,MAAMK,aAAa,MAAMC,SAASN,OAAO,KAAK,CAAC,MAAM;QACrD,MAAMO,UAAUF,WAAW,QAAQ,CAAC;QAEpC,MAAM,IAAI,CAAC,iBAAiB,CAACN,SAAS,EAAE,EAAEQ,SAASP,OAAO,KAAK,CAAC,SAAS;QAEzE,OAAOF,WAAW,QAAQ,CAAC,IAAI,CAAC;IACpC;IAEA,MAAc,kBACVU,UAAkB,EAClBD,OAAe,EACfE,SAA8B,EAChC;QACE,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B;YAAE,IAAID;QAAW,GACjB;YACI,QAAQ;YACR,MAAM;gBACF,aAAa;gBACb,OAAOD;gBACPE;YACJ;QACJ;IAER;IAEA,MAAc,gBAAgBD,UAAkB,EAAEN,OAAe,EAAE;QAC/D,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B;YAAE,IAAIM;QAAW,GACjB;YACI,QAAQ;YACR,MAAM;gBACFN;YACJ;QACJ;IAER;AACJ;AAEO,MAAMQ,4BAA4BC,eAAe,oBAAoB,CAAC;IACzE,gBAAgBlB;IAChB,cAAc;QAACmB;QAAiBC;QAA8BC;KAAgC;AAClG"}
|
|
@@ -4,7 +4,7 @@ import { Ai, AiSdkTools } from "@webiny/api-core/features/ai/index.js";
|
|
|
4
4
|
import { Encryption } from "@webiny/api-core/features/encryption/index.js";
|
|
5
5
|
import { ListTagsUseCase } from "@webiny/api-file-manager/features/file/ListTags/index.js";
|
|
6
6
|
import { GetSettingsUseCase } from "../GetSettings/index.js";
|
|
7
|
-
import { AiPromptContextBuilder } from "../AiPromptContext/index.js";
|
|
7
|
+
import { AiPromptContextBuilder, formatAdditionalFilesContext } from "../AiPromptContext/index.js";
|
|
8
8
|
import { createReadProjectFileTool } from "../AiPromptContext/ReadProjectFileTool.js";
|
|
9
9
|
import { WbGeneratePageContentUseCase } from "./abstractions.js";
|
|
10
10
|
import { buildDomainPrompt } from "./buildPrompt.js";
|
|
@@ -31,7 +31,8 @@ class WbGeneratePageContentUseCaseImpl {
|
|
|
31
31
|
projectId: params.projectId,
|
|
32
32
|
readerPersonaId: params.readerPersonaId,
|
|
33
33
|
writerPersonaId: params.writerPersonaId,
|
|
34
|
-
excludedFileIds: params.excludedFileIds
|
|
34
|
+
excludedFileIds: params.excludedFileIds,
|
|
35
|
+
additionalFileIds: params.additionalFileIds
|
|
35
36
|
});
|
|
36
37
|
if (context.allProjectFiles.length > 0) {
|
|
37
38
|
const projectFileTool = createReadProjectFileTool(context.allProjectFiles, context.excludedFileIds);
|
|
@@ -66,7 +67,7 @@ class WbGeneratePageContentUseCaseImpl {
|
|
|
66
67
|
},
|
|
67
68
|
system,
|
|
68
69
|
toolChoice: "auto",
|
|
69
|
-
prompt: params.prompt,
|
|
70
|
+
prompt: params.prompt + formatAdditionalFilesContext(context.additionalFiles),
|
|
70
71
|
...Object.keys(sdkTools).length > 0 ? {
|
|
71
72
|
tools: sdkTools,
|
|
72
73
|
stopWhen: stepCountIs(20)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.js","sources":["../../../../src/api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.ts"],"sourcesContent":["import { stepCountIs } from \"ai\";\nimport { Result } from \"@webiny/feature/api\";\nimport { Ai } from \"@webiny/api-core/features/ai/index.js\";\nimport { AiSdkTools } from \"@webiny/api-core/features/ai/index.js\";\nimport { Encryption } from \"@webiny/api-core/features/encryption/index.js\";\nimport { ListTagsUseCase } from \"@webiny/api-file-manager/features/file/ListTags/index.js\";\nimport { GetSettingsUseCase } from \"~/api/features/GetSettings/index.js\";\nimport {
|
|
1
|
+
{"version":3,"file":"api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.js","sources":["../../../../src/api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.ts"],"sourcesContent":["import { stepCountIs } from \"ai\";\nimport { Result } from \"@webiny/feature/api\";\nimport { Ai } from \"@webiny/api-core/features/ai/index.js\";\nimport { AiSdkTools } from \"@webiny/api-core/features/ai/index.js\";\nimport { Encryption } from \"@webiny/api-core/features/encryption/index.js\";\nimport { ListTagsUseCase } from \"@webiny/api-file-manager/features/file/ListTags/index.js\";\nimport { GetSettingsUseCase } from \"~/api/features/GetSettings/index.js\";\nimport {\n AiPromptContextBuilder,\n formatAdditionalFilesContext\n} from \"~/api/features/AiPromptContext/index.js\";\nimport { createReadProjectFileTool } from \"~/api/features/AiPromptContext/ReadProjectFileTool.js\";\nimport { WbGeneratePageContentUseCase } from \"./abstractions.js\";\nimport type {\n WbGeneratePageContentParams,\n GeneratePageContentResult,\n GenerationTelemetry\n} from \"./abstractions.js\";\nimport { buildDomainPrompt } from \"./buildPrompt.js\";\nimport { LlmJsonResponse } from \"./LlmJsonResponse.js\";\nimport { ComponentFilter } from \"./ComponentFilter.js\";\n\nclass WbGeneratePageContentUseCaseImpl implements WbGeneratePageContentUseCase.Interface {\n constructor(\n private promptContextBuilder: AiPromptContextBuilder.Interface,\n private getSettings: GetSettingsUseCase.Interface,\n private ai: Ai.Interface,\n private aiSdkTools: AiSdkTools.Interface,\n private encryption: Encryption.Interface,\n private listTags: ListTagsUseCase.Interface\n ) {}\n\n async execute(\n params: WbGeneratePageContentParams\n ): Promise<Result<GeneratePageContentResult, Error>> {\n const settingsResult = await this.getSettings.execute();\n if (settingsResult.isFail()) {\n return Result.fail(new Error(\"Failed to load AI PowerUps settings.\"));\n }\n\n const settings = settingsResult.value;\n const firstProvider = settings.providers.presets[0];\n\n if (!firstProvider) {\n return Result.fail(\n new Error(\"No AI provider configured. Add a provider in AI Power Ups settings.\")\n );\n }\n\n const apiKey = await this.encryption.decrypt(firstProvider.apiKeyEncrypted);\n\n const sdkTools = this.aiSdkTools.getToolSet();\n\n const context = await this.promptContextBuilder.execute({\n projectId: params.projectId,\n readerPersonaId: params.readerPersonaId,\n writerPersonaId: params.writerPersonaId,\n excludedFileIds: params.excludedFileIds,\n additionalFileIds: params.additionalFileIds\n });\n\n if (context.allProjectFiles.length > 0) {\n const projectFileTool = createReadProjectFileTool(\n context.allProjectFiles,\n context.excludedFileIds\n );\n Object.assign(sdkTools, projectFileTool);\n }\n\n // Fetch image tags so the prompt can enumerate what's queryable; without\n // this the model invents tag/IDs instead of calling listImagesByTag.\n const tagsResult = await this.listTags.execute({\n where: { type_startsWith: \"image/\" },\n limit: 100\n });\n const imageTags = tagsResult.isOk() ? tagsResult.value.map(t => t.tag) : [];\n\n const components = params.components as Array<{ name: string }>;\n const systemText =\n buildDomainPrompt(components, params.tools, imageTags) + context.toString();\n\n const system = {\n role: \"system\" as const,\n content: systemText,\n providerOptions: {\n anthropic: {\n cacheControl: { type: \"ephemeral\" }\n }\n }\n };\n\n try {\n const aiResult = await this.ai.generateText({\n model: firstProvider.model,\n connection: {\n sdkName: firstProvider.model.split(\"/\")[0],\n apiKey\n },\n system,\n toolChoice: \"auto\",\n prompt: params.prompt + formatAdditionalFilesContext(context.additionalFiles),\n ...(Object.keys(sdkTools).length > 0\n ? { tools: sdkTools, stopWhen: stepCountIs(20) }\n : {})\n });\n\n const text =\n aiResult.text ||\n (aiResult.steps.filter(step => step.text.length > 0).pop()?.text ?? \"\");\n\n const elements = LlmJsonResponse.fromRawText(text).toArray();\n const componentFilter = new ComponentFilter(components);\n const output = JSON.stringify(componentFilter.filter(elements));\n\n const filesRead = new Set<string>();\n let toolCallsMade = 0;\n for (const step of aiResult.steps) {\n for (const call of step.toolCalls) {\n toolCallsMade++;\n if (call.toolName === \"read_project_file\") {\n const input = call.input as { fileId?: string };\n if (input.fileId) {\n filesRead.add(input.fileId);\n }\n }\n }\n }\n\n const telemetry: GenerationTelemetry = {\n filesRead: [...filesRead],\n cacheHit: context.cacheHit,\n toolCallsMade,\n totalSteps: aiResult.steps.length,\n toolsAvailable: Object.keys(sdkTools),\n imageTagsInPrompt: imageTags\n };\n\n return Result.ok({ output, telemetry });\n } catch (error) {\n return Result.fail(\n new Error(\n `AI generation failed: ${error instanceof Error ? error.message : String(error)}`\n )\n );\n }\n }\n}\n\nexport const WbGeneratePageContentUseCaseImplementation =\n WbGeneratePageContentUseCase.createImplementation({\n implementation: WbGeneratePageContentUseCaseImpl,\n dependencies: [\n AiPromptContextBuilder,\n GetSettingsUseCase,\n Ai,\n AiSdkTools,\n Encryption,\n ListTagsUseCase\n ]\n });\n"],"names":["WbGeneratePageContentUseCaseImpl","promptContextBuilder","getSettings","ai","aiSdkTools","encryption","listTags","params","settingsResult","Result","Error","settings","firstProvider","apiKey","sdkTools","context","projectFileTool","createReadProjectFileTool","Object","tagsResult","imageTags","t","components","systemText","buildDomainPrompt","system","aiResult","formatAdditionalFilesContext","stepCountIs","text","step","elements","LlmJsonResponse","componentFilter","ComponentFilter","output","JSON","filesRead","Set","toolCallsMade","call","input","telemetry","error","String","WbGeneratePageContentUseCaseImplementation","WbGeneratePageContentUseCase","AiPromptContextBuilder","GetSettingsUseCase","Ai","AiSdkTools","Encryption","ListTagsUseCase"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api/features/WbGeneratePageContent/abstractions.js","sources":["../../../../src/api/features/WbGeneratePageContent/abstractions.ts"],"sourcesContent":["import { createAbstraction, Result } from \"@webiny/feature/api\";\n\nexport interface WbGeneratePageContentParams {\n prompt: string;\n components: unknown;\n tools: unknown;\n projectId?: string | null;\n excludedFileIds?: string[] | null;\n readerPersonaId?: string | null;\n writerPersonaId?: string | null;\n}\n\nexport interface GenerationTelemetry {\n filesRead: string[];\n cacheHit: boolean;\n toolCallsMade: number;\n totalSteps: number;\n toolsAvailable: string[];\n imageTagsInPrompt: string[];\n}\n\nexport interface GeneratePageContentResult {\n output: string;\n telemetry: GenerationTelemetry;\n}\n\nexport interface IWbGeneratePageContentUseCase {\n execute(params: WbGeneratePageContentParams): Promise<Result<GeneratePageContentResult, Error>>;\n}\n\nexport const WbGeneratePageContentUseCase = createAbstraction<IWbGeneratePageContentUseCase>(\n \"AiPowerUpsWbGeneratePageContentUseCase\"\n);\n\nexport namespace WbGeneratePageContentUseCase {\n export type Interface = IWbGeneratePageContentUseCase;\n export type Params = WbGeneratePageContentParams;\n}\n"],"names":["WbGeneratePageContentUseCase","createAbstraction"],"mappings":";
|
|
1
|
+
{"version":3,"file":"api/features/WbGeneratePageContent/abstractions.js","sources":["../../../../src/api/features/WbGeneratePageContent/abstractions.ts"],"sourcesContent":["import { createAbstraction, Result } from \"@webiny/feature/api\";\n\nexport interface WbGeneratePageContentParams {\n prompt: string;\n components: unknown;\n tools: unknown;\n projectId?: string | null;\n excludedFileIds?: string[] | null;\n readerPersonaId?: string | null;\n writerPersonaId?: string | null;\n additionalFileIds?: string[] | null;\n}\n\nexport interface GenerationTelemetry {\n filesRead: string[];\n cacheHit: boolean;\n toolCallsMade: number;\n totalSteps: number;\n toolsAvailable: string[];\n imageTagsInPrompt: string[];\n}\n\nexport interface GeneratePageContentResult {\n output: string;\n telemetry: GenerationTelemetry;\n}\n\nexport interface IWbGeneratePageContentUseCase {\n execute(params: WbGeneratePageContentParams): Promise<Result<GeneratePageContentResult, Error>>;\n}\n\nexport const WbGeneratePageContentUseCase = createAbstraction<IWbGeneratePageContentUseCase>(\n \"AiPowerUpsWbGeneratePageContentUseCase\"\n);\n\nexport namespace WbGeneratePageContentUseCase {\n export type Interface = IWbGeneratePageContentUseCase;\n export type Params = WbGeneratePageContentParams;\n}\n"],"names":["WbGeneratePageContentUseCase","createAbstraction"],"mappings":";AA+BO,MAAMA,+BAA+BC,kBACxC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { LexicalParser as Abstraction } from "./abstractions/LexicalParser.js";
|
|
2
|
+
declare class LexicalParserImpl implements Abstraction.Interface {
|
|
3
|
+
private WindowClass;
|
|
4
|
+
parse(html: string): Promise<Record<string, unknown> | null>;
|
|
5
|
+
private loadWindow;
|
|
6
|
+
}
|
|
7
|
+
export declare const LexicalParser: typeof LexicalParserImpl & {
|
|
8
|
+
__abstraction: import("@webiny/di").Abstraction<import("./abstractions/LexicalParser.js").ILexicalParser>;
|
|
9
|
+
};
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { createHtmlToLexicalParser } from "@webiny/lexical-converter";
|
|
2
|
+
import { LexicalParser } from "./abstractions/LexicalParser.js";
|
|
3
|
+
const parser = createHtmlToLexicalParser();
|
|
4
|
+
class LexicalParserImpl {
|
|
5
|
+
async parse(html) {
|
|
6
|
+
try {
|
|
7
|
+
const Window = await this.loadWindow();
|
|
8
|
+
const window = new Window();
|
|
9
|
+
const document = window.document;
|
|
10
|
+
document.body.innerHTML = html;
|
|
11
|
+
const result = parser(document);
|
|
12
|
+
await window.happyDOM.close();
|
|
13
|
+
return result;
|
|
14
|
+
} catch (error) {
|
|
15
|
+
console.error("[LexicalParser] Failed to parse HTML to Lexical state:", error);
|
|
16
|
+
console.error("[LexicalParser] Input HTML:", html);
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
async loadWindow() {
|
|
21
|
+
if (!this.WindowClass) {
|
|
22
|
+
const { Window } = await import("happy-dom");
|
|
23
|
+
this.WindowClass = Window;
|
|
24
|
+
}
|
|
25
|
+
return this.WindowClass;
|
|
26
|
+
}
|
|
27
|
+
constructor(){
|
|
28
|
+
this.WindowClass = null;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const LexicalParser_LexicalParser = LexicalParser.createImplementation({
|
|
32
|
+
implementation: LexicalParserImpl,
|
|
33
|
+
dependencies: []
|
|
34
|
+
});
|
|
35
|
+
export { LexicalParser_LexicalParser as LexicalParser };
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=LexicalParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api/features/WbTranslatePage/LexicalParser.js","sources":["../../../../src/api/features/WbTranslatePage/LexicalParser.ts"],"sourcesContent":["import { createHtmlToLexicalParser } from \"@webiny/lexical-converter\";\nimport { LexicalParser as Abstraction } from \"./abstractions/LexicalParser.js\";\n\nconst parser = createHtmlToLexicalParser();\n\nclass LexicalParserImpl implements Abstraction.Interface {\n private WindowClass: typeof import(\"happy-dom\").Window | null = null;\n\n async parse(html: string): Promise<Record<string, unknown> | null> {\n try {\n const Window = await this.loadWindow();\n const window = new Window();\n const document = window.document;\n document.body.innerHTML = html;\n const result = parser(document as unknown as Document);\n await window.happyDOM.close();\n return result;\n } catch (error) {\n console.error(\"[LexicalParser] Failed to parse HTML to Lexical state:\", error);\n console.error(\"[LexicalParser] Input HTML:\", html);\n return null;\n }\n }\n\n private async loadWindow() {\n if (!this.WindowClass) {\n const { Window } = await import(\"happy-dom\");\n this.WindowClass = Window;\n }\n return this.WindowClass;\n }\n}\n\nexport const LexicalParser = Abstraction.createImplementation({\n implementation: LexicalParserImpl,\n dependencies: []\n});\n"],"names":["parser","createHtmlToLexicalParser","LexicalParserImpl","html","Window","window","document","result","error","console","LexicalParser","Abstraction"],"mappings":";;AAGA,MAAMA,SAASC;AAEf,MAAMC;IAGF,MAAM,MAAMC,IAAY,EAA2C;QAC/D,IAAI;YACA,MAAMC,SAAS,MAAM,IAAI,CAAC,UAAU;YACpC,MAAMC,SAAS,IAAID;YACnB,MAAME,WAAWD,OAAO,QAAQ;YAChCC,SAAS,IAAI,CAAC,SAAS,GAAGH;YAC1B,MAAMI,SAASP,OAAOM;YACtB,MAAMD,OAAO,QAAQ,CAAC,KAAK;YAC3B,OAAOE;QACX,EAAE,OAAOC,OAAO;YACZC,QAAQ,KAAK,CAAC,0DAA0DD;YACxEC,QAAQ,KAAK,CAAC,+BAA+BN;YAC7C,OAAO;QACX;IACJ;IAEA,MAAc,aAAa;QACvB,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;YACnB,MAAM,EAAEC,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC;YAChC,IAAI,CAAC,WAAW,GAAGA;QACvB;QACA,OAAO,IAAI,CAAC,WAAW;IAC3B;;aAxBQ,WAAW,GAA6C;;AAyBpE;AAEO,MAAMM,8BAAgBC,cAAAA,oBAAgC,CAAC;IAC1D,gBAAgBT;IAChB,cAAc,EAAE;AACpB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Ai } from "@webiny/api-core/features/ai/index.js";
|
|
2
|
+
import { Encryption } from "@webiny/api-core/features/encryption/index.js";
|
|
3
|
+
import { GetDefaultLanguageUseCase } from "@webiny/languages/exports/api/languages.js";
|
|
4
|
+
import { TranslatePageUseCase } from "@webiny/api-website-builder/features/pages/TranslatePage/index.js";
|
|
5
|
+
import { UpdatePageRepository } from "@webiny/api-website-builder/features/pages/UpdatePage/abstractions.js";
|
|
6
|
+
import { GetSettingsUseCase } from "../../../api/features/GetSettings/index.js";
|
|
7
|
+
import { LexicalParser } from "./abstractions/LexicalParser.js";
|
|
8
|
+
declare class WbTranslatePageDecoratorImpl implements TranslatePageUseCase.Interface {
|
|
9
|
+
private getDefaultLanguage;
|
|
10
|
+
private getSettings;
|
|
11
|
+
private ai;
|
|
12
|
+
private encryption;
|
|
13
|
+
private lexicalParser;
|
|
14
|
+
private updatePageRepository;
|
|
15
|
+
private decoratee;
|
|
16
|
+
constructor(getDefaultLanguage: GetDefaultLanguageUseCase.Interface, getSettings: GetSettingsUseCase.Interface, ai: Ai.Interface, encryption: Encryption.Interface, lexicalParser: LexicalParser.Interface, updatePageRepository: UpdatePageRepository.Interface, decoratee: TranslatePageUseCase.Interface);
|
|
17
|
+
execute(params: TranslatePageUseCase.Params): TranslatePageUseCase.Return;
|
|
18
|
+
private resolveSourceLanguage;
|
|
19
|
+
private translate;
|
|
20
|
+
private extractBindings;
|
|
21
|
+
private slugify;
|
|
22
|
+
private buildUpdateData;
|
|
23
|
+
}
|
|
24
|
+
export declare const WbTranslatePageDecorator: typeof WbTranslatePageDecoratorImpl & {
|
|
25
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-website-builder/features/pages/TranslatePage/abstractions.js").ITranslatePageUseCase>;
|
|
26
|
+
};
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import set from "lodash/set";
|
|
2
|
+
import { Result } from "@webiny/feature/api";
|
|
3
|
+
import { Ai } from "@webiny/api-core/features/ai/index.js";
|
|
4
|
+
import { Encryption } from "@webiny/api-core/features/encryption/index.js";
|
|
5
|
+
import { GetDefaultLanguageUseCase } from "@webiny/languages/exports/api/languages.js";
|
|
6
|
+
import { TranslatePageUseCase } from "@webiny/api-website-builder/features/pages/TranslatePage/index.js";
|
|
7
|
+
import { UpdatePageRepository } from "@webiny/api-website-builder/features/pages/UpdatePage/abstractions.js";
|
|
8
|
+
import { GetSettingsUseCase } from "../GetSettings/index.js";
|
|
9
|
+
import { LexicalParser } from "./abstractions/LexicalParser.js";
|
|
10
|
+
class WbTranslatePageDecoratorImpl {
|
|
11
|
+
constructor(getDefaultLanguage, getSettings, ai, encryption, lexicalParser, updatePageRepository, decoratee){
|
|
12
|
+
this.getDefaultLanguage = getDefaultLanguage;
|
|
13
|
+
this.getSettings = getSettings;
|
|
14
|
+
this.ai = ai;
|
|
15
|
+
this.encryption = encryption;
|
|
16
|
+
this.lexicalParser = lexicalParser;
|
|
17
|
+
this.updatePageRepository = updatePageRepository;
|
|
18
|
+
this.decoratee = decoratee;
|
|
19
|
+
}
|
|
20
|
+
async execute(params) {
|
|
21
|
+
const result = await this.decoratee.execute(params);
|
|
22
|
+
if (result.isFail()) return result;
|
|
23
|
+
const page = result.value;
|
|
24
|
+
const sourceLanguage = await this.resolveSourceLanguage(page);
|
|
25
|
+
const translations = await this.translate(page, sourceLanguage, params.languageCode);
|
|
26
|
+
if (!translations) return Result.ok(page);
|
|
27
|
+
const updateData = await this.buildUpdateData(page, translations);
|
|
28
|
+
const updateResult = await this.updatePageRepository.execute(page.id, updateData);
|
|
29
|
+
if (updateResult.isFail()) return Result.ok(page);
|
|
30
|
+
return Result.ok(updateResult.value);
|
|
31
|
+
}
|
|
32
|
+
async resolveSourceLanguage(page) {
|
|
33
|
+
if (page.properties["sourcePage"]) return page.properties["language"] ?? "en";
|
|
34
|
+
const result = await this.getDefaultLanguage.execute();
|
|
35
|
+
if (result.isOk()) return result.value.code;
|
|
36
|
+
return "en";
|
|
37
|
+
}
|
|
38
|
+
async translate(page, sourceLanguage, targetLanguage) {
|
|
39
|
+
const settingsResult = await this.getSettings.execute();
|
|
40
|
+
if (settingsResult.isFail()) return null;
|
|
41
|
+
const settings = settingsResult.value;
|
|
42
|
+
const firstProvider = settings.providers.presets[0];
|
|
43
|
+
if (!firstProvider) return null;
|
|
44
|
+
const apiKey = await this.encryption.decrypt(firstProvider.apiKeyEncrypted);
|
|
45
|
+
const properties = {
|
|
46
|
+
title: page.properties["title"],
|
|
47
|
+
snippet: page.properties["snippet"],
|
|
48
|
+
pathSlug: page.properties["title"]
|
|
49
|
+
};
|
|
50
|
+
const bindings = this.extractBindings(page.bindings);
|
|
51
|
+
const input = JSON.stringify({
|
|
52
|
+
properties,
|
|
53
|
+
bindings
|
|
54
|
+
});
|
|
55
|
+
const result = await this.ai.generateText({
|
|
56
|
+
model: firstProvider.model,
|
|
57
|
+
connection: {
|
|
58
|
+
sdkName: firstProvider.model.split("/")[0],
|
|
59
|
+
apiKey
|
|
60
|
+
},
|
|
61
|
+
system: `You are a professional translator. Translate all user-provided text to language code "${targetLanguage}", preserving placeholders and formatting. Return a JSON object with the same keys, only changing the values.`,
|
|
62
|
+
prompt: `Translate given key-value pairs from "${sourceLanguage}" to language code "${targetLanguage}". Do not modify the keys. "properties" is a simple key-value pair. "bindings" values are located in the "value" key. ${input}`,
|
|
63
|
+
temperature: 0.3
|
|
64
|
+
});
|
|
65
|
+
try {
|
|
66
|
+
return JSON.parse(result.text);
|
|
67
|
+
} catch {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
extractBindings(bindings) {
|
|
72
|
+
const result = {};
|
|
73
|
+
for(const elementId in bindings){
|
|
74
|
+
const element = bindings[elementId];
|
|
75
|
+
const inputs = element.inputs;
|
|
76
|
+
if (inputs) for(const inputName in inputs){
|
|
77
|
+
const input = inputs[inputName];
|
|
78
|
+
if ("text" === input.type || "longText" === input.type) result[`${elementId}.inputs.${inputName}`] = {
|
|
79
|
+
type: input.type,
|
|
80
|
+
value: input.static
|
|
81
|
+
};
|
|
82
|
+
else if ("lexical" === input.type && input.static?.html) result[`${elementId}.inputs.${inputName}`] = {
|
|
83
|
+
type: input.type,
|
|
84
|
+
value: input.static.html
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return result;
|
|
89
|
+
}
|
|
90
|
+
slugify(text) {
|
|
91
|
+
return text.toLowerCase().normalize("NFKD").replace(/[̀-ͯ]/g, "").replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
|
|
92
|
+
}
|
|
93
|
+
async buildUpdateData(page, translations) {
|
|
94
|
+
const properties = {
|
|
95
|
+
...page.properties
|
|
96
|
+
};
|
|
97
|
+
const bindings = structuredClone(page.bindings);
|
|
98
|
+
const translatedPathSlug = translations.properties["pathSlug"];
|
|
99
|
+
delete translations.properties["pathSlug"];
|
|
100
|
+
for (const [key, value] of Object.entries(translations.properties))properties[key] = value;
|
|
101
|
+
if (translatedPathSlug) {
|
|
102
|
+
const slug = this.slugify(translatedPathSlug);
|
|
103
|
+
if (slug) {
|
|
104
|
+
const languageCode = page.properties["language"];
|
|
105
|
+
properties["path"] = `/${languageCode}/${slug}`;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
for (const [key, binding] of Object.entries(translations.bindings))if ("lexical" === binding.type) {
|
|
109
|
+
const state = await this.lexicalParser.parse(binding.value);
|
|
110
|
+
if (state) {
|
|
111
|
+
set(bindings, `${key}.static.state`, JSON.stringify(state));
|
|
112
|
+
set(bindings, `${key}.static.html`, binding.value);
|
|
113
|
+
}
|
|
114
|
+
} else set(bindings, `${key}.static`, binding.value);
|
|
115
|
+
return {
|
|
116
|
+
properties,
|
|
117
|
+
bindings
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
const WbTranslatePageDecorator = TranslatePageUseCase.createDecorator({
|
|
122
|
+
decorator: WbTranslatePageDecoratorImpl,
|
|
123
|
+
dependencies: [
|
|
124
|
+
GetDefaultLanguageUseCase,
|
|
125
|
+
GetSettingsUseCase,
|
|
126
|
+
Ai,
|
|
127
|
+
Encryption,
|
|
128
|
+
LexicalParser,
|
|
129
|
+
UpdatePageRepository
|
|
130
|
+
]
|
|
131
|
+
});
|
|
132
|
+
export { WbTranslatePageDecorator };
|
|
133
|
+
|
|
134
|
+
//# sourceMappingURL=WbTranslatePageDecorator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api/features/WbTranslatePage/WbTranslatePageDecorator.js","sources":["../../../../src/api/features/WbTranslatePage/WbTranslatePageDecorator.ts"],"sourcesContent":["import set from \"lodash/set\";\nimport { Result } from \"@webiny/feature/api\";\nimport { Ai } from \"@webiny/api-core/features/ai/index.js\";\nimport { Encryption } from \"@webiny/api-core/features/encryption/index.js\";\nimport { GetDefaultLanguageUseCase } from \"@webiny/languages/exports/api/languages.js\";\nimport { TranslatePageUseCase } from \"@webiny/api-website-builder/features/pages/TranslatePage/index.js\";\nimport { UpdatePageRepository } from \"@webiny/api-website-builder/features/pages/UpdatePage/abstractions.js\";\nimport type { WbPage } from \"@webiny/api-website-builder/domain/page/abstractions.js\";\nimport { GetSettingsUseCase } from \"~/api/features/GetSettings/index.js\";\nimport { LexicalParser } from \"./abstractions/LexicalParser.js\";\n\ntype InputType = \"text\" | \"longText\" | \"lexical\";\n\ninterface TranslatableBinding {\n type: InputType;\n value: string;\n}\n\ntype TranslatableBindings = Record<string, TranslatableBinding>;\n\ninterface TranslatedBindings {\n [key: string]: { type: InputType; value: string };\n}\n\ninterface TranslatedData {\n properties: Record<string, string>;\n bindings: TranslatedBindings;\n}\n\nclass WbTranslatePageDecoratorImpl implements TranslatePageUseCase.Interface {\n constructor(\n private getDefaultLanguage: GetDefaultLanguageUseCase.Interface,\n private getSettings: GetSettingsUseCase.Interface,\n private ai: Ai.Interface,\n private encryption: Encryption.Interface,\n private lexicalParser: LexicalParser.Interface,\n private updatePageRepository: UpdatePageRepository.Interface,\n private decoratee: TranslatePageUseCase.Interface\n ) {}\n\n async execute(params: TranslatePageUseCase.Params): TranslatePageUseCase.Return {\n const result = await this.decoratee.execute(params);\n if (result.isFail()) {\n return result;\n }\n\n const page = result.value;\n const sourceLanguage = await this.resolveSourceLanguage(page);\n\n const translations = await this.translate(page, sourceLanguage, params.languageCode);\n if (!translations) {\n return Result.ok(page);\n }\n\n const updateData = await this.buildUpdateData(page, translations);\n const updateResult = await this.updatePageRepository.execute(page.id, updateData);\n if (updateResult.isFail()) {\n return Result.ok(page);\n }\n\n return Result.ok(updateResult.value);\n }\n\n private async resolveSourceLanguage(page: WbPage): Promise<string> {\n if (page.properties[\"sourcePage\"]) {\n return page.properties[\"language\"] ?? \"en\";\n }\n\n const result = await this.getDefaultLanguage.execute();\n if (result.isOk()) {\n return result.value.code;\n }\n\n return \"en\";\n }\n\n private async translate(\n page: WbPage,\n sourceLanguage: string,\n targetLanguage: string\n ): Promise<TranslatedData | null> {\n const settingsResult = await this.getSettings.execute();\n if (settingsResult.isFail()) {\n return null;\n }\n\n const settings = settingsResult.value;\n const firstProvider = settings.providers.presets[0];\n\n if (!firstProvider) {\n return null;\n }\n\n const apiKey = await this.encryption.decrypt(firstProvider.apiKeyEncrypted);\n\n const properties = {\n title: page.properties[\"title\"],\n snippet: page.properties[\"snippet\"],\n pathSlug: page.properties[\"title\"]\n };\n const bindings = this.extractBindings(page.bindings);\n const input = JSON.stringify({ properties, bindings });\n\n const result = await this.ai.generateText({\n model: firstProvider.model,\n connection: {\n sdkName: firstProvider.model.split(\"/\")[0],\n apiKey\n },\n system: `You are a professional translator. Translate all user-provided text to language code \"${targetLanguage}\", preserving placeholders and formatting. Return a JSON object with the same keys, only changing the values.`,\n prompt: `Translate given key-value pairs from \"${sourceLanguage}\" to language code \"${targetLanguage}\". Do not modify the keys. \"properties\" is a simple key-value pair. \"bindings\" values are located in the \"value\" key. ${input}`,\n temperature: 0.3\n });\n\n try {\n return JSON.parse(result.text);\n } catch {\n return null;\n }\n }\n\n private extractBindings(bindings: Record<string, any>): TranslatableBindings {\n const result: TranslatableBindings = {};\n\n for (const elementId in bindings) {\n const element = bindings[elementId];\n const inputs = element.inputs;\n if (!inputs) {\n continue;\n }\n\n for (const inputName in inputs) {\n const input = inputs[inputName];\n if (input.type === \"text\" || input.type === \"longText\") {\n result[`${elementId}.inputs.${inputName}`] = {\n type: input.type,\n value: input.static\n };\n } else if (input.type === \"lexical\" && input.static?.html) {\n result[`${elementId}.inputs.${inputName}`] = {\n type: input.type,\n value: input.static.html\n };\n }\n }\n }\n\n return result;\n }\n\n private slugify(text: string): string {\n return text\n .toLowerCase()\n .normalize(\"NFKD\")\n .replace(/[̀-ͯ]/g, \"\")\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\");\n }\n\n private async buildUpdateData(\n page: WbPage,\n translations: TranslatedData\n ): Promise<{ properties: Record<string, any>; bindings: Record<string, any> }> {\n const properties: Record<string, any> = { ...page.properties };\n const bindings: Record<string, any> = structuredClone(page.bindings);\n\n const translatedPathSlug = translations.properties[\"pathSlug\"];\n delete translations.properties[\"pathSlug\"];\n\n for (const [key, value] of Object.entries(translations.properties)) {\n properties[key] = value;\n }\n\n if (translatedPathSlug) {\n const slug = this.slugify(translatedPathSlug);\n if (slug) {\n const languageCode = page.properties[\"language\"];\n properties[\"path\"] = `/${languageCode}/${slug}`;\n }\n }\n\n for (const [key, binding] of Object.entries(translations.bindings)) {\n if (binding.type === \"lexical\") {\n const state = await this.lexicalParser.parse(binding.value);\n if (state) {\n set(bindings, `${key}.static.state`, JSON.stringify(state));\n set(bindings, `${key}.static.html`, binding.value);\n }\n } else {\n set(bindings, `${key}.static`, binding.value);\n }\n }\n\n return { properties, bindings };\n }\n}\n\nexport const WbTranslatePageDecorator = TranslatePageUseCase.createDecorator({\n decorator: WbTranslatePageDecoratorImpl,\n dependencies: [\n GetDefaultLanguageUseCase,\n GetSettingsUseCase,\n Ai,\n Encryption,\n LexicalParser,\n UpdatePageRepository\n ]\n});\n"],"names":["WbTranslatePageDecoratorImpl","getDefaultLanguage","getSettings","ai","encryption","lexicalParser","updatePageRepository","decoratee","params","result","page","sourceLanguage","translations","Result","updateData","updateResult","targetLanguage","settingsResult","settings","firstProvider","apiKey","properties","bindings","input","JSON","elementId","element","inputs","inputName","text","structuredClone","translatedPathSlug","key","value","Object","slug","languageCode","binding","state","set","WbTranslatePageDecorator","TranslatePageUseCase","GetDefaultLanguageUseCase","GetSettingsUseCase","Ai","Encryption","LexicalParser","UpdatePageRepository"],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface ILexicalParser {
|
|
2
|
+
parse(html: string): Promise<Record<string, unknown> | null>;
|
|
3
|
+
}
|
|
4
|
+
export declare const LexicalParser: import("@webiny/di").Abstraction<ILexicalParser>;
|
|
5
|
+
export declare namespace LexicalParser {
|
|
6
|
+
type Interface = ILexicalParser;
|
|
7
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api/features/WbTranslatePage/abstractions/LexicalParser.js","sources":["../../../../../src/api/features/WbTranslatePage/abstractions/LexicalParser.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\n\nexport interface ILexicalParser {\n parse(html: string): Promise<Record<string, unknown> | null>;\n}\n\nexport const LexicalParser = createAbstraction<ILexicalParser>(\n \"AiPowerUps/WbTranslatePage/LexicalParser\"\n);\n\nexport namespace LexicalParser {\n export type Interface = ILexicalParser;\n}\n"],"names":["LexicalParser","createAbstraction"],"mappings":";AAMO,MAAMA,gBAAgBC,kBACzB"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/api";
|
|
2
|
+
import { WbTranslatePageDecorator } from "./WbTranslatePageDecorator.js";
|
|
3
|
+
import { LexicalParser } from "./LexicalParser.js";
|
|
4
|
+
const WbTranslatePageFeature = createFeature({
|
|
5
|
+
name: "AiPowerUps/WbTranslatePage",
|
|
6
|
+
register (container) {
|
|
7
|
+
container.register(LexicalParser).inSingletonScope();
|
|
8
|
+
container.registerDecorator(WbTranslatePageDecorator);
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
export { WbTranslatePageFeature };
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api/features/WbTranslatePage/feature.js","sources":["../../../../src/api/features/WbTranslatePage/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { WbTranslatePageDecorator } from \"./WbTranslatePageDecorator.js\";\nimport { LexicalParser } from \"./LexicalParser.js\";\n\nexport const WbTranslatePageFeature = createFeature({\n name: \"AiPowerUps/WbTranslatePage\",\n register(container) {\n container.register(LexicalParser).inSingletonScope();\n container.registerDecorator(WbTranslatePageDecorator);\n }\n});\n"],"names":["WbTranslatePageFeature","createFeature","container","LexicalParser","WbTranslatePageDecorator"],"mappings":";;;AAIO,MAAMA,yBAAyBC,cAAc;IAChD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC,eAAe,gBAAgB;QAClDD,UAAU,iBAAiB,CAACE;IAChC;AACJ"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { CoreGraphQLSchemaFactory } from "@webiny/
|
|
1
|
+
import { CoreGraphQLSchemaFactory } from "@webiny/api-graphql/graphql/abstractions.core.js";
|
|
2
2
|
declare class BaseGraphQLSchemaImpl implements CoreGraphQLSchemaFactory.Interface {
|
|
3
3
|
execute(builder: CoreGraphQLSchemaFactory.SchemaBuilder): Promise<CoreGraphQLSchemaFactory.SchemaBuilder>;
|
|
4
4
|
}
|
|
5
5
|
export declare const BaseGraphQLSchema: typeof BaseGraphQLSchemaImpl & {
|
|
6
|
-
__abstraction: import("@webiny/di").Abstraction<import("@webiny/
|
|
6
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-graphql/graphql/abstractions.core.js").ICoreGraphQLSchemaFactory>;
|
|
7
7
|
};
|
|
8
8
|
export {};
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import { CoreGraphQLSchemaFactory } from "@webiny/
|
|
2
|
-
import { ErrorResponse, Response } from "@webiny/
|
|
3
|
-
import {
|
|
1
|
+
import { CoreGraphQLSchemaFactory } from "@webiny/api-graphql/graphql/abstractions.core.js";
|
|
2
|
+
import { ErrorResponse, Response } from "@webiny/api-graphql/responses.js";
|
|
3
|
+
import { Ai } from "@webiny/api-core/features/ai/index.js";
|
|
4
4
|
import { TaskService } from "@webiny/api-core/features/task/TaskService/index.js";
|
|
5
|
+
import { FeatureFlags } from "@webiny/api-core/features/featureFlags/abstractions.js";
|
|
5
6
|
import { GetSettingsUseCase } from "../features/GetSettings/index.js";
|
|
6
7
|
import { UpdateSettingsUseCase } from "../features/UpdateSettings/index.js";
|
|
7
8
|
import { AiPowerUpsSettingsGraphQLMapper } from "./abstractions.js";
|
|
8
9
|
import { WB_GENERATE_PAGE_CONTENT_TASK_ID } from "../features/WbGeneratePageContent/WbGeneratePageContentTask.js";
|
|
10
|
+
import { CMS_GENERATE_ENTRY_CONTENT_TASK_ID } from "../features/CmsGenerateEntryContent/CmsGenerateEntryContentTask.js";
|
|
9
11
|
class BaseGraphQLSchemaImpl {
|
|
10
12
|
async execute(builder) {
|
|
11
13
|
builder.addTypeDefs(`
|
|
@@ -43,6 +45,16 @@ class BaseGraphQLSchemaImpl {
|
|
|
43
45
|
excludedFileIds: [String!]
|
|
44
46
|
readerPersonaId: String
|
|
45
47
|
writerPersonaId: String
|
|
48
|
+
additionalFileIds: [String!]
|
|
49
|
+
): JSON!
|
|
50
|
+
generateEntryContent(
|
|
51
|
+
prompt: String!
|
|
52
|
+
modelId: String!
|
|
53
|
+
projectId: String
|
|
54
|
+
excludedFileIds: [String!]
|
|
55
|
+
readerPersonaId: String
|
|
56
|
+
writerPersonaId: String
|
|
57
|
+
additionalFileIds: [String!]
|
|
46
58
|
): JSON!
|
|
47
59
|
}
|
|
48
60
|
|
|
@@ -65,9 +77,9 @@ class BaseGraphQLSchemaImpl {
|
|
|
65
77
|
builder.addResolver({
|
|
66
78
|
path: "AiPowerUpsQuery.listModels",
|
|
67
79
|
dependencies: [
|
|
68
|
-
|
|
80
|
+
Ai
|
|
69
81
|
],
|
|
70
|
-
resolver: (
|
|
82
|
+
resolver: (ai)=>async ()=>ai.listModels()
|
|
71
83
|
});
|
|
72
84
|
builder.addResolver({
|
|
73
85
|
path: "AiPowerUpsQuery.getSettings",
|
|
@@ -96,7 +108,34 @@ class BaseGraphQLSchemaImpl {
|
|
|
96
108
|
projectId: args.projectId ?? null,
|
|
97
109
|
excludedFileIds: args.excludedFileIds ?? null,
|
|
98
110
|
readerPersonaId: args.readerPersonaId ?? null,
|
|
99
|
-
writerPersonaId: args.writerPersonaId ?? null
|
|
111
|
+
writerPersonaId: args.writerPersonaId ?? null,
|
|
112
|
+
additionalFileIds: args.additionalFileIds ?? null
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
if (result.isFail()) throw result.error;
|
|
116
|
+
return {
|
|
117
|
+
id: result.value.id
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
builder.addResolver({
|
|
122
|
+
path: "AiPowerUpsMutation.generateEntryContent",
|
|
123
|
+
dependencies: [
|
|
124
|
+
TaskService,
|
|
125
|
+
FeatureFlags
|
|
126
|
+
],
|
|
127
|
+
resolver: (taskService, featureFlags)=>async ({ args })=>{
|
|
128
|
+
if (!featureFlags.get().isEnabled("aiPowerups.cms.entryGeneration")) throw new Error("AI entry generation cannot be used because your project license does not permit it.");
|
|
129
|
+
const result = await taskService.trigger({
|
|
130
|
+
definition: CMS_GENERATE_ENTRY_CONTENT_TASK_ID,
|
|
131
|
+
input: {
|
|
132
|
+
prompt: args.prompt,
|
|
133
|
+
modelId: args.modelId,
|
|
134
|
+
projectId: args.projectId ?? null,
|
|
135
|
+
excludedFileIds: args.excludedFileIds ?? null,
|
|
136
|
+
readerPersonaId: args.readerPersonaId ?? null,
|
|
137
|
+
writerPersonaId: args.writerPersonaId ?? null,
|
|
138
|
+
additionalFileIds: args.additionalFileIds ?? null
|
|
100
139
|
}
|
|
101
140
|
});
|
|
102
141
|
if (result.isFail()) throw result.error;
|