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