@webiny/ai-powerups 6.3.0 → 6.4.0-beta.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 (274) hide show
  1. package/AiPowerups.js +8 -9
  2. package/AiPowerups.js.map +1 -1
  3. package/admin/Extension.js +28 -26
  4. package/admin/Extension.js.map +1 -1
  5. package/admin/domain/errors.d.ts +12 -0
  6. package/admin/domain/errors.js +21 -0
  7. package/admin/domain/errors.js.map +1 -0
  8. package/admin/features/feature.js +13 -12
  9. package/admin/features/feature.js.map +1 -1
  10. package/admin/features/generatePageContent/GeneratePageContentGateway.js +35 -16
  11. package/admin/features/generatePageContent/GeneratePageContentGateway.js.map +1 -1
  12. package/admin/features/generatePageContent/GeneratePageContentUseCase.js +13 -10
  13. package/admin/features/generatePageContent/GeneratePageContentUseCase.js.map +1 -1
  14. package/admin/features/generatePageContent/abstractions.d.ts +4 -0
  15. package/admin/features/generatePageContent/abstractions.js +3 -2
  16. package/admin/features/generatePageContent/abstractions.js.map +1 -1
  17. package/admin/features/generatePageContent/feature.js +7 -6
  18. package/admin/features/generatePageContent/feature.js.map +1 -1
  19. package/admin/features/generatePageContent/index.js +1 -3
  20. package/admin/features/listModels/ListModelsGateway.js +17 -14
  21. package/admin/features/listModels/ListModelsGateway.js.map +1 -1
  22. package/admin/features/listModels/ListModelsRepository.js +21 -18
  23. package/admin/features/listModels/ListModelsRepository.js.map +1 -1
  24. package/admin/features/listModels/ListModelsUseCase.js +13 -10
  25. package/admin/features/listModels/ListModelsUseCase.js.map +1 -1
  26. package/admin/features/listModels/abstractions.js +4 -3
  27. package/admin/features/listModels/abstractions.js.map +1 -1
  28. package/admin/features/listModels/feature.js +15 -14
  29. package/admin/features/listModels/feature.js.map +1 -1
  30. package/admin/features/listModels/index.js +1 -3
  31. package/admin/features/settings/getSettings/GetSettingsGateway.js +17 -14
  32. package/admin/features/settings/getSettings/GetSettingsGateway.js.map +1 -1
  33. package/admin/features/settings/getSettings/GetSettingsRepository.js +23 -23
  34. package/admin/features/settings/getSettings/GetSettingsRepository.js.map +1 -1
  35. package/admin/features/settings/getSettings/GetSettingsUseCase.js +13 -10
  36. package/admin/features/settings/getSettings/GetSettingsUseCase.js.map +1 -1
  37. package/admin/features/settings/getSettings/abstractions.js +4 -3
  38. package/admin/features/settings/getSettings/abstractions.js.map +1 -1
  39. package/admin/features/settings/getSettings/feature.js +15 -14
  40. package/admin/features/settings/getSettings/feature.js.map +1 -1
  41. package/admin/features/settings/getSettings/index.js +1 -3
  42. package/admin/features/settings/shared/SettingsCache.js +14 -13
  43. package/admin/features/settings/shared/SettingsCache.js.map +1 -1
  44. package/admin/features/settings/shared/abstractions.d.ts +32 -0
  45. package/admin/features/settings/shared/abstractions.js +2 -18
  46. package/admin/features/settings/shared/abstractions.js.map +1 -1
  47. package/admin/features/settings/shared/feature.js +11 -10
  48. package/admin/features/settings/shared/feature.js.map +1 -1
  49. package/admin/features/settings/shared/index.js +0 -2
  50. package/admin/features/settings/updateSettings/UpdateSettingsGateway.js +34 -18
  51. package/admin/features/settings/updateSettings/UpdateSettingsGateway.js.map +1 -1
  52. package/admin/features/settings/updateSettings/UpdateSettingsRepository.js +17 -13
  53. package/admin/features/settings/updateSettings/UpdateSettingsRepository.js.map +1 -1
  54. package/admin/features/settings/updateSettings/UpdateSettingsUseCase.js +13 -10
  55. package/admin/features/settings/updateSettings/UpdateSettingsUseCase.js.map +1 -1
  56. package/admin/features/settings/updateSettings/abstractions.js +4 -3
  57. package/admin/features/settings/updateSettings/abstractions.js.map +1 -1
  58. package/admin/features/settings/updateSettings/feature.js +15 -14
  59. package/admin/features/settings/updateSettings/feature.js.map +1 -1
  60. package/admin/features/settings/updateSettings/index.js +1 -3
  61. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPage.d.ts +4 -0
  62. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPage.js +50 -0
  63. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPage.js.map +1 -0
  64. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPresenter.d.ts +2 -1
  65. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPresenter.js +133 -129
  66. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPresenter.js.map +1 -1
  67. package/admin/presentation/AiPowerUpsSettings/abstractions.d.ts +2 -1
  68. package/admin/presentation/AiPowerUpsSettings/abstractions.js +2 -1
  69. package/admin/presentation/AiPowerUpsSettings/abstractions.js.map +1 -1
  70. package/admin/presentation/AiPowerUpsSettings/feature.js +20 -16
  71. package/admin/presentation/AiPowerUpsSettings/feature.js.map +1 -1
  72. package/admin/presentation/AiPowerUpsSettings/index.d.ts +0 -3
  73. package/admin/presentation/AiPowerUpsSettings/index.js +0 -5
  74. package/admin/presentation/AiPowerUpsSettings/settingsGroup.js +2 -1
  75. package/admin/presentation/AiPowerUpsSettings/settingsGroup.js.map +1 -1
  76. package/admin/presentation/AiPowerUpsSettings/useAiPowerUpsSettings.js +19 -20
  77. package/admin/presentation/AiPowerUpsSettings/useAiPowerUpsSettings.js.map +1 -1
  78. package/admin/presentation/{PersonasSettings.d.ts → ProjectsSettings.d.ts} +2 -2
  79. package/admin/presentation/ProjectsSettings.js +56 -0
  80. package/admin/presentation/ProjectsSettings.js.map +1 -0
  81. package/admin/presentation/ProvidersSettings.js +39 -33
  82. package/admin/presentation/ProvidersSettings.js.map +1 -1
  83. package/admin/presentation/ReaderPersonasSettings.d.ts +11 -0
  84. package/admin/presentation/ReaderPersonasSettings.js +37 -0
  85. package/admin/presentation/ReaderPersonasSettings.js.map +1 -0
  86. package/admin/presentation/WbContentGeneration/Extension.js +15 -16
  87. package/admin/presentation/WbContentGeneration/Extension.js.map +1 -1
  88. package/admin/presentation/WbContentGeneration/GenerateContentButton.js +12 -17
  89. package/admin/presentation/WbContentGeneration/GenerateContentButton.js.map +1 -1
  90. package/admin/presentation/WbContentGeneration/GenerateContentDialog.js +94 -127
  91. package/admin/presentation/WbContentGeneration/GenerateContentDialog.js.map +1 -1
  92. package/admin/presentation/WbContentGeneration/GenerateContentPresenter.d.ts +19 -5
  93. package/admin/presentation/WbContentGeneration/GenerateContentPresenter.js +214 -77
  94. package/admin/presentation/WbContentGeneration/GenerateContentPresenter.js.map +1 -1
  95. package/admin/presentation/WbContentGeneration/abstractions.d.ts +4 -2
  96. package/admin/presentation/WbContentGeneration/abstractions.js +2 -1
  97. package/admin/presentation/WbContentGeneration/abstractions.js.map +1 -1
  98. package/admin/presentation/WbContentGeneration/decompressGzipBase64.js +10 -11
  99. package/admin/presentation/WbContentGeneration/decompressGzipBase64.js.map +1 -1
  100. package/admin/presentation/WbContentGeneration/feature.js +11 -10
  101. package/admin/presentation/WbContentGeneration/feature.js.map +1 -1
  102. package/admin/presentation/WriterPersonasSettings.d.ts +11 -0
  103. package/admin/presentation/WriterPersonasSettings.js +37 -0
  104. package/admin/presentation/WriterPersonasSettings.js.map +1 -0
  105. package/admin/routes.d.ts +4 -0
  106. package/admin/routes.js +10 -0
  107. package/admin/routes.js.map +1 -0
  108. package/api/Extension.js +28 -11
  109. package/api/Extension.js.map +1 -1
  110. package/api/constants.js +2 -1
  111. package/api/constants.js.map +1 -1
  112. package/api/features/AiImageEnrichment/AiImageEnrichmentAfterCreateHandler.d.ts +11 -0
  113. package/api/features/AiImageEnrichment/AiImageEnrichmentAfterCreateHandler.js +27 -0
  114. package/api/features/AiImageEnrichment/AiImageEnrichmentAfterCreateHandler.js.map +1 -0
  115. package/api/features/AiImageEnrichment/AiImageEnrichmentTask.d.ts +34 -0
  116. package/api/features/AiImageEnrichment/AiImageEnrichmentTask.js +140 -0
  117. package/api/features/AiImageEnrichment/AiImageEnrichmentTask.js.map +1 -0
  118. package/api/features/AiImageEnrichment/feature.d.ts +4 -0
  119. package/api/features/AiImageEnrichment/feature.js +13 -0
  120. package/api/features/AiImageEnrichment/feature.js.map +1 -0
  121. package/api/features/AiPromptContext/AiPromptContextBuilder.d.ts +12 -0
  122. package/api/features/AiPromptContext/AiPromptContextBuilder.js +103 -0
  123. package/api/features/AiPromptContext/AiPromptContextBuilder.js.map +1 -0
  124. package/api/features/AiPromptContext/ProjectFileAssembler.d.ts +22 -0
  125. package/api/features/AiPromptContext/ProjectFileAssembler.js +76 -0
  126. package/api/features/AiPromptContext/ProjectFileAssembler.js.map +1 -0
  127. package/api/features/AiPromptContext/ProjectFileCache.d.ts +16 -0
  128. package/api/features/AiPromptContext/ProjectFileCache.js +61 -0
  129. package/api/features/AiPromptContext/ProjectFileCache.js.map +1 -0
  130. package/api/features/AiPromptContext/ProjectSection.d.ts +4 -0
  131. package/api/features/AiPromptContext/ProjectSection.js +35 -0
  132. package/api/features/AiPromptContext/ProjectSection.js.map +1 -0
  133. package/api/features/AiPromptContext/ReadProjectFileTool.d.ts +3 -0
  134. package/api/features/AiPromptContext/ReadProjectFileTool.js +36 -0
  135. package/api/features/AiPromptContext/ReadProjectFileTool.js.map +1 -0
  136. package/api/features/AiPromptContext/ReaderPersonaSection.d.ts +4 -0
  137. package/api/features/AiPromptContext/ReaderPersonaSection.js +10 -0
  138. package/api/features/AiPromptContext/ReaderPersonaSection.js.map +1 -0
  139. package/api/features/AiPromptContext/WriterPersonaSection.d.ts +4 -0
  140. package/api/features/AiPromptContext/WriterPersonaSection.js +10 -0
  141. package/api/features/AiPromptContext/WriterPersonaSection.js.map +1 -0
  142. package/api/features/AiPromptContext/abstractions.d.ts +68 -0
  143. package/api/features/AiPromptContext/abstractions.js +7 -0
  144. package/api/features/AiPromptContext/abstractions.js.map +1 -0
  145. package/api/features/AiPromptContext/feature.d.ts +4 -0
  146. package/api/features/AiPromptContext/feature.js +15 -0
  147. package/api/features/AiPromptContext/feature.js.map +1 -0
  148. package/api/features/AiPromptContext/index.d.ts +1 -0
  149. package/api/features/AiPromptContext/index.js +1 -0
  150. package/api/features/ExtractFrontmatter/ExtractFrontmatterBeforeCreateHandler.d.ts +11 -0
  151. package/api/features/ExtractFrontmatter/ExtractFrontmatterBeforeCreateHandler.js +34 -0
  152. package/api/features/ExtractFrontmatter/ExtractFrontmatterBeforeCreateHandler.js.map +1 -0
  153. package/api/features/ExtractFrontmatter/feature.d.ts +4 -0
  154. package/api/features/ExtractFrontmatter/feature.js +11 -0
  155. package/api/features/ExtractFrontmatter/feature.js.map +1 -0
  156. package/api/features/GetSettings/GetSettingsRepository.d.ts +3 -2
  157. package/api/features/GetSettings/GetSettingsRepository.js +29 -26
  158. package/api/features/GetSettings/GetSettingsRepository.js.map +1 -1
  159. package/api/features/GetSettings/GetSettingsUseCase.js +13 -10
  160. package/api/features/GetSettings/GetSettingsUseCase.js.map +1 -1
  161. package/api/features/GetSettings/abstractions.js +3 -2
  162. package/api/features/GetSettings/abstractions.js.map +1 -1
  163. package/api/features/GetSettings/feature.js +7 -6
  164. package/api/features/GetSettings/feature.js.map +1 -1
  165. package/api/features/GetSettings/index.js +0 -2
  166. package/api/features/Projects/ProjectsHandler.d.ts +31 -0
  167. package/api/features/Projects/ProjectsHandler.js +103 -0
  168. package/api/features/Projects/ProjectsHandler.js.map +1 -0
  169. package/api/features/Projects/feature.d.ts +4 -0
  170. package/api/features/Projects/feature.js +11 -0
  171. package/api/features/Projects/feature.js.map +1 -0
  172. package/api/features/Projects/types.d.ts +50 -0
  173. package/api/features/Projects/types.js +0 -0
  174. package/api/features/Providers/ProvidersGraphQLMapper.js +33 -30
  175. package/api/features/Providers/ProvidersGraphQLMapper.js.map +1 -1
  176. package/api/features/Providers/ProvidersHandler.js +67 -64
  177. package/api/features/Providers/ProvidersHandler.js.map +1 -1
  178. package/api/features/Providers/feature.js +7 -6
  179. package/api/features/Providers/feature.js.map +1 -1
  180. package/api/features/Providers/index.js +0 -3
  181. package/api/features/Providers/types.js +0 -3
  182. package/api/features/ReaderPersonas/ReaderPersonasHandler.d.ts +20 -0
  183. package/api/features/ReaderPersonas/ReaderPersonasHandler.js +43 -0
  184. package/api/features/ReaderPersonas/ReaderPersonasHandler.js.map +1 -0
  185. package/api/features/ReaderPersonas/feature.d.ts +4 -0
  186. package/api/features/ReaderPersonas/feature.js +11 -0
  187. package/api/features/ReaderPersonas/feature.js.map +1 -0
  188. package/api/features/ReaderPersonas/index.d.ts +2 -0
  189. package/api/features/ReaderPersonas/index.js +1 -0
  190. package/api/features/ReaderPersonas/types.d.ts +24 -0
  191. package/api/features/ReaderPersonas/types.js +0 -0
  192. package/api/features/UpdateSettings/UpdateSettingsRepository.d.ts +3 -2
  193. package/api/features/UpdateSettings/UpdateSettingsRepository.js +59 -62
  194. package/api/features/UpdateSettings/UpdateSettingsRepository.js.map +1 -1
  195. package/api/features/UpdateSettings/UpdateSettingsUseCase.js +23 -21
  196. package/api/features/UpdateSettings/UpdateSettingsUseCase.js.map +1 -1
  197. package/api/features/UpdateSettings/abstractions.js +5 -7
  198. package/api/features/UpdateSettings/abstractions.js.map +1 -1
  199. package/api/features/UpdateSettings/errors.d.ts +10 -0
  200. package/api/features/UpdateSettings/errors.js +14 -0
  201. package/api/features/UpdateSettings/errors.js.map +1 -0
  202. package/api/features/UpdateSettings/events.js +16 -11
  203. package/api/features/UpdateSettings/events.js.map +1 -1
  204. package/api/features/UpdateSettings/feature.js +7 -6
  205. package/api/features/UpdateSettings/feature.js.map +1 -1
  206. package/api/features/UpdateSettings/index.js +1 -3
  207. package/api/features/WbGeneratePageContent/WbGeneratePageContentTask.d.ts +4 -0
  208. package/api/features/WbGeneratePageContent/WbGeneratePageContentTask.js +63 -60
  209. package/api/features/WbGeneratePageContent/WbGeneratePageContentTask.js.map +1 -1
  210. package/api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.d.ts +5 -3
  211. package/api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.js +92 -53
  212. package/api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.js.map +1 -1
  213. package/api/features/WbGeneratePageContent/abstractions.d.ts +15 -1
  214. package/api/features/WbGeneratePageContent/abstractions.js +2 -1
  215. package/api/features/WbGeneratePageContent/abstractions.js.map +1 -1
  216. package/api/features/WbGeneratePageContent/buildPrompt.d.ts +1 -1
  217. package/api/features/WbGeneratePageContent/buildPrompt.js +11 -10
  218. package/api/features/WbGeneratePageContent/buildPrompt.js.map +1 -1
  219. package/api/features/WbGeneratePageContent/feature.js +7 -6
  220. package/api/features/WbGeneratePageContent/feature.js.map +1 -1
  221. package/api/features/WbGeneratePageContent/index.js +0 -2
  222. package/api/features/WriterPersonas/WriterPersonasHandler.d.ts +20 -0
  223. package/api/features/WriterPersonas/WriterPersonasHandler.js +43 -0
  224. package/api/features/WriterPersonas/WriterPersonasHandler.js.map +1 -0
  225. package/api/features/WriterPersonas/feature.d.ts +4 -0
  226. package/api/features/WriterPersonas/feature.js +11 -0
  227. package/api/features/WriterPersonas/feature.js.map +1 -0
  228. package/api/features/WriterPersonas/index.d.ts +2 -0
  229. package/api/features/WriterPersonas/index.js +1 -0
  230. package/api/features/WriterPersonas/types.d.ts +24 -0
  231. package/api/features/WriterPersonas/types.js +0 -0
  232. package/api/features/shared/SettingsCache.d.ts +12 -0
  233. package/api/features/shared/SettingsCache.js +22 -0
  234. package/api/features/shared/SettingsCache.js.map +1 -0
  235. package/api/features/shared/abstractions.d.ts +13 -0
  236. package/api/features/shared/abstractions.js +4 -2
  237. package/api/features/shared/abstractions.js.map +1 -1
  238. package/api/features/shared/index.d.ts +3 -1
  239. package/api/features/shared/index.js +1 -3
  240. package/api/graphql/AiPowerUpsSettingsGraphQLMapper.js +35 -26
  241. package/api/graphql/AiPowerUpsSettingsGraphQLMapper.js.map +1 -1
  242. package/api/graphql/BaseGraphQLSchema.js +98 -81
  243. package/api/graphql/BaseGraphQLSchema.js.map +1 -1
  244. package/api/graphql/abstractions.js +2 -1
  245. package/api/graphql/abstractions.js.map +1 -1
  246. package/api/types.d.ts +1 -0
  247. package/api/types.js +1 -4
  248. package/index.js +0 -2
  249. package/package.json +26 -24
  250. package/admin/features/generatePageContent/index.js.map +0 -1
  251. package/admin/features/listModels/index.js.map +0 -1
  252. package/admin/features/settings/getSettings/index.js.map +0 -1
  253. package/admin/features/settings/shared/index.js.map +0 -1
  254. package/admin/features/settings/updateSettings/index.js.map +0 -1
  255. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsConfig.d.ts +0 -2
  256. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsConfig.js +0 -11
  257. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsConfig.js.map +0 -1
  258. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsDialog.d.ts +0 -5
  259. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsDialog.js +0 -58
  260. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsDialog.js.map +0 -1
  261. package/admin/presentation/AiPowerUpsSettings/index.js.map +0 -1
  262. package/admin/presentation/AiPowerUpsSettings/useAiPowerUpsSettingsDialog.d.ts +0 -1
  263. package/admin/presentation/AiPowerUpsSettings/useAiPowerUpsSettingsDialog.js +0 -12
  264. package/admin/presentation/AiPowerUpsSettings/useAiPowerUpsSettingsDialog.js.map +0 -1
  265. package/admin/presentation/PersonasSettings.js +0 -29
  266. package/admin/presentation/PersonasSettings.js.map +0 -1
  267. package/api/features/GetSettings/index.js.map +0 -1
  268. package/api/features/Providers/index.js.map +0 -1
  269. package/api/features/Providers/types.js.map +0 -1
  270. package/api/features/UpdateSettings/index.js.map +0 -1
  271. package/api/features/WbGeneratePageContent/index.js.map +0 -1
  272. package/api/features/shared/index.js.map +0 -1
  273. package/api/types.js.map +0 -1
  274. package/index.js.map +0 -1
