@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
@@ -0,0 +1,90 @@
1
+ import { computed, makeAutoObservable, runInAction } from "mobx";
2
+ import { RevisionsListPresenter } from "@webiny/app-headless-cms/exports/admin/cms/entry/editor.js";
3
+ import { CompareEntryRevisionsUseCase } from "../../features/compareEntryRevisions/abstractions.js";
4
+ import { CmsCompareEntryRevisionsPresenter } from "./abstractions.js";
5
+ class CmsCompareEntryRevisionsPresenterImpl {
6
+ constructor(revisionsPresenter, useCase){
7
+ this.revisionsPresenter = revisionsPresenter;
8
+ this.useCase = useCase;
9
+ this.drawerVisible = false;
10
+ this.selectedIds = [];
11
+ this.dialogVisible = false;
12
+ this.comparing = false;
13
+ this.error = null;
14
+ this.result = null;
15
+ makeAutoObservable(this, {
16
+ revisionsPresenter: false,
17
+ useCase: false,
18
+ vm: computed
19
+ });
20
+ }
21
+ get vm() {
22
+ return {
23
+ drawerVisible: this.drawerVisible,
24
+ revisions: this.revisionsPresenter.vm.revisions,
25
+ selectedIds: this.selectedIds,
26
+ canCompare: 2 === this.selectedIds.length,
27
+ dialogVisible: this.dialogVisible,
28
+ comparing: this.comparing,
29
+ error: this.error,
30
+ result: this.result
31
+ };
32
+ }
33
+ showDrawer() {
34
+ this.drawerVisible = true;
35
+ }
36
+ hideDrawer() {
37
+ this.drawerVisible = false;
38
+ this.selectedIds = [];
39
+ }
40
+ toggleRevision(revisionId) {
41
+ const index = this.selectedIds.indexOf(revisionId);
42
+ if (index >= 0) this.selectedIds = this.selectedIds.filter((id)=>id !== revisionId);
43
+ else if (this.selectedIds.length < 2) this.selectedIds = [
44
+ ...this.selectedIds,
45
+ revisionId
46
+ ];
47
+ }
48
+ async compare(modelId) {
49
+ if (2 !== this.selectedIds.length) return;
50
+ this.drawerVisible = false;
51
+ this.dialogVisible = true;
52
+ this.comparing = true;
53
+ this.error = null;
54
+ this.result = null;
55
+ try {
56
+ const result = await this.useCase.execute({
57
+ modelId,
58
+ revisionId1: this.selectedIds[0],
59
+ revisionId2: this.selectedIds[1]
60
+ });
61
+ runInAction(()=>{
62
+ this.result = result;
63
+ });
64
+ } catch (e) {
65
+ runInAction(()=>{
66
+ this.error = e instanceof Error ? e.message : "Failed to compare revisions";
67
+ });
68
+ } finally{
69
+ runInAction(()=>{
70
+ this.comparing = false;
71
+ });
72
+ }
73
+ }
74
+ hideDialog() {
75
+ this.dialogVisible = false;
76
+ this.result = null;
77
+ this.error = null;
78
+ this.selectedIds = [];
79
+ }
80
+ }
81
+ const CmsCompareEntryRevisionsPresenterImplementation = CmsCompareEntryRevisionsPresenter.createImplementation({
82
+ implementation: CmsCompareEntryRevisionsPresenterImpl,
83
+ dependencies: [
84
+ RevisionsListPresenter,
85
+ CompareEntryRevisionsUseCase
86
+ ]
87
+ });
88
+ export { CmsCompareEntryRevisionsPresenterImplementation };
89
+
90
+ //# sourceMappingURL=CmsCompareEntryRevisionsPresenter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsPresenter.js","sources":["../../../../src/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsPresenter.ts"],"sourcesContent":["import { computed, makeAutoObservable, runInAction } from \"mobx\";\nimport { RevisionsListPresenter } from \"@webiny/app-headless-cms/exports/admin/cms/entry/editor.js\";\nimport { CompareEntryRevisionsUseCase } from \"~/admin/features/compareEntryRevisions/abstractions.js\";\nimport { CmsCompareEntryRevisionsPresenter } from \"./abstractions.js\";\nimport type { ICmsCompareEntryRevisionsViewModel } from \"./abstractions.js\";\n\nclass CmsCompareEntryRevisionsPresenterImpl implements CmsCompareEntryRevisionsPresenter.Interface {\n private drawerVisible = false;\n private selectedIds: string[] = [];\n private dialogVisible = false;\n private comparing = false;\n private error: string | null = null;\n private result: { html: string; summary: string } | null = null;\n\n constructor(\n private revisionsPresenter: RevisionsListPresenter.Interface,\n private useCase: CompareEntryRevisionsUseCase.Interface\n ) {\n makeAutoObservable<CmsCompareEntryRevisionsPresenterImpl, \"revisionsPresenter\" | \"useCase\">(\n this,\n {\n revisionsPresenter: false,\n useCase: false,\n vm: computed\n }\n );\n }\n\n get vm(): ICmsCompareEntryRevisionsViewModel {\n return {\n drawerVisible: this.drawerVisible,\n revisions: this.revisionsPresenter.vm.revisions,\n selectedIds: this.selectedIds,\n canCompare: this.selectedIds.length === 2,\n dialogVisible: this.dialogVisible,\n comparing: this.comparing,\n error: this.error,\n result: this.result\n };\n }\n\n showDrawer(): void {\n this.drawerVisible = true;\n }\n\n hideDrawer(): void {\n this.drawerVisible = false;\n this.selectedIds = [];\n }\n\n toggleRevision(revisionId: string): void {\n const index = this.selectedIds.indexOf(revisionId);\n if (index >= 0) {\n this.selectedIds = this.selectedIds.filter(id => id !== revisionId);\n } else if (this.selectedIds.length < 2) {\n this.selectedIds = [...this.selectedIds, revisionId];\n }\n }\n\n async compare(modelId: string): Promise<void> {\n if (this.selectedIds.length !== 2) {\n return;\n }\n\n this.drawerVisible = false;\n this.dialogVisible = true;\n this.comparing = true;\n this.error = null;\n this.result = null;\n\n try {\n const result = await this.useCase.execute({\n modelId,\n revisionId1: this.selectedIds[0],\n revisionId2: this.selectedIds[1]\n });\n\n runInAction(() => {\n this.result = result;\n });\n } catch (e: unknown) {\n runInAction(() => {\n this.error = e instanceof Error ? e.message : \"Failed to compare revisions\";\n });\n } finally {\n runInAction(() => {\n this.comparing = false;\n });\n }\n }\n\n hideDialog(): void {\n this.dialogVisible = false;\n this.result = null;\n this.error = null;\n this.selectedIds = [];\n }\n}\n\nexport const CmsCompareEntryRevisionsPresenterImplementation =\n CmsCompareEntryRevisionsPresenter.createImplementation({\n implementation: CmsCompareEntryRevisionsPresenterImpl,\n dependencies: [RevisionsListPresenter, CompareEntryRevisionsUseCase]\n });\n"],"names":["CmsCompareEntryRevisionsPresenterImpl","revisionsPresenter","useCase","makeAutoObservable","computed","revisionId","index","id","modelId","result","runInAction","e","Error","CmsCompareEntryRevisionsPresenterImplementation","CmsCompareEntryRevisionsPresenter","RevisionsListPresenter","CompareEntryRevisionsUseCase"],"mappings":";;;;AAMA,MAAMA;IAQF,YACYC,kBAAoD,EACpDC,OAA+C,CACzD;aAFUD,kBAAkB,GAAlBA;aACAC,OAAO,GAAPA;aATJ,aAAa,GAAG;aAChB,WAAW,GAAa,EAAE;aAC1B,aAAa,GAAG;aAChB,SAAS,GAAG;aACZ,KAAK,GAAkB;aACvB,MAAM,GAA6C;QAMvDC,mBACI,IAAI,EACJ;YACI,oBAAoB;YACpB,SAAS;YACT,IAAIC;QACR;IAER;IAEA,IAAI,KAAyC;QACzC,OAAO;YACH,eAAe,IAAI,CAAC,aAAa;YACjC,WAAW,IAAI,CAAC,kBAAkB,CAAC,EAAE,CAAC,SAAS;YAC/C,aAAa,IAAI,CAAC,WAAW;YAC7B,YAAY,AAA4B,MAA5B,IAAI,CAAC,WAAW,CAAC,MAAM;YACnC,eAAe,IAAI,CAAC,aAAa;YACjC,WAAW,IAAI,CAAC,SAAS;YACzB,OAAO,IAAI,CAAC,KAAK;YACjB,QAAQ,IAAI,CAAC,MAAM;QACvB;IACJ;IAEA,aAAmB;QACf,IAAI,CAAC,aAAa,GAAG;IACzB;IAEA,aAAmB;QACf,IAAI,CAAC,aAAa,GAAG;QACrB,IAAI,CAAC,WAAW,GAAG,EAAE;IACzB;IAEA,eAAeC,UAAkB,EAAQ;QACrC,MAAMC,QAAQ,IAAI,CAAC,WAAW,CAAC,OAAO,CAACD;QACvC,IAAIC,SAAS,GACT,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAACC,CAAAA,KAAMA,OAAOF;aACrD,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,GACjC,IAAI,CAAC,WAAW,GAAG;eAAI,IAAI,CAAC,WAAW;YAAEA;SAAW;IAE5D;IAEA,MAAM,QAAQG,OAAe,EAAiB;QAC1C,IAAI,AAA4B,MAA5B,IAAI,CAAC,WAAW,CAAC,MAAM,EACvB;QAGJ,IAAI,CAAC,aAAa,GAAG;QACrB,IAAI,CAAC,aAAa,GAAG;QACrB,IAAI,CAAC,SAAS,GAAG;QACjB,IAAI,CAAC,KAAK,GAAG;QACb,IAAI,CAAC,MAAM,GAAG;QAEd,IAAI;YACA,MAAMC,SAAS,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;gBACtCD;gBACA,aAAa,IAAI,CAAC,WAAW,CAAC,EAAE;gBAChC,aAAa,IAAI,CAAC,WAAW,CAAC,EAAE;YACpC;YAEAE,YAAY;gBACR,IAAI,CAAC,MAAM,GAAGD;YAClB;QACJ,EAAE,OAAOE,GAAY;YACjBD,YAAY;gBACR,IAAI,CAAC,KAAK,GAAGC,aAAaC,QAAQD,EAAE,OAAO,GAAG;YAClD;QACJ,SAAU;YACND,YAAY;gBACR,IAAI,CAAC,SAAS,GAAG;YACrB;QACJ;IACJ;IAEA,aAAmB;QACf,IAAI,CAAC,aAAa,GAAG;QACrB,IAAI,CAAC,MAAM,GAAG;QACd,IAAI,CAAC,KAAK,GAAG;QACb,IAAI,CAAC,WAAW,GAAG,EAAE;IACzB;AACJ;AAEO,MAAMG,kDACTC,kCAAkC,oBAAoB,CAAC;IACnD,gBAAgBd;IAChB,cAAc;QAACe;QAAwBC;KAA6B;AACxE"}
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare const CmsCompareEntryRevisions: () => React.JSX.Element;
@@ -0,0 +1,16 @@
1
+ import react from "react";
2
+ import { RegisterFeature } from "@webiny/app-admin";
3
+ import { InternalContentEntryEditorConfig } from "@webiny/app-headless-cms/admin/config/contentEntries/index.js";
4
+ import { CmsCompareEntryRevisionsPresentationFeature } from "./feature.js";
5
+ import { CmsCompareEntryRevisionsMenuItem } from "./CmsCompareEntryRevisionsMenuItem.js";
6
+ import { CmsCompareEntryRevisionsOverlays } from "./CmsCompareEntryRevisionsOverlays.js";
7
+ const { Actions: Actions } = InternalContentEntryEditorConfig;
8
+ const CmsCompareEntryRevisions = ()=>/*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(RegisterFeature, {
9
+ feature: CmsCompareEntryRevisionsPresentationFeature
10
+ }), /*#__PURE__*/ react.createElement(InternalContentEntryEditorConfig, null, /*#__PURE__*/ react.createElement(Actions.MenuItemAction, {
11
+ name: "compareEntryRevisions",
12
+ element: /*#__PURE__*/ react.createElement(CmsCompareEntryRevisionsMenuItem, null)
13
+ })), /*#__PURE__*/ react.createElement(CmsCompareEntryRevisionsOverlays, null));
14
+ export { CmsCompareEntryRevisions };
15
+
16
+ //# sourceMappingURL=Extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin/presentation/CmsCompareEntryRevisions/Extension.js","sources":["../../../../src/admin/presentation/CmsCompareEntryRevisions/Extension.tsx"],"sourcesContent":["import React from \"react\";\nimport { RegisterFeature } from \"@webiny/app-admin\";\nimport { InternalContentEntryEditorConfig } from \"@webiny/app-headless-cms/admin/config/contentEntries/index.js\";\nimport { CmsCompareEntryRevisionsPresentationFeature } from \"./feature.js\";\nimport { CmsCompareEntryRevisionsMenuItem } from \"./CmsCompareEntryRevisionsMenuItem.js\";\nimport { CmsCompareEntryRevisionsOverlays } from \"./CmsCompareEntryRevisionsOverlays.js\";\n\nconst { Actions } = InternalContentEntryEditorConfig;\n\nexport const CmsCompareEntryRevisions = () => {\n return (\n <>\n <RegisterFeature feature={CmsCompareEntryRevisionsPresentationFeature} />\n <InternalContentEntryEditorConfig>\n <Actions.MenuItemAction\n name={\"compareEntryRevisions\"}\n element={<CmsCompareEntryRevisionsMenuItem />}\n />\n </InternalContentEntryEditorConfig>\n <CmsCompareEntryRevisionsOverlays />\n </>\n );\n};\n"],"names":["Actions","InternalContentEntryEditorConfig","CmsCompareEntryRevisions","RegisterFeature","CmsCompareEntryRevisionsPresentationFeature","CmsCompareEntryRevisionsMenuItem","CmsCompareEntryRevisionsOverlays"],"mappings":";;;;;;AAOA,MAAM,EAAEA,SAAAA,OAAO,EAAE,GAAGC;AAEb,MAAMC,2BAA2B,IAC7B,WAAP,GACI,wDACI,oBAACC,iBAAeA;QAAC,SAASC;sBAC1B,oBAACH,kCAAgCA,MAAAA,WAAAA,GAC7B,oBAACD,QAAQ,cAAc;QACnB,MAAM;QACN,uBAAS,oBAACK,kCAAgCA;uBAGlD,oBAACC,kCAAgCA"}
@@ -0,0 +1,29 @@
1
+ import type { RevisionsListPresenter } from "@webiny/app-headless-cms/exports/admin/cms/entry/editor.js";
2
+ interface CompareEntryRevisionsResult {
3
+ html: string;
4
+ summary: string;
5
+ }
6
+ export interface ICmsCompareEntryRevisionsViewModel {
7
+ drawerVisible: boolean;
8
+ revisions: RevisionsListPresenter.ViewModel["revisions"];
9
+ selectedIds: string[];
10
+ canCompare: boolean;
11
+ dialogVisible: boolean;
12
+ comparing: boolean;
13
+ error: string | null;
14
+ result: CompareEntryRevisionsResult | null;
15
+ }
16
+ export interface ICmsCompareEntryRevisionsPresenter {
17
+ vm: ICmsCompareEntryRevisionsViewModel;
18
+ showDrawer(): void;
19
+ hideDrawer(): void;
20
+ toggleRevision(revisionId: string): void;
21
+ compare(modelId: string): Promise<void>;
22
+ hideDialog(): void;
23
+ }
24
+ export declare const CmsCompareEntryRevisionsPresenter: import("@webiny/di").Abstraction<ICmsCompareEntryRevisionsPresenter>;
25
+ export declare namespace CmsCompareEntryRevisionsPresenter {
26
+ type Interface = ICmsCompareEntryRevisionsPresenter;
27
+ type ViewModel = ICmsCompareEntryRevisionsViewModel;
28
+ }
29
+ export {};
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/admin";
2
+ const CmsCompareEntryRevisionsPresenter = createAbstraction("AiPowerUps/CmsCompareEntryRevisionsPresenter");
3
+ export { CmsCompareEntryRevisionsPresenter };
4
+
5
+ //# sourceMappingURL=abstractions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin/presentation/CmsCompareEntryRevisions/abstractions.js","sources":["../../../../src/admin/presentation/CmsCompareEntryRevisions/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\nimport type { RevisionsListPresenter } from \"@webiny/app-headless-cms/exports/admin/cms/entry/editor.js\";\n\ninterface CompareEntryRevisionsResult {\n html: string;\n summary: string;\n}\n\nexport interface ICmsCompareEntryRevisionsViewModel {\n drawerVisible: boolean;\n revisions: RevisionsListPresenter.ViewModel[\"revisions\"];\n selectedIds: string[];\n canCompare: boolean;\n dialogVisible: boolean;\n comparing: boolean;\n error: string | null;\n result: CompareEntryRevisionsResult | null;\n}\n\nexport interface ICmsCompareEntryRevisionsPresenter {\n vm: ICmsCompareEntryRevisionsViewModel;\n showDrawer(): void;\n hideDrawer(): void;\n toggleRevision(revisionId: string): void;\n compare(modelId: string): Promise<void>;\n hideDialog(): void;\n}\n\nexport const CmsCompareEntryRevisionsPresenter =\n createAbstraction<ICmsCompareEntryRevisionsPresenter>(\n \"AiPowerUps/CmsCompareEntryRevisionsPresenter\"\n );\n\nexport namespace CmsCompareEntryRevisionsPresenter {\n export type Interface = ICmsCompareEntryRevisionsPresenter;\n export type ViewModel = ICmsCompareEntryRevisionsViewModel;\n}\n"],"names":["CmsCompareEntryRevisionsPresenter","createAbstraction"],"mappings":";AA4BO,MAAMA,oCACTC,kBACI"}
@@ -0,0 +1,3 @@
1
+ export declare const CmsCompareEntryRevisionsPresentationFeature: import("@webiny/feature/admin").FeatureDefinition<{
2
+ presenter: import("./abstractions.js").ICmsCompareEntryRevisionsPresenter;
3
+ }, []>;
@@ -0,0 +1,17 @@
1
+ import { createFeature } from "@webiny/feature/admin";
2
+ import { CmsCompareEntryRevisionsPresenter } from "./abstractions.js";
3
+ import { CmsCompareEntryRevisionsPresenterImplementation } from "./CmsCompareEntryRevisionsPresenter.js";
4
+ const CmsCompareEntryRevisionsPresentationFeature = createFeature({
5
+ name: "AiPowerUps/CmsCompareEntryRevisionsPresenter",
6
+ register (container) {
7
+ container.register(CmsCompareEntryRevisionsPresenterImplementation).inSingletonScope();
8
+ },
9
+ resolve (container) {
10
+ return {
11
+ presenter: container.resolve(CmsCompareEntryRevisionsPresenter)
12
+ };
13
+ }
14
+ });
15
+ export { CmsCompareEntryRevisionsPresentationFeature };
16
+
17
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin/presentation/CmsCompareEntryRevisions/feature.js","sources":["../../../../src/admin/presentation/CmsCompareEntryRevisions/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport { CmsCompareEntryRevisionsPresenter as Abstraction } from \"./abstractions.js\";\nimport { CmsCompareEntryRevisionsPresenterImplementation } from \"./CmsCompareEntryRevisionsPresenter.js\";\n\nexport const CmsCompareEntryRevisionsPresentationFeature = createFeature({\n name: \"AiPowerUps/CmsCompareEntryRevisionsPresenter\",\n register(container) {\n container.register(CmsCompareEntryRevisionsPresenterImplementation).inSingletonScope();\n },\n resolve(container) {\n return {\n presenter: container.resolve(Abstraction)\n };\n }\n});\n"],"names":["CmsCompareEntryRevisionsPresentationFeature","createFeature","container","CmsCompareEntryRevisionsPresenterImplementation","Abstraction"],"mappings":";;;AAIO,MAAMA,8CAA8CC,cAAc;IACrE,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC,iDAAiD,gBAAgB;IACxF;IACA,SAAQD,SAAS;QACb,OAAO;YACH,WAAWA,UAAU,OAAO,CAACE;QACjC;IACJ;AACJ"}
@@ -0,0 +1,4 @@
1
+ import React from "react";
2
+ export declare const CmsGenerateContentButton: (() => React.JSX.Element | null) & React.NamedExoticComponent<unknown> & {
3
+ readonly type: () => React.JSX.Element | null;
4
+ };
@@ -0,0 +1,27 @@
1
+ import react from "react";
2
+ import { observer } from "mobx-react-lite";
3
+ import { IconButton } from "@webiny/admin-ui";
4
+ import { ReactComponent } from "@webiny/icons/auto_fix_high.svg";
5
+ import { useOpenDialog } from "@webiny/app-admin";
6
+ import { useModel } from "@webiny/app-headless-cms/admin/components/ModelProvider/useModel.js";
7
+ import { CMS_GENERATE_CONTENT_DIALOG } from "./CmsGenerateContentDialog.js";
8
+ import { useAiPowerUpsSettings } from "../AiPowerUpsSettings/index.js";
9
+ import { useContentEntryFormPresenter } from "@webiny/app-headless-cms/exports/admin/cms/entry/editor.js";
10
+ const CmsGenerateContentButton = observer(()=>{
11
+ const { openDialog } = useOpenDialog();
12
+ const { settings } = useAiPowerUpsSettings();
13
+ const { model } = useModel();
14
+ const presenter = useContentEntryFormPresenter();
15
+ if (!presenter.vm.canSave) return null;
16
+ if (!settings || 0 === settings.providers.presets.length) return null;
17
+ return /*#__PURE__*/ react.createElement(IconButton, {
18
+ variant: "ghost",
19
+ icon: /*#__PURE__*/ react.createElement(ReactComponent, null),
20
+ onClick: ()=>openDialog(CMS_GENERATE_CONTENT_DIALOG, {
21
+ modelId: model.modelId
22
+ })
23
+ });
24
+ });
25
+ export { CmsGenerateContentButton };
26
+
27
+ //# sourceMappingURL=CmsGenerateContentButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin/presentation/CmsContentGeneration/CmsGenerateContentButton.js","sources":["../../../../src/admin/presentation/CmsContentGeneration/CmsGenerateContentButton.tsx"],"sourcesContent":["import React from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { IconButton } from \"@webiny/admin-ui\";\nimport { ReactComponent as ChatIcon } from \"@webiny/icons/auto_fix_high.svg\";\nimport { useOpenDialog } from \"@webiny/app-admin\";\nimport { useModel } from \"@webiny/app-headless-cms/admin/components/ModelProvider/useModel.js\";\nimport { CMS_GENERATE_CONTENT_DIALOG } from \"./CmsGenerateContentDialog.js\";\nimport { useAiPowerUpsSettings } from \"~/admin/presentation/AiPowerUpsSettings/index.js\";\nimport { useContentEntryFormPresenter } from \"@webiny/app-headless-cms/exports/admin/cms/entry/editor.js\";\n\nexport const CmsGenerateContentButton = observer(() => {\n const { openDialog } = useOpenDialog();\n const { settings } = useAiPowerUpsSettings();\n const { model } = useModel();\n const presenter = useContentEntryFormPresenter();\n\n if (!presenter.vm.canSave) {\n return null;\n }\n\n if (!settings || settings.providers.presets.length === 0) {\n return null;\n }\n\n return (\n <IconButton\n variant=\"ghost\"\n icon={<ChatIcon />}\n onClick={() => openDialog(CMS_GENERATE_CONTENT_DIALOG, { modelId: model.modelId })}\n />\n );\n});\n"],"names":["CmsGenerateContentButton","observer","openDialog","useOpenDialog","settings","useAiPowerUpsSettings","model","useModel","presenter","useContentEntryFormPresenter","IconButton","ChatIcon","CMS_GENERATE_CONTENT_DIALOG"],"mappings":";;;;;;;;;AAUO,MAAMA,2BAA2BC,SAAS;IAC7C,MAAM,EAAEC,UAAU,EAAE,GAAGC;IACvB,MAAM,EAAEC,QAAQ,EAAE,GAAGC;IACrB,MAAM,EAAEC,KAAK,EAAE,GAAGC;IAClB,MAAMC,YAAYC;IAElB,IAAI,CAACD,UAAU,EAAE,CAAC,OAAO,EACrB,OAAO;IAGX,IAAI,CAACJ,YAAYA,AAAsC,MAAtCA,SAAS,SAAS,CAAC,OAAO,CAAC,MAAM,EAC9C,OAAO;IAGX,OAAO,WAAP,GACI,oBAACM,YAAUA;QACP,SAAQ;QACR,oBAAM,oBAACC,gBAAQA;QACf,SAAS,IAAMT,WAAWU,6BAA6B;gBAAE,SAASN,MAAM,OAAO;YAAC;;AAG5F"}
@@ -0,0 +1,5 @@
1
+ import React from "react";
2
+ export declare const CMS_GENERATE_CONTENT_DIALOG = "cms-generate-content";
3
+ export declare const CmsGenerateContentDialog: (() => React.JSX.Element) & React.NamedExoticComponent<unknown> & {
4
+ readonly type: () => React.JSX.Element;
5
+ };
@@ -0,0 +1,106 @@
1
+ import react, { useEffect, useRef } from "react";
2
+ import { observer } from "mobx-react-lite";
3
+ import { FormView, useDialog } from "@webiny/app-admin";
4
+ import { Dialog, OverlayLoader, useToast } from "@webiny/admin-ui";
5
+ import { useFeature } from "@webiny/app";
6
+ import { useWebsockets } from "@webiny/app-websockets";
7
+ import { useContentEntryFormPresenter } from "@webiny/app-headless-cms/presentation/contentEntries/form/useContentEntryFormPresenter.js";
8
+ import { CmsGenerateContentFeature } from "./feature.js";
9
+ import { decompressGzipBase64 } from "../WbContentGeneration/decompressGzipBase64.js";
10
+ function formatElapsed(totalSeconds) {
11
+ const minutes = Math.floor(totalSeconds / 60);
12
+ const seconds = totalSeconds % 60;
13
+ return `${minutes}:${seconds.toString().padStart(2, "0")}`;
14
+ }
15
+ const CMS_GENERATE_CONTENT_DIALOG = "cms-generate-content";
16
+ const WS_ACTION_CONTENT = "aiPowerUps.generateEntryContent.content";
17
+ const WS_ACTION_ERROR = "aiPowerUps.generateEntryContent.error";
18
+ const CmsGenerateContentDialog = observer(()=>{
19
+ const { closeDialog, params } = useDialog();
20
+ const { presenter } = useFeature(CmsGenerateContentFeature);
21
+ const formPresenter = useContentEntryFormPresenter();
22
+ const vm = presenter.vm;
23
+ const wasSubmitting = useRef(false);
24
+ const websockets = useWebsockets();
25
+ const toast = useToast();
26
+ const modelId = params.modelId;
27
+ useEffect(()=>{
28
+ presenter.init();
29
+ }, []);
30
+ useEffect(()=>{
31
+ const contentSubscription = websockets.onMessage(WS_ACTION_CONTENT, async (message)=>{
32
+ const responseText = await decompressGzipBase64(message.data.value);
33
+ try {
34
+ const entryValues = await presenter.processAiResponse(responseText);
35
+ console.log("entryValues", entryValues);
36
+ const form = formPresenter.vm.form;
37
+ if (form) form.setData(entryValues);
38
+ } catch (e) {
39
+ console.error("Failed to process AI response", {
40
+ responseText
41
+ });
42
+ console.error(e);
43
+ toast.showWarningToast({
44
+ title: "Failed to process AI response",
45
+ description: "Open the console for more details."
46
+ });
47
+ presenter.cancelPrompt();
48
+ }
49
+ });
50
+ const errorSubscription = websockets.onMessage(WS_ACTION_ERROR, async (message)=>{
51
+ toast.showWarningToast({
52
+ title: "Failed to generate content",
53
+ description: message.data.message
54
+ });
55
+ presenter.cancelPrompt();
56
+ });
57
+ return ()=>{
58
+ contentSubscription.off();
59
+ errorSubscription.off();
60
+ };
61
+ }, []);
62
+ useEffect(()=>{
63
+ if (wasSubmitting.current && !vm.submitting && !vm.timedOut) closeDialog();
64
+ wasSubmitting.current = vm.submitting;
65
+ }, [
66
+ vm.submitting
67
+ ]);
68
+ useEffect(()=>{
69
+ if (vm.timedOut) toast.showWarningToast({
70
+ title: "Request timed out",
71
+ description: "The AI generation took too long. Please try again."
72
+ });
73
+ }, [
74
+ vm.timedOut
75
+ ]);
76
+ const handleSubmit = async ()=>{
77
+ await presenter.submit(modelId);
78
+ };
79
+ return /*#__PURE__*/ react.createElement(Dialog, {
80
+ open: true,
81
+ onClose: closeDialog,
82
+ title: "Generate Entry Content",
83
+ size: "lg",
84
+ actions: /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(Dialog.CancelAction, {
85
+ onClick: closeDialog,
86
+ text: "Cancel"
87
+ }), /*#__PURE__*/ react.createElement(Dialog.ConfirmAction, {
88
+ onClick: handleSubmit,
89
+ text: "Generate",
90
+ disabled: vm.loading || vm.submitting
91
+ }))
92
+ }, vm.loading ? /*#__PURE__*/ react.createElement(OverlayLoader, {
93
+ text: "Loading..."
94
+ }) : null, vm.submitting ? /*#__PURE__*/ react.createElement(OverlayLoader, {
95
+ className: "bg-neutral-base/90",
96
+ text: /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement("div", null, "Generating content... ", formatElapsed(vm.elapsedSeconds)), /*#__PURE__*/ react.createElement("div", {
97
+ className: "text-sm text-neutral-muted pt-xs"
98
+ }, "Content generation can take a few minutes, depending on the model you're using."))
99
+ }) : null, vm.form ? /*#__PURE__*/ react.createElement(FormView, {
100
+ name: "CmsGenerateContent",
101
+ form: vm.form
102
+ }) : null);
103
+ });
104
+ export { CMS_GENERATE_CONTENT_DIALOG, CmsGenerateContentDialog };
105
+
106
+ //# sourceMappingURL=CmsGenerateContentDialog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin/presentation/CmsContentGeneration/CmsGenerateContentDialog.js","sources":["../../../../src/admin/presentation/CmsContentGeneration/CmsGenerateContentDialog.tsx"],"sourcesContent":["import React, { useEffect, useRef } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { useDialog, FormView } from \"@webiny/app-admin\";\nimport { Dialog, OverlayLoader, useToast } from \"@webiny/admin-ui\";\nimport { useFeature } from \"@webiny/app\";\nimport type { IncomingGenericData } from \"@webiny/app-websockets\";\nimport { useWebsockets } from \"@webiny/app-websockets\";\nimport { useContentEntryFormPresenter } from \"@webiny/app-headless-cms/presentation/contentEntries/form/useContentEntryFormPresenter.js\";\nimport { CmsGenerateContentFeature } from \"./feature.js\";\nimport { decompressGzipBase64 } from \"~/admin/presentation/WbContentGeneration/decompressGzipBase64.js\";\n\nfunction formatElapsed(totalSeconds: number): string {\n const minutes = Math.floor(totalSeconds / 60);\n const seconds = totalSeconds % 60;\n return `${minutes}:${seconds.toString().padStart(2, \"0\")}`;\n}\n\nexport const CMS_GENERATE_CONTENT_DIALOG = \"cms-generate-content\";\n\nconst WS_ACTION_CONTENT = \"aiPowerUps.generateEntryContent.content\";\nconst WS_ACTION_ERROR = \"aiPowerUps.generateEntryContent.error\";\n\ninterface GenerateEntryContentMessage extends IncomingGenericData {\n action: typeof WS_ACTION_CONTENT;\n data: {\n compression: \"gzip\";\n value: string;\n };\n}\n\ninterface GenerateEntryContentErrorMessage extends IncomingGenericData {\n action: typeof WS_ACTION_ERROR;\n data: {\n message: string;\n };\n}\n\nexport const CmsGenerateContentDialog = observer(() => {\n const { closeDialog, params } = useDialog();\n const { presenter } = useFeature(CmsGenerateContentFeature);\n const formPresenter = useContentEntryFormPresenter();\n const vm = presenter.vm;\n const wasSubmitting = useRef(false);\n const websockets = useWebsockets();\n const toast = useToast();\n const modelId = params.modelId as string;\n\n useEffect(() => {\n presenter.init();\n }, []);\n\n useEffect(() => {\n const contentSubscription = websockets.onMessage<GenerateEntryContentMessage>(\n WS_ACTION_CONTENT,\n async message => {\n const responseText = await decompressGzipBase64(message.data.value);\n try {\n const entryValues = await presenter.processAiResponse(responseText);\n console.log(\"entryValues\", entryValues);\n const form = formPresenter.vm.form;\n if (form) {\n form.setData(entryValues);\n }\n } catch (e) {\n console.error(\"Failed to process AI response\", { responseText });\n console.error(e);\n toast.showWarningToast({\n title: \"Failed to process AI response\",\n description: \"Open the console for more details.\"\n });\n presenter.cancelPrompt();\n }\n }\n );\n\n const errorSubscription = websockets.onMessage<GenerateEntryContentErrorMessage>(\n WS_ACTION_ERROR,\n async message => {\n toast.showWarningToast({\n title: \"Failed to generate content\",\n description: message.data.message\n });\n presenter.cancelPrompt();\n }\n );\n\n return () => {\n contentSubscription.off();\n errorSubscription.off();\n };\n }, []);\n\n useEffect(() => {\n if (wasSubmitting.current && !vm.submitting && !vm.timedOut) {\n closeDialog();\n }\n wasSubmitting.current = vm.submitting;\n }, [vm.submitting]);\n\n useEffect(() => {\n if (vm.timedOut) {\n toast.showWarningToast({\n title: \"Request timed out\",\n description: \"The AI generation took too long. Please try again.\"\n });\n }\n }, [vm.timedOut]);\n\n const handleSubmit = async () => {\n await presenter.submit(modelId);\n };\n\n return (\n <Dialog\n open={true}\n onClose={closeDialog}\n title=\"Generate Entry Content\"\n size={\"lg\"}\n actions={\n <>\n <Dialog.CancelAction onClick={closeDialog} text=\"Cancel\" />\n <Dialog.ConfirmAction\n onClick={handleSubmit}\n text=\"Generate\"\n disabled={vm.loading || vm.submitting}\n />\n </>\n }\n >\n {vm.loading ? <OverlayLoader text={\"Loading...\"} /> : null}\n {vm.submitting ? (\n <OverlayLoader\n className={\"bg-neutral-base/90\"}\n text={\n <>\n <div>Generating content... {formatElapsed(vm.elapsedSeconds)}</div>\n <div className=\"text-sm text-neutral-muted pt-xs\">\n Content generation can take a few minutes, depending on the model\n you&apos;re using.\n </div>\n </>\n }\n />\n ) : null}\n {vm.form ? <FormView name=\"CmsGenerateContent\" form={vm.form} /> : null}\n </Dialog>\n );\n});\n"],"names":["formatElapsed","totalSeconds","minutes","Math","seconds","CMS_GENERATE_CONTENT_DIALOG","WS_ACTION_CONTENT","WS_ACTION_ERROR","CmsGenerateContentDialog","observer","closeDialog","params","useDialog","presenter","useFeature","CmsGenerateContentFeature","formPresenter","useContentEntryFormPresenter","vm","wasSubmitting","useRef","websockets","useWebsockets","toast","useToast","modelId","useEffect","contentSubscription","message","responseText","decompressGzipBase64","entryValues","console","form","e","errorSubscription","handleSubmit","Dialog","OverlayLoader","FormView"],"mappings":";;;;;;;;;AAWA,SAASA,cAAcC,YAAoB;IACvC,MAAMC,UAAUC,KAAK,KAAK,CAACF,eAAe;IAC1C,MAAMG,UAAUH,eAAe;IAC/B,OAAO,GAAGC,QAAQ,CAAC,EAAEE,QAAQ,QAAQ,GAAG,QAAQ,CAAC,GAAG,MAAM;AAC9D;AAEO,MAAMC,8BAA8B;AAE3C,MAAMC,oBAAoB;AAC1B,MAAMC,kBAAkB;AAiBjB,MAAMC,2BAA2BC,SAAS;IAC7C,MAAM,EAAEC,WAAW,EAAEC,MAAM,EAAE,GAAGC;IAChC,MAAM,EAAEC,SAAS,EAAE,GAAGC,WAAWC;IACjC,MAAMC,gBAAgBC;IACtB,MAAMC,KAAKL,UAAU,EAAE;IACvB,MAAMM,gBAAgBC,OAAO;IAC7B,MAAMC,aAAaC;IACnB,MAAMC,QAAQC;IACd,MAAMC,UAAUd,OAAO,OAAO;IAE9Be,UAAU;QACNb,UAAU,IAAI;IAClB,GAAG,EAAE;IAELa,UAAU;QACN,MAAMC,sBAAsBN,WAAW,SAAS,CAC5Cf,mBACA,OAAMsB;YACF,MAAMC,eAAe,MAAMC,qBAAqBF,QAAQ,IAAI,CAAC,KAAK;YAClE,IAAI;gBACA,MAAMG,cAAc,MAAMlB,UAAU,iBAAiB,CAACgB;gBACtDG,QAAQ,GAAG,CAAC,eAAeD;gBAC3B,MAAME,OAAOjB,cAAc,EAAE,CAAC,IAAI;gBAClC,IAAIiB,MACAA,KAAK,OAAO,CAACF;YAErB,EAAE,OAAOG,GAAG;gBACRF,QAAQ,KAAK,CAAC,iCAAiC;oBAAEH;gBAAa;gBAC9DG,QAAQ,KAAK,CAACE;gBACdX,MAAM,gBAAgB,CAAC;oBACnB,OAAO;oBACP,aAAa;gBACjB;gBACAV,UAAU,YAAY;YAC1B;QACJ;QAGJ,MAAMsB,oBAAoBd,WAAW,SAAS,CAC1Cd,iBACA,OAAMqB;YACFL,MAAM,gBAAgB,CAAC;gBACnB,OAAO;gBACP,aAAaK,QAAQ,IAAI,CAAC,OAAO;YACrC;YACAf,UAAU,YAAY;QAC1B;QAGJ,OAAO;YACHc,oBAAoB,GAAG;YACvBQ,kBAAkB,GAAG;QACzB;IACJ,GAAG,EAAE;IAELT,UAAU;QACN,IAAIP,cAAc,OAAO,IAAI,CAACD,GAAG,UAAU,IAAI,CAACA,GAAG,QAAQ,EACvDR;QAEJS,cAAc,OAAO,GAAGD,GAAG,UAAU;IACzC,GAAG;QAACA,GAAG,UAAU;KAAC;IAElBQ,UAAU;QACN,IAAIR,GAAG,QAAQ,EACXK,MAAM,gBAAgB,CAAC;YACnB,OAAO;YACP,aAAa;QACjB;IAER,GAAG;QAACL,GAAG,QAAQ;KAAC;IAEhB,MAAMkB,eAAe;QACjB,MAAMvB,UAAU,MAAM,CAACY;IAC3B;IAEA,OAAO,WAAP,GACI,oBAACY,QAAMA;QACH,MAAM;QACN,SAAS3B;QACT,OAAM;QACN,MAAM;QACN,uBACI,wDACI,oBAAC2B,OAAO,YAAY;YAAC,SAAS3B;YAAa,MAAK;0BAChD,oBAAC2B,OAAO,aAAa;YACjB,SAASD;YACT,MAAK;YACL,UAAUlB,GAAG,OAAO,IAAIA,GAAG,UAAU;;OAKhDA,GAAG,OAAO,GAAG,WAAH,GAAG,oBAACoB,eAAaA;QAAC,MAAM;SAAmB,MACrDpB,GAAG,UAAU,GAAG,WAAH,GACV,oBAACoB,eAAaA;QACV,WAAW;QACX,oBACI,wDACI,oBAAC,aAAI,0BAAuBtC,cAAckB,GAAG,cAAc,kBAC3D,oBAAC;YAAI,WAAU;WAAmC;SAO9D,MACHA,GAAG,IAAI,GAAG,WAAH,GAAG,oBAACqB,UAAQA;QAAC,MAAK;QAAqB,MAAMrB,GAAG,IAAI;SAAO;AAG/E"}
@@ -0,0 +1,29 @@
1
+ import { ToolPipelineRunner } from "@webiny/app-admin";
2
+ import { CmsGenerateContentPresenter as Abstraction } from "./abstractions.js";
3
+ import { GenerateEntryContentUseCase } from "../../../admin/features/generateEntryContent/index.js";
4
+ import { AiPromptFormFactory } from "../../../admin/presentation/AiPromptFormFactory/abstractions.js";
5
+ declare class CmsGenerateContentPresenterImpl implements Abstraction.Interface {
6
+ private pipelineRunner;
7
+ private generateEntryContent;
8
+ private formFactory;
9
+ private _loading;
10
+ private _submitting;
11
+ private _timedOut;
12
+ private _form;
13
+ private _timeoutId;
14
+ private _intervalId;
15
+ private _elapsedSeconds;
16
+ constructor(pipelineRunner: ToolPipelineRunner.Interface, generateEntryContent: GenerateEntryContentUseCase.Interface, formFactory: AiPromptFormFactory.Interface);
17
+ get vm(): Abstraction.ViewModel;
18
+ init(): Promise<void>;
19
+ submit(modelId: string): Promise<void>;
20
+ processAiResponse(responseText: string): Promise<Record<string, unknown>>;
21
+ cancelPrompt(): void;
22
+ private startTimeout;
23
+ private clearTimeout;
24
+ private clearInterval;
25
+ }
26
+ export declare const CmsGenerateContentPresenter: typeof CmsGenerateContentPresenterImpl & {
27
+ __abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").ICmsGenerateContentPresenter>;
28
+ };
29
+ export {};
@@ -0,0 +1,120 @@
1
+ import { computed, makeAutoObservable, runInAction } from "mobx";
2
+ import { ToolPipelineRunner } from "@webiny/app-admin";
3
+ import { CmsGenerateContentPresenter } from "./abstractions.js";
4
+ import { GenerateEntryContentUseCase } from "../../features/generateEntryContent/index.js";
5
+ import { AiPromptFormFactory } from "../AiPromptFormFactory/abstractions.js";
6
+ const SUBMIT_TIMEOUT_MS = 300000;
7
+ class CmsGenerateContentPresenterImpl {
8
+ constructor(pipelineRunner, generateEntryContent, formFactory){
9
+ this.pipelineRunner = pipelineRunner;
10
+ this.generateEntryContent = generateEntryContent;
11
+ this.formFactory = formFactory;
12
+ this._loading = false;
13
+ this._submitting = false;
14
+ this._timedOut = false;
15
+ this._form = null;
16
+ this._timeoutId = null;
17
+ this._intervalId = null;
18
+ this._elapsedSeconds = 0;
19
+ makeAutoObservable(this, {
20
+ vm: computed
21
+ }, {
22
+ autoBind: true
23
+ });
24
+ }
25
+ get vm() {
26
+ return {
27
+ form: this._form ? this._form.vm : null,
28
+ loading: this._loading,
29
+ submitting: this._submitting,
30
+ timedOut: this._timedOut,
31
+ elapsedSeconds: this._elapsedSeconds
32
+ };
33
+ }
34
+ async init() {
35
+ this._form = this.formFactory.createForm({
36
+ promptDescription: "Describe the content you want to generate for this entry."
37
+ });
38
+ }
39
+ async submit(modelId) {
40
+ if (!this._form) return;
41
+ const data = await this._form.submit();
42
+ if (!data) return;
43
+ runInAction(()=>{
44
+ this._submitting = true;
45
+ this._timedOut = false;
46
+ });
47
+ this.startTimeout();
48
+ try {
49
+ const excludedFileIds = this.formFactory.computeExcludedFileIds(this._form);
50
+ const additionalFileIds = data.additionalFiles?.map((f)=>f.id) ?? null;
51
+ await this.generateEntryContent.execute({
52
+ prompt: data.prompt,
53
+ modelId,
54
+ projectId: data.project || null,
55
+ excludedFileIds,
56
+ readerPersonaId: data.readerPersona || null,
57
+ writerPersonaId: data.writerPersona || null,
58
+ additionalFileIds
59
+ });
60
+ } catch {
61
+ this.clearTimeout();
62
+ runInAction(()=>{
63
+ this._submitting = false;
64
+ });
65
+ }
66
+ }
67
+ async processAiResponse(responseText) {
68
+ this.clearTimeout();
69
+ runInAction(()=>{
70
+ this._submitting = false;
71
+ });
72
+ const aiResponseJson = JSON.parse(responseText);
73
+ const resolved = await this.pipelineRunner.resolve(aiResponseJson);
74
+ return resolved;
75
+ }
76
+ cancelPrompt() {
77
+ this.clearTimeout();
78
+ this._submitting = false;
79
+ }
80
+ startTimeout() {
81
+ this.clearTimeout();
82
+ this._elapsedSeconds = 0;
83
+ this._intervalId = setInterval(()=>{
84
+ runInAction(()=>{
85
+ this._elapsedSeconds++;
86
+ });
87
+ }, 1000);
88
+ this._timeoutId = setTimeout(()=>{
89
+ runInAction(()=>{
90
+ this._submitting = false;
91
+ this._timedOut = true;
92
+ });
93
+ this.clearInterval();
94
+ }, SUBMIT_TIMEOUT_MS);
95
+ }
96
+ clearTimeout() {
97
+ if (null !== this._timeoutId) {
98
+ clearTimeout(this._timeoutId);
99
+ this._timeoutId = null;
100
+ }
101
+ this.clearInterval();
102
+ }
103
+ clearInterval() {
104
+ if (null !== this._intervalId) {
105
+ clearInterval(this._intervalId);
106
+ this._intervalId = null;
107
+ }
108
+ }
109
+ }
110
+ const CmsGenerateContentPresenter_CmsGenerateContentPresenter = CmsGenerateContentPresenter.createImplementation({
111
+ implementation: CmsGenerateContentPresenterImpl,
112
+ dependencies: [
113
+ ToolPipelineRunner,
114
+ GenerateEntryContentUseCase,
115
+ AiPromptFormFactory
116
+ ]
117
+ });
118
+ export { CmsGenerateContentPresenter_CmsGenerateContentPresenter as CmsGenerateContentPresenter };
119
+
120
+ //# sourceMappingURL=CmsGenerateContentPresenter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin/presentation/CmsContentGeneration/CmsGenerateContentPresenter.js","sources":["../../../../src/admin/presentation/CmsContentGeneration/CmsGenerateContentPresenter.ts"],"sourcesContent":["import { makeAutoObservable, computed, runInAction } from \"mobx\";\nimport { ToolPipelineRunner } from \"@webiny/app-admin\";\nimport type { FormModel } from \"@webiny/app-admin\";\nimport type { FileValue } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport { CmsGenerateContentPresenter as Abstraction } from \"./abstractions.js\";\nimport { GenerateEntryContentUseCase } from \"~/admin/features/generateEntryContent/index.js\";\nimport { AiPromptFormFactory } from \"~/admin/presentation/AiPromptFormFactory/abstractions.js\";\n\nconst SUBMIT_TIMEOUT_MS = 300_000;\n\nclass CmsGenerateContentPresenterImpl implements Abstraction.Interface {\n private _loading = false;\n private _submitting = false;\n private _timedOut = false;\n private _form: FormModel.Interface | null = null;\n private _timeoutId: ReturnType<typeof setTimeout> | null = null;\n private _intervalId: ReturnType<typeof setInterval> | null = null;\n private _elapsedSeconds = 0;\n\n constructor(\n private pipelineRunner: ToolPipelineRunner.Interface,\n private generateEntryContent: GenerateEntryContentUseCase.Interface,\n private formFactory: AiPromptFormFactory.Interface\n ) {\n makeAutoObservable(this, { vm: computed }, { autoBind: true });\n }\n\n get vm(): Abstraction.ViewModel {\n return {\n form: this._form ? this._form.vm : null,\n loading: this._loading,\n submitting: this._submitting,\n timedOut: this._timedOut,\n elapsedSeconds: this._elapsedSeconds\n };\n }\n\n async init(): Promise<void> {\n this._form = this.formFactory.createForm({\n promptDescription: \"Describe the content you want to generate for this entry.\"\n });\n }\n\n async submit(modelId: string): Promise<void> {\n if (!this._form) {\n return;\n }\n\n const data = await this._form.submit<{\n prompt: string;\n project?: string;\n includedFiles?: string[];\n readerPersona?: string;\n writerPersona?: string;\n additionalFiles?: FileValue[];\n }>();\n\n if (!data) {\n return;\n }\n\n runInAction(() => {\n this._submitting = true;\n this._timedOut = false;\n });\n\n this.startTimeout();\n\n try {\n const excludedFileIds = this.formFactory.computeExcludedFileIds(this._form);\n const additionalFileIds = data.additionalFiles?.map(f => f.id) ?? null;\n\n await this.generateEntryContent.execute({\n prompt: data.prompt,\n modelId,\n projectId: data.project || null,\n excludedFileIds,\n readerPersonaId: data.readerPersona || null,\n writerPersonaId: data.writerPersona || null,\n additionalFileIds\n });\n } catch {\n this.clearTimeout();\n runInAction(() => {\n this._submitting = false;\n });\n }\n }\n\n async processAiResponse(responseText: string): Promise<Record<string, unknown>> {\n this.clearTimeout();\n runInAction(() => {\n this._submitting = false;\n });\n\n const aiResponseJson = JSON.parse(responseText);\n const resolved = await this.pipelineRunner.resolve(aiResponseJson);\n return resolved as Record<string, unknown>;\n }\n\n cancelPrompt(): void {\n this.clearTimeout();\n this._submitting = false;\n }\n\n private startTimeout(): void {\n this.clearTimeout();\n this._elapsedSeconds = 0;\n this._intervalId = setInterval(() => {\n runInAction(() => {\n this._elapsedSeconds++;\n });\n }, 1000);\n this._timeoutId = setTimeout(() => {\n runInAction(() => {\n this._submitting = false;\n this._timedOut = true;\n });\n this.clearInterval();\n }, SUBMIT_TIMEOUT_MS);\n }\n\n private clearTimeout(): void {\n if (this._timeoutId !== null) {\n clearTimeout(this._timeoutId);\n this._timeoutId = null;\n }\n this.clearInterval();\n }\n\n private clearInterval(): void {\n if (this._intervalId !== null) {\n clearInterval(this._intervalId);\n this._intervalId = null;\n }\n }\n}\n\nexport const CmsGenerateContentPresenter = Abstraction.createImplementation({\n implementation: CmsGenerateContentPresenterImpl,\n dependencies: [ToolPipelineRunner, GenerateEntryContentUseCase, AiPromptFormFactory]\n});\n"],"names":["SUBMIT_TIMEOUT_MS","CmsGenerateContentPresenterImpl","pipelineRunner","generateEntryContent","formFactory","makeAutoObservable","computed","modelId","data","runInAction","excludedFileIds","additionalFileIds","f","responseText","aiResponseJson","JSON","resolved","setInterval","setTimeout","clearTimeout","clearInterval","CmsGenerateContentPresenter","Abstraction","ToolPipelineRunner","GenerateEntryContentUseCase","AiPromptFormFactory"],"mappings":";;;;;AAQA,MAAMA,oBAAoB;AAE1B,MAAMC;IASF,YACYC,cAA4C,EAC5CC,oBAA2D,EAC3DC,WAA0C,CACpD;aAHUF,cAAc,GAAdA;aACAC,oBAAoB,GAApBA;aACAC,WAAW,GAAXA;aAXJ,QAAQ,GAAG;aACX,WAAW,GAAG;aACd,SAAS,GAAG;aACZ,KAAK,GAA+B;aACpC,UAAU,GAAyC;aACnD,WAAW,GAA0C;aACrD,eAAe,GAAG;QAOtBC,mBAAmB,IAAI,EAAE;YAAE,IAAIC;QAAS,GAAG;YAAE,UAAU;QAAK;IAChE;IAEA,IAAI,KAA4B;QAC5B,OAAO;YACH,MAAM,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG;YACnC,SAAS,IAAI,CAAC,QAAQ;YACtB,YAAY,IAAI,CAAC,WAAW;YAC5B,UAAU,IAAI,CAAC,SAAS;YACxB,gBAAgB,IAAI,CAAC,eAAe;QACxC;IACJ;IAEA,MAAM,OAAsB;QACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;YACrC,mBAAmB;QACvB;IACJ;IAEA,MAAM,OAAOC,OAAe,EAAiB;QACzC,IAAI,CAAC,IAAI,CAAC,KAAK,EACX;QAGJ,MAAMC,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM;QASpC,IAAI,CAACA,MACD;QAGJC,YAAY;YACR,IAAI,CAAC,WAAW,GAAG;YACnB,IAAI,CAAC,SAAS,GAAG;QACrB;QAEA,IAAI,CAAC,YAAY;QAEjB,IAAI;YACA,MAAMC,kBAAkB,IAAI,CAAC,WAAW,CAAC,sBAAsB,CAAC,IAAI,CAAC,KAAK;YAC1E,MAAMC,oBAAoBH,KAAK,eAAe,EAAE,IAAII,CAAAA,IAAKA,EAAE,EAAE,KAAK;YAElE,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC;gBACpC,QAAQJ,KAAK,MAAM;gBACnBD;gBACA,WAAWC,KAAK,OAAO,IAAI;gBAC3BE;gBACA,iBAAiBF,KAAK,aAAa,IAAI;gBACvC,iBAAiBA,KAAK,aAAa,IAAI;gBACvCG;YACJ;QACJ,EAAE,OAAM;YACJ,IAAI,CAAC,YAAY;YACjBF,YAAY;gBACR,IAAI,CAAC,WAAW,GAAG;YACvB;QACJ;IACJ;IAEA,MAAM,kBAAkBI,YAAoB,EAAoC;QAC5E,IAAI,CAAC,YAAY;QACjBJ,YAAY;YACR,IAAI,CAAC,WAAW,GAAG;QACvB;QAEA,MAAMK,iBAAiBC,KAAK,KAAK,CAACF;QAClC,MAAMG,WAAW,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAACF;QACnD,OAAOE;IACX;IAEA,eAAqB;QACjB,IAAI,CAAC,YAAY;QACjB,IAAI,CAAC,WAAW,GAAG;IACvB;IAEQ,eAAqB;QACzB,IAAI,CAAC,YAAY;QACjB,IAAI,CAAC,eAAe,GAAG;QACvB,IAAI,CAAC,WAAW,GAAGC,YAAY;YAC3BR,YAAY;gBACR,IAAI,CAAC,eAAe;YACxB;QACJ,GAAG;QACH,IAAI,CAAC,UAAU,GAAGS,WAAW;YACzBT,YAAY;gBACR,IAAI,CAAC,WAAW,GAAG;gBACnB,IAAI,CAAC,SAAS,GAAG;YACrB;YACA,IAAI,CAAC,aAAa;QACtB,GAAGT;IACP;IAEQ,eAAqB;QACzB,IAAI,AAAoB,SAApB,IAAI,CAAC,UAAU,EAAW;YAC1BmB,aAAa,IAAI,CAAC,UAAU;YAC5B,IAAI,CAAC,UAAU,GAAG;QACtB;QACA,IAAI,CAAC,aAAa;IACtB;IAEQ,gBAAsB;QAC1B,IAAI,AAAqB,SAArB,IAAI,CAAC,WAAW,EAAW;YAC3BC,cAAc,IAAI,CAAC,WAAW;YAC9B,IAAI,CAAC,WAAW,GAAG;QACvB;IACJ;AACJ;AAEO,MAAMC,0DAA8BC,4BAAAA,oBAAgC,CAAC;IACxE,gBAAgBrB;IAChB,cAAc;QAACsB;QAAoBC;QAA6BC;KAAoB;AACxF"}
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare const CmsContentGeneration: () => React.JSX.Element | null;
@@ -0,0 +1,27 @@
1
+ import react from "react";
2
+ import { AdminConfig, RegisterFeature, useFeatureFlags } from "@webiny/app-admin";
3
+ import { InternalContentEntryEditorConfig } from "@webiny/app-headless-cms/admin/config/contentEntries/index.js";
4
+ import { CmsGenerateContentButton } from "./CmsGenerateContentButton.js";
5
+ import { CMS_GENERATE_CONTENT_DIALOG, CmsGenerateContentDialog } from "./CmsGenerateContentDialog.js";
6
+ import { CmsGenerateContentFeature } from "./feature.js";
7
+ import { GenerateEntryContentFeature } from "../../features/generateEntryContent/index.js";
8
+ const { Actions: Actions } = InternalContentEntryEditorConfig;
9
+ const CmsContentGeneration = ()=>{
10
+ const featureFlags = useFeatureFlags();
11
+ if (!featureFlags.isEnabled("aiPowerups.cms.entryGeneration")) return null;
12
+ return /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(RegisterFeature, {
13
+ feature: CmsGenerateContentFeature
14
+ }), /*#__PURE__*/ react.createElement(RegisterFeature, {
15
+ feature: GenerateEntryContentFeature
16
+ }), /*#__PURE__*/ react.createElement(AdminConfig, null, /*#__PURE__*/ react.createElement(AdminConfig.Dialog, {
17
+ name: CMS_GENERATE_CONTENT_DIALOG,
18
+ element: /*#__PURE__*/ react.createElement(CmsGenerateContentDialog, null)
19
+ })), /*#__PURE__*/ react.createElement(InternalContentEntryEditorConfig, null, /*#__PURE__*/ react.createElement(Actions.ButtonAction, {
20
+ name: "generateEntryContent",
21
+ before: "save",
22
+ element: /*#__PURE__*/ react.createElement(CmsGenerateContentButton, null)
23
+ })));
24
+ };
25
+ export { CmsContentGeneration };
26
+
27
+ //# sourceMappingURL=Extension.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin/presentation/CmsContentGeneration/Extension.js","sources":["../../../../src/admin/presentation/CmsContentGeneration/Extension.tsx"],"sourcesContent":["import React from \"react\";\nimport { AdminConfig, RegisterFeature, useFeatureFlags } from \"@webiny/app-admin\";\nimport { InternalContentEntryEditorConfig } from \"@webiny/app-headless-cms/admin/config/contentEntries/index.js\";\nimport { CmsGenerateContentButton } from \"~/admin/presentation/CmsContentGeneration/CmsGenerateContentButton.js\";\nimport {\n CmsGenerateContentDialog,\n CMS_GENERATE_CONTENT_DIALOG\n} from \"~/admin/presentation/CmsContentGeneration/CmsGenerateContentDialog.js\";\nimport { CmsGenerateContentFeature } from \"~/admin/presentation/CmsContentGeneration/feature.js\";\nimport { GenerateEntryContentFeature } from \"~/admin/features/generateEntryContent/index.js\";\n\nconst { Actions } = InternalContentEntryEditorConfig;\n\nexport const CmsContentGeneration = () => {\n const featureFlags = useFeatureFlags();\n\n if (!featureFlags.isEnabled(\"aiPowerups.cms.entryGeneration\")) {\n return null;\n }\n\n return (\n <>\n <RegisterFeature feature={CmsGenerateContentFeature} />\n <RegisterFeature feature={GenerateEntryContentFeature} />\n <AdminConfig>\n <AdminConfig.Dialog\n name={CMS_GENERATE_CONTENT_DIALOG}\n element={<CmsGenerateContentDialog />}\n />\n </AdminConfig>\n <InternalContentEntryEditorConfig>\n <Actions.ButtonAction\n name={\"generateEntryContent\"}\n before={\"save\"}\n element={<CmsGenerateContentButton />}\n />\n </InternalContentEntryEditorConfig>\n </>\n );\n};\n"],"names":["Actions","InternalContentEntryEditorConfig","CmsContentGeneration","featureFlags","useFeatureFlags","RegisterFeature","CmsGenerateContentFeature","GenerateEntryContentFeature","AdminConfig","CMS_GENERATE_CONTENT_DIALOG","CmsGenerateContentDialog","CmsGenerateContentButton"],"mappings":";;;;;;;AAWA,MAAM,EAAEA,SAAAA,OAAO,EAAE,GAAGC;AAEb,MAAMC,uBAAuB;IAChC,MAAMC,eAAeC;IAErB,IAAI,CAACD,aAAa,SAAS,CAAC,mCACxB,OAAO;IAGX,OAAO,WAAP,GACI,wDACI,oBAACE,iBAAeA;QAAC,SAASC;sBAC1B,oBAACD,iBAAeA;QAAC,SAASE;sBAC1B,oBAACC,aAAWA,MAAAA,WAAAA,GACR,oBAACA,YAAY,MAAM;QACf,MAAMC;QACN,uBAAS,oBAACC,0BAAwBA;uBAG1C,oBAACT,kCAAgCA,MAAAA,WAAAA,GAC7B,oBAACD,QAAQ,YAAY;QACjB,MAAM;QACN,QAAQ;QACR,uBAAS,oBAACW,0BAAwBA;;AAKtD"}
@@ -0,0 +1,20 @@
1
+ import type { IFormVM } from "@webiny/app-admin/features/formModel/abstractions.js";
2
+ export interface ICmsGenerateContentVm {
3
+ form: IFormVM | null;
4
+ loading: boolean;
5
+ submitting: boolean;
6
+ timedOut: boolean;
7
+ elapsedSeconds: number;
8
+ }
9
+ export interface ICmsGenerateContentPresenter {
10
+ readonly vm: ICmsGenerateContentVm;
11
+ init(): Promise<void>;
12
+ submit(modelId: string): Promise<void>;
13
+ cancelPrompt(): void;
14
+ processAiResponse(responseText: string): Promise<Record<string, unknown>>;
15
+ }
16
+ export declare const CmsGenerateContentPresenter: import("@webiny/di").Abstraction<ICmsGenerateContentPresenter>;
17
+ export declare namespace CmsGenerateContentPresenter {
18
+ type Interface = ICmsGenerateContentPresenter;
19
+ type ViewModel = ICmsGenerateContentVm;
20
+ }
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/admin";
2
+ const CmsGenerateContentPresenter = createAbstraction("CmsContentGeneration/Presenter");
3
+ export { CmsGenerateContentPresenter };
4
+
5
+ //# sourceMappingURL=abstractions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin/presentation/CmsContentGeneration/abstractions.js","sources":["../../../../src/admin/presentation/CmsContentGeneration/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\nimport type { IFormVM } from \"@webiny/app-admin/features/formModel/abstractions.js\";\n\nexport interface ICmsGenerateContentVm {\n form: IFormVM | null;\n loading: boolean;\n submitting: boolean;\n timedOut: boolean;\n elapsedSeconds: number;\n}\n\nexport interface ICmsGenerateContentPresenter {\n readonly vm: ICmsGenerateContentVm;\n init(): Promise<void>;\n submit(modelId: string): Promise<void>;\n cancelPrompt(): void;\n processAiResponse(responseText: string): Promise<Record<string, unknown>>;\n}\n\nexport const CmsGenerateContentPresenter = createAbstraction<ICmsGenerateContentPresenter>(\n \"CmsContentGeneration/Presenter\"\n);\n\nexport namespace CmsGenerateContentPresenter {\n export type Interface = ICmsGenerateContentPresenter;\n export type ViewModel = ICmsGenerateContentVm;\n}\n"],"names":["CmsGenerateContentPresenter","createAbstraction"],"mappings":";AAmBO,MAAMA,8BAA8BC,kBACvC"}
@@ -0,0 +1,3 @@
1
+ export declare const CmsGenerateContentFeature: import("@webiny/feature/admin").FeatureDefinition<{
2
+ presenter: import("./abstractions.js").ICmsGenerateContentPresenter;
3
+ }, []>;