@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,173 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
4
+ import { createClientFeature } from '@payloadcms/richtext-lexical/client';
5
+ import { useDocumentInfo, useFormFields, useTranslation } from '@payloadcms/ui';
6
+ import { BeautifulMentionNode, BeautifulMentionsPlugin } from 'lexical-beautiful-mentions';
7
+ import React, { useCallback } from 'react';
8
+ const MENTION_SUGGESTIONS_TTL_MS = 60_000;
9
+ const mentionSuggestionsCache = new Map();
10
+ const mentionSuggestionsInFlight = new Map();
11
+ const getMentionCacheKey = (collectionSlug, trigger)=>`${collectionSlug}:${trigger}`;
12
+ const fetchMentionSuggestions = async (collectionSlug, trigger)=>{
13
+ const cacheKey = getMentionCacheKey(collectionSlug, trigger);
14
+ const now = Date.now();
15
+ const cached = mentionSuggestionsCache.get(cacheKey);
16
+ if (cached && cached.expiresAt > now) {
17
+ return cached.items;
18
+ }
19
+ const existingRequest = mentionSuggestionsInFlight.get(cacheKey);
20
+ if (existingRequest) {
21
+ return existingRequest;
22
+ }
23
+ const request = (async ()=>{
24
+ const params = new URLSearchParams({
25
+ collection: collectionSlug,
26
+ q: '',
27
+ trigger
28
+ });
29
+ try {
30
+ const response = await fetch(`/api/prompt-mentions?${params.toString()}`);
31
+ if (!response.ok) {
32
+ return [];
33
+ }
34
+ const data = await response.json();
35
+ const items = (data.items || []).map((item)=>({
36
+ ...item,
37
+ value: item.id || item.value
38
+ }));
39
+ mentionSuggestionsCache.set(cacheKey, {
40
+ expiresAt: now + MENTION_SUGGESTIONS_TTL_MS,
41
+ items
42
+ });
43
+ return items;
44
+ } catch (e) {
45
+ console.error(`Failed to fetch suggestions for ${trigger}`, e);
46
+ return [];
47
+ } finally{
48
+ mentionSuggestionsInFlight.delete(cacheKey);
49
+ }
50
+ })();
51
+ mentionSuggestionsInFlight.set(cacheKey, request);
52
+ return request;
53
+ };
54
+ const PromptMentionsMenu = ({ children, className, loading, ref, style, ...props })=>{
55
+ const { t } = useTranslation();
56
+ return /*#__PURE__*/ _jsx("ul", {
57
+ className: className,
58
+ ref: ref,
59
+ style: {
60
+ backgroundColor: 'var(--theme-elevation-0)',
61
+ border: '1px solid var(--theme-elevation-200)',
62
+ borderRadius: '4px',
63
+ boxShadow: '0 4px 12px 0 rgba(0,0,0,0.1)',
64
+ listStyle: 'none',
65
+ margin: 0,
66
+ maxHeight: '300px',
67
+ minWidth: '250px',
68
+ overflowY: 'auto',
69
+ padding: '4px 0',
70
+ position: 'absolute',
71
+ width: 'max-content',
72
+ zIndex: 100,
73
+ ...style
74
+ },
75
+ ...props,
76
+ children: loading ? /*#__PURE__*/ _jsx("li", {
77
+ style: {
78
+ color: 'var(--theme-elevation-500)',
79
+ fontSize: '14px',
80
+ padding: '8px 12px'
81
+ },
82
+ children: t('ai-plugin:general:loading')
83
+ }) : children
84
+ });
85
+ };
86
+ PromptMentionsMenu.displayName = 'PromptMentionsMenu';
87
+ const PromptMentionsMenuItem = ({ children, className, isFocused, itemValue: _itemValue, label, ref, selected, style, ...props })=>{
88
+ return /*#__PURE__*/ _jsx("li", {
89
+ className: className,
90
+ ref: ref,
91
+ style: {
92
+ alignItems: 'center',
93
+ backgroundColor: selected || isFocused ? 'var(--theme-elevation-100)' : 'transparent',
94
+ color: 'var(--theme-elevation-800)',
95
+ cursor: 'pointer',
96
+ display: 'flex',
97
+ fontSize: '14px',
98
+ lineHeight: '1.5',
99
+ padding: '8px 12px',
100
+ whiteSpace: 'nowrap',
101
+ ...style
102
+ },
103
+ ...props,
104
+ children: label || children
105
+ });
106
+ };
107
+ PromptMentionsMenuItem.displayName = 'PromptMentionsMenuItem';
108
+ const PromptMentionsPlugin = ()=>{
109
+ useLexicalComposerContext();
110
+ const suggestionsRef = React.useRef({});
111
+ // Get schema-path from the form to determine the target collection (Instructions context)
112
+ const schemaPathField = useFormFields(([fields])=>fields['schema-path']);
113
+ const schemaPath = schemaPathField?.value;
114
+ // Get current document info (Regular Collection context)
115
+ const { collectionSlug: currentCollectionSlug } = useDocumentInfo();
116
+ // Determine effective collection slug
117
+ // 1. If schemaPath exists (Instructions), derive slug from it (e.g. "products.name" -> "products")
118
+ // 2. Fallback to current collection slug (e.g. editing a Product directly)
119
+ const collectionSlug = schemaPath ? schemaPath.split('.')[0] : currentCollectionSlug;
120
+ // Pre-fetch suggestions when collectionSlug changes
121
+ React.useEffect(()=>{
122
+ const fetchSuggestions = async ()=>{
123
+ if (!collectionSlug) {
124
+ return;
125
+ }
126
+ const triggers = [
127
+ '@',
128
+ '#'
129
+ ];
130
+ const newSuggestions = {};
131
+ await Promise.all(triggers.map(async (trigger)=>{
132
+ newSuggestions[trigger] = await fetchMentionSuggestions(collectionSlug, trigger);
133
+ }));
134
+ suggestionsRef.current = newSuggestions;
135
+ };
136
+ fetchSuggestions().catch(console.error);
137
+ }, [
138
+ collectionSlug
139
+ ]);
140
+ const queryMentions = useCallback(async (trigger, queryString)=>{
141
+ const items = suggestionsRef.current[trigger] || [];
142
+ if (!queryString) {
143
+ return items;
144
+ }
145
+ const lowerQuery = queryString.toLowerCase();
146
+ return items.filter((item)=>{
147
+ const display = item.display || item.value || '';
148
+ return display.toLowerCase().includes(lowerQuery);
149
+ });
150
+ }, []);
151
+ return /*#__PURE__*/ _jsx(BeautifulMentionsPlugin, {
152
+ menuComponent: PromptMentionsMenu,
153
+ menuItemComponent: PromptMentionsMenuItem,
154
+ onSearch: queryMentions,
155
+ triggers: [
156
+ '@',
157
+ '#'
158
+ ]
159
+ });
160
+ };
161
+ export const PromptMentionsClient = createClientFeature({
162
+ nodes: [
163
+ BeautifulMentionNode
164
+ ],
165
+ plugins: [
166
+ {
167
+ Component: PromptMentionsPlugin,
168
+ position: 'normal'
169
+ }
170
+ ]
171
+ });
172
+
173
+ //# sourceMappingURL=feature.client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/fields/PromptEditorField/feature.client.tsx"],"sourcesContent":["'use client'\n\nimport type {\n BeautifulMentionsItem} from 'lexical-beautiful-mentions';\n\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext'\nimport { createClientFeature } from '@payloadcms/richtext-lexical/client'\nimport { useDocumentInfo, useFormFields, useTranslation } from '@payloadcms/ui'\nimport {\n BeautifulMentionNode,\n BeautifulMentionsPlugin,\n} from 'lexical-beautiful-mentions'\nimport React, { useCallback } from 'react'\n\ntype MentionSuggestion = {\n display?: string\n id?: string\n value?: string\n} & BeautifulMentionsItem\n\nconst MENTION_SUGGESTIONS_TTL_MS = 60_000\nconst mentionSuggestionsCache = new Map<string, { expiresAt: number; items: MentionSuggestion[] }>()\nconst mentionSuggestionsInFlight = new Map<string, Promise<MentionSuggestion[]>>()\n\nconst getMentionCacheKey = (collectionSlug: string, trigger: string): string =>\n `${collectionSlug}:${trigger}`\n\nconst fetchMentionSuggestions = async (\n collectionSlug: string,\n trigger: string,\n): Promise<MentionSuggestion[]> => {\n const cacheKey = getMentionCacheKey(collectionSlug, trigger)\n const now = Date.now()\n const cached = mentionSuggestionsCache.get(cacheKey)\n\n if (cached && cached.expiresAt > now) {\n return cached.items\n }\n\n const existingRequest = mentionSuggestionsInFlight.get(cacheKey)\n if (existingRequest) {\n return existingRequest\n }\n\n const request = (async () => {\n const params = new URLSearchParams({\n collection: collectionSlug,\n q: '',\n trigger,\n })\n\n try {\n const response = await fetch(`/api/prompt-mentions?${params.toString()}`)\n if (!response.ok) {\n return []\n }\n\n const data = await response.json()\n const items = (data.items || []).map((item: any) => ({\n ...item,\n value: item.id || item.value,\n })) as MentionSuggestion[]\n\n mentionSuggestionsCache.set(cacheKey, {\n expiresAt: now + MENTION_SUGGESTIONS_TTL_MS,\n items,\n })\n\n return items\n } catch (e) {\n console.error(`Failed to fetch suggestions for ${trigger}`, e)\n return []\n } finally {\n mentionSuggestionsInFlight.delete(cacheKey)\n }\n })()\n\n mentionSuggestionsInFlight.set(cacheKey, request)\n return request\n}\n\nconst PromptMentionsMenu = ({\n children,\n className,\n loading,\n ref,\n style,\n ...props\n}: {\n children?: React.ReactNode\n className?: string\n loading?: boolean\n role?: string\n style?: React.CSSProperties\n} & { ref?: React.RefObject<HTMLUListElement | null> }) => {\n const { t } = useTranslation()\n return (\n <ul\n className={className}\n ref={ref}\n style={{\n backgroundColor: 'var(--theme-elevation-0)',\n border: '1px solid var(--theme-elevation-200)',\n borderRadius: '4px',\n boxShadow: '0 4px 12px 0 rgba(0,0,0,0.1)',\n listStyle: 'none',\n margin: 0,\n maxHeight: '300px',\n minWidth: '250px',\n overflowY: 'auto',\n padding: '4px 0',\n position: 'absolute',\n width: 'max-content',\n zIndex: 100,\n ...style,\n }}\n {...props}\n >\n {loading ? (\n <li\n style={{\n color: 'var(--theme-elevation-500)',\n fontSize: '14px',\n padding: '8px 12px',\n }}\n >\n {t('ai-plugin:general:loading' as any)}\n </li>\n ) : (\n children\n )}\n </ul>\n )\n}\nPromptMentionsMenu.displayName = 'PromptMentionsMenu'\n\nconst PromptMentionsMenuItem = ({\n children,\n className,\n isFocused,\n itemValue: _itemValue,\n label,\n ref,\n selected,\n style,\n ...props\n}: {\n children?: React.ReactNode\n className?: string\n isFocused?: boolean\n itemValue?: string\n label?: string\n onClick?: () => void\n onMouseEnter?: () => void\n role?: string\n selected?: boolean\n style?: React.CSSProperties\n} & { ref?: React.RefObject<HTMLLIElement | null> }) => {\n return (\n <li\n className={className}\n ref={ref}\n style={{\n alignItems: 'center',\n backgroundColor: selected || isFocused ? 'var(--theme-elevation-100)' : 'transparent',\n color: 'var(--theme-elevation-800)',\n cursor: 'pointer',\n display: 'flex',\n fontSize: '14px',\n lineHeight: '1.5',\n padding: '8px 12px',\n whiteSpace: 'nowrap',\n ...style,\n }}\n {...props}\n >\n {label || children}\n </li>\n )\n}\nPromptMentionsMenuItem.displayName = 'PromptMentionsMenuItem'\n\nconst PromptMentionsPlugin: React.FC = () => {\n useLexicalComposerContext()\n const suggestionsRef = React.useRef<Record<string, MentionSuggestion[]>>({})\n\n // Get schema-path from the form to determine the target collection (Instructions context)\n const schemaPathField = useFormFields(([fields]: any) => fields['schema-path'])\n const schemaPath = schemaPathField?.value as string\n\n // Get current document info (Regular Collection context)\n const { collectionSlug: currentCollectionSlug } = useDocumentInfo()\n\n // Determine effective collection slug\n // 1. If schemaPath exists (Instructions), derive slug from it (e.g. \"products.name\" -> \"products\")\n // 2. Fallback to current collection slug (e.g. editing a Product directly)\n const collectionSlug = schemaPath ? schemaPath.split('.')[0] : currentCollectionSlug\n\n // Pre-fetch suggestions when collectionSlug changes\n React.useEffect(() => {\n const fetchSuggestions = async () => {\n if (!collectionSlug) {\n return\n }\n\n const triggers = ['@', '#']\n const newSuggestions: Record<string, any[]> = {}\n\n await Promise.all(\n triggers.map(async (trigger) => {\n newSuggestions[trigger] = await fetchMentionSuggestions(collectionSlug, trigger)\n }),\n )\n\n suggestionsRef.current = newSuggestions\n }\n\n fetchSuggestions().catch(console.error)\n }, [collectionSlug])\n\n const queryMentions = useCallback(async (trigger: string, queryString?: null | string) => {\n const items = suggestionsRef.current[trigger] || []\n\n if (!queryString) {\n return items as BeautifulMentionsItem[]\n }\n\n const lowerQuery = queryString.toLowerCase()\n return items.filter((item) => {\n const display = item.display || item.value || ''\n return display.toLowerCase().includes(lowerQuery)\n }) as BeautifulMentionsItem[]\n }, [])\n\n return (\n <BeautifulMentionsPlugin\n menuComponent={PromptMentionsMenu}\n menuItemComponent={PromptMentionsMenuItem}\n onSearch={queryMentions}\n triggers={['@', '#']}\n />\n )\n}\n\nexport const PromptMentionsClient = createClientFeature({\n nodes: [BeautifulMentionNode],\n plugins: [\n {\n Component: PromptMentionsPlugin,\n position: 'normal',\n },\n ],\n})\n"],"names":["useLexicalComposerContext","createClientFeature","useDocumentInfo","useFormFields","useTranslation","BeautifulMentionNode","BeautifulMentionsPlugin","React","useCallback","MENTION_SUGGESTIONS_TTL_MS","mentionSuggestionsCache","Map","mentionSuggestionsInFlight","getMentionCacheKey","collectionSlug","trigger","fetchMentionSuggestions","cacheKey","now","Date","cached","get","expiresAt","items","existingRequest","request","params","URLSearchParams","collection","q","response","fetch","toString","ok","data","json","map","item","value","id","set","e","console","error","delete","PromptMentionsMenu","children","className","loading","ref","style","props","t","ul","backgroundColor","border","borderRadius","boxShadow","listStyle","margin","maxHeight","minWidth","overflowY","padding","position","width","zIndex","li","color","fontSize","displayName","PromptMentionsMenuItem","isFocused","itemValue","_itemValue","label","selected","alignItems","cursor","display","lineHeight","whiteSpace","PromptMentionsPlugin","suggestionsRef","useRef","schemaPathField","fields","schemaPath","currentCollectionSlug","split","useEffect","fetchSuggestions","triggers","newSuggestions","Promise","all","current","catch","queryMentions","queryString","lowerQuery","toLowerCase","filter","includes","menuComponent","menuItemComponent","onSearch","PromptMentionsClient","nodes","plugins","Component"],"mappings":"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"}
@@ -0,0 +1,148 @@
1
+ 'use client';
2
+ import { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';
3
+ import { createClientFeature } from '@payloadcms/richtext-lexical/client';
4
+ import { useDocumentInfo, useFormFields, useTranslation } from '@payloadcms/ui';
5
+ import { BeautifulMentionNode, BeautifulMentionsPlugin, } from 'lexical-beautiful-mentions';
6
+ import React, { useCallback } from 'react';
7
+ const MENTION_SUGGESTIONS_TTL_MS = 60_000;
8
+ const mentionSuggestionsCache = new Map();
9
+ const mentionSuggestionsInFlight = new Map();
10
+ const getMentionCacheKey = (collectionSlug, trigger) => `${collectionSlug}:${trigger}`;
11
+ const fetchMentionSuggestions = async (collectionSlug, trigger) => {
12
+ const cacheKey = getMentionCacheKey(collectionSlug, trigger);
13
+ const now = Date.now();
14
+ const cached = mentionSuggestionsCache.get(cacheKey);
15
+ if (cached && cached.expiresAt > now) {
16
+ return cached.items;
17
+ }
18
+ const existingRequest = mentionSuggestionsInFlight.get(cacheKey);
19
+ if (existingRequest) {
20
+ return existingRequest;
21
+ }
22
+ const request = (async () => {
23
+ const params = new URLSearchParams({
24
+ collection: collectionSlug,
25
+ q: '',
26
+ trigger,
27
+ });
28
+ try {
29
+ const response = await fetch(`/api/prompt-mentions?${params.toString()}`);
30
+ if (!response.ok) {
31
+ return [];
32
+ }
33
+ const data = await response.json();
34
+ const items = (data.items || []).map((item) => ({
35
+ ...item,
36
+ value: item.id || item.value,
37
+ }));
38
+ mentionSuggestionsCache.set(cacheKey, {
39
+ expiresAt: now + MENTION_SUGGESTIONS_TTL_MS,
40
+ items,
41
+ });
42
+ return items;
43
+ }
44
+ catch (e) {
45
+ console.error(`Failed to fetch suggestions for ${trigger}`, e);
46
+ return [];
47
+ }
48
+ finally {
49
+ mentionSuggestionsInFlight.delete(cacheKey);
50
+ }
51
+ })();
52
+ mentionSuggestionsInFlight.set(cacheKey, request);
53
+ return request;
54
+ };
55
+ const PromptMentionsMenu = ({ children, className, loading, ref, style, ...props }) => {
56
+ const { t } = useTranslation();
57
+ return (<ul className={className} ref={ref} style={{
58
+ backgroundColor: 'var(--theme-elevation-0)',
59
+ border: '1px solid var(--theme-elevation-200)',
60
+ borderRadius: '4px',
61
+ boxShadow: '0 4px 12px 0 rgba(0,0,0,0.1)',
62
+ listStyle: 'none',
63
+ margin: 0,
64
+ maxHeight: '300px',
65
+ minWidth: '250px',
66
+ overflowY: 'auto',
67
+ padding: '4px 0',
68
+ position: 'absolute',
69
+ width: 'max-content',
70
+ zIndex: 100,
71
+ ...style,
72
+ }} {...props}>
73
+ {loading ? (<li style={{
74
+ color: 'var(--theme-elevation-500)',
75
+ fontSize: '14px',
76
+ padding: '8px 12px',
77
+ }}>
78
+ {t('ai-plugin:general:loading')}
79
+ </li>) : (children)}
80
+ </ul>);
81
+ };
82
+ PromptMentionsMenu.displayName = 'PromptMentionsMenu';
83
+ const PromptMentionsMenuItem = ({ children, className, isFocused, itemValue: _itemValue, label, ref, selected, style, ...props }) => {
84
+ return (<li className={className} ref={ref} style={{
85
+ alignItems: 'center',
86
+ backgroundColor: selected || isFocused ? 'var(--theme-elevation-100)' : 'transparent',
87
+ color: 'var(--theme-elevation-800)',
88
+ cursor: 'pointer',
89
+ display: 'flex',
90
+ fontSize: '14px',
91
+ lineHeight: '1.5',
92
+ padding: '8px 12px',
93
+ whiteSpace: 'nowrap',
94
+ ...style,
95
+ }} {...props}>
96
+ {label || children}
97
+ </li>);
98
+ };
99
+ PromptMentionsMenuItem.displayName = 'PromptMentionsMenuItem';
100
+ const PromptMentionsPlugin = () => {
101
+ useLexicalComposerContext();
102
+ const suggestionsRef = React.useRef({});
103
+ // Get schema-path from the form to determine the target collection (Instructions context)
104
+ const schemaPathField = useFormFields(([fields]) => fields['schema-path']);
105
+ const schemaPath = schemaPathField?.value;
106
+ // Get current document info (Regular Collection context)
107
+ const { collectionSlug: currentCollectionSlug } = useDocumentInfo();
108
+ // Determine effective collection slug
109
+ // 1. If schemaPath exists (Instructions), derive slug from it (e.g. "products.name" -> "products")
110
+ // 2. Fallback to current collection slug (e.g. editing a Product directly)
111
+ const collectionSlug = schemaPath ? schemaPath.split('.')[0] : currentCollectionSlug;
112
+ // Pre-fetch suggestions when collectionSlug changes
113
+ React.useEffect(() => {
114
+ const fetchSuggestions = async () => {
115
+ if (!collectionSlug) {
116
+ return;
117
+ }
118
+ const triggers = ['@', '#'];
119
+ const newSuggestions = {};
120
+ await Promise.all(triggers.map(async (trigger) => {
121
+ newSuggestions[trigger] = await fetchMentionSuggestions(collectionSlug, trigger);
122
+ }));
123
+ suggestionsRef.current = newSuggestions;
124
+ };
125
+ fetchSuggestions().catch(console.error);
126
+ }, [collectionSlug]);
127
+ const queryMentions = useCallback(async (trigger, queryString) => {
128
+ const items = suggestionsRef.current[trigger] || [];
129
+ if (!queryString) {
130
+ return items;
131
+ }
132
+ const lowerQuery = queryString.toLowerCase();
133
+ return items.filter((item) => {
134
+ const display = item.display || item.value || '';
135
+ return display.toLowerCase().includes(lowerQuery);
136
+ });
137
+ }, []);
138
+ return (<BeautifulMentionsPlugin menuComponent={PromptMentionsMenu} menuItemComponent={PromptMentionsMenuItem} onSearch={queryMentions} triggers={['@', '#']}/>);
139
+ };
140
+ export const PromptMentionsClient = createClientFeature({
141
+ nodes: [BeautifulMentionNode],
142
+ plugins: [
143
+ {
144
+ Component: PromptMentionsPlugin,
145
+ position: 'normal',
146
+ },
147
+ ],
148
+ });
@@ -0,0 +1 @@
1
+ export declare const PromptMentionsFeature: import("@payloadcms/richtext-lexical").FeatureProviderProviderServer<undefined, undefined, undefined>;
@@ -0,0 +1,30 @@
1
+ import { createServerFeature } from '@payloadcms/richtext-lexical';
2
+ // Mock the node for server-side usage to avoid import issues with the library
3
+ const BeautifulMentionNode = {
4
+ clone: (node)=>({
5
+ ...node
6
+ }),
7
+ getType: ()=>'beautifulMention',
8
+ importJSON: (serializedNode)=>{
9
+ // Return a basic object that satisfies the lexical node interface purely for server validation
10
+ return {
11
+ ...serializedNode,
12
+ exportJSON: ()=>serializedNode,
13
+ getType: ()=>'beautifulMention'
14
+ };
15
+ }
16
+ };
17
+ export const PromptMentionsFeature = createServerFeature({
18
+ feature: {
19
+ ClientFeature: '@ai-stack/payloadcms/fields/PromptEditorField/feature.client.js#PromptMentionsClient',
20
+ nodes: [
21
+ {
22
+ converters: {},
23
+ node: BeautifulMentionNode
24
+ }
25
+ ]
26
+ },
27
+ key: 'promptMentions'
28
+ });
29
+
30
+ //# sourceMappingURL=feature.server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/fields/PromptEditorField/feature.server.ts"],"sourcesContent":["import { createServerFeature } from '@payloadcms/richtext-lexical'\n\n// Mock the node for server-side usage to avoid import issues with the library\nconst BeautifulMentionNode = {\n clone: (node: any) => ({ ...node }),\n getType: () => 'beautifulMention',\n importJSON: (serializedNode: any) => {\n // Return a basic object that satisfies the lexical node interface purely for server validation\n return {\n ...serializedNode,\n exportJSON: () => serializedNode,\n getType: () => 'beautifulMention',\n }\n },\n}\n\nexport const PromptMentionsFeature = createServerFeature({\n feature: {\n ClientFeature: '@ai-stack/payloadcms/fields/PromptEditorField/feature.client.js#PromptMentionsClient',\n nodes: [\n {\n converters: {},\n node: BeautifulMentionNode,\n },\n ],\n },\n key: 'promptMentions',\n})\n"],"names":["createServerFeature","BeautifulMentionNode","clone","node","getType","importJSON","serializedNode","exportJSON","PromptMentionsFeature","feature","ClientFeature","nodes","converters","key"],"mappings":"AAAA,SAASA,mBAAmB,QAAQ,+BAA8B;AAElE,8EAA8E;AAC9E,MAAMC,uBAAuB;IAC3BC,OAAO,CAACC,OAAe,CAAA;YAAE,GAAGA,IAAI;QAAC,CAAA;IACjCC,SAAS,IAAM;IACfC,YAAY,CAACC;QACX,+FAA+F;QAC/F,OAAO;YACL,GAAGA,cAAc;YACjBC,YAAY,IAAMD;YAClBF,SAAS,IAAM;QACjB;IACF;AACF;AAEA,OAAO,MAAMI,wBAAwBR,oBAAoB;IACvDS,SAAS;QACPC,eAAe;QACfC,OAAO;YACL;gBACEC,YAAY,CAAC;gBACbT,MAAMF;YACR;SACD;IACH;IACAY,KAAK;AACP,GAAE"}
@@ -0,0 +1,4 @@
1
+ import type { Field, RichTextField } from 'payload';
2
+ type PromptFieldOverrides = Partial<RichTextField>;
3
+ export declare const PromptField: (overrides?: PromptFieldOverrides) => Field;
4
+ export {};
@@ -0,0 +1,18 @@
1
+ import { lexicalEditor } from '@payloadcms/richtext-lexical';
2
+ import { PromptMentionsFeature } from './PromptEditorField/feature.server.js';
3
+ export const PromptField = (overrides = {})=>{
4
+ return {
5
+ name: 'prompt',
6
+ type: 'richText',
7
+ label: 'Prompt',
8
+ ...overrides,
9
+ editor: overrides.editor ?? lexicalEditor({
10
+ features: ({ rootFeatures })=>[
11
+ // ...rootFeatures,
12
+ PromptMentionsFeature()
13
+ ]
14
+ })
15
+ };
16
+ };
17
+
18
+ //# sourceMappingURL=PromptField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/fields/PromptField.ts"],"sourcesContent":["import type { Field, RichTextField } from 'payload'\n\nimport { lexicalEditor } from '@payloadcms/richtext-lexical'\n\nimport { PromptMentionsFeature } from './PromptEditorField/feature.server.js'\n\ntype PromptFieldOverrides = Partial<RichTextField>\n\nexport const PromptField = (overrides: PromptFieldOverrides = {}): Field => {\n return {\n name: 'prompt',\n type: 'richText',\n label: 'Prompt',\n ...overrides,\n editor:\n overrides.editor ??\n lexicalEditor({\n features: ({ rootFeatures }) => [\n // ...rootFeatures,\n PromptMentionsFeature(),\n ],\n }),\n }\n}\n"],"names":["lexicalEditor","PromptMentionsFeature","PromptField","overrides","name","type","label","editor","features","rootFeatures"],"mappings":"AAEA,SAASA,aAAa,QAAQ,+BAA8B;AAE5D,SAASC,qBAAqB,QAAQ,wCAAuC;AAI7E,OAAO,MAAMC,cAAc,CAACC,YAAkC,CAAC,CAAC;IAC9D,OAAO;QACLC,MAAM;QACNC,MAAM;QACNC,OAAO;QACP,GAAGH,SAAS;QACZI,QACEJ,UAAUI,MAAM,IAChBP,cAAc;YACZQ,UAAU,CAAC,EAAEC,YAAY,EAAE,GAAK;oBAC9B,mBAAmB;oBACnBR;iBACD;QACH;IACJ;AACF,EAAC"}
@@ -33,7 +33,6 @@ export const SelectField = (props)=>{
33
33
  label: field.label,
34
34
  name: path,
35
35
  onChange: (value)=>{
36
- console.log("value --- ", value);
37
36
  if (Array.isArray(value)) {
38
37
  setValue(value[0]?.value ?? '');
39
38
  } else if (value && typeof value === 'object' && 'value' in value) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/fields/SelectField/SelectField.tsx"],"sourcesContent":["'use client'\n\nimport type { OptionObject, SelectFieldClientProps } from 'payload'\n\nimport { SelectInput, useField } from '@payloadcms/ui'\nimport React, { useEffect, useState } from 'react'\n\n// Use to filter model options in settings based on field types\nexport const SelectField = (\n props: {\n filterByField: string\n options: { fields: string[]; label: string; value: string }[]\n path: string\n } & SelectFieldClientProps,\n) => {\n const { field, filterByField, options, path } = props\n const { value: relatedField } = useField<string>({\n path: filterByField,\n })\n\n const [filterOptions, setFilterOptions] = useState<OptionObject[]>([])\n\n useEffect(() => {\n if (!Array.isArray(options)) {\n return\n }\n\n const opts = options.filter((option) => {\n if (!relatedField || !option.fields) {\n return true\n }\n\n if (Array.isArray(option.fields)) {\n return option.fields.includes(relatedField)\n }\n })\n setFilterOptions(opts)\n }, [relatedField, options])\n\n const { setValue, value: selectValue } = useField<string>({ path })\n\n return (\n <SelectInput\n label={field.label}\n name={path}\n onChange={(value) => {\n console.log(\"value --- \", value)\n if (Array.isArray(value)) {\n setValue(value[0]?.value ?? '')\n } else if (value && typeof value === 'object' && 'value' in value) {\n setValue((value as OptionObject).value)\n } else {\n setValue('')\n }\n }}\n options={filterOptions}\n path={path}\n value={selectValue}\n />\n )\n}\n"],"names":["SelectInput","useField","React","useEffect","useState","SelectField","props","field","filterByField","options","path","value","relatedField","filterOptions","setFilterOptions","Array","isArray","opts","filter","option","fields","includes","setValue","selectValue","label","name","onChange","console","log"],"mappings":"AAAA;;AAIA,SAASA,WAAW,EAAEC,QAAQ,QAAQ,iBAAgB;AACtD,OAAOC,SAASC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAElD,+DAA+D;AAC/D,OAAO,MAAMC,cAAc,CACzBC;IAMA,MAAM,EAAEC,KAAK,EAAEC,aAAa,EAAEC,OAAO,EAAEC,IAAI,EAAE,GAAGJ;IAChD,MAAM,EAAEK,OAAOC,YAAY,EAAE,GAAGX,SAAiB;QAC/CS,MAAMF;IACR;IAEA,MAAM,CAACK,eAAeC,iBAAiB,GAAGV,SAAyB,EAAE;IAErED,UAAU;QACR,IAAI,CAACY,MAAMC,OAAO,CAACP,UAAU;YAC3B;QACF;QAEA,MAAMQ,OAAOR,QAAQS,MAAM,CAAC,CAACC;YAC3B,IAAI,CAACP,gBAAgB,CAACO,OAAOC,MAAM,EAAE;gBACnC,OAAO;YACT;YAEA,IAAIL,MAAMC,OAAO,CAACG,OAAOC,MAAM,GAAG;gBAChC,OAAOD,OAAOC,MAAM,CAACC,QAAQ,CAACT;YAChC;QACF;QACAE,iBAAiBG;IACnB,GAAG;QAACL;QAAcH;KAAQ;IAE1B,MAAM,EAAEa,QAAQ,EAAEX,OAAOY,WAAW,EAAE,GAAGtB,SAAiB;QAAES;IAAK;IAEjE,qBACE,KAACV;QACCwB,OAAOjB,MAAMiB,KAAK;QAClBC,MAAMf;QACNgB,UAAU,CAACf;YACTgB,QAAQC,GAAG,CAAC,cAAcjB;YAC1B,IAAII,MAAMC,OAAO,CAACL,QAAQ;gBACxBW,SAASX,KAAK,CAAC,EAAE,EAAEA,SAAS;YAC9B,OAAO,IAAIA,SAAS,OAAOA,UAAU,YAAY,WAAWA,OAAO;gBACjEW,SAAS,AAACX,MAAuBA,KAAK;YACxC,OAAO;gBACLW,SAAS;YACX;QACF;QACAb,SAASI;QACTH,MAAMA;QACNC,OAAOY;;AAGb,EAAC"}
1
+ {"version":3,"sources":["../../../src/fields/SelectField/SelectField.tsx"],"sourcesContent":["'use client'\n\nimport type { OptionObject, SelectFieldClientProps } from 'payload'\n\nimport { SelectInput, useField } from '@payloadcms/ui'\nimport React, { useEffect, useState } from 'react'\n\n// Use to filter model options in settings based on field types\nexport const SelectField = (\n props: {\n filterByField: string\n options: { fields: string[]; label: string; value: string }[]\n path: string\n } & SelectFieldClientProps,\n) => {\n const { field, filterByField, options, path } = props\n const { value: relatedField } = useField<string>({\n path: filterByField,\n })\n\n const [filterOptions, setFilterOptions] = useState<OptionObject[]>([])\n\n useEffect(() => {\n if (!Array.isArray(options)) {\n return\n }\n\n const opts = options.filter((option) => {\n if (!relatedField || !option.fields) {\n return true\n }\n\n if (Array.isArray(option.fields)) {\n return option.fields.includes(relatedField)\n }\n })\n setFilterOptions(opts)\n }, [relatedField, options])\n\n const { setValue, value: selectValue } = useField<string>({ path })\n\n return (\n <SelectInput\n label={field.label}\n name={path}\n onChange={(value) => {\n if (Array.isArray(value)) {\n setValue(value[0]?.value ?? '')\n } else if (value && typeof value === 'object' && 'value' in value) {\n setValue((value as OptionObject).value)\n } else {\n setValue('')\n }\n }}\n options={filterOptions}\n path={path}\n value={selectValue}\n />\n )\n}\n"],"names":["SelectInput","useField","React","useEffect","useState","SelectField","props","field","filterByField","options","path","value","relatedField","filterOptions","setFilterOptions","Array","isArray","opts","filter","option","fields","includes","setValue","selectValue","label","name","onChange"],"mappings":"AAAA;;AAIA,SAASA,WAAW,EAAEC,QAAQ,QAAQ,iBAAgB;AACtD,OAAOC,SAASC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAElD,+DAA+D;AAC/D,OAAO,MAAMC,cAAc,CACzBC;IAMA,MAAM,EAAEC,KAAK,EAAEC,aAAa,EAAEC,OAAO,EAAEC,IAAI,EAAE,GAAGJ;IAChD,MAAM,EAAEK,OAAOC,YAAY,EAAE,GAAGX,SAAiB;QAC/CS,MAAMF;IACR;IAEA,MAAM,CAACK,eAAeC,iBAAiB,GAAGV,SAAyB,EAAE;IAErED,UAAU;QACR,IAAI,CAACY,MAAMC,OAAO,CAACP,UAAU;YAC3B;QACF;QAEA,MAAMQ,OAAOR,QAAQS,MAAM,CAAC,CAACC;YAC3B,IAAI,CAACP,gBAAgB,CAACO,OAAOC,MAAM,EAAE;gBACnC,OAAO;YACT;YAEA,IAAIL,MAAMC,OAAO,CAACG,OAAOC,MAAM,GAAG;gBAChC,OAAOD,OAAOC,MAAM,CAACC,QAAQ,CAACT;YAChC;QACF;QACAE,iBAAiBG;IACnB,GAAG;QAACL;QAAcH;KAAQ;IAE1B,MAAM,EAAEa,QAAQ,EAAEX,OAAOY,WAAW,EAAE,GAAGtB,SAAiB;QAAES;IAAK;IAEjE,qBACE,KAACV;QACCwB,OAAOjB,MAAMiB,KAAK;QAClBC,MAAMf;QACNgB,UAAU,CAACf;YACT,IAAII,MAAMC,OAAO,CAACL,QAAQ;gBACxBW,SAASX,KAAK,CAAC,EAAE,EAAEA,SAAS;YAC9B,OAAO,IAAIA,SAAS,OAAOA,UAAU,YAAY,WAAWA,OAAO;gBACjEW,SAAS,AAACX,MAAuBA,KAAK;YACxC,OAAO;gBACLW,SAAS;YACX;QACF;QACAb,SAASI;QACTH,MAAMA;QACNC,OAAOY;;AAGb,EAAC"}
@@ -24,7 +24,6 @@ export const SelectField = (props) => {
24
24
  }, [relatedField, options]);
25
25
  const { setValue, value: selectValue } = useField({ path });
26
26
  return (<SelectInput label={field.label} name={path} onChange={(value) => {
27
- console.log("value --- ", value);
28
27
  if (Array.isArray(value)) {
29
28
  setValue(value[0]?.value ?? '');
30
29
  }
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- export type { GenerateArgs } from './ai/index.js';
2
- export { defaultPrompts } from './ai/prompts.js';
1
+ export { defaultPrompts } from './ai/utilities/prompts.js';
2
+ export { promptMentionsEndpoint } from './endpoints/promptMentions.js';
3
3
  export { PayloadAiPluginLexicalEditorFeature } from './fields/LexicalEditor/feature.server.js';
4
+ export { PromptField } from './fields/PromptField.js';
4
5
  export type {} from './payload-ai.d.ts';
5
6
  export { payloadAiPlugin } from './plugin.js';
6
- export { fieldToJsonSchema } from './utilities/fieldToJsonSchema.js';
7
+ export { fieldToJsonSchema } from './utilities/fields/fieldToJsonSchema.js';
package/dist/index.js CHANGED
@@ -1,6 +1,8 @@
1
- export { defaultPrompts } from './ai/prompts.js';
1
+ export { defaultPrompts } from './ai/utilities/prompts.js';
2
+ export { promptMentionsEndpoint } from './endpoints/promptMentions.js';
2
3
  export { PayloadAiPluginLexicalEditorFeature } from './fields/LexicalEditor/feature.server.js';
4
+ export { PromptField } from './fields/PromptField.js';
3
5
  export { payloadAiPlugin } from './plugin.js';
4
- export { fieldToJsonSchema } from './utilities/fieldToJsonSchema.js';
6
+ export { fieldToJsonSchema } from './utilities/fields/fieldToJsonSchema.js';
5
7
 
6
8
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export type { GenerateArgs } from './ai/index.js'\n\nexport { defaultPrompts } from './ai/prompts.js'\n\nexport { PayloadAiPluginLexicalEditorFeature } from './fields/LexicalEditor/feature.server.js'\n// Re-export to ensure payload.ai module augmentation is included\nexport type {} from './payload-ai.d.ts'\n\nexport { payloadAiPlugin } from './plugin.js'\nexport { fieldToJsonSchema } from './utilities/fieldToJsonSchema.js'\n"],"names":["defaultPrompts","PayloadAiPluginLexicalEditorFeature","payloadAiPlugin","fieldToJsonSchema"],"mappings":"AAEA,SAASA,cAAc,QAAQ,kBAAiB;AAEhD,SAASC,mCAAmC,QAAQ,2CAA0C;AAI9F,SAASC,eAAe,QAAQ,cAAa;AAC7C,SAASC,iBAAiB,QAAQ,mCAAkC"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { defaultPrompts } from './ai/utilities/prompts.js'\nexport { promptMentionsEndpoint } from './endpoints/promptMentions.js'\nexport { PayloadAiPluginLexicalEditorFeature } from './fields/LexicalEditor/feature.server.js'\nexport { PromptField } from './fields/PromptField.js'\n// Re-export to ensure payload.ai module augmentation is included\nexport type {} from './payload-ai.d.ts'\nexport { payloadAiPlugin } from './plugin.js'\nexport { fieldToJsonSchema } from './utilities/fields/fieldToJsonSchema.js'\n"],"names":["defaultPrompts","promptMentionsEndpoint","PayloadAiPluginLexicalEditorFeature","PromptField","payloadAiPlugin","fieldToJsonSchema"],"mappings":"AAAA,SAASA,cAAc,QAAQ,4BAA2B;AAC1D,SAASC,sBAAsB,QAAQ,gCAA+B;AACtE,SAASC,mCAAmC,QAAQ,2CAA0C;AAC9F,SAASC,WAAW,QAAQ,0BAAyB;AAGrD,SAASC,eAAe,QAAQ,cAAa;AAC7C,SAASC,iBAAiB,QAAQ,0CAAyC"}
@@ -1,5 +1,5 @@
1
- import { getFieldInfo } from '../../utilities/getFieldInfo.js';
2
- import { lexicalToHTML } from '../../utilities/lexicalToHTML.js';
1
+ import { getFieldInfo } from '../../utilities/fields/getFieldInfo.js';
2
+ import { lexicalToHTML } from '../../utilities/lexical/lexicalToHTML.js';
3
3
  import { asyncHandlebars } from './asyncHandlebars.js';
4
4
  import { handlebarsHelpersMap } from './helpersMap.js';
5
5
  export const registerEditorHelper = (payload, schemaPath)=>{
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/libraries/handlebars/helpers.ts"],"sourcesContent":["import type { SerializedEditorState } from 'lexical'\n\nimport { getFieldInfo } from '../../utilities/getFieldInfo.js'\nimport { lexicalToHTML } from '../../utilities/lexicalToHTML.js'\nimport { asyncHandlebars } from './asyncHandlebars.js'\nimport { handlebarsHelpersMap } from './helpersMap.js'\n\nexport const registerEditorHelper = (payload: any, schemaPath: string) => {\n //TODO: add autocomplete ability using handlebars template on PromptEditorField and include custom helpers in dropdown\n\n let fieldInfo = getFieldInfo(payload.collections, schemaPath)\n const schemaPathChunks = schemaPath.split('.')\n\n asyncHandlebars.registerHelper(\n handlebarsHelpersMap.toHTML.name,\n async function (content: SerializedEditorState, options: any) {\n const collectionSlug = schemaPathChunks[0]\n const { ids } = options\n for (const id of ids) {\n //TODO: Find a better way to get schemaPath of defined field in prompt editor\n const path = `${collectionSlug}.${id}`\n fieldInfo = getFieldInfo(payload.collections, path)\n }\n\n let html = ''\n if (\n fieldInfo &&\n 'editor' in fieldInfo &&\n fieldInfo.editor &&\n typeof fieldInfo.editor === 'object' &&\n 'editorConfig' in fieldInfo.editor &&\n fieldInfo.editor.editorConfig\n ) {\n if (\n fieldInfo.editor.editorConfig &&\n typeof fieldInfo.editor.editorConfig === 'object' &&\n 'features' in fieldInfo.editor.editorConfig &&\n 'lexical' in fieldInfo.editor.editorConfig &&\n 'resolvedFeatureMap' in fieldInfo.editor.editorConfig\n ) {\n html = await lexicalToHTML(\n content,\n fieldInfo.editor.editorConfig as any, // as SanitizedServerEditorConfig\n )\n }\n }\n return new asyncHandlebars.SafeString(html)\n },\n )\n}\n"],"names":["getFieldInfo","lexicalToHTML","asyncHandlebars","handlebarsHelpersMap","registerEditorHelper","payload","schemaPath","fieldInfo","collections","schemaPathChunks","split","registerHelper","toHTML","name","content","options","collectionSlug","ids","id","path","html","editor","editorConfig","SafeString"],"mappings":"AAEA,SAASA,YAAY,QAAQ,kCAAiC;AAC9D,SAASC,aAAa,QAAQ,mCAAkC;AAChE,SAASC,eAAe,QAAQ,uBAAsB;AACtD,SAASC,oBAAoB,QAAQ,kBAAiB;AAEtD,OAAO,MAAMC,uBAAuB,CAACC,SAAcC;IACjD,sHAAsH;IAEtH,IAAIC,YAAYP,aAAaK,QAAQG,WAAW,EAAEF;IAClD,MAAMG,mBAAmBH,WAAWI,KAAK,CAAC;IAE1CR,gBAAgBS,cAAc,CAC5BR,qBAAqBS,MAAM,CAACC,IAAI,EAChC,eAAgBC,OAA8B,EAAEC,OAAY;QAC1D,MAAMC,iBAAiBP,gBAAgB,CAAC,EAAE;QAC1C,MAAM,EAAEQ,GAAG,EAAE,GAAGF;QAChB,KAAK,MAAMG,MAAMD,IAAK;YACpB,6EAA6E;YAC7E,MAAME,OAAO,CAAC,EAAEH,eAAe,CAAC,EAAEE,GAAG,CAAC;YACtCX,YAAYP,aAAaK,QAAQG,WAAW,EAAEW;QAChD;QAEA,IAAIC,OAAO;QACX,IACEb,aACA,YAAYA,aACZA,UAAUc,MAAM,IAChB,OAAOd,UAAUc,MAAM,KAAK,YAC5B,kBAAkBd,UAAUc,MAAM,IAClCd,UAAUc,MAAM,CAACC,YAAY,EAC7B;YACA,IACEf,UAAUc,MAAM,CAACC,YAAY,IAC7B,OAAOf,UAAUc,MAAM,CAACC,YAAY,KAAK,YACzC,cAAcf,UAAUc,MAAM,CAACC,YAAY,IAC3C,aAAaf,UAAUc,MAAM,CAACC,YAAY,IAC1C,wBAAwBf,UAAUc,MAAM,CAACC,YAAY,EACrD;gBACAF,OAAO,MAAMnB,cACXa,SACAP,UAAUc,MAAM,CAACC,YAAY;YAEjC;QACF;QACA,OAAO,IAAIpB,gBAAgBqB,UAAU,CAACH;IACxC;AAEJ,EAAC"}
1
+ {"version":3,"sources":["../../../src/libraries/handlebars/helpers.ts"],"sourcesContent":["import type { SerializedEditorState } from 'lexical'\n\nimport { getFieldInfo } from '../../utilities/fields/getFieldInfo.js'\nimport { lexicalToHTML } from '../../utilities/lexical/lexicalToHTML.js'\nimport { asyncHandlebars } from './asyncHandlebars.js'\nimport { handlebarsHelpersMap } from './helpersMap.js'\n\nexport const registerEditorHelper = (payload: any, schemaPath: string) => {\n //TODO: add autocomplete ability using handlebars template on PromptEditorField and include custom helpers in dropdown\n\n let fieldInfo = getFieldInfo(payload.collections, schemaPath)\n const schemaPathChunks = schemaPath.split('.')\n\n asyncHandlebars.registerHelper(\n handlebarsHelpersMap.toHTML.name,\n async function (content: SerializedEditorState, options: any) {\n const collectionSlug = schemaPathChunks[0]\n const { ids } = options\n for (const id of ids) {\n //TODO: Find a better way to get schemaPath of defined field in prompt editor\n const path = `${collectionSlug}.${id}`\n fieldInfo = getFieldInfo(payload.collections, path)\n }\n\n let html = ''\n if (\n fieldInfo &&\n 'editor' in fieldInfo &&\n fieldInfo.editor &&\n typeof fieldInfo.editor === 'object' &&\n 'editorConfig' in fieldInfo.editor &&\n fieldInfo.editor.editorConfig\n ) {\n if (\n fieldInfo.editor.editorConfig &&\n typeof fieldInfo.editor.editorConfig === 'object' &&\n 'features' in fieldInfo.editor.editorConfig &&\n 'lexical' in fieldInfo.editor.editorConfig &&\n 'resolvedFeatureMap' in fieldInfo.editor.editorConfig\n ) {\n html = await lexicalToHTML(\n content,\n fieldInfo.editor.editorConfig as any, // as SanitizedServerEditorConfig\n )\n }\n }\n return new asyncHandlebars.SafeString(html)\n },\n )\n}\n"],"names":["getFieldInfo","lexicalToHTML","asyncHandlebars","handlebarsHelpersMap","registerEditorHelper","payload","schemaPath","fieldInfo","collections","schemaPathChunks","split","registerHelper","toHTML","name","content","options","collectionSlug","ids","id","path","html","editor","editorConfig","SafeString"],"mappings":"AAEA,SAASA,YAAY,QAAQ,yCAAwC;AACrE,SAASC,aAAa,QAAQ,2CAA0C;AACxE,SAASC,eAAe,QAAQ,uBAAsB;AACtD,SAASC,oBAAoB,QAAQ,kBAAiB;AAEtD,OAAO,MAAMC,uBAAuB,CAACC,SAAcC;IACjD,sHAAsH;IAEtH,IAAIC,YAAYP,aAAaK,QAAQG,WAAW,EAAEF;IAClD,MAAMG,mBAAmBH,WAAWI,KAAK,CAAC;IAE1CR,gBAAgBS,cAAc,CAC5BR,qBAAqBS,MAAM,CAACC,IAAI,EAChC,eAAgBC,OAA8B,EAAEC,OAAY;QAC1D,MAAMC,iBAAiBP,gBAAgB,CAAC,EAAE;QAC1C,MAAM,EAAEQ,GAAG,EAAE,GAAGF;QAChB,KAAK,MAAMG,MAAMD,IAAK;YACpB,6EAA6E;YAC7E,MAAME,OAAO,CAAC,EAAEH,eAAe,CAAC,EAAEE,GAAG,CAAC;YACtCX,YAAYP,aAAaK,QAAQG,WAAW,EAAEW;QAChD;QAEA,IAAIC,OAAO;QACX,IACEb,aACA,YAAYA,aACZA,UAAUc,MAAM,IAChB,OAAOd,UAAUc,MAAM,KAAK,YAC5B,kBAAkBd,UAAUc,MAAM,IAClCd,UAAUc,MAAM,CAACC,YAAY,EAC7B;YACA,IACEf,UAAUc,MAAM,CAACC,YAAY,IAC7B,OAAOf,UAAUc,MAAM,CAACC,YAAY,KAAK,YACzC,cAAcf,UAAUc,MAAM,CAACC,YAAY,IAC3C,aAAaf,UAAUc,MAAM,CAACC,YAAY,IAC1C,wBAAwBf,UAAUc,MAAM,CAACC,YAAY,EACrD;gBACAF,OAAO,MAAMnB,cACXa,SACAP,UAAUc,MAAM,CAACC,YAAY;YAEjC;QACF;QACA,OAAO,IAAIpB,gBAAgBqB,UAAU,CAACH;IACxC;AAEJ,EAAC"}
@@ -1,6 +1,10 @@
1
1
  import { asyncHandlebars } from './asyncHandlebars.js';
2
2
  export const replacePlaceholders = (prompt, values)=>{
3
- return asyncHandlebars.compile(prompt, {
3
+ // Sanitize {{ #fieldName }} or {{#fieldName}} to {{ fieldName }}
4
+ // so Handlebars doesn't confuse it for a block helper and throw parse errors.
5
+ // We ignore standard Handlebars block helpers: if, unless, each, with
6
+ const sanitizedPrompt = typeof prompt === 'string' ? prompt.replace(/\{\{\s*#\s*(?!if\b|unless\b|each\b|with\b)([\w.]+)\s*\}\}/g, '{{ $1 }}') : prompt;
7
+ return asyncHandlebars.compile(sanitizedPrompt, {
4
8
  trackIds: true
5
9
  })(values);
6
10
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/libraries/handlebars/replacePlaceholders.ts"],"sourcesContent":["import { asyncHandlebars } from './asyncHandlebars.js'\n\nexport const replacePlaceholders = (prompt: string, values: object) => {\n return asyncHandlebars.compile(prompt, { trackIds: true })(values) as Promise<string>\n}\n"],"names":["asyncHandlebars","replacePlaceholders","prompt","values","compile","trackIds"],"mappings":"AAAA,SAASA,eAAe,QAAQ,uBAAsB;AAEtD,OAAO,MAAMC,sBAAsB,CAACC,QAAgBC;IAClD,OAAOH,gBAAgBI,OAAO,CAACF,QAAQ;QAAEG,UAAU;IAAK,GAAGF;AAC7D,EAAC"}
1
+ {"version":3,"sources":["../../../src/libraries/handlebars/replacePlaceholders.ts"],"sourcesContent":["import { asyncHandlebars } from './asyncHandlebars.js'\n\nexport const replacePlaceholders = (prompt: string, values: object) => {\n // Sanitize {{ #fieldName }} or {{#fieldName}} to {{ fieldName }}\n // so Handlebars doesn't confuse it for a block helper and throw parse errors.\n // We ignore standard Handlebars block helpers: if, unless, each, with\n const sanitizedPrompt = typeof prompt === 'string'\n ? prompt.replace(/\\{\\{\\s*#\\s*(?!if\\b|unless\\b|each\\b|with\\b)([\\w.]+)\\s*\\}\\}/g, '{{ $1 }}')\n : prompt\n\n return asyncHandlebars.compile(sanitizedPrompt, { trackIds: true })(values) as Promise<string>\n}\n"],"names":["asyncHandlebars","replacePlaceholders","prompt","values","sanitizedPrompt","replace","compile","trackIds"],"mappings":"AAAA,SAASA,eAAe,QAAQ,uBAAsB;AAEtD,OAAO,MAAMC,sBAAsB,CAACC,QAAgBC;IAClD,iEAAiE;IACjE,8EAA8E;IAC9E,sEAAsE;IACtE,MAAMC,kBAAkB,OAAOF,WAAW,WACtCA,OAAOG,OAAO,CAAC,8DAA8D,cAC7EH;IAEJ,OAAOF,gBAAgBM,OAAO,CAACF,iBAAiB;QAAEG,UAAU;IAAK,GAAGJ;AACtE,EAAC"}
@@ -1,14 +1,9 @@
1
1
  // Global type definitions for @ai-stack/payloadcms
2
2
  // This file augments the Payload types using inline type definitions
3
3
 
4
- import type { GenerateObjectResult, ImagePart, JSONValue, ModelMessage } from 'ai'
4
+ import type { GenerateObjectResult, GenerateTextResult, ImagePart, JSONValue, ModelMessage, StreamTextResult, ToolSet } from 'ai'
5
5
  import type { z } from 'zod'
6
6
 
7
- /**
8
- * Provider options compatible with AI SDK
9
- */
10
- type ProviderOptions = Record<string, Record<string, JSONValue>>
11
-
12
7
  /**
13
8
  * Base arguments for all generation methods
14
9
  */
@@ -19,7 +14,6 @@ interface PayloadGenerationBaseArgs {
19
14
  model?: string
20
15
  prompt: string
21
16
  provider?: string
22
- providerOptions?: ProviderOptions
23
17
  system?: string
24
18
  temperature?: number
25
19
  }
@@ -37,9 +31,7 @@ interface PayloadGenerateObjectArgs extends PayloadGenerationBaseArgs {
37
31
  /**
38
32
  * Arguments for generateText - simple text generation
39
33
  */
40
- interface PayloadGenerateTextArgs extends PayloadGenerationBaseArgs {
41
- // No additional fields needed for basic text generation
42
- }
34
+ type PayloadGenerateTextArgs = PayloadGenerationBaseArgs
43
35
 
44
36
  /**
45
37
  * Arguments for generateMedia - image/video generation
@@ -57,7 +49,6 @@ interface PayloadGenerateMediaArgs {
57
49
  n?: number
58
50
  prompt: string
59
51
  provider?: string
60
- providerOptions?: ProviderOptions
61
52
  seed?: number
62
53
  size?: { height: number; width: number }
63
54
  speed?: number
@@ -86,11 +77,6 @@ interface MediaResult {
86
77
  declare module 'payload' {
87
78
  interface BasePayload {
88
79
  ai: {
89
- /**
90
- * @deprecated Use generateObject or generateText instead
91
- * Legacy generate method for backward compatibility
92
- */
93
- generate: (args: unknown) => Promise<unknown>
94
80
 
95
81
  /**
96
82
  * Generate media (images or videos)
@@ -111,7 +97,7 @@ declare module 'payload' {
111
97
  * @param args - Generation arguments including provider, model, and prompt
112
98
  * @returns Promise resolving to the generated text
113
99
  */
114
- generateText: (args: PayloadGenerateTextArgs) => Promise<string>
100
+ generateText: (args: PayloadGenerateTextArgs) => Promise<GenerateTextResult<ToolSet, unknown>>
115
101
 
116
102
  /**
117
103
  * Get a specific model instance
@@ -137,14 +123,14 @@ declare module 'payload' {
137
123
  * @param args - Generation arguments including provider, model, prompt, and schema
138
124
  * @returns Response stream
139
125
  */
140
- streamObject: <T = unknown>(args: PayloadGenerateObjectArgs) => Promise<Response>
126
+ streamObject: (args: PayloadGenerateObjectArgs) => Promise<Response>
141
127
 
142
128
  /**
143
129
  * Stream text output
144
130
  * @param args - Generation arguments including provider, model, and prompt
145
131
  * @returns Response stream
146
132
  */
147
- streamText: (args: PayloadGenerateTextArgs) => Promise<Response>
133
+ streamText: (args: PayloadGenerateTextArgs) => Promise<StreamTextResult<ToolSet, unknown>>
148
134
  }
149
135
  }
150
136
  }