@@ -1,10 +1,8 @@
1
1
  import { createAbstraction } from "@webiny/feature/api";
2
- export const UpdateSettingsRepository = createAbstraction("AiPowerUpsUpdateSettingsRepository");
3
- export const UpdateSettingsUseCase = createAbstraction("AiPowerUpsUpdateSettingsUseCase");
4
-
5
- // Domain events
6
-
7
- export const AiPowerUpsSettingsBeforeUpdateEventHandler = createAbstraction("AiPowerUpsSettingsBeforeUpdateEventHandler");
8
- export const AiPowerUpsSettingsAfterUpdateEventHandler = createAbstraction("AiPowerUpsSettingsAfterUpdateEventHandler");
2
+ const UpdateSettingsRepository = createAbstraction("AiPowerUpsUpdateSettingsRepository");
3
+ const UpdateSettingsUseCase = createAbstraction("AiPowerUpsUpdateSettingsUseCase");
4
+ const AiPowerUpsSettingsBeforeUpdateEventHandler = createAbstraction("AiPowerUpsSettingsBeforeUpdateEventHandler");
5
+ const AiPowerUpsSettingsAfterUpdateEventHandler = createAbstraction("AiPowerUpsSettingsAfterUpdateEventHandler");
6
+ export { AiPowerUpsSettingsAfterUpdateEventHandler, AiPowerUpsSettingsBeforeUpdateEventHandler, UpdateSettingsRepository, UpdateSettingsUseCase };
9
7
 
