@webiny/ai-powerups 0.0.0-unstable.0d717d18dd

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 (466) hide show
  1. package/AiPowerups.d.ts +2 -0
  2. package/AiPowerups.js +11 -0
  3. package/AiPowerups.js.map +1 -0
  4. package/LICENSE +36 -0
  5. package/README.md +11 -0
  6. package/admin/Extension.d.ts +2 -0
  7. package/admin/Extension.js +45 -0
  8. package/admin/Extension.js.map +1 -0
  9. package/admin/domain/errors.d.ts +12 -0
  10. package/admin/domain/errors.js +21 -0
  11. package/admin/domain/errors.js.map +1 -0
  12. package/admin/features/compareEntryRevisions/CompareEntryRevisionsGateway.d.ts +12 -0
  13. package/admin/features/compareEntryRevisions/CompareEntryRevisionsGateway.js +46 -0
  14. package/admin/features/compareEntryRevisions/CompareEntryRevisionsGateway.js.map +1 -0
  15. package/admin/features/compareEntryRevisions/CompareEntryRevisionsRepository.d.ts +11 -0
  16. package/admin/features/compareEntryRevisions/CompareEntryRevisionsRepository.js +18 -0
  17. package/admin/features/compareEntryRevisions/CompareEntryRevisionsRepository.js.map +1 -0
  18. package/admin/features/compareEntryRevisions/CompareEntryRevisionsUseCase.d.ts +11 -0
  19. package/admin/features/compareEntryRevisions/CompareEntryRevisionsUseCase.js +18 -0
  20. package/admin/features/compareEntryRevisions/CompareEntryRevisionsUseCase.js.map +1 -0
  21. package/admin/features/compareEntryRevisions/abstractions.d.ts +32 -0
  22. package/admin/features/compareEntryRevisions/abstractions.js +7 -0
  23. package/admin/features/compareEntryRevisions/abstractions.js.map +1 -0
  24. package/admin/features/compareEntryRevisions/feature.d.ts +1 -0
  25. package/admin/features/compareEntryRevisions/feature.js +15 -0
  26. package/admin/features/compareEntryRevisions/feature.js.map +1 -0
  27. package/admin/features/compareEntryRevisions/index.d.ts +2 -0
  28. package/admin/features/compareEntryRevisions/index.js +2 -0
  29. package/admin/features/feature.d.ts +1 -0
  30. package/admin/features/feature.js +24 -0
  31. package/admin/features/feature.js.map +1 -0
  32. package/admin/features/generateEntryContent/GenerateEntryContentGateway.d.ts +12 -0
  33. package/admin/features/generateEntryContent/GenerateEntryContentGateway.js +45 -0
  34. package/admin/features/generateEntryContent/GenerateEntryContentGateway.js.map +1 -0
  35. package/admin/features/generateEntryContent/GenerateEntryContentUseCase.d.ts +11 -0
  36. package/admin/features/generateEntryContent/GenerateEntryContentUseCase.js +18 -0
  37. package/admin/features/generateEntryContent/GenerateEntryContentUseCase.js.map +1 -0
  38. package/admin/features/generateEntryContent/abstractions.d.ts +24 -0
  39. package/admin/features/generateEntryContent/abstractions.js +6 -0
  40. package/admin/features/generateEntryContent/abstractions.js.map +1 -0
  41. package/admin/features/generateEntryContent/feature.d.ts +1 -0
  42. package/admin/features/generateEntryContent/feature.js +13 -0
  43. package/admin/features/generateEntryContent/feature.js.map +1 -0
  44. package/admin/features/generateEntryContent/index.d.ts +3 -0
  45. package/admin/features/generateEntryContent/index.js +2 -0
  46. package/admin/features/generatePageContent/GeneratePageContentGateway.d.ts +12 -0
  47. package/admin/features/generatePageContent/GeneratePageContentGateway.js +47 -0
  48. package/admin/features/generatePageContent/GeneratePageContentGateway.js.map +1 -0
  49. package/admin/features/generatePageContent/GeneratePageContentUseCase.d.ts +11 -0
  50. package/admin/features/generatePageContent/GeneratePageContentUseCase.js +18 -0
  51. package/admin/features/generatePageContent/GeneratePageContentUseCase.js.map +1 -0
  52. package/admin/features/generatePageContent/abstractions.d.ts +25 -0
  53. package/admin/features/generatePageContent/abstractions.js +6 -0
  54. package/admin/features/generatePageContent/abstractions.js.map +1 -0
  55. package/admin/features/generatePageContent/feature.d.ts +1 -0
  56. package/admin/features/generatePageContent/feature.js +13 -0
  57. package/admin/features/generatePageContent/feature.js.map +1 -0
  58. package/admin/features/generatePageContent/index.d.ts +3 -0
  59. package/admin/features/generatePageContent/index.js +2 -0
  60. package/admin/features/listModels/ListModelsGateway.d.ts +12 -0
  61. package/admin/features/listModels/ListModelsGateway.js +34 -0
  62. package/admin/features/listModels/ListModelsGateway.js.map +1 -0
  63. package/admin/features/listModels/ListModelsRepository.d.ts +13 -0
  64. package/admin/features/listModels/ListModelsRepository.js +27 -0
  65. package/admin/features/listModels/ListModelsRepository.js.map +1 -0
  66. package/admin/features/listModels/ListModelsUseCase.d.ts +10 -0
  67. package/admin/features/listModels/ListModelsUseCase.js +18 -0
  68. package/admin/features/listModels/ListModelsUseCase.js.map +1 -0
  69. package/admin/features/listModels/abstractions.d.ts +28 -0
  70. package/admin/features/listModels/abstractions.js +7 -0
  71. package/admin/features/listModels/abstractions.js.map +1 -0
  72. package/admin/features/listModels/feature.d.ts +3 -0
  73. package/admin/features/listModels/feature.js +21 -0
  74. package/admin/features/listModels/feature.js.map +1 -0
  75. package/admin/features/listModels/index.d.ts +2 -0
  76. package/admin/features/listModels/index.js +2 -0
  77. package/admin/features/settings/getSettings/GetSettingsGateway.d.ts +12 -0
  78. package/admin/features/settings/getSettings/GetSettingsGateway.js +29 -0
  79. package/admin/features/settings/getSettings/GetSettingsGateway.js.map +1 -0
  80. package/admin/features/settings/getSettings/GetSettingsRepository.d.ts +14 -0
  81. package/admin/features/settings/getSettings/GetSettingsRepository.js +31 -0
  82. package/admin/features/settings/getSettings/GetSettingsRepository.js.map +1 -0
  83. package/admin/features/settings/getSettings/GetSettingsUseCase.d.ts +11 -0
  84. package/admin/features/settings/getSettings/GetSettingsUseCase.js +18 -0
  85. package/admin/features/settings/getSettings/GetSettingsUseCase.js.map +1 -0
  86. package/admin/features/settings/getSettings/abstractions.d.ts +22 -0
  87. package/admin/features/settings/getSettings/abstractions.js +7 -0
  88. package/admin/features/settings/getSettings/abstractions.js.map +1 -0
  89. package/admin/features/settings/getSettings/feature.d.ts +3 -0
  90. package/admin/features/settings/getSettings/feature.js +21 -0
  91. package/admin/features/settings/getSettings/feature.js.map +1 -0
  92. package/admin/features/settings/getSettings/index.d.ts +2 -0
  93. package/admin/features/settings/getSettings/index.js +2 -0
  94. package/admin/features/settings/shared/SettingsCache.d.ts +10 -0
  95. package/admin/features/settings/shared/SettingsCache.js +19 -0
  96. package/admin/features/settings/shared/SettingsCache.js.map +1 -0
  97. package/admin/features/settings/shared/abstractions.d.ts +50 -0
  98. package/admin/features/settings/shared/abstractions.js +5 -0
  99. package/admin/features/settings/shared/abstractions.js.map +1 -0
  100. package/admin/features/settings/shared/feature.d.ts +3 -0
  101. package/admin/features/settings/shared/feature.js +17 -0
  102. package/admin/features/settings/shared/feature.js.map +1 -0
  103. package/admin/features/settings/shared/index.d.ts +2 -0
  104. package/admin/features/settings/shared/index.js +2 -0
  105. package/admin/features/settings/updateSettings/UpdateSettingsGateway.d.ts +12 -0
  106. package/admin/features/settings/updateSettings/UpdateSettingsGateway.js +45 -0
  107. package/admin/features/settings/updateSettings/UpdateSettingsGateway.js.map +1 -0
  108. package/admin/features/settings/updateSettings/UpdateSettingsRepository.d.ts +13 -0
  109. package/admin/features/settings/updateSettings/UpdateSettingsRepository.js +23 -0
  110. package/admin/features/settings/updateSettings/UpdateSettingsRepository.js.map +1 -0
  111. package/admin/features/settings/updateSettings/UpdateSettingsUseCase.d.ts +11 -0
  112. package/admin/features/settings/updateSettings/UpdateSettingsUseCase.js +18 -0
  113. package/admin/features/settings/updateSettings/UpdateSettingsUseCase.js.map +1 -0
  114. package/admin/features/settings/updateSettings/abstractions.d.ts +22 -0
  115. package/admin/features/settings/updateSettings/abstractions.js +7 -0
  116. package/admin/features/settings/updateSettings/abstractions.js.map +1 -0
  117. package/admin/features/settings/updateSettings/feature.d.ts +3 -0
  118. package/admin/features/settings/updateSettings/feature.js +21 -0
  119. package/admin/features/settings/updateSettings/feature.js.map +1 -0
  120. package/admin/features/settings/updateSettings/index.d.ts +2 -0
  121. package/admin/features/settings/updateSettings/index.js +2 -0
  122. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPage.d.ts +4 -0
  123. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPage.js +49 -0
  124. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPage.js.map +1 -0
  125. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPresenter.d.ts +26 -0
  126. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPresenter.js +148 -0
  127. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPresenter.js.map +1 -0
  128. package/admin/presentation/AiPowerUpsSettings/abstractions.d.ts +18 -0
  129. package/admin/presentation/AiPowerUpsSettings/abstractions.js +5 -0
  130. package/admin/presentation/AiPowerUpsSettings/abstractions.js.map +1 -0
  131. package/admin/presentation/AiPowerUpsSettings/feature.d.ts +3 -0
  132. package/admin/presentation/AiPowerUpsSettings/feature.js +25 -0
  133. package/admin/presentation/AiPowerUpsSettings/feature.js.map +1 -0
  134. package/admin/presentation/AiPowerUpsSettings/index.d.ts +3 -0
  135. package/admin/presentation/AiPowerUpsSettings/index.js +3 -0
  136. package/admin/presentation/AiPowerUpsSettings/settingsGroup.d.ts +17 -0
  137. package/admin/presentation/AiPowerUpsSettings/settingsGroup.js +5 -0
  138. package/admin/presentation/AiPowerUpsSettings/settingsGroup.js.map +1 -0
  139. package/admin/presentation/AiPowerUpsSettings/useAiPowerUpsSettings.d.ts +4 -0
  140. package/admin/presentation/AiPowerUpsSettings/useAiPowerUpsSettings.js +27 -0
  141. package/admin/presentation/AiPowerUpsSettings/useAiPowerUpsSettings.js.map +1 -0
  142. package/admin/presentation/AiPromptFormFactory/AiPromptFormFactory.d.ts +20 -0
  143. package/admin/presentation/AiPromptFormFactory/AiPromptFormFactory.js +108 -0
  144. package/admin/presentation/AiPromptFormFactory/AiPromptFormFactory.js.map +1 -0
  145. package/admin/presentation/AiPromptFormFactory/abstractions.d.ts +14 -0
  146. package/admin/presentation/AiPromptFormFactory/abstractions.js +5 -0
  147. package/admin/presentation/AiPromptFormFactory/abstractions.js.map +1 -0
  148. package/admin/presentation/AiPromptFormFactory/feature.d.ts +1 -0
  149. package/admin/presentation/AiPromptFormFactory/feature.js +11 -0
  150. package/admin/presentation/AiPromptFormFactory/feature.js.map +1 -0
  151. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDialog.d.ts +9 -0
  152. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDialog.js +118 -0
  153. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDialog.js.map +1 -0
  154. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDrawer.d.ts +9 -0
  155. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDrawer.js +72 -0
  156. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDrawer.js.map +1 -0
  157. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsMenuItem.d.ts +4 -0
  158. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsMenuItem.js +21 -0
  159. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsMenuItem.js.map +1 -0
  160. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsOverlays.d.ts +2 -0
  161. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsOverlays.js +17 -0
  162. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsOverlays.js.map +1 -0
  163. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsPresenter.d.ts +25 -0
  164. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsPresenter.js +90 -0
  165. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsPresenter.js.map +1 -0
  166. package/admin/presentation/CmsCompareEntryRevisions/Extension.d.ts +2 -0
  167. package/admin/presentation/CmsCompareEntryRevisions/Extension.js +16 -0
  168. package/admin/presentation/CmsCompareEntryRevisions/Extension.js.map +1 -0
  169. package/admin/presentation/CmsCompareEntryRevisions/abstractions.d.ts +29 -0
  170. package/admin/presentation/CmsCompareEntryRevisions/abstractions.js +5 -0
  171. package/admin/presentation/CmsCompareEntryRevisions/abstractions.js.map +1 -0
  172. package/admin/presentation/CmsCompareEntryRevisions/feature.d.ts +3 -0
  173. package/admin/presentation/CmsCompareEntryRevisions/feature.js +17 -0
  174. package/admin/presentation/CmsCompareEntryRevisions/feature.js.map +1 -0
  175. package/admin/presentation/CmsContentGeneration/CmsGenerateContentButton.d.ts +4 -0
  176. package/admin/presentation/CmsContentGeneration/CmsGenerateContentButton.js +27 -0
  177. package/admin/presentation/CmsContentGeneration/CmsGenerateContentButton.js.map +1 -0
  178. package/admin/presentation/CmsContentGeneration/CmsGenerateContentDialog.d.ts +5 -0
  179. package/admin/presentation/CmsContentGeneration/CmsGenerateContentDialog.js +106 -0
  180. package/admin/presentation/CmsContentGeneration/CmsGenerateContentDialog.js.map +1 -0
  181. package/admin/presentation/CmsContentGeneration/CmsGenerateContentPresenter.d.ts +29 -0
  182. package/admin/presentation/CmsContentGeneration/CmsGenerateContentPresenter.js +120 -0
  183. package/admin/presentation/CmsContentGeneration/CmsGenerateContentPresenter.js.map +1 -0
  184. package/admin/presentation/CmsContentGeneration/Extension.d.ts +2 -0
  185. package/admin/presentation/CmsContentGeneration/Extension.js +27 -0
  186. package/admin/presentation/CmsContentGeneration/Extension.js.map +1 -0
  187. package/admin/presentation/CmsContentGeneration/abstractions.d.ts +20 -0
  188. package/admin/presentation/CmsContentGeneration/abstractions.js +5 -0
  189. package/admin/presentation/CmsContentGeneration/abstractions.js.map +1 -0
  190. package/admin/presentation/CmsContentGeneration/feature.d.ts +3 -0
  191. package/admin/presentation/CmsContentGeneration/feature.js +17 -0
  192. package/admin/presentation/CmsContentGeneration/feature.js.map +1 -0
  193. package/admin/presentation/CmsEntryWizard/CmsEntryWizard.d.ts +4 -0
  194. package/admin/presentation/CmsEntryWizard/CmsEntryWizard.js +113 -0
  195. package/admin/presentation/CmsEntryWizard/CmsEntryWizard.js.map +1 -0
  196. package/admin/presentation/CmsEntryWizard/CmsEntryWizardGate.d.ts +4 -0
  197. package/admin/presentation/CmsEntryWizard/CmsEntryWizardGate.js +19 -0
  198. package/admin/presentation/CmsEntryWizard/CmsEntryWizardGate.js.map +1 -0
  199. package/admin/presentation/CmsEntryWizard/Extension.d.ts +2 -0
  200. package/admin/presentation/CmsEntryWizard/Extension.js +10 -0
  201. package/admin/presentation/CmsEntryWizard/Extension.js.map +1 -0
  202. package/admin/presentation/ProjectsSettings.d.ts +11 -0
  203. package/admin/presentation/ProjectsSettings.js +56 -0
  204. package/admin/presentation/ProjectsSettings.js.map +1 -0
  205. package/admin/presentation/ProvidersSettings.d.ts +16 -0
  206. package/admin/presentation/ProvidersSettings.js +46 -0
  207. package/admin/presentation/ProvidersSettings.js.map +1 -0
  208. package/admin/presentation/ReaderPersonasSettings.d.ts +11 -0
  209. package/admin/presentation/ReaderPersonasSettings.js +37 -0
  210. package/admin/presentation/ReaderPersonasSettings.js.map +1 -0
  211. package/admin/presentation/WbContentGeneration/Extension.d.ts +2 -0
  212. package/admin/presentation/WbContentGeneration/Extension.js +22 -0
  213. package/admin/presentation/WbContentGeneration/Extension.js.map +1 -0
  214. package/admin/presentation/WbContentGeneration/GenerateContentButton.d.ts +2 -0
  215. package/admin/presentation/WbContentGeneration/GenerateContentButton.js +19 -0
  216. package/admin/presentation/WbContentGeneration/GenerateContentButton.js.map +1 -0
  217. package/admin/presentation/WbContentGeneration/GenerateContentDialog.d.ts +21 -0
  218. package/admin/presentation/WbContentGeneration/GenerateContentDialog.js +125 -0
  219. package/admin/presentation/WbContentGeneration/GenerateContentDialog.js.map +1 -0
  220. package/admin/presentation/WbContentGeneration/GenerateContentPresenter.d.ts +33 -0
  221. package/admin/presentation/WbContentGeneration/GenerateContentPresenter.js +161 -0
  222. package/admin/presentation/WbContentGeneration/GenerateContentPresenter.js.map +1 -0
  223. package/admin/presentation/WbContentGeneration/PROCESS_IDEA.md +190 -0
  224. package/admin/presentation/WbContentGeneration/abstractions.d.ts +31 -0
  225. package/admin/presentation/WbContentGeneration/abstractions.js +5 -0
  226. package/admin/presentation/WbContentGeneration/abstractions.js.map +1 -0
  227. package/admin/presentation/WbContentGeneration/decompressGzipBase64.d.ts +1 -0
  228. package/admin/presentation/WbContentGeneration/decompressGzipBase64.js +13 -0
  229. package/admin/presentation/WbContentGeneration/decompressGzipBase64.js.map +1 -0
  230. package/admin/presentation/WbContentGeneration/feature.d.ts +3 -0
  231. package/admin/presentation/WbContentGeneration/feature.js +17 -0
  232. package/admin/presentation/WbContentGeneration/feature.js.map +1 -0
  233. package/admin/presentation/WriterPersonasSettings.d.ts +11 -0
  234. package/admin/presentation/WriterPersonasSettings.js +37 -0
  235. package/admin/presentation/WriterPersonasSettings.js.map +1 -0
  236. package/admin/routes.d.ts +4 -0
  237. package/admin/routes.js +10 -0
  238. package/admin/routes.js.map +1 -0
  239. package/api/Extension.d.ts +4 -0
  240. package/api/Extension.js +45 -0
  241. package/api/Extension.js.map +1 -0
  242. package/api/constants.d.ts +1 -0
  243. package/api/constants.js +4 -0
  244. package/api/constants.js.map +1 -0
  245. package/api/features/AiImageEnrichment/AiImageEnrichmentAfterCreateHandler.d.ts +13 -0
  246. package/api/features/AiImageEnrichment/AiImageEnrichmentAfterCreateHandler.js +31 -0
  247. package/api/features/AiImageEnrichment/AiImageEnrichmentAfterCreateHandler.js.map +1 -0
  248. package/api/features/AiImageEnrichment/AiImageEnrichmentTask.d.ts +36 -0
  249. package/api/features/AiImageEnrichment/AiImageEnrichmentTask.js +142 -0
  250. package/api/features/AiImageEnrichment/AiImageEnrichmentTask.js.map +1 -0
  251. package/api/features/AiImageEnrichment/feature.d.ts +4 -0
  252. package/api/features/AiImageEnrichment/feature.js +13 -0
  253. package/api/features/AiImageEnrichment/feature.js.map +1 -0
  254. package/api/features/AiPromptContext/AiPromptContextBuilder.d.ts +19 -0
  255. package/api/features/AiPromptContext/AiPromptContextBuilder.js +147 -0
  256. package/api/features/AiPromptContext/AiPromptContextBuilder.js.map +1 -0
  257. package/api/features/AiPromptContext/ProjectFileAssembler.d.ts +22 -0
  258. package/api/features/AiPromptContext/ProjectFileAssembler.js +76 -0
  259. package/api/features/AiPromptContext/ProjectFileAssembler.js.map +1 -0
  260. package/api/features/AiPromptContext/ProjectFileCache.d.ts +16 -0
  261. package/api/features/AiPromptContext/ProjectFileCache.js +61 -0
  262. package/api/features/AiPromptContext/ProjectFileCache.js.map +1 -0
  263. package/api/features/AiPromptContext/ProjectSection.d.ts +4 -0
  264. package/api/features/AiPromptContext/ProjectSection.js +35 -0
  265. package/api/features/AiPromptContext/ProjectSection.js.map +1 -0
  266. package/api/features/AiPromptContext/ReadProjectFileTool.d.ts +3 -0
  267. package/api/features/AiPromptContext/ReadProjectFileTool.js +36 -0
  268. package/api/features/AiPromptContext/ReadProjectFileTool.js.map +1 -0
  269. package/api/features/AiPromptContext/ReaderPersonaSection.d.ts +4 -0
  270. package/api/features/AiPromptContext/ReaderPersonaSection.js +10 -0
  271. package/api/features/AiPromptContext/ReaderPersonaSection.js.map +1 -0
  272. package/api/features/AiPromptContext/WriterPersonaSection.d.ts +4 -0
  273. package/api/features/AiPromptContext/WriterPersonaSection.js +10 -0
  274. package/api/features/AiPromptContext/WriterPersonaSection.js.map +1 -0
  275. package/api/features/AiPromptContext/abstractions.d.ts +71 -0
  276. package/api/features/AiPromptContext/abstractions.js +15 -0
  277. package/api/features/AiPromptContext/abstractions.js.map +1 -0
  278. package/api/features/AiPromptContext/feature.d.ts +4 -0
  279. package/api/features/AiPromptContext/feature.js +15 -0
  280. package/api/features/AiPromptContext/feature.js.map +1 -0
  281. package/api/features/AiPromptContext/index.d.ts +1 -0
  282. package/api/features/AiPromptContext/index.js +1 -0
  283. package/api/features/CmsCompareEntryRevisions/CmsCompareEntryRevisionsUseCase.d.ts +22 -0
  284. package/api/features/CmsCompareEntryRevisions/CmsCompareEntryRevisionsUseCase.js +136 -0
  285. package/api/features/CmsCompareEntryRevisions/CmsCompareEntryRevisionsUseCase.js.map +1 -0
  286. package/api/features/CmsCompareEntryRevisions/abstractions.d.ts +18 -0
  287. package/api/features/CmsCompareEntryRevisions/abstractions.js +5 -0
  288. package/api/features/CmsCompareEntryRevisions/abstractions.js.map +1 -0
  289. package/api/features/CmsCompareEntryRevisions/feature.d.ts +4 -0
  290. package/api/features/CmsCompareEntryRevisions/feature.js +11 -0
  291. package/api/features/CmsCompareEntryRevisions/feature.js.map +1 -0
  292. package/api/features/CmsCompareEntryRevisions/index.d.ts +2 -0
  293. package/api/features/CmsCompareEntryRevisions/index.js +2 -0
  294. package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentTask.d.ts +33 -0
  295. package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentTask.js +84 -0
  296. package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentTask.js.map +1 -0
  297. package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentUseCase.d.ts +29 -0
  298. package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentUseCase.js +141 -0
  299. package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentUseCase.js.map +1 -0
  300. package/api/features/CmsGenerateEntryContent/abstractions.d.ts +36 -0
  301. package/api/features/CmsGenerateEntryContent/abstractions.js +5 -0
  302. package/api/features/CmsGenerateEntryContent/abstractions.js.map +1 -0
  303. package/api/features/CmsGenerateEntryContent/buildPrompt.d.ts +2 -0
  304. package/api/features/CmsGenerateEntryContent/buildPrompt.js +61 -0
  305. package/api/features/CmsGenerateEntryContent/buildPrompt.js.map +1 -0
  306. package/api/features/CmsGenerateEntryContent/feature.d.ts +4 -0
  307. package/api/features/CmsGenerateEntryContent/feature.js +13 -0
  308. package/api/features/CmsGenerateEntryContent/feature.js.map +1 -0
  309. package/api/features/CmsGenerateEntryContent/index.d.ts +1 -0
  310. package/api/features/CmsGenerateEntryContent/index.js +1 -0
  311. package/api/features/CmsGenerateEntryContent/injectDynamicZoneTypenames.d.ts +2 -0
  312. package/api/features/CmsGenerateEntryContent/injectDynamicZoneTypenames.js +30 -0
  313. package/api/features/CmsGenerateEntryContent/injectDynamicZoneTypenames.js.map +1 -0
  314. package/api/features/CmsResolveImageTool/CmsResolveImageTool.d.ts +14 -0
  315. package/api/features/CmsResolveImageTool/CmsResolveImageTool.js +27 -0
  316. package/api/features/CmsResolveImageTool/CmsResolveImageTool.js.map +1 -0
  317. package/api/features/CmsResolveImageTool/feature.d.ts +4 -0
  318. package/api/features/CmsResolveImageTool/feature.js +11 -0
  319. package/api/features/CmsResolveImageTool/feature.js.map +1 -0
  320. package/api/features/ExtractFrontmatter/ExtractFrontmatterBeforeCreateHandler.d.ts +11 -0
  321. package/api/features/ExtractFrontmatter/ExtractFrontmatterBeforeCreateHandler.js +34 -0
  322. package/api/features/ExtractFrontmatter/ExtractFrontmatterBeforeCreateHandler.js.map +1 -0
  323. package/api/features/ExtractFrontmatter/feature.d.ts +4 -0
  324. package/api/features/ExtractFrontmatter/feature.js +11 -0
  325. package/api/features/ExtractFrontmatter/feature.js.map +1 -0
  326. package/api/features/GetSettings/GetSettingsRepository.d.ts +16 -0
  327. package/api/features/GetSettings/GetSettingsRepository.js +40 -0
  328. package/api/features/GetSettings/GetSettingsRepository.js.map +1 -0
  329. package/api/features/GetSettings/GetSettingsUseCase.d.ts +10 -0
  330. package/api/features/GetSettings/GetSettingsUseCase.js +18 -0
  331. package/api/features/GetSettings/GetSettingsUseCase.js.map +1 -0
  332. package/api/features/GetSettings/abstractions.d.ts +16 -0
  333. package/api/features/GetSettings/abstractions.js +6 -0
  334. package/api/features/GetSettings/abstractions.js.map +1 -0
  335. package/api/features/GetSettings/feature.d.ts +4 -0
  336. package/api/features/GetSettings/feature.js +13 -0
  337. package/api/features/GetSettings/feature.js.map +1 -0
  338. package/api/features/GetSettings/index.d.ts +2 -0
  339. package/api/features/GetSettings/index.js +2 -0
  340. package/api/features/Projects/ProjectsHandler.d.ts +31 -0
  341. package/api/features/Projects/ProjectsHandler.js +103 -0
  342. package/api/features/Projects/ProjectsHandler.js.map +1 -0
  343. package/api/features/Projects/feature.d.ts +4 -0
  344. package/api/features/Projects/feature.js +11 -0
  345. package/api/features/Projects/feature.js.map +1 -0
  346. package/api/features/Projects/types.d.ts +50 -0
  347. package/api/features/Projects/types.js +0 -0
  348. package/api/features/Providers/ProvidersGraphQLMapper.d.ts +21 -0
  349. package/api/features/Providers/ProvidersGraphQLMapper.js +39 -0
  350. package/api/features/Providers/ProvidersGraphQLMapper.js.map +1 -0
  351. package/api/features/Providers/ProvidersHandler.d.ts +26 -0
  352. package/api/features/Providers/ProvidersHandler.js +79 -0
  353. package/api/features/Providers/ProvidersHandler.js.map +1 -0
  354. package/api/features/Providers/feature.d.ts +4 -0
  355. package/api/features/Providers/feature.js +13 -0
  356. package/api/features/Providers/feature.js.map +1 -0
  357. package/api/features/Providers/index.d.ts +1 -0
  358. package/api/features/Providers/index.js +0 -0
  359. package/api/features/Providers/types.d.ts +29 -0
  360. package/api/features/Providers/types.js +0 -0
  361. package/api/features/ReaderPersonas/ReaderPersonasHandler.d.ts +20 -0
  362. package/api/features/ReaderPersonas/ReaderPersonasHandler.js +43 -0
  363. package/api/features/ReaderPersonas/ReaderPersonasHandler.js.map +1 -0
  364. package/api/features/ReaderPersonas/feature.d.ts +4 -0
  365. package/api/features/ReaderPersonas/feature.js +11 -0
  366. package/api/features/ReaderPersonas/feature.js.map +1 -0
  367. package/api/features/ReaderPersonas/index.d.ts +2 -0
  368. package/api/features/ReaderPersonas/index.js +1 -0
  369. package/api/features/ReaderPersonas/types.d.ts +24 -0
  370. package/api/features/ReaderPersonas/types.js +0 -0
  371. package/api/features/UpdateSettings/UpdateSettingsRepository.d.ts +16 -0
  372. package/api/features/UpdateSettings/UpdateSettingsRepository.js +71 -0
  373. package/api/features/UpdateSettings/UpdateSettingsRepository.js.map +1 -0
  374. package/api/features/UpdateSettings/UpdateSettingsUseCase.d.ts +13 -0
  375. package/api/features/UpdateSettings/UpdateSettingsUseCase.js +30 -0
  376. package/api/features/UpdateSettings/UpdateSettingsUseCase.js.map +1 -0
  377. package/api/features/UpdateSettings/abstractions.d.ts +36 -0
  378. package/api/features/UpdateSettings/abstractions.js +8 -0
  379. package/api/features/UpdateSettings/abstractions.js.map +1 -0
  380. package/api/features/UpdateSettings/errors.d.ts +10 -0
  381. package/api/features/UpdateSettings/errors.js +14 -0
  382. package/api/features/UpdateSettings/errors.js.map +1 -0
  383. package/api/features/UpdateSettings/events.d.ts +10 -0
  384. package/api/features/UpdateSettings/events.js +21 -0
  385. package/api/features/UpdateSettings/events.js.map +1 -0
  386. package/api/features/UpdateSettings/feature.d.ts +4 -0
  387. package/api/features/UpdateSettings/feature.js +13 -0
  388. package/api/features/UpdateSettings/feature.js.map +1 -0
  389. package/api/features/UpdateSettings/index.d.ts +1 -0
  390. package/api/features/UpdateSettings/index.js +1 -0
  391. package/api/features/WbGeneratePageContent/ComponentFilter.d.ts +18 -0
  392. package/api/features/WbGeneratePageContent/ComponentFilter.js +69 -0
  393. package/api/features/WbGeneratePageContent/ComponentFilter.js.map +1 -0
  394. package/api/features/WbGeneratePageContent/LlmJsonResponse.d.ts +7 -0
  395. package/api/features/WbGeneratePageContent/LlmJsonResponse.js +35 -0
  396. package/api/features/WbGeneratePageContent/LlmJsonResponse.js.map +1 -0
  397. package/api/features/WbGeneratePageContent/WbGeneratePageContentTask.d.ts +34 -0
  398. package/api/features/WbGeneratePageContent/WbGeneratePageContentTask.js +85 -0
  399. package/api/features/WbGeneratePageContent/WbGeneratePageContentTask.js.map +1 -0
  400. package/api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.d.ts +23 -0
  401. package/api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.js +121 -0
  402. package/api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.js.map +1 -0
  403. package/api/features/WbGeneratePageContent/abstractions.d.ts +31 -0
  404. package/api/features/WbGeneratePageContent/abstractions.js +5 -0
  405. package/api/features/WbGeneratePageContent/abstractions.js.map +1 -0
  406. package/api/features/WbGeneratePageContent/buildPrompt.d.ts +3 -0
  407. package/api/features/WbGeneratePageContent/buildPrompt.js +158 -0
  408. package/api/features/WbGeneratePageContent/buildPrompt.js.map +1 -0
  409. package/api/features/WbGeneratePageContent/feature.d.ts +4 -0
  410. package/api/features/WbGeneratePageContent/feature.js +13 -0
  411. package/api/features/WbGeneratePageContent/feature.js.map +1 -0
  412. package/api/features/WbGeneratePageContent/index.d.ts +1 -0
  413. package/api/features/WbGeneratePageContent/index.js +1 -0
  414. package/api/features/WbTranslatePage/LexicalParser.d.ts +10 -0
  415. package/api/features/WbTranslatePage/LexicalParser.js +37 -0
  416. package/api/features/WbTranslatePage/LexicalParser.js.map +1 -0
  417. package/api/features/WbTranslatePage/WbTranslatePageDecorator.d.ts +27 -0
  418. package/api/features/WbTranslatePage/WbTranslatePageDecorator.js +134 -0
  419. package/api/features/WbTranslatePage/WbTranslatePageDecorator.js.map +1 -0
  420. package/api/features/WbTranslatePage/abstractions/LexicalParser.d.ts +7 -0
  421. package/api/features/WbTranslatePage/abstractions/LexicalParser.js +5 -0
  422. package/api/features/WbTranslatePage/abstractions/LexicalParser.js.map +1 -0
  423. package/api/features/WbTranslatePage/feature.d.ts +4 -0
  424. package/api/features/WbTranslatePage/feature.js +13 -0
  425. package/api/features/WbTranslatePage/feature.js.map +1 -0
  426. package/api/features/WbTranslatePage/index.d.ts +2 -0
  427. package/api/features/WbTranslatePage/index.js +2 -0
  428. package/api/features/WriterPersonas/WriterPersonasHandler.d.ts +20 -0
  429. package/api/features/WriterPersonas/WriterPersonasHandler.js +43 -0
  430. package/api/features/WriterPersonas/WriterPersonasHandler.js.map +1 -0
  431. package/api/features/WriterPersonas/feature.d.ts +4 -0
  432. package/api/features/WriterPersonas/feature.js +11 -0
  433. package/api/features/WriterPersonas/feature.js.map +1 -0
  434. package/api/features/WriterPersonas/index.d.ts +2 -0
  435. package/api/features/WriterPersonas/index.js +1 -0
  436. package/api/features/WriterPersonas/types.d.ts +24 -0
  437. package/api/features/WriterPersonas/types.js +0 -0
  438. package/api/features/shared/SettingsCache.d.ts +12 -0
  439. package/api/features/shared/SettingsCache.js +22 -0
  440. package/api/features/shared/SettingsCache.js.map +1 -0
  441. package/api/features/shared/abstractions.d.ts +33 -0
  442. package/api/features/shared/abstractions.js +7 -0
  443. package/api/features/shared/abstractions.js.map +1 -0
  444. package/api/features/shared/index.d.ts +3 -0
  445. package/api/features/shared/index.js +1 -0
  446. package/api/graphql/AiPowerUpsSettingsGraphQLMapper.d.ts +13 -0
  447. package/api/graphql/AiPowerUpsSettingsGraphQLMapper.js +44 -0
  448. package/api/graphql/AiPowerUpsSettingsGraphQLMapper.js.map +1 -0
  449. package/api/graphql/BaseGraphQLSchema.d.ts +8 -0
  450. package/api/graphql/BaseGraphQLSchema.js +172 -0
  451. package/api/graphql/BaseGraphQLSchema.js.map +1 -0
  452. package/api/graphql/CmsCompareEntryRevisionsSchema.d.ts +8 -0
  453. package/api/graphql/CmsCompareEntryRevisionsSchema.js +68 -0
  454. package/api/graphql/CmsCompareEntryRevisionsSchema.js.map +1 -0
  455. package/api/graphql/abstractions.d.ts +9 -0
  456. package/api/graphql/abstractions.js +5 -0
  457. package/api/graphql/abstractions.js.map +1 -0
  458. package/api/types.d.ts +5 -0
  459. package/api/types.js +3 -0
  460. package/exports/admin/ai-powerups.d.ts +1 -0
  461. package/exports/admin/ai-powerups.js +1 -0
  462. package/exports/api/ai-powerups.d.ts +2 -0
  463. package/exports/api/ai-powerups.js +2 -0
  464. package/index.d.ts +1 -0
  465. package/index.js +1 -0
  466. package/package.json +65 -0
