@ai-stack/payloadcms 3.2.26 → 3.68.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) hide show
  1. package/{LICENSE.md → LICENSE} +1 -1
  2. package/README.md +218 -229
  3. package/dist/access/checkAccess.d.ts +4 -0
  4. package/dist/access/checkAccess.js +20 -0
  5. package/dist/access/checkAccess.js.map +1 -0
  6. package/dist/ai/core/generateObject.d.ts +7 -0
  7. package/dist/ai/core/generateObject.js +35 -0
  8. package/dist/ai/core/generateObject.js.map +1 -0
  9. package/dist/ai/core/generateText.d.ts +7 -0
  10. package/dist/ai/core/generateText.js +31 -0
  11. package/dist/ai/core/generateText.js.map +1 -0
  12. package/dist/ai/core/index.d.ts +11 -0
  13. package/dist/ai/core/index.js +10 -0
  14. package/dist/ai/core/index.js.map +1 -0
  15. package/dist/ai/core/media/generateMedia.d.ts +7 -0
  16. package/dist/ai/core/media/generateMedia.js +50 -0
  17. package/dist/ai/core/media/generateMedia.js.map +1 -0
  18. package/dist/ai/core/media/image/generateImage.d.ts +6 -0
  19. package/dist/ai/core/media/image/generateImage.js +41 -0
  20. package/dist/ai/core/media/image/generateImage.js.map +1 -0
  21. package/dist/ai/core/media/image/handlers/multimodal.d.ts +7 -0
  22. package/dist/ai/core/media/image/handlers/multimodal.js +100 -0
  23. package/dist/ai/core/media/image/handlers/multimodal.js.map +1 -0
  24. package/dist/ai/core/media/image/handlers/standard.d.ts +7 -0
  25. package/dist/ai/core/media/image/handlers/standard.js +28 -0
  26. package/dist/ai/core/media/image/handlers/standard.js.map +1 -0
  27. package/dist/ai/core/media/image/index.d.ts +2 -0
  28. package/dist/ai/core/media/image/index.js +3 -0
  29. package/dist/ai/core/media/image/index.js.map +1 -0
  30. package/dist/ai/core/media/index.d.ts +2 -0
  31. package/dist/ai/core/media/index.js +3 -0
  32. package/dist/ai/core/media/index.js.map +1 -0
  33. package/dist/ai/core/media/speech/generateSpeech.d.ts +5 -0
  34. package/dist/ai/core/media/speech/generateSpeech.js +55 -0
  35. package/dist/ai/core/media/speech/generateSpeech.js.map +1 -0
  36. package/dist/ai/core/media/speech/index.d.ts +2 -0
  37. package/dist/ai/core/media/speech/index.js +3 -0
  38. package/dist/ai/core/media/speech/index.js.map +1 -0
  39. package/dist/ai/core/media/types.d.ts +74 -0
  40. package/dist/ai/core/media/types.js +5 -0
  41. package/dist/ai/core/media/types.js.map +1 -0
  42. package/dist/ai/core/media/utils.d.ts +11 -0
  43. package/dist/ai/core/media/utils.js +34 -0
  44. package/dist/ai/core/media/utils.js.map +1 -0
  45. package/dist/ai/core/media/video/generateVideo.d.ts +6 -0
  46. package/dist/ai/core/media/video/generateVideo.js +32 -0
  47. package/dist/ai/core/media/video/generateVideo.js.map +1 -0
  48. package/dist/ai/core/media/video/index.d.ts +2 -0
  49. package/dist/ai/core/media/video/index.js +3 -0
  50. package/dist/ai/core/media/video/index.js.map +1 -0
  51. package/dist/ai/core/streamObject.d.ts +7 -0
  52. package/dist/ai/core/streamObject.js +54 -0
  53. package/dist/ai/core/streamObject.js.map +1 -0
  54. package/dist/ai/core/streamText.d.ts +7 -0
  55. package/dist/ai/core/streamText.js +30 -0
  56. package/dist/ai/core/streamText.js.map +1 -0
  57. package/dist/ai/core/types.d.ts +85 -0
  58. package/dist/ai/core/types.js +5 -0
  59. package/dist/ai/core/types.js.map +1 -0
  60. package/dist/ai/index.d.ts +11 -0
  61. package/dist/ai/index.js +25 -0
  62. package/dist/ai/index.js.map +1 -0
  63. package/dist/ai/providers/blocks/anthropic.d.ts +2 -0
  64. package/dist/ai/providers/blocks/anthropic.js +223 -0
  65. package/dist/ai/providers/blocks/anthropic.js.map +1 -0
  66. package/dist/ai/providers/blocks/elevenlabs.d.ts +2 -0
  67. package/dist/ai/providers/blocks/elevenlabs.js +449 -0
  68. package/dist/ai/providers/blocks/elevenlabs.js.map +1 -0
  69. package/dist/ai/providers/blocks/fal.d.ts +2 -0
  70. package/dist/ai/providers/blocks/fal.js +312 -0
  71. package/dist/ai/providers/blocks/fal.js.map +1 -0
  72. package/dist/ai/providers/blocks/google.d.ts +2 -0
  73. package/dist/ai/providers/blocks/google.js +623 -0
  74. package/dist/ai/providers/blocks/google.js.map +1 -0
  75. package/dist/ai/providers/blocks/index.d.ts +2 -0
  76. package/dist/ai/providers/blocks/index.js +18 -0
  77. package/dist/ai/providers/blocks/index.js.map +1 -0
  78. package/dist/ai/providers/blocks/openai-compatible.d.ts +2 -0
  79. package/dist/ai/providers/blocks/openai-compatible.js +308 -0
  80. package/dist/ai/providers/blocks/openai-compatible.js.map +1 -0
  81. package/dist/ai/providers/blocks/openai.d.ts +2 -0
  82. package/dist/ai/providers/blocks/openai.js +600 -0
  83. package/dist/ai/providers/blocks/openai.js.map +1 -0
  84. package/dist/ai/providers/blocks/xai.d.ts +2 -0
  85. package/dist/ai/providers/blocks/xai.js +247 -0
  86. package/dist/ai/providers/blocks/xai.js.map +1 -0
  87. package/dist/ai/providers/icons.d.ts +7 -0
  88. package/dist/ai/providers/icons.js +9 -0
  89. package/dist/ai/providers/icons.js.map +1 -0
  90. package/dist/ai/providers/index.d.ts +2 -0
  91. package/dist/ai/providers/index.js +6 -0
  92. package/dist/ai/providers/index.js.map +1 -0
  93. package/dist/ai/providers/registry.d.ts +40 -0
  94. package/dist/ai/providers/registry.js +267 -0
  95. package/dist/ai/providers/registry.js.map +1 -0
  96. package/dist/ai/providers/types.d.ts +115 -0
  97. package/dist/ai/providers/types.js +4 -0
  98. package/dist/ai/providers/types.js.map +1 -0
  99. package/dist/ai/utils/systemGenerate.d.ts +1 -1
  100. package/dist/ai/utils/systemGenerate.js +19 -19
  101. package/dist/ai/utils/systemGenerate.js.map +1 -1
  102. package/dist/collections/AIJobs.d.ts +2 -0
  103. package/dist/collections/AIJobs.js +81 -0
  104. package/dist/collections/AIJobs.js.map +1 -0
  105. package/dist/collections/AISettings.d.ts +2 -0
  106. package/dist/collections/AISettings.js +279 -0
  107. package/dist/collections/AISettings.js.map +1 -0
  108. package/dist/collections/Instructions.js +224 -50
  109. package/dist/collections/Instructions.js.map +1 -1
  110. package/dist/defaults.d.ts +3 -0
  111. package/dist/defaults.js +3 -0
  112. package/dist/defaults.js.map +1 -1
  113. package/dist/endpoints/buildPromptUtils.d.ts +19 -0
  114. package/dist/endpoints/buildPromptUtils.js +114 -0
  115. package/dist/endpoints/buildPromptUtils.js.map +1 -0
  116. package/dist/endpoints/chat.d.ts +4 -0
  117. package/dist/endpoints/fetchFields.js +0 -7
  118. package/dist/endpoints/fetchFields.js.map +1 -1
  119. package/dist/endpoints/fetchVoices.d.ts +2 -0
  120. package/dist/endpoints/fetchVoices.js +79 -0
  121. package/dist/endpoints/fetchVoices.js.map +1 -0
  122. package/dist/endpoints/index.js +339 -232
  123. package/dist/endpoints/index.js.map +1 -1
  124. package/dist/exports/client.d.ts +9 -0
  125. package/dist/exports/client.js +9 -0
  126. package/dist/exports/client.js.map +1 -1
  127. package/dist/exports/fields.d.ts +1 -0
  128. package/dist/exports/fields.js +1 -0
  129. package/dist/exports/fields.js.map +1 -1
  130. package/dist/fields/ArrayComposeField/ArrayComposeField.d.ts +15 -0
  131. package/dist/fields/ArrayComposeField/ArrayComposeField.js +87 -0
  132. package/dist/fields/ArrayComposeField/ArrayComposeField.js.map +1 -0
  133. package/dist/fields/ArrayComposeField/ArrayComposeField.jsx +73 -0
  134. package/dist/fields/ComposeField/ComposeField.js +2 -2
  135. package/dist/fields/ComposeField/ComposeField.js.map +1 -1
  136. package/dist/fields/ComposeField/ComposeField.jsx +2 -2
  137. package/dist/fields/PromptEditorField/PromptEditorField.js +162 -16
  138. package/dist/fields/PromptEditorField/PromptEditorField.js.map +1 -1
  139. package/dist/fields/PromptEditorField/PromptEditorField.jsx +123 -5
  140. package/dist/index.d.ts +3 -0
  141. package/dist/index.js +1 -0
  142. package/dist/index.js.map +1 -1
  143. package/dist/init.js +63 -65
  144. package/dist/init.js.map +1 -1
  145. package/dist/payload-ai.d.ts +149 -0
  146. package/dist/plugin.js +94 -46
  147. package/dist/plugin.js.map +1 -1
  148. package/dist/providers/InstructionsProvider/InstructionsProvider.js +38 -7
  149. package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
  150. package/dist/providers/InstructionsProvider/InstructionsProvider.jsx +30 -4
  151. package/dist/providers/InstructionsProvider/context.d.ts +1 -0
  152. package/dist/providers/InstructionsProvider/context.js +1 -0
  153. package/dist/providers/InstructionsProvider/context.js.map +1 -1
  154. package/dist/providers/InstructionsProvider/useInstructions.js +30 -10
  155. package/dist/providers/InstructionsProvider/useInstructions.js.map +1 -1
  156. package/dist/styles.d.ts +11 -0
  157. package/dist/types/handlebars-async-helpers.d.ts +1 -0
  158. package/dist/types/handlebars-dist-handlebars.d.ts +1 -0
  159. package/dist/types/react-mentions.d.ts +1 -0
  160. package/dist/types.d.ts +6 -16
  161. package/dist/types.js.map +1 -1
  162. package/dist/ui/AIConfigDashboard/index.d.ts +2 -0
  163. package/dist/ui/AIConfigDashboard/index.js +46 -0
  164. package/dist/ui/AIConfigDashboard/index.js.map +1 -0
  165. package/dist/ui/AIConfigDashboard/index.jsx +24 -0
  166. package/dist/ui/ApiKeyStatusIndicator/index.d.ts +6 -0
  167. package/dist/ui/ApiKeyStatusIndicator/index.js +39 -0
  168. package/dist/ui/ApiKeyStatusIndicator/index.js.map +1 -0
  169. package/dist/ui/ApiKeyStatusIndicator/index.jsx +29 -0
  170. package/dist/ui/Compose/Compose.d.ts +2 -2
  171. package/dist/ui/Compose/Compose.js +118 -92
  172. package/dist/ui/Compose/Compose.js.map +1 -1
  173. package/dist/ui/Compose/Compose.jsx +113 -103
  174. package/dist/ui/Compose/ComposePlaceholder.d.ts +7 -0
  175. package/dist/ui/Compose/ComposePlaceholder.js +78 -0
  176. package/dist/ui/Compose/ComposePlaceholder.js.map +1 -0
  177. package/dist/ui/Compose/ComposePlaceholder.jsx +66 -0
  178. package/dist/ui/Compose/UndoRedoActions.d.ts +2 -2
  179. package/dist/ui/Compose/UndoRedoActions.js +11 -6
  180. package/dist/ui/Compose/UndoRedoActions.js.map +1 -1
  181. package/dist/ui/Compose/UndoRedoActions.jsx +8 -6
  182. package/dist/ui/Compose/compose.module.css +57 -17
  183. package/dist/ui/Compose/hooks/menu/itemsMap.js +13 -7
  184. package/dist/ui/Compose/hooks/menu/itemsMap.js.map +1 -1
  185. package/dist/ui/Compose/hooks/menu/useMenu.d.ts +2 -1
  186. package/dist/ui/Compose/hooks/menu/useMenu.js +28 -17
  187. package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
  188. package/dist/ui/Compose/hooks/menu/useMenu.jsx +27 -14
  189. package/dist/ui/Compose/hooks/useActiveFieldTracking.js +69 -10
  190. package/dist/ui/Compose/hooks/useActiveFieldTracking.js.map +1 -1
  191. package/dist/ui/Compose/hooks/useGenerate.d.ts +3 -0
  192. package/dist/ui/Compose/hooks/useGenerate.js +71 -11
  193. package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
  194. package/dist/ui/Compose/hooks/useHistory.d.ts +0 -1
  195. package/dist/ui/Compose/hooks/useHistory.js +113 -26
  196. package/dist/ui/Compose/hooks/useHistory.js.map +1 -1
  197. package/dist/ui/DynamicModelSelect/index.d.ts +7 -0
  198. package/dist/ui/DynamicModelSelect/index.js +231 -0
  199. package/dist/ui/DynamicModelSelect/index.js.map +1 -0
  200. package/dist/ui/DynamicModelSelect/index.jsx +207 -0
  201. package/dist/ui/DynamicProviderSelect/index.d.ts +7 -0
  202. package/dist/ui/DynamicProviderSelect/index.js +101 -0
  203. package/dist/ui/DynamicProviderSelect/index.js.map +1 -0
  204. package/dist/ui/DynamicProviderSelect/index.jsx +90 -0
  205. package/dist/ui/DynamicVoiceSelect/index.d.ts +7 -0
  206. package/dist/ui/DynamicVoiceSelect/index.js +156 -0
  207. package/dist/ui/DynamicVoiceSelect/index.js.map +1 -0
  208. package/dist/ui/DynamicVoiceSelect/index.jsx +102 -0
  209. package/dist/ui/EncryptedTextField/index.d.ts +8 -0
  210. package/dist/ui/EncryptedTextField/index.js +74 -0
  211. package/dist/ui/EncryptedTextField/index.js.map +1 -0
  212. package/dist/ui/EncryptedTextField/index.jsx +35 -0
  213. package/dist/ui/Icons/LottieAnimation.js +3 -1
  214. package/dist/ui/Icons/LottieAnimation.js.map +1 -1
  215. package/dist/ui/Icons/LottieAnimation.jsx +2 -1
  216. package/dist/ui/ModelRowLabel/index.d.ts +6 -0
  217. package/dist/ui/ModelRowLabel/index.js +41 -0
  218. package/dist/ui/ModelRowLabel/index.js.map +1 -0
  219. package/dist/ui/ModelRowLabel/index.jsx +26 -0
  220. package/dist/ui/ProviderOptionsEditor/index.d.ts +7 -0
  221. package/dist/ui/ProviderOptionsEditor/index.js +291 -0
  222. package/dist/ui/ProviderOptionsEditor/index.js.map +1 -0
  223. package/dist/ui/ProviderOptionsEditor/index.jsx +210 -0
  224. package/dist/ui/VoicesFetcher/index.d.ts +7 -0
  225. package/dist/ui/VoicesFetcher/index.js +118 -0
  226. package/dist/ui/VoicesFetcher/index.js.map +1 -0
  227. package/dist/ui/VoicesFetcher/index.jsx +79 -0
  228. package/dist/utilities/buildSmartPrompt.d.ts +22 -0
  229. package/dist/utilities/buildSmartPrompt.js +143 -0
  230. package/dist/utilities/buildSmartPrompt.js.map +1 -0
  231. package/dist/utilities/encryption.d.ts +2 -0
  232. package/dist/utilities/encryption.js +47 -0
  233. package/dist/utilities/encryption.js.map +1 -0
  234. package/dist/utilities/extractImageData.d.ts +9 -0
  235. package/dist/utilities/extractImageData.js +12 -2
  236. package/dist/utilities/extractImageData.js.map +1 -1
  237. package/dist/utilities/fetchImages.d.ts +14 -0
  238. package/dist/utilities/fetchImages.js +38 -0
  239. package/dist/utilities/fetchImages.js.map +1 -0
  240. package/dist/utilities/fieldToJsonSchema.d.ts +2 -1
  241. package/dist/utilities/fieldToJsonSchema.js +66 -3
  242. package/dist/utilities/fieldToJsonSchema.js.map +1 -1
  243. package/dist/utilities/getFieldBySchemaPath.d.ts +2 -2
  244. package/dist/utilities/getFieldBySchemaPath.js +15 -0
  245. package/dist/utilities/getFieldBySchemaPath.js.map +1 -1
  246. package/dist/utilities/getProviderOptionsFields.d.ts +16 -0
  247. package/dist/utilities/getProviderOptionsFields.js +80 -0
  248. package/dist/utilities/getProviderOptionsFields.js.map +1 -0
  249. package/dist/utilities/isPluginActivated.js +1 -2
  250. package/dist/utilities/isPluginActivated.js.map +1 -1
  251. package/dist/utilities/lexicalToHTML.js.map +1 -1
  252. package/dist/utilities/resolveImageReferences.d.ts +30 -0
  253. package/dist/utilities/resolveImageReferences.js +167 -0
  254. package/dist/utilities/resolveImageReferences.js.map +1 -0
  255. package/dist/utilities/schemaConverter.d.ts +3 -0
  256. package/dist/utilities/schemaConverter.js +93 -0
  257. package/dist/utilities/schemaConverter.js.map +1 -0
  258. package/dist/utilities/setSafeLexicalState.d.ts +1 -3
  259. package/dist/utilities/setSafeLexicalState.js +1 -1
  260. package/dist/utilities/setSafeLexicalState.js.map +1 -1
  261. package/dist/utilities/updateFieldsConfig.js +27 -43
  262. package/dist/utilities/updateFieldsConfig.js.map +1 -1
  263. package/package.json +23 -24
  264. package/dist/ai/models/anthropic/index.d.ts +0 -2
  265. package/dist/ai/models/anthropic/index.js +0 -129
  266. package/dist/ai/models/anthropic/index.js.map +0 -1
  267. package/dist/ai/models/elevenLabs/generateVoice.d.ts +0 -8
  268. package/dist/ai/models/elevenLabs/generateVoice.js +0 -20
  269. package/dist/ai/models/elevenLabs/generateVoice.js.map +0 -1
  270. package/dist/ai/models/elevenLabs/index.d.ts +0 -2
  271. package/dist/ai/models/elevenLabs/index.js +0 -133
  272. package/dist/ai/models/elevenLabs/index.js.map +0 -1
  273. package/dist/ai/models/elevenLabs/voices.d.ts +0 -8
  274. package/dist/ai/models/elevenLabs/voices.js +0 -24
  275. package/dist/ai/models/elevenLabs/voices.js.map +0 -1
  276. package/dist/ai/models/generateObject.d.ts +0 -11
  277. package/dist/ai/models/generateObject.js +0 -22
  278. package/dist/ai/models/generateObject.js.map +0 -1
  279. package/dist/ai/models/google/generateImage.d.ts +0 -9
  280. package/dist/ai/models/google/generateImage.js +0 -27
  281. package/dist/ai/models/google/generateImage.js.map +0 -1
  282. package/dist/ai/models/google/index.d.ts +0 -2
  283. package/dist/ai/models/google/index.js +0 -201
  284. package/dist/ai/models/google/index.js.map +0 -1
  285. package/dist/ai/models/index.d.ts +0 -2
  286. package/dist/ai/models/index.js +0 -13
  287. package/dist/ai/models/index.js.map +0 -1
  288. package/dist/ai/models/openai/generateImage.d.ts +0 -5
  289. package/dist/ai/models/openai/generateImage.js +0 -31
  290. package/dist/ai/models/openai/generateImage.js.map +0 -1
  291. package/dist/ai/models/openai/generateVoice.d.ts +0 -6
  292. package/dist/ai/models/openai/generateVoice.js +0 -19
  293. package/dist/ai/models/openai/generateVoice.js.map +0 -1
  294. package/dist/ai/models/openai/index.d.ts +0 -2
  295. package/dist/ai/models/openai/index.js +0 -428
  296. package/dist/ai/models/openai/index.js.map +0 -1
  297. package/dist/ai/models/openai/openai.d.ts +0 -1
  298. package/dist/ai/models/openai/openai.js +0 -8
  299. package/dist/ai/models/openai/openai.js.map +0 -1
  300. package/dist/ai/utils/editImagesWithOpenAI.d.ts +0 -10
  301. package/dist/ai/utils/editImagesWithOpenAI.js +0 -37
  302. package/dist/ai/utils/editImagesWithOpenAI.js.map +0 -1
  303. package/dist/styles.d.js +0 -2
  304. package/dist/styles.d.js.map +0 -1
  305. package/dist/types/handlebars-async-helpers.d.js +0 -2
  306. package/dist/types/handlebars-async-helpers.d.js.map +0 -1
  307. package/dist/types/handlebars-dist-handlebars.d.js +0 -2
  308. package/dist/types/handlebars-dist-handlebars.d.js.map +0 -1
  309. package/dist/types/react-mentions.d.js +0 -2
  310. package/dist/types/react-mentions.d.js.map +0 -1
  311. package/dist/utilities/getGenerationModels.d.ts +0 -2
  312. package/dist/utilities/getGenerationModels.js +0 -10
  313. package/dist/utilities/getGenerationModels.js.map +0 -1