10
8
  //# sourceMappingURL=abstractions.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createAbstraction","UpdateSettingsRepository","UpdateSettingsUseCase","AiPowerUpsSettingsBeforeUpdateEventHandler","AiPowerUpsSettingsAfterUpdateEventHandler"],"sources":["abstractions.ts"],"sourcesContent":["import { createAbstraction, Result } from \"@webiny/feature/api\";\nimport type { DomainEvent, IEventHandler } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport type { IAiPowerUpsSettings } from \"~/api/types.js\";\n\nexport interface IUpdateSettingsRepository {\n execute(input: IAiPowerUpsSettings): Promise<Result<IAiPowerUpsSettings, Error>>;\n}\n\nexport const UpdateSettingsRepository = createAbstraction<IUpdateSettingsRepository>(\n \"AiPowerUpsUpdateSettingsRepository\"\n);\n\nexport namespace UpdateSettingsRepository {\n export type Interface = IUpdateSettingsRepository;\n export type Return = Promise<Result<IAiPowerUpsSettings, Error>>;\n}\n\nexport interface IUpdateSettingsUseCase {\n execute(input: IAiPowerUpsSettings): Promise<Result<IAiPowerUpsSettings, Error>>;\n}\n\nexport const UpdateSettingsUseCase = createAbstraction<IUpdateSettingsUseCase>(\n \"AiPowerUpsUpdateSettingsUseCase\"\n);\n\nexport namespace UpdateSettingsUseCase {\n export type Interface = IUpdateSettingsUseCase;\n export type Return = Promise<Result<IAiPowerUpsSettings, Error>>;\n export type Params = IAiPowerUpsSettings;\n}\n\n// Domain events\nexport interface AiPowerUpsSettingsBeforeUpdatePayload {\n input: IAiPowerUpsSettings;\n}\n\nexport interface AiPowerUpsSettingsAfterUpdatePayload {\n settings: IAiPowerUpsSettings;\n}\n\nexport const AiPowerUpsSettingsBeforeUpdateEventHandler = createAbstraction<\n IEventHandler<DomainEvent<AiPowerUpsSettingsBeforeUpdatePayload>>\n>(\"AiPowerUpsSettingsBeforeUpdateEventHandler\");\n\nexport namespace AiPowerUpsSettingsBeforeUpdateEventHandler {\n export type Interface = IEventHandler<DomainEvent<AiPowerUpsSettingsBeforeUpdatePayload>>;\n export type Event = DomainEvent<AiPowerUpsSettingsBeforeUpdatePayload>;\n}\n\nexport const AiPowerUpsSettingsAfterUpdateEventHandler = createAbstraction<\n IEventHandler<DomainEvent<AiPowerUpsSettingsAfterUpdatePayload>>\n>(\"AiPowerUpsSettingsAfterUpdateEventHandler\");\n\nexport namespace AiPowerUpsSettingsAfterUpdateEventHandler {\n export type Interface = IEventHandler<DomainEvent<AiPowerUpsSettingsAfterUpdatePayload>>;\n export type Event = DomainEvent<AiPowerUpsSettingsAfterUpdatePayload>;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAgB,qBAAqB;AAQ/D,OAAO,MAAMC,wBAAwB,GAAGD,iBAAiB,CACrD,oCACJ,CAAC;AAWD,OAAO,MAAME,qBAAqB,GAAGF,iBAAiB,CAClD,iCACJ,CAAC;;AAQD;;AASA,OAAO,MAAMG,0CAA0C,GAAGH,iBAAiB,CAEzE,4CAA4C,CAAC;AAO/C,OAAO,MAAMI,yCAAyC,GAAGJ,iBAAiB,CAExE,2CAA2C,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"api/features/UpdateSettings/abstractions.js","sources":["../../../../src/api/features/UpdateSettings/abstractions.ts"],"sourcesContent":["import { createAbstraction, Result } from \"@webiny/feature/api\";\nimport type { DomainEvent, IEventHandler } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport type { IAiPowerUpsSettings } from \"~/api/types.js\";\n\nexport interface IUpdateSettingsRepository {\n execute(input: IAiPowerUpsSettings): Promise<Result<IAiPowerUpsSettings, Error>>;\n}\n\nexport const UpdateSettingsRepository = createAbstraction<IUpdateSettingsRepository>(\n \"AiPowerUpsUpdateSettingsRepository\"\n);\n\nexport namespace UpdateSettingsRepository {\n export type Interface = IUpdateSettingsRepository;\n export type Return = Promise<Result<IAiPowerUpsSettings, Error>>;\n}\n\nexport interface IUpdateSettingsUseCase {\n execute(input: IAiPowerUpsSettings): Promise<Result<IAiPowerUpsSettings, Error>>;\n}\n\nexport const UpdateSettingsUseCase = createAbstraction<IUpdateSettingsUseCase>(\n \"AiPowerUpsUpdateSettingsUseCase\"\n);\n\nexport namespace UpdateSettingsUseCase {\n export type Interface = IUpdateSettingsUseCase;\n export type Return = Promise<Result<IAiPowerUpsSettings, Error>>;\n export type Params = IAiPowerUpsSettings;\n}\n\n// Domain events\nexport interface AiPowerUpsSettingsBeforeUpdatePayload {\n input: IAiPowerUpsSettings;\n}\n\nexport interface AiPowerUpsSettingsAfterUpdatePayload {\n settings: IAiPowerUpsSettings;\n}\n\nexport const AiPowerUpsSettingsBeforeUpdateEventHandler = createAbstraction<\n IEventHandler<DomainEvent<AiPowerUpsSettingsBeforeUpdatePayload>>\n>(\"AiPowerUpsSettingsBeforeUpdateEventHandler\");\n\nexport namespace AiPowerUpsSettingsBeforeUpdateEventHandler {\n export type Interface = IEventHandler<DomainEvent<AiPowerUpsSettingsBeforeUpdatePayload>>;\n export type Event = DomainEvent<AiPowerUpsSettingsBeforeUpdatePayload>;\n}\n\nexport const AiPowerUpsSettingsAfterUpdateEventHandler = createAbstraction<\n IEventHandler<DomainEvent<AiPowerUpsSettingsAfterUpdatePayload>>\n>(\"AiPowerUpsSettingsAfterUpdateEventHandler\");\n\nexport namespace AiPowerUpsSettingsAfterUpdateEventHandler {\n export type Interface = IEventHandler<DomainEvent<AiPowerUpsSettingsAfterUpdatePayload>>;\n export type Event = DomainEvent<AiPowerUpsSettingsAfterUpdatePayload>;\n}\n"],"names":["UpdateSettingsRepository","createAbstraction","UpdateSettingsUseCase","AiPowerUpsSettingsBeforeUpdateEventHandler","AiPowerUpsSettingsAfterUpdateEventHandler"],"mappings":";AAQO,MAAMA,2BAA2BC,kBACpC;AAYG,MAAMC,wBAAwBD,kBACjC;AAkBG,MAAME,6CAA6CF,kBAExD;AAOK,MAAMG,4CAA4CH,kBAEvD"}
