@ai-stack/payloadcms 3.76.0-beta.0 → 3.76.0-beta.2

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 (349) hide show
  1. package/dist/ai/core/generateObject.js +1 -4
  2. package/dist/ai/core/generateObject.js.map +1 -1
  3. package/dist/ai/core/generateText.js +1 -5
  4. package/dist/ai/core/generateText.js.map +1 -1
  5. package/dist/ai/core/media/generateMedia.js +1 -4
  6. package/dist/ai/core/media/generateMedia.js.map +1 -1
  7. package/dist/ai/core/media/image/generateImage.js +4 -14
  8. package/dist/ai/core/media/image/generateImage.js.map +1 -1
  9. package/dist/ai/core/media/image/handlers/multimodal.js +21 -58
  10. package/dist/ai/core/media/image/handlers/multimodal.js.map +1 -1
  11. package/dist/ai/core/media/image/handlers/standard.js +17 -9
  12. package/dist/ai/core/media/image/handlers/standard.js.map +1 -1
  13. package/dist/ai/core/media/speech/generateSpeech.js +10 -11
  14. package/dist/ai/core/media/speech/generateSpeech.js.map +1 -1
  15. package/dist/ai/core/media/types.d.ts +3 -4
  16. package/dist/ai/core/media/types.js.map +1 -1
  17. package/dist/ai/core/streamObject.js +0 -3
  18. package/dist/ai/core/streamObject.js.map +1 -1
  19. package/dist/ai/core/streamText.js +1 -4
  20. package/dist/ai/core/streamText.js.map +1 -1
  21. package/dist/ai/core/types.d.ts +2 -2
  22. package/dist/ai/core/types.js.map +1 -1
  23. package/dist/ai/providers/blocks/anthropic.js +0 -42
  24. package/dist/ai/providers/blocks/anthropic.js.map +1 -1
  25. package/dist/ai/providers/blocks/elevenlabs.js +1 -106
  26. package/dist/ai/providers/blocks/elevenlabs.js.map +1 -1
  27. package/dist/ai/providers/blocks/fal.js +0 -118
  28. package/dist/ai/providers/blocks/fal.js.map +1 -1
  29. package/dist/ai/providers/blocks/google.js +2 -236
  30. package/dist/ai/providers/blocks/google.js.map +1 -1
  31. package/dist/ai/providers/blocks/openai-compatible.js +0 -144
  32. package/dist/ai/providers/blocks/openai-compatible.js.map +1 -1
  33. package/dist/ai/providers/blocks/openai.js +0 -200
  34. package/dist/ai/providers/blocks/openai.js.map +1 -1
  35. package/dist/ai/providers/blocks/xai.js +0 -53
  36. package/dist/ai/providers/blocks/xai.js.map +1 -1
  37. package/dist/ai/providers/index.d.ts +1 -1
  38. package/dist/ai/providers/index.js +0 -2
  39. package/dist/ai/providers/index.js.map +1 -1
  40. package/dist/ai/providers/registry.d.ts +24 -28
  41. package/dist/ai/providers/registry.js +186 -140
  42. package/dist/ai/providers/registry.js.map +1 -1
  43. package/dist/ai/providers/types.d.ts +12 -33
  44. package/dist/ai/providers/types.js +0 -1
  45. package/dist/ai/providers/types.js.map +1 -1
  46. package/dist/ai/schemas/lexicalJsonSchema.js +1 -1
  47. package/dist/ai/schemas/lexicalJsonSchema.js.map +1 -1
  48. package/dist/ai/utilities/filterEditorSchemaByNodes.js.map +1 -0
  49. package/dist/ai/utilities/generateFileNameByPrompt.js.map +1 -0
  50. package/dist/ai/utilities/isObjectSchema.js.map +1 -0
  51. package/dist/ai/utilities/nodeToSchemaMap.js.map +1 -0
  52. package/dist/ai/{prompts.d.ts → utilities/prompts.d.ts} +1 -1
  53. package/dist/ai/utilities/prompts.js.map +1 -0
  54. package/dist/ai/utilities/systemGenerate.js.map +1 -0
  55. package/dist/collections/AIJobs.js +3 -12
  56. package/dist/collections/AIJobs.js.map +1 -1
  57. package/dist/collections/AIProviders.d.ts +2 -0
  58. package/dist/collections/{AISettings.js → AIProviders.js} +54 -26
  59. package/dist/collections/AIProviders.js.map +1 -0
  60. package/dist/collections/Instructions.js +93 -57
  61. package/dist/collections/Instructions.js.map +1 -1
  62. package/dist/collections/shared.d.ts +30 -0
  63. package/dist/collections/shared.js +15 -0
  64. package/dist/collections/shared.js.map +1 -0
  65. package/dist/defaults.js +1 -1
  66. package/dist/defaults.js.map +1 -1
  67. package/dist/endpoints/fetchFields.js +15 -7
  68. package/dist/endpoints/fetchFields.js.map +1 -1
  69. package/dist/endpoints/fetchVoices.js +2 -2
  70. package/dist/endpoints/fetchVoices.js.map +1 -1
  71. package/dist/endpoints/generate.d.ts +7 -0
  72. package/dist/endpoints/generate.js +268 -0
  73. package/dist/endpoints/generate.js.map +1 -0
  74. package/dist/endpoints/index.js +9 -604
  75. package/dist/endpoints/index.js.map +1 -1
  76. package/dist/endpoints/promptMentions.d.ts +2 -0
  77. package/dist/endpoints/promptMentions.js +166 -0
  78. package/dist/endpoints/promptMentions.js.map +1 -0
  79. package/dist/endpoints/upload.d.ts +7 -0
  80. package/dist/endpoints/upload.js +294 -0
  81. package/dist/endpoints/upload.js.map +1 -0
  82. package/dist/endpoints/videogenWebhook.d.ts +7 -0
  83. package/dist/endpoints/videogenWebhook.js +132 -0
  84. package/dist/endpoints/videogenWebhook.js.map +1 -0
  85. package/dist/exports/client.d.ts +3 -2
  86. package/dist/exports/client.js +3 -2
  87. package/dist/exports/client.js.map +1 -1
  88. package/dist/exports/fields.d.ts +2 -1
  89. package/dist/exports/fields.js +2 -1
  90. package/dist/exports/fields.js.map +1 -1
  91. package/dist/fields/ArrayComposeField/ArrayComposeField.js +1 -1
  92. package/dist/fields/ArrayComposeField/ArrayComposeField.js.map +1 -1
  93. package/dist/fields/ArrayComposeField/ArrayComposeField.jsx +1 -1
  94. package/dist/fields/ComposeField/ComposeField.d.ts +1 -0
  95. package/dist/fields/ComposeField/ComposeField.js +18 -8
  96. package/dist/fields/ComposeField/ComposeField.js.map +1 -1
  97. package/dist/fields/ComposeField/ComposeField.jsx +12 -7
  98. package/dist/fields/PromptEditorField/feature.client.d.ts +1 -0
  99. package/dist/fields/PromptEditorField/feature.client.js +173 -0
  100. package/dist/fields/PromptEditorField/feature.client.js.map +1 -0
  101. package/dist/fields/PromptEditorField/feature.client.jsx +148 -0
  102. package/dist/fields/PromptEditorField/feature.server.d.ts +1 -0
  103. package/dist/fields/PromptEditorField/feature.server.js +30 -0
  104. package/dist/fields/PromptEditorField/feature.server.js.map +1 -0
  105. package/dist/fields/PromptField.d.ts +4 -0
  106. package/dist/fields/PromptField.js +18 -0
  107. package/dist/fields/PromptField.js.map +1 -0
  108. package/dist/fields/SelectField/SelectField.js +0 -1
  109. package/dist/fields/SelectField/SelectField.js.map +1 -1
  110. package/dist/fields/SelectField/SelectField.jsx +0 -1
  111. package/dist/index.d.ts +4 -3
  112. package/dist/index.js +4 -2
  113. package/dist/index.js.map +1 -1
  114. package/dist/libraries/handlebars/helpers.js +2 -2
  115. package/dist/libraries/handlebars/helpers.js.map +1 -1
  116. package/dist/libraries/handlebars/replacePlaceholders.js +5 -1
  117. package/dist/libraries/handlebars/replacePlaceholders.js.map +1 -1
  118. package/dist/payload-ai.d.ts +5 -19
  119. package/dist/plugin.js +19 -22
  120. package/dist/plugin.js.map +1 -1
  121. package/dist/providers/FieldProvider/FieldProvider.js +10 -19
  122. package/dist/providers/FieldProvider/FieldProvider.js.map +1 -1
  123. package/dist/providers/FieldProvider/FieldProvider.jsx +7 -17
  124. package/dist/providers/InstructionsProvider/InstructionsProvider.js +4 -1
  125. package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
  126. package/dist/providers/InstructionsProvider/InstructionsProvider.jsx +3 -0
  127. package/dist/providers/InstructionsProvider/useInstructions.js +1 -1
  128. package/dist/providers/InstructionsProvider/useInstructions.js.map +1 -1
  129. package/dist/translations/de.json +47 -0
  130. package/dist/translations/en.json +45 -2
  131. package/dist/translations/es.json +45 -2
  132. package/dist/translations/fa.json +45 -2
  133. package/dist/translations/fr.json +46 -3
  134. package/dist/translations/hi.json +47 -0
  135. package/dist/translations/index.d.ts +88 -26
  136. package/dist/translations/index.js +18 -32
  137. package/dist/translations/index.js.map +1 -1
  138. package/dist/translations/ja.json +47 -0
  139. package/dist/translations/nb.json +47 -0
  140. package/dist/translations/nl.json +47 -0
  141. package/dist/translations/pl.json +45 -2
  142. package/dist/translations/pt.json +47 -0
  143. package/dist/translations/ru.json +45 -2
  144. package/dist/translations/th.json +47 -0
  145. package/dist/translations/translation-schema.json +184 -11
  146. package/dist/translations/uk.json +45 -2
  147. package/dist/translations/zh.json +47 -0
  148. package/dist/types.d.ts +57 -31
  149. package/dist/types.js.map +1 -1
  150. package/dist/ui/Compose/Compose.js +42 -79
  151. package/dist/ui/Compose/Compose.js.map +1 -1
  152. package/dist/ui/Compose/Compose.jsx +32 -86
  153. package/dist/ui/Compose/ComposePlaceholder.js +1 -1
  154. package/dist/ui/Compose/ComposePlaceholder.js.map +1 -1
  155. package/dist/ui/Compose/ComposePlaceholder.jsx +1 -1
  156. package/dist/ui/Compose/{compose.module.css → compose.module.scss} +3 -5
  157. package/dist/ui/Compose/hooks/menu/Item.d.ts +1 -1
  158. package/dist/ui/Compose/hooks/menu/Item.js +7 -3
  159. package/dist/ui/Compose/hooks/menu/Item.js.map +1 -1
  160. package/dist/ui/Compose/hooks/menu/Item.jsx +11 -5
  161. package/dist/ui/Compose/hooks/menu/TranslateMenu.d.ts +5 -0
  162. package/dist/ui/Compose/hooks/menu/TranslateMenu.js +48 -5
  163. package/dist/ui/Compose/hooks/menu/TranslateMenu.js.map +1 -1
  164. package/dist/ui/Compose/hooks/menu/TranslateMenu.jsx +44 -6
  165. package/dist/ui/Compose/hooks/menu/items.d.ts +8 -8
  166. package/dist/ui/Compose/hooks/menu/itemsMap.d.ts +2 -1
  167. package/dist/ui/Compose/hooks/menu/itemsMap.js.map +1 -1
  168. package/dist/ui/Compose/hooks/menu/menu.module.scss +4 -1
  169. package/dist/ui/Compose/hooks/menu/types.d.ts +21 -0
  170. package/dist/ui/Compose/hooks/menu/types.js +3 -0
  171. package/dist/ui/Compose/hooks/menu/types.js.map +1 -0
  172. package/dist/ui/Compose/hooks/menu/useMenu.d.ts +2 -2
  173. package/dist/ui/Compose/hooks/menu/useMenu.js +45 -23
  174. package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
  175. package/dist/ui/Compose/hooks/menu/useMenu.jsx +43 -23
  176. package/dist/ui/Compose/hooks/mergeGeneratedValue.d.ts +14 -0
  177. package/dist/ui/Compose/hooks/mergeGeneratedValue.js +38 -0
  178. package/dist/ui/Compose/hooks/mergeGeneratedValue.js.map +1 -0
  179. package/dist/ui/Compose/hooks/useActiveFieldTracking.js +34 -0
  180. package/dist/ui/Compose/hooks/useActiveFieldTracking.js.map +1 -1
  181. package/dist/ui/Compose/hooks/useGenerate.js +37 -12
  182. package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
  183. package/dist/ui/Compose/hooks/useGenerateUpload.js +67 -19
  184. package/dist/ui/Compose/hooks/useGenerateUpload.js.map +1 -1
  185. package/dist/ui/Compose/hooks/useStreamingUpdate.js +4 -4
  186. package/dist/ui/Compose/hooks/useStreamingUpdate.js.map +1 -1
  187. package/dist/ui/ConfigDashboard/configDashboard.module.css +94 -0
  188. package/dist/ui/ConfigDashboard/index.d.ts +2 -0
  189. package/dist/ui/ConfigDashboard/index.js +159 -0
  190. package/dist/ui/ConfigDashboard/index.js.map +1 -0
  191. package/dist/ui/ConfigDashboard/index.jsx +122 -0
  192. package/dist/ui/DynamicModelSelect/index.js +6 -27
  193. package/dist/ui/DynamicModelSelect/index.js.map +1 -1
  194. package/dist/ui/DynamicModelSelect/index.jsx +6 -29
  195. package/dist/ui/DynamicProviderSelect/index.js +6 -27
  196. package/dist/ui/DynamicProviderSelect/index.js.map +1 -1
  197. package/dist/ui/DynamicProviderSelect/index.jsx +6 -29
  198. package/dist/ui/DynamicVoiceSelect/index.js +34 -83
  199. package/dist/ui/DynamicVoiceSelect/index.js.map +1 -1
  200. package/dist/ui/DynamicVoiceSelect/index.jsx +16 -53
  201. package/dist/ui/GlobalProviderOptions/index.d.ts +2 -0
  202. package/dist/ui/GlobalProviderOptions/index.js +118 -0
  203. package/dist/ui/GlobalProviderOptions/index.js.map +1 -0
  204. package/dist/ui/GlobalProviderOptions/index.jsx +60 -0
  205. package/dist/ui/Icons/Icons.js +1 -1
  206. package/dist/ui/Icons/Icons.js.map +1 -1
  207. package/dist/ui/Icons/Icons.jsx +1 -1
  208. package/dist/ui/Icons/LottieAnimation.js +1 -1
  209. package/dist/ui/Icons/LottieAnimation.js.map +1 -1
  210. package/dist/ui/Icons/LottieAnimation.jsx +1 -1
  211. package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.d.ts +12 -0
  212. package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.js +166 -0
  213. package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.js.map +1 -0
  214. package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.jsx +83 -0
  215. package/dist/ui/InstructionProviderOptions/index.d.ts +2 -0
  216. package/dist/ui/InstructionProviderOptions/index.js +157 -0
  217. package/dist/ui/InstructionProviderOptions/index.js.map +1 -0
  218. package/dist/ui/InstructionProviderOptions/index.jsx +92 -0
  219. package/dist/ui/VoicesFetcher/index.js.map +1 -1
  220. package/dist/ui/hooks/useAISettings.d.ts +26 -0
  221. package/dist/ui/hooks/useAISettings.js +73 -0
  222. package/dist/ui/hooks/useAISettings.js.map +1 -0
  223. package/dist/ui/providerOptions/updateProviderOptionsValue.d.ts +6 -0
  224. package/dist/ui/providerOptions/updateProviderOptionsValue.js +50 -0
  225. package/dist/ui/providerOptions/updateProviderOptionsValue.js.map +1 -0
  226. package/dist/ui/shared/handleSelectChange.d.ts +5 -0
  227. package/dist/ui/shared/handleSelectChange.js +12 -0
  228. package/dist/ui/shared/handleSelectChange.js.map +1 -0
  229. package/dist/ui/shared/types.d.ts +11 -0
  230. package/dist/ui/shared/types.js +5 -0
  231. package/dist/ui/shared/types.js.map +1 -0
  232. package/dist/utilities/ai/resolveEffectiveInstructionSettings.d.ts +15 -0
  233. package/dist/utilities/ai/resolveEffectiveInstructionSettings.js +136 -0
  234. package/dist/utilities/ai/resolveEffectiveInstructionSettings.js.map +1 -0
  235. package/dist/{endpoints → utilities}/buildPromptUtils.js +14 -5
  236. package/dist/utilities/buildPromptUtils.js.map +1 -0
  237. package/dist/utilities/buildSmartPrompt.js +3 -3
  238. package/dist/utilities/buildSmartPrompt.js.map +1 -1
  239. package/dist/utilities/fields/fieldToJsonSchema.js.map +1 -0
  240. package/dist/utilities/fields/getFieldBySchemaPath.js.map +1 -0
  241. package/dist/utilities/fields/getFieldInfo.js.map +1 -0
  242. package/dist/utilities/{updateFieldsConfig.js → fields/updateFieldsConfig.js} +8 -3
  243. package/dist/utilities/fields/updateFieldsConfig.js.map +1 -0
  244. package/dist/utilities/images/extractImageData.js.map +1 -0
  245. package/dist/utilities/images/extractPromptAttachments.js.map +1 -0
  246. package/dist/utilities/{fetchImages.d.ts → images/fetchImages.d.ts} +1 -1
  247. package/dist/utilities/images/fetchImages.js +49 -0
  248. package/dist/utilities/images/fetchImages.js.map +1 -0
  249. package/dist/utilities/images/resolveImageReferences.js +183 -0
  250. package/dist/utilities/images/resolveImageReferences.js.map +1 -0
  251. package/dist/utilities/init/autoSetupProviders.d.ts +3 -0
  252. package/dist/utilities/init/autoSetupProviders.js +216 -0
  253. package/dist/utilities/init/autoSetupProviders.js.map +1 -0
  254. package/dist/utilities/lexical/editorSchemaValidator.js.map +1 -0
  255. package/dist/utilities/lexical/lexicalToHTML.js.map +1 -0
  256. package/dist/utilities/lexical/lexicalToPromptTemplate.d.ts +2 -0
  257. package/dist/utilities/lexical/lexicalToPromptTemplate.js +50 -0
  258. package/dist/utilities/lexical/lexicalToPromptTemplate.js.map +1 -0
  259. package/dist/utilities/lexical/setSafeLexicalState.js.map +1 -0
  260. package/dist/utilities/lexical/stringToLexicalJSON.d.ts +2 -0
  261. package/dist/utilities/lexical/stringToLexicalJSON.js +39 -0
  262. package/dist/utilities/lexical/stringToLexicalJSON.js.map +1 -0
  263. package/dist/utilities/sanitizeLog.d.ts +1 -0
  264. package/dist/utilities/sanitizeLog.js +39 -0
  265. package/dist/utilities/sanitizeLog.js.map +1 -0
  266. package/dist/utilities/seedProperties.js +37 -22
  267. package/dist/utilities/seedProperties.js.map +1 -1
  268. package/package.json +5 -2
  269. package/dist/ai/analyse.d.ts +0 -1
  270. package/dist/ai/analyse.js +0 -3
  271. package/dist/ai/analyse.js.map +0 -1
  272. package/dist/ai/index.d.ts +0 -11
  273. package/dist/ai/index.js +0 -25
  274. package/dist/ai/index.js.map +0 -1
  275. package/dist/ai/prompts.js.map +0 -1
  276. package/dist/ai/utils/filterEditorSchemaByNodes.js.map +0 -1
  277. package/dist/ai/utils/generateFileNameByPrompt.js.map +0 -1
  278. package/dist/ai/utils/isObjectSchema.js.map +0 -1
  279. package/dist/ai/utils/nodeToSchemaMap.js.map +0 -1
  280. package/dist/ai/utils/systemGenerate.js.map +0 -1
  281. package/dist/collections/AISettings.d.ts +0 -2
  282. package/dist/collections/AISettings.js.map +0 -1
  283. package/dist/endpoints/buildPromptUtils.js.map +0 -1
  284. package/dist/endpoints/chat.d.ts +0 -4
  285. package/dist/fields/PromptEditorField/PromptEditorField.d.ts +0 -3
  286. package/dist/fields/PromptEditorField/PromptEditorField.js +0 -217
  287. package/dist/fields/PromptEditorField/PromptEditorField.js.map +0 -1
  288. package/dist/fields/PromptEditorField/PromptEditorField.jsx +0 -160
  289. package/dist/ui/AIConfigDashboard/index.d.ts +0 -2
  290. package/dist/ui/AIConfigDashboard/index.js +0 -222
  291. package/dist/ui/AIConfigDashboard/index.js.map +0 -1
  292. package/dist/ui/AIConfigDashboard/index.jsx +0 -170
  293. package/dist/ui/ProviderOptionsEditor/index.d.ts +0 -7
  294. package/dist/ui/ProviderOptionsEditor/index.js +0 -291
  295. package/dist/ui/ProviderOptionsEditor/index.js.map +0 -1
  296. package/dist/ui/ProviderOptionsEditor/index.jsx +0 -210
  297. package/dist/utilities/editorSchemaValidator.js.map +0 -1
  298. package/dist/utilities/extractImageData.js.map +0 -1
  299. package/dist/utilities/extractPromptAttachments.js.map +0 -1
  300. package/dist/utilities/fetchImages.js +0 -38
  301. package/dist/utilities/fetchImages.js.map +0 -1
  302. package/dist/utilities/fieldToJsonSchema.js.map +0 -1
  303. package/dist/utilities/getFieldBySchemaPath.js.map +0 -1
  304. package/dist/utilities/getFieldInfo.js.map +0 -1
  305. package/dist/utilities/getProviderOptionsFields.d.ts +0 -16
  306. package/dist/utilities/getProviderOptionsFields.js +0 -80
  307. package/dist/utilities/getProviderOptionsFields.js.map +0 -1
  308. package/dist/utilities/isPluginActivated.d.ts +0 -2
  309. package/dist/utilities/isPluginActivated.js +0 -5
  310. package/dist/utilities/isPluginActivated.js.map +0 -1
  311. package/dist/utilities/lexicalToHTML.js.map +0 -1
  312. package/dist/utilities/resolveImageReferences.js +0 -167
  313. package/dist/utilities/resolveImageReferences.js.map +0 -1
  314. package/dist/utilities/schemaConverter.d.ts +0 -3
  315. package/dist/utilities/schemaConverter.js +0 -93
  316. package/dist/utilities/schemaConverter.js.map +0 -1
  317. package/dist/utilities/setSafeLexicalState.js.map +0 -1
  318. package/dist/utilities/updateFieldsConfig.js.map +0 -1
  319. /package/dist/ai/{utils → utilities}/filterEditorSchemaByNodes.d.ts +0 -0
  320. /package/dist/ai/{utils → utilities}/filterEditorSchemaByNodes.js +0 -0
  321. /package/dist/ai/{utils → utilities}/generateFileNameByPrompt.d.ts +0 -0
  322. /package/dist/ai/{utils → utilities}/generateFileNameByPrompt.js +0 -0
  323. /package/dist/ai/{utils → utilities}/isObjectSchema.d.ts +0 -0
  324. /package/dist/ai/{utils → utilities}/isObjectSchema.js +0 -0
  325. /package/dist/ai/{utils → utilities}/nodeToSchemaMap.d.ts +0 -0
  326. /package/dist/ai/{utils → utilities}/nodeToSchemaMap.js +0 -0
  327. /package/dist/ai/{prompts.js → utilities/prompts.js} +0 -0
  328. /package/dist/ai/{utils → utilities}/systemGenerate.d.ts +0 -0
  329. /package/dist/ai/{utils → utilities}/systemGenerate.js +0 -0
  330. /package/dist/ui/Icons/{icons.module.css → icons.module.scss} +0 -0
  331. /package/dist/{endpoints → utilities}/buildPromptUtils.d.ts +0 -0
  332. /package/dist/utilities/{fieldToJsonSchema.d.ts → fields/fieldToJsonSchema.d.ts} +0 -0
  333. /package/dist/utilities/{fieldToJsonSchema.js → fields/fieldToJsonSchema.js} +0 -0
  334. /package/dist/utilities/{getFieldBySchemaPath.d.ts → fields/getFieldBySchemaPath.d.ts} +0 -0
  335. /package/dist/utilities/{getFieldBySchemaPath.js → fields/getFieldBySchemaPath.js} +0 -0
  336. /package/dist/utilities/{getFieldInfo.d.ts → fields/getFieldInfo.d.ts} +0 -0
  337. /package/dist/utilities/{getFieldInfo.js → fields/getFieldInfo.js} +0 -0
  338. /package/dist/utilities/{updateFieldsConfig.d.ts → fields/updateFieldsConfig.d.ts} +0 -0
  339. /package/dist/utilities/{extractImageData.d.ts → images/extractImageData.d.ts} +0 -0
  340. /package/dist/utilities/{extractImageData.js → images/extractImageData.js} +0 -0
  341. /package/dist/utilities/{extractPromptAttachments.d.ts → images/extractPromptAttachments.d.ts} +0 -0
  342. /package/dist/utilities/{extractPromptAttachments.js → images/extractPromptAttachments.js} +0 -0
  343. /package/dist/utilities/{resolveImageReferences.d.ts → images/resolveImageReferences.d.ts} +0 -0
  344. /package/dist/utilities/{editorSchemaValidator.d.ts → lexical/editorSchemaValidator.d.ts} +0 -0
  345. /package/dist/utilities/{editorSchemaValidator.js → lexical/editorSchemaValidator.js} +0 -0
  346. /package/dist/utilities/{lexicalToHTML.d.ts → lexical/lexicalToHTML.d.ts} +0 -0
  347. /package/dist/utilities/{lexicalToHTML.js → lexical/lexicalToHTML.js} +0 -0
  348. /package/dist/utilities/{setSafeLexicalState.d.ts → lexical/setSafeLexicalState.d.ts} +0 -0
  349. /package/dist/utilities/{setSafeLexicalState.js → lexical/setSafeLexicalState.js} +0 -0