package/dist/init.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/init.ts"],"sourcesContent":["import type { Payload } from 'payload'\n\nimport type { PluginConfig } from './types.js'\n\nimport { defaultSeedPrompts } from './ai/prompts.js'\nimport { systemGenerate } from './ai/utils/systemGenerate.js'\nimport { PLUGIN_INSTRUCTIONS_TABLE } from './defaults.js'\nimport { getGenerationModels } from './utilities/getGenerationModels.js'\n\nexport const init = async (\n payload: Payload,\n fieldSchemaPaths: Record<string, { label: string; relationTo?: string; type: string }>,\n pluginConfig: PluginConfig,\n) => {\n if (!pluginConfig.generatePromptOnInit) {\n return\n }\n\n if (pluginConfig.debugging) {\n payload.logger.info(`— AI Plugin: Initializing...`)\n }\n\n const paths = Object.keys(fieldSchemaPaths)\n\n // Note: schema-path is globally unique, so we create one entry per path regardless of localization\n // Localization info is kept for potential future use or debugging\n const _isLocalized =\n pluginConfig._localization?.enabled && pluginConfig._localization.locales.length > 0\n const _locales = pluginConfig._localization?.locales || []\n\n // Get all instructions for faster initialization\n // Query with locale: 'all' to get entries from all locales when localization is enabled\n const { docs: allInstructions } = await payload.find({\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n depth: 0,\n locale: 'all',\n pagination: false,\n select: {\n id: true,\n 'field-type': true,\n 'schema-path': true,\n },\n })\n\n const fieldInstructionsMap: Record<string, { fieldType: string; id: number | string }> = {}\n\n type InstructionDoc = (typeof allInstructions)[0]\n\n for (let i = 0; i < paths.length; i++) {\n const path = paths[i]\n const { type: fieldType, label: fieldLabel, relationTo } = fieldSchemaPaths[path]\n // Find existing entry for this path (schema-path is globally unique, not per locale)\n let instructions: InstructionDoc | undefined = allInstructions.find(\n (entry) => entry['schema-path'] === path,\n )\n\n if (!instructions) {\n let seed\n const seedOptions = {\n fieldLabel,\n fieldSchemaPaths,\n fieldType,\n path,\n }\n\n if (pluginConfig.seedPrompts) {\n seed = await pluginConfig.seedPrompts(seedOptions)\n }\n if (seed === undefined) {\n seed = await defaultSeedPrompts(seedOptions)\n }\n // Field should be ignored\n if (!seed) {\n if (pluginConfig.debugging) {\n payload.logger.info(`— AI Plugin: No seed prompt for ${path}, ignoring...`)\n }\n continue\n }\n\n let generatedPrompt = '{{ title }}'\n if ('prompt' in seed) {\n // find the model that has the generateText function\n const models = getGenerationModels(pluginConfig)\n const model =\n models && Array.isArray(models) ? models.find((model) => model.generateText) : undefined\n generatedPrompt = await systemGenerate(\n {\n prompt: seed.prompt,\n system: seed.system,\n },\n model?.generateText,\n )\n }\n\n const modelsForId = getGenerationModels(pluginConfig)\n const modelForId =\n modelsForId && Array.isArray(modelsForId)\n ? modelsForId.find((a) => a.fields.includes(fieldType))\n : undefined\n\n const data = {\n 'model-id': modelForId?.id,\n prompt: generatedPrompt,\n ...seed.data, // allow to override data, but not the one below\n 'field-type': fieldType,\n 'relation-to': relationTo,\n 'schema-path': path,\n }\n\n payload.logger.info(\n {\n 'model-id': data['model-id'],\n prompt: generatedPrompt,\n ...seed.data,\n },\n `Prompt seeded for \"${path}\" field`,\n )\n\n try {\n instructions = (await payload.create({\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n data,\n })) as InstructionDoc\n } catch (err: unknown) {\n // Handle unique constraint violation - entry might already exist for another locale\n const error = err as { data?: { errors?: Array<{ path?: string }> }; name?: string }\n if (\n error?.name === 'ValidationError' &&\n error?.data?.errors?.some((e) => e.path === 'schema-path')\n ) {\n // Try to find the existing entry across all locales\n const { docs } = await payload.find({\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n limit: 1,\n locale: 'all',\n select: {\n id: true,\n 'field-type': true,\n 'schema-path': true,\n },\n where: {\n 'schema-path': {\n equals: path,\n },\n },\n })\n\n const existingEntry = docs[0] as InstructionDoc | undefined\n if (existingEntry) {\n instructions = existingEntry\n if (pluginConfig.debugging) {\n payload.logger.info(\n `— AI Plugin: Entry already exists for ${path}, using existing entry`,\n )\n }\n } else {\n payload.logger.error(err, `— AI Plugin: Error creating Compose settings for ${path}`)\n }\n } else {\n payload.logger.error(err, `— AI Plugin: Error creating Compose settings for ${path}`)\n }\n }\n\n if (instructions?.id) {\n fieldInstructionsMap[path] = {\n id: instructions.id,\n fieldType,\n }\n }\n } else {\n if (instructions['field-type'] !== fieldType) {\n const currentFieldType = instructions['field-type'] as string\n payload.logger.warn(\n `— AI Plugin: Field type mismatch for ${path}! Was \"${fieldType}\", it is \"${currentFieldType}\" now. Updating...`,\n )\n await payload.update({\n id: instructions.id,\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n data: {\n 'field-type': fieldType,\n },\n })\n instructions['field-type'] = fieldType\n }\n\n fieldInstructionsMap[path] = {\n id: instructions.id,\n fieldType,\n }\n }\n }\n\n if (pluginConfig.debugging) {\n payload.logger.info(\n `— AI Plugin: Enabled fields map: ${JSON.stringify(fieldInstructionsMap, null, 2)}`,\n )\n payload.logger.info(`— AI Plugin: Initialized!`)\n }\n\n if (pluginConfig.generatePromptOnInit) {\n payload.logger.info(\n '\\n\\n-AI Plugin: Example prompts are added to get you started, Now go break some code 🚀🚀🚀\\n\\n',\n )\n }\n}\n"],"names":["defaultSeedPrompts","systemGenerate","PLUGIN_INSTRUCTIONS_TABLE","getGenerationModels","init","payload","fieldSchemaPaths","pluginConfig","generatePromptOnInit","debugging","logger","info","paths","Object","keys","_isLocalized","_localization","enabled","locales","length","_locales","docs","allInstructions","find","collection","depth","locale","pagination","select","id","fieldInstructionsMap","i","path","type","fieldType","label","fieldLabel","relationTo","instructions","entry","seed","seedOptions","seedPrompts","undefined","generatedPrompt","models","model","Array","isArray","generateText","prompt","system","modelsForId","modelForId","a","fields","includes","data","create","err","error","name","errors","some","e","limit","where","equals","existingEntry","currentFieldType","warn","update","JSON","stringify"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/init.ts"],"sourcesContent":["import type { Payload } from 'payload'\n\nimport type { PluginConfig } from './types.js'\n\nimport { defaultSeedPrompts } from './ai/prompts.js'\nimport { systemGenerate } from './ai/utils/systemGenerate.js'\nimport { PLUGIN_INSTRUCTIONS_TABLE } from './defaults.js'\n\n// Defined capabilities mapping for init\nconst CAPABILITY_MAP = [\n { id: 'text', fields: ['text', 'textarea'] },\n { id: 'richtext', fields: ['richText'] },\n { id: 'image', fields: ['upload'] },\n { id: 'array', fields: ['array'] },\n // TTS usually outputs to upload, but init logic maps field types to capabilities\n]\n\nexport const init = async (\n payload: Payload,\n fieldSchemaPaths: Record<string, { label: string; relationTo?: string; type: string }>,\n pluginConfig: PluginConfig,\n) => {\n if (!pluginConfig.generatePromptOnInit) {\n return\n }\n\n if (pluginConfig.debugging) {\n payload.logger.info(`— AI Plugin: Initializing...`)\n }\n\n const paths = Object.keys(fieldSchemaPaths)\n\n // Get all instructions for faster initialization\n const { docs: allInstructions } = await payload.find({\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n depth: 0,\n pagination: false,\n select: {\n 'field-type': true,\n 'model-id': true,\n 'schema-path': true,\n },\n })\n\n const fieldInstructionsMap: Record<string, { fieldType: any; id: any }> = {}\n\n for (let i = 0; i < paths.length; i++) {\n const path = paths[i]\n const { type: fieldType, label: fieldLabel, relationTo } = fieldSchemaPaths[path]\n let instructions = allInstructions.find((entry) => entry['schema-path'] === path)\n\n if (!instructions) {\n let seed\n const seedOptions = {\n fieldLabel,\n fieldSchemaPaths,\n fieldType,\n path,\n }\n\n if (pluginConfig.seedPrompts) {seed = await pluginConfig.seedPrompts(seedOptions)}\n if (seed === undefined) {seed = await defaultSeedPrompts(seedOptions)}\n // Field should be ignored\n if (!seed) {\n if (pluginConfig.debugging) {\n payload.logger.info(`— AI Plugin: No seed prompt for ${path}, ignoring...`)\n }\n continue\n }\n\n // Empty prompt - smart fallback will generate a contextual prompt at runtime\n const generatedPrompt: string | undefined = ''\n if ('prompt' in seed) {\n // Prompt generation currently disabled during migration to AI SDK Providers\n // TODO: Re-enable using a default provider from AI Settings if available\n /*\n generatedPrompt = await systemGenerate(\n {\n prompt: seed.prompt,\n system: seed.system,\n },\n undefined // No generateTextFn currently\n )\n */\n }\n\n const modelForId = CAPABILITY_MAP.find((a) => a.fields.includes(fieldType))\n\n const data = {\n 'model-id': modelForId?.id,\n prompt: generatedPrompt,\n ...seed.data, // allow to override data, but not the one below\n 'field-type': fieldType,\n 'relation-to': relationTo,\n 'schema-path': path,\n }\n\n payload.logger.info(\n {\n 'model-id': data['model-id'],\n prompt: generatedPrompt,\n ...seed.data,\n },\n `Prompt seeded for \"${path}\" field`,\n )\n\n instructions = (await payload\n .create({\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n data,\n })\n .catch((err) => {\n payload.logger.error(err, '— AI Plugin: Error creating Compose settings-')\n })) as (typeof allInstructions)[0]\n\n if (instructions?.id) {\n fieldInstructionsMap[path] = {\n id: instructions.id,\n fieldType,\n }\n }\n } else {\n const modelForId = CAPABILITY_MAP.find((a) => a.fields.includes(fieldType))\n\n if (instructions['field-type'] !== fieldType || !instructions['model-id']) {\n payload.logger.warn(\n `— AI Plugin: Field config mismatch for ${path}! Updating...`,\n )\n const updateData: any = {\n 'field-type': fieldType,\n }\n \n // Only set model-id if it's missing or we have a better default\n if (!instructions['model-id'] && modelForId?.id) {\n updateData['model-id'] = modelForId.id\n }\n \n await payload.update({\n id: instructions.id,\n collection: PLUGIN_INSTRUCTIONS_TABLE,\n data: updateData,\n })\n instructions['field-type'] = fieldType\n if (updateData['model-id']) {\n instructions['model-id'] = updateData['model-id']\n }\n }\n\n fieldInstructionsMap[path] = {\n id: instructions.id,\n fieldType,\n }\n }\n }\n\n if (pluginConfig.debugging) {\n payload.logger.info(\n `— AI Plugin: Enabled fields map: ${JSON.stringify(fieldInstructionsMap, null, 2)}`,\n )\n payload.logger.info(`— AI Plugin: Initialized!`)\n }\n\n if (pluginConfig.generatePromptOnInit) {\n payload.logger.info(\n '\\n\\n-AI Plugin: Example prompts are added to get you started, Now go break some code 🚀🚀🚀\\n\\n',\n )\n }\n}\n"],"names":["defaultSeedPrompts","PLUGIN_INSTRUCTIONS_TABLE","CAPABILITY_MAP","id","fields","init","payload","fieldSchemaPaths","pluginConfig","generatePromptOnInit","debugging","logger","info","paths","Object","keys","docs","allInstructions","find","collection","depth","pagination","select","fieldInstructionsMap","i","length","path","type","fieldType","label","fieldLabel","relationTo","instructions","entry","seed","seedOptions","seedPrompts","undefined","generatedPrompt","modelForId","a","includes","data","prompt","create","catch","err","error","warn","updateData","update","JSON","stringify"],"mappings":"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"}
@@ -0,0 +1,149 @@
1
+ // Global type definitions for @ai-stack/payloadcms
2
+ // This file augments the Payload types using inline type definitions
3
+
4
+ import type { GenerateObjectResult, ImagePart, JSONValue, ModelMessage } from 'ai'
5
+ import type { z } from 'zod'
6
+
7
+ /**
8
+ * Provider options compatible with AI SDK
9
+ */
10
+ type ProviderOptions = Record<string, Record<string, JSONValue>>
11
+
12
+ /**
13
+ * Base arguments for all generation methods
14
+ */
15
+ interface PayloadGenerationBaseArgs {
16
+ extractAttachments?: boolean
17
+ maxTokens?: number
18
+ messages?: ModelMessage[]
19
+ model?: string
20
+ prompt: string
21
+ provider?: string
22
+ providerOptions?: ProviderOptions
23
+ system?: string
24
+ temperature?: number
25
+ }
26
+
27
+ /**
28
+ * Arguments for generateObject - structured output generation
29
+ */
30
+ interface PayloadGenerateObjectArgs extends PayloadGenerationBaseArgs {
31
+ images?: ImagePart[]
32
+ mode?: 'auto' | 'json' | 'tool'
33
+ schema?: Record<string, unknown> | z.ZodTypeAny
34
+ }
35
+
36
+ /**
37
+ * Arguments for generateText - simple text generation
38
+ */
39
+ interface PayloadGenerateTextArgs extends PayloadGenerationBaseArgs {
40
+ // No additional fields needed for basic text generation
41
+ }
42
+
43
+ /**
44
+ * Arguments for generateMedia - image/video generation
45
+ */
46
+ interface PayloadGenerateMediaArgs {
47
+ aspectRatio?: string
48
+ audioFormat?: string
49
+ callbackUrl?: string
50
+ duration?: number
51
+ fps?: number
52
+ images?: ImagePart[]
53
+ instructionId?: number | string
54
+ mode?: 'i2v' | 't2v'
55
+ model?: string
56
+ n?: number
57
+ prompt: string
58
+ provider?: string
59
+ providerOptions?: ProviderOptions
60
+ seed?: number
61
+ size?: { height: number; width: number }
62
+ speed?: number
63
+ voice?: string
64
+ }
65
+
66
+ /**
67
+ * Result from generateMedia - can be immediate file or async job
68
+ */
69
+ interface MediaResult {
70
+ // Immediate result (image generation)
71
+ file?: {
72
+ data: Buffer
73
+ mimetype: string
74
+ name: string
75
+ size: number
76
+ }
77
+
78
+ // Async job result (video generation)
79
+ jobId?: string
80
+ progress?: number
81
+ status?: 'completed' | 'failed' | 'queued' | 'running'
82
+ taskId?: string
83
+ }
84
+
85
+ declare module 'payload' {
86
+ interface BasePayload {
87
+ ai: {
88
+ /**
89
+ * @deprecated Use generateObject or generateText instead
90
+ * Legacy generate method for backward compatibility
91
+ */
92
+ generate: (args: unknown) => Promise<unknown>
93
+
94
+ /**
95
+ * Generate media (images or videos)
96
+ * @param args - Generation arguments including provider, model, prompt, and media options
97
+ * @returns Promise resolving to either a file or async job info
98
+ */
99
+ generateMedia: (args: PayloadGenerateMediaArgs) => Promise<MediaResult>
100
+
101
+ /**
102
+ * Generate structured output with schema validation
103
+ * @param args - Generation arguments including provider, model, prompt, and schema
104
+ * @returns Promise resolving to the generated object
105
+ */
106
+ generateObject: <T = unknown>(args: PayloadGenerateObjectArgs) => Promise<GenerateObjectResult<T>>
107
+
108
+ /**
109
+ * Generate simple text output
110
+ * @param args - Generation arguments including provider, model, and prompt
111
+ * @returns Promise resolving to the generated text
112
+ */
113
+ generateText: (args: PayloadGenerateTextArgs) => Promise<string>
114
+
115
+ /**
116
+ * Get a specific model instance
117
+ * @param provider - Provider name (e.g., 'openai', 'anthropic')
118
+ * @param modelId - Model ID (e.g., 'gpt-4', 'claude-3')
119
+ * @param type - Model type ('text', 'image', or 'tts')
120
+ * @returns Promise resolving to the model instance
121
+ */
122
+ getModel: (provider: string, modelId: string, type?: 'image' | 'text' | 'tts') => Promise<unknown>
123
+
124
+ /**
125
+ * Get the provider registry
126
+ * @returns Promise resolving to the provider registry
127
+ */
128
+ getRegistry: () => Promise<Record<string, unknown>>
129
+
130
+ /**
131
+ * Stream structured output with schema validation
132
+ * @param args - Generation arguments including provider, model, prompt, and schema
133
+ * @returns Response stream
134
+ */
135
+ streamObject: <T = unknown>(
136
+ args: PayloadGenerateObjectArgs,
137
+ ) => Promise<Response>
138
+
139
+ /**
140
+ * Stream text output
141
+ * @param args - Generation arguments including provider, model, and prompt
142
+ * @returns Response stream
143
+ */
144
+ streamText: (args: PayloadGenerateTextArgs) => Promise<Response>
145
+ }
146
+ }
147
+ }
148
+
149
+ export {}
package/dist/plugin.js CHANGED
@@ -1,13 +1,14 @@
1
1
  import { deepMerge } from 'payload/shared';
2
- import { defaultGenerationModels } from './ai/models/index.js';
3
2
  import { lexicalJsonSchema } from './ai/schemas/lexicalJsonSchema.js';
3
+ import { aiJobsCollection } from './collections/AIJobs.js';
4
+ import { aiSettingsGlobal } from './collections/AISettings.js';
4
5
  import { instructionsCollection } from './collections/Instructions.js';
5
6
  import { PLUGIN_NAME } from './defaults.js';
6
7
  import { fetchFields } from './endpoints/fetchFields.js';
8
+ import { fetchVoices } from './endpoints/fetchVoices.js';
7
9
  import { endpoints } from './endpoints/index.js';
8
10
  import { init } from './init.js';
9
11
  import { translations } from './translations/index.js';
10
- import { getGenerationModels } from './utilities/getGenerationModels.js';
11
12
  import { isPluginActivated } from './utilities/isPluginActivated.js';
12
13
  import { updateFieldsConfig } from './utilities/updateFieldsConfig.js';
13
14
  const defaultPluginConfig = {
@@ -17,8 +18,7 @@ const defaultPluginConfig = {
17
18
  },
18
19
  collections: {},
19
20
  disableSponsorMessage: false,
20
- generatePromptOnInit: true,
21
- generationModels: defaultGenerationModels
21
+ generatePromptOnInit: true
22
22
  };
23
23
  const sponsorMessage = `
24
24
  ╔═══════════════════════════════════════════════════════════════╗
@@ -53,49 +53,23 @@ const securityMessage = `
53
53
  ║ them explicitly in your plugin configuration. ║
54
54
  ╚═══════════════════════════════════════════════════════════════╝
55
55
  `;
56
- const isLocalizationEnabled = (config)=>{
57
- return config !== false && typeof config === 'object' && config !== null && 'locales' in config && Array.isArray(config.locales) && config.locales.length > 0;
58
- };
59
- const extractLocales = (config)=>{
60
- if (config && typeof config === 'object' && 'locales' in config && Array.isArray(config.locales)) {
61
- return {
62
- defaultLocale: 'defaultLocale' in config && typeof config.defaultLocale === 'string' ? config.defaultLocale : undefined,
63
- locales: config.locales.map((locale)=>typeof locale === 'string' ? locale : locale.code)
64
- };
65
- }
66
- return {
67
- locales: []
68
- };
69
- };
70
56
  const payloadAiPlugin = (pluginConfig)=>(incomingConfig)=>{
71
- const localizationConfig = incomingConfig.localization;
72
- const hasLocalization = isLocalizationEnabled(localizationConfig);
73
- const localizationData = hasLocalization ? extractLocales(localizationConfig) : {
74
- locales: []
75
- };
76
57
  pluginConfig = {
77
58
  ...defaultPluginConfig,
78
59
  ...pluginConfig,
79
- _localization: hasLocalization ? {
80
- enabled: true,
81
- ...localizationData
82
- } : {
83
- enabled: false,
84
- locales: []
85
- },
86
60
  access: {
87
61
  ...defaultPluginConfig.access,
88
62
  ...pluginConfig.access
89
63
  }
90
64
  };
91
- pluginConfig.generationModels = getGenerationModels(pluginConfig);
92
65
  const isActivated = isPluginActivated(pluginConfig);
93
66
  let updatedConfig = {
94
67
  ...incomingConfig
95
68
  };
96
- const collectionsFieldPathMap = {};
69
+ let collectionsFieldPathMap = {};
97
70
  if (isActivated) {
98
71
  const Instructions = instructionsCollection(pluginConfig);
72
+ const AIJobs = aiJobsCollection();
99
73
  // Inject editor schema to config, so that it can be accessed when /textarea endpoint will hit
100
74
  const lexicalSchema = lexicalJsonSchema(pluginConfig.editorConfig?.nodes);
101
75
  Instructions.admin = {
@@ -115,10 +89,12 @@ const payloadAiPlugin = (pluginConfig)=>(incomingConfig)=>{
115
89
  };
116
90
  const collections = [
117
91
  ...incomingConfig.collections ?? [],
118
- Instructions
92
+ Instructions,
93
+ AIJobs
119
94
  ];
120
95
  const globals = [
121
- ...incomingConfig.globals ?? []
96
+ ...incomingConfig.globals ?? [],
97
+ aiSettingsGlobal
122
98
  ];
123
99
  const { collections: collectionSlugs, globals: globalsSlugs } = pluginConfig;
124
100
  const { components: { providers = [] } = {} } = incomingConfig.admin || {};
@@ -136,27 +112,36 @@ const payloadAiPlugin = (pluginConfig)=>(incomingConfig)=>{
136
112
  }
137
113
  };
138
114
  const pluginEndpoints = endpoints(pluginConfig);
139
- const processedCollections = collections.map((collection)=>{
140
- if (collectionSlugs[collection.slug]) {
141
- const { schemaPathMap, updatedCollectionConfig } = updateFieldsConfig(collection);
142
- Object.assign(collectionsFieldPathMap, schemaPathMap);
143
- return updatedCollectionConfig;
144
- }
145
- return collection;
146
- });
147
115
  updatedConfig = {
148
116
  ...incomingConfig,
149
- collections: processedCollections,
117
+ collections: collections.map((collection)=>{
118
+ if (collectionSlugs[collection.slug]) {
119
+ const { schemaPathMap, updatedCollectionConfig } = updateFieldsConfig(collection);
120
+ collectionsFieldPathMap = {
121
+ ...collectionsFieldPathMap,
122
+ ...schemaPathMap
123
+ };
124
+ return updatedCollectionConfig;
125
+ }
126
+ return collection;
127
+ }),
150
128
  endpoints: [
151
129
  ...incomingConfig.endpoints ?? [],
152
130
  pluginEndpoints.textarea,
153
131
  pluginEndpoints.upload,
154
- fetchFields(pluginConfig)
132
+ ...pluginEndpoints.videogenWebhook ? [
133
+ pluginEndpoints.videogenWebhook
134
+ ] : [],
135
+ fetchFields(pluginConfig),
136
+ fetchVoices
155
137
  ],
156
138
  globals: globals.map((global)=>{
157
- if (globalsSlugs?.[global.slug]) {
139
+ if (globalsSlugs && globalsSlugs[global.slug]) {
158
140
  const { schemaPathMap, updatedCollectionConfig } = updateFieldsConfig(global);
159
- Object.assign(collectionsFieldPathMap, schemaPathMap);
141
+ collectionsFieldPathMap = {
142
+ ...collectionsFieldPathMap,
143
+ ...schemaPathMap
144
+ };
160
145
  return updatedCollectionConfig;
161
146
  }
162
147
  return global;
@@ -189,6 +174,69 @@ const payloadAiPlugin = (pluginConfig)=>(incomingConfig)=>{
189
174
  }, 3000);
190
175
  }
191
176
  });
177
+ payload.ai = {
178
+ // Core generation methods
179
+ generateObject: async (args)=>{
180
+ const { generateObject } = await import('./ai/core/index.js');
181
+ return generateObject({
182
+ ...args,
183
+ payload
184
+ });
185
+ },
186
+ generateText: async (args)=>{
187
+ const { generateText } = await import('./ai/core/index.js');
188
+ return generateText({
189
+ ...args,
190
+ payload
191
+ });
192
+ },
193
+ generateMedia: async (args)=>{
194
+ const { generateMedia } = await import('./ai/core/index.js');
195
+ return generateMedia({
196
+ ...args,
197
+ payload
198
+ });
199
+ },
200
+ // Streaming variants
201
+ streamObject: async (args)=>{
202
+ const { streamObject } = await import('./ai/core/index.js');
203
+ const result = await streamObject({
204
+ ...args,
205
+ payload
206
+ });
207
+ return result.toTextStreamResponse();
208
+ },
209
+ streamText: async (args)=>{
210
+ const { streamText } = await import('./ai/core/index.js');
211
+ return streamText({
212
+ ...args,
213
+ payload
214
+ });
215
+ },
216
+ // Helper utilities
217
+ getModel: async (provider, modelId, type)=>{
218
+ const { getImageModel, getLanguageModel, getTTSModel } = await import('./ai/providers/registry.js');
219
+ if (type === 'image') {
220
+ return getImageModel(payload, provider, modelId);
221
+ }
222
+ if (type === 'tts') {
223
+ return getTTSModel(payload, provider, modelId);
224
+ }
225
+ return getLanguageModel(payload, provider, modelId);
226
+ },
227
+ getRegistry: async ()=>{
228
+ const { getProviderRegistry } = await import('./ai/providers/registry.js');
229
+ return getProviderRegistry(payload);
230
+ },
231
+ // Legacy method for backward compatibility
232
+ /** @deprecated Use generateObject or generateText instead */ generate: async (args)=>{
233
+ const { generate } = await import('./ai/index.js');
234
+ return generate({
235
+ ...args,
236
+ payload
237
+ });
238
+ }
239
+ };
192
240
  };
193
241
  return updatedConfig;
194
242
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/plugin.ts"],"sourcesContent":["import type { CollectionConfig, Config, GlobalConfig } from 'payload'\n\nimport { deepMerge } from 'payload/shared'\n\nimport type { PluginConfig } from './types.js'\n\nimport { defaultGenerationModels } from './ai/models/index.js'\nimport { lexicalJsonSchema } from './ai/schemas/lexicalJsonSchema.js'\nimport { instructionsCollection } from './collections/Instructions.js'\nimport { PLUGIN_NAME } from './defaults.js'\nimport { fetchFields } from './endpoints/fetchFields.js'\nimport { endpoints } from './endpoints/index.js'\nimport { init } from './init.js'\nimport { translations } from './translations/index.js'\nimport { getGenerationModels } from './utilities/getGenerationModels.js'\nimport { isPluginActivated } from './utilities/isPluginActivated.js'\nimport { updateFieldsConfig } from './utilities/updateFieldsConfig.js'\n\nconst defaultPluginConfig: PluginConfig = {\n access: {\n generate: ({ req }) => !!req.user,\n settings: ({ req }) => !!req.user,\n },\n collections: {},\n disableSponsorMessage: false,\n generatePromptOnInit: true,\n generationModels: defaultGenerationModels,\n}\n\nconst sponsorMessage = `\n╔═══════════════════════════════════════════════════════════════╗\n║ THANK YOU FOR USING THE PAYLOAD AI PLUGIN! ║\n║ ║\n║ If this plugin makes your life easier, please ║\n║ consider supporting its development and maintenance: ║\n║ ║\n║ • Buy me a coffee: https://buymeacoffee.com/ashbuilds ║\n║ • Sponsor on GitHub: https://github.com/sponsors/ashbuilds ║\n║ ║\n║ Your support fuels continued improvements, ║\n║ new features, and more caffeinated coding sessions! ☕ ║\n║ ║\n║ Got feedback or need help? Submit an issue here: ║\n║ • https://github.com/ashbuilds/payload-ai/issues/new ║\n║ ║\n║ Thank you again, and happy building! ║\n╚═══════════════════════════════════════════════════════════════╝\n`\n\nconst securityMessage = `\n╔═══════════════════════════════════════════════════════════════╗\n║ SECURITY NOTICE ║\n║ ║\n║ The AI Plugin now requires authentication by default. ║\n║ All AI features are restricted to authenticated users. ║\n║ ║\n║ To customize access control, configure the 'access' option ║\n║ in your plugin settings. See documentation for details. ║\n║ ║\n║ If you need different access patterns, please configure ║\n║ them explicitly in your plugin configuration. ║\n╚═══════════════════════════════════════════════════════════════╝\n`\n\nconst isLocalizationEnabled = (config: Config['localization']) => {\n return (\n config !== false &&\n typeof config === 'object' &&\n config !== null &&\n 'locales' in config &&\n Array.isArray(config.locales) &&\n config.locales.length > 0\n )\n}\n\nconst extractLocales = (\n config: Config['localization'],\n): { defaultLocale?: string; locales: string[] } => {\n if (\n config &&\n typeof config === 'object' &&\n 'locales' in config &&\n Array.isArray(config.locales)\n ) {\n return {\n defaultLocale:\n 'defaultLocale' in config && typeof config.defaultLocale === 'string'\n ? config.defaultLocale\n : undefined,\n locales: config.locales.map((locale) =>\n typeof locale === 'string' ? locale : (locale as { code: string }).code,\n ),\n }\n }\n return { locales: [] }\n}\n\nconst payloadAiPlugin =\n (pluginConfig: PluginConfig) =>\n (incomingConfig: Config): Config => {\n const localizationConfig = incomingConfig.localization\n const hasLocalization = isLocalizationEnabled(localizationConfig)\n const localizationData = hasLocalization ? extractLocales(localizationConfig) : { locales: [] }\n\n pluginConfig = {\n ...defaultPluginConfig,\n ...pluginConfig,\n _localization: hasLocalization\n ? {\n enabled: true,\n ...localizationData,\n }\n : {\n enabled: false,\n locales: [],\n },\n access: {\n ...defaultPluginConfig.access,\n ...pluginConfig.access,\n },\n }\n\n pluginConfig.generationModels = getGenerationModels(pluginConfig)\n\n const isActivated = isPluginActivated(pluginConfig)\n let updatedConfig: Config = { ...incomingConfig }\n const collectionsFieldPathMap: Record<\n string,\n { label: string; relationTo?: string; type: string }\n > = {}\n\n if (isActivated) {\n const Instructions = instructionsCollection(pluginConfig)\n // Inject editor schema to config, so that it can be accessed when /textarea endpoint will hit\n const lexicalSchema = lexicalJsonSchema(pluginConfig.editorConfig?.nodes)\n\n Instructions.admin = {\n ...Instructions.admin,\n }\n\n if (pluginConfig.debugging) {\n Instructions.admin.hidden = false\n }\n\n Instructions.admin.custom = {\n ...(Instructions.admin.custom || {}),\n [PLUGIN_NAME]: {\n editorConfig: {\n // Used in admin client for useObject hook\n schema: lexicalSchema,\n },\n },\n }\n\n const collections = [...(incomingConfig.collections ?? []), Instructions]\n const globals = [...(incomingConfig.globals ?? [])]\n const { collections: collectionSlugs, globals: globalsSlugs } = pluginConfig\n\n const { components: { providers = [] } = {} } = incomingConfig.admin || {}\n const updatedProviders = [\n ...(providers ?? []),\n {\n path: '@ai-stack/payloadcms/client#InstructionsProvider',\n },\n ]\n\n incomingConfig.admin = {\n ...(incomingConfig.admin || {}),\n components: {\n ...(incomingConfig.admin?.components ?? {}),\n providers: updatedProviders,\n },\n }\n\n const pluginEndpoints = endpoints(pluginConfig)\n\n const processedCollections = collections.map((collection) => {\n if (collectionSlugs[collection.slug]) {\n const { schemaPathMap, updatedCollectionConfig } = updateFieldsConfig(collection)\n Object.assign(collectionsFieldPathMap, schemaPathMap)\n return updatedCollectionConfig as CollectionConfig\n }\n return collection\n })\n\n updatedConfig = {\n ...incomingConfig,\n collections: processedCollections,\n endpoints: [\n ...(incomingConfig.endpoints ?? []),\n pluginEndpoints.textarea,\n pluginEndpoints.upload,\n fetchFields(pluginConfig),\n ],\n globals: globals.map((global) => {\n if (globalsSlugs?.[global.slug]) {\n const { schemaPathMap, updatedCollectionConfig } = updateFieldsConfig(global)\n Object.assign(collectionsFieldPathMap, schemaPathMap)\n return updatedCollectionConfig as GlobalConfig\n }\n return global\n }),\n i18n: {\n ...(incomingConfig.i18n || {}),\n translations: {\n ...deepMerge(translations, incomingConfig.i18n?.translations ?? {}),\n },\n },\n }\n }\n\n updatedConfig.onInit = async (payload) => {\n if (incomingConfig.onInit) {\n await incomingConfig.onInit(payload)\n }\n\n if (!isActivated) {\n payload.logger.warn(`— AI Plugin: Not activated. Please verify your environment keys.`)\n return\n }\n\n await init(payload, collectionsFieldPathMap, pluginConfig)\n .catch((error) => {\n payload.logger.error(error, `— AI Plugin: Initialization Error`)\n })\n .finally(() => {\n if (!pluginConfig.disableSponsorMessage) {\n setTimeout(() => {\n payload.logger.info(securityMessage)\n }, 1000)\n setTimeout(() => {\n payload.logger.info(sponsorMessage)\n }, 3000)\n }\n })\n }\n\n return updatedConfig\n }\n\nexport { payloadAiPlugin }\n"],"names":["deepMerge","defaultGenerationModels","lexicalJsonSchema","instructionsCollection","PLUGIN_NAME","fetchFields","endpoints","init","translations","getGenerationModels","isPluginActivated","updateFieldsConfig","defaultPluginConfig","access","generate","req","user","settings","collections","disableSponsorMessage","generatePromptOnInit","generationModels","sponsorMessage","securityMessage","isLocalizationEnabled","config","Array","isArray","locales","length","extractLocales","defaultLocale","undefined","map","locale","code","payloadAiPlugin","pluginConfig","incomingConfig","localizationConfig","localization","hasLocalization","localizationData","_localization","enabled","isActivated","updatedConfig","collectionsFieldPathMap","Instructions","lexicalSchema","editorConfig","nodes","admin","debugging","hidden","custom","schema","globals","collectionSlugs","globalsSlugs","components","providers","updatedProviders","path","pluginEndpoints","processedCollections","collection","slug","schemaPathMap","updatedCollectionConfig","Object","assign","textarea","upload","global","i18n","onInit","payload","logger","warn","catch","error","finally","setTimeout","info"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/plugin.ts"],"sourcesContent":["import type { CollectionConfig, Config, GlobalConfig } from 'payload'\n\nimport { deepMerge } from 'payload/shared'\n\nimport type { PluginConfig } from './types.js'\n\nimport { lexicalJsonSchema } from './ai/schemas/lexicalJsonSchema.js'\nimport { aiJobsCollection } from './collections/AIJobs.js'\nimport { aiSettingsGlobal } from './collections/AISettings.js'\nimport { instructionsCollection } from './collections/Instructions.js'\nimport { PLUGIN_NAME } from './defaults.js'\nimport { fetchFields } from './endpoints/fetchFields.js'\nimport { fetchVoices } from './endpoints/fetchVoices.js'\nimport { endpoints } from './endpoints/index.js'\nimport { init } from './init.js'\nimport { translations } from './translations/index.js'\nimport { isPluginActivated } from './utilities/isPluginActivated.js'\nimport { updateFieldsConfig } from './utilities/updateFieldsConfig.js'\n\nconst defaultPluginConfig: PluginConfig = {\n access: {\n generate: ({ req }) => !!req.user,\n settings: ({ req }) => !!req.user,\n },\n collections: {},\n disableSponsorMessage: false,\n generatePromptOnInit: true,\n}\n\nconst sponsorMessage = `\n╔═══════════════════════════════════════════════════════════════╗\n║ THANK YOU FOR USING THE PAYLOAD AI PLUGIN! ║\n║ ║\n║ If this plugin makes your life easier, please ║\n║ consider supporting its development and maintenance: ║\n║ ║\n║ • Buy me a coffee: https://buymeacoffee.com/ashbuilds ║\n║ • Sponsor on GitHub: https://github.com/sponsors/ashbuilds ║\n║ ║\n║ Your support fuels continued improvements, ║\n║ new features, and more caffeinated coding sessions! ☕ ║\n║ ║\n║ Got feedback or need help? Submit an issue here: ║\n║ • https://github.com/ashbuilds/payload-ai/issues/new ║\n║ ║\n║ Thank you again, and happy building! ║\n╚═══════════════════════════════════════════════════════════════╝\n`\n\nconst securityMessage = `\n╔═══════════════════════════════════════════════════════════════╗\n║ SECURITY NOTICE ║\n║ ║\n║ The AI Plugin now requires authentication by default. ║\n║ All AI features are restricted to authenticated users. ║\n║ ║\n║ To customize access control, configure the 'access' option ║\n║ in your plugin settings. See documentation for details. ║\n║ ║\n║ If you need different access patterns, please configure ║\n║ them explicitly in your plugin configuration. ║\n╚═══════════════════════════════════════════════════════════════╝\n`\n\nconst payloadAiPlugin =\n (pluginConfig: PluginConfig) =>\n (incomingConfig: Config): Config => {\n pluginConfig = {\n ...defaultPluginConfig,\n ...pluginConfig,\n access: {\n ...defaultPluginConfig.access,\n ...pluginConfig.access,\n },\n }\n\n const isActivated = isPluginActivated(pluginConfig)\n let updatedConfig: Config = { ...incomingConfig }\n let collectionsFieldPathMap = {}\n\n if (isActivated) {\n const Instructions = instructionsCollection(pluginConfig)\n const AIJobs = aiJobsCollection()\n // Inject editor schema to config, so that it can be accessed when /textarea endpoint will hit\n const lexicalSchema = lexicalJsonSchema(pluginConfig.editorConfig?.nodes)\n\n Instructions.admin = {\n ...Instructions.admin,\n }\n\n if (pluginConfig.debugging) {\n Instructions.admin.hidden = false\n }\n\n Instructions.admin.custom = {\n ...(Instructions.admin.custom || {}),\n [PLUGIN_NAME]: {\n editorConfig: {\n // Used in admin client for useObject hook\n schema: lexicalSchema,\n },\n },\n }\n\n const collections = [...(incomingConfig.collections ?? []), Instructions, AIJobs]\n const globals = [...(incomingConfig.globals ?? []), aiSettingsGlobal]\n const { collections: collectionSlugs, globals: globalsSlugs } = pluginConfig\n\n const { components: { providers = [] } = {} } = incomingConfig.admin || {}\n const updatedProviders = [\n ...(providers ?? []),\n {\n path: '@ai-stack/payloadcms/client#InstructionsProvider',\n },\n ]\n\n incomingConfig.admin = {\n ...(incomingConfig.admin || {}),\n components: {\n ...(incomingConfig.admin?.components ?? {}),\n providers: updatedProviders,\n },\n }\n\n const pluginEndpoints = endpoints(pluginConfig)\n updatedConfig = {\n ...incomingConfig,\n collections: collections.map((collection) => {\n if (collectionSlugs[collection.slug]) {\n const { schemaPathMap, updatedCollectionConfig } = updateFieldsConfig(collection)\n collectionsFieldPathMap = {\n ...collectionsFieldPathMap,\n ...schemaPathMap,\n }\n return updatedCollectionConfig as CollectionConfig\n }\n\n return collection\n }),\n endpoints: [\n ...(incomingConfig.endpoints ?? []),\n pluginEndpoints.textarea,\n pluginEndpoints.upload,\n ...(pluginEndpoints.videogenWebhook ? [pluginEndpoints.videogenWebhook] : []),\n fetchFields(pluginConfig),\n fetchVoices,\n ],\n globals: globals.map((global) => {\n if (globalsSlugs && globalsSlugs[global.slug]) {\n const { schemaPathMap, updatedCollectionConfig } = updateFieldsConfig(global)\n collectionsFieldPathMap = {\n ...collectionsFieldPathMap,\n ...schemaPathMap,\n }\n return updatedCollectionConfig as GlobalConfig\n }\n\n return global\n }),\n i18n: {\n ...(incomingConfig.i18n || {}),\n translations: {\n ...deepMerge(translations, incomingConfig.i18n?.translations ?? {}),\n },\n },\n }\n }\n\n updatedConfig.onInit = async (payload) => {\n if (incomingConfig.onInit) {\n await incomingConfig.onInit(payload)\n }\n\n if (!isActivated) {\n payload.logger.warn(`— AI Plugin: Not activated. Please verify your environment keys.`)\n return\n }\n\n await init(payload, collectionsFieldPathMap, pluginConfig)\n .catch((error) => {\n payload.logger.error(error, `— AI Plugin: Initialization Error`)\n })\n .finally(() => {\n if (!pluginConfig.disableSponsorMessage) {\n setTimeout(() => {\n payload.logger.info(securityMessage)\n }, 1000)\n setTimeout(() => {\n payload.logger.info(sponsorMessage)\n }, 3000)\n }\n })\n\n // Inject AI capabilities with enhanced abstraction layer\n ;(payload as any).ai = {\n // Core generation methods\n generateObject: async (args: any) => {\n const { generateObject } = await import('./ai/core/index.js')\n return generateObject({ ...args, payload })\n },\n\n generateText: async (args: any) => {\n const { generateText } = await import('./ai/core/index.js')\n return generateText({ ...args, payload })\n },\n\n generateMedia: async (args: any) => {\n const { generateMedia } = await import('./ai/core/index.js')\n return generateMedia({ ...args, payload })\n },\n\n // Streaming variants\n streamObject: async (args: any) => {\n const { streamObject } = await import('./ai/core/index.js')\n const result = await streamObject({ ...args, payload })\n return result.toTextStreamResponse()\n },\n\n streamText: async (args: any) => {\n const { streamText } = await import('./ai/core/index.js')\n return streamText({ ...args, payload })\n },\n\n // Helper utilities\n getModel: async (provider: string, modelId: string, type?: 'image' | 'text' | 'tts') => {\n const { getImageModel, getLanguageModel, getTTSModel } = await import(\n './ai/providers/registry.js'\n )\n if (type === 'image') {\n return getImageModel(payload, provider, modelId)\n }\n if (type === 'tts') {\n return getTTSModel(payload, provider, modelId)\n }\n return getLanguageModel(payload, provider, modelId)\n },\n\n getRegistry: async () => {\n const { getProviderRegistry } = await import('./ai/providers/registry.js')\n return getProviderRegistry(payload)\n },\n\n // Legacy method for backward compatibility\n /** @deprecated Use generateObject or generateText instead */\n generate: async (args: any) => {\n const { generate } = await import('./ai/index.js')\n return generate({ ...args, payload })\n },\n }\n }\n\n return updatedConfig\n }\n\nexport { payloadAiPlugin }\n"],"names":["deepMerge","lexicalJsonSchema","aiJobsCollection","aiSettingsGlobal","instructionsCollection","PLUGIN_NAME","fetchFields","fetchVoices","endpoints","init","translations","isPluginActivated","updateFieldsConfig","defaultPluginConfig","access","generate","req","user","settings","collections","disableSponsorMessage","generatePromptOnInit","sponsorMessage","securityMessage","payloadAiPlugin","pluginConfig","incomingConfig","isActivated","updatedConfig","collectionsFieldPathMap","Instructions","AIJobs","lexicalSchema","editorConfig","nodes","admin","debugging","hidden","custom","schema","globals","collectionSlugs","globalsSlugs","components","providers","updatedProviders","path","pluginEndpoints","map","collection","slug","schemaPathMap","updatedCollectionConfig","textarea","upload","videogenWebhook","global","i18n","onInit","payload","logger","warn","catch","error","finally","setTimeout","info","ai","generateObject","args","generateText","generateMedia","streamObject","result","toTextStreamResponse","streamText","getModel","provider","modelId","type","getImageModel","getLanguageModel","getTTSModel","getRegistry","getProviderRegistry"],"mappings":"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"}
@@ -1,10 +1,13 @@
1
1
  'use client';
2
- import { jsx as _jsx } from "react/jsx-runtime";
3
- import { useAuth, useConfig } from '@payloadcms/ui';
4
- import React, { useEffect, useState } from 'react';
5
- import { PLUGIN_FETCH_FIELDS_ENDPOINT } from '../../defaults.js';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { useAuth, useConfig, useDocumentDrawer } from '@payloadcms/ui';
4
+ import React, { useCallback, useEffect, useState } from 'react';
5
+ import { PLUGIN_FETCH_FIELDS_ENDPOINT, PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js';
6
+ import { useActiveFieldTracking } from '../../ui/Compose/hooks/useActiveFieldTracking.js';
6
7
  import { InstructionsContext } from './context.js';
7
8
  export const InstructionsProvider = ({ children })=>{
9
+ // Initialize field tracking globally so ai-plugin-active class is added on field focus
10
+ useActiveFieldTracking();
8
11
  const [instructions, setInstructionsState] = useState({});
9
12
  const [promptFields, setPromptFields] = useState([]);
10
13
  const [activeCollection, setActiveCollection] = useState('');
@@ -14,9 +17,33 @@ export const InstructionsProvider = ({ children })=>{
14
17
  const { user } = useAuth();
15
18
  const { config } = useConfig();
16
19
  const { routes: { api }, serverURL } = config;
20
+ // Global Document Drawer state
21
+ const [drawerInstructionId, setDrawerInstructionId] = useState('');
22
+ const [drawerOpenCount, setDrawerOpenCount] = useState(0);
23
+ const [DocumentDrawer, _, { openDrawer: openPayloadDrawer }] = useDocumentDrawer({
24
+ id: drawerInstructionId,
25
+ collectionSlug: PLUGIN_INSTRUCTIONS_TABLE
26
+ });
27
+ const openDrawer = useCallback((id)=>{
28
+ setDrawerInstructionId(id);
29
+ setDrawerOpenCount((prev)=>prev + 1);
30
+ }, []);
31
+ // Open drawer when count changes
32
+ useEffect(()=>{
33
+ if (drawerOpenCount > 0) {
34
+ openPayloadDrawer();
35
+ }
36
+ }, [
37
+ drawerOpenCount,
38
+ openPayloadDrawer
39
+ ]);
17
40
  // This is here because each field have separate instructions and
18
41
  // their ID is needed to edit them for Drawer
19
42
  useEffect(()=>{
43
+ // Only fetch if we have a user ID - prevents fetching on every user object reference change
44
+ if (!user?.id) {
45
+ return;
46
+ }
20
47
  fetch(`${serverURL}${api}${PLUGIN_FETCH_FIELDS_ENDPOINT}`).then(async (res)=>{
21
48
  await res.json().then((data)=>{
22
49
  setIsConfigAllowed(data?.isConfigAllowed || false);
@@ -31,9 +58,9 @@ export const InstructionsProvider = ({ children })=>{
31
58
  }, [
32
59
  api,
33
60
  serverURL,
34
- user
61
+ user?.id
35
62
  ]);
36
- return /*#__PURE__*/ _jsx(InstructionsContext.Provider, {
63
+ return /*#__PURE__*/ _jsxs(InstructionsContext.Provider, {
37
64
  value: {
38
65
  activeCollection,
39
66
  debugging,
@@ -41,10 +68,14 @@ export const InstructionsProvider = ({ children })=>{
41
68
  hasInstructions: instructions && Object.keys(instructions).length > 0,
42
69
  instructions,
43
70
  isConfigAllowed,
71
+ openDrawer,
44
72
  promptFields,
45
73
  setActiveCollection
46
74
  },
47
- children: children
75
+ children: [
76
+ children,
77
+ /*#__PURE__*/ _jsx(DocumentDrawer, {})
78
+ ]
48
79
  });
49
80
  };
50
81
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/providers/InstructionsProvider/InstructionsProvider.tsx"],"sourcesContent":["'use client'\n\n\nimport { useAuth, useConfig } from '@payloadcms/ui'\nimport React, { useEffect, useState } from 'react'\n\nimport type { SerializedPromptField } from '../../types.js'\n\nimport { PLUGIN_FETCH_FIELDS_ENDPOINT } from '../../defaults.js'\nimport { InstructionsContext } from './context.js'\n\n\nexport const InstructionsProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n const [instructions, setInstructionsState] = useState({})\n const [promptFields, setPromptFields] = useState<SerializedPromptField[]>([])\n const [activeCollection, setActiveCollection] = useState('')\n const [isConfigAllowed, setIsConfigAllowed] = useState(false)\n const [enabledLanguages, setEnabledLanguages] = useState<string[]>()\n const [debugging, setDebugging] = useState(false)\n const { user } = useAuth()\n\n const { config } = useConfig()\n const {\n routes: { api },\n serverURL,\n } = config\n\n // This is here because each field have separate instructions and\n // their ID is needed to edit them for Drawer\n useEffect(() => {\n fetch(`${serverURL}${api}${PLUGIN_FETCH_FIELDS_ENDPOINT}`)\n .then(async (res) => {\n await res.json().then((data) => {\n setIsConfigAllowed(data?.isConfigAllowed || false)\n setEnabledLanguages(data?.enabledLanguages || [])\n setInstructionsState(data?.fields || {})\n setPromptFields(data?.promptFields || [])\n setDebugging(data?.debugging || false)\n })\n })\n .catch((err) => {\n console.error('InstructionsProvider:', err)\n })\n }, [api, serverURL, user])\n\n return (\n <InstructionsContext.Provider\n value={{\n activeCollection,\n debugging,\n enabledLanguages,\n hasInstructions: instructions && Object.keys(instructions).length > 0,\n instructions,\n isConfigAllowed,\n promptFields,\n setActiveCollection,\n }}\n >\n {children}\n </InstructionsContext.Provider>\n )\n}\n"],"names":["useAuth","useConfig","React","useEffect","useState","PLUGIN_FETCH_FIELDS_ENDPOINT","InstructionsContext","InstructionsProvider","children","instructions","setInstructionsState","promptFields","setPromptFields","activeCollection","setActiveCollection","isConfigAllowed","setIsConfigAllowed","enabledLanguages","setEnabledLanguages","debugging","setDebugging","user","config","routes","api","serverURL","fetch","then","res","json","data","fields","catch","err","console","error","Provider","value","hasInstructions","Object","keys","length"],"mappings":"AAAA;;AAGA,SAASA,OAAO,EAAEC,SAAS,QAAQ,iBAAgB;AACnD,OAAOC,SAASC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAIlD,SAASC,4BAA4B,QAAQ,oBAAmB;AAChE,SAASC,mBAAmB,QAAQ,eAAc;AAGlD,OAAO,MAAMC,uBAAgE,CAAC,EAAEC,QAAQ,EAAE;IACxF,MAAM,CAACC,cAAcC,qBAAqB,GAAGN,SAAS,CAAC;IACvD,MAAM,CAACO,cAAcC,gBAAgB,GAAGR,SAAkC,EAAE;IAC5E,MAAM,CAACS,kBAAkBC,oBAAoB,GAAGV,SAAS;IACzD,MAAM,CAACW,iBAAiBC,mBAAmB,GAAGZ,SAAS;IACvD,MAAM,CAACa,kBAAkBC,oBAAoB,GAAGd;IAChD,MAAM,CAACe,WAAWC,aAAa,GAAGhB,SAAS;IAC3C,MAAM,EAAEiB,IAAI,EAAE,GAAGrB;IAEjB,MAAM,EAAEsB,MAAM,EAAE,GAAGrB;IACnB,MAAM,EACJsB,QAAQ,EAAEC,GAAG,EAAE,EACfC,SAAS,EACV,GAAGH;IAEJ,iEAAiE;IACjE,6CAA6C;IAC7CnB,UAAU;QACRuB,MAAM,CAAC,EAAED,UAAU,EAAED,IAAI,EAAEnB,6BAA6B,CAAC,EACtDsB,IAAI,CAAC,OAAOC;YACX,MAAMA,IAAIC,IAAI,GAAGF,IAAI,CAAC,CAACG;gBACrBd,mBAAmBc,MAAMf,mBAAmB;gBAC5CG,oBAAoBY,MAAMb,oBAAoB,EAAE;gBAChDP,qBAAqBoB,MAAMC,UAAU,CAAC;gBACtCnB,gBAAgBkB,MAAMnB,gBAAgB,EAAE;gBACxCS,aAAaU,MAAMX,aAAa;YAClC;QACF,GACCa,KAAK,CAAC,CAACC;YACNC,QAAQC,KAAK,CAAC,yBAAyBF;QACzC;IACJ,GAAG;QAACT;QAAKC;QAAWJ;KAAK;IAEzB,qBACE,KAACf,oBAAoB8B,QAAQ;QAC3BC,OAAO;YACLxB;YACAM;YACAF;YACAqB,iBAAiB7B,gBAAgB8B,OAAOC,IAAI,CAAC/B,cAAcgC,MAAM,GAAG;YACpEhC;YACAM;YACAJ;YACAG;QACF;kBAECN;;AAGP,EAAC"}
1
+ {"version":3,"sources":["../../../src/providers/InstructionsProvider/InstructionsProvider.tsx"],"sourcesContent":["'use client'\n\nimport { useAuth, useConfig, useDocumentDrawer } from '@payloadcms/ui'\nimport React, { useCallback, useEffect, useState } from 'react'\n\nimport type { SerializedPromptField } from '../../types.js'\n\nimport { PLUGIN_FETCH_FIELDS_ENDPOINT, PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js'\nimport { useActiveFieldTracking } from '../../ui/Compose/hooks/useActiveFieldTracking.js'\nimport { InstructionsContext } from './context.js'\n\nexport const InstructionsProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => {\n // Initialize field tracking globally so ai-plugin-active class is added on field focus\n useActiveFieldTracking()\n \n const [instructions, setInstructionsState] = useState({})\n const [promptFields, setPromptFields] = useState<SerializedPromptField[]>([])\n const [activeCollection, setActiveCollection] = useState('')\n const [isConfigAllowed, setIsConfigAllowed] = useState(false)\n const [enabledLanguages, setEnabledLanguages] = useState<string[]>()\n const [debugging, setDebugging] = useState(false)\n const { user } = useAuth()\n\n const { config } = useConfig()\n const {\n routes: { api },\n serverURL,\n } = config\n\n // Global Document Drawer state\n const [drawerInstructionId, setDrawerInstructionId] = useState<string>('')\n const [drawerOpenCount, setDrawerOpenCount] = useState(0)\n\n const [DocumentDrawer, _, { openDrawer: openPayloadDrawer }] = useDocumentDrawer({\n id: drawerInstructionId,\n collectionSlug: PLUGIN_INSTRUCTIONS_TABLE,\n })\n\n const openDrawer = useCallback((id: string) => {\n setDrawerInstructionId(id)\n setDrawerOpenCount((prev) => prev + 1)\n }, [])\n\n // Open drawer when count changes\n useEffect(() => {\n if (drawerOpenCount > 0) {\n openPayloadDrawer()\n }\n }, [drawerOpenCount, openPayloadDrawer])\n\n // This is here because each field have separate instructions and\n // their ID is needed to edit them for Drawer\n useEffect(() => {\n // Only fetch if we have a user ID - prevents fetching on every user object reference change\n if (!user?.id) {\n return\n }\n\n fetch(`${serverURL}${api}${PLUGIN_FETCH_FIELDS_ENDPOINT}`)\n .then(async (res) => {\n await res.json().then((data) => {\n setIsConfigAllowed(data?.isConfigAllowed || false)\n setEnabledLanguages(data?.enabledLanguages || [])\n setInstructionsState(data?.fields || {})\n setPromptFields(data?.promptFields || [])\n setDebugging(data?.debugging || false)\n })\n })\n .catch((err) => {\n console.error('InstructionsProvider:', err)\n })\n }, [api, serverURL, user?.id])\n\n return (\n <InstructionsContext.Provider\n value={{\n activeCollection,\n debugging,\n enabledLanguages,\n hasInstructions: instructions && Object.keys(instructions).length > 0,\n instructions,\n isConfigAllowed,\n openDrawer,\n promptFields,\n setActiveCollection,\n }}\n >\n {children}\n <DocumentDrawer />\n </InstructionsContext.Provider>\n )\n}\n"],"names":["useAuth","useConfig","useDocumentDrawer","React","useCallback","useEffect","useState","PLUGIN_FETCH_FIELDS_ENDPOINT","PLUGIN_INSTRUCTIONS_TABLE","useActiveFieldTracking","InstructionsContext","InstructionsProvider","children","instructions","setInstructionsState","promptFields","setPromptFields","activeCollection","setActiveCollection","isConfigAllowed","setIsConfigAllowed","enabledLanguages","setEnabledLanguages","debugging","setDebugging","user","config","routes","api","serverURL","drawerInstructionId","setDrawerInstructionId","drawerOpenCount","setDrawerOpenCount","DocumentDrawer","_","openDrawer","openPayloadDrawer","id","collectionSlug","prev","fetch","then","res","json","data","fields","catch","err","console","error","Provider","value","hasInstructions","Object","keys","length"],"mappings":"AAAA;;AAEA,SAASA,OAAO,EAAEC,SAAS,EAAEC,iBAAiB,QAAQ,iBAAgB;AACtE,OAAOC,SAASC,WAAW,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAI/D,SAASC,4BAA4B,EAAEC,yBAAyB,QAAQ,oBAAmB;AAC3F,SAASC,sBAAsB,QAAQ,mDAAkD;AACzF,SAASC,mBAAmB,QAAQ,eAAc;AAElD,OAAO,MAAMC,uBAAgE,CAAC,EAAEC,QAAQ,EAAE;IACxF,uFAAuF;IACvFH;IAEA,MAAM,CAACI,cAAcC,qBAAqB,GAAGR,SAAS,CAAC;IACvD,MAAM,CAACS,cAAcC,gBAAgB,GAAGV,SAAkC,EAAE;IAC5E,MAAM,CAACW,kBAAkBC,oBAAoB,GAAGZ,SAAS;IACzD,MAAM,CAACa,iBAAiBC,mBAAmB,GAAGd,SAAS;IACvD,MAAM,CAACe,kBAAkBC,oBAAoB,GAAGhB;IAChD,MAAM,CAACiB,WAAWC,aAAa,GAAGlB,SAAS;IAC3C,MAAM,EAAEmB,IAAI,EAAE,GAAGzB;IAEjB,MAAM,EAAE0B,MAAM,EAAE,GAAGzB;IACnB,MAAM,EACJ0B,QAAQ,EAAEC,GAAG,EAAE,EACfC,SAAS,EACV,GAAGH;IAEJ,+BAA+B;IAC/B,MAAM,CAACI,qBAAqBC,uBAAuB,GAAGzB,SAAiB;IACvE,MAAM,CAAC0B,iBAAiBC,mBAAmB,GAAG3B,SAAS;IAEvD,MAAM,CAAC4B,gBAAgBC,GAAG,EAAEC,YAAYC,iBAAiB,EAAE,CAAC,GAAGnC,kBAAkB;QAC/EoC,IAAIR;QACJS,gBAAgB/B;IAClB;IAEA,MAAM4B,aAAahC,YAAY,CAACkC;QAC9BP,uBAAuBO;QACvBL,mBAAmB,CAACO,OAASA,OAAO;IACtC,GAAG,EAAE;IAEL,iCAAiC;IACjCnC,UAAU;QACR,IAAI2B,kBAAkB,GAAG;YACvBK;QACF;IACF,GAAG;QAACL;QAAiBK;KAAkB;IAEvC,iEAAiE;IACjE,6CAA6C;IAC7ChC,UAAU;QACR,4FAA4F;QAC5F,IAAI,CAACoB,MAAMa,IAAI;YACb;QACF;QAEAG,MAAM,CAAC,EAAEZ,UAAU,EAAED,IAAI,EAAErB,6BAA6B,CAAC,EACtDmC,IAAI,CAAC,OAAOC;YACX,MAAMA,IAAIC,IAAI,GAAGF,IAAI,CAAC,CAACG;gBACrBzB,mBAAmByB,MAAM1B,mBAAmB;gBAC5CG,oBAAoBuB,MAAMxB,oBAAoB,EAAE;gBAChDP,qBAAqB+B,MAAMC,UAAU,CAAC;gBACtC9B,gBAAgB6B,MAAM9B,gBAAgB,EAAE;gBACxCS,aAAaqB,MAAMtB,aAAa;YAClC;QACF,GACCwB,KAAK,CAAC,CAACC;YACNC,QAAQC,KAAK,CAAC,yBAAyBF;QACzC;IACJ,GAAG;QAACpB;QAAKC;QAAWJ,MAAMa;KAAG;IAE7B,qBACE,MAAC5B,oBAAoByC,QAAQ;QAC3BC,OAAO;YACLnC;YACAM;YACAF;YACAgC,iBAAiBxC,gBAAgByC,OAAOC,IAAI,CAAC1C,cAAc2C,MAAM,GAAG;YACpE3C;YACAM;YACAiB;YACArB;YACAG;QACF;;YAECN;0BACD,KAACsB;;;AAGP,EAAC"}