@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,617 +1,22 @@
1
- import * as process from 'node:process';
2
- import { checkAccess } from '../access/checkAccess.js';
3
- import { filterEditorSchemaByNodes } from '../ai/utils/filterEditorSchemaByNodes.js';
4
- import { PLUGIN_AI_JOBS_TABLE, PLUGIN_API_ENDPOINT_GENERATE, PLUGIN_API_ENDPOINT_GENERATE_UPLOAD, PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK, PLUGIN_INSTRUCTIONS_TABLE, PLUGIN_NAME } from '../defaults.js';
5
- import { registerEditorHelper } from '../libraries/handlebars/helpers.js';
6
- import { replacePlaceholders } from '../libraries/handlebars/replacePlaceholders.js';
7
- import { buildSmartPrompt, isGenericPrompt } from '../utilities/buildSmartPrompt.js';
8
- import { extractImageData } from '../utilities/extractImageData.js';
9
- import { fetchImages } from '../utilities/fetchImages.js';
10
- import { fieldToJsonSchema } from '../utilities/fieldToJsonSchema.js';
11
- import { getFieldBySchemaPath } from '../utilities/getFieldBySchemaPath.js';
12
- import { resolveImageReferences } from '../utilities/resolveImageReferences.js';
13
- import { assignPrompt, extendContextWithPromptFields } from './buildPromptUtils.js';
1
+ import { PLUGIN_API_ENDPOINT_GENERATE, PLUGIN_API_ENDPOINT_GENERATE_UPLOAD, PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK } from '../defaults.js';
2
+ import { promptMentionsEndpoint } from './promptMentions.js';
3
+ import { generateHandler } from './generate.js';
4
+ import { uploadHandler } from './upload.js';
5
+ import { videogenWebhookHandler } from './videogenWebhook.js';
14
6
  export const endpoints = (pluginConfig)=>({
7
+ promptMentions: promptMentionsEndpoint,
15
8
  textarea: {
16
- // Text/rich-text generation endpoint using payload.ai.streamObject
17
- handler: async (req)=>{
18
- try {
19
- // Check authentication and authorization first
20
- await checkAccess(req, pluginConfig);
21
- const data = await req.json?.();
22
- const { allowedEditorNodes = [], locale = 'en', options } = data;
23
- const { action, actionParams, instructionId } = options;
24
- const contextData = data.doc;
25
- if (!instructionId) {
26
- throw new Error(`Instruction ID is required for "${PLUGIN_NAME}" to work, please check your configuration, or try again`);
27
- }
28
- // Verify user has access to the specific instruction
29
- const instructions = await req.payload.findByID({
30
- id: instructionId,
31
- collection: PLUGIN_INSTRUCTIONS_TABLE,
32
- req
33
- });
34
- const { collections } = req.payload.config;
35
- const collection = collections.find((collection)=>collection.slug === PLUGIN_INSTRUCTIONS_TABLE);
36
- if (!collection) {
37
- throw new Error('Collection not found');
38
- }
39
- const { custom: { [PLUGIN_NAME]: { editorConfig = {} } = {} } = {} } = collection.admin;
40
- const { schema: editorSchema = {} } = editorConfig;
41
- let { prompt: promptTemplate = '' } = instructions;
42
- // Smart fallback: if prompt is generic, build a contextual prompt from field metadata
43
- if (isGenericPrompt(promptTemplate)) {
44
- const schemaPath = String(instructions['schema-path']);
45
- promptTemplate = buildSmartPrompt({
46
- documentData: contextData,
47
- payload: req.payload,
48
- schemaPath
49
- });
50
- if (pluginConfig.debugging) {
51
- req.payload.logger.info({
52
- smartPrompt: promptTemplate
53
- }, `— AI Plugin: Using smart fallback prompt for ${schemaPath}`);
54
- }
55
- }
56
- let allowedEditorSchema = editorSchema;
57
- if (allowedEditorNodes.length) {
58
- allowedEditorSchema = filterEditorSchemaByNodes(editorSchema, allowedEditorNodes);
59
- // Debug: Log what nodes were received and what definitions remain
60
- if (pluginConfig.debugging) {
61
- req.payload.logger.info({
62
- receivedNodes: allowedEditorNodes,
63
- remainingDefinitions: Object.keys(allowedEditorSchema.definitions || {})
64
- }, '— AI Plugin: Schema filtering debug');
65
- }
66
- }
67
- const schemaPath = String(instructions['schema-path']);
68
- const parts = (schemaPath || '').split('.') || [];
69
- const collectionName = parts[0];
70
- const fieldName = parts.length > 1 ? parts[parts.length - 1] : '';
71
- registerEditorHelper(req.payload, schemaPath);
72
- const { defaultLocale, locales = [] } = req.payload.config.localization || {};
73
- const localeData = locales.find((l)=>{
74
- return l.code === locale;
75
- });
76
- let localeInfo = locale;
77
- if (localeData && defaultLocale && localeData.label && typeof localeData.label === 'object' && defaultLocale in localeData.label) {
78
- localeInfo = localeData.label[defaultLocale];
79
- }
80
- const prompts = await assignPrompt(action, {
81
- type: String(instructions['field-type']),
82
- actionParams,
83
- collection: collectionName,
84
- context: contextData,
85
- field: fieldName || '',
86
- layout: instructions.layout,
87
- locale: localeInfo,
88
- pluginConfig,
89
- systemPrompt: instructions.system,
90
- template: String(promptTemplate)
91
- });
92
- if (pluginConfig.debugging) {
93
- req.payload.logger.info({
94
- prompts
95
- }, `— AI Plugin: Executing text prompt on ${schemaPath}`);
96
- }
97
- // Build per-field JSON schema for structured generation when applicable
98
- let jsonSchema = allowedEditorSchema;
99
- let targetField;
100
- try {
101
- const targetCollection = req.payload.config.collections.find((c)=>c.slug === collectionName);
102
- if (targetCollection && fieldName) {
103
- targetField = getFieldBySchemaPath(targetCollection, schemaPath);
104
- const supported = [
105
- 'array',
106
- 'text',
107
- 'textarea',
108
- 'select',
109
- 'number',
110
- 'date',
111
- 'code',
112
- 'email',
113
- 'json'
114
- ];
115
- const t = String(targetField?.type || '');
116
- if (targetField && supported.includes(t)) {
117
- // For array fields, use count from array-settings if available
118
- if (t === 'array') {
119
- const arraySettings = instructions['array-settings'] || {};
120
- const count = arraySettings.count || 3;
121
- // Override the field's maxRows with the requested count
122
- const modifiedField = {
123
- ...targetField,
124
- maxRows: count,
125
- minRows: count
126
- };
127
- jsonSchema = fieldToJsonSchema(modifiedField, {
128
- nameOverride: fieldName
129
- });
130
- } else {
131
- jsonSchema = fieldToJsonSchema(targetField, {
132
- nameOverride: fieldName
133
- });
134
- }
135
- }
136
- }
137
- } catch (e) {
138
- req.payload.logger.error(e, '— AI Plugin: Error building field JSON schema');
139
- }
140
- // Get model settings from instruction
141
- const settingsName = instructions['model-id'] === 'richtext' ? 'richtext-settings' : instructions['model-id'] === 'text' ? 'text-settings' : instructions['model-id'] === 'array' ? 'array-settings' : undefined;
142
- if (!settingsName) {
143
- throw new Error(`Unsupported model-id: ${instructions['model-id']}`);
144
- }
145
- const modelSettings = instructions[settingsName] || {};
146
- // Resolve @field:filename references from the prompt
147
- const { images: resolvedImages, processedPrompt } = await resolveImageReferences(prompts.prompt, contextData, req, collectionName);
148
- // Extract hardcoded URLs from the processed prompt
149
- const hardcodedImages = extractImageData(processedPrompt);
150
- // Combine images
151
- const allImages = [
152
- ...hardcodedImages,
153
- ...resolvedImages
154
- ];
155
- let images;
156
- if (allImages.length > 0) {
157
- const imageParts = await fetchImages(req, allImages);
158
- if (imageParts.length > 0) {
159
- images = imageParts;
160
- }
161
- }
162
- let promptToUse = processedPrompt;
163
- let systemToUse = prompts.system;
164
- // let messagesToUse: any = undefined
165
- // Execute beforeGenerate hooks
166
- if (targetField && targetField.custom?.ai?.beforeGenerate) {
167
- const beforeHooks = targetField.custom.ai.beforeGenerate;
168
- for (const hook of beforeHooks){
169
- const result = await hook({
170
- doc: contextData,
171
- field: targetField,
172
- headers: req.headers,
173
- instructions,
174
- payload: req.payload,
175
- prompt: promptToUse,
176
- req,
177
- system: systemToUse
178
- });
179
- if (result) {
180
- if (result.prompt) promptToUse = result.prompt;
181
- if (result.system) systemToUse = result.system;
182
- }
183
- }
184
- }
185
- const streamResult = await req.payload.ai.streamObject({
186
- // extractAttachments: modelSettings.extractAttachments as boolean | undefined,
187
- images,
188
- maxTokens: modelSettings.maxTokens,
189
- // messages: messagesToUse,
190
- model: modelSettings.model,
191
- onFinish: async ({ object })=>{
192
- if (targetField && targetField.custom?.ai?.afterGenerate) {
193
- const afterHooks = targetField.custom.ai.afterGenerate;
194
- for (const hook of afterHooks){
195
- await hook({
196
- doc: contextData,
197
- field: targetField,
198
- headers: req.headers,
199
- instructions,
200
- payload: req.payload,
201
- req,
202
- result: object
203
- });
204
- }
205
- }
206
- },
207
- prompt: processedPrompt,
208
- provider: modelSettings.provider,
209
- providerOptions: {
210
- openai: {
211
- strictJsonSchema: true
212
- }
213
- },
214
- schema: jsonSchema,
215
- system: systemToUse,
216
- temperature: modelSettings.temperature
217
- });
218
- return streamResult;
219
- } catch (error) {
220
- req.payload.logger.error(error, 'Error generating content: ');
221
- const message = error && typeof error === 'object' && 'message' in error ? error.message : String(error);
222
- return new Response(JSON.stringify({
223
- error: message
224
- }), {
225
- headers: {
226
- 'Content-Type': 'application/json'
227
- },
228
- status: message.includes('Authentication required') || message.includes('Insufficient permissions') ? 401 : 500
229
- });
230
- }
231
- },
9
+ handler: generateHandler(pluginConfig),
232
10
  method: 'post',
233
11
  path: PLUGIN_API_ENDPOINT_GENERATE
234
12
  },
235
13
  upload: {
236
- // Image/video generation endpoint using payload.ai.generateMedia
237
- handler: async (req)=>{
238
- try {
239
- // Check authentication and authorization first
240
- await checkAccess(req, pluginConfig);
241
- const data = await req.json?.();
242
- const { collectionSlug, documentId, options } = data;
243
- const { instructionId } = options;
244
- let docData = {};
245
- if (documentId) {
246
- try {
247
- docData = await req.payload.findByID({
248
- id: documentId,
249
- collection: collectionSlug,
250
- draft: true,
251
- req
252
- });
253
- } catch (e) {
254
- req.payload.logger.error(e, '— AI Plugin: Error fetching document, you should try again after enabling drafts for this collection');
255
- }
256
- }
257
- const contextData = {
258
- ...data.doc,
259
- ...docData
260
- };
261
- let instructions = {
262
- images: [],
263
- 'model-id': '',
264
- prompt: ''
265
- };
266
- if (instructionId) {
267
- // Verify user has access to the specific instruction
268
- instructions = await req.payload.findByID({
269
- id: instructionId,
270
- collection: PLUGIN_INSTRUCTIONS_TABLE,
271
- req
272
- });
273
- }
274
- let { prompt: promptTemplate = '' } = instructions;
275
- const { images: sampleImages = [] } = instructions;
276
- const schemaPath = String(instructions['schema-path']);
277
- registerEditorHelper(req.payload, schemaPath);
278
- // Smart fallback: if prompt is generic, build a contextual prompt from field metadata
279
- if (isGenericPrompt(promptTemplate)) {
280
- promptTemplate = buildSmartPrompt({
281
- documentData: contextData,
282
- payload: req.payload,
283
- schemaPath
284
- });
285
- if (pluginConfig.debugging) {
286
- req.payload.logger.info({
287
- smartPrompt: promptTemplate
288
- }, `— AI Plugin: Using smart fallback prompt for ${schemaPath}`);
289
- }
290
- }
291
- const extendedContext = extendContextWithPromptFields(contextData, {
292
- type: String(instructions['field-type']),
293
- collection: collectionSlug
294
- }, pluginConfig);
295
- const text = await replacePlaceholders(promptTemplate, extendedContext);
296
- const uploadCollectionSlug = instructions['relation-to'];
297
- // Resolve @field:filename references from the prompt
298
- const { images: resolvedImages, processedPrompt } = await resolveImageReferences(text, contextData, req, collectionSlug);
299
- // Extract hardcoded URLs from the processed prompt and merge with resolved images and sample images
300
- const images = [
301
- ...extractImageData(processedPrompt),
302
- ...resolvedImages,
303
- ...sampleImages
304
- ];
305
- // Process images - convert to ImagePart format using helper
306
- const editImages = await fetchImages(req, images);
307
- let promptToUse = text;
308
- let targetField;
309
- try {
310
- const targetCollection = req.payload.config.collections.find((c)=>c.slug === collectionSlug);
311
- if (targetCollection && schemaPath) {
312
- targetField = getFieldBySchemaPath(targetCollection, schemaPath);
313
- }
314
- } catch (e) {
315
- req.payload.logger.error(e, '— AI Plugin: Error finding field for hooks');
316
- }
317
- if (targetField && targetField.custom?.ai?.beforeGenerate) {
318
- const beforeHooks = targetField.custom.ai.beforeGenerate;
319
- for (const hook of beforeHooks){
320
- const result = await hook({
321
- doc: contextData,
322
- field: targetField,
323
- headers: req.headers,
324
- instructions,
325
- payload: req.payload,
326
- prompt: promptToUse,
327
- req
328
- });
329
- if (result) {
330
- if (result.prompt) {
331
- promptToUse = result.prompt;
332
- }
333
- if (result.instructions) {
334
- instructions = {
335
- ...instructions,
336
- ...result.instructions
337
- };
338
- }
339
- }
340
- }
341
- }
342
- if (pluginConfig.debugging) {
343
- req.payload.logger.info({
344
- text: promptToUse
345
- }, `— AI Plugin: Executing media generation`);
346
- }
347
- // Prepare callback URL for async jobs
348
- const serverURL = req.payload.config?.serverURL || process.env.SERVER_URL || process.env.NEXT_PUBLIC_SERVER_URL;
349
- const callbackUrl = serverURL ? `${serverURL.replace(/\/$/, '')}/api${PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK}?instructionId=${instructionId}` : undefined;
350
- // Get model settings
351
- // Re-evaluate settings name and settings in case instructions changed
352
- const modelId = instructions['model-id'];
353
- const settingsName = modelId === 'image' ? 'image-settings' : modelId === 'video' ? 'video-settings' : modelId === 'tts' ? 'tts-settings' : undefined;
354
- if (!settingsName) {
355
- throw new Error(`Unsupported model-id: ${modelId}`);
356
- }
357
- // Get model settings from instruction
358
- const instructionSettings = instructions[settingsName] || {};
359
- // Fallback to AISettings global defaults if instruction-level settings are missing
360
- let globalDefaults = {};
361
- if (!instructionSettings.provider || !instructionSettings.model) {
362
- try {
363
- const aiSettings = await req.payload.findGlobal({
364
- slug: 'ai-settings',
365
- context: {
366
- unsafe: true
367
- }
368
- });
369
- // Map modelId to the corresponding default settings key
370
- const defaultsKey = modelId === 'image' ? 'image' : modelId === 'video' ? 'video' : modelId === 'tts' ? 'tts' : undefined;
371
- if (defaultsKey && aiSettings?.defaults?.[defaultsKey]) {
372
- globalDefaults = aiSettings.defaults[defaultsKey];
373
- if (pluginConfig.debugging) {
374
- req.payload.logger.info({
375
- globalDefaults
376
- }, `— AI Plugin: Using AISettings defaults for ${modelId}`);
377
- }
378
- }
379
- } catch (e) {
380
- req.payload.logger.error(e, '— AI Plugin: Error fetching AISettings defaults');
381
- }
382
- }
383
- // Merge: instruction settings take priority over global defaults
384
- // Filter out null/undefined values so they don't overwrite valid defaults
385
- const filteredInstructionSettings = Object.fromEntries(Object.entries(instructionSettings).filter(([_, v])=>v != null));
386
- const modelSettings = {
387
- ...globalDefaults,
388
- ...filteredInstructionSettings
389
- };
390
- // Use payload.ai.generateMedia directly! 🎉
391
- const result = await req.payload.ai.generateMedia({
392
- callbackUrl,
393
- images: editImages,
394
- instructionId,
395
- model: modelSettings.model,
396
- prompt: promptToUse,
397
- provider: modelSettings.provider,
398
- ...modelSettings
399
- });
400
- if (targetField && targetField.custom?.ai?.afterGenerate) {
401
- const afterHooks = targetField.custom.ai.afterGenerate;
402
- for (const hook of afterHooks){
403
- await hook({
404
- doc: contextData,
405
- field: targetField,
406
- headers: req.headers,
407
- instructions,
408
- payload: req.payload,
409
- req,
410
- result
411
- });
412
- }
413
- }
414
- // If model returned a file immediately, proceed with upload
415
- if (result && 'file' in result) {
416
- let assetData;
417
- if (typeof pluginConfig.mediaUpload === 'function') {
418
- assetData = await pluginConfig.mediaUpload(result, {
419
- collection: uploadCollectionSlug,
420
- request: req
421
- });
422
- } else {
423
- assetData = await req.payload.create({
424
- collection: uploadCollectionSlug,
425
- data: {
426
- alt: text
427
- },
428
- file: result.file,
429
- req
430
- });
431
- }
432
- if (!assetData.id) {
433
- req.payload.logger.error('Error uploading generated media, is your media upload function correct?');
434
- throw new Error('Error uploading generated media!');
435
- }
436
- return new Response(JSON.stringify({
437
- result: {
438
- id: assetData.id,
439
- alt: assetData.alt
440
- }
441
- }));
442
- }
443
- // Otherwise, assume async job launch
444
- if (result && ('jobId' in result || 'taskId' in result)) {
445
- const externalTaskId = result.jobId || result.taskId;
446
- const status = result.status || 'queued';
447
- const progress = result.progress ?? 0;
448
- // Create AI Job doc and return only its id
449
- const createdJob = await req.payload.create({
450
- collection: PLUGIN_AI_JOBS_TABLE,
451
- data: {
452
- instructionId,
453
- progress,
454
- status,
455
- task_id: externalTaskId
456
- },
457
- overrideAccess: true,
458
- req
459
- });
460
- return new Response(JSON.stringify({
461
- job: {
462
- id: createdJob.id
463
- }
464
- }), {
465
- headers: {
466
- 'Content-Type': 'application/json'
467
- }
468
- });
469
- }
470
- throw new Error('Unexpected model response.');
471
- } catch (error) {
472
- req.payload.logger.error(// @ts-expect-error
473
- error?.type || error.message, 'Error generating upload: ');
474
- const message = error && typeof error === 'object' && 'message' in error ? error.message : String(error);
475
- return new Response(JSON.stringify({
476
- error: message
477
- }), {
478
- headers: {
479
- 'Content-Type': 'application/json'
480
- },
481
- status: message.includes('Authentication required') || message.includes('Insufficient permissions') ? 401 : 500
482
- });
483
- }
484
- },
14
+ handler: uploadHandler(pluginConfig),
485
15
  method: 'post',
486
16
  path: PLUGIN_API_ENDPOINT_GENERATE_UPLOAD
487
17
  },
488
18
  videogenWebhook: {
489
- handler: async (req)=>{
490
- console.log('videogenWebhook --> ', req);
491
- try {
492
- const urlAll = new URL(req.url || '');
493
- const qpSecret = urlAll.searchParams.get('secret') || '';
494
- const headerSecret = req.headers.get('x-webhook-secret') || '';
495
- const falSecret = process.env.FAL_WEBHOOK_SECRET;
496
- const legacySecret = process.env.VIDEOGEN_WEBHOOK_SECRET;
497
- const provided = qpSecret || headerSecret;
498
- // TODO: fal is failing because of auth but webhook seem to work
499
- if (!provided || (falSecret ? provided !== falSecret : provided !== legacySecret)) {
500
- return new Response('Unauthorized', {
501
- status: 401
502
- });
503
- }
504
- const instructionId = urlAll.searchParams.get('instructionId');
505
- if (!instructionId) {
506
- throw new Error('instructionId missing');
507
- }
508
- const body = await req.json?.();
509
- // Normalize fal webhook payload
510
- const status = body && (body.status || body.data?.status || body.response?.status) || undefined;
511
- const progress = (body && (body.progress ?? body.data?.progress ?? body.response?.progress)) ?? undefined;
512
- const requestId = body && (body.taskId || body.request_id || body.gateway_request_id || body.request?.request_id) || undefined;
513
- const error = body?.error || body?.data?.error || body?.response?.error;
514
- // Update AI Job row by task_id (and instructionId)
515
- const jobSearch = await req.payload.find({
516
- collection: PLUGIN_AI_JOBS_TABLE,
517
- depth: 0,
518
- limit: 1,
519
- where: {
520
- and: [
521
- {
522
- task_id: {
523
- equals: requestId
524
- }
525
- },
526
- {
527
- instructionId: {
528
- equals: instructionId
529
- }
530
- }
531
- ]
532
- }
533
- });
534
- const jobDoc = jobSearch.docs?.[0];
535
- if (jobDoc) {
536
- await req.payload.update({
537
- id: jobDoc.id,
538
- collection: PLUGIN_AI_JOBS_TABLE,
539
- data: {
540
- progress,
541
- status,
542
- task_id: requestId
543
- },
544
- overrideAccess: true,
545
- req
546
- });
547
- }
548
- console.log('fal webhook body: ', body);
549
- const videoUrl = body?.outputs?.[0]?.url || body?.data?.outputs?.[0]?.url || body?.video?.url || body?.data?.video?.url || body?.response?.video?.url || body?.videos?.[0]?.url || body?.data?.videos?.[0]?.url;
550
- if (status === 'completed' && videoUrl) {
551
- // Fetch the related instruction to get upload collection
552
- const instructions = await req.payload.findByID({
553
- id: instructionId,
554
- collection: PLUGIN_INSTRUCTIONS_TABLE,
555
- req
556
- });
557
- const uploadCollectionSlug = instructions['relation-to'];
558
- const videoResp = await fetch(videoUrl);
559
- if (!videoResp.ok) {
560
- throw new Error(`Failed to fetch output: ${videoResp.status}`);
561
- }
562
- const buffer = Buffer.from(await videoResp.arrayBuffer());
563
- const created = await req.payload.create({
564
- collection: uploadCollectionSlug,
565
- data: {
566
- alt: 'video generation'
567
- },
568
- file: {
569
- name: 'video_generation.mp4',
570
- data: buffer,
571
- mimetype: 'video/mp4',
572
- size: buffer.byteLength
573
- },
574
- overrideAccess: true,
575
- req
576
- });
577
- // Persist the result on the AI Job record
578
- if (jobDoc) {
579
- await req.payload.update({
580
- id: jobDoc.id,
581
- collection: PLUGIN_AI_JOBS_TABLE,
582
- data: {
583
- progress: 100,
584
- result_id: created?.id,
585
- status: 'completed'
586
- },
587
- overrideAccess: true,
588
- req
589
- });
590
- }
591
- }
592
- if (status === 'failed' && error) {
593
- req.payload.logger.error(error, 'Video generation failed: ');
594
- }
595
- return new Response(JSON.stringify({
596
- ok: true
597
- }), {
598
- headers: {
599
- 'Content-Type': 'application/json'
600
- }
601
- });
602
- } catch (error) {
603
- req.payload.logger.error(error, 'Error in videogen webhook: ');
604
- const message = error && typeof error === 'object' && 'message' in error ? error.message : String(error);
605
- return new Response(JSON.stringify({
606
- error: message
607
- }), {
608
- headers: {
609
- 'Content-Type': 'application/json'
610
- },
611
- status: 500
612
- });
613
- }
614
- },
19
+ handler: videogenWebhookHandler,
615
20
  method: 'post',
616
21
  path: PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK
617
22
  }