@ai-stack/payloadcms 3.2.26 → 3.68.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 (313) hide show
  1. package/{LICENSE.md → LICENSE} +1 -1
  2. package/README.md +218 -229
  3. package/dist/access/checkAccess.d.ts +4 -0
  4. package/dist/access/checkAccess.js +20 -0
  5. package/dist/access/checkAccess.js.map +1 -0
  6. package/dist/ai/core/generateObject.d.ts +7 -0
  7. package/dist/ai/core/generateObject.js +35 -0
  8. package/dist/ai/core/generateObject.js.map +1 -0
  9. package/dist/ai/core/generateText.d.ts +7 -0
  10. package/dist/ai/core/generateText.js +31 -0
  11. package/dist/ai/core/generateText.js.map +1 -0
  12. package/dist/ai/core/index.d.ts +11 -0
  13. package/dist/ai/core/index.js +10 -0
  14. package/dist/ai/core/index.js.map +1 -0
  15. package/dist/ai/core/media/generateMedia.d.ts +7 -0
  16. package/dist/ai/core/media/generateMedia.js +50 -0
  17. package/dist/ai/core/media/generateMedia.js.map +1 -0
  18. package/dist/ai/core/media/image/generateImage.d.ts +6 -0
  19. package/dist/ai/core/media/image/generateImage.js +41 -0
  20. package/dist/ai/core/media/image/generateImage.js.map +1 -0
  21. package/dist/ai/core/media/image/handlers/multimodal.d.ts +7 -0
  22. package/dist/ai/core/media/image/handlers/multimodal.js +100 -0
  23. package/dist/ai/core/media/image/handlers/multimodal.js.map +1 -0
  24. package/dist/ai/core/media/image/handlers/standard.d.ts +7 -0
  25. package/dist/ai/core/media/image/handlers/standard.js +28 -0
  26. package/dist/ai/core/media/image/handlers/standard.js.map +1 -0
  27. package/dist/ai/core/media/image/index.d.ts +2 -0
  28. package/dist/ai/core/media/image/index.js +3 -0
  29. package/dist/ai/core/media/image/index.js.map +1 -0
  30. package/dist/ai/core/media/index.d.ts +2 -0
  31. package/dist/ai/core/media/index.js +3 -0
  32. package/dist/ai/core/media/index.js.map +1 -0
  33. package/dist/ai/core/media/speech/generateSpeech.d.ts +5 -0
  34. package/dist/ai/core/media/speech/generateSpeech.js +55 -0
  35. package/dist/ai/core/media/speech/generateSpeech.js.map +1 -0
  36. package/dist/ai/core/media/speech/index.d.ts +2 -0
  37. package/dist/ai/core/media/speech/index.js +3 -0
  38. package/dist/ai/core/media/speech/index.js.map +1 -0
  39. package/dist/ai/core/media/types.d.ts +74 -0
  40. package/dist/ai/core/media/types.js +5 -0
  41. package/dist/ai/core/media/types.js.map +1 -0
  42. package/dist/ai/core/media/utils.d.ts +11 -0
  43. package/dist/ai/core/media/utils.js +34 -0
  44. package/dist/ai/core/media/utils.js.map +1 -0
  45. package/dist/ai/core/media/video/generateVideo.d.ts +6 -0
  46. package/dist/ai/core/media/video/generateVideo.js +32 -0
  47. package/dist/ai/core/media/video/generateVideo.js.map +1 -0
  48. package/dist/ai/core/media/video/index.d.ts +2 -0
  49. package/dist/ai/core/media/video/index.js +3 -0
  50. package/dist/ai/core/media/video/index.js.map +1 -0
  51. package/dist/ai/core/streamObject.d.ts +7 -0
  52. package/dist/ai/core/streamObject.js +54 -0
  53. package/dist/ai/core/streamObject.js.map +1 -0
  54. package/dist/ai/core/streamText.d.ts +7 -0
  55. package/dist/ai/core/streamText.js +30 -0
  56. package/dist/ai/core/streamText.js.map +1 -0
  57. package/dist/ai/core/types.d.ts +85 -0
  58. package/dist/ai/core/types.js +5 -0
  59. package/dist/ai/core/types.js.map +1 -0
  60. package/dist/ai/index.d.ts +11 -0
  61. package/dist/ai/index.js +25 -0
  62. package/dist/ai/index.js.map +1 -0
  63. package/dist/ai/providers/blocks/anthropic.d.ts +2 -0
  64. package/dist/ai/providers/blocks/anthropic.js +223 -0
  65. package/dist/ai/providers/blocks/anthropic.js.map +1 -0
  66. package/dist/ai/providers/blocks/elevenlabs.d.ts +2 -0
  67. package/dist/ai/providers/blocks/elevenlabs.js +449 -0
  68. package/dist/ai/providers/blocks/elevenlabs.js.map +1 -0
  69. package/dist/ai/providers/blocks/fal.d.ts +2 -0
  70. package/dist/ai/providers/blocks/fal.js +312 -0
  71. package/dist/ai/providers/blocks/fal.js.map +1 -0
  72. package/dist/ai/providers/blocks/google.d.ts +2 -0
  73. package/dist/ai/providers/blocks/google.js +623 -0
  74. package/dist/ai/providers/blocks/google.js.map +1 -0
  75. package/dist/ai/providers/blocks/index.d.ts +2 -0
  76. package/dist/ai/providers/blocks/index.js +18 -0
  77. package/dist/ai/providers/blocks/index.js.map +1 -0
  78. package/dist/ai/providers/blocks/openai-compatible.d.ts +2 -0
  79. package/dist/ai/providers/blocks/openai-compatible.js +308 -0
  80. package/dist/ai/providers/blocks/openai-compatible.js.map +1 -0
  81. package/dist/ai/providers/blocks/openai.d.ts +2 -0
  82. package/dist/ai/providers/blocks/openai.js +600 -0
  83. package/dist/ai/providers/blocks/openai.js.map +1 -0
  84. package/dist/ai/providers/blocks/xai.d.ts +2 -0
  85. package/dist/ai/providers/blocks/xai.js +247 -0
  86. package/dist/ai/providers/blocks/xai.js.map +1 -0
  87. package/dist/ai/providers/icons.d.ts +7 -0
  88. package/dist/ai/providers/icons.js +9 -0
  89. package/dist/ai/providers/icons.js.map +1 -0
  90. package/dist/ai/providers/index.d.ts +2 -0
  91. package/dist/ai/providers/index.js +6 -0
  92. package/dist/ai/providers/index.js.map +1 -0
  93. package/dist/ai/providers/registry.d.ts +40 -0
  94. package/dist/ai/providers/registry.js +267 -0
  95. package/dist/ai/providers/registry.js.map +1 -0
  96. package/dist/ai/providers/types.d.ts +115 -0
  97. package/dist/ai/providers/types.js +4 -0
  98. package/dist/ai/providers/types.js.map +1 -0
  99. package/dist/ai/utils/systemGenerate.d.ts +1 -1
  100. package/dist/ai/utils/systemGenerate.js +19 -19
  101. package/dist/ai/utils/systemGenerate.js.map +1 -1
  102. package/dist/collections/AIJobs.d.ts +2 -0
  103. package/dist/collections/AIJobs.js +81 -0
  104. package/dist/collections/AIJobs.js.map +1 -0
  105. package/dist/collections/AISettings.d.ts +2 -0
  106. package/dist/collections/AISettings.js +279 -0
  107. package/dist/collections/AISettings.js.map +1 -0
  108. package/dist/collections/Instructions.js +224 -50
  109. package/dist/collections/Instructions.js.map +1 -1
  110. package/dist/defaults.d.ts +3 -0
  111. package/dist/defaults.js +3 -0
  112. package/dist/defaults.js.map +1 -1
  113. package/dist/endpoints/buildPromptUtils.d.ts +19 -0
  114. package/dist/endpoints/buildPromptUtils.js +114 -0
  115. package/dist/endpoints/buildPromptUtils.js.map +1 -0
  116. package/dist/endpoints/chat.d.ts +4 -0
  117. package/dist/endpoints/fetchFields.js +0 -7
  118. package/dist/endpoints/fetchFields.js.map +1 -1
  119. package/dist/endpoints/fetchVoices.d.ts +2 -0
  120. package/dist/endpoints/fetchVoices.js +79 -0
  121. package/dist/endpoints/fetchVoices.js.map +1 -0
  122. package/dist/endpoints/index.js +339 -232
  123. package/dist/endpoints/index.js.map +1 -1
  124. package/dist/exports/client.d.ts +9 -0
  125. package/dist/exports/client.js +9 -0
  126. package/dist/exports/client.js.map +1 -1
  127. package/dist/exports/fields.d.ts +1 -0
  128. package/dist/exports/fields.js +1 -0
  129. package/dist/exports/fields.js.map +1 -1
  130. package/dist/fields/ArrayComposeField/ArrayComposeField.d.ts +15 -0
  131. package/dist/fields/ArrayComposeField/ArrayComposeField.js +87 -0
  132. package/dist/fields/ArrayComposeField/ArrayComposeField.js.map +1 -0
  133. package/dist/fields/ArrayComposeField/ArrayComposeField.jsx +73 -0
  134. package/dist/fields/ComposeField/ComposeField.js +2 -2
  135. package/dist/fields/ComposeField/ComposeField.js.map +1 -1
  136. package/dist/fields/ComposeField/ComposeField.jsx +2 -2
  137. package/dist/fields/PromptEditorField/PromptEditorField.js +162 -16
  138. package/dist/fields/PromptEditorField/PromptEditorField.js.map +1 -1
  139. package/dist/fields/PromptEditorField/PromptEditorField.jsx +123 -5
  140. package/dist/index.d.ts +3 -0
  141. package/dist/index.js +1 -0
  142. package/dist/index.js.map +1 -1
  143. package/dist/init.js +63 -65
  144. package/dist/init.js.map +1 -1
  145. package/dist/payload-ai.d.ts +149 -0
  146. package/dist/plugin.js +94 -46
  147. package/dist/plugin.js.map +1 -1
  148. package/dist/providers/InstructionsProvider/InstructionsProvider.js +38 -7
  149. package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
  150. package/dist/providers/InstructionsProvider/InstructionsProvider.jsx +30 -4
  151. package/dist/providers/InstructionsProvider/context.d.ts +1 -0
  152. package/dist/providers/InstructionsProvider/context.js +1 -0
  153. package/dist/providers/InstructionsProvider/context.js.map +1 -1
  154. package/dist/providers/InstructionsProvider/useInstructions.js +30 -10
  155. package/dist/providers/InstructionsProvider/useInstructions.js.map +1 -1
  156. package/dist/styles.d.ts +11 -0
  157. package/dist/types/handlebars-async-helpers.d.ts +1 -0
  158. package/dist/types/handlebars-dist-handlebars.d.ts +1 -0
  159. package/dist/types/react-mentions.d.ts +1 -0
  160. package/dist/types.d.ts +6 -16
  161. package/dist/types.js.map +1 -1
  162. package/dist/ui/AIConfigDashboard/index.d.ts +2 -0
  163. package/dist/ui/AIConfigDashboard/index.js +46 -0
  164. package/dist/ui/AIConfigDashboard/index.js.map +1 -0
  165. package/dist/ui/AIConfigDashboard/index.jsx +24 -0
  166. package/dist/ui/ApiKeyStatusIndicator/index.d.ts +6 -0
  167. package/dist/ui/ApiKeyStatusIndicator/index.js +39 -0
  168. package/dist/ui/ApiKeyStatusIndicator/index.js.map +1 -0
  169. package/dist/ui/ApiKeyStatusIndicator/index.jsx +29 -0
  170. package/dist/ui/Compose/Compose.d.ts +2 -2
  171. package/dist/ui/Compose/Compose.js +118 -92
  172. package/dist/ui/Compose/Compose.js.map +1 -1
  173. package/dist/ui/Compose/Compose.jsx +113 -103
  174. package/dist/ui/Compose/ComposePlaceholder.d.ts +7 -0
  175. package/dist/ui/Compose/ComposePlaceholder.js +78 -0
  176. package/dist/ui/Compose/ComposePlaceholder.js.map +1 -0
  177. package/dist/ui/Compose/ComposePlaceholder.jsx +66 -0
  178. package/dist/ui/Compose/UndoRedoActions.d.ts +2 -2
  179. package/dist/ui/Compose/UndoRedoActions.js +11 -6
  180. package/dist/ui/Compose/UndoRedoActions.js.map +1 -1
  181. package/dist/ui/Compose/UndoRedoActions.jsx +8 -6
  182. package/dist/ui/Compose/compose.module.css +57 -17
  183. package/dist/ui/Compose/hooks/menu/itemsMap.js +13 -7
  184. package/dist/ui/Compose/hooks/menu/itemsMap.js.map +1 -1
  185. package/dist/ui/Compose/hooks/menu/useMenu.d.ts +2 -1
  186. package/dist/ui/Compose/hooks/menu/useMenu.js +28 -17
  187. package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
  188. package/dist/ui/Compose/hooks/menu/useMenu.jsx +27 -14
  189. package/dist/ui/Compose/hooks/useActiveFieldTracking.js +69 -10
  190. package/dist/ui/Compose/hooks/useActiveFieldTracking.js.map +1 -1
  191. package/dist/ui/Compose/hooks/useGenerate.d.ts +3 -0
  192. package/dist/ui/Compose/hooks/useGenerate.js +71 -11
  193. package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
  194. package/dist/ui/Compose/hooks/useHistory.d.ts +0 -1
  195. package/dist/ui/Compose/hooks/useHistory.js +113 -26
  196. package/dist/ui/Compose/hooks/useHistory.js.map +1 -1
  197. package/dist/ui/DynamicModelSelect/index.d.ts +7 -0
  198. package/dist/ui/DynamicModelSelect/index.js +231 -0
  199. package/dist/ui/DynamicModelSelect/index.js.map +1 -0
  200. package/dist/ui/DynamicModelSelect/index.jsx +207 -0
  201. package/dist/ui/DynamicProviderSelect/index.d.ts +7 -0
  202. package/dist/ui/DynamicProviderSelect/index.js +101 -0
  203. package/dist/ui/DynamicProviderSelect/index.js.map +1 -0
  204. package/dist/ui/DynamicProviderSelect/index.jsx +90 -0
  205. package/dist/ui/DynamicVoiceSelect/index.d.ts +7 -0
  206. package/dist/ui/DynamicVoiceSelect/index.js +156 -0
  207. package/dist/ui/DynamicVoiceSelect/index.js.map +1 -0
  208. package/dist/ui/DynamicVoiceSelect/index.jsx +102 -0
  209. package/dist/ui/EncryptedTextField/index.d.ts +8 -0
  210. package/dist/ui/EncryptedTextField/index.js +74 -0
  211. package/dist/ui/EncryptedTextField/index.js.map +1 -0
  212. package/dist/ui/EncryptedTextField/index.jsx +35 -0
  213. package/dist/ui/Icons/LottieAnimation.js +3 -1
  214. package/dist/ui/Icons/LottieAnimation.js.map +1 -1
  215. package/dist/ui/Icons/LottieAnimation.jsx +2 -1
  216. package/dist/ui/ModelRowLabel/index.d.ts +6 -0
  217. package/dist/ui/ModelRowLabel/index.js +41 -0
  218. package/dist/ui/ModelRowLabel/index.js.map +1 -0
  219. package/dist/ui/ModelRowLabel/index.jsx +26 -0
  220. package/dist/ui/ProviderOptionsEditor/index.d.ts +7 -0
  221. package/dist/ui/ProviderOptionsEditor/index.js +291 -0
  222. package/dist/ui/ProviderOptionsEditor/index.js.map +1 -0
  223. package/dist/ui/ProviderOptionsEditor/index.jsx +210 -0
  224. package/dist/ui/VoicesFetcher/index.d.ts +7 -0
  225. package/dist/ui/VoicesFetcher/index.js +118 -0
  226. package/dist/ui/VoicesFetcher/index.js.map +1 -0
  227. package/dist/ui/VoicesFetcher/index.jsx +79 -0
  228. package/dist/utilities/buildSmartPrompt.d.ts +22 -0
  229. package/dist/utilities/buildSmartPrompt.js +143 -0
  230. package/dist/utilities/buildSmartPrompt.js.map +1 -0
  231. package/dist/utilities/encryption.d.ts +2 -0
  232. package/dist/utilities/encryption.js +47 -0
  233. package/dist/utilities/encryption.js.map +1 -0
  234. package/dist/utilities/extractImageData.d.ts +9 -0
  235. package/dist/utilities/extractImageData.js +12 -2
  236. package/dist/utilities/extractImageData.js.map +1 -1
  237. package/dist/utilities/fetchImages.d.ts +14 -0
  238. package/dist/utilities/fetchImages.js +38 -0
  239. package/dist/utilities/fetchImages.js.map +1 -0
  240. package/dist/utilities/fieldToJsonSchema.d.ts +2 -1
  241. package/dist/utilities/fieldToJsonSchema.js +66 -3
  242. package/dist/utilities/fieldToJsonSchema.js.map +1 -1
  243. package/dist/utilities/getFieldBySchemaPath.d.ts +2 -2
  244. package/dist/utilities/getFieldBySchemaPath.js +15 -0
  245. package/dist/utilities/getFieldBySchemaPath.js.map +1 -1
  246. package/dist/utilities/getProviderOptionsFields.d.ts +16 -0
  247. package/dist/utilities/getProviderOptionsFields.js +80 -0
  248. package/dist/utilities/getProviderOptionsFields.js.map +1 -0
  249. package/dist/utilities/isPluginActivated.js +1 -2
  250. package/dist/utilities/isPluginActivated.js.map +1 -1
  251. package/dist/utilities/lexicalToHTML.js.map +1 -1
  252. package/dist/utilities/resolveImageReferences.d.ts +30 -0
  253. package/dist/utilities/resolveImageReferences.js +167 -0
  254. package/dist/utilities/resolveImageReferences.js.map +1 -0
  255. package/dist/utilities/schemaConverter.d.ts +3 -0
  256. package/dist/utilities/schemaConverter.js +93 -0
  257. package/dist/utilities/schemaConverter.js.map +1 -0
  258. package/dist/utilities/setSafeLexicalState.d.ts +1 -3
  259. package/dist/utilities/setSafeLexicalState.js +1 -1
  260. package/dist/utilities/setSafeLexicalState.js.map +1 -1
  261. package/dist/utilities/updateFieldsConfig.js +27 -43
  262. package/dist/utilities/updateFieldsConfig.js.map +1 -1
  263. package/package.json +23 -24
  264. package/dist/ai/models/anthropic/index.d.ts +0 -2
  265. package/dist/ai/models/anthropic/index.js +0 -129
  266. package/dist/ai/models/anthropic/index.js.map +0 -1
  267. package/dist/ai/models/elevenLabs/generateVoice.d.ts +0 -8
  268. package/dist/ai/models/elevenLabs/generateVoice.js +0 -20
  269. package/dist/ai/models/elevenLabs/generateVoice.js.map +0 -1
  270. package/dist/ai/models/elevenLabs/index.d.ts +0 -2
  271. package/dist/ai/models/elevenLabs/index.js +0 -133
  272. package/dist/ai/models/elevenLabs/index.js.map +0 -1
  273. package/dist/ai/models/elevenLabs/voices.d.ts +0 -8
  274. package/dist/ai/models/elevenLabs/voices.js +0 -24
  275. package/dist/ai/models/elevenLabs/voices.js.map +0 -1
  276. package/dist/ai/models/generateObject.d.ts +0 -11
  277. package/dist/ai/models/generateObject.js +0 -22
  278. package/dist/ai/models/generateObject.js.map +0 -1
  279. package/dist/ai/models/google/generateImage.d.ts +0 -9
  280. package/dist/ai/models/google/generateImage.js +0 -27
  281. package/dist/ai/models/google/generateImage.js.map +0 -1
  282. package/dist/ai/models/google/index.d.ts +0 -2
  283. package/dist/ai/models/google/index.js +0 -201
  284. package/dist/ai/models/google/index.js.map +0 -1
  285. package/dist/ai/models/index.d.ts +0 -2
  286. package/dist/ai/models/index.js +0 -13
  287. package/dist/ai/models/index.js.map +0 -1
  288. package/dist/ai/models/openai/generateImage.d.ts +0 -5
  289. package/dist/ai/models/openai/generateImage.js +0 -31
  290. package/dist/ai/models/openai/generateImage.js.map +0 -1
  291. package/dist/ai/models/openai/generateVoice.d.ts +0 -6
  292. package/dist/ai/models/openai/generateVoice.js +0 -19
  293. package/dist/ai/models/openai/generateVoice.js.map +0 -1
  294. package/dist/ai/models/openai/index.d.ts +0 -2
  295. package/dist/ai/models/openai/index.js +0 -428
  296. package/dist/ai/models/openai/index.js.map +0 -1
  297. package/dist/ai/models/openai/openai.d.ts +0 -1
  298. package/dist/ai/models/openai/openai.js +0 -8
  299. package/dist/ai/models/openai/openai.js.map +0 -1
  300. package/dist/ai/utils/editImagesWithOpenAI.d.ts +0 -10
  301. package/dist/ai/utils/editImagesWithOpenAI.js +0 -37
  302. package/dist/ai/utils/editImagesWithOpenAI.js.map +0 -1
  303. package/dist/styles.d.js +0 -2
  304. package/dist/styles.d.js.map +0 -1
  305. package/dist/types/handlebars-async-helpers.d.js +0 -2
  306. package/dist/types/handlebars-async-helpers.d.js.map +0 -1
  307. package/dist/types/handlebars-dist-handlebars.d.js +0 -2
  308. package/dist/types/handlebars-dist-handlebars.d.js.map +0 -1
  309. package/dist/types/react-mentions.d.js +0 -2
  310. package/dist/types/react-mentions.d.js.map +0 -1
  311. package/dist/utilities/getGenerationModels.d.ts +0 -2
  312. package/dist/utilities/getGenerationModels.js +0 -10
  313. package/dist/utilities/getGenerationModels.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/endpoints/index.ts"],"sourcesContent":["import type { CollectionSlug, PayloadRequest } from 'payload'\n\nimport * as process from 'node:process'\n\nimport type {\n ActionMenuItems,\n Endpoints,\n PluginConfig,\n PromptFieldGetterContext,\n} from '../types.js'\n\nimport { defaultPrompts } from '../ai/prompts.js'\nimport { filterEditorSchemaByNodes } from '../ai/utils/filterEditorSchemaByNodes.js'\nimport {\n PLUGIN_API_ENDPOINT_GENERATE,\n PLUGIN_API_ENDPOINT_GENERATE_UPLOAD,\n PLUGIN_INSTRUCTIONS_TABLE,\n PLUGIN_NAME,\n} from '../defaults.js'\nimport { asyncHandlebars } from '../libraries/handlebars/asyncHandlebars.js'\nimport { registerEditorHelper } from '../libraries/handlebars/helpers.js'\nimport { handlebarsHelpersMap } from '../libraries/handlebars/helpersMap.js'\nimport { replacePlaceholders } from '../libraries/handlebars/replacePlaceholders.js'\nimport { extractImageData } from '../utilities/extractImageData.js'\nimport { fieldToJsonSchema } from '../utilities/fieldToJsonSchema.js'\nimport { getFieldBySchemaPath } from '../utilities/getFieldBySchemaPath.js'\nimport { getGenerationModels } from '../utilities/getGenerationModels.js'\n\nconst requireAuthentication = (req: PayloadRequest) => {\n if (!req.user) {\n throw new Error('Authentication required. Please log in to use AI features.')\n }\n return true\n}\n\nconst checkAccess = async (req: PayloadRequest, pluginConfig: PluginConfig) => {\n requireAuthentication(req)\n\n if (pluginConfig.access?.generate) {\n const hasAccess = await pluginConfig.access.generate({ req })\n if (!hasAccess) {\n throw new Error('Insufficient permissions to use AI generation features.')\n }\n }\n\n return true\n}\n\nconst extendContextWithPromptFields = (\n data: object,\n ctx: PromptFieldGetterContext,\n pluginConfig: PluginConfig,\n) => {\n const { promptFields = [] } = pluginConfig\n const fieldsMap = new Map(\n promptFields\n .filter((f) => !f.collections || f.collections.includes(ctx.collection))\n .map((f) => [f.name, f]),\n )\n return new Proxy(data, {\n get: (target, prop: string) => {\n const field = fieldsMap.get(prop)\n if (field?.getter) {\n const value = field.getter(data, ctx)\n return Promise.resolve(value).then((v) => new asyncHandlebars.SafeString(v))\n }\n // {{prop}} escapes content by default. Here we make sure it won't be escaped.\n const value = typeof target === 'object' ? (target as any)[prop] : undefined\n return typeof value === 'string' ? new asyncHandlebars.SafeString(value) : value\n },\n // It's used by the handlebars library to determine if the property is enumerable\n getOwnPropertyDescriptor: (target, prop) => {\n const field = fieldsMap.get(prop as string)\n if (field) {\n return {\n configurable: true,\n enumerable: true,\n }\n }\n return Object.getOwnPropertyDescriptor(target, prop)\n },\n has: (target, prop) => {\n return fieldsMap.has(prop as string) || (target && prop in target)\n },\n ownKeys: (target) => {\n return [...fieldsMap.keys(), ...Object.keys(target || {})]\n },\n })\n}\n\nconst buildRichTextSystem = (baseSystem: string, layout: string) => {\n return `${baseSystem}\n\nRULES:\n- Generate original and unique content based on the given topic.\n- Strictly adhere to the specified layout and formatting instructions.\n- Utilize the provided rich text editor tools for appropriate formatting.\n- Ensure the output follows the structure of the sample output object.\n- Produce valid JSON with no undefined or null values.\n---\nLAYOUT INSTRUCTIONS:\n${layout}\n\n---\nADDITIONAL GUIDELINES:\n- Ensure coherence and logical flow between all sections.\n- Maintain a consistent tone and style throughout the content.\n- Use clear and concise language appropriate for the target audience.\n`\n}\n\nconst assignPrompt = async (\n action: ActionMenuItems,\n {\n type,\n actionParams,\n collection,\n context,\n field,\n layout,\n locale,\n pluginConfig,\n systemPrompt = '',\n template,\n }: {\n actionParams: Record<any, any>\n collection: CollectionSlug\n context: object\n field: string\n layout: string\n locale: string\n pluginConfig: PluginConfig\n systemPrompt: string\n template: string\n type: string\n },\n) => {\n const extendedContext = extendContextWithPromptFields(context, { type, collection }, pluginConfig)\n const prompt = await replacePlaceholders(template, extendedContext)\n const toLexicalHTML = type === 'richText' ? handlebarsHelpersMap.toHTML.name : ''\n\n const assignedPrompts = {\n layout: type === 'richText' ? layout : undefined,\n prompt,\n //TODO: Define only once on a collection level\n system: type === 'richText' ? buildRichTextSystem(systemPrompt, layout) : undefined,\n }\n\n if (action === 'Compose') {\n if (locale && locale !== 'en') {\n /**\n * NOTE: Avoid using the \"system prompt\" for setting the output language,\n * as it causes quotation marks to appear in the output (Currently only tested with openai models).\n * Appending the language instruction directly to the prompt resolves this issue.\n **/\n assignedPrompts.prompt += `\n --- \n OUTPUT LANGUAGE: ${locale}\n `\n }\n\n return assignedPrompts\n }\n\n const prompts = [...(pluginConfig.prompts || []), ...defaultPrompts]\n const foundPrompt = prompts.find((p) => p.name === action)\n const getLayout = foundPrompt?.layout\n const getSystemPrompt = foundPrompt?.system\n\n let updatedLayout = layout\n if (getLayout) {\n updatedLayout = getLayout()\n }\n\n const system = getSystemPrompt\n ? getSystemPrompt({\n ...(actionParams || {}),\n prompt,\n systemPrompt,\n })\n : ''\n\n return {\n layout: updatedLayout,\n // TODO: revisit this toLexicalHTML\n prompt: await replacePlaceholders(`{{${toLexicalHTML} ${field}}}`, extendedContext),\n system,\n }\n}\n\nexport const endpoints: (pluginConfig: PluginConfig) => Endpoints = (pluginConfig) =>\n ({\n textarea: {\n //TODO: This is the main endpoint for generating content - its just needs to be renamed to 'generate' or something.\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 const { defaultLocale, locales = [] } = req.payload.config.localization || {}\n const localeData = locales.find((l) => {\n return l.code === locale\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 locale: locales.length > 0 && locale ? locale : undefined,\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 const { prompt: promptTemplate = '' } = instructions\n\n let allowedEditorSchema = editorSchema\n if (allowedEditorNodes.length) {\n allowedEditorSchema = filterEditorSchemaByNodes(editorSchema, allowedEditorNodes)\n }\n\n const schemaPath = instructions['schema-path'] as string\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 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 models = getGenerationModels(pluginConfig)\n const model =\n models && Array.isArray(models)\n ? models.find((model) => model.id === instructions['model-id'])\n : undefined\n\n if (!model) {\n throw new Error('Model not found')\n }\n\n const settingsName =\n model.settings && 'name' in model.settings ? model.settings.name : undefined\n if (!settingsName) {\n req.payload.logger.error('— AI Plugin: Error fetching settings name!')\n }\n\n const modelOptions = settingsName ? instructions[settingsName] || {} : {}\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} using ${model.id}`,\n )\n }\n\n // Build per-field JSON schema for structured generation when applicable\n let jsonSchema = allowedEditorSchema\n try {\n \n const targetCollection = req.payload.config.collections.find(\n (c) => c.slug === collectionName,\n )\n\n const targetGlobal = req.payload.config.globals?.find(\n (g) => g.slug === collectionName,\n )\n\n const targetConfig = targetCollection || targetGlobal\n\n if (targetConfig && fieldName) {\n const targetField = getFieldBySchemaPath(targetConfig, schemaPath)\n const supported = [\n 'text',\n 'textarea',\n 'select',\n 'number',\n 'date',\n 'code',\n 'email',\n 'json',\n ]\n\n const t = String(targetField?.type || '')\n if (targetField && supported.includes(t)) {\n jsonSchema = fieldToJsonSchema(targetField as any, { nameOverride: fieldName })\n }\n }\n } catch (e) {\n req.payload.logger.error(e, '— AI Plugin: Error building field JSON schema')\n }\n\n return model.handler?.(prompts.prompt, {\n ...modelOptions,\n layout: prompts.layout,\n locale: localeInfo,\n schema: jsonSchema,\n system: prompts.system,\n })\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 any).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 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,\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, any> = { images: [], 'model-id': '', prompt: '' }\n\n if (instructionId) {\n // Get locale from request if available\n const { locale: requestLocale } = data\n const { locales = [] } = req.payload.config.localization || {}\n\n // Verify user has access to the specific instruction\n // Pass locale if localization is enabled for the Instructions collection\n instructions = await req.payload.findByID({\n id: instructionId,\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n locale: locales.length > 0 && requestLocale ? requestLocale : undefined,\n req, // Pass req to ensure access control is applied\n })\n }\n\n const { images: sampleImages = [], prompt: promptTemplate = '' } = instructions\n const schemaPath = instructions['schema-path']\n\n registerEditorHelper(req.payload, schemaPath)\n\n const extendedContext = extendContextWithPromptFields(\n contextData,\n { type: instructions['field-type'], collection: collectionSlug },\n pluginConfig,\n )\n const text = await replacePlaceholders(promptTemplate, extendedContext)\n const modelId = instructions['model-id']\n const uploadCollectionSlug = instructions['relation-to']\n\n const images = [...extractImageData(text), ...sampleImages]\n\n const editImages = []\n for (const img of images) {\n const serverURL =\n req.payload.config?.serverURL ||\n process.env.SERVER_URL ||\n process.env.NEXT_PUBLIC_SERVER_URL\n\n let url = img.image.thumbnailURL || img.image.url\n if (!url.startsWith('http')) {\n url = `${serverURL}${url}`\n }\n\n try {\n const response = await fetch(url, {\n headers: {\n //TODO: Further testing needed or so find a proper way.\n Authorization: `Bearer ${req.headers.get('Authorization')?.split('Bearer ')[1] || ''}`,\n },\n method: 'GET',\n })\n\n const blob = await response.blob()\n editImages.push({\n name: img.image.name,\n type: img.image.type,\n data: blob,\n size: blob.size,\n url,\n })\n } catch (e) {\n req.payload.logger.error(e, `Error fetching reference image ${url}`)\n throw Error(\n \"We couldn't fetch the images. Please ensure the images are accessible and hosted publicly.\",\n )\n }\n }\n\n const modelsUpload = getGenerationModels(pluginConfig)\n const model =\n modelsUpload && Array.isArray(modelsUpload)\n ? modelsUpload.find((model) => model.id === modelId)\n : undefined\n\n if (!model) {\n throw new Error('Model not found')\n }\n\n // @ts-ignore\n const settingsName = model && model.settings ? model.settings.name : undefined\n if (!settingsName) {\n req.payload.logger.error('— AI Plugin: Error fetching settings name!')\n }\n\n let modelOptions = settingsName ? instructions[settingsName] || {} : {}\n modelOptions = {\n ...modelOptions,\n images: editImages,\n }\n\n if (pluginConfig.debugging) {\n req.payload.logger.info(\n { text },\n `— AI Plugin: Executing image prompt using ${model.id}`,\n )\n }\n\n const result = await model.handler?.(text, modelOptions)\n let assetData: { alt?: string; id: number | string }\n\n if (typeof pluginConfig.mediaUpload === 'function') {\n assetData = await pluginConfig.mediaUpload(result, {\n collection: uploadCollectionSlug,\n request: req,\n })\n } else {\n assetData = await req.payload.create({\n collection: uploadCollectionSlug,\n data: result.data,\n file: result.file,\n req, // Pass req to ensure access control is applied\n })\n }\n\n if (!assetData.id) {\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 return new Response(\n JSON.stringify({\n result: {\n id: assetData.id,\n alt: assetData.alt,\n },\n }),\n )\n } catch (error) {\n req.payload.logger.error(error, 'Error generating upload: ')\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:\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 }) satisfies Endpoints\n"],"names":["process","defaultPrompts","filterEditorSchemaByNodes","PLUGIN_API_ENDPOINT_GENERATE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","PLUGIN_INSTRUCTIONS_TABLE","PLUGIN_NAME","asyncHandlebars","registerEditorHelper","handlebarsHelpersMap","replacePlaceholders","extractImageData","fieldToJsonSchema","getFieldBySchemaPath","getGenerationModels","requireAuthentication","req","user","Error","checkAccess","pluginConfig","access","generate","hasAccess","extendContextWithPromptFields","data","ctx","promptFields","fieldsMap","Map","filter","f","collections","includes","collection","map","name","Proxy","get","target","prop","field","getter","value","Promise","resolve","then","v","SafeString","undefined","getOwnPropertyDescriptor","configurable","enumerable","Object","has","ownKeys","keys","buildRichTextSystem","baseSystem","layout","assignPrompt","action","type","actionParams","context","locale","systemPrompt","template","extendedContext","prompt","toLexicalHTML","toHTML","assignedPrompts","system","prompts","foundPrompt","find","p","getLayout","getSystemPrompt","updatedLayout","endpoints","textarea","handler","json","allowedEditorNodes","options","instructionId","contextData","doc","defaultLocale","locales","payload","config","localization","localeData","l","code","instructions","findByID","id","length","slug","custom","editorConfig","admin","schema","editorSchema","promptTemplate","allowedEditorSchema","schemaPath","parts","split","collectionName","fieldName","localeInfo","label","models","model","Array","isArray","settingsName","settings","logger","error","modelOptions","String","debugging","info","jsonSchema","targetCollection","c","targetGlobal","globals","g","targetConfig","targetField","supported","t","nameOverride","e","message","Response","JSON","stringify","headers","status","method","path","upload","collectionSlug","documentId","docData","draft","images","requestLocale","sampleImages","text","modelId","uploadCollectionSlug","editImages","img","serverURL","env","SERVER_URL","NEXT_PUBLIC_SERVER_URL","url","image","thumbnailURL","startsWith","response","fetch","Authorization","blob","push","size","modelsUpload","result","assetData","mediaUpload","request","create","file","alt"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/endpoints/index.ts"],"sourcesContent":["import type { ImagePart } from 'ai'\nimport type { 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 }\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 try {\n const targetCollection = req.payload.config.collections.find(\n (c) => c.slug === collectionName,\n )\n if (targetCollection && fieldName) {\n const 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<string, unknown>\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 // Use payload.ai.streamObject directly! 🎉\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 model: modelSettings.model as string,\n prompt: processedPrompt,\n provider: modelSettings.provider as string,\n schema: jsonSchema,\n system: prompts.system,\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,\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 modelId = instructions['model-id']\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 if (pluginConfig.debugging) {\n req.payload.logger.info({ text }, `— AI Plugin: Executing media generation`)\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 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-settings',\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: text,\n provider: modelSettings.provider as string,\n ...modelSettings,\n })\n\n // If model returned a file immediately, proceed with upload\n if (result && 'file' in result) {\n let assetData: { alt?: string; id: number | string }\n if (typeof pluginConfig.mediaUpload === 'function') {\n assetData = await pluginConfig.mediaUpload(result, {\n collection: uploadCollectionSlug as string,\n request: req,\n })\n } else {\n assetData = await req.payload.create({\n collection: uploadCollectionSlug as string,\n data: { alt: text },\n file: result.file,\n req, // Pass req to ensure access control is applied\n })\n }\n\n if (!assetData.id) {\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 return new Response(\n JSON.stringify({\n result: {\n id: assetData.id,\n alt: assetData.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","parts","split","collectionName","fieldName","defaultLocale","locales","localization","localeData","l","code","localeInfo","label","prompts","type","context","field","layout","systemPrompt","system","template","jsonSchema","targetCollection","c","targetField","supported","t","includes","arraySettings","count","modifiedField","maxRows","minRows","nameOverride","e","error","settingsName","undefined","modelSettings","images","resolvedImages","processedPrompt","hardcodedImages","allImages","imageParts","streamResult","ai","streamObject","maxTokens","model","provider","temperature","message","Response","JSON","stringify","headers","status","method","path","upload","collectionSlug","documentId","docData","draft","sampleImages","extendedContext","text","modelId","uploadCollectionSlug","editImages","serverURL","env","SERVER_URL","NEXT_PUBLIC_SERVER_URL","callbackUrl","replace","instructionSettings","globalDefaults","aiSettings","findGlobal","unsafe","defaultsKey","defaults","filteredInstructionSettings","Object","fromEntries","entries","filter","_","v","result","generateMedia","assetData","mediaUpload","request","create","alt","file","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","created","name","mimetype","size","byteLength","result_id"],"mappings":"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"}
@@ -1,3 +1,12 @@
1
1
  export { LexicalEditorFeatureClient } from '../fields/LexicalEditor/feature.client.js';
2
2
  export { InstructionsContext } from '../providers/InstructionsProvider/context.js';
3
3
  export { InstructionsProvider } from '../providers/InstructionsProvider/InstructionsProvider.js';
4
+ export { AIConfigDashboard } from '../ui/AIConfigDashboard/index.js';
5
+ export { ApiKeyStatusIndicator } from '../ui/ApiKeyStatusIndicator/index.js';
6
+ export { DynamicModelSelect } from '../ui/DynamicModelSelect/index.js';
7
+ export { DynamicProviderSelect } from '../ui/DynamicProviderSelect/index.js';
8
+ export { DynamicVoiceSelect } from '../ui/DynamicVoiceSelect/index.js';
9
+ export { EncryptedTextField } from '../ui/EncryptedTextField/index.js';
10
+ export { ModelRowLabel } from '../ui/ModelRowLabel/index.js';
11
+ export { ProviderOptionsEditor } from '../ui/ProviderOptionsEditor/index.js';
12
+ export { VoicesFetcher } from '../ui/VoicesFetcher/index.js';
@@ -1,5 +1,14 @@
1
1
  export { LexicalEditorFeatureClient } from '../fields/LexicalEditor/feature.client.js';
2
2
  export { InstructionsContext } from '../providers/InstructionsProvider/context.js';
3
3
  export { InstructionsProvider } from '../providers/InstructionsProvider/InstructionsProvider.js';
4
+ export { AIConfigDashboard } from '../ui/AIConfigDashboard/index.js';
5
+ export { ApiKeyStatusIndicator } from '../ui/ApiKeyStatusIndicator/index.js';
6
+ export { DynamicModelSelect } from '../ui/DynamicModelSelect/index.js';
7
+ export { DynamicProviderSelect } from '../ui/DynamicProviderSelect/index.js';
8
+ export { DynamicVoiceSelect } from '../ui/DynamicVoiceSelect/index.js';
9
+ export { EncryptedTextField } from '../ui/EncryptedTextField/index.js';
10
+ export { ModelRowLabel } from '../ui/ModelRowLabel/index.js';
11
+ export { ProviderOptionsEditor } from '../ui/ProviderOptionsEditor/index.js';
12
+ export { VoicesFetcher } from '../ui/VoicesFetcher/index.js';
4
13
 
5
14
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/exports/client.ts"],"sourcesContent":["export { LexicalEditorFeatureClient } from '../fields/LexicalEditor/feature.client.js'\nexport { InstructionsContext } from '../providers/InstructionsProvider/context.js'\nexport { InstructionsProvider } from '../providers/InstructionsProvider/InstructionsProvider.js'\n"],"names":["LexicalEditorFeatureClient","InstructionsContext","InstructionsProvider"],"mappings":"AAAA,SAASA,0BAA0B,QAAQ,4CAA2C;AACtF,SAASC,mBAAmB,QAAQ,+CAA8C;AAClF,SAASC,oBAAoB,QAAQ,4DAA2D"}
1
+ {"version":3,"sources":["../../src/exports/client.ts"],"sourcesContent":["export { LexicalEditorFeatureClient } from '../fields/LexicalEditor/feature.client.js'\nexport { InstructionsContext } from '../providers/InstructionsProvider/context.js'\nexport { InstructionsProvider } from '../providers/InstructionsProvider/InstructionsProvider.js'\nexport { AIConfigDashboard } from '../ui/AIConfigDashboard/index.js'\nexport { ApiKeyStatusIndicator } from '../ui/ApiKeyStatusIndicator/index.js'\nexport { DynamicModelSelect } from '../ui/DynamicModelSelect/index.js'\nexport { DynamicProviderSelect } from '../ui/DynamicProviderSelect/index.js'\nexport { DynamicVoiceSelect } from '../ui/DynamicVoiceSelect/index.js'\nexport { EncryptedTextField } from '../ui/EncryptedTextField/index.js'\nexport { ModelRowLabel } from '../ui/ModelRowLabel/index.js'\nexport { ProviderOptionsEditor } from '../ui/ProviderOptionsEditor/index.js'\nexport { VoicesFetcher } from '../ui/VoicesFetcher/index.js'\n"],"names":["LexicalEditorFeatureClient","InstructionsContext","InstructionsProvider","AIConfigDashboard","ApiKeyStatusIndicator","DynamicModelSelect","DynamicProviderSelect","DynamicVoiceSelect","EncryptedTextField","ModelRowLabel","ProviderOptionsEditor","VoicesFetcher"],"mappings":"AAAA,SAASA,0BAA0B,QAAQ,4CAA2C;AACtF,SAASC,mBAAmB,QAAQ,+CAA8C;AAClF,SAASC,oBAAoB,QAAQ,4DAA2D;AAChG,SAASC,iBAAiB,QAAQ,mCAAkC;AACpE,SAASC,qBAAqB,QAAQ,uCAAsC;AAC5E,SAASC,kBAAkB,QAAQ,oCAAmC;AACtE,SAASC,qBAAqB,QAAQ,uCAAsC;AAC5E,SAASC,kBAAkB,QAAQ,oCAAmC;AACtE,SAASC,kBAAkB,QAAQ,oCAAmC;AACtE,SAASC,aAAa,QAAQ,+BAA8B;AAC5D,SAASC,qBAAqB,QAAQ,uCAAsC;AAC5E,SAASC,aAAa,QAAQ,+BAA8B"}
@@ -1,3 +1,4 @@
1
+ export { ArrayComposeField } from '../fields/ArrayComposeField/ArrayComposeField.js';
1
2
  export { ComposeField } from '../fields/ComposeField/ComposeField.js';
2
3
  export { PromptEditorField } from '../fields/PromptEditorField/PromptEditorField.js';
3
4
  export { SelectField } from '../fields/SelectField/SelectField.js';
@@ -1,3 +1,4 @@
1
+ export { ArrayComposeField } from '../fields/ArrayComposeField/ArrayComposeField.js';
1
2
  export { ComposeField } from '../fields/ComposeField/ComposeField.js';
2
3
  export { PromptEditorField } from '../fields/PromptEditorField/PromptEditorField.js';
3
4
  export { SelectField } from '../fields/SelectField/SelectField.js';
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/exports/fields.ts"],"sourcesContent":["export { ComposeField } from '../fields/ComposeField/ComposeField.js'\nexport { PromptEditorField } from '../fields/PromptEditorField/PromptEditorField.js'\nexport { SelectField } from '../fields/SelectField/SelectField.js'\n"],"names":["ComposeField","PromptEditorField","SelectField"],"mappings":"AAAA,SAASA,YAAY,QAAQ,yCAAwC;AACrE,SAASC,iBAAiB,QAAQ,mDAAkD;AACpF,SAASC,WAAW,QAAQ,uCAAsC"}
1
+ {"version":3,"sources":["../../src/exports/fields.ts"],"sourcesContent":["export { ArrayComposeField } from '../fields/ArrayComposeField/ArrayComposeField.js'\nexport { ComposeField } from '../fields/ComposeField/ComposeField.js'\nexport { PromptEditorField } from '../fields/PromptEditorField/PromptEditorField.js'\nexport { SelectField } from '../fields/SelectField/SelectField.js'\n"],"names":["ArrayComposeField","ComposeField","PromptEditorField","SelectField"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,mDAAkD;AACpF,SAASC,YAAY,QAAQ,yCAAwC;AACrE,SAASC,iBAAiB,QAAQ,mDAAkD;AACpF,SAASC,WAAW,QAAQ,uCAAsC"}
@@ -0,0 +1,15 @@
1
+ import type { ClientField } from 'payload';
2
+ import React from 'react';
3
+ type ArrayComposeFieldProps = {
4
+ [key: string]: any;
5
+ field: ClientField;
6
+ path?: string;
7
+ schemaPath?: string;
8
+ };
9
+ /**
10
+ * ArrayComposeField - A version of ComposeField specifically for array fields.
11
+ * Unlike regular fields, arrays don't have focus events, so this component
12
+ * renders the Compose button immediately (always visible).
13
+ */
14
+ export declare const ArrayComposeField: (props: ArrayComposeFieldProps) => React.JSX.Element;
15
+ export {};
@@ -0,0 +1,87 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { FieldDescription, useDocumentInfo } from '@payloadcms/ui';
4
+ import React from 'react';
5
+ import { createPortal } from 'react-dom';
6
+ import { FieldProvider } from '../../providers/FieldProvider/FieldProvider.js';
7
+ import { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js';
8
+ import { Compose } from '../../ui/Compose/Compose.js';
9
+ import styles from '../../ui/Compose/compose.module.css';
10
+ /**
11
+ * ArrayComposeField - A version of ComposeField specifically for array fields.
12
+ * Unlike regular fields, arrays don't have focus events, so this component
13
+ * renders the Compose button immediately (always visible).
14
+ */ export const ArrayComposeField = (props)=>{
15
+ const { collectionSlug } = useDocumentInfo();
16
+ const finalSchemaPath = props?.schemaPath ?? (collectionSlug ? `${collectionSlug}.${props?.path ?? ''}` : props?.path ?? '');
17
+ const { id: instructionId, disabled, hasInstructions, isConfigAllowed } = useInstructions({
18
+ schemaPath: finalSchemaPath
19
+ });
20
+ // Portal target state
21
+ const [portalTarget, setPortalTarget] = React.useState(null);
22
+ // State to track if the "Add Row" button is present in the DOM
23
+ const [isAddRowPresent, setIsAddRowPresent] = React.useState(true);
24
+ React.useEffect(()=>{
25
+ if (props.field && 'name' in props.field) {
26
+ const fieldId = `field-${props.field.name}`;
27
+ const fieldElement = document.getElementById(fieldId);
28
+ if (fieldElement) {
29
+ fieldElement.classList.add(styles.arrayFieldWrapper);
30
+ // Force relative position via inline style to prevent class application delays/overrides
31
+ fieldElement.style.position = 'relative';
32
+ setPortalTarget(fieldElement);
33
+ // Check initial state
34
+ const checkAddRow = ()=>{
35
+ const btn = fieldElement.querySelector('.array-field__add-row');
36
+ setIsAddRowPresent(!!btn);
37
+ };
38
+ checkAddRow();
39
+ // Observe for changes (e.g. when max rows reached and button is removed)
40
+ const observer = new MutationObserver(checkAddRow);
41
+ observer.observe(fieldElement, {
42
+ childList: true,
43
+ subtree: true
44
+ });
45
+ return ()=>observer.disconnect();
46
+ }
47
+ }
48
+ }, [
49
+ props.field
50
+ ]);
51
+ const adminDescription = props?.field?.admin || {};
52
+ const description = 'description' in adminDescription ? adminDescription.description : '';
53
+ return /*#__PURE__*/ _jsxs(FieldProvider, {
54
+ context: {
55
+ field: props?.field,
56
+ path: props?.path ?? '',
57
+ schemaPath: finalSchemaPath
58
+ },
59
+ children: [
60
+ /*#__PURE__*/ _jsx("div", {
61
+ children: /*#__PURE__*/ _jsx(FieldDescription, {
62
+ description: description,
63
+ path: props?.path
64
+ })
65
+ }),
66
+ hasInstructions && instructionId && !disabled && portalTarget ? /*#__PURE__*/ createPortal(/*#__PURE__*/ _jsx("div", {
67
+ className: `
68
+ ${styles.composePortal}
69
+ ${isAddRowPresent ? styles.composePortalAbsolute : styles.composePortalStatic}
70
+ `,
71
+ children: /*#__PURE__*/ _jsx(Compose, {
72
+ descriptionProps: {
73
+ ...props,
74
+ field: props?.field,
75
+ path: props?.path ?? '',
76
+ schemaPath: finalSchemaPath
77
+ },
78
+ forceVisible: true,
79
+ instructionId: instructionId,
80
+ isConfigAllowed: isConfigAllowed
81
+ })
82
+ }), portalTarget) : null
83
+ ]
84
+ });
85
+ };
86
+
87
+ //# sourceMappingURL=ArrayComposeField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/fields/ArrayComposeField/ArrayComposeField.tsx"],"sourcesContent":["'use client'\n\nimport type { ClientField } from 'payload'\n\nimport { FieldDescription, useDocumentInfo } from '@payloadcms/ui'\nimport React from 'react'\nimport { createPortal } from 'react-dom'\n\nimport { FieldProvider } from '../../providers/FieldProvider/FieldProvider.js'\nimport { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js'\nimport { Compose } from '../../ui/Compose/Compose.js'\nimport styles from '../../ui/Compose/compose.module.css'\n\ntype ArrayComposeFieldProps = {\n [key: string]: any\n field: ClientField\n path?: string\n schemaPath?: string\n}\n\n/**\n * ArrayComposeField - A version of ComposeField specifically for array fields.\n * Unlike regular fields, arrays don't have focus events, so this component\n * renders the Compose button immediately (always visible).\n */\nexport const ArrayComposeField = (props: ArrayComposeFieldProps) => {\n const { collectionSlug } = useDocumentInfo()\n\n const finalSchemaPath =\n props?.schemaPath ??\n (collectionSlug ? `${collectionSlug}.${props?.path ?? ''}` : (props?.path ?? ''))\n\n const {\n id: instructionId,\n disabled,\n hasInstructions,\n isConfigAllowed,\n } = useInstructions({\n schemaPath: finalSchemaPath,\n })\n\n // Portal target state\n const [portalTarget, setPortalTarget] = React.useState<HTMLElement | null>(null)\n\n // State to track if the \"Add Row\" button is present in the DOM\n const [isAddRowPresent, setIsAddRowPresent] = React.useState(true)\n\n React.useEffect(() => {\n if (props.field && 'name' in props.field) {\n const fieldId = `field-${props.field.name}`\n const fieldElement = document.getElementById(fieldId)\n \n if (fieldElement) {\n fieldElement.classList.add(styles.arrayFieldWrapper)\n // Force relative position via inline style to prevent class application delays/overrides\n fieldElement.style.position = 'relative'\n setPortalTarget(fieldElement)\n\n // Check initial state\n const checkAddRow = () => {\n const btn = fieldElement.querySelector('.array-field__add-row')\n setIsAddRowPresent(!!btn)\n }\n \n checkAddRow()\n\n // Observe for changes (e.g. when max rows reached and button is removed)\n const observer = new MutationObserver(checkAddRow)\n observer.observe(fieldElement, { childList: true, subtree: true })\n\n return () => observer.disconnect()\n }\n }\n }, [props.field])\n\n const adminDescription = props?.field?.admin || {}\n const description = 'description' in adminDescription ? adminDescription.description : ''\n\n return (\n <FieldProvider\n context={{\n field: props?.field,\n path: props?.path ?? '',\n schemaPath: finalSchemaPath,\n }}\n >\n <div>\n <FieldDescription description={description as any} path={props?.path as string} />\n </div>\n\n {/* Portal the Compose button to the bottom of the field wrapper */}\n {hasInstructions && instructionId && !disabled && portalTarget\n ? createPortal(\n <div \n className={`\n ${styles.composePortal} \n ${isAddRowPresent ? styles.composePortalAbsolute : styles.composePortalStatic}\n `}\n >\n <Compose\n descriptionProps={{\n ...props,\n field: props?.field,\n path: props?.path ?? '',\n schemaPath: finalSchemaPath,\n }}\n forceVisible={true}\n instructionId={instructionId}\n isConfigAllowed={isConfigAllowed}\n />\n </div>,\n portalTarget,\n )\n : null}\n </FieldProvider>\n )\n}\n"],"names":["FieldDescription","useDocumentInfo","React","createPortal","FieldProvider","useInstructions","Compose","styles","ArrayComposeField","props","collectionSlug","finalSchemaPath","schemaPath","path","id","instructionId","disabled","hasInstructions","isConfigAllowed","portalTarget","setPortalTarget","useState","isAddRowPresent","setIsAddRowPresent","useEffect","field","fieldId","name","fieldElement","document","getElementById","classList","add","arrayFieldWrapper","style","position","checkAddRow","btn","querySelector","observer","MutationObserver","observe","childList","subtree","disconnect","adminDescription","admin","description","context","div","className","composePortal","composePortalAbsolute","composePortalStatic","descriptionProps","forceVisible"],"mappings":"AAAA;;AAIA,SAASA,gBAAgB,EAAEC,eAAe,QAAQ,iBAAgB;AAClE,OAAOC,WAAW,QAAO;AACzB,SAASC,YAAY,QAAQ,YAAW;AAExC,SAASC,aAAa,QAAQ,iDAAgD;AAC9E,SAASC,eAAe,QAAQ,0DAAyD;AACzF,SAASC,OAAO,QAAQ,8BAA6B;AACrD,OAAOC,YAAY,sCAAqC;AASxD;;;;CAIC,GACD,OAAO,MAAMC,oBAAoB,CAACC;IAChC,MAAM,EAAEC,cAAc,EAAE,GAAGT;IAE3B,MAAMU,kBACJF,OAAOG,cACNF,CAAAA,iBAAiB,CAAC,EAAEA,eAAe,CAAC,EAAED,OAAOI,QAAQ,GAAG,CAAC,GAAIJ,OAAOI,QAAQ,EAAE;IAEjF,MAAM,EACJC,IAAIC,aAAa,EACjBC,QAAQ,EACRC,eAAe,EACfC,eAAe,EAChB,GAAGb,gBAAgB;QAClBO,YAAYD;IACd;IAEA,sBAAsB;IACtB,MAAM,CAACQ,cAAcC,gBAAgB,GAAGlB,MAAMmB,QAAQ,CAAqB;IAE3E,+DAA+D;IAC/D,MAAM,CAACC,iBAAiBC,mBAAmB,GAAGrB,MAAMmB,QAAQ,CAAC;IAE7DnB,MAAMsB,SAAS,CAAC;QACd,IAAIf,MAAMgB,KAAK,IAAI,UAAUhB,MAAMgB,KAAK,EAAE;YACxC,MAAMC,UAAU,CAAC,MAAM,EAAEjB,MAAMgB,KAAK,CAACE,IAAI,CAAC,CAAC;YAC3C,MAAMC,eAAeC,SAASC,cAAc,CAACJ;YAE7C,IAAIE,cAAc;gBAChBA,aAAaG,SAAS,CAACC,GAAG,CAACzB,OAAO0B,iBAAiB;gBACnD,yFAAyF;gBACzFL,aAAaM,KAAK,CAACC,QAAQ,GAAG;gBAC9Bf,gBAAgBQ;gBAEhB,sBAAsB;gBACtB,MAAMQ,cAAc;oBAClB,MAAMC,MAAMT,aAAaU,aAAa,CAAC;oBACvCf,mBAAmB,CAAC,CAACc;gBACvB;gBAEAD;gBAEA,yEAAyE;gBACzE,MAAMG,WAAW,IAAIC,iBAAiBJ;gBACtCG,SAASE,OAAO,CAACb,cAAc;oBAAEc,WAAW;oBAAMC,SAAS;gBAAK;gBAEhE,OAAO,IAAMJ,SAASK,UAAU;YAClC;QACF;IACF,GAAG;QAACnC,MAAMgB,KAAK;KAAC;IAEhB,MAAMoB,mBAAmBpC,OAAOgB,OAAOqB,SAAS,CAAC;IACjD,MAAMC,cAAc,iBAAiBF,mBAAmBA,iBAAiBE,WAAW,GAAG;IAEvF,qBACE,MAAC3C;QACC4C,SAAS;YACPvB,OAAOhB,OAAOgB;YACdZ,MAAMJ,OAAOI,QAAQ;YACrBD,YAAYD;QACd;;0BAEA,KAACsC;0BACC,cAAA,KAACjD;oBAAiB+C,aAAaA;oBAAoBlC,MAAMJ,OAAOI;;;YAIjEI,mBAAmBF,iBAAiB,CAACC,YAAYG,6BAC9ChB,2BACE,KAAC8C;gBACCC,WAAW,CAAC;gBACV,EAAE3C,OAAO4C,aAAa,CAAC;gBACvB,EAAE7B,kBAAkBf,OAAO6C,qBAAqB,GAAG7C,OAAO8C,mBAAmB,CAAC;cAChF,CAAC;0BAED,cAAA,KAAC/C;oBACCgD,kBAAkB;wBAChB,GAAG7C,KAAK;wBACRgB,OAAOhB,OAAOgB;wBACdZ,MAAMJ,OAAOI,QAAQ;wBACrBD,YAAYD;oBACd;oBACA4C,cAAc;oBACdxC,eAAeA;oBACfG,iBAAiBA;;gBAGrBC,gBAEF;;;AAGV,EAAC"}
@@ -0,0 +1,73 @@
1
+ 'use client';
2
+ import { FieldDescription, useDocumentInfo } from '@payloadcms/ui';
3
+ import React from 'react';
4
+ import { createPortal } from 'react-dom';
5
+ import { FieldProvider } from '../../providers/FieldProvider/FieldProvider.js';
6
+ import { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js';
7
+ import { Compose } from '../../ui/Compose/Compose.js';
8
+ import styles from '../../ui/Compose/compose.module.css';
9
+ /**
10
+ * ArrayComposeField - A version of ComposeField specifically for array fields.
11
+ * Unlike regular fields, arrays don't have focus events, so this component
12
+ * renders the Compose button immediately (always visible).
13
+ */
14
+ export const ArrayComposeField = (props) => {
15
+ const { collectionSlug } = useDocumentInfo();
16
+ const finalSchemaPath = props?.schemaPath ??
17
+ (collectionSlug ? `${collectionSlug}.${props?.path ?? ''}` : (props?.path ?? ''));
18
+ const { id: instructionId, disabled, hasInstructions, isConfigAllowed, } = useInstructions({
19
+ schemaPath: finalSchemaPath,
20
+ });
21
+ // Portal target state
22
+ const [portalTarget, setPortalTarget] = React.useState(null);
23
+ // State to track if the "Add Row" button is present in the DOM
24
+ const [isAddRowPresent, setIsAddRowPresent] = React.useState(true);
25
+ React.useEffect(() => {
26
+ if (props.field && 'name' in props.field) {
27
+ const fieldId = `field-${props.field.name}`;
28
+ const fieldElement = document.getElementById(fieldId);
29
+ if (fieldElement) {
30
+ fieldElement.classList.add(styles.arrayFieldWrapper);
31
+ // Force relative position via inline style to prevent class application delays/overrides
32
+ fieldElement.style.position = 'relative';
33
+ setPortalTarget(fieldElement);
34
+ // Check initial state
35
+ const checkAddRow = () => {
36
+ const btn = fieldElement.querySelector('.array-field__add-row');
37
+ setIsAddRowPresent(!!btn);
38
+ };
39
+ checkAddRow();
40
+ // Observe for changes (e.g. when max rows reached and button is removed)
41
+ const observer = new MutationObserver(checkAddRow);
42
+ observer.observe(fieldElement, { childList: true, subtree: true });
43
+ return () => observer.disconnect();
44
+ }
45
+ }
46
+ }, [props.field]);
47
+ const adminDescription = props?.field?.admin || {};
48
+ const description = 'description' in adminDescription ? adminDescription.description : '';
49
+ return (<FieldProvider context={{
50
+ field: props?.field,
51
+ path: props?.path ?? '',
52
+ schemaPath: finalSchemaPath,
53
+ }}>
54
+ <div>
55
+ <FieldDescription description={description} path={props?.path}/>
56
+ </div>
57
+
58
+ {/* Portal the Compose button to the bottom of the field wrapper */}
59
+ {hasInstructions && instructionId && !disabled && portalTarget
60
+ ? createPortal(<div className={`
61
+ ${styles.composePortal}
62
+ ${isAddRowPresent ? styles.composePortalAbsolute : styles.composePortalStatic}
63
+ `}>
64
+ <Compose descriptionProps={{
65
+ ...props,
66
+ field: props?.field,
67
+ path: props?.path ?? '',
68
+ schemaPath: finalSchemaPath,
69
+ }} forceVisible={true} instructionId={instructionId} isConfigAllowed={isConfigAllowed}/>
70
+ </div>, portalTarget)
71
+ : null}
72
+ </FieldProvider>);
73
+ };
@@ -4,7 +4,7 @@ import { FieldDescription, useDocumentInfo } from '@payloadcms/ui';
4
4
  import React from 'react';
5
5
  import { FieldProvider } from '../../providers/FieldProvider/FieldProvider.js';
6
6
  import { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js';
7
- import { Compose } from '../../ui/Compose/Compose.js';
7
+ import { ComposePlaceholder } from '../../ui/Compose/ComposePlaceholder.js';
8
8
  export const ComposeField = (props)=>{
9
9
  const { collectionSlug } = useDocumentInfo();
10
10
  const finalSchemaPath = props?.schemaPath ?? (collectionSlug ? `${collectionSlug}.${props?.path ?? ''}` : props?.path ?? '');
@@ -20,7 +20,7 @@ export const ComposeField = (props)=>{
20
20
  schemaPath: finalSchemaPath
21
21
  },
22
22
  children: [
23
- hasInstructions && instructionId && !disabled ? /*#__PURE__*/ _jsx(Compose, {
23
+ hasInstructions && instructionId && !disabled ? /*#__PURE__*/ _jsx(ComposePlaceholder, {
24
24
  descriptionProps: {
25
25
  ...props,
26
26
  field: props?.field,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/fields/ComposeField/ComposeField.tsx"],"sourcesContent":["'use client'\n\nimport type { ClientField } from 'payload'\n\nimport { FieldDescription, useDocumentInfo } from '@payloadcms/ui'\nimport React from 'react'\n\nimport { FieldProvider } from '../../providers/FieldProvider/FieldProvider.js'\nimport { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js'\nimport { Compose } from '../../ui/Compose/Compose.js'\n\ntype ComposeFieldProps = {\n [key: string]: any\n field: ClientField\n path?: string\n schemaPath?: string\n}\n\nexport const ComposeField = (props: ComposeFieldProps) => {\n const { collectionSlug } = useDocumentInfo()\n\n const finalSchemaPath =\n props?.schemaPath ??\n (collectionSlug ? `${collectionSlug}.${props?.path ?? ''}` : (props?.path ?? ''))\n\n const {\n id: instructionId,\n disabled,\n hasInstructions,\n isConfigAllowed,\n } = useInstructions({\n schemaPath: finalSchemaPath,\n })\n\n const adminDescription = props?.field?.admin || {}\n const description = \"description\" in adminDescription ? adminDescription.description : \"\"\n\n return (\n <FieldProvider\n context={{\n field: props?.field,\n path: props?.path ?? '',\n schemaPath: finalSchemaPath,\n }}\n >\n {hasInstructions && instructionId && !disabled ? (\n <Compose\n descriptionProps={{\n ...props,\n field: props?.field,\n path: props?.path ?? '',\n schemaPath: finalSchemaPath,\n }}\n instructionId={instructionId}\n isConfigAllowed={isConfigAllowed}\n />\n ) : null}\n\n <div>\n <FieldDescription description={description as any} path={props?.path as string} />\n </div>\n </FieldProvider>\n )\n}\n"],"names":["FieldDescription","useDocumentInfo","React","FieldProvider","useInstructions","Compose","ComposeField","props","collectionSlug","finalSchemaPath","schemaPath","path","id","instructionId","disabled","hasInstructions","isConfigAllowed","adminDescription","field","admin","description","context","descriptionProps","div"],"mappings":"AAAA;;AAIA,SAASA,gBAAgB,EAAEC,eAAe,QAAQ,iBAAgB;AAClE,OAAOC,WAAW,QAAO;AAEzB,SAASC,aAAa,QAAQ,iDAAgD;AAC9E,SAASC,eAAe,QAAQ,0DAAyD;AACzF,SAASC,OAAO,QAAQ,8BAA6B;AASrD,OAAO,MAAMC,eAAe,CAACC;IAC3B,MAAM,EAAEC,cAAc,EAAE,GAAGP;IAE3B,MAAMQ,kBACJF,OAAOG,cACNF,CAAAA,iBAAiB,CAAC,EAAEA,eAAe,CAAC,EAAED,OAAOI,QAAQ,GAAG,CAAC,GAAIJ,OAAOI,QAAQ,EAAE;IAEjF,MAAM,EACJC,IAAIC,aAAa,EACjBC,QAAQ,EACRC,eAAe,EACfC,eAAe,EAChB,GAAGZ,gBAAgB;QAClBM,YAAYD;IACd;IAEA,MAAMQ,mBAAmBV,OAAOW,OAAOC,SAAS,CAAC;IACjD,MAAMC,cAAc,iBAAiBH,mBAAmBA,iBAAiBG,WAAW,GAAG;IAEvF,qBACE,MAACjB;QACCkB,SAAS;YACPH,OAAOX,OAAOW;YACdP,MAAMJ,OAAOI,QAAQ;YACrBD,YAAYD;QACd;;YAECM,mBAAmBF,iBAAiB,CAACC,yBACpC,KAACT;gBACCiB,kBAAkB;oBAChB,GAAGf,KAAK;oBACRW,OAAOX,OAAOW;oBACdP,MAAMJ,OAAOI,QAAQ;oBACrBD,YAAYD;gBACd;gBACAI,eAAeA;gBACfG,iBAAiBA;iBAEjB;0BAEJ,KAACO;0BACC,cAAA,KAACvB;oBAAiBoB,aAAaA;oBAAoBT,MAAMJ,OAAOI;;;;;AAIxE,EAAC"}
1
+ {"version":3,"sources":["../../../src/fields/ComposeField/ComposeField.tsx"],"sourcesContent":["'use client'\n\nimport type { ClientField } from 'payload'\n\nimport { FieldDescription, useDocumentInfo } from '@payloadcms/ui'\nimport React from 'react'\n\nimport { FieldProvider } from '../../providers/FieldProvider/FieldProvider.js'\nimport { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js'\nimport { ComposePlaceholder } from '../../ui/Compose/ComposePlaceholder.js'\n\ntype ComposeFieldProps = {\n [key: string]: any\n field: ClientField\n path?: string\n schemaPath?: string\n}\n\nexport const ComposeField = (props: ComposeFieldProps) => {\n const { collectionSlug } = useDocumentInfo()\n\n const finalSchemaPath =\n props?.schemaPath ??\n (collectionSlug ? `${collectionSlug}.${props?.path ?? ''}` : (props?.path ?? ''))\n\n const {\n id: instructionId,\n disabled,\n hasInstructions,\n isConfigAllowed,\n } = useInstructions({\n schemaPath: finalSchemaPath,\n })\n\n const adminDescription = props?.field?.admin || {}\n const description = \"description\" in adminDescription ? adminDescription.description : \"\"\n\n return (\n <FieldProvider\n context={{\n field: props?.field,\n path: props?.path ?? '',\n schemaPath: finalSchemaPath,\n }}\n >\n {hasInstructions && instructionId && !disabled ? (\n <ComposePlaceholder\n descriptionProps={{\n ...props,\n field: props?.field,\n path: props?.path ?? '',\n schemaPath: finalSchemaPath,\n }}\n instructionId={instructionId}\n isConfigAllowed={isConfigAllowed}\n />\n ) : null}\n\n <div>\n <FieldDescription description={description as any} path={props?.path as string} />\n </div>\n </FieldProvider>\n )\n}\n"],"names":["FieldDescription","useDocumentInfo","React","FieldProvider","useInstructions","ComposePlaceholder","ComposeField","props","collectionSlug","finalSchemaPath","schemaPath","path","id","instructionId","disabled","hasInstructions","isConfigAllowed","adminDescription","field","admin","description","context","descriptionProps","div"],"mappings":"AAAA;;AAIA,SAASA,gBAAgB,EAAEC,eAAe,QAAQ,iBAAgB;AAClE,OAAOC,WAAW,QAAO;AAEzB,SAASC,aAAa,QAAQ,iDAAgD;AAC9E,SAASC,eAAe,QAAQ,0DAAyD;AACzF,SAASC,kBAAkB,QAAQ,yCAAwC;AAS3E,OAAO,MAAMC,eAAe,CAACC;IAC3B,MAAM,EAAEC,cAAc,EAAE,GAAGP;IAE3B,MAAMQ,kBACJF,OAAOG,cACNF,CAAAA,iBAAiB,CAAC,EAAEA,eAAe,CAAC,EAAED,OAAOI,QAAQ,GAAG,CAAC,GAAIJ,OAAOI,QAAQ,EAAE;IAEjF,MAAM,EACJC,IAAIC,aAAa,EACjBC,QAAQ,EACRC,eAAe,EACfC,eAAe,EAChB,GAAGZ,gBAAgB;QAClBM,YAAYD;IACd;IAEA,MAAMQ,mBAAmBV,OAAOW,OAAOC,SAAS,CAAC;IACjD,MAAMC,cAAc,iBAAiBH,mBAAmBA,iBAAiBG,WAAW,GAAG;IAEvF,qBACE,MAACjB;QACCkB,SAAS;YACPH,OAAOX,OAAOW;YACdP,MAAMJ,OAAOI,QAAQ;YACrBD,YAAYD;QACd;;YAECM,mBAAmBF,iBAAiB,CAACC,yBACpC,KAACT;gBACCiB,kBAAkB;oBAChB,GAAGf,KAAK;oBACRW,OAAOX,OAAOW;oBACdP,MAAMJ,OAAOI,QAAQ;oBACrBD,YAAYD;gBACd;gBACAI,eAAeA;gBACfG,iBAAiBA;iBAEjB;0BAEJ,KAACO;0BACC,cAAA,KAACvB;oBAAiBoB,aAAaA;oBAAoBT,MAAMJ,OAAOI;;;;;AAIxE,EAAC"}
@@ -3,7 +3,7 @@ import { FieldDescription, useDocumentInfo } from '@payloadcms/ui';
3
3
  import React from 'react';
4
4
  import { FieldProvider } from '../../providers/FieldProvider/FieldProvider.js';
5
5
  import { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js';
6
- import { Compose } from '../../ui/Compose/Compose.js';
6
+ import { ComposePlaceholder } from '../../ui/Compose/ComposePlaceholder.js';
7
7
  export const ComposeField = (props) => {
8
8
  const { collectionSlug } = useDocumentInfo();
9
9
  const finalSchemaPath = props?.schemaPath ??
@@ -18,7 +18,7 @@ export const ComposeField = (props) => {
18
18
  path: props?.path ?? '',
19
19
  schemaPath: finalSchemaPath,
20
20
  }}>
21
- {hasInstructions && instructionId && !disabled ? (<Compose descriptionProps={{
21
+ {hasInstructions && instructionId && !disabled ? (<ComposePlaceholder descriptionProps={{
22
22
  ...props,
23
23
  field: props?.field,
24
24
  path: props?.path ?? '',