@webiny/ai-powerups 0.0.0-unstable.7be00a75a9

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 (311) 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 +33 -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/feature.d.ts +1 -0
  13. package/admin/features/feature.js +22 -0
  14. package/admin/features/feature.js.map +1 -0
  15. package/admin/features/generatePageContent/GeneratePageContentGateway.d.ts +12 -0
  16. package/admin/features/generatePageContent/GeneratePageContentGateway.js +45 -0
  17. package/admin/features/generatePageContent/GeneratePageContentGateway.js.map +1 -0
  18. package/admin/features/generatePageContent/GeneratePageContentUseCase.d.ts +11 -0
  19. package/admin/features/generatePageContent/GeneratePageContentUseCase.js +18 -0
  20. package/admin/features/generatePageContent/GeneratePageContentUseCase.js.map +1 -0
  21. package/admin/features/generatePageContent/abstractions.d.ts +24 -0
  22. package/admin/features/generatePageContent/abstractions.js +6 -0
  23. package/admin/features/generatePageContent/abstractions.js.map +1 -0
  24. package/admin/features/generatePageContent/feature.d.ts +1 -0
  25. package/admin/features/generatePageContent/feature.js +13 -0
  26. package/admin/features/generatePageContent/feature.js.map +1 -0
  27. package/admin/features/generatePageContent/index.d.ts +3 -0
  28. package/admin/features/generatePageContent/index.js +2 -0
  29. package/admin/features/listModels/ListModelsGateway.d.ts +12 -0
  30. package/admin/features/listModels/ListModelsGateway.js +34 -0
  31. package/admin/features/listModels/ListModelsGateway.js.map +1 -0
  32. package/admin/features/listModels/ListModelsRepository.d.ts +13 -0
  33. package/admin/features/listModels/ListModelsRepository.js +27 -0
  34. package/admin/features/listModels/ListModelsRepository.js.map +1 -0
  35. package/admin/features/listModels/ListModelsUseCase.d.ts +10 -0
  36. package/admin/features/listModels/ListModelsUseCase.js +18 -0
  37. package/admin/features/listModels/ListModelsUseCase.js.map +1 -0
  38. package/admin/features/listModels/abstractions.d.ts +28 -0
  39. package/admin/features/listModels/abstractions.js +7 -0
  40. package/admin/features/listModels/abstractions.js.map +1 -0
  41. package/admin/features/listModels/feature.d.ts +3 -0
  42. package/admin/features/listModels/feature.js +21 -0
  43. package/admin/features/listModels/feature.js.map +1 -0
  44. package/admin/features/listModels/index.d.ts +2 -0
  45. package/admin/features/listModels/index.js +2 -0
  46. package/admin/features/settings/getSettings/GetSettingsGateway.d.ts +12 -0
  47. package/admin/features/settings/getSettings/GetSettingsGateway.js +29 -0
  48. package/admin/features/settings/getSettings/GetSettingsGateway.js.map +1 -0
  49. package/admin/features/settings/getSettings/GetSettingsRepository.d.ts +14 -0
  50. package/admin/features/settings/getSettings/GetSettingsRepository.js +31 -0
  51. package/admin/features/settings/getSettings/GetSettingsRepository.js.map +1 -0
  52. package/admin/features/settings/getSettings/GetSettingsUseCase.d.ts +11 -0
  53. package/admin/features/settings/getSettings/GetSettingsUseCase.js +18 -0
  54. package/admin/features/settings/getSettings/GetSettingsUseCase.js.map +1 -0
  55. package/admin/features/settings/getSettings/abstractions.d.ts +22 -0
  56. package/admin/features/settings/getSettings/abstractions.js +7 -0
  57. package/admin/features/settings/getSettings/abstractions.js.map +1 -0
  58. package/admin/features/settings/getSettings/feature.d.ts +3 -0
  59. package/admin/features/settings/getSettings/feature.js +21 -0
  60. package/admin/features/settings/getSettings/feature.js.map +1 -0
  61. package/admin/features/settings/getSettings/index.d.ts +2 -0
  62. package/admin/features/settings/getSettings/index.js +2 -0
  63. package/admin/features/settings/shared/SettingsCache.d.ts +10 -0
  64. package/admin/features/settings/shared/SettingsCache.js +19 -0
  65. package/admin/features/settings/shared/SettingsCache.js.map +1 -0
  66. package/admin/features/settings/shared/abstractions.d.ts +50 -0
  67. package/admin/features/settings/shared/abstractions.js +5 -0
  68. package/admin/features/settings/shared/abstractions.js.map +1 -0
  69. package/admin/features/settings/shared/feature.d.ts +3 -0
  70. package/admin/features/settings/shared/feature.js +17 -0
  71. package/admin/features/settings/shared/feature.js.map +1 -0
  72. package/admin/features/settings/shared/index.d.ts +2 -0
  73. package/admin/features/settings/shared/index.js +2 -0
  74. package/admin/features/settings/updateSettings/UpdateSettingsGateway.d.ts +12 -0
  75. package/admin/features/settings/updateSettings/UpdateSettingsGateway.js +45 -0
  76. package/admin/features/settings/updateSettings/UpdateSettingsGateway.js.map +1 -0
  77. package/admin/features/settings/updateSettings/UpdateSettingsRepository.d.ts +13 -0
  78. package/admin/features/settings/updateSettings/UpdateSettingsRepository.js +23 -0
  79. package/admin/features/settings/updateSettings/UpdateSettingsRepository.js.map +1 -0
  80. package/admin/features/settings/updateSettings/UpdateSettingsUseCase.d.ts +11 -0
  81. package/admin/features/settings/updateSettings/UpdateSettingsUseCase.js +18 -0
  82. package/admin/features/settings/updateSettings/UpdateSettingsUseCase.js.map +1 -0
  83. package/admin/features/settings/updateSettings/abstractions.d.ts +22 -0
  84. package/admin/features/settings/updateSettings/abstractions.js +7 -0
  85. package/admin/features/settings/updateSettings/abstractions.js.map +1 -0
  86. package/admin/features/settings/updateSettings/feature.d.ts +3 -0
  87. package/admin/features/settings/updateSettings/feature.js +21 -0
  88. package/admin/features/settings/updateSettings/feature.js.map +1 -0
  89. package/admin/features/settings/updateSettings/index.d.ts +2 -0
  90. package/admin/features/settings/updateSettings/index.js +2 -0
  91. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPage.d.ts +4 -0
  92. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPage.js +50 -0
  93. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPage.js.map +1 -0
  94. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPresenter.d.ts +26 -0
  95. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPresenter.js +148 -0
  96. package/admin/presentation/AiPowerUpsSettings/AiPowerUpsSettingsPresenter.js.map +1 -0
  97. package/admin/presentation/AiPowerUpsSettings/abstractions.d.ts +18 -0
  98. package/admin/presentation/AiPowerUpsSettings/abstractions.js +5 -0
  99. package/admin/presentation/AiPowerUpsSettings/abstractions.js.map +1 -0
  100. package/admin/presentation/AiPowerUpsSettings/feature.d.ts +3 -0
  101. package/admin/presentation/AiPowerUpsSettings/feature.js +25 -0
  102. package/admin/presentation/AiPowerUpsSettings/feature.js.map +1 -0
  103. package/admin/presentation/AiPowerUpsSettings/index.d.ts +3 -0
  104. package/admin/presentation/AiPowerUpsSettings/index.js +3 -0
  105. package/admin/presentation/AiPowerUpsSettings/settingsGroup.d.ts +17 -0
  106. package/admin/presentation/AiPowerUpsSettings/settingsGroup.js +5 -0
  107. package/admin/presentation/AiPowerUpsSettings/settingsGroup.js.map +1 -0
  108. package/admin/presentation/AiPowerUpsSettings/useAiPowerUpsSettings.d.ts +4 -0
  109. package/admin/presentation/AiPowerUpsSettings/useAiPowerUpsSettings.js +27 -0
  110. package/admin/presentation/AiPowerUpsSettings/useAiPowerUpsSettings.js.map +1 -0
  111. package/admin/presentation/ProjectsSettings.d.ts +11 -0
  112. package/admin/presentation/ProjectsSettings.js +56 -0
  113. package/admin/presentation/ProjectsSettings.js.map +1 -0
  114. package/admin/presentation/ProvidersSettings.d.ts +16 -0
  115. package/admin/presentation/ProvidersSettings.js +46 -0
  116. package/admin/presentation/ProvidersSettings.js.map +1 -0
  117. package/admin/presentation/ReaderPersonasSettings.d.ts +11 -0
  118. package/admin/presentation/ReaderPersonasSettings.js +37 -0
  119. package/admin/presentation/ReaderPersonasSettings.js.map +1 -0
  120. package/admin/presentation/WbContentGeneration/Extension.d.ts +2 -0
  121. package/admin/presentation/WbContentGeneration/Extension.js +22 -0
  122. package/admin/presentation/WbContentGeneration/Extension.js.map +1 -0
  123. package/admin/presentation/WbContentGeneration/GenerateContentButton.d.ts +2 -0
  124. package/admin/presentation/WbContentGeneration/GenerateContentButton.js +19 -0
  125. package/admin/presentation/WbContentGeneration/GenerateContentButton.js.map +1 -0
  126. package/admin/presentation/WbContentGeneration/GenerateContentDialog.d.ts +21 -0
  127. package/admin/presentation/WbContentGeneration/GenerateContentDialog.js +105 -0
  128. package/admin/presentation/WbContentGeneration/GenerateContentDialog.js.map +1 -0
  129. package/admin/presentation/WbContentGeneration/GenerateContentPresenter.d.ts +38 -0
  130. package/admin/presentation/WbContentGeneration/GenerateContentPresenter.js +228 -0
  131. package/admin/presentation/WbContentGeneration/GenerateContentPresenter.js.map +1 -0
  132. package/admin/presentation/WbContentGeneration/PROCESS_IDEA.md +190 -0
  133. package/admin/presentation/WbContentGeneration/abstractions.d.ts +30 -0
  134. package/admin/presentation/WbContentGeneration/abstractions.js +5 -0
  135. package/admin/presentation/WbContentGeneration/abstractions.js.map +1 -0
  136. package/admin/presentation/WbContentGeneration/decompressGzipBase64.d.ts +1 -0
  137. package/admin/presentation/WbContentGeneration/decompressGzipBase64.js +13 -0
  138. package/admin/presentation/WbContentGeneration/decompressGzipBase64.js.map +1 -0
  139. package/admin/presentation/WbContentGeneration/feature.d.ts +3 -0
  140. package/admin/presentation/WbContentGeneration/feature.js +17 -0
  141. package/admin/presentation/WbContentGeneration/feature.js.map +1 -0
  142. package/admin/presentation/WriterPersonasSettings.d.ts +11 -0
  143. package/admin/presentation/WriterPersonasSettings.js +37 -0
  144. package/admin/presentation/WriterPersonasSettings.js.map +1 -0
  145. package/admin/routes.d.ts +4 -0
  146. package/admin/routes.js +10 -0
  147. package/admin/routes.js.map +1 -0
  148. package/api/Extension.d.ts +4 -0
  149. package/api/Extension.js +37 -0
  150. package/api/Extension.js.map +1 -0
  151. package/api/constants.d.ts +1 -0
  152. package/api/constants.js +4 -0
  153. package/api/constants.js.map +1 -0
  154. package/api/features/AiImageEnrichment/AiImageEnrichmentAfterCreateHandler.d.ts +11 -0
  155. package/api/features/AiImageEnrichment/AiImageEnrichmentAfterCreateHandler.js +27 -0
  156. package/api/features/AiImageEnrichment/AiImageEnrichmentAfterCreateHandler.js.map +1 -0
  157. package/api/features/AiImageEnrichment/AiImageEnrichmentTask.d.ts +34 -0
  158. package/api/features/AiImageEnrichment/AiImageEnrichmentTask.js +140 -0
  159. package/api/features/AiImageEnrichment/AiImageEnrichmentTask.js.map +1 -0
  160. package/api/features/AiImageEnrichment/feature.d.ts +4 -0
  161. package/api/features/AiImageEnrichment/feature.js +13 -0
  162. package/api/features/AiImageEnrichment/feature.js.map +1 -0
  163. package/api/features/AiPromptContext/AiPromptContextBuilder.d.ts +12 -0
  164. package/api/features/AiPromptContext/AiPromptContextBuilder.js +103 -0
  165. package/api/features/AiPromptContext/AiPromptContextBuilder.js.map +1 -0
  166. package/api/features/AiPromptContext/ProjectFileAssembler.d.ts +22 -0
  167. package/api/features/AiPromptContext/ProjectFileAssembler.js +76 -0
  168. package/api/features/AiPromptContext/ProjectFileAssembler.js.map +1 -0
  169. package/api/features/AiPromptContext/ProjectFileCache.d.ts +16 -0
  170. package/api/features/AiPromptContext/ProjectFileCache.js +61 -0
  171. package/api/features/AiPromptContext/ProjectFileCache.js.map +1 -0
  172. package/api/features/AiPromptContext/ProjectSection.d.ts +4 -0
  173. package/api/features/AiPromptContext/ProjectSection.js +35 -0
  174. package/api/features/AiPromptContext/ProjectSection.js.map +1 -0
  175. package/api/features/AiPromptContext/ReadProjectFileTool.d.ts +3 -0
  176. package/api/features/AiPromptContext/ReadProjectFileTool.js +36 -0
  177. package/api/features/AiPromptContext/ReadProjectFileTool.js.map +1 -0
  178. package/api/features/AiPromptContext/ReaderPersonaSection.d.ts +4 -0
  179. package/api/features/AiPromptContext/ReaderPersonaSection.js +10 -0
  180. package/api/features/AiPromptContext/ReaderPersonaSection.js.map +1 -0
  181. package/api/features/AiPromptContext/WriterPersonaSection.d.ts +4 -0
  182. package/api/features/AiPromptContext/WriterPersonaSection.js +10 -0
  183. package/api/features/AiPromptContext/WriterPersonaSection.js.map +1 -0
  184. package/api/features/AiPromptContext/abstractions.d.ts +68 -0
  185. package/api/features/AiPromptContext/abstractions.js +7 -0
  186. package/api/features/AiPromptContext/abstractions.js.map +1 -0
  187. package/api/features/AiPromptContext/feature.d.ts +4 -0
  188. package/api/features/AiPromptContext/feature.js +15 -0
  189. package/api/features/AiPromptContext/feature.js.map +1 -0
  190. package/api/features/AiPromptContext/index.d.ts +1 -0
  191. package/api/features/AiPromptContext/index.js +1 -0
  192. package/api/features/ExtractFrontmatter/ExtractFrontmatterBeforeCreateHandler.d.ts +11 -0
  193. package/api/features/ExtractFrontmatter/ExtractFrontmatterBeforeCreateHandler.js +34 -0
  194. package/api/features/ExtractFrontmatter/ExtractFrontmatterBeforeCreateHandler.js.map +1 -0
  195. package/api/features/ExtractFrontmatter/feature.d.ts +4 -0
  196. package/api/features/ExtractFrontmatter/feature.js +11 -0
  197. package/api/features/ExtractFrontmatter/feature.js.map +1 -0
  198. package/api/features/GetSettings/GetSettingsRepository.d.ts +16 -0
  199. package/api/features/GetSettings/GetSettingsRepository.js +40 -0
  200. package/api/features/GetSettings/GetSettingsRepository.js.map +1 -0
  201. package/api/features/GetSettings/GetSettingsUseCase.d.ts +10 -0
  202. package/api/features/GetSettings/GetSettingsUseCase.js +18 -0
  203. package/api/features/GetSettings/GetSettingsUseCase.js.map +1 -0
  204. package/api/features/GetSettings/abstractions.d.ts +16 -0
  205. package/api/features/GetSettings/abstractions.js +6 -0
  206. package/api/features/GetSettings/abstractions.js.map +1 -0
  207. package/api/features/GetSettings/feature.d.ts +4 -0
  208. package/api/features/GetSettings/feature.js +13 -0
  209. package/api/features/GetSettings/feature.js.map +1 -0
  210. package/api/features/GetSettings/index.d.ts +1 -0
  211. package/api/features/GetSettings/index.js +1 -0
  212. package/api/features/Projects/ProjectsHandler.d.ts +31 -0
  213. package/api/features/Projects/ProjectsHandler.js +103 -0
  214. package/api/features/Projects/ProjectsHandler.js.map +1 -0
  215. package/api/features/Projects/feature.d.ts +4 -0
  216. package/api/features/Projects/feature.js +11 -0
  217. package/api/features/Projects/feature.js.map +1 -0
  218. package/api/features/Projects/types.d.ts +50 -0
  219. package/api/features/Projects/types.js +0 -0
  220. package/api/features/Providers/ProvidersGraphQLMapper.d.ts +21 -0
  221. package/api/features/Providers/ProvidersGraphQLMapper.js +39 -0
  222. package/api/features/Providers/ProvidersGraphQLMapper.js.map +1 -0
  223. package/api/features/Providers/ProvidersHandler.d.ts +26 -0
  224. package/api/features/Providers/ProvidersHandler.js +79 -0
  225. package/api/features/Providers/ProvidersHandler.js.map +1 -0
  226. package/api/features/Providers/feature.d.ts +4 -0
  227. package/api/features/Providers/feature.js +13 -0
  228. package/api/features/Providers/feature.js.map +1 -0
  229. package/api/features/Providers/index.d.ts +1 -0
  230. package/api/features/Providers/index.js +0 -0
  231. package/api/features/Providers/types.d.ts +29 -0
  232. package/api/features/Providers/types.js +0 -0
  233. package/api/features/ReaderPersonas/ReaderPersonasHandler.d.ts +20 -0
  234. package/api/features/ReaderPersonas/ReaderPersonasHandler.js +43 -0
  235. package/api/features/ReaderPersonas/ReaderPersonasHandler.js.map +1 -0
  236. package/api/features/ReaderPersonas/feature.d.ts +4 -0
  237. package/api/features/ReaderPersonas/feature.js +11 -0
  238. package/api/features/ReaderPersonas/feature.js.map +1 -0
  239. package/api/features/ReaderPersonas/index.d.ts +2 -0
  240. package/api/features/ReaderPersonas/index.js +1 -0
  241. package/api/features/ReaderPersonas/types.d.ts +24 -0
  242. package/api/features/ReaderPersonas/types.js +0 -0
  243. package/api/features/UpdateSettings/UpdateSettingsRepository.d.ts +16 -0
  244. package/api/features/UpdateSettings/UpdateSettingsRepository.js +71 -0
  245. package/api/features/UpdateSettings/UpdateSettingsRepository.js.map +1 -0
  246. package/api/features/UpdateSettings/UpdateSettingsUseCase.d.ts +13 -0
  247. package/api/features/UpdateSettings/UpdateSettingsUseCase.js +30 -0
  248. package/api/features/UpdateSettings/UpdateSettingsUseCase.js.map +1 -0
  249. package/api/features/UpdateSettings/abstractions.d.ts +36 -0
  250. package/api/features/UpdateSettings/abstractions.js +8 -0
  251. package/api/features/UpdateSettings/abstractions.js.map +1 -0
  252. package/api/features/UpdateSettings/errors.d.ts +10 -0
  253. package/api/features/UpdateSettings/errors.js +14 -0
  254. package/api/features/UpdateSettings/errors.js.map +1 -0
  255. package/api/features/UpdateSettings/events.d.ts +10 -0
  256. package/api/features/UpdateSettings/events.js +21 -0
  257. package/api/features/UpdateSettings/events.js.map +1 -0
  258. package/api/features/UpdateSettings/feature.d.ts +4 -0
  259. package/api/features/UpdateSettings/feature.js +13 -0
  260. package/api/features/UpdateSettings/feature.js.map +1 -0
  261. package/api/features/UpdateSettings/index.d.ts +1 -0
  262. package/api/features/UpdateSettings/index.js +1 -0
  263. package/api/features/WbGeneratePageContent/WbGeneratePageContentTask.d.ts +33 -0
  264. package/api/features/WbGeneratePageContent/WbGeneratePageContentTask.js +75 -0
  265. package/api/features/WbGeneratePageContent/WbGeneratePageContentTask.js.map +1 -0
  266. package/api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.d.ts +21 -0
  267. package/api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.js +106 -0
  268. package/api/features/WbGeneratePageContent/WbGeneratePageContentUseCase.js.map +1 -0
  269. package/api/features/WbGeneratePageContent/abstractions.d.ts +28 -0
  270. package/api/features/WbGeneratePageContent/abstractions.js +5 -0
  271. package/api/features/WbGeneratePageContent/abstractions.js.map +1 -0
  272. package/api/features/WbGeneratePageContent/buildPrompt.d.ts +1 -0
  273. package/api/features/WbGeneratePageContent/buildPrompt.js +143 -0
  274. package/api/features/WbGeneratePageContent/buildPrompt.js.map +1 -0
  275. package/api/features/WbGeneratePageContent/feature.d.ts +4 -0
  276. package/api/features/WbGeneratePageContent/feature.js +13 -0
  277. package/api/features/WbGeneratePageContent/feature.js.map +1 -0
  278. package/api/features/WbGeneratePageContent/index.d.ts +1 -0
  279. package/api/features/WbGeneratePageContent/index.js +1 -0
  280. package/api/features/WriterPersonas/WriterPersonasHandler.d.ts +20 -0
  281. package/api/features/WriterPersonas/WriterPersonasHandler.js +43 -0
  282. package/api/features/WriterPersonas/WriterPersonasHandler.js.map +1 -0
  283. package/api/features/WriterPersonas/feature.d.ts +4 -0
  284. package/api/features/WriterPersonas/feature.js +11 -0
  285. package/api/features/WriterPersonas/feature.js.map +1 -0
  286. package/api/features/WriterPersonas/index.d.ts +2 -0
  287. package/api/features/WriterPersonas/index.js +1 -0
  288. package/api/features/WriterPersonas/types.d.ts +24 -0
  289. package/api/features/WriterPersonas/types.js +0 -0
  290. package/api/features/shared/SettingsCache.d.ts +12 -0
  291. package/api/features/shared/SettingsCache.js +22 -0
  292. package/api/features/shared/SettingsCache.js.map +1 -0
  293. package/api/features/shared/abstractions.d.ts +33 -0
  294. package/api/features/shared/abstractions.js +7 -0
  295. package/api/features/shared/abstractions.js.map +1 -0
  296. package/api/features/shared/index.d.ts +3 -0
  297. package/api/features/shared/index.js +1 -0
  298. package/api/graphql/AiPowerUpsSettingsGraphQLMapper.d.ts +13 -0
  299. package/api/graphql/AiPowerUpsSettingsGraphQLMapper.js +44 -0
  300. package/api/graphql/AiPowerUpsSettingsGraphQLMapper.js.map +1 -0
  301. package/api/graphql/BaseGraphQLSchema.d.ts +8 -0
  302. package/api/graphql/BaseGraphQLSchema.js +133 -0
  303. package/api/graphql/BaseGraphQLSchema.js.map +1 -0
  304. package/api/graphql/abstractions.d.ts +9 -0
  305. package/api/graphql/abstractions.js +5 -0
  306. package/api/graphql/abstractions.js.map +1 -0
  307. package/api/types.d.ts +5 -0
  308. package/api/types.js +3 -0
  309. package/index.d.ts +1 -0
  310. package/index.js +1 -0
  311. package/package.json +60 -0