@@ -0,0 +1,10 @@
1
+ import { BaseError } from "@webiny/feature/api";
2
+ import type { OutputErrors } from "@webiny/utils/createZodError.js";
3
+ interface ValidationParams {
4
+ invalidFields: OutputErrors;
5
+ }
6
+ export declare class SettingsValidationError extends BaseError<ValidationParams> {
7
+ readonly code: "AiPowerUps/Settings/ValidationError";
8
+ constructor(invalidFields: OutputErrors);
9
+ }
10
+ export {};
@@ -0,0 +1,14 @@
1
+ import { BaseError } from "@webiny/feature/api";
2
+ class SettingsValidationError extends BaseError {
3
+ constructor(invalidFields){
4
+ super({
5
+ message: "Validation failed.",
6
+ data: {
7
+ invalidFields
8
+ }
9
+ }), this.code = "AiPowerUps/Settings/ValidationError";
10
+ }
11
+ }
12
+ export { SettingsValidationError };
13
+
14
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api/features/UpdateSettings/errors.js","sources":["../../../../src/api/features/UpdateSettings/errors.ts"],"sourcesContent":["import { BaseError } from \"@webiny/feature/api\";\nimport type { OutputErrors } from \"@webiny/utils/createZodError.js\";\n\ninterface ValidationParams {\n invalidFields: OutputErrors;\n}\n\nexport class SettingsValidationError extends BaseError<ValidationParams> {\n override readonly code = \"AiPowerUps/Settings/ValidationError\" as const;\n\n constructor(invalidFields: OutputErrors) {\n super({\n message: \"Validation failed.\",\n data: { invalidFields }\n });\n }\n}\n"],"names":["SettingsValidationError","BaseError","invalidFields"],"mappings":";AAOO,MAAMA,gCAAgCC;IAGzC,YAAYC,aAA2B,CAAE;QACrC,KAAK,CAAC;YACF,SAAS;YACT,MAAM;gBAAEA;YAAc;QAC1B,SANc,IAAI,GAAG;IAOzB;AACJ"}
@@ -1,16 +1,21 @@
1
1
  import { DomainEvent } from "@webiny/api-core/features/eventPublisher/index.js";
