@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
@@ -1,10 +1,9 @@
1
1
  'use client';
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
- import { useForm } from '@payloadcms/ui';
4
- import { getSiblingData } from 'payload/shared';
3
+ import { useConfig, useField, useLocale, useTranslation } from '@payloadcms/ui';
5
4
  import React, { useEffect, useMemo, useState } from 'react';
6
5
  import { useFieldProps } from '../../../../providers/FieldProvider/useFieldProps.js';
7
- import { Compose, Proofread, Rephrase } from './items.js';
6
+ import { Compose, Proofread, Rephrase, Translate } from './items.js';
8
7
  import { menuItemsMap } from './itemsMap.js';
9
8
  import styles from './menu.module.scss';
10
9
  const getActiveComponent = (ac)=>{
@@ -15,36 +14,47 @@ const getActiveComponent = (ac)=>{
15
14
  return Proofread;
16
15
  case 'Rephrase':
17
16
  return Rephrase;
17
+ case 'Translate':
18
+ return Translate;
18
19
  default:
19
20
  return Rephrase;
20
21
  }
21
22
  };
22
23
  export const useMenu = (menuEvents, options)=>{
23
24
  const { field: { type: fieldType } = {}, path } = useFieldProps();
24
- const { getData } = useForm();
25
+ const { value } = useField({
26
+ path: path || ''
27
+ });
28
+ const { config } = useConfig();
29
+ const locale = useLocale();
30
+ const { t } = useTranslation();
25
31
  const [activeComponent, setActiveComponent] = useState('Rephrase');
26
- // Check value once on mount or when path/type changes
32
+ // Check value whenever it changes
27
33
  useEffect(()=>{
28
34
  let hasValue = false;
29
35
  try {
30
- const data = getData();
31
- if (path) {
32
- const val = getSiblingData(data, path);
33
- hasValue = val !== undefined && val !== null;
34
- // For richTextFields, we might need a more robust check (e.g. check for root.children.length > 0)
35
- // But for now, simple truthiness covers most cases or at least defaults safely
36
- if (fieldType === 'richText' && val && typeof val === 'object' && 'root' in val) {
37
- // Basic lexical check could go here if needed
38
- }
36
+ hasValue = value !== undefined && value !== null;
37
+ // For richTextFields, we might need a more robust check (e.g. check for root.children.length > 0)
38
+ // But for now, simple truthiness covers most cases or at least defaults safely
39
+ if (fieldType === 'richText' && value && typeof value === 'object' && 'root' in value) {
40
+ // Basic lexical check could go here if needed
39
41
  }
40
42
  } catch (e) {
41
43
  // ignore
42
44
  }
43
45
  if (!hasValue) {
44
- setActiveComponent('Compose');
46
+ const defaultLocale = config?.localization ? config.localization.defaultLocale : undefined;
47
+ const translateItem = menuItemsMap.find((i)=>i.name === 'Translate');
48
+ const isTranslateExcluded = translateItem?.excludedFor?.includes(fieldType ?? '');
49
+ if (!isTranslateExcluded && locale?.code && defaultLocale && locale.code !== defaultLocale) {
50
+ setActiveComponent('Translate');
51
+ } else {
52
+ setActiveComponent('Compose');
53
+ }
45
54
  return;
46
55
  }
47
- if (menuItemsMap.some((i)=>i.excludedFor?.includes(fieldType ?? ''))) {
56
+ const rephraseItem = menuItemsMap.find((i)=>i.name === 'Rephrase');
57
+ if (rephraseItem?.excludedFor?.includes(fieldType ?? '')) {
48
58
  setActiveComponent('Compose');
49
59
  return;
50
60
  }
@@ -52,8 +62,9 @@ export const useMenu = (menuEvents, options)=>{
52
62
  setActiveComponent('Rephrase');
53
63
  }, [
54
64
  fieldType,
55
- getData,
56
- path
65
+ value,
66
+ locale?.code,
67
+ config?.localization
57
68
  ]);
58
69
  const MemoizedActiveComponent = useMemo(()=>{
59
70
  return ({ isLoading, loadingLabel, stop })=>{
@@ -65,7 +76,16 @@ export const useMenu = (menuEvents, options)=>{
65
76
  if (!isLoading) {
66
77
  const trigger = menuEvents[`on${activeComponent}`];
67
78
  if (typeof trigger === 'function') {
68
- trigger(data);
79
+ const isEvent = data && typeof data === 'object' && 'nativeEvent' in data;
80
+ const actualData = isEvent ? undefined : data;
81
+ if (activeComponent === 'Translate' && !actualData) {
82
+ trigger({
83
+ locale: locale?.code,
84
+ translateFromDefault: true
85
+ });
86
+ } else {
87
+ trigger(actualData);
88
+ }
69
89
  } else {
70
90
  console.error('No trigger found for', activeComponent);
71
91
  }
@@ -73,13 +93,15 @@ export const useMenu = (menuEvents, options)=>{
73
93
  stop();
74
94
  }
75
95
  },
76
- title: isLoading ? 'Click to stop' : activeItem.name,
77
- children: isLoading && (loadingLabel ?? activeItem.loadingText)
96
+ title: isLoading ? t('ai-plugin:general:clickToStop') : t(`ai-plugin:actions:${activeItem.name.toLowerCase()}`),
97
+ children: isLoading && (loadingLabel ?? (activeItem.loadingText ? t(`ai-plugin:actionLoading:${activeItem.loadingText.toLowerCase()}`) : null))
78
98
  });
79
99
  };
80
100
  }, [
81
101
  activeComponent,
82
- menuEvents
102
+ menuEvents,
103
+ t,
104
+ locale?.code
83
105
  ]);
84
106
  const filteredMenuItems = useMemo(()=>menuItemsMap.filter((i)=>{
85
107
  if (i.name === 'Settings' && !options.isConfigAllowed) {
@@ -105,7 +127,7 @@ export const useMenu = (menuEvents, options)=>{
105
127
  menuEvents[`on${i.name}`]?.(data);
106
128
  onClose();
107
129
  },
108
- children: isLoading && i.loadingText
130
+ children: isLoading && i.loadingText && t(`ai-plugin:actionLoading:${i.loadingText.toLowerCase()}`)
109
131
  }, i.name);
110
132
  })
111
133
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/useMenu.tsx"],"sourcesContent":["'use client'\n\nimport { useForm } from '@payloadcms/ui'\nimport { getSiblingData } from 'payload/shared'\nimport React, { useEffect, useMemo, useState } from 'react'\n\nimport type { ActionMenuItems, UseMenuEvents, UseMenuOptions } from '../../../../types.js'\n\nimport { useFieldProps } from '../../../../providers/FieldProvider/useFieldProps.js'\nimport { Compose, Proofread, Rephrase } from './items.js'\nimport { menuItemsMap } from './itemsMap.js'\nimport styles from './menu.module.scss'\n\nconst getActiveComponent = (ac: ActionMenuItems) => {\n switch (ac) {\n case 'Compose':\n return Compose\n case 'Proofread':\n return Proofread\n case 'Rephrase':\n return Rephrase\n default:\n return Rephrase\n }\n}\n\nexport const useMenu = (menuEvents: UseMenuEvents, options: UseMenuOptions) => {\n const { field: { type: fieldType } = {}, path } = useFieldProps()\n const { getData } = useForm()\n const [activeComponent, setActiveComponent] = useState<ActionMenuItems>('Rephrase')\n\n // Check value once on mount or when path/type changes\n useEffect(() => {\n let hasValue = false\n\n try {\n const data = getData()\n if (path) {\n const val = getSiblingData(data, path)\n hasValue = val !== undefined && val !== null\n // For richTextFields, we might need a more robust check (e.g. check for root.children.length > 0)\n // But for now, simple truthiness covers most cases or at least defaults safely\n if (fieldType === 'richText' && val && typeof val === 'object' && 'root' in val) {\n // Basic lexical check could go here if needed\n }\n }\n } catch (e) {\n // ignore\n }\n\n if (!hasValue) {\n setActiveComponent('Compose')\n return\n }\n\n if (menuItemsMap.some((i) => i.excludedFor?.includes(fieldType ?? ''))) {\n setActiveComponent('Compose')\n return\n }\n\n // Default to Rephrase if value exists\n setActiveComponent('Rephrase')\n }, [fieldType, getData, path])\n\n const MemoizedActiveComponent = useMemo(() => {\n return ({ isLoading, loadingLabel, stop }: { isLoading: boolean; loadingLabel?: string; stop: () => void }) => {\n const ActiveComponent = getActiveComponent(activeComponent)\n const activeItem = menuItemsMap.find((i) => i.name === activeComponent)!\n return (\n <ActiveComponent\n hideIcon\n onClick={(data: unknown) => {\n if (!isLoading) {\n const trigger = menuEvents[`on${activeComponent}`]\n if (typeof trigger === 'function') {\n trigger(data)\n } else {\n console.error('No trigger found for', activeComponent)\n }\n } else {\n stop()\n }\n }}\n title={isLoading ? 'Click to stop' : activeItem.name}\n >\n {isLoading && (loadingLabel ?? activeItem.loadingText)}\n </ActiveComponent>\n )\n }\n }, [activeComponent, menuEvents])\n\n const filteredMenuItems = useMemo(\n () =>\n menuItemsMap.filter((i) => {\n if (i.name === 'Settings' && !options.isConfigAllowed) {\n return false\n } // Disable settings if a user role is not permitted\n return i.name !== activeComponent && !i.excludedFor?.includes(fieldType ?? '')\n }),\n [activeComponent, fieldType, options.isConfigAllowed],\n )\n\n const MemoizedMenu = useMemo(() => {\n return ({ isLoading, onClose }: { isLoading: boolean; onClose: () => void }) => (\n <div className={styles.menu}>\n {filteredMenuItems.map((i) => {\n const Action = i.component\n return (\n <Action\n disabled={isLoading}\n key={i.name}\n onClick={(data: unknown) => {\n if (i.name !== 'Settings') {\n setActiveComponent(i.name)\n }\n\n menuEvents[`on${i.name}`]?.(data)\n onClose()\n }}\n >\n {isLoading && i.loadingText}\n </Action>\n )\n })}\n </div>\n )\n }, [filteredMenuItems, menuEvents])\n\n return {\n ActiveComponent: MemoizedActiveComponent,\n Menu: MemoizedMenu,\n }\n}\n\n"],"names":["useForm","getSiblingData","React","useEffect","useMemo","useState","useFieldProps","Compose","Proofread","Rephrase","menuItemsMap","styles","getActiveComponent","ac","useMenu","menuEvents","options","field","type","fieldType","path","getData","activeComponent","setActiveComponent","hasValue","data","val","undefined","e","some","i","excludedFor","includes","MemoizedActiveComponent","isLoading","loadingLabel","stop","ActiveComponent","activeItem","find","name","hideIcon","onClick","trigger","console","error","title","loadingText","filteredMenuItems","filter","isConfigAllowed","MemoizedMenu","onClose","div","className","menu","map","Action","component","disabled","Menu"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/useMenu.tsx"],"sourcesContent":["'use client'\n\nimport { useConfig, useField, useLocale, useTranslation } from '@payloadcms/ui'\nimport React, { useEffect, useMemo, useState } from 'react'\n\nimport type {\n PluginAITranslationKeys,\n PluginAITranslations,\n} from '../../../../translations/index.js'\nimport type { ActionMenuItems } from '../../../../types.js'\nimport type { UseMenuEvents, UseMenuOptions } from './types.js'\n\nimport { useFieldProps } from '../../../../providers/FieldProvider/useFieldProps.js'\nimport { Compose, Proofread, Rephrase, Translate } from './items.js'\nimport { menuItemsMap } from './itemsMap.js'\nimport styles from './menu.module.scss'\n\nconst getActiveComponent = (ac: ActionMenuItems) => {\n switch (ac) {\n case 'Compose':\n return Compose\n case 'Proofread':\n return Proofread\n case 'Rephrase':\n return Rephrase\n case 'Translate':\n return Translate\n default:\n return Rephrase\n }\n}\n\nexport const useMenu = (menuEvents: UseMenuEvents, options: UseMenuOptions) => {\n const { field: { type: fieldType } = {}, path } = useFieldProps()\n const { value } = useField<any>({ path: path || '' })\n const { config } = useConfig()\n const locale = useLocale()\n const { t } = useTranslation<PluginAITranslations, PluginAITranslationKeys>()\n const [activeComponent, setActiveComponent] = useState<ActionMenuItems>('Rephrase')\n\n // Check value whenever it changes\n useEffect(() => {\n let hasValue = false\n\n try {\n hasValue = value !== undefined && value !== null\n // For richTextFields, we might need a more robust check (e.g. check for root.children.length > 0)\n // But for now, simple truthiness covers most cases or at least defaults safely\n if (fieldType === 'richText' && value && typeof value === 'object' && 'root' in value) {\n // Basic lexical check could go here if needed\n }\n } catch (e) {\n // ignore\n }\n\n if (!hasValue) {\n const defaultLocale = config?.localization ? config.localization.defaultLocale : undefined\n const translateItem = menuItemsMap.find((i) => i.name === 'Translate')\n const isTranslateExcluded = translateItem?.excludedFor?.includes(fieldType ?? '')\n\n if (!isTranslateExcluded && locale?.code && defaultLocale && locale.code !== defaultLocale) {\n setActiveComponent('Translate')\n } else {\n setActiveComponent('Compose')\n }\n return\n }\n\n const rephraseItem = menuItemsMap.find((i) => i.name === 'Rephrase')\n if (rephraseItem?.excludedFor?.includes(fieldType ?? '')) {\n setActiveComponent('Compose')\n return\n }\n\n // Default to Rephrase if value exists\n setActiveComponent('Rephrase')\n }, [fieldType, value, locale?.code, config?.localization])\n\n const MemoizedActiveComponent = useMemo(() => {\n return ({\n isLoading,\n loadingLabel,\n stop,\n }: {\n isLoading: boolean\n loadingLabel?: string\n stop: () => void\n }) => {\n const ActiveComponent = getActiveComponent(activeComponent)\n const activeItem = menuItemsMap.find((i) => i.name === activeComponent)!\n return (\n <ActiveComponent\n hideIcon\n onClick={(data: unknown) => {\n if (!isLoading) {\n const trigger = menuEvents[`on${activeComponent}`]\n if (typeof trigger === 'function') {\n const isEvent = data && typeof data === 'object' && 'nativeEvent' in data\n const actualData = isEvent ? undefined : data\n\n if (activeComponent === 'Translate' && !actualData) {\n trigger({ locale: locale?.code, translateFromDefault: true })\n } else {\n trigger(actualData)\n }\n } else {\n console.error('No trigger found for', activeComponent)\n }\n } else {\n stop()\n }\n }}\n title={\n isLoading\n ? t('ai-plugin:general:clickToStop' as any)\n : t(`ai-plugin:actions:${activeItem.name.toLowerCase()}` as any)\n }\n >\n {isLoading &&\n (loadingLabel ??\n (activeItem.loadingText ? t(`ai-plugin:actionLoading:${activeItem.loadingText.toLowerCase()}` as any) : null))}\n </ActiveComponent>\n )\n }\n }, [activeComponent, menuEvents, t, locale?.code])\n\n const filteredMenuItems = useMemo(\n () =>\n menuItemsMap.filter((i) => {\n if (i.name === 'Settings' && !options.isConfigAllowed) {\n return false\n } // Disable settings if a user role is not permitted\n return i.name !== activeComponent && !i.excludedFor?.includes(fieldType ?? '')\n }),\n [activeComponent, fieldType, options.isConfigAllowed],\n )\n\n const MemoizedMenu = useMemo(() => {\n return ({ isLoading, onClose }: { isLoading: boolean; onClose: () => void }) => (\n <div className={styles.menu}>\n {filteredMenuItems.map((i) => {\n const Action = i.component\n return (\n <Action\n disabled={isLoading}\n key={i.name}\n onClick={(data: unknown) => {\n if (i.name !== 'Settings') {\n setActiveComponent(i.name)\n }\n\n menuEvents[`on${i.name}`]?.(data)\n onClose()\n }}\n >\n {isLoading && i.loadingText && t(`ai-plugin:actionLoading:${i.loadingText.toLowerCase()}` as any)}\n </Action>\n )\n })}\n </div>\n )\n }, [filteredMenuItems, menuEvents])\n\n return {\n ActiveComponent: MemoizedActiveComponent,\n Menu: MemoizedMenu,\n }\n}\n"],"names":["useConfig","useField","useLocale","useTranslation","React","useEffect","useMemo","useState","useFieldProps","Compose","Proofread","Rephrase","Translate","menuItemsMap","styles","getActiveComponent","ac","useMenu","menuEvents","options","field","type","fieldType","path","value","config","locale","t","activeComponent","setActiveComponent","hasValue","undefined","e","defaultLocale","localization","translateItem","find","i","name","isTranslateExcluded","excludedFor","includes","code","rephraseItem","MemoizedActiveComponent","isLoading","loadingLabel","stop","ActiveComponent","activeItem","hideIcon","onClick","data","trigger","isEvent","actualData","translateFromDefault","console","error","title","toLowerCase","loadingText","filteredMenuItems","filter","isConfigAllowed","MemoizedMenu","onClose","div","className","menu","map","Action","component","disabled","Menu"],"mappings":"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"}
@@ -1,9 +1,8 @@
1
1
  'use client';
2
- import { useForm } from '@payloadcms/ui';
3
- import { getSiblingData } from 'payload/shared';
2
+ import { useConfig, useField, useLocale, useTranslation } from '@payloadcms/ui';
4
3
  import React, { useEffect, useMemo, useState } from 'react';
5
4
  import { useFieldProps } from '../../../../providers/FieldProvider/useFieldProps.js';
6
- import { Compose, Proofread, Rephrase } from './items.js';
5
+ import { Compose, Proofread, Rephrase, Translate } from './items.js';
7
6
  import { menuItemsMap } from './itemsMap.js';
8
7
  import styles from './menu.module.scss';
9
8
  const getActiveComponent = (ac) => {
@@ -14,52 +13,69 @@ const getActiveComponent = (ac) => {
14
13
  return Proofread;
15
14
  case 'Rephrase':
16
15
  return Rephrase;
16
+ case 'Translate':
17
+ return Translate;
17
18
  default:
18
19
  return Rephrase;
19
20
  }
20
21
  };
21
22
  export const useMenu = (menuEvents, options) => {
22
23
  const { field: { type: fieldType } = {}, path } = useFieldProps();
23
- const { getData } = useForm();
24
+ const { value } = useField({ path: path || '' });
25
+ const { config } = useConfig();
26
+ const locale = useLocale();
27
+ const { t } = useTranslation();
24
28
  const [activeComponent, setActiveComponent] = useState('Rephrase');
25
- // Check value once on mount or when path/type changes
29
+ // Check value whenever it changes
26
30
  useEffect(() => {
27
31
  let hasValue = false;
28
32
  try {
29
- const data = getData();
30
- if (path) {
31
- const val = getSiblingData(data, path);
32
- hasValue = val !== undefined && val !== null;
33
- // For richTextFields, we might need a more robust check (e.g. check for root.children.length > 0)
34
- // But for now, simple truthiness covers most cases or at least defaults safely
35
- if (fieldType === 'richText' && val && typeof val === 'object' && 'root' in val) {
36
- // Basic lexical check could go here if needed
37
- }
33
+ hasValue = value !== undefined && value !== null;
34
+ // For richTextFields, we might need a more robust check (e.g. check for root.children.length > 0)
35
+ // But for now, simple truthiness covers most cases or at least defaults safely
36
+ if (fieldType === 'richText' && value && typeof value === 'object' && 'root' in value) {
37
+ // Basic lexical check could go here if needed
38
38
  }
39
39
  }
40
40
  catch (e) {
41
41
  // ignore
42
42
  }
43
43
  if (!hasValue) {
44
- setActiveComponent('Compose');
44
+ const defaultLocale = config?.localization ? config.localization.defaultLocale : undefined;
45
+ const translateItem = menuItemsMap.find((i) => i.name === 'Translate');
46
+ const isTranslateExcluded = translateItem?.excludedFor?.includes(fieldType ?? '');
47
+ if (!isTranslateExcluded && locale?.code && defaultLocale && locale.code !== defaultLocale) {
48
+ setActiveComponent('Translate');
49
+ }
50
+ else {
51
+ setActiveComponent('Compose');
52
+ }
45
53
  return;
46
54
  }
47
- if (menuItemsMap.some((i) => i.excludedFor?.includes(fieldType ?? ''))) {
55
+ const rephraseItem = menuItemsMap.find((i) => i.name === 'Rephrase');
56
+ if (rephraseItem?.excludedFor?.includes(fieldType ?? '')) {
48
57
  setActiveComponent('Compose');
49
58
  return;
50
59
  }
51
60
  // Default to Rephrase if value exists
52
61
  setActiveComponent('Rephrase');
53
- }, [fieldType, getData, path]);
62
+ }, [fieldType, value, locale?.code, config?.localization]);
54
63
  const MemoizedActiveComponent = useMemo(() => {
55
- return ({ isLoading, loadingLabel, stop }) => {
64
+ return ({ isLoading, loadingLabel, stop, }) => {
56
65
  const ActiveComponent = getActiveComponent(activeComponent);
57
66
  const activeItem = menuItemsMap.find((i) => i.name === activeComponent);
58
67
  return (<ActiveComponent hideIcon onClick={(data) => {
59
68
  if (!isLoading) {
60
69
  const trigger = menuEvents[`on${activeComponent}`];
61
70
  if (typeof trigger === 'function') {
62
- trigger(data);
71
+ const isEvent = data && typeof data === 'object' && 'nativeEvent' in data;
72
+ const actualData = isEvent ? undefined : data;
73
+ if (activeComponent === 'Translate' && !actualData) {
74
+ trigger({ locale: locale?.code, translateFromDefault: true });
75
+ }
76
+ else {
77
+ trigger(actualData);
78
+ }
63
79
  }
64
80
  else {
65
81
  console.error('No trigger found for', activeComponent);
@@ -68,11 +84,15 @@ export const useMenu = (menuEvents, options) => {
68
84
  else {
69
85
  stop();
70
86
  }
71
- }} title={isLoading ? 'Click to stop' : activeItem.name}>
72
- {isLoading && (loadingLabel ?? activeItem.loadingText)}
87
+ }} title={isLoading
88
+ ? t('ai-plugin:general:clickToStop')
89
+ : t(`ai-plugin:actions:${activeItem.name.toLowerCase()}`)}>
90
+ {isLoading &&
91
+ (loadingLabel ??
92
+ (activeItem.loadingText ? t(`ai-plugin:actionLoading:${activeItem.loadingText.toLowerCase()}`) : null))}
73
93
  </ActiveComponent>);
74
94
  };
75
- }, [activeComponent, menuEvents]);
95
+ }, [activeComponent, menuEvents, t, locale?.code]);
76
96
  const filteredMenuItems = useMemo(() => menuItemsMap.filter((i) => {
77
97
  if (i.name === 'Settings' && !options.isConfigAllowed) {
78
98
  return false;
@@ -90,7 +110,7 @@ export const useMenu = (menuEvents, options) => {
90
110
  menuEvents[`on${i.name}`]?.(data);
91
111
  onClose();
92
112
  }}>
93
- {isLoading && i.loadingText}
113
+ {isLoading && i.loadingText && t(`ai-plugin:actionLoading:${i.loadingText.toLowerCase()}`)}
94
114
  </Action>);
95
115
  })}
96
116
  </div>);
@@ -0,0 +1,14 @@
1
+ type MergeGeneratedValueArgs = {
2
+ appendGenerated: boolean;
3
+ currentValue: unknown;
4
+ generatedValue: unknown;
5
+ hasMany: boolean;
6
+ max?: number;
7
+ maxRows?: number;
8
+ };
9
+ type MergeGeneratedValueResult = {
10
+ truncated: boolean;
11
+ value: unknown;
12
+ };
13
+ export declare const mergeGeneratedValue: ({ appendGenerated, currentValue, generatedValue, hasMany, max, maxRows, }: MergeGeneratedValueArgs) => MergeGeneratedValueResult;
14
+ export {};
@@ -0,0 +1,38 @@
1
+ const toArray = (value)=>{
2
+ if (Array.isArray(value)) {
3
+ return value;
4
+ }
5
+ if (value === null || value === undefined || value === '') {
6
+ return [];
7
+ }
8
+ return [
9
+ value
10
+ ];
11
+ };
12
+ export const mergeGeneratedValue = ({ appendGenerated, currentValue, generatedValue, hasMany, max, maxRows })=>{
13
+ if (!appendGenerated || !hasMany) {
14
+ return {
15
+ truncated: false,
16
+ value: generatedValue
17
+ };
18
+ }
19
+ const current = toArray(currentValue);
20
+ const generated = toArray(generatedValue);
21
+ const merged = [
22
+ ...current,
23
+ ...generated
24
+ ];
25
+ const limit = typeof maxRows === 'number' ? maxRows : typeof max === 'number' ? max : undefined;
26
+ if (typeof limit === 'number' && limit >= 0 && merged.length > limit) {
27
+ return {
28
+ truncated: true,
29
+ value: merged.slice(0, limit)
30
+ };
31
+ }
32
+ return {
33
+ truncated: false,
34
+ value: merged
35
+ };
36
+ };
37
+
38
+ //# sourceMappingURL=mergeGeneratedValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/ui/Compose/hooks/mergeGeneratedValue.ts"],"sourcesContent":["type MergeGeneratedValueArgs = {\n appendGenerated: boolean\n currentValue: unknown\n generatedValue: unknown\n hasMany: boolean\n max?: number\n maxRows?: number\n}\n\ntype MergeGeneratedValueResult = {\n truncated: boolean\n value: unknown\n}\n\nconst toArray = (value: unknown): unknown[] => {\n if (Array.isArray(value)) {\n return value\n }\n\n if (value === null || value === undefined || value === '') {\n return []\n }\n\n return [value]\n}\n\nexport const mergeGeneratedValue = ({\n appendGenerated,\n currentValue,\n generatedValue,\n hasMany,\n max,\n maxRows,\n}: MergeGeneratedValueArgs): MergeGeneratedValueResult => {\n if (!appendGenerated || !hasMany) {\n return {\n truncated: false,\n value: generatedValue,\n }\n }\n\n const current = toArray(currentValue)\n const generated = toArray(generatedValue)\n\n const merged = [...current, ...generated]\n const limit = typeof maxRows === 'number' ? maxRows : typeof max === 'number' ? max : undefined\n\n if (typeof limit === 'number' && limit >= 0 && merged.length > limit) {\n return {\n truncated: true,\n value: merged.slice(0, limit),\n }\n }\n\n return {\n truncated: false,\n value: merged,\n }\n}\n"],"names":["toArray","value","Array","isArray","undefined","mergeGeneratedValue","appendGenerated","currentValue","generatedValue","hasMany","max","maxRows","truncated","current","generated","merged","limit","length","slice"],"mappings":"AAcA,MAAMA,UAAU,CAACC;IACf,IAAIC,MAAMC,OAAO,CAACF,QAAQ;QACxB,OAAOA;IACT;IAEA,IAAIA,UAAU,QAAQA,UAAUG,aAAaH,UAAU,IAAI;QACzD,OAAO,EAAE;IACX;IAEA,OAAO;QAACA;KAAM;AAChB;AAEA,OAAO,MAAMI,sBAAsB,CAAC,EAClCC,eAAe,EACfC,YAAY,EACZC,cAAc,EACdC,OAAO,EACPC,GAAG,EACHC,OAAO,EACiB;IACxB,IAAI,CAACL,mBAAmB,CAACG,SAAS;QAChC,OAAO;YACLG,WAAW;YACXX,OAAOO;QACT;IACF;IAEA,MAAMK,UAAUb,QAAQO;IACxB,MAAMO,YAAYd,QAAQQ;IAE1B,MAAMO,SAAS;WAAIF;WAAYC;KAAU;IACzC,MAAME,QAAQ,OAAOL,YAAY,WAAWA,UAAU,OAAOD,QAAQ,WAAWA,MAAMN;IAEtF,IAAI,OAAOY,UAAU,YAAYA,SAAS,KAAKD,OAAOE,MAAM,GAAGD,OAAO;QACpE,OAAO;YACLJ,WAAW;YACXX,OAAOc,OAAOG,KAAK,CAAC,GAAGF;QACzB;IACF;IAEA,OAAO;QACLJ,WAAW;QACXX,OAAOc;IACT;AACF,EAAC"}
@@ -5,7 +5,9 @@ import { jsonSchema } from 'ai';
5
5
  import { useCallback, useEffect, useRef } from 'react';
6
6
  import { PLUGIN_API_ENDPOINT_GENERATE } from '../../../defaults.js';
7
7
  import { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js';
8
- import { setSafeLexicalState } from '../../../utilities/setSafeLexicalState.js';
8
+ import { useInstructions } from '../../../providers/InstructionsProvider/useInstructions.js';
9
+ import { setSafeLexicalState } from '../../../utilities/lexical/setSafeLexicalState.js';
10
+ import { mergeGeneratedValue } from './mergeGeneratedValue.js';
9
11
  import { useGenerateUpload } from './useGenerateUpload.js';
10
12
  import { useHistory } from './useHistory.js';
11
13
  import { useStreamingUpdate } from './useStreamingUpdate.js';
@@ -18,15 +20,30 @@ export const useGenerate = ({ instructionId })=>{
18
20
  }, [
19
21
  instructionId
20
22
  ]);
21
- const { field, path: pathFromContext } = useFieldProps();
23
+ const { field, path: pathFromContext, schemaPath } = useFieldProps();
24
+ const { appendGenerated } = useInstructions({
25
+ schemaPath
26
+ });
22
27
  const editorConfigContext = useEditorConfigContext();
23
- const { setValue } = useField({
28
+ const { setValue, value: currentFieldValue } = useField({
24
29
  path: pathFromContext ?? ''
25
30
  });
31
+ const appendGeneratedRef = useRef(!!appendGenerated);
32
+ const currentFieldValueRef = useRef(currentFieldValue);
26
33
  const { set: setHistory } = useHistory();
27
34
  const { getData } = useForm();
28
35
  const { id: documentId } = useDocumentInfo();
29
- const localFromContext = useLocale();
36
+ const locale = useLocale();
37
+ useEffect(()=>{
38
+ appendGeneratedRef.current = !!appendGenerated;
39
+ }, [
40
+ appendGenerated
41
+ ]);
42
+ useEffect(()=>{
43
+ currentFieldValueRef.current = currentFieldValue;
44
+ }, [
45
+ currentFieldValue
46
+ ]);
30
47
  const { isLoading: loadingObject, object, stop: objectStop, submit } = useObject({
31
48
  api: `/api${PLUGIN_API_ENDPOINT_GENERATE}`,
32
49
  onError: (error)=>{
@@ -38,12 +55,21 @@ export const useGenerate = ({ instructionId })=>{
38
55
  if (field.type === 'richText') {
39
56
  setHistory(result.object);
40
57
  setSafeLexicalState(result.object, editor);
41
- } else if ('name' in field && result.object[field.name]) {
42
- setHistory(result.object[field.name]);
43
- setValue(result.object[field.name]);
58
+ } else if ('name' in field && result.object[field.name] !== undefined) {
59
+ const merged = mergeGeneratedValue({
60
+ appendGenerated: appendGeneratedRef.current,
61
+ currentValue: currentFieldValueRef.current,
62
+ generatedValue: result.object[field.name],
63
+ hasMany: field.hasMany === true,
64
+ max: typeof field.max === 'number' ? field.max : undefined,
65
+ maxRows: typeof field.maxRows === 'number' ? field.maxRows : undefined
66
+ });
67
+ if (merged.truncated) {
68
+ toast.info('Appended values were truncated to this field maximum.');
69
+ }
70
+ setHistory(merged.value);
71
+ setValue(merged.value);
44
72
  }
45
- } else {
46
- console.log('onFinish: result, field ', result, field);
47
73
  }
48
74
  },
49
75
  schema: jsonSchema({
@@ -77,11 +103,11 @@ export const useGenerate = ({ instructionId })=>{
77
103
  ...doc,
78
104
  id: documentId
79
105
  },
80
- locale: localFromContext?.code,
106
+ locale: locale?.code,
81
107
  options
82
108
  });
83
109
  }, [
84
- localFromContext?.code,
110
+ locale?.code,
85
111
  instructionIdRef,
86
112
  documentId,
87
113
  getData,
@@ -102,7 +128,6 @@ export const useGenerate = ({ instructionId })=>{
102
128
  field
103
129
  ]);
104
130
  const stop = useCallback(()=>{
105
- console.log('Stopping...');
106
131
  objectStop();
107
132
  }, [
108
133
  objectStop
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/ui/Compose/hooks/useGenerate.ts"],"sourcesContent":["import { experimental_useObject as useObject } from '@ai-sdk/react'\nimport { useEditorConfigContext } from '@payloadcms/richtext-lexical/client'\nimport { toast, useDocumentInfo, useField, useForm, useLocale } from '@payloadcms/ui'\nimport { jsonSchema } from 'ai'\nimport { useCallback, useEffect, useRef } from 'react'\n\nimport type { ActionMenuItems } from '../../../types.js'\n\nimport { PLUGIN_API_ENDPOINT_GENERATE } from '../../../defaults.js'\nimport { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js'\nimport { setSafeLexicalState } from '../../../utilities/setSafeLexicalState.js'\nimport { useGenerateUpload } from './useGenerateUpload.js'\nimport { useHistory } from './useHistory.js'\nimport { useStreamingUpdate } from './useStreamingUpdate.js'\n\ntype ActionCallbackParams = { action: ActionMenuItems; params?: unknown }\n\nexport const useGenerate = ({ instructionId }: { instructionId: string }) => {\n // Create a ref to hold the current instructionId\n const instructionIdRef = useRef(instructionId)\n\n // Update the ref whenever instructionId changes\n useEffect(() => {\n instructionIdRef.current = instructionId\n }, [instructionId])\n\n const { field, path: pathFromContext } = useFieldProps()\n const editorConfigContext = useEditorConfigContext()\n const { setValue } = useField<any>({\n path: pathFromContext ?? '',\n })\n const { set: setHistory } = useHistory()\n const { getData } = useForm()\n const { id: documentId } = useDocumentInfo()\n const localFromContext = useLocale()\n\n const {\n isLoading: loadingObject,\n object,\n stop: objectStop,\n submit,\n } = useObject({\n api: `/api${PLUGIN_API_ENDPOINT_GENERATE}`,\n onError: (error: any) => {\n toast.error(`Failed to generate: ${error.message}`)\n console.error('Error generating object:', error)\n },\n onFinish: (result) => {\n if (result.object && field) {\n if (field.type === 'richText') {\n setHistory(result.object)\n setSafeLexicalState(result.object, editor)\n } else if ('name' in field && result.object[field.name]) {\n setHistory(result.object[field.name])\n setValue(result.object[field.name])\n }\n } else {\n console.log('onFinish: result, field ', result, field)\n }\n },\n schema: jsonSchema({\n type: 'object',\n additionalProperties: true,\n properties: {},\n }) as any,\n })\n\n const { editor } = editorConfigContext\n\n // Hook: Handle high-frequency streaming updates\n useStreamingUpdate({\n editor,\n isLoading: loadingObject,\n object,\n })\n\n // Hook 2: Handle Upload generation and polling\n const { generateUpload, isJobActive, jobProgress, jobStatus } = useGenerateUpload({\n instructionIdRef,\n })\n\n const streamObject = useCallback(\n ({ action = 'Compose', params }: ActionCallbackParams) => {\n const doc = getData()\n\n const currentInstructionId = instructionIdRef.current\n\n const options = {\n action,\n actionParams: params,\n instructionId: currentInstructionId,\n }\n\n submit({\n allowedEditorNodes: Array.from(editor?._nodes?.keys() || []),\n doc: {\n ...doc,\n id: documentId,\n },\n locale: localFromContext?.code,\n options,\n })\n },\n [localFromContext?.code, instructionIdRef, documentId, getData, submit, editor],\n )\n\n const generate = useCallback(\n async (options?: ActionCallbackParams) => {\n if ((field as any)?.type === 'upload') {\n return generateUpload()\n }\n // All supported types use structured object generation when schema is provided server-side\n return streamObject(options ?? { action: 'Compose' })\n },\n [generateUpload, streamObject, field],\n )\n\n const stop = useCallback(() => {\n console.log('Stopping...')\n objectStop()\n }, [objectStop])\n\n return {\n generate,\n isJobActive,\n isLoading: loadingObject,\n jobProgress,\n jobStatus,\n stop,\n }\n}\n"],"names":["experimental_useObject","useObject","useEditorConfigContext","toast","useDocumentInfo","useField","useForm","useLocale","jsonSchema","useCallback","useEffect","useRef","PLUGIN_API_ENDPOINT_GENERATE","useFieldProps","setSafeLexicalState","useGenerateUpload","useHistory","useStreamingUpdate","useGenerate","instructionId","instructionIdRef","current","field","path","pathFromContext","editorConfigContext","setValue","set","setHistory","getData","id","documentId","localFromContext","isLoading","loadingObject","object","stop","objectStop","submit","api","onError","error","message","console","onFinish","result","type","editor","name","log","schema","additionalProperties","properties","generateUpload","isJobActive","jobProgress","jobStatus","streamObject","action","params","doc","currentInstructionId","options","actionParams","allowedEditorNodes","Array","from","_nodes","keys","locale","code","generate"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/ui/Compose/hooks/useGenerate.ts"],"sourcesContent":["import { experimental_useObject as useObject } from '@ai-sdk/react'\nimport { useEditorConfigContext } from '@payloadcms/richtext-lexical/client'\nimport { toast, useDocumentInfo, useField, useForm, useLocale } from '@payloadcms/ui'\nimport { jsonSchema } from 'ai'\nimport { useCallback, useEffect, useRef } from 'react'\n\nimport type { ActionMenuItems } from '../../../types.js'\n\nimport { PLUGIN_API_ENDPOINT_GENERATE } from '../../../defaults.js'\nimport { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js'\nimport { useInstructions } from '../../../providers/InstructionsProvider/useInstructions.js'\nimport { setSafeLexicalState } from '../../../utilities/lexical/setSafeLexicalState.js'\nimport { mergeGeneratedValue } from './mergeGeneratedValue.js'\nimport { useGenerateUpload } from './useGenerateUpload.js'\nimport { useHistory } from './useHistory.js'\nimport { useStreamingUpdate } from './useStreamingUpdate.js'\n\ntype ActionCallbackParams = { action: ActionMenuItems; params?: unknown }\n\nexport const useGenerate = ({ instructionId }: { instructionId: string }) => {\n // Create a ref to hold the current instructionId\n const instructionIdRef = useRef(instructionId)\n\n // Update the ref whenever instructionId changes\n useEffect(() => {\n instructionIdRef.current = instructionId\n }, [instructionId])\n\n const { field, path: pathFromContext, schemaPath } = useFieldProps()\n const { appendGenerated } = useInstructions({ schemaPath })\n const editorConfigContext = useEditorConfigContext()\n const { setValue, value: currentFieldValue } = useField<any>({\n path: pathFromContext ?? '',\n })\n const appendGeneratedRef = useRef(!!appendGenerated)\n const currentFieldValueRef = useRef(currentFieldValue)\n const { set: setHistory } = useHistory()\n const { getData } = useForm()\n const { id: documentId } = useDocumentInfo()\n const locale = useLocale()\n\n useEffect(() => {\n appendGeneratedRef.current = !!appendGenerated\n }, [appendGenerated])\n\n useEffect(() => {\n currentFieldValueRef.current = currentFieldValue\n }, [currentFieldValue])\n\n const {\n isLoading: loadingObject,\n object,\n stop: objectStop,\n submit,\n } = useObject({\n api: `/api${PLUGIN_API_ENDPOINT_GENERATE}`,\n onError: (error: any) => {\n toast.error(`Failed to generate: ${error.message}`)\n console.error('Error generating object:', error)\n },\n onFinish: (result) => {\n if (result.object && field) {\n if (field.type === 'richText') {\n setHistory(result.object)\n setSafeLexicalState(result.object, editor)\n } else if ('name' in field && result.object[field.name] !== undefined) {\n const merged = mergeGeneratedValue({\n appendGenerated: appendGeneratedRef.current,\n currentValue: currentFieldValueRef.current,\n generatedValue: result.object[field.name],\n hasMany: (field as any).hasMany === true,\n max: typeof (field as any).max === 'number' ? (field as any).max : undefined,\n maxRows: typeof (field as any).maxRows === 'number' ? (field as any).maxRows : undefined,\n })\n\n if (merged.truncated) {\n toast.info('Appended values were truncated to this field maximum.')\n }\n\n setHistory(merged.value)\n setValue(merged.value)\n }\n }\n },\n schema: jsonSchema({\n type: 'object',\n additionalProperties: true,\n properties: {},\n }) as any,\n })\n\n const { editor } = editorConfigContext\n\n // Hook: Handle high-frequency streaming updates\n useStreamingUpdate({\n editor,\n isLoading: loadingObject,\n object,\n })\n\n // Hook 2: Handle Upload generation and polling\n const { generateUpload, isJobActive, jobProgress, jobStatus } = useGenerateUpload({\n instructionIdRef,\n })\n\n const streamObject = useCallback(\n ({ action = 'Compose', params }: ActionCallbackParams) => {\n const doc = getData()\n\n const currentInstructionId = instructionIdRef.current\n\n const options = {\n action,\n actionParams: params,\n instructionId: currentInstructionId,\n }\n\n submit({\n allowedEditorNodes: Array.from(editor?._nodes?.keys() || []),\n doc: {\n ...doc,\n id: documentId,\n },\n locale: locale?.code,\n options,\n })\n },\n [locale?.code, instructionIdRef, documentId, getData, submit, editor],\n )\n\n const generate = useCallback(\n async (options?: ActionCallbackParams) => {\n if ((field as any)?.type === 'upload') {\n return generateUpload()\n }\n // All supported types use structured object generation when schema is provided server-side\n return streamObject(options ?? { action: 'Compose' })\n },\n [generateUpload, streamObject, field],\n )\n\n const stop = useCallback(() => {\n objectStop()\n }, [objectStop])\n\n return {\n generate,\n isJobActive,\n isLoading: loadingObject,\n jobProgress,\n jobStatus,\n stop,\n }\n}\n"],"names":["experimental_useObject","useObject","useEditorConfigContext","toast","useDocumentInfo","useField","useForm","useLocale","jsonSchema","useCallback","useEffect","useRef","PLUGIN_API_ENDPOINT_GENERATE","useFieldProps","useInstructions","setSafeLexicalState","mergeGeneratedValue","useGenerateUpload","useHistory","useStreamingUpdate","useGenerate","instructionId","instructionIdRef","current","field","path","pathFromContext","schemaPath","appendGenerated","editorConfigContext","setValue","value","currentFieldValue","appendGeneratedRef","currentFieldValueRef","set","setHistory","getData","id","documentId","locale","isLoading","loadingObject","object","stop","objectStop","submit","api","onError","error","message","console","onFinish","result","type","editor","name","undefined","merged","currentValue","generatedValue","hasMany","max","maxRows","truncated","info","schema","additionalProperties","properties","generateUpload","isJobActive","jobProgress","jobStatus","streamObject","action","params","doc","currentInstructionId","options","actionParams","allowedEditorNodes","Array","from","_nodes","keys","code","generate"],"mappings":"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"}