@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.
Files changed (239) hide show
  1. package/AiPowerups.js +2 -2
  2. package/AiPowerups.js.map +1 -1
  3. package/admin/Extension.js +11 -2
  4. package/admin/Extension.js.map +1 -1
  5. package/admin/features/compareEntryRevisions/CompareEntryRevisionsGateway.d.ts +12 -0
  6. package/admin/features/compareEntryRevisions/CompareEntryRevisionsGateway.js +46 -0
  7. package/admin/features/compareEntryRevisions/CompareEntryRevisionsGateway.js.map +1 -0
  8. package/admin/features/compareEntryRevisions/CompareEntryRevisionsRepository.d.ts +11 -0
  9. package/admin/features/compareEntryRevisions/CompareEntryRevisionsRepository.js +18 -0
  10. package/admin/features/compareEntryRevisions/CompareEntryRevisionsRepository.js.map +1 -0
  11. package/admin/features/compareEntryRevisions/CompareEntryRevisionsUseCase.d.ts +11 -0
  12. package/admin/features/compareEntryRevisions/CompareEntryRevisionsUseCase.js +18 -0
  13. package/admin/features/compareEntryRevisions/CompareEntryRevisionsUseCase.js.map +1 -0
  14. package/admin/features/compareEntryRevisions/abstractions.d.ts +32 -0
  15. package/admin/features/compareEntryRevisions/abstractions.js +7 -0
  16. package/admin/features/compareEntryRevisions/abstractions.js.map +1 -0
  17. package/admin/features/compareEntryRevisions/feature.d.ts +1 -0
  18. package/admin/features/compareEntryRevisions/feature.js +15 -0
  19. package/admin/features/compareEntryRevisions/feature.js.map +1 -0
  20. package/admin/features/compareEntryRevisions/index.d.ts +2 -0
  21. package/admin/features/compareEntryRevisions/index.js +2 -0
  22. package/admin/features/feature.js +2 -0
  23. package/admin/features/feature.js.map +1 -1
  24. package/admin/features/generateEntryContent/GenerateEntryContentGateway.d.ts +12 -0
  25. package/admin/features/generateEntryContent/GenerateEntryContentGateway.js +45 -0
  26. package/admin/features/generateEntryContent/GenerateEntryContentGateway.js.map +1 -0
  27. package/admin/features/generateEntryContent/GenerateEntryContentUseCase.d.ts +11 -0
  28. package/admin/features/generateEntryContent/GenerateEntryContentUseCase.js +18 -0
  29. package/admin/features/generateEntryContent/GenerateEntryContentUseCase.js.map +1 -0
  30. package/admin/features/generateEntryContent/abstractions.d.ts +24 -0
  31. package/admin/features/generateEntryContent/abstractions.js +6 -0
  32. package/admin/features/generateEntryContent/abstractions.js.map +1 -0
  33. package/admin/features/generateEntryContent/feature.d.ts +1 -0
  34. package/admin/features/generateEntryContent/feature.js +13 -0
  35. package/admin/features/generateEntryContent/feature.js.map +1 -0
  36. package/admin/features/generateEntryContent/index.d.ts +3 -0
  37. package/admin/features/generateEntryContent/index.js +2 -0
  38. package/admin/features/generatePageContent/GeneratePageContentGateway.js +2 -0
  39. package/admin/features/generatePageContent/GeneratePageContentGateway.js.map +1 -1
  40. package/admin/features/generatePageContent/abstractions.d.ts +1 -0
  41. package/admin/features/generatePageContent/abstractions.js.map +1 -1
  42. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPage.d.ts +2 -2
  43. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPage.js +3 -4
  44. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPage.js.map +1 -1
  45. package/admin/presentation/AiPromptFormFactory/AiPromptFormFactory.d.ts +20 -0
  46. package/admin/presentation/AiPromptFormFactory/AiPromptFormFactory.js +108 -0
  47. package/admin/presentation/AiPromptFormFactory/AiPromptFormFactory.js.map +1 -0
  48. package/admin/presentation/AiPromptFormFactory/abstractions.d.ts +14 -0
  49. package/admin/presentation/AiPromptFormFactory/abstractions.js +5 -0
  50. package/admin/presentation/AiPromptFormFactory/abstractions.js.map +1 -0
  51. package/admin/presentation/AiPromptFormFactory/feature.d.ts +1 -0
  52. package/admin/presentation/AiPromptFormFactory/feature.js +11 -0
  53. package/admin/presentation/AiPromptFormFactory/feature.js.map +1 -0
  54. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDialog.d.ts +9 -0
  55. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDialog.js +118 -0
  56. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDialog.js.map +1 -0
  57. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDrawer.d.ts +9 -0
  58. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDrawer.js +72 -0
  59. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDrawer.js.map +1 -0
  60. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsMenuItem.d.ts +4 -0
  61. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsMenuItem.js +21 -0
  62. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsMenuItem.js.map +1 -0
  63. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsOverlays.d.ts +2 -0
  64. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsOverlays.js +17 -0
  65. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsOverlays.js.map +1 -0
  66. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsPresenter.d.ts +25 -0
  67. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsPresenter.js +90 -0
  68. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsPresenter.js.map +1 -0
  69. package/admin/presentation/CmsCompareEntryRevisions/Extension.d.ts +2 -0
  70. package/admin/presentation/CmsCompareEntryRevisions/Extension.js +16 -0
  71. package/admin/presentation/CmsCompareEntryRevisions/Extension.js.map +1 -0
  72. package/admin/presentation/CmsCompareEntryRevisions/abstractions.d.ts +29 -0
  73. package/admin/presentation/CmsCompareEntryRevisions/abstractions.js +5 -0
  74. package/admin/presentation/CmsCompareEntryRevisions/abstractions.js.map +1 -0
  75. package/admin/presentation/CmsCompareEntryRevisions/feature.d.ts +3 -0
  76. package/admin/presentation/CmsCompareEntryRevisions/feature.js +17 -0
  77. package/admin/presentation/CmsCompareEntryRevisions/feature.js.map +1 -0
  78. package/admin/presentation/CmsContentGeneration/CmsGenerateContentButton.d.ts +4 -0
  79. package/admin/presentation/CmsContentGeneration/CmsGenerateContentButton.js +27 -0
  80. package/admin/presentation/CmsContentGeneration/CmsGenerateContentButton.js.map +1 -0
  81. package/admin/presentation/CmsContentGeneration/CmsGenerateContentDialog.d.ts +5 -0
  82. package/admin/presentation/CmsContentGeneration/CmsGenerateContentDialog.js +106 -0
  83. package/admin/presentation/CmsContentGeneration/CmsGenerateContentDialog.js.map +1 -0
  84. package/admin/presentation/CmsContentGeneration/CmsGenerateContentPresenter.d.ts +29 -0
  85. package/admin/presentation/CmsContentGeneration/CmsGenerateContentPresenter.js +120 -0
  86. package/admin/presentation/CmsContentGeneration/CmsGenerateContentPresenter.js.map +1 -0
  87. package/admin/presentation/CmsContentGeneration/Extension.d.ts +2 -0
  88. package/admin/presentation/CmsContentGeneration/Extension.js +27 -0
  89. package/admin/presentation/CmsContentGeneration/Extension.js.map +1 -0
  90. package/admin/presentation/CmsContentGeneration/abstractions.d.ts +20 -0
  91. package/admin/presentation/CmsContentGeneration/abstractions.js +5 -0
  92. package/admin/presentation/CmsContentGeneration/abstractions.js.map +1 -0
  93. package/admin/presentation/CmsContentGeneration/feature.d.ts +3 -0
  94. package/admin/presentation/CmsContentGeneration/feature.js +17 -0
  95. package/admin/presentation/CmsContentGeneration/feature.js.map +1 -0
  96. package/admin/presentation/CmsEntryWizard/CmsEntryWizard.d.ts +4 -0
  97. package/admin/presentation/CmsEntryWizard/CmsEntryWizard.js +113 -0
  98. package/admin/presentation/CmsEntryWizard/CmsEntryWizard.js.map +1 -0
  99. package/admin/presentation/CmsEntryWizard/CmsEntryWizardGate.d.ts +4 -0
  100. package/admin/presentation/CmsEntryWizard/CmsEntryWizardGate.js +19 -0
  101. package/admin/presentation/CmsEntryWizard/CmsEntryWizardGate.js.map +1 -0
  102. package/admin/presentation/CmsEntryWizard/Extension.d.ts +2 -0
  103. package/admin/presentation/CmsEntryWizard/Extension.js +10 -0
  104. package/admin/presentation/CmsEntryWizard/Extension.js.map +1 -0
  105. package/admin/presentation/ProjectsSettings.js +4 -4
  106. package/admin/presentation/ProjectsSettings.js.map +1 -1
  107. package/admin/presentation/ProvidersSettings.js +1 -1
  108. package/admin/presentation/ProvidersSettings.js.map +1 -1
  109. package/admin/presentation/WbContentGeneration/GenerateContentDialog.d.ts +2 -2
  110. package/admin/presentation/WbContentGeneration/GenerateContentDialog.js +2 -2
  111. package/admin/presentation/WbContentGeneration/GenerateContentDialog.js.map +1 -1
  112. package/admin/presentation/WbContentGeneration/GenerateContentPresenter.d.ts +4 -12
  113. package/admin/presentation/WbContentGeneration/GenerateContentPresenter.js +12 -94
  114. package/admin/presentation/WbContentGeneration/GenerateContentPresenter.js.map +1 -1
  115. package/api/Extension.js +13 -3
  116. package/api/Extension.js.map +1 -1
  117. package/api/features/AiChatProvider/PowerUpsAiChatProvider.d.ts +24 -0
  118. package/api/features/AiChatProvider/PowerUpsAiChatProvider.js +31 -0
  119. package/api/features/AiChatProvider/PowerUpsAiChatProvider.js.map +1 -0
  120. package/api/features/AiChatProvider/feature.d.ts +9 -0
  121. package/api/features/AiChatProvider/feature.js +11 -0
  122. package/api/features/AiChatProvider/feature.js.map +1 -0
  123. package/api/features/AiChatProvider/index.d.ts +2 -0
  124. package/api/features/AiChatProvider/index.js +2 -0
  125. package/api/features/AiImageEnrichment/AiImageEnrichmentStreamRoute.d.ts +36 -0
  126. package/api/features/AiImageEnrichment/AiImageEnrichmentStreamRoute.js +85 -0
  127. package/api/features/AiImageEnrichment/AiImageEnrichmentStreamRoute.js.map +1 -0
  128. package/api/features/AiImageEnrichment/AiImageEnrichmentTask.d.ts +10 -14
  129. package/api/features/AiImageEnrichment/AiImageEnrichmentTask.js +27 -100
  130. package/api/features/AiImageEnrichment/AiImageEnrichmentTask.js.map +1 -1
  131. package/api/features/AiImageEnrichment/ApplyImageEnrichmentUseCase.d.ts +18 -0
  132. package/api/features/AiImageEnrichment/ApplyImageEnrichmentUseCase.js +50 -0
  133. package/api/features/AiImageEnrichment/ApplyImageEnrichmentUseCase.js.map +1 -0
  134. package/api/features/AiImageEnrichment/PrepareImageEnrichmentUseCase.d.ts +19 -0
  135. package/api/features/AiImageEnrichment/PrepareImageEnrichmentUseCase.js +49 -0
  136. package/api/features/AiImageEnrichment/PrepareImageEnrichmentUseCase.js.map +1 -0
  137. package/api/features/AiImageEnrichment/abstractions.d.ts +60 -0
  138. package/api/features/AiImageEnrichment/abstractions.js +12 -0
  139. package/api/features/AiImageEnrichment/abstractions.js.map +1 -0
  140. package/api/features/AiImageEnrichment/buildEnrichmentAiRequest.d.ts +12 -0
  141. package/api/features/AiImageEnrichment/buildEnrichmentAiRequest.js +30 -0
  142. package/api/features/AiImageEnrichment/buildEnrichmentAiRequest.js.map +1 -0
  143. package/api/features/AiImageEnrichment/errors.d.ts +26 -0
  144. package/api/features/AiImageEnrichment/errors.js +28 -0
  145. package/api/features/AiImageEnrichment/errors.js.map +1 -0
  146. package/api/features/AiImageEnrichment/feature.js +9 -0
  147. package/api/features/AiImageEnrichment/feature.js.map +1 -1
  148. package/api/features/AiImageEnrichment/imageEnrichmentErrorStatusCode.d.ts +6 -0
  149. package/api/features/AiImageEnrichment/imageEnrichmentErrorStatusCode.js +9 -0
  150. package/api/features/AiImageEnrichment/imageEnrichmentErrorStatusCode.js.map +1 -0
  151. package/api/features/AiImageEnrichment/readEnrichmentPartial.d.ts +8 -0
  152. package/api/features/AiImageEnrichment/readEnrichmentPartial.js +16 -0
  153. package/api/features/AiImageEnrichment/readEnrichmentPartial.js.map +1 -0
  154. package/api/features/AiImageEnrichment/streamEvents.d.ts +36 -0
  155. package/api/features/AiImageEnrichment/streamEvents.js +0 -0
  156. package/api/features/AiPromptContext/AiPromptContextBuilder.d.ts +8 -1
  157. package/api/features/AiPromptContext/AiPromptContextBuilder.js +46 -2
  158. package/api/features/AiPromptContext/AiPromptContextBuilder.js.map +1 -1
  159. package/api/features/AiPromptContext/abstractions.d.ts +3 -0
  160. package/api/features/AiPromptContext/abstractions.js +9 -1
  161. package/api/features/AiPromptContext/abstractions.js.map +1 -1
  162. package/api/features/AiPromptContext/index.d.ts +1 -1
  163. package/api/features/AiPromptContext/index.js +1 -1
  164. package/api/features/CmsCompareEntryRevisions/CmsCompareEntryRevisionsUseCase.d.ts +22 -0
  165. package/api/features/CmsCompareEntryRevisions/CmsCompareEntryRevisionsUseCase.js +136 -0
  166. package/api/features/CmsCompareEntryRevisions/CmsCompareEntryRevisionsUseCase.js.map +1 -0
  167. package/api/features/CmsCompareEntryRevisions/abstractions.d.ts +18 -0
  168. package/api/features/CmsCompareEntryRevisions/abstractions.js +5 -0
  169. package/api/features/CmsCompareEntryRevisions/abstractions.js.map +1 -0
  170. package/api/features/CmsCompareEntryRevisions/feature.d.ts +4 -0
  171. package/api/features/CmsCompareEntryRevisions/feature.js +11 -0
  172. package/api/features/CmsCompareEntryRevisions/feature.js.map +1 -0
  173. package/api/features/CmsCompareEntryRevisions/index.d.ts +2 -0
  174. package/api/features/CmsCompareEntryRevisions/index.js +2 -0
  175. package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentTask.d.ts +33 -0
  176. package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentTask.js +84 -0
  177. package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentTask.js.map +1 -0
  178. package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentUseCase.d.ts +29 -0
  179. package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentUseCase.js +141 -0
  180. package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentUseCase.js.map +1 -0
  181. package/api/features/CmsGenerateEntryContent/abstractions.d.ts +36 -0
  182. package/api/features/CmsGenerateEntryContent/abstractions.js +5 -0
  183. package/api/features/CmsGenerateEntryContent/abstractions.js.map +1 -0
  184. package/api/features/CmsGenerateEntryContent/buildPrompt.d.ts +2 -0
  185. package/api/features/CmsGenerateEntryContent/buildPrompt.js +61 -0
  186. package/api/features/CmsGenerateEntryContent/buildPrompt.js.map +1 -0
  187. package/api/features/CmsGenerateEntryContent/feature.d.ts +4 -0
  188. package/api/features/CmsGenerateEntryContent/feature.js +13 -0
  189. package/api/features/CmsGenerateEntryContent/feature.js.map +1 -0
  190. package/api/features/CmsGenerateEntryContent/index.d.ts +1 -0
  191. package/api/features/CmsGenerateEntryContent/index.js +1 -0
  192. package/api/features/CmsGenerateEntryContent/injectDynamicZoneTypenames.d.ts +2 -0
  193. package/api/features/CmsGenerateEntryContent/injectDynamicZoneTypenames.js +30 -0
  194. package/api/features/CmsGenerateEntryContent/injectDynamicZoneTypenames.js.map +1 -0
  195. package/api/features/CmsResolveImageTool/CmsResolveImageTool.d.ts +14 -0
  196. package/api/features/CmsResolveImageTool/CmsResolveImageTool.js +27 -0
  197. package/api/features/CmsResolveImageTool/CmsResolveImageTool.js.map +1 -0
  198. package/api/features/CmsResolveImageTool/feature.d.ts +4 -0
  199. package/api/features/CmsResolveImageTool/feature.js +11 -0
  200. package/api/features/CmsResolveImageTool/feature.js.map +1 -0
  201. package/api/features/GetSettings/GetSettingsUseCase.d.ts +1 -1
  202. package/api/features/GetSettings/index.d.ts +1 -0
  203. package/api/features/GetSettings/index.js +1 -0
  204. package/api/features/Providers/ProvidersHandler.d.ts +1 -3
  205. package/api/features/Providers/ProvidersHandler.js +2 -15
  206. package/api/features/Providers/ProvidersHandler.js.map +1 -1
  207. package/api/features/Providers/types.d.ts +2 -2
  208. package/api/features/WbGeneratePageContent/WbGeneratePageContentTask.d.ts +4 -3
  209. package/api/features/WbGeneratePageContent/WbGeneratePageContentTask.js +25 -15
  210. package/api/features/WbGeneratePageContent/WbGeneratePageContentTask.js.map +1 -1
  211. package/api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.js +4 -3
  212. package/api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.js.map +1 -1
  213. package/api/features/WbGeneratePageContent/abstractions.d.ts +1 -0
  214. package/api/features/WbGeneratePageContent/abstractions.js.map +1 -1
  215. package/api/features/WbTranslatePage/LexicalParser.d.ts +10 -0
  216. package/api/features/WbTranslatePage/LexicalParser.js +37 -0
  217. package/api/features/WbTranslatePage/LexicalParser.js.map +1 -0
  218. package/api/features/WbTranslatePage/WbTranslatePageDecorator.d.ts +27 -0
  219. package/api/features/WbTranslatePage/WbTranslatePageDecorator.js +134 -0
  220. package/api/features/WbTranslatePage/WbTranslatePageDecorator.js.map +1 -0
  221. package/api/features/WbTranslatePage/abstractions/LexicalParser.d.ts +7 -0
  222. package/api/features/WbTranslatePage/abstractions/LexicalParser.js +5 -0
  223. package/api/features/WbTranslatePage/abstractions/LexicalParser.js.map +1 -0
  224. package/api/features/WbTranslatePage/feature.d.ts +4 -0
  225. package/api/features/WbTranslatePage/feature.js +13 -0
  226. package/api/features/WbTranslatePage/feature.js.map +1 -0
  227. package/api/features/WbTranslatePage/index.d.ts +2 -0
  228. package/api/features/WbTranslatePage/index.js +2 -0
  229. package/api/graphql/BaseGraphQLSchema.d.ts +2 -2
  230. package/api/graphql/BaseGraphQLSchema.js +45 -6
  231. package/api/graphql/BaseGraphQLSchema.js.map +1 -1
  232. package/api/graphql/CmsCompareEntryRevisionsSchema.d.ts +8 -0
  233. package/api/graphql/CmsCompareEntryRevisionsSchema.js +68 -0
  234. package/api/graphql/CmsCompareEntryRevisionsSchema.js.map +1 -0
  235. package/exports/admin/ai-powerups.d.ts +1 -0
  236. package/exports/admin/ai-powerups.js +1 -0
  237. package/exports/api/ai-powerups.d.ts +2 -0
  238. package/exports/api/ai-powerups.js +2 -0
  239. package/package.json +33 -25
