@webiny/ai-powerups 6.4.12-beta.5 → 6.5.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 (336) hide show
  1. package/admin/Extension.js +7 -1
  2. package/admin/Extension.js.map +1 -1
  3. package/admin/domain/modelRoles.d.ts +17 -0
  4. package/admin/domain/modelRoles.js +8 -0
  5. package/admin/domain/modelRoles.js.map +1 -0
  6. package/admin/features/compareEntryRevisions/CompareEntryRevisionsGateway.d.ts +12 -0
  7. package/admin/features/compareEntryRevisions/CompareEntryRevisionsGateway.js +46 -0
  8. package/admin/features/compareEntryRevisions/CompareEntryRevisionsGateway.js.map +1 -0
  9. package/admin/features/compareEntryRevisions/CompareEntryRevisionsRepository.d.ts +11 -0
  10. package/admin/features/compareEntryRevisions/CompareEntryRevisionsRepository.js +18 -0
  11. package/admin/features/compareEntryRevisions/CompareEntryRevisionsRepository.js.map +1 -0
  12. package/admin/features/compareEntryRevisions/CompareEntryRevisionsUseCase.d.ts +11 -0
  13. package/admin/features/compareEntryRevisions/CompareEntryRevisionsUseCase.js +18 -0
  14. package/admin/features/compareEntryRevisions/CompareEntryRevisionsUseCase.js.map +1 -0
  15. package/admin/features/compareEntryRevisions/abstractions.d.ts +32 -0
  16. package/admin/features/compareEntryRevisions/abstractions.js +7 -0
  17. package/admin/features/compareEntryRevisions/abstractions.js.map +1 -0
  18. package/admin/features/compareEntryRevisions/feature.d.ts +1 -0
  19. package/admin/features/compareEntryRevisions/feature.js +15 -0
  20. package/admin/features/compareEntryRevisions/feature.js.map +1 -0
  21. package/admin/features/compareEntryRevisions/index.d.ts +2 -0
  22. package/admin/features/compareEntryRevisions/index.js +2 -0
  23. package/admin/features/feature.js +4 -0
  24. package/admin/features/feature.js.map +1 -1
  25. package/admin/features/generateEntryContent/GenerateEntryContentGateway.d.ts +12 -0
  26. package/admin/features/generateEntryContent/GenerateEntryContentGateway.js +45 -0
  27. package/admin/features/generateEntryContent/GenerateEntryContentGateway.js.map +1 -0
  28. package/admin/features/generateEntryContent/GenerateEntryContentUseCase.d.ts +11 -0
  29. package/admin/features/generateEntryContent/GenerateEntryContentUseCase.js +18 -0
  30. package/admin/features/generateEntryContent/GenerateEntryContentUseCase.js.map +1 -0
  31. package/admin/features/generateEntryContent/abstractions.d.ts +24 -0
  32. package/admin/features/generateEntryContent/abstractions.js +6 -0
  33. package/admin/features/generateEntryContent/abstractions.js.map +1 -0
  34. package/admin/features/generateEntryContent/feature.d.ts +1 -0
  35. package/admin/features/generateEntryContent/feature.js +13 -0
  36. package/admin/features/generateEntryContent/feature.js.map +1 -0
  37. package/admin/features/generateEntryContent/index.d.ts +3 -0
  38. package/admin/features/generateEntryContent/index.js +2 -0
  39. package/admin/features/generatePageContent/GeneratePageContentGateway.js +2 -0
  40. package/admin/features/generatePageContent/GeneratePageContentGateway.js.map +1 -1
  41. package/admin/features/generatePageContent/abstractions.d.ts +1 -0
  42. package/admin/features/generatePageContent/abstractions.js.map +1 -1
  43. package/admin/features/listCapabilities/ListCapabilitiesGateway.d.ts +12 -0
  44. package/admin/features/listCapabilities/ListCapabilitiesGateway.js +34 -0
  45. package/admin/features/listCapabilities/ListCapabilitiesGateway.js.map +1 -0
  46. package/admin/features/listCapabilities/ListCapabilitiesRepository.d.ts +13 -0
  47. package/admin/features/listCapabilities/ListCapabilitiesRepository.js +27 -0
  48. package/admin/features/listCapabilities/ListCapabilitiesRepository.js.map +1 -0
  49. package/admin/features/listCapabilities/ListCapabilitiesUseCase.d.ts +10 -0
  50. package/admin/features/listCapabilities/ListCapabilitiesUseCase.js +18 -0
  51. package/admin/features/listCapabilities/ListCapabilitiesUseCase.js.map +1 -0
  52. package/admin/features/listCapabilities/abstractions.d.ts +28 -0
  53. package/admin/features/listCapabilities/abstractions.js +7 -0
  54. package/admin/features/listCapabilities/abstractions.js.map +1 -0
  55. package/admin/features/listCapabilities/feature.d.ts +3 -0
  56. package/admin/features/listCapabilities/feature.js +21 -0
  57. package/admin/features/listCapabilities/feature.js.map +1 -0
  58. package/admin/features/listCapabilities/index.d.ts +3 -0
  59. package/admin/features/listCapabilities/index.js +2 -0
  60. package/admin/features/listModels/ListModelsGateway.js +18 -1
  61. package/admin/features/listModels/ListModelsGateway.js.map +1 -1
  62. package/admin/features/listModels/abstractions.d.ts +2 -0
  63. package/admin/features/listModels/abstractions.js.map +1 -1
  64. package/admin/features/settings/shared/abstractions.d.ts +58 -25
  65. package/admin/features/settings/shared/abstractions.js.map +1 -1
  66. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPage.d.ts +2 -2
  67. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPage.js +3 -4
  68. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPage.js.map +1 -1
  69. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPresenter.js +13 -1
  70. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPresenter.js.map +1 -1
  71. package/admin/presentation/AiPowerUpsSettings/feature.js +6 -2
  72. package/admin/presentation/AiPowerUpsSettings/feature.js.map +1 -1
  73. package/admin/presentation/AiPowerUpsSettings/hasUsableModel.d.ts +13 -0
  74. package/admin/presentation/AiPowerUpsSettings/hasUsableModel.js +9 -0
  75. package/admin/presentation/AiPowerUpsSettings/hasUsableModel.js.map +1 -0
  76. package/admin/presentation/AiPowerUpsSettings/index.d.ts +1 -0
  77. package/admin/presentation/AiPowerUpsSettings/index.js +1 -0
  78. package/admin/presentation/AiPowerUpsSettings/settingsGroup.d.ts +6 -0
  79. package/admin/presentation/AiPowerUpsSettings/settingsGroup.js.map +1 -1
  80. package/admin/presentation/AiPromptFormFactory/AiPromptFormFactory.d.ts +20 -0
  81. package/admin/presentation/AiPromptFormFactory/AiPromptFormFactory.js +108 -0
  82. package/admin/presentation/AiPromptFormFactory/AiPromptFormFactory.js.map +1 -0
  83. package/admin/presentation/AiPromptFormFactory/abstractions.d.ts +14 -0
  84. package/admin/presentation/AiPromptFormFactory/abstractions.js +5 -0
  85. package/admin/presentation/AiPromptFormFactory/abstractions.js.map +1 -0
  86. package/admin/presentation/AiPromptFormFactory/feature.d.ts +1 -0
  87. package/admin/presentation/AiPromptFormFactory/feature.js +11 -0
  88. package/admin/presentation/AiPromptFormFactory/feature.js.map +1 -0
  89. package/admin/presentation/CapabilitiesSettings.d.ts +39 -0
  90. package/admin/presentation/CapabilitiesSettings.js +104 -0
  91. package/admin/presentation/CapabilitiesSettings.js.map +1 -0
  92. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDialog.d.ts +9 -0
  93. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDialog.js +118 -0
  94. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDialog.js.map +1 -0
  95. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDrawer.d.ts +9 -0
  96. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDrawer.js +72 -0
  97. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsDrawer.js.map +1 -0
  98. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsMenuItem.d.ts +4 -0
  99. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsMenuItem.js +21 -0
  100. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsMenuItem.js.map +1 -0
  101. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsOverlays.d.ts +2 -0
  102. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsOverlays.js +17 -0
  103. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsOverlays.js.map +1 -0
  104. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsPresenter.d.ts +25 -0
  105. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsPresenter.js +90 -0
  106. package/admin/presentation/CmsCompareEntryRevisions/CmsCompareEntryRevisionsPresenter.js.map +1 -0
  107. package/admin/presentation/CmsCompareEntryRevisions/Extension.d.ts +2 -0
  108. package/admin/presentation/CmsCompareEntryRevisions/Extension.js +16 -0
  109. package/admin/presentation/CmsCompareEntryRevisions/Extension.js.map +1 -0
  110. package/admin/presentation/CmsCompareEntryRevisions/abstractions.d.ts +29 -0
  111. package/admin/presentation/CmsCompareEntryRevisions/abstractions.js +5 -0
  112. package/admin/presentation/CmsCompareEntryRevisions/abstractions.js.map +1 -0
  113. package/admin/presentation/CmsCompareEntryRevisions/feature.d.ts +3 -0
  114. package/admin/presentation/CmsCompareEntryRevisions/feature.js +17 -0
  115. package/admin/presentation/CmsCompareEntryRevisions/feature.js.map +1 -0
  116. package/admin/presentation/CmsContentGeneration/CmsGenerateContentButton.d.ts +4 -0
  117. package/admin/presentation/CmsContentGeneration/CmsGenerateContentButton.js +27 -0
  118. package/admin/presentation/CmsContentGeneration/CmsGenerateContentButton.js.map +1 -0
  119. package/admin/presentation/CmsContentGeneration/CmsGenerateContentDialog.d.ts +5 -0
  120. package/admin/presentation/CmsContentGeneration/CmsGenerateContentDialog.js +106 -0
  121. package/admin/presentation/CmsContentGeneration/CmsGenerateContentDialog.js.map +1 -0
  122. package/admin/presentation/CmsContentGeneration/CmsGenerateContentPresenter.d.ts +29 -0
  123. package/admin/presentation/CmsContentGeneration/CmsGenerateContentPresenter.js +120 -0
  124. package/admin/presentation/CmsContentGeneration/CmsGenerateContentPresenter.js.map +1 -0
  125. package/admin/presentation/CmsContentGeneration/Extension.d.ts +2 -0
  126. package/admin/presentation/CmsContentGeneration/Extension.js +27 -0
  127. package/admin/presentation/CmsContentGeneration/Extension.js.map +1 -0
  128. package/admin/presentation/CmsContentGeneration/abstractions.d.ts +20 -0
  129. package/admin/presentation/CmsContentGeneration/abstractions.js +5 -0
  130. package/admin/presentation/CmsContentGeneration/abstractions.js.map +1 -0
  131. package/admin/presentation/CmsContentGeneration/feature.d.ts +3 -0
  132. package/admin/presentation/CmsContentGeneration/feature.js +17 -0
  133. package/admin/presentation/CmsContentGeneration/feature.js.map +1 -0
  134. package/admin/presentation/CmsEntryWizard/CmsEntryWizard.d.ts +4 -0
  135. package/admin/presentation/CmsEntryWizard/CmsEntryWizard.js +113 -0
  136. package/admin/presentation/CmsEntryWizard/CmsEntryWizard.js.map +1 -0
  137. package/admin/presentation/CmsEntryWizard/CmsEntryWizardGate.d.ts +4 -0
  138. package/admin/presentation/CmsEntryWizard/CmsEntryWizardGate.js +19 -0
  139. package/admin/presentation/CmsEntryWizard/CmsEntryWizardGate.js.map +1 -0
  140. package/admin/presentation/CmsEntryWizard/Extension.d.ts +2 -0
  141. package/admin/presentation/CmsEntryWizard/Extension.js +10 -0
  142. package/admin/presentation/CmsEntryWizard/Extension.js.map +1 -0
  143. package/admin/presentation/ConnectionsSettings.d.ts +25 -0
  144. package/admin/presentation/ConnectionsSettings.js +52 -0
  145. package/admin/presentation/ConnectionsSettings.js.map +1 -0
  146. package/admin/presentation/ModelRolesSettings.d.ts +29 -0
  147. package/admin/presentation/ModelRolesSettings.js +67 -0
  148. package/admin/presentation/ModelRolesSettings.js.map +1 -0
  149. package/admin/presentation/ProjectsSettings.js +4 -4
  150. package/admin/presentation/ProjectsSettings.js.map +1 -1
  151. package/admin/presentation/ProvidersSettings.js +1 -1
  152. package/admin/presentation/ProvidersSettings.js.map +1 -1
  153. package/admin/presentation/WbContentGeneration/GenerateContentButton.js +2 -2
  154. package/admin/presentation/WbContentGeneration/GenerateContentButton.js.map +1 -1
  155. package/admin/presentation/WbContentGeneration/GenerateContentDialog.d.ts +2 -2
  156. package/admin/presentation/WbContentGeneration/GenerateContentDialog.js +2 -2
  157. package/admin/presentation/WbContentGeneration/GenerateContentDialog.js.map +1 -1
  158. package/admin/presentation/WbContentGeneration/GenerateContentPresenter.d.ts +4 -12
  159. package/admin/presentation/WbContentGeneration/GenerateContentPresenter.js +12 -94
  160. package/admin/presentation/WbContentGeneration/GenerateContentPresenter.js.map +1 -1
  161. package/admin/presentation/modelRoles.d.ts +10 -0
  162. package/admin/presentation/modelRoles.js +23 -0
  163. package/admin/presentation/modelRoles.js.map +1 -0
  164. package/api/Extension.js +16 -0
  165. package/api/Extension.js.map +1 -1
  166. package/api/features/AiImageEnrichment/AiImageEnrichmentTask.d.ts +10 -8
  167. package/api/features/AiImageEnrichment/AiImageEnrichmentTask.js +37 -42
  168. package/api/features/AiImageEnrichment/AiImageEnrichmentTask.js.map +1 -1
  169. package/api/features/AiImageEnrichment/capability.d.ts +13 -0
  170. package/api/features/AiImageEnrichment/capability.js +19 -0
  171. package/api/features/AiImageEnrichment/capability.js.map +1 -0
  172. package/api/features/AiImageEnrichment/feature.js +2 -0
  173. package/api/features/AiImageEnrichment/feature.js.map +1 -1
  174. package/api/features/AiPromptContext/AiPromptContextBuilder.d.ts +8 -1
  175. package/api/features/AiPromptContext/AiPromptContextBuilder.js +46 -2
  176. package/api/features/AiPromptContext/AiPromptContextBuilder.js.map +1 -1
  177. package/api/features/AiPromptContext/abstractions.d.ts +3 -0
  178. package/api/features/AiPromptContext/abstractions.js +9 -1
  179. package/api/features/AiPromptContext/abstractions.js.map +1 -1
  180. package/api/features/AiPromptContext/index.d.ts +1 -1
  181. package/api/features/AiPromptContext/index.js +1 -1
  182. package/api/features/Capabilities/CapabilitiesHandler.d.ts +28 -0
  183. package/api/features/Capabilities/CapabilitiesHandler.js +56 -0
  184. package/api/features/Capabilities/CapabilitiesHandler.js.map +1 -0
  185. package/api/features/Capabilities/ListAiCapabilitiesUseCase.d.ts +18 -0
  186. package/api/features/Capabilities/ListAiCapabilitiesUseCase.js +28 -0
  187. package/api/features/Capabilities/ListAiCapabilitiesUseCase.js.map +1 -0
  188. package/api/features/Capabilities/ResolveAiCapabilityUseCase.d.ts +30 -0
  189. package/api/features/Capabilities/ResolveAiCapabilityUseCase.js +88 -0
  190. package/api/features/Capabilities/ResolveAiCapabilityUseCase.js.map +1 -0
  191. package/api/features/Capabilities/abstractions.d.ts +77 -0
  192. package/api/features/Capabilities/abstractions.js +7 -0
  193. package/api/features/Capabilities/abstractions.js.map +1 -0
  194. package/api/features/Capabilities/composeSystemPrompt.d.ts +14 -0
  195. package/api/features/Capabilities/composeSystemPrompt.js +13 -0
  196. package/api/features/Capabilities/composeSystemPrompt.js.map +1 -0
  197. package/api/features/Capabilities/feature.d.ts +4 -0
  198. package/api/features/Capabilities/feature.js +15 -0
  199. package/api/features/Capabilities/feature.js.map +1 -0
  200. package/api/features/Capabilities/index.d.ts +5 -0
  201. package/api/features/Capabilities/index.js +3 -0
  202. package/api/features/Capabilities/types.d.ts +86 -0
  203. package/api/features/Capabilities/types.js +4 -0
  204. package/api/features/Capabilities/types.js.map +1 -0
  205. package/api/features/CmsCompareEntryRevisions/CmsCompareEntryRevisionsUseCase.d.ts +20 -0
  206. package/api/features/CmsCompareEntryRevisions/CmsCompareEntryRevisionsUseCase.js +82 -0
  207. package/api/features/CmsCompareEntryRevisions/CmsCompareEntryRevisionsUseCase.js.map +1 -0
  208. package/api/features/CmsCompareEntryRevisions/abstractions.d.ts +18 -0
  209. package/api/features/CmsCompareEntryRevisions/abstractions.js +5 -0
  210. package/api/features/CmsCompareEntryRevisions/abstractions.js.map +1 -0
  211. package/api/features/CmsCompareEntryRevisions/capability.d.ts +13 -0
  212. package/api/features/CmsCompareEntryRevisions/capability.js +64 -0
  213. package/api/features/CmsCompareEntryRevisions/capability.js.map +1 -0
  214. package/api/features/CmsCompareEntryRevisions/feature.d.ts +4 -0
  215. package/api/features/CmsCompareEntryRevisions/feature.js +13 -0
  216. package/api/features/CmsCompareEntryRevisions/feature.js.map +1 -0
  217. package/api/features/CmsCompareEntryRevisions/index.d.ts +2 -0
  218. package/api/features/CmsCompareEntryRevisions/index.js +2 -0
  219. package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentTask.d.ts +33 -0
  220. package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentTask.js +84 -0
  221. package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentTask.js.map +1 -0
  222. package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentUseCase.d.ts +27 -0
  223. package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentUseCase.js +133 -0
  224. package/api/features/CmsGenerateEntryContent/CmsGenerateEntryContentUseCase.js.map +1 -0
  225. package/api/features/CmsGenerateEntryContent/abstractions.d.ts +36 -0
  226. package/api/features/CmsGenerateEntryContent/abstractions.js +5 -0
  227. package/api/features/CmsGenerateEntryContent/abstractions.js.map +1 -0
  228. package/api/features/CmsGenerateEntryContent/buildPrompt.d.ts +2 -0
  229. package/api/features/CmsGenerateEntryContent/buildPrompt.js +61 -0
  230. package/api/features/CmsGenerateEntryContent/buildPrompt.js.map +1 -0
  231. package/api/features/CmsGenerateEntryContent/capability.d.ts +17 -0
  232. package/api/features/CmsGenerateEntryContent/capability.js +17 -0
  233. package/api/features/CmsGenerateEntryContent/capability.js.map +1 -0
  234. package/api/features/CmsGenerateEntryContent/feature.d.ts +4 -0
  235. package/api/features/CmsGenerateEntryContent/feature.js +15 -0
  236. package/api/features/CmsGenerateEntryContent/feature.js.map +1 -0
  237. package/api/features/CmsGenerateEntryContent/index.d.ts +1 -0
  238. package/api/features/CmsGenerateEntryContent/index.js +1 -0
  239. package/api/features/CmsGenerateEntryContent/injectDynamicZoneTypenames.d.ts +2 -0
  240. package/api/features/CmsGenerateEntryContent/injectDynamicZoneTypenames.js +30 -0
  241. package/api/features/CmsGenerateEntryContent/injectDynamicZoneTypenames.js.map +1 -0
  242. package/api/features/CmsResolveImageTool/CmsResolveImageTool.d.ts +14 -0
  243. package/api/features/CmsResolveImageTool/CmsResolveImageTool.js +27 -0
  244. package/api/features/CmsResolveImageTool/CmsResolveImageTool.js.map +1 -0
  245. package/api/features/CmsResolveImageTool/feature.d.ts +4 -0
  246. package/api/features/CmsResolveImageTool/feature.js +11 -0
  247. package/api/features/CmsResolveImageTool/feature.js.map +1 -0
  248. package/api/features/Connections/ConnectionsGraphQLMapper.d.ts +20 -0
  249. package/api/features/Connections/ConnectionsGraphQLMapper.js +37 -0
  250. package/api/features/Connections/ConnectionsGraphQLMapper.js.map +1 -0
  251. package/api/features/Connections/ConnectionsHandler.d.ts +25 -0
  252. package/api/features/Connections/ConnectionsHandler.js +84 -0
  253. package/api/features/Connections/ConnectionsHandler.js.map +1 -0
  254. package/api/features/Connections/feature.d.ts +4 -0
  255. package/api/features/Connections/feature.js +13 -0
  256. package/api/features/Connections/feature.js.map +1 -0
  257. package/api/features/Connections/index.d.ts +2 -0
  258. package/api/features/Connections/index.js +1 -0
  259. package/api/features/Connections/legacyProviders.d.ts +26 -0
  260. package/api/features/Connections/legacyProviders.js +9 -0
  261. package/api/features/Connections/legacyProviders.js.map +1 -0
  262. package/api/features/Connections/types.d.ts +36 -0
  263. package/api/features/Connections/types.js +0 -0
  264. package/api/features/GetSettings/GetSettingsRepository.js +1 -1
  265. package/api/features/GetSettings/GetSettingsRepository.js.map +1 -1
  266. package/api/features/GetSettings/index.d.ts +1 -0
  267. package/api/features/GetSettings/index.js +1 -0
  268. package/api/features/ModelRoles/ModelRolesHandler.d.ts +15 -0
  269. package/api/features/ModelRoles/ModelRolesHandler.js +68 -0
  270. package/api/features/ModelRoles/ModelRolesHandler.js.map +1 -0
  271. package/api/features/ModelRoles/feature.d.ts +4 -0
  272. package/api/features/ModelRoles/feature.js +11 -0
  273. package/api/features/ModelRoles/feature.js.map +1 -0
  274. package/api/features/ModelRoles/index.d.ts +4 -0
  275. package/api/features/ModelRoles/index.js +2 -0
  276. package/api/features/ModelRoles/roles.d.ts +16 -0
  277. package/api/features/ModelRoles/roles.js +9 -0
  278. package/api/features/ModelRoles/roles.js.map +1 -0
  279. package/api/features/ModelRoles/types.d.ts +21 -0
  280. package/api/features/ModelRoles/types.js +7 -0
  281. package/api/features/ModelRoles/types.js.map +1 -0
  282. package/api/features/Providers/ProvidersHandler.js.map +1 -1
  283. package/api/features/Providers/types.d.ts +2 -2
  284. package/api/features/UpdateSettings/UpdateSettingsRepository.js +2 -2
  285. package/api/features/UpdateSettings/UpdateSettingsRepository.js.map +1 -1
  286. package/api/features/WbGeneratePageContent/WbGeneratePageContentTask.d.ts +4 -3
  287. package/api/features/WbGeneratePageContent/WbGeneratePageContentTask.js +25 -15
  288. package/api/features/WbGeneratePageContent/WbGeneratePageContentTask.js.map +1 -1
  289. package/api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.d.ts +3 -5
  290. package/api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.js +16 -23
  291. package/api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.js.map +1 -1
  292. package/api/features/WbGeneratePageContent/abstractions.d.ts +1 -0
  293. package/api/features/WbGeneratePageContent/abstractions.js.map +1 -1
  294. package/api/features/WbGeneratePageContent/capability.d.ts +16 -0
  295. package/api/features/WbGeneratePageContent/capability.js +17 -0
  296. package/api/features/WbGeneratePageContent/capability.js.map +1 -0
  297. package/api/features/WbGeneratePageContent/feature.js +2 -0
  298. package/api/features/WbGeneratePageContent/feature.js.map +1 -1
  299. package/api/features/WbTranslatePage/LexicalParser.d.ts +10 -0
  300. package/api/features/WbTranslatePage/LexicalParser.js +37 -0
  301. package/api/features/WbTranslatePage/LexicalParser.js.map +1 -0
  302. package/api/features/WbTranslatePage/WbTranslatePageDecorator.d.ts +29 -0
  303. package/api/features/WbTranslatePage/WbTranslatePageDecorator.js +143 -0
  304. package/api/features/WbTranslatePage/WbTranslatePageDecorator.js.map +1 -0
  305. package/api/features/WbTranslatePage/abstractions/LexicalParser.d.ts +7 -0
  306. package/api/features/WbTranslatePage/abstractions/LexicalParser.js +5 -0
  307. package/api/features/WbTranslatePage/abstractions/LexicalParser.js.map +1 -0
  308. package/api/features/WbTranslatePage/capability.d.ts +13 -0
  309. package/api/features/WbTranslatePage/capability.js +19 -0
  310. package/api/features/WbTranslatePage/capability.js.map +1 -0
  311. package/api/features/WbTranslatePage/feature.d.ts +4 -0
  312. package/api/features/WbTranslatePage/feature.js +15 -0
  313. package/api/features/WbTranslatePage/feature.js.map +1 -0
  314. package/api/features/WbTranslatePage/index.d.ts +2 -0
  315. package/api/features/WbTranslatePage/index.js +2 -0
  316. package/api/features/shared/abstractions.d.ts +6 -1
  317. package/api/features/shared/abstractions.js.map +1 -1
  318. package/api/features/shared/modelId.d.ts +11 -0
  319. package/api/features/shared/modelId.js +4 -0
  320. package/api/features/shared/modelId.js.map +1 -0
  321. package/api/graphql/BaseGraphQLSchema.js +58 -1
  322. package/api/graphql/BaseGraphQLSchema.js.map +1 -1
  323. package/api/graphql/CmsCompareEntryRevisionsSchema.d.ts +8 -0
  324. package/api/graphql/CmsCompareEntryRevisionsSchema.js +68 -0
  325. package/api/graphql/CmsCompareEntryRevisionsSchema.js.map +1 -0
  326. package/api/types.d.ts +3 -0
  327. package/api/types.js +3 -0
  328. package/{api/features/WbGeneratePageContent → domain}/LlmJsonResponse.d.ts +1 -0
  329. package/{api/features/WbGeneratePageContent → domain}/LlmJsonResponse.js +3 -0
  330. package/domain/LlmJsonResponse.js.map +1 -0
  331. package/exports/admin/ai-powerups.d.ts +1 -0
  332. package/exports/admin/ai-powerups.js +1 -0
  333. package/exports/api/ai-powerups.d.ts +2 -0
  334. package/exports/api/ai-powerups.js +2 -0
  335. package/package.json +33 -26
  336. package/api/features/WbGeneratePageContent/LlmJsonResponse.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"api/Extension.js","sources":["../../src/api/Extension.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { WcpContext } from \"@webiny/api-core/features/wcp/WcpContext/index.js\";\nimport { BaseGraphQLSchema } from \"./graphql/BaseGraphQLSchema.js\";\nimport AiPowerUpsSettingsGraphQLMapperImpl from \"./graphql/AiPowerUpsSettingsGraphQLMapper.js\";\nimport { AiPowerUpsSettingsCache } from \"./features/shared/SettingsCache.js\";\nimport { GetSettingsFeature } from \"./features/GetSettings/feature.js\";\nimport { UpdateSettingsFeature } from \"./features/UpdateSettings/feature.js\";\nimport { WbGeneratePageContentFeature } from \"./features/WbGeneratePageContent/feature.js\";\nimport { ProvidersFeature } from \"./features/Providers/feature.js\";\nimport { ReaderPersonasFeature } from \"./features/ReaderPersonas/feature.js\";\nimport { WriterPersonasFeature } from \"./features/WriterPersonas/feature.js\";\nimport { ProjectsFeature } from \"./features/Projects/feature.js\";\nimport { AiPromptContextFeature } from \"./features/AiPromptContext/feature.js\";\nimport { AiImageEnrichmentFeature } from \"./features/AiImageEnrichment/feature.js\";\nimport { ExtractFrontmatterFeature } from \"./features/ExtractFrontmatter/feature.js\";\n\nexport const Extension = createFeature({\n name: \"AiPowerUps\",\n register(container) {\n container.register(AiPowerUpsSettingsCache).inSingletonScope();\n\n GetSettingsFeature.register(container);\n UpdateSettingsFeature.register(container);\n ProvidersFeature.register(container);\n ReaderPersonasFeature.register(container);\n WriterPersonasFeature.register(container);\n ProjectsFeature.register(container);\n AiPromptContextFeature.register(container);\n WbGeneratePageContentFeature.register(container);\n ExtractFrontmatterFeature.register(container);\n\n const wcp = container.resolve(WcpContext);\n if (wcp.canUseAiImageEnrichment()) {\n AiImageEnrichmentFeature.register(container);\n }\n\n container.register(AiPowerUpsSettingsGraphQLMapperImpl).inSingletonScope();\n container.register(BaseGraphQLSchema);\n }\n});\n"],"names":["Extension","createFeature","container","AiPowerUpsSettingsCache","GetSettingsFeature","UpdateSettingsFeature","ProvidersFeature","ReaderPersonasFeature","WriterPersonasFeature","ProjectsFeature","AiPromptContextFeature","WbGeneratePageContentFeature","ExtractFrontmatterFeature","wcp","WcpContext","AiImageEnrichmentFeature","AiPowerUpsSettingsGraphQLMapperImpl","BaseGraphQLSchema"],"mappings":";;;;;;;;;;;;;;;AAgBO,MAAMA,YAAYC,cAAc;IACnC,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC,yBAAyB,gBAAgB;QAE5DC,mBAAmB,QAAQ,CAACF;QAC5BG,sBAAsB,QAAQ,CAACH;QAC/BI,iBAAiB,QAAQ,CAACJ;QAC1BK,sBAAsB,QAAQ,CAACL;QAC/BM,sBAAsB,QAAQ,CAACN;QAC/BO,gBAAgB,QAAQ,CAACP;QACzBQ,uBAAuB,QAAQ,CAACR;QAChCS,6BAA6B,QAAQ,CAACT;QACtCU,0BAA0B,QAAQ,CAACV;QAEnC,MAAMW,MAAMX,UAAU,OAAO,CAACY;QAC9B,IAAID,IAAI,uBAAuB,IAC3BE,yBAAyB,QAAQ,CAACb;QAGtCA,UAAU,QAAQ,CAACc,iCAAqC,gBAAgB;QACxEd,UAAU,QAAQ,CAACe;IACvB;AACJ"}
