@ai-stack/payloadcms 3.76.0-beta.1 → 3.76.0-beta.3

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 (341) 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 +7 -24
  10. package/dist/ai/core/media/image/handlers/multimodal.js.map +1 -1
  11. package/dist/ai/core/media/image/handlers/standard.js +7 -2
  12. package/dist/ai/core/media/image/handlers/standard.js.map +1 -1
  13. package/dist/ai/core/media/speech/generateSpeech.js +2 -3
  14. package/dist/ai/core/media/speech/generateSpeech.js.map +1 -1
  15. package/dist/ai/core/media/types.d.ts +2 -3
  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 +2 -44
  24. package/dist/ai/providers/blocks/anthropic.js.map +1 -1
  25. package/dist/ai/providers/blocks/elevenlabs.js +4 -109
  26. package/dist/ai/providers/blocks/elevenlabs.js.map +1 -1
  27. package/dist/ai/providers/blocks/fal.js +2 -120
  28. package/dist/ai/providers/blocks/fal.js.map +1 -1
  29. package/dist/ai/providers/blocks/google.js +6 -240
  30. package/dist/ai/providers/blocks/google.js.map +1 -1
  31. package/dist/ai/providers/blocks/openai-compatible.js +2 -146
  32. package/dist/ai/providers/blocks/openai-compatible.js.map +1 -1
  33. package/dist/ai/providers/blocks/openai.js +2 -202
  34. package/dist/ai/providers/blocks/openai.js.map +1 -1
  35. package/dist/ai/providers/blocks/xai.js +2 -55
  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 +184 -138
  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/{utils → utilities}/nodeToSchemaMap.js +6 -6
  52. package/dist/ai/utilities/nodeToSchemaMap.js.map +1 -0
  53. package/dist/ai/{prompts.d.ts → utilities/prompts.d.ts} +1 -1
  54. package/dist/ai/utilities/prompts.js.map +1 -0
  55. package/dist/ai/utilities/systemGenerate.js.map +1 -0
  56. package/dist/collections/AIJobs.js +3 -12
  57. package/dist/collections/AIJobs.js.map +1 -1
  58. package/dist/collections/AIProviders.js +56 -29
  59. package/dist/collections/AIProviders.js.map +1 -1
  60. package/dist/collections/Instructions.js +91 -59
  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/endpoints/fetchFields.js +14 -6
  66. package/dist/endpoints/fetchFields.js.map +1 -1
  67. package/dist/endpoints/fetchVoices.js +1 -1
  68. package/dist/endpoints/fetchVoices.js.map +1 -1
  69. package/dist/endpoints/generate.d.ts +7 -0
  70. package/dist/endpoints/generate.js +268 -0
  71. package/dist/endpoints/generate.js.map +1 -0
  72. package/dist/endpoints/index.js +9 -639
  73. package/dist/endpoints/index.js.map +1 -1
  74. package/dist/endpoints/promptMentions.d.ts +2 -0
  75. package/dist/endpoints/promptMentions.js +166 -0
  76. package/dist/endpoints/promptMentions.js.map +1 -0
  77. package/dist/endpoints/upload.d.ts +7 -0
  78. package/dist/endpoints/upload.js +294 -0
  79. package/dist/endpoints/upload.js.map +1 -0
  80. package/dist/endpoints/videogenWebhook.d.ts +7 -0
  81. package/dist/endpoints/videogenWebhook.js +132 -0
  82. package/dist/endpoints/videogenWebhook.js.map +1 -0
  83. package/dist/exports/client.d.ts +2 -1
  84. package/dist/exports/client.js +2 -1
  85. package/dist/exports/client.js.map +1 -1
  86. package/dist/exports/fields.d.ts +2 -1
  87. package/dist/exports/fields.js +2 -1
  88. package/dist/exports/fields.js.map +1 -1
  89. package/dist/fields/ArrayComposeField/ArrayComposeField.js +1 -1
  90. package/dist/fields/ArrayComposeField/ArrayComposeField.js.map +1 -1
  91. package/dist/fields/ArrayComposeField/ArrayComposeField.jsx +1 -1
  92. package/dist/fields/ComposeField/ComposeField.d.ts +1 -0
  93. package/dist/fields/ComposeField/ComposeField.js +18 -8
  94. package/dist/fields/ComposeField/ComposeField.js.map +1 -1
  95. package/dist/fields/ComposeField/ComposeField.jsx +12 -7
  96. package/dist/fields/LexicalEditor/feature.server.js +1 -1
  97. package/dist/fields/LexicalEditor/feature.server.js.map +1 -1
  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 +18 -21
  120. package/dist/plugin.js.map +1 -1
  121. package/dist/providers/FieldProvider/FieldProvider.js +11 -20
  122. package/dist/providers/FieldProvider/FieldProvider.js.map +1 -1
  123. package/dist/providers/FieldProvider/FieldProvider.jsx +8 -18
  124. package/dist/providers/InstructionsProvider/InstructionsProvider.js +5 -2
  125. package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
  126. package/dist/providers/InstructionsProvider/InstructionsProvider.jsx +5 -2
  127. package/dist/translations/de.json +47 -0
  128. package/dist/translations/en.json +45 -2
  129. package/dist/translations/es.json +45 -2
  130. package/dist/translations/fa.json +45 -2
  131. package/dist/translations/fr.json +46 -3
  132. package/dist/translations/hi.json +47 -0
  133. package/dist/translations/index.d.ts +88 -26
  134. package/dist/translations/index.js +18 -32
  135. package/dist/translations/index.js.map +1 -1
  136. package/dist/translations/ja.json +47 -0
  137. package/dist/translations/nb.json +47 -0
  138. package/dist/translations/nl.json +47 -0
  139. package/dist/translations/pl.json +45 -2
  140. package/dist/translations/pt.json +47 -0
  141. package/dist/translations/ru.json +45 -2
  142. package/dist/translations/th.json +47 -0
  143. package/dist/translations/translation-schema.json +184 -11
  144. package/dist/translations/uk.json +45 -2
  145. package/dist/translations/zh.json +47 -0
  146. package/dist/types.d.ts +64 -28
  147. package/dist/types.js.map +1 -1
  148. package/dist/ui/Compose/Compose.js +42 -79
  149. package/dist/ui/Compose/Compose.js.map +1 -1
  150. package/dist/ui/Compose/Compose.jsx +32 -86
  151. package/dist/ui/Compose/ComposePlaceholder.js +1 -1
  152. package/dist/ui/Compose/ComposePlaceholder.js.map +1 -1
  153. package/dist/ui/Compose/ComposePlaceholder.jsx +1 -1
  154. package/dist/ui/Compose/{compose.module.css → compose.module.scss} +3 -5
  155. package/dist/ui/Compose/hooks/menu/Item.d.ts +1 -1
  156. package/dist/ui/Compose/hooks/menu/Item.js +7 -3
  157. package/dist/ui/Compose/hooks/menu/Item.js.map +1 -1
  158. package/dist/ui/Compose/hooks/menu/Item.jsx +11 -5
  159. package/dist/ui/Compose/hooks/menu/TranslateMenu.js +15 -5
  160. package/dist/ui/Compose/hooks/menu/TranslateMenu.js.map +1 -1
  161. package/dist/ui/Compose/hooks/menu/TranslateMenu.jsx +11 -5
  162. package/dist/ui/Compose/hooks/menu/items.d.ts +8 -8
  163. package/dist/ui/Compose/hooks/menu/itemsMap.d.ts +2 -1
  164. package/dist/ui/Compose/hooks/menu/itemsMap.js.map +1 -1
  165. package/dist/ui/Compose/hooks/menu/types.d.ts +21 -0
  166. package/dist/ui/Compose/hooks/menu/types.js +3 -0
  167. package/dist/ui/Compose/hooks/menu/types.js.map +1 -0
  168. package/dist/ui/Compose/hooks/menu/useMenu.d.ts +2 -2
  169. package/dist/ui/Compose/hooks/menu/useMenu.js +45 -23
  170. package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
  171. package/dist/ui/Compose/hooks/menu/useMenu.jsx +43 -23
  172. package/dist/ui/Compose/hooks/mergeGeneratedValue.d.ts +14 -0
  173. package/dist/ui/Compose/hooks/mergeGeneratedValue.js +38 -0
  174. package/dist/ui/Compose/hooks/mergeGeneratedValue.js.map +1 -0
  175. package/dist/ui/Compose/hooks/useGenerate.js +37 -12
  176. package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
  177. package/dist/ui/Compose/hooks/useGenerateUpload.js +66 -24
  178. package/dist/ui/Compose/hooks/useGenerateUpload.js.map +1 -1
  179. package/dist/ui/Compose/hooks/useHistory.js +1 -1
  180. package/dist/ui/Compose/hooks/useHistory.js.map +1 -1
  181. package/dist/ui/Compose/hooks/useStreamingUpdate.js +4 -4
  182. package/dist/ui/Compose/hooks/useStreamingUpdate.js.map +1 -1
  183. package/dist/ui/ConfigDashboard/configDashboard.module.css +94 -0
  184. package/dist/ui/ConfigDashboard/index.js +27 -92
  185. package/dist/ui/ConfigDashboard/index.js.map +1 -1
  186. package/dist/ui/ConfigDashboard/index.jsx +24 -77
  187. package/dist/ui/DynamicModelSelect/index.js +6 -27
  188. package/dist/ui/DynamicModelSelect/index.js.map +1 -1
  189. package/dist/ui/DynamicModelSelect/index.jsx +6 -29
  190. package/dist/ui/DynamicProviderSelect/index.js +6 -27
  191. package/dist/ui/DynamicProviderSelect/index.js.map +1 -1
  192. package/dist/ui/DynamicProviderSelect/index.jsx +6 -29
  193. package/dist/ui/DynamicVoiceSelect/index.js +34 -83
  194. package/dist/ui/DynamicVoiceSelect/index.js.map +1 -1
  195. package/dist/ui/DynamicVoiceSelect/index.jsx +16 -53
  196. package/dist/ui/GlobalProviderOptions/index.d.ts +2 -0
  197. package/dist/ui/GlobalProviderOptions/index.js +118 -0
  198. package/dist/ui/GlobalProviderOptions/index.js.map +1 -0
  199. package/dist/ui/GlobalProviderOptions/index.jsx +60 -0
  200. package/dist/ui/Icons/Icons.js +1 -1
  201. package/dist/ui/Icons/Icons.js.map +1 -1
  202. package/dist/ui/Icons/Icons.jsx +1 -1
  203. package/dist/ui/Icons/LottieAnimation.js +1 -1
  204. package/dist/ui/Icons/LottieAnimation.js.map +1 -1
  205. package/dist/ui/Icons/LottieAnimation.jsx +1 -1
  206. package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.d.ts +12 -0
  207. package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.js +166 -0
  208. package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.js.map +1 -0
  209. package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.jsx +83 -0
  210. package/dist/ui/InstructionProviderOptions/index.d.ts +2 -0
  211. package/dist/ui/InstructionProviderOptions/index.js +157 -0
  212. package/dist/ui/InstructionProviderOptions/index.js.map +1 -0
  213. package/dist/ui/InstructionProviderOptions/index.jsx +92 -0
  214. package/dist/ui/VoicesFetcher/index.js.map +1 -1
  215. package/dist/ui/hooks/useAISettings.d.ts +26 -0
  216. package/dist/ui/hooks/useAISettings.js +73 -0
  217. package/dist/ui/hooks/useAISettings.js.map +1 -0
  218. package/dist/ui/providerOptions/updateProviderOptionsValue.d.ts +6 -0
  219. package/dist/ui/providerOptions/updateProviderOptionsValue.js +50 -0
  220. package/dist/ui/providerOptions/updateProviderOptionsValue.js.map +1 -0
  221. package/dist/ui/shared/handleSelectChange.d.ts +5 -0
  222. package/dist/ui/shared/handleSelectChange.js +12 -0
  223. package/dist/ui/shared/handleSelectChange.js.map +1 -0
  224. package/dist/ui/shared/types.d.ts +11 -0
  225. package/dist/ui/shared/types.js +5 -0
  226. package/dist/ui/shared/types.js.map +1 -0
  227. package/dist/utilities/ai/resolveEffectiveInstructionSettings.d.ts +15 -0
  228. package/dist/utilities/ai/resolveEffectiveInstructionSettings.js +136 -0
  229. package/dist/utilities/ai/resolveEffectiveInstructionSettings.js.map +1 -0
  230. package/dist/{endpoints → utilities}/buildPromptUtils.js +14 -5
  231. package/dist/utilities/buildPromptUtils.js.map +1 -0
  232. package/dist/utilities/buildSmartPrompt.js +3 -3
  233. package/dist/utilities/buildSmartPrompt.js.map +1 -1
  234. package/dist/utilities/fields/fieldToJsonSchema.js.map +1 -0
  235. package/dist/utilities/fields/getFieldBySchemaPath.js.map +1 -0
  236. package/dist/utilities/fields/getFieldInfo.js.map +1 -0
  237. package/dist/utilities/{updateFieldsConfig.js → fields/updateFieldsConfig.js} +8 -3
  238. package/dist/utilities/fields/updateFieldsConfig.js.map +1 -0
  239. package/dist/utilities/images/extractImageData.js.map +1 -0
  240. package/dist/utilities/images/extractPromptAttachments.js.map +1 -0
  241. package/dist/utilities/{fetchImages.d.ts → images/fetchImages.d.ts} +1 -1
  242. package/dist/utilities/images/fetchImages.js +49 -0
  243. package/dist/utilities/images/fetchImages.js.map +1 -0
  244. package/dist/utilities/images/resolveImageReferences.js +183 -0
  245. package/dist/utilities/images/resolveImageReferences.js.map +1 -0
  246. package/dist/utilities/init/autoSetupProviders.d.ts +3 -0
  247. package/dist/utilities/init/autoSetupProviders.js +216 -0
  248. package/dist/utilities/init/autoSetupProviders.js.map +1 -0
  249. package/dist/utilities/lexical/editorSchemaValidator.js.map +1 -0
  250. package/dist/utilities/lexical/lexicalToHTML.js.map +1 -0
  251. package/dist/utilities/lexical/lexicalToPromptTemplate.d.ts +2 -0
  252. package/dist/utilities/lexical/lexicalToPromptTemplate.js +50 -0
  253. package/dist/utilities/lexical/lexicalToPromptTemplate.js.map +1 -0
  254. package/dist/utilities/lexical/setSafeLexicalState.js.map +1 -0
  255. package/dist/utilities/lexical/stringToLexicalJSON.d.ts +2 -0
  256. package/dist/utilities/lexical/stringToLexicalJSON.js +39 -0
  257. package/dist/utilities/lexical/stringToLexicalJSON.js.map +1 -0
  258. package/dist/utilities/sanitizeLog.d.ts +1 -0
  259. package/dist/utilities/sanitizeLog.js +39 -0
  260. package/dist/utilities/sanitizeLog.js.map +1 -0
  261. package/dist/utilities/seedProperties.js +54 -22
  262. package/dist/utilities/seedProperties.js.map +1 -1
  263. package/package.json +36 -2
  264. package/dist/ai/analyse.d.ts +0 -1
  265. package/dist/ai/analyse.js +0 -3
  266. package/dist/ai/analyse.js.map +0 -1
  267. package/dist/ai/index.d.ts +0 -11
  268. package/dist/ai/index.js +0 -25
  269. package/dist/ai/index.js.map +0 -1
  270. package/dist/ai/prompts.js.map +0 -1
  271. package/dist/ai/utils/filterEditorSchemaByNodes.js.map +0 -1
  272. package/dist/ai/utils/generateFileNameByPrompt.js.map +0 -1
  273. package/dist/ai/utils/isObjectSchema.js.map +0 -1
  274. package/dist/ai/utils/nodeToSchemaMap.js.map +0 -1
  275. package/dist/ai/utils/systemGenerate.js.map +0 -1
  276. package/dist/endpoints/buildPromptUtils.js.map +0 -1
  277. package/dist/endpoints/chat.d.ts +0 -4
  278. package/dist/fields/PromptEditorField/PromptEditorField.d.ts +0 -3
  279. package/dist/fields/PromptEditorField/PromptEditorField.js +0 -217
  280. package/dist/fields/PromptEditorField/PromptEditorField.js.map +0 -1
  281. package/dist/fields/PromptEditorField/PromptEditorField.jsx +0 -160
  282. package/dist/ui/AIConfigDashboard/index.d.ts +0 -2
  283. package/dist/ui/AIConfigDashboard/index.js +0 -224
  284. package/dist/ui/AIConfigDashboard/index.js.map +0 -1
  285. package/dist/ui/AIConfigDashboard/index.jsx +0 -175
  286. package/dist/ui/ProviderOptionsEditor/index.d.ts +0 -7
  287. package/dist/ui/ProviderOptionsEditor/index.js +0 -291
  288. package/dist/ui/ProviderOptionsEditor/index.js.map +0 -1
  289. package/dist/ui/ProviderOptionsEditor/index.jsx +0 -210
  290. package/dist/utilities/editorSchemaValidator.js.map +0 -1
  291. package/dist/utilities/extractImageData.js.map +0 -1
  292. package/dist/utilities/extractPromptAttachments.js.map +0 -1
  293. package/dist/utilities/fetchImages.js +0 -38
  294. package/dist/utilities/fetchImages.js.map +0 -1
  295. package/dist/utilities/fieldToJsonSchema.js.map +0 -1
  296. package/dist/utilities/getFieldBySchemaPath.js.map +0 -1
  297. package/dist/utilities/getFieldInfo.js.map +0 -1
  298. package/dist/utilities/getProviderOptionsFields.d.ts +0 -16
  299. package/dist/utilities/getProviderOptionsFields.js +0 -80
  300. package/dist/utilities/getProviderOptionsFields.js.map +0 -1
  301. package/dist/utilities/isPluginActivated.d.ts +0 -2
  302. package/dist/utilities/isPluginActivated.js +0 -5
  303. package/dist/utilities/isPluginActivated.js.map +0 -1
  304. package/dist/utilities/lexicalToHTML.js.map +0 -1
  305. package/dist/utilities/resolveImageReferences.js +0 -167
  306. package/dist/utilities/resolveImageReferences.js.map +0 -1
  307. package/dist/utilities/schemaConverter.d.ts +0 -3
  308. package/dist/utilities/schemaConverter.js +0 -93
  309. package/dist/utilities/schemaConverter.js.map +0 -1
  310. package/dist/utilities/setSafeLexicalState.js.map +0 -1
  311. package/dist/utilities/updateFieldsConfig.js.map +0 -1
  312. /package/dist/ai/{utils → utilities}/filterEditorSchemaByNodes.d.ts +0 -0
  313. /package/dist/ai/{utils → utilities}/filterEditorSchemaByNodes.js +0 -0
  314. /package/dist/ai/{utils → utilities}/generateFileNameByPrompt.d.ts +0 -0
  315. /package/dist/ai/{utils → utilities}/generateFileNameByPrompt.js +0 -0
  316. /package/dist/ai/{utils → utilities}/isObjectSchema.d.ts +0 -0
  317. /package/dist/ai/{utils → utilities}/isObjectSchema.js +0 -0
  318. /package/dist/ai/{utils → utilities}/nodeToSchemaMap.d.ts +0 -0
  319. /package/dist/ai/{prompts.js → utilities/prompts.js} +0 -0
  320. /package/dist/ai/{utils → utilities}/systemGenerate.d.ts +0 -0
  321. /package/dist/ai/{utils → utilities}/systemGenerate.js +0 -0
  322. /package/dist/ui/Icons/{icons.module.css → icons.module.scss} +0 -0
  323. /package/dist/{endpoints → utilities}/buildPromptUtils.d.ts +0 -0
  324. /package/dist/utilities/{fieldToJsonSchema.d.ts → fields/fieldToJsonSchema.d.ts} +0 -0
  325. /package/dist/utilities/{fieldToJsonSchema.js → fields/fieldToJsonSchema.js} +0 -0
  326. /package/dist/utilities/{getFieldBySchemaPath.d.ts → fields/getFieldBySchemaPath.d.ts} +0 -0
  327. /package/dist/utilities/{getFieldBySchemaPath.js → fields/getFieldBySchemaPath.js} +0 -0
  328. /package/dist/utilities/{getFieldInfo.d.ts → fields/getFieldInfo.d.ts} +0 -0
  329. /package/dist/utilities/{getFieldInfo.js → fields/getFieldInfo.js} +0 -0
  330. /package/dist/utilities/{updateFieldsConfig.d.ts → fields/updateFieldsConfig.d.ts} +0 -0
  331. /package/dist/utilities/{extractImageData.d.ts → images/extractImageData.d.ts} +0 -0
  332. /package/dist/utilities/{extractImageData.js → images/extractImageData.js} +0 -0
  333. /package/dist/utilities/{extractPromptAttachments.d.ts → images/extractPromptAttachments.d.ts} +0 -0
  334. /package/dist/utilities/{extractPromptAttachments.js → images/extractPromptAttachments.js} +0 -0
  335. /package/dist/utilities/{resolveImageReferences.d.ts → images/resolveImageReferences.d.ts} +0 -0
  336. /package/dist/utilities/{editorSchemaValidator.d.ts → lexical/editorSchemaValidator.d.ts} +0 -0
  337. /package/dist/utilities/{editorSchemaValidator.js → lexical/editorSchemaValidator.js} +0 -0
  338. /package/dist/utilities/{lexicalToHTML.d.ts → lexical/lexicalToHTML.d.ts} +0 -0
  339. /package/dist/utilities/{lexicalToHTML.js → lexical/lexicalToHTML.js} +0 -0
  340. /package/dist/utilities/{setSafeLexicalState.d.ts → lexical/setSafeLexicalState.d.ts} +0 -0
  341. /package/dist/utilities/{setSafeLexicalState.js → lexical/setSafeLexicalState.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/endpoints/index.ts"],"sourcesContent":["import type { ImagePart } from 'ai'\nimport type { Field, PayloadRequest } from 'payload'\n\nimport * as process from 'node:process'\n\nimport type { Endpoints, PluginConfig } from '../types.js'\n\nimport { checkAccess } from '../access/checkAccess.js'\nimport { filterEditorSchemaByNodes } from '../ai/utils/filterEditorSchemaByNodes.js'\nimport {\n PLUGIN_AI_JOBS_TABLE,\n PLUGIN_API_ENDPOINT_GENERATE,\n PLUGIN_API_ENDPOINT_GENERATE_UPLOAD,\n PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK,\n PLUGIN_INSTRUCTIONS_TABLE,\n PLUGIN_NAME,\n} from '../defaults.js'\nimport { registerEditorHelper } from '../libraries/handlebars/helpers.js'\nimport { replacePlaceholders } from '../libraries/handlebars/replacePlaceholders.js'\nimport { buildSmartPrompt, isGenericPrompt } from '../utilities/buildSmartPrompt.js'\nimport { extractImageData } from '../utilities/extractImageData.js'\nimport { type FetchableImage, fetchImages } from '../utilities/fetchImages.js'\nimport { fieldToJsonSchema } from '../utilities/fieldToJsonSchema.js'\nimport { getFieldBySchemaPath } from '../utilities/getFieldBySchemaPath.js'\nimport { resolveImageReferences } from '../utilities/resolveImageReferences.js'\nimport { assignPrompt, extendContextWithPromptFields } from './buildPromptUtils.js'\n\nexport const endpoints: (pluginConfig: PluginConfig) => Endpoints = (pluginConfig) =>\n ({\n textarea: {\n // Text/rich-text generation endpoint using payload.ai.streamObject\n handler: async (req: PayloadRequest) => {\n try {\n // Check authentication and authorization first\n await checkAccess(req, pluginConfig)\n\n const data = await req.json?.()\n\n const { allowedEditorNodes = [], locale = 'en', options } = data\n const { action, actionParams, instructionId } = options\n const contextData = data.doc\n\n if (!instructionId) {\n throw new Error(\n `Instruction ID is required for \"${PLUGIN_NAME}\" to work, please check your configuration, or try again`,\n )\n }\n\n // Verify user has access to the specific instruction\n const instructions = await req.payload.findByID({\n id: instructionId,\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n req, // Pass req to ensure access control is applied\n })\n\n const { collections } = req.payload.config\n const collection = collections.find(\n (collection) => collection.slug === PLUGIN_INSTRUCTIONS_TABLE,\n )\n\n if (!collection) {\n throw new Error('Collection not found')\n }\n\n const { custom: { [PLUGIN_NAME]: { editorConfig = {} } = {} } = {} } = collection.admin\n const { schema: editorSchema = {} } = editorConfig\n let { prompt: promptTemplate = '' } = instructions\n\n // Smart fallback: if prompt is generic, build a contextual prompt from field metadata\n if (isGenericPrompt(promptTemplate)) {\n const schemaPath = String(instructions['schema-path'])\n promptTemplate = buildSmartPrompt({\n documentData: contextData,\n payload: req.payload,\n schemaPath,\n })\n\n if (pluginConfig.debugging) {\n req.payload.logger.info(\n { smartPrompt: promptTemplate },\n `— AI Plugin: Using smart fallback prompt for ${schemaPath}`,\n )\n }\n }\n\n let allowedEditorSchema = editorSchema\n if (allowedEditorNodes.length) {\n allowedEditorSchema = filterEditorSchemaByNodes(editorSchema, allowedEditorNodes)\n // Debug: Log what nodes were received and what definitions remain\n if (pluginConfig.debugging) {\n req.payload.logger.info(\n {\n receivedNodes: allowedEditorNodes,\n remainingDefinitions: Object.keys(allowedEditorSchema.definitions || {}),\n },\n '— AI Plugin: Schema filtering debug',\n )\n }\n }\n\n const schemaPath = String(instructions['schema-path'])\n const parts = (schemaPath || '').split('.') || []\n const collectionName = parts[0]\n const fieldName = parts.length > 1 ? parts[parts.length - 1] : ''\n\n registerEditorHelper(req.payload, schemaPath)\n\n const { defaultLocale, locales = [] } = req.payload.config.localization || {}\n const localeData = locales.find((l) => {\n return l.code === locale\n })\n\n let localeInfo = locale\n if (\n localeData &&\n defaultLocale &&\n localeData.label &&\n typeof localeData.label === 'object' &&\n defaultLocale in localeData.label\n ) {\n localeInfo = localeData.label[defaultLocale]\n }\n\n const prompts = await assignPrompt(action, {\n type: String(instructions['field-type']),\n actionParams,\n collection: collectionName,\n context: contextData,\n field: fieldName || '',\n layout: instructions.layout,\n locale: localeInfo,\n pluginConfig,\n systemPrompt: instructions.system,\n template: String(promptTemplate),\n })\n\n if (pluginConfig.debugging) {\n req.payload.logger.info(\n { prompts },\n `— AI Plugin: Executing text prompt on ${schemaPath}`,\n )\n }\n\n // Build per-field JSON schema for structured generation when applicable\n let jsonSchema = allowedEditorSchema\n let targetField: Field | null | undefined\n\n try {\n const targetCollection = req.payload.config.collections.find(\n (c) => c.slug === collectionName,\n )\n if (targetCollection && fieldName) {\n targetField = getFieldBySchemaPath(targetCollection, schemaPath)\n const supported = [\n 'array',\n 'text',\n 'textarea',\n 'select',\n 'number',\n 'date',\n 'code',\n 'email',\n 'json',\n ]\n const t = String(targetField?.type || '')\n if (targetField && supported.includes(t)) {\n // For array fields, use count from array-settings if available\n if (t === 'array') {\n const arraySettings = (instructions['array-settings'] || {}) as Record<\n string,\n unknown\n >\n const count = (arraySettings.count as number) || 3\n // Override the field's maxRows with the requested count\n const modifiedField = {\n ...targetField,\n maxRows: count,\n minRows: count,\n } as typeof targetField\n jsonSchema = fieldToJsonSchema(modifiedField, { nameOverride: fieldName })\n } else {\n jsonSchema = fieldToJsonSchema(targetField, { nameOverride: fieldName })\n }\n }\n }\n } catch (e) {\n req.payload.logger.error(e, '— AI Plugin: Error building field JSON schema')\n }\n\n // Get model settings from instruction\n const settingsName =\n instructions['model-id'] === 'richtext'\n ? 'richtext-settings'\n : instructions['model-id'] === 'text'\n ? 'text-settings'\n : instructions['model-id'] === 'array'\n ? 'array-settings'\n : undefined\n\n if (!settingsName) {\n throw new Error(`Unsupported model-id: ${instructions['model-id']}`)\n }\n\n const modelSettings = instructions[settingsName] || {}\n\n // Resolve @field:filename references from the prompt\n const { images: resolvedImages, processedPrompt } = await resolveImageReferences(\n prompts.prompt,\n contextData,\n req,\n collectionName,\n )\n\n // Extract hardcoded URLs from the processed prompt\n const hardcodedImages = extractImageData(processedPrompt)\n\n // Combine images\n const allImages = [...hardcodedImages, ...resolvedImages] as FetchableImage[]\n\n let images: ImagePart[] | undefined\n\n if (allImages.length > 0) {\n const imageParts = await fetchImages(req, allImages)\n\n if (imageParts.length > 0) {\n images = imageParts\n }\n }\n\n let promptToUse = processedPrompt\n let systemToUse = prompts.system\n // let messagesToUse: any = undefined\n\n // Execute beforeGenerate hooks\n if (targetField && (targetField as any).custom?.ai?.beforeGenerate) {\n const beforeHooks = (targetField as any).custom.ai.beforeGenerate as Array<\n (args: any) => Promise<any>\n >\n for (const hook of beforeHooks) {\n const result = await hook({\n doc: contextData,\n field: targetField,\n headers: req.headers,\n instructions,\n payload: req.payload,\n prompt: promptToUse,\n req,\n system: systemToUse,\n })\n\n if (result) {\n if (result.prompt) promptToUse = result.prompt\n if (result.system) systemToUse = result.system\n }\n }\n }\n\n const streamResult = await req.payload.ai.streamObject({\n // extractAttachments: modelSettings.extractAttachments as boolean | undefined,\n images,\n maxTokens: modelSettings.maxTokens as number | undefined,\n // messages: messagesToUse,\n model: modelSettings.model as string,\n onFinish: async ({ object }) => {\n if (targetField && (targetField as any).custom?.ai?.afterGenerate) {\n const afterHooks = (targetField as any).custom.ai.afterGenerate as Array<\n (args: any) => Promise<any>\n >\n for (const hook of afterHooks) {\n await hook({\n doc: contextData,\n field: targetField,\n headers: req.headers,\n instructions,\n payload: req.payload,\n req,\n result: object,\n })\n }\n }\n },\n prompt: processedPrompt,\n provider: modelSettings.provider as string,\n providerOptions: {\n openai: {\n strictJsonSchema: true,\n },\n },\n schema: jsonSchema,\n system: systemToUse,\n temperature: modelSettings.temperature as number | undefined,\n })\n\n return streamResult\n } catch (error) {\n req.payload.logger.error(error, 'Error generating content: ')\n const message =\n error && typeof error === 'object' && 'message' in error\n ? (error as Error).message\n : String(error)\n return new Response(JSON.stringify({ error: message }), {\n headers: { 'Content-Type': 'application/json' },\n status:\n message.includes('Authentication required') ||\n message.includes('Insufficient permissions')\n ? 401\n : 500,\n })\n }\n },\n method: 'post',\n path: PLUGIN_API_ENDPOINT_GENERATE,\n },\n upload: {\n // Image/video generation endpoint using payload.ai.generateMedia\n handler: async (req: PayloadRequest) => {\n try {\n // Check authentication and authorization first\n await checkAccess(req, pluginConfig)\n\n const data = await req.json?.()\n\n const { collectionSlug, documentId, options } = data\n const { instructionId } = options\n let docData = {}\n\n if (documentId) {\n try {\n docData = await req.payload.findByID({\n id: documentId,\n collection: collectionSlug as string,\n draft: true,\n req, // Pass req to ensure access control is applied\n })\n } catch (e) {\n req.payload.logger.error(\n e,\n '— AI Plugin: Error fetching document, you should try again after enabling drafts for this collection',\n )\n }\n }\n\n const contextData = {\n ...data.doc,\n ...docData,\n }\n\n let instructions: Record<string, unknown> = { images: [], 'model-id': '', prompt: '' }\n\n if (instructionId) {\n // Verify user has access to the specific instruction\n instructions = await req.payload.findByID({\n id: instructionId,\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n req, // Pass req to ensure access control is applied\n })\n }\n\n let { prompt: promptTemplate = '' } = instructions\n const { images: sampleImages = [] } = instructions\n const schemaPath = String(instructions['schema-path'])\n registerEditorHelper(req.payload, schemaPath)\n\n // Smart fallback: if prompt is generic, build a contextual prompt from field metadata\n if (isGenericPrompt(promptTemplate as string)) {\n promptTemplate = buildSmartPrompt({\n documentData: contextData,\n payload: req.payload,\n schemaPath,\n })\n\n if (pluginConfig.debugging) {\n req.payload.logger.info(\n { smartPrompt: promptTemplate },\n `— AI Plugin: Using smart fallback prompt for ${schemaPath}`,\n )\n }\n }\n\n const extendedContext = extendContextWithPromptFields(\n contextData,\n { type: String(instructions['field-type']), collection: collectionSlug },\n pluginConfig,\n )\n const text = await replacePlaceholders(promptTemplate as string, extendedContext)\n const uploadCollectionSlug = instructions['relation-to']\n\n // Resolve @field:filename references from the prompt\n const { images: resolvedImages, processedPrompt } = await resolveImageReferences(\n text,\n contextData,\n req,\n collectionSlug,\n )\n\n // Extract hardcoded URLs from the processed prompt and merge with resolved images and sample images\n const images = [\n ...extractImageData(processedPrompt),\n ...resolvedImages,\n ...(sampleImages as unknown[]),\n ] as FetchableImage[]\n\n // Process images - convert to ImagePart format using helper\n const editImages: ImagePart[] = await fetchImages(req, images)\n\n let promptToUse = text\n let targetField: Field | null | undefined\n\n try {\n const targetCollection = req.payload.config.collections.find(\n (c) => c.slug === collectionSlug,\n )\n if (targetCollection && schemaPath) {\n targetField = getFieldBySchemaPath(targetCollection, schemaPath)\n }\n } catch (e) {\n req.payload.logger.error(e, '— AI Plugin: Error finding field for hooks')\n }\n\n if (targetField && (targetField as any).custom?.ai?.beforeGenerate) {\n const beforeHooks = (targetField as any).custom.ai.beforeGenerate as Array<\n (args: any) => Promise<any>\n >\n for (const hook of beforeHooks) {\n const result = await hook({\n doc: contextData,\n field: targetField,\n headers: req.headers,\n instructions,\n payload: req.payload,\n prompt: promptToUse,\n req,\n })\n\n if (result) {\n if (result.prompt) {\n promptToUse = result.prompt\n }\n if (result.instructions) {\n instructions = {\n ...instructions,\n ...result.instructions,\n }\n }\n }\n }\n }\n\n if (pluginConfig.debugging) {\n req.payload.logger.info(\n { text: promptToUse },\n `— AI Plugin: Executing media generation`,\n )\n }\n\n // Prepare callback URL for async jobs\n const serverURL =\n req.payload.config?.serverURL ||\n process.env.SERVER_URL ||\n process.env.NEXT_PUBLIC_SERVER_URL\n\n const callbackUrl = serverURL\n ? `${serverURL.replace(/\\/$/, '')}/api${PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK}?instructionId=${instructionId}`\n : undefined\n\n // Get model settings\n // Re-evaluate settings name and settings in case instructions changed\n const modelId = instructions['model-id']\n const settingsName =\n modelId === 'image'\n ? 'image-settings'\n : modelId === 'video'\n ? 'video-settings'\n : modelId === 'tts'\n ? 'tts-settings'\n : undefined\n if (!settingsName) {\n throw new Error(`Unsupported model-id: ${modelId}`)\n }\n\n // Get model settings from instruction\n const instructionSettings = (instructions[settingsName] || {}) as Record<string, unknown>\n\n // Fallback to AISettings global defaults if instruction-level settings are missing\n let globalDefaults: Record<string, unknown> = {}\n if (!instructionSettings.provider || !instructionSettings.model) {\n try {\n const aiSettings = await req.payload.findGlobal({\n slug: 'ai-providers',\n context: { unsafe: true }, // Get decrypted values for internal use\n })\n\n // Map modelId to the corresponding default settings key\n const defaultsKey =\n modelId === 'image'\n ? 'image'\n : modelId === 'video'\n ? 'video'\n : modelId === 'tts'\n ? 'tts'\n : undefined\n\n if (defaultsKey && aiSettings?.defaults?.[defaultsKey]) {\n globalDefaults = aiSettings.defaults[defaultsKey] as Record<string, unknown>\n\n if (pluginConfig.debugging) {\n req.payload.logger.info(\n { globalDefaults },\n `— AI Plugin: Using AISettings defaults for ${modelId}`,\n )\n }\n }\n } catch (e) {\n req.payload.logger.error(e, '— AI Plugin: Error fetching AISettings defaults')\n }\n }\n\n // Merge: instruction settings take priority over global defaults\n // Filter out null/undefined values so they don't overwrite valid defaults\n const filteredInstructionSettings = Object.fromEntries(\n Object.entries(instructionSettings).filter(([_, v]) => v != null),\n )\n const modelSettings = {\n ...globalDefaults,\n ...filteredInstructionSettings,\n }\n\n // Use payload.ai.generateMedia directly! 🎉\n const result = await req.payload.ai.generateMedia({\n callbackUrl,\n images: editImages,\n instructionId,\n model: modelSettings.model as string,\n prompt: promptToUse,\n provider: modelSettings.provider as string,\n ...modelSettings,\n })\n\n if (targetField && (targetField as any).custom?.ai?.afterGenerate) {\n const afterHooks = (targetField as any).custom.ai.afterGenerate as Array<\n (args: any) => Promise<any>\n >\n for (const hook of afterHooks) {\n await hook({\n doc: contextData,\n field: targetField,\n headers: req.headers,\n instructions,\n payload: req.payload,\n req,\n result,\n })\n }\n }\n\n // If model returned files immediately, proceed with upload\n if (result && 'files' in result && Array.isArray(result.files) && result.files.length > 0) {\n const uploadedDocs: Array<{ alt?: string; id: number | string }> = []\n\n for (const file of result.files) {\n let assetData: { alt?: string; id: number | string }\n \n // Create a synthetic result for the single file to pass to mediaUpload\n const singleFileResult = {\n files: [file],\n }\n\n if (typeof pluginConfig.mediaUpload === 'function') {\n const uploadResult = await pluginConfig.mediaUpload(singleFileResult, {\n collection: uploadCollectionSlug as string,\n request: req,\n })\n assetData = { id: uploadResult.id, alt: (uploadResult as any).alt }\n } else {\n const created = await req.payload.create({\n collection: uploadCollectionSlug as string,\n data: { alt: text },\n file, // Pass the file object directly: { data, mimetype, name, size }\n req, // Pass req to ensure access control is applied\n })\n assetData = { id: created.id, alt: created.alt as string }\n }\n\n if (assetData.id) {\n uploadedDocs.push(assetData)\n }\n }\n\n if (uploadedDocs.length === 0) {\n req.payload.logger.error(\n 'Error uploading generated media, is your media upload function correct?',\n )\n throw new Error('Error uploading generated media!')\n }\n\n // Check if target field supports multiple values\n let hasMany = false\n if (targetField) {\n if (targetField.type === 'relationship' || targetField.type === 'upload' || targetField.type === 'select') {\n hasMany = (targetField as any).hasMany === true\n }\n }\n\n if (hasMany) {\n return new Response(\n JSON.stringify({\n result: uploadedDocs.map((d) => ({\n id: d.id,\n alt: d.alt,\n })),\n }),\n )\n }\n\n return new Response(\n JSON.stringify({\n result: {\n id: uploadedDocs[0].id,\n alt: uploadedDocs[0].alt,\n },\n }),\n )\n }\n\n // Otherwise, assume async job launch\n if (result && ('jobId' in result || 'taskId' in result)) {\n const externalTaskId = result.jobId || result.taskId\n const status = result.status || 'queued'\n const progress = result.progress ?? 0\n\n // Create AI Job doc and return only its id\n const createdJob = await req.payload.create({\n collection: PLUGIN_AI_JOBS_TABLE,\n data: {\n instructionId,\n progress,\n status,\n task_id: externalTaskId,\n },\n overrideAccess: true,\n req,\n })\n\n return new Response(JSON.stringify({ job: { id: createdJob.id } }), {\n headers: { 'Content-Type': 'application/json' },\n })\n }\n\n throw new Error('Unexpected model response.')\n } catch (error) {\n req.payload.logger.error(\n // @ts-expect-error\n error?.type || (error as Error).message,\n 'Error generating upload: ',\n )\n const message =\n error && typeof error === 'object' && 'message' in error\n ? (error as Error).message\n : String(error)\n return new Response(JSON.stringify({ error: message }), {\n headers: { 'Content-Type': 'application/json' },\n status:\n message.includes('Authentication required') ||\n message.includes('Insufficient permissions')\n ? 401\n : 500,\n })\n }\n },\n method: 'post',\n path: PLUGIN_API_ENDPOINT_GENERATE_UPLOAD,\n },\n videogenWebhook: {\n handler: async (req: PayloadRequest) => {\n console.log('videogenWebhook --> ', req)\n try {\n const urlAll = new URL(req.url || '')\n const qpSecret = urlAll.searchParams.get('secret') || ''\n const headerSecret = req.headers.get('x-webhook-secret') || ''\n const falSecret = process.env.FAL_WEBHOOK_SECRET\n const legacySecret = process.env.VIDEOGEN_WEBHOOK_SECRET\n const provided = qpSecret || headerSecret\n // TODO: fal is failing because of auth but webhook seem to work\n if (!provided || (falSecret ? provided !== falSecret : provided !== legacySecret)) {\n return new Response('Unauthorized', { status: 401 })\n }\n\n const instructionId = urlAll.searchParams.get('instructionId')\n if (!instructionId) {\n throw new Error('instructionId missing')\n }\n\n const body = await req.json?.()\n // Normalize fal webhook payload\n const status: string | undefined =\n (body && (body.status || body.data?.status || body.response?.status)) || undefined\n const progress: number | undefined =\n (body && (body.progress ?? body.data?.progress ?? body.response?.progress)) ?? undefined\n const requestId: string | undefined =\n (body &&\n (body.taskId ||\n body.request_id ||\n body.gateway_request_id ||\n body.request?.request_id)) ||\n undefined\n const error = body?.error || body?.data?.error || body?.response?.error\n\n // Update AI Job row by task_id (and instructionId)\n const jobSearch = await req.payload.find({\n collection: PLUGIN_AI_JOBS_TABLE,\n depth: 0,\n limit: 1,\n where: {\n and: [\n { task_id: { equals: requestId } },\n { instructionId: { equals: instructionId } },\n ],\n },\n })\n\n const jobDoc = jobSearch.docs?.[0]\n if (jobDoc) {\n await req.payload.update({\n id: jobDoc.id,\n collection: PLUGIN_AI_JOBS_TABLE,\n data: {\n progress,\n status,\n task_id: requestId,\n },\n overrideAccess: true,\n req,\n })\n }\n\n console.log('fal webhook body: ', body)\n\n const videoUrl =\n body?.outputs?.[0]?.url ||\n body?.data?.outputs?.[0]?.url ||\n body?.video?.url ||\n body?.data?.video?.url ||\n body?.response?.video?.url ||\n body?.videos?.[0]?.url ||\n body?.data?.videos?.[0]?.url\n\n if (status === 'completed' && videoUrl) {\n // Fetch the related instruction to get upload collection\n const instructions = await req.payload.findByID({\n id: instructionId,\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n req,\n })\n\n const uploadCollectionSlug = instructions['relation-to']\n\n const videoResp = await fetch(videoUrl)\n if (!videoResp.ok) {\n throw new Error(`Failed to fetch output: ${videoResp.status}`)\n }\n const buffer = Buffer.from(await videoResp.arrayBuffer())\n\n const created = await req.payload.create({\n collection: uploadCollectionSlug,\n data: { alt: 'video generation' },\n file: {\n name: 'video_generation.mp4',\n data: buffer,\n mimetype: 'video/mp4',\n size: buffer.byteLength,\n },\n overrideAccess: true,\n req,\n })\n\n // Persist the result on the AI Job record\n if (jobDoc) {\n await req.payload.update({\n id: jobDoc.id,\n collection: PLUGIN_AI_JOBS_TABLE,\n data: {\n progress: 100,\n result_id: created?.id,\n status: 'completed',\n },\n overrideAccess: true,\n req,\n })\n }\n }\n\n if (status === 'failed' && error) {\n req.payload.logger.error(error, 'Video generation failed: ')\n }\n\n return new Response(JSON.stringify({ ok: true }), {\n headers: { 'Content-Type': 'application/json' },\n })\n } catch (error) {\n req.payload.logger.error(error, 'Error in videogen webhook: ')\n const message =\n error && typeof error === 'object' && 'message' in error\n ? (error as any).message\n : String(error)\n return new Response(JSON.stringify({ error: message }), {\n headers: { 'Content-Type': 'application/json' },\n status: 500,\n })\n }\n },\n method: 'post',\n path: PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK,\n },\n }) satisfies Endpoints\n"],"names":["process","checkAccess","filterEditorSchemaByNodes","PLUGIN_AI_JOBS_TABLE","PLUGIN_API_ENDPOINT_GENERATE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK","PLUGIN_INSTRUCTIONS_TABLE","PLUGIN_NAME","registerEditorHelper","replacePlaceholders","buildSmartPrompt","isGenericPrompt","extractImageData","fetchImages","fieldToJsonSchema","getFieldBySchemaPath","resolveImageReferences","assignPrompt","extendContextWithPromptFields","endpoints","pluginConfig","textarea","handler","req","data","json","allowedEditorNodes","locale","options","action","actionParams","instructionId","contextData","doc","Error","instructions","payload","findByID","id","collection","collections","config","find","slug","custom","editorConfig","admin","schema","editorSchema","prompt","promptTemplate","schemaPath","String","documentData","debugging","logger","info","smartPrompt","allowedEditorSchema","length","receivedNodes","remainingDefinitions","Object","keys","definitions","parts","split","collectionName","fieldName","defaultLocale","locales","localization","localeData","l","code","localeInfo","label","prompts","type","context","field","layout","systemPrompt","system","template","jsonSchema","targetField","targetCollection","c","supported","t","includes","arraySettings","count","modifiedField","maxRows","minRows","nameOverride","e","error","settingsName","undefined","modelSettings","images","resolvedImages","processedPrompt","hardcodedImages","allImages","imageParts","promptToUse","systemToUse","ai","beforeGenerate","beforeHooks","hook","result","headers","streamResult","streamObject","maxTokens","model","onFinish","object","afterGenerate","afterHooks","provider","providerOptions","openai","strictJsonSchema","temperature","message","Response","JSON","stringify","status","method","path","upload","collectionSlug","documentId","docData","draft","sampleImages","extendedContext","text","uploadCollectionSlug","editImages","serverURL","env","SERVER_URL","NEXT_PUBLIC_SERVER_URL","callbackUrl","replace","modelId","instructionSettings","globalDefaults","aiSettings","findGlobal","unsafe","defaultsKey","defaults","filteredInstructionSettings","fromEntries","entries","filter","_","v","generateMedia","Array","isArray","files","uploadedDocs","file","assetData","singleFileResult","mediaUpload","uploadResult","request","alt","created","create","push","hasMany","map","d","externalTaskId","jobId","taskId","progress","createdJob","task_id","overrideAccess","job","videogenWebhook","console","log","urlAll","URL","url","qpSecret","searchParams","get","headerSecret","falSecret","FAL_WEBHOOK_SECRET","legacySecret","VIDEOGEN_WEBHOOK_SECRET","provided","body","response","requestId","request_id","gateway_request_id","jobSearch","depth","limit","where","and","equals","jobDoc","docs","update","videoUrl","outputs","video","videos","videoResp","fetch","ok","buffer","Buffer","from","arrayBuffer","name","mimetype","size","byteLength","result_id"],"mappings":"AAGA,YAAYA,aAAa,eAAc;AAIvC,SAASC,WAAW,QAAQ,2BAA0B;AACtD,SAASC,yBAAyB,QAAQ,2CAA0C;AACpF,SACEC,oBAAoB,EACpBC,4BAA4B,EAC5BC,mCAAmC,EACnCC,oCAAoC,EACpCC,yBAAyB,EACzBC,WAAW,QACN,iBAAgB;AACvB,SAASC,oBAAoB,QAAQ,qCAAoC;AACzE,SAASC,mBAAmB,QAAQ,iDAAgD;AACpF,SAASC,gBAAgB,EAAEC,eAAe,QAAQ,mCAAkC;AACpF,SAASC,gBAAgB,QAAQ,mCAAkC;AACnE,SAA8BC,WAAW,QAAQ,8BAA6B;AAC9E,SAASC,iBAAiB,QAAQ,oCAAmC;AACrE,SAASC,oBAAoB,QAAQ,uCAAsC;AAC3E,SAASC,sBAAsB,QAAQ,yCAAwC;AAC/E,SAASC,YAAY,EAAEC,6BAA6B,QAAQ,wBAAuB;AAEnF,OAAO,MAAMC,YAAuD,CAACC,eAClE,CAAA;QACCC,UAAU;YACR,mEAAmE;YACnEC,SAAS,OAAOC;gBACd,IAAI;oBACF,+CAA+C;oBAC/C,MAAMvB,YAAYuB,KAAKH;oBAEvB,MAAMI,OAAO,MAAMD,IAAIE,IAAI;oBAE3B,MAAM,EAAEC,qBAAqB,EAAE,EAAEC,SAAS,IAAI,EAAEC,OAAO,EAAE,GAAGJ;oBAC5D,MAAM,EAAEK,MAAM,EAAEC,YAAY,EAAEC,aAAa,EAAE,GAAGH;oBAChD,MAAMI,cAAcR,KAAKS,GAAG;oBAE5B,IAAI,CAACF,eAAe;wBAClB,MAAM,IAAIG,MACR,CAAC,gCAAgC,EAAE3B,YAAY,wDAAwD,CAAC;oBAE5G;oBAEA,qDAAqD;oBACrD,MAAM4B,eAAe,MAAMZ,IAAIa,OAAO,CAACC,QAAQ,CAAC;wBAC9CC,IAAIP;wBACJQ,YAAYjC;wBACZiB;oBACF;oBAEA,MAAM,EAAEiB,WAAW,EAAE,GAAGjB,IAAIa,OAAO,CAACK,MAAM;oBAC1C,MAAMF,aAAaC,YAAYE,IAAI,CACjC,CAACH,aAAeA,WAAWI,IAAI,KAAKrC;oBAGtC,IAAI,CAACiC,YAAY;wBACf,MAAM,IAAIL,MAAM;oBAClB;oBAEA,MAAM,EAAEU,QAAQ,EAAE,CAACrC,YAAY,EAAE,EAAEsC,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAGN,WAAWO,KAAK;oBACvF,MAAM,EAAEC,QAAQC,eAAe,CAAC,CAAC,EAAE,GAAGH;oBACtC,IAAI,EAAEI,QAAQC,iBAAiB,EAAE,EAAE,GAAGf;oBAEtC,sFAAsF;oBACtF,IAAIxB,gBAAgBuC,iBAAiB;wBACnC,MAAMC,aAAaC,OAAOjB,YAAY,CAAC,cAAc;wBACrDe,iBAAiBxC,iBAAiB;4BAChC2C,cAAcrB;4BACdI,SAASb,IAAIa,OAAO;4BACpBe;wBACF;wBAEA,IAAI/B,aAAakC,SAAS,EAAE;4BAC1B/B,IAAIa,OAAO,CAACmB,MAAM,CAACC,IAAI,CACrB;gCAAEC,aAAaP;4BAAe,GAC9B,CAAC,6CAA6C,EAAEC,WAAW,CAAC;wBAEhE;oBACF;oBAEA,IAAIO,sBAAsBV;oBAC1B,IAAItB,mBAAmBiC,MAAM,EAAE;wBAC7BD,sBAAsBzD,0BAA0B+C,cAActB;wBAC9D,kEAAkE;wBAClE,IAAIN,aAAakC,SAAS,EAAE;4BAC1B/B,IAAIa,OAAO,CAACmB,MAAM,CAACC,IAAI,CACrB;gCACEI,eAAelC;gCACfmC,sBAAsBC,OAAOC,IAAI,CAACL,oBAAoBM,WAAW,IAAI,CAAC;4BACxE,GACA;wBAEJ;oBACF;oBAEA,MAAMb,aAAaC,OAAOjB,YAAY,CAAC,cAAc;oBACrD,MAAM8B,QAAQ,AAACd,CAAAA,cAAc,EAAC,EAAGe,KAAK,CAAC,QAAQ,EAAE;oBACjD,MAAMC,iBAAiBF,KAAK,CAAC,EAAE;oBAC/B,MAAMG,YAAYH,MAAMN,MAAM,GAAG,IAAIM,KAAK,CAACA,MAAMN,MAAM,GAAG,EAAE,GAAG;oBAE/DnD,qBAAqBe,IAAIa,OAAO,EAAEe;oBAElC,MAAM,EAAEkB,aAAa,EAAEC,UAAU,EAAE,EAAE,GAAG/C,IAAIa,OAAO,CAACK,MAAM,CAAC8B,YAAY,IAAI,CAAC;oBAC5E,MAAMC,aAAaF,QAAQ5B,IAAI,CAAC,CAAC+B;wBAC/B,OAAOA,EAAEC,IAAI,KAAK/C;oBACpB;oBAEA,IAAIgD,aAAahD;oBACjB,IACE6C,cACAH,iBACAG,WAAWI,KAAK,IAChB,OAAOJ,WAAWI,KAAK,KAAK,YAC5BP,iBAAiBG,WAAWI,KAAK,EACjC;wBACAD,aAAaH,WAAWI,KAAK,CAACP,cAAc;oBAC9C;oBAEA,MAAMQ,UAAU,MAAM5D,aAAaY,QAAQ;wBACzCiD,MAAM1B,OAAOjB,YAAY,CAAC,aAAa;wBACvCL;wBACAS,YAAY4B;wBACZY,SAAS/C;wBACTgD,OAAOZ,aAAa;wBACpBa,QAAQ9C,aAAa8C,MAAM;wBAC3BtD,QAAQgD;wBACRvD;wBACA8D,cAAc/C,aAAagD,MAAM;wBACjCC,UAAUhC,OAAOF;oBACnB;oBAEA,IAAI9B,aAAakC,SAAS,EAAE;wBAC1B/B,IAAIa,OAAO,CAACmB,MAAM,CAACC,IAAI,CACrB;4BAAEqB;wBAAQ,GACV,CAAC,sCAAsC,EAAE1B,WAAW,CAAC;oBAEzD;oBAEA,wEAAwE;oBACxE,IAAIkC,aAAa3B;oBACjB,IAAI4B;oBAEJ,IAAI;wBACF,MAAMC,mBAAmBhE,IAAIa,OAAO,CAACK,MAAM,CAACD,WAAW,CAACE,IAAI,CAC1D,CAAC8C,IAAMA,EAAE7C,IAAI,KAAKwB;wBAEpB,IAAIoB,oBAAoBnB,WAAW;4BACjCkB,cAAcvE,qBAAqBwE,kBAAkBpC;4BACrD,MAAMsC,YAAY;gCAChB;gCACA;gCACA;gCACA;gCACA;gCACA;gCACA;gCACA;gCACA;6BACD;4BACD,MAAMC,IAAItC,OAAOkC,aAAaR,QAAQ;4BACtC,IAAIQ,eAAeG,UAAUE,QAAQ,CAACD,IAAI;gCACxC,+DAA+D;gCAC/D,IAAIA,MAAM,SAAS;oCACjB,MAAME,gBAAiBzD,YAAY,CAAC,iBAAiB,IAAI,CAAC;oCAI1D,MAAM0D,QAAQ,AAACD,cAAcC,KAAK,IAAe;oCACjD,wDAAwD;oCACxD,MAAMC,gBAAgB;wCACpB,GAAGR,WAAW;wCACdS,SAASF;wCACTG,SAASH;oCACX;oCACAR,aAAavE,kBAAkBgF,eAAe;wCAAEG,cAAc7B;oCAAU;gCAC1E,OAAO;oCACLiB,aAAavE,kBAAkBwE,aAAa;wCAAEW,cAAc7B;oCAAU;gCACxE;4BACF;wBACF;oBACF,EAAE,OAAO8B,GAAG;wBACV3E,IAAIa,OAAO,CAACmB,MAAM,CAAC4C,KAAK,CAACD,GAAG;oBAC9B;oBAEA,sCAAsC;oBACtC,MAAME,eACJjE,YAAY,CAAC,WAAW,KAAK,aACzB,sBACAA,YAAY,CAAC,WAAW,KAAK,SAC3B,kBACAA,YAAY,CAAC,WAAW,KAAK,UAC3B,mBACAkE;oBAEV,IAAI,CAACD,cAAc;wBACjB,MAAM,IAAIlE,MAAM,CAAC,sBAAsB,EAAEC,YAAY,CAAC,WAAW,CAAC,CAAC;oBACrE;oBAEA,MAAMmE,gBAAgBnE,YAAY,CAACiE,aAAa,IAAI,CAAC;oBAErD,qDAAqD;oBACrD,MAAM,EAAEG,QAAQC,cAAc,EAAEC,eAAe,EAAE,GAAG,MAAMzF,uBACxD6D,QAAQ5B,MAAM,EACdjB,aACAT,KACA4C;oBAGF,mDAAmD;oBACnD,MAAMuC,kBAAkB9F,iBAAiB6F;oBAEzC,iBAAiB;oBACjB,MAAME,YAAY;2BAAID;2BAAoBF;qBAAe;oBAEzD,IAAID;oBAEJ,IAAII,UAAUhD,MAAM,GAAG,GAAG;wBACxB,MAAMiD,aAAa,MAAM/F,YAAYU,KAAKoF;wBAE1C,IAAIC,WAAWjD,MAAM,GAAG,GAAG;4BACzB4C,SAASK;wBACX;oBACF;oBAEA,IAAIC,cAAcJ;oBAClB,IAAIK,cAAcjC,QAAQM,MAAM;oBAChC,qCAAqC;oBAErC,+BAA+B;oBAC/B,IAAIG,eAAe,AAACA,YAAoB1C,MAAM,EAAEmE,IAAIC,gBAAgB;wBAClE,MAAMC,cAAc,AAAC3B,YAAoB1C,MAAM,CAACmE,EAAE,CAACC,cAAc;wBAGjE,KAAK,MAAME,QAAQD,YAAa;4BAC9B,MAAME,SAAS,MAAMD,KAAK;gCACxBjF,KAAKD;gCACLgD,OAAOM;gCACP8B,SAAS7F,IAAI6F,OAAO;gCACpBjF;gCACAC,SAASb,IAAIa,OAAO;gCACpBa,QAAQ4D;gCACRtF;gCACA4D,QAAQ2B;4BACV;4BAEA,IAAIK,QAAQ;gCACV,IAAIA,OAAOlE,MAAM,EAAE4D,cAAcM,OAAOlE,MAAM;gCAC9C,IAAIkE,OAAOhC,MAAM,EAAE2B,cAAcK,OAAOhC,MAAM;4BAChD;wBACF;oBACF;oBAEA,MAAMkC,eAAe,MAAM9F,IAAIa,OAAO,CAAC2E,EAAE,CAACO,YAAY,CAAC;wBACrD,+EAA+E;wBAC/Ef;wBACAgB,WAAWjB,cAAciB,SAAS;wBAClC,2BAA2B;wBAC3BC,OAAOlB,cAAckB,KAAK;wBAC1BC,UAAU,OAAO,EAAEC,MAAM,EAAE;4BACzB,IAAIpC,eAAe,AAACA,YAAoB1C,MAAM,EAAEmE,IAAIY,eAAe;gCACjE,MAAMC,aAAa,AAACtC,YAAoB1C,MAAM,CAACmE,EAAE,CAACY,aAAa;gCAG/D,KAAK,MAAMT,QAAQU,WAAY;oCAC7B,MAAMV,KAAK;wCACTjF,KAAKD;wCACLgD,OAAOM;wCACP8B,SAAS7F,IAAI6F,OAAO;wCACpBjF;wCACAC,SAASb,IAAIa,OAAO;wCACpBb;wCACA4F,QAAQO;oCACV;gCACF;4BACF;wBACF;wBACAzE,QAAQwD;wBACRoB,UAAUvB,cAAcuB,QAAQ;wBAChCC,iBAAiB;4BACfC,QAAQ;gCACNC,kBAAkB;4BACpB;wBACF;wBACAjF,QAAQsC;wBACRF,QAAQ2B;wBACRmB,aAAa3B,cAAc2B,WAAW;oBACxC;oBAEA,OAAOZ;gBACT,EAAE,OAAOlB,OAAO;oBACd5E,IAAIa,OAAO,CAACmB,MAAM,CAAC4C,KAAK,CAACA,OAAO;oBAChC,MAAM+B,UACJ/B,SAAS,OAAOA,UAAU,YAAY,aAAaA,QAC/C,AAACA,MAAgB+B,OAAO,GACxB9E,OAAO+C;oBACb,OAAO,IAAIgC,SAASC,KAAKC,SAAS,CAAC;wBAAElC,OAAO+B;oBAAQ,IAAI;wBACtDd,SAAS;4BAAE,gBAAgB;wBAAmB;wBAC9CkB,QACEJ,QAAQvC,QAAQ,CAAC,8BACjBuC,QAAQvC,QAAQ,CAAC,8BACb,MACA;oBACR;gBACF;YACF;YACA4C,QAAQ;YACRC,MAAMrI;QACR;QACAsI,QAAQ;YACN,iEAAiE;YACjEnH,SAAS,OAAOC;gBACd,IAAI;oBACF,+CAA+C;oBAC/C,MAAMvB,YAAYuB,KAAKH;oBAEvB,MAAMI,OAAO,MAAMD,IAAIE,IAAI;oBAE3B,MAAM,EAAEiH,cAAc,EAAEC,UAAU,EAAE/G,OAAO,EAAE,GAAGJ;oBAChD,MAAM,EAAEO,aAAa,EAAE,GAAGH;oBAC1B,IAAIgH,UAAU,CAAC;oBAEf,IAAID,YAAY;wBACd,IAAI;4BACFC,UAAU,MAAMrH,IAAIa,OAAO,CAACC,QAAQ,CAAC;gCACnCC,IAAIqG;gCACJpG,YAAYmG;gCACZG,OAAO;gCACPtH;4BACF;wBACF,EAAE,OAAO2E,GAAG;4BACV3E,IAAIa,OAAO,CAACmB,MAAM,CAAC4C,KAAK,CACtBD,GACA;wBAEJ;oBACF;oBAEA,MAAMlE,cAAc;wBAClB,GAAGR,KAAKS,GAAG;wBACX,GAAG2G,OAAO;oBACZ;oBAEA,IAAIzG,eAAwC;wBAAEoE,QAAQ,EAAE;wBAAE,YAAY;wBAAItD,QAAQ;oBAAG;oBAErF,IAAIlB,eAAe;wBACjB,qDAAqD;wBACrDI,eAAe,MAAMZ,IAAIa,OAAO,CAACC,QAAQ,CAAC;4BACxCC,IAAIP;4BACJQ,YAAYjC;4BACZiB;wBACF;oBACF;oBAEA,IAAI,EAAE0B,QAAQC,iBAAiB,EAAE,EAAE,GAAGf;oBACtC,MAAM,EAAEoE,QAAQuC,eAAe,EAAE,EAAE,GAAG3G;oBACtC,MAAMgB,aAAaC,OAAOjB,YAAY,CAAC,cAAc;oBACrD3B,qBAAqBe,IAAIa,OAAO,EAAEe;oBAElC,sFAAsF;oBACtF,IAAIxC,gBAAgBuC,iBAA2B;wBAC7CA,iBAAiBxC,iBAAiB;4BAChC2C,cAAcrB;4BACdI,SAASb,IAAIa,OAAO;4BACpBe;wBACF;wBAEA,IAAI/B,aAAakC,SAAS,EAAE;4BAC1B/B,IAAIa,OAAO,CAACmB,MAAM,CAACC,IAAI,CACrB;gCAAEC,aAAaP;4BAAe,GAC9B,CAAC,6CAA6C,EAAEC,WAAW,CAAC;wBAEhE;oBACF;oBAEA,MAAM4F,kBAAkB7H,8BACtBc,aACA;wBAAE8C,MAAM1B,OAAOjB,YAAY,CAAC,aAAa;wBAAGI,YAAYmG;oBAAe,GACvEtH;oBAEF,MAAM4H,OAAO,MAAMvI,oBAAoByC,gBAA0B6F;oBACjE,MAAME,uBAAuB9G,YAAY,CAAC,cAAc;oBAExD,qDAAqD;oBACrD,MAAM,EAAEoE,QAAQC,cAAc,EAAEC,eAAe,EAAE,GAAG,MAAMzF,uBACxDgI,MACAhH,aACAT,KACAmH;oBAGF,oGAAoG;oBACpG,MAAMnC,SAAS;2BACV3F,iBAAiB6F;2BACjBD;2BACCsC;qBACL;oBAED,4DAA4D;oBAC5D,MAAMI,aAA0B,MAAMrI,YAAYU,KAAKgF;oBAEvD,IAAIM,cAAcmC;oBAClB,IAAI1D;oBAEJ,IAAI;wBACF,MAAMC,mBAAmBhE,IAAIa,OAAO,CAACK,MAAM,CAACD,WAAW,CAACE,IAAI,CAC1D,CAAC8C,IAAMA,EAAE7C,IAAI,KAAK+F;wBAEpB,IAAInD,oBAAoBpC,YAAY;4BAClCmC,cAAcvE,qBAAqBwE,kBAAkBpC;wBACvD;oBACF,EAAE,OAAO+C,GAAG;wBACV3E,IAAIa,OAAO,CAACmB,MAAM,CAAC4C,KAAK,CAACD,GAAG;oBAC9B;oBAEA,IAAIZ,eAAe,AAACA,YAAoB1C,MAAM,EAAEmE,IAAIC,gBAAgB;wBAClE,MAAMC,cAAc,AAAC3B,YAAoB1C,MAAM,CAACmE,EAAE,CAACC,cAAc;wBAGjE,KAAK,MAAME,QAAQD,YAAa;4BAC9B,MAAME,SAAS,MAAMD,KAAK;gCACxBjF,KAAKD;gCACLgD,OAAOM;gCACP8B,SAAS7F,IAAI6F,OAAO;gCACpBjF;gCACAC,SAASb,IAAIa,OAAO;gCACpBa,QAAQ4D;gCACRtF;4BACF;4BAEA,IAAI4F,QAAQ;gCACV,IAAIA,OAAOlE,MAAM,EAAE;oCACjB4D,cAAcM,OAAOlE,MAAM;gCAC7B;gCACA,IAAIkE,OAAOhF,YAAY,EAAE;oCACvBA,eAAe;wCACb,GAAGA,YAAY;wCACf,GAAGgF,OAAOhF,YAAY;oCACxB;gCACF;4BACF;wBACF;oBACF;oBAEA,IAAIf,aAAakC,SAAS,EAAE;wBAC1B/B,IAAIa,OAAO,CAACmB,MAAM,CAACC,IAAI,CACrB;4BAAEwF,MAAMnC;wBAAY,GACpB,CAAC,uCAAuC,CAAC;oBAE7C;oBAEA,sCAAsC;oBACtC,MAAMsC,YACJ5H,IAAIa,OAAO,CAACK,MAAM,EAAE0G,aACpBpJ,QAAQqJ,GAAG,CAACC,UAAU,IACtBtJ,QAAQqJ,GAAG,CAACE,sBAAsB;oBAEpC,MAAMC,cAAcJ,YAChB,CAAC,EAAEA,UAAUK,OAAO,CAAC,OAAO,IAAI,IAAI,EAAEnJ,qCAAqC,eAAe,EAAE0B,cAAc,CAAC,GAC3GsE;oBAEJ,qBAAqB;oBACrB,sEAAsE;oBACtE,MAAMoD,UAAUtH,YAAY,CAAC,WAAW;oBACxC,MAAMiE,eACJqD,YAAY,UACR,mBACAA,YAAY,UACV,mBACAA,YAAY,QACV,iBACApD;oBACV,IAAI,CAACD,cAAc;wBACjB,MAAM,IAAIlE,MAAM,CAAC,sBAAsB,EAAEuH,QAAQ,CAAC;oBACpD;oBAEA,sCAAsC;oBACtC,MAAMC,sBAAuBvH,YAAY,CAACiE,aAAa,IAAI,CAAC;oBAE5D,mFAAmF;oBACnF,IAAIuD,iBAA0C,CAAC;oBAC/C,IAAI,CAACD,oBAAoB7B,QAAQ,IAAI,CAAC6B,oBAAoBlC,KAAK,EAAE;wBAC/D,IAAI;4BACF,MAAMoC,aAAa,MAAMrI,IAAIa,OAAO,CAACyH,UAAU,CAAC;gCAC9ClH,MAAM;gCACNoC,SAAS;oCAAE+E,QAAQ;gCAAK;4BAC1B;4BAEA,wDAAwD;4BACxD,MAAMC,cACJN,YAAY,UACR,UACAA,YAAY,UACV,UACAA,YAAY,QACV,QACApD;4BAEV,IAAI0D,eAAeH,YAAYI,UAAU,CAACD,YAAY,EAAE;gCACtDJ,iBAAiBC,WAAWI,QAAQ,CAACD,YAAY;gCAEjD,IAAI3I,aAAakC,SAAS,EAAE;oCAC1B/B,IAAIa,OAAO,CAACmB,MAAM,CAACC,IAAI,CACrB;wCAAEmG;oCAAe,GACjB,CAAC,2CAA2C,EAAEF,QAAQ,CAAC;gCAE3D;4BACF;wBACF,EAAE,OAAOvD,GAAG;4BACV3E,IAAIa,OAAO,CAACmB,MAAM,CAAC4C,KAAK,CAACD,GAAG;wBAC9B;oBACF;oBAEA,iEAAiE;oBACjE,0EAA0E;oBAC1E,MAAM+D,8BAA8BnG,OAAOoG,WAAW,CACpDpG,OAAOqG,OAAO,CAACT,qBAAqBU,MAAM,CAAC,CAAC,CAACC,GAAGC,EAAE,GAAKA,KAAK;oBAE9D,MAAMhE,gBAAgB;wBACpB,GAAGqD,cAAc;wBACjB,GAAGM,2BAA2B;oBAChC;oBAEA,4CAA4C;oBAC5C,MAAM9C,SAAS,MAAM5F,IAAIa,OAAO,CAAC2E,EAAE,CAACwD,aAAa,CAAC;wBAChDhB;wBACAhD,QAAQ2C;wBACRnH;wBACAyF,OAAOlB,cAAckB,KAAK;wBAC1BvE,QAAQ4D;wBACRgB,UAAUvB,cAAcuB,QAAQ;wBAChC,GAAGvB,aAAa;oBAClB;oBAEA,IAAIhB,eAAe,AAACA,YAAoB1C,MAAM,EAAEmE,IAAIY,eAAe;wBACjE,MAAMC,aAAa,AAACtC,YAAoB1C,MAAM,CAACmE,EAAE,CAACY,aAAa;wBAG/D,KAAK,MAAMT,QAAQU,WAAY;4BAC7B,MAAMV,KAAK;gCACTjF,KAAKD;gCACLgD,OAAOM;gCACP8B,SAAS7F,IAAI6F,OAAO;gCACpBjF;gCACAC,SAASb,IAAIa,OAAO;gCACpBb;gCACA4F;4BACF;wBACF;oBACF;oBAEA,2DAA2D;oBAC3D,IAAIA,UAAU,WAAWA,UAAUqD,MAAMC,OAAO,CAACtD,OAAOuD,KAAK,KAAKvD,OAAOuD,KAAK,CAAC/G,MAAM,GAAG,GAAG;wBACzF,MAAMgH,eAA6D,EAAE;wBAErE,KAAK,MAAMC,QAAQzD,OAAOuD,KAAK,CAAE;4BAC/B,IAAIG;4BAEJ,uEAAuE;4BACvE,MAAMC,mBAAmB;gCACvBJ,OAAO;oCAACE;iCAAK;4BACf;4BAEA,IAAI,OAAOxJ,aAAa2J,WAAW,KAAK,YAAY;gCAClD,MAAMC,eAAe,MAAM5J,aAAa2J,WAAW,CAACD,kBAAkB;oCACpEvI,YAAY0G;oCACZgC,SAAS1J;gCACX;gCACAsJ,YAAY;oCAAEvI,IAAI0I,aAAa1I,EAAE;oCAAE4I,KAAK,AAACF,aAAqBE,GAAG;gCAAC;4BACpE,OAAO;gCACL,MAAMC,UAAU,MAAM5J,IAAIa,OAAO,CAACgJ,MAAM,CAAC;oCACvC7I,YAAY0G;oCACZzH,MAAM;wCAAE0J,KAAKlC;oCAAK;oCAClB4B;oCACArJ;gCACF;gCACAsJ,YAAY;oCAAEvI,IAAI6I,QAAQ7I,EAAE;oCAAE4I,KAAKC,QAAQD,GAAG;gCAAW;4BAC3D;4BAEA,IAAIL,UAAUvI,EAAE,EAAE;gCAChBqI,aAAaU,IAAI,CAACR;4BACpB;wBACF;wBAEA,IAAIF,aAAahH,MAAM,KAAK,GAAG;4BAC7BpC,IAAIa,OAAO,CAACmB,MAAM,CAAC4C,KAAK,CACtB;4BAEF,MAAM,IAAIjE,MAAM;wBAClB;wBAEA,iDAAiD;wBACjD,IAAIoJ,UAAU;wBACd,IAAIhG,aAAa;4BACf,IAAIA,YAAYR,IAAI,KAAK,kBAAkBQ,YAAYR,IAAI,KAAK,YAAYQ,YAAYR,IAAI,KAAK,UAAU;gCACzGwG,UAAU,AAAChG,YAAoBgG,OAAO,KAAK;4BAC7C;wBACF;wBAEA,IAAIA,SAAS;4BACV,OAAO,IAAInD,SACVC,KAAKC,SAAS,CAAC;gCACblB,QAAQwD,aAAaY,GAAG,CAAC,CAACC,IAAO,CAAA;wCAC/BlJ,IAAIkJ,EAAElJ,EAAE;wCACR4I,KAAKM,EAAEN,GAAG;oCACZ,CAAA;4BACF;wBAEJ;wBAEA,OAAO,IAAI/C,SACTC,KAAKC,SAAS,CAAC;4BACblB,QAAQ;gCACN7E,IAAIqI,YAAY,CAAC,EAAE,CAACrI,EAAE;gCACtB4I,KAAKP,YAAY,CAAC,EAAE,CAACO,GAAG;4BAC1B;wBACF;oBAEJ;oBAEA,qCAAqC;oBACrC,IAAI/D,UAAW,CAAA,WAAWA,UAAU,YAAYA,MAAK,GAAI;wBACvD,MAAMsE,iBAAiBtE,OAAOuE,KAAK,IAAIvE,OAAOwE,MAAM;wBACpD,MAAMrD,SAASnB,OAAOmB,MAAM,IAAI;wBAChC,MAAMsD,WAAWzE,OAAOyE,QAAQ,IAAI;wBAEpC,2CAA2C;wBAC3C,MAAMC,aAAa,MAAMtK,IAAIa,OAAO,CAACgJ,MAAM,CAAC;4BAC1C7I,YAAYrC;4BACZsB,MAAM;gCACJO;gCACA6J;gCACAtD;gCACAwD,SAASL;4BACX;4BACAM,gBAAgB;4BAChBxK;wBACF;wBAEA,OAAO,IAAI4G,SAASC,KAAKC,SAAS,CAAC;4BAAE2D,KAAK;gCAAE1J,IAAIuJ,WAAWvJ,EAAE;4BAAC;wBAAE,IAAI;4BAClE8E,SAAS;gCAAE,gBAAgB;4BAAmB;wBAChD;oBACF;oBAEA,MAAM,IAAIlF,MAAM;gBAClB,EAAE,OAAOiE,OAAO;oBACd5E,IAAIa,OAAO,CAACmB,MAAM,CAAC4C,KAAK,CACtB,mBAAmB;oBACnBA,OAAOrB,QAAQ,AAACqB,MAAgB+B,OAAO,EACvC;oBAEF,MAAMA,UACJ/B,SAAS,OAAOA,UAAU,YAAY,aAAaA,QAC/C,AAACA,MAAgB+B,OAAO,GACxB9E,OAAO+C;oBACb,OAAO,IAAIgC,SAASC,KAAKC,SAAS,CAAC;wBAAElC,OAAO+B;oBAAQ,IAAI;wBACtDd,SAAS;4BAAE,gBAAgB;wBAAmB;wBAC9CkB,QACEJ,QAAQvC,QAAQ,CAAC,8BACjBuC,QAAQvC,QAAQ,CAAC,8BACb,MACA;oBACR;gBACF;YACF;YACA4C,QAAQ;YACRC,MAAMpI;QACR;QACA6L,iBAAiB;YACf3K,SAAS,OAAOC;gBACd2K,QAAQC,GAAG,CAAC,wBAAwB5K;gBACpC,IAAI;oBACF,MAAM6K,SAAS,IAAIC,IAAI9K,IAAI+K,GAAG,IAAI;oBAClC,MAAMC,WAAWH,OAAOI,YAAY,CAACC,GAAG,CAAC,aAAa;oBACtD,MAAMC,eAAenL,IAAI6F,OAAO,CAACqF,GAAG,CAAC,uBAAuB;oBAC5D,MAAME,YAAY5M,QAAQqJ,GAAG,CAACwD,kBAAkB;oBAChD,MAAMC,eAAe9M,QAAQqJ,GAAG,CAAC0D,uBAAuB;oBACxD,MAAMC,WAAWR,YAAYG;oBAC7B,gEAAgE;oBAChE,IAAI,CAACK,YAAaJ,CAAAA,YAAYI,aAAaJ,YAAYI,aAAaF,YAAW,GAAI;wBACjF,OAAO,IAAI1E,SAAS,gBAAgB;4BAAEG,QAAQ;wBAAI;oBACpD;oBAEA,MAAMvG,gBAAgBqK,OAAOI,YAAY,CAACC,GAAG,CAAC;oBAC9C,IAAI,CAAC1K,eAAe;wBAClB,MAAM,IAAIG,MAAM;oBAClB;oBAEA,MAAM8K,OAAO,MAAMzL,IAAIE,IAAI;oBAC3B,gCAAgC;oBAChC,MAAM6G,SACJ,AAAC0E,QAASA,CAAAA,KAAK1E,MAAM,IAAI0E,KAAKxL,IAAI,EAAE8G,UAAU0E,KAAKC,QAAQ,EAAE3E,MAAK,KAAOjC;oBAC3E,MAAMuF,WACJ,AAACoB,CAAAA,QAASA,CAAAA,KAAKpB,QAAQ,IAAIoB,KAAKxL,IAAI,EAAEoK,YAAYoB,KAAKC,QAAQ,EAAErB,QAAO,CAAC,KAAMvF;oBACjF,MAAM6G,YACJ,AAACF,QACEA,CAAAA,KAAKrB,MAAM,IACVqB,KAAKG,UAAU,IACfH,KAAKI,kBAAkB,IACvBJ,KAAK/B,OAAO,EAAEkC,UAAS,KAC3B9G;oBACF,MAAMF,QAAQ6G,MAAM7G,SAAS6G,MAAMxL,MAAM2E,SAAS6G,MAAMC,UAAU9G;oBAElE,mDAAmD;oBACnD,MAAMkH,YAAY,MAAM9L,IAAIa,OAAO,CAACM,IAAI,CAAC;wBACvCH,YAAYrC;wBACZoN,OAAO;wBACPC,OAAO;wBACPC,OAAO;4BACLC,KAAK;gCACH;oCAAE3B,SAAS;wCAAE4B,QAAQR;oCAAU;gCAAE;gCACjC;oCAAEnL,eAAe;wCAAE2L,QAAQ3L;oCAAc;gCAAE;6BAC5C;wBACH;oBACF;oBAEA,MAAM4L,SAASN,UAAUO,IAAI,EAAE,CAAC,EAAE;oBAClC,IAAID,QAAQ;wBACV,MAAMpM,IAAIa,OAAO,CAACyL,MAAM,CAAC;4BACvBvL,IAAIqL,OAAOrL,EAAE;4BACbC,YAAYrC;4BACZsB,MAAM;gCACJoK;gCACAtD;gCACAwD,SAASoB;4BACX;4BACAnB,gBAAgB;4BAChBxK;wBACF;oBACF;oBAEA2K,QAAQC,GAAG,CAAC,sBAAsBa;oBAElC,MAAMc,WACJd,MAAMe,SAAS,CAAC,EAAE,EAAEzB,OACpBU,MAAMxL,MAAMuM,SAAS,CAAC,EAAE,EAAEzB,OAC1BU,MAAMgB,OAAO1B,OACbU,MAAMxL,MAAMwM,OAAO1B,OACnBU,MAAMC,UAAUe,OAAO1B,OACvBU,MAAMiB,QAAQ,CAAC,EAAE,EAAE3B,OACnBU,MAAMxL,MAAMyM,QAAQ,CAAC,EAAE,EAAE3B;oBAE3B,IAAIhE,WAAW,eAAewF,UAAU;wBACtC,yDAAyD;wBACzD,MAAM3L,eAAe,MAAMZ,IAAIa,OAAO,CAACC,QAAQ,CAAC;4BAC9CC,IAAIP;4BACJQ,YAAYjC;4BACZiB;wBACF;wBAEA,MAAM0H,uBAAuB9G,YAAY,CAAC,cAAc;wBAExD,MAAM+L,YAAY,MAAMC,MAAML;wBAC9B,IAAI,CAACI,UAAUE,EAAE,EAAE;4BACjB,MAAM,IAAIlM,MAAM,CAAC,wBAAwB,EAAEgM,UAAU5F,MAAM,CAAC,CAAC;wBAC/D;wBACA,MAAM+F,SAASC,OAAOC,IAAI,CAAC,MAAML,UAAUM,WAAW;wBAEtD,MAAMrD,UAAU,MAAM5J,IAAIa,OAAO,CAACgJ,MAAM,CAAC;4BACvC7I,YAAY0G;4BACZzH,MAAM;gCAAE0J,KAAK;4BAAmB;4BAChCN,MAAM;gCACJ6D,MAAM;gCACNjN,MAAM6M;gCACNK,UAAU;gCACVC,MAAMN,OAAOO,UAAU;4BACzB;4BACA7C,gBAAgB;4BAChBxK;wBACF;wBAEA,0CAA0C;wBAC1C,IAAIoM,QAAQ;4BACV,MAAMpM,IAAIa,OAAO,CAACyL,MAAM,CAAC;gCACvBvL,IAAIqL,OAAOrL,EAAE;gCACbC,YAAYrC;gCACZsB,MAAM;oCACJoK,UAAU;oCACViD,WAAW1D,SAAS7I;oCACpBgG,QAAQ;gCACV;gCACAyD,gBAAgB;gCAChBxK;4BACF;wBACF;oBACF;oBAEA,IAAI+G,WAAW,YAAYnC,OAAO;wBAChC5E,IAAIa,OAAO,CAACmB,MAAM,CAAC4C,KAAK,CAACA,OAAO;oBAClC;oBAEA,OAAO,IAAIgC,SAASC,KAAKC,SAAS,CAAC;wBAAE+F,IAAI;oBAAK,IAAI;wBAChDhH,SAAS;4BAAE,gBAAgB;wBAAmB;oBAChD;gBACF,EAAE,OAAOjB,OAAO;oBACd5E,IAAIa,OAAO,CAACmB,MAAM,CAAC4C,KAAK,CAACA,OAAO;oBAChC,MAAM+B,UACJ/B,SAAS,OAAOA,UAAU,YAAY,aAAaA,QAC/C,AAACA,MAAc+B,OAAO,GACtB9E,OAAO+C;oBACb,OAAO,IAAIgC,SAASC,KAAKC,SAAS,CAAC;wBAAElC,OAAO+B;oBAAQ,IAAI;wBACtDd,SAAS;4BAAE,gBAAgB;wBAAmB;wBAC9CkB,QAAQ;oBACV;gBACF;YACF;YACAC,QAAQ;YACRC,MAAMnI;QACR;IACF,CAAA,EAAsB"}
1
+ {"version":3,"sources":["../../src/endpoints/index.ts"],"sourcesContent":["import type { Endpoints, PluginConfig } from '../types.js'\n\nimport {\n PLUGIN_API_ENDPOINT_GENERATE,\n PLUGIN_API_ENDPOINT_GENERATE_UPLOAD,\n PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK,\n} from '../defaults.js'\nimport { generateHandler } from './generate.js'\nimport { promptMentionsEndpoint } from './promptMentions.js'\nimport { uploadHandler } from './upload.js'\nimport { videogenWebhookHandler } from './videogenWebhook.js'\n\nexport const endpoints: (pluginConfig: PluginConfig) => Endpoints = (pluginConfig) =>\n ({\n promptMentions: promptMentionsEndpoint,\n textarea: {\n handler: generateHandler(pluginConfig),\n method: 'post',\n path: PLUGIN_API_ENDPOINT_GENERATE,\n },\n upload: {\n handler: uploadHandler(pluginConfig),\n method: 'post',\n path: PLUGIN_API_ENDPOINT_GENERATE_UPLOAD,\n },\n videogenWebhook: {\n handler: videogenWebhookHandler,\n method: 'post',\n path: PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK,\n },\n }) satisfies Endpoints\n"],"names":["PLUGIN_API_ENDPOINT_GENERATE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK","generateHandler","promptMentionsEndpoint","uploadHandler","videogenWebhookHandler","endpoints","pluginConfig","promptMentions","textarea","handler","method","path","upload","videogenWebhook"],"mappings":"AAEA,SACEA,4BAA4B,EAC5BC,mCAAmC,EACnCC,oCAAoC,QAC/B,iBAAgB;AACvB,SAASC,eAAe,QAAQ,gBAAe;AAC/C,SAASC,sBAAsB,QAAQ,sBAAqB;AAC5D,SAASC,aAAa,QAAQ,cAAa;AAC3C,SAASC,sBAAsB,QAAQ,uBAAsB;AAE7D,OAAO,MAAMC,YAAuD,CAACC,eAClE,CAAA;QACCC,gBAAgBL;QAChBM,UAAU;YACRC,SAASR,gBAAgBK;YACzBI,QAAQ;YACRC,MAAMb;QACR;QACAc,QAAQ;YACNH,SAASN,cAAcG;YACvBI,QAAQ;YACRC,MAAMZ;QACR;QACAc,iBAAiB;YACfJ,SAASL;YACTM,QAAQ;YACRC,MAAMX;QACR;IACF,CAAA,EAAsB"}
@@ -0,0 +1,2 @@
1
+ import type { Endpoint } from 'payload';
2
+ export declare const promptMentionsEndpoint: Endpoint;
@@ -0,0 +1,166 @@
1
+ const collectFieldSuggestions = (fields, prefix = '', suggestions = [])=>{
2
+ for (const field of fields){
3
+ if (field.name) {
4
+ const fieldPath = prefix ? `${prefix}.${String(field.name)}` : String(field.name);
5
+ suggestions.push({
6
+ id: fieldPath,
7
+ display: fieldPath
8
+ });
9
+ }
10
+ if (field.fields && Array.isArray(field.fields)) {
11
+ const newPrefix = field.name ? prefix ? `${prefix}.${String(field.name)}` : String(field.name) : prefix;
12
+ collectFieldSuggestions(field.fields, newPrefix, suggestions);
13
+ }
14
+ if (field.tabs && Array.isArray(field.tabs)) {
15
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
+ field.tabs.forEach((tab)=>{
17
+ collectFieldSuggestions(tab.fields, prefix, suggestions);
18
+ });
19
+ }
20
+ }
21
+ return suggestions;
22
+ };
23
+ const collectUploadFields = (fields, prefix = '', uploadFields = [])=>{
24
+ for (const field of fields){
25
+ if (field.type === 'upload' && field.name) {
26
+ const fieldPath = prefix ? `${prefix}.${String(field.name)}` : String(field.name);
27
+ uploadFields.push({
28
+ name: fieldPath,
29
+ hasMany: field.hasMany === true
30
+ });
31
+ }
32
+ if (field.fields && Array.isArray(field.fields)) {
33
+ const newPrefix = field.name ? prefix ? `${prefix}.${String(field.name)}` : String(field.name) : prefix;
34
+ collectUploadFields(field.fields, newPrefix, uploadFields);
35
+ }
36
+ if (field.tabs && Array.isArray(field.tabs)) {
37
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
38
+ field.tabs.forEach((tab)=>{
39
+ collectUploadFields(tab.fields, prefix, uploadFields);
40
+ });
41
+ }
42
+ }
43
+ return uploadFields;
44
+ };
45
+ const mentionsResponse = (items)=>Response.json({
46
+ items: items.map((s)=>({
47
+ ...s,
48
+ value: s.id
49
+ }))
50
+ }, {
51
+ headers: {
52
+ 'Cache-Control': 'private, max-age=30, stale-while-revalidate=120'
53
+ }
54
+ });
55
+ export const promptMentionsEndpoint = {
56
+ handler: async (req)=>{
57
+ const trigger = String(req.query.trigger ?? '@');
58
+ const q = String(req.query.q ?? '').trim();
59
+ const collectionSlug = String(req.query.collection ?? '');
60
+ const id = String(req.query.id ?? '');
61
+ if (!collectionSlug) {
62
+ return Response.json({
63
+ items: []
64
+ });
65
+ }
66
+ // Handle Fields (#)
67
+ if (trigger === '#') {
68
+ const collection = req.payload.config.collections.find((c)=>c.slug === collectionSlug);
69
+ if (!collection) {
70
+ return Response.json({
71
+ items: []
72
+ });
73
+ }
74
+ const fieldSuggestions = collectFieldSuggestions(collection.fields);
75
+ const suggestions = q.length === 0 ? fieldSuggestions : fieldSuggestions.filter((item)=>item.id.toLowerCase().includes(q.toLowerCase()));
76
+ return mentionsResponse(suggestions);
77
+ }
78
+ // Handle Images (@)
79
+ if (trigger === '@') {
80
+ const collection = req.payload.config.collections.find((c)=>c.slug === collectionSlug);
81
+ if (!collection) {
82
+ return Response.json({
83
+ items: []
84
+ });
85
+ }
86
+ const uploadFields = collectUploadFields(collection.fields);
87
+ const suggestions = [];
88
+ // Add base field names
89
+ uploadFields.forEach(({ name })=>{
90
+ if (!q || name.toLowerCase().includes(q.toLowerCase())) {
91
+ suggestions.push({
92
+ id: name,
93
+ display: name
94
+ });
95
+ }
96
+ });
97
+ // If ID is provided, fetch document to get specific filenames
98
+ if (id && id !== 'create') {
99
+ try {
100
+ const doc = await req.payload.findByID({
101
+ id,
102
+ collection: collectionSlug,
103
+ depth: 1,
104
+ req
105
+ });
106
+ if (doc) {
107
+ uploadFields.forEach(({ name, hasMany })=>{
108
+ // Access nested value
109
+ const parts = name.split('.');
110
+ let value = doc;
111
+ for (const part of parts){
112
+ value = value?.[part];
113
+ }
114
+ // Helper to extract filename
115
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
116
+ const getFilename = (item)=>{
117
+ if (typeof item === 'object' && item && (item.filename || item.name)) {
118
+ return item.filename || item.name;
119
+ }
120
+ return null;
121
+ };
122
+ if (value) {
123
+ if (hasMany && Array.isArray(value)) {
124
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
125
+ value.forEach((item)=>{
126
+ const fname = getFilename(item);
127
+ if (fname) {
128
+ const suggestion = `${name}:${fname}`;
129
+ if (!q || suggestion.toLowerCase().includes(q.toLowerCase())) {
130
+ suggestions.push({
131
+ id: suggestion,
132
+ display: suggestion
133
+ });
134
+ }
135
+ }
136
+ });
137
+ } else {
138
+ const fname = getFilename(value);
139
+ if (fname) {
140
+ const suggestion = `${name}:${fname}`;
141
+ if (!q || suggestion.toLowerCase().includes(q.toLowerCase())) {
142
+ suggestions.push({
143
+ id: suggestion,
144
+ display: suggestion
145
+ });
146
+ }
147
+ }
148
+ }
149
+ }
150
+ });
151
+ }
152
+ } catch (e) {
153
+ console.error('Error fetching document for suggestions', e);
154
+ }
155
+ }
156
+ return mentionsResponse(suggestions);
157
+ }
158
+ return Response.json({
159
+ items: []
160
+ });
161
+ },
162
+ method: 'get',
163
+ path: '/prompt-mentions'
164
+ };
165
+
166
+ //# sourceMappingURL=promptMentions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/endpoints/promptMentions.ts"],"sourcesContent":["import type { Endpoint } from 'payload'\n\ntype Suggestion = { display: string; id: string }\ntype UploadField = { hasMany: boolean; name: string }\n\n \nconst collectFieldSuggestions = (\n fields: any[],\n prefix = '',\n suggestions: Suggestion[] = [],\n): Suggestion[] => {\n for (const field of fields) {\n if (field.name) {\n const fieldPath = prefix ? `${prefix}.${String(field.name)}` : String(field.name)\n suggestions.push({\n id: fieldPath,\n display: fieldPath,\n })\n }\n\n if (field.fields && Array.isArray(field.fields)) {\n const newPrefix = field.name\n ? prefix\n ? `${prefix}.${String(field.name)}`\n : String(field.name)\n : prefix\n collectFieldSuggestions(field.fields, newPrefix, suggestions)\n }\n\n if (field.tabs && Array.isArray(field.tabs)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n field.tabs.forEach((tab: any) => {\n collectFieldSuggestions(tab.fields, prefix, suggestions)\n })\n }\n }\n\n return suggestions\n}\n\n \nconst collectUploadFields = (\n fields: any[],\n prefix = '',\n uploadFields: UploadField[] = [],\n): UploadField[] => {\n for (const field of fields) {\n if (field.type === 'upload' && field.name) {\n const fieldPath = prefix ? `${prefix}.${String(field.name)}` : String(field.name)\n uploadFields.push({ name: fieldPath, hasMany: field.hasMany === true })\n }\n\n if (field.fields && Array.isArray(field.fields)) {\n const newPrefix = field.name\n ? prefix\n ? `${prefix}.${String(field.name)}`\n : String(field.name)\n : prefix\n collectUploadFields(field.fields, newPrefix, uploadFields)\n }\n\n if (field.tabs && Array.isArray(field.tabs)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n field.tabs.forEach((tab: any) => {\n collectUploadFields(tab.fields, prefix, uploadFields)\n })\n }\n }\n\n return uploadFields\n}\n\nconst mentionsResponse = (items: Suggestion[]) =>\n Response.json(\n {\n items: items.map((s) => ({\n ...s,\n value: s.id,\n })),\n },\n {\n headers: {\n 'Cache-Control': 'private, max-age=30, stale-while-revalidate=120',\n },\n },\n )\n\nexport const promptMentionsEndpoint: Endpoint = {\n handler: async (req) => {\n const trigger = String(req.query.trigger ?? '@')\n const q = String(req.query.q ?? '').trim()\n const collectionSlug = String(req.query.collection ?? '')\n const id = String(req.query.id ?? '')\n\n if (!collectionSlug) {\n return Response.json({ items: [] })\n }\n\n // Handle Fields (#)\n if (trigger === '#') {\n const collection = req.payload.config.collections.find((c) => c.slug === collectionSlug)\n if (!collection) {\n return Response.json({ items: [] })\n }\n\n const fieldSuggestions = collectFieldSuggestions(collection.fields)\n const suggestions =\n q.length === 0\n ? fieldSuggestions\n : fieldSuggestions.filter((item) => item.id.toLowerCase().includes(q.toLowerCase()))\n\n return mentionsResponse(suggestions)\n }\n\n // Handle Images (@)\n if (trigger === '@') {\n const collection = req.payload.config.collections.find((c) => c.slug === collectionSlug)\n if (!collection) {\n return Response.json({ items: [] })\n }\n\n const uploadFields = collectUploadFields(collection.fields)\n const suggestions: Suggestion[] = []\n\n // Add base field names\n uploadFields.forEach(({ name }) => {\n if (!q || name.toLowerCase().includes(q.toLowerCase())) {\n suggestions.push({ id: name, display: name })\n }\n })\n\n // If ID is provided, fetch document to get specific filenames\n if (id && id !== 'create') {\n try {\n const doc = await req.payload.findByID({\n id,\n collection: collectionSlug,\n depth: 1, // Need depth to get filename\n req,\n })\n\n if (doc) {\n uploadFields.forEach(({ name, hasMany }) => {\n // Access nested value\n const parts = name.split('.')\n let value = doc\n for (const part of parts) {\n value = (value as any)?.[part]\n }\n\n // Helper to extract filename\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const getFilename = (item: any): null | string => {\n if (typeof item === 'object' && item && (item.filename || item.name)) {\n return item.filename || item.name\n }\n return null\n }\n\n if (value) {\n if (hasMany && Array.isArray(value)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value.forEach((item: any) => {\n const fname = getFilename(item)\n if (fname) {\n const suggestion = `${name}:${fname}`\n if (!q || suggestion.toLowerCase().includes(q.toLowerCase())) {\n suggestions.push({ id: suggestion, display: suggestion })\n }\n }\n })\n } else {\n const fname = getFilename(value)\n if (fname) {\n const suggestion = `${name}:${fname}`\n if (!q || suggestion.toLowerCase().includes(q.toLowerCase())) {\n suggestions.push({ id: suggestion, display: suggestion })\n }\n }\n }\n }\n })\n }\n } catch (e) {\n console.error('Error fetching document for suggestions', e)\n }\n }\n\n return mentionsResponse(suggestions)\n }\n\n return Response.json({ items: [] })\n },\n method: 'get',\n path: '/prompt-mentions',\n}\n"],"names":["collectFieldSuggestions","fields","prefix","suggestions","field","name","fieldPath","String","push","id","display","Array","isArray","newPrefix","tabs","forEach","tab","collectUploadFields","uploadFields","type","hasMany","mentionsResponse","items","Response","json","map","s","value","headers","promptMentionsEndpoint","handler","req","trigger","query","q","trim","collectionSlug","collection","payload","config","collections","find","c","slug","fieldSuggestions","length","filter","item","toLowerCase","includes","doc","findByID","depth","parts","split","part","getFilename","filename","fname","suggestion","e","console","error","method","path"],"mappings":"AAMA,MAAMA,0BAA0B,CAC9BC,QACAC,SAAS,EAAE,EACXC,cAA4B,EAAE;IAE9B,KAAK,MAAMC,SAASH,OAAQ;QAC1B,IAAIG,MAAMC,IAAI,EAAE;YACd,MAAMC,YAAYJ,SAAS,CAAC,EAAEA,OAAO,CAAC,EAAEK,OAAOH,MAAMC,IAAI,EAAE,CAAC,GAAGE,OAAOH,MAAMC,IAAI;YAChFF,YAAYK,IAAI,CAAC;gBACfC,IAAIH;gBACJI,SAASJ;YACX;QACF;QAEA,IAAIF,MAAMH,MAAM,IAAIU,MAAMC,OAAO,CAACR,MAAMH,MAAM,GAAG;YAC/C,MAAMY,YAAYT,MAAMC,IAAI,GACxBH,SACE,CAAC,EAAEA,OAAO,CAAC,EAAEK,OAAOH,MAAMC,IAAI,EAAE,CAAC,GACjCE,OAAOH,MAAMC,IAAI,IACnBH;YACJF,wBAAwBI,MAAMH,MAAM,EAAEY,WAAWV;QACnD;QAEA,IAAIC,MAAMU,IAAI,IAAIH,MAAMC,OAAO,CAACR,MAAMU,IAAI,GAAG;YAC3C,8DAA8D;YAC9DV,MAAMU,IAAI,CAACC,OAAO,CAAC,CAACC;gBAClBhB,wBAAwBgB,IAAIf,MAAM,EAAEC,QAAQC;YAC9C;QACF;IACF;IAEA,OAAOA;AACT;AAGA,MAAMc,sBAAsB,CAC1BhB,QACAC,SAAS,EAAE,EACXgB,eAA8B,EAAE;IAEhC,KAAK,MAAMd,SAASH,OAAQ;QAC1B,IAAIG,MAAMe,IAAI,KAAK,YAAYf,MAAMC,IAAI,EAAE;YACzC,MAAMC,YAAYJ,SAAS,CAAC,EAAEA,OAAO,CAAC,EAAEK,OAAOH,MAAMC,IAAI,EAAE,CAAC,GAAGE,OAAOH,MAAMC,IAAI;YAChFa,aAAaV,IAAI,CAAC;gBAAEH,MAAMC;gBAAWc,SAAShB,MAAMgB,OAAO,KAAK;YAAK;QACvE;QAEA,IAAIhB,MAAMH,MAAM,IAAIU,MAAMC,OAAO,CAACR,MAAMH,MAAM,GAAG;YAC/C,MAAMY,YAAYT,MAAMC,IAAI,GACxBH,SACE,CAAC,EAAEA,OAAO,CAAC,EAAEK,OAAOH,MAAMC,IAAI,EAAE,CAAC,GACjCE,OAAOH,MAAMC,IAAI,IACnBH;YACJe,oBAAoBb,MAAMH,MAAM,EAAEY,WAAWK;QAC/C;QAEA,IAAId,MAAMU,IAAI,IAAIH,MAAMC,OAAO,CAACR,MAAMU,IAAI,GAAG;YAC3C,8DAA8D;YAC9DV,MAAMU,IAAI,CAACC,OAAO,CAAC,CAACC;gBAClBC,oBAAoBD,IAAIf,MAAM,EAAEC,QAAQgB;YAC1C;QACF;IACF;IAEA,OAAOA;AACT;AAEA,MAAMG,mBAAmB,CAACC,QACxBC,SAASC,IAAI,CACX;QACEF,OAAOA,MAAMG,GAAG,CAAC,CAACC,IAAO,CAAA;gBACvB,GAAGA,CAAC;gBACJC,OAAOD,EAAEjB,EAAE;YACb,CAAA;IACF,GACA;QACEmB,SAAS;YACP,iBAAiB;QACnB;IACF;AAGJ,OAAO,MAAMC,yBAAmC;IAC9CC,SAAS,OAAOC;QACd,MAAMC,UAAUzB,OAAOwB,IAAIE,KAAK,CAACD,OAAO,IAAI;QAC5C,MAAME,IAAI3B,OAAOwB,IAAIE,KAAK,CAACC,CAAC,IAAI,IAAIC,IAAI;QACxC,MAAMC,iBAAiB7B,OAAOwB,IAAIE,KAAK,CAACI,UAAU,IAAI;QACtD,MAAM5B,KAAKF,OAAOwB,IAAIE,KAAK,CAACxB,EAAE,IAAI;QAElC,IAAI,CAAC2B,gBAAgB;YACnB,OAAOb,SAASC,IAAI,CAAC;gBAAEF,OAAO,EAAE;YAAC;QACnC;QAEA,oBAAoB;QACpB,IAAIU,YAAY,KAAK;YACnB,MAAMK,aAAaN,IAAIO,OAAO,CAACC,MAAM,CAACC,WAAW,CAACC,IAAI,CAAC,CAACC,IAAMA,EAAEC,IAAI,KAAKP;YACzE,IAAI,CAACC,YAAY;gBACf,OAAOd,SAASC,IAAI,CAAC;oBAAEF,OAAO,EAAE;gBAAC;YACnC;YAEA,MAAMsB,mBAAmB5C,wBAAwBqC,WAAWpC,MAAM;YAClE,MAAME,cACJ+B,EAAEW,MAAM,KAAK,IACTD,mBACAA,iBAAiBE,MAAM,CAAC,CAACC,OAASA,KAAKtC,EAAE,CAACuC,WAAW,GAAGC,QAAQ,CAACf,EAAEc,WAAW;YAEpF,OAAO3B,iBAAiBlB;QAC1B;QAEA,oBAAoB;QACpB,IAAI6B,YAAY,KAAK;YACnB,MAAMK,aAAaN,IAAIO,OAAO,CAACC,MAAM,CAACC,WAAW,CAACC,IAAI,CAAC,CAACC,IAAMA,EAAEC,IAAI,KAAKP;YACzE,IAAI,CAACC,YAAY;gBACf,OAAOd,SAASC,IAAI,CAAC;oBAAEF,OAAO,EAAE;gBAAC;YACnC;YAEA,MAAMJ,eAAeD,oBAAoBoB,WAAWpC,MAAM;YAC1D,MAAME,cAA4B,EAAE;YAEpC,uBAAuB;YACvBe,aAAaH,OAAO,CAAC,CAAC,EAAEV,IAAI,EAAE;gBAC5B,IAAI,CAAC6B,KAAK7B,KAAK2C,WAAW,GAAGC,QAAQ,CAACf,EAAEc,WAAW,KAAK;oBACtD7C,YAAYK,IAAI,CAAC;wBAAEC,IAAIJ;wBAAMK,SAASL;oBAAK;gBAC7C;YACF;YAEA,8DAA8D;YAC9D,IAAII,MAAMA,OAAO,UAAU;gBACzB,IAAI;oBACF,MAAMyC,MAAM,MAAMnB,IAAIO,OAAO,CAACa,QAAQ,CAAC;wBACrC1C;wBACA4B,YAAYD;wBACZgB,OAAO;wBACPrB;oBACF;oBAEA,IAAImB,KAAK;wBACPhC,aAAaH,OAAO,CAAC,CAAC,EAAEV,IAAI,EAAEe,OAAO,EAAE;4BACrC,sBAAsB;4BACtB,MAAMiC,QAAQhD,KAAKiD,KAAK,CAAC;4BACzB,IAAI3B,QAAQuB;4BACZ,KAAK,MAAMK,QAAQF,MAAO;gCACxB1B,QAASA,OAAe,CAAC4B,KAAK;4BAChC;4BAEA,6BAA6B;4BAC7B,8DAA8D;4BAC9D,MAAMC,cAAc,CAACT;gCACnB,IAAI,OAAOA,SAAS,YAAYA,QAASA,CAAAA,KAAKU,QAAQ,IAAIV,KAAK1C,IAAI,AAAD,GAAI;oCACpE,OAAO0C,KAAKU,QAAQ,IAAIV,KAAK1C,IAAI;gCACnC;gCACA,OAAO;4BACT;4BAEA,IAAIsB,OAAO;gCACT,IAAIP,WAAWT,MAAMC,OAAO,CAACe,QAAQ;oCACnC,8DAA8D;oCAC9DA,MAAMZ,OAAO,CAAC,CAACgC;wCACb,MAAMW,QAAQF,YAAYT;wCAC1B,IAAIW,OAAO;4CACT,MAAMC,aAAa,CAAC,EAAEtD,KAAK,CAAC,EAAEqD,MAAM,CAAC;4CACrC,IAAI,CAACxB,KAAKyB,WAAWX,WAAW,GAAGC,QAAQ,CAACf,EAAEc,WAAW,KAAK;gDAC5D7C,YAAYK,IAAI,CAAC;oDAAEC,IAAIkD;oDAAYjD,SAASiD;gDAAW;4CACzD;wCACF;oCACF;gCACF,OAAO;oCACL,MAAMD,QAAQF,YAAY7B;oCAC1B,IAAI+B,OAAO;wCACT,MAAMC,aAAa,CAAC,EAAEtD,KAAK,CAAC,EAAEqD,MAAM,CAAC;wCACrC,IAAI,CAACxB,KAAKyB,WAAWX,WAAW,GAAGC,QAAQ,CAACf,EAAEc,WAAW,KAAK;4CAC5D7C,YAAYK,IAAI,CAAC;gDAAEC,IAAIkD;gDAAYjD,SAASiD;4CAAW;wCACzD;oCACF;gCACF;4BACF;wBACF;oBACF;gBACF,EAAE,OAAOC,GAAG;oBACVC,QAAQC,KAAK,CAAC,2CAA2CF;gBAC3D;YACF;YAEA,OAAOvC,iBAAiBlB;QAC1B;QAEA,OAAOoB,SAASC,IAAI,CAAC;YAAEF,OAAO,EAAE;QAAC;IACnC;IACAyC,QAAQ;IACRC,MAAM;AACR,EAAC"}
@@ -0,0 +1,7 @@
1
+ import type { PayloadRequest } from 'payload';
2
+ import type { PluginConfig } from '../types.js';
3
+ /**
4
+ * Image/video/audio upload generation endpoint handler.
5
+ * Uses payload.ai.generateMedia for media generation.
6
+ */
7
+ export declare const uploadHandler: (pluginConfig: PluginConfig) => (req: PayloadRequest) => Promise<Response>;
@@ -0,0 +1,294 @@
1
+ import * as process from 'node:process';
2
+ import { PLUGIN_AI_JOBS_TABLE, PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK, PLUGIN_INSTRUCTIONS_TABLE } from '../defaults.js';
3
+ import { registerEditorHelper } from '../libraries/handlebars/helpers.js';
4
+ import { replacePlaceholders } from '../libraries/handlebars/replacePlaceholders.js';
5
+ import { resolveEffectiveInstructionSettings } from '../utilities/ai/resolveEffectiveInstructionSettings.js';
6
+ import { extendContextWithPromptFields } from '../utilities/buildPromptUtils.js';
7
+ import { buildSmartPrompt, isGenericPrompt } from '../utilities/buildSmartPrompt.js';
8
+ import { getFieldBySchemaPath } from '../utilities/fields/getFieldBySchemaPath.js';
9
+ import { extractImageData } from '../utilities/images/extractImageData.js';
10
+ import { fetchImages } from '../utilities/images/fetchImages.js';
11
+ import { resolveImageReferences } from '../utilities/images/resolveImageReferences.js';
12
+ import { lexicalToPromptTemplate } from '../utilities/lexical/lexicalToPromptTemplate.js';
13
+ import { sanitizeLog } from '../utilities/sanitizeLog.js';
14
+ /**
15
+ * Image/video/audio upload generation endpoint handler.
16
+ * Uses payload.ai.generateMedia for media generation.
17
+ */ export const uploadHandler = (pluginConfig)=>async (req)=>{
18
+ try {
19
+ // Check authentication and authorization first
20
+ // await checkAccess(req, pluginConfig)
21
+ const data = await req.json?.();
22
+ const { collectionSlug, documentId, options } = data;
23
+ const { instructionId } = options;
24
+ let docData = {};
25
+ if (documentId) {
26
+ try {
27
+ docData = await req.payload.findByID({
28
+ id: documentId,
29
+ collection: collectionSlug,
30
+ draft: true,
31
+ req
32
+ });
33
+ } catch (e) {
34
+ req.payload.logger.error(e, '— AI Plugin: Error fetching document, you should try again after enabling drafts for this collection');
35
+ }
36
+ }
37
+ const contextData = {
38
+ ...docData,
39
+ ...data.doc
40
+ };
41
+ let instructions = {
42
+ images: [],
43
+ 'model-id': '',
44
+ prompt: ''
45
+ };
46
+ if (instructionId) {
47
+ // Verify user has access to the specific instruction
48
+ instructions = await req.payload.findByID({
49
+ id: instructionId,
50
+ collection: PLUGIN_INSTRUCTIONS_TABLE,
51
+ req
52
+ });
53
+ }
54
+ let { prompt: promptTemplate = '' } = instructions;
55
+ // Convert Lexical JSON to string template if needed
56
+ if (promptTemplate && typeof promptTemplate === 'object') {
57
+ promptTemplate = lexicalToPromptTemplate(promptTemplate);
58
+ }
59
+ const { images: sampleImages = [] } = instructions;
60
+ const schemaPath = String(instructions['schema-path']);
61
+ registerEditorHelper(req.payload, schemaPath);
62
+ // Smart fallback: if prompt is generic, build a contextual prompt from field metadata
63
+ if (isGenericPrompt(promptTemplate)) {
64
+ promptTemplate = buildSmartPrompt({
65
+ documentData: contextData,
66
+ payload: req.payload,
67
+ schemaPath
68
+ });
69
+ if (pluginConfig.debugging) {
70
+ req.payload.logger.info({
71
+ smartPrompt: promptTemplate
72
+ }, `— AI Plugin: Using smart fallback prompt for ${schemaPath}`);
73
+ }
74
+ }
75
+ const extendedContext = extendContextWithPromptFields(contextData, {
76
+ type: String(instructions['field-type']),
77
+ collection: collectionSlug
78
+ }, pluginConfig);
79
+ if (pluginConfig.debugging) {
80
+ req.payload.logger.info(sanitizeLog({
81
+ contextDataKeys: Object.keys(contextData),
82
+ contextDataSample: Object.fromEntries(Object.entries(contextData).map(([k, v])=>[
83
+ k,
84
+ typeof v === 'object' ? `[object]` : v
85
+ ])),
86
+ promptTemplate
87
+ }), `— AI Plugin: DEBUG upload context before replacePlaceholders`);
88
+ }
89
+ const text = await replacePlaceholders(promptTemplate, extendedContext);
90
+ const uploadCollectionSlug = instructions['relation-to'];
91
+ // Resolve @field:filename references from the prompt
92
+ const { images: resolvedImages, processedPrompt } = await resolveImageReferences(text, contextData, req, collectionSlug);
93
+ // Extract hardcoded URLs from the processed prompt and merge with resolved images and sample images
94
+ const images = [
95
+ ...extractImageData(processedPrompt),
96
+ ...resolvedImages,
97
+ ...sampleImages
98
+ ];
99
+ // Process images - convert to ImagePart format using helper
100
+ const editImages = await fetchImages(req, images);
101
+ let promptToUse = processedPrompt;
102
+ let targetField;
103
+ try {
104
+ const targetCollection = req.payload.config.collections.find((c)=>c.slug === collectionSlug);
105
+ if (targetCollection && schemaPath) {
106
+ targetField = getFieldBySchemaPath(targetCollection, schemaPath);
107
+ }
108
+ } catch (e) {
109
+ req.payload.logger.error(e, '— AI Plugin: Error finding field for hooks');
110
+ }
111
+ if (targetField && targetField.custom?.ai?.beforeGenerate) {
112
+ const beforeHooks = targetField.custom.ai.beforeGenerate;
113
+ for (const hook of beforeHooks){
114
+ const result = await hook({
115
+ doc: contextData,
116
+ field: targetField,
117
+ headers: req.headers,
118
+ instructions,
119
+ payload: req.payload,
120
+ prompt: promptToUse,
121
+ req
122
+ });
123
+ if (result) {
124
+ if (result.prompt) {
125
+ promptToUse = result.prompt;
126
+ }
127
+ if (result.instructions) {
128
+ instructions = {
129
+ ...instructions,
130
+ ...result.instructions
131
+ };
132
+ }
133
+ }
134
+ }
135
+ }
136
+ if (pluginConfig.debugging) {
137
+ req.payload.logger.info(sanitizeLog({
138
+ text: promptToUse
139
+ }), `— AI Plugin: Executing media generation`);
140
+ }
141
+ // Prepare callback URL for async jobs
142
+ const serverURL = req.payload.config?.serverURL || process.env.SERVER_URL || process.env.NEXT_PUBLIC_SERVER_URL;
143
+ const callbackUrl = serverURL ? `${serverURL.replace(/\/$/, '')}/api${PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK}?instructionId=${instructionId}` : undefined;
144
+ const modelId = instructions['model-id'];
145
+ const aiSettings = await req.payload.findGlobal({
146
+ slug: 'ai-providers',
147
+ context: {
148
+ unsafe: true
149
+ }
150
+ });
151
+ const { effectiveSettings: modelSettings, settingsName } = resolveEffectiveInstructionSettings({
152
+ defaults: aiSettings?.defaults,
153
+ instructions
154
+ });
155
+ if (!settingsName) {
156
+ throw new Error(`Unsupported model-id: ${modelId}`);
157
+ }
158
+ const generateParams = {
159
+ callbackUrl,
160
+ images: editImages,
161
+ instructionId,
162
+ model: modelSettings.model,
163
+ prompt: promptToUse,
164
+ provider: modelSettings.provider,
165
+ providerOptions: modelSettings,
166
+ ...modelSettings
167
+ };
168
+ if (pluginConfig.debugging) {
169
+ req.payload.logger.info(sanitizeLog(generateParams), '— AI Plugin: Final generation parameters for media');
170
+ }
171
+ // Use payload.ai.generateMedia directly! 🎉
172
+ const result = await req.payload.ai.generateMedia(generateParams);
173
+ if (targetField && targetField.custom?.ai?.afterGenerate) {
174
+ const afterHooks = targetField.custom.ai.afterGenerate;
175
+ for (const hook of afterHooks){
176
+ await hook({
177
+ doc: contextData,
178
+ field: targetField,
179
+ headers: req.headers,
180
+ instructions,
181
+ payload: req.payload,
182
+ req,
183
+ result
184
+ });
185
+ }
186
+ }
187
+ // If model returned files immediately, proceed with upload
188
+ if (result && 'files' in result && Array.isArray(result.files) && result.files.length > 0) {
189
+ const uploadedDocs = [];
190
+ for (const file of result.files){
191
+ let assetData;
192
+ // Create a synthetic result for the single file to pass to mediaUpload
193
+ const singleFileResult = {
194
+ files: [
195
+ file
196
+ ]
197
+ };
198
+ if (typeof pluginConfig.mediaUpload === 'function') {
199
+ const uploadResult = await pluginConfig.mediaUpload(singleFileResult, {
200
+ collection: uploadCollectionSlug,
201
+ request: req
202
+ });
203
+ assetData = {
204
+ id: uploadResult.id,
205
+ alt: uploadResult.alt
206
+ };
207
+ } else {
208
+ const created = await req.payload.create({
209
+ collection: uploadCollectionSlug,
210
+ data: {
211
+ alt: text
212
+ },
213
+ file,
214
+ req
215
+ });
216
+ assetData = {
217
+ id: created.id,
218
+ alt: created.alt
219
+ };
220
+ }
221
+ if (assetData.id) {
222
+ uploadedDocs.push(assetData);
223
+ }
224
+ }
225
+ if (uploadedDocs.length === 0) {
226
+ req.payload.logger.error('Error uploading generated media, is your media upload function correct?');
227
+ throw new Error('Error uploading generated media!');
228
+ }
229
+ // Check if target field supports multiple values
230
+ let hasMany = false;
231
+ if (targetField) {
232
+ if (targetField.type === 'relationship' || targetField.type === 'upload' || targetField.type === 'select') {
233
+ hasMany = targetField.hasMany === true;
234
+ }
235
+ }
236
+ if (hasMany) {
237
+ return new Response(JSON.stringify({
238
+ result: uploadedDocs.map((d)=>({
239
+ id: d.id,
240
+ alt: d.alt
241
+ }))
242
+ }));
243
+ }
244
+ return new Response(JSON.stringify({
245
+ result: {
246
+ id: uploadedDocs[0].id,
247
+ alt: uploadedDocs[0].alt
248
+ }
249
+ }));
250
+ }
251
+ // Otherwise, assume async job launch
252
+ if (result && ('jobId' in result || 'taskId' in result)) {
253
+ const externalTaskId = result.jobId || result.taskId;
254
+ const status = result.status || 'queued';
255
+ const progress = result.progress ?? 0;
256
+ // Create AI Job doc and return only its id
257
+ const createdJob = await req.payload.create({
258
+ collection: PLUGIN_AI_JOBS_TABLE,
259
+ data: {
260
+ instructionId,
261
+ progress,
262
+ status,
263
+ task_id: externalTaskId
264
+ },
265
+ overrideAccess: true,
266
+ req
267
+ });
268
+ return new Response(JSON.stringify({
269
+ job: {
270
+ id: createdJob.id
271
+ }
272
+ }), {
273
+ headers: {
274
+ 'Content-Type': 'application/json'
275
+ }
276
+ });
277
+ }
278
+ throw new Error('Unexpected model response.');
279
+ } catch (error) {
280
+ req.payload.logger.error(// @ts-expect-error
281
+ error?.type || error.message, '— AI Plugin: Error generating media upload:');
282
+ const message = error && typeof error === 'object' && 'message' in error ? error.message : String(error);
283
+ return new Response(JSON.stringify({
284
+ error: message
285
+ }), {
286
+ headers: {
287
+ 'Content-Type': 'application/json'
288
+ },
289
+ status: message.includes('Authentication required') || message.includes('Insufficient permissions') ? 401 : 500
290
+ });
291
+ }
292
+ };
293
+
294
+ //# sourceMappingURL=upload.js.map