@@ -1,14 +1,14 @@
1
1
  import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
2
- import { WebsocketService } from "@webiny/api-websockets/features/WebsocketService/index.js";
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, websocketService){
8
+ constructor(identityContext, generatePageContent, sendToIdentity){
9
9
  this.identityContext = identityContext;
10
10
  this.generatePageContent = generatePageContent;
11
- this.websocketService = websocketService;
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.websocketService.send({
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.websocketService.send({
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
- WebsocketService
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 { WebsocketService } from \"@webiny/api-websockets/features/WebsocketService/index.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}\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 websocketService: WebsocketService.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 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 });\n\n const identity = this.identityContext.getIdentity();\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.websocketService.send(\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.websocketService.send(\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, WebsocketService]\n});\n"],"names":["WB_GENERATE_PAGE_CONTENT_TASK_ID","WbGeneratePageContentTaskImpl","identityContext","generatePageContent","websocketService","input","controller","result","identity","compressed","compress","payload","identityId","telemetry","message","WbGeneratePageContentTask","TaskDefinition","IdentityContext","WbGeneratePageContentUseCase","WebsocketService"],"mappings":";;;;;AAOO,MAAMA,mCAAmC;AAYhD,MAAMC;IAQF,YACYC,eAA0C,EAC1CC,mBAA2D,EAC3DC,gBAA4C,CACtD;aAHUF,eAAe,GAAfA;aACAC,mBAAmB,GAAnBA;aACAC,gBAAgB,GAAhBA;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,SAAS,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC;YAClD,QAAQF,MAAM,MAAM;YACpB,YAAYA,MAAM,UAAU;YAC5B,OAAOA,MAAM,KAAK;YAClB,WAAWA,MAAM,SAAS;YAC1B,iBAAiBA,MAAM,eAAe;YACtC,iBAAiBA,MAAM,eAAe;YACtC,iBAAiBA,MAAM,eAAe;QAC1C;QAEA,MAAMG,WAAW,IAAI,CAAC,eAAe,CAAC,WAAW;QAEjD,IAAID,OAAO,MAAM,IAAI;YACjB,MAAM,IAAI,CAAC,eAAe,CAACC,SAAS,EAAE,EAAED,OAAO,KAAK,CAAC,OAAO;YAE5D,OAAOD,WAAW,QAAQ,CAAC,KAAK,CAAC;gBAC7B,SAASC,OAAO,KAAK,CAAC,OAAO;YACjC;QACJ;QAEA,MAAME,aAAa,MAAMC,SAASH,OAAO,KAAK,CAAC,MAAM;QACrD,MAAMI,UAAUF,WAAW,QAAQ,CAAC;QAEpC,MAAM,IAAI,CAAC,iBAAiB,CAACD,SAAS,EAAE,EAAEG,SAASJ,OAAO,KAAK,CAAC,SAAS;QAEzE,OAAOD,WAAW,QAAQ,CAAC,IAAI,CAAC;IACpC;IAEA,MAAc,kBACVM,UAAkB,EAClBD,OAAe,EACfE,SAA8B,EAChC;QACE,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAC5B;YAAE,IAAID;QAAW,GACjB;YACI,QAAQ;YACR,MAAM;gBACF,aAAa;gBACb,OAAOD;gBACPE;YACJ;QACJ;IAER;IAEA,MAAc,gBAAgBD,UAAkB,EAAEE,OAAe,EAAE;QAC/D,MAAM,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAC5B;YAAE,IAAIF;QAAW,GACjB;YACI,QAAQ;YACR,MAAM;gBACFE;YACJ;QACJ;IAER;AACJ;AAEO,MAAMC,4BAA4BC,eAAe,oBAAoB,CAAC;IACzE,gBAAgBf;IAChB,cAAc;QAACgB;QAAiBC;QAA8BC;KAAiB;AACnF"}
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 { AiPromptContextBuilder } 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 });\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,\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","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
+ {"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":";;;;;;;;;;;;AAsBA,MAAMA;IACF,YACYC,oBAAsD,EACtDC,WAAyC,EACzCC,EAAgB,EAChBC,UAAgC,EAChCC,UAAgC,EAChCC,QAAmC,CAC7C;aANUL,oBAAoB,GAApBA;aACAC,WAAW,GAAXA;aACAC,EAAE,GAAFA;aACAC,UAAU,GAAVA;aACAC,UAAU,GAAVA;aACAC,QAAQ,GAARA;IACT;IAEH,MAAM,QACFC,MAAmC,EACc;QACjD,MAAMC,iBAAiB,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO;QACrD,IAAIA,eAAe,MAAM,IACrB,OAAOC,OAAO,IAAI,CAAC,IAAIC,MAAM;QAGjC,MAAMC,WAAWH,eAAe,KAAK;QACrC,MAAMI,gBAAgBD,SAAS,SAAS,CAAC,OAAO,CAAC,EAAE;QAEnD,IAAI,CAACC,eACD,OAAOH,OAAO,IAAI,CACd,IAAIC,MAAM;QAIlB,MAAMG,SAAS,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAACD,cAAc,eAAe;QAE1E,MAAME,WAAW,IAAI,CAAC,UAAU,CAAC,UAAU;QAE3C,MAAMC,UAAU,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;YACpD,WAAWR,OAAO,SAAS;YAC3B,iBAAiBA,OAAO,eAAe;YACvC,iBAAiBA,OAAO,eAAe;YACvC,iBAAiBA,OAAO,eAAe;YACvC,mBAAmBA,OAAO,iBAAiB;QAC/C;QAEA,IAAIQ,QAAQ,eAAe,CAAC,MAAM,GAAG,GAAG;YACpC,MAAMC,kBAAkBC,0BACpBF,QAAQ,eAAe,EACvBA,QAAQ,eAAe;YAE3BG,OAAO,MAAM,CAACJ,UAAUE;QAC5B;QAIA,MAAMG,aAAa,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC3C,OAAO;gBAAE,iBAAiB;YAAS;YACnC,OAAO;QACX;QACA,MAAMC,YAAYD,WAAW,IAAI,KAAKA,WAAW,KAAK,CAAC,GAAG,CAACE,CAAAA,IAAKA,EAAE,GAAG,IAAI,EAAE;QAE3E,MAAMC,aAAaf,OAAO,UAAU;QACpC,MAAMgB,aACFC,kBAAkBF,YAAYf,OAAO,KAAK,EAAEa,aAAaL,QAAQ,QAAQ;QAE7E,MAAMU,SAAS;YACX,MAAM;YACN,SAASF;YACT,iBAAiB;gBACb,WAAW;oBACP,cAAc;wBAAE,MAAM;oBAAY;gBACtC;YACJ;QACJ;QAEA,IAAI;YACA,MAAMG,WAAW,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC;gBACxC,OAAOd,cAAc,KAAK;gBAC1B,YAAY;oBACR,SAASA,cAAc,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;oBAC1CC;gBACJ;gBACAY;gBACA,YAAY;gBACZ,QAAQlB,OAAO,MAAM,GAAGoB,6BAA6BZ,QAAQ,eAAe;gBAC5E,GAAIG,OAAO,IAAI,CAACJ,UAAU,MAAM,GAAG,IAC7B;oBAAE,OAAOA;oBAAU,UAAUc,YAAY;gBAAI,IAC7C,CAAC,CAAC;YACZ;YAEA,MAAMC,OACFH,SAAS,IAAI,IACZA,CAAAA,SAAS,KAAK,CAAC,MAAM,CAACI,CAAAA,OAAQA,KAAK,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,IAAI,QAAQ,EAAC;YAEzE,MAAMC,WAAWC,gBAAgB,WAAW,CAACH,MAAM,OAAO;YAC1D,MAAMI,kBAAkB,IAAIC,gBAAgBZ;YAC5C,MAAMa,SAASC,KAAK,SAAS,CAACH,gBAAgB,MAAM,CAACF;YAErD,MAAMM,YAAY,IAAIC;YACtB,IAAIC,gBAAgB;YACpB,KAAK,MAAMT,QAAQJ,SAAS,KAAK,CAC7B,KAAK,MAAMc,QAAQV,KAAK,SAAS,CAAE;gBAC/BS;gBACA,IAAIC,AAAkB,wBAAlBA,KAAK,QAAQ,EAA0B;oBACvC,MAAMC,QAAQD,KAAK,KAAK;oBACxB,IAAIC,MAAM,MAAM,EACZJ,UAAU,GAAG,CAACI,MAAM,MAAM;gBAElC;YACJ;YAGJ,MAAMC,YAAiC;gBACnC,WAAW;uBAAIL;iBAAU;gBACzB,UAAUtB,QAAQ,QAAQ;gBAC1BwB;gBACA,YAAYb,SAAS,KAAK,CAAC,MAAM;gBACjC,gBAAgBR,OAAO,IAAI,CAACJ;gBAC5B,mBAAmBM;YACvB;YAEA,OAAOX,OAAO,EAAE,CAAC;gBAAE0B;gBAAQO;YAAU;QACzC,EAAE,OAAOC,OAAO;YACZ,OAAOlC,OAAO,IAAI,CACd,IAAIC,MACA,CAAC,sBAAsB,EAAEiC,iBAAiBjC,QAAQiC,MAAM,OAAO,GAAGC,OAAOD,QAAQ;QAG7F;IACJ;AACJ;AAEO,MAAME,6CACTC,6BAA6B,oBAAoB,CAAC;IAC9C,gBAAgB9C;IAChB,cAAc;QACV+C;QACAC;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
@@ -7,6 +7,7 @@ export interface WbGeneratePageContentParams {
7
7
  excludedFileIds?: string[] | null;
8
8
  readerPersonaId?: string | null;
9
9
  writerPersonaId?: string | null;
10
+ additionalFileIds?: string[] | null;
10
11
  }
11
12
  export interface GenerationTelemetry {
12
13
  filesRead: string[];
@@ -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":";AA8BO,MAAMA,+BAA+BC,kBACxC"}
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,5 @@
1
+ import { createAbstraction } from "@webiny/feature/api";
2
+ const LexicalParser = createAbstraction("AiPowerUps/WbTranslatePage/LexicalParser");
3
+ export { LexicalParser };
4
+
5
+ //# sourceMappingURL=LexicalParser.js.map
@@ -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,4 @@
1
+ export declare const WbTranslatePageFeature: {
2
+ name: string;
3
+ register(container: import("@webiny/di").Container): void;
4
+ };
@@ -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"}
@@ -0,0 +1,2 @@
1
+ export { LexicalParser } from "./abstractions/LexicalParser.js";
2
+ export { WbTranslatePageFeature } from "./feature.js";
@@ -0,0 +1,2 @@
1
+ export { LexicalParser } from "./abstractions/LexicalParser.js";
2
+ export { WbTranslatePageFeature } from "./feature.js";
@@ -1,8 +1,8 @@
1
- import { CoreGraphQLSchemaFactory } from "@webiny/handler-graphql/graphql/abstractions.core.js";
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/handler-graphql/graphql/abstractions.public.js").IGraphQLSchemaFactory>;
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/handler-graphql/graphql/abstractions.core.js";
2
- import { ErrorResponse, Response } from "@webiny/handler-graphql/responses.js";
3
- import { AiModelRegistry } from "@webiny/api-core/features/ai/index.js";
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
- AiModelRegistry
80
+ Ai
69
81
  ],
70
- resolver: (registry)=>async ()=>registry.listModels()
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;