@@ -0,0 +1,140 @@
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 { UpdateFileUseCase } from "@webiny/api-file-manager/features/file/UpdateFile/index.js";
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";
11
+ 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
+ const aiOutputSchema = Output.object({
14
+ schema: z.object({
15
+ tags: z.array(z.string()),
16
+ description: z.string()
17
+ })
18
+ });
19
+ class AiImageEnrichmentTaskImpl {
20
+ constructor(getFile, fmSettings, updateFile, ai, getSettings, encryption, websocketService){
21
+ this.getFile = getFile;
22
+ this.fmSettings = fmSettings;
23
+ this.updateFile = updateFile;
24
+ this.ai = ai;
25
+ this.getSettings = getSettings;
26
+ this.encryption = encryption;
27
+ this.websocketService = websocketService;
28
+ this.id = AI_IMAGE_ENRICHMENT_TASK_ID;
29
+ this.title = "File Manager - AI Image Enrichment";
30
+ this.description = "Automatically enriches uploaded images with AI-generated tags and description.";
31
+ this.maxIterations = 1;
32
+ this.isPrivate = true;
33
+ this.databaseLogs = false;
34
+ this.selfCleanup = [
35
+ "onSuccess",
36
+ "onAbort"
37
+ ];
38
+ }
39
+ async run({ input, controller }) {
40
+ if (controller.runtime.isAborted()) return controller.response.aborted();
41
+ const fileResult = await this.getFile.execute(input.fileId);
42
+ if (fileResult.isFail()) return controller.response.error({
43
+ message: `File not found: ${input.fileId}`
44
+ });
45
+ const file = fileResult.value;
46
+ if (!file.type.startsWith("image/")) return controller.response.done("File is not an image; skipping AI enrichment.");
47
+ const settingsResult = await this.fmSettings.execute();
48
+ const srcPrefix = settingsResult.isOk() ? settingsResult.value.srcPrefix ?? "" : "";
49
+ 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
+ });
59
+ let tags = [];
60
+ let description = "";
61
+ try {
62
+ const aiResult = await this.ai.generateText({
63
+ model: firstProvider.model,
64
+ output: aiOutputSchema,
65
+ connection: {
66
+ sdkName: firstProvider.model.split("/")[0],
67
+ apiKey: await this.encryption.decrypt(firstProvider.apiKeyEncrypted)
68
+ },
69
+ messages: [
70
+ {
71
+ role: "user",
72
+ content: [
73
+ {
74
+ type: "image",
75
+ image: new URL(imageUrl)
76
+ },
77
+ {
78
+ type: "text",
79
+ text: AI_PROMPT
80
+ }
81
+ ]
82
+ }
83
+ ]
84
+ });
85
+ tags = aiResult.output.tags;
86
+ description = aiResult.output.description;
87
+ } catch (error) {
88
+ console.log("error", error.message);
89
+ return controller.response.error({
90
+ message: `AI enrichment failed: ${error instanceof Error ? error.message : String(error)}`
91
+ });
92
+ }
93
+ const mergedTags = [
94
+ ...new Set([
95
+ ...file.tags,
96
+ ...tags
97
+ ])
98
+ ];
99
+ const updateResult = await this.updateFile.execute({
100
+ id: file.id,
101
+ tags: mergedTags,
102
+ description
103
+ });
104
+ if (updateResult.isFail()) return controller.response.error({
105
+ message: `Failed to update file: ${updateResult.error.message}`
106
+ });
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
+ }
118
+ return controller.response.done("AI image enrichment completed successfully.");
119
+ }
120
+ }
121
+ const AiImageEnrichmentTask = TaskDefinition.createImplementation({
122
+ implementation: AiImageEnrichmentTaskImpl,
123
+ dependencies: [
124
+ GetFileUseCase,
125
+ GetSettingsUseCase,
126
+ UpdateFileUseCase,
127
+ Ai,
128
+ index_js_GetSettingsUseCase,
129
+ Encryption,
130
+ [
131
+ WebsocketService,
132
+ {
133
+ optional: true
134
+ }
135
+ ]
136
+ ]
137
+ });
138
+ export { AI_IMAGE_ENRICHMENT_TASK_ID, AiImageEnrichmentTask };
139
+
140
+ //# 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 { 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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"}
@@ -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,12 @@
1
+ import { GetSettingsUseCase } from "../../../api/features/GetSettings/index.js";
2
+ import { AiPromptContextBuilder as Abstraction, ProjectFileAssembler, type AiPromptContext, type AiPromptContextParams } from "./abstractions.js";
3
+ declare class AiPromptContextBuilderImpl implements Abstraction.Interface {
4
+ private getSettings;
5
+ private fileAssembler;
6
+ constructor(getSettings: GetSettingsUseCase.Interface, fileAssembler: ProjectFileAssembler.Interface);
7
+ execute(params: AiPromptContextParams): Promise<AiPromptContext>;
8
+ }
9
+ export declare const AiPromptContextBuilder: typeof AiPromptContextBuilderImpl & {
10
+ __abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IAiPromptContextBuilder>;
11
+ };
12
+ export {};
@@ -0,0 +1,103 @@
1
+ import { GetSettingsUseCase } from "../GetSettings/index.js";
2
+ import { AiPromptContextBuilder, ProjectFileAssembler } from "./abstractions.js";
3
+ import { WriterPersonaSection } from "./WriterPersonaSection.js";
4
+ import { ReaderPersonaSection } from "./ReaderPersonaSection.js";
5
+ import { ProjectSection } from "./ProjectSection.js";
6
+ function resolvePersonas(settings, project, params) {
7
+ const readerPersonaId = params.readerPersonaId ?? project?.defaultReaderPersonaId ?? void 0;
8
+ const writerPersonaId = params.writerPersonaId ?? project?.defaultWriterPersonaId ?? void 0;
9
+ const readerPreset = readerPersonaId ? settings.readerPersonas?.presets?.find((p)=>p.id === readerPersonaId) : void 0;
10
+ const writerPreset = writerPersonaId ? settings.writerPersonas?.presets?.find((p)=>p.id === writerPersonaId) : void 0;
11
+ return {
12
+ reader: readerPreset ? {
13
+ name: readerPreset.name,
14
+ description: readerPreset.description,
15
+ style: readerPreset.style
16
+ } : void 0,
17
+ writer: writerPreset ? {
18
+ name: writerPreset.name,
19
+ description: writerPreset.description,
20
+ style: writerPreset.style
21
+ } : void 0
22
+ };
23
+ }
24
+ function formatContext(ctx) {
25
+ const sections = [];
26
+ if (ctx.writerPersona) sections.push(WriterPersonaSection.format(ctx.writerPersona));
27
+ if (ctx.readerPersona) sections.push(ReaderPersonaSection.format(ctx.readerPersona));
28
+ if (ctx.project) {
29
+ const projectText = ProjectSection.format(ctx.project);
30
+ if (projectText) sections.push(projectText);
31
+ }
32
+ return sections.length > 0 ? "\n\n" + sections.join("\n\n") : "";
33
+ }
34
+ function emptyContext(warnings) {
35
+ return {
36
+ project: void 0,
37
+ readerPersona: void 0,
38
+ writerPersona: void 0,
39
+ allProjectFiles: [],
40
+ excludedFileIds: new Set(),
41
+ cacheHit: false,
42
+ warnings,
43
+ toString () {
44
+ return "";
45
+ }
46
+ };
47
+ }
48
+ class AiPromptContextBuilderImpl {
49
+ constructor(getSettings, fileAssembler){
50
+ this.getSettings = getSettings;
51
+ this.fileAssembler = fileAssembler;
52
+ }
53
+ async execute(params) {
54
+ const warnings = [];
55
+ const settingsResult = await this.getSettings.execute();
56
+ if (settingsResult.isFail()) {
57
+ warnings.push("Failed to load AI PowerUps settings.");
58
+ return emptyContext(warnings);
59
+ }
60
+ const settings = settingsResult.value;
61
+ const projectPreset = params.projectId ? settings.projects?.presets?.find((p)=>p.id === params.projectId) : void 0;
62
+ const { reader, writer } = resolvePersonas(settings, projectPreset, params);
63
+ const excludedFileIds = new Set(params.excludedFileIds ?? []);
64
+ let project;
65
+ let allProjectFiles = [];
66
+ let cacheHit = false;
67
+ if (projectPreset) {
68
+ const assembled = await this.fileAssembler.execute(projectPreset.id, projectPreset.version ?? 0, projectPreset.files ?? [], warnings);
69
+ allProjectFiles = assembled.files;
70
+ cacheHit = assembled.cacheHit;
71
+ const visibleFiles = excludedFileIds.size > 0 ? allProjectFiles.filter((f)=>!excludedFileIds.has(f.id)) : allProjectFiles;
72
+ project = {
73
+ name: projectPreset.name,
74
+ instructions: projectPreset.instructions,
75
+ files: visibleFiles,
76
+ totalTokens: visibleFiles.reduce((sum, f)=>sum + f.tokenCount, 0)
77
+ };
78
+ }
79
+ const ctx = {
80
+ project,
81
+ readerPersona: reader,
82
+ writerPersona: writer,
83
+ allProjectFiles,
84
+ excludedFileIds,
85
+ cacheHit,
86
+ warnings,
87
+ toString () {
88
+ return formatContext(this);
89
+ }
90
+ };
91
+ return ctx;
92
+ }
93
+ }
94
+ const AiPromptContextBuilder_AiPromptContextBuilder = AiPromptContextBuilder.createImplementation({
95
+ implementation: AiPromptContextBuilderImpl,
96
+ dependencies: [
97
+ GetSettingsUseCase,
98
+ ProjectFileAssembler
99
+ ]
100
+ });
101
+ export { AiPromptContextBuilder_AiPromptContextBuilder as AiPromptContextBuilder };
102
+
103
+ //# 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 {\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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"}
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api/features/AiPromptContext/ProjectSection.js","sources":["../../../../src/api/features/AiPromptContext/ProjectSection.ts"],"sourcesContent":["import type { ResolvedProject } from \"./abstractions.js\";\n\nexport class ProjectSection {\n static format(project: ResolvedProject): string {\n const hasInstructions = !!project.instructions;\n const hasFiles = project.files.length > 0;\n\n if (!hasInstructions && !hasFiles) {\n return \"\";\n }\n\n const parts: string[] = [`## Project: ${project.name}`];\n\n if (hasInstructions) {\n parts.push(project.instructions!);\n }\n\n if (hasFiles) {\n parts.push(\n [\n \"### Available reference files\",\n \"\",\n `You have access to ${project.files.length} reference files for this project. Use the`,\n \"`read_project_file` tool to read any file when its contents are relevant\",\n \"to the user's request. Read files only when needed — do not read all files\",\n \"preemptively.\",\n \"\",\n \"Files:\",\n \"\",\n ...project.files.map(file => {\n const lines = [\n `- id: \"${file.id}\"`,\n ` name: \"${file.name}\"`,\n ` description: \"${file.description || \"(no description)\"}\"`,\n ` tokens: ~${file.tokenCount}`\n ];\n return lines.join(\"\\n\");\n })\n ].join(\"\\n\")\n );\n }\n\n return parts.join(\"\\n\\n\");\n }\n}\n"],"names":["ProjectSection","project","hasInstructions","hasFiles","parts","file","lines"],"mappings":"AAEO,MAAMA;IACT,OAAO,OAAOC,OAAwB,EAAU;QAC5C,MAAMC,kBAAkB,CAAC,CAACD,QAAQ,YAAY;QAC9C,MAAME,WAAWF,QAAQ,KAAK,CAAC,MAAM,GAAG;QAExC,IAAI,CAACC,mBAAmB,CAACC,UACrB,OAAO;QAGX,MAAMC,QAAkB;YAAC,CAAC,YAAY,EAAEH,QAAQ,IAAI,EAAE;SAAC;QAEvD,IAAIC,iBACAE,MAAM,IAAI,CAACH,QAAQ,YAAY;QAGnC,IAAIE,UACAC,MAAM,IAAI,CACN;YACI;YACA;YACA,CAAC,mBAAmB,EAAEH,QAAQ,KAAK,CAAC,MAAM,CAAC,0CAA0C,CAAC;YACtF;YACA;YACA;YACA;YACA;YACA;eACGA,QAAQ,KAAK,CAAC,GAAG,CAACI,CAAAA;gBACjB,MAAMC,QAAQ;oBACV,CAAC,OAAO,EAAED,KAAK,EAAE,CAAC,CAAC,CAAC;oBACpB,CAAC,SAAS,EAAEA,KAAK,IAAI,CAAC,CAAC,CAAC;oBACxB,CAAC,gBAAgB,EAAEA,KAAK,WAAW,IAAI,mBAAmB,CAAC,CAAC;oBAC5D,CAAC,WAAW,EAAEA,KAAK,UAAU,EAAE;iBAClC;gBACD,OAAOC,MAAM,IAAI,CAAC;YACtB;SACH,CAAC,IAAI,CAAC;QAIf,OAAOF,MAAM,IAAI,CAAC;IACtB;AACJ"}
@@ -0,0 +1,3 @@
1
+ import type { ToolSet } from "ai";
2
+ import type { ProjectFileContent } from "./abstractions.js";
3
+ export declare function createReadProjectFileTool(files: ProjectFileContent[], excludedFileIds: Set<string>): ToolSet;
@@ -0,0 +1,36 @@
1
+ import { z } from "zod";
2
+ const inputSchema = z.object({
3
+ fileId: z.string().describe("The id of the file from the project manifest.")
4
+ });
5
+ function createReadProjectFileTool(files, excludedFileIds) {
6
+ const fileMap = new Map(files.map((f)=>[
7
+ f.id,
8
+ f
9
+ ]));
10
+ return {
11
+ read_project_file: {
12
+ description: "Read the full contents of a project reference file by its id. Use this when a file from the manifest contains information relevant to the user's request.",
13
+ inputSchema: inputSchema,
14
+ execute: async (input)=>{
15
+ const { fileId } = input;
16
+ if (excludedFileIds.has(fileId)) return {
17
+ error: "File excluded for this generation."
18
+ };
19
+ const file = fileMap.get(fileId);
20
+ if (!file) {
21
+ const availableIds = files.map((f)=>f.id).join(", ");
22
+ return {
23
+ error: `File not found. Available ids: ${availableIds}`
24
+ };
25
+ }
26
+ return {
27
+ content: file.content,
28
+ name: file.name
29
+ };
30
+ }
31
+ }
32
+ };
33
+ }
34
+ export { createReadProjectFileTool };
35
+
36
+ //# sourceMappingURL=ReadProjectFileTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api/features/AiPromptContext/ReadProjectFileTool.js","sources":["../../../../src/api/features/AiPromptContext/ReadProjectFileTool.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type { ToolSet } from \"ai\";\nimport type { ProjectFileContent } from \"./abstractions.js\";\n\nconst inputSchema = z.object({\n fileId: z.string().describe(\"The id of the file from the project manifest.\")\n});\n\nexport function createReadProjectFileTool(\n files: ProjectFileContent[],\n excludedFileIds: Set<string>\n): ToolSet {\n const fileMap = new Map(files.map(f => [f.id, f]));\n\n return {\n read_project_file: {\n description:\n \"Read the full contents of a project reference file by its id. \" +\n \"Use this when a file from the manifest contains information relevant to the user's request.\",\n inputSchema,\n execute: async (input: unknown) => {\n const { fileId } = input as z.infer<typeof inputSchema>;\n\n if (excludedFileIds.has(fileId)) {\n return { error: \"File excluded for this generation.\" };\n }\n\n const file = fileMap.get(fileId);\n if (!file) {\n const availableIds = files.map(f => f.id).join(\", \");\n return {\n error: `File not found. Available ids: ${availableIds}`\n };\n }\n\n return {\n content: file.content,\n name: file.name\n };\n }\n }\n };\n}\n"],"names":["inputSchema","z","createReadProjectFileTool","files","excludedFileIds","fileMap","Map","f","input","fileId","file","availableIds"],"mappings":";AAIA,MAAMA,cAAcC,EAAE,MAAM,CAAC;IACzB,QAAQA,EAAE,MAAM,GAAG,QAAQ,CAAC;AAChC;AAEO,SAASC,0BACZC,KAA2B,EAC3BC,eAA4B;IAE5B,MAAMC,UAAU,IAAIC,IAAIH,MAAM,GAAG,CAACI,CAAAA,IAAK;YAACA,EAAE,EAAE;YAAEA;SAAE;IAEhD,OAAO;QACH,mBAAmB;YACf,aACI;YAEJP,aAAAA;YACA,SAAS,OAAOQ;gBACZ,MAAM,EAAEC,MAAM,EAAE,GAAGD;gBAEnB,IAAIJ,gBAAgB,GAAG,CAACK,SACpB,OAAO;oBAAE,OAAO;gBAAqC;gBAGzD,MAAMC,OAAOL,QAAQ,GAAG,CAACI;gBACzB,IAAI,CAACC,MAAM;oBACP,MAAMC,eAAeR,MAAM,GAAG,CAACI,CAAAA,IAAKA,EAAE,EAAE,EAAE,IAAI,CAAC;oBAC/C,OAAO;wBACH,OAAO,CAAC,+BAA+B,EAAEI,cAAc;oBAC3D;gBACJ;gBAEA,OAAO;oBACH,SAASD,KAAK,OAAO;oBACrB,MAAMA,KAAK,IAAI;gBACnB;YACJ;QACJ;IACJ;AACJ"}
@@ -0,0 +1,4 @@
1
+ import type { ResolvedPersona } from "./abstractions.js";
2
+ export declare class ReaderPersonaSection {
3
+ static format(persona: ResolvedPersona): string;
4
+ }