@@ -0,0 +1,142 @@
1
+ import { Output } from "ai";
2
+ import { z } from "zod";
3
+ import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
4
+ import { Ai } from "@webiny/api-core/features/ai/index.js";
5
+ import { Encryption } from "@webiny/api-core/features/encryption/index.js";
6
+ import { GetFileUseCase } from "@webiny/api-file-manager/features/file/GetFile/index.js";
7
+ import { GetFileContentsByIdUseCase } from "@webiny/api-file-manager/features/file/GetFileContentsById/abstractions.js";
8
+ import { UpdateFileUseCase } from "@webiny/api-file-manager/features/file/UpdateFile/index.js";
9
+ import { WebsocketsSendToIdentityUseCase } from "@webiny/api-websockets/features/SendToIdentity/abstractions.js";
10
+ import { IdentityContext } from "@webiny/api-core/exports/api/security.js";
11
+ import { GetSettingsUseCase } from "../GetSettings/index.js";
12
+ const AI_IMAGE_ENRICHMENT_TASK_ID = "fmAiImageEnrichment";
13
+ const AI_PROMPT = "Analyze this image and return up to 5 lowercase descriptive tags and one short sentence describing the image.";
14
+ const aiOutputSchema = Output.object({
15
+ schema: z.object({
16
+ tags: z.array(z.string()),
17
+ description: z.string()
18
+ })
19
+ });
20
+ class AiImageEnrichmentTaskImpl {
21
+ constructor(getFile, getFileContents, updateFile, ai, getSettings, encryption, identityContext, sendToIdentity){
22
+ this.getFile = getFile;
23
+ this.getFileContents = getFileContents;
24
+ this.updateFile = updateFile;
25
+ this.ai = ai;
26
+ this.getSettings = getSettings;
27
+ this.encryption = encryption;
28
+ this.identityContext = identityContext;
29
+ this.sendToIdentity = sendToIdentity;
30
+ this.id = AI_IMAGE_ENRICHMENT_TASK_ID;
31
+ this.title = "File Manager - AI Image Enrichment";
32
+ this.description = "Automatically enriches uploaded images with AI-generated tags and description.";
33
+ this.maxIterations = 1;
34
+ this.isPrivate = true;
35
+ this.databaseLogs = false;
36
+ this.selfCleanup = [
37
+ "onSuccess",
38
+ "onAbort"
39
+ ];
40
+ }
41
+ async run({ input, controller }) {
42
+ if (controller.runtime.isAborted()) return controller.response.aborted();
43
+ const fileResult = await this.getFile.execute(input.fileId);
44
+ if (fileResult.isFail()) return controller.response.error({
45
+ message: `File not found: ${input.fileId}`
46
+ });
47
+ const file = fileResult.value;
48
+ if (!file.type.startsWith("image/")) return controller.response.done("File is not an image; skipping AI enrichment.");
49
+ const contentsResult = await this.getFileContents.execute(input.fileId);
50
+ if (contentsResult.isFail()) return controller.response.error({
51
+ message: `Unable to read file contents: ${contentsResult.error.message}`
52
+ });
53
+ const imageBase64 = contentsResult.value.buffer.toString("base64");
54
+ const imageMediaType = contentsResult.value.contentType;
55
+ const aiSettingsResult = await this.getSettings.execute();
56
+ if (aiSettingsResult.isFail()) return controller.response.error({
57
+ message: "No AI provider configured. Add a provider in AI Power Ups settings."
58
+ });
59
+ const aiSettings = aiSettingsResult.value;
60
+ const firstProvider = aiSettings.providers.presets[0];
61
+ if (!firstProvider) return controller.response.done({
62
+ message: "No AI provider configured. Add a provider in AI Power Ups settings."
63
+ });
64
+ let tags = [];
65
+ let description = "";
66
+ try {
67
+ const aiResult = await this.ai.generateText({
68
+ model: firstProvider.model,
69
+ output: aiOutputSchema,
70
+ connection: {
71
+ sdkName: firstProvider.model.split("/")[0],
72
+ apiKey: await this.encryption.decrypt(firstProvider.apiKeyEncrypted)
73
+ },
74
+ messages: [
75
+ {
76
+ role: "user",
77
+ content: [
78
+ {
79
+ type: "file",
80
+ data: imageBase64,
81
+ mediaType: imageMediaType
82
+ },
83
+ {
84
+ type: "text",
85
+ text: AI_PROMPT
86
+ }
87
+ ]
88
+ }
89
+ ]
90
+ });
91
+ tags = aiResult.output.tags;
92
+ description = aiResult.output.description;
93
+ } catch (error) {
94
+ console.log("error", error.message);
95
+ return controller.response.error({
96
+ message: `AI enrichment failed: ${error instanceof Error ? error.message : String(error)}`
97
+ });
98
+ }
99
+ const mergedTags = [
100
+ ...new Set([
101
+ ...file.tags,
102
+ ...tags
103
+ ])
104
+ ];
105
+ const updateResult = await this.updateFile.execute({
106
+ id: file.id,
107
+ tags: mergedTags,
108
+ description
109
+ });
110
+ if (updateResult.isFail()) return controller.response.error({
111
+ message: `Failed to update file: ${updateResult.error.message}`
112
+ });
113
+ const identity = this.identityContext.getIdentity();
114
+ await this.sendToIdentity.execute({
115
+ id: identity.id
116
+ }, {
117
+ action: "fm.file.enrichment",
118
+ data: {
119
+ id: file.id,
120
+ tags: mergedTags,
121
+ description
122
+ }
123
+ });
124
+ return controller.response.done("AI image enrichment completed successfully.");
125
+ }
126
+ }
127
+ const AiImageEnrichmentTask = TaskDefinition.createImplementation({
128
+ implementation: AiImageEnrichmentTaskImpl,
129
+ dependencies: [
130
+ GetFileUseCase,
131
+ GetFileContentsByIdUseCase,
132
+ UpdateFileUseCase,
133
+ Ai,
134
+ GetSettingsUseCase,
135
+ Encryption,
136
+ IdentityContext,
137
+ WebsocketsSendToIdentityUseCase
138
+ ]
139
+ });
140
+ export { AI_IMAGE_ENRICHMENT_TASK_ID, AiImageEnrichmentTask };
141
+
142
+ //# sourceMappingURL=AiImageEnrichmentTask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api/features/AiImageEnrichment/AiImageEnrichmentTask.js","sources":["../../../../src/api/features/AiImageEnrichment/AiImageEnrichmentTask.ts"],"sourcesContent":["import { Output } from \"ai\";\nimport { z } from \"zod\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { Ai } from \"@webiny/api-core/features/ai/index.js\";\nimport { Encryption } from \"@webiny/api-core/features/encryption/index.js\";\nimport { GetFileUseCase } from \"@webiny/api-file-manager/features/file/GetFile/index.js\";\nimport { GetFileContentsByIdUseCase } from \"@webiny/api-file-manager/features/file/GetFileContentsById/abstractions.js\";\nimport { UpdateFileUseCase } from \"@webiny/api-file-manager/features/file/UpdateFile/index.js\";\nimport { WebsocketsSendToIdentityUseCase } from \"@webiny/api-websockets/features/SendToIdentity/abstractions.js\";\nimport { IdentityContext } from \"@webiny/api-core/exports/api/security.js\";\nimport { GetSettingsUseCase } from \"~/api/features/GetSettings/index.js\";\n\nexport const AI_IMAGE_ENRICHMENT_TASK_ID = \"fmAiImageEnrichment\";\n\nconst AI_PROMPT =\n \"Analyze this image and return up to 5 lowercase descriptive tags and one short sentence describing the image.\";\n\nconst aiOutputSchema = Output.object({\n schema: z.object({\n tags: z.array(z.string()),\n description: z.string()\n })\n});\n\nexport interface IAiImageEnrichmentTaskInput {\n fileId: string;\n}\n\nclass AiImageEnrichmentTaskImpl implements TaskDefinition.Interface<IAiImageEnrichmentTaskInput> {\n id = AI_IMAGE_ENRICHMENT_TASK_ID;\n title = \"File Manager - AI Image Enrichment\";\n description = \"Automatically enriches uploaded images with AI-generated tags and description.\";\n maxIterations = 1;\n isPrivate = true;\n databaseLogs = false;\n\n public readonly selfCleanup = [\"onSuccess\" as const, \"onAbort\" as const];\n\n constructor(\n private getFile: GetFileUseCase.Interface,\n private getFileContents: GetFileContentsByIdUseCase.Interface,\n private updateFile: UpdateFileUseCase.Interface,\n private ai: Ai.Interface,\n private getSettings: GetSettingsUseCase.Interface,\n private encryption: Encryption.Interface,\n private identityContext: IdentityContext.Interface,\n private sendToIdentity: WebsocketsSendToIdentityUseCase.Interface\n ) {}\n\n async run({\n input,\n controller\n }: TaskDefinition.RunParams<IAiImageEnrichmentTaskInput>): Promise<\n TaskDefinition.Result<IAiImageEnrichmentTaskInput>\n > {\n if (controller.runtime.isAborted()) {\n return controller.response.aborted();\n }\n\n const fileResult = await this.getFile.execute(input.fileId);\n if (fileResult.isFail()) {\n return controller.response.error({\n message: `File not found: ${input.fileId}`\n });\n }\n\n const file = fileResult.value;\n\n if (!file.type.startsWith(\"image/\")) {\n return controller.response.done(\"File is not an image; skipping AI enrichment.\");\n }\n\n // Read the image bytes and send them to the AI as base64, NOT a URL. A URL forces the\n // provider to fetch the file — which fails for private/access-controlled files, leaks the\n // domain, and can't reach a non-public origin (e.g. local dev). base64 is a portable standard\n // that works on every setup. (Also resolves the AI-SDK \"image part\" deprecation.)\n const contentsResult = await this.getFileContents.execute(input.fileId);\n if (contentsResult.isFail()) {\n return controller.response.error({\n message: `Unable to read file contents: ${contentsResult.error.message}`\n });\n }\n const imageBase64 = contentsResult.value.buffer.toString(\"base64\");\n const imageMediaType = contentsResult.value.contentType;\n\n const aiSettingsResult = await this.getSettings.execute();\n\n if (aiSettingsResult.isFail()) {\n return controller.response.error({\n message: \"No AI provider configured. Add a provider in AI Power Ups settings.\"\n });\n }\n\n const aiSettings = aiSettingsResult.value;\n\n const firstProvider = aiSettings.providers.presets[0];\n\n if (!firstProvider) {\n return controller.response.done({\n message: \"No AI provider configured. Add a provider in AI Power Ups settings.\"\n });\n }\n\n let tags: string[] = [];\n let description = \"\";\n try {\n const aiResult = await this.ai.generateText({\n model: firstProvider.model,\n output: aiOutputSchema,\n connection: {\n sdkName: firstProvider.model.split(\"/\")[0],\n apiKey: await this.encryption.decrypt(firstProvider.apiKeyEncrypted)\n },\n messages: [\n {\n role: \"user\",\n content: [\n {\n type: \"file\",\n data: imageBase64,\n mediaType: imageMediaType\n },\n {\n type: \"text\",\n text: AI_PROMPT\n }\n ]\n }\n ]\n });\n\n tags = aiResult.output.tags;\n description = aiResult.output.description;\n } catch (error) {\n console.log(\"error\", error.message);\n return controller.response.error({\n message: `AI enrichment failed: ${error instanceof Error ? error.message : String(error)}`\n });\n }\n\n const mergedTags = [...new Set([...file.tags, ...tags])];\n\n const updateResult = await this.updateFile.execute({\n id: file.id,\n tags: mergedTags,\n description\n });\n\n if (updateResult.isFail()) {\n return controller.response.error({\n message: `Failed to update file: ${updateResult.error.message}`\n });\n }\n\n const identity = this.identityContext.getIdentity();\n await this.sendToIdentity.execute(\n { id: identity.id },\n {\n action: \"fm.file.enrichment\",\n data: {\n id: file.id,\n tags: mergedTags,\n description\n }\n }\n );\n\n return controller.response.done(\"AI image enrichment completed successfully.\");\n }\n}\n\nexport const AiImageEnrichmentTask = TaskDefinition.createImplementation({\n implementation: AiImageEnrichmentTaskImpl,\n dependencies: [\n GetFileUseCase,\n GetFileContentsByIdUseCase,\n UpdateFileUseCase,\n Ai,\n GetSettingsUseCase,\n Encryption,\n IdentityContext,\n WebsocketsSendToIdentityUseCase\n ]\n});\n"],"names":["AI_IMAGE_ENRICHMENT_TASK_ID","AI_PROMPT","aiOutputSchema","Output","z","AiImageEnrichmentTaskImpl","getFile","getFileContents","updateFile","ai","getSettings","encryption","identityContext","sendToIdentity","input","controller","fileResult","file","contentsResult","imageBase64","imageMediaType","aiSettingsResult","aiSettings","firstProvider","tags","description","aiResult","error","console","Error","String","mergedTags","Set","updateResult","identity","AiImageEnrichmentTask","TaskDefinition","GetFileUseCase","GetFileContentsByIdUseCase","UpdateFileUseCase","Ai","GetSettingsUseCase","Encryption","IdentityContext","WebsocketsSendToIdentityUseCase"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare const AiImageEnrichmentFeature: {
2
+ name: string;
3
+ register(container: import("@webiny/di").Container): void;
4
+ };
@@ -0,0 +1,13 @@
1
+ import { createFeature } from "@webiny/feature/api";
2
+ import { AiImageEnrichmentAfterCreateHandler } from "./AiImageEnrichmentAfterCreateHandler.js";
3
+ import { AiImageEnrichmentTask } from "./AiImageEnrichmentTask.js";
4
+ const AiImageEnrichmentFeature = createFeature({
5
+ name: "AiPowerUps/AiImageEnrichment",
6
+ register (container) {
7
+ container.register(AiImageEnrichmentAfterCreateHandler);
8
+ container.register(AiImageEnrichmentTask);
9
+ }
10
+ });
11
+ export { AiImageEnrichmentFeature };
12
+
13
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api/features/AiImageEnrichment/feature.js","sources":["../../../../src/api/features/AiImageEnrichment/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { AiImageEnrichmentAfterCreateHandler } from \"./AiImageEnrichmentAfterCreateHandler.js\";\nimport { AiImageEnrichmentTask } from \"./AiImageEnrichmentTask.js\";\n\nexport const AiImageEnrichmentFeature = createFeature({\n name: \"AiPowerUps/AiImageEnrichment\",\n register(container) {\n container.register(AiImageEnrichmentAfterCreateHandler);\n container.register(AiImageEnrichmentTask);\n }\n});\n"],"names":["AiImageEnrichmentFeature","createFeature","container","AiImageEnrichmentAfterCreateHandler","AiImageEnrichmentTask"],"mappings":";;;AAIO,MAAMA,2BAA2BC,cAAc;IAClD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;IACvB;AACJ"}
@@ -0,0 +1,19 @@
1
+ import { GetSettingsUseCase } from "../../../api/features/GetSettings/index.js";
2
+ import { GetFileContentsByIdUseCase } from "@webiny/api-file-manager/features/file/GetFileContentsById/index.js";
3
+ import { GetFileUseCase } from "@webiny/api-file-manager/features/file/GetFile/index.js";
4
+ import { TextExtractor } from "@webiny/api-core/features/ai/index.js";
5
+ import { AiPromptContextBuilder as Abstraction, ProjectFileAssembler, type AiPromptContext, type AiPromptContextParams } from "./abstractions.js";
6
+ declare class AiPromptContextBuilderImpl implements Abstraction.Interface {
7
+ private getSettings;
8
+ private fileAssembler;
9
+ private getFileContents;
10
+ private getFile;
11
+ private textExtractor;
12
+ constructor(getSettings: GetSettingsUseCase.Interface, fileAssembler: ProjectFileAssembler.Interface, getFileContents: GetFileContentsByIdUseCase.Interface, getFile: GetFileUseCase.Interface, textExtractor: TextExtractor.Interface);
13
+ execute(params: AiPromptContextParams): Promise<AiPromptContext>;
14
+ private fetchAdditionalFiles;
15
+ }
16
+ export declare const AiPromptContextBuilder: typeof AiPromptContextBuilderImpl & {
17
+ __abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IAiPromptContextBuilder>;
18
+ };
19
+ export {};
@@ -0,0 +1,147 @@
1
+ import { GetSettingsUseCase } from "../GetSettings/index.js";
2
+ import { GetFileContentsByIdUseCase } from "@webiny/api-file-manager/features/file/GetFileContentsById/index.js";
3
+ import { GetFileUseCase } from "@webiny/api-file-manager/features/file/GetFile/index.js";
4
+ import { TextExtractor } from "@webiny/api-core/features/ai/index.js";
5
+ import { AiPromptContextBuilder, ProjectFileAssembler } from "./abstractions.js";
6
+ import { WriterPersonaSection } from "./WriterPersonaSection.js";
7
+ import { ReaderPersonaSection } from "./ReaderPersonaSection.js";
8
+ import { ProjectSection } from "./ProjectSection.js";
9
+ function resolvePersonas(settings, project, params) {
10
+ const readerPersonaId = params.readerPersonaId ?? project?.defaultReaderPersonaId ?? void 0;
11
+ const writerPersonaId = params.writerPersonaId ?? project?.defaultWriterPersonaId ?? void 0;
12
+ const readerPreset = readerPersonaId ? settings.readerPersonas?.presets?.find((p)=>p.id === readerPersonaId) : void 0;
13
+ const writerPreset = writerPersonaId ? settings.writerPersonas?.presets?.find((p)=>p.id === writerPersonaId) : void 0;
14
+ return {
15
+ reader: readerPreset ? {
16
+ name: readerPreset.name,
17
+ description: readerPreset.description,
18
+ style: readerPreset.style
19
+ } : void 0,
20
+ writer: writerPreset ? {
21
+ name: writerPreset.name,
22
+ description: writerPreset.description,
23
+ style: writerPreset.style
24
+ } : void 0
25
+ };
26
+ }
27
+ function formatContext(ctx) {
28
+ const sections = [];
29
+ if (ctx.writerPersona) sections.push(WriterPersonaSection.format(ctx.writerPersona));
30
+ if (ctx.readerPersona) sections.push(ReaderPersonaSection.format(ctx.readerPersona));
31
+ if (ctx.project) {
32
+ const projectText = ProjectSection.format(ctx.project);
33
+ if (projectText) sections.push(projectText);
34
+ }
35
+ return sections.length > 0 ? "\n\n" + sections.join("\n\n") : "";
36
+ }
37
+ function emptyContext(warnings) {
38
+ return {
39
+ project: void 0,
40
+ readerPersona: void 0,
41
+ writerPersona: void 0,
42
+ allProjectFiles: [],
43
+ additionalFiles: [],
44
+ excludedFileIds: new Set(),
45
+ cacheHit: false,
46
+ warnings,
47
+ toString () {
48
+ return "";
49
+ }
50
+ };
51
+ }
52
+ class AiPromptContextBuilderImpl {
53
+ constructor(getSettings, fileAssembler, getFileContents, getFile, textExtractor){
54
+ this.getSettings = getSettings;
55
+ this.fileAssembler = fileAssembler;
56
+ this.getFileContents = getFileContents;
57
+ this.getFile = getFile;
58
+ this.textExtractor = textExtractor;
59
+ }
60
+ async execute(params) {
61
+ const warnings = [];
62
+ const settingsResult = await this.getSettings.execute();
63
+ if (settingsResult.isFail()) {
64
+ warnings.push("Failed to load AI PowerUps settings.");
65
+ return emptyContext(warnings);
66
+ }
67
+ const settings = settingsResult.value;
68
+ const projectPreset = params.projectId ? settings.projects?.presets?.find((p)=>p.id === params.projectId) : void 0;
69
+ const { reader, writer } = resolvePersonas(settings, projectPreset, params);
70
+ const excludedFileIds = new Set(params.excludedFileIds ?? []);
71
+ let project;
72
+ let allProjectFiles = [];
73
+ let cacheHit = false;
74
+ if (projectPreset) {
75
+ const assembled = await this.fileAssembler.execute(projectPreset.id, projectPreset.version ?? 0, projectPreset.files ?? [], warnings);
76
+ allProjectFiles = assembled.files;
77
+ cacheHit = assembled.cacheHit;
78
+ const visibleFiles = excludedFileIds.size > 0 ? allProjectFiles.filter((f)=>!excludedFileIds.has(f.id)) : allProjectFiles;
79
+ project = {
80
+ name: projectPreset.name,
81
+ instructions: projectPreset.instructions,
82
+ files: visibleFiles,
83
+ totalTokens: visibleFiles.reduce((sum, f)=>sum + f.tokenCount, 0)
84
+ };
85
+ }
86
+ const additionalFiles = await this.fetchAdditionalFiles(params.additionalFileIds, warnings);
87
+ if (additionalFiles.length > 0) allProjectFiles = [
88
+ ...allProjectFiles,
89
+ ...additionalFiles
90
+ ];
91
+ const ctx = {
92
+ project,
93
+ readerPersona: reader,
94
+ writerPersona: writer,
95
+ allProjectFiles,
96
+ additionalFiles,
97
+ excludedFileIds,
98
+ cacheHit,
99
+ warnings,
100
+ toString () {
101
+ return formatContext(this);
102
+ }
103
+ };
104
+ return ctx;
105
+ }
106
+ async fetchAdditionalFiles(fileIds, warnings) {
107
+ if (!fileIds || 0 === fileIds.length) return [];
108
+ const results = await Promise.all(fileIds.map(async (fileId)=>{
109
+ const [contentsResult, damResult] = await Promise.all([
110
+ this.getFileContents.execute(fileId),
111
+ this.getFile.execute(fileId)
112
+ ]);
113
+ if (contentsResult.isFail()) {
114
+ warnings.push(`Failed to load additional file (${fileId}): ${contentsResult.error.message}`);
115
+ return null;
116
+ }
117
+ const name = damResult.isOk() ? damResult.value.name : fileId;
118
+ const mimeType = damResult.isOk() ? damResult.value.type : "application/octet-stream";
119
+ if (!this.textExtractor.canExtract(mimeType)) {
120
+ warnings.push(`Skipped additional file "${name}" (${fileId}): unsupported type "${mimeType}".`);
121
+ return null;
122
+ }
123
+ const { text: content } = await this.textExtractor.extract(contentsResult.value.buffer, mimeType);
124
+ return {
125
+ id: fileId,
126
+ name,
127
+ content,
128
+ description: damResult.isOk() ? damResult.value.description : void 0,
129
+ tokenCount: Math.ceil(content.length / 4)
130
+ };
131
+ }));
132
+ return results.filter((r)=>null !== r);
133
+ }
134
+ }
135
+ const AiPromptContextBuilder_AiPromptContextBuilder = AiPromptContextBuilder.createImplementation({
136
+ implementation: AiPromptContextBuilderImpl,
137
+ dependencies: [
138
+ GetSettingsUseCase,
139
+ ProjectFileAssembler,
140
+ GetFileContentsByIdUseCase,
141
+ GetFileUseCase,
142
+ TextExtractor
143
+ ]
144
+ });
145
+ export { AiPromptContextBuilder_AiPromptContextBuilder as AiPromptContextBuilder };
146
+
147
+ //# sourceMappingURL=AiPromptContextBuilder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api/features/AiPromptContext/AiPromptContextBuilder.js","sources":["../../../../src/api/features/AiPromptContext/AiPromptContextBuilder.ts"],"sourcesContent":["import { GetSettingsUseCase } from \"~/api/features/GetSettings/index.js\";\nimport { GetFileContentsByIdUseCase } from \"@webiny/api-file-manager/features/file/GetFileContentsById/index.js\";\nimport { GetFileUseCase } from \"@webiny/api-file-manager/features/file/GetFile/index.js\";\nimport { TextExtractor } from \"@webiny/api-core/features/ai/index.js\";\nimport {\n AiPromptContextBuilder as Abstraction,\n ProjectFileAssembler,\n type AiPromptContext,\n type AiPromptContextParams,\n type ProjectFileContent,\n type ResolvedPersona,\n type ResolvedProject\n} from \"./abstractions.js\";\nimport type { IAiPowerUpsSettings } from \"~/api/types.js\";\nimport type { ProjectPreset } from \"~/api/features/Projects/types.js\";\nimport { WriterPersonaSection } from \"./WriterPersonaSection.js\";\nimport { ReaderPersonaSection } from \"./ReaderPersonaSection.js\";\nimport { ProjectSection } from \"./ProjectSection.js\";\n\nfunction resolvePersonas(\n settings: IAiPowerUpsSettings,\n project: ProjectPreset | undefined,\n params: AiPromptContextParams\n): { reader?: ResolvedPersona; writer?: ResolvedPersona } {\n const readerPersonaId = params.readerPersonaId ?? project?.defaultReaderPersonaId ?? undefined;\n const writerPersonaId = params.writerPersonaId ?? project?.defaultWriterPersonaId ?? undefined;\n\n const readerPreset = readerPersonaId\n ? settings.readerPersonas?.presets?.find(p => p.id === readerPersonaId)\n : undefined;\n\n const writerPreset = writerPersonaId\n ? settings.writerPersonas?.presets?.find(p => p.id === writerPersonaId)\n : undefined;\n\n return {\n reader: readerPreset\n ? {\n name: readerPreset.name,\n description: readerPreset.description,\n style: readerPreset.style\n }\n : undefined,\n writer: writerPreset\n ? {\n name: writerPreset.name,\n description: writerPreset.description,\n style: writerPreset.style\n }\n : undefined\n };\n}\n\nfunction formatContext(ctx: AiPromptContext): string {\n const sections: string[] = [];\n\n if (ctx.writerPersona) {\n sections.push(WriterPersonaSection.format(ctx.writerPersona));\n }\n if (ctx.readerPersona) {\n sections.push(ReaderPersonaSection.format(ctx.readerPersona));\n }\n if (ctx.project) {\n const projectText = ProjectSection.format(ctx.project);\n if (projectText) {\n sections.push(projectText);\n }\n }\n return sections.length > 0 ? \"\\n\\n\" + sections.join(\"\\n\\n\") : \"\";\n}\n\nfunction emptyContext(warnings: string[]): AiPromptContext {\n return {\n project: undefined,\n readerPersona: undefined,\n writerPersona: undefined,\n allProjectFiles: [],\n additionalFiles: [],\n excludedFileIds: new Set(),\n cacheHit: false,\n warnings,\n toString() {\n return \"\";\n }\n };\n}\n\nclass AiPromptContextBuilderImpl implements Abstraction.Interface {\n constructor(\n private getSettings: GetSettingsUseCase.Interface,\n private fileAssembler: ProjectFileAssembler.Interface,\n private getFileContents: GetFileContentsByIdUseCase.Interface,\n private getFile: GetFileUseCase.Interface,\n private textExtractor: TextExtractor.Interface\n ) {}\n\n async execute(params: AiPromptContextParams): Promise<AiPromptContext> {\n const warnings: string[] = [];\n\n const settingsResult = await this.getSettings.execute();\n if (settingsResult.isFail()) {\n warnings.push(\"Failed to load AI PowerUps settings.\");\n return emptyContext(warnings);\n }\n\n const settings = settingsResult.value;\n const projectPreset = params.projectId\n ? settings.projects?.presets?.find(p => p.id === params.projectId)\n : undefined;\n\n const { reader, writer } = resolvePersonas(settings, projectPreset, params);\n const excludedFileIds = new Set(params.excludedFileIds ?? []);\n\n let project: ResolvedProject | undefined;\n let allProjectFiles: ProjectFileContent[] = [];\n let cacheHit = false;\n\n if (projectPreset) {\n const assembled = await this.fileAssembler.execute(\n projectPreset.id,\n projectPreset.version ?? 0,\n projectPreset.files ?? [],\n warnings\n );\n allProjectFiles = assembled.files;\n cacheHit = assembled.cacheHit;\n\n const visibleFiles =\n excludedFileIds.size > 0\n ? allProjectFiles.filter(f => !excludedFileIds.has(f.id))\n : allProjectFiles;\n\n project = {\n name: projectPreset.name,\n instructions: projectPreset.instructions,\n files: visibleFiles,\n totalTokens: visibleFiles.reduce((sum, f) => sum + f.tokenCount, 0)\n };\n }\n\n const additionalFiles = await this.fetchAdditionalFiles(params.additionalFileIds, warnings);\n if (additionalFiles.length > 0) {\n allProjectFiles = [...allProjectFiles, ...additionalFiles];\n }\n\n const ctx: AiPromptContext = {\n project,\n readerPersona: reader,\n writerPersona: writer,\n allProjectFiles,\n additionalFiles,\n excludedFileIds,\n cacheHit,\n warnings,\n toString() {\n return formatContext(this);\n }\n };\n\n return ctx;\n }\n\n private async fetchAdditionalFiles(\n fileIds: string[] | null | undefined,\n warnings: string[]\n ): Promise<ProjectFileContent[]> {\n if (!fileIds || fileIds.length === 0) {\n return [];\n }\n\n const results = await Promise.all(\n fileIds.map(async (fileId): Promise<ProjectFileContent | null> => {\n const [contentsResult, damResult] = await Promise.all([\n this.getFileContents.execute(fileId),\n this.getFile.execute(fileId)\n ]);\n\n if (contentsResult.isFail()) {\n warnings.push(\n `Failed to load additional file (${fileId}): ${contentsResult.error.message}`\n );\n return null;\n }\n\n const name = damResult.isOk() ? damResult.value.name : fileId;\n const mimeType = damResult.isOk()\n ? damResult.value.type\n : \"application/octet-stream\";\n\n if (!this.textExtractor.canExtract(mimeType)) {\n warnings.push(\n `Skipped additional file \"${name}\" (${fileId}): unsupported type \"${mimeType}\".`\n );\n return null;\n }\n\n const { text: content } = await this.textExtractor.extract(\n contentsResult.value.buffer,\n mimeType\n );\n\n return {\n id: fileId,\n name,\n content,\n description: damResult.isOk() ? damResult.value.description : undefined,\n tokenCount: Math.ceil(content.length / 4)\n };\n })\n );\n\n return results.filter((r): r is ProjectFileContent => r !== null);\n }\n}\n\nexport const AiPromptContextBuilder = Abstraction.createImplementation({\n implementation: AiPromptContextBuilderImpl,\n dependencies: [\n GetSettingsUseCase,\n ProjectFileAssembler,\n GetFileContentsByIdUseCase,\n GetFileUseCase,\n TextExtractor\n ]\n});\n"],"names":["resolvePersonas","settings","project","params","readerPersonaId","undefined","writerPersonaId","readerPreset","p","writerPreset","formatContext","ctx","sections","WriterPersonaSection","ReaderPersonaSection","projectText","ProjectSection","emptyContext","warnings","Set","AiPromptContextBuilderImpl","getSettings","fileAssembler","getFileContents","getFile","textExtractor","settingsResult","projectPreset","reader","writer","excludedFileIds","allProjectFiles","cacheHit","assembled","visibleFiles","f","sum","additionalFiles","fileIds","results","Promise","fileId","contentsResult","damResult","name","mimeType","content","Math","r","AiPromptContextBuilder","Abstraction","GetSettingsUseCase","ProjectFileAssembler","GetFileContentsByIdUseCase","GetFileUseCase","TextExtractor"],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { GetFileContentsByIdUseCase } from "@webiny/api-file-manager/features/file/GetFileContentsById/index.js";
2
+ import { GetFileUseCase } from "@webiny/api-file-manager/features/file/GetFile/index.js";
3
+ import { ProjectFileAssembler as Abstraction, ProjectFileCache, type ProjectFileContent } from "./abstractions.js";
4
+ declare class ProjectFileAssemblerImpl implements Abstraction.Interface {
5
+ private getFileContents;
6
+ private getFile;
7
+ private cache;
8
+ constructor(getFileContents: GetFileContentsByIdUseCase.Interface, getFile: GetFileUseCase.Interface, cache: ProjectFileCache.Interface);
9
+ execute(projectId: string, version: number, files: Array<{
10
+ id: string;
11
+ name: string;
12
+ mimeType: string;
13
+ }>, warnings: string[]): Promise<{
14
+ files: ProjectFileContent[];
15
+ cacheHit: boolean;
16
+ }>;
17
+ private assembleFiles;
18
+ }
19
+ export declare const ProjectFileAssembler: typeof ProjectFileAssemblerImpl & {
20
+ __abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IProjectFileAssembler>;
21
+ };
22
+ export {};
@@ -0,0 +1,76 @@
1
+ import { GetFileContentsByIdUseCase } from "@webiny/api-file-manager/features/file/GetFileContentsById/index.js";
2
+ import { GetFileUseCase } from "@webiny/api-file-manager/features/file/GetFile/index.js";
3
+ import { ProjectFileAssembler, ProjectFileCache } from "./abstractions.js";
4
+ const SUPPORTED_MIME_PREFIXES = [
5
+ "text/"
6
+ ];
7
+ const SUPPORTED_MIME_TYPES = new Set([
8
+ "application/json",
9
+ "application/csv"
10
+ ]);
11
+ function isSupportedType(mimeType) {
12
+ if (SUPPORTED_MIME_PREFIXES.some((prefix)=>mimeType.startsWith(prefix))) return true;
13
+ return SUPPORTED_MIME_TYPES.has(mimeType);
14
+ }
15
+ function estimateTokenCount(text) {
16
+ return Math.ceil(text.length / 4);
17
+ }
18
+ class ProjectFileAssemblerImpl {
19
+ constructor(getFileContents, getFile, cache){
20
+ this.getFileContents = getFileContents;
21
+ this.getFile = getFile;
22
+ this.cache = cache;
23
+ }
24
+ async execute(projectId, version, files, warnings) {
25
+ const cached = await this.cache.get(projectId, version);
26
+ if (cached.hit) return {
27
+ files: cached.files,
28
+ cacheHit: true
29
+ };
30
+ const assembled = await this.assembleFiles(files, warnings);
31
+ await this.cache.set(projectId, version, assembled);
32
+ return {
33
+ files: assembled,
34
+ cacheHit: false
35
+ };
36
+ }
37
+ async assembleFiles(files, warnings) {
38
+ const supportedFiles = files.filter((f)=>isSupportedType(f.mimeType));
39
+ if (0 === supportedFiles.length) return [];
40
+ const results = await Promise.all(supportedFiles.map(async (file)=>{
41
+ const [contentsResult, damResult] = await Promise.all([
42
+ this.getFileContents.execute(file.id),
43
+ this.getFile.execute(file.id)
44
+ ]);
45
+ if (contentsResult.isFail()) {
46
+ const msg = `Failed to load file "${file.name}" (${file.id}): ${contentsResult.error.message}`;
47
+ console.warn("ProjectFileAssembler:", msg);
48
+ warnings.push(msg);
49
+ return null;
50
+ }
51
+ const content = contentsResult.value.buffer.toString("utf-8");
52
+ let description;
53
+ if (damResult.isFail()) console.warn(`ProjectFileAssembler: failed to load DAM record for "${file.name}" (${file.id})`);
54
+ else if (damResult.value.description) description = damResult.value.description;
55
+ return {
56
+ id: file.id,
57
+ name: file.name,
58
+ content,
59
+ description,
60
+ tokenCount: estimateTokenCount(content)
61
+ };
62
+ }));
63
+ return results.filter((r)=>null !== r);
64
+ }
65
+ }
66
+ const ProjectFileAssembler_ProjectFileAssembler = ProjectFileAssembler.createImplementation({
67
+ implementation: ProjectFileAssemblerImpl,
68
+ dependencies: [
69
+ GetFileContentsByIdUseCase,
70
+ GetFileUseCase,
71
+ ProjectFileCache
72
+ ]
73
+ });
74
+ export { ProjectFileAssembler_ProjectFileAssembler as ProjectFileAssembler };
75
+
76
+ //# sourceMappingURL=ProjectFileAssembler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api/features/AiPromptContext/ProjectFileAssembler.js","sources":["../../../../src/api/features/AiPromptContext/ProjectFileAssembler.ts"],"sourcesContent":["import { GetFileContentsByIdUseCase } from \"@webiny/api-file-manager/features/file/GetFileContentsById/index.js\";\nimport { GetFileUseCase } from \"@webiny/api-file-manager/features/file/GetFile/index.js\";\nimport {\n ProjectFileAssembler as Abstraction,\n ProjectFileCache,\n type ProjectFileContent\n} from \"./abstractions.js\";\n\nconst SUPPORTED_MIME_PREFIXES = [\"text/\"];\nconst SUPPORTED_MIME_TYPES = new Set([\"application/json\", \"application/csv\"]);\n\nfunction isSupportedType(mimeType: string): boolean {\n if (SUPPORTED_MIME_PREFIXES.some(prefix => mimeType.startsWith(prefix))) {\n return true;\n }\n return SUPPORTED_MIME_TYPES.has(mimeType);\n}\n\nfunction estimateTokenCount(text: string): number {\n return Math.ceil(text.length / 4);\n}\n\nclass ProjectFileAssemblerImpl implements Abstraction.Interface {\n constructor(\n private getFileContents: GetFileContentsByIdUseCase.Interface,\n private getFile: GetFileUseCase.Interface,\n private cache: ProjectFileCache.Interface\n ) {}\n\n async execute(\n projectId: string,\n version: number,\n files: Array<{ id: string; name: string; mimeType: string }>,\n warnings: string[]\n ): Promise<{ files: ProjectFileContent[]; cacheHit: boolean }> {\n const cached = await this.cache.get(projectId, version);\n if (cached.hit) {\n return { files: cached.files, cacheHit: true };\n }\n\n const assembled = await this.assembleFiles(files, warnings);\n await this.cache.set(projectId, version, assembled);\n return { files: assembled, cacheHit: false };\n }\n\n private async assembleFiles(\n files: Array<{ id: string; name: string; mimeType: string }>,\n warnings: string[]\n ): Promise<ProjectFileContent[]> {\n const supportedFiles = files.filter(f => isSupportedType(f.mimeType));\n\n if (supportedFiles.length === 0) {\n return [];\n }\n\n const results = await Promise.all(\n supportedFiles.map(async (file): Promise<ProjectFileContent | null> => {\n const [contentsResult, damResult] = await Promise.all([\n this.getFileContents.execute(file.id),\n this.getFile.execute(file.id)\n ]);\n\n if (contentsResult.isFail()) {\n const msg = `Failed to load file \"${file.name}\" (${file.id}): ${contentsResult.error.message}`;\n console.warn(\"ProjectFileAssembler:\", msg);\n warnings.push(msg);\n return null;\n }\n\n const content = contentsResult.value.buffer.toString(\"utf-8\");\n\n let description: string | undefined;\n if (damResult.isFail()) {\n console.warn(\n `ProjectFileAssembler: failed to load DAM record for \"${file.name}\" (${file.id})`\n );\n } else if (damResult.value.description) {\n description = damResult.value.description;\n }\n\n return {\n id: file.id,\n name: file.name,\n content,\n description,\n tokenCount: estimateTokenCount(content)\n };\n })\n );\n\n return results.filter((r): r is ProjectFileContent => r !== null);\n }\n}\n\nexport const ProjectFileAssembler = Abstraction.createImplementation({\n implementation: ProjectFileAssemblerImpl,\n dependencies: [GetFileContentsByIdUseCase, GetFileUseCase, ProjectFileCache]\n});\n"],"names":["SUPPORTED_MIME_PREFIXES","SUPPORTED_MIME_TYPES","Set","isSupportedType","mimeType","prefix","estimateTokenCount","text","Math","ProjectFileAssemblerImpl","getFileContents","getFile","cache","projectId","version","files","warnings","cached","assembled","supportedFiles","f","results","Promise","file","contentsResult","damResult","msg","console","content","description","r","ProjectFileAssembler","Abstraction","GetFileContentsByIdUseCase","GetFileUseCase","ProjectFileCache"],"mappings":";;;AAQA,MAAMA,0BAA0B;IAAC;CAAQ;AACzC,MAAMC,uBAAuB,IAAIC,IAAI;IAAC;IAAoB;CAAkB;AAE5E,SAASC,gBAAgBC,QAAgB;IACrC,IAAIJ,wBAAwB,IAAI,CAACK,CAAAA,SAAUD,SAAS,UAAU,CAACC,UAC3D,OAAO;IAEX,OAAOJ,qBAAqB,GAAG,CAACG;AACpC;AAEA,SAASE,mBAAmBC,IAAY;IACpC,OAAOC,KAAK,IAAI,CAACD,KAAK,MAAM,GAAG;AACnC;AAEA,MAAME;IACF,YACYC,eAAqD,EACrDC,OAAiC,EACjCC,KAAiC,CAC3C;aAHUF,eAAe,GAAfA;aACAC,OAAO,GAAPA;aACAC,KAAK,GAALA;IACT;IAEH,MAAM,QACFC,SAAiB,EACjBC,OAAe,EACfC,KAA4D,EAC5DC,QAAkB,EACyC;QAC3D,MAAMC,SAAS,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAACJ,WAAWC;QAC/C,IAAIG,OAAO,GAAG,EACV,OAAO;YAAE,OAAOA,OAAO,KAAK;YAAE,UAAU;QAAK;QAGjD,MAAMC,YAAY,MAAM,IAAI,CAAC,aAAa,CAACH,OAAOC;QAClD,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAACH,WAAWC,SAASI;QACzC,OAAO;YAAE,OAAOA;YAAW,UAAU;QAAM;IAC/C;IAEA,MAAc,cACVH,KAA4D,EAC5DC,QAAkB,EACW;QAC7B,MAAMG,iBAAiBJ,MAAM,MAAM,CAACK,CAAAA,IAAKjB,gBAAgBiB,EAAE,QAAQ;QAEnE,IAAID,AAA0B,MAA1BA,eAAe,MAAM,EACrB,OAAO,EAAE;QAGb,MAAME,UAAU,MAAMC,QAAQ,GAAG,CAC7BH,eAAe,GAAG,CAAC,OAAOI;YACtB,MAAM,CAACC,gBAAgBC,UAAU,GAAG,MAAMH,QAAQ,GAAG,CAAC;gBAClD,IAAI,CAAC,eAAe,CAAC,OAAO,CAACC,KAAK,EAAE;gBACpC,IAAI,CAAC,OAAO,CAAC,OAAO,CAACA,KAAK,EAAE;aAC/B;YAED,IAAIC,eAAe,MAAM,IAAI;gBACzB,MAAME,MAAM,CAAC,qBAAqB,EAAEH,KAAK,IAAI,CAAC,GAAG,EAAEA,KAAK,EAAE,CAAC,GAAG,EAAEC,eAAe,KAAK,CAAC,OAAO,EAAE;gBAC9FG,QAAQ,IAAI,CAAC,yBAAyBD;gBACtCV,SAAS,IAAI,CAACU;gBACd,OAAO;YACX;YAEA,MAAME,UAAUJ,eAAe,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC;YAErD,IAAIK;YACJ,IAAIJ,UAAU,MAAM,IAChBE,QAAQ,IAAI,CACR,CAAC,qDAAqD,EAAEJ,KAAK,IAAI,CAAC,GAAG,EAAEA,KAAK,EAAE,CAAC,CAAC,CAAC;iBAElF,IAAIE,UAAU,KAAK,CAAC,WAAW,EAClCI,cAAcJ,UAAU,KAAK,CAAC,WAAW;YAG7C,OAAO;gBACH,IAAIF,KAAK,EAAE;gBACX,MAAMA,KAAK,IAAI;gBACfK;gBACAC;gBACA,YAAYvB,mBAAmBsB;YACnC;QACJ;QAGJ,OAAOP,QAAQ,MAAM,CAAC,CAACS,IAA+BA,AAAM,SAANA;IAC1D;AACJ;AAEO,MAAMC,4CAAuBC,qBAAAA,oBAAgC,CAAC;IACjE,gBAAgBvB;IAChB,cAAc;QAACwB;QAA4BC;QAAgBC;KAAiB;AAChF"}
@@ -0,0 +1,16 @@
1
+ import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
2
+ import { ProjectFileCache as Abstraction, ProjectFileContent } from "./abstractions.js";
3
+ declare class ProjectFileCacheImpl implements Abstraction.Interface {
4
+ private keyValueStore;
5
+ constructor(keyValueStore: GlobalKeyValueStore.Interface);
6
+ get(projectId: string, version: number): Promise<{
7
+ files: ProjectFileContent[];
8
+ hit: boolean;
9
+ }>;
10
+ set(projectId: string, version: number, files: ProjectFileContent[]): Promise<void>;
11
+ private cacheKey;
12
+ }
13
+ export declare const ProjectFileCache: typeof ProjectFileCacheImpl & {
14
+ __abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IProjectFileCache>;
15
+ };
16
+ export {};
@@ -0,0 +1,61 @@
1
+ import { compress, decompress } from "@webiny/utils/features/compression/legacy/gzip.js";
2
+ import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
3
+ import { ProjectFileCache } from "./abstractions.js";
4
+ const CACHE_TTL_DAYS = 30;
5
+ class ProjectFileCacheImpl {
6
+ constructor(keyValueStore){
7
+ this.keyValueStore = keyValueStore;
8
+ }
9
+ async get(projectId, version) {
10
+ const key = this.cacheKey(projectId, version);
11
+ const cached = await this.keyValueStore.get(key);
12
+ if (!cached.isFail() && cached.value) try {
13
+ const decompressed = await decompress(Buffer.from(cached.value, "base64"));
14
+ const parsed = JSON.parse(decompressed.toString("utf-8"));
15
+ return {
16
+ files: parsed.files,
17
+ hit: true
18
+ };
19
+ } catch (error) {
20
+ console.warn("ProjectFileCache: cache entry corrupted, rebuilding", {
21
+ key,
22
+ error
23
+ });
24
+ }
25
+ return {
26
+ files: [],
27
+ hit: false
28
+ };
29
+ }
30
+ async set(projectId, version, files) {
31
+ const key = this.cacheKey(projectId, version);
32
+ try {
33
+ const payload = {
34
+ files
35
+ };
36
+ const compressed = await compress(JSON.stringify(payload));
37
+ const expiresAt = new Date();
38
+ expiresAt.setDate(expiresAt.getDate() + CACHE_TTL_DAYS);
39
+ await this.keyValueStore.set(key, compressed.toString("base64"), {
40
+ expiresAt
41
+ });
42
+ } catch (error) {
43
+ console.warn("ProjectFileCache: cache write failed", {
44
+ key,
45
+ error
46
+ });
47
+ }
48
+ }
49
+ cacheKey(projectId, version) {
50
+ return `AiProjectContext/${projectId}/v${version}`;
51
+ }
52
+ }
53
+ const ProjectFileCache_ProjectFileCache = ProjectFileCache.createImplementation({
54
+ implementation: ProjectFileCacheImpl,
55
+ dependencies: [
56
+ GlobalKeyValueStore
57
+ ]
58
+ });
59
+ export { ProjectFileCache_ProjectFileCache as ProjectFileCache };
60
+
61
+ //# sourceMappingURL=ProjectFileCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api/features/AiPromptContext/ProjectFileCache.js","sources":["../../../../src/api/features/AiPromptContext/ProjectFileCache.ts"],"sourcesContent":["import { compress, decompress } from \"@webiny/utils/features/compression/legacy/gzip.js\";\nimport { GlobalKeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\nimport { ProjectFileCache as Abstraction, ProjectFileContent } from \"./abstractions.js\";\n\nconst CACHE_TTL_DAYS = 30;\n\ninterface CachedProjectContext {\n files: ProjectFileContent[];\n}\n\nclass ProjectFileCacheImpl implements Abstraction.Interface {\n constructor(private keyValueStore: GlobalKeyValueStore.Interface) {}\n\n async get(\n projectId: string,\n version: number\n ): Promise<{ files: ProjectFileContent[]; hit: boolean }> {\n const key = this.cacheKey(projectId, version);\n const cached = await this.keyValueStore.get<string>(key);\n\n if (!cached.isFail() && cached.value) {\n try {\n const decompressed = await decompress(Buffer.from(cached.value, \"base64\"));\n const parsed = JSON.parse(decompressed.toString(\"utf-8\")) as CachedProjectContext;\n return { files: parsed.files, hit: true };\n } catch (error) {\n console.warn(\"ProjectFileCache: cache entry corrupted, rebuilding\", {\n key,\n error\n });\n }\n }\n\n return { files: [], hit: false };\n }\n\n async set(projectId: string, version: number, files: ProjectFileContent[]): Promise<void> {\n const key = this.cacheKey(projectId, version);\n\n try {\n const payload: CachedProjectContext = { files };\n const compressed = await compress(JSON.stringify(payload));\n const expiresAt = new Date();\n expiresAt.setDate(expiresAt.getDate() + CACHE_TTL_DAYS);\n await this.keyValueStore.set(key, compressed.toString(\"base64\"), { expiresAt });\n } catch (error) {\n console.warn(\"ProjectFileCache: cache write failed\", { key, error });\n }\n }\n\n private cacheKey(projectId: string, version: number): string {\n return `AiProjectContext/${projectId}/v${version}`;\n }\n}\n\nexport const ProjectFileCache = Abstraction.createImplementation({\n implementation: ProjectFileCacheImpl,\n dependencies: [GlobalKeyValueStore]\n});\n"],"names":["CACHE_TTL_DAYS","ProjectFileCacheImpl","keyValueStore","projectId","version","key","cached","decompressed","decompress","Buffer","parsed","JSON","error","console","files","payload","compressed","compress","expiresAt","Date","ProjectFileCache","Abstraction","GlobalKeyValueStore"],"mappings":";;;AAIA,MAAMA,iBAAiB;AAMvB,MAAMC;IACF,YAAoBC,aAA4C,CAAE;aAA9CA,aAAa,GAAbA;IAA+C;IAEnE,MAAM,IACFC,SAAiB,EACjBC,OAAe,EACuC;QACtD,MAAMC,MAAM,IAAI,CAAC,QAAQ,CAACF,WAAWC;QACrC,MAAME,SAAS,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAASD;QAEpD,IAAI,CAACC,OAAO,MAAM,MAAMA,OAAO,KAAK,EAChC,IAAI;YACA,MAAMC,eAAe,MAAMC,WAAWC,OAAO,IAAI,CAACH,OAAO,KAAK,EAAE;YAChE,MAAMI,SAASC,KAAK,KAAK,CAACJ,aAAa,QAAQ,CAAC;YAChD,OAAO;gBAAE,OAAOG,OAAO,KAAK;gBAAE,KAAK;YAAK;QAC5C,EAAE,OAAOE,OAAO;YACZC,QAAQ,IAAI,CAAC,uDAAuD;gBAChER;gBACAO;YACJ;QACJ;QAGJ,OAAO;YAAE,OAAO,EAAE;YAAE,KAAK;QAAM;IACnC;IAEA,MAAM,IAAIT,SAAiB,EAAEC,OAAe,EAAEU,KAA2B,EAAiB;QACtF,MAAMT,MAAM,IAAI,CAAC,QAAQ,CAACF,WAAWC;QAErC,IAAI;YACA,MAAMW,UAAgC;gBAAED;YAAM;YAC9C,MAAME,aAAa,MAAMC,SAASN,KAAK,SAAS,CAACI;YACjD,MAAMG,YAAY,IAAIC;YACtBD,UAAU,OAAO,CAACA,UAAU,OAAO,KAAKlB;YACxC,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAACK,KAAKW,WAAW,QAAQ,CAAC,WAAW;gBAAEE;YAAU;QACjF,EAAE,OAAON,OAAO;YACZC,QAAQ,IAAI,CAAC,wCAAwC;gBAAER;gBAAKO;YAAM;QACtE;IACJ;IAEQ,SAAST,SAAiB,EAAEC,OAAe,EAAU;QACzD,OAAO,CAAC,iBAAiB,EAAED,UAAU,EAAE,EAAEC,SAAS;IACtD;AACJ;AAEO,MAAMgB,oCAAmBC,iBAAAA,oBAAgC,CAAC;IAC7D,gBAAgBpB;IAChB,cAAc;QAACqB;KAAoB;AACvC"}
@@ -0,0 +1,4 @@
1
+ import type { ResolvedProject } from "./abstractions.js";
2
+ export declare class ProjectSection {
3
+ static format(project: ResolvedProject): string;
4
+ }
@@ -0,0 +1,35 @@
1
+ class ProjectSection {
2
+ static format(project) {
3
+ const hasInstructions = !!project.instructions;
4
+ const hasFiles = project.files.length > 0;
5
+ if (!hasInstructions && !hasFiles) return "";
6
+ const parts = [
7
+ `## Project: ${project.name}`
8
+ ];
9
+ if (hasInstructions) parts.push(project.instructions);
10
+ if (hasFiles) parts.push([
11
+ "### Available reference files",
12
+ "",
13
+ `You have access to ${project.files.length} reference files for this project. Use the`,
14
+ "`read_project_file` tool to read any file when its contents are relevant",
15
+ "to the user's request. Read files only when needed — do not read all files",
16
+ "preemptively.",
17
+ "",
18
+ "Files:",
19
+ "",
20
+ ...project.files.map((file)=>{
21
+ const lines = [
22
+ `- id: "${file.id}"`,
23
+ ` name: "${file.name}"`,
24
+ ` description: "${file.description || "(no description)"}"`,
25
+ ` tokens: ~${file.tokenCount}`
26
+ ];
27
+ return lines.join("\n");
28
+ })
29
+ ].join("\n"));
30
+ return parts.join("\n\n");
31
+ }
32
+ }
33
+ export { ProjectSection };
34
+
35
+ //# sourceMappingURL=ProjectSection.js.map