@ai-stack/payloadcms 3.2.24 → 3.68.0-beta.1
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.
- package/{LICENSE.md → LICENSE} +1 -1
- package/README.md +218 -229
- package/dist/access/checkAccess.d.ts +4 -0
- package/dist/access/checkAccess.js +20 -0
- package/dist/access/checkAccess.js.map +1 -0
- package/dist/ai/core/generateObject.d.ts +7 -0
- package/dist/ai/core/generateObject.js +35 -0
- package/dist/ai/core/generateObject.js.map +1 -0
- package/dist/ai/core/generateText.d.ts +7 -0
- package/dist/ai/core/generateText.js +31 -0
- package/dist/ai/core/generateText.js.map +1 -0
- package/dist/ai/core/index.d.ts +11 -0
- package/dist/ai/core/index.js +10 -0
- package/dist/ai/core/index.js.map +1 -0
- package/dist/ai/core/media/generateMedia.d.ts +7 -0
- package/dist/ai/core/media/generateMedia.js +50 -0
- package/dist/ai/core/media/generateMedia.js.map +1 -0
- package/dist/ai/core/media/image/generateImage.d.ts +6 -0
- package/dist/ai/core/media/image/generateImage.js +41 -0
- package/dist/ai/core/media/image/generateImage.js.map +1 -0
- package/dist/ai/core/media/image/handlers/multimodal.d.ts +7 -0
- package/dist/ai/core/media/image/handlers/multimodal.js +95 -0
- package/dist/ai/core/media/image/handlers/multimodal.js.map +1 -0
- package/dist/ai/core/media/image/handlers/standard.d.ts +7 -0
- package/dist/ai/core/media/image/handlers/standard.js +28 -0
- package/dist/ai/core/media/image/handlers/standard.js.map +1 -0
- package/dist/ai/core/media/image/index.d.ts +2 -0
- package/dist/ai/core/media/image/index.js +3 -0
- package/dist/ai/core/media/image/index.js.map +1 -0
- package/dist/ai/core/media/index.d.ts +2 -0
- package/dist/ai/core/media/index.js +3 -0
- package/dist/ai/core/media/index.js.map +1 -0
- package/dist/ai/core/media/speech/generateSpeech.d.ts +5 -0
- package/dist/ai/core/media/speech/generateSpeech.js +55 -0
- package/dist/ai/core/media/speech/generateSpeech.js.map +1 -0
- package/dist/ai/core/media/speech/index.d.ts +2 -0
- package/dist/ai/core/media/speech/index.js +3 -0
- package/dist/ai/core/media/speech/index.js.map +1 -0
- package/dist/ai/core/media/types.d.ts +74 -0
- package/dist/ai/core/media/types.js +5 -0
- package/dist/ai/core/media/types.js.map +1 -0
- package/dist/ai/core/media/utils.d.ts +11 -0
- package/dist/ai/core/media/utils.js +34 -0
- package/dist/ai/core/media/utils.js.map +1 -0
- package/dist/ai/core/media/video/generateVideo.d.ts +6 -0
- package/dist/ai/core/media/video/generateVideo.js +32 -0
- package/dist/ai/core/media/video/generateVideo.js.map +1 -0
- package/dist/ai/core/media/video/index.d.ts +2 -0
- package/dist/ai/core/media/video/index.js +3 -0
- package/dist/ai/core/media/video/index.js.map +1 -0
- package/dist/ai/core/streamObject.d.ts +7 -0
- package/dist/ai/core/streamObject.js +57 -0
- package/dist/ai/core/streamObject.js.map +1 -0
- package/dist/ai/core/streamText.d.ts +7 -0
- package/dist/ai/core/streamText.js +30 -0
- package/dist/ai/core/streamText.js.map +1 -0
- package/dist/ai/core/types.d.ts +85 -0
- package/dist/ai/core/types.js +5 -0
- package/dist/ai/core/types.js.map +1 -0
- package/dist/ai/index.d.ts +11 -0
- package/dist/ai/index.js +25 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/providers/blocks/anthropic.d.ts +2 -0
- package/dist/ai/providers/blocks/anthropic.js +222 -0
- package/dist/ai/providers/blocks/anthropic.js.map +1 -0
- package/dist/ai/providers/blocks/elevenlabs.d.ts +2 -0
- package/dist/ai/providers/blocks/elevenlabs.js +448 -0
- package/dist/ai/providers/blocks/elevenlabs.js.map +1 -0
- package/dist/ai/providers/blocks/fal.d.ts +2 -0
- package/dist/ai/providers/blocks/fal.js +311 -0
- package/dist/ai/providers/blocks/fal.js.map +1 -0
- package/dist/ai/providers/blocks/google.d.ts +2 -0
- package/dist/ai/providers/blocks/google.js +622 -0
- package/dist/ai/providers/blocks/google.js.map +1 -0
- package/dist/ai/providers/blocks/index.d.ts +2 -0
- package/dist/ai/providers/blocks/index.js +18 -0
- package/dist/ai/providers/blocks/index.js.map +1 -0
- package/dist/ai/providers/blocks/openai-compatible.d.ts +2 -0
- package/dist/ai/providers/blocks/openai-compatible.js +307 -0
- package/dist/ai/providers/blocks/openai-compatible.js.map +1 -0
- package/dist/ai/providers/blocks/openai.d.ts +2 -0
- package/dist/ai/providers/blocks/openai.js +599 -0
- package/dist/ai/providers/blocks/openai.js.map +1 -0
- package/dist/ai/providers/blocks/xai.d.ts +2 -0
- package/dist/ai/providers/blocks/xai.js +246 -0
- package/dist/ai/providers/blocks/xai.js.map +1 -0
- package/dist/ai/providers/index.d.ts +2 -0
- package/dist/ai/providers/index.js +6 -0
- package/dist/ai/providers/index.js.map +1 -0
- package/dist/ai/providers/registry.d.ts +40 -0
- package/dist/ai/providers/registry.js +256 -0
- package/dist/ai/providers/registry.js.map +1 -0
- package/dist/ai/providers/types.d.ts +115 -0
- package/dist/ai/providers/types.js +4 -0
- package/dist/ai/providers/types.js.map +1 -0
- package/dist/ai/utils/systemGenerate.d.ts +1 -1
- package/dist/ai/utils/systemGenerate.js +19 -19
- package/dist/ai/utils/systemGenerate.js.map +1 -1
- package/dist/collections/AIJobs.d.ts +2 -0
- package/dist/collections/AIJobs.js +81 -0
- package/dist/collections/AIJobs.js.map +1 -0
- package/dist/collections/AISettings.d.ts +2 -0
- package/dist/collections/AISettings.js +279 -0
- package/dist/collections/AISettings.js.map +1 -0
- package/dist/collections/Instructions.js +185 -37
- package/dist/collections/Instructions.js.map +1 -1
- package/dist/defaults.d.ts +3 -0
- package/dist/defaults.js +3 -0
- package/dist/defaults.js.map +1 -1
- package/dist/endpoints/buildPromptUtils.d.ts +19 -0
- package/dist/endpoints/buildPromptUtils.js +114 -0
- package/dist/endpoints/buildPromptUtils.js.map +1 -0
- package/dist/endpoints/chat.d.js +3 -0
- package/dist/endpoints/chat.d.js.map +1 -0
- package/dist/endpoints/fetchVoices.d.ts +2 -0
- package/dist/endpoints/fetchVoices.js +79 -0
- package/dist/endpoints/fetchVoices.js.map +1 -0
- package/dist/endpoints/index.js +253 -214
- package/dist/endpoints/index.js.map +1 -1
- package/dist/exports/client.d.ts +9 -0
- package/dist/exports/client.js +9 -0
- package/dist/exports/client.js.map +1 -1
- package/dist/fields/ComposeField/ComposeField.js +2 -2
- package/dist/fields/ComposeField/ComposeField.js.map +1 -1
- package/dist/fields/ComposeField/ComposeField.jsx +2 -2
- package/dist/fields/PromptEditorField/PromptEditorField.js +155 -14
- package/dist/fields/PromptEditorField/PromptEditorField.js.map +1 -1
- package/dist/fields/PromptEditorField/PromptEditorField.jsx +118 -3
- package/dist/index.d.ts +1 -0
- package/dist/index.js.map +1 -1
- package/dist/init.js +35 -13
- package/dist/init.js.map +1 -1
- package/dist/payload-ai.d.js +3 -0
- package/dist/payload-ai.d.js.map +1 -0
- package/dist/plugin.js +80 -9
- package/dist/plugin.js.map +1 -1
- package/dist/providers/InstructionsProvider/InstructionsProvider.js +35 -7
- package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
- package/dist/providers/InstructionsProvider/InstructionsProvider.jsx +27 -4
- package/dist/providers/InstructionsProvider/context.d.ts +1 -0
- package/dist/providers/InstructionsProvider/context.js +1 -0
- package/dist/providers/InstructionsProvider/context.js.map +1 -1
- package/dist/providers/InstructionsProvider/useInstructions.js +13 -6
- package/dist/providers/InstructionsProvider/useInstructions.js.map +1 -1
- package/dist/types.d.ts +7 -7
- package/dist/types.js.map +1 -1
- package/dist/ui/AIConfigDashboard/index.d.ts +2 -0
- package/dist/ui/AIConfigDashboard/index.js +46 -0
- package/dist/ui/AIConfigDashboard/index.js.map +1 -0
- package/dist/ui/AIConfigDashboard/index.jsx +24 -0
- package/dist/ui/ApiKeyStatusIndicator/index.d.ts +6 -0
- package/dist/ui/ApiKeyStatusIndicator/index.js +39 -0
- package/dist/ui/ApiKeyStatusIndicator/index.js.map +1 -0
- package/dist/ui/ApiKeyStatusIndicator/index.jsx +29 -0
- package/dist/ui/Compose/Compose.d.ts +1 -2
- package/dist/ui/Compose/Compose.js +116 -90
- package/dist/ui/Compose/Compose.js.map +1 -1
- package/dist/ui/Compose/Compose.jsx +111 -101
- package/dist/ui/Compose/ComposePlaceholder.d.ts +7 -0
- package/dist/ui/Compose/ComposePlaceholder.js +78 -0
- package/dist/ui/Compose/ComposePlaceholder.js.map +1 -0
- package/dist/ui/Compose/ComposePlaceholder.jsx +66 -0
- package/dist/ui/Compose/UndoRedoActions.js +3 -1
- package/dist/ui/Compose/UndoRedoActions.js.map +1 -1
- package/dist/ui/Compose/UndoRedoActions.jsx +2 -1
- package/dist/ui/Compose/compose.module.css +1 -1
- package/dist/ui/Compose/hooks/menu/itemsMap.js +1 -1
- package/dist/ui/Compose/hooks/menu/itemsMap.js.map +1 -1
- package/dist/ui/Compose/hooks/menu/useMenu.d.ts +2 -1
- package/dist/ui/Compose/hooks/menu/useMenu.js +2 -2
- package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
- package/dist/ui/Compose/hooks/menu/useMenu.jsx +2 -2
- package/dist/ui/Compose/hooks/useActiveFieldTracking.js +69 -10
- package/dist/ui/Compose/hooks/useActiveFieldTracking.js.map +1 -1
- package/dist/ui/Compose/hooks/useGenerate.d.ts +3 -0
- package/dist/ui/Compose/hooks/useGenerate.js +71 -11
- package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
- package/dist/ui/Compose/hooks/useHistory.js +52 -5
- package/dist/ui/Compose/hooks/useHistory.js.map +1 -1
- package/dist/ui/DynamicModelSelect/index.d.ts +7 -0
- package/dist/ui/DynamicModelSelect/index.js +231 -0
- package/dist/ui/DynamicModelSelect/index.js.map +1 -0
- package/dist/ui/DynamicModelSelect/index.jsx +207 -0
- package/dist/ui/DynamicProviderSelect/index.d.ts +7 -0
- package/dist/ui/DynamicProviderSelect/index.js +101 -0
- package/dist/ui/DynamicProviderSelect/index.js.map +1 -0
- package/dist/ui/DynamicProviderSelect/index.jsx +90 -0
- package/dist/ui/DynamicVoiceSelect/index.d.ts +7 -0
- package/dist/ui/DynamicVoiceSelect/index.js +104 -0
- package/dist/ui/DynamicVoiceSelect/index.js.map +1 -0
- package/dist/ui/DynamicVoiceSelect/index.jsx +69 -0
- package/dist/ui/EncryptedTextField/index.d.ts +8 -0
- package/dist/ui/EncryptedTextField/index.js +74 -0
- package/dist/ui/EncryptedTextField/index.js.map +1 -0
- package/dist/ui/EncryptedTextField/index.jsx +35 -0
- package/dist/ui/Icons/LottieAnimation.js +3 -1
- package/dist/ui/Icons/LottieAnimation.js.map +1 -1
- package/dist/ui/Icons/LottieAnimation.jsx +2 -1
- package/dist/ui/ModelRowLabel/index.d.ts +6 -0
- package/dist/ui/ModelRowLabel/index.js +41 -0
- package/dist/ui/ModelRowLabel/index.js.map +1 -0
- package/dist/ui/ModelRowLabel/index.jsx +26 -0
- package/dist/ui/ProviderOptionsEditor/index.d.ts +7 -0
- package/dist/ui/ProviderOptionsEditor/index.js +291 -0
- package/dist/ui/ProviderOptionsEditor/index.js.map +1 -0
- package/dist/ui/ProviderOptionsEditor/index.jsx +210 -0
- package/dist/ui/VoicesFetcher/index.d.ts +7 -0
- package/dist/ui/VoicesFetcher/index.js +72 -0
- package/dist/ui/VoicesFetcher/index.js.map +1 -0
- package/dist/ui/VoicesFetcher/index.jsx +56 -0
- package/dist/utilities/encryption.d.ts +2 -0
- package/dist/utilities/encryption.js +47 -0
- package/dist/utilities/encryption.js.map +1 -0
- package/dist/utilities/extractImageData.d.ts +9 -0
- package/dist/utilities/extractImageData.js +12 -2
- package/dist/utilities/extractImageData.js.map +1 -1
- package/dist/utilities/fetchImages.d.ts +14 -0
- package/dist/utilities/fetchImages.js +38 -0
- package/dist/utilities/fetchImages.js.map +1 -0
- package/dist/utilities/fieldToJsonSchema.d.ts +2 -1
- package/dist/utilities/fieldToJsonSchema.js +66 -3
- package/dist/utilities/fieldToJsonSchema.js.map +1 -1
- package/dist/utilities/getFieldBySchemaPath.js +15 -0
- package/dist/utilities/getFieldBySchemaPath.js.map +1 -1
- package/dist/utilities/getProviderOptionsFields.d.ts +16 -0
- package/dist/utilities/getProviderOptionsFields.js +80 -0
- package/dist/utilities/getProviderOptionsFields.js.map +1 -0
- package/dist/utilities/isPluginActivated.js +1 -2
- package/dist/utilities/isPluginActivated.js.map +1 -1
- package/dist/utilities/lexicalToHTML.js.map +1 -1
- package/dist/utilities/resolveImageReferences.d.ts +28 -0
- package/dist/utilities/resolveImageReferences.js +148 -0
- package/dist/utilities/resolveImageReferences.js.map +1 -0
- package/dist/utilities/schemaConverter.d.ts +3 -0
- package/dist/utilities/schemaConverter.js +93 -0
- package/dist/utilities/schemaConverter.js.map +1 -0
- package/dist/utilities/setSafeLexicalState.d.ts +1 -3
- package/dist/utilities/setSafeLexicalState.js +1 -1
- package/dist/utilities/setSafeLexicalState.js.map +1 -1
- package/package.json +38 -39
- package/dist/ai/models/anthropic/index.d.ts +0 -2
- package/dist/ai/models/anthropic/index.js +0 -129
- package/dist/ai/models/anthropic/index.js.map +0 -1
- package/dist/ai/models/elevenLabs/generateVoice.d.ts +0 -8
- package/dist/ai/models/elevenLabs/generateVoice.js +0 -20
- package/dist/ai/models/elevenLabs/generateVoice.js.map +0 -1
- package/dist/ai/models/elevenLabs/index.d.ts +0 -2
- package/dist/ai/models/elevenLabs/index.js +0 -133
- package/dist/ai/models/elevenLabs/index.js.map +0 -1
- package/dist/ai/models/elevenLabs/voices.d.ts +0 -8
- package/dist/ai/models/elevenLabs/voices.js +0 -24
- package/dist/ai/models/elevenLabs/voices.js.map +0 -1
- package/dist/ai/models/generateObject.d.ts +0 -11
- package/dist/ai/models/generateObject.js +0 -22
- package/dist/ai/models/generateObject.js.map +0 -1
- package/dist/ai/models/google/generateImage.d.ts +0 -9
- package/dist/ai/models/google/generateImage.js +0 -27
- package/dist/ai/models/google/generateImage.js.map +0 -1
- package/dist/ai/models/google/index.d.ts +0 -2
- package/dist/ai/models/google/index.js +0 -201
- package/dist/ai/models/google/index.js.map +0 -1
- package/dist/ai/models/index.d.ts +0 -2
- package/dist/ai/models/index.js +0 -13
- package/dist/ai/models/index.js.map +0 -1
- package/dist/ai/models/openai/generateImage.d.ts +0 -5
- package/dist/ai/models/openai/generateImage.js +0 -31
- package/dist/ai/models/openai/generateImage.js.map +0 -1
- package/dist/ai/models/openai/generateVoice.d.ts +0 -6
- package/dist/ai/models/openai/generateVoice.js +0 -19
- package/dist/ai/models/openai/generateVoice.js.map +0 -1
- package/dist/ai/models/openai/index.d.ts +0 -2
- package/dist/ai/models/openai/index.js +0 -428
- package/dist/ai/models/openai/index.js.map +0 -1
- package/dist/ai/models/openai/openai.d.ts +0 -1
- package/dist/ai/models/openai/openai.js +0 -8
- package/dist/ai/models/openai/openai.js.map +0 -1
- package/dist/ai/utils/editImagesWithOpenAI.d.ts +0 -10
- package/dist/ai/utils/editImagesWithOpenAI.js +0 -37
- package/dist/ai/utils/editImagesWithOpenAI.js.map +0 -1
- package/dist/types.d.js +0 -3
- package/dist/types.d.js.map +0 -1
- package/dist/utilities/getGenerationModels.d.ts +0 -2
- package/dist/utilities/getGenerationModels.js +0 -10
- package/dist/utilities/getGenerationModels.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { FieldDescription, FieldLabel, useField } from '@payloadcms/ui';
|
|
2
|
+
import { FieldDescription, FieldLabel, useConfig, useField } from '@payloadcms/ui';
|
|
3
3
|
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
4
4
|
import { Mention, MentionsInput } from 'react-mentions/dist/react-mentions.cjs.js';
|
|
5
5
|
import { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js';
|
|
@@ -11,11 +11,121 @@ export const PromptEditorField = (props) => {
|
|
|
11
11
|
});
|
|
12
12
|
const [localValue, setLocalValue] = useState(payloadValue || '');
|
|
13
13
|
const hasInitialized = useRef(false);
|
|
14
|
-
const { promptEditorSuggestions } = useInstructions();
|
|
14
|
+
const { activeCollection, promptEditorSuggestions } = useInstructions();
|
|
15
|
+
const { config } = useConfig();
|
|
15
16
|
const suggestions = useMemo(() => promptEditorSuggestions.map((suggestion) => ({
|
|
16
17
|
id: suggestion,
|
|
17
18
|
display: suggestion,
|
|
18
19
|
})), [promptEditorSuggestions]);
|
|
20
|
+
// Extract document ID from URL if available (to get specific filenames)
|
|
21
|
+
const [documentData, setDocumentData] = useState(null);
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
// Only run in browser
|
|
24
|
+
if (typeof window === 'undefined') {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
// Allow time for verify window.location is stable (unlikely to change but good practice)
|
|
28
|
+
const segments = window.location.pathname.split('/');
|
|
29
|
+
const collectionsIndex = segments.indexOf('collections');
|
|
30
|
+
if (collectionsIndex > -1 && segments.length > collectionsIndex + 2) {
|
|
31
|
+
const urlCollectionSlug = segments[collectionsIndex + 1];
|
|
32
|
+
const urlId = segments[collectionsIndex + 2];
|
|
33
|
+
// Only fetch if we are editing instructions for the same collection we are viewing
|
|
34
|
+
// and we haven't fetched yet (or ID changed)
|
|
35
|
+
if (urlCollectionSlug === activeCollection && urlId && urlId !== 'create') {
|
|
36
|
+
const fetchDocument = async () => {
|
|
37
|
+
try {
|
|
38
|
+
const response = await fetch(`${String(config.serverURL)}${String(config.routes.api)}/${String(urlCollectionSlug)}/${String(urlId)}`);
|
|
39
|
+
if (response.ok) {
|
|
40
|
+
const data = await response.json();
|
|
41
|
+
setDocumentData(data);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
catch (_err) {
|
|
45
|
+
// Ignore error
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
void fetchDocument();
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}, [activeCollection, config]);
|
|
52
|
+
// Extract all upload fields from the current collection schema
|
|
53
|
+
const imageFieldSuggestions = useMemo(() => {
|
|
54
|
+
const suggestions = [];
|
|
55
|
+
// Use activeCollection from context which holds the target collection slug
|
|
56
|
+
const targetSlug = activeCollection;
|
|
57
|
+
if (!targetSlug || !config?.collections) {
|
|
58
|
+
return [];
|
|
59
|
+
}
|
|
60
|
+
const collection = config.collections.find((c) => c.slug === targetSlug);
|
|
61
|
+
if (!collection?.fields) {
|
|
62
|
+
return [];
|
|
63
|
+
}
|
|
64
|
+
const uploadFields = [];
|
|
65
|
+
// Recursive function to find upload fields
|
|
66
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
67
|
+
const findUploadFields = (fields, prefix = '') => {
|
|
68
|
+
for (const field of fields) {
|
|
69
|
+
if (field.type === 'upload' && field.name) {
|
|
70
|
+
const fieldPath = prefix ? `${prefix}.${String(field.name)}` : String(field.name);
|
|
71
|
+
uploadFields.push({ name: fieldPath, hasMany: field.hasMany === true });
|
|
72
|
+
}
|
|
73
|
+
// Check nested fields in groups, arrays, etc.
|
|
74
|
+
if (field.fields && Array.isArray(field.fields)) {
|
|
75
|
+
const newPrefix = field.name ? (prefix ? `${prefix}.${String(field.name)}` : String(field.name)) : prefix;
|
|
76
|
+
findUploadFields(field.fields, newPrefix);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
findUploadFields(collection.fields);
|
|
81
|
+
// Add generic field names (base suggestions) - ONLY for single uploads (not hasMany arrays)
|
|
82
|
+
uploadFields.forEach(({ name, hasMany }) => {
|
|
83
|
+
// User requested to hide the array itself for hasMany fields
|
|
84
|
+
if (!hasMany) {
|
|
85
|
+
suggestions.push({ id: name, display: name });
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
// If we have document data, add specific filename suggestions
|
|
89
|
+
if (documentData) {
|
|
90
|
+
uploadFields.forEach(({ name, hasMany }) => {
|
|
91
|
+
const value = documentData[name]; // Note: nested access logic simplified for now
|
|
92
|
+
// Helper to extract filename from media doc (which might be ID or object)
|
|
93
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
94
|
+
const getFilename = (item) => {
|
|
95
|
+
if (typeof item === 'object' && item && (item.filename || item.name)) {
|
|
96
|
+
return item.filename || item.name;
|
|
97
|
+
}
|
|
98
|
+
// If it's just an ID, we can't show filename without populating.
|
|
99
|
+
// Assuming compose view usually fetches with depth > 0 or we rely on what we have.
|
|
100
|
+
return null;
|
|
101
|
+
};
|
|
102
|
+
if (value) {
|
|
103
|
+
if (hasMany && Array.isArray(value)) {
|
|
104
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
105
|
+
value.forEach((item) => {
|
|
106
|
+
const fname = getFilename(item);
|
|
107
|
+
if (fname) {
|
|
108
|
+
const suggestion = `${name}:${fname}`;
|
|
109
|
+
suggestions.push({ id: suggestion, display: suggestion });
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
else if (!hasMany) {
|
|
114
|
+
// Single image - we already added the base name above.
|
|
115
|
+
// We can optionally add the specific filename too if desired,
|
|
116
|
+
// but user request focused on arrays.
|
|
117
|
+
// Adding the specific filename option for Single images too as it's explicit.
|
|
118
|
+
const fname = getFilename(value);
|
|
119
|
+
if (fname) {
|
|
120
|
+
const suggestion = `${name}:${fname}`;
|
|
121
|
+
suggestions.push({ id: suggestion, display: suggestion });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
return suggestions;
|
|
128
|
+
}, [activeCollection, config, documentData]);
|
|
19
129
|
useEffect(() => {
|
|
20
130
|
if (!hasInitialized.current || payloadValue === '') {
|
|
21
131
|
setLocalValue(payloadValue || '');
|
|
@@ -29,13 +139,18 @@ export const PromptEditorField = (props) => {
|
|
|
29
139
|
setValue(localValue);
|
|
30
140
|
}, [localValue, setValue]);
|
|
31
141
|
const displayTransform = useCallback((id) => `{{ ${id} }}`, []);
|
|
142
|
+
const imageDisplayTransform = useCallback((id) => `@${id}`, []);
|
|
32
143
|
return (<div className="field-type textarea">
|
|
33
144
|
<FieldLabel label={field.label}/>
|
|
34
|
-
<MentionsInput onBlur={handleBlur} onChange={handleChange} placeholder="Type
|
|
145
|
+
<MentionsInput onBlur={handleBlur} onChange={handleChange} placeholder="Type {{ for fields }} or @imageField for images. For specific images use @imageField:filename.jpg" style={defaultStyle} value={localValue}>
|
|
35
146
|
<Mention data={suggestions} displayTransform={displayTransform} markup="{{__id__}}" style={{
|
|
36
147
|
backgroundColor: 'var(--theme-elevation-100)',
|
|
37
148
|
padding: '2px 0',
|
|
38
149
|
}} trigger="{"/>
|
|
150
|
+
<Mention data={imageFieldSuggestions} displayTransform={imageDisplayTransform} markup="@__id__" style={{
|
|
151
|
+
backgroundColor: 'var(--theme-elevation-150)',
|
|
152
|
+
padding: '2px 0',
|
|
153
|
+
}} trigger="@"/>
|
|
39
154
|
</MentionsInput>
|
|
40
155
|
<FieldDescription description={field?.admin?.description} path=""/>
|
|
41
156
|
</div>);
|
package/dist/index.d.ts
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { defaultPrompts, defaultSeedPrompts } from './ai/prompts.js'\
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export type { GenerateArgs } from './ai/index.js'\n\nexport { defaultPrompts, defaultSeedPrompts } from './ai/prompts.js'\nexport { PayloadAiPluginLexicalEditorFeature } from './fields/LexicalEditor/feature.server.js'\n\nexport { payloadAiPlugin } from './plugin.js'\n"],"names":["defaultPrompts","defaultSeedPrompts","PayloadAiPluginLexicalEditorFeature","payloadAiPlugin"],"mappings":"AAEA,SAASA,cAAc,EAAEC,kBAAkB,QAAQ,kBAAiB;AACpE,SAASC,mCAAmC,QAAQ,2CAA0C;AAE9F,SAASC,eAAe,QAAQ,cAAa"}
|
package/dist/init.js
CHANGED
|
@@ -1,7 +1,27 @@
|
|
|
1
1
|
import { defaultSeedPrompts } from './ai/prompts.js';
|
|
2
|
-
import { systemGenerate } from './ai/utils/systemGenerate.js';
|
|
3
2
|
import { PLUGIN_INSTRUCTIONS_TABLE } from './defaults.js';
|
|
4
|
-
|
|
3
|
+
// Defined capabilities mapping for init
|
|
4
|
+
const CAPABILITY_MAP = [
|
|
5
|
+
{
|
|
6
|
+
id: 'text',
|
|
7
|
+
fields: [
|
|
8
|
+
'text',
|
|
9
|
+
'textarea'
|
|
10
|
+
]
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
id: 'richtext',
|
|
14
|
+
fields: [
|
|
15
|
+
'richText'
|
|
16
|
+
]
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
id: 'image',
|
|
20
|
+
fields: [
|
|
21
|
+
'upload'
|
|
22
|
+
]
|
|
23
|
+
}
|
|
24
|
+
];
|
|
5
25
|
export const init = async (payload, fieldSchemaPaths, pluginConfig)=>{
|
|
6
26
|
if (!pluginConfig.generatePromptOnInit) {
|
|
7
27
|
return;
|
|
@@ -46,18 +66,20 @@ export const init = async (payload, fieldSchemaPaths, pluginConfig)=>{
|
|
|
46
66
|
}
|
|
47
67
|
continue;
|
|
48
68
|
}
|
|
49
|
-
|
|
69
|
+
const generatedPrompt = '{{ title }}';
|
|
50
70
|
if ('prompt' in seed) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
71
|
+
// Prompt generation currently disabled during migration to AI SDK Providers
|
|
72
|
+
// TODO: Re-enable using a default provider from AI Settings if available
|
|
73
|
+
/*
|
|
74
|
+
generatedPrompt = await systemGenerate(
|
|
75
|
+
{
|
|
76
|
+
prompt: seed.prompt,
|
|
77
|
+
system: seed.system,
|
|
78
|
+
},
|
|
79
|
+
undefined // No generateTextFn currently
|
|
80
|
+
)
|
|
81
|
+
*/ }
|
|
82
|
+
const modelForId = CAPABILITY_MAP.find((a)=>a.fields.includes(fieldType));
|
|
61
83
|
const data = {
|
|
62
84
|
'model-id': modelForId?.id,
|
|
63
85
|
prompt: generatedPrompt,
|
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'\
|
|
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 // 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 '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 const generatedPrompt: string | undefined = '{{ title }}'\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 if (instructions['field-type'] !== fieldType) {\n payload.logger.warn(\n `— AI Plugin: Field type mismatch for ${path}! Was \"${fieldType}\", it is \"${instructions['field-type']}\" 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","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","update","JSON","stringify"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/payload-ai.d.ts"],"sourcesContent":["import type { GenerateObjectResult } from 'ai'\n// Type definitions for payload.ai API\nimport type { Payload } from 'payload'\n\nimport type {\n MediaResult,\n PayloadGenerateMediaArgs,\n PayloadGenerateObjectArgs,\n PayloadGenerateTextArgs,\n} from './ai/core/types.js'\n\ndeclare module 'payload' {\n interface BasePayload {\n ai: {\n /**\n * @deprecated Use generateObject or generateText instead\n * Legacy generate method for backward compatibility\n */\n generate: (args: unknown) => Promise<unknown>\n\n /**\n * Generate media (images or videos)\n * @param args - Generation arguments including provider, model, prompt, and media options\n * @returns Promise resolving to either a file or async job info\n */\n generateMedia: (args: Omit<PayloadGenerateMediaArgs, 'payload'>) => Promise<MediaResult>\n\n /**\n * Generate structured output with schema validation\n * @param args - Generation arguments including provider, model, prompt, and schema\n * @returns Promise resolving to the generated object\n */\n generateObject: <T = unknown>(args: Omit<PayloadGenerateObjectArgs, 'payload'>) => Promise<GenerateObjectResult<T>>\n\n /**\n * Generate simple text output\n * @param args - Generation arguments including provider, model, and prompt\n * @returns Promise resolving to the generated text\n */\n generateText: (args: Omit<PayloadGenerateTextArgs, 'payload'>) => Promise<string>\n\n /**\n * Get a specific model instance\n * @param provider - Provider name (e.g., 'openai', 'anthropic')\n * @param modelId - Model ID (e.g., 'gpt-4', 'claude-3')\n * @param type - Model type ('text', 'image', or 'tts')\n * @returns Promise resolving to the model instance\n */\n getModel: (provider: string, modelId: string, type?: 'image' | 'text' | 'tts') => Promise<unknown>\n\n /**\n * Get the provider registry\n * @returns Promise resolving to the provider registry\n */\n getRegistry: () => Promise<Record<string, unknown>>\n\n /**\n * Stream structured output with schema validation\n * @param args - Generation arguments including provider, model, prompt, and schema\n * @returns Response stream\n */\n streamObject: <T = unknown>(\n args: Omit<PayloadGenerateObjectArgs, 'payload'>,\n ) => Promise<Response>\n\n /**\n * Stream text output\n * @param args - Generation arguments including provider, model, and prompt\n * @returns Response stream\n */\n streamText: (args: Omit<PayloadGenerateTextArgs, 'payload'>) => Promise<Response>\n }\n }\n}"],"names":[],"mappings":"AAIA,WAK2B"}
|
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
|
╔═══════════════════════════════════════════════════════════════╗
|
|
@@ -62,7 +62,6 @@ const payloadAiPlugin = (pluginConfig)=>(incomingConfig)=>{
|
|
|
62
62
|
...pluginConfig.access
|
|
63
63
|
}
|
|
64
64
|
};
|
|
65
|
-
pluginConfig.generationModels = getGenerationModels(pluginConfig);
|
|
66
65
|
const isActivated = isPluginActivated(pluginConfig);
|
|
67
66
|
let updatedConfig = {
|
|
68
67
|
...incomingConfig
|
|
@@ -70,6 +69,7 @@ const payloadAiPlugin = (pluginConfig)=>(incomingConfig)=>{
|
|
|
70
69
|
let collectionsFieldPathMap = {};
|
|
71
70
|
if (isActivated) {
|
|
72
71
|
const Instructions = instructionsCollection(pluginConfig);
|
|
72
|
+
const AIJobs = aiJobsCollection();
|
|
73
73
|
// Inject editor schema to config, so that it can be accessed when /textarea endpoint will hit
|
|
74
74
|
const lexicalSchema = lexicalJsonSchema(pluginConfig.editorConfig?.nodes);
|
|
75
75
|
Instructions.admin = {
|
|
@@ -89,10 +89,12 @@ const payloadAiPlugin = (pluginConfig)=>(incomingConfig)=>{
|
|
|
89
89
|
};
|
|
90
90
|
const collections = [
|
|
91
91
|
...incomingConfig.collections ?? [],
|
|
92
|
-
Instructions
|
|
92
|
+
Instructions,
|
|
93
|
+
AIJobs
|
|
93
94
|
];
|
|
94
95
|
const globals = [
|
|
95
|
-
...incomingConfig.globals ?? []
|
|
96
|
+
...incomingConfig.globals ?? [],
|
|
97
|
+
aiSettingsGlobal
|
|
96
98
|
];
|
|
97
99
|
const { collections: collectionSlugs, globals: globalsSlugs } = pluginConfig;
|
|
98
100
|
const { components: { providers = [] } = {} } = incomingConfig.admin || {};
|
|
@@ -127,7 +129,11 @@ const payloadAiPlugin = (pluginConfig)=>(incomingConfig)=>{
|
|
|
127
129
|
...incomingConfig.endpoints ?? [],
|
|
128
130
|
pluginEndpoints.textarea,
|
|
129
131
|
pluginEndpoints.upload,
|
|
130
|
-
|
|
132
|
+
...pluginEndpoints.videogenWebhook ? [
|
|
133
|
+
pluginEndpoints.videogenWebhook
|
|
134
|
+
] : [],
|
|
135
|
+
fetchFields(pluginConfig),
|
|
136
|
+
fetchVoices
|
|
131
137
|
],
|
|
132
138
|
globals: globals.map((global)=>{
|
|
133
139
|
if (globalsSlugs && globalsSlugs[global.slug]) {
|
|
@@ -149,7 +155,9 @@ const payloadAiPlugin = (pluginConfig)=>(incomingConfig)=>{
|
|
|
149
155
|
};
|
|
150
156
|
}
|
|
151
157
|
updatedConfig.onInit = async (payload)=>{
|
|
152
|
-
if (incomingConfig.onInit)
|
|
158
|
+
if (incomingConfig.onInit) {
|
|
159
|
+
await incomingConfig.onInit(payload);
|
|
160
|
+
}
|
|
153
161
|
if (!isActivated) {
|
|
154
162
|
payload.logger.warn(`— AI Plugin: Not activated. Please verify your environment keys.`);
|
|
155
163
|
return;
|
|
@@ -166,6 +174,69 @@ const payloadAiPlugin = (pluginConfig)=>(incomingConfig)=>{
|
|
|
166
174
|
}, 3000);
|
|
167
175
|
}
|
|
168
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
|
+
};
|
|
169
240
|
};
|
|
170
241
|
return updatedConfig;
|
|
171
242
|
};
|
package/dist/plugin.js.map
CHANGED
|
@@ -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 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 pluginConfig.generationModels = getGenerationModels(pluginConfig)\n\n const isActivated = isPluginActivated(pluginConfig)\n let updatedConfig: Config = { ...incomingConfig }\n let collectionsFieldPathMap = {}\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 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 fetchFields(pluginConfig),\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) await incomingConfig.onInit(payload)\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","payloadAiPlugin","pluginConfig","incomingConfig","isActivated","updatedConfig","collectionsFieldPathMap","Instructions","lexicalSchema","editorConfig","nodes","admin","debugging","hidden","custom","schema","globals","collectionSlugs","globalsSlugs","components","providers","updatedProviders","path","pluginEndpoints","map","collection","slug","schemaPathMap","updatedCollectionConfig","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":"AAEA,SAASA,SAAS,QAAQ,iBAAgB;AAI1C,SAASC,iBAAiB,QAAQ,oCAAmC;AACrE,SAASC,gBAAgB,QAAQ,0BAAyB;AAC1D,SAASC,gBAAgB,QAAQ,8BAA6B;AAC9D,SAASC,sBAAsB,QAAQ,gCAA+B;AACtE,SAASC,WAAW,QAAQ,gBAAe;AAC3C,SAASC,WAAW,QAAQ,6BAA4B;AACxD,SAASC,WAAW,QAAQ,6BAA4B;AACxD,SAASC,SAAS,QAAQ,uBAAsB;AAChD,SAASC,IAAI,QAAQ,YAAW;AAChC,SAASC,YAAY,QAAQ,0BAAyB;AACtD,SAASC,iBAAiB,QAAQ,mCAAkC;AACpE,SAASC,kBAAkB,QAAQ,oCAAmC;AAEtE,MAAMC,sBAAoC;IACxCC,QAAQ;QACNC,UAAU,CAAC,EAAEC,GAAG,EAAE,GAAK,CAAC,CAACA,IAAIC,IAAI;QACjCC,UAAU,CAAC,EAAEF,GAAG,EAAE,GAAK,CAAC,CAACA,IAAIC,IAAI;IACnC;IACAE,aAAa,CAAC;IACdC,uBAAuB;IACvBC,sBAAsB;AACxB;AAEA,MAAMC,iBAAiB,CAAC;;;;;;;;;;;;;;;;;;AAkBxB,CAAC;AAED,MAAMC,kBAAkB,CAAC;;;;;;;;;;;;;AAazB,CAAC;AAED,MAAMC,kBACJ,CAACC,eACD,CAACC;QACCD,eAAe;YACb,GAAGZ,mBAAmB;YACtB,GAAGY,YAAY;YACfX,QAAQ;gBACN,GAAGD,oBAAoBC,MAAM;gBAC7B,GAAGW,aAAaX,MAAM;YACxB;QACF;QAEA,MAAMa,cAAchB,kBAAkBc;QACtC,IAAIG,gBAAwB;YAAE,GAAGF,cAAc;QAAC;QAChD,IAAIG,0BAA0B,CAAC;QAE/B,IAAIF,aAAa;YACf,MAAMG,eAAe1B,uBAAuBqB;YAC5C,MAAMM,SAAS7B;YACf,8FAA8F;YAC9F,MAAM8B,gBAAgB/B,kBAAkBwB,aAAaQ,YAAY,EAAEC;YAEnEJ,aAAaK,KAAK,GAAG;gBACnB,GAAGL,aAAaK,KAAK;YACvB;YAEA,IAAIV,aAAaW,SAAS,EAAE;gBAC1BN,aAAaK,KAAK,CAACE,MAAM,GAAG;YAC9B;YAEAP,aAAaK,KAAK,CAACG,MAAM,GAAG;gBAC1B,GAAIR,aAAaK,KAAK,CAACG,MAAM,IAAI,CAAC,CAAC;gBACnC,CAACjC,YAAY,EAAE;oBACb4B,cAAc;wBACZ,0CAA0C;wBAC1CM,QAAQP;oBACV;gBACF;YACF;YAEA,MAAMb,cAAc;mBAAKO,eAAeP,WAAW,IAAI,EAAE;gBAAGW;gBAAcC;aAAO;YACjF,MAAMS,UAAU;mBAAKd,eAAec,OAAO,IAAI,EAAE;gBAAGrC;aAAiB;YACrE,MAAM,EAAEgB,aAAasB,eAAe,EAAED,SAASE,YAAY,EAAE,GAAGjB;YAEhE,MAAM,EAAEkB,YAAY,EAAEC,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,GAAGlB,eAAeS,KAAK,IAAI,CAAC;YACzE,MAAMU,mBAAmB;mBACnBD,aAAa,EAAE;gBACnB;oBACEE,MAAM;gBACR;aACD;YAEDpB,eAAeS,KAAK,GAAG;gBACrB,GAAIT,eAAeS,KAAK,IAAI,CAAC,CAAC;gBAC9BQ,YAAY;oBACV,GAAIjB,eAAeS,KAAK,EAAEQ,cAAc,CAAC,CAAC;oBAC1CC,WAAWC;gBACb;YACF;YAEA,MAAME,kBAAkBvC,UAAUiB;YAClCG,gBAAgB;gBACd,GAAGF,cAAc;gBACjBP,aAAaA,YAAY6B,GAAG,CAAC,CAACC;oBAC5B,IAAIR,eAAe,CAACQ,WAAWC,IAAI,CAAC,EAAE;wBACpC,MAAM,EAAEC,aAAa,EAAEC,uBAAuB,EAAE,GAAGxC,mBAAmBqC;wBACtEpB,0BAA0B;4BACxB,GAAGA,uBAAuB;4BAC1B,GAAGsB,aAAa;wBAClB;wBACA,OAAOC;oBACT;oBAEA,OAAOH;gBACT;gBACAzC,WAAW;uBACLkB,eAAelB,SAAS,IAAI,EAAE;oBAClCuC,gBAAgBM,QAAQ;oBACxBN,gBAAgBO,MAAM;uBAClBP,gBAAgBQ,eAAe,GAAG;wBAACR,gBAAgBQ,eAAe;qBAAC,GAAG,EAAE;oBAC5EjD,YAAYmB;oBACZlB;iBACD;gBACDiC,SAASA,QAAQQ,GAAG,CAAC,CAACQ;oBACpB,IAAId,gBAAgBA,YAAY,CAACc,OAAON,IAAI,CAAC,EAAE;wBAC7C,MAAM,EAAEC,aAAa,EAAEC,uBAAuB,EAAE,GAAGxC,mBAAmB4C;wBACtE3B,0BAA0B;4BACxB,GAAGA,uBAAuB;4BAC1B,GAAGsB,aAAa;wBAClB;wBACA,OAAOC;oBACT;oBAEA,OAAOI;gBACT;gBACAC,MAAM;oBACJ,GAAI/B,eAAe+B,IAAI,IAAI,CAAC,CAAC;oBAC7B/C,cAAc;wBACZ,GAAGV,UAAUU,cAAcgB,eAAe+B,IAAI,EAAE/C,gBAAgB,CAAC,EAAE;oBACrE;gBACF;YACF;QACF;QAEAkB,cAAc8B,MAAM,GAAG,OAAOC;YAC5B,IAAIjC,eAAegC,MAAM,EAAE;gBACzB,MAAMhC,eAAegC,MAAM,CAACC;YAC9B;YAEA,IAAI,CAAChC,aAAa;gBAChBgC,QAAQC,MAAM,CAACC,IAAI,CAAC,CAAC,gEAAgE,CAAC;gBACtF;YACF;YAEA,MAAMpD,KAAKkD,SAAS9B,yBAAyBJ,cAC1CqC,KAAK,CAAC,CAACC;gBACNJ,QAAQC,MAAM,CAACG,KAAK,CAACA,OAAO,CAAC,iCAAiC,CAAC;YACjE,GACCC,OAAO,CAAC;gBACP,IAAI,CAACvC,aAAaL,qBAAqB,EAAE;oBACvC6C,WAAW;wBACTN,QAAQC,MAAM,CAACM,IAAI,CAAC3C;oBACtB,GAAG;oBACH0C,WAAW;wBACTN,QAAQC,MAAM,CAACM,IAAI,CAAC5C;oBACtB,GAAG;gBACL;YACF;YAGAqC,QAAgBQ,EAAE,GAAG;gBACrB,0BAA0B;gBAC1BC,gBAAgB,OAAOC;oBACrB,MAAM,EAAED,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC;oBACxC,OAAOA,eAAe;wBAAE,GAAGC,IAAI;wBAAEV;oBAAQ;gBAC3C;gBAEAW,cAAc,OAAOD;oBACnB,MAAM,EAAEC,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC;oBACtC,OAAOA,aAAa;wBAAE,GAAGD,IAAI;wBAAEV;oBAAQ;gBACzC;gBAEAY,eAAe,OAAOF;oBACpB,MAAM,EAAEE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC;oBACvC,OAAOA,cAAc;wBAAE,GAAGF,IAAI;wBAAEV;oBAAQ;gBAC1C;gBAEA,qBAAqB;gBACrBa,cAAc,OAAOH;oBACnB,MAAM,EAAEG,YAAY,EAAE,GAAG,MAAM,MAAM,CAAC;oBACtC,MAAMC,SAAS,MAAMD,aAAa;wBAAE,GAAGH,IAAI;wBAAEV;oBAAQ;oBACrD,OAAOc,OAAOC,oBAAoB;gBACpC;gBAEAC,YAAY,OAAON;oBACjB,MAAM,EAAEM,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC;oBACpC,OAAOA,WAAW;wBAAE,GAAGN,IAAI;wBAAEV;oBAAQ;gBACvC;gBAEA,mBAAmB;gBACnBiB,UAAU,OAAOC,UAAkBC,SAAiBC;oBAClD,MAAM,EAAEC,aAAa,EAAEC,gBAAgB,EAAEC,WAAW,EAAE,GAAG,MAAM,MAAM,CACnE;oBAEF,IAAIH,SAAS,SAAS;wBACpB,OAAOC,cAAcrB,SAASkB,UAAUC;oBAC1C;oBACA,IAAIC,SAAS,OAAO;wBAClB,OAAOG,YAAYvB,SAASkB,UAAUC;oBACxC;oBACA,OAAOG,iBAAiBtB,SAASkB,UAAUC;gBAC7C;gBAEAK,aAAa;oBACX,MAAM,EAAEC,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAAC;oBAC7C,OAAOA,oBAAoBzB;gBAC7B;gBAEA,2CAA2C;gBAC3C,2DAA2D,GAC3D5C,UAAU,OAAOsD;oBACf,MAAM,EAAEtD,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC;oBAClC,OAAOA,SAAS;wBAAE,GAAGsD,IAAI;wBAAEV;oBAAQ;gBACrC;YACF;QACF;QAEA,OAAO/B;IACT;AAEF,SAASJ,eAAe,GAAE"}
|
|
@@ -1,8 +1,8 @@
|
|
|
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
6
|
import { InstructionsContext } from './context.js';
|
|
7
7
|
export const InstructionsProvider = ({ children })=>{
|
|
8
8
|
const [instructions, setInstructionsState] = useState({});
|
|
@@ -14,9 +14,33 @@ export const InstructionsProvider = ({ children })=>{
|
|
|
14
14
|
const { user } = useAuth();
|
|
15
15
|
const { config } = useConfig();
|
|
16
16
|
const { routes: { api }, serverURL } = config;
|
|
17
|
+
// Global Document Drawer state
|
|
18
|
+
const [drawerInstructionId, setDrawerInstructionId] = useState('');
|
|
19
|
+
const [drawerOpenCount, setDrawerOpenCount] = useState(0);
|
|
20
|
+
const [DocumentDrawer, _, { openDrawer: openPayloadDrawer }] = useDocumentDrawer({
|
|
21
|
+
id: drawerInstructionId,
|
|
22
|
+
collectionSlug: PLUGIN_INSTRUCTIONS_TABLE
|
|
23
|
+
});
|
|
24
|
+
const openDrawer = useCallback((id)=>{
|
|
25
|
+
setDrawerInstructionId(id);
|
|
26
|
+
setDrawerOpenCount((prev)=>prev + 1);
|
|
27
|
+
}, []);
|
|
28
|
+
// Open drawer when count changes
|
|
29
|
+
useEffect(()=>{
|
|
30
|
+
if (drawerOpenCount > 0) {
|
|
31
|
+
openPayloadDrawer();
|
|
32
|
+
}
|
|
33
|
+
}, [
|
|
34
|
+
drawerOpenCount,
|
|
35
|
+
openPayloadDrawer
|
|
36
|
+
]);
|
|
17
37
|
// This is here because each field have separate instructions and
|
|
18
38
|
// their ID is needed to edit them for Drawer
|
|
19
39
|
useEffect(()=>{
|
|
40
|
+
// Only fetch if we have a user ID - prevents fetching on every user object reference change
|
|
41
|
+
if (!user?.id) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
20
44
|
fetch(`${serverURL}${api}${PLUGIN_FETCH_FIELDS_ENDPOINT}`).then(async (res)=>{
|
|
21
45
|
await res.json().then((data)=>{
|
|
22
46
|
setIsConfigAllowed(data?.isConfigAllowed || false);
|
|
@@ -31,9 +55,9 @@ export const InstructionsProvider = ({ children })=>{
|
|
|
31
55
|
}, [
|
|
32
56
|
api,
|
|
33
57
|
serverURL,
|
|
34
|
-
user
|
|
58
|
+
user?.id
|
|
35
59
|
]);
|
|
36
|
-
return /*#__PURE__*/
|
|
60
|
+
return /*#__PURE__*/ _jsxs(InstructionsContext.Provider, {
|
|
37
61
|
value: {
|
|
38
62
|
activeCollection,
|
|
39
63
|
debugging,
|
|
@@ -41,10 +65,14 @@ export const InstructionsProvider = ({ children })=>{
|
|
|
41
65
|
hasInstructions: instructions && Object.keys(instructions).length > 0,
|
|
42
66
|
instructions,
|
|
43
67
|
isConfigAllowed,
|
|
68
|
+
openDrawer,
|
|
44
69
|
promptFields,
|
|
45
70
|
setActiveCollection
|
|
46
71
|
},
|
|
47
|
-
children:
|
|
72
|
+
children: [
|
|
73
|
+
children,
|
|
74
|
+
/*#__PURE__*/ _jsx(DocumentDrawer, {})
|
|
75
|
+
]
|
|
48
76
|
});
|
|
49
77
|
};
|
|
50
78
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/providers/InstructionsProvider/InstructionsProvider.tsx"],"sourcesContent":["'use client'\n\
|
|
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 { InstructionsContext } from './context.js'\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 // 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","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,mBAAmB,QAAQ,eAAc;AAElD,OAAO,MAAMC,uBAAgE,CAAC,EAAEC,QAAQ,EAAE;IACxF,MAAM,CAACC,cAAcC,qBAAqB,GAAGP,SAAS,CAAC;IACvD,MAAM,CAACQ,cAAcC,gBAAgB,GAAGT,SAAkC,EAAE;IAC5E,MAAM,CAACU,kBAAkBC,oBAAoB,GAAGX,SAAS;IACzD,MAAM,CAACY,iBAAiBC,mBAAmB,GAAGb,SAAS;IACvD,MAAM,CAACc,kBAAkBC,oBAAoB,GAAGf;IAChD,MAAM,CAACgB,WAAWC,aAAa,GAAGjB,SAAS;IAC3C,MAAM,EAAEkB,IAAI,EAAE,GAAGxB;IAEjB,MAAM,EAAEyB,MAAM,EAAE,GAAGxB;IACnB,MAAM,EACJyB,QAAQ,EAAEC,GAAG,EAAE,EACfC,SAAS,EACV,GAAGH;IAEJ,+BAA+B;IAC/B,MAAM,CAACI,qBAAqBC,uBAAuB,GAAGxB,SAAiB;IACvE,MAAM,CAACyB,iBAAiBC,mBAAmB,GAAG1B,SAAS;IAEvD,MAAM,CAAC2B,gBAAgBC,GAAG,EAAEC,YAAYC,iBAAiB,EAAE,CAAC,GAAGlC,kBAAkB;QAC/EmC,IAAIR;QACJS,gBAAgB9B;IAClB;IAEA,MAAM2B,aAAa/B,YAAY,CAACiC;QAC9BP,uBAAuBO;QACvBL,mBAAmB,CAACO,OAASA,OAAO;IACtC,GAAG,EAAE;IAEL,iCAAiC;IACjClC,UAAU;QACR,IAAI0B,kBAAkB,GAAG;YACvBK;QACF;IACF,GAAG;QAACL;QAAiBK;KAAkB;IAEvC,iEAAiE;IACjE,6CAA6C;IAC7C/B,UAAU;QACR,4FAA4F;QAC5F,IAAI,CAACmB,MAAMa,IAAI;YACb;QACF;QAEAG,MAAM,CAAC,EAAEZ,UAAU,EAAED,IAAI,EAAEpB,6BAA6B,CAAC,EACtDkC,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"}
|