@@ -1,12 +1,15 @@
1
1
  export const updateFieldsConfig = (collectionConfig)=>{
2
2
  let schemaPathMap = {};
3
3
  function updateField(field, parentPath = '') {
4
- const currentPath = parentPath ? `${parentPath}.${field.name}` : field.name;
4
+ const currentPath = field.name ? parentPath ? `${parentPath}.${field.name}` : field.name : parentPath;
5
5
  const currentSchemaPath = `${collectionConfig.slug}.${currentPath}`;
6
6
  // Disabled fields/ field types
7
7
  if (field.admin?.disabled || field.admin?.readOnly || field.admin?.hidden || field.type === 'row') {
8
8
  return field;
9
9
  }
10
+ // Developer opt-out: custom.ai.enabled === false skips compose injection entirely
11
+ const aiConfig = field.custom?.ai;
12
+ const isAiDisabledByDev = aiConfig?.enabled === false;
10
13
  // Map field path for global fieldInstructionsMap to load related instructions
11
14
  // This is done due to save extra API call to get instructions when Field components are loaded in admin
12
15
  // Doing is will only call instructions data when user clicks on settings
@@ -16,12 +19,13 @@ export const updateFieldsConfig = (collectionConfig)=>{
16
19
  'text',
17
20
  'textarea',
18
21
  'upload'
19
- ].includes(field.type)) {
22
+ ].includes(field.type) && !isAiDisabledByDev) {
20
23
  schemaPathMap = {
21
24
  ...schemaPathMap,
22
25
  [currentSchemaPath]: {
23
26
  type: field.type,
24
27
  custom: field.custom,
28
+ hasMany: field.hasMany === true,
25
29
  label: field.label || field.name,
26
30
  relationTo: field.relationTo
27
31
  }
@@ -34,7 +38,7 @@ export const updateFieldsConfig = (collectionConfig)=>{
34
38
  'text',
35
39
  'textarea',
36
40
  'upload'
37
- ].includes(field.type)) {
41
+ ].includes(field.type) && !isAiDisabledByDev) {
38
42
  let customField = {};
39
43
  // Custom fields don't fully adhere to the Payload schema, making it difficult to
40
44
  // determine which components support injecting ComposeField as a Description.
@@ -54,6 +58,7 @@ export const updateFieldsConfig = (collectionConfig)=>{
54
58
  ...field.admin?.components || {},
55
59
  Description: {
56
60
  clientProps: {
61
+ alwaysShow: !!aiConfig?.alwaysShow,
57
62
  schemaPath: currentSchemaPath
58
63
  },
59
64
  path: componentPath
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utilities/fields/updateFieldsConfig.ts"],"sourcesContent":["import type { CollectionConfig, GlobalConfig } from 'payload'\n\ninterface UpdateFieldsConfig {\n schemaPathMap: Record<string, any>\n updatedCollectionConfig: CollectionConfig | GlobalConfig\n}\n\nexport const updateFieldsConfig = (collectionConfig: CollectionConfig | GlobalConfig): UpdateFieldsConfig => {\n let schemaPathMap = {}\n\n function updateField(field: any, parentPath = ''): any {\n const currentPath = field.name\n ? parentPath\n ? `${parentPath}.${field.name}`\n : field.name\n : parentPath\n const currentSchemaPath = `${collectionConfig.slug}.${currentPath}`\n\n // Disabled fields/ field types\n if (\n field.admin?.disabled ||\n field.admin?.readOnly ||\n field.admin?.hidden ||\n field.type === 'row'\n ) {\n return field\n }\n\n // Developer opt-out: custom.ai.enabled === false skips compose injection entirely\n const aiConfig = field.custom?.ai\n const isAiDisabledByDev = aiConfig?.enabled === false\n\n // Map field path for global fieldInstructionsMap to load related instructions\n // This is done due to save extra API call to get instructions when Field components are loaded in admin\n // Doing is will only call instructions data when user clicks on settings\n if (['array', 'richText', 'text', 'textarea', 'upload'].includes(field.type) && !isAiDisabledByDev) {\n schemaPathMap = {\n ...schemaPathMap,\n [currentSchemaPath]: {\n type: field.type,\n custom: field.custom,\n hasMany: field.hasMany === true,\n label: field.label || field.name,\n relationTo: field.relationTo,\n },\n }\n }\n\n // Inject AI actions, richText is not included here as it has to be explicitly defined by user\n // Array fields also get AI injection for bulk generation\n if (['array', 'text', 'textarea', 'upload'].includes(field.type) && !isAiDisabledByDev) {\n let customField = {}\n\n // Custom fields don't fully adhere to the Payload schema, making it difficult to\n // determine which components support injecting ComposeField as a Description.\n if (field.admin?.components?.Field || field.admin?.components?.Description) {\n // TODO: If a field already provides its own Description, we still inject our ComposeField\n // by overriding Description. If you need both, consider composing your own wrapper.\n customField = {}\n }\n\n // Array fields use ArrayComposeField (always visible) since they don't have focus events\n // Other fields use ComposeField with focus-dependent visibility\n const componentPath = field.type === 'array'\n ? '@ai-stack/payloadcms/fields#ArrayComposeField'\n : '@ai-stack/payloadcms/fields#ComposeField'\n\n return {\n ...field,\n admin: {\n ...field.admin,\n components: {\n ...(field.admin?.components || {}),\n Description: {\n clientProps: {\n alwaysShow: !!aiConfig?.alwaysShow,\n schemaPath: currentSchemaPath,\n },\n path: componentPath,\n },\n ...customField,\n },\n },\n }\n }\n\n if (field.fields) {\n return {\n ...field,\n fields: field.fields.map((subField: any) => updateField(subField, currentPath)),\n }\n }\n\n if (field.tabs) {\n return {\n ...field,\n tabs: field.tabs.map((tab: any) => {\n return {\n ...tab,\n // Tabs are a UI construct and should not add to the schema path\n fields: (tab.fields || []).map((subField: any) => updateField(subField, parentPath)),\n }\n }),\n }\n }\n\n if (field.blocks) {\n return {\n ...field,\n blocks: field.blocks.map((block: any) => ({\n ...block,\n fields: block.fields.map((subField: any) =>\n updateField(subField, `${currentPath}.${block.slug}`),\n ),\n })),\n }\n }\n\n return field\n }\n\n const updatedCollectionConfig = {\n ...collectionConfig,\n fields: collectionConfig.fields.map((field) => updateField(field)),\n }\n\n return {\n schemaPathMap,\n updatedCollectionConfig,\n }\n}\n"],"names":["updateFieldsConfig","collectionConfig","schemaPathMap","updateField","field","parentPath","currentPath","name","currentSchemaPath","slug","admin","disabled","readOnly","hidden","type","aiConfig","custom","ai","isAiDisabledByDev","enabled","includes","hasMany","label","relationTo","customField","components","Field","Description","componentPath","clientProps","alwaysShow","schemaPath","path","fields","map","subField","tabs","tab","blocks","block","updatedCollectionConfig"],"mappings":"AAOA,OAAO,MAAMA,qBAAqB,CAACC;IACjC,IAAIC,gBAAgB,CAAC;IAErB,SAASC,YAAYC,KAAU,EAAEC,aAAa,EAAE;QAC9C,MAAMC,cAAcF,MAAMG,IAAI,GAC1BF,aACE,CAAC,EAAEA,WAAW,CAAC,EAAED,MAAMG,IAAI,CAAC,CAAC,GAC7BH,MAAMG,IAAI,GACZF;QACJ,MAAMG,oBAAoB,CAAC,EAAEP,iBAAiBQ,IAAI,CAAC,CAAC,EAAEH,YAAY,CAAC;QAEnE,+BAA+B;QAC/B,IACEF,MAAMM,KAAK,EAAEC,YACbP,MAAMM,KAAK,EAAEE,YACbR,MAAMM,KAAK,EAAEG,UACbT,MAAMU,IAAI,KAAK,OACf;YACA,OAAOV;QACT;QAEA,kFAAkF;QAClF,MAAMW,WAAWX,MAAMY,MAAM,EAAEC;QAC/B,MAAMC,oBAAoBH,UAAUI,YAAY;QAEhD,8EAA8E;QAC9E,wGAAwG;QACxG,yEAAyE;QACzE,IAAI;YAAC;YAAS;YAAY;YAAQ;YAAY;SAAS,CAACC,QAAQ,CAAChB,MAAMU,IAAI,KAAK,CAACI,mBAAmB;YAClGhB,gBAAgB;gBACd,GAAGA,aAAa;gBAChB,CAACM,kBAAkB,EAAE;oBACnBM,MAAMV,MAAMU,IAAI;oBAChBE,QAAQZ,MAAMY,MAAM;oBACpBK,SAASjB,MAAMiB,OAAO,KAAK;oBAC3BC,OAAOlB,MAAMkB,KAAK,IAAIlB,MAAMG,IAAI;oBAChCgB,YAAYnB,MAAMmB,UAAU;gBAC9B;YACF;QACF;QAEA,8FAA8F;QAC9F,yDAAyD;QACzD,IAAI;YAAC;YAAS;YAAQ;YAAY;SAAS,CAACH,QAAQ,CAAChB,MAAMU,IAAI,KAAK,CAACI,mBAAmB;YACtF,IAAIM,cAAc,CAAC;YAEnB,iFAAiF;YACjF,8EAA8E;YAC9E,IAAIpB,MAAMM,KAAK,EAAEe,YAAYC,SAAStB,MAAMM,KAAK,EAAEe,YAAYE,aAAa;gBAC1E,0FAA0F;gBAC1F,oFAAoF;gBACpFH,cAAc,CAAC;YACjB;YAEA,yFAAyF;YACzF,gEAAgE;YAChE,MAAMI,gBAAgBxB,MAAMU,IAAI,KAAK,UACjC,kDACA;YAEJ,OAAO;gBACL,GAAGV,KAAK;gBACRM,OAAO;oBACL,GAAGN,MAAMM,KAAK;oBACde,YAAY;wBACV,GAAIrB,MAAMM,KAAK,EAAEe,cAAc,CAAC,CAAC;wBACjCE,aAAa;4BACXE,aAAa;gCACXC,YAAY,CAAC,CAACf,UAAUe;gCACxBC,YAAYvB;4BACd;4BACAwB,MAAMJ;wBACR;wBACA,GAAGJ,WAAW;oBAChB;gBACF;YACF;QACF;QAEA,IAAIpB,MAAM6B,MAAM,EAAE;YAChB,OAAO;gBACL,GAAG7B,KAAK;gBACR6B,QAAQ7B,MAAM6B,MAAM,CAACC,GAAG,CAAC,CAACC,WAAkBhC,YAAYgC,UAAU7B;YACpE;QACF;QAEA,IAAIF,MAAMgC,IAAI,EAAE;YACd,OAAO;gBACL,GAAGhC,KAAK;gBACRgC,MAAMhC,MAAMgC,IAAI,CAACF,GAAG,CAAC,CAACG;oBACpB,OAAO;wBACL,GAAGA,GAAG;wBACN,gEAAgE;wBAChEJ,QAAQ,AAACI,CAAAA,IAAIJ,MAAM,IAAI,EAAE,AAAD,EAAGC,GAAG,CAAC,CAACC,WAAkBhC,YAAYgC,UAAU9B;oBAC1E;gBACF;YACF;QACF;QAEA,IAAID,MAAMkC,MAAM,EAAE;YAChB,OAAO;gBACL,GAAGlC,KAAK;gBACRkC,QAAQlC,MAAMkC,MAAM,CAACJ,GAAG,CAAC,CAACK,QAAgB,CAAA;wBACxC,GAAGA,KAAK;wBACRN,QAAQM,MAAMN,MAAM,CAACC,GAAG,CAAC,CAACC,WACxBhC,YAAYgC,UAAU,CAAC,EAAE7B,YAAY,CAAC,EAAEiC,MAAM9B,IAAI,CAAC,CAAC;oBAExD,CAAA;YACF;QACF;QAEA,OAAOL;IACT;IAEA,MAAMoC,0BAA0B;QAC9B,GAAGvC,gBAAgB;QACnBgC,QAAQhC,iBAAiBgC,MAAM,CAACC,GAAG,CAAC,CAAC9B,QAAUD,YAAYC;IAC7D;IAEA,OAAO;QACLF;QACAsC;IACF;AACF,EAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utilities/images/extractImageData.ts"],"sourcesContent":["type ImageData = {\n image: { name: string; type: string; url: string }\n}[]\n\n/**\n * Extracts hardcoded image URLs from text using regex.\n * \n * NOTE: This only handles direct URLs in the text.\n * For @field references, use resolveImageReferences utility instead.\n * \n * @param input - Text containing image URLs\n * @returns Array of extracted image data\n */\nexport function extractImageData(input: string): ImageData {\n const regex = /(?:https?:)?\\/[\\w%\\-.,/]+\\.(png|jpe?g|webp)/gi\n const matches = input.match(regex)\n\n if (!matches) {return []}\n\n return matches.map((url) => {\n const decodedUrl = decodeURIComponent(url)\n const parts = decodedUrl.split('/')\n const filename = parts[parts.length - 1]\n const name = filename.replace(/\\.(png|jpe?g|webp)$/i, '')\n const typeMatch = filename.match(/\\.(png|jpe?g|webp)$/i)\n const type = typeMatch ? typeMatch[1].toLowerCase() : 'unknown'\n\n return {\n image: {\n name,\n type,\n url,\n },\n }\n })\n}\n"],"names":["extractImageData","input","regex","matches","match","map","url","decodedUrl","decodeURIComponent","parts","split","filename","length","name","replace","typeMatch","type","toLowerCase","image"],"mappings":"AAIA;;;;;;;;CAQC,GACD,OAAO,SAASA,iBAAiBC,KAAa;IAC5C,MAAMC,QAAQ;IACd,MAAMC,UAAUF,MAAMG,KAAK,CAACF;IAE5B,IAAI,CAACC,SAAS;QAAC,OAAO,EAAE;IAAA;IAExB,OAAOA,QAAQE,GAAG,CAAC,CAACC;QAClB,MAAMC,aAAaC,mBAAmBF;QACtC,MAAMG,QAAQF,WAAWG,KAAK,CAAC;QAC/B,MAAMC,WAAWF,KAAK,CAACA,MAAMG,MAAM,GAAG,EAAE;QACxC,MAAMC,OAAOF,SAASG,OAAO,CAAC,wBAAwB;QACtD,MAAMC,YAAYJ,SAASP,KAAK,CAAC;QACjC,MAAMY,OAAOD,YAAYA,SAAS,CAAC,EAAE,CAACE,WAAW,KAAK;QAEtD,OAAO;YACLC,OAAO;gBACLL;gBACAG;gBACAV;YACF;QACF;IACF;AACF"}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utilities/images/extractPromptAttachments.ts"],"sourcesContent":["import type { ModelMessage } from 'ai'\n\n// Converts prompt into messages, extracting images in the process\nexport function extractPromptAttachments(prompt: string): ModelMessage[] {\n // Regex to match absolute HTTPS URLs with image extensions\n const imageUrlRegex = /https:\\/\\/\\S+\\.(?:png|jpe?g|webp)/gi\n \n const messages: ModelMessage[] = []\n const imageUrls: string[] = []\n \n // Find all image URLs in the prompt\n let match\n while ((match = imageUrlRegex.exec(prompt)) !== null) {\n imageUrls.push(match[0])\n }\n \n // Create image messages first\n for (const imageUrl of imageUrls) {\n messages.push({\n content: [\n {\n type: 'image',\n image: new URL(imageUrl)\n }\n ],\n role: 'user'\n })\n }\n \n // Add the text prompt as a regular user message if there's any text left\n messages.push({\n content: prompt,\n role: 'user'\n })\n\n return messages\n}"],"names":["extractPromptAttachments","prompt","imageUrlRegex","messages","imageUrls","match","exec","push","imageUrl","content","type","image","URL","role"],"mappings":"AAEA,kEAAkE;AAClE,OAAO,SAASA,yBAAyBC,MAAc;IACrD,2DAA2D;IAC3D,MAAMC,gBAAgB;IAEtB,MAAMC,WAA2B,EAAE;IACnC,MAAMC,YAAsB,EAAE;IAE9B,oCAAoC;IACpC,IAAIC;IACJ,MAAO,AAACA,CAAAA,QAAQH,cAAcI,IAAI,CAACL,OAAM,MAAO,KAAM;QACpDG,UAAUG,IAAI,CAACF,KAAK,CAAC,EAAE;IACzB;IAEA,8BAA8B;IAC9B,KAAK,MAAMG,YAAYJ,UAAW;QAChCD,SAASI,IAAI,CAAC;YACZE,SAAS;gBACP;oBACEC,MAAM;oBACNC,OAAO,IAAIC,IAAIJ;gBACjB;aACD;YACDK,MAAM;QACR;IACF;IAEA,yEAAyE;IACzEV,SAASI,IAAI,CAAC;QACZE,SAASR;QACTY,MAAM;IACR;IAEA,OAAOV;AACT"}
@@ -8,7 +8,7 @@ export interface FetchableImage {
8
8
  };
9
9
  }
10
10
  /**
11
- * Fetches images from a list of objects containing URLs (and optional thumbnails/mimetypes)
11
+ * Fetches images in parallel from a list of objects containing URLs
12
12
  * and converts them to AI SDK compatible ImageParts.
13
13
  */
14
14
  export declare function fetchImages(req: PayloadRequest, images: FetchableImage[]): Promise<ImagePart[]>;
@@ -0,0 +1,49 @@
1
+ import * as process from 'node:process';
2
+ /**
3
+ * Fetch a single image and convert to an AI SDK ImagePart.
4
+ */ async function fetchSingleImage(req, img) {
5
+ const serverURL = req.payload.config?.serverURL || process.env.SERVER_URL || process.env.NEXT_PUBLIC_SERVER_URL;
6
+ let url = img.image.thumbnailURL || img.image.url;
7
+ if (!url.startsWith('http')) {
8
+ url = `${String(serverURL)}${String(url)}`;
9
+ }
10
+ const response = await fetch(url, {
11
+ headers: {
12
+ Authorization: `Bearer ${req.headers.get('Authorization')?.split('Bearer ')[1] || ''}`
13
+ },
14
+ method: 'GET'
15
+ });
16
+ if (!response.ok) {
17
+ throw new Error(`Failed to fetch image: ${response.statusText}`);
18
+ }
19
+ const blob = await response.blob();
20
+ const arrayBuffer = await blob.arrayBuffer();
21
+ return {
22
+ type: 'image',
23
+ image: arrayBuffer,
24
+ mediaType: img.image.mimeType || blob.type || 'image/png'
25
+ };
26
+ }
27
+ /**
28
+ * Fetches images in parallel from a list of objects containing URLs
29
+ * and converts them to AI SDK compatible ImageParts.
30
+ */ export async function fetchImages(req, images) {
31
+ if (images.length === 0) {
32
+ return [];
33
+ }
34
+ const results = await Promise.allSettled(images.map((img)=>fetchSingleImage(req, img)));
35
+ const imageParts = [];
36
+ for (const result of results){
37
+ if (result.status === 'fulfilled') {
38
+ imageParts.push(result.value);
39
+ } else {
40
+ req.payload.logger.error(result.reason, '— AI Plugin: Error fetching reference image');
41
+ }
42
+ }
43
+ if (imageParts.length === 0 && images.length > 0) {
44
+ throw new Error("We couldn't fetch any of the images. Please ensure the images are accessible and hosted publicly.");
45
+ }
46
+ return imageParts;
47
+ }
48
+
49
+ //# sourceMappingURL=fetchImages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utilities/images/fetchImages.ts"],"sourcesContent":["import type { ImagePart } from 'ai'\nimport type { PayloadRequest } from 'payload'\n\nimport * as process from 'node:process'\n\nexport interface FetchableImage {\n image: {\n mimeType?: string\n thumbnailURL?: string\n url: string\n }\n}\n\n/**\n * Fetch a single image and convert to an AI SDK ImagePart.\n */\nasync function fetchSingleImage(\n req: PayloadRequest,\n img: FetchableImage,\n): Promise<ImagePart> {\n const serverURL =\n req.payload.config?.serverURL ||\n process.env.SERVER_URL ||\n process.env.NEXT_PUBLIC_SERVER_URL\n\n let url = img.image.thumbnailURL || img.image.url\n if (!url.startsWith('http')) {\n url = `${String(serverURL)}${String(url)}`\n }\n\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${req.headers.get('Authorization')?.split('Bearer ')[1] || ''}`,\n },\n method: 'GET',\n })\n\n if (!response.ok) {\n throw new Error(`Failed to fetch image: ${response.statusText}`)\n }\n\n const blob = await response.blob()\n const arrayBuffer = await blob.arrayBuffer()\n\n return {\n type: 'image',\n image: arrayBuffer,\n mediaType: img.image.mimeType || blob.type || 'image/png',\n }\n}\n\n/**\n * Fetches images in parallel from a list of objects containing URLs\n * and converts them to AI SDK compatible ImageParts.\n */\nexport async function fetchImages(\n req: PayloadRequest,\n images: FetchableImage[],\n): Promise<ImagePart[]> {\n if (images.length === 0) {\n return []\n }\n\n const results = await Promise.allSettled(\n images.map((img) => fetchSingleImage(req, img)),\n )\n\n const imageParts: ImagePart[] = []\n for (const result of results) {\n if (result.status === 'fulfilled') {\n imageParts.push(result.value)\n } else {\n req.payload.logger.error(result.reason, '— AI Plugin: Error fetching reference image')\n }\n }\n\n if (imageParts.length === 0 && images.length > 0) {\n throw new Error(\n \"We couldn't fetch any of the images. Please ensure the images are accessible and hosted publicly.\",\n )\n }\n\n return imageParts\n}\n"],"names":["process","fetchSingleImage","req","img","serverURL","payload","config","env","SERVER_URL","NEXT_PUBLIC_SERVER_URL","url","image","thumbnailURL","startsWith","String","response","fetch","headers","Authorization","get","split","method","ok","Error","statusText","blob","arrayBuffer","type","mediaType","mimeType","fetchImages","images","length","results","Promise","allSettled","map","imageParts","result","status","push","value","logger","error","reason"],"mappings":"AAGA,YAAYA,aAAa,eAAc;AAUvC;;CAEC,GACD,eAAeC,iBACbC,GAAmB,EACnBC,GAAmB;IAEnB,MAAMC,YACJF,IAAIG,OAAO,CAACC,MAAM,EAAEF,aACpBJ,QAAQO,GAAG,CAACC,UAAU,IACtBR,QAAQO,GAAG,CAACE,sBAAsB;IAEpC,IAAIC,MAAMP,IAAIQ,KAAK,CAACC,YAAY,IAAIT,IAAIQ,KAAK,CAACD,GAAG;IACjD,IAAI,CAACA,IAAIG,UAAU,CAAC,SAAS;QAC3BH,MAAM,CAAC,EAAEI,OAAOV,WAAW,EAAEU,OAAOJ,KAAK,CAAC;IAC5C;IAEA,MAAMK,WAAW,MAAMC,MAAMN,KAAK;QAChCO,SAAS;YACPC,eAAe,CAAC,OAAO,EAAEhB,IAAIe,OAAO,CAACE,GAAG,CAAC,kBAAkBC,MAAM,UAAU,CAAC,EAAE,IAAI,GAAG,CAAC;QACxF;QACAC,QAAQ;IACV;IAEA,IAAI,CAACN,SAASO,EAAE,EAAE;QAChB,MAAM,IAAIC,MAAM,CAAC,uBAAuB,EAAER,SAASS,UAAU,CAAC,CAAC;IACjE;IAEA,MAAMC,OAAO,MAAMV,SAASU,IAAI;IAChC,MAAMC,cAAc,MAAMD,KAAKC,WAAW;IAE1C,OAAO;QACLC,MAAM;QACNhB,OAAOe;QACPE,WAAWzB,IAAIQ,KAAK,CAACkB,QAAQ,IAAIJ,KAAKE,IAAI,IAAI;IAChD;AACF;AAEA;;;CAGC,GACD,OAAO,eAAeG,YACpB5B,GAAmB,EACnB6B,MAAwB;IAExB,IAAIA,OAAOC,MAAM,KAAK,GAAG;QACvB,OAAO,EAAE;IACX;IAEA,MAAMC,UAAU,MAAMC,QAAQC,UAAU,CACtCJ,OAAOK,GAAG,CAAC,CAACjC,MAAQF,iBAAiBC,KAAKC;IAG5C,MAAMkC,aAA0B,EAAE;IAClC,KAAK,MAAMC,UAAUL,QAAS;QAC5B,IAAIK,OAAOC,MAAM,KAAK,aAAa;YACjCF,WAAWG,IAAI,CAACF,OAAOG,KAAK;QAC9B,OAAO;YACLvC,IAAIG,OAAO,CAACqC,MAAM,CAACC,KAAK,CAACL,OAAOM,MAAM,EAAE;QAC1C;IACF;IAEA,IAAIP,WAAWL,MAAM,KAAK,KAAKD,OAAOC,MAAM,GAAG,GAAG;QAChD,MAAM,IAAIT,MACR;IAEJ;IAEA,OAAOc;AACT"}
@@ -0,0 +1,183 @@
1
+ /**
2
+ * Retrieves a nested value from an object using dot-notation path.
3
+ */ function getNestedValue(obj, path) {
4
+ return path.split('.').reduce((current, key)=>{
5
+ if (current && typeof current === 'object' && key in current) {
6
+ return current[key];
7
+ }
8
+ return undefined;
9
+ }, obj);
10
+ }
11
+ /**
12
+ * Parses and resolves image references in prompts.
13
+ *
14
+ * Supports two formats:
15
+ * - @fieldName - for single upload fields
16
+ * - @collection.fieldName - schema path format (collection prefix is stripped)
17
+ * - @fieldName:filename.jpg - for specific images in hasMany fields
18
+ *
19
+ * @param prompt - The prompt text containing @field references
20
+ * @param contextData - The document data to resolve field values from
21
+ * @param req - Payload request object for fetching media
22
+ * @param collectionSlug - Optional collection slug to strip from schema path references
23
+ * @returns Processed prompt with references removed and array of resolved images
24
+ */ export async function resolveImageReferences(prompt, contextData, req, collectionSlug) {
25
+ // Pattern matches: @fieldName or @fieldName:filename.ext
26
+ const pattern = /@([\w.]+)(?::(.+?\.(?:png|jpe?g|webp|gif)))?/gi;
27
+ const references = [];
28
+ let match;
29
+ while((match = pattern.exec(prompt)) !== null){
30
+ references.push({
31
+ fieldName: match[1],
32
+ filename: match[2],
33
+ fullMatch: match[0]
34
+ });
35
+ }
36
+ if (references.length === 0) {
37
+ return {
38
+ images: [],
39
+ processedPrompt: prompt
40
+ };
41
+ }
42
+ // Resolve all references in parallel
43
+ const results = await Promise.allSettled(references.map(async (ref)=>{
44
+ // Strip collection prefix from schema path if it matches
45
+ let fieldPath = ref.fieldName;
46
+ if (collectionSlug && fieldPath.startsWith(`${collectionSlug}.`)) {
47
+ fieldPath = fieldPath.slice(collectionSlug.length + 1);
48
+ }
49
+ const fieldValue = getNestedValue(contextData, fieldPath);
50
+ if (!fieldValue) {
51
+ req.payload.logger.warn(`— AI Plugin: Image reference @${ref.fieldName} not found in document context`);
52
+ return null;
53
+ }
54
+ if (!ref.filename) {
55
+ if (Array.isArray(fieldValue)) {
56
+ const docs = await Promise.all(fieldValue.map((v)=>resolveMediaDocument(v, req, collectionSlug)));
57
+ const validDocs = docs.filter(Boolean);
58
+ if (validDocs.length > 0) {
59
+ return {
60
+ images: validDocs.map(formatImageData),
61
+ ref
62
+ };
63
+ }
64
+ return null;
65
+ } else {
66
+ const mediaDoc = await resolveMediaDocument(fieldValue, req, collectionSlug);
67
+ return mediaDoc ? {
68
+ images: [
69
+ formatImageData(mediaDoc)
70
+ ],
71
+ ref
72
+ } : null;
73
+ }
74
+ } else {
75
+ const mediaDoc = await resolveMediaFromArray(fieldValue, ref.filename, req, collectionSlug);
76
+ return mediaDoc ? {
77
+ images: [
78
+ formatImageData(mediaDoc)
79
+ ],
80
+ ref
81
+ } : null;
82
+ }
83
+ }));
84
+ const resolvedImages = [];
85
+ let processedPrompt = prompt;
86
+ for (const result of results){
87
+ if (result.status === 'fulfilled' && result.value) {
88
+ resolvedImages.push(...result.value.images);
89
+ const replacementText = result.value.images.map((img)=>img.image.name).join(', ');
90
+ processedPrompt = processedPrompt.replace(result.value.ref.fullMatch, replacementText);
91
+ } else if (result.status === 'rejected') {
92
+ req.payload.logger.error(result.reason, '— AI Plugin: Error resolving image reference');
93
+ }
94
+ }
95
+ // Clean up extra whitespace from removed references
96
+ processedPrompt = processedPrompt.replace(/\s+/g, ' ').trim();
97
+ return {
98
+ images: resolvedImages,
99
+ processedPrompt
100
+ };
101
+ }
102
+ /**
103
+ * Resolves a single media document from an ID or populated object.
104
+ * Uses the upload collection's `relationTo` from the field config when available,
105
+ * falling back to common collection names.
106
+ */ async function resolveMediaDocument(value, req, collectionSlug) {
107
+ // If it's already a populated object with required fields
108
+ if (typeof value === 'object' && value !== null && 'url' in value) {
109
+ return value;
110
+ }
111
+ // If it's an ID string or number, fetch the media document
112
+ if (typeof value === 'string' || typeof value === 'number') {
113
+ // Build collection candidates: prefer the known upload collections from config,
114
+ // then fall back to common names
115
+ const uploadCollections = req.payload.config.collections.filter((c)=>c.upload).map((c)=>c.slug);
116
+ const candidates = uploadCollections.length > 0 ? uploadCollections : [
117
+ 'media',
118
+ 'uploads'
119
+ ];
120
+ for (const slug of candidates){
121
+ try {
122
+ const mediaDoc = await req.payload.findByID({
123
+ id: value,
124
+ collection: slug,
125
+ req
126
+ });
127
+ if (mediaDoc) {
128
+ return mediaDoc;
129
+ }
130
+ } catch {
131
+ continue;
132
+ }
133
+ }
134
+ }
135
+ return null;
136
+ }
137
+ /**
138
+ * Resolves a specific media document from an array by matching filename.
139
+ * Resolves items in parallel for better performance.
140
+ */ async function resolveMediaFromArray(arrayValue, filename, req, collectionSlug) {
141
+ if (!Array.isArray(arrayValue)) {
142
+ return null;
143
+ }
144
+ // Resolve all items in parallel
145
+ const results = await Promise.allSettled(arrayValue.map((item)=>resolveMediaDocument(item, req, collectionSlug)));
146
+ // Find the first match
147
+ for (const result of results){
148
+ if (result.status === 'fulfilled' && result.value && matchesFilename(result.value, filename)) {
149
+ return result.value;
150
+ }
151
+ }
152
+ return null;
153
+ }
154
+ /**
155
+ * Checks if a media document matches the given filename
156
+ */ function matchesFilename(mediaDoc, filename) {
157
+ const docFilename = mediaDoc.filename || mediaDoc.name;
158
+ if (!docFilename) {
159
+ return false;
160
+ }
161
+ return docFilename.toLowerCase() === filename.toLowerCase();
162
+ }
163
+ /**
164
+ * Formats media document into the expected image data structure
165
+ */ function formatImageData(mediaDoc) {
166
+ return {
167
+ image: {
168
+ name: mediaDoc.filename || mediaDoc.name || 'unknown',
169
+ type: extractFileExtension(mediaDoc.filename || mediaDoc.name || ''),
170
+ mimeType: mediaDoc.mimeType || mediaDoc.mimetype,
171
+ thumbnailURL: mediaDoc.thumbnailURL,
172
+ url: mediaDoc.url
173
+ }
174
+ };
175
+ }
176
+ /**
177
+ * Extracts file extension from filename
178
+ */ function extractFileExtension(filename) {
179
+ const match = filename.match(/\.([^.]+)$/);
180
+ return match ? match[1].toLowerCase() : 'unknown';
181
+ }
182
+
183
+ //# sourceMappingURL=resolveImageReferences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utilities/images/resolveImageReferences.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\ninterface ImageReference {\n fieldName: string\n filename?: string\n fullMatch: string\n}\n\nexport interface ResolvedImage {\n image: {\n mimeType?: string\n name: string\n thumbnailURL?: string\n type: string\n url: string\n }\n}\n\ninterface ResolveImageReferencesResult {\n images: ResolvedImage[]\n processedPrompt: string\n}\n\n/**\n * Retrieves a nested value from an object using dot-notation path.\n */\nfunction getNestedValue(obj: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce((current, key) => {\n if (current && typeof current === 'object' && key in current) {\n return (current as Record<string, unknown>)[key]\n }\n return undefined\n }, obj as unknown)\n}\n\n/**\n * Parses and resolves image references in prompts.\n *\n * Supports two formats:\n * - @fieldName - for single upload fields\n * - @collection.fieldName - schema path format (collection prefix is stripped)\n * - @fieldName:filename.jpg - for specific images in hasMany fields\n *\n * @param prompt - The prompt text containing @field references\n * @param contextData - The document data to resolve field values from\n * @param req - Payload request object for fetching media\n * @param collectionSlug - Optional collection slug to strip from schema path references\n * @returns Processed prompt with references removed and array of resolved images\n */\nexport async function resolveImageReferences(\n prompt: string,\n contextData: Record<string, unknown>,\n req: PayloadRequest,\n collectionSlug?: string,\n): Promise<ResolveImageReferencesResult> {\n // Pattern matches: @fieldName or @fieldName:filename.ext\n const pattern = /@([\\w.]+)(?::(.+?\\.(?:png|jpe?g|webp|gif)))?/gi\n const references: ImageReference[] = []\n let match: null | RegExpExecArray\n\n while ((match = pattern.exec(prompt)) !== null) {\n references.push({\n fieldName: match[1],\n filename: match[2],\n fullMatch: match[0],\n })\n }\n\n if (references.length === 0) {\n return { images: [], processedPrompt: prompt }\n }\n\n // Resolve all references in parallel\n const results = await Promise.allSettled(\n references.map(async (ref) => {\n // Strip collection prefix from schema path if it matches\n let fieldPath = ref.fieldName\n if (collectionSlug && fieldPath.startsWith(`${collectionSlug}.`)) {\n fieldPath = fieldPath.slice(collectionSlug.length + 1)\n }\n\n const fieldValue = getNestedValue(contextData, fieldPath)\n if (!fieldValue) {\n req.payload.logger.warn(\n `— AI Plugin: Image reference @${ref.fieldName} not found in document context`,\n )\n return null\n }\n\n if (!ref.filename) {\n if (Array.isArray(fieldValue)) {\n const docs = await Promise.all(\n fieldValue.map((v) => resolveMediaDocument(v, req, collectionSlug))\n )\n const validDocs = docs.filter(Boolean) as Record<string, unknown>[]\n if (validDocs.length > 0) {\n return { images: validDocs.map(formatImageData), ref }\n }\n return null\n } else {\n const mediaDoc = await resolveMediaDocument(fieldValue, req, collectionSlug)\n return mediaDoc ? { images: [formatImageData(mediaDoc)], ref } : null\n }\n } else {\n const mediaDoc = await resolveMediaFromArray(fieldValue, ref.filename, req, collectionSlug)\n return mediaDoc ? { images: [formatImageData(mediaDoc)], ref } : null\n }\n }),\n )\n\n const resolvedImages: ResolvedImage[] = []\n let processedPrompt = prompt\n\n for (const result of results) {\n if (result.status === 'fulfilled' && result.value) {\n resolvedImages.push(...result.value.images)\n const replacementText = result.value.images.map((img) => img.image.name).join(', ')\n processedPrompt = processedPrompt.replace(result.value.ref.fullMatch, replacementText)\n } else if (result.status === 'rejected') {\n req.payload.logger.error(result.reason, '— AI Plugin: Error resolving image reference')\n }\n }\n\n // Clean up extra whitespace from removed references\n processedPrompt = processedPrompt.replace(/\\s+/g, ' ').trim()\n\n return {\n images: resolvedImages,\n processedPrompt,\n }\n}\n\n/**\n * Resolves a single media document from an ID or populated object.\n * Uses the upload collection's `relationTo` from the field config when available,\n * falling back to common collection names.\n */\nasync function resolveMediaDocument(\n value: unknown,\n req: PayloadRequest,\n collectionSlug?: string,\n): Promise<null | Record<string, unknown>> {\n // If it's already a populated object with required fields\n if (typeof value === 'object' && value !== null && 'url' in value) {\n return value as Record<string, unknown>\n }\n\n // If it's an ID string or number, fetch the media document\n if (typeof value === 'string' || typeof value === 'number') {\n // Build collection candidates: prefer the known upload collections from config,\n // then fall back to common names\n const uploadCollections = req.payload.config.collections\n .filter((c) => c.upload)\n .map((c) => c.slug)\n\n const candidates = uploadCollections.length > 0\n ? uploadCollections\n : ['media', 'uploads']\n\n for (const slug of candidates) {\n try {\n const mediaDoc = await req.payload.findByID({\n id: value,\n collection: slug,\n req,\n })\n if (mediaDoc) {\n return mediaDoc as Record<string, unknown>\n }\n } catch {\n // Continue to next collection\n continue\n }\n }\n }\n\n return null\n}\n\n/**\n * Resolves a specific media document from an array by matching filename.\n * Resolves items in parallel for better performance.\n */\nasync function resolveMediaFromArray(\n arrayValue: unknown,\n filename: string,\n req: PayloadRequest,\n collectionSlug?: string,\n): Promise<null | Record<string, unknown>> {\n if (!Array.isArray(arrayValue)) {\n return null\n }\n\n // Resolve all items in parallel\n const results = await Promise.allSettled(\n arrayValue.map((item) => resolveMediaDocument(item, req, collectionSlug)),\n )\n\n // Find the first match\n for (const result of results) {\n if (result.status === 'fulfilled' && result.value && matchesFilename(result.value, filename)) {\n return result.value\n }\n }\n\n return null\n}\n\n/**\n * Checks if a media document matches the given filename\n */\nfunction matchesFilename(mediaDoc: Record<string, unknown>, filename: string): boolean {\n const docFilename = mediaDoc.filename || mediaDoc.name\n if (!docFilename) {\n return false\n }\n return (docFilename as string).toLowerCase() === filename.toLowerCase()\n}\n\n/**\n * Formats media document into the expected image data structure\n */\nfunction formatImageData(mediaDoc: Record<string, unknown>): ResolvedImage {\n return {\n image: {\n name: (mediaDoc.filename || mediaDoc.name || 'unknown') as string,\n type: extractFileExtension((mediaDoc.filename || mediaDoc.name || '') as string),\n mimeType: (mediaDoc.mimeType || mediaDoc.mimetype) as string | undefined,\n thumbnailURL: mediaDoc.thumbnailURL as string | undefined,\n url: mediaDoc.url as string,\n },\n }\n}\n\n/**\n * Extracts file extension from filename\n */\nfunction extractFileExtension(filename: string): string {\n const match = filename.match(/\\.([^.]+)$/)\n return match ? match[1].toLowerCase() : 'unknown'\n}\n"],"names":["getNestedValue","obj","path","split","reduce","current","key","undefined","resolveImageReferences","prompt","contextData","req","collectionSlug","pattern","references","match","exec","push","fieldName","filename","fullMatch","length","images","processedPrompt","results","Promise","allSettled","map","ref","fieldPath","startsWith","slice","fieldValue","payload","logger","warn","Array","isArray","docs","all","v","resolveMediaDocument","validDocs","filter","Boolean","formatImageData","mediaDoc","resolveMediaFromArray","resolvedImages","result","status","value","replacementText","img","image","name","join","replace","error","reason","trim","uploadCollections","config","collections","c","upload","slug","candidates","findByID","id","collection","arrayValue","item","matchesFilename","docFilename","toLowerCase","type","extractFileExtension","mimeType","mimetype","thumbnailURL","url"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Payload } from 'payload';
2
+ import type { PluginConfig } from '../../types.js';
3
+ export declare const autoSetupProviders: (payload: Payload, config: PluginConfig) => Promise<void>;
@@ -0,0 +1,216 @@
1
+ import { anthropicBlock } from '../../ai/providers/blocks/anthropic.js';
2
+ import { elevenlabsBlock } from '../../ai/providers/blocks/elevenlabs.js';
3
+ import { falBlock } from '../../ai/providers/blocks/fal.js';
4
+ import { googleBlock } from '../../ai/providers/blocks/google.js';
5
+ import { openaiBlock } from '../../ai/providers/blocks/openai.js';
6
+ import { xaiBlock } from '../../ai/providers/blocks/xai.js';
7
+ const findModelsDefault = (block)=>{
8
+ let defaultModels = [];
9
+ const search = (fields)=>{
10
+ for (const f of fields){
11
+ if (f.name === 'models' && Array.isArray(f.defaultValue)) {
12
+ defaultModels = f.defaultValue;
13
+ return true;
14
+ }
15
+ if (f.tabs) {
16
+ for (const t of f.tabs){
17
+ if (search(t.fields)) {
18
+ return true;
19
+ }
20
+ }
21
+ }
22
+ if (f.fields) {
23
+ if (search(f.fields)) {
24
+ return true;
25
+ }
26
+ }
27
+ }
28
+ return false;
29
+ };
30
+ if (block?.fields) {
31
+ search(block.fields);
32
+ }
33
+ return defaultModels;
34
+ };
35
+ const providerKeys = {
36
+ anthropic: 'ANTHROPIC_API_KEY',
37
+ elevenlabs: 'ELEVENLABS_API_KEY',
38
+ fal: 'FAL_KEY',
39
+ google: [
40
+ 'GOOGLE_GENERATIVE_AI_API_KEY',
41
+ 'GEMINI_API_KEY'
42
+ ],
43
+ openai: 'OPENAI_API_KEY',
44
+ xai: 'XAI_API_KEY'
45
+ };
46
+ export const autoSetupProviders = async (payload, config)=>{
47
+ try {
48
+ const existing = await payload.findGlobal({
49
+ slug: 'ai-providers'
50
+ });
51
+ // Build the default array structure
52
+ let initializedAny = false;
53
+ const providersArray = [];
54
+ const defaults = {
55
+ image: existing.defaults?.image || {
56
+ model: '',
57
+ provider: ''
58
+ },
59
+ text: existing.defaults?.text || {
60
+ model: '',
61
+ provider: ''
62
+ },
63
+ tts: existing.defaults?.tts || {
64
+ model: '',
65
+ provider: ''
66
+ },
67
+ video: existing.defaults?.video || {
68
+ model: '',
69
+ provider: ''
70
+ }
71
+ };
72
+ const { providerOptions } = config;
73
+ // OpenAI Setup
74
+ if (process.env[providerKeys.openai]) {
75
+ const isAlreadyConfigured = existing.providers?.find((p)=>p.blockType === 'openai');
76
+ if (!isAlreadyConfigured) {
77
+ providersArray.push({
78
+ apiKey: process.env[providerKeys.openai],
79
+ blockType: 'openai',
80
+ enabled: true,
81
+ models: findModelsDefault(openaiBlock)
82
+ });
83
+ initializedAny = true;
84
+ }
85
+ }
86
+ // Google Setup
87
+ const googleKey = process.env[providerKeys.google[0]] || process.env[providerKeys.google[1]];
88
+ if (googleKey) {
89
+ const isAlreadyConfigured = existing.providers?.find((p)=>p.blockType === 'google');
90
+ if (!isAlreadyConfigured) {
91
+ providersArray.push({
92
+ apiKey: googleKey,
93
+ blockType: 'google',
94
+ enabled: true,
95
+ models: findModelsDefault(googleBlock)
96
+ });
97
+ initializedAny = true;
98
+ }
99
+ }
100
+ // Anthropic Setup
101
+ if (process.env[providerKeys.anthropic]) {
102
+ const isAlreadyConfigured = existing.providers?.find((p)=>p.blockType === 'anthropic');
103
+ if (!isAlreadyConfigured) {
104
+ providersArray.push({
105
+ apiKey: process.env[providerKeys.anthropic],
106
+ blockType: 'anthropic',
107
+ enabled: true,
108
+ models: findModelsDefault(anthropicBlock)
109
+ });
110
+ initializedAny = true;
111
+ }
112
+ }
113
+ // ElevenLabs Setup
114
+ if (process.env[providerKeys.elevenlabs]) {
115
+ const isAlreadyConfigured = existing.providers?.find((p)=>p.blockType === 'elevenlabs');
116
+ if (!isAlreadyConfigured) {
117
+ providersArray.push({
118
+ apiKey: process.env[providerKeys.elevenlabs],
119
+ blockType: 'elevenlabs',
120
+ enabled: true,
121
+ models: findModelsDefault(elevenlabsBlock)
122
+ });
123
+ initializedAny = true;
124
+ }
125
+ }
126
+ // XAI Setup
127
+ if (process.env[providerKeys.xai]) {
128
+ const isAlreadyConfigured = existing.providers?.find((p)=>p.blockType === 'xai');
129
+ if (!isAlreadyConfigured) {
130
+ providersArray.push({
131
+ apiKey: process.env[providerKeys.xai],
132
+ blockType: 'xai',
133
+ enabled: true,
134
+ models: findModelsDefault(xaiBlock)
135
+ });
136
+ initializedAny = true;
137
+ }
138
+ }
139
+ // Fal Setup
140
+ if (process.env[providerKeys.fal]) {
141
+ const isAlreadyConfigured = existing.providers?.find((p)=>p.blockType === 'fal');
142
+ if (!isAlreadyConfigured) {
143
+ providersArray.push({
144
+ apiKey: process.env[providerKeys.fal],
145
+ blockType: 'fal',
146
+ enabled: true,
147
+ models: findModelsDefault(falBlock)
148
+ });
149
+ initializedAny = true;
150
+ }
151
+ }
152
+ // Setup defaults globally regardless of whether providers were newly added or not
153
+ const configuredProviders = [
154
+ ...existing.providers || [],
155
+ ...providersArray
156
+ ];
157
+ if (configuredProviders.length > 0) {
158
+ if (!defaults.text.provider && config.generationDefaults?.text) {
159
+ defaults.text.provider = config.generationDefaults.text.provider;
160
+ defaults.text.model = config.generationDefaults.text.model;
161
+ initializedAny = true;
162
+ }
163
+ const providerSchemaByProvider = {};
164
+ for (const [providerName, options] of Object.entries(providerOptions || {})){
165
+ if (options && typeof options === 'object' && !Array.isArray(options)) {
166
+ providerSchemaByProvider[providerName] = options;
167
+ }
168
+ }
169
+ if (!defaults.image.provider && config.generationDefaults?.image) {
170
+ defaults.image.provider = config.generationDefaults.image.provider;
171
+ defaults.image.model = config.generationDefaults.image.model;
172
+ initializedAny = true;
173
+ }
174
+ if (!defaults.tts.provider && config.generationDefaults?.tts) {
175
+ defaults.tts.provider = config.generationDefaults.tts.provider;
176
+ defaults.tts.model = config.generationDefaults.tts.model;
177
+ defaults.tts.voice = config.generationDefaults.tts.voice;
178
+ initializedAny = true;
179
+ }
180
+ if (!defaults.video.provider && config.generationDefaults?.video) {
181
+ defaults.video.provider = config.generationDefaults.video.provider;
182
+ defaults.video.model = config.generationDefaults.video.model;
183
+ initializedAny = true;
184
+ }
185
+ if (Object.keys(providerSchemaByProvider).length > 0) {
186
+ const schemaForUseCases = JSON.stringify(providerSchemaByProvider);
187
+ const useCases = [
188
+ 'text',
189
+ 'image',
190
+ 'tts',
191
+ 'video'
192
+ ];
193
+ for (const useCase of useCases){
194
+ if (JSON.stringify(defaults[useCase].schema) !== schemaForUseCases) {
195
+ defaults[useCase].schema = JSON.parse(schemaForUseCases);
196
+ initializedAny = true;
197
+ }
198
+ }
199
+ }
200
+ }
201
+ if (initializedAny) {
202
+ await payload.updateGlobal({
203
+ slug: 'ai-providers',
204
+ data: {
205
+ defaults,
206
+ providers: configuredProviders
207
+ }
208
+ });
209
+ payload.logger.info(`— AI Plugin: Auto-setup complete. Handled defaults for seeded providers.`);
210
+ }
211
+ } catch (error) {
212
+ payload.logger.warn(`— AI Plugin: Failed to auto-setup providers: ${error instanceof Error ? error.message : String(error)}`);
213
+ }
214
+ };
215
+
216
+ //# sourceMappingURL=autoSetupProviders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utilities/init/autoSetupProviders.ts"],"sourcesContent":["import type { Payload } from 'payload'\n\nimport type { PluginConfig } from '../../types.js'\n\nimport { anthropicBlock } from '../../ai/providers/blocks/anthropic.js'\nimport { elevenlabsBlock } from '../../ai/providers/blocks/elevenlabs.js'\nimport { falBlock } from '../../ai/providers/blocks/fal.js'\nimport { googleBlock } from '../../ai/providers/blocks/google.js'\nimport { openaiBlock } from '../../ai/providers/blocks/openai.js'\nimport { xaiBlock } from '../../ai/providers/blocks/xai.js'\n\n\nconst findModelsDefault = (block: any): any[] => {\n let defaultModels: any[] = []\n const search = (fields: any[]): boolean => {\n for (const f of fields) {\n if (f.name === 'models' && Array.isArray(f.defaultValue)) {\n defaultModels = f.defaultValue\n return true\n }\n if (f.tabs) {\n for (const t of f.tabs) {\n if (search(t.fields)) {\n return true\n }\n }\n }\n if (f.fields) {\n if (search(f.fields)) {\n return true\n }\n }\n }\n return false\n }\n if (block?.fields) {\n search(block.fields)\n }\n return defaultModels\n}\n\nconst providerKeys = {\n anthropic: 'ANTHROPIC_API_KEY',\n elevenlabs: 'ELEVENLABS_API_KEY',\n fal: 'FAL_KEY',\n google: ['GOOGLE_GENERATIVE_AI_API_KEY', 'GEMINI_API_KEY'],\n openai: 'OPENAI_API_KEY',\n xai: 'XAI_API_KEY',\n}\n\nexport const autoSetupProviders = async (payload: Payload, config: PluginConfig) => {\n try {\n const existing = await payload.findGlobal({ slug: 'ai-providers' })\n\n // Build the default array structure\n let initializedAny = false\n const providersArray: any[] = []\n const defaults = {\n image: existing.defaults?.image || { model: '', provider: '' },\n text: existing.defaults?.text || { model: '', provider: '' },\n tts: existing.defaults?.tts || { model: '', provider: '' },\n video: existing.defaults?.video || { model: '', provider: '' },\n }\n\n const { providerOptions } = config\n\n // OpenAI Setup\n if (process.env[providerKeys.openai]) {\n const isAlreadyConfigured = existing.providers?.find((p: any) => p.blockType === 'openai')\n if (!isAlreadyConfigured) {\n providersArray.push({\n apiKey: process.env[providerKeys.openai],\n blockType: 'openai',\n enabled: true,\n models: findModelsDefault(openaiBlock),\n })\n initializedAny = true\n }\n }\n\n // Google Setup\n const googleKey = process.env[providerKeys.google[0]] || process.env[providerKeys.google[1]]\n if (googleKey) {\n const isAlreadyConfigured = existing.providers?.find((p: any) => p.blockType === 'google')\n if (!isAlreadyConfigured) {\n providersArray.push({\n apiKey: googleKey,\n blockType: 'google',\n enabled: true,\n models: findModelsDefault(googleBlock),\n })\n initializedAny = true\n }\n }\n\n // Anthropic Setup\n if (process.env[providerKeys.anthropic]) {\n const isAlreadyConfigured = existing.providers?.find((p: any) => p.blockType === 'anthropic')\n if (!isAlreadyConfigured) {\n providersArray.push({\n apiKey: process.env[providerKeys.anthropic],\n blockType: 'anthropic',\n enabled: true,\n models: findModelsDefault(anthropicBlock),\n })\n initializedAny = true\n }\n }\n\n // ElevenLabs Setup\n if (process.env[providerKeys.elevenlabs]) {\n const isAlreadyConfigured = existing.providers?.find((p: any) => p.blockType === 'elevenlabs')\n if (!isAlreadyConfigured) {\n providersArray.push({\n apiKey: process.env[providerKeys.elevenlabs],\n blockType: 'elevenlabs',\n enabled: true,\n models: findModelsDefault(elevenlabsBlock),\n })\n initializedAny = true\n }\n }\n\n // XAI Setup\n if (process.env[providerKeys.xai]) {\n const isAlreadyConfigured = existing.providers?.find((p: any) => p.blockType === 'xai')\n if (!isAlreadyConfigured) {\n providersArray.push({\n apiKey: process.env[providerKeys.xai],\n blockType: 'xai',\n enabled: true,\n models: findModelsDefault(xaiBlock),\n })\n initializedAny = true\n }\n }\n\n // Fal Setup\n if (process.env[providerKeys.fal]) {\n const isAlreadyConfigured = existing.providers?.find((p: any) => p.blockType === 'fal')\n if (!isAlreadyConfigured) {\n providersArray.push({\n apiKey: process.env[providerKeys.fal],\n blockType: 'fal',\n enabled: true,\n models: findModelsDefault(falBlock),\n })\n initializedAny = true\n }\n }\n\n // Setup defaults globally regardless of whether providers were newly added or not\n const configuredProviders = [...(existing.providers || []), ...providersArray]\n if (configuredProviders.length > 0) {\n if (!defaults.text.provider && config.generationDefaults?.text) {\n defaults.text.provider = config.generationDefaults.text.provider\n defaults.text.model = config.generationDefaults.text.model\n initializedAny = true\n }\n \n const providerSchemaByProvider: Record<string, unknown> = {}\n for (const [providerName, options] of Object.entries(providerOptions || {})) {\n if (options && typeof options === 'object' && !Array.isArray(options)) {\n providerSchemaByProvider[providerName] = options\n }\n }\n\n if (!defaults.image.provider && config.generationDefaults?.image) {\n defaults.image.provider = config.generationDefaults.image.provider\n defaults.image.model = config.generationDefaults.image.model\n initializedAny = true\n }\n\n if (!defaults.tts.provider && config.generationDefaults?.tts) {\n defaults.tts.provider = config.generationDefaults.tts.provider\n defaults.tts.model = config.generationDefaults.tts.model\n defaults.tts.voice = config.generationDefaults.tts.voice\n initializedAny = true\n }\n\n if (!defaults.video.provider && config.generationDefaults?.video) {\n defaults.video.provider = config.generationDefaults.video.provider\n defaults.video.model = config.generationDefaults.video.model\n initializedAny = true\n }\n\n if (Object.keys(providerSchemaByProvider).length > 0) {\n const schemaForUseCases = JSON.stringify(providerSchemaByProvider)\n const useCases: Array<'image' | 'text' | 'tts' | 'video'> = ['text', 'image', 'tts', 'video']\n\n for (const useCase of useCases) {\n if (JSON.stringify(defaults[useCase].schema) !== schemaForUseCases) {\n defaults[useCase].schema = JSON.parse(schemaForUseCases)\n initializedAny = true\n }\n }\n }\n }\n\n if (initializedAny) {\n await payload.updateGlobal({\n slug: 'ai-providers',\n data: {\n defaults,\n providers: configuredProviders,\n },\n })\n payload.logger.info(\n `— AI Plugin: Auto-setup complete. Handled defaults for seeded providers.`,\n )\n }\n } catch (error) {\n payload.logger.warn(\n `— AI Plugin: Failed to auto-setup providers: ${error instanceof Error ? error.message : String(error)}`,\n )\n }\n}\n"],"names":["anthropicBlock","elevenlabsBlock","falBlock","googleBlock","openaiBlock","xaiBlock","findModelsDefault","block","defaultModels","search","fields","f","name","Array","isArray","defaultValue","tabs","t","providerKeys","anthropic","elevenlabs","fal","google","openai","xai","autoSetupProviders","payload","config","existing","findGlobal","slug","initializedAny","providersArray","defaults","image","model","provider","text","tts","video","providerOptions","process","env","isAlreadyConfigured","providers","find","p","blockType","push","apiKey","enabled","models","googleKey","configuredProviders","length","generationDefaults","providerSchemaByProvider","providerName","options","Object","entries","voice","keys","schemaForUseCases","JSON","stringify","useCases","useCase","schema","parse","updateGlobal","data","logger","info","error","warn","Error","message","String"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utilities/lexical/editorSchemaValidator.ts"],"sourcesContent":["import ajvModule from 'ajv'\n\nexport const editorSchemaValidator = (schema: unknown) => {\n const modifiedSchema = JSON.parse(JSON.stringify(schema), function (key: string, value: any) {\n if (key === 'required' && Array.isArray(value)) {\n // Safely access properties from parent\n const parent = this as { properties?: Record<string, any> }\n const parentProperties = parent.properties\n\n if (parentProperties) {\n const requiredFields = ['type'] // type is always required\n\n // Check if this node has children property\n if ('children' in parentProperties) {\n requiredFields.push('children')\n }\n\n // Check if this node has text property\n if ('text' in parentProperties) {\n requiredFields.push('text')\n }\n\n const filteredRequired = value.filter((field) => requiredFields.includes(field))\n return filteredRequired.length ? filteredRequired : undefined\n }\n }\n return value\n })\n\n const Ajv = ajvModule.default\n const ajv = new Ajv()\n\n return ajv.compile(modifiedSchema)\n}\n"],"names":["ajvModule","editorSchemaValidator","schema","modifiedSchema","JSON","parse","stringify","key","value","Array","isArray","parent","parentProperties","properties","requiredFields","push","filteredRequired","filter","field","includes","length","undefined","Ajv","default","ajv","compile"],"mappings":"AAAA,OAAOA,eAAe,MAAK;AAE3B,OAAO,MAAMC,wBAAwB,CAACC;IACpC,MAAMC,iBAAiBC,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACJ,SAAS,SAAUK,GAAW,EAAEC,KAAU;QACzF,IAAID,QAAQ,cAAcE,MAAMC,OAAO,CAACF,QAAQ;YAC9C,uCAAuC;YACvC,MAAMG,SAAS,IAAI;YACnB,MAAMC,mBAAmBD,OAAOE,UAAU;YAE1C,IAAID,kBAAkB;gBACpB,MAAME,iBAAiB;oBAAC;iBAAO,CAAC,0BAA0B;;gBAE1D,2CAA2C;gBAC3C,IAAI,cAAcF,kBAAkB;oBAClCE,eAAeC,IAAI,CAAC;gBACtB;gBAEA,uCAAuC;gBACvC,IAAI,UAAUH,kBAAkB;oBAC9BE,eAAeC,IAAI,CAAC;gBACtB;gBAEA,MAAMC,mBAAmBR,MAAMS,MAAM,CAAC,CAACC,QAAUJ,eAAeK,QAAQ,CAACD;gBACzE,OAAOF,iBAAiBI,MAAM,GAAGJ,mBAAmBK;YACtD;QACF;QACA,OAAOb;IACT;IAEA,MAAMc,MAAMtB,UAAUuB,OAAO;IAC7B,MAAMC,MAAM,IAAIF;IAEhB,OAAOE,IAAIC,OAAO,CAACtB;AACrB,EAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/utilities/lexical/lexicalToHTML.ts"],"sourcesContent":["import type { SerializedEditorState } from 'lexical'\n\nimport {\n consolidateHTMLConverters,\n convertLexicalToHTML,\n type SanitizedServerEditorConfig,\n} from '@payloadcms/richtext-lexical'\n\nexport async function lexicalToHTML(\n editorData: SerializedEditorState,\n editorConfig: SanitizedServerEditorConfig,\n) {\n return await convertLexicalToHTML({\n converters: consolidateHTMLConverters({ editorConfig }),\n data: editorData,\n })\n}\n"],"names":["consolidateHTMLConverters","convertLexicalToHTML","lexicalToHTML","editorData","editorConfig","converters","data"],"mappings":"AAEA,SACEA,yBAAyB,EACzBC,oBAAoB,QAEf,+BAA8B;AAErC,OAAO,eAAeC,cACpBC,UAAiC,EACjCC,YAAyC;IAEzC,OAAO,MAAMH,qBAAqB;QAChCI,YAAYL,0BAA0B;YAAEI;QAAa;QACrDE,MAAMH;IACR;AACF"}
@@ -0,0 +1,2 @@
1
+ import type { SerializedEditorState } from 'lexical';
2
+ export declare const lexicalToPromptTemplate: (editorState: SerializedEditorState | any) => string;