@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/ai/schemas/lexicalJsonSchema.ts"],"sourcesContent":["import type { JSONSchema } from 'openai/lib/jsonschema'\n\nimport { isObjectSchema } from '../utils/isObjectSchema.js'\n\nexport interface LexicalNodeSchema extends JSONSchema {\n $schema?: string\n additionalProperties?: boolean\n definitions?: Record<string, any>\n properties: {\n [key: string]: any\n children?: {\n items: {\n $ref?: string\n anyOf?: { $ref: string }[]\n }\n type: 'array'\n }\n type?: {\n enum: string[]\n type: 'string'\n }\n }\n required?: string[]\n type: 'object'\n}\n\nexport const documentSchema: LexicalNodeSchema = {\n type: 'object',\n $schema: 'http://json-schema.org/draft-07/schema#',\n additionalProperties: false,\n definitions: {\n LineBreakNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['linebreak'] },\n version: { type: 'number' },\n },\n required: ['type', 'version'],\n },\n TabNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['tab'] },\n version: { type: 'number' },\n },\n required: ['type', 'version'],\n },\n // Text Node (Leaf Node)\n TextNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['text'] },\n detail: {\n type: 'number',\n description: 'Text detail flags',\n enum: [\n 0, // No details\n 1, // IS_DIRECTIONLESS\n 2, // IS_UNMERGEABLE\n 3, // IS_DIRECTIONLESS + IS_UNMERGEABLE\n ],\n examples: [\n { description: 'No special details', value: 0 },\n { description: 'Directionless', value: 1 },\n { description: 'Unmergeable', value: 2 },\n { description: 'Directionless + Unmergeable', value: 3 },\n ],\n },\n direction: {\n type: ['string', 'null'],\n enum: ['ltr', null],\n },\n format: {\n type: 'number',\n description: `Format flags for text:\n 0 = No format\n 1 = Bold\n 2 = Italic\n 3 = Bold + Italic (1|2)\n 4 = Strikethrough\n 8 = Underline\n 9 = Bold + Underline (1|8)\n 16 = Code\n 32 = Subscript\n 64 = Superscript\n 128 = Highlight\n \n Formats can be combined using binary OR (|).\n Example combinations:\n - Bold + Italic = 1|2 = 3\n - Bold + Underline = 1|8 = 9\n - Italic + Underline = 2|8 = 10\n - Bold + Italic + Underline = 1|2|8 = 11`,\n },\n indent: { type: 'number' },\n mode: {\n type: 'number',\n description: 'Text mode flags',\n enum: [\n 0, // Normal\n 1, // Token\n 2, // Segmented\n ],\n examples: [\n { description: 'Normal text', value: 0 },\n { description: 'Token text', value: 1 },\n { description: 'Segmented text', value: 2 },\n ],\n },\n style: {\n type: 'string',\n description: 'CSS style string (e.g., \"color: red; font-size: 12px;\")',\n },\n text: { type: 'string' },\n version: { type: 'number' },\n },\n required: [\n 'type',\n 'text',\n 'format',\n 'style',\n 'mode',\n 'detail',\n 'direction',\n 'indent',\n 'version',\n ],\n },\n // Styled Table Cell Node\n TableCellNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['tablecell'] },\n children: {\n type: 'array',\n items: {\n $ref: '#/definitions/TextNode',\n },\n },\n colSpan: { type: 'number' },\n direction: {\n type: ['string', 'null'],\n enum: ['ltr', null],\n },\n headerState: { type: 'number' },\n indent: { type: 'number' },\n version: { type: 'number' },\n width: {\n type: ['null'],\n enum: [null],\n },\n },\n required: [\n 'type',\n 'children',\n 'headerState',\n 'colSpan',\n 'width',\n 'direction',\n 'indent',\n 'version',\n ],\n },\n // Styled Table Row Node\n TableRowNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['tablerow'] },\n children: {\n type: 'array',\n items: {\n $ref: '#/definitions/TableCellNode',\n },\n },\n height: { type: 'number' },\n },\n required: ['type', 'children', 'height'],\n },\n // Styled Table Node\n TableNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['table'] },\n children: {\n type: 'array',\n items: {\n $ref: '#/definitions/TableRowNode',\n },\n },\n },\n required: ['type', 'children'],\n },\n // Heading Node\n HeadingNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['heading'] },\n children: {\n type: 'array',\n items: {\n anyOf: [\n { $ref: '#/definitions/TextNode' },\n { $ref: '#/definitions/LinkNode' },\n { $ref: '#/definitions/LineBreakNode' },\n { $ref: '#/definitions/TabNode' },\n ],\n },\n },\n direction: {\n type: ['string', 'null'],\n enum: ['ltr', null],\n },\n indent: { type: 'number' },\n tag: { type: 'string', enum: ['h1', 'h2', 'h3'] },\n version: { type: 'number' },\n },\n required: ['type', 'tag', 'children', 'direction', 'indent', 'version'],\n },\n // Paragraph Node\n ParagraphNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['paragraph'] },\n children: {\n type: 'array',\n items: {\n anyOf: [\n { $ref: '#/definitions/TextNode' },\n { $ref: '#/definitions/LinkNode' },\n { $ref: '#/definitions/CodeNode' },\n { $ref: '#/definitions/LineBreakNode' },\n { $ref: '#/definitions/TabNode' },\n ],\n },\n },\n direction: {\n type: ['string', 'null'],\n enum: ['ltr', null],\n },\n format: {\n type: 'string',\n description:\n 'Format alignment based on content. Prioritize \"start\", then \"center\", and use \"right\" only when appropriate.',\n enum: ['start', 'center', 'right'],\n },\n indent: { type: 'number' },\n textFormat: { type: 'number' },\n textStyle: {\n type: 'string',\n description: 'CSS style string (e.g., \"color: red; font-size: 12px;\")',\n },\n version: { type: 'number' },\n },\n required: [\n 'type',\n 'children',\n 'direction',\n 'format',\n 'indent',\n 'textFormat',\n 'textStyle',\n 'version',\n ],\n },\n // Link Node\n LinkNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['link'] },\n children: {\n type: 'array',\n items: {\n $ref: '#/definitions/TextNode',\n },\n },\n url: { type: 'string' },\n },\n required: ['type', 'url', 'children'],\n },\n // List Item Node\n ListItemNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n // NOTE: Do not change the position of \"indent\", models like gpt generate properties as they are\n // defined in schema, moving the position of property \"indent\"\n // can cause issue with schema validation while streaming generated json to lexical editor\n indent: { type: 'number', enum: [0, 1] },\n\n type: { type: 'string', enum: ['listitem'] },\n children: {\n type: 'array',\n items: {\n anyOf: [\n { $ref: '#/definitions/ParagraphNode' },\n { $ref: '#/definitions/ListNode' },\n { $ref: '#/definitions/LineBreakNode' },\n ],\n },\n },\n },\n required: ['indent', 'type', 'children'],\n },\n // List Node\n ListNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['list'] },\n children: {\n type: 'array',\n items: {\n $ref: '#/definitions/ListItemNode',\n },\n },\n listType: { type: 'string', enum: ['bullet', 'number'] },\n },\n required: ['type', 'listType', 'children'],\n },\n // Quote Node\n QuoteNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['quote'] },\n children: {\n type: 'array',\n items: {\n anyOf: [\n { $ref: '#/definitions/TextNode' },\n { $ref: '#/definitions/ParagraphNode' },\n { $ref: '#/definitions/LineBreakNode' },\n { $ref: '#/definitions/TabNode' },\n ],\n },\n },\n },\n required: ['type', 'children'],\n },\n // Code Node\n CodeNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['code'] },\n code: { type: 'string' },\n language: { type: 'string' },\n },\n required: ['type', 'code', 'language'],\n },\n // Horizontal Rule Node\n HorizontalRuleNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['horizontalrule'] },\n },\n required: ['type'],\n },\n // Image Node\n ImageNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['image'] },\n alt: { type: 'string' },\n caption: {\n type: 'array',\n items: {\n $ref: '#/definitions/TextNode',\n },\n },\n src: { type: 'string' },\n },\n required: ['type', 'src', 'alt', 'caption'],\n },\n // Root Node\n RootNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['root'] },\n children: {\n type: 'array',\n items: {\n anyOf: [\n { $ref: '#/definitions/TextNode' },\n { $ref: '#/definitions/HeadingNode' },\n { $ref: '#/definitions/ParagraphNode' },\n { $ref: '#/definitions/LinkNode' },\n { $ref: '#/definitions/ListNode' },\n { $ref: '#/definitions/QuoteNode' },\n { $ref: '#/definitions/CodeNode' },\n { $ref: '#/definitions/HorizontalRuleNode' },\n { $ref: '#/definitions/ImageNode' },\n { $ref: '#/definitions/TableNode' },\n ],\n },\n },\n direction: {\n type: ['string', 'null'],\n enum: ['ltr', null],\n },\n indent: { type: 'number' },\n version: { type: 'number' },\n },\n required: ['type', 'children', 'direction', 'indent', 'version'],\n },\n },\n properties: {\n root: {\n $ref: '#/definitions/RootNode',\n },\n },\n required: ['root'],\n}\n\nexport const lexicalJsonSchema = (customNodes: JSONSchema[] | undefined) => {\n const schema = structuredClone(documentSchema)\n\n if (Array.isArray(customNodes) && customNodes.length > 0) {\n customNodes.forEach((nodeObj) => {\n for (const [nodeName, nodeDefinition] of Object.entries(nodeObj)) {\n // @ts-ignore\n schema.definitions[nodeName] = nodeDefinition\n\n // @ts-ignore\n const rootNode = schema.definitions['RootNode']\n if (isObjectSchema(rootNode)) {\n const children = rootNode.properties?.children\n const items = children?.items\n const anyOfList = (items as any)?.anyOf\n\n if (Array.isArray(anyOfList)) {\n anyOfList.push({ $ref: `#/definitions/${nodeName}` })\n }\n }\n }\n })\n }\n\n return schema\n}\n"],"names":["isObjectSchema","documentSchema","type","$schema","additionalProperties","definitions","LineBreakNode","properties","enum","version","required","TabNode","TextNode","detail","description","examples","value","direction","format","indent","mode","style","text","TableCellNode","children","items","$ref","colSpan","headerState","width","TableRowNode","height","TableNode","HeadingNode","anyOf","tag","ParagraphNode","textFormat","textStyle","LinkNode","url","ListItemNode","ListNode","listType","QuoteNode","CodeNode","code","language","HorizontalRuleNode","ImageNode","alt","caption","src","RootNode","root","lexicalJsonSchema","customNodes","schema","structuredClone","Array","isArray","length","forEach","nodeObj","nodeName","nodeDefinition","Object","entries","rootNode","anyOfList","push"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/ai/schemas/lexicalJsonSchema.ts"],"sourcesContent":["import type { JSONSchema } from 'openai/lib/jsonschema'\n\nimport { isObjectSchema } from '../utilities/isObjectSchema.js'\n\nexport interface LexicalNodeSchema extends JSONSchema {\n $schema?: string\n additionalProperties?: boolean\n definitions?: Record<string, any>\n properties: {\n [key: string]: any\n children?: {\n items: {\n $ref?: string\n anyOf?: { $ref: string }[]\n }\n type: 'array'\n }\n type?: {\n enum: string[]\n type: 'string'\n }\n }\n required?: string[]\n type: 'object'\n}\n\nexport const documentSchema: LexicalNodeSchema = {\n type: 'object',\n $schema: 'http://json-schema.org/draft-07/schema#',\n additionalProperties: false,\n definitions: {\n LineBreakNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['linebreak'] },\n version: { type: 'number' },\n },\n required: ['type', 'version'],\n },\n TabNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['tab'] },\n version: { type: 'number' },\n },\n required: ['type', 'version'],\n },\n // Text Node (Leaf Node)\n TextNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['text'] },\n detail: {\n type: 'number',\n description: 'Text detail flags',\n enum: [\n 0, // No details\n 1, // IS_DIRECTIONLESS\n 2, // IS_UNMERGEABLE\n 3, // IS_DIRECTIONLESS + IS_UNMERGEABLE\n ],\n examples: [\n { description: 'No special details', value: 0 },\n { description: 'Directionless', value: 1 },\n { description: 'Unmergeable', value: 2 },\n { description: 'Directionless + Unmergeable', value: 3 },\n ],\n },\n direction: {\n type: ['string', 'null'],\n enum: ['ltr', null],\n },\n format: {\n type: 'number',\n description: `Format flags for text:\n 0 = No format\n 1 = Bold\n 2 = Italic\n 3 = Bold + Italic (1|2)\n 4 = Strikethrough\n 8 = Underline\n 9 = Bold + Underline (1|8)\n 16 = Code\n 32 = Subscript\n 64 = Superscript\n 128 = Highlight\n \n Formats can be combined using binary OR (|).\n Example combinations:\n - Bold + Italic = 1|2 = 3\n - Bold + Underline = 1|8 = 9\n - Italic + Underline = 2|8 = 10\n - Bold + Italic + Underline = 1|2|8 = 11`,\n },\n indent: { type: 'number' },\n mode: {\n type: 'number',\n description: 'Text mode flags',\n enum: [\n 0, // Normal\n 1, // Token\n 2, // Segmented\n ],\n examples: [\n { description: 'Normal text', value: 0 },\n { description: 'Token text', value: 1 },\n { description: 'Segmented text', value: 2 },\n ],\n },\n style: {\n type: 'string',\n description: 'CSS style string (e.g., \"color: red; font-size: 12px;\")',\n },\n text: { type: 'string' },\n version: { type: 'number' },\n },\n required: [\n 'type',\n 'text',\n 'format',\n 'style',\n 'mode',\n 'detail',\n 'direction',\n 'indent',\n 'version',\n ],\n },\n // Styled Table Cell Node\n TableCellNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['tablecell'] },\n children: {\n type: 'array',\n items: {\n $ref: '#/definitions/TextNode',\n },\n },\n colSpan: { type: 'number' },\n direction: {\n type: ['string', 'null'],\n enum: ['ltr', null],\n },\n headerState: { type: 'number' },\n indent: { type: 'number' },\n version: { type: 'number' },\n width: {\n type: ['null'],\n enum: [null],\n },\n },\n required: [\n 'type',\n 'children',\n 'headerState',\n 'colSpan',\n 'width',\n 'direction',\n 'indent',\n 'version',\n ],\n },\n // Styled Table Row Node\n TableRowNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['tablerow'] },\n children: {\n type: 'array',\n items: {\n $ref: '#/definitions/TableCellNode',\n },\n },\n height: { type: 'number' },\n },\n required: ['type', 'children', 'height'],\n },\n // Styled Table Node\n TableNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['table'] },\n children: {\n type: 'array',\n items: {\n $ref: '#/definitions/TableRowNode',\n },\n },\n },\n required: ['type', 'children'],\n },\n // Heading Node\n HeadingNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['heading'] },\n children: {\n type: 'array',\n items: {\n anyOf: [\n { $ref: '#/definitions/TextNode' },\n { $ref: '#/definitions/LinkNode' },\n { $ref: '#/definitions/LineBreakNode' },\n { $ref: '#/definitions/TabNode' },\n ],\n },\n },\n direction: {\n type: ['string', 'null'],\n enum: ['ltr', null],\n },\n indent: { type: 'number' },\n tag: { type: 'string', enum: ['h1', 'h2', 'h3'] },\n version: { type: 'number' },\n },\n required: ['type', 'tag', 'children', 'direction', 'indent', 'version'],\n },\n // Paragraph Node\n ParagraphNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['paragraph'] },\n children: {\n type: 'array',\n items: {\n anyOf: [\n { $ref: '#/definitions/TextNode' },\n { $ref: '#/definitions/LinkNode' },\n { $ref: '#/definitions/CodeNode' },\n { $ref: '#/definitions/LineBreakNode' },\n { $ref: '#/definitions/TabNode' },\n ],\n },\n },\n direction: {\n type: ['string', 'null'],\n enum: ['ltr', null],\n },\n format: {\n type: 'string',\n description:\n 'Format alignment based on content. Prioritize \"start\", then \"center\", and use \"right\" only when appropriate.',\n enum: ['start', 'center', 'right'],\n },\n indent: { type: 'number' },\n textFormat: { type: 'number' },\n textStyle: {\n type: 'string',\n description: 'CSS style string (e.g., \"color: red; font-size: 12px;\")',\n },\n version: { type: 'number' },\n },\n required: [\n 'type',\n 'children',\n 'direction',\n 'format',\n 'indent',\n 'textFormat',\n 'textStyle',\n 'version',\n ],\n },\n // Link Node\n LinkNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['link'] },\n children: {\n type: 'array',\n items: {\n $ref: '#/definitions/TextNode',\n },\n },\n url: { type: 'string' },\n },\n required: ['type', 'url', 'children'],\n },\n // List Item Node\n ListItemNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n // NOTE: Do not change the position of \"indent\", models like gpt generate properties as they are\n // defined in schema, moving the position of property \"indent\"\n // can cause issue with schema validation while streaming generated json to lexical editor\n indent: { type: 'number', enum: [0, 1] },\n\n type: { type: 'string', enum: ['listitem'] },\n children: {\n type: 'array',\n items: {\n anyOf: [\n { $ref: '#/definitions/ParagraphNode' },\n { $ref: '#/definitions/ListNode' },\n { $ref: '#/definitions/LineBreakNode' },\n ],\n },\n },\n },\n required: ['indent', 'type', 'children'],\n },\n // List Node\n ListNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['list'] },\n children: {\n type: 'array',\n items: {\n $ref: '#/definitions/ListItemNode',\n },\n },\n listType: { type: 'string', enum: ['bullet', 'number'] },\n },\n required: ['type', 'listType', 'children'],\n },\n // Quote Node\n QuoteNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['quote'] },\n children: {\n type: 'array',\n items: {\n anyOf: [\n { $ref: '#/definitions/TextNode' },\n { $ref: '#/definitions/ParagraphNode' },\n { $ref: '#/definitions/LineBreakNode' },\n { $ref: '#/definitions/TabNode' },\n ],\n },\n },\n },\n required: ['type', 'children'],\n },\n // Code Node\n CodeNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['code'] },\n code: { type: 'string' },\n language: { type: 'string' },\n },\n required: ['type', 'code', 'language'],\n },\n // Horizontal Rule Node\n HorizontalRuleNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['horizontalrule'] },\n },\n required: ['type'],\n },\n // Image Node\n ImageNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['image'] },\n alt: { type: 'string' },\n caption: {\n type: 'array',\n items: {\n $ref: '#/definitions/TextNode',\n },\n },\n src: { type: 'string' },\n },\n required: ['type', 'src', 'alt', 'caption'],\n },\n // Root Node\n RootNode: {\n type: 'object',\n additionalProperties: false,\n properties: {\n type: { type: 'string', enum: ['root'] },\n children: {\n type: 'array',\n items: {\n anyOf: [\n { $ref: '#/definitions/TextNode' },\n { $ref: '#/definitions/HeadingNode' },\n { $ref: '#/definitions/ParagraphNode' },\n { $ref: '#/definitions/LinkNode' },\n { $ref: '#/definitions/ListNode' },\n { $ref: '#/definitions/QuoteNode' },\n { $ref: '#/definitions/CodeNode' },\n { $ref: '#/definitions/HorizontalRuleNode' },\n { $ref: '#/definitions/ImageNode' },\n { $ref: '#/definitions/TableNode' },\n ],\n },\n },\n direction: {\n type: ['string', 'null'],\n enum: ['ltr', null],\n },\n indent: { type: 'number' },\n version: { type: 'number' },\n },\n required: ['type', 'children', 'direction', 'indent', 'version'],\n },\n },\n properties: {\n root: {\n $ref: '#/definitions/RootNode',\n },\n },\n required: ['root'],\n}\n\nexport const lexicalJsonSchema = (customNodes: JSONSchema[] | undefined) => {\n const schema = structuredClone(documentSchema)\n\n if (Array.isArray(customNodes) && customNodes.length > 0) {\n customNodes.forEach((nodeObj) => {\n for (const [nodeName, nodeDefinition] of Object.entries(nodeObj)) {\n // @ts-ignore\n schema.definitions[nodeName] = nodeDefinition\n\n // @ts-ignore\n const rootNode = schema.definitions['RootNode']\n if (isObjectSchema(rootNode)) {\n const children = rootNode.properties?.children\n const items = children?.items\n const anyOfList = (items as any)?.anyOf\n\n if (Array.isArray(anyOfList)) {\n anyOfList.push({ $ref: `#/definitions/${nodeName}` })\n }\n }\n }\n })\n }\n\n return schema\n}\n"],"names":["isObjectSchema","documentSchema","type","$schema","additionalProperties","definitions","LineBreakNode","properties","enum","version","required","TabNode","TextNode","detail","description","examples","value","direction","format","indent","mode","style","text","TableCellNode","children","items","$ref","colSpan","headerState","width","TableRowNode","height","TableNode","HeadingNode","anyOf","tag","ParagraphNode","textFormat","textStyle","LinkNode","url","ListItemNode","ListNode","listType","QuoteNode","CodeNode","code","language","HorizontalRuleNode","ImageNode","alt","caption","src","RootNode","root","lexicalJsonSchema","customNodes","schema","structuredClone","Array","isArray","length","forEach","nodeObj","nodeName","nodeDefinition","Object","entries","rootNode","anyOfList","push"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ai/utilities/filterEditorSchemaByNodes.ts"],"sourcesContent":["import type { LexicalNodeSchema } from '../schemas/lexicalJsonSchema.js'\n\nimport { isObjectSchema } from './isObjectSchema.js'\nimport { coreNodeTypes, nodeClassToType, nodeTypeToSchemaMap } from './nodeToSchemaMap.js'\n\n/**\n * Filters the Lexical JSON schema to only include definitions for allowed nodes.\n *\n * @param schema - The full Lexical JSON schema\n * @param allowedNodes - Array of allowed node types. Can be either:\n * - Node class names (e.g., 'HeadingNode', 'ParagraphNode')\n * - Type values (e.g., 'heading', 'paragraph')\n * @returns A filtered schema containing only the allowed definitions\n */\nexport function filterEditorSchemaByNodes(schema: LexicalNodeSchema, allowedNodes: string[]) {\n // Normalize node names to lowercase type values\n const normalizedTypes = new Set<string>()\n\n // Always include core nodes\n for (const coreType of coreNodeTypes) {\n normalizedTypes.add(coreType)\n }\n\n // Add user-specified allowed nodes\n for (const node of allowedNodes) {\n // Handle both formats: 'HeadingNode' and 'heading'\n const normalized = node.includes('Node') ? nodeClassToType(node) : node.toLowerCase()\n normalizedTypes.add(normalized)\n }\n\n const filteredDefinitions: Record<string, any> = {}\n\n // First pass: collect definitions whose \"type.enum\" includes an allowed type\n for (const [key, def] of Object.entries(schema.definitions ?? {})) {\n if (isObjectSchema(def)) {\n const typeEnum = def.properties?.type?.enum\n if (typeEnum && typeEnum.some((t) => normalizedTypes.has(t))) {\n filteredDefinitions[key] = JSON.parse(JSON.stringify(def)) // Deep copy to safely mutate\n }\n }\n }\n\n // Ensure core schema definitions are included by checking the map\n for (const coreType of coreNodeTypes) {\n const defName = nodeTypeToSchemaMap[coreType]\n if (defName && schema.definitions?.[defName] && !filteredDefinitions[defName]) {\n filteredDefinitions[defName] = JSON.parse(JSON.stringify(schema.definitions[defName]))\n }\n }\n\n // Helper to check if a $ref points to an allowed definition\n const isAllowedRef = (ref: string) => {\n if (typeof ref !== 'string') {\n return false\n }\n const defName = ref.replace('#/definitions/', '')\n return defName in filteredDefinitions\n }\n\n // Second pass: update \"children\" in each definition to only include allowed refs\n for (const def of Object.values(filteredDefinitions)) {\n if (isObjectSchema(def) && def.properties?.children?.items) {\n const items = def.properties.children.items\n\n if (Array.isArray(items.anyOf)) {\n // Filter anyOf to only allowed $refs\n items.anyOf = items.anyOf.filter((entry) => isAllowedRef(entry.$ref))\n if (items.anyOf.length === 0) {\n delete def.properties.children\n }\n } else if (items.$ref && !isAllowedRef(items.$ref)) {\n delete def.properties.children\n }\n }\n }\n\n // Return the new schema with pruned definitions\n return {\n ...schema,\n definitions: filteredDefinitions,\n }\n}\n"],"names":["isObjectSchema","coreNodeTypes","nodeClassToType","nodeTypeToSchemaMap","filterEditorSchemaByNodes","schema","allowedNodes","normalizedTypes","Set","coreType","add","node","normalized","includes","toLowerCase","filteredDefinitions","key","def","Object","entries","definitions","typeEnum","properties","type","enum","some","t","has","JSON","parse","stringify","defName","isAllowedRef","ref","replace","values","children","items","Array","isArray","anyOf","filter","entry","$ref","length"],"mappings":"AAEA,SAASA,cAAc,QAAQ,sBAAqB;AACpD,SAASC,aAAa,EAAEC,eAAe,EAAEC,mBAAmB,QAAQ,uBAAsB;AAE1F;;;;;;;;CAQC,GACD,OAAO,SAASC,0BAA0BC,MAAyB,EAAEC,YAAsB;IACzF,gDAAgD;IAChD,MAAMC,kBAAkB,IAAIC;IAE5B,4BAA4B;IAC5B,KAAK,MAAMC,YAAYR,cAAe;QACpCM,gBAAgBG,GAAG,CAACD;IACtB;IAEA,mCAAmC;IACnC,KAAK,MAAME,QAAQL,aAAc;QAC/B,mDAAmD;QACnD,MAAMM,aAAaD,KAAKE,QAAQ,CAAC,UAAUX,gBAAgBS,QAAQA,KAAKG,WAAW;QACnFP,gBAAgBG,GAAG,CAACE;IACtB;IAEA,MAAMG,sBAA2C,CAAC;IAElD,6EAA6E;IAC7E,KAAK,MAAM,CAACC,KAAKC,IAAI,IAAIC,OAAOC,OAAO,CAACd,OAAOe,WAAW,IAAI,CAAC,GAAI;QACjE,IAAIpB,eAAeiB,MAAM;YACvB,MAAMI,WAAWJ,IAAIK,UAAU,EAAEC,MAAMC;YACvC,IAAIH,YAAYA,SAASI,IAAI,CAAC,CAACC,IAAMnB,gBAAgBoB,GAAG,CAACD,KAAK;gBAC5DX,mBAAmB,CAACC,IAAI,GAAGY,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACb,MAAM,6BAA6B;;YAC1F;QACF;IACF;IAEA,kEAAkE;IAClE,KAAK,MAAMR,YAAYR,cAAe;QACpC,MAAM8B,UAAU5B,mBAAmB,CAACM,SAAS;QAC7C,IAAIsB,WAAW1B,OAAOe,WAAW,EAAE,CAACW,QAAQ,IAAI,CAAChB,mBAAmB,CAACgB,QAAQ,EAAE;YAC7EhB,mBAAmB,CAACgB,QAAQ,GAAGH,KAAKC,KAAK,CAACD,KAAKE,SAAS,CAACzB,OAAOe,WAAW,CAACW,QAAQ;QACtF;IACF;IAEA,4DAA4D;IAC5D,MAAMC,eAAe,CAACC;QACpB,IAAI,OAAOA,QAAQ,UAAU;YAC3B,OAAO;QACT;QACA,MAAMF,UAAUE,IAAIC,OAAO,CAAC,kBAAkB;QAC9C,OAAOH,WAAWhB;IACpB;IAEA,iFAAiF;IACjF,KAAK,MAAME,OAAOC,OAAOiB,MAAM,CAACpB,qBAAsB;QACpD,IAAIf,eAAeiB,QAAQA,IAAIK,UAAU,EAAEc,UAAUC,OAAO;YAC1D,MAAMA,QAAQpB,IAAIK,UAAU,CAACc,QAAQ,CAACC,KAAK;YAE3C,IAAIC,MAAMC,OAAO,CAACF,MAAMG,KAAK,GAAG;gBAC9B,qCAAqC;gBACrCH,MAAMG,KAAK,GAAGH,MAAMG,KAAK,CAACC,MAAM,CAAC,CAACC,QAAUV,aAAaU,MAAMC,IAAI;gBACnE,IAAIN,MAAMG,KAAK,CAACI,MAAM,KAAK,GAAG;oBAC5B,OAAO3B,IAAIK,UAAU,CAACc,QAAQ;gBAChC;YACF,OAAO,IAAIC,MAAMM,IAAI,IAAI,CAACX,aAAaK,MAAMM,IAAI,GAAG;gBAClD,OAAO1B,IAAIK,UAAU,CAACc,QAAQ;YAChC;QACF;IACF;IAEA,gDAAgD;IAChD,OAAO;QACL,GAAG/B,MAAM;QACTe,aAAaL;IACf;AACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ai/utilities/generateFileNameByPrompt.ts"],"sourcesContent":["export function generateFileNameByPrompt(prompt: string) {\n // Helper function to get a random integer between min and max (inclusive)\n function getRandomInt(min: number, max: number) {\n return Math.floor(Math.random() * (max - min + 1)) + min\n }\n\n // Define the desired length of the filename part from the prompt\n const maxLength = 30\n const promptLength = prompt.length\n\n // Determine the start position for the random substring\n const startPos = getRandomInt(0, Math.max(0, promptLength - maxLength))\n\n // Get the random substring and truncate it if necessary\n let randomSubstring = prompt.substring(startPos, startPos + maxLength)\n\n // Replace invalid filename characters with an underscore\n randomSubstring = randomSubstring.replace(/[^a-z\\d]/gi, '_').toLowerCase()\n\n // Add a timestamp for uniqueness\n const timestamp = new Date().toISOString().replace(/[:.-]/g, '')\n\n // Combine the truncated prompt and timestamp to form the filename\n return `${randomSubstring}_${timestamp}`\n}\n"],"names":["generateFileNameByPrompt","prompt","getRandomInt","min","max","Math","floor","random","maxLength","promptLength","length","startPos","randomSubstring","substring","replace","toLowerCase","timestamp","Date","toISOString"],"mappings":"AAAA,OAAO,SAASA,yBAAyBC,MAAc;IACrD,0EAA0E;IAC1E,SAASC,aAAaC,GAAW,EAAEC,GAAW;QAC5C,OAAOC,KAAKC,KAAK,CAACD,KAAKE,MAAM,KAAMH,CAAAA,MAAMD,MAAM,CAAA,KAAMA;IACvD;IAEA,iEAAiE;IACjE,MAAMK,YAAY;IAClB,MAAMC,eAAeR,OAAOS,MAAM;IAElC,wDAAwD;IACxD,MAAMC,WAAWT,aAAa,GAAGG,KAAKD,GAAG,CAAC,GAAGK,eAAeD;IAE5D,wDAAwD;IACxD,IAAII,kBAAkBX,OAAOY,SAAS,CAACF,UAAUA,WAAWH;IAE5D,yDAAyD;IACzDI,kBAAkBA,gBAAgBE,OAAO,CAAC,cAAc,KAAKC,WAAW;IAExE,iCAAiC;IACjC,MAAMC,YAAY,IAAIC,OAAOC,WAAW,GAAGJ,OAAO,CAAC,UAAU;IAE7D,kEAAkE;IAClE,OAAO,CAAC,EAAEF,gBAAgB,CAAC,EAAEI,UAAU,CAAC;AAC1C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ai/utilities/isObjectSchema.ts"],"sourcesContent":["import type { LexicalNodeSchema } from '../schemas/lexicalJsonSchema.js'\n\nexport function isObjectSchema(schema: unknown): schema is LexicalNodeSchema {\n return typeof schema === 'object' && schema !== null && !Array.isArray(schema)\n}\n"],"names":["isObjectSchema","schema","Array","isArray"],"mappings":"AAEA,OAAO,SAASA,eAAeC,MAAe;IAC5C,OAAO,OAAOA,WAAW,YAAYA,WAAW,QAAQ,CAACC,MAAMC,OAAO,CAACF;AACzE"}
|
|
@@ -6,24 +6,24 @@
|
|
|
6
6
|
* The values are the schema definition names as defined in lexicalJsonSchema.ts.
|
|
7
7
|
*/ export const nodeTypeToSchemaMap = {
|
|
8
8
|
// Core nodes (typically always included)
|
|
9
|
-
text: 'TextNode',
|
|
10
9
|
linebreak: 'LineBreakNode',
|
|
11
|
-
tab: 'TabNode',
|
|
12
10
|
root: 'RootNode',
|
|
11
|
+
tab: 'TabNode',
|
|
12
|
+
text: 'TextNode',
|
|
13
13
|
// Block nodes
|
|
14
|
-
paragraph: 'ParagraphNode',
|
|
15
14
|
heading: 'HeadingNode',
|
|
16
|
-
quote: 'QuoteNode',
|
|
17
15
|
list: 'ListNode',
|
|
18
16
|
listitem: 'ListItemNode',
|
|
17
|
+
paragraph: 'ParagraphNode',
|
|
18
|
+
quote: 'QuoteNode',
|
|
19
19
|
// Rich content nodes
|
|
20
|
-
link: 'LinkNode',
|
|
21
20
|
code: 'CodeNode',
|
|
22
21
|
horizontalrule: 'HorizontalRuleNode',
|
|
22
|
+
link: 'LinkNode',
|
|
23
23
|
// Table nodes
|
|
24
24
|
table: 'TableNode',
|
|
25
|
-
tablerow: 'TableRowNode',
|
|
26
25
|
tablecell: 'TableCellNode',
|
|
26
|
+
tablerow: 'TableRowNode',
|
|
27
27
|
// Media nodes
|
|
28
28
|
image: 'ImageNode'
|
|
29
29
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ai/utilities/nodeToSchemaMap.ts"],"sourcesContent":["/**\n * Maps Lexical node type values to JSON schema definition names.\n * This is used to filter the editor schema based on allowed editor nodes.\n *\n * The keys are the type values that appear in serialized Lexical JSON (e.g., 'heading', 'paragraph').\n * The values are the schema definition names as defined in lexicalJsonSchema.ts.\n */\nexport const nodeTypeToSchemaMap: Record<string, string> = {\n // Core nodes (typically always included)\n linebreak: 'LineBreakNode',\n root: 'RootNode',\n tab: 'TabNode',\n text: 'TextNode',\n\n // Block nodes\n heading: 'HeadingNode',\n list: 'ListNode',\n listitem: 'ListItemNode',\n paragraph: 'ParagraphNode',\n quote: 'QuoteNode',\n\n // Rich content nodes\n code: 'CodeNode',\n horizontalrule: 'HorizontalRuleNode',\n link: 'LinkNode',\n\n // Table nodes\n table: 'TableNode',\n tablecell: 'TableCellNode',\n tablerow: 'TableRowNode',\n\n // Media nodes\n image: 'ImageNode',\n}\n\n/**\n * Core nodes that should always be included in the filtered schema\n */\nexport const coreNodeTypes = ['text', 'linebreak', 'tab', 'root', 'paragraph']\n\n/**\n * Converts a Lexical node class name (e.g., 'HeadingNode') to its type value (e.g., 'heading').\n * This handles the common pattern where node classes are named with the pattern `{Type}Node`.\n */\nexport function nodeClassToType(nodeClassName: string): string {\n // Handle common formats:\n // 'HeadingNode' -> 'heading'\n // 'ParagraphNode' -> 'paragraph'\n // 'HorizontalRuleNode' -> 'horizontalrule'\n return nodeClassName.replace(/Node$/, '').toLowerCase()\n}\n\n/**\n * Converts a set of Lexical node class names to their corresponding schema definition names.\n * Includes core nodes automatically.\n */\nexport function nodeClassesToSchemaDefinitions(nodeClassNames: string[]): string[] {\n const definitions = new Set<string>()\n\n // Always include core nodes\n for (const coreType of coreNodeTypes) {\n const def = nodeTypeToSchemaMap[coreType]\n if (def) {\n definitions.add(def)\n }\n }\n\n // Convert each node class to its definition\n for (const className of nodeClassNames) {\n const type = nodeClassToType(className)\n const def = nodeTypeToSchemaMap[type]\n if (def) {\n definitions.add(def)\n }\n }\n\n return Array.from(definitions)\n}\n"],"names":["nodeTypeToSchemaMap","linebreak","root","tab","text","heading","list","listitem","paragraph","quote","code","horizontalrule","link","table","tablecell","tablerow","image","coreNodeTypes","nodeClassToType","nodeClassName","replace","toLowerCase","nodeClassesToSchemaDefinitions","nodeClassNames","definitions","Set","coreType","def","add","className","type","Array","from"],"mappings":"AAAA;;;;;;CAMC,GACD,OAAO,MAAMA,sBAA8C;IACzD,yCAAyC;IACzCC,WAAW;IACXC,MAAM;IACNC,KAAK;IACLC,MAAM;IAEN,cAAc;IACdC,SAAS;IACTC,MAAM;IACNC,UAAU;IACVC,WAAW;IACXC,OAAO;IAEP,qBAAqB;IACrBC,MAAM;IACNC,gBAAgB;IAChBC,MAAM;IAEN,cAAc;IACdC,OAAO;IACPC,WAAW;IACXC,UAAU;IAEV,cAAc;IACdC,OAAO;AACT,EAAC;AAED;;CAEC,GACD,OAAO,MAAMC,gBAAgB;IAAC;IAAQ;IAAa;IAAO;IAAQ;CAAY,CAAA;AAE9E;;;CAGC,GACD,OAAO,SAASC,gBAAgBC,aAAqB;IACnD,yBAAyB;IACzB,6BAA6B;IAC7B,iCAAiC;IACjC,2CAA2C;IAC3C,OAAOA,cAAcC,OAAO,CAAC,SAAS,IAAIC,WAAW;AACvD;AAEA;;;CAGC,GACD,OAAO,SAASC,+BAA+BC,cAAwB;IACrE,MAAMC,cAAc,IAAIC;IAExB,4BAA4B;IAC5B,KAAK,MAAMC,YAAYT,cAAe;QACpC,MAAMU,MAAM3B,mBAAmB,CAAC0B,SAAS;QACzC,IAAIC,KAAK;YACPH,YAAYI,GAAG,CAACD;QAClB;IACF;IAEA,4CAA4C;IAC5C,KAAK,MAAME,aAAaN,eAAgB;QACtC,MAAMO,OAAOZ,gBAAgBW;QAC7B,MAAMF,MAAM3B,mBAAmB,CAAC8B,KAAK;QACrC,IAAIH,KAAK;YACPH,YAAYI,GAAG,CAACD;QAClB;IACF;IAEA,OAAOI,MAAMC,IAAI,CAACR;AACpB"}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import type { ActionPrompt } from '
|
|
1
|
+
import type { ActionPrompt } from '../../types.js';
|
|
2
2
|
export declare const defaultSystemPrompt = "IMPORTANT INSTRUCTION:\nProduce only the requested output text.\nDo not add any explanations, comments, or engagement.\nDo not use quotation marks in the response.\nBEGIN OUTPUT:";
|
|
3
3
|
export declare const defaultPrompts: ActionPrompt[];
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ai/utilities/prompts.ts"],"sourcesContent":["import type { ActionPrompt } from '../../types.js'\n\n//TODO: This is a temporary solution make use of structured output\nexport const defaultSystemPrompt = `IMPORTANT INSTRUCTION:\nProduce only the requested output text.\nDo not add any explanations, comments, or engagement.\nDo not use quotation marks in the response.\nBEGIN OUTPUT:`\n\nexport const defaultPrompts: ActionPrompt[] = [\n {\n name: 'Rephrase',\n system: ({\n prompt = '',\n systemPrompt = '',\n }) => `You are a skilled language expert. Rephrase the given text while maintaining its original meaning, tone, and emotional content. Use different words and sentence structures where possible, but preserve the overall style and sentiment of the original.\n \n -------------\n INSTRUCTIONS:\n - Rephrase the text according to the guidelines of the ORIGINAL SYSTEM PROMPT, if provided.\n - Retain the original meaning, tone, and emotional content.\n - Use different vocabulary and sentence structures where appropriate.\n - Ensure the rephrased text conveys the same message and feeling as the original.\n ${prompt ? '\\n\\nPrevious prompt:\\n' + prompt : ''}\n ${systemPrompt ? '\\n\\nORIGINAL SYSTEM PROMPT:\\n' + systemPrompt : ''}\n -------------`,\n },\n {\n name: 'Expand',\n system:\n () => `You are a creative writer and subject matter expert. Expand the given text by adding depth, detail, and relevant information while maintaining the original tone and style.\n \n -------------\n INSTRUCTIONS:\n - Understand the main ideas and tone of the text.\n - Add more details, examples, explanations, or context.\n - Maintain the original tone, style, and intent.\n - Ensure the expanded version flows naturally and coherently.\n - Do not contradict or alter the original meaning.\n -------------`,\n },\n {\n name: 'Proofread',\n system:\n () => `You are an English language expert. Proofread the given text, focusing on correcting grammar and spelling mistakes without altering the content, style, or tone.\n \n -------------\n INSTRUCTIONS:\n - Correct grammar and spelling errors.\n - Do not change the content, meaning, tone, or style.\n - Return the full text, whether corrections were made or not.\n - Do not provide additional comments or analysis.\n -------------`,\n },\n {\n name: 'Simplify',\n system: ({\n prompt = '',\n }) => `You are a skilled communicator specializing in clear and concise writing. Simplify the given text to make it easier to understand while retaining its core message.\n \n -------------\n INSTRUCTIONS:\n - Simplify the language, using more common words and shorter sentences.\n - Remove unnecessary details or jargon while keeping essential information.\n - Maintain the original meaning and key points.\n - Aim for clarity and readability for a general audience.\n - The simplified text should be more concise than the original.\n ${prompt ? '\\n\\nPREVIOUS PROMPT:\\n' + prompt : ''}\n -------------`,\n },\n {\n name: 'Summarize',\n layout: () => `\n[heading] - Summary\n[paragraph] - Your summary goes here...\n `,\n system: () =>\n `You are an expert at summarizing information. Your task is to create a concise summary of the given text that captures its key points and essential details while preserving the original meaning.\n\nINSTRUCTIONS:\n1. Carefully read and analyze the provided text.\n2. Identify and extract the main ideas and crucial supporting details.\n3. Condense the information into a clear and coherent summary that maintains the core message.\n4. Preserve the original tone and intent of the text.\n5. Ensure your summary is approximately 25-30% of the original text length.\n6. Use clear and precise language, avoiding unnecessary jargon or complexity.\n`,\n },\n {\n name: 'Tone',\n system: () =>\n `You are a tone adjustment specialist. Modify the tone of the given text as specified while keeping the original message and content intact.\n \n -------------\n INSTRUCTIONS:\n - Adjust the tone to match the specified style (e.g., formal, informal, professional, friendly).\n - Maintain the original content and meaning.\n - Ensure the adjusted text flows naturally with the new tone.\n -------------`,\n },\n {\n name: 'Translate',\n system: ({ locale, prompt = '', systemPrompt = '' }: { locale?: string; prompt?: string; systemPrompt?: string }) =>\n `You are a skilled translator. Translate the following text into ${locale}, ensuring the original meaning, tone, and context are preserved.\n \n -------------\n INSTRUCTIONS:\n - Accurately translate the text into ${locale}.\n - Preserve the original meaning, tone, and context.\n - Ensure the translation is culturally appropriate and natural in the target language.\n ${prompt ? '\\n\\nPREVIOUS PROMPT:\\n' + prompt : ''}\n ${systemPrompt ? '\\n\\nORIGINAL SYSTEM PROMPT:\\n' + systemPrompt : ''}\n -------------`,\n },\n]\n"],"names":["defaultSystemPrompt","defaultPrompts","name","system","prompt","systemPrompt","layout","locale"],"mappings":"AAEA,kEAAkE;AAClE,OAAO,MAAMA,sBAAsB,CAAC;;;;aAIvB,CAAC,CAAA;AAEd,OAAO,MAAMC,iBAAiC;IAC5C;QACEC,MAAM;QACNC,QAAQ,CAAC,EACPC,SAAS,EAAE,EACXC,eAAe,EAAE,EAClB,GAAK,CAAC;;;;;;;;MAQL,EAAED,SAAS,2BAA2BA,SAAS,GAAG;MAClD,EAAEC,eAAe,kCAAkCA,eAAe,GAAG;mBACxD,CAAC;IAClB;IACA;QACEH,MAAM;QACNC,QACE,IAAM,CAAC;;;;;;;;;mBASM,CAAC;IAClB;IACA;QACED,MAAM;QACNC,QACE,IAAM,CAAC;;;;;;;;mBAQM,CAAC;IAClB;IACA;QACED,MAAM;QACNC,QAAQ,CAAC,EACPC,SAAS,EAAE,EACZ,GAAK,CAAC;;;;;;;;;MASL,EAAEA,SAAS,2BAA2BA,SAAS,GAAG;mBACrC,CAAC;IAClB;IACA;QACEF,MAAM;QACNI,QAAQ,IAAM,CAAC;;;IAGf,CAAC;QACDH,QAAQ,IACN,CAAC;;;;;;;;;AASP,CAAC;IACC;IACA;QACED,MAAM;QACNC,QAAQ,IACN,CAAC;;;;;;;mBAOY,CAAC;IAClB;IACA;QACED,MAAM;QACNC,QAAQ,CAAC,EAAEI,MAAM,EAAEH,SAAS,EAAE,EAAEC,eAAe,EAAE,EAA+D,GAC9G,CAAC,gEAAgE,EAAEE,OAAO;;;;yCAIvC,EAAEA,OAAO;;;IAG9C,EAAEH,SAAS,2BAA2BA,SAAS,GAAG;IAClD,EAAEC,eAAe,kCAAkCA,eAAe,GAAG;iBACxD,CAAC;IAChB;CACD,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ai/utilities/systemGenerate.ts"],"sourcesContent":["import { anthropic } from '@ai-sdk/anthropic'\nimport { generateText } from 'ai'\n\nimport { PLUGIN_DEFAULT_ANTHROPIC_MODEL, PLUGIN_DEFAULT_OPENAI_MODEL } from '../../defaults.js'\n// import { openai } from '../models/openai/openai.js'\n\nexport const systemGenerate = async (\n data: { prompt: string; system: string },\n generateTextFn?: (prompt: string, system: string) => Promise<string>,\n) => {\n const { prompt, system } = data\n\n if (generateTextFn) {\n return generateTextFn(prompt, system)\n }\n\n // TODO: to be re-evaluate and implemented in a way that admin ui can generate when needed\n\n // let model = null\n\n\n // If the generateTextFn is not provided, still need OPENAI_API_KEY or ANTHROPIC_API_KEY to initialize\n // if (process.env.OPENAI_API_KEY) {\n // model = openai(PLUGIN_DEFAULT_OPENAI_MODEL)\n // } else if (process.env.ANTHROPIC_API_KEY) {\n // model = anthropic(PLUGIN_DEFAULT_ANTHROPIC_MODEL)\n // } else {\n // throw new Error('- AI Plugin: Please check your environment variables!')\n // }\n //\n // const { text } = await generateText({\n // model,\n // prompt,\n // system,\n // })\n //\n // return text\n}\n"],"names":["systemGenerate","data","generateTextFn","prompt","system"],"mappings":"AAIA,sDAAsD;AAEtD,OAAO,MAAMA,iBAAiB,OAC5BC,MACAC;IAEA,MAAM,EAAEC,MAAM,EAAEC,MAAM,EAAE,GAAGH;IAE3B,IAAIC,gBAAgB;QAClB,OAAOA,eAAeC,QAAQC;IAChC;AAEA,0FAA0F;AAE1F,mBAAmB;AAGnB,sGAAsG;AACtG,oCAAoC;AACpC,gDAAgD;AAChD,8CAA8C;AAC9C,sDAAsD;AACtD,WAAW;AACX,6EAA6E;AAC7E,IAAI;AACJ,EAAE;AACF,wCAAwC;AACxC,WAAW;AACX,YAAY;AACZ,YAAY;AACZ,KAAK;AACL,EAAE;AACF,cAAc;AAChB,EAAC"}
|
|
@@ -1,18 +1,9 @@
|
|
|
1
1
|
import { PLUGIN_AI_JOBS_TABLE, PLUGIN_INSTRUCTIONS_TABLE } from '../defaults.js';
|
|
2
|
-
|
|
3
|
-
create: ({ req })=>!!req.user,
|
|
4
|
-
delete: ({ req })=>!!req.user,
|
|
5
|
-
read: ({ req })=>!!req.user,
|
|
6
|
-
update: ({ req })=>!!req.user
|
|
7
|
-
};
|
|
8
|
-
const defaultAdminConfig = {
|
|
9
|
-
group: 'Plugins',
|
|
10
|
-
hidden: true
|
|
11
|
-
};
|
|
2
|
+
import { pluginCollectionAccess, pluginCollectionAdmin } from './shared.js';
|
|
12
3
|
export const aiJobsCollection = ()=>({
|
|
13
4
|
slug: PLUGIN_AI_JOBS_TABLE,
|
|
14
|
-
access:
|
|
15
|
-
admin:
|
|
5
|
+
access: pluginCollectionAccess,
|
|
6
|
+
admin: pluginCollectionAdmin,
|
|
16
7
|
fields: [
|
|
17
8
|
{
|
|
18
9
|
name: 'instructionId',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/collections/AIJobs.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\n\nimport { PLUGIN_AI_JOBS_TABLE, PLUGIN_INSTRUCTIONS_TABLE } from '../defaults.js'\
|
|
1
|
+
{"version":3,"sources":["../../src/collections/AIJobs.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\n\nimport { PLUGIN_AI_JOBS_TABLE, PLUGIN_INSTRUCTIONS_TABLE } from '../defaults.js'\nimport { pluginCollectionAccess, pluginCollectionAdmin } from './shared.js'\n\n\nexport const aiJobsCollection = (): CollectionConfig => ({\n slug: PLUGIN_AI_JOBS_TABLE,\n access: pluginCollectionAccess,\n admin: pluginCollectionAdmin,\n fields: [\n {\n name: 'instructionId',\n type: 'relationship',\n relationTo: PLUGIN_INSTRUCTIONS_TABLE,\n required: true,\n },\n {\n name: 'task_id',\n type: 'text',\n required: true,\n unique: true,\n },\n {\n name: 'status',\n type: 'select',\n defaultValue: 'queued',\n options: [\n { label: 'Queued', value: 'queued' },\n { label: 'Running', value: 'running' },\n { label: 'Completed', value: 'completed' },\n { label: 'Failed', value: 'failed' },\n { label: 'Canceled', value: 'canceled' },\n ],\n },\n {\n name: 'progress',\n type: 'number',\n max: 100,\n min: 0,\n },\n {\n name: 'result_id',\n type: 'text',\n },\n {\n name: 'error',\n type: 'textarea',\n },\n {\n name: 'meta',\n type: 'json',\n },\n ],\n labels: {\n plural: 'AI Jobs',\n singular: 'AI Job',\n },\n})\n"],"names":["PLUGIN_AI_JOBS_TABLE","PLUGIN_INSTRUCTIONS_TABLE","pluginCollectionAccess","pluginCollectionAdmin","aiJobsCollection","slug","access","admin","fields","name","type","relationTo","required","unique","defaultValue","options","label","value","max","min","labels","plural","singular"],"mappings":"AAEA,SAASA,oBAAoB,EAAEC,yBAAyB,QAAQ,iBAAgB;AAChF,SAASC,sBAAsB,EAAEC,qBAAqB,QAAQ,cAAa;AAG3E,OAAO,MAAMC,mBAAmB,IAAyB,CAAA;QACvDC,MAAML;QACNM,QAAQJ;QACRK,OAAOJ;QACPK,QAAQ;YACN;gBACEC,MAAM;gBACNC,MAAM;gBACNC,YAAYV;gBACZW,UAAU;YACZ;YACA;gBACEH,MAAM;gBACNC,MAAM;gBACNE,UAAU;gBACVC,QAAQ;YACV;YACA;gBACEJ,MAAM;gBACNC,MAAM;gBACNI,cAAc;gBACdC,SAAS;oBACP;wBAAEC,OAAO;wBAAUC,OAAO;oBAAS;oBACnC;wBAAED,OAAO;wBAAWC,OAAO;oBAAU;oBACrC;wBAAED,OAAO;wBAAaC,OAAO;oBAAY;oBACzC;wBAAED,OAAO;wBAAUC,OAAO;oBAAS;oBACnC;wBAAED,OAAO;wBAAYC,OAAO;oBAAW;iBACxC;YACH;YACA;gBACER,MAAM;gBACNC,MAAM;gBACNQ,KAAK;gBACLC,KAAK;YACP;YACA;gBACEV,MAAM;gBACNC,MAAM;YACR;YACA;gBACED,MAAM;gBACNC,MAAM;YACR;YACA;gBACED,MAAM;gBACNC,MAAM;YACR;SACD;QACDU,QAAQ;YACNC,QAAQ;YACRC,UAAU;QACZ;IACF,CAAA,EAAE"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { allProviderBlocks } from '../ai/providers/blocks/index.js';
|
|
2
|
+
import { invalidateProviderCache } from '../ai/providers/registry.js';
|
|
2
3
|
export const AIProvidersGlobal = {
|
|
3
4
|
slug: 'ai-providers',
|
|
4
5
|
access: {
|
|
@@ -49,7 +50,7 @@ export const AIProvidersGlobal = {
|
|
|
49
50
|
type: 'text',
|
|
50
51
|
admin: {
|
|
51
52
|
components: {
|
|
52
|
-
Field: '@ai-stack/payloadcms/
|
|
53
|
+
Field: '@ai-stack/payloadcms/ui/DynamicProviderSelect/index.js#DynamicProviderSelect'
|
|
53
54
|
}
|
|
54
55
|
},
|
|
55
56
|
label: 'Default Provider'
|
|
@@ -59,21 +60,27 @@ export const AIProvidersGlobal = {
|
|
|
59
60
|
type: 'text',
|
|
60
61
|
admin: {
|
|
61
62
|
components: {
|
|
62
|
-
Field: '@ai-stack/payloadcms/
|
|
63
|
+
Field: '@ai-stack/payloadcms/ui/DynamicModelSelect/index.js#DynamicModelSelect'
|
|
63
64
|
}
|
|
64
65
|
},
|
|
65
66
|
label: 'Default Model'
|
|
66
67
|
},
|
|
67
68
|
{
|
|
68
|
-
name: '
|
|
69
|
+
name: 'providerOptions',
|
|
69
70
|
type: 'json',
|
|
70
71
|
admin: {
|
|
71
72
|
components: {
|
|
72
|
-
Field: '@ai-stack/payloadcms/
|
|
73
|
-
}
|
|
74
|
-
description: 'Default options for this model (global)'
|
|
73
|
+
Field: '@ai-stack/payloadcms/ui/GlobalProviderOptions/index.js#GlobalProviderOptions'
|
|
74
|
+
}
|
|
75
75
|
},
|
|
76
|
-
label: '
|
|
76
|
+
label: 'Provider Options'
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: 'schema',
|
|
80
|
+
type: 'json',
|
|
81
|
+
admin: {
|
|
82
|
+
hidden: true
|
|
83
|
+
}
|
|
77
84
|
}
|
|
78
85
|
],
|
|
79
86
|
label: ''
|
|
@@ -92,7 +99,7 @@ export const AIProvidersGlobal = {
|
|
|
92
99
|
type: 'text',
|
|
93
100
|
admin: {
|
|
94
101
|
components: {
|
|
95
|
-
Field: '@ai-stack/payloadcms/
|
|
102
|
+
Field: '@ai-stack/payloadcms/ui/DynamicProviderSelect/index.js#DynamicProviderSelect'
|
|
96
103
|
}
|
|
97
104
|
},
|
|
98
105
|
label: 'Default Provider'
|
|
@@ -102,21 +109,27 @@ export const AIProvidersGlobal = {
|
|
|
102
109
|
type: 'text',
|
|
103
110
|
admin: {
|
|
104
111
|
components: {
|
|
105
|
-
Field: '@ai-stack/payloadcms/
|
|
112
|
+
Field: '@ai-stack/payloadcms/ui/DynamicModelSelect/index.js#DynamicModelSelect'
|
|
106
113
|
}
|
|
107
114
|
},
|
|
108
115
|
label: 'Default Model'
|
|
109
116
|
},
|
|
110
117
|
{
|
|
111
|
-
name: '
|
|
118
|
+
name: 'providerOptions',
|
|
112
119
|
type: 'json',
|
|
113
120
|
admin: {
|
|
114
121
|
components: {
|
|
115
|
-
Field: '@ai-stack/payloadcms/
|
|
116
|
-
}
|
|
117
|
-
description: 'Default options for this model (global)'
|
|
122
|
+
Field: '@ai-stack/payloadcms/ui/GlobalProviderOptions/index.js#GlobalProviderOptions'
|
|
123
|
+
}
|
|
118
124
|
},
|
|
119
|
-
label: '
|
|
125
|
+
label: 'Provider Options'
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
name: 'schema',
|
|
129
|
+
type: 'json',
|
|
130
|
+
admin: {
|
|
131
|
+
hidden: true
|
|
132
|
+
}
|
|
120
133
|
}
|
|
121
134
|
],
|
|
122
135
|
label: ''
|
|
@@ -135,7 +148,7 @@ export const AIProvidersGlobal = {
|
|
|
135
148
|
type: 'text',
|
|
136
149
|
admin: {
|
|
137
150
|
components: {
|
|
138
|
-
Field: '@ai-stack/payloadcms/
|
|
151
|
+
Field: '@ai-stack/payloadcms/ui/DynamicProviderSelect/index.js#DynamicProviderSelect'
|
|
139
152
|
}
|
|
140
153
|
},
|
|
141
154
|
label: 'Default Provider'
|
|
@@ -145,7 +158,7 @@ export const AIProvidersGlobal = {
|
|
|
145
158
|
type: 'text',
|
|
146
159
|
admin: {
|
|
147
160
|
components: {
|
|
148
|
-
Field: '@ai-stack/payloadcms/
|
|
161
|
+
Field: '@ai-stack/payloadcms/ui/DynamicModelSelect/index.js#DynamicModelSelect'
|
|
149
162
|
}
|
|
150
163
|
},
|
|
151
164
|
label: 'Default Model'
|
|
@@ -155,21 +168,27 @@ export const AIProvidersGlobal = {
|
|
|
155
168
|
type: 'text',
|
|
156
169
|
admin: {
|
|
157
170
|
components: {
|
|
158
|
-
Field: '@ai-stack/payloadcms/
|
|
171
|
+
Field: '@ai-stack/payloadcms/ui/DynamicVoiceSelect/index.js#DynamicVoiceSelect'
|
|
159
172
|
}
|
|
160
173
|
},
|
|
161
174
|
label: 'Default Voice'
|
|
162
175
|
},
|
|
163
176
|
{
|
|
164
|
-
name: '
|
|
177
|
+
name: 'providerOptions',
|
|
165
178
|
type: 'json',
|
|
166
179
|
admin: {
|
|
167
180
|
components: {
|
|
168
|
-
Field: '@ai-stack/payloadcms/
|
|
169
|
-
}
|
|
170
|
-
description: 'Default options for this model (global)'
|
|
181
|
+
Field: '@ai-stack/payloadcms/ui/GlobalProviderOptions/index.js#GlobalProviderOptions'
|
|
182
|
+
}
|
|
171
183
|
},
|
|
172
|
-
label: '
|
|
184
|
+
label: 'Provider Options'
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
name: 'schema',
|
|
188
|
+
type: 'json',
|
|
189
|
+
admin: {
|
|
190
|
+
hidden: true
|
|
191
|
+
}
|
|
173
192
|
}
|
|
174
193
|
],
|
|
175
194
|
label: ''
|
|
@@ -191,7 +210,7 @@ export const AIProvidersGlobal = {
|
|
|
191
210
|
type: 'text',
|
|
192
211
|
admin: {
|
|
193
212
|
components: {
|
|
194
|
-
Field: '@ai-stack/payloadcms/
|
|
213
|
+
Field: '@ai-stack/payloadcms/ui/DynamicProviderSelect/index.js#DynamicProviderSelect'
|
|
195
214
|
}
|
|
196
215
|
},
|
|
197
216
|
label: 'Default Provider'
|
|
@@ -201,21 +220,27 @@ export const AIProvidersGlobal = {
|
|
|
201
220
|
type: 'text',
|
|
202
221
|
admin: {
|
|
203
222
|
components: {
|
|
204
|
-
Field: '@ai-stack/payloadcms/
|
|
223
|
+
Field: '@ai-stack/payloadcms/ui/DynamicModelSelect/index.js#DynamicModelSelect'
|
|
205
224
|
}
|
|
206
225
|
},
|
|
207
226
|
label: 'Default Model'
|
|
208
227
|
},
|
|
209
228
|
{
|
|
210
|
-
name: '
|
|
229
|
+
name: 'providerOptions',
|
|
211
230
|
type: 'json',
|
|
212
231
|
admin: {
|
|
213
232
|
components: {
|
|
214
|
-
Field: '@ai-stack/payloadcms/
|
|
215
|
-
}
|
|
216
|
-
description: 'Default options for this model (global)'
|
|
233
|
+
Field: '@ai-stack/payloadcms/ui/GlobalProviderOptions/index.js#GlobalProviderOptions'
|
|
234
|
+
}
|
|
217
235
|
},
|
|
218
|
-
label: '
|
|
236
|
+
label: 'Provider Options'
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
name: 'schema',
|
|
240
|
+
type: 'json',
|
|
241
|
+
admin: {
|
|
242
|
+
hidden: true
|
|
243
|
+
}
|
|
219
244
|
}
|
|
220
245
|
],
|
|
221
246
|
label: ''
|
|
@@ -232,6 +257,8 @@ export const AIProvidersGlobal = {
|
|
|
232
257
|
hooks: {
|
|
233
258
|
afterChange: [
|
|
234
259
|
async ({ doc, req })=>{
|
|
260
|
+
// Immediately invalidate cached provider registry so new settings take effect
|
|
261
|
+
invalidateProviderCache();
|
|
235
262
|
if (doc.enabledCollections && doc.enabledCollections.length > 0) {
|
|
236
263
|
const { seedProperties } = await import('../utilities/seedProperties.js');
|
|
237
264
|
await seedProperties({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/collections/AIProviders.ts"],"sourcesContent":["import type { GlobalConfig } from 'payload'\n\nimport { allProviderBlocks } from '../ai/providers/blocks/index.js'\n\nexport const AIProvidersGlobal: GlobalConfig = {\n slug: 'ai-providers',\n access: {\n read: ({ req }) => !!req.user,\n update: ({ req }) => !!req.user,\n },\n admin: {\n description: 'Connect your providers and choose the default models used across your project.',\n group: false,\n },\n fields: [\n {\n name: 'providers',\n type: 'blocks',\n admin: {\n description:\n 'Add one or more providers and set their credentials and settings. You can keep multiple providers and switch defaults below.',\n initCollapsed: true,\n },\n blocks: allProviderBlocks,\n label: 'AI Providers',\n required: true,\n },\n {\n name: 'enabledCollections',\n type: 'json',\n admin: {\n hidden: true,\n },\n },\n {\n name: 'defaults',\n type: 'group',\n admin: {\n description:\n 'Pick the default provider and model for each feature. These defaults are used unless a collection or field overrides them.',\n },\n fields: [\n {\n type: 'tabs',\n tabs: [\n {\n fields: [\n {\n name: 'text',\n type: 'group',\n fields: [\n {\n name: 'provider',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicProviderSelect',\n },\n },\n label: 'Default Provider',\n },\n {\n name: 'model',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicModelSelect',\n },\n },\n label: 'Default Model',\n },\n {\n name: 'options',\n type: 'json',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#ProviderOptionsEditor',\n },\n description: 'Default options for this model (global)',\n },\n label: 'Global Model Options',\n },\n ],\n label: '',\n },\n ],\n label: 'Text Generation',\n },\n {\n fields: [\n {\n name: 'image',\n type: 'group',\n fields: [\n {\n name: 'provider',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicProviderSelect',\n },\n },\n label: 'Default Provider',\n },\n {\n name: 'model',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicModelSelect',\n },\n },\n label: 'Default Model',\n },\n {\n name: 'options',\n type: 'json',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#ProviderOptionsEditor',\n },\n description: 'Default options for this model (global)',\n },\n label: 'Global Model Options',\n },\n ],\n label: '',\n },\n ],\n label: 'Image Generation',\n },\n {\n fields: [\n {\n name: 'tts',\n type: 'group',\n fields: [\n {\n name: 'provider',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicProviderSelect',\n },\n },\n label: 'Default Provider',\n },\n {\n name: 'model',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicModelSelect',\n },\n },\n label: 'Default Model',\n },\n {\n name: 'voice',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicVoiceSelect',\n },\n },\n label: 'Default Voice',\n },\n {\n name: 'options',\n type: 'json',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#ProviderOptionsEditor',\n },\n description: 'Default options for this model (global)',\n },\n label: 'Global Model Options',\n },\n ],\n label: '',\n },\n ],\n label: 'Speech Generation',\n },\n {\n admin: {\n disabled: true,\n },\n fields: [\n {\n name: 'video',\n type: 'group',\n fields: [\n {\n name: 'provider',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicProviderSelect',\n },\n },\n label: 'Default Provider',\n },\n {\n name: 'model',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#DynamicModelSelect',\n },\n },\n label: 'Default Model',\n },\n {\n name: 'options',\n type: 'json',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/client#ProviderOptionsEditor',\n },\n description: 'Default options for this model (global)',\n },\n label: 'Global Model Options',\n },\n ],\n label: '',\n },\n ],\n label: 'Video Generation',\n },\n ],\n },\n ],\n label: 'Default Models',\n },\n ],\n hooks: {\n afterChange: [\n async ({ doc, req }) => {\n if (doc.enabledCollections && doc.enabledCollections.length > 0) {\n const { seedProperties } = await import('../utilities/seedProperties.js')\n await seedProperties({\n enabledCollections: doc.enabledCollections,\n req,\n })\n }\n return doc\n },\n ],\n afterRead: [\n async ({ context, doc, req }) => {\n if (!req.payload.secret) {\n return doc\n }\n\n const { decrypt } = await import('../utilities/encryption.js')\n\n if (doc.providers) {\n doc.providers = doc.providers.map((provider: any) => {\n if (provider.apiKey) {\n if (context.unsafe) {\n // Internal use: decrypt\n provider.apiKey = decrypt(provider.apiKey, req.payload.secret)\n } else {\n // Admin UI: mask\n // We can't easily check if it's valid without decrypting, but for UI we just show mask\n // If we want to show \"present\", we can return a mask\n provider.apiKey = 'sk-****' + provider.apiKey.slice(-4)\n }\n }\n return provider\n })\n }\n return doc\n },\n ],\n beforeChange: [\n async ({ data, originalDoc, req }) => {\n if (!req.payload.secret) {\n return data\n }\n\n const { encrypt } = await import('../utilities/encryption.js')\n\n // Iterate over providers and encrypt API keys\n if (data.providers) {\n data.providers = data.providers.map((provider: any) => {\n if (provider.apiKey) {\n const originalProvider = originalDoc?.providers?.find(\n (p: any) => p.id === provider.id,\n )\n\n // If the key strictly equals the existing one (e.g. partial update merge), do nothing.\n // This prevents re-encrypting an already encrypted key.\n if (originalProvider?.apiKey && provider.apiKey === originalProvider.apiKey) {\n return provider\n }\n\n // If it looks like a masked key, don't re-encrypt (it means it wasn't changed via UI)\n if (provider.apiKey.startsWith('sk-') && provider.apiKey.includes('****')) {\n // Restore the original encrypted key from originalDoc\n if (originalProvider?.apiKey) {\n provider.apiKey = originalProvider.apiKey\n }\n } else {\n // Encrypt new key\n provider.apiKey = encrypt(provider.apiKey, req.payload.secret)\n }\n }\n return provider\n })\n }\n return data\n },\n ],\n },\n label: 'AI Providers',\n}\n"],"names":["allProviderBlocks","AIProvidersGlobal","slug","access","read","req","user","update","admin","description","group","fields","name","type","initCollapsed","blocks","label","required","hidden","tabs","components","Field","disabled","hooks","afterChange","doc","enabledCollections","length","seedProperties","afterRead","context","payload","secret","decrypt","providers","map","provider","apiKey","unsafe","slice","beforeChange","data","originalDoc","encrypt","originalProvider","find","p","id","startsWith","includes"],"mappings":"AAEA,SAASA,iBAAiB,QAAQ,kCAAiC;AAEnE,OAAO,MAAMC,oBAAkC;IAC7CC,MAAM;IACNC,QAAQ;QACNC,MAAM,CAAC,EAAEC,GAAG,EAAE,GAAK,CAAC,CAACA,IAAIC,IAAI;QAC7BC,QAAQ,CAAC,EAAEF,GAAG,EAAE,GAAK,CAAC,CAACA,IAAIC,IAAI;IACjC;IACAE,OAAO;QACLC,aAAa;QACbC,OAAO;IACT;IACAC,QAAQ;QACN;YACEC,MAAM;YACNC,MAAM;YACNL,OAAO;gBACLC,aACE;gBACFK,eAAe;YACjB;YACAC,QAAQf;YACRgB,OAAO;YACPC,UAAU;QACZ;QACA;YACEL,MAAM;YACNC,MAAM;YACNL,OAAO;gBACLU,QAAQ;YACV;QACF;QACA;YACEN,MAAM;YACNC,MAAM;YACNL,OAAO;gBACLC,aACE;YACJ;YACAE,QAAQ;gBACN;oBACEE,MAAM;oBACNM,MAAM;wBACJ;4BACER,QAAQ;gCACN;oCACEC,MAAM;oCACNC,MAAM;oCACNF,QAAQ;wCACN;4CACEC,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEJ,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEJ,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;gDACAZ,aAAa;4CACf;4CACAO,OAAO;wCACT;qCACD;oCACDA,OAAO;gCACT;6BACD;4BACDA,OAAO;wBACT;wBACA;4BACEL,QAAQ;gCACN;oCACEC,MAAM;oCACNC,MAAM;oCACNF,QAAQ;wCACN;4CACEC,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEJ,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEJ,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;gDACAZ,aAAa;4CACf;4CACAO,OAAO;wCACT;qCACD;oCACDA,OAAO;gCACT;6BACD;4BACDA,OAAO;wBACT;wBACA;4BACEL,QAAQ;gCACN;oCACEC,MAAM;oCACNC,MAAM;oCACNF,QAAQ;wCACN;4CACEC,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEJ,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEJ,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEJ,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;gDACAZ,aAAa;4CACf;4CACAO,OAAO;wCACT;qCACD;oCACDA,OAAO;gCACT;6BACD;4BACDA,OAAO;wBACT;wBACA;4BACER,OAAO;gCACLc,UAAU;4BACZ;4BACAX,QAAQ;gCACN;oCACEC,MAAM;oCACNC,MAAM;oCACNF,QAAQ;wCACN;4CACEC,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEJ,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEJ,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;gDACAZ,aAAa;4CACf;4CACAO,OAAO;wCACT;qCACD;oCACDA,OAAO;gCACT;6BACD;4BACDA,OAAO;wBACT;qBACD;gBACH;aACD;YACDA,OAAO;QACT;KACD;IACDO,OAAO;QACLC,aAAa;YACX,OAAO,EAAEC,GAAG,EAAEpB,GAAG,EAAE;gBACjB,IAAIoB,IAAIC,kBAAkB,IAAID,IAAIC,kBAAkB,CAACC,MAAM,GAAG,GAAG;oBAC/D,MAAM,EAAEC,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC;oBACxC,MAAMA,eAAe;wBACnBF,oBAAoBD,IAAIC,kBAAkB;wBAC1CrB;oBACF;gBACF;gBACA,OAAOoB;YACT;SACD;QACDI,WAAW;YACT,OAAO,EAAEC,OAAO,EAAEL,GAAG,EAAEpB,GAAG,EAAE;gBAC1B,IAAI,CAACA,IAAI0B,OAAO,CAACC,MAAM,EAAE;oBACvB,OAAOP;gBACT;gBAEA,MAAM,EAAEQ,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC;gBAEjC,IAAIR,IAAIS,SAAS,EAAE;oBACjBT,IAAIS,SAAS,GAAGT,IAAIS,SAAS,CAACC,GAAG,CAAC,CAACC;wBACjC,IAAIA,SAASC,MAAM,EAAE;4BACnB,IAAIP,QAAQQ,MAAM,EAAE;gCAClB,wBAAwB;gCACxBF,SAASC,MAAM,GAAGJ,QAAQG,SAASC,MAAM,EAAEhC,IAAI0B,OAAO,CAACC,MAAM;4BAC/D,OAAO;gCACL,iBAAiB;gCACjB,uFAAuF;gCACvF,qDAAqD;gCACrDI,SAASC,MAAM,GAAG,YAAYD,SAASC,MAAM,CAACE,KAAK,CAAC,CAAC;4BACvD;wBACF;wBACA,OAAOH;oBACT;gBACF;gBACA,OAAOX;YACT;SACD;QACDe,cAAc;YACZ,OAAO,EAAEC,IAAI,EAAEC,WAAW,EAAErC,GAAG,EAAE;gBAC/B,IAAI,CAACA,IAAI0B,OAAO,CAACC,MAAM,EAAE;oBACvB,OAAOS;gBACT;gBAEA,MAAM,EAAEE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC;gBAEjC,8CAA8C;gBAC9C,IAAIF,KAAKP,SAAS,EAAE;oBAClBO,KAAKP,SAAS,GAAGO,KAAKP,SAAS,CAACC,GAAG,CAAC,CAACC;wBACnC,IAAIA,SAASC,MAAM,EAAE;4BACnB,MAAMO,mBAAmBF,aAAaR,WAAWW,KAC/C,CAACC,IAAWA,EAAEC,EAAE,KAAKX,SAASW,EAAE;4BAGlC,uFAAuF;4BACvF,wDAAwD;4BACxD,IAAIH,kBAAkBP,UAAUD,SAASC,MAAM,KAAKO,iBAAiBP,MAAM,EAAE;gCAC3E,OAAOD;4BACT;4BAEA,sFAAsF;4BACtF,IAAIA,SAASC,MAAM,CAACW,UAAU,CAAC,UAAUZ,SAASC,MAAM,CAACY,QAAQ,CAAC,SAAS;gCACzE,sDAAsD;gCACtD,IAAIL,kBAAkBP,QAAQ;oCAC5BD,SAASC,MAAM,GAAGO,iBAAiBP,MAAM;gCAC3C;4BACF,OAAO;gCACL,kBAAkB;gCAClBD,SAASC,MAAM,GAAGM,QAAQP,SAASC,MAAM,EAAEhC,IAAI0B,OAAO,CAACC,MAAM;4BAC/D;wBACF;wBACA,OAAOI;oBACT;gBACF;gBACA,OAAOK;YACT;SACD;IACH;IACAzB,OAAO;AACT,EAAC"}
|
|
1
|
+
{"version":3,"sources":["../../src/collections/AIProviders.ts"],"sourcesContent":["import type { GlobalConfig } from 'payload'\n\nimport { allProviderBlocks } from '../ai/providers/blocks/index.js'\nimport { invalidateProviderCache } from '../ai/providers/registry.js'\n\nexport const AIProvidersGlobal: GlobalConfig = {\n slug: 'ai-providers',\n access: {\n read: ({ req }) => !!req.user,\n update: ({ req }) => !!req.user,\n },\n admin: {\n description: 'Connect your providers and choose the default models used across your project.',\n group: false,\n },\n fields: [\n {\n name: 'providers',\n type: 'blocks',\n admin: {\n description:\n 'Add one or more providers and set their credentials and settings. You can keep multiple providers and switch defaults below.',\n initCollapsed: true,\n },\n blocks: allProviderBlocks,\n label: 'AI Providers',\n required: true,\n },\n {\n name: 'enabledCollections',\n type: 'json',\n admin: {\n hidden: true,\n },\n },\n {\n name: 'defaults',\n type: 'group',\n admin: {\n description:\n 'Pick the default provider and model for each feature. These defaults are used unless a collection or field overrides them.',\n },\n fields: [\n {\n type: 'tabs',\n tabs: [\n {\n fields: [\n {\n name: 'text',\n type: 'group',\n fields: [\n {\n name: 'provider',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/ui/DynamicProviderSelect/index.js#DynamicProviderSelect',\n },\n },\n label: 'Default Provider',\n },\n {\n name: 'model',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/ui/DynamicModelSelect/index.js#DynamicModelSelect',\n },\n },\n label: 'Default Model',\n },\n {\n name: 'providerOptions',\n type: 'json',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/ui/GlobalProviderOptions/index.js#GlobalProviderOptions',\n },\n },\n label: 'Provider Options',\n },\n {\n name: 'schema',\n type: 'json',\n admin: {\n hidden: true,\n },\n },\n ],\n label: '',\n },\n ],\n label: 'Text Generation',\n },\n {\n fields: [\n {\n name: 'image',\n type: 'group',\n fields: [\n {\n name: 'provider',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/ui/DynamicProviderSelect/index.js#DynamicProviderSelect',\n },\n },\n label: 'Default Provider',\n },\n {\n name: 'model',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/ui/DynamicModelSelect/index.js#DynamicModelSelect',\n },\n },\n label: 'Default Model',\n },\n {\n name: 'providerOptions',\n type: 'json',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/ui/GlobalProviderOptions/index.js#GlobalProviderOptions',\n },\n },\n label: 'Provider Options',\n },\n {\n name: 'schema',\n type: 'json',\n admin: {\n hidden: true,\n },\n },\n ],\n label: '',\n },\n ],\n label: 'Image Generation',\n },\n {\n fields: [\n {\n name: 'tts',\n type: 'group',\n fields: [\n {\n name: 'provider',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/ui/DynamicProviderSelect/index.js#DynamicProviderSelect',\n },\n },\n label: 'Default Provider',\n },\n {\n name: 'model',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/ui/DynamicModelSelect/index.js#DynamicModelSelect',\n },\n },\n label: 'Default Model',\n },\n {\n name: 'voice',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/ui/DynamicVoiceSelect/index.js#DynamicVoiceSelect',\n },\n },\n label: 'Default Voice',\n },\n {\n name: 'providerOptions',\n type: 'json',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/ui/GlobalProviderOptions/index.js#GlobalProviderOptions',\n },\n },\n label: 'Provider Options',\n },\n {\n name: 'schema',\n type: 'json',\n admin: {\n hidden: true,\n },\n },\n ],\n label: '',\n },\n ],\n label: 'Speech Generation',\n },\n {\n admin: {\n disabled: true,\n },\n fields: [\n {\n name: 'video',\n type: 'group',\n fields: [\n {\n name: 'provider',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/ui/DynamicProviderSelect/index.js#DynamicProviderSelect',\n },\n },\n label: 'Default Provider',\n },\n {\n name: 'model',\n type: 'text',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/ui/DynamicModelSelect/index.js#DynamicModelSelect',\n },\n },\n label: 'Default Model',\n },\n {\n name: 'providerOptions',\n type: 'json',\n admin: {\n components: {\n Field: '@ai-stack/payloadcms/ui/GlobalProviderOptions/index.js#GlobalProviderOptions',\n },\n },\n label: 'Provider Options',\n },\n {\n name: 'schema',\n type: 'json',\n admin: {\n hidden: true,\n },\n },\n ],\n label: '',\n },\n ],\n label: 'Video Generation',\n },\n ],\n },\n ],\n label: 'Default Models',\n },\n ],\n hooks: {\n afterChange: [\n async ({ doc, req }) => {\n // Immediately invalidate cached provider registry so new settings take effect\n invalidateProviderCache()\n\n if (doc.enabledCollections && doc.enabledCollections.length > 0) {\n const { seedProperties } = await import('../utilities/seedProperties.js')\n await seedProperties({\n enabledCollections: doc.enabledCollections,\n req,\n })\n }\n return doc\n },\n ],\n afterRead: [\n async ({ context, doc, req }) => {\n if (!req.payload.secret) {\n return doc\n }\n\n const { decrypt } = await import('../utilities/encryption.js')\n\n if (doc.providers) {\n doc.providers = doc.providers.map((provider: any) => {\n if (provider.apiKey) {\n if (context.unsafe) {\n // Internal use: decrypt\n provider.apiKey = decrypt(provider.apiKey, req.payload.secret)\n } else {\n // Admin UI: mask\n // We can't easily check if it's valid without decrypting, but for UI we just show mask\n // If we want to show \"present\", we can return a mask\n provider.apiKey = 'sk-****' + provider.apiKey.slice(-4)\n }\n }\n return provider\n })\n }\n return doc\n },\n ],\n beforeChange: [\n async ({ data, originalDoc, req }) => {\n if (!req.payload.secret) {\n return data\n }\n\n const { encrypt } = await import('../utilities/encryption.js')\n\n // Iterate over providers and encrypt API keys\n if (data.providers) {\n data.providers = data.providers.map((provider: any) => {\n if (provider.apiKey) {\n const originalProvider = originalDoc?.providers?.find(\n (p: any) => p.id === provider.id,\n )\n\n // If the key strictly equals the existing one (e.g. partial update merge), do nothing.\n // This prevents re-encrypting an already encrypted key.\n if (originalProvider?.apiKey && provider.apiKey === originalProvider.apiKey) {\n return provider\n }\n\n // If it looks like a masked key, don't re-encrypt (it means it wasn't changed via UI)\n if (provider.apiKey.startsWith('sk-') && provider.apiKey.includes('****')) {\n // Restore the original encrypted key from originalDoc\n if (originalProvider?.apiKey) {\n provider.apiKey = originalProvider.apiKey\n }\n } else {\n // Encrypt new key\n provider.apiKey = encrypt(provider.apiKey, req.payload.secret)\n }\n }\n return provider\n })\n }\n return data\n },\n ],\n },\n label: 'AI Providers',\n}\n"],"names":["allProviderBlocks","invalidateProviderCache","AIProvidersGlobal","slug","access","read","req","user","update","admin","description","group","fields","name","type","initCollapsed","blocks","label","required","hidden","tabs","components","Field","disabled","hooks","afterChange","doc","enabledCollections","length","seedProperties","afterRead","context","payload","secret","decrypt","providers","map","provider","apiKey","unsafe","slice","beforeChange","data","originalDoc","encrypt","originalProvider","find","p","id","startsWith","includes"],"mappings":"AAEA,SAASA,iBAAiB,QAAQ,kCAAiC;AACnE,SAASC,uBAAuB,QAAQ,8BAA6B;AAErE,OAAO,MAAMC,oBAAkC;IAC7CC,MAAM;IACNC,QAAQ;QACNC,MAAM,CAAC,EAAEC,GAAG,EAAE,GAAK,CAAC,CAACA,IAAIC,IAAI;QAC7BC,QAAQ,CAAC,EAAEF,GAAG,EAAE,GAAK,CAAC,CAACA,IAAIC,IAAI;IACjC;IACAE,OAAO;QACLC,aAAa;QACbC,OAAO;IACT;IACAC,QAAQ;QACN;YACEC,MAAM;YACNC,MAAM;YACNL,OAAO;gBACLC,aACE;gBACFK,eAAe;YACjB;YACAC,QAAQhB;YACRiB,OAAO;YACPC,UAAU;QACZ;QACA;YACEL,MAAM;YACNC,MAAM;YACNL,OAAO;gBACLU,QAAQ;YACV;QACF;QACA;YACEN,MAAM;YACNC,MAAM;YACNL,OAAO;gBACLC,aACE;YACJ;YACAE,QAAQ;gBACN;oBACEE,MAAM;oBACNM,MAAM;wBACJ;4BACER,QAAQ;gCACN;oCACEC,MAAM;oCACNC,MAAM;oCACNF,QAAQ;wCACN;4CACEC,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEJ,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEJ,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEJ,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLU,QAAQ;4CACV;wCACF;qCACD;oCACDF,OAAO;gCACT;6BACD;4BACDA,OAAO;wBACT;wBACA;4BACEL,QAAQ;gCACN;oCACEC,MAAM;oCACNC,MAAM;oCACNF,QAAQ;wCACN;4CACEC,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEJ,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEJ,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEJ,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLU,QAAQ;4CACV;wCACF;qCACD;oCACDF,OAAO;gCACT;6BACD;4BACDA,OAAO;wBACT;wBACA;4BACEL,QAAQ;gCACN;oCACEC,MAAM;oCACNC,MAAM;oCACNF,QAAQ;wCACN;4CACEC,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEJ,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEJ,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEJ,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEJ,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLU,QAAQ;4CACV;wCACF;qCACD;oCACDF,OAAO;gCACT;6BACD;4BACDA,OAAO;wBACT;wBACA;4BACER,OAAO;gCACLc,UAAU;4BACZ;4BACAX,QAAQ;gCACN;oCACEC,MAAM;oCACNC,MAAM;oCACNF,QAAQ;wCACN;4CACEC,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEJ,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEJ,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLY,YAAY;oDACVC,OAAO;gDACT;4CACF;4CACAL,OAAO;wCACT;wCACA;4CACEJ,MAAM;4CACNC,MAAM;4CACNL,OAAO;gDACLU,QAAQ;4CACV;wCACF;qCACD;oCACDF,OAAO;gCACT;6BACD;4BACDA,OAAO;wBACT;qBACD;gBACH;aACD;YACDA,OAAO;QACT;KACD;IACDO,OAAO;QACLC,aAAa;YACX,OAAO,EAAEC,GAAG,EAAEpB,GAAG,EAAE;gBACjB,8EAA8E;gBAC9EL;gBAEA,IAAIyB,IAAIC,kBAAkB,IAAID,IAAIC,kBAAkB,CAACC,MAAM,GAAG,GAAG;oBAC/D,MAAM,EAAEC,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC;oBACxC,MAAMA,eAAe;wBACnBF,oBAAoBD,IAAIC,kBAAkB;wBAC1CrB;oBACF;gBACF;gBACA,OAAOoB;YACT;SACD;QACDI,WAAW;YACT,OAAO,EAAEC,OAAO,EAAEL,GAAG,EAAEpB,GAAG,EAAE;gBAC1B,IAAI,CAACA,IAAI0B,OAAO,CAACC,MAAM,EAAE;oBACvB,OAAOP;gBACT;gBAEA,MAAM,EAAEQ,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC;gBAEjC,IAAIR,IAAIS,SAAS,EAAE;oBACjBT,IAAIS,SAAS,GAAGT,IAAIS,SAAS,CAACC,GAAG,CAAC,CAACC;wBACjC,IAAIA,SAASC,MAAM,EAAE;4BACnB,IAAIP,QAAQQ,MAAM,EAAE;gCAClB,wBAAwB;gCACxBF,SAASC,MAAM,GAAGJ,QAAQG,SAASC,MAAM,EAAEhC,IAAI0B,OAAO,CAACC,MAAM;4BAC/D,OAAO;gCACL,iBAAiB;gCACjB,uFAAuF;gCACvF,qDAAqD;gCACrDI,SAASC,MAAM,GAAG,YAAYD,SAASC,MAAM,CAACE,KAAK,CAAC,CAAC;4BACvD;wBACF;wBACA,OAAOH;oBACT;gBACF;gBACA,OAAOX;YACT;SACD;QACDe,cAAc;YACZ,OAAO,EAAEC,IAAI,EAAEC,WAAW,EAAErC,GAAG,EAAE;gBAC/B,IAAI,CAACA,IAAI0B,OAAO,CAACC,MAAM,EAAE;oBACvB,OAAOS;gBACT;gBAEA,MAAM,EAAEE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC;gBAEjC,8CAA8C;gBAC9C,IAAIF,KAAKP,SAAS,EAAE;oBAClBO,KAAKP,SAAS,GAAGO,KAAKP,SAAS,CAACC,GAAG,CAAC,CAACC;wBACnC,IAAIA,SAASC,MAAM,EAAE;4BACnB,MAAMO,mBAAmBF,aAAaR,WAAWW,KAC/C,CAACC,IAAWA,EAAEC,EAAE,KAAKX,SAASW,EAAE;4BAGlC,uFAAuF;4BACvF,wDAAwD;4BACxD,IAAIH,kBAAkBP,UAAUD,SAASC,MAAM,KAAKO,iBAAiBP,MAAM,EAAE;gCAC3E,OAAOD;4BACT;4BAEA,sFAAsF;4BACtF,IAAIA,SAASC,MAAM,CAACW,UAAU,CAAC,UAAUZ,SAASC,MAAM,CAACY,QAAQ,CAAC,SAAS;gCACzE,sDAAsD;gCACtD,IAAIL,kBAAkBP,QAAQ;oCAC5BD,SAASC,MAAM,GAAGO,iBAAiBP,MAAM;gCAC3C;4BACF,OAAO;gCACL,kBAAkB;gCAClBD,SAASC,MAAM,GAAGM,QAAQP,SAASC,MAAM,EAAEhC,IAAI0B,OAAO,CAACC,MAAM;4BAC/D;wBACF;wBACA,OAAOI;oBACT;gBACF;gBACA,OAAOK;YACT;SACD;IACH;IACAzB,OAAO;AACT,EAAC"}
|