@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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ai-stack/payloadcms",
3
- "version": "3.76.0-beta.1",
3
+ "version": "3.76.0-beta.3",
4
4
  "private": false,
5
5
  "bugs": "https://github.com/ashbuilds/payload-ai/issues",
6
6
  "repository": "https://github.com/ashbuilds/payload-ai",
@@ -43,6 +43,21 @@
43
43
  "import": "./dist/exports/fields.js",
44
44
  "types": "./dist/exports/fields.d.ts",
45
45
  "default": "./dist/exports/fields.js"
46
+ },
47
+ "./ui/*": {
48
+ "import": "./dist/ui/*",
49
+ "types": "./dist/ui/*",
50
+ "default": "./dist/ui/*"
51
+ },
52
+ "./fields/*": {
53
+ "import": "./dist/fields/*",
54
+ "types": "./dist/fields/*",
55
+ "default": "./dist/fields/*"
56
+ },
57
+ "./providers/*": {
58
+ "import": "./dist/providers/*",
59
+ "types": "./dist/providers/*",
60
+ "default": "./dist/providers/*"
46
61
  }
47
62
  },
48
63
  "main": "./dist/index.js",
@@ -74,7 +89,7 @@
74
89
  "build:types": "tsc --outDir dist --rootDir ./src",
75
90
  "clean": "rimraf {dist,*.tsbuildinfo}",
76
91
  "copyfiles": "copyfiles -u 1 \"src/**/*.{html,css,scss,ttf,woff,woff2,eot,svg,jpg,png,json,d.ts}\" dist/",
77
- "dev": "next dev dev --turbo",
92
+ "dev": "concurrently \"pnpm build:swc -w\" \"next dev dev --turbo\"",
78
93
  "dev:generate-importmap": "pnpm dev:payload generate:importmap",
79
94
  "dev:generate-types": "pnpm dev:payload generate:types",
80
95
  "dev:payload": "cross-env PAYLOAD_CONFIG_PATH=./dev/payload.config.ts payload",
@@ -106,6 +121,7 @@
106
121
  "@types/react": "19.1.8",
107
122
  "@types/react-dom": "19.1.6",
108
123
  "cloudflared": "^0.7.1",
124
+ "concurrently": "^9.2.1",
109
125
  "copyfiles": "2.4.1",
110
126
  "cross-env": "^7.0.3",
111
127
  "dotenv-cli": "^11.0.0",
@@ -130,6 +146,7 @@
130
146
  },
131
147
  "peerDependencies": {
132
148
  "@lexical/html": "^0.35.0",
149
+ "@lexical/react": "^0.35.0",
133
150
  "@payloadcms/richtext-lexical": "^3.55.1",
134
151
  "@payloadcms/translations": "^3.55.1",
135
152
  "@payloadcms/ui": "^3.55.1",
@@ -166,6 +183,21 @@
166
183
  "import": "./dist/exports/client.js",
167
184
  "types": "./dist/exports/client.d.ts",
168
185
  "default": "./dist/exports/client.js"
186
+ },
187
+ "./ui/*": {
188
+ "import": "./dist/ui/*",
189
+ "types": "./dist/ui/*",
190
+ "default": "./dist/ui/*"
191
+ },
192
+ "./fields/*": {
193
+ "import": "./dist/fields/*",
194
+ "types": "./dist/fields/*",
195
+ "default": "./dist/fields/*"
196
+ },
197
+ "./providers/*": {
198
+ "import": "./dist/providers/*",
199
+ "types": "./dist/providers/*",
200
+ "default": "./dist/providers/*"
169
201
  }
170
202
  }
171
203
  },
@@ -193,12 +225,14 @@
193
225
  "@anthropic-ai/sdk": "^0.62.0",
194
226
  "@fal-ai/client": "^1.7.0",
195
227
  "@google/genai": "^1.30.0",
228
+ "@payloadcms/live-preview-react": "3.76.0",
196
229
  "ai": "^5.0.104",
197
230
  "ajv": "^8.17.1",
198
231
  "elevenlabs": "^0.8.2",
199
232
  "get-input-selection": "^1.1.4",
200
233
  "handlebars": "4.7.8",
201
234
  "handlebars-async-helpers": "^1.0.6",
235
+ "lexical-beautiful-mentions": "^0.1.48",
202
236
  "locale-codes": "^1.3.1",
203
237
  "lodash.isequal": "^4.5.0",
204
238
  "openai": "^5.20.1",