2
- import { AiPowerUpsSettingsBeforeUpdateEventHandler, AiPowerUpsSettingsAfterUpdateEventHandler } from "./abstractions.js";
3
- export class AiPowerUpsSettingsBeforeUpdateEvent extends DomainEvent {
4
- eventType = "ai-PowerUps.settings.beforeUpdate";
5
- getHandlerAbstraction() {
6
- return AiPowerUpsSettingsBeforeUpdateEventHandler;
7
- }
2
+ import { AiPowerUpsSettingsAfterUpdateEventHandler, AiPowerUpsSettingsBeforeUpdateEventHandler } from "./abstractions.js";
3
+ class AiPowerUpsSettingsBeforeUpdateEvent extends DomainEvent {
4
+ getHandlerAbstraction() {
5
+ return AiPowerUpsSettingsBeforeUpdateEventHandler;
6
+ }
7
+ constructor(...args){
8
+ super(...args), this.eventType = "ai-PowerUps.settings.beforeUpdate";
9
+ }
8
10
  }
9
- export class AiPowerUpsSettingsAfterUpdateEvent extends DomainEvent {
10
- eventType = "ai-PowerUps.settings.afterUpdate";
11
- getHandlerAbstraction() {
12
- return AiPowerUpsSettingsAfterUpdateEventHandler;
13
- }
11
+ class AiPowerUpsSettingsAfterUpdateEvent extends DomainEvent {
12
+ getHandlerAbstraction() {
13
+ return AiPowerUpsSettingsAfterUpdateEventHandler;
14
+ }
15
+ constructor(...args){
16
+ super(...args), this.eventType = "ai-PowerUps.settings.afterUpdate";
17
+ }
14
18
  }
19
+ export { AiPowerUpsSettingsAfterUpdateEvent, AiPowerUpsSettingsBeforeUpdateEvent };
15
20
 
16
21
  //# sourceMappingURL=events.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["DomainEvent","AiPowerUpsSettingsBeforeUpdateEventHandler","AiPowerUpsSettingsAfterUpdateEventHandler","AiPowerUpsSettingsBeforeUpdateEvent","eventType","getHandlerAbstraction","AiPowerUpsSettingsAfterUpdateEvent"],"sources":["events.ts"],"sourcesContent":["import { DomainEvent } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport {\n AiPowerUpsSettingsBeforeUpdateEventHandler,\n AiPowerUpsSettingsAfterUpdateEventHandler\n} from \"./abstractions.js\";\nimport type {\n AiPowerUpsSettingsBeforeUpdatePayload,\n AiPowerUpsSettingsAfterUpdatePayload\n} from \"./abstractions.js\";\n\nexport class AiPowerUpsSettingsBeforeUpdateEvent extends DomainEvent<AiPowerUpsSettingsBeforeUpdatePayload> {\n eventType = \"ai-PowerUps.settings.beforeUpdate\" as const;\n\n getHandlerAbstraction() {\n return AiPowerUpsSettingsBeforeUpdateEventHandler;\n }\n}\n\nexport class AiPowerUpsSettingsAfterUpdateEvent extends DomainEvent<AiPowerUpsSettingsAfterUpdatePayload> {\n eventType = \"ai-PowerUps.settings.afterUpdate\" as const;\n\n getHandlerAbstraction() {\n return AiPowerUpsSettingsAfterUpdateEventHandler;\n }\n}\n"],"mappings":"AAAA,SAASA,WAAW,QAAQ,mDAAmD;AAC/E,SACIC,0CAA0C,EAC1CC,yCAAyC;AAO7C,OAAO,MAAMC,mCAAmC,SAASH,WAAW,CAAwC;EACxGI,SAAS,GAAG,mCAAmC;EAE/CC,qBAAqBA,CAAA,EAAG;IACpB,OAAOJ,0CAA0C;EACrD;AACJ;AAEA,OAAO,MAAMK,kCAAkC,SAASN,WAAW,CAAuC;EACtGI,SAAS,GAAG,kCAAkC;EAE9CC,qBAAqBA,CAAA,EAAG;IACpB,OAAOH,yCAAyC;EACpD;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"api/features/UpdateSettings/events.js","sources":["../../../../src/api/features/UpdateSettings/events.ts"],"sourcesContent":["import { DomainEvent } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport {\n AiPowerUpsSettingsBeforeUpdateEventHandler,\n AiPowerUpsSettingsAfterUpdateEventHandler\n} from \"./abstractions.js\";\nimport type {\n AiPowerUpsSettingsBeforeUpdatePayload,\n AiPowerUpsSettingsAfterUpdatePayload\n} from \"./abstractions.js\";\n\nexport class AiPowerUpsSettingsBeforeUpdateEvent extends DomainEvent<AiPowerUpsSettingsBeforeUpdatePayload> {\n eventType = \"ai-PowerUps.settings.beforeUpdate\" as const;\n\n getHandlerAbstraction() {\n return AiPowerUpsSettingsBeforeUpdateEventHandler;\n }\n}\n\nexport class AiPowerUpsSettingsAfterUpdateEvent extends DomainEvent<AiPowerUpsSettingsAfterUpdatePayload> {\n eventType = \"ai-PowerUps.settings.afterUpdate\" as const;\n\n getHandlerAbstraction() {\n return AiPowerUpsSettingsAfterUpdateEventHandler;\n }\n}\n"],"names":["AiPowerUpsSettingsBeforeUpdateEvent","DomainEvent","AiPowerUpsSettingsBeforeUpdateEventHandler","AiPowerUpsSettingsAfterUpdateEvent","AiPowerUpsSettingsAfterUpdateEventHandler"],"mappings":";;AAUO,MAAMA,4CAA4CC;IAGrD,wBAAwB;QACpB,OAAOC;IACX;;QALG,qBACH,SAAS,GAAG;;AAKhB;AAEO,MAAMC,2CAA2CF;IAGpD,wBAAwB;QACpB,OAAOG;IACX;;QALG,qBACH,SAAS,GAAG;;AAKhB"}
@@ -1,12 +1,13 @@
1
1
  import { createFeature } from "@webiny/feature/api";
2
2
  import { UpdateSettingsRepositoryImplementation } from "./UpdateSettingsRepository.js";
3
3
  import { UpdateSettingsUseCaseImplementation } from "./UpdateSettingsUseCase.js";
4
- export const UpdateSettingsFeature = createFeature({
5
- name: "AiPowerUpsUpdateSettings",
6
- register(container) {
7
- container.register(UpdateSettingsRepositoryImplementation).inSingletonScope();
8
- container.register(UpdateSettingsUseCaseImplementation);
9
- }
4
+ const UpdateSettingsFeature = createFeature({
5
+ name: "AiPowerUpsUpdateSettings",
6
+ register (container) {
7
+ container.register(UpdateSettingsRepositoryImplementation).inSingletonScope();
8
+ container.register(UpdateSettingsUseCaseImplementation);
9
+ }
10
10
  });
11
+ export { UpdateSettingsFeature };
11
12
 
12
13
  //# sourceMappingURL=feature.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createFeature","UpdateSettingsRepositoryImplementation","UpdateSettingsUseCaseImplementation","UpdateSettingsFeature","name","register","container","inSingletonScope"],"sources":["feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { UpdateSettingsRepositoryImplementation } from \"./UpdateSettingsRepository.js\";\nimport { UpdateSettingsUseCaseImplementation } from \"./UpdateSettingsUseCase.js\";\n\nexport const UpdateSettingsFeature = createFeature({\n name: \"AiPowerUpsUpdateSettings\",\n register(container) {\n container.register(UpdateSettingsRepositoryImplementation).inSingletonScope();\n container.register(UpdateSettingsUseCaseImplementation);\n }\n});\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,qBAAqB;AACnD,SAASC,sCAAsC;AAC/C,SAASC,mCAAmC;AAE5C,OAAO,MAAMC,qBAAqB,GAAGH,aAAa,CAAC;EAC/CI,IAAI,EAAE,0BAA0B;EAChCC,QAAQA,CAACC,SAAS,EAAE;IAChBA,SAAS,CAACD,QAAQ,CAACJ,sCAAsC,CAAC,CAACM,gBAAgB,CAAC,CAAC;IAC7ED,SAAS,CAACD,QAAQ,CAACH,mCAAmC,CAAC;EAC3D;AACJ,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"api/features/UpdateSettings/feature.js","sources":["../../../../src/api/features/UpdateSettings/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { UpdateSettingsRepositoryImplementation } from \"./UpdateSettingsRepository.js\";\nimport { UpdateSettingsUseCaseImplementation } from \"./UpdateSettingsUseCase.js\";\n\nexport const UpdateSettingsFeature = createFeature({\n name: \"AiPowerUpsUpdateSettings\",\n register(container) {\n container.register(UpdateSettingsRepositoryImplementation).inSingletonScope();\n container.register(UpdateSettingsUseCaseImplementation);\n }\n});\n"],"names":["UpdateSettingsFeature","createFeature","container","UpdateSettingsRepositoryImplementation","UpdateSettingsUseCaseImplementation"],"mappings":";;;AAIO,MAAMA,wBAAwBC,cAAc;IAC/C,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC,wCAAwC,gBAAgB;QAC3ED,UAAU,QAAQ,CAACE;IACvB;AACJ"}
@@ -1,3 +1 @@
1
- export { UpdateSettingsUseCase, AiPowerUpsSettingsBeforeUpdateEventHandler, AiPowerUpsSettingsAfterUpdateEventHandler } from "./abstractions.js";
2
-
3
- //# sourceMappingURL=index.js.map
1
+ export { AiPowerUpsSettingsAfterUpdateEventHandler, AiPowerUpsSettingsBeforeUpdateEventHandler, UpdateSettingsUseCase } from "./abstractions.js";
@@ -7,6 +7,10 @@ export interface IWbGeneratePageContentTaskInput {
7
7
  prompt: string;
8
8
  components: unknown;
9
9
  tools: unknown;
10
+ projectId?: string | null;
11
+ excludedFileIds?: string[] | null;
12
+ readerPersonaId?: string | null;
13
+ writerPersonaId?: string | null;
10
14
  }
11
15
  declare class WbGeneratePageContentTaskImpl implements TaskDefinition.Interface<IWbGeneratePageContentTaskInput> {
12
16
  private identityContext;
@@ -3,70 +3,73 @@ import { WebsocketService } from "@webiny/api-websockets/features/WebsocketServi
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
- export const WB_GENERATE_PAGE_CONTENT_TASK_ID = "aiPowerUpsGeneratePageContent";
6
+ const WB_GENERATE_PAGE_CONTENT_TASK_ID = "aiPowerUpsGeneratePageContent";
7
7
  class WbGeneratePageContentTaskImpl {
8
- id = WB_GENERATE_PAGE_CONTENT_TASK_ID;
9
- title = "AI Power-Ups - Generate Page Content";
10
- description = "Generates page content using AI based on a user prompt.";
11
- maxIterations = 1;
12
- isPrivate = true;
13
- databaseLogs = false;
14
- constructor(identityContext, generatePageContent, websocketService) {
15
- this.identityContext = identityContext;
16
- this.generatePageContent = generatePageContent;
17
- this.websocketService = websocketService;
18
- }
19
- async run({
20
- input,
21
- controller
22
- }) {
23
- if (controller.runtime.isAborted()) {
24
- return controller.response.aborted();
8
+ constructor(identityContext, generatePageContent, websocketService){
9
+ this.identityContext = identityContext;
10
+ this.generatePageContent = generatePageContent;
11
+ this.websocketService = websocketService;
12
+ this.id = WB_GENERATE_PAGE_CONTENT_TASK_ID;
13
+ this.title = "AI Power-Ups - Generate Page Content";
14
+ this.description = "Generates page content using AI based on a user prompt.";
15
+ this.maxIterations = 1;
16
+ this.isPrivate = true;
17
+ this.databaseLogs = false;
25
18
  }
26
- const result = await this.generatePageContent.execute({
27
- prompt: input.prompt,
28
- components: input.components,
29
- tools: input.tools
30
- });
31
- const identity = this.identityContext.getIdentity();
32
- if (result.isFail()) {
33
- await this.sendErrorToUser(identity.id, result.error.message);
34
- return controller.response.error({
35
- message: result.error.message
36
- });
19
+ async run({ input, controller }) {
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
+ const identity = this.identityContext.getIdentity();
31
+ if (result.isFail()) {
32
+ await this.sendErrorToUser(identity.id, result.error.message);
33
+ return controller.response.error({
34
+ message: result.error.message
35
+ });
36
+ }
37
+ const compressed = await compress(result.value.output);
38
+ const payload = compressed.toString("base64");
39
+ await this.sendContentToUser(identity.id, payload, result.value.telemetry);
40
+ return controller.response.done("Page content generated successfully.");
41
+ }
42
+ async sendContentToUser(identityId, payload, telemetry) {
43
+ await this.websocketService.send({
44
+ id: identityId
45
+ }, {
46
+ action: "aiPowerUps.generatePageContent.content",
47
+ data: {
48
+ compression: "gzip",
49
+ value: payload,
50
+ telemetry
51
+ }
52
+ });
53
+ }
54
+ async sendErrorToUser(identityId, message) {
55
+ await this.websocketService.send({
56
+ id: identityId
57
+ }, {
58
+ action: "aiPowerUps.generatePageContent.error",
59
+ data: {
60
+ message
61
+ }
62
+ });
37
63
  }
38
-
39
- // Send websocket message
40
- const compressed = await compress(result.value);
41
- const payload = compressed.toString("base64");
42
- await this.sendContentToUser(identity.id, payload);
43
- return controller.response.done("Page content generated successfully.");
44
- }
45
- async sendContentToUser(identityId, payload) {
46
- await this.websocketService.send({
47
- id: identityId
48
- }, {
49
- action: "aiPowerUps.generatePageContent.content",
50
- data: {
51
- compression: "gzip",
52
- value: payload
53
- }
54
- });
55
- }
56
- async sendErrorToUser(identityId, message) {
57
- await this.websocketService.send({
58
- id: identityId
59
- }, {
60
- action: "aiPowerUps.generatePageContent.error",
61
- data: {
62
- message
63
- }
64
- });
65
- }
66
64
  }
67
- export const WbGeneratePageContentTask = TaskDefinition.createImplementation({
68
- implementation: WbGeneratePageContentTaskImpl,
69
- dependencies: [IdentityContext, WbGeneratePageContentUseCase, WebsocketService]
65
+ const WbGeneratePageContentTask = TaskDefinition.createImplementation({
66
+ implementation: WbGeneratePageContentTaskImpl,
67
+ dependencies: [
68
+ IdentityContext,
69
+ WbGeneratePageContentUseCase,
70
+ WebsocketService
71
+ ]
70
72
  });
73
+ export { WB_GENERATE_PAGE_CONTENT_TASK_ID, WbGeneratePageContentTask };
71
74
 
72
75
  //# sourceMappingURL=WbGeneratePageContentTask.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["TaskDefinition","WebsocketService","compress","WbGeneratePageContentUseCase","IdentityContext","WB_GENERATE_PAGE_CONTENT_TASK_ID","WbGeneratePageContentTaskImpl","id","title","description","maxIterations","isPrivate","databaseLogs","constructor","identityContext","generatePageContent","websocketService","run","input","controller","runtime","isAborted","response","aborted","result","execute","prompt","components","tools","identity","getIdentity","isFail","sendErrorToUser","error","message","compressed","value","payload","toString","sendContentToUser","done","identityId","send","action","data","compression","WbGeneratePageContentTask","createImplementation","implementation","dependencies"],"sources":["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 { 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}\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 });\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 // Send websocket message\n const compressed = await compress(result.value);\n const payload = compressed.toString(\"base64\");\n\n await this.sendContentToUser(identity.id, payload);\n\n return controller.response.done(\"Page content generated successfully.\");\n }\n\n private async sendContentToUser(identityId: string, payload: string) {\n await this.websocketService.send(\n { id: identityId },\n {\n action: \"aiPowerUps.generatePageContent.content\",\n data: {\n compression: \"gzip\",\n value: payload\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"],"mappings":"AAAA,SAASA,cAAc,QAAQ,wDAAwD;AACvF,SAASC,gBAAgB,QAAQ,2DAA2D;AAC5F,SAASC,QAAQ,QAAQ,mDAAmD;AAC5E,SAASC,4BAA4B;AACrC,SAASC,eAAe,QAAQ,0CAA0C;AAE1E,OAAO,MAAMC,gCAAgC,GAAG,+BAA+B;AAQ/E,MAAMC,6BAA6B,CAAsE;EACrGC,EAAE,GAAGF,gCAAgC;EACrCG,KAAK,GAAG,sCAAsC;EAC9CC,WAAW,GAAG,yDAAyD;EACvEC,aAAa,GAAG,CAAC;EACjBC,SAAS,GAAG,IAAI;EAChBC,YAAY,GAAG,KAAK;EAEpBC,WAAWA,CACCC,eAA0C,EAC1CC,mBAA2D,EAC3DC,gBAA4C,EACtD;IAAA,KAHUF,eAA0C,GAA1CA,eAA0C;IAAA,KAC1CC,mBAA2D,GAA3DA,mBAA2D;IAAA,KAC3DC,gBAA4C,GAA5CA,gBAA4C;EACrD;EAEH,MAAMC,GAAGA,CAAC;IACNC,KAAK;IACLC;EACuD,CAAC,EAE1D;IACE,IAAIA,UAAU,CAACC,OAAO,CAACC,SAAS,CAAC,CAAC,EAAE;MAChC,OAAOF,UAAU,CAACG,QAAQ,CAACC,OAAO,CAAC,CAAC;IACxC;IAEA,MAAMC,MAAM,GAAG,MAAM,IAAI,CAACT,mBAAmB,CAACU,OAAO,CAAC;MAClDC,MAAM,EAAER,KAAK,CAACQ,MAAM;MACpBC,UAAU,EAAET,KAAK,CAACS,UAAU;MAC5BC,KAAK,EAAEV,KAAK,CAACU;IACjB,CAAC,CAAC;IAEF,MAAMC,QAAQ,GAAG,IAAI,CAACf,eAAe,CAACgB,WAAW,CAAC,CAAC;IAEnD,IAAIN,MAAM,CAACO,MAAM,CAAC,CAAC,EAAE;MACjB,MAAM,IAAI,CAACC,eAAe,CAACH,QAAQ,CAACtB,EAAE,EAAEiB,MAAM,CAACS,KAAK,CAACC,OAAO,CAAC;MAE7D,OAAOf,UAAU,CAACG,QAAQ,CAACW,KAAK,CAAC;QAC7BC,OAAO,EAAEV,MAAM,CAACS,KAAK,CAACC;MAC1B,CAAC,CAAC;IACN;;IAEA;IACA,MAAMC,UAAU,GAAG,MAAMjC,QAAQ,CAACsB,MAAM,CAACY,KAAK,CAAC;IAC/C,MAAMC,OAAO,GAAGF,UAAU,CAACG,QAAQ,CAAC,QAAQ,CAAC;IAE7C,MAAM,IAAI,CAACC,iBAAiB,CAACV,QAAQ,CAACtB,EAAE,EAAE8B,OAAO,CAAC;IAElD,OAAOlB,UAAU,CAACG,QAAQ,CAACkB,IAAI,CAAC,sCAAsC,CAAC;EAC3E;EAEA,MAAcD,iBAAiBA,CAACE,UAAkB,EAAEJ,OAAe,EAAE;IACjE,MAAM,IAAI,CAACrB,gBAAgB,CAAC0B,IAAI,CAC5B;MAAEnC,EAAE,EAAEkC;IAAW,CAAC,EAClB;MACIE,MAAM,EAAE,wCAAwC;MAChDC,IAAI,EAAE;QACFC,WAAW,EAAE,MAAM;QACnBT,KAAK,EAAEC;MACX;IACJ,CACJ,CAAC;EACL;EAEA,MAAcL,eAAeA,CAACS,UAAkB,EAAEP,OAAe,EAAE;IAC/D,MAAM,IAAI,CAAClB,gBAAgB,CAAC0B,IAAI,CAC5B;MAAEnC,EAAE,EAAEkC;IAAW,CAAC,EAClB;MACIE,MAAM,EAAE,sCAAsC;MAC9CC,IAAI,EAAE;QACFV;MACJ;IACJ,CACJ,CAAC;EACL;AACJ;AAEA,OAAO,MAAMY,yBAAyB,GAAG9C,cAAc,CAAC+C,oBAAoB,CAAC;EACzEC,cAAc,EAAE1C,6BAA6B;EAC7C2C,YAAY,EAAE,CAAC7C,eAAe,EAAED,4BAA4B,EAAEF,gBAAgB;AAClF,CAAC,CAAC","ignoreList":[]}
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"}
@@ -3,15 +3,17 @@ import { Ai } from "@webiny/api-core/features/ai/index.js";
3
3
  import { AiSdkTools } from "@webiny/api-core/features/ai/index.js";
4
4
  import { Encryption } from "@webiny/api-core/features/encryption/index.js";
5
5
  import { GetSettingsUseCase } from "../../../api/features/GetSettings/index.js";
6
+ import { AiPromptContextBuilder } from "../../../api/features/AiPromptContext/index.js";
6
7
  import { WbGeneratePageContentUseCase } from "./abstractions.js";
7
- import type { WbGeneratePageContentParams } from "./abstractions.js";
8
+ import type { WbGeneratePageContentParams, GeneratePageContentResult } from "./abstractions.js";
8
9
  declare class WbGeneratePageContentUseCaseImpl implements WbGeneratePageContentUseCase.Interface {
10
+ private promptContextBuilder;
9
11
  private getSettings;
10
12
  private ai;
11
13
  private aiSdkTools;
12
14
  private encryption;
13
- constructor(getSettings: GetSettingsUseCase.Interface, ai: Ai.Interface, aiSdkTools: AiSdkTools.Interface, encryption: Encryption.Interface);
14
- execute(params: WbGeneratePageContentParams): Promise<Result<string, Error>>;
15
+ constructor(promptContextBuilder: AiPromptContextBuilder.Interface, getSettings: GetSettingsUseCase.Interface, ai: Ai.Interface, aiSdkTools: AiSdkTools.Interface, encryption: Encryption.Interface);
16
+ execute(params: WbGeneratePageContentParams): Promise<Result<GeneratePageContentResult, Error>>;
15
17
  }
16
18
  export declare const WbGeneratePageContentUseCaseImplementation: typeof WbGeneratePageContentUseCaseImpl & {
17
19
  __abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IWbGeneratePageContentUseCase>;
@@ -1,67 +1,106 @@
1
1
  import { stepCountIs } from "ai";
2
2
  import { Result } from "@webiny/feature/api";
3
- import { Ai } from "@webiny/api-core/features/ai/index.js";
4
- import { AiSdkTools } from "@webiny/api-core/features/ai/index.js";
3
+ import { Ai, AiSdkTools } from "@webiny/api-core/features/ai/index.js";
5
4
  import { Encryption } from "@webiny/api-core/features/encryption/index.js";
6
5
  import { GetSettingsUseCase } from "../GetSettings/index.js";
6
+ import { AiPromptContextBuilder } from "../AiPromptContext/index.js";
7
+ import { createReadProjectFileTool } from "../AiPromptContext/ReadProjectFileTool.js";
7
8
  import { WbGeneratePageContentUseCase } from "./abstractions.js";
8
- import { buildSystemPrompt } from "./buildPrompt.js";
9
+ import { buildDomainPrompt } from "./buildPrompt.js";
9
10
  function stripCodeFence(text) {
10
- return text.replace(/^```(?:json)?\s*\n?/, "").replace(/\n?```\s*$/, "").trim();
11
+ return text.replace(/^```(?:json)?\s*\n?/, "").replace(/\n?```\s*$/, "").trim();
11
12
  }
12
13
  class WbGeneratePageContentUseCaseImpl {
13
- constructor(getSettings, ai, aiSdkTools, encryption) {
14
- this.getSettings = getSettings;
15
- this.ai = ai;
16
- this.aiSdkTools = aiSdkTools;
17
- this.encryption = encryption;
18
- }
19
- async execute(params) {
20
- const settingsResult = await this.getSettings.execute();
21
- if (settingsResult.isFail()) {
22
- return Result.fail(new Error("Failed to load AI PowerUps settings."));
14
+ constructor(promptContextBuilder, getSettings, ai, aiSdkTools, encryption){
15
+ this.promptContextBuilder = promptContextBuilder;
16
+ this.getSettings = getSettings;
17
+ this.ai = ai;
18
+ this.aiSdkTools = aiSdkTools;
19
+ this.encryption = encryption;
23
20
  }
24
- const settings = settingsResult.value;
25
- const firstProvider = settings.providers.presets[0];
26
- if (!firstProvider) {
27
- return Result.fail(new Error("No AI provider configured. Add a provider in AI Power Ups settings."));
21
+ async execute(params) {
22
+ const settingsResult = await this.getSettings.execute();
23
+ if (settingsResult.isFail()) return Result.fail(new Error("Failed to load AI PowerUps settings."));
24
+ const settings = settingsResult.value;
25
+ const firstProvider = settings.providers.presets[0];
26
+ if (!firstProvider) return Result.fail(new Error("No AI provider configured. Add a provider in AI Power Ups settings."));
27
+ const apiKey = this.encryption.decrypt(firstProvider.apiKeyEncrypted);
28
+ const sdkTools = this.aiSdkTools.getToolSet();
29
+ const context = await this.promptContextBuilder.execute({
30
+ projectId: params.projectId,
31
+ readerPersonaId: params.readerPersonaId,
32
+ writerPersonaId: params.writerPersonaId,
33
+ excludedFileIds: params.excludedFileIds
34
+ });
35
+ if (context.allProjectFiles.length > 0) {
36
+ const projectFileTool = createReadProjectFileTool(context.allProjectFiles, context.excludedFileIds);
37
+ Object.assign(sdkTools, projectFileTool);
38
+ }
39
+ const systemText = buildDomainPrompt(params.components, params.tools) + context.toString();
40
+ const system = {
41
+ role: "system",
42
+ content: systemText,
43
+ providerOptions: {
44
+ anthropic: {
45
+ cacheControl: {
46
+ type: "ephemeral"
47
+ }
48
+ }
49
+ }
50
+ };
51
+ try {
52
+ const aiResult = await this.ai.generateText({
53
+ model: firstProvider.model,
54
+ connection: {
55
+ sdkName: firstProvider.model.split("/")[0],
56
+ apiKey
57
+ },
58
+ system,
59
+ toolChoice: "auto",
60
+ prompt: params.prompt,
61
+ ...Object.keys(sdkTools).length > 0 ? {
62
+ tools: sdkTools,
63
+ stopWhen: stepCountIs(20)
64
+ } : {}
65
+ });
66
+ const text = aiResult.text || (aiResult.steps.filter((step)=>step.text.length > 0).pop()?.text ?? "");
67
+ const output = stripCodeFence(text);
68
+ const filesRead = new Set();
69
+ let toolCallsMade = 0;
70
+ for (const step of aiResult.steps)for (const call of step.toolCalls){
71
+ toolCallsMade++;
72
+ if ("read_project_file" === call.toolName) {
73
+ const input = call.input;
74
+ if (input.fileId) filesRead.add(input.fileId);
75
+ }
76
+ }
77
+ const telemetry = {
78
+ filesRead: [
79
+ ...filesRead
80
+ ],
81
+ cacheHit: context.cacheHit,
82
+ toolCallsMade,
83
+ totalSteps: aiResult.steps.length
84
+ };
85
+ return Result.ok({
86
+ output,
87
+ telemetry
88
+ });
89
+ } catch (error) {
90
+ return Result.fail(new Error(`AI generation failed: ${error instanceof Error ? error.message : String(error)}`));
91
+ }
28
92
  }
29
-
30
- // Decrypt at point of use.
31
- const apiKey = this.encryption.decrypt(firstProvider.apiKeyEncrypted);
32
-
33
- // TODO: configure this in `ai` as default behavior.
34
- const sdkTools = this.aiSdkTools.getToolSet();
35
- const system = buildSystemPrompt(params.components, params.tools);
36
- try {
37
- const aiResult = await this.ai.generateText({
38
- model: firstProvider.model,
39
- connection: {
40
- sdkName: firstProvider.model.split("/")[0],
41
- apiKey
42
- },
43
- system,
44
- toolChoice: "auto",
45
- prompt: params.prompt,
46
- ...(Object.keys(sdkTools).length > 0 ? {
47
- tools: sdkTools,
48
- stopWhen: stepCountIs(10)
49
- } : {})
50
- });
51
-
52
- // result.text might be empty if the last step was a tool call.
53
- // Find the last step that has text content:
54
- const text = aiResult.text || (aiResult.steps.filter(step => step.text.length > 0).pop()?.text ?? "");
55
- const output = stripCodeFence(text);
56
- return Result.ok(output);
57
- } catch (error) {
58
- return Result.fail(new Error(`AI generation failed: ${error instanceof Error ? error.message : String(error)}`));
59
- }
60
- }
61
93
  }
62
- export const WbGeneratePageContentUseCaseImplementation = WbGeneratePageContentUseCase.createImplementation({
63
- implementation: WbGeneratePageContentUseCaseImpl,
64
- dependencies: [GetSettingsUseCase, Ai, AiSdkTools, Encryption]
94
+ const WbGeneratePageContentUseCaseImplementation = WbGeneratePageContentUseCase.createImplementation({
95
+ implementation: WbGeneratePageContentUseCaseImpl,
96
+ dependencies: [
97
+ AiPromptContextBuilder,
98
+ GetSettingsUseCase,
99
+ Ai,
100
+ AiSdkTools,
101
+ Encryption
102
+ ]
65
103
  });
104
+ export { WbGeneratePageContentUseCaseImplementation };
66
105
 
67
106
  //# sourceMappingURL=WbGeneratePageContentUseCase.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["stepCountIs","Result","Ai","AiSdkTools","Encryption","GetSettingsUseCase","WbGeneratePageContentUseCase","buildSystemPrompt","stripCodeFence","text","replace","trim","WbGeneratePageContentUseCaseImpl","constructor","getSettings","ai","aiSdkTools","encryption","execute","params","settingsResult","isFail","fail","Error","settings","value","firstProvider","providers","presets","apiKey","decrypt","apiKeyEncrypted","sdkTools","getToolSet","system","components","tools","aiResult","generateText","model","connection","sdkName","split","toolChoice","prompt","Object","keys","length","stopWhen","steps","filter","step","pop","output","ok","error","message","String","WbGeneratePageContentUseCaseImplementation","createImplementation","implementation","dependencies"],"sources":["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 { GetSettingsUseCase } from \"~/api/features/GetSettings/index.js\";\nimport { WbGeneratePageContentUseCase } from \"./abstractions.js\";\nimport type { WbGeneratePageContentParams } from \"./abstractions.js\";\nimport { buildSystemPrompt } from \"./buildPrompt.js\";\n\nfunction stripCodeFence(text: string): string {\n return text\n .replace(/^```(?:json)?\\s*\\n?/, \"\")\n .replace(/\\n?```\\s*$/, \"\")\n .trim();\n}\n\nclass WbGeneratePageContentUseCaseImpl implements WbGeneratePageContentUseCase.Interface {\n constructor(\n private getSettings: GetSettingsUseCase.Interface,\n private ai: Ai.Interface,\n private aiSdkTools: AiSdkTools.Interface,\n private encryption: Encryption.Interface\n ) {}\n\n async execute(params: WbGeneratePageContentParams): Promise<Result<string, 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 // Decrypt at point of use.\n const apiKey = this.encryption.decrypt(firstProvider.apiKeyEncrypted);\n\n // TODO: configure this in `ai` as default behavior.\n const sdkTools = this.aiSdkTools.getToolSet();\n\n const system = buildSystemPrompt(params.components, params.tools);\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(10) }\n : {})\n });\n\n // result.text might be empty if the last step was a tool call.\n // Find the last step that has text content:\n const text =\n aiResult.text ||\n (aiResult.steps.filter(step => step.text.length > 0).pop()?.text ?? \"\");\n\n const output = stripCodeFence(text);\n\n return Result.ok(output);\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: [GetSettingsUseCase, Ai, AiSdkTools, Encryption]\n });\n"],"mappings":"AAAA,SAASA,WAAW,QAAQ,IAAI;AAChC,SAASC,MAAM,QAAQ,qBAAqB;AAC5C,SAASC,EAAE,QAAQ,uCAAuC;AAC1D,SAASC,UAAU,QAAQ,uCAAuC;AAClE,SAASC,UAAU,QAAQ,+CAA+C;AAC1E,SAASC,kBAAkB;AAC3B,SAASC,4BAA4B;AAErC,SAASC,iBAAiB;AAE1B,SAASC,cAAcA,CAACC,IAAY,EAAU;EAC1C,OAAOA,IAAI,CACNC,OAAO,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAClCA,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CACzBC,IAAI,CAAC,CAAC;AACf;AAEA,MAAMC,gCAAgC,CAAmD;EACrFC,WAAWA,CACCC,WAAyC,EACzCC,EAAgB,EAChBC,UAAgC,EAChCC,UAAgC,EAC1C;IAAA,KAJUH,WAAyC,GAAzCA,WAAyC;IAAA,KACzCC,EAAgB,GAAhBA,EAAgB;IAAA,KAChBC,UAAgC,GAAhCA,UAAgC;IAAA,KAChCC,UAAgC,GAAhCA,UAAgC;EACzC;EAEH,MAAMC,OAAOA,CAACC,MAAmC,EAAkC;IAC/E,MAAMC,cAAc,GAAG,MAAM,IAAI,CAACN,WAAW,CAACI,OAAO,CAAC,CAAC;IACvD,IAAIE,cAAc,CAACC,MAAM,CAAC,CAAC,EAAE;MACzB,OAAOpB,MAAM,CAACqB,IAAI,CAAC,IAAIC,KAAK,CAAC,sCAAsC,CAAC,CAAC;IACzE;IAEA,MAAMC,QAAQ,GAAGJ,cAAc,CAACK,KAAK;IACrC,MAAMC,aAAa,GAAGF,QAAQ,CAACG,SAAS,CAACC,OAAO,CAAC,CAAC,CAAC;IAEnD,IAAI,CAACF,aAAa,EAAE;MAChB,OAAOzB,MAAM,CAACqB,IAAI,CACd,IAAIC,KAAK,CAAC,qEAAqE,CACnF,CAAC;IACL;;IAEA;IACA,MAAMM,MAAM,GAAG,IAAI,CAACZ,UAAU,CAACa,OAAO,CAACJ,aAAa,CAACK,eAAe,CAAC;;IAErE;IACA,MAAMC,QAAQ,GAAG,IAAI,CAAChB,UAAU,CAACiB,UAAU,CAAC,CAAC;IAE7C,MAAMC,MAAM,GAAG3B,iBAAiB,CAACY,MAAM,CAACgB,UAAU,EAAEhB,MAAM,CAACiB,KAAK,CAAC;IAEjE,IAAI;MACA,MAAMC,QAAQ,GAAG,MAAM,IAAI,CAACtB,EAAE,CAACuB,YAAY,CAAC;QACxCC,KAAK,EAAEb,aAAa,CAACa,KAAK;QAC1BC,UAAU,EAAE;UACRC,OAAO,EAAEf,aAAa,CAACa,KAAK,CAACG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;UAC1Cb;QACJ,CAAC;QACDK,MAAM;QACNS,UAAU,EAAE,MAAM;QAClBC,MAAM,EAAEzB,MAAM,CAACyB,MAAM;QACrB,IAAIC,MAAM,CAACC,IAAI,CAACd,QAAQ,CAAC,CAACe,MAAM,GAAG,CAAC,GAC9B;UAAEX,KAAK,EAAEJ,QAAQ;UAAEgB,QAAQ,EAAEhD,WAAW,CAAC,EAAE;QAAE,CAAC,GAC9C,CAAC,CAAC;MACZ,CAAC,CAAC;;MAEF;MACA;MACA,MAAMS,IAAI,GACN4B,QAAQ,CAAC5B,IAAI,KACZ4B,QAAQ,CAACY,KAAK,CAACC,MAAM,CAACC,IAAI,IAAIA,IAAI,CAAC1C,IAAI,CAACsC,MAAM,GAAG,CAAC,CAAC,CAACK,GAAG,CAAC,CAAC,EAAE3C,IAAI,IAAI,EAAE,CAAC;MAE3E,MAAM4C,MAAM,GAAG7C,cAAc,CAACC,IAAI,CAAC;MAEnC,OAAOR,MAAM,CAACqD,EAAE,CAACD,MAAM,CAAC;IAC5B,CAAC,CAAC,OAAOE,KAAK,EAAE;MACZ,OAAOtD,MAAM,CAACqB,IAAI,CACd,IAAIC,KAAK,CACL,yBAAyBgC,KAAK,YAAYhC,KAAK,GAAGgC,KAAK,CAACC,OAAO,GAAGC,MAAM,CAACF,KAAK,CAAC,EACnF,CACJ,CAAC;IACL;EACJ;AACJ;AAEA,OAAO,MAAMG,0CAA0C,GACnDpD,4BAA4B,CAACqD,oBAAoB,CAAC;EAC9CC,cAAc,EAAEhD,gCAAgC;EAChDiD,YAAY,EAAE,CAACxD,kBAAkB,EAAEH,EAAE,EAAEC,UAAU,EAAEC,UAAU;AACjE,CAAC,CAAC","ignoreList":[]}
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 { 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\";\n\nfunction stripCodeFence(text: string): string {\n return text\n .replace(/^```(?:json)?\\s*\\n?/, \"\")\n .replace(/\\n?```\\s*$/, \"\")\n .trim();\n}\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 ) {}\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 = 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 const systemText = buildDomainPrompt(params.components, params.tools) + 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 output = stripCodeFence(text);\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 };\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: [AiPromptContextBuilder, GetSettingsUseCase, Ai, AiSdkTools, Encryption]\n });\n"],"names":["stripCodeFence","text","WbGeneratePageContentUseCaseImpl","promptContextBuilder","getSettings","ai","aiSdkTools","encryption","params","settingsResult","Result","Error","settings","firstProvider","apiKey","sdkTools","context","projectFileTool","createReadProjectFileTool","Object","systemText","buildDomainPrompt","system","aiResult","stepCountIs","step","output","filesRead","Set","toolCallsMade","call","input","telemetry","error","String","WbGeneratePageContentUseCaseImplementation","WbGeneratePageContentUseCase","AiPromptContextBuilder","GetSettingsUseCase","Ai","AiSdkTools","Encryption"],"mappings":"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"}
@@ -3,9 +3,23 @@ export interface WbGeneratePageContentParams {
3
3
  prompt: string;
4
4
  components: unknown;
5
5
  tools: unknown;
6
+ projectId?: string | null;
7
+ excludedFileIds?: string[] | null;
8
+ readerPersonaId?: string | null;
9
+ writerPersonaId?: string | null;
10
+ }
11
+ export interface GenerationTelemetry {
12
+ filesRead: string[];
13
+ cacheHit: boolean;
14
+ toolCallsMade: number;
15
+ totalSteps: number;
16
+ }
17
+ export interface GeneratePageContentResult {
18
+ output: string;
19
+ telemetry: GenerationTelemetry;
6
20
  }
7
21
  export interface IWbGeneratePageContentUseCase {
8
- execute(params: WbGeneratePageContentParams): Promise<Result<string, Error>>;
22
+ execute(params: WbGeneratePageContentParams): Promise<Result<GeneratePageContentResult, Error>>;
9
23
  }
10
24
  export declare const WbGeneratePageContentUseCase: import("@webiny/di").Abstraction<IWbGeneratePageContentUseCase>;
11
25
  export declare namespace WbGeneratePageContentUseCase {
@@ -1,4 +1,5 @@
1
1
  import { createAbstraction } from "@webiny/feature/api";
2
- export const WbGeneratePageContentUseCase = createAbstraction("AiPowerUpsWbGeneratePageContentUseCase");
2
+ const WbGeneratePageContentUseCase = createAbstraction("AiPowerUpsWbGeneratePageContentUseCase");
3
+ export { WbGeneratePageContentUseCase };
3
4
 
4
5
  //# sourceMappingURL=abstractions.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createAbstraction","WbGeneratePageContentUseCase"],"sources":["abstractions.ts"],"sourcesContent":["import { createAbstraction, Result } from \"@webiny/feature/api\";\n\nexport interface WbGeneratePageContentParams {\n prompt: string;\n components: unknown;\n tools: unknown;\n}\n\nexport interface IWbGeneratePageContentUseCase {\n execute(params: WbGeneratePageContentParams): Promise<Result<string, 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"],"mappings":"AAAA,SAASA,iBAAiB,QAAgB,qBAAqB;AAY/D,OAAO,MAAMC,4BAA4B,GAAGD,iBAAiB,CACzD,wCACJ,CAAC","ignoreList":[]}
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}\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":";AA4BO,MAAMA,+BAA+BC,kBACxC"}