@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.
- 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 +100 -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 +54 -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 +223 -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 +449 -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 +312 -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 +623 -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 +308 -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 +600 -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 +247 -0
- package/dist/ai/providers/blocks/xai.js.map +1 -0
- package/dist/ai/providers/icons.d.ts +7 -0
- package/dist/ai/providers/icons.js +9 -0
- package/dist/ai/providers/icons.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 +267 -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 +224 -50
- 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.ts +4 -0
- package/dist/endpoints/fetchFields.js +0 -7
- package/dist/endpoints/fetchFields.js.map +1 -1
- 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 +339 -232
- 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/exports/fields.d.ts +1 -0
- package/dist/exports/fields.js +1 -0
- package/dist/exports/fields.js.map +1 -1
- package/dist/fields/ArrayComposeField/ArrayComposeField.d.ts +15 -0
- package/dist/fields/ArrayComposeField/ArrayComposeField.js +87 -0
- package/dist/fields/ArrayComposeField/ArrayComposeField.js.map +1 -0
- package/dist/fields/ArrayComposeField/ArrayComposeField.jsx +73 -0
- 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 +162 -16
- package/dist/fields/PromptEditorField/PromptEditorField.js.map +1 -1
- package/dist/fields/PromptEditorField/PromptEditorField.jsx +123 -5
- package/dist/index.d.ts +3 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/init.js +63 -65
- package/dist/init.js.map +1 -1
- package/dist/payload-ai.d.ts +149 -0
- package/dist/plugin.js +94 -46
- package/dist/plugin.js.map +1 -1
- package/dist/providers/InstructionsProvider/InstructionsProvider.js +38 -7
- package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
- package/dist/providers/InstructionsProvider/InstructionsProvider.jsx +30 -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 +30 -10
- package/dist/providers/InstructionsProvider/useInstructions.js.map +1 -1
- package/dist/styles.d.ts +11 -0
- package/dist/types/handlebars-async-helpers.d.ts +1 -0
- package/dist/types/handlebars-dist-handlebars.d.ts +1 -0
- package/dist/types/react-mentions.d.ts +1 -0
- package/dist/types.d.ts +6 -16
- 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 +2 -2
- package/dist/ui/Compose/Compose.js +118 -92
- package/dist/ui/Compose/Compose.js.map +1 -1
- package/dist/ui/Compose/Compose.jsx +113 -103
- 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.d.ts +2 -2
- package/dist/ui/Compose/UndoRedoActions.js +11 -6
- package/dist/ui/Compose/UndoRedoActions.js.map +1 -1
- package/dist/ui/Compose/UndoRedoActions.jsx +8 -6
- package/dist/ui/Compose/compose.module.css +57 -17
- package/dist/ui/Compose/hooks/menu/itemsMap.js +13 -7
- 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 +28 -17
- package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
- package/dist/ui/Compose/hooks/menu/useMenu.jsx +27 -14
- 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.d.ts +0 -1
- package/dist/ui/Compose/hooks/useHistory.js +113 -26
- 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 +156 -0
- package/dist/ui/DynamicVoiceSelect/index.js.map +1 -0
- package/dist/ui/DynamicVoiceSelect/index.jsx +102 -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 +118 -0
- package/dist/ui/VoicesFetcher/index.js.map +1 -0
- package/dist/ui/VoicesFetcher/index.jsx +79 -0
- package/dist/utilities/buildSmartPrompt.d.ts +22 -0
- package/dist/utilities/buildSmartPrompt.js +143 -0
- package/dist/utilities/buildSmartPrompt.js.map +1 -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.d.ts +2 -2
- 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 +30 -0
- package/dist/utilities/resolveImageReferences.js +167 -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/dist/utilities/updateFieldsConfig.js +27 -43
- package/dist/utilities/updateFieldsConfig.js.map +1 -1
- package/package.json +23 -24
- 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/styles.d.js +0 -2
- package/dist/styles.d.js.map +0 -1
- package/dist/types/handlebars-async-helpers.d.js +0 -2
- package/dist/types/handlebars-async-helpers.d.js.map +0 -1
- package/dist/types/handlebars-dist-handlebars.d.js +0 -2
- package/dist/types/handlebars-dist-handlebars.d.js.map +0 -1
- package/dist/types/react-mentions.d.js +0 -2
- package/dist/types/react-mentions.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,9 +1,12 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import { useAuth, useConfig } from '@payloadcms/ui';
|
|
3
|
-
import React, { useEffect, useState } from 'react';
|
|
4
|
-
import { PLUGIN_FETCH_FIELDS_ENDPOINT } from '../../defaults.js';
|
|
2
|
+
import { useAuth, useConfig, useDocumentDrawer } from '@payloadcms/ui';
|
|
3
|
+
import React, { useCallback, useEffect, useState } from 'react';
|
|
4
|
+
import { PLUGIN_FETCH_FIELDS_ENDPOINT, PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js';
|
|
5
|
+
import { useActiveFieldTracking } from '../../ui/Compose/hooks/useActiveFieldTracking.js';
|
|
5
6
|
import { InstructionsContext } from './context.js';
|
|
6
7
|
export const InstructionsProvider = ({ children }) => {
|
|
8
|
+
// Initialize field tracking globally so ai-plugin-active class is added on field focus
|
|
9
|
+
useActiveFieldTracking();
|
|
7
10
|
const [instructions, setInstructionsState] = useState({});
|
|
8
11
|
const [promptFields, setPromptFields] = useState([]);
|
|
9
12
|
const [activeCollection, setActiveCollection] = useState('');
|
|
@@ -13,9 +16,30 @@ export const InstructionsProvider = ({ children }) => {
|
|
|
13
16
|
const { user } = useAuth();
|
|
14
17
|
const { config } = useConfig();
|
|
15
18
|
const { routes: { api }, serverURL, } = config;
|
|
19
|
+
// Global Document Drawer state
|
|
20
|
+
const [drawerInstructionId, setDrawerInstructionId] = useState('');
|
|
21
|
+
const [drawerOpenCount, setDrawerOpenCount] = useState(0);
|
|
22
|
+
const [DocumentDrawer, _, { openDrawer: openPayloadDrawer }] = useDocumentDrawer({
|
|
23
|
+
id: drawerInstructionId,
|
|
24
|
+
collectionSlug: PLUGIN_INSTRUCTIONS_TABLE,
|
|
25
|
+
});
|
|
26
|
+
const openDrawer = useCallback((id) => {
|
|
27
|
+
setDrawerInstructionId(id);
|
|
28
|
+
setDrawerOpenCount((prev) => prev + 1);
|
|
29
|
+
}, []);
|
|
30
|
+
// Open drawer when count changes
|
|
31
|
+
useEffect(() => {
|
|
32
|
+
if (drawerOpenCount > 0) {
|
|
33
|
+
openPayloadDrawer();
|
|
34
|
+
}
|
|
35
|
+
}, [drawerOpenCount, openPayloadDrawer]);
|
|
16
36
|
// This is here because each field have separate instructions and
|
|
17
37
|
// their ID is needed to edit them for Drawer
|
|
18
38
|
useEffect(() => {
|
|
39
|
+
// Only fetch if we have a user ID - prevents fetching on every user object reference change
|
|
40
|
+
if (!user?.id) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
19
43
|
fetch(`${serverURL}${api}${PLUGIN_FETCH_FIELDS_ENDPOINT}`)
|
|
20
44
|
.then(async (res) => {
|
|
21
45
|
await res.json().then((data) => {
|
|
@@ -29,7 +53,7 @@ export const InstructionsProvider = ({ children }) => {
|
|
|
29
53
|
.catch((err) => {
|
|
30
54
|
console.error('InstructionsProvider:', err);
|
|
31
55
|
});
|
|
32
|
-
}, [api, serverURL, user]);
|
|
56
|
+
}, [api, serverURL, user?.id]);
|
|
33
57
|
return (<InstructionsContext.Provider value={{
|
|
34
58
|
activeCollection,
|
|
35
59
|
debugging,
|
|
@@ -37,9 +61,11 @@ export const InstructionsProvider = ({ children }) => {
|
|
|
37
61
|
hasInstructions: instructions && Object.keys(instructions).length > 0,
|
|
38
62
|
instructions,
|
|
39
63
|
isConfigAllowed,
|
|
64
|
+
openDrawer,
|
|
40
65
|
promptFields,
|
|
41
66
|
setActiveCollection,
|
|
42
67
|
}}>
|
|
43
68
|
{children}
|
|
69
|
+
<DocumentDrawer />
|
|
44
70
|
</InstructionsContext.Provider>);
|
|
45
71
|
};
|
|
@@ -9,6 +9,7 @@ export type InstructionsContextValue = {
|
|
|
9
9
|
hasInstructions: boolean;
|
|
10
10
|
instructions: Record<string, any>;
|
|
11
11
|
isConfigAllowed: boolean;
|
|
12
|
+
openDrawer: (instructionId: string) => void;
|
|
12
13
|
path?: string;
|
|
13
14
|
promptFields: SerializedPromptField[];
|
|
14
15
|
schemaPath?: unknown;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/providers/InstructionsProvider/context.ts"],"sourcesContent":["'use client'\n\nimport type { Field } from 'payload'\nimport type React from 'react';\n\nimport { createContext } from 'react'\n\nimport type { SerializedPromptField } from '../../types.js'\n\nexport type InstructionsContextValue = {\n activeCollection?: string\n debugging?: boolean\n enabledLanguages?: string[]\n field?: Field\n hasInstructions: boolean\n instructions: Record<string, any>\n isConfigAllowed: boolean\n path?: string\n promptFields: SerializedPromptField[]\n schemaPath?: unknown\n setActiveCollection?: React.Dispatch<React.SetStateAction<string>>\n}\n\nexport const initialContext: InstructionsContextValue = {\n debugging: false,\n field: undefined,\n hasInstructions: false,\n instructions: {},\n isConfigAllowed: true,\n path: '',\n promptFields: [],\n schemaPath: '',\n}\n\nexport const InstructionsContext = createContext<InstructionsContextValue>(initialContext)\n"],"names":["createContext","initialContext","debugging","field","undefined","hasInstructions","instructions","isConfigAllowed","path","promptFields","schemaPath","InstructionsContext"],"mappings":"AAAA;AAKA,SAASA,aAAa,QAAQ,QAAO;
|
|
1
|
+
{"version":3,"sources":["../../../src/providers/InstructionsProvider/context.ts"],"sourcesContent":["'use client'\n\nimport type { Field } from 'payload'\nimport type React from 'react';\n\nimport { createContext } from 'react'\n\nimport type { SerializedPromptField } from '../../types.js'\n\nexport type InstructionsContextValue = {\n activeCollection?: string\n debugging?: boolean\n enabledLanguages?: string[]\n field?: Field\n hasInstructions: boolean\n instructions: Record<string, any>\n isConfigAllowed: boolean\n openDrawer: (instructionId: string) => void\n path?: string\n promptFields: SerializedPromptField[]\n schemaPath?: unknown\n setActiveCollection?: React.Dispatch<React.SetStateAction<string>>\n}\n\nexport const initialContext: InstructionsContextValue = {\n debugging: false,\n field: undefined,\n hasInstructions: false,\n instructions: {},\n isConfigAllowed: true,\n openDrawer: () => null,\n path: '',\n promptFields: [],\n schemaPath: '',\n}\n\nexport const InstructionsContext = createContext<InstructionsContextValue>(initialContext)\n"],"names":["createContext","initialContext","debugging","field","undefined","hasInstructions","instructions","isConfigAllowed","openDrawer","path","promptFields","schemaPath","InstructionsContext"],"mappings":"AAAA;AAKA,SAASA,aAAa,QAAQ,QAAO;AAmBrC,OAAO,MAAMC,iBAA2C;IACtDC,WAAW;IACXC,OAAOC;IACPC,iBAAiB;IACjBC,cAAc,CAAC;IACfC,iBAAiB;IACjBC,YAAY,IAAM;IAClBC,MAAM;IACNC,cAAc,EAAE;IAChBC,YAAY;AACd,EAAC;AAED,OAAO,MAAMC,sBAAsBZ,cAAwCC,gBAAe"}
|
|
@@ -3,10 +3,22 @@ import { useDocumentInfo } from '@payloadcms/ui';
|
|
|
3
3
|
import { useContext, useEffect, useMemo, useState } from 'react';
|
|
4
4
|
import { PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js';
|
|
5
5
|
import { handlebarsHelpers, handlebarsHelpersMap } from '../../libraries/handlebars/helpersMap.js';
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Normalize a schema path by removing array indices.
|
|
8
|
+
* This allows fields inside arrays to match their instruction records.
|
|
9
|
+
*
|
|
10
|
+
* Example:
|
|
11
|
+
* 'array-test-cases.keywords.0.keyword' -> 'array-test-cases.keywords.keyword'
|
|
12
|
+
* 'characters.views.2.description' -> 'characters.views.description'
|
|
13
|
+
* 'posts.title' -> 'posts.title' (no change)
|
|
14
|
+
*/ const normalizeSchemaPath = (path)=>{
|
|
15
|
+
if (!path) {
|
|
16
|
+
return path;
|
|
17
|
+
}
|
|
18
|
+
// Remove numeric path segments (array indices)
|
|
19
|
+
return path.split('.').filter((segment)=>!/^\d+$/.test(segment)).join('.');
|
|
9
20
|
};
|
|
21
|
+
const warnedOnceOnNoInstructionId = new Set();
|
|
10
22
|
const warnOnceOnMissingInstructions = (path)=>{
|
|
11
23
|
if (!warnedOnceOnNoInstructionId.has(path)) {
|
|
12
24
|
warnedOnceOnNoInstructionId.add(path);
|
|
@@ -24,7 +36,8 @@ export const useInstructions = (update = {})=>{
|
|
|
24
36
|
setSchemaPath(update.schemaPath ?? '');
|
|
25
37
|
}
|
|
26
38
|
}, [
|
|
27
|
-
update.schemaPath
|
|
39
|
+
update.schemaPath,
|
|
40
|
+
schemaPath
|
|
28
41
|
]);
|
|
29
42
|
useEffect(()=>{
|
|
30
43
|
if (activeCollection !== collectionSlug && collectionSlug !== PLUGIN_INSTRUCTIONS_TABLE && typeof setActiveCollection === 'function') {
|
|
@@ -53,14 +66,20 @@ export const useInstructions = (update = {})=>{
|
|
|
53
66
|
const promptEditorSuggestions = useMemo(()=>{
|
|
54
67
|
const activeFields = groupedFields[activeCollection] || [];
|
|
55
68
|
const suggestions = [];
|
|
69
|
+
// Build instruction lookup map once for O(1) access instead of O(n) search per field
|
|
70
|
+
const instructionLookup = new Map(Object.entries(instructions).map(([key, value])=>{
|
|
71
|
+
const path = key.split('.').slice(1).join('.');
|
|
72
|
+
return [
|
|
73
|
+
path,
|
|
74
|
+
value
|
|
75
|
+
];
|
|
76
|
+
}));
|
|
56
77
|
activeFields.forEach((f)=>{
|
|
57
|
-
const
|
|
58
|
-
const fieldInfo = fieldKey ? instructions[fieldKey] : undefined;
|
|
78
|
+
const fieldInfo = instructionLookup.get(f);
|
|
59
79
|
if (!fieldInfo) {
|
|
60
80
|
return;
|
|
61
81
|
}
|
|
62
82
|
if (fieldInfo.fieldType === 'upload') {
|
|
63
|
-
suggestions.push(`${f}.url`);
|
|
64
83
|
return;
|
|
65
84
|
}
|
|
66
85
|
const helpers = handlebarsHelpers.filter((h)=>handlebarsHelpersMap[h]?.field === fieldInfo.fieldType);
|
|
@@ -71,7 +90,7 @@ export const useInstructions = (update = {})=>{
|
|
|
71
90
|
} else {
|
|
72
91
|
suggestions.push(f);
|
|
73
92
|
}
|
|
74
|
-
}
|
|
93
|
+
});
|
|
75
94
|
promptFields.forEach(({ name, collections })=>{
|
|
76
95
|
if (!activeCollection) {
|
|
77
96
|
return;
|
|
@@ -87,8 +106,9 @@ export const useInstructions = (update = {})=>{
|
|
|
87
106
|
instructions,
|
|
88
107
|
promptFields
|
|
89
108
|
]);
|
|
90
|
-
|
|
91
|
-
const
|
|
109
|
+
// Normalize the schema path to handle array indices
|
|
110
|
+
const normalizedSchemaPath = normalizeSchemaPath(schemaPath);
|
|
111
|
+
const pathInstructions = instructions[normalizedSchemaPath];
|
|
92
112
|
if (debugging && !pathInstructions && schemaPath && hasInstructions) {
|
|
93
113
|
warnOnceOnMissingInstructions(schemaPath);
|
|
94
114
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/providers/InstructionsProvider/useInstructions.ts"],"sourcesContent":["import { InstructionsContext } from '@ai-stack/payloadcms/client'\nimport { useDocumentInfo } from '@payloadcms/ui'\nimport { useContext, useEffect, useMemo, useState } from 'react'\n\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js'\nimport { handlebarsHelpers, handlebarsHelpersMap } from '../../libraries/handlebars/helpersMap.js'\n\
|
|
1
|
+
{"version":3,"sources":["../../../src/providers/InstructionsProvider/useInstructions.ts"],"sourcesContent":["import { InstructionsContext } from '@ai-stack/payloadcms/client'\nimport { useDocumentInfo } from '@payloadcms/ui'\nimport { useContext, useEffect, useMemo, useState } from 'react'\n\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js'\nimport { handlebarsHelpers, handlebarsHelpersMap } from '../../libraries/handlebars/helpersMap.js'\n\n/**\n * Normalize a schema path by removing array indices.\n * This allows fields inside arrays to match their instruction records.\n * \n * Example:\n * 'array-test-cases.keywords.0.keyword' -> 'array-test-cases.keywords.keyword'\n * 'characters.views.2.description' -> 'characters.views.description'\n * 'posts.title' -> 'posts.title' (no change)\n */\nconst normalizeSchemaPath = (path: string): string => {\n if (!path) {\n return path\n }\n // Remove numeric path segments (array indices)\n return path.split('.').filter(segment => !/^\\d+$/.test(segment)).join('.')\n}\n\nconst warnedOnceOnNoInstructionId = new Set<string>()\nconst warnOnceOnMissingInstructions = (path: string) => {\n if (!warnedOnceOnNoInstructionId.has(path)) {\n warnedOnceOnNoInstructionId.add(path)\n // eslint-disable-next-line no-console\n console.info(`[AI Plugin] There are no AI instructions for this field: ${path}. Enable \"generatePromptOnInit\" option to enable them.`)\n }\n}\n\nexport const useInstructions = (\n update: {\n schemaPath?: unknown\n } = {},\n) => {\n const context = useContext(InstructionsContext)\n const { collectionSlug } = useDocumentInfo()\n const { activeCollection, debugging, hasInstructions, instructions, promptFields, setActiveCollection } = context\n\n const [schemaPath, setSchemaPath] = useState(update.schemaPath as string)\n\n useEffect(() => {\n if (update.schemaPath !== schemaPath) {\n setSchemaPath((update.schemaPath as string) ?? '')\n }\n }, [update.schemaPath, schemaPath])\n\n useEffect(() => {\n if (\n activeCollection !== collectionSlug &&\n collectionSlug !== PLUGIN_INSTRUCTIONS_TABLE &&\n typeof setActiveCollection === 'function'\n ) {\n setActiveCollection(collectionSlug ?? '')\n }\n }, [activeCollection, collectionSlug, setActiveCollection])\n\n const groupedFields = useMemo(() => {\n const result: Record<string, string[]> = {}\n\n for (const fullKey of Object.keys(instructions || {})) {\n const [collection, ...pathParts] = fullKey.split('.')\n const path = pathParts.join('.')\n if (!result[collection]) {\n result[collection] = []\n }\n result[collection].push(path)\n }\n\n return result\n }, [instructions])\n\n // Suggestions for prompt editor\n const promptEditorSuggestions = useMemo(() => {\n const activeFields = groupedFields[activeCollection as string] || []\n const suggestions: string[] = []\n\n // Build instruction lookup map once for O(1) access instead of O(n) search per field\n const instructionLookup = new Map(\n Object.entries(instructions).map(([key, value]) => {\n const path = key.split('.').slice(1).join('.')\n return [path, value]\n })\n )\n\n activeFields.forEach((f) => {\n const fieldInfo = instructionLookup.get(f)\n\n if (!fieldInfo) {return}\n\n if (fieldInfo.fieldType === 'upload') {\n return\n }\n\n const helpers = handlebarsHelpers.filter(\n (h) => (handlebarsHelpersMap as Record<string, { field?: string }>)[h]?.field === fieldInfo.fieldType,\n )\n\n if (helpers.length) {\n for (const helper of helpers) {\n suggestions.push(`${helper} ${f}`)\n }\n } else {\n suggestions.push(f)\n }\n })\n\n promptFields.forEach(({ name, collections }) => {\n if (!activeCollection) {return}\n\n if (!collections || collections.includes(activeCollection)) {\n suggestions.push(name)\n }\n })\n\n return suggestions\n }, [groupedFields, activeCollection, instructions, promptFields])\n\n // Normalize the schema path to handle array indices\n const normalizedSchemaPath = normalizeSchemaPath(schemaPath)\n const pathInstructions = instructions[normalizedSchemaPath]\n\n if (debugging && !pathInstructions && schemaPath && hasInstructions) {\n warnOnceOnMissingInstructions(schemaPath)\n }\n \n return {\n ...context,\n ...(pathInstructions || {}),\n promptEditorSuggestions,\n }\n}\n\n"],"names":["InstructionsContext","useDocumentInfo","useContext","useEffect","useMemo","useState","PLUGIN_INSTRUCTIONS_TABLE","handlebarsHelpers","handlebarsHelpersMap","normalizeSchemaPath","path","split","filter","segment","test","join","warnedOnceOnNoInstructionId","Set","warnOnceOnMissingInstructions","has","add","console","info","useInstructions","update","context","collectionSlug","activeCollection","debugging","hasInstructions","instructions","promptFields","setActiveCollection","schemaPath","setSchemaPath","groupedFields","result","fullKey","Object","keys","collection","pathParts","push","promptEditorSuggestions","activeFields","suggestions","instructionLookup","Map","entries","map","key","value","slice","forEach","f","fieldInfo","get","fieldType","helpers","h","field","length","helper","name","collections","includes","normalizedSchemaPath","pathInstructions"],"mappings":"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"}
|
package/dist/styles.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
declare module 'handlebars-async-helpers'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
declare module 'handlebars/dist/handlebars.js'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
declare module 'react-mentions/dist/react-mentions.cjs.js'
|
package/dist/types.d.ts
CHANGED
|
@@ -2,7 +2,8 @@ import type { JSONSchema } from 'openai/lib/jsonschema';
|
|
|
2
2
|
import type { ImageGenerateParams } from 'openai/resources/images';
|
|
3
3
|
import type { CollectionConfig, CollectionSlug, DataFromCollectionSlug, Endpoint, Field, File, GlobalConfig, GroupField, PayloadRequest, TypedCollection } from 'payload';
|
|
4
4
|
import type { CSSProperties, MouseEventHandler } from 'react';
|
|
5
|
-
import type {
|
|
5
|
+
import type { MediaResult } from './ai/core/index.js';
|
|
6
|
+
import type { PLUGIN_INSTRUCTIONS_TABLE } from "./defaults.js";
|
|
6
7
|
export interface PluginConfigAccess {
|
|
7
8
|
/**
|
|
8
9
|
* Control access to AI generation features (generate text, images, audio)
|
|
@@ -28,24 +29,11 @@ export interface PluginOptions {
|
|
|
28
29
|
*/
|
|
29
30
|
enabledLanguages?: string[];
|
|
30
31
|
}
|
|
31
|
-
export type PluginConfigMediaUploadFunction = (result: {
|
|
32
|
-
data: Record<any, any>;
|
|
33
|
-
file: File;
|
|
34
|
-
}, { collection, request, }: {
|
|
32
|
+
export type PluginConfigMediaUploadFunction = (result: MediaResult, { collection, request, }: {
|
|
35
33
|
collection: CollectionSlug;
|
|
36
34
|
request: PayloadRequest;
|
|
37
35
|
}) => Promise<DataFromCollectionSlug<CollectionSlug>>;
|
|
38
36
|
export interface PluginConfig {
|
|
39
|
-
/**
|
|
40
|
-
* Localization configuration for Instructions collection
|
|
41
|
-
* Automatically populated from Payload config if localization is enabled
|
|
42
|
-
* @internal
|
|
43
|
-
*/
|
|
44
|
-
_localization?: {
|
|
45
|
-
defaultLocale?: string;
|
|
46
|
-
enabled: boolean;
|
|
47
|
-
locales: string[];
|
|
48
|
-
};
|
|
49
37
|
/**
|
|
50
38
|
* Access control configuration for AI features
|
|
51
39
|
* By default, all AI features require authentication
|
|
@@ -87,7 +75,7 @@ export interface PluginConfig {
|
|
|
87
75
|
export interface GenerationModel {
|
|
88
76
|
fields: string[];
|
|
89
77
|
generateText?: (prompt: string, system: string) => Promise<string>;
|
|
90
|
-
handler?: (prompt: string, options: any) => Promise<any> | Response;
|
|
78
|
+
handler?: (prompt: string, options: any) => File | Promise<any> | Response;
|
|
91
79
|
id: string;
|
|
92
80
|
name: string;
|
|
93
81
|
output: 'audio' | 'file' | 'image' | 'json' | 'text' | 'video';
|
|
@@ -106,8 +94,10 @@ export type GenerateTextarea<T = any> = (args: {
|
|
|
106
94
|
options?: any;
|
|
107
95
|
}) => Promise<string> | string;
|
|
108
96
|
export interface Endpoints {
|
|
97
|
+
fetchVoices?: Omit<Endpoint, 'root'>;
|
|
109
98
|
textarea: Omit<Endpoint, 'root'>;
|
|
110
99
|
upload: Omit<Endpoint, 'root'>;
|
|
100
|
+
videogenWebhook?: Omit<Endpoint, 'root'>;
|
|
111
101
|
}
|
|
112
102
|
export type ActionMenuItems = 'Compose' | 'Expand' | 'Proofread' | 'Rephrase' | 'Settings' | 'Simplify' | 'Summarize' | 'Tone' | 'Translate';
|
|
113
103
|
export type ActionPromptOptions = {
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { JSONSchema } from 'openai/lib/jsonschema'\nimport type { ImageGenerateParams } from 'openai/resources/images'\nimport type {\n CollectionConfig,\n CollectionSlug,\n DataFromCollectionSlug,\n Endpoint,\n Field,\n File,\n GlobalConfig,\n GroupField,\n PayloadRequest,\n TypedCollection,\n} from 'payload'\nimport type { CSSProperties, MouseEventHandler } from 'react'\n\nimport type {
|
|
1
|
+
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { JSONSchema } from 'openai/lib/jsonschema'\nimport type { ImageGenerateParams } from 'openai/resources/images'\nimport type {\n CollectionConfig,\n CollectionSlug,\n DataFromCollectionSlug,\n Endpoint,\n Field,\n File,\n GlobalConfig,\n GroupField,\n PayloadRequest,\n TypedCollection,\n} from 'payload'\nimport type { CSSProperties, MouseEventHandler } from 'react'\n\nimport type { MediaResult } from './ai/core/index.js'\nimport type {PLUGIN_INSTRUCTIONS_TABLE} from \"./defaults.js\";\n\nexport interface PluginConfigAccess {\n /**\n * Control access to AI generation features (generate text, images, audio)\n * @default () => !!req.user (requires authentication)\n */\n generate?: ({ req }: { req: PayloadRequest }) => boolean | Promise<boolean>\n /**\n * Control access to AI settings/configuration\n * @default () => !!req.user (requires authentication)\n */\n settings?: ({ req }: { req: PayloadRequest }) => boolean | Promise<boolean>\n}\n\nexport interface PluginOptions {\n /**\n * Provide local tags to filter language options from the Translate Menu\n * Check for the available local tags,\n * visit: https://www.npmjs.com/package/locale-codes\n * Example: [\"en-US\", \"zh-SG\", \"zh-CN\", \"en\"]\n */\n enabledLanguages?: string[]\n}\n\nexport type PluginConfigMediaUploadFunction = (\n result: MediaResult,\n {\n collection,\n request,\n }: {\n collection: CollectionSlug\n request: PayloadRequest\n },\n) => Promise<DataFromCollectionSlug<CollectionSlug>>\n\nexport interface PluginConfig {\n /**\n * Access control configuration for AI features\n * By default, all AI features require authentication\n */\n access?: PluginConfigAccess\n collections: {\n [key: CollectionSlug]: boolean\n }\n debugging?: boolean\n disableSponsorMessage?: boolean\n editorConfig?: { nodes: JSONSchema[] }\n fields?: Field[]\n generatePromptOnInit?: boolean\n generationModels?: ((defaultModels: GenerationModel[]) => GenerationModel[]) | GenerationModel[]\n globals?: {\n [key: GlobalConfig['slug']]: boolean\n }\n interfaceName?: string\n mediaUpload?: PluginConfigMediaUploadFunction\n options?: PluginOptions\n // Override the instructions collection config\n overrideInstructions?: Partial<CollectionConfig>\n promptFields?: PromptField[]\n /**\n * Custom action prompts for AI text generation\n * If not provided, uses default prompts\n * You can access default prompts by importing { defaultPrompts } from '@ai-stack/payloadcms'\n */\n prompts?: ActionPrompt[]\n /**\n * Custom seed prompt function for generating field-specific prompts\n * If not provided, uses default seed prompt function\n * You can access default seed prompts by importing { defaultSeedPrompts } from '@ai-stack/payloadcms'\n */\n seedPrompts?: SeedPromptFunction\n uploadCollectionSlug?: CollectionSlug\n}\n\nexport interface GenerationModel {\n fields: string[]\n generateText?: (prompt: string, system: string) => Promise<string>\n handler?: (prompt: string, options: any) => File | Promise<any> | Response\n id: string\n name: string\n output: 'audio' | 'file' | 'image' | 'json' | 'text' | 'video'\n settings?: GroupField\n supportsPromptOptimization?: boolean\n}\n\nexport interface GenerationConfig {\n models: GenerationModel[]\n provider: string\n}\n\nexport type GenerateTextarea<T = any> = (args: {\n collectionSlug: CollectionSlug\n doc: T\n documentId?: number | string\n locale?: string\n options?: any\n}) => Promise<string> | string\n\nexport interface Endpoints {\n fetchVoices?: Omit<Endpoint, 'root'>\n textarea: Omit<Endpoint, 'root'>\n upload: Omit<Endpoint, 'root'>\n videogenWebhook?: Omit<Endpoint, 'root'>\n}\n\nexport type ActionMenuItems =\n | 'Compose'\n | 'Expand'\n | 'Proofread'\n | 'Rephrase'\n | 'Settings'\n | 'Simplify'\n | 'Summarize'\n | 'Tone'\n | 'Translate'\n\nexport type ActionPromptOptions = {\n layout?: string\n locale?: string\n prompt?: string\n systemPrompt?: string\n}\n\nexport type ActionPrompt = {\n layout?: (options?: ActionPromptOptions) => string\n name: ActionMenuItems\n system: (options: ActionPromptOptions) => string\n}\n\nexport type SeedPromptOptions = {\n fieldLabel: string\n fieldSchemaPaths: Record<string, any>\n fieldType: string\n path: string\n}\n\nexport type SeedPromptData = Omit<\n TypedCollection[typeof PLUGIN_INSTRUCTIONS_TABLE],\n 'createdAt' | 'id' | 'updatedAt'\n>\n\nexport type SeedPromptResult =\n | {\n data?: SeedPromptData\n }\n | {\n data?: SeedPromptData\n prompt: string\n system: string\n }\n | false\n | undefined\n | void\n\nexport type SeedPromptFunction = (\n options: SeedPromptOptions,\n) => Promise<SeedPromptResult> | SeedPromptResult\n\nexport type ActionMenuEvents =\n | 'onCompose'\n | 'onExpand'\n | 'onProofread'\n | 'onRephrase'\n | 'onSettings'\n | 'onSimplify'\n | 'onSummarize'\n | 'onTone'\n | 'onTranslate'\n\nexport type UseMenuEvents = {\n [key in ActionMenuEvents]?: (data?: unknown) => void\n}\n\nexport type UseMenuOptions = {\n isConfigAllowed: boolean\n}\n\nexport type BaseItemProps<T = any> = {\n children?: React.ReactNode\n disabled?: boolean\n hideIcon?: boolean\n isActive?: boolean\n isMenu?: boolean\n onClick: (data?: unknown) => void\n onMouseEnter?: MouseEventHandler<T> | undefined\n onMouseLeave?: MouseEventHandler<T> | undefined\n style?: CSSProperties | undefined\n title?: string\n}\n\nexport type ImageReference = {\n data: Blob\n name: string\n size: number\n type: string\n url: string\n}\n\nexport type GenerateImageParams = {\n images?: ImageReference[]\n size?: ImageGenerateParams['size']\n style?: ImageGenerateParams['style']\n version?: ImageGenerateParams['model']\n}\n\nexport type SerializedPromptField = {\n collections?: CollectionSlug[]\n name: string\n}\n\nexport type PromptFieldGetterContext = {\n collection: CollectionSlug\n type: string\n}\n\nexport type PromptField = {\n // If not provided, the value will be returned from the data object as-is\n getter?: (data: object, ctx: PromptFieldGetterContext) => Promise<string> | string\n} & SerializedPromptField\n"],"names":[],"mappings":"AAyOA,WAGyB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import React from 'react';
|
|
4
|
+
export const AIConfigDashboard = ()=>{
|
|
5
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
6
|
+
style: {
|
|
7
|
+
alignItems: 'center',
|
|
8
|
+
background: 'var(--theme-elevation-50)',
|
|
9
|
+
border: '1px solid var(--theme-elevation-150)',
|
|
10
|
+
borderRadius: '8px',
|
|
11
|
+
display: 'flex',
|
|
12
|
+
justifyContent: 'space-between',
|
|
13
|
+
marginBottom: '20px',
|
|
14
|
+
padding: '20px'
|
|
15
|
+
},
|
|
16
|
+
children: [
|
|
17
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
18
|
+
children: [
|
|
19
|
+
/*#__PURE__*/ _jsx("h4", {
|
|
20
|
+
style: {
|
|
21
|
+
margin: '0 0 5px 0'
|
|
22
|
+
},
|
|
23
|
+
children: "AI Configuration"
|
|
24
|
+
}),
|
|
25
|
+
/*#__PURE__*/ _jsx("p", {
|
|
26
|
+
style: {
|
|
27
|
+
color: 'var(--theme-elevation-500)',
|
|
28
|
+
fontSize: '14px',
|
|
29
|
+
margin: '0'
|
|
30
|
+
},
|
|
31
|
+
children: "Manage your AI providers, API keys, and default models."
|
|
32
|
+
})
|
|
33
|
+
]
|
|
34
|
+
}),
|
|
35
|
+
/*#__PURE__*/ _jsx("a", {
|
|
36
|
+
href: "/admin/globals/ai-settings",
|
|
37
|
+
children: /*#__PURE__*/ _jsx("button", {
|
|
38
|
+
className: "btn btn--style-primary btn--size-small",
|
|
39
|
+
children: "Manage AI Settings"
|
|
40
|
+
})
|
|
41
|
+
})
|
|
42
|
+
]
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ui/AIConfigDashboard/index.tsx"],"sourcesContent":["'use client'\n\nimport React from 'react'\n\nexport const AIConfigDashboard: React.FC = () => {\n return (\n <div\n style={{\n alignItems: 'center',\n background: 'var(--theme-elevation-50)',\n border: '1px solid var(--theme-elevation-150)',\n borderRadius: '8px',\n display: 'flex',\n justifyContent: 'space-between',\n marginBottom: '20px',\n padding: '20px',\n }}\n >\n <div>\n <h4 style={{ margin: '0 0 5px 0' }}>AI Configuration</h4>\n <p style={{ color: 'var(--theme-elevation-500)', fontSize: '14px', margin: '0' }}>\n Manage your AI providers, API keys, and default models.\n </p>\n </div>\n <a href=\"/admin/globals/ai-settings\">\n <button className=\"btn btn--style-primary btn--size-small\">Manage AI Settings</button>\n </a>\n </div>\n )\n}\n"],"names":["React","AIConfigDashboard","div","style","alignItems","background","border","borderRadius","display","justifyContent","marginBottom","padding","h4","margin","p","color","fontSize","a","href","button","className"],"mappings":"AAAA;;AAEA,OAAOA,WAAW,QAAO;AAEzB,OAAO,MAAMC,oBAA8B;IACzC,qBACE,MAACC;QACCC,OAAO;YACLC,YAAY;YACZC,YAAY;YACZC,QAAQ;YACRC,cAAc;YACdC,SAAS;YACTC,gBAAgB;YAChBC,cAAc;YACdC,SAAS;QACX;;0BAEA,MAACT;;kCACC,KAACU;wBAAGT,OAAO;4BAAEU,QAAQ;wBAAY;kCAAG;;kCACpC,KAACC;wBAAEX,OAAO;4BAAEY,OAAO;4BAA8BC,UAAU;4BAAQH,QAAQ;wBAAI;kCAAG;;;;0BAIpF,KAACI;gBAAEC,MAAK;0BACN,cAAA,KAACC;oBAAOC,WAAU;8BAAyC;;;;;AAInE,EAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
export const AIConfigDashboard = () => {
|
|
4
|
+
return (<div style={{
|
|
5
|
+
alignItems: 'center',
|
|
6
|
+
background: 'var(--theme-elevation-50)',
|
|
7
|
+
border: '1px solid var(--theme-elevation-150)',
|
|
8
|
+
borderRadius: '8px',
|
|
9
|
+
display: 'flex',
|
|
10
|
+
justifyContent: 'space-between',
|
|
11
|
+
marginBottom: '20px',
|
|
12
|
+
padding: '20px',
|
|
13
|
+
}}>
|
|
14
|
+
<div>
|
|
15
|
+
<h4 style={{ margin: '0 0 5px 0' }}>AI Configuration</h4>
|
|
16
|
+
<p style={{ color: 'var(--theme-elevation-500)', fontSize: '14px', margin: '0' }}>
|
|
17
|
+
Manage your AI providers, API keys, and default models.
|
|
18
|
+
</p>
|
|
19
|
+
</div>
|
|
20
|
+
<a href="/admin/globals/ai-settings">
|
|
21
|
+
<button className="btn btn--style-primary btn--size-small">Manage AI Settings</button>
|
|
22
|
+
</a>
|
|
23
|
+
</div>);
|
|
24
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useField } from '@payloadcms/ui';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
export const ApiKeyStatusIndicator = ({ path })=>{
|
|
6
|
+
const { value } = useField({
|
|
7
|
+
path
|
|
8
|
+
});
|
|
9
|
+
const hasKey = !!value;
|
|
10
|
+
if (!hasKey) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
14
|
+
style: {
|
|
15
|
+
alignItems: 'center',
|
|
16
|
+
backgroundColor: 'var(--theme-success-100)',
|
|
17
|
+
borderRadius: '4px',
|
|
18
|
+
color: 'var(--theme-success-700)',
|
|
19
|
+
display: 'inline-flex',
|
|
20
|
+
fontSize: '12px',
|
|
21
|
+
fontWeight: 'bold',
|
|
22
|
+
gap: '6px',
|
|
23
|
+
padding: '4px 8px'
|
|
24
|
+
},
|
|
25
|
+
children: [
|
|
26
|
+
/*#__PURE__*/ _jsx("span", {
|
|
27
|
+
style: {
|
|
28
|
+
backgroundColor: 'currentColor',
|
|
29
|
+
borderRadius: '50%',
|
|
30
|
+
height: '8px',
|
|
31
|
+
width: '8px'
|
|
32
|
+
}
|
|
33
|
+
}),
|
|
34
|
+
"Active"
|
|
35
|
+
]
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ui/ApiKeyStatusIndicator/index.tsx"],"sourcesContent":["'use client'\n\nimport { useField } from '@payloadcms/ui'\nimport React from 'react'\n\ntype Props = {\n path: string\n}\n\nexport const ApiKeyStatusIndicator: React.FC<Props> = ({ path }) => {\n const { value } = useField<string>({ path })\n const hasKey = !!value\n\n if (!hasKey) {return null}\n\n return (\n <div style={{ \n alignItems: 'center', \n backgroundColor: 'var(--theme-success-100)', \n borderRadius: '4px',\n color: 'var(--theme-success-700)',\n display: 'inline-flex',\n fontSize: '12px',\n fontWeight: 'bold',\n gap: '6px',\n padding: '4px 8px'\n }}>\n <span style={{ \n backgroundColor: 'currentColor', \n borderRadius: '50%', \n height: '8px', \n width: '8px' \n }} />\n Active\n </div>\n )\n}\n"],"names":["useField","React","ApiKeyStatusIndicator","path","value","hasKey","div","style","alignItems","backgroundColor","borderRadius","color","display","fontSize","fontWeight","gap","padding","span","height","width"],"mappings":"AAAA;;AAEA,SAASA,QAAQ,QAAQ,iBAAgB;AACzC,OAAOC,WAAW,QAAO;AAMzB,OAAO,MAAMC,wBAAyC,CAAC,EAAEC,IAAI,EAAE;IAC7D,MAAM,EAAEC,KAAK,EAAE,GAAGJ,SAAiB;QAAEG;IAAK;IAC1C,MAAME,SAAS,CAAC,CAACD;IAEjB,IAAI,CAACC,QAAQ;QAAC,OAAO;IAAI;IAEzB,qBACE,MAACC;QAAIC,OAAO;YACVC,YAAY;YACZC,iBAAiB;YACjBC,cAAc;YACdC,OAAO;YACPC,SAAS;YACTC,UAAU;YACVC,YAAY;YACZC,KAAK;YACLC,SAAS;QACX;;0BACE,KAACC;gBAAKV,OAAO;oBACXE,iBAAiB;oBACjBC,cAAc;oBACdQ,QAAQ;oBACRC,OAAO;gBACT;;YAAK;;;AAIX,EAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useField } from '@payloadcms/ui';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
export const ApiKeyStatusIndicator = ({ path }) => {
|
|
5
|
+
const { value } = useField({ path });
|
|
6
|
+
const hasKey = !!value;
|
|
7
|
+
if (!hasKey) {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
return (<div style={{
|
|
11
|
+
alignItems: 'center',
|
|
12
|
+
backgroundColor: 'var(--theme-success-100)',
|
|
13
|
+
borderRadius: '4px',
|
|
14
|
+
color: 'var(--theme-success-700)',
|
|
15
|
+
display: 'inline-flex',
|
|
16
|
+
fontSize: '12px',
|
|
17
|
+
fontWeight: 'bold',
|
|
18
|
+
gap: '6px',
|
|
19
|
+
padding: '4px 8px'
|
|
20
|
+
}}>
|
|
21
|
+
<span style={{
|
|
22
|
+
backgroundColor: 'currentColor',
|
|
23
|
+
borderRadius: '50%',
|
|
24
|
+
height: '8px',
|
|
25
|
+
width: '8px'
|
|
26
|
+
}}/>
|
|
27
|
+
Active
|
|
28
|
+
</div>);
|
|
29
|
+
};
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import type { ClientField } from 'payload';
|
|
2
2
|
import type { FC } from 'react';
|
|
3
|
-
type ComposeProps = {
|
|
3
|
+
export type ComposeProps = {
|
|
4
4
|
descriptionProps?: {
|
|
5
5
|
field: ClientField;
|
|
6
6
|
path: string;
|
|
7
7
|
schemaPath: string;
|
|
8
8
|
};
|
|
9
|
+
forceVisible?: boolean;
|
|
9
10
|
instructionId: string;
|
|
10
11
|
isConfigAllowed: boolean;
|
|
11
12
|
};
|
|
12
13
|
export declare const Compose: FC<ComposeProps>;
|
|
13
|
-
export {};
|