@@ -1 +0,0 @@
1
- export {};
@@ -1,3 +0,0 @@
1
- // Coming soon...
2
-
3
- //# sourceMappingURL=analyse.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/ai/analyse.ts"],"sourcesContent":["// Coming soon...\n"],"names":[],"mappings":"AAAA,iBAAiB"}
@@ -1,11 +0,0 @@
1
- import type { Field, Payload } from 'payload';
2
- export type GenerateArgs = {
3
- mode?: 'auto' | 'json' | 'tool';
4
- model?: string;
5
- payload: Payload;
6
- prompt: string;
7
- provider?: string;
8
- schema?: Field[];
9
- system?: string;
10
- };
11
- export declare function generate(args: GenerateArgs): Promise<import("ai").GenerateObjectResult<Record<string, unknown>> | import("ai").GenerateTextResult<import("ai").ToolSet, never>>;
package/dist/ai/index.js DELETED
@@ -1,25 +0,0 @@
1
- import { generateObject, generateText } from 'ai';
2
- import { convertPayloadSchemaToZod } from '../utilities/schemaConverter.js';
3
- import { getLanguageModel } from './providers/registry.js';
4
- // Use in payload.ai that is injected during payload init. // this will always be non-streaming function, generateText, generateObject, Images etc
5
- export async function generate(args) {
6
- const { mode, model, payload, prompt, provider, schema, system } = args;
7
- const languageModel = await getLanguageModel(payload, provider, model);
8
- if (schema) {
9
- const zodSchema = convertPayloadSchemaToZod(schema);
10
- return generateObject({
11
- mode: mode || 'auto',
12
- model: languageModel,
13
- prompt,
14
- schema: zodSchema,
15
- system
16
- });
17
- }
18
- return generateText({
19
- model: languageModel,
20
- prompt,
21
- system
22
- });
23
- }
24
-
25
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/ai/index.ts"],"sourcesContent":["import type { Field, Payload } from 'payload'\n\nimport { generateObject, generateText } from 'ai'\n\nimport { convertPayloadSchemaToZod } from '../utilities/schemaConverter.js'\nimport { getLanguageModel } from './providers/registry.js'\n\nexport type GenerateArgs = {\n mode?: 'auto' | 'json' | 'tool'\n model?: string\n payload: Payload\n prompt: string\n provider?: string\n schema?: Field[]\n system?: string\n}\n\n// Use in payload.ai that is injected during payload init. // this will always be non-streaming function, generateText, generateObject, Images etc\nexport async function generate(args: GenerateArgs) {\n const { mode, model, payload, prompt, provider, schema, system } = args\n\n const languageModel = await getLanguageModel(payload, provider, model)\n\n if (schema) {\n const zodSchema = convertPayloadSchemaToZod(schema)\n return generateObject({\n mode: mode || 'auto',\n model: languageModel,\n prompt,\n schema: zodSchema,\n system,\n })\n }\n\n return generateText({\n model: languageModel,\n prompt,\n system,\n })\n}\n"],"names":["generateObject","generateText","convertPayloadSchemaToZod","getLanguageModel","generate","args","mode","model","payload","prompt","provider","schema","system","languageModel","zodSchema"],"mappings":"AAEA,SAASA,cAAc,EAAEC,YAAY,QAAQ,KAAI;AAEjD,SAASC,yBAAyB,QAAQ,kCAAiC;AAC3E,SAASC,gBAAgB,QAAQ,0BAAyB;AAY1D,kJAAkJ;AAClJ,OAAO,eAAeC,SAASC,IAAkB;IAC/C,MAAM,EAAEC,IAAI,EAAEC,KAAK,EAAEC,OAAO,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,MAAM,EAAE,GAAGP;IAEnE,MAAMQ,gBAAgB,MAAMV,iBAAiBK,SAASE,UAAUH;IAEhE,IAAII,QAAQ;QACV,MAAMG,YAAYZ,0BAA0BS;QAC5C,OAAOX,eAAe;YACpBM,MAAMA,QAAQ;YACdC,OAAOM;YACPJ;YACAE,QAAQG;YACRF;QACF;IACF;IAEA,OAAOX,aAAa;QAClBM,OAAOM;QACPJ;QACAG;IACF;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/ai/prompts.ts"],"sourcesContent":["import type { ActionPrompt } from '../types.js'\n\n//TODO: This is a temporary solution make use of structured output\nexport const defaultSystemPrompt = `IMPORTANT INSTRUCTION:\nProduce only the requested output text.\nDo not add any explanations, comments, or engagement.\nDo not use quotation marks in the response.\nBEGIN OUTPUT:`\n\nexport const defaultPrompts: ActionPrompt[] = [\n {\n name: 'Rephrase',\n system: ({\n prompt = '',\n systemPrompt = '',\n }) => `You are a skilled language expert. Rephrase the given text while maintaining its original meaning, tone, and emotional content. Use different words and sentence structures where possible, but preserve the overall style and sentiment of the original.\n \n -------------\n INSTRUCTIONS:\n - Rephrase the text according to the guidelines of the ORIGINAL SYSTEM PROMPT, if provided.\n - Retain the original meaning, tone, and emotional content.\n - Use different vocabulary and sentence structures where appropriate.\n - Ensure the rephrased text conveys the same message and feeling as the original.\n ${prompt ? '\\n\\nPrevious prompt:\\n' + prompt : ''}\n ${systemPrompt ? '\\n\\nORIGINAL SYSTEM PROMPT:\\n' + systemPrompt : ''}\n -------------`,\n },\n {\n name: 'Expand',\n system:\n () => `You are a creative writer and subject matter expert. Expand the given text by adding depth, detail, and relevant information while maintaining the original tone and style.\n \n -------------\n INSTRUCTIONS:\n - Understand the main ideas and tone of the text.\n - Add more details, examples, explanations, or context.\n - Maintain the original tone, style, and intent.\n - Ensure the expanded version flows naturally and coherently.\n - Do not contradict or alter the original meaning.\n -------------`,\n },\n {\n name: 'Proofread',\n system:\n () => `You are an English language expert. Proofread the given text, focusing on correcting grammar and spelling mistakes without altering the content, style, or tone.\n \n -------------\n INSTRUCTIONS:\n - Correct grammar and spelling errors.\n - Do not change the content, meaning, tone, or style.\n - Return the full text, whether corrections were made or not.\n - Do not provide additional comments or analysis.\n -------------`,\n },\n {\n name: 'Simplify',\n system: ({\n prompt = '',\n }) => `You are a skilled communicator specializing in clear and concise writing. Simplify the given text to make it easier to understand while retaining its core message.\n \n -------------\n INSTRUCTIONS:\n - Simplify the language, using more common words and shorter sentences.\n - Remove unnecessary details or jargon while keeping essential information.\n - Maintain the original meaning and key points.\n - Aim for clarity and readability for a general audience.\n - The simplified text should be more concise than the original.\n ${prompt ? '\\n\\nPREVIOUS PROMPT:\\n' + prompt : ''}\n -------------`,\n },\n {\n name: 'Summarize',\n layout: () => `\n[heading] - Summary\n[paragraph] - Your summary goes here...\n `,\n system: () =>\n `You are an expert at summarizing information. Your task is to create a concise summary of the given text that captures its key points and essential details while preserving the original meaning.\n\nINSTRUCTIONS:\n1. Carefully read and analyze the provided text.\n2. Identify and extract the main ideas and crucial supporting details.\n3. Condense the information into a clear and coherent summary that maintains the core message.\n4. Preserve the original tone and intent of the text.\n5. Ensure your summary is approximately 25-30% of the original text length.\n6. Use clear and precise language, avoiding unnecessary jargon or complexity.\n`,\n },\n {\n name: 'Tone',\n system: () =>\n `You are a tone adjustment specialist. Modify the tone of the given text as specified while keeping the original message and content intact.\n \n -------------\n INSTRUCTIONS:\n - Adjust the tone to match the specified style (e.g., formal, informal, professional, friendly).\n - Maintain the original content and meaning.\n - Ensure the adjusted text flows naturally with the new tone.\n -------------`,\n },\n {\n name: 'Translate',\n system: ({ locale, prompt = '', systemPrompt = '' }) =>\n `You are a skilled translator. Translate the following text into ${locale}, ensuring the original meaning, tone, and context are preserved.\n \n -------------\n INSTRUCTIONS:\n - Accurately translate the text into ${locale}.\n - Preserve the original meaning, tone, and context.\n - Ensure the translation is culturally appropriate and natural in the target language.\n ${prompt ? '\\n\\nPREVIOUS PROMPT:\\n' + prompt : ''}\n ${systemPrompt ? '\\n\\nORIGINAL SYSTEM PROMPT:\\n' + systemPrompt : ''}\n -------------`,\n },\n]\n"],"names":["defaultSystemPrompt","defaultPrompts","name","system","prompt","systemPrompt","layout","locale"],"mappings":"AAEA,kEAAkE;AAClE,OAAO,MAAMA,sBAAsB,CAAC;;;;aAIvB,CAAC,CAAA;AAEd,OAAO,MAAMC,iBAAiC;IAC5C;QACEC,MAAM;QACNC,QAAQ,CAAC,EACPC,SAAS,EAAE,EACXC,eAAe,EAAE,EAClB,GAAK,CAAC;;;;;;;;MAQL,EAAED,SAAS,2BAA2BA,SAAS,GAAG;MAClD,EAAEC,eAAe,kCAAkCA,eAAe,GAAG;mBACxD,CAAC;IAClB;IACA;QACEH,MAAM;QACNC,QACE,IAAM,CAAC;;;;;;;;;mBASM,CAAC;IAClB;IACA;QACED,MAAM;QACNC,QACE,IAAM,CAAC;;;;;;;;mBAQM,CAAC;IAClB;IACA;QACED,MAAM;QACNC,QAAQ,CAAC,EACPC,SAAS,EAAE,EACZ,GAAK,CAAC;;;;;;;;;MASL,EAAEA,SAAS,2BAA2BA,SAAS,GAAG;mBACrC,CAAC;IAClB;IACA;QACEF,MAAM;QACNI,QAAQ,IAAM,CAAC;;;IAGf,CAAC;QACDH,QAAQ,IACN,CAAC;;;;;;;;;AASP,CAAC;IACC;IACA;QACED,MAAM;QACNC,QAAQ,IACN,CAAC;;;;;;;mBAOY,CAAC;IAClB;IACA;QACED,MAAM;QACNC,QAAQ,CAAC,EAAEI,MAAM,EAAEH,SAAS,EAAE,EAAEC,eAAe,EAAE,EAAE,GACjD,CAAC,gEAAgE,EAAEE,OAAO;;;;yCAIvC,EAAEA,OAAO;;;IAG9C,EAAEH,SAAS,2BAA2BA,SAAS,GAAG;IAClD,EAAEC,eAAe,kCAAkCA,eAAe,GAAG;iBACxD,CAAC;IAChB;CACD,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/ai/utils/filterEditorSchemaByNodes.ts"],"sourcesContent":["import type { LexicalNodeSchema } from '../schemas/lexicalJsonSchema.js'\n\nimport { isObjectSchema } from './isObjectSchema.js'\nimport { coreNodeTypes, nodeClassToType, nodeTypeToSchemaMap } from './nodeToSchemaMap.js'\n\n/**\n * Filters the Lexical JSON schema to only include definitions for allowed nodes.\n *\n * @param schema - The full Lexical JSON schema\n * @param allowedNodes - Array of allowed node types. Can be either:\n * - Node class names (e.g., 'HeadingNode', 'ParagraphNode')\n * - Type values (e.g., 'heading', 'paragraph')\n * @returns A filtered schema containing only the allowed definitions\n */\nexport function filterEditorSchemaByNodes(schema: LexicalNodeSchema, allowedNodes: string[]) {\n // Normalize node names to lowercase type values\n const normalizedTypes = new Set<string>()\n\n // Always include core nodes\n for (const coreType of coreNodeTypes) {\n normalizedTypes.add(coreType)\n }\n\n // Add user-specified allowed nodes\n for (const node of allowedNodes) {\n // Handle both formats: 'HeadingNode' and 'heading'\n const normalized = node.includes('Node') ? nodeClassToType(node) : node.toLowerCase()\n normalizedTypes.add(normalized)\n }\n\n const filteredDefinitions: Record<string, any> = {}\n\n // First pass: collect definitions whose \"type.enum\" includes an allowed type\n for (const [key, def] of Object.entries(schema.definitions ?? {})) {\n if (isObjectSchema(def)) {\n const typeEnum = def.properties?.type?.enum\n if (typeEnum && typeEnum.some((t) => normalizedTypes.has(t))) {\n filteredDefinitions[key] = JSON.parse(JSON.stringify(def)) // Deep copy to safely mutate\n }\n }\n }\n\n // Ensure core schema definitions are included by checking the map\n for (const coreType of coreNodeTypes) {\n const defName = nodeTypeToSchemaMap[coreType]\n if (defName && schema.definitions?.[defName] && !filteredDefinitions[defName]) {\n filteredDefinitions[defName] = JSON.parse(JSON.stringify(schema.definitions[defName]))\n }\n }\n\n // Helper to check if a $ref points to an allowed definition\n const isAllowedRef = (ref: string) => {\n if (typeof ref !== 'string') {\n return false\n }\n const defName = ref.replace('#/definitions/', '')\n return defName in filteredDefinitions\n }\n\n // Second pass: update \"children\" in each definition to only include allowed refs\n for (const def of Object.values(filteredDefinitions)) {\n if (isObjectSchema(def) && def.properties?.children?.items) {\n const items = def.properties.children.items\n\n if (Array.isArray(items.anyOf)) {\n // Filter anyOf to only allowed $refs\n items.anyOf = items.anyOf.filter((entry) => isAllowedRef(entry.$ref))\n if (items.anyOf.length === 0) {\n delete def.properties.children\n }\n } else if (items.$ref && !isAllowedRef(items.$ref)) {\n delete def.properties.children\n }\n }\n }\n\n // Return the new schema with pruned definitions\n return {\n ...schema,\n definitions: filteredDefinitions,\n }\n}\n"],"names":["isObjectSchema","coreNodeTypes","nodeClassToType","nodeTypeToSchemaMap","filterEditorSchemaByNodes","schema","allowedNodes","normalizedTypes","Set","coreType","add","node","normalized","includes","toLowerCase","filteredDefinitions","key","def","Object","entries","definitions","typeEnum","properties","type","enum","some","t","has","JSON","parse","stringify","defName","isAllowedRef","ref","replace","values","children","items","Array","isArray","anyOf","filter","entry","$ref","length"],"mappings":"AAEA,SAASA,cAAc,QAAQ,sBAAqB;AACpD,SAASC,aAAa,EAAEC,eAAe,EAAEC,mBAAmB,QAAQ,uBAAsB;AAE1F;;;;;;;;CAQC,GACD,OAAO,SAASC,0BAA0BC,MAAyB,EAAEC,YAAsB;IACzF,gDAAgD;IAChD,MAAMC,kBAAkB,IAAIC;IAE5B,4BAA4B;IAC5B,KAAK,MAAMC,YAAYR,cAAe;QACpCM,gBAAgBG,GAAG,CAACD;IACtB;IAEA,mCAAmC;IACnC,KAAK,MAAME,QAAQL,aAAc;QAC/B,mDAAmD;QACnD,MAAMM,aAAaD,KAAKE,QAAQ,CAAC,UAAUX,gBAAgBS,QAAQA,KAAKG,WAAW;QACnFP,gBAAgBG,GAAG,CAACE;IACtB;IAEA,MAAMG,sBAA2C,CAAC;IAElD,6EAA6E;IAC7E,KAAK,MAAM,CAACC,KAAKC,IAAI,IAAIC,OAAOC,OAAO,CAACd,OAAOe,WAAW,IAAI,CAAC,GAAI;QACjE,IAAIpB,eAAeiB,MAAM;YACvB,MAAMI,WAAWJ,IAAIK,UAAU,EAAEC,MAAMC;YACvC,IAAIH,YAAYA,SAASI,IAAI,CAAC,CAACC,IAAMnB,gBAAgBoB,GAAG,CAACD,KAAK;gBAC5DX,mBAAmB,CAACC,IAAI,GAAGY,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACb,MAAM,6BAA6B;;YAC1F;QACF;IACF;IAEA,kEAAkE;IAClE,KAAK,MAAMR,YAAYR,cAAe;QACpC,MAAM8B,UAAU5B,mBAAmB,CAACM,SAAS;QAC7C,IAAIsB,WAAW1B,OAAOe,WAAW,EAAE,CAACW,QAAQ,IAAI,CAAChB,mBAAmB,CAACgB,QAAQ,EAAE;YAC7EhB,mBAAmB,CAACgB,QAAQ,GAAGH,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACzB,OAAOe,WAAW,CAACW,QAAQ;QACtF;IACF;IAEA,4DAA4D;IAC5D,MAAMC,eAAe,CAACC;QACpB,IAAI,OAAOA,QAAQ,UAAU;YAC3B,OAAO;QACT;QACA,MAAMF,UAAUE,IAAIC,OAAO,CAAC,kBAAkB;QAC9C,OAAOH,WAAWhB;IACpB;IAEA,iFAAiF;IACjF,KAAK,MAAME,OAAOC,OAAOiB,MAAM,CAACpB,qBAAsB;QACpD,IAAIf,eAAeiB,QAAQA,IAAIK,UAAU,EAAEc,UAAUC,OAAO;YAC1D,MAAMA,QAAQpB,IAAIK,UAAU,CAACc,QAAQ,CAACC,KAAK;YAE3C,IAAIC,MAAMC,OAAO,CAACF,MAAMG,KAAK,GAAG;gBAC9B,qCAAqC;gBACrCH,MAAMG,KAAK,GAAGH,MAAMG,KAAK,CAACC,MAAM,CAAC,CAACC,QAAUV,aAAaU,MAAMC,IAAI;gBACnE,IAAIN,MAAMG,KAAK,CAACI,MAAM,KAAK,GAAG;oBAC5B,OAAO3B,IAAIK,UAAU,CAACc,QAAQ;gBAChC;YACF,OAAO,IAAIC,MAAMM,IAAI,IAAI,CAACX,aAAaK,MAAMM,IAAI,GAAG;gBAClD,OAAO1B,IAAIK,UAAU,CAACc,QAAQ;YAChC;QACF;IACF;IAEA,gDAAgD;IAChD,OAAO;QACL,GAAG/B,MAAM;QACTe,aAAaL;IACf;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/ai/utils/generateFileNameByPrompt.ts"],"sourcesContent":["export function generateFileNameByPrompt(prompt: string) {\n // Helper function to get a random integer between min and max (inclusive)\n function getRandomInt(min: number, max: number) {\n return Math.floor(Math.random() * (max - min + 1)) + min\n }\n\n // Define the desired length of the filename part from the prompt\n const maxLength = 30\n const promptLength = prompt.length\n\n // Determine the start position for the random substring\n const startPos = getRandomInt(0, Math.max(0, promptLength - maxLength))\n\n // Get the random substring and truncate it if necessary\n let randomSubstring = prompt.substring(startPos, startPos + maxLength)\n\n // Replace invalid filename characters with an underscore\n randomSubstring = randomSubstring.replace(/[^a-z\\d]/gi, '_').toLowerCase()\n\n // Add a timestamp for uniqueness\n const timestamp = new Date().toISOString().replace(/[:.-]/g, '')\n\n // Combine the truncated prompt and timestamp to form the filename\n return `${randomSubstring}_${timestamp}`\n}\n"],"names":["generateFileNameByPrompt","prompt","getRandomInt","min","max","Math","floor","random","maxLength","promptLength","length","startPos","randomSubstring","substring","replace","toLowerCase","timestamp","Date","toISOString"],"mappings":"AAAA,OAAO,SAASA,yBAAyBC,MAAc;IACrD,0EAA0E;IAC1E,SAASC,aAAaC,GAAW,EAAEC,GAAW;QAC5C,OAAOC,KAAKC,KAAK,CAACD,KAAKE,MAAM,KAAMH,CAAAA,MAAMD,MAAM,CAAA,KAAMA;IACvD;IAEA,iEAAiE;IACjE,MAAMK,YAAY;IAClB,MAAMC,eAAeR,OAAOS,MAAM;IAElC,wDAAwD;IACxD,MAAMC,WAAWT,aAAa,GAAGG,KAAKD,GAAG,CAAC,GAAGK,eAAeD;IAE5D,wDAAwD;IACxD,IAAII,kBAAkBX,OAAOY,SAAS,CAACF,UAAUA,WAAWH;IAE5D,yDAAyD;IACzDI,kBAAkBA,gBAAgBE,OAAO,CAAC,cAAc,KAAKC,WAAW;IAExE,iCAAiC;IACjC,MAAMC,YAAY,IAAIC,OAAOC,WAAW,GAAGJ,OAAO,CAAC,UAAU;IAE7D,kEAAkE;IAClE,OAAO,CAAC,EAAEF,gBAAgB,CAAC,EAAEI,UAAU,CAAC;AAC1C"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/ai/utils/isObjectSchema.ts"],"sourcesContent":["import type { LexicalNodeSchema } from '../schemas/lexicalJsonSchema.js'\n\nexport function isObjectSchema(schema: unknown): schema is LexicalNodeSchema {\n return typeof schema === 'object' && schema !== null && !Array.isArray(schema)\n}\n"],"names":["isObjectSchema","schema","Array","isArray"],"mappings":"AAEA,OAAO,SAASA,eAAeC,MAAe;IAC5C,OAAO,OAAOA,WAAW,YAAYA,WAAW,QAAQ,CAACC,MAAMC,OAAO,CAACF;AACzE"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/ai/utils/nodeToSchemaMap.ts"],"sourcesContent":["/**\n * Maps Lexical node type values to JSON schema definition names.\n * This is used to filter the editor schema based on allowed editor nodes.\n *\n * The keys are the type values that appear in serialized Lexical JSON (e.g., 'heading', 'paragraph').\n * The values are the schema definition names as defined in lexicalJsonSchema.ts.\n */\nexport const nodeTypeToSchemaMap: Record<string, string> = {\n // Core nodes (typically always included)\n text: 'TextNode',\n linebreak: 'LineBreakNode',\n tab: 'TabNode',\n root: 'RootNode',\n\n // Block nodes\n paragraph: 'ParagraphNode',\n heading: 'HeadingNode',\n quote: 'QuoteNode',\n list: 'ListNode',\n listitem: 'ListItemNode',\n\n // Rich content nodes\n link: 'LinkNode',\n code: 'CodeNode',\n horizontalrule: 'HorizontalRuleNode',\n\n // Table nodes\n table: 'TableNode',\n tablerow: 'TableRowNode',\n tablecell: 'TableCellNode',\n\n // Media nodes\n image: 'ImageNode',\n}\n\n/**\n * Core nodes that should always be included in the filtered schema\n */\nexport const coreNodeTypes = ['text', 'linebreak', 'tab', 'root', 'paragraph']\n\n/**\n * Converts a Lexical node class name (e.g., 'HeadingNode') to its type value (e.g., 'heading').\n * This handles the common pattern where node classes are named with the pattern `{Type}Node`.\n */\nexport function nodeClassToType(nodeClassName: string): string {\n // Handle common formats:\n // 'HeadingNode' -> 'heading'\n // 'ParagraphNode' -> 'paragraph'\n // 'HorizontalRuleNode' -> 'horizontalrule'\n return nodeClassName.replace(/Node$/, '').toLowerCase()\n}\n\n/**\n * Converts a set of Lexical node class names to their corresponding schema definition names.\n * Includes core nodes automatically.\n */\nexport function nodeClassesToSchemaDefinitions(nodeClassNames: string[]): string[] {\n const definitions = new Set<string>()\n\n // Always include core nodes\n for (const coreType of coreNodeTypes) {\n const def = nodeTypeToSchemaMap[coreType]\n if (def) {\n definitions.add(def)\n }\n }\n\n // Convert each node class to its definition\n for (const className of nodeClassNames) {\n const type = nodeClassToType(className)\n const def = nodeTypeToSchemaMap[type]\n if (def) {\n definitions.add(def)\n }\n }\n\n return Array.from(definitions)\n}\n"],"names":["nodeTypeToSchemaMap","text","linebreak","tab","root","paragraph","heading","quote","list","listitem","link","code","horizontalrule","table","tablerow","tablecell","image","coreNodeTypes","nodeClassToType","nodeClassName","replace","toLowerCase","nodeClassesToSchemaDefinitions","nodeClassNames","definitions","Set","coreType","def","add","className","type","Array","from"],"mappings":"AAAA;;;;;;CAMC,GACD,OAAO,MAAMA,sBAA8C;IACzD,yCAAyC;IACzCC,MAAM;IACNC,WAAW;IACXC,KAAK;IACLC,MAAM;IAEN,cAAc;IACdC,WAAW;IACXC,SAAS;IACTC,OAAO;IACPC,MAAM;IACNC,UAAU;IAEV,qBAAqB;IACrBC,MAAM;IACNC,MAAM;IACNC,gBAAgB;IAEhB,cAAc;IACdC,OAAO;IACPC,UAAU;IACVC,WAAW;IAEX,cAAc;IACdC,OAAO;AACT,EAAC;AAED;;CAEC,GACD,OAAO,MAAMC,gBAAgB;IAAC;IAAQ;IAAa;IAAO;IAAQ;CAAY,CAAA;AAE9E;;;CAGC,GACD,OAAO,SAASC,gBAAgBC,aAAqB;IACnD,yBAAyB;IACzB,6BAA6B;IAC7B,iCAAiC;IACjC,2CAA2C;IAC3C,OAAOA,cAAcC,OAAO,CAAC,SAAS,IAAIC,WAAW;AACvD;AAEA;;;CAGC,GACD,OAAO,SAASC,+BAA+BC,cAAwB;IACrE,MAAMC,cAAc,IAAIC;IAExB,4BAA4B;IAC5B,KAAK,MAAMC,YAAYT,cAAe;QACpC,MAAMU,MAAM3B,mBAAmB,CAAC0B,SAAS;QACzC,IAAIC,KAAK;YACPH,YAAYI,GAAG,CAACD;QAClB;IACF;IAEA,4CAA4C;IAC5C,KAAK,MAAME,aAAaN,eAAgB;QACtC,MAAMO,OAAOZ,gBAAgBW;QAC7B,MAAMF,MAAM3B,mBAAmB,CAAC8B,KAAK;QACrC,IAAIH,KAAK;YACPH,YAAYI,GAAG,CAACD;QAClB;IACF;IAEA,OAAOI,MAAMC,IAAI,CAACR;AACpB"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/ai/utils/systemGenerate.ts"],"sourcesContent":["import { anthropic } from '@ai-sdk/anthropic'\nimport { generateText } from 'ai'\n\nimport { PLUGIN_DEFAULT_ANTHROPIC_MODEL, PLUGIN_DEFAULT_OPENAI_MODEL } from '../../defaults.js'\n// import { openai } from '../models/openai/openai.js'\n\nexport const systemGenerate = async (\n data: { prompt: string; system: string },\n generateTextFn?: (prompt: string, system: string) => Promise<string>,\n) => {\n const { prompt, system } = data\n\n if (generateTextFn) {\n return generateTextFn(prompt, system)\n }\n\n // TODO: to be re-evaluate and implemented in a way that admin ui can generate when needed\n\n // let model = null\n\n\n // If the generateTextFn is not provided, still need OPENAI_API_KEY or ANTHROPIC_API_KEY to initialize\n // if (process.env.OPENAI_API_KEY) {\n // model = openai(PLUGIN_DEFAULT_OPENAI_MODEL)\n // } else if (process.env.ANTHROPIC_API_KEY) {\n // model = anthropic(PLUGIN_DEFAULT_ANTHROPIC_MODEL)\n // } else {\n // throw new Error('- AI Plugin: Please check your environment variables!')\n // }\n //\n // const { text } = await generateText({\n // model,\n // prompt,\n // system,\n // })\n //\n // return text\n}\n"],"names":["systemGenerate","data","generateTextFn","prompt","system"],"mappings":"AAIA,sDAAsD;AAEtD,OAAO,MAAMA,iBAAiB,OAC5BC,MACAC;IAEA,MAAM,EAAEC,MAAM,EAAEC,MAAM,EAAE,GAAGH;IAE3B,IAAIC,gBAAgB;QAClB,OAAOA,eAAeC,QAAQC;IAChC;AAEA,0FAA0F;AAE1F,mBAAmB;AAGnB,sGAAsG;AACtG,oCAAoC;AACpC,gDAAgD;AAChD,8CAA8C;AAC9C,sDAAsD;AACtD,WAAW;AACX,6EAA6E;AAC7E,IAAI;AACJ,EAAE;AACF,wCAAwC;AACxC,WAAW;AACX,YAAY;AACZ,YAAY;AACZ,KAAK;AACL,EAAE;AACF,cAAc;AAChB,EAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/endpoints/buildPromptUtils.ts"],"sourcesContent":["import type { CollectionSlug } from 'payload'\n\nimport type {\n ActionMenuItems,\n PluginConfig,\n PromptFieldGetterContext,\n} from '../types.js'\n\nimport { defaultPrompts } from '../ai/prompts.js'\nimport { asyncHandlebars } from '../libraries/handlebars/asyncHandlebars.js'\nimport { handlebarsHelpersMap } from '../libraries/handlebars/helpersMap.js'\nimport { replacePlaceholders } from '../libraries/handlebars/replacePlaceholders.js'\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\nexport const 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. - revalidate\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: type === 'richText' ? buildRichTextSystem(system, updatedLayout) : system,\n }\n}\n\nexport const 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"],"names":["defaultPrompts","asyncHandlebars","handlebarsHelpersMap","replacePlaceholders","buildRichTextSystem","baseSystem","layout","assignPrompt","action","type","actionParams","collection","context","field","locale","pluginConfig","systemPrompt","template","extendedContext","extendContextWithPromptFields","prompt","toLexicalHTML","toHTML","name","assignedPrompts","undefined","system","prompts","foundPrompt","find","p","getLayout","getSystemPrompt","updatedLayout","data","ctx","promptFields","fieldsMap","Map","filter","f","collections","includes","map","Proxy","get","target","prop","getter","value","Promise","resolve","then","v","SafeString","getOwnPropertyDescriptor","configurable","enumerable","Object","has","ownKeys","keys"],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import type { Endpoint } from 'payload';
2
-
3
- import type { PluginConfig } from '../types.js';
4
- export declare const Chat: (pluginConfig: PluginConfig) => Endpoint;
@@ -1,3 +0,0 @@
1
- import type { TextareaFieldClientProps } from 'payload';
2
- import React from 'react';
3
- export declare const PromptEditorField: React.FC<TextareaFieldClientProps>;
@@ -1,217 +0,0 @@
1
- 'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { FieldDescription, FieldLabel, useConfig, useField } from '@payloadcms/ui';
4
- import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
5
- import { Mention, MentionsInput } from 'react-mentions/dist/react-mentions.cjs.js';
6
- import { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js';
7
- import { defaultStyle } from './defaultStyle.js';
8
- export const PromptEditorField = (props)=>{
9
- const { field, path: pathFromContext } = props;
10
- const { setValue, value: payloadValue } = useField({
11
- path: pathFromContext
12
- });
13
- const [localValue, setLocalValue] = useState(payloadValue || '');
14
- const hasInitialized = useRef(false);
15
- const { activeCollection, promptEditorSuggestions } = useInstructions();
16
- const { config } = useConfig();
17
- const suggestions = useMemo(()=>promptEditorSuggestions.map((suggestion)=>({
18
- id: suggestion,
19
- display: suggestion
20
- })), [
21
- promptEditorSuggestions
22
- ]);
23
- // Extract document ID from URL if available (to get specific filenames)
24
- const [documentData, setDocumentData] = useState(null);
25
- useEffect(()=>{
26
- // Only run in browser
27
- if (typeof window === 'undefined') {
28
- return;
29
- }
30
- // Allow time for verify window.location is stable (unlikely to change but good practice)
31
- const segments = window.location.pathname.split('/');
32
- const collectionsIndex = segments.indexOf('collections');
33
- if (collectionsIndex > -1 && segments.length > collectionsIndex + 2) {
34
- const urlCollectionSlug = segments[collectionsIndex + 1];
35
- const urlId = segments[collectionsIndex + 2];
36
- // Only fetch if we are editing instructions for the same collection we are viewing
37
- // and we haven't fetched yet (or ID changed)
38
- if (urlCollectionSlug === activeCollection && urlId && urlId !== 'create') {
39
- const fetchDocument = async ()=>{
40
- try {
41
- const response = await fetch(`${String(config.serverURL)}${String(config.routes.api)}/${String(urlCollectionSlug)}/${String(urlId)}`);
42
- if (response.ok) {
43
- const data = await response.json();
44
- setDocumentData(data);
45
- }
46
- } catch (_err) {
47
- // Ignore error
48
- }
49
- };
50
- void fetchDocument();
51
- }
52
- }
53
- }, [
54
- activeCollection,
55
- config
56
- ]);
57
- // Extract all upload fields from the current collection schema
58
- const imageFieldSuggestions = useMemo(()=>{
59
- const suggestions = [];
60
- // Use activeCollection from context which holds the target collection slug
61
- const targetSlug = activeCollection;
62
- if (!targetSlug || !config?.collections) {
63
- return [];
64
- }
65
- const collection = config.collections.find((c)=>c.slug === targetSlug);
66
- if (!collection?.fields) {
67
- return [];
68
- }
69
- const uploadFields = [];
70
- // Recursive function to find upload fields
71
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
72
- const findUploadFields = (fields, prefix = '')=>{
73
- for (const field of fields){
74
- if (field.type === 'upload' && field.name) {
75
- const fieldPath = prefix ? `${prefix}.${String(field.name)}` : String(field.name);
76
- uploadFields.push({
77
- name: fieldPath,
78
- hasMany: field.hasMany === true
79
- });
80
- }
81
- // Check nested fields in groups, arrays, etc.
82
- if (field.fields && Array.isArray(field.fields)) {
83
- const newPrefix = field.name ? prefix ? `${prefix}.${String(field.name)}` : String(field.name) : prefix;
84
- findUploadFields(field.fields, newPrefix);
85
- }
86
- }
87
- };
88
- findUploadFields(collection.fields);
89
- // Add generic field names (base suggestions) - ONLY for single uploads (not hasMany arrays)
90
- uploadFields.forEach(({ name, hasMany })=>{
91
- // User requested to hide the array itself for hasMany fields
92
- if (!hasMany) {
93
- suggestions.push({
94
- id: name,
95
- display: name
96
- });
97
- }
98
- });
99
- // If we have document data, add specific filename suggestions
100
- if (documentData) {
101
- uploadFields.forEach(({ name, hasMany })=>{
102
- const value = documentData[name] // Note: nested access logic simplified for now
103
- ;
104
- // Helper to extract filename from media doc (which might be ID or object)
105
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
106
- const getFilename = (item)=>{
107
- if (typeof item === 'object' && item && (item.filename || item.name)) {
108
- return item.filename || item.name;
109
- }
110
- // If it's just an ID, we can't show filename without populating.
111
- // Assuming compose view usually fetches with depth > 0 or we rely on what we have.
112
- return null;
113
- };
114
- if (value) {
115
- if (hasMany && Array.isArray(value)) {
116
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
117
- value.forEach((item)=>{
118
- const fname = getFilename(item);
119
- if (fname) {
120
- const suggestion = `${name}:${fname}`;
121
- suggestions.push({
122
- id: suggestion,
123
- display: suggestion
124
- });
125
- }
126
- });
127
- } else if (!hasMany) {
128
- // Single image - we already added the base name above.
129
- // We can optionally add the specific filename too if desired,
130
- // but user request focused on arrays.
131
- // Adding the specific filename option for Single images too as it's explicit.
132
- const fname = getFilename(value);
133
- if (fname) {
134
- const suggestion = `${name}:${fname}`;
135
- suggestions.push({
136
- id: suggestion,
137
- display: suggestion
138
- });
139
- }
140
- }
141
- }
142
- });
143
- }
144
- return suggestions;
145
- }, [
146
- activeCollection,
147
- config,
148
- documentData
149
- ]);
150
- useEffect(()=>{
151
- if (!hasInitialized.current || payloadValue === '') {
152
- setLocalValue(payloadValue || '');
153
- hasInitialized.current = true;
154
- }
155
- }, [
156
- payloadValue
157
- ]);
158
- const handleChange = useCallback((e)=>{
159
- const newValue = e.target.value;
160
- setLocalValue(newValue);
161
- // Also update Payload value immediately to prevent loss when Save is clicked
162
- setValue(newValue);
163
- }, [
164
- setValue
165
- ]);
166
- const handleBlur = useCallback(()=>{
167
- setValue(localValue);
168
- }, [
169
- localValue,
170
- setValue
171
- ]);
172
- const displayTransform = useCallback((id)=>`{{ ${id} }}`, []);
173
- const imageDisplayTransform = useCallback((id)=>`@${id}`, []);
174
- return /*#__PURE__*/ _jsxs("div", {
175
- className: "field-type textarea",
176
- children: [
177
- /*#__PURE__*/ _jsx(FieldLabel, {
178
- label: field.label
179
- }),
180
- /*#__PURE__*/ _jsxs(MentionsInput, {
181
- onBlur: handleBlur,
182
- onChange: handleChange,
183
- placeholder: "Type {{ for fields }} or @imageField for images. For specific images use @imageField:filename.jpg",
184
- style: defaultStyle,
185
- value: localValue,
186
- children: [
187
- /*#__PURE__*/ _jsx(Mention, {
188
- data: suggestions,
189
- displayTransform: displayTransform,
190
- markup: "{{__id__}}",
191
- style: {
192
- backgroundColor: 'var(--theme-elevation-100)',
193
- padding: '2px 0'
194
- },
195
- trigger: "{"
196
- }),
197
- /*#__PURE__*/ _jsx(Mention, {
198
- data: imageFieldSuggestions,
199
- displayTransform: imageDisplayTransform,
200
- markup: "@__id__",
201
- style: {
202
- backgroundColor: 'var(--theme-elevation-150)',
203
- padding: '2px 0'
204
- },
205
- trigger: "@"
206
- })
207
- ]
208
- }),
209
- /*#__PURE__*/ _jsx(FieldDescription, {
210
- description: field?.admin?.description,
211
- path: ""
212
- })
213
- ]
214
- });
215
- };
216
-
217
- //# sourceMappingURL=PromptEditorField.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/fields/PromptEditorField/PromptEditorField.tsx"],"sourcesContent":["'use client'\n\nimport type { TextareaFieldClientProps } from 'payload'\n\nimport { FieldDescription, FieldLabel, useConfig, useField } from '@payloadcms/ui'\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { Mention, MentionsInput } from 'react-mentions/dist/react-mentions.cjs.js'\n\nimport { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js'\nimport { defaultStyle } from './defaultStyle.js'\n\nexport const PromptEditorField: React.FC<TextareaFieldClientProps> = (props) => {\n const { field, path: pathFromContext } = props\n const { setValue, value: payloadValue } = useField<string>({\n path: pathFromContext,\n })\n\n const [localValue, setLocalValue] = useState(payloadValue || '')\n const hasInitialized = useRef(false)\n\n const { activeCollection, promptEditorSuggestions } = useInstructions()\n const { config } = useConfig()\n\n const suggestions = useMemo(\n () =>\n promptEditorSuggestions.map((suggestion: string) => ({\n id: suggestion,\n display: suggestion,\n })),\n [promptEditorSuggestions],\n )\n\n // Extract document ID from URL if available (to get specific filenames)\n const [documentData, setDocumentData] = useState<null | Record<string, unknown>>(null)\n \n useEffect(() => {\n // Only run in browser\n if (typeof window === 'undefined') {\n return\n }\n\n // Allow time for verify window.location is stable (unlikely to change but good practice)\n const segments = window.location.pathname.split('/')\n const collectionsIndex = segments.indexOf('collections')\n \n if (collectionsIndex > -1 && segments.length > collectionsIndex + 2) {\n const urlCollectionSlug = segments[collectionsIndex + 1]\n const urlId = segments[collectionsIndex + 2]\n\n // Only fetch if we are editing instructions for the same collection we are viewing\n // and we haven't fetched yet (or ID changed)\n if (urlCollectionSlug === activeCollection && urlId && urlId !== 'create') {\n const fetchDocument = async () => {\n try {\n \n const response = await fetch(`${String(config.serverURL)}${String(config.routes.api)}/${String(urlCollectionSlug)}/${String(urlId)}`)\n if (response.ok) {\n const data = await response.json()\n setDocumentData(data)\n }\n } catch (_err) {\n // Ignore error\n }\n }\n void fetchDocument()\n }\n }\n }, [activeCollection, config])\n\n // Extract all upload fields from the current collection schema\n const imageFieldSuggestions = useMemo(() => {\n const suggestions: { display: string; id: string }[] = []\n \n // Use activeCollection from context which holds the target collection slug\n const targetSlug = activeCollection\n \n if (!targetSlug || !config?.collections) {\n return []\n }\n\n const collection = config.collections.find((c) => c.slug === targetSlug)\n if (!collection?.fields) {\n return []\n }\n\n const uploadFields: { hasMany: boolean; name: string }[] = []\n\n // Recursive function to find upload fields\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const findUploadFields = (fields: any[], prefix = ''): void => {\n for (const field of fields) {\n if (field.type === 'upload' && field.name) {\n const fieldPath = prefix ? `${prefix}.${String(field.name)}` : String(field.name)\n uploadFields.push({ name: fieldPath, hasMany: field.hasMany === true })\n }\n // Check nested fields in groups, arrays, etc.\n if (field.fields && Array.isArray(field.fields)) {\n const newPrefix = field.name ? (prefix ? `${prefix}.${String(field.name)}` : String(field.name)) : prefix\n findUploadFields(field.fields, newPrefix)\n }\n }\n }\n\n findUploadFields(collection.fields)\n \n // Add generic field names (base suggestions) - ONLY for single uploads (not hasMany arrays)\n uploadFields.forEach(({ name, hasMany }) => {\n // User requested to hide the array itself for hasMany fields\n if (!hasMany) {\n suggestions.push({ id: name, display: name })\n }\n })\n\n // If we have document data, add specific filename suggestions\n if (documentData) {\n uploadFields.forEach(({ name, hasMany }) => {\n const value = documentData[name] // Note: nested access logic simplified for now\n \n // Helper to extract filename from media doc (which might be ID or object)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const getFilename = (item: any): null | string => {\n if (typeof item === 'object' && item && (item.filename || item.name)) {\n return item.filename || item.name\n }\n // If it's just an ID, we can't show filename without populating. \n // Assuming compose view usually fetches with depth > 0 or we rely on what we have.\n return null\n }\n\n if (value) {\n if (hasMany && Array.isArray(value)) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n value.forEach((item: any) => {\n const fname = getFilename(item)\n if (fname) {\n const suggestion = `${name}:${fname}`\n suggestions.push({ id: suggestion, display: suggestion })\n }\n })\n } else if (!hasMany) {\n // Single image - we already added the base name above.\n // We can optionally add the specific filename too if desired, \n // but user request focused on arrays.\n // Adding the specific filename option for Single images too as it's explicit.\n const fname = getFilename(value)\n if (fname) {\n const suggestion = `${name}:${fname}`\n suggestions.push({ id: suggestion, display: suggestion })\n }\n }\n }\n })\n }\n \n return suggestions\n }, [activeCollection, config, documentData])\n\n useEffect(() => {\n if (!hasInitialized.current || payloadValue === '') {\n setLocalValue(payloadValue || '')\n hasInitialized.current = true\n }\n }, [payloadValue])\n\n const handleChange = useCallback((e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const newValue = e.target.value\n setLocalValue(newValue)\n // Also update Payload value immediately to prevent loss when Save is clicked\n setValue(newValue)\n }, [setValue])\n\n const handleBlur = useCallback(() => {\n setValue(localValue)\n }, [localValue, setValue])\n\n const displayTransform = useCallback((id: string) => `{{ ${id} }}`, [])\n const imageDisplayTransform = useCallback((id: string) => `@${id}`, [])\n\n return (\n <div className=\"field-type textarea\">\n <FieldLabel label={field.label} />\n <MentionsInput\n onBlur={handleBlur}\n onChange={handleChange}\n placeholder=\"Type {{ for fields }} or @imageField for images. For specific images use @imageField:filename.jpg\"\n style={defaultStyle}\n value={localValue}\n >\n <Mention\n data={suggestions}\n displayTransform={displayTransform}\n markup=\"{{__id__}}\"\n style={{\n backgroundColor: 'var(--theme-elevation-100)',\n padding: '2px 0',\n }}\n trigger=\"{\"\n />\n <Mention\n data={imageFieldSuggestions}\n displayTransform={imageDisplayTransform}\n markup=\"@__id__\"\n style={{\n backgroundColor: 'var(--theme-elevation-150)',\n padding: '2px 0',\n }}\n trigger=\"@\"\n />\n </MentionsInput>\n <FieldDescription description={field?.admin?.description} path=\"\" />\n </div>\n )\n}\n"],"names":["FieldDescription","FieldLabel","useConfig","useField","React","useCallback","useEffect","useMemo","useRef","useState","Mention","MentionsInput","useInstructions","defaultStyle","PromptEditorField","props","field","path","pathFromContext","setValue","value","payloadValue","localValue","setLocalValue","hasInitialized","activeCollection","promptEditorSuggestions","config","suggestions","map","suggestion","id","display","documentData","setDocumentData","window","segments","location","pathname","split","collectionsIndex","indexOf","length","urlCollectionSlug","urlId","fetchDocument","response","fetch","String","serverURL","routes","api","ok","data","json","_err","imageFieldSuggestions","targetSlug","collections","collection","find","c","slug","fields","uploadFields","findUploadFields","prefix","type","name","fieldPath","push","hasMany","Array","isArray","newPrefix","forEach","getFilename","item","filename","fname","current","handleChange","e","newValue","target","handleBlur","displayTransform","imageDisplayTransform","div","className","label","onBlur","onChange","placeholder","style","markup","backgroundColor","padding","trigger","description","admin"],"mappings":"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"}