1
+ {"version":3,"file":"api/Extension.js","sources":["../../src/api/Extension.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { WcpContext } from \"@webiny/api-core/features/wcp/WcpContext/index.js\";\nimport { BaseGraphQLSchema } from \"./graphql/BaseGraphQLSchema.js\";\nimport AiPowerUpsSettingsGraphQLMapperImpl from \"./graphql/AiPowerUpsSettingsGraphQLMapper.js\";\nimport { AiPowerUpsSettingsCache } from \"./features/shared/SettingsCache.js\";\nimport { GetSettingsFeature } from \"./features/GetSettings/feature.js\";\nimport { UpdateSettingsFeature } from \"./features/UpdateSettings/feature.js\";\nimport { WbGeneratePageContentFeature } from \"./features/WbGeneratePageContent/feature.js\";\nimport { ProvidersFeature } from \"./features/Providers/feature.js\";\nimport { ConnectionsFeature } from \"./features/Connections/feature.js\";\nimport { ModelRolesFeature } from \"./features/ModelRoles/feature.js\";\nimport { CapabilitiesFeature } from \"./features/Capabilities/feature.js\";\nimport { ReaderPersonasFeature } from \"./features/ReaderPersonas/feature.js\";\nimport { WriterPersonasFeature } from \"./features/WriterPersonas/feature.js\";\nimport { ProjectsFeature } from \"./features/Projects/feature.js\";\nimport { AiPromptContextFeature } from \"./features/AiPromptContext/feature.js\";\nimport { AiImageEnrichmentFeature } from \"./features/AiImageEnrichment/feature.js\";\nimport { ExtractFrontmatterFeature } from \"./features/ExtractFrontmatter/feature.js\";\nimport { CmsGenerateEntryContentFeature } from \"./features/CmsGenerateEntryContent/feature.js\";\nimport { CmsResolveImageToolFeature } from \"./features/CmsResolveImageTool/feature.js\";\nimport { CmsCompareEntryRevisionsFeature } from \"./features/CmsCompareEntryRevisions/feature.js\";\nimport { WbTranslatePageFeature } from \"./features/WbTranslatePage/feature.js\";\nimport { CmsCompareEntryRevisionsSchema } from \"./graphql/CmsCompareEntryRevisionsSchema.js\";\n\nexport const Extension = createFeature({\n name: \"AiPowerUps\",\n register(container) {\n container.register(AiPowerUpsSettingsCache).inSingletonScope();\n\n GetSettingsFeature.register(container);\n UpdateSettingsFeature.register(container);\n /*\n * `ProvidersFeature` is still registered so the legacy `providers` section keeps round-\n * tripping through storage. `Connections` and `ModelRoles` read it once to seed\n * themselves; nothing else does. It goes away with the next breaking release.\n */\n ProvidersFeature.register(container);\n ConnectionsFeature.register(container);\n ModelRolesFeature.register(container);\n CapabilitiesFeature.register(container);\n ReaderPersonasFeature.register(container);\n WriterPersonasFeature.register(container);\n ProjectsFeature.register(container);\n AiPromptContextFeature.register(container);\n WbGeneratePageContentFeature.register(container);\n CmsGenerateEntryContentFeature.register(container);\n CmsResolveImageToolFeature.register(container);\n ExtractFrontmatterFeature.register(container);\n\n const wcp = container.resolve(WcpContext);\n if (wcp.canUseAiImageEnrichment()) {\n AiImageEnrichmentFeature.register(container);\n }\n\n CmsCompareEntryRevisionsFeature.register(container);\n WbTranslatePageFeature.register(container);\n\n container.register(AiPowerUpsSettingsGraphQLMapperImpl).inSingletonScope();\n container.register(BaseGraphQLSchema);\n container.register(CmsCompareEntryRevisionsSchema);\n }\n});\n"],"names":["Extension","createFeature","container","AiPowerUpsSettingsCache","GetSettingsFeature","UpdateSettingsFeature","ProvidersFeature","ConnectionsFeature","ModelRolesFeature","CapabilitiesFeature","ReaderPersonasFeature","WriterPersonasFeature","ProjectsFeature","AiPromptContextFeature","WbGeneratePageContentFeature","CmsGenerateEntryContentFeature","CmsResolveImageToolFeature","ExtractFrontmatterFeature","wcp","WcpContext","AiImageEnrichmentFeature","CmsCompareEntryRevisionsFeature","WbTranslatePageFeature","AiPowerUpsSettingsGraphQLMapperImpl","BaseGraphQLSchema","CmsCompareEntryRevisionsSchema"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAwBO,MAAMA,YAAYC,cAAc;IACnC,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC,yBAAyB,gBAAgB;QAE5DC,mBAAmB,QAAQ,CAACF;QAC5BG,sBAAsB,QAAQ,CAACH;QAM/BI,iBAAiB,QAAQ,CAACJ;QAC1BK,mBAAmB,QAAQ,CAACL;QAC5BM,kBAAkB,QAAQ,CAACN;QAC3BO,oBAAoB,QAAQ,CAACP;QAC7BQ,sBAAsB,QAAQ,CAACR;QAC/BS,sBAAsB,QAAQ,CAACT;QAC/BU,gBAAgB,QAAQ,CAACV;QACzBW,uBAAuB,QAAQ,CAACX;QAChCY,6BAA6B,QAAQ,CAACZ;QACtCa,+BAA+B,QAAQ,CAACb;QACxCc,2BAA2B,QAAQ,CAACd;QACpCe,0BAA0B,QAAQ,CAACf;QAEnC,MAAMgB,MAAMhB,UAAU,OAAO,CAACiB;QAC9B,IAAID,IAAI,uBAAuB,IAC3BE,yBAAyB,QAAQ,CAAClB;QAGtCmB,gCAAgC,QAAQ,CAACnB;QACzCoB,uBAAuB,QAAQ,CAACpB;QAEhCA,UAAU,QAAQ,CAACqB,iCAAqC,gBAAgB;QACxErB,UAAU,QAAQ,CAACsB;QACnBtB,UAAU,QAAQ,CAACuB;IACvB;AACJ"}
@@ -1,11 +1,12 @@
1
1
  import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
2
2
  import { Ai } from "@webiny/api-core/features/ai/index.js";
3
- import { Encryption } from "@webiny/api-core/features/encryption/index.js";
3
+ import { Logger } from "@webiny/api-core/features/logger/index.js";
4
4
  import { GetFileUseCase } from "@webiny/api-file-manager/features/file/GetFile/index.js";
5
5
  import { UpdateFileUseCase } from "@webiny/api-file-manager/features/file/UpdateFile/index.js";
6
6
  import { GetSettingsUseCase as FmGetSettingsUseCase } from "@webiny/api-file-manager/features/settings/GetSettings/abstractions.js";
7
- import { WebsocketService } from "@webiny/api-websockets/features/WebsocketService/index.js";
8
- import { GetSettingsUseCase } from "../../../api/features/GetSettings/index.js";
7
+ import { WebsocketsSendToIdentityUseCase } from "@webiny/api-websockets/features/SendToIdentity/abstractions.js";
8
+ import { IdentityContext } from "@webiny/api-core/exports/api/security.js";
9
+ import { ResolveAiCapabilityUseCase } from "../../../api/features/Capabilities/index.js";
9
10
  export declare const AI_IMAGE_ENRICHMENT_TASK_ID = "fmAiImageEnrichment";
10
11
  export interface IAiImageEnrichmentTaskInput {
11
12
  fileId: string;
@@ -15,9 +16,10 @@ declare class AiImageEnrichmentTaskImpl implements TaskDefinition.Interface<IAiI
15
16
  private fmSettings;
16
17
  private updateFile;
17
18
  private ai;
18
- private getSettings;
19
- private encryption;
20
- private websocketService?;
19
+ private resolveCapability;
20
+ private logger;
21
+ private identityContext;
22
+ private sendToIdentity;
21
23
  id: string;
22
24
  title: string;
23
25
  description: string;
@@ -25,10 +27,10 @@ declare class AiImageEnrichmentTaskImpl implements TaskDefinition.Interface<IAiI
25
27
  isPrivate: boolean;
26
28
  databaseLogs: boolean;
27
29
  readonly selfCleanup: ("onAbort" | "onSuccess")[];
28
- constructor(getFile: GetFileUseCase.Interface, fmSettings: FmGetSettingsUseCase.Interface, updateFile: UpdateFileUseCase.Interface, ai: Ai.Interface, getSettings: GetSettingsUseCase.Interface, encryption: Encryption.Interface, websocketService?: WebsocketService.Interface | undefined);
30
+ constructor(getFile: GetFileUseCase.Interface, fmSettings: FmGetSettingsUseCase.Interface, updateFile: UpdateFileUseCase.Interface, ai: Ai.Interface, resolveCapability: ResolveAiCapabilityUseCase.Interface, logger: Logger.Interface, identityContext: IdentityContext.Interface, sendToIdentity: WebsocketsSendToIdentityUseCase.Interface);
29
31
  run({ input, controller }: TaskDefinition.RunParams<IAiImageEnrichmentTaskInput>): Promise<TaskDefinition.Result<IAiImageEnrichmentTaskInput>>;
30
32
  }
31
33
  export declare const AiImageEnrichmentTask: typeof AiImageEnrichmentTaskImpl & {
32
- __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskDefinition<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskOutput>>;
34
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskDefinition<import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskOutput>>;
33
35
  };
34
36
  export {};
@@ -2,14 +2,15 @@ import { Output } from "ai";
2
2
  import { z } from "zod";
3
3
  import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
4
4
  import { Ai } from "@webiny/api-core/features/ai/index.js";
5
- import { Encryption } from "@webiny/api-core/features/encryption/index.js";
5
+ import { Logger } from "@webiny/api-core/features/logger/index.js";
6
6
  import { GetFileUseCase } from "@webiny/api-file-manager/features/file/GetFile/index.js";
7
7
  import { UpdateFileUseCase } from "@webiny/api-file-manager/features/file/UpdateFile/index.js";
8
8
  import { GetSettingsUseCase } from "@webiny/api-file-manager/features/settings/GetSettings/abstractions.js";
9
- import { WebsocketService } from "@webiny/api-websockets/features/WebsocketService/index.js";
10
- import { GetSettingsUseCase as index_js_GetSettingsUseCase } from "../GetSettings/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 { ResolveAiCapabilityUseCase, withAdditionalInstructions } from "../Capabilities/index.js";
12
+ import { FM_IMAGE_ENRICHMENT_CAPABILITY } from "./capability.js";
11
13
  const AI_IMAGE_ENRICHMENT_TASK_ID = "fmAiImageEnrichment";
12
- const AI_PROMPT = "Analyze this image and return up to 5 lowercase descriptive tags and one short sentence describing the image.";
13
14
  const aiOutputSchema = Output.object({
14
15
  schema: z.object({
15
16
  tags: z.array(z.string()),
@@ -17,14 +18,15 @@ const aiOutputSchema = Output.object({
17
18
  })
18
19
  });
19
20
  class AiImageEnrichmentTaskImpl {
20
- constructor(getFile, fmSettings, updateFile, ai, getSettings, encryption, websocketService){
21
+ constructor(getFile, fmSettings, updateFile, ai, resolveCapability, logger, identityContext, sendToIdentity){
21
22
  this.getFile = getFile;
22
23
  this.fmSettings = fmSettings;
23
24
  this.updateFile = updateFile;
24
25
  this.ai = ai;
25
- this.getSettings = getSettings;
26
- this.encryption = encryption;
27
- this.websocketService = websocketService;
26
+ this.resolveCapability = resolveCapability;
27
+ this.logger = logger;
28
+ this.identityContext = identityContext;
29
+ this.sendToIdentity = sendToIdentity;
28
30
  this.id = AI_IMAGE_ENRICHMENT_TASK_ID;
29
31
  this.title = "File Manager - AI Image Enrichment";
30
32
  this.description = "Automatically enriches uploaded images with AI-generated tags and description.";
@@ -47,25 +49,22 @@ class AiImageEnrichmentTaskImpl {
47
49
  const settingsResult = await this.fmSettings.execute();
48
50
  const srcPrefix = settingsResult.isOk() ? settingsResult.value.srcPrefix ?? "" : "";
49
51
  const imageUrl = `${srcPrefix}${file.key}`;
50
- const aiSettingsResult = await this.getSettings.execute();
51
- if (aiSettingsResult.isFail()) return controller.response.error({
52
- message: "No AI provider configured. Add a provider in AI Power Ups settings."
53
- });
54
- const aiSettings = aiSettingsResult.value;
55
- const firstProvider = aiSettings.providers.presets[0];
56
- if (!firstProvider) return controller.response.done({
57
- message: "No AI provider configured. Add a provider in AI Power Ups settings."
58
- });
52
+ const resolved = await this.resolveCapability.execute(FM_IMAGE_ENRICHMENT_CAPABILITY);
53
+ if (resolved.isFail()) {
54
+ this.logger.warn({
55
+ fileId: input.fileId,
56
+ reason: resolved.error.message
57
+ }, "Skipping AI image enrichment.");
58
+ return controller.response.done(resolved.error.message);
59
+ }
60
+ const capability = resolved.value;
59
61
  let tags = [];
60
62
  let description = "";
61
63
  try {
62
64
  const aiResult = await this.ai.generateText({
63
- model: firstProvider.model,
65
+ model: capability.model,
64
66
  output: aiOutputSchema,
65
- connection: {
66
- sdkName: firstProvider.model.split("/")[0],
67
- apiKey: await this.encryption.decrypt(firstProvider.apiKeyEncrypted)
68
- },
67
+ connection: capability.connection,
69
68
  messages: [
70
69
  {
71
70
  role: "user",
@@ -76,7 +75,7 @@ class AiImageEnrichmentTaskImpl {
76
75
  },
77
76
  {
78
77
  type: "text",
79
- text: AI_PROMPT
78
+ text: withAdditionalInstructions(capability)
80
79
  }
81
80
  ]
82
81
  }
@@ -104,17 +103,17 @@ class AiImageEnrichmentTaskImpl {
104
103
  if (updateResult.isFail()) return controller.response.error({
105
104
  message: `Failed to update file: ${updateResult.error.message}`
106
105
  });
107
- if (this.websocketService) {
108
- const connectionsResult = await this.websocketService.listConnections();
109
- if (connectionsResult.isOk() && connectionsResult.value.length > 0) await this.websocketService.sendToConnections(connectionsResult.value, {
110
- action: "fm.file.enrichment",
111
- data: {
112
- id: file.id,
113
- tags: mergedTags,
114
- description
115
- }
116
- });
117
- }
106
+ const identity = this.identityContext.getIdentity();
107
+ await this.sendToIdentity.execute({
108
+ id: identity.id
109
+ }, {
110
+ action: "fm.file.enrichment",
111
+ data: {
112
+ id: file.id,
113
+ tags: mergedTags,
114
+ description
115
+ }
116
+ });
118
117
  return controller.response.done("AI image enrichment completed successfully.");
119
118
  }
120
119
  }
@@ -125,14 +124,10 @@ const AiImageEnrichmentTask = TaskDefinition.createImplementation({
125
124
  GetSettingsUseCase,
126
125
  UpdateFileUseCase,
127
126
  Ai,
128
- index_js_GetSettingsUseCase,
129
- Encryption,
130
- [
131
- WebsocketService,
132
- {
133
- optional: true
134
- }
135
- ]
127
+ ResolveAiCapabilityUseCase,
128
+ Logger,
129
+ IdentityContext,
130
+ WebsocketsSendToIdentityUseCase
136
131
  ]
137
132
  });
138
133
  export { AI_IMAGE_ENRICHMENT_TASK_ID, AiImageEnrichmentTask };
@@ -1 +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 { UpdateFileUseCase } from \"@webiny/api-file-manager/features/file/UpdateFile/index.js\";\nimport { GetSettingsUseCase as FmGetSettingsUseCase } from \"@webiny/api-file-manager/features/settings/GetSettings/abstractions.js\";\nimport { WebsocketService } from \"@webiny/api-websockets/features/WebsocketService/index.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 fmSettings: FmGetSettingsUseCase.Interface,\n private updateFile: UpdateFileUseCase.Interface,\n private ai: Ai.Interface,\n private getSettings: GetSettingsUseCase.Interface,\n private encryption: Encryption.Interface,\n private websocketService?: WebsocketService.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 const settingsResult = await this.fmSettings.execute();\n const srcPrefix = settingsResult.isOk() ? (settingsResult.value.srcPrefix ?? \"\") : \"\";\n const imageUrl = `${srcPrefix}${file.key}`;\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: \"image\",\n image: new URL(imageUrl)\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 if (this.websocketService) {\n const connectionsResult = await this.websocketService.listConnections();\n if (connectionsResult.isOk() && connectionsResult.value.length > 0) {\n await this.websocketService.sendToConnections(connectionsResult.value, {\n action: \"fm.file.enrichment\",\n data: {\n id: file.id,\n tags: mergedTags,\n description\n }\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 FmGetSettingsUseCase,\n UpdateFileUseCase,\n Ai,\n GetSettingsUseCase,\n Encryption,\n [WebsocketService, { optional: true }]\n ]\n});\n"],"names":["AI_IMAGE_ENRICHMENT_TASK_ID","AI_PROMPT","aiOutputSchema","Output","z","AiImageEnrichmentTaskImpl","getFile","fmSettings","updateFile","ai","getSettings","encryption","websocketService","input","controller","fileResult","file","settingsResult","srcPrefix","imageUrl","aiSettingsResult","aiSettings","firstProvider","tags","description","aiResult","URL","error","console","Error","String","mergedTags","Set","updateResult","connectionsResult","AiImageEnrichmentTask","TaskDefinition","GetFileUseCase","FmGetSettingsUseCase","UpdateFileUseCase","Ai","GetSettingsUseCase","Encryption","WebsocketService"],"mappings":"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"}
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 { Logger } from \"@webiny/api-core/features/logger/index.js\";\nimport { GetFileUseCase } from \"@webiny/api-file-manager/features/file/GetFile/index.js\";\nimport { UpdateFileUseCase } from \"@webiny/api-file-manager/features/file/UpdateFile/index.js\";\nimport { GetSettingsUseCase as FmGetSettingsUseCase } from \"@webiny/api-file-manager/features/settings/GetSettings/abstractions.js\";\nimport { WebsocketsSendToIdentityUseCase } from \"@webiny/api-websockets/features/SendToIdentity/abstractions.js\";\nimport { IdentityContext } from \"@webiny/api-core/exports/api/security.js\";\nimport {\n ResolveAiCapabilityUseCase,\n withAdditionalInstructions\n} from \"~/api/features/Capabilities/index.js\";\nimport { FM_IMAGE_ENRICHMENT_CAPABILITY } from \"./capability.js\";\n\nexport const AI_IMAGE_ENRICHMENT_TASK_ID = \"fmAiImageEnrichment\";\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 fmSettings: FmGetSettingsUseCase.Interface,\n private updateFile: UpdateFileUseCase.Interface,\n private ai: Ai.Interface,\n private resolveCapability: ResolveAiCapabilityUseCase.Interface,\n private logger: Logger.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 const settingsResult = await this.fmSettings.execute();\n const srcPrefix = settingsResult.isOk() ? (settingsResult.value.srcPrefix ?? \"\") : \"\";\n const imageUrl = `${srcPrefix}${file.key}`;\n\n const resolved = await this.resolveCapability.execute(FM_IMAGE_ENRICHMENT_CAPABILITY);\n\n if (resolved.isFail()) {\n /*\n * A skip, not a failure. This feature is not licence-gated on this branch, so every\n * project that uploads an image without AI configured would otherwise get a failed task\n * on every upload. Today's behaviour for an unconfigured provider is the same soft\n * done; the log is new, because a skip and a misconfiguration used to look identical.\n */\n this.logger.warn(\n { fileId: input.fileId, reason: resolved.error.message },\n \"Skipping AI image enrichment.\"\n );\n return controller.response.done(resolved.error.message);\n }\n\n const capability = resolved.value;\n\n let tags: string[] = [];\n let description = \"\";\n try {\n const aiResult = await this.ai.generateText({\n model: capability.model,\n output: aiOutputSchema,\n connection: capability.connection,\n messages: [\n {\n role: \"user\",\n content: [\n {\n type: \"image\",\n image: new URL(imageUrl)\n },\n {\n type: \"text\",\n text: withAdditionalInstructions(capability)\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 FmGetSettingsUseCase,\n UpdateFileUseCase,\n Ai,\n ResolveAiCapabilityUseCase,\n Logger,\n IdentityContext,\n WebsocketsSendToIdentityUseCase\n ]\n});\n"],"names":["AI_IMAGE_ENRICHMENT_TASK_ID","aiOutputSchema","Output","z","AiImageEnrichmentTaskImpl","getFile","fmSettings","updateFile","ai","resolveCapability","logger","identityContext","sendToIdentity","input","controller","fileResult","file","settingsResult","srcPrefix","imageUrl","resolved","FM_IMAGE_ENRICHMENT_CAPABILITY","capability","tags","description","aiResult","URL","withAdditionalInstructions","error","console","Error","String","mergedTags","Set","updateResult","identity","AiImageEnrichmentTask","TaskDefinition","GetFileUseCase","FmGetSettingsUseCase","UpdateFileUseCase","Ai","ResolveAiCapabilityUseCase","Logger","IdentityContext","WebsocketsSendToIdentityUseCase"],"mappings":";;;;;;;;;;;;AAgBO,MAAMA,8BAA8B;AAE3C,MAAMC,iBAAiBC,OAAO,MAAM,CAAC;IACjC,QAAQC,EAAE,MAAM,CAAC;QACb,MAAMA,EAAE,KAAK,CAACA,EAAE,MAAM;QACtB,aAAaA,EAAE,MAAM;IACzB;AACJ;AAMA,MAAMC;IAUF,YACYC,OAAiC,EACjCC,UAA0C,EAC1CC,UAAuC,EACvCC,EAAgB,EAChBC,iBAAuD,EACvDC,MAAwB,EACxBC,eAA0C,EAC1CC,cAAyD,CACnE;aARUP,OAAO,GAAPA;aACAC,UAAU,GAAVA;aACAC,UAAU,GAAVA;aACAC,EAAE,GAAFA;aACAC,iBAAiB,GAAjBA;aACAC,MAAM,GAANA;aACAC,eAAe,GAAfA;aACAC,cAAc,GAAdA;aAjBZ,EAAE,GAAGZ;aACL,KAAK,GAAG;aACR,WAAW,GAAG;aACd,aAAa,GAAG;aAChB,SAAS,GAAG;aACZ,YAAY,GAAG;aAEC,WAAW,GAAG;YAAC;YAAsB;SAAmB;IAWrE;IAEH,MAAM,IAAI,EACNa,KAAK,EACLC,UAAU,EAC0C,EAEtD;QACE,IAAIA,WAAW,OAAO,CAAC,SAAS,IAC5B,OAAOA,WAAW,QAAQ,CAAC,OAAO;QAGtC,MAAMC,aAAa,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,CAACF,MAAM,MAAM;QAC1D,IAAIE,WAAW,MAAM,IACjB,OAAOD,WAAW,QAAQ,CAAC,KAAK,CAAC;YAC7B,SAAS,CAAC,gBAAgB,EAAED,MAAM,MAAM,EAAE;QAC9C;QAGJ,MAAMG,OAAOD,WAAW,KAAK;QAE7B,IAAI,CAACC,KAAK,IAAI,CAAC,UAAU,CAAC,WACtB,OAAOF,WAAW,QAAQ,CAAC,IAAI,CAAC;QAGpC,MAAMG,iBAAiB,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO;QACpD,MAAMC,YAAYD,eAAe,IAAI,KAAMA,eAAe,KAAK,CAAC,SAAS,IAAI,KAAM;QACnF,MAAME,WAAW,GAAGD,YAAYF,KAAK,GAAG,EAAE;QAE1C,MAAMI,WAAW,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAACC;QAEtD,IAAID,SAAS,MAAM,IAAI;YAOnB,IAAI,CAAC,MAAM,CAAC,IAAI,CACZ;gBAAE,QAAQP,MAAM,MAAM;gBAAE,QAAQO,SAAS,KAAK,CAAC,OAAO;YAAC,GACvD;YAEJ,OAAON,WAAW,QAAQ,CAAC,IAAI,CAACM,SAAS,KAAK,CAAC,OAAO;QAC1D;QAEA,MAAME,aAAaF,SAAS,KAAK;QAEjC,IAAIG,OAAiB,EAAE;QACvB,IAAIC,cAAc;QAClB,IAAI;YACA,MAAMC,WAAW,MAAM,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC;gBACxC,OAAOH,WAAW,KAAK;gBACvB,QAAQrB;gBACR,YAAYqB,WAAW,UAAU;gBACjC,UAAU;oBACN;wBACI,MAAM;wBACN,SAAS;4BACL;gCACI,MAAM;gCACN,OAAO,IAAII,IAAIP;4BACnB;4BACA;gCACI,MAAM;gCACN,MAAMQ,2BAA2BL;4BACrC;yBACH;oBACL;iBACH;YACL;YAEAC,OAAOE,SAAS,MAAM,CAAC,IAAI;YAC3BD,cAAcC,SAAS,MAAM,CAAC,WAAW;QAC7C,EAAE,OAAOG,OAAO;YACZC,QAAQ,GAAG,CAAC,SAASD,MAAM,OAAO;YAClC,OAAOd,WAAW,QAAQ,CAAC,KAAK,CAAC;gBAC7B,SAAS,CAAC,sBAAsB,EAAEc,iBAAiBE,QAAQF,MAAM,OAAO,GAAGG,OAAOH,QAAQ;YAC9F;QACJ;QAEA,MAAMI,aAAa;eAAI,IAAIC,IAAI;mBAAIjB,KAAK,IAAI;mBAAKO;aAAK;SAAE;QAExD,MAAMW,eAAe,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YAC/C,IAAIlB,KAAK,EAAE;YACX,MAAMgB;YACNR;QACJ;QAEA,IAAIU,aAAa,MAAM,IACnB,OAAOpB,WAAW,QAAQ,CAAC,KAAK,CAAC;YAC7B,SAAS,CAAC,uBAAuB,EAAEoB,aAAa,KAAK,CAAC,OAAO,EAAE;QACnE;QAGJ,MAAMC,WAAW,IAAI,CAAC,eAAe,CAAC,WAAW;QACjD,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B;YAAE,IAAIA,SAAS,EAAE;QAAC,GAClB;YACI,QAAQ;YACR,MAAM;gBACF,IAAInB,KAAK,EAAE;gBACX,MAAMgB;gBACNR;YACJ;QACJ;QAGJ,OAAOV,WAAW,QAAQ,CAAC,IAAI,CAAC;IACpC;AACJ;AAEO,MAAMsB,wBAAwBC,eAAe,oBAAoB,CAAC;IACrE,gBAAgBjC;IAChB,cAAc;QACVkC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
@@ -0,0 +1,13 @@
1
+ import { AiCapability } from "../../../api/features/Capabilities/index.js";
2
+ export declare const FM_IMAGE_ENRICHMENT_CAPABILITY = "fm.imageEnrichment";
3
+ declare class FmImageEnrichmentCapabilityImpl implements AiCapability.Interface {
4
+ readonly id = "fm.imageEnrichment";
5
+ readonly label = "Image enrichment";
6
+ readonly description = "Reads an uploaded image and writes its alt text, title and tags. Needs a model that accepts image input.";
7
+ readonly defaultRole: "vision";
8
+ readonly guidance = "Analyze this image and return up to 5 lowercase descriptive tags and one short sentence describing the image.";
9
+ }
10
+ export declare const FmImageEnrichmentCapability: typeof FmImageEnrichmentCapabilityImpl & {
11
+ __abstraction: import("@webiny/di").Abstraction<import("~/api/features/Capabilities/index.js").IAiCapability>;
12
+ };
13
+ export {};
@@ -0,0 +1,19 @@
1
+ import { AiCapability } from "../Capabilities/index.js";
2
+ const FM_IMAGE_ENRICHMENT_CAPABILITY = "fm.imageEnrichment";
3
+ const guidance = "Analyze this image and return up to 5 lowercase descriptive tags and one short sentence describing the image.";
4
+ class FmImageEnrichmentCapabilityImpl {
5
+ constructor(){
6
+ this.id = FM_IMAGE_ENRICHMENT_CAPABILITY;
7
+ this.label = "Image enrichment";
8
+ this.description = "Reads an uploaded image and writes its alt text, title and tags. Needs a model that accepts image input.";
9
+ this.defaultRole = "vision";
10
+ this.guidance = guidance;
11
+ }
12
+ }
13
+ const FmImageEnrichmentCapability = AiCapability.createImplementation({
14
+ implementation: FmImageEnrichmentCapabilityImpl,
15
+ dependencies: []
16
+ });
17
+ export { FM_IMAGE_ENRICHMENT_CAPABILITY, FmImageEnrichmentCapability };
18
+
19
+ //# sourceMappingURL=capability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api/features/AiImageEnrichment/capability.js","sources":["../../../../src/api/features/AiImageEnrichment/capability.ts"],"sourcesContent":["import { AiCapability } from \"~/api/features/Capabilities/index.js\";\n\nexport const FM_IMAGE_ENRICHMENT_CAPABILITY = \"fm.imageEnrichment\";\n\n/**\n * The prompt lives here rather than in the task now, because it is the capability's, and the\n * resolver hands it back with the project's additional instructions already appended.\n *\n * This is the one AI prompt whose structure does not come from the prose: `Output.object(...)` in\n * the task enforces the tags/description shape. House tag vocabularies go in additional\n * instructions (\"use our taxonomy\", \"no more than three tags\", \"British spelling\").\n */\nconst guidance =\n \"Analyze this image and return up to 5 lowercase descriptive tags and one short sentence describing the image.\";\n\nclass FmImageEnrichmentCapabilityImpl implements AiCapability.Interface {\n readonly id = FM_IMAGE_ENRICHMENT_CAPABILITY;\n readonly label = \"Image enrichment\";\n readonly description =\n \"Reads an uploaded image and writes its alt text, title and tags. Needs a model that accepts image input.\";\n readonly defaultRole = \"vision\" as const;\n readonly guidance = guidance;\n}\n\nexport const FmImageEnrichmentCapability = AiCapability.createImplementation({\n implementation: FmImageEnrichmentCapabilityImpl,\n dependencies: []\n});\n"],"names":["FM_IMAGE_ENRICHMENT_CAPABILITY","guidance","FmImageEnrichmentCapabilityImpl","FmImageEnrichmentCapability","AiCapability"],"mappings":";AAEO,MAAMA,iCAAiC;AAU9C,MAAMC,WACF;AAEJ,MAAMC;;aACO,EAAE,GAAGF;aACL,KAAK,GAAG;aACR,WAAW,GAChB;aACK,WAAW,GAAG;aACd,QAAQ,GAAGC;;AACxB;AAEO,MAAME,8BAA8BC,aAAa,oBAAoB,CAAC;IACzE,gBAAgBF;IAChB,cAAc,EAAE;AACpB"}
@@ -1,9 +1,11 @@
1
1
  import { createFeature } from "@webiny/feature/api";
2
2
  import { AiImageEnrichmentAfterCreateHandler } from "./AiImageEnrichmentAfterCreateHandler.js";
3
3
  import { AiImageEnrichmentTask } from "./AiImageEnrichmentTask.js";
4
+ import { FmImageEnrichmentCapability } from "./capability.js";
4
5
  const AiImageEnrichmentFeature = createFeature({
5
6
  name: "AiPowerUps/AiImageEnrichment",
6
7
  register (container) {
8
+ container.register(FmImageEnrichmentCapability);
7
9
  container.register(AiImageEnrichmentAfterCreateHandler);
8
10
  container.register(AiImageEnrichmentTask);
9
11
  }
@@ -1 +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"}
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\";\nimport { FmImageEnrichmentCapability } from \"./capability.js\";\n\nexport const AiImageEnrichmentFeature = createFeature({\n name: \"AiPowerUps/AiImageEnrichment\",\n register(container) {\n container.register(FmImageEnrichmentCapability);\n container.register(AiImageEnrichmentAfterCreateHandler);\n container.register(AiImageEnrichmentTask);\n }\n});\n"],"names":["AiImageEnrichmentFeature","createFeature","container","FmImageEnrichmentCapability","AiImageEnrichmentAfterCreateHandler","AiImageEnrichmentTask"],"mappings":";;;;AAKO,MAAMA,2BAA2BC,cAAc;IAClD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;QACnBF,UAAU,QAAQ,CAACG;IACvB;AACJ"}
@@ -1,10 +1,17 @@
1
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";
2
5
  import { AiPromptContextBuilder as Abstraction, ProjectFileAssembler, type AiPromptContext, type AiPromptContextParams } from "./abstractions.js";
3
6
  declare class AiPromptContextBuilderImpl implements Abstraction.Interface {
4
7
  private getSettings;
5
8
  private fileAssembler;
6
- constructor(getSettings: GetSettingsUseCase.Interface, fileAssembler: ProjectFileAssembler.Interface);
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);
7
13
  execute(params: AiPromptContextParams): Promise<AiPromptContext>;
14
+ private fetchAdditionalFiles;
8
15
  }
9
16
  export declare const AiPromptContextBuilder: typeof AiPromptContextBuilderImpl & {
10
17
  __abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IAiPromptContextBuilder>;
@@ -1,4 +1,7 @@
1
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";
2
5
  import { AiPromptContextBuilder, ProjectFileAssembler } from "./abstractions.js";
3
6
  import { WriterPersonaSection } from "./WriterPersonaSection.js";
4
7
  import { ReaderPersonaSection } from "./ReaderPersonaSection.js";
@@ -37,6 +40,7 @@ function emptyContext(warnings) {
37
40
  readerPersona: void 0,
38
41
  writerPersona: void 0,
39
42
  allProjectFiles: [],
43
+ additionalFiles: [],
40
44
  excludedFileIds: new Set(),
41
45
  cacheHit: false,
42
46
  warnings,
@@ -46,9 +50,12 @@ function emptyContext(warnings) {
46
50
  };
47
51
  }
48
52
  class AiPromptContextBuilderImpl {
49
- constructor(getSettings, fileAssembler){
53
+ constructor(getSettings, fileAssembler, getFileContents, getFile, textExtractor){
50
54
  this.getSettings = getSettings;
51
55
  this.fileAssembler = fileAssembler;
56
+ this.getFileContents = getFileContents;
57
+ this.getFile = getFile;
58
+ this.textExtractor = textExtractor;
52
59
  }
53
60
  async execute(params) {
54
61
  const warnings = [];
@@ -76,11 +83,17 @@ class AiPromptContextBuilderImpl {
76
83
  totalTokens: visibleFiles.reduce((sum, f)=>sum + f.tokenCount, 0)
77
84
  };
78
85
  }
86
+ const additionalFiles = await this.fetchAdditionalFiles(params.additionalFileIds, warnings);
87
+ if (additionalFiles.length > 0) allProjectFiles = [
88
+ ...allProjectFiles,
89
+ ...additionalFiles
90
+ ];
79
91
  const ctx = {
80
92
  project,
81
93
  readerPersona: reader,
82
94
  writerPersona: writer,
83
95
  allProjectFiles,
96
+ additionalFiles,
84
97
  excludedFileIds,
85
98
  cacheHit,
86
99
  warnings,
@@ -90,12 +103,43 @@ class AiPromptContextBuilderImpl {
90
103
  };
91
104
  return ctx;
92
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
+ }
93
134
  }
94
135
  const AiPromptContextBuilder_AiPromptContextBuilder = AiPromptContextBuilder.createImplementation({
95
136
  implementation: AiPromptContextBuilderImpl,
96
137
  dependencies: [
97
138
  GetSettingsUseCase,
98
- ProjectFileAssembler
139
+ ProjectFileAssembler,
140
+ GetFileContentsByIdUseCase,
141
+ GetFileUseCase,
142
+ TextExtractor
99
143
  ]
100
144
  });
101
145
  export { AiPromptContextBuilder_AiPromptContextBuilder as AiPromptContextBuilder };
@@ -1 +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 {\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\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 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 ) {}\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 ctx: AiPromptContext = {\n project,\n readerPersona: reader,\n writerPersona: writer,\n allProjectFiles,\n excludedFileIds,\n cacheHit,\n warnings,\n toString() {\n return formatContext(this);\n }\n };\n\n return ctx;\n }\n}\n\nexport const AiPromptContextBuilder = Abstraction.createImplementation({\n implementation: AiPromptContextBuilderImpl,\n dependencies: [GetSettingsUseCase, ProjectFileAssembler]\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","settingsResult","projectPreset","reader","writer","excludedFileIds","allProjectFiles","cacheHit","assembled","visibleFiles","f","sum","AiPromptContextBuilder","Abstraction","GetSettingsUseCase","ProjectFileAssembler"],"mappings":"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"}
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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"}
@@ -28,6 +28,7 @@ export interface AiPromptContextParams {
28
28
  readerPersonaId?: string | null;
29
29
  writerPersonaId?: string | null;
30
30
  excludedFileIds?: string[] | null;
31
+ additionalFileIds?: string[] | null;
31
32
  }
32
33
  export interface ProjectFileContent {
33
34
  id: string;
@@ -52,6 +53,7 @@ export interface AiPromptContext {
52
53
  readerPersona?: ResolvedPersona;
53
54
  writerPersona?: ResolvedPersona;
54
55
  allProjectFiles: ProjectFileContent[];
56
+ additionalFiles: ProjectFileContent[];
55
57
  excludedFileIds: Set<string>;
56
58
  cacheHit: boolean;
57
59
  warnings: string[];
@@ -66,3 +68,4 @@ export declare namespace AiPromptContextBuilder {
66
68
  type Params = AiPromptContextParams;
67
69
  type Context = AiPromptContext;
68
70
  }
71
+ export declare function formatAdditionalFilesContext(files: ProjectFileContent[]): string;
@@ -2,6 +2,14 @@ import { createAbstraction } from "@webiny/feature/api";
2
2
  const ProjectFileCache = createAbstraction("ProjectFileCache");
3
3
  const ProjectFileAssembler = createAbstraction("ProjectFileAssembler");
4
4
  const AiPromptContextBuilder = createAbstraction("AiPowerUpsPromptContextBuilder");
5
- export { AiPromptContextBuilder, ProjectFileAssembler, ProjectFileCache };
5
+ function formatAdditionalFilesContext(files) {
6
+ if (0 === files.length) return "";
7
+ const sections = files.map((f)=>{
8
+ const desc = f.description ? ` description="${f.description}"` : "";
9
+ return `<attached-file name="${f.name}"${desc}>\n${f.content}\n</attached-file>`;
10
+ });
11
+ return `\n\nThe user attached the following files as additional context for this generation:\n\n${sections.join("\n\n")}`;
12
+ }
13
+ export { AiPromptContextBuilder, ProjectFileAssembler, ProjectFileCache, formatAdditionalFilesContext };
6
14
 
7
15
  //# sourceMappingURL=abstractions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api/features/AiPromptContext/abstractions.js","sources":["../../../../src/api/features/AiPromptContext/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\n\n// ============================================================================\n// ProjectFileCache\n// ============================================================================\n\nexport interface IProjectFileCache {\n get(projectId: string, version: number): Promise<{ files: ProjectFileContent[]; hit: boolean }>;\n set(projectId: string, version: number, files: ProjectFileContent[]): Promise<void>;\n}\n\nexport const ProjectFileCache = createAbstraction<IProjectFileCache>(\"ProjectFileCache\");\n\nexport namespace ProjectFileCache {\n export type Interface = IProjectFileCache;\n}\n\n// ============================================================================\n// ProjectFileAssembler\n// ============================================================================\n\nexport interface IProjectFileAssembler {\n 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}\n\nexport const ProjectFileAssembler =\n createAbstraction<IProjectFileAssembler>(\"ProjectFileAssembler\");\n\nexport namespace ProjectFileAssembler {\n export type Interface = IProjectFileAssembler;\n}\n\n// ============================================================================\n// AiPromptContext\n// ============================================================================\n\nexport interface AiPromptContextParams {\n projectId?: string | null;\n readerPersonaId?: string | null;\n writerPersonaId?: string | null;\n excludedFileIds?: string[] | null;\n}\n\nexport interface ProjectFileContent {\n id: string;\n name: string;\n content: string;\n description?: string;\n tokenCount: number;\n}\n\nexport interface ResolvedProject {\n name: string;\n instructions?: string;\n files: ProjectFileContent[];\n totalTokens: number;\n}\n\nexport interface ResolvedPersona {\n name: string;\n description: string;\n style?: string;\n}\n\nexport interface AiPromptContext {\n project?: ResolvedProject;\n readerPersona?: ResolvedPersona;\n writerPersona?: ResolvedPersona;\n allProjectFiles: ProjectFileContent[];\n excludedFileIds: Set<string>;\n cacheHit: boolean;\n warnings: string[];\n toString(): string;\n}\n\nexport interface IAiPromptContextBuilder {\n execute(params: AiPromptContextParams): Promise<AiPromptContext>;\n}\n\nexport const AiPromptContextBuilder = createAbstraction<IAiPromptContextBuilder>(\n \"AiPowerUpsPromptContextBuilder\"\n);\n\nexport namespace AiPromptContextBuilder {\n export type Interface = IAiPromptContextBuilder;\n export type Params = AiPromptContextParams;\n export type Context = AiPromptContext;\n}\n"],"names":["ProjectFileCache","createAbstraction","ProjectFileAssembler","AiPromptContextBuilder"],"mappings":";AAWO,MAAMA,mBAAmBC,kBAAqC;AAmB9D,MAAMC,uBACTD,kBAAyC;AAqDtC,MAAME,yBAAyBF,kBAClC"}
1
+ {"version":3,"file":"api/features/AiPromptContext/abstractions.js","sources":["../../../../src/api/features/AiPromptContext/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\n\n// ============================================================================\n// ProjectFileCache\n// ============================================================================\n\nexport interface IProjectFileCache {\n get(projectId: string, version: number): Promise<{ files: ProjectFileContent[]; hit: boolean }>;\n set(projectId: string, version: number, files: ProjectFileContent[]): Promise<void>;\n}\n\nexport const ProjectFileCache = createAbstraction<IProjectFileCache>(\"ProjectFileCache\");\n\nexport namespace ProjectFileCache {\n export type Interface = IProjectFileCache;\n}\n\n// ============================================================================\n// ProjectFileAssembler\n// ============================================================================\n\nexport interface IProjectFileAssembler {\n 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}\n\nexport const ProjectFileAssembler =\n createAbstraction<IProjectFileAssembler>(\"ProjectFileAssembler\");\n\nexport namespace ProjectFileAssembler {\n export type Interface = IProjectFileAssembler;\n}\n\n// ============================================================================\n// AiPromptContext\n// ============================================================================\n\nexport interface AiPromptContextParams {\n projectId?: string | null;\n readerPersonaId?: string | null;\n writerPersonaId?: string | null;\n excludedFileIds?: string[] | null;\n additionalFileIds?: string[] | null;\n}\n\nexport interface ProjectFileContent {\n id: string;\n name: string;\n content: string;\n description?: string;\n tokenCount: number;\n}\n\nexport interface ResolvedProject {\n name: string;\n instructions?: string;\n files: ProjectFileContent[];\n totalTokens: number;\n}\n\nexport interface ResolvedPersona {\n name: string;\n description: string;\n style?: string;\n}\n\nexport interface AiPromptContext {\n project?: ResolvedProject;\n readerPersona?: ResolvedPersona;\n writerPersona?: ResolvedPersona;\n allProjectFiles: ProjectFileContent[];\n additionalFiles: ProjectFileContent[];\n excludedFileIds: Set<string>;\n cacheHit: boolean;\n warnings: string[];\n toString(): string;\n}\n\nexport interface IAiPromptContextBuilder {\n execute(params: AiPromptContextParams): Promise<AiPromptContext>;\n}\n\nexport const AiPromptContextBuilder = createAbstraction<IAiPromptContextBuilder>(\n \"AiPowerUpsPromptContextBuilder\"\n);\n\nexport namespace AiPromptContextBuilder {\n export type Interface = IAiPromptContextBuilder;\n export type Params = AiPromptContextParams;\n export type Context = AiPromptContext;\n}\n\nexport function formatAdditionalFilesContext(files: ProjectFileContent[]): string {\n if (files.length === 0) {\n return \"\";\n }\n const sections = files.map(f => {\n const desc = f.description ? ` description=\"${f.description}\"` : \"\";\n return `<attached-file name=\"${f.name}\"${desc}>\\n${f.content}\\n</attached-file>`;\n });\n return `\\n\\nThe user attached the following files as additional context for this generation:\\n\\n${sections.join(\"\\n\\n\")}`;\n}\n"],"names":["ProjectFileCache","createAbstraction","ProjectFileAssembler","AiPromptContextBuilder","formatAdditionalFilesContext","files","sections","f","desc"],"mappings":";AAWO,MAAMA,mBAAmBC,kBAAqC;AAmB9D,MAAMC,uBACTD,kBAAyC;AAuDtC,MAAME,yBAAyBF,kBAClC;AASG,SAASG,6BAA6BC,KAA2B;IACpE,IAAIA,AAAiB,MAAjBA,MAAM,MAAM,EACZ,OAAO;IAEX,MAAMC,WAAWD,MAAM,GAAG,CAACE,CAAAA;QACvB,MAAMC,OAAOD,EAAE,WAAW,GAAG,CAAC,cAAc,EAAEA,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG;QACjE,OAAO,CAAC,qBAAqB,EAAEA,EAAE,IAAI,CAAC,CAAC,EAAEC,KAAK,GAAG,EAAED,EAAE,OAAO,CAAC,kBAAkB,CAAC;IACpF;IACA,OAAO,CAAC,wFAAwF,EAAED,SAAS,IAAI,CAAC,SAAS;AAC7H"}
@@ -1 +1 @@
1
- export { AiPromptContextBuilder, type ResolvedProject, type ResolvedPersona, type ProjectFileContent } from "./abstractions.js";
1
+ export { AiPromptContextBuilder, formatAdditionalFilesContext, type ResolvedProject, type ResolvedPersona, type ProjectFileContent } from "./abstractions.js";
@@ -1 +1 @@
1
- export { AiPromptContextBuilder } from "./abstractions.js";
1
+ export { AiPromptContextBuilder, formatAdditionalFilesContext } from "./abstractions.js";
@@ -0,0 +1,28 @@
1
+ import { z } from "zod";
2
+ import { AiPowerUpsSettingsGroupHandler } from "../../../api/features/shared/index.js";
3
+ import type { CapabilitiesSettings } from "./types.js";
4
+ import type { PersistedCapabilities } from "./types.js";
5
+ declare class CapabilitiesHandlerImpl implements AiPowerUpsSettingsGroupHandler.Interface {
6
+ readonly name = "capabilities";
7
+ readonly inputSchema: z.ZodObject<{
8
+ items: z.ZodRecord<z.ZodString, z.ZodObject<{
9
+ enabled: z.ZodOptional<z.ZodNullable<z.ZodBoolean>>;
10
+ overrides: z.ZodOptional<z.ZodNullable<z.ZodObject<{
11
+ roleId: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodEnum<{
12
+ fast: "fast";
13
+ standard: "standard";
14
+ vision: "vision";
15
+ }>, z.ZodLiteral<"">]>>>;
16
+ connectionId: z.ZodOptional<z.ZodNullable<z.ZodString>>;
17
+ model: z.ZodOptional<z.ZodNullable<z.ZodString>>;
18
+ additionalInstructions: z.ZodOptional<z.ZodNullable<z.ZodString>>;
19
+ }, z.core.$strip>>>;
20
+ }, z.core.$strip>>;
21
+ }, z.core.$strip>;
22
+ mapFromStorage(persisted: unknown): CapabilitiesSettings;
23
+ mapToStorage(internal: unknown): Promise<PersistedCapabilities>;
24
+ }
25
+ declare const _default: typeof CapabilitiesHandlerImpl & {
26
+ __abstraction: import("@webiny/di").Abstraction<import("../shared/abstractions.js").IAiPowerUpsSettingsGroupHandler>;
27
+ };
28
+ export default _default;