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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (341) hide show
  1. package/dist/ai/core/generateObject.js +1 -4
  2. package/dist/ai/core/generateObject.js.map +1 -1
  3. package/dist/ai/core/generateText.js +1 -5
  4. package/dist/ai/core/generateText.js.map +1 -1
  5. package/dist/ai/core/media/generateMedia.js +1 -4
  6. package/dist/ai/core/media/generateMedia.js.map +1 -1
  7. package/dist/ai/core/media/image/generateImage.js +4 -14
  8. package/dist/ai/core/media/image/generateImage.js.map +1 -1
  9. package/dist/ai/core/media/image/handlers/multimodal.js +7 -24
  10. package/dist/ai/core/media/image/handlers/multimodal.js.map +1 -1
  11. package/dist/ai/core/media/image/handlers/standard.js +7 -2
  12. package/dist/ai/core/media/image/handlers/standard.js.map +1 -1
  13. package/dist/ai/core/media/speech/generateSpeech.js +2 -3
  14. package/dist/ai/core/media/speech/generateSpeech.js.map +1 -1
  15. package/dist/ai/core/media/types.d.ts +2 -3
  16. package/dist/ai/core/media/types.js.map +1 -1
  17. package/dist/ai/core/streamObject.js +0 -3
  18. package/dist/ai/core/streamObject.js.map +1 -1
  19. package/dist/ai/core/streamText.js +1 -4
  20. package/dist/ai/core/streamText.js.map +1 -1
  21. package/dist/ai/core/types.d.ts +2 -2
  22. package/dist/ai/core/types.js.map +1 -1
  23. package/dist/ai/providers/blocks/anthropic.js +2 -44
  24. package/dist/ai/providers/blocks/anthropic.js.map +1 -1
  25. package/dist/ai/providers/blocks/elevenlabs.js +4 -109
  26. package/dist/ai/providers/blocks/elevenlabs.js.map +1 -1
  27. package/dist/ai/providers/blocks/fal.js +2 -120
  28. package/dist/ai/providers/blocks/fal.js.map +1 -1
  29. package/dist/ai/providers/blocks/google.js +6 -240
  30. package/dist/ai/providers/blocks/google.js.map +1 -1
  31. package/dist/ai/providers/blocks/openai-compatible.js +2 -146
  32. package/dist/ai/providers/blocks/openai-compatible.js.map +1 -1
  33. package/dist/ai/providers/blocks/openai.js +2 -202
  34. package/dist/ai/providers/blocks/openai.js.map +1 -1
  35. package/dist/ai/providers/blocks/xai.js +2 -55
  36. package/dist/ai/providers/blocks/xai.js.map +1 -1
  37. package/dist/ai/providers/index.d.ts +1 -1
  38. package/dist/ai/providers/index.js +0 -2
  39. package/dist/ai/providers/index.js.map +1 -1
  40. package/dist/ai/providers/registry.d.ts +24 -28
  41. package/dist/ai/providers/registry.js +184 -138
  42. package/dist/ai/providers/registry.js.map +1 -1
  43. package/dist/ai/providers/types.d.ts +12 -33
  44. package/dist/ai/providers/types.js +0 -1
  45. package/dist/ai/providers/types.js.map +1 -1
  46. package/dist/ai/schemas/lexicalJsonSchema.js +1 -1
  47. package/dist/ai/schemas/lexicalJsonSchema.js.map +1 -1
  48. package/dist/ai/utilities/filterEditorSchemaByNodes.js.map +1 -0
  49. package/dist/ai/utilities/generateFileNameByPrompt.js.map +1 -0
  50. package/dist/ai/utilities/isObjectSchema.js.map +1 -0
  51. package/dist/ai/{utils → utilities}/nodeToSchemaMap.js +6 -6
  52. package/dist/ai/utilities/nodeToSchemaMap.js.map +1 -0
  53. package/dist/ai/{prompts.d.ts → utilities/prompts.d.ts} +1 -1
  54. package/dist/ai/utilities/prompts.js.map +1 -0
  55. package/dist/ai/utilities/systemGenerate.js.map +1 -0
  56. package/dist/collections/AIJobs.js +3 -12
  57. package/dist/collections/AIJobs.js.map +1 -1
  58. package/dist/collections/AIProviders.js +56 -29
  59. package/dist/collections/AIProviders.js.map +1 -1
  60. package/dist/collections/Instructions.js +91 -59
  61. package/dist/collections/Instructions.js.map +1 -1
  62. package/dist/collections/shared.d.ts +30 -0
  63. package/dist/collections/shared.js +15 -0
  64. package/dist/collections/shared.js.map +1 -0
  65. package/dist/endpoints/fetchFields.js +14 -6
  66. package/dist/endpoints/fetchFields.js.map +1 -1
  67. package/dist/endpoints/fetchVoices.js +1 -1
  68. package/dist/endpoints/fetchVoices.js.map +1 -1
  69. package/dist/endpoints/generate.d.ts +7 -0
  70. package/dist/endpoints/generate.js +268 -0
  71. package/dist/endpoints/generate.js.map +1 -0
  72. package/dist/endpoints/index.js +9 -639
  73. package/dist/endpoints/index.js.map +1 -1
  74. package/dist/endpoints/promptMentions.d.ts +2 -0
  75. package/dist/endpoints/promptMentions.js +166 -0
  76. package/dist/endpoints/promptMentions.js.map +1 -0
  77. package/dist/endpoints/upload.d.ts +7 -0
  78. package/dist/endpoints/upload.js +294 -0
  79. package/dist/endpoints/upload.js.map +1 -0
  80. package/dist/endpoints/videogenWebhook.d.ts +7 -0
  81. package/dist/endpoints/videogenWebhook.js +132 -0
  82. package/dist/endpoints/videogenWebhook.js.map +1 -0
  83. package/dist/exports/client.d.ts +2 -1
  84. package/dist/exports/client.js +2 -1
  85. package/dist/exports/client.js.map +1 -1
  86. package/dist/exports/fields.d.ts +2 -1
  87. package/dist/exports/fields.js +2 -1
  88. package/dist/exports/fields.js.map +1 -1
  89. package/dist/fields/ArrayComposeField/ArrayComposeField.js +1 -1
  90. package/dist/fields/ArrayComposeField/ArrayComposeField.js.map +1 -1
  91. package/dist/fields/ArrayComposeField/ArrayComposeField.jsx +1 -1
  92. package/dist/fields/ComposeField/ComposeField.d.ts +1 -0
  93. package/dist/fields/ComposeField/ComposeField.js +18 -8
  94. package/dist/fields/ComposeField/ComposeField.js.map +1 -1
  95. package/dist/fields/ComposeField/ComposeField.jsx +12 -7
  96. package/dist/fields/LexicalEditor/feature.server.js +1 -1
  97. package/dist/fields/LexicalEditor/feature.server.js.map +1 -1
  98. package/dist/fields/PromptEditorField/feature.client.d.ts +1 -0
  99. package/dist/fields/PromptEditorField/feature.client.js +173 -0
  100. package/dist/fields/PromptEditorField/feature.client.js.map +1 -0
  101. package/dist/fields/PromptEditorField/feature.client.jsx +148 -0
  102. package/dist/fields/PromptEditorField/feature.server.d.ts +1 -0
  103. package/dist/fields/PromptEditorField/feature.server.js +30 -0
  104. package/dist/fields/PromptEditorField/feature.server.js.map +1 -0
  105. package/dist/fields/PromptField.d.ts +4 -0
  106. package/dist/fields/PromptField.js +18 -0
  107. package/dist/fields/PromptField.js.map +1 -0
  108. package/dist/fields/SelectField/SelectField.js +0 -1
  109. package/dist/fields/SelectField/SelectField.js.map +1 -1
  110. package/dist/fields/SelectField/SelectField.jsx +0 -1
  111. package/dist/index.d.ts +4 -3
  112. package/dist/index.js +4 -2
  113. package/dist/index.js.map +1 -1
  114. package/dist/libraries/handlebars/helpers.js +2 -2
  115. package/dist/libraries/handlebars/helpers.js.map +1 -1
  116. package/dist/libraries/handlebars/replacePlaceholders.js +5 -1
  117. package/dist/libraries/handlebars/replacePlaceholders.js.map +1 -1
  118. package/dist/payload-ai.d.ts +5 -19
  119. package/dist/plugin.js +18 -21
  120. package/dist/plugin.js.map +1 -1
  121. package/dist/providers/FieldProvider/FieldProvider.js +11 -20
  122. package/dist/providers/FieldProvider/FieldProvider.js.map +1 -1
  123. package/dist/providers/FieldProvider/FieldProvider.jsx +8 -18
  124. package/dist/providers/InstructionsProvider/InstructionsProvider.js +5 -2
  125. package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
  126. package/dist/providers/InstructionsProvider/InstructionsProvider.jsx +5 -2
  127. package/dist/translations/de.json +47 -0
  128. package/dist/translations/en.json +45 -2
  129. package/dist/translations/es.json +45 -2
  130. package/dist/translations/fa.json +45 -2
  131. package/dist/translations/fr.json +46 -3
  132. package/dist/translations/hi.json +47 -0
  133. package/dist/translations/index.d.ts +88 -26
  134. package/dist/translations/index.js +18 -32
  135. package/dist/translations/index.js.map +1 -1
  136. package/dist/translations/ja.json +47 -0
  137. package/dist/translations/nb.json +47 -0
  138. package/dist/translations/nl.json +47 -0
  139. package/dist/translations/pl.json +45 -2
  140. package/dist/translations/pt.json +47 -0
  141. package/dist/translations/ru.json +45 -2
  142. package/dist/translations/th.json +47 -0
  143. package/dist/translations/translation-schema.json +184 -11
  144. package/dist/translations/uk.json +45 -2
  145. package/dist/translations/zh.json +47 -0
  146. package/dist/types.d.ts +64 -28
  147. package/dist/types.js.map +1 -1
  148. package/dist/ui/Compose/Compose.js +42 -79
  149. package/dist/ui/Compose/Compose.js.map +1 -1
  150. package/dist/ui/Compose/Compose.jsx +32 -86
  151. package/dist/ui/Compose/ComposePlaceholder.js +1 -1
  152. package/dist/ui/Compose/ComposePlaceholder.js.map +1 -1
  153. package/dist/ui/Compose/ComposePlaceholder.jsx +1 -1
  154. package/dist/ui/Compose/{compose.module.css → compose.module.scss} +3 -5
  155. package/dist/ui/Compose/hooks/menu/Item.d.ts +1 -1
  156. package/dist/ui/Compose/hooks/menu/Item.js +7 -3
  157. package/dist/ui/Compose/hooks/menu/Item.js.map +1 -1
  158. package/dist/ui/Compose/hooks/menu/Item.jsx +11 -5
  159. package/dist/ui/Compose/hooks/menu/TranslateMenu.js +15 -5
  160. package/dist/ui/Compose/hooks/menu/TranslateMenu.js.map +1 -1
  161. package/dist/ui/Compose/hooks/menu/TranslateMenu.jsx +11 -5
  162. package/dist/ui/Compose/hooks/menu/items.d.ts +8 -8
  163. package/dist/ui/Compose/hooks/menu/itemsMap.d.ts +2 -1
  164. package/dist/ui/Compose/hooks/menu/itemsMap.js.map +1 -1
  165. package/dist/ui/Compose/hooks/menu/types.d.ts +21 -0
  166. package/dist/ui/Compose/hooks/menu/types.js +3 -0
  167. package/dist/ui/Compose/hooks/menu/types.js.map +1 -0
  168. package/dist/ui/Compose/hooks/menu/useMenu.d.ts +2 -2
  169. package/dist/ui/Compose/hooks/menu/useMenu.js +45 -23
  170. package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
  171. package/dist/ui/Compose/hooks/menu/useMenu.jsx +43 -23
  172. package/dist/ui/Compose/hooks/mergeGeneratedValue.d.ts +14 -0
  173. package/dist/ui/Compose/hooks/mergeGeneratedValue.js +38 -0
  174. package/dist/ui/Compose/hooks/mergeGeneratedValue.js.map +1 -0
  175. package/dist/ui/Compose/hooks/useGenerate.js +37 -12
  176. package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
  177. package/dist/ui/Compose/hooks/useGenerateUpload.js +66 -24
  178. package/dist/ui/Compose/hooks/useGenerateUpload.js.map +1 -1
  179. package/dist/ui/Compose/hooks/useHistory.js +1 -1
  180. package/dist/ui/Compose/hooks/useHistory.js.map +1 -1
  181. package/dist/ui/Compose/hooks/useStreamingUpdate.js +4 -4
  182. package/dist/ui/Compose/hooks/useStreamingUpdate.js.map +1 -1
  183. package/dist/ui/ConfigDashboard/configDashboard.module.css +94 -0
  184. package/dist/ui/ConfigDashboard/index.js +27 -92
  185. package/dist/ui/ConfigDashboard/index.js.map +1 -1
  186. package/dist/ui/ConfigDashboard/index.jsx +24 -77
  187. package/dist/ui/DynamicModelSelect/index.js +6 -27
  188. package/dist/ui/DynamicModelSelect/index.js.map +1 -1
  189. package/dist/ui/DynamicModelSelect/index.jsx +6 -29
  190. package/dist/ui/DynamicProviderSelect/index.js +6 -27
  191. package/dist/ui/DynamicProviderSelect/index.js.map +1 -1
  192. package/dist/ui/DynamicProviderSelect/index.jsx +6 -29
  193. package/dist/ui/DynamicVoiceSelect/index.js +34 -83
  194. package/dist/ui/DynamicVoiceSelect/index.js.map +1 -1
  195. package/dist/ui/DynamicVoiceSelect/index.jsx +16 -53
  196. package/dist/ui/GlobalProviderOptions/index.d.ts +2 -0
  197. package/dist/ui/GlobalProviderOptions/index.js +118 -0
  198. package/dist/ui/GlobalProviderOptions/index.js.map +1 -0
  199. package/dist/ui/GlobalProviderOptions/index.jsx +60 -0
  200. package/dist/ui/Icons/Icons.js +1 -1
  201. package/dist/ui/Icons/Icons.js.map +1 -1
  202. package/dist/ui/Icons/Icons.jsx +1 -1
  203. package/dist/ui/Icons/LottieAnimation.js +1 -1
  204. package/dist/ui/Icons/LottieAnimation.js.map +1 -1
  205. package/dist/ui/Icons/LottieAnimation.jsx +1 -1
  206. package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.d.ts +12 -0
  207. package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.js +166 -0
  208. package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.js.map +1 -0
  209. package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.jsx +83 -0
  210. package/dist/ui/InstructionProviderOptions/index.d.ts +2 -0
  211. package/dist/ui/InstructionProviderOptions/index.js +157 -0
  212. package/dist/ui/InstructionProviderOptions/index.js.map +1 -0
  213. package/dist/ui/InstructionProviderOptions/index.jsx +92 -0
  214. package/dist/ui/VoicesFetcher/index.js.map +1 -1
  215. package/dist/ui/hooks/useAISettings.d.ts +26 -0
  216. package/dist/ui/hooks/useAISettings.js +73 -0
  217. package/dist/ui/hooks/useAISettings.js.map +1 -0
  218. package/dist/ui/providerOptions/updateProviderOptionsValue.d.ts +6 -0
  219. package/dist/ui/providerOptions/updateProviderOptionsValue.js +50 -0
  220. package/dist/ui/providerOptions/updateProviderOptionsValue.js.map +1 -0
  221. package/dist/ui/shared/handleSelectChange.d.ts +5 -0
  222. package/dist/ui/shared/handleSelectChange.js +12 -0
  223. package/dist/ui/shared/handleSelectChange.js.map +1 -0
  224. package/dist/ui/shared/types.d.ts +11 -0
  225. package/dist/ui/shared/types.js +5 -0
  226. package/dist/ui/shared/types.js.map +1 -0
  227. package/dist/utilities/ai/resolveEffectiveInstructionSettings.d.ts +15 -0
  228. package/dist/utilities/ai/resolveEffectiveInstructionSettings.js +136 -0
  229. package/dist/utilities/ai/resolveEffectiveInstructionSettings.js.map +1 -0
  230. package/dist/{endpoints → utilities}/buildPromptUtils.js +14 -5
  231. package/dist/utilities/buildPromptUtils.js.map +1 -0
  232. package/dist/utilities/buildSmartPrompt.js +3 -3
  233. package/dist/utilities/buildSmartPrompt.js.map +1 -1
  234. package/dist/utilities/fields/fieldToJsonSchema.js.map +1 -0
  235. package/dist/utilities/fields/getFieldBySchemaPath.js.map +1 -0
  236. package/dist/utilities/fields/getFieldInfo.js.map +1 -0
  237. package/dist/utilities/{updateFieldsConfig.js → fields/updateFieldsConfig.js} +8 -3
  238. package/dist/utilities/fields/updateFieldsConfig.js.map +1 -0
  239. package/dist/utilities/images/extractImageData.js.map +1 -0
  240. package/dist/utilities/images/extractPromptAttachments.js.map +1 -0
  241. package/dist/utilities/{fetchImages.d.ts → images/fetchImages.d.ts} +1 -1
  242. package/dist/utilities/images/fetchImages.js +49 -0
  243. package/dist/utilities/images/fetchImages.js.map +1 -0
  244. package/dist/utilities/images/resolveImageReferences.js +183 -0
  245. package/dist/utilities/images/resolveImageReferences.js.map +1 -0
  246. package/dist/utilities/init/autoSetupProviders.d.ts +3 -0
  247. package/dist/utilities/init/autoSetupProviders.js +216 -0
  248. package/dist/utilities/init/autoSetupProviders.js.map +1 -0
  249. package/dist/utilities/lexical/editorSchemaValidator.js.map +1 -0
  250. package/dist/utilities/lexical/lexicalToHTML.js.map +1 -0
  251. package/dist/utilities/lexical/lexicalToPromptTemplate.d.ts +2 -0
  252. package/dist/utilities/lexical/lexicalToPromptTemplate.js +50 -0
  253. package/dist/utilities/lexical/lexicalToPromptTemplate.js.map +1 -0
  254. package/dist/utilities/lexical/setSafeLexicalState.js.map +1 -0
  255. package/dist/utilities/lexical/stringToLexicalJSON.d.ts +2 -0
  256. package/dist/utilities/lexical/stringToLexicalJSON.js +39 -0
  257. package/dist/utilities/lexical/stringToLexicalJSON.js.map +1 -0
  258. package/dist/utilities/sanitizeLog.d.ts +1 -0
  259. package/dist/utilities/sanitizeLog.js +39 -0
  260. package/dist/utilities/sanitizeLog.js.map +1 -0
  261. package/dist/utilities/seedProperties.js +54 -22
  262. package/dist/utilities/seedProperties.js.map +1 -1
  263. package/package.json +36 -2
  264. package/dist/ai/analyse.d.ts +0 -1
  265. package/dist/ai/analyse.js +0 -3
  266. package/dist/ai/analyse.js.map +0 -1
  267. package/dist/ai/index.d.ts +0 -11
  268. package/dist/ai/index.js +0 -25
  269. package/dist/ai/index.js.map +0 -1
  270. package/dist/ai/prompts.js.map +0 -1
  271. package/dist/ai/utils/filterEditorSchemaByNodes.js.map +0 -1
  272. package/dist/ai/utils/generateFileNameByPrompt.js.map +0 -1
  273. package/dist/ai/utils/isObjectSchema.js.map +0 -1
  274. package/dist/ai/utils/nodeToSchemaMap.js.map +0 -1
  275. package/dist/ai/utils/systemGenerate.js.map +0 -1
  276. package/dist/endpoints/buildPromptUtils.js.map +0 -1
  277. package/dist/endpoints/chat.d.ts +0 -4
  278. package/dist/fields/PromptEditorField/PromptEditorField.d.ts +0 -3
  279. package/dist/fields/PromptEditorField/PromptEditorField.js +0 -217
  280. package/dist/fields/PromptEditorField/PromptEditorField.js.map +0 -1
  281. package/dist/fields/PromptEditorField/PromptEditorField.jsx +0 -160
  282. package/dist/ui/AIConfigDashboard/index.d.ts +0 -2
  283. package/dist/ui/AIConfigDashboard/index.js +0 -224
  284. package/dist/ui/AIConfigDashboard/index.js.map +0 -1
  285. package/dist/ui/AIConfigDashboard/index.jsx +0 -175
  286. package/dist/ui/ProviderOptionsEditor/index.d.ts +0 -7
  287. package/dist/ui/ProviderOptionsEditor/index.js +0 -291
  288. package/dist/ui/ProviderOptionsEditor/index.js.map +0 -1
  289. package/dist/ui/ProviderOptionsEditor/index.jsx +0 -210
  290. package/dist/utilities/editorSchemaValidator.js.map +0 -1
  291. package/dist/utilities/extractImageData.js.map +0 -1
  292. package/dist/utilities/extractPromptAttachments.js.map +0 -1
  293. package/dist/utilities/fetchImages.js +0 -38
  294. package/dist/utilities/fetchImages.js.map +0 -1
  295. package/dist/utilities/fieldToJsonSchema.js.map +0 -1
  296. package/dist/utilities/getFieldBySchemaPath.js.map +0 -1
  297. package/dist/utilities/getFieldInfo.js.map +0 -1
  298. package/dist/utilities/getProviderOptionsFields.d.ts +0 -16
  299. package/dist/utilities/getProviderOptionsFields.js +0 -80
  300. package/dist/utilities/getProviderOptionsFields.js.map +0 -1
  301. package/dist/utilities/isPluginActivated.d.ts +0 -2
  302. package/dist/utilities/isPluginActivated.js +0 -5
  303. package/dist/utilities/isPluginActivated.js.map +0 -1
  304. package/dist/utilities/lexicalToHTML.js.map +0 -1
  305. package/dist/utilities/resolveImageReferences.js +0 -167
  306. package/dist/utilities/resolveImageReferences.js.map +0 -1
  307. package/dist/utilities/schemaConverter.d.ts +0 -3
  308. package/dist/utilities/schemaConverter.js +0 -93
  309. package/dist/utilities/schemaConverter.js.map +0 -1
  310. package/dist/utilities/setSafeLexicalState.js.map +0 -1
  311. package/dist/utilities/updateFieldsConfig.js.map +0 -1
  312. /package/dist/ai/{utils → utilities}/filterEditorSchemaByNodes.d.ts +0 -0
  313. /package/dist/ai/{utils → utilities}/filterEditorSchemaByNodes.js +0 -0
  314. /package/dist/ai/{utils → utilities}/generateFileNameByPrompt.d.ts +0 -0
  315. /package/dist/ai/{utils → utilities}/generateFileNameByPrompt.js +0 -0
  316. /package/dist/ai/{utils → utilities}/isObjectSchema.d.ts +0 -0
  317. /package/dist/ai/{utils → utilities}/isObjectSchema.js +0 -0
  318. /package/dist/ai/{utils → utilities}/nodeToSchemaMap.d.ts +0 -0
  319. /package/dist/ai/{prompts.js → utilities/prompts.js} +0 -0
  320. /package/dist/ai/{utils → utilities}/systemGenerate.d.ts +0 -0
  321. /package/dist/ai/{utils → utilities}/systemGenerate.js +0 -0
  322. /package/dist/ui/Icons/{icons.module.css → icons.module.scss} +0 -0
  323. /package/dist/{endpoints → utilities}/buildPromptUtils.d.ts +0 -0
  324. /package/dist/utilities/{fieldToJsonSchema.d.ts → fields/fieldToJsonSchema.d.ts} +0 -0
  325. /package/dist/utilities/{fieldToJsonSchema.js → fields/fieldToJsonSchema.js} +0 -0
  326. /package/dist/utilities/{getFieldBySchemaPath.d.ts → fields/getFieldBySchemaPath.d.ts} +0 -0
  327. /package/dist/utilities/{getFieldBySchemaPath.js → fields/getFieldBySchemaPath.js} +0 -0
  328. /package/dist/utilities/{getFieldInfo.d.ts → fields/getFieldInfo.d.ts} +0 -0
  329. /package/dist/utilities/{getFieldInfo.js → fields/getFieldInfo.js} +0 -0
  330. /package/dist/utilities/{updateFieldsConfig.d.ts → fields/updateFieldsConfig.d.ts} +0 -0
  331. /package/dist/utilities/{extractImageData.d.ts → images/extractImageData.d.ts} +0 -0
  332. /package/dist/utilities/{extractImageData.js → images/extractImageData.js} +0 -0
  333. /package/dist/utilities/{extractPromptAttachments.d.ts → images/extractPromptAttachments.d.ts} +0 -0
  334. /package/dist/utilities/{extractPromptAttachments.js → images/extractPromptAttachments.js} +0 -0
  335. /package/dist/utilities/{resolveImageReferences.d.ts → images/resolveImageReferences.d.ts} +0 -0
  336. /package/dist/utilities/{editorSchemaValidator.d.ts → lexical/editorSchemaValidator.d.ts} +0 -0
  337. /package/dist/utilities/{editorSchemaValidator.js → lexical/editorSchemaValidator.js} +0 -0
  338. /package/dist/utilities/{lexicalToHTML.d.ts → lexical/lexicalToHTML.d.ts} +0 -0
  339. /package/dist/utilities/{lexicalToHTML.js → lexical/lexicalToHTML.js} +0 -0
  340. /package/dist/utilities/{setSafeLexicalState.d.ts → lexical/setSafeLexicalState.d.ts} +0 -0
  341. /package/dist/utilities/{setSafeLexicalState.js → lexical/setSafeLexicalState.js} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/endpoints/upload.ts"],"sourcesContent":["import type { ImagePart } from 'ai'\nimport type { Field, PayloadRequest } from 'payload'\n\nimport * as process from 'node:process'\n\nimport type { PluginConfig } from '../types.js'\n\nimport { checkAccess } from '../access/checkAccess.js'\nimport {\n PLUGIN_AI_JOBS_TABLE,\n PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK,\n PLUGIN_INSTRUCTIONS_TABLE,\n} from '../defaults.js'\nimport { registerEditorHelper } from '../libraries/handlebars/helpers.js'\nimport { replacePlaceholders } from '../libraries/handlebars/replacePlaceholders.js'\nimport { resolveEffectiveInstructionSettings } from '../utilities/ai/resolveEffectiveInstructionSettings.js'\nimport { extendContextWithPromptFields } from '../utilities/buildPromptUtils.js'\nimport { buildSmartPrompt, isGenericPrompt } from '../utilities/buildSmartPrompt.js'\nimport { getFieldBySchemaPath } from '../utilities/fields/getFieldBySchemaPath.js'\nimport { extractImageData } from '../utilities/images/extractImageData.js'\nimport { type FetchableImage, fetchImages } from '../utilities/images/fetchImages.js'\nimport { resolveImageReferences } from '../utilities/images/resolveImageReferences.js'\nimport { lexicalToPromptTemplate } from '../utilities/lexical/lexicalToPromptTemplate.js'\nimport { sanitizeLog } from '../utilities/sanitizeLog.js'\n\n/**\n * Image/video/audio upload generation endpoint handler.\n * Uses payload.ai.generateMedia for media generation.\n */\nexport const uploadHandler = (pluginConfig: PluginConfig) => async (req: PayloadRequest) => {\n try {\n // Check authentication and authorization first\n // await checkAccess(req, pluginConfig)\n\n const data = await req.json?.()\n\n const { collectionSlug, documentId, options } = data\n const { instructionId } = options\n let docData = {}\n\n if (documentId) {\n try {\n docData = await req.payload.findByID({\n id: documentId,\n collection: collectionSlug as string,\n draft: true,\n req, // Pass req to ensure access control is applied\n })\n } catch (e) {\n req.payload.logger.error(\n e,\n '— AI Plugin: Error fetching document, you should try again after enabling drafts for this collection',\n )\n }\n }\n\n const contextData = {\n ...docData,\n ...data.doc,\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\n // Convert Lexical JSON to string template if needed\n if (promptTemplate && typeof promptTemplate === 'object') {\n promptTemplate = lexicalToPromptTemplate(promptTemplate)\n }\n\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\n if (pluginConfig.debugging) {\n req.payload.logger.info(\n sanitizeLog({\n contextDataKeys: Object.keys(contextData),\n contextDataSample: Object.fromEntries(\n Object.entries(contextData).map(([k, v]) => [\n k,\n typeof v === 'object' ? `[object]` : v,\n ]),\n ),\n promptTemplate,\n }),\n `— AI Plugin: DEBUG upload context before replacePlaceholders`,\n )\n }\n\n const text = await replacePlaceholders(promptTemplate as string, extendedContext)\n const uploadCollectionSlug = instructions['relation-to']\n\n // Resolve @field:filename references from the prompt\n const { images: resolvedImages, processedPrompt } = await resolveImageReferences(\n text,\n contextData,\n req,\n collectionSlug,\n )\n\n // Extract hardcoded URLs from the processed prompt and merge with resolved images and sample images\n const images = [\n ...extractImageData(processedPrompt),\n ...resolvedImages,\n ...(sampleImages as unknown[]),\n ] as FetchableImage[]\n\n // Process images - convert to ImagePart format using helper\n const editImages: ImagePart[] = await fetchImages(req, images)\n\n let promptToUse = processedPrompt\n let targetField: Field | null | undefined\n\n try {\n const targetCollection = req.payload.config.collections.find((c) => c.slug === collectionSlug)\n if (targetCollection && schemaPath) {\n targetField = getFieldBySchemaPath(targetCollection, schemaPath)\n }\n } catch (e) {\n req.payload.logger.error(e, '— AI Plugin: Error finding field for hooks')\n }\n\n if (targetField && (targetField as any).custom?.ai?.beforeGenerate) {\n const beforeHooks = (targetField as any).custom.ai.beforeGenerate as Array<\n (args: any) => Promise<any>\n >\n for (const hook of beforeHooks) {\n const result = await hook({\n doc: contextData,\n field: targetField,\n headers: req.headers,\n instructions,\n payload: req.payload,\n prompt: promptToUse,\n req,\n })\n\n if (result) {\n if (result.prompt) {\n promptToUse = result.prompt\n }\n if (result.instructions) {\n instructions = {\n ...instructions,\n ...result.instructions,\n }\n }\n }\n }\n }\n\n if (pluginConfig.debugging) {\n req.payload.logger.info(sanitizeLog({ text: promptToUse }), `— AI Plugin: Executing media generation`)\n }\n\n // Prepare callback URL for async jobs\n const serverURL =\n req.payload.config?.serverURL || process.env.SERVER_URL || 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 const modelId = instructions['model-id']\n const aiSettings = await req.payload.findGlobal({\n slug: 'ai-providers',\n context: { unsafe: true },\n })\n const { effectiveSettings: modelSettings, settingsName } = resolveEffectiveInstructionSettings({\n defaults: aiSettings?.defaults as Record<string, unknown> | undefined,\n instructions,\n })\n\n if (!settingsName) {\n throw new Error(`Unsupported model-id: ${modelId}`)\n }\n\n const generateParams = {\n callbackUrl,\n images: editImages,\n instructionId,\n model: modelSettings.model as string,\n prompt: promptToUse,\n provider: modelSettings.provider as string,\n providerOptions: modelSettings,\n ...modelSettings,\n }\n\n if (pluginConfig.debugging) {\n req.payload.logger.info(\n sanitizeLog(generateParams),\n '— AI Plugin: Final generation parameters for media',\n )\n }\n\n // Use payload.ai.generateMedia directly! 🎉\n const result = await req.payload.ai.generateMedia(generateParams)\n\n if (targetField && (targetField as any).custom?.ai?.afterGenerate) {\n const afterHooks = (targetField as any).custom.ai.afterGenerate as Array<\n (args: any) => Promise<any>\n >\n for (const hook of afterHooks) {\n await hook({\n doc: contextData,\n field: targetField,\n headers: req.headers,\n instructions,\n payload: req.payload,\n req,\n result,\n })\n }\n }\n\n // If model returned files immediately, proceed with upload\n if (result && 'files' in result && Array.isArray(result.files) && result.files.length > 0) {\n const uploadedDocs: Array<{ alt?: string; id: number | string }> = []\n\n for (const file of result.files) {\n let assetData: { alt?: string; id: number | string }\n\n // Create a synthetic result for the single file to pass to mediaUpload\n const singleFileResult = {\n files: [file],\n }\n\n if (typeof pluginConfig.mediaUpload === 'function') {\n const uploadResult = await pluginConfig.mediaUpload(singleFileResult, {\n collection: uploadCollectionSlug as string,\n request: req,\n })\n assetData = { id: uploadResult.id, alt: (uploadResult as any).alt }\n } else {\n const created = await req.payload.create({\n collection: uploadCollectionSlug as string,\n data: { alt: text },\n file, // Pass the file object directly: { data, mimetype, name, size }\n req, // Pass req to ensure access control is applied\n })\n assetData = { id: created.id, alt: created.alt as string }\n }\n\n if (assetData.id) {\n uploadedDocs.push(assetData)\n }\n }\n\n if (uploadedDocs.length === 0) {\n req.payload.logger.error(\n 'Error uploading generated media, is your media upload function correct?',\n )\n throw new Error('Error uploading generated media!')\n }\n\n // Check if target field supports multiple values\n let hasMany = false\n if (targetField) {\n if (\n targetField.type === 'relationship' ||\n targetField.type === 'upload' ||\n targetField.type === 'select'\n ) {\n hasMany = (targetField as any).hasMany === true\n }\n }\n\n if (hasMany) {\n return new Response(\n JSON.stringify({\n result: uploadedDocs.map((d) => ({\n id: d.id,\n alt: d.alt,\n })),\n }),\n )\n }\n\n return new Response(\n JSON.stringify({\n result: {\n id: uploadedDocs[0].id,\n alt: uploadedDocs[0].alt,\n },\n }),\n )\n }\n\n // Otherwise, assume async job launch\n if (result && ('jobId' in result || 'taskId' in result)) {\n const externalTaskId = result.jobId || result.taskId\n const status = result.status || 'queued'\n const progress = result.progress ?? 0\n\n // Create AI Job doc and return only its id\n const createdJob = await req.payload.create({\n collection: PLUGIN_AI_JOBS_TABLE,\n data: {\n instructionId,\n progress,\n status,\n task_id: externalTaskId,\n },\n overrideAccess: true,\n req,\n })\n\n return new Response(JSON.stringify({ job: { id: createdJob.id } }), {\n headers: { 'Content-Type': 'application/json' },\n })\n }\n\n throw new Error('Unexpected model response.')\n } catch (error) {\n req.payload.logger.error(\n // @ts-expect-error\n error?.type || (error as Error).message,\n '— AI Plugin: Error generating media 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') || message.includes('Insufficient permissions')\n ? 401\n : 500,\n })\n }\n}\n"],"names":["process","PLUGIN_AI_JOBS_TABLE","PLUGIN_API_ENDPOINT_VIDEOGEN_WEBHOOK","PLUGIN_INSTRUCTIONS_TABLE","registerEditorHelper","replacePlaceholders","resolveEffectiveInstructionSettings","extendContextWithPromptFields","buildSmartPrompt","isGenericPrompt","getFieldBySchemaPath","extractImageData","fetchImages","resolveImageReferences","lexicalToPromptTemplate","sanitizeLog","uploadHandler","pluginConfig","req","data","json","collectionSlug","documentId","options","instructionId","docData","payload","findByID","id","collection","draft","e","logger","error","contextData","doc","instructions","images","prompt","promptTemplate","sampleImages","schemaPath","String","documentData","debugging","info","smartPrompt","extendedContext","type","contextDataKeys","Object","keys","contextDataSample","fromEntries","entries","map","k","v","text","uploadCollectionSlug","resolvedImages","processedPrompt","editImages","promptToUse","targetField","targetCollection","config","collections","find","c","slug","custom","ai","beforeGenerate","beforeHooks","hook","result","field","headers","serverURL","env","SERVER_URL","NEXT_PUBLIC_SERVER_URL","callbackUrl","replace","undefined","modelId","aiSettings","findGlobal","context","unsafe","effectiveSettings","modelSettings","settingsName","defaults","Error","generateParams","model","provider","providerOptions","generateMedia","afterGenerate","afterHooks","Array","isArray","files","length","uploadedDocs","file","assetData","singleFileResult","mediaUpload","uploadResult","request","alt","created","create","push","hasMany","Response","JSON","stringify","d","externalTaskId","jobId","taskId","status","progress","createdJob","task_id","overrideAccess","job","message","includes"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { PayloadRequest } from 'payload';
2
+ /**
3
+ * Videogen webhook handler.
4
+ * Receives async callbacks from video generation providers (e.g. fal.ai)
5
+ * and updates the corresponding AI Job records.
6
+ */
7
+ export declare const videogenWebhookHandler: (req: PayloadRequest) => Promise<Response>;
@@ -0,0 +1,132 @@
1
+ import * as process from 'node:process';
2
+ import { PLUGIN_AI_JOBS_TABLE, PLUGIN_INSTRUCTIONS_TABLE } from '../defaults.js';
3
+ /**
4
+ * Videogen webhook handler.
5
+ * Receives async callbacks from video generation providers (e.g. fal.ai)
6
+ * and updates the corresponding AI Job records.
7
+ */ export const videogenWebhookHandler = async (req)=>{
8
+ try {
9
+ const urlAll = new URL(req.url || '');
10
+ const qpSecret = urlAll.searchParams.get('secret') || '';
11
+ const headerSecret = req.headers.get('x-webhook-secret') || '';
12
+ const falSecret = process.env.FAL_WEBHOOK_SECRET;
13
+ const legacySecret = process.env.VIDEOGEN_WEBHOOK_SECRET;
14
+ const provided = qpSecret || headerSecret;
15
+ // TODO: fal is failing because of auth but webhook seem to work
16
+ if (!provided || (falSecret ? provided !== falSecret : provided !== legacySecret)) {
17
+ return new Response('Unauthorized', {
18
+ status: 401
19
+ });
20
+ }
21
+ const instructionId = urlAll.searchParams.get('instructionId');
22
+ if (!instructionId) {
23
+ throw new Error('instructionId missing');
24
+ }
25
+ const body = await req.json?.();
26
+ // Normalize fal webhook payload
27
+ const status = body && (body.status || body.data?.status || body.response?.status) || undefined;
28
+ const progress = (body && (body.progress ?? body.data?.progress ?? body.response?.progress)) ?? undefined;
29
+ const requestId = body && (body.taskId || body.request_id || body.gateway_request_id || body.request?.request_id) || undefined;
30
+ const error = body?.error || body?.data?.error || body?.response?.error;
31
+ // Update AI Job row by task_id (and instructionId)
32
+ const jobSearch = await req.payload.find({
33
+ collection: PLUGIN_AI_JOBS_TABLE,
34
+ depth: 0,
35
+ limit: 1,
36
+ where: {
37
+ and: [
38
+ {
39
+ task_id: {
40
+ equals: requestId
41
+ }
42
+ },
43
+ {
44
+ instructionId: {
45
+ equals: instructionId
46
+ }
47
+ }
48
+ ]
49
+ }
50
+ });
51
+ const jobDoc = jobSearch.docs?.[0];
52
+ if (jobDoc) {
53
+ await req.payload.update({
54
+ id: jobDoc.id,
55
+ collection: PLUGIN_AI_JOBS_TABLE,
56
+ data: {
57
+ progress,
58
+ status,
59
+ task_id: requestId
60
+ },
61
+ overrideAccess: true,
62
+ req
63
+ });
64
+ }
65
+ 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;
66
+ if (status === 'completed' && videoUrl) {
67
+ // Fetch the related instruction to get upload collection
68
+ const instructions = await req.payload.findByID({
69
+ id: instructionId,
70
+ collection: PLUGIN_INSTRUCTIONS_TABLE,
71
+ req
72
+ });
73
+ const uploadCollectionSlug = instructions['relation-to'];
74
+ const videoResp = await fetch(videoUrl);
75
+ if (!videoResp.ok) {
76
+ throw new Error(`Failed to fetch output: ${videoResp.status}`);
77
+ }
78
+ const buffer = Buffer.from(await videoResp.arrayBuffer());
79
+ const created = await req.payload.create({
80
+ collection: uploadCollectionSlug,
81
+ data: {
82
+ alt: 'video generation'
83
+ },
84
+ file: {
85
+ name: 'video_generation.mp4',
86
+ data: buffer,
87
+ mimetype: 'video/mp4',
88
+ size: buffer.byteLength
89
+ },
90
+ overrideAccess: true,
91
+ req
92
+ });
93
+ // Persist the result on the AI Job record
94
+ if (jobDoc) {
95
+ await req.payload.update({
96
+ id: jobDoc.id,
97
+ collection: PLUGIN_AI_JOBS_TABLE,
98
+ data: {
99
+ progress: 100,
100
+ result_id: created?.id,
101
+ status: 'completed'
102
+ },
103
+ overrideAccess: true,
104
+ req
105
+ });
106
+ }
107
+ }
108
+ if (status === 'failed' && error) {
109
+ req.payload.logger.error(error, '— AI Plugin: Video generation failed: ');
110
+ }
111
+ return new Response(JSON.stringify({
112
+ ok: true
113
+ }), {
114
+ headers: {
115
+ 'Content-Type': 'application/json'
116
+ }
117
+ });
118
+ } catch (error) {
119
+ req.payload.logger.error(error, '— AI Plugin: Error in videogen webhook: ');
120
+ const message = error && typeof error === 'object' && 'message' in error ? error.message : String(error);
121
+ return new Response(JSON.stringify({
122
+ error: message
123
+ }), {
124
+ headers: {
125
+ 'Content-Type': 'application/json'
126
+ },
127
+ status: 500
128
+ });
129
+ }
130
+ };
131
+
132
+ //# sourceMappingURL=videogenWebhook.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/endpoints/videogenWebhook.ts"],"sourcesContent":["import type { PayloadRequest } from 'payload'\n\nimport * as process from 'node:process'\n\nimport { PLUGIN_AI_JOBS_TABLE, PLUGIN_INSTRUCTIONS_TABLE } from '../defaults.js'\n\n/**\n * Videogen webhook handler.\n * Receives async callbacks from video generation providers (e.g. fal.ai)\n * and updates the corresponding AI Job records.\n */\nexport const videogenWebhookHandler = async (req: PayloadRequest) => {\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 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, '— AI Plugin: 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, '— AI Plugin: 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"],"names":["process","PLUGIN_AI_JOBS_TABLE","PLUGIN_INSTRUCTIONS_TABLE","videogenWebhookHandler","req","urlAll","URL","url","qpSecret","searchParams","get","headerSecret","headers","falSecret","env","FAL_WEBHOOK_SECRET","legacySecret","VIDEOGEN_WEBHOOK_SECRET","provided","Response","status","instructionId","Error","body","json","data","response","undefined","progress","requestId","taskId","request_id","gateway_request_id","request","error","jobSearch","payload","find","collection","depth","limit","where","and","task_id","equals","jobDoc","docs","update","id","overrideAccess","videoUrl","outputs","video","videos","instructions","findByID","uploadCollectionSlug","videoResp","fetch","ok","buffer","Buffer","from","arrayBuffer","created","create","alt","file","name","mimetype","size","byteLength","result_id","logger","JSON","stringify","message","String"],"mappings":"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"}
@@ -7,6 +7,7 @@ export { DynamicModelSelect } from '../ui/DynamicModelSelect/index.js';
7
7
  export { DynamicProviderSelect } from '../ui/DynamicProviderSelect/index.js';
8
8
  export { DynamicVoiceSelect } from '../ui/DynamicVoiceSelect/index.js';
9
9
  export { EncryptedTextField } from '../ui/EncryptedTextField/index.js';
10
+ export { GlobalProviderOptions } from '../ui/GlobalProviderOptions/index.js';
11
+ export { InstructionProviderOptions } from '../ui/InstructionProviderOptions/index.js';
10
12
  export { ModelRowLabel } from '../ui/ModelRowLabel/index.js';
11
- export { ProviderOptionsEditor } from '../ui/ProviderOptionsEditor/index.js';
12
13
  export { VoicesFetcher } from '../ui/VoicesFetcher/index.js';
@@ -7,8 +7,9 @@ export { DynamicModelSelect } from '../ui/DynamicModelSelect/index.js';
7
7
  export { DynamicProviderSelect } from '../ui/DynamicProviderSelect/index.js';
8
8
  export { DynamicVoiceSelect } from '../ui/DynamicVoiceSelect/index.js';
9
9
  export { EncryptedTextField } from '../ui/EncryptedTextField/index.js';
10
+ export { GlobalProviderOptions } from '../ui/GlobalProviderOptions/index.js';
11
+ export { InstructionProviderOptions } from '../ui/InstructionProviderOptions/index.js';
10
12
  export { ModelRowLabel } from '../ui/ModelRowLabel/index.js';
11
- export { ProviderOptionsEditor } from '../ui/ProviderOptionsEditor/index.js';
12
13
  export { VoicesFetcher } from '../ui/VoicesFetcher/index.js';
13
14
 
14
15
  //# 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'\nexport { ApiKeyStatusIndicator } from '../ui/ApiKeyStatusIndicator/index.js'\nexport { ConfigDashboard } from '../ui/ConfigDashboard/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","ApiKeyStatusIndicator","ConfigDashboard","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,qBAAqB,QAAQ,uCAAsC;AAC5E,SAASC,eAAe,QAAQ,iCAAgC;AAChE,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
+ {"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 { ApiKeyStatusIndicator } from '../ui/ApiKeyStatusIndicator/index.js'\nexport { ConfigDashboard } from '../ui/ConfigDashboard/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 { GlobalProviderOptions } from '../ui/GlobalProviderOptions/index.js'\nexport { InstructionProviderOptions } from '../ui/InstructionProviderOptions/index.js'\nexport { ModelRowLabel } from '../ui/ModelRowLabel/index.js'\n\nexport { VoicesFetcher } from '../ui/VoicesFetcher/index.js'\n"],"names":["LexicalEditorFeatureClient","InstructionsContext","InstructionsProvider","ApiKeyStatusIndicator","ConfigDashboard","DynamicModelSelect","DynamicProviderSelect","DynamicVoiceSelect","EncryptedTextField","GlobalProviderOptions","InstructionProviderOptions","ModelRowLabel","VoicesFetcher"],"mappings":"AAAA,SAASA,0BAA0B,QAAQ,4CAA2C;AACtF,SAASC,mBAAmB,QAAQ,+CAA8C;AAClF,SAASC,oBAAoB,QAAQ,4DAA2D;AAChG,SAASC,qBAAqB,QAAQ,uCAAsC;AAC5E,SAASC,eAAe,QAAQ,iCAAgC;AAChE,SAASC,kBAAkB,QAAQ,oCAAmC;AACtE,SAASC,qBAAqB,QAAQ,uCAAsC;AAC5E,SAASC,kBAAkB,QAAQ,oCAAmC;AACtE,SAASC,kBAAkB,QAAQ,oCAAmC;AACtE,SAASC,qBAAqB,QAAQ,uCAAsC;AAC5E,SAASC,0BAA0B,QAAQ,4CAA2C;AACtF,SAASC,aAAa,QAAQ,+BAA8B;AAE5D,SAASC,aAAa,QAAQ,+BAA8B"}
@@ -1,4 +1,5 @@
1
1
  export { ArrayComposeField } from '../fields/ArrayComposeField/ArrayComposeField.js';
2
2
  export { ComposeField } from '../fields/ComposeField/ComposeField.js';
3
- export { PromptEditorField } from '../fields/PromptEditorField/PromptEditorField.js';
3
+ export { PromptMentionsClient } from '../fields/PromptEditorField/feature.client.js';
4
+ export { PromptField } from '../fields/PromptField.js';
4
5
  export { SelectField } from '../fields/SelectField/SelectField.js';
@@ -1,6 +1,7 @@
1
1
  export { ArrayComposeField } from '../fields/ArrayComposeField/ArrayComposeField.js';
2
2
  export { ComposeField } from '../fields/ComposeField/ComposeField.js';
3
- export { PromptEditorField } from '../fields/PromptEditorField/PromptEditorField.js';
3
+ export { PromptMentionsClient } from '../fields/PromptEditorField/feature.client.js';
4
+ export { PromptField } from '../fields/PromptField.js';
4
5
  export { SelectField } from '../fields/SelectField/SelectField.js';
5
6
 
6
7
  //# sourceMappingURL=fields.js.map
@@ -1 +1 @@
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"}
1
+ {"version":3,"sources":["../../src/exports/fields.ts"],"sourcesContent":["export { ArrayComposeField } from '../fields/ArrayComposeField/ArrayComposeField.js'\nexport { ComposeField } from '../fields/ComposeField/ComposeField.js'\n\nexport { PromptMentionsClient } from '../fields/PromptEditorField/feature.client.js'\nexport { PromptField } from '../fields/PromptField.js'\nexport { SelectField } from '../fields/SelectField/SelectField.js'\n"],"names":["ArrayComposeField","ComposeField","PromptMentionsClient","PromptField","SelectField"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,mDAAkD;AACpF,SAASC,YAAY,QAAQ,yCAAwC;AAErE,SAASC,oBAAoB,QAAQ,gDAA+C;AACpF,SAASC,WAAW,QAAQ,2BAA0B;AACtD,SAASC,WAAW,QAAQ,uCAAsC"}
@@ -6,7 +6,7 @@ import { createPortal } from 'react-dom';
6
6
  import { FieldProvider } from '../../providers/FieldProvider/FieldProvider.js';
7
7
  import { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js';
8
8
  import { Compose } from '../../ui/Compose/Compose.js';
9
- import styles from '../../ui/Compose/compose.module.css';
9
+ import styles from '../../ui/Compose/compose.module.scss';
10
10
  /**
11
11
  * ArrayComposeField - A version of ComposeField specifically for array fields.
12
12
  * Unlike regular fields, arrays don't have focus events, so this component
@@ -1 +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"}
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.scss'\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,uCAAsC;AASzD;;;;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"}
@@ -5,7 +5,7 @@ import { createPortal } from 'react-dom';
5
5
  import { FieldProvider } from '../../providers/FieldProvider/FieldProvider.js';
6
6
  import { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js';
7
7
  import { Compose } from '../../ui/Compose/Compose.js';
8
- import styles from '../../ui/Compose/compose.module.css';
8
+ import styles from '../../ui/Compose/compose.module.scss';
9
9
  /**
10
10
  * ArrayComposeField - A version of ComposeField specifically for array fields.
11
11
  * Unlike regular fields, arrays don't have focus events, so this component
@@ -2,6 +2,7 @@ import type { ClientField } from 'payload';
2
2
  import React from 'react';
3
3
  type ComposeFieldProps = {
4
4
  [key: string]: any;
5
+ alwaysShow?: boolean;
5
6
  field: ClientField;
6
7
  path?: string;
7
8
  schemaPath?: string;
@@ -4,15 +4,25 @@ 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
8
  import { ComposePlaceholder } from '../../ui/Compose/ComposePlaceholder.js';
8
9
  export const ComposeField = (props)=>{
9
10
  const { collectionSlug } = useDocumentInfo();
10
11
  const finalSchemaPath = props?.schemaPath ?? (collectionSlug ? `${collectionSlug}.${props?.path ?? ''}` : props?.path ?? '');
11
- const { id: instructionId, disabled, hasInstructions, isConfigAllowed } = useInstructions({
12
+ const { id: instructionId, alwaysShow: instructionAlwaysShow, disabled, hasInstructions, isConfigAllowed } = useInstructions({
12
13
  schemaPath: finalSchemaPath
13
14
  });
14
15
  const adminDescription = props?.field?.admin || {};
15
16
  const description = "description" in adminDescription ? adminDescription.description : "";
17
+ const descriptionProps = {
18
+ ...props,
19
+ field: props?.field,
20
+ path: props?.path ?? '',
21
+ schemaPath: finalSchemaPath
22
+ };
23
+ // alwaysShow from either developer config (client prop) or admin instructions
24
+ const isAlwaysShow = props.alwaysShow || instructionAlwaysShow;
25
+ const shouldRender = hasInstructions && instructionId && !disabled;
16
26
  return /*#__PURE__*/ _jsxs(FieldProvider, {
17
27
  context: {
18
28
  field: props?.field,
@@ -20,13 +30,13 @@ export const ComposeField = (props)=>{
20
30
  schemaPath: finalSchemaPath
21
31
  },
22
32
  children: [
23
- hasInstructions && instructionId && !disabled ? /*#__PURE__*/ _jsx(ComposePlaceholder, {
24
- descriptionProps: {
25
- ...props,
26
- field: props?.field,
27
- path: props?.path ?? '',
28
- schemaPath: finalSchemaPath
29
- },
33
+ shouldRender ? isAlwaysShow ? /*#__PURE__*/ _jsx(Compose, {
34
+ descriptionProps: descriptionProps,
35
+ forceVisible: true,
36
+ instructionId: instructionId,
37
+ isConfigAllowed: isConfigAllowed
38
+ }) : /*#__PURE__*/ _jsx(ComposePlaceholder, {
39
+ descriptionProps: descriptionProps,
30
40
  instructionId: instructionId,
31
41
  isConfigAllowed: isConfigAllowed
32
42
  }) : null,
@@ -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 { 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"}
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'\nimport { ComposePlaceholder } from '../../ui/Compose/ComposePlaceholder.js'\n\ntype ComposeFieldProps = {\n [key: string]: any\n alwaysShow?: boolean\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 alwaysShow: instructionAlwaysShow,\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 const descriptionProps = {\n ...props,\n field: props?.field,\n path: props?.path ?? '',\n schemaPath: finalSchemaPath,\n }\n\n // alwaysShow from either developer config (client prop) or admin instructions\n const isAlwaysShow = props.alwaysShow || instructionAlwaysShow\n const shouldRender = hasInstructions && instructionId && !disabled\n\n return (\n <FieldProvider\n context={{\n field: props?.field,\n path: props?.path ?? '',\n schemaPath: finalSchemaPath,\n }}\n >\n {shouldRender ? (\n isAlwaysShow ? (\n <Compose\n descriptionProps={descriptionProps}\n forceVisible={true}\n instructionId={instructionId}\n isConfigAllowed={isConfigAllowed}\n />\n ) : (\n <ComposePlaceholder\n descriptionProps={descriptionProps}\n instructionId={instructionId}\n isConfigAllowed={isConfigAllowed}\n />\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","ComposePlaceholder","ComposeField","props","collectionSlug","finalSchemaPath","schemaPath","path","id","instructionId","alwaysShow","instructionAlwaysShow","disabled","hasInstructions","isConfigAllowed","adminDescription","field","admin","description","descriptionProps","isAlwaysShow","shouldRender","context","forceVisible","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;AACrD,SAASC,kBAAkB,QAAQ,yCAAwC;AAU3E,OAAO,MAAMC,eAAe,CAACC;IAC3B,MAAM,EAAEC,cAAc,EAAE,GAAGR;IAE3B,MAAMS,kBACJF,OAAOG,cACNF,CAAAA,iBAAiB,CAAC,EAAEA,eAAe,CAAC,EAAED,OAAOI,QAAQ,GAAG,CAAC,GAAIJ,OAAOI,QAAQ,EAAE;IAEjF,MAAM,EACJC,IAAIC,aAAa,EACjBC,YAAYC,qBAAqB,EACjCC,QAAQ,EACRC,eAAe,EACfC,eAAe,EAChB,GAAGf,gBAAgB;QAClBO,YAAYD;IACd;IAEA,MAAMU,mBAAmBZ,OAAOa,OAAOC,SAAS,CAAC;IACjD,MAAMC,cAAc,iBAAiBH,mBAAmBA,iBAAiBG,WAAW,GAAG;IAEvF,MAAMC,mBAAmB;QACvB,GAAGhB,KAAK;QACRa,OAAOb,OAAOa;QACdT,MAAMJ,OAAOI,QAAQ;QACrBD,YAAYD;IACd;IAEA,8EAA8E;IAC9E,MAAMe,eAAejB,MAAMO,UAAU,IAAIC;IACzC,MAAMU,eAAeR,mBAAmBJ,iBAAiB,CAACG;IAE1D,qBACE,MAACd;QACCwB,SAAS;YACPN,OAAOb,OAAOa;YACdT,MAAMJ,OAAOI,QAAQ;YACrBD,YAAYD;QACd;;YAECgB,eACCD,6BACE,KAACpB;gBACCmB,kBAAkBA;gBAClBI,cAAc;gBACdd,eAAeA;gBACfK,iBAAiBA;+BAGnB,KAACb;gBACCkB,kBAAkBA;gBAClBV,eAAeA;gBACfK,iBAAiBA;iBAGnB;0BAEJ,KAACU;0BACC,cAAA,KAAC7B;oBAAiBuB,aAAaA;oBAAoBX,MAAMJ,OAAOI;;;;;AAIxE,EAAC"}
@@ -3,27 +3,32 @@ 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
7
  import { ComposePlaceholder } from '../../ui/Compose/ComposePlaceholder.js';
7
8
  export const ComposeField = (props) => {
8
9
  const { collectionSlug } = useDocumentInfo();
9
10
  const finalSchemaPath = props?.schemaPath ??
10
11
  (collectionSlug ? `${collectionSlug}.${props?.path ?? ''}` : (props?.path ?? ''));
11
- const { id: instructionId, disabled, hasInstructions, isConfigAllowed, } = useInstructions({
12
+ const { id: instructionId, alwaysShow: instructionAlwaysShow, disabled, hasInstructions, isConfigAllowed, } = useInstructions({
12
13
  schemaPath: finalSchemaPath,
13
14
  });
14
15
  const adminDescription = props?.field?.admin || {};
15
16
  const description = "description" in adminDescription ? adminDescription.description : "";
17
+ const descriptionProps = {
18
+ ...props,
19
+ field: props?.field,
20
+ path: props?.path ?? '',
21
+ schemaPath: finalSchemaPath,
22
+ };
23
+ // alwaysShow from either developer config (client prop) or admin instructions
24
+ const isAlwaysShow = props.alwaysShow || instructionAlwaysShow;
25
+ const shouldRender = hasInstructions && instructionId && !disabled;
16
26
  return (<FieldProvider context={{
17
27
  field: props?.field,
18
28
  path: props?.path ?? '',
19
29
  schemaPath: finalSchemaPath,
20
30
  }}>
21
- {hasInstructions && instructionId && !disabled ? (<ComposePlaceholder descriptionProps={{
22
- ...props,
23
- field: props?.field,
24
- path: props?.path ?? '',
25
- schemaPath: finalSchemaPath,
26
- }} instructionId={instructionId} isConfigAllowed={isConfigAllowed}/>) : null}
31
+ {shouldRender ? (isAlwaysShow ? (<Compose descriptionProps={descriptionProps} forceVisible={true} instructionId={instructionId} isConfigAllowed={isConfigAllowed}/>) : (<ComposePlaceholder descriptionProps={descriptionProps} instructionId={instructionId} isConfigAllowed={isConfigAllowed}/>)) : null}
27
32
 
28
33
  <div>
29
34
  <FieldDescription description={description} path={props?.path}/>
@@ -3,7 +3,7 @@ import { PLUGIN_LEXICAL_EDITOR_FEATURE } from '../../defaults.js';
3
3
  // TODO: Find a way to check if the plugin is activated
4
4
  export const PayloadAiPluginLexicalEditorFeature = createServerFeature({
5
5
  feature: {
6
- ClientFeature: '@ai-stack/payloadcms/client#LexicalEditorFeatureClient'
6
+ ClientFeature: '@ai-stack/payloadcms/fields/LexicalEditor/feature.client.js#LexicalEditorFeatureClient'
7
7
  },
8
8
  key: PLUGIN_LEXICAL_EDITOR_FEATURE
9
9
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/fields/LexicalEditor/feature.server.ts"],"sourcesContent":["import { createServerFeature } from '@payloadcms/richtext-lexical'\n\nimport { PLUGIN_LEXICAL_EDITOR_FEATURE } from '../../defaults.js'\n\n// TODO: Find a way to check if the plugin is activated\nexport const PayloadAiPluginLexicalEditorFeature = createServerFeature({\n feature: {\n ClientFeature: '@ai-stack/payloadcms/client#LexicalEditorFeatureClient',\n },\n key: PLUGIN_LEXICAL_EDITOR_FEATURE,\n})\n"],"names":["createServerFeature","PLUGIN_LEXICAL_EDITOR_FEATURE","PayloadAiPluginLexicalEditorFeature","feature","ClientFeature","key"],"mappings":"AAAA,SAASA,mBAAmB,QAAQ,+BAA8B;AAElE,SAASC,6BAA6B,QAAQ,oBAAmB;AAEjE,uDAAuD;AACvD,OAAO,MAAMC,sCAAsCF,oBAAoB;IACrEG,SAAS;QACPC,eAAe;IACjB;IACAC,KAAKJ;AACP,GAAE"}
1
+ {"version":3,"sources":["../../../src/fields/LexicalEditor/feature.server.ts"],"sourcesContent":["import { createServerFeature } from '@payloadcms/richtext-lexical'\n\nimport { PLUGIN_LEXICAL_EDITOR_FEATURE } from '../../defaults.js'\n\n// TODO: Find a way to check if the plugin is activated\nexport const PayloadAiPluginLexicalEditorFeature = createServerFeature({\n feature: {\n ClientFeature: '@ai-stack/payloadcms/fields/LexicalEditor/feature.client.js#LexicalEditorFeatureClient',\n },\n key: PLUGIN_LEXICAL_EDITOR_FEATURE,\n})\n"],"names":["createServerFeature","PLUGIN_LEXICAL_EDITOR_FEATURE","PayloadAiPluginLexicalEditorFeature","feature","ClientFeature","key"],"mappings":"AAAA,SAASA,mBAAmB,QAAQ,+BAA8B;AAElE,SAASC,6BAA6B,QAAQ,oBAAmB;AAEjE,uDAAuD;AACvD,OAAO,MAAMC,sCAAsCF,oBAAoB;IACrEG,SAAS;QACPC,eAAe;IACjB;IACAC,KAAKJ;AACP,GAAE"}
@@ -0,0 +1 @@
1
+ export declare const PromptMentionsClient: import("@payloadcms/richtext-lexical").FeatureProviderProviderClient<undefined, undefined>;