@ai-stack/payloadcms 3.2.24-beta → 3.68.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/{LICENSE.md → LICENSE} +1 -1
- package/README.md +218 -229
- package/dist/access/checkAccess.d.ts +4 -0
- package/dist/access/checkAccess.js +20 -0
- package/dist/access/checkAccess.js.map +1 -0
- package/dist/ai/core/generateObject.d.ts +7 -0
- package/dist/ai/core/generateObject.js +35 -0
- package/dist/ai/core/generateObject.js.map +1 -0
- package/dist/ai/core/generateText.d.ts +7 -0
- package/dist/ai/core/generateText.js +31 -0
- package/dist/ai/core/generateText.js.map +1 -0
- package/dist/ai/core/index.d.ts +11 -0
- package/dist/ai/core/index.js +10 -0
- package/dist/ai/core/index.js.map +1 -0
- package/dist/ai/core/media/generateMedia.d.ts +7 -0
- package/dist/ai/core/media/generateMedia.js +50 -0
- package/dist/ai/core/media/generateMedia.js.map +1 -0
- package/dist/ai/core/media/image/generateImage.d.ts +6 -0
- package/dist/ai/core/media/image/generateImage.js +41 -0
- package/dist/ai/core/media/image/generateImage.js.map +1 -0
- package/dist/ai/core/media/image/handlers/multimodal.d.ts +7 -0
- package/dist/ai/core/media/image/handlers/multimodal.js +95 -0
- package/dist/ai/core/media/image/handlers/multimodal.js.map +1 -0
- package/dist/ai/core/media/image/handlers/standard.d.ts +7 -0
- package/dist/ai/core/media/image/handlers/standard.js +28 -0
- package/dist/ai/core/media/image/handlers/standard.js.map +1 -0
- package/dist/ai/core/media/image/index.d.ts +2 -0
- package/dist/ai/core/media/image/index.js +3 -0
- package/dist/ai/core/media/image/index.js.map +1 -0
- package/dist/ai/core/media/index.d.ts +2 -0
- package/dist/ai/core/media/index.js +3 -0
- package/dist/ai/core/media/index.js.map +1 -0
- package/dist/ai/core/media/speech/generateSpeech.d.ts +5 -0
- package/dist/ai/core/media/speech/generateSpeech.js +55 -0
- package/dist/ai/core/media/speech/generateSpeech.js.map +1 -0
- package/dist/ai/core/media/speech/index.d.ts +2 -0
- package/dist/ai/core/media/speech/index.js +3 -0
- package/dist/ai/core/media/speech/index.js.map +1 -0
- package/dist/ai/core/media/types.d.ts +74 -0
- package/dist/ai/core/media/types.js +5 -0
- package/dist/ai/core/media/types.js.map +1 -0
- package/dist/ai/core/media/utils.d.ts +11 -0
- package/dist/ai/core/media/utils.js +34 -0
- package/dist/ai/core/media/utils.js.map +1 -0
- package/dist/ai/core/media/video/generateVideo.d.ts +6 -0
- package/dist/ai/core/media/video/generateVideo.js +32 -0
- package/dist/ai/core/media/video/generateVideo.js.map +1 -0
- package/dist/ai/core/media/video/index.d.ts +2 -0
- package/dist/ai/core/media/video/index.js +3 -0
- package/dist/ai/core/media/video/index.js.map +1 -0
- package/dist/ai/core/streamObject.d.ts +7 -0
- package/dist/ai/core/streamObject.js +57 -0
- package/dist/ai/core/streamObject.js.map +1 -0
- package/dist/ai/core/streamText.d.ts +7 -0
- package/dist/ai/core/streamText.js +30 -0
- package/dist/ai/core/streamText.js.map +1 -0
- package/dist/ai/core/types.d.ts +85 -0
- package/dist/ai/core/types.js +5 -0
- package/dist/ai/core/types.js.map +1 -0
- package/dist/ai/index.d.ts +11 -0
- package/dist/ai/index.js +25 -0
- package/dist/ai/index.js.map +1 -0
- package/dist/ai/providers/blocks/anthropic.d.ts +2 -0
- package/dist/ai/providers/blocks/anthropic.js +222 -0
- package/dist/ai/providers/blocks/anthropic.js.map +1 -0
- package/dist/ai/providers/blocks/elevenlabs.d.ts +2 -0
- package/dist/ai/providers/blocks/elevenlabs.js +448 -0
- package/dist/ai/providers/blocks/elevenlabs.js.map +1 -0
- package/dist/ai/providers/blocks/fal.d.ts +2 -0
- package/dist/ai/providers/blocks/fal.js +311 -0
- package/dist/ai/providers/blocks/fal.js.map +1 -0
- package/dist/ai/providers/blocks/google.d.ts +2 -0
- package/dist/ai/providers/blocks/google.js +622 -0
- package/dist/ai/providers/blocks/google.js.map +1 -0
- package/dist/ai/providers/blocks/index.d.ts +2 -0
- package/dist/ai/providers/blocks/index.js +18 -0
- package/dist/ai/providers/blocks/index.js.map +1 -0
- package/dist/ai/providers/blocks/openai-compatible.d.ts +2 -0
- package/dist/ai/providers/blocks/openai-compatible.js +307 -0
- package/dist/ai/providers/blocks/openai-compatible.js.map +1 -0
- package/dist/ai/providers/blocks/openai.d.ts +2 -0
- package/dist/ai/providers/blocks/openai.js +599 -0
- package/dist/ai/providers/blocks/openai.js.map +1 -0
- package/dist/ai/providers/blocks/xai.d.ts +2 -0
- package/dist/ai/providers/blocks/xai.js +246 -0
- package/dist/ai/providers/blocks/xai.js.map +1 -0
- package/dist/ai/providers/index.d.ts +2 -0
- package/dist/ai/providers/index.js +6 -0
- package/dist/ai/providers/index.js.map +1 -0
- package/dist/ai/providers/registry.d.ts +40 -0
- package/dist/ai/providers/registry.js +256 -0
- package/dist/ai/providers/registry.js.map +1 -0
- package/dist/ai/providers/types.d.ts +115 -0
- package/dist/ai/providers/types.js +4 -0
- package/dist/ai/providers/types.js.map +1 -0
- package/dist/ai/utils/systemGenerate.d.ts +1 -1
- package/dist/ai/utils/systemGenerate.js +19 -19
- package/dist/ai/utils/systemGenerate.js.map +1 -1
- package/dist/collections/AIJobs.d.ts +2 -0
- package/dist/collections/AIJobs.js +81 -0
- package/dist/collections/AIJobs.js.map +1 -0
- package/dist/collections/AISettings.d.ts +2 -0
- package/dist/collections/AISettings.js +279 -0
- package/dist/collections/AISettings.js.map +1 -0
- package/dist/collections/Instructions.js +185 -37
- package/dist/collections/Instructions.js.map +1 -1
- package/dist/defaults.d.ts +3 -0
- package/dist/defaults.js +3 -0
- package/dist/defaults.js.map +1 -1
- package/dist/endpoints/buildPromptUtils.d.ts +19 -0
- package/dist/endpoints/buildPromptUtils.js +114 -0
- package/dist/endpoints/buildPromptUtils.js.map +1 -0
- package/dist/endpoints/chat.d.js +3 -0
- package/dist/endpoints/chat.d.js.map +1 -0
- package/dist/endpoints/fetchVoices.d.ts +2 -0
- package/dist/endpoints/fetchVoices.js +79 -0
- package/dist/endpoints/fetchVoices.js.map +1 -0
- package/dist/endpoints/index.js +253 -214
- package/dist/endpoints/index.js.map +1 -1
- package/dist/exports/client.d.ts +9 -0
- package/dist/exports/client.js +9 -0
- package/dist/exports/client.js.map +1 -1
- package/dist/fields/ComposeField/ComposeField.js +2 -2
- package/dist/fields/ComposeField/ComposeField.js.map +1 -1
- package/dist/fields/ComposeField/ComposeField.jsx +2 -2
- package/dist/fields/PromptEditorField/PromptEditorField.js +155 -14
- package/dist/fields/PromptEditorField/PromptEditorField.js.map +1 -1
- package/dist/fields/PromptEditorField/PromptEditorField.jsx +118 -3
- package/dist/index.d.ts +1 -0
- package/dist/index.js.map +1 -1
- package/dist/init.js +35 -13
- package/dist/init.js.map +1 -1
- package/dist/payload-ai.d.js +3 -0
- package/dist/payload-ai.d.js.map +1 -0
- package/dist/plugin.js +80 -9
- package/dist/plugin.js.map +1 -1
- package/dist/providers/InstructionsProvider/InstructionsProvider.js +35 -7
- package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
- package/dist/providers/InstructionsProvider/InstructionsProvider.jsx +27 -4
- package/dist/providers/InstructionsProvider/context.d.ts +1 -0
- package/dist/providers/InstructionsProvider/context.js +1 -0
- package/dist/providers/InstructionsProvider/context.js.map +1 -1
- package/dist/providers/InstructionsProvider/useInstructions.js +13 -6
- package/dist/providers/InstructionsProvider/useInstructions.js.map +1 -1
- package/dist/types.d.ts +7 -7
- package/dist/types.js.map +1 -1
- package/dist/ui/AIConfigDashboard/index.d.ts +2 -0
- package/dist/ui/AIConfigDashboard/index.js +46 -0
- package/dist/ui/AIConfigDashboard/index.js.map +1 -0
- package/dist/ui/AIConfigDashboard/index.jsx +24 -0
- package/dist/ui/ApiKeyStatusIndicator/index.d.ts +6 -0
- package/dist/ui/ApiKeyStatusIndicator/index.js +39 -0
- package/dist/ui/ApiKeyStatusIndicator/index.js.map +1 -0
- package/dist/ui/ApiKeyStatusIndicator/index.jsx +29 -0
- package/dist/ui/Compose/Compose.d.ts +1 -2
- package/dist/ui/Compose/Compose.js +116 -90
- package/dist/ui/Compose/Compose.js.map +1 -1
- package/dist/ui/Compose/Compose.jsx +111 -101
- package/dist/ui/Compose/ComposePlaceholder.d.ts +7 -0
- package/dist/ui/Compose/ComposePlaceholder.js +78 -0
- package/dist/ui/Compose/ComposePlaceholder.js.map +1 -0
- package/dist/ui/Compose/ComposePlaceholder.jsx +66 -0
- package/dist/ui/Compose/UndoRedoActions.js +3 -1
- package/dist/ui/Compose/UndoRedoActions.js.map +1 -1
- package/dist/ui/Compose/UndoRedoActions.jsx +2 -1
- package/dist/ui/Compose/compose.module.css +1 -1
- package/dist/ui/Compose/hooks/menu/itemsMap.js +1 -1
- package/dist/ui/Compose/hooks/menu/itemsMap.js.map +1 -1
- package/dist/ui/Compose/hooks/menu/useMenu.d.ts +2 -1
- package/dist/ui/Compose/hooks/menu/useMenu.js +2 -2
- package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
- package/dist/ui/Compose/hooks/menu/useMenu.jsx +2 -2
- package/dist/ui/Compose/hooks/useActiveFieldTracking.js +69 -10
- package/dist/ui/Compose/hooks/useActiveFieldTracking.js.map +1 -1
- package/dist/ui/Compose/hooks/useGenerate.d.ts +3 -0
- package/dist/ui/Compose/hooks/useGenerate.js +71 -11
- package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
- package/dist/ui/Compose/hooks/useHistory.js +52 -5
- package/dist/ui/Compose/hooks/useHistory.js.map +1 -1
- package/dist/ui/DynamicModelSelect/index.d.ts +7 -0
- package/dist/ui/DynamicModelSelect/index.js +231 -0
- package/dist/ui/DynamicModelSelect/index.js.map +1 -0
- package/dist/ui/DynamicModelSelect/index.jsx +207 -0
- package/dist/ui/DynamicProviderSelect/index.d.ts +7 -0
- package/dist/ui/DynamicProviderSelect/index.js +101 -0
- package/dist/ui/DynamicProviderSelect/index.js.map +1 -0
- package/dist/ui/DynamicProviderSelect/index.jsx +90 -0
- package/dist/ui/DynamicVoiceSelect/index.d.ts +7 -0
- package/dist/ui/DynamicVoiceSelect/index.js +104 -0
- package/dist/ui/DynamicVoiceSelect/index.js.map +1 -0
- package/dist/ui/DynamicVoiceSelect/index.jsx +69 -0
- package/dist/ui/EncryptedTextField/index.d.ts +8 -0
- package/dist/ui/EncryptedTextField/index.js +74 -0
- package/dist/ui/EncryptedTextField/index.js.map +1 -0
- package/dist/ui/EncryptedTextField/index.jsx +35 -0
- package/dist/ui/Icons/LottieAnimation.js +3 -1
- package/dist/ui/Icons/LottieAnimation.js.map +1 -1
- package/dist/ui/Icons/LottieAnimation.jsx +2 -1
- package/dist/ui/ModelRowLabel/index.d.ts +6 -0
- package/dist/ui/ModelRowLabel/index.js +41 -0
- package/dist/ui/ModelRowLabel/index.js.map +1 -0
- package/dist/ui/ModelRowLabel/index.jsx +26 -0
- package/dist/ui/ProviderOptionsEditor/index.d.ts +7 -0
- package/dist/ui/ProviderOptionsEditor/index.js +291 -0
- package/dist/ui/ProviderOptionsEditor/index.js.map +1 -0
- package/dist/ui/ProviderOptionsEditor/index.jsx +210 -0
- package/dist/ui/VoicesFetcher/index.d.ts +7 -0
- package/dist/ui/VoicesFetcher/index.js +72 -0
- package/dist/ui/VoicesFetcher/index.js.map +1 -0
- package/dist/ui/VoicesFetcher/index.jsx +56 -0
- package/dist/utilities/encryption.d.ts +2 -0
- package/dist/utilities/encryption.js +47 -0
- package/dist/utilities/encryption.js.map +1 -0
- package/dist/utilities/extractImageData.d.ts +9 -0
- package/dist/utilities/extractImageData.js +12 -2
- package/dist/utilities/extractImageData.js.map +1 -1
- package/dist/utilities/fetchImages.d.ts +14 -0
- package/dist/utilities/fetchImages.js +38 -0
- package/dist/utilities/fetchImages.js.map +1 -0
- package/dist/utilities/fieldToJsonSchema.d.ts +2 -1
- package/dist/utilities/fieldToJsonSchema.js +66 -3
- package/dist/utilities/fieldToJsonSchema.js.map +1 -1
- package/dist/utilities/getFieldBySchemaPath.js +15 -0
- package/dist/utilities/getFieldBySchemaPath.js.map +1 -1
- package/dist/utilities/getProviderOptionsFields.d.ts +16 -0
- package/dist/utilities/getProviderOptionsFields.js +80 -0
- package/dist/utilities/getProviderOptionsFields.js.map +1 -0
- package/dist/utilities/isPluginActivated.js +1 -2
- package/dist/utilities/isPluginActivated.js.map +1 -1
- package/dist/utilities/lexicalToHTML.js.map +1 -1
- package/dist/utilities/resolveImageReferences.d.ts +28 -0
- package/dist/utilities/resolveImageReferences.js +148 -0
- package/dist/utilities/resolveImageReferences.js.map +1 -0
- package/dist/utilities/schemaConverter.d.ts +3 -0
- package/dist/utilities/schemaConverter.js +93 -0
- package/dist/utilities/schemaConverter.js.map +1 -0
- package/dist/utilities/setSafeLexicalState.d.ts +1 -3
- package/dist/utilities/setSafeLexicalState.js +1 -1
- package/dist/utilities/setSafeLexicalState.js.map +1 -1
- package/package.json +19 -21
- package/dist/ai/models/anthropic/index.d.ts +0 -2
- package/dist/ai/models/anthropic/index.js +0 -129
- package/dist/ai/models/anthropic/index.js.map +0 -1
- package/dist/ai/models/elevenLabs/generateVoice.d.ts +0 -8
- package/dist/ai/models/elevenLabs/generateVoice.js +0 -20
- package/dist/ai/models/elevenLabs/generateVoice.js.map +0 -1
- package/dist/ai/models/elevenLabs/index.d.ts +0 -2
- package/dist/ai/models/elevenLabs/index.js +0 -133
- package/dist/ai/models/elevenLabs/index.js.map +0 -1
- package/dist/ai/models/elevenLabs/voices.d.ts +0 -8
- package/dist/ai/models/elevenLabs/voices.js +0 -24
- package/dist/ai/models/elevenLabs/voices.js.map +0 -1
- package/dist/ai/models/generateObject.d.ts +0 -11
- package/dist/ai/models/generateObject.js +0 -22
- package/dist/ai/models/generateObject.js.map +0 -1
- package/dist/ai/models/google/generateImage.d.ts +0 -9
- package/dist/ai/models/google/generateImage.js +0 -27
- package/dist/ai/models/google/generateImage.js.map +0 -1
- package/dist/ai/models/google/index.d.ts +0 -2
- package/dist/ai/models/google/index.js +0 -201
- package/dist/ai/models/google/index.js.map +0 -1
- package/dist/ai/models/index.d.ts +0 -2
- package/dist/ai/models/index.js +0 -13
- package/dist/ai/models/index.js.map +0 -1
- package/dist/ai/models/openai/generateImage.d.ts +0 -5
- package/dist/ai/models/openai/generateImage.js +0 -31
- package/dist/ai/models/openai/generateImage.js.map +0 -1
- package/dist/ai/models/openai/generateVoice.d.ts +0 -6
- package/dist/ai/models/openai/generateVoice.js +0 -19
- package/dist/ai/models/openai/generateVoice.js.map +0 -1
- package/dist/ai/models/openai/index.d.ts +0 -2
- package/dist/ai/models/openai/index.js +0 -428
- package/dist/ai/models/openai/index.js.map +0 -1
- package/dist/ai/models/openai/openai.d.ts +0 -1
- package/dist/ai/models/openai/openai.js +0 -8
- package/dist/ai/models/openai/openai.js.map +0 -1
- package/dist/ai/utils/editImagesWithOpenAI.d.ts +0 -10
- package/dist/ai/utils/editImagesWithOpenAI.js +0 -37
- package/dist/ai/utils/editImagesWithOpenAI.js.map +0 -1
- package/dist/types.d.js +0 -3
- package/dist/types.d.js.map +0 -1
- package/dist/utilities/getGenerationModels.d.ts +0 -2
- package/dist/utilities/getGenerationModels.js +0 -10
- package/dist/utilities/getGenerationModels.js.map +0 -1
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useField } from '@payloadcms/ui';
|
|
4
|
+
import React, { useState } from 'react';
|
|
5
|
+
export const EncryptedTextField = ({ label, path, required })=>{
|
|
6
|
+
const { setValue, value } = useField({
|
|
7
|
+
path
|
|
8
|
+
});
|
|
9
|
+
const [isEditing, setIsEditing] = useState(!value);
|
|
10
|
+
const isMasked = typeof value === 'string' && value.startsWith('sk-') && value.includes('****');
|
|
11
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
12
|
+
className: "field-type text",
|
|
13
|
+
children: [
|
|
14
|
+
/*#__PURE__*/ _jsxs("label", {
|
|
15
|
+
className: "field-label",
|
|
16
|
+
children: [
|
|
17
|
+
label || 'API Key',
|
|
18
|
+
required && /*#__PURE__*/ _jsx("span", {
|
|
19
|
+
className: "required",
|
|
20
|
+
children: "*"
|
|
21
|
+
})
|
|
22
|
+
]
|
|
23
|
+
}),
|
|
24
|
+
!isEditing && isMasked ? /*#__PURE__*/ _jsxs("div", {
|
|
25
|
+
style: {
|
|
26
|
+
alignItems: 'center',
|
|
27
|
+
display: 'flex',
|
|
28
|
+
gap: '10px'
|
|
29
|
+
},
|
|
30
|
+
children: [
|
|
31
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
32
|
+
style: {
|
|
33
|
+
background: 'var(--theme-elevation-100)',
|
|
34
|
+
borderRadius: '4px',
|
|
35
|
+
flexGrow: 1,
|
|
36
|
+
fontFamily: 'monospace',
|
|
37
|
+
padding: '8px 12px'
|
|
38
|
+
},
|
|
39
|
+
children: [
|
|
40
|
+
value,
|
|
41
|
+
/*#__PURE__*/ _jsx("span", {
|
|
42
|
+
style: {
|
|
43
|
+
color: 'var(--theme-success-500)',
|
|
44
|
+
fontSize: '0.8em',
|
|
45
|
+
marginLeft: '10px'
|
|
46
|
+
},
|
|
47
|
+
children: "✓ Configured"
|
|
48
|
+
})
|
|
49
|
+
]
|
|
50
|
+
}),
|
|
51
|
+
/*#__PURE__*/ _jsx("button", {
|
|
52
|
+
className: "btn btn--style-secondary btn--size-small",
|
|
53
|
+
onClick: ()=>{
|
|
54
|
+
setValue('');
|
|
55
|
+
setIsEditing(true);
|
|
56
|
+
},
|
|
57
|
+
type: "button",
|
|
58
|
+
children: "Change"
|
|
59
|
+
})
|
|
60
|
+
]
|
|
61
|
+
}) : /*#__PURE__*/ _jsx("input", {
|
|
62
|
+
onChange: (e)=>setValue(e.target.value),
|
|
63
|
+
placeholder: "sk-...",
|
|
64
|
+
style: {
|
|
65
|
+
width: '100%'
|
|
66
|
+
},
|
|
67
|
+
type: "password",
|
|
68
|
+
value: value || ''
|
|
69
|
+
})
|
|
70
|
+
]
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ui/EncryptedTextField/index.tsx"],"sourcesContent":["'use client'\n\nimport { useField } from '@payloadcms/ui'\nimport React, { useState } from 'react'\n\ntype Props = {\n label?: string\n path: string\n required?: boolean\n}\n\nexport const EncryptedTextField: React.FC<Props> = ({ label, path, required }) => {\n const { setValue, value } = useField<string>({ path })\n const [isEditing, setIsEditing] = useState(!value)\n\n const isMasked = typeof value === 'string' && value.startsWith('sk-') && value.includes('****')\n\n return (\n <div className=\"field-type text\">\n <label className=\"field-label\">\n {label || 'API Key'}\n {required && <span className=\"required\">*</span>}\n </label>\n\n {!isEditing && isMasked ? (\n <div style={{ alignItems: 'center', display: 'flex', gap: '10px' }}>\n <div\n style={{\n background: 'var(--theme-elevation-100)',\n borderRadius: '4px',\n flexGrow: 1,\n fontFamily: 'monospace',\n padding: '8px 12px',\n }}\n >\n {value}\n <span\n style={{ color: 'var(--theme-success-500)', fontSize: '0.8em', marginLeft: '10px' }}\n >\n ✓ Configured\n </span>\n </div>\n <button\n className=\"btn btn--style-secondary btn--size-small\"\n onClick={() => {\n setValue('')\n setIsEditing(true)\n }}\n type=\"button\"\n >\n Change\n </button>\n </div>\n ) : (\n <input\n onChange={(e) => setValue(e.target.value)}\n placeholder=\"sk-...\"\n style={{ width: '100%' }}\n type=\"password\"\n value={value || ''}\n />\n )}\n </div>\n )\n}\n"],"names":["useField","React","useState","EncryptedTextField","label","path","required","setValue","value","isEditing","setIsEditing","isMasked","startsWith","includes","div","className","span","style","alignItems","display","gap","background","borderRadius","flexGrow","fontFamily","padding","color","fontSize","marginLeft","button","onClick","type","input","onChange","e","target","placeholder","width"],"mappings":"AAAA;;AAEA,SAASA,QAAQ,QAAQ,iBAAgB;AACzC,OAAOC,SAASC,QAAQ,QAAQ,QAAO;AAQvC,OAAO,MAAMC,qBAAsC,CAAC,EAAEC,KAAK,EAAEC,IAAI,EAAEC,QAAQ,EAAE;IAC3E,MAAM,EAAEC,QAAQ,EAAEC,KAAK,EAAE,GAAGR,SAAiB;QAAEK;IAAK;IACpD,MAAM,CAACI,WAAWC,aAAa,GAAGR,SAAS,CAACM;IAE5C,MAAMG,WAAW,OAAOH,UAAU,YAAYA,MAAMI,UAAU,CAAC,UAAUJ,MAAMK,QAAQ,CAAC;IAExF,qBACE,MAACC;QAAIC,WAAU;;0BACb,MAACX;gBAAMW,WAAU;;oBACdX,SAAS;oBACTE,0BAAY,KAACU;wBAAKD,WAAU;kCAAW;;;;YAGzC,CAACN,aAAaE,yBACb,MAACG;gBAAIG,OAAO;oBAAEC,YAAY;oBAAUC,SAAS;oBAAQC,KAAK;gBAAO;;kCAC/D,MAACN;wBACCG,OAAO;4BACLI,YAAY;4BACZC,cAAc;4BACdC,UAAU;4BACVC,YAAY;4BACZC,SAAS;wBACX;;4BAECjB;0CACD,KAACQ;gCACCC,OAAO;oCAAES,OAAO;oCAA4BC,UAAU;oCAASC,YAAY;gCAAO;0CACnF;;;;kCAIH,KAACC;wBACCd,WAAU;wBACVe,SAAS;4BACPvB,SAAS;4BACTG,aAAa;wBACf;wBACAqB,MAAK;kCACN;;;+BAKH,KAACC;gBACCC,UAAU,CAACC,IAAM3B,SAAS2B,EAAEC,MAAM,CAAC3B,KAAK;gBACxC4B,aAAY;gBACZnB,OAAO;oBAAEoB,OAAO;gBAAO;gBACvBN,MAAK;gBACLvB,OAAOA,SAAS;;;;AAK1B,EAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useField } from '@payloadcms/ui';
|
|
3
|
+
import React, { useState } from 'react';
|
|
4
|
+
export const EncryptedTextField = ({ label, path, required }) => {
|
|
5
|
+
const { setValue, value } = useField({ path });
|
|
6
|
+
const [isEditing, setIsEditing] = useState(!value);
|
|
7
|
+
const isMasked = typeof value === 'string' && value.startsWith('sk-') && value.includes('****');
|
|
8
|
+
return (<div className="field-type text">
|
|
9
|
+
<label className="field-label">
|
|
10
|
+
{label || 'API Key'}
|
|
11
|
+
{required && <span className="required">*</span>}
|
|
12
|
+
</label>
|
|
13
|
+
|
|
14
|
+
{!isEditing && isMasked ? (<div style={{ alignItems: 'center', display: 'flex', gap: '10px' }}>
|
|
15
|
+
<div style={{
|
|
16
|
+
background: 'var(--theme-elevation-100)',
|
|
17
|
+
borderRadius: '4px',
|
|
18
|
+
flexGrow: 1,
|
|
19
|
+
fontFamily: 'monospace',
|
|
20
|
+
padding: '8px 12px',
|
|
21
|
+
}}>
|
|
22
|
+
{value}
|
|
23
|
+
<span style={{ color: 'var(--theme-success-500)', fontSize: '0.8em', marginLeft: '10px' }}>
|
|
24
|
+
✓ Configured
|
|
25
|
+
</span>
|
|
26
|
+
</div>
|
|
27
|
+
<button className="btn btn--style-secondary btn--size-small" onClick={() => {
|
|
28
|
+
setValue('');
|
|
29
|
+
setIsEditing(true);
|
|
30
|
+
}} type="button">
|
|
31
|
+
Change
|
|
32
|
+
</button>
|
|
33
|
+
</div>) : (<input onChange={(e) => setValue(e.target.value)} placeholder="sk-..." style={{ width: '100%' }} type="password" value={value || ''}/>)}
|
|
34
|
+
</div>);
|
|
35
|
+
};
|
|
@@ -7,7 +7,9 @@ const LottieAnimation = ({ isLoading = false })=>{
|
|
|
7
7
|
const [animations, setAnimations] = useState([]);
|
|
8
8
|
useEffect(()=>{
|
|
9
9
|
const svg = svgRef.current;
|
|
10
|
-
if (!svg)
|
|
10
|
+
if (!svg) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
11
13
|
const animateTransform = (element, keyframes)=>{
|
|
12
14
|
const animation = element.animate(keyframes, {
|
|
13
15
|
direction: 'alternate',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/ui/Icons/LottieAnimation.tsx"],"sourcesContent":["// @ts-nocheck\n\nimport React, { useEffect, useRef, useState } from 'react'\n\nimport styles from './icons.module.css'\n\nconst LottieAnimation = ({ isLoading = false }) => {\n const svgRef = useRef(null)\n const [animations, setAnimations] = useState([])\n\n useEffect(() => {\n const svg = svgRef.current\n if (!svg) return\n\n const animateTransform = (element, keyframes) => {\n const animation = element.animate(keyframes, {\n direction: 'alternate',\n duration: 1000,\n easing: 'ease-in-out',\n iterations: Infinity,\n })\n return animation\n }\n\n // Animate Group 2 (Rectangle)\n const rectangle = svg.querySelector('#group2')\n const rectangleAnimation = animateTransform(rectangle, [\n { transform: 'translate(0, 0) scale(1)' },\n { transform: 'translate(0, 0) scale(2.54)' },\n { transform: 'translate(0, 0) scale(1)' },\n ])\n\n // Animate Group 3 (Triangle)\n const triangle = svg.querySelector('#group3')\n const triangleAnimation = animateTransform(triangle, [\n { transform: 'translate(-69.5px, 77.5px) scale(1)' },\n { transform: 'translate(-70px, 73px) scale(0.36)' },\n { transform: 'translate(-69.5px, 77.5px) scale(1)' },\n ])\n\n setAnimations([rectangleAnimation, triangleAnimation])\n\n // Clean up animations on unmount\n return () => {\n rectangleAnimation.cancel()\n triangleAnimation.cancel()\n }\n }, [])\n\n useEffect(() => {\n if (isLoading) {\n animations.forEach((animation) => animation.play())\n } else {\n animations.forEach((animation) => animation.pause())\n }\n }, [isLoading, animations])\n\n return (\n <span\n style={{\n left: '3px',\n position: 'relative',\n top: '-6px',\n }}\n >\n <svg height=\"41\" ref={svgRef} viewBox=\"-250 -250 500 500\" width=\"41\">\n <g id=\"group2\">\n <rect className={styles.color_fill} height=\"41\" width=\"41\" x=\"-20.5\" y=\"-20.5\" />\n </g>\n <g id=\"group3\">\n <path className={styles.color_fill} d=\"M48.5 57.5L48.5 -57.5L-49.5 -1.093L48.5 57.5Z\" />\n </g>\n </svg>\n </span>\n )\n}\n\nexport default LottieAnimation\n"],"names":["React","useEffect","useRef","useState","styles","LottieAnimation","isLoading","svgRef","animations","setAnimations","svg","current","animateTransform","element","keyframes","animation","animate","direction","duration","easing","iterations","Infinity","rectangle","querySelector","rectangleAnimation","transform","triangle","triangleAnimation","cancel","forEach","play","pause","span","style","left","position","top","height","ref","viewBox","width","g","id","rect","className","color_fill","x","y","path","d"],"mappings":"AAAA,cAAc;;AAEd,OAAOA,SAASC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAO;AAE1D,OAAOC,YAAY,qBAAoB;AAEvC,MAAMC,kBAAkB,CAAC,EAAEC,YAAY,KAAK,EAAE;IAC5C,MAAMC,SAASL,OAAO;IACtB,MAAM,CAACM,YAAYC,cAAc,GAAGN,SAAS,EAAE;IAE/CF,UAAU;QACR,MAAMS,MAAMH,OAAOI,OAAO;QAC1B,IAAI,CAACD,KAAK;
|
|
1
|
+
{"version":3,"sources":["../../../src/ui/Icons/LottieAnimation.tsx"],"sourcesContent":["// @ts-nocheck\n\nimport React, { useEffect, useRef, useState } from 'react'\n\nimport styles from './icons.module.css'\n\nconst LottieAnimation = ({ isLoading = false }) => {\n const svgRef = useRef(null)\n const [animations, setAnimations] = useState([])\n\n useEffect(() => {\n const svg = svgRef.current\n if (!svg) {return}\n\n const animateTransform = (element, keyframes) => {\n const animation = element.animate(keyframes, {\n direction: 'alternate',\n duration: 1000,\n easing: 'ease-in-out',\n iterations: Infinity,\n })\n return animation\n }\n\n // Animate Group 2 (Rectangle)\n const rectangle = svg.querySelector('#group2')\n const rectangleAnimation = animateTransform(rectangle, [\n { transform: 'translate(0, 0) scale(1)' },\n { transform: 'translate(0, 0) scale(2.54)' },\n { transform: 'translate(0, 0) scale(1)' },\n ])\n\n // Animate Group 3 (Triangle)\n const triangle = svg.querySelector('#group3')\n const triangleAnimation = animateTransform(triangle, [\n { transform: 'translate(-69.5px, 77.5px) scale(1)' },\n { transform: 'translate(-70px, 73px) scale(0.36)' },\n { transform: 'translate(-69.5px, 77.5px) scale(1)' },\n ])\n\n setAnimations([rectangleAnimation, triangleAnimation])\n\n // Clean up animations on unmount\n return () => {\n rectangleAnimation.cancel()\n triangleAnimation.cancel()\n }\n }, [])\n\n useEffect(() => {\n if (isLoading) {\n animations.forEach((animation) => animation.play())\n } else {\n animations.forEach((animation) => animation.pause())\n }\n }, [isLoading, animations])\n\n return (\n <span\n style={{\n left: '3px',\n position: 'relative',\n top: '-6px',\n }}\n >\n <svg height=\"41\" ref={svgRef} viewBox=\"-250 -250 500 500\" width=\"41\">\n <g id=\"group2\">\n <rect className={styles.color_fill} height=\"41\" width=\"41\" x=\"-20.5\" y=\"-20.5\" />\n </g>\n <g id=\"group3\">\n <path className={styles.color_fill} d=\"M48.5 57.5L48.5 -57.5L-49.5 -1.093L48.5 57.5Z\" />\n </g>\n </svg>\n </span>\n )\n}\n\nexport default LottieAnimation\n"],"names":["React","useEffect","useRef","useState","styles","LottieAnimation","isLoading","svgRef","animations","setAnimations","svg","current","animateTransform","element","keyframes","animation","animate","direction","duration","easing","iterations","Infinity","rectangle","querySelector","rectangleAnimation","transform","triangle","triangleAnimation","cancel","forEach","play","pause","span","style","left","position","top","height","ref","viewBox","width","g","id","rect","className","color_fill","x","y","path","d"],"mappings":"AAAA,cAAc;;AAEd,OAAOA,SAASC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAO;AAE1D,OAAOC,YAAY,qBAAoB;AAEvC,MAAMC,kBAAkB,CAAC,EAAEC,YAAY,KAAK,EAAE;IAC5C,MAAMC,SAASL,OAAO;IACtB,MAAM,CAACM,YAAYC,cAAc,GAAGN,SAAS,EAAE;IAE/CF,UAAU;QACR,MAAMS,MAAMH,OAAOI,OAAO;QAC1B,IAAI,CAACD,KAAK;YAAC;QAAM;QAEjB,MAAME,mBAAmB,CAACC,SAASC;YACjC,MAAMC,YAAYF,QAAQG,OAAO,CAACF,WAAW;gBAC3CG,WAAW;gBACXC,UAAU;gBACVC,QAAQ;gBACRC,YAAYC;YACd;YACA,OAAON;QACT;QAEA,8BAA8B;QAC9B,MAAMO,YAAYZ,IAAIa,aAAa,CAAC;QACpC,MAAMC,qBAAqBZ,iBAAiBU,WAAW;YACrD;gBAAEG,WAAW;YAA2B;YACxC;gBAAEA,WAAW;YAA8B;YAC3C;gBAAEA,WAAW;YAA2B;SACzC;QAED,6BAA6B;QAC7B,MAAMC,WAAWhB,IAAIa,aAAa,CAAC;QACnC,MAAMI,oBAAoBf,iBAAiBc,UAAU;YACnD;gBAAED,WAAW;YAAsC;YACnD;gBAAEA,WAAW;YAAqC;YAClD;gBAAEA,WAAW;YAAsC;SACpD;QAEDhB,cAAc;YAACe;YAAoBG;SAAkB;QAErD,iCAAiC;QACjC,OAAO;YACLH,mBAAmBI,MAAM;YACzBD,kBAAkBC,MAAM;QAC1B;IACF,GAAG,EAAE;IAEL3B,UAAU;QACR,IAAIK,WAAW;YACbE,WAAWqB,OAAO,CAAC,CAACd,YAAcA,UAAUe,IAAI;QAClD,OAAO;YACLtB,WAAWqB,OAAO,CAAC,CAACd,YAAcA,UAAUgB,KAAK;QACnD;IACF,GAAG;QAACzB;QAAWE;KAAW;IAE1B,qBACE,KAACwB;QACCC,OAAO;YACLC,MAAM;YACNC,UAAU;YACVC,KAAK;QACP;kBAEA,cAAA,MAAC1B;YAAI2B,QAAO;YAAKC,KAAK/B;YAAQgC,SAAQ;YAAoBC,OAAM;;8BAC9D,KAACC;oBAAEC,IAAG;8BACJ,cAAA,KAACC;wBAAKC,WAAWxC,OAAOyC,UAAU;wBAAER,QAAO;wBAAKG,OAAM;wBAAKM,GAAE;wBAAQC,GAAE;;;8BAEzE,KAACN;oBAAEC,IAAG;8BACJ,cAAA,KAACM;wBAAKJ,WAAWxC,OAAOyC,UAAU;wBAAEI,GAAE;;;;;;AAKhD;AAEA,eAAe5C,gBAAe"}
|
|
@@ -6,8 +6,9 @@ const LottieAnimation = ({ isLoading = false }) => {
|
|
|
6
6
|
const [animations, setAnimations] = useState([]);
|
|
7
7
|
useEffect(() => {
|
|
8
8
|
const svg = svgRef.current;
|
|
9
|
-
if (!svg)
|
|
9
|
+
if (!svg) {
|
|
10
10
|
return;
|
|
11
|
+
}
|
|
11
12
|
const animateTransform = (element, keyframes) => {
|
|
12
13
|
const animation = element.animate(keyframes, {
|
|
13
14
|
direction: 'alternate',
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useRowLabel } from '@payloadcms/ui';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
/**
|
|
6
|
+
* Generic Model Row Label component for provider blocks
|
|
7
|
+
* Displays model name with enabled status badge
|
|
8
|
+
*/ export const ModelRowLabel = ()=>{
|
|
9
|
+
const { data, rowNumber } = useRowLabel();
|
|
10
|
+
const displayName = data?.name || data?.id || `Model ${rowNumber}`;
|
|
11
|
+
const isEnabled = data?.enabled !== false;
|
|
12
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
13
|
+
style: {
|
|
14
|
+
alignItems: 'center',
|
|
15
|
+
display: 'flex',
|
|
16
|
+
gap: '10px'
|
|
17
|
+
},
|
|
18
|
+
children: [
|
|
19
|
+
/*#__PURE__*/ _jsx("span", {
|
|
20
|
+
style: {
|
|
21
|
+
fontWeight: '500'
|
|
22
|
+
},
|
|
23
|
+
children: displayName
|
|
24
|
+
}),
|
|
25
|
+
/*#__PURE__*/ _jsx("span", {
|
|
26
|
+
style: {
|
|
27
|
+
backgroundColor: isEnabled ? 'var(--theme-success-100)' : 'var(--theme-elevation-200)',
|
|
28
|
+
borderRadius: '4px',
|
|
29
|
+
color: isEnabled ? 'var(--theme-success-700)' : 'var(--theme-elevation-600)',
|
|
30
|
+
fontSize: '11px',
|
|
31
|
+
fontWeight: '600',
|
|
32
|
+
padding: '2px 8px',
|
|
33
|
+
textTransform: 'uppercase'
|
|
34
|
+
},
|
|
35
|
+
children: isEnabled ? '●Enabled' : 'Disabled'
|
|
36
|
+
})
|
|
37
|
+
]
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ui/ModelRowLabel/index.tsx"],"sourcesContent":["'use client'\n\nimport type { ArrayFieldLabelClientComponent } from 'payload'\n\nimport { useRowLabel } from '@payloadcms/ui'\nimport React from 'react'\n\n/**\n * Generic Model Row Label component for provider blocks\n * Displays model name with enabled status badge\n */\nexport const ModelRowLabel: ArrayFieldLabelClientComponent = () => {\n const { data, rowNumber } = useRowLabel<{\n enabled?: boolean\n id?: string\n name?: string\n }>()\n\n const displayName = data?.name || data?.id || `Model ${rowNumber}`\n const isEnabled = data?.enabled !== false\n\n return (\n <div style={{ alignItems: 'center', display: 'flex', gap: '10px' }}>\n <span style={{ fontWeight: '500' }}>{displayName}</span>\n <span\n style={{\n backgroundColor: isEnabled ? 'var(--theme-success-100)' : 'var(--theme-elevation-200)',\n borderRadius: '4px',\n color: isEnabled ? 'var(--theme-success-700)' : 'var(--theme-elevation-600)',\n fontSize: '11px',\n fontWeight: '600',\n padding: '2px 8px',\n textTransform: 'uppercase',\n }}\n >\n {isEnabled ? '●Enabled' : 'Disabled'}\n </span>\n </div>\n )\n}\n"],"names":["useRowLabel","React","ModelRowLabel","data","rowNumber","displayName","name","id","isEnabled","enabled","div","style","alignItems","display","gap","span","fontWeight","backgroundColor","borderRadius","color","fontSize","padding","textTransform"],"mappings":"AAAA;;AAIA,SAASA,WAAW,QAAQ,iBAAgB;AAC5C,OAAOC,WAAW,QAAO;AAEzB;;;CAGC,GACD,OAAO,MAAMC,gBAAgD;IAC3D,MAAM,EAAEC,IAAI,EAAEC,SAAS,EAAE,GAAGJ;IAM5B,MAAMK,cAAcF,MAAMG,QAAQH,MAAMI,MAAM,CAAC,MAAM,EAAEH,UAAU,CAAC;IAClE,MAAMI,YAAYL,MAAMM,YAAY;IAEpC,qBACE,MAACC;QAAIC,OAAO;YAAEC,YAAY;YAAUC,SAAS;YAAQC,KAAK;QAAO;;0BAC/D,KAACC;gBAAKJ,OAAO;oBAAEK,YAAY;gBAAM;0BAAIX;;0BACrC,KAACU;gBACCJ,OAAO;oBACLM,iBAAiBT,YAAY,6BAA6B;oBAC1DU,cAAc;oBACdC,OAAOX,YAAY,6BAA6B;oBAChDY,UAAU;oBACVJ,YAAY;oBACZK,SAAS;oBACTC,eAAe;gBACjB;0BAECd,YAAY,aAAa;;;;AAIlC,EAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { useRowLabel } from '@payloadcms/ui';
|
|
3
|
+
import React from 'react';
|
|
4
|
+
/**
|
|
5
|
+
* Generic Model Row Label component for provider blocks
|
|
6
|
+
* Displays model name with enabled status badge
|
|
7
|
+
*/
|
|
8
|
+
export const ModelRowLabel = () => {
|
|
9
|
+
const { data, rowNumber } = useRowLabel();
|
|
10
|
+
const displayName = data?.name || data?.id || `Model ${rowNumber}`;
|
|
11
|
+
const isEnabled = data?.enabled !== false;
|
|
12
|
+
return (<div style={{ alignItems: 'center', display: 'flex', gap: '10px' }}>
|
|
13
|
+
<span style={{ fontWeight: '500' }}>{displayName}</span>
|
|
14
|
+
<span style={{
|
|
15
|
+
backgroundColor: isEnabled ? 'var(--theme-success-100)' : 'var(--theme-elevation-200)',
|
|
16
|
+
borderRadius: '4px',
|
|
17
|
+
color: isEnabled ? 'var(--theme-success-700)' : 'var(--theme-elevation-600)',
|
|
18
|
+
fontSize: '11px',
|
|
19
|
+
fontWeight: '600',
|
|
20
|
+
padding: '2px 8px',
|
|
21
|
+
textTransform: 'uppercase',
|
|
22
|
+
}}>
|
|
23
|
+
{isEnabled ? '●Enabled' : 'Disabled'}
|
|
24
|
+
</span>
|
|
25
|
+
</div>);
|
|
26
|
+
};
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { RenderFields, useField, useFormFields } from '@payloadcms/ui';
|
|
4
|
+
import React, { useEffect, useMemo, useState } from 'react';
|
|
5
|
+
import { allProviderBlocks } from '../../ai/providers/blocks/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Find a field by name within a block's fields, searching through tabs
|
|
8
|
+
*/ function findFieldInBlock(block, fieldName) {
|
|
9
|
+
const searchFields = (fields)=>{
|
|
10
|
+
for (const field of fields){
|
|
11
|
+
if ('name' in field && field.name === fieldName) {
|
|
12
|
+
return field;
|
|
13
|
+
}
|
|
14
|
+
if (field.type === 'tabs' && 'tabs' in field) {
|
|
15
|
+
for (const tab of field.tabs){
|
|
16
|
+
const found = searchFields(tab.fields);
|
|
17
|
+
if (found) {
|
|
18
|
+
return found;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
if (field.type === 'group' && 'fields' in field) {
|
|
23
|
+
const found = searchFields(field.fields);
|
|
24
|
+
if (found) {
|
|
25
|
+
return found;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return undefined;
|
|
30
|
+
};
|
|
31
|
+
return searchFields(block.fields);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Get provider options fields for a given provider and use case
|
|
35
|
+
*/ function getProviderOptionsFields(providerSlug, useCase) {
|
|
36
|
+
const block = allProviderBlocks.find((b)=>b.slug === providerSlug);
|
|
37
|
+
if (!block) {
|
|
38
|
+
return [];
|
|
39
|
+
}
|
|
40
|
+
const groupName = `${useCase}ProviderOptions`;
|
|
41
|
+
const optionsGroup = findFieldInBlock(block, groupName);
|
|
42
|
+
if (optionsGroup && optionsGroup.type === 'group' && 'fields' in optionsGroup) {
|
|
43
|
+
return optionsGroup.fields;
|
|
44
|
+
}
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
export const ProviderOptionsEditor = (props)=>{
|
|
48
|
+
const { path } = props;
|
|
49
|
+
// Get parent path to find sibling provider field
|
|
50
|
+
const parentPath = path.split('.').slice(0, -1).join('.');
|
|
51
|
+
const providerField = useFormFields(([fields])=>fields[`${parentPath}.provider`]);
|
|
52
|
+
const provider = providerField?.value;
|
|
53
|
+
// Infer use case from path
|
|
54
|
+
// Handles:
|
|
55
|
+
// - AISettings: 'defaults.text.options' -> useCase is 'text'
|
|
56
|
+
// - Instructions: 'text-settings.providerOptions' -> useCase is 'text'
|
|
57
|
+
const useCase = useMemo(()=>{
|
|
58
|
+
// Check for AISettings paths first (e.g., 'defaults.text.options')
|
|
59
|
+
const pathParts = path.split('.');
|
|
60
|
+
const parentName = pathParts[pathParts.length - 2];
|
|
61
|
+
if ([
|
|
62
|
+
'image',
|
|
63
|
+
'text',
|
|
64
|
+
'tts',
|
|
65
|
+
'video'
|
|
66
|
+
].includes(parentName)) {
|
|
67
|
+
return parentName;
|
|
68
|
+
}
|
|
69
|
+
// Check for Instructions paths
|
|
70
|
+
if (path.includes('tts-settings')) {
|
|
71
|
+
return 'tts';
|
|
72
|
+
}
|
|
73
|
+
if (path.includes('image-settings')) {
|
|
74
|
+
return 'image';
|
|
75
|
+
}
|
|
76
|
+
if (path.includes('video-settings')) {
|
|
77
|
+
return 'video';
|
|
78
|
+
}
|
|
79
|
+
return 'text';
|
|
80
|
+
}, [
|
|
81
|
+
path
|
|
82
|
+
]);
|
|
83
|
+
const { setValue, value } = useField({
|
|
84
|
+
path
|
|
85
|
+
});
|
|
86
|
+
const [aiSettings, setAiSettings] = useState(null);
|
|
87
|
+
// Fetch AI Settings to get current provider defaults
|
|
88
|
+
useEffect(()=>{
|
|
89
|
+
fetch('/api/globals/ai-settings?depth=1').then((res)=>res.json()).then((data)=>setAiSettings(data)).catch((err)=>console.error('Error fetching AI settings:', err));
|
|
90
|
+
}, []);
|
|
91
|
+
// Get the configured default options from AI Settings for this provider
|
|
92
|
+
const configuredDefaults = useMemo(()=>{
|
|
93
|
+
if (!provider || !aiSettings) {
|
|
94
|
+
return null;
|
|
95
|
+
}
|
|
96
|
+
const providerBlock = aiSettings.providers?.find((p)=>p.blockType === provider && p.enabled);
|
|
97
|
+
if (!providerBlock) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
// Get provider options by use case
|
|
101
|
+
const optionsKey = `${useCase}ProviderOptions`;
|
|
102
|
+
return providerBlock[optionsKey] || null;
|
|
103
|
+
}, [
|
|
104
|
+
provider,
|
|
105
|
+
useCase,
|
|
106
|
+
aiSettings
|
|
107
|
+
]);
|
|
108
|
+
// Get field definitions from provider block
|
|
109
|
+
const fields = useMemo(()=>{
|
|
110
|
+
if (!provider) {
|
|
111
|
+
return [];
|
|
112
|
+
}
|
|
113
|
+
return getProviderOptionsFields(provider, useCase);
|
|
114
|
+
}, [
|
|
115
|
+
provider,
|
|
116
|
+
useCase
|
|
117
|
+
]);
|
|
118
|
+
// Check if there are any overrides set
|
|
119
|
+
const hasOverrides = useMemo(()=>{
|
|
120
|
+
return value && Object.keys(value).length > 0;
|
|
121
|
+
}, [
|
|
122
|
+
value
|
|
123
|
+
]);
|
|
124
|
+
if (!provider) {
|
|
125
|
+
return /*#__PURE__*/ _jsx("div", {
|
|
126
|
+
className: "field-type",
|
|
127
|
+
style: {
|
|
128
|
+
padding: '12px 0'
|
|
129
|
+
},
|
|
130
|
+
children: /*#__PURE__*/ _jsx("p", {
|
|
131
|
+
style: {
|
|
132
|
+
color: 'var(--theme-elevation-600)',
|
|
133
|
+
fontSize: '13px',
|
|
134
|
+
margin: 0
|
|
135
|
+
},
|
|
136
|
+
children: "Please select a provider first to configure options."
|
|
137
|
+
})
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
if (fields.length === 0) {
|
|
141
|
+
return /*#__PURE__*/ _jsx("div", {
|
|
142
|
+
className: "field-type",
|
|
143
|
+
style: {
|
|
144
|
+
padding: '12px 0'
|
|
145
|
+
},
|
|
146
|
+
children: /*#__PURE__*/ _jsxs("p", {
|
|
147
|
+
style: {
|
|
148
|
+
color: 'var(--theme-elevation-600)',
|
|
149
|
+
fontSize: '13px',
|
|
150
|
+
margin: 0
|
|
151
|
+
},
|
|
152
|
+
children: [
|
|
153
|
+
"No configurable options available for ",
|
|
154
|
+
provider,
|
|
155
|
+
" (",
|
|
156
|
+
useCase,
|
|
157
|
+
")."
|
|
158
|
+
]
|
|
159
|
+
})
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
163
|
+
className: "field-type provider-options-editor",
|
|
164
|
+
children: [
|
|
165
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
166
|
+
style: {
|
|
167
|
+
marginBottom: '16px'
|
|
168
|
+
},
|
|
169
|
+
children: [
|
|
170
|
+
/*#__PURE__*/ _jsx("label", {
|
|
171
|
+
className: "field-label",
|
|
172
|
+
style: {
|
|
173
|
+
display: 'block',
|
|
174
|
+
marginBottom: '8px'
|
|
175
|
+
},
|
|
176
|
+
children: "Provider Options"
|
|
177
|
+
}),
|
|
178
|
+
configuredDefaults && /*#__PURE__*/ _jsxs("div", {
|
|
179
|
+
style: {
|
|
180
|
+
background: 'var(--theme-elevation-50)',
|
|
181
|
+
border: '1px solid var(--theme-elevation-100)',
|
|
182
|
+
borderRadius: '4px',
|
|
183
|
+
fontSize: '12px',
|
|
184
|
+
marginBottom: '12px',
|
|
185
|
+
padding: '12px'
|
|
186
|
+
},
|
|
187
|
+
children: [
|
|
188
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
189
|
+
style: {
|
|
190
|
+
alignItems: 'center',
|
|
191
|
+
display: 'flex',
|
|
192
|
+
justifyContent: 'space-between',
|
|
193
|
+
marginBottom: '8px'
|
|
194
|
+
},
|
|
195
|
+
children: [
|
|
196
|
+
/*#__PURE__*/ _jsx("strong", {
|
|
197
|
+
style: {
|
|
198
|
+
color: 'var(--theme-elevation-800)'
|
|
199
|
+
},
|
|
200
|
+
children: "Defaults from AI Settings"
|
|
201
|
+
}),
|
|
202
|
+
/*#__PURE__*/ _jsx("span", {
|
|
203
|
+
style: {
|
|
204
|
+
background: 'var(--theme-elevation-100)',
|
|
205
|
+
borderRadius: '10px',
|
|
206
|
+
color: 'var(--theme-elevation-500)',
|
|
207
|
+
fontSize: '11px',
|
|
208
|
+
padding: '2px 8px'
|
|
209
|
+
},
|
|
210
|
+
children: "Inherited"
|
|
211
|
+
})
|
|
212
|
+
]
|
|
213
|
+
}),
|
|
214
|
+
/*#__PURE__*/ _jsx("div", {
|
|
215
|
+
style: {
|
|
216
|
+
color: 'var(--theme-elevation-600)',
|
|
217
|
+
display: 'flex',
|
|
218
|
+
flexWrap: 'wrap',
|
|
219
|
+
gap: '8px'
|
|
220
|
+
},
|
|
221
|
+
children: Object.entries(configuredDefaults).map(([key, val])=>{
|
|
222
|
+
// Skip nested objects for display
|
|
223
|
+
if (typeof val === 'object' && val !== null) {
|
|
224
|
+
return null;
|
|
225
|
+
}
|
|
226
|
+
return /*#__PURE__*/ _jsxs("span", {
|
|
227
|
+
style: {
|
|
228
|
+
background: 'var(--theme-elevation-100)',
|
|
229
|
+
borderRadius: '3px',
|
|
230
|
+
fontSize: '11px',
|
|
231
|
+
padding: '2px 6px'
|
|
232
|
+
},
|
|
233
|
+
children: [
|
|
234
|
+
key,
|
|
235
|
+
": ",
|
|
236
|
+
/*#__PURE__*/ _jsx("strong", {
|
|
237
|
+
children: String(val)
|
|
238
|
+
})
|
|
239
|
+
]
|
|
240
|
+
}, key);
|
|
241
|
+
})
|
|
242
|
+
})
|
|
243
|
+
]
|
|
244
|
+
}),
|
|
245
|
+
/*#__PURE__*/ _jsx("p", {
|
|
246
|
+
style: {
|
|
247
|
+
color: 'var(--theme-elevation-500)',
|
|
248
|
+
fontSize: '12px',
|
|
249
|
+
fontStyle: 'italic',
|
|
250
|
+
marginBottom: '12px'
|
|
251
|
+
},
|
|
252
|
+
children: "Override defaults for this specific field. Empty values inherit from AI Settings."
|
|
253
|
+
})
|
|
254
|
+
]
|
|
255
|
+
}),
|
|
256
|
+
/*#__PURE__*/ _jsx(RenderFields, {
|
|
257
|
+
fields: fields,
|
|
258
|
+
forceRender: true,
|
|
259
|
+
margins: "small",
|
|
260
|
+
parentIndexPath: "",
|
|
261
|
+
parentPath: path,
|
|
262
|
+
parentSchemaPath: path,
|
|
263
|
+
permissions: true
|
|
264
|
+
}),
|
|
265
|
+
hasOverrides && /*#__PURE__*/ _jsx("button", {
|
|
266
|
+
onClick: ()=>setValue({}),
|
|
267
|
+
onMouseEnter: (e)=>{
|
|
268
|
+
e.currentTarget.style.background = 'var(--theme-elevation-100)';
|
|
269
|
+
},
|
|
270
|
+
onMouseLeave: (e)=>{
|
|
271
|
+
e.currentTarget.style.background = 'transparent';
|
|
272
|
+
},
|
|
273
|
+
style: {
|
|
274
|
+
background: 'transparent',
|
|
275
|
+
border: '1px solid var(--theme-elevation-200)',
|
|
276
|
+
borderRadius: '4px',
|
|
277
|
+
color: 'var(--theme-text)',
|
|
278
|
+
cursor: 'pointer',
|
|
279
|
+
fontSize: '13px',
|
|
280
|
+
marginTop: '12px',
|
|
281
|
+
padding: '8px 16px',
|
|
282
|
+
transition: 'all 0.15s ease'
|
|
283
|
+
},
|
|
284
|
+
type: "button",
|
|
285
|
+
children: "Reset to Defaults"
|
|
286
|
+
})
|
|
287
|
+
]
|
|
288
|
+
});
|
|
289
|
+
};
|
|
290
|
+
|
|
291
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ui/ProviderOptionsEditor/index.tsx"],"sourcesContent":["'use client'\n\nimport { RenderFields, useField, useFormFields } from '@payloadcms/ui'\nimport React, { useEffect, useMemo, useState } from 'react'\n\nimport { allProviderBlocks } from '../../ai/providers/blocks/index.js'\n\ntype UseCase = 'image' | 'text' | 'tts' | 'video'\n\ninterface ProviderOptionsEditorProps {\n name?: string\n path: string\n}\n\n/**\n * Find a field by name within a block's fields, searching through tabs\n */\nfunction findFieldInBlock(block: any, fieldName: string): any | undefined {\n const searchFields = (fields: any[]): any | undefined => {\n for (const field of fields) {\n if ('name' in field && field.name === fieldName) {\n return field\n }\n if (field.type === 'tabs' && 'tabs' in field) {\n for (const tab of field.tabs) {\n const found = searchFields(tab.fields)\n if (found) {\n return found\n }\n }\n }\n if (field.type === 'group' && 'fields' in field) {\n const found = searchFields(field.fields)\n if (found) {\n return found\n }\n }\n }\n return undefined\n }\n\n return searchFields(block.fields)\n}\n\n/**\n * Get provider options fields for a given provider and use case\n */\nfunction getProviderOptionsFields(providerSlug: string, useCase: UseCase): any[] {\n const block = allProviderBlocks.find((b) => b.slug === providerSlug)\n if (!block) {\n return []\n }\n\n const groupName = `${useCase}ProviderOptions`\n const optionsGroup = findFieldInBlock(block, groupName)\n\n if (optionsGroup && optionsGroup.type === 'group' && 'fields' in optionsGroup) {\n return optionsGroup.fields\n }\n\n return []\n}\n\nexport const ProviderOptionsEditor: React.FC<ProviderOptionsEditorProps> = (props) => {\n const { path } = props\n\n // Get parent path to find sibling provider field\n const parentPath = path.split('.').slice(0, -1).join('.')\n const providerField = useFormFields(([fields]) => fields[`${parentPath}.provider`])\n const provider = providerField?.value as string\n\n // Infer use case from path\n // Handles:\n // - AISettings: 'defaults.text.options' -> useCase is 'text'\n // - Instructions: 'text-settings.providerOptions' -> useCase is 'text'\n const useCase: UseCase = useMemo(() => {\n // Check for AISettings paths first (e.g., 'defaults.text.options')\n const pathParts = path.split('.')\n const parentName = pathParts[pathParts.length - 2]\n\n if (['image', 'text', 'tts', 'video'].includes(parentName)) {\n return parentName as UseCase\n }\n\n // Check for Instructions paths\n if (path.includes('tts-settings')) {\n return 'tts'\n }\n if (path.includes('image-settings')) {\n return 'image'\n }\n if (path.includes('video-settings')) {\n return 'video'\n }\n return 'text'\n }, [path])\n\n const { setValue, value } = useField<Record<string, any>>({ path })\n const [aiSettings, setAiSettings] = useState<any>(null)\n\n // Fetch AI Settings to get current provider defaults\n useEffect(() => {\n fetch('/api/globals/ai-settings?depth=1')\n .then((res) => res.json())\n .then((data) => setAiSettings(data))\n .catch((err) => console.error('Error fetching AI settings:', err))\n }, [])\n\n // Get the configured default options from AI Settings for this provider\n const configuredDefaults = useMemo(() => {\n if (!provider || !aiSettings) {\n return null\n }\n\n const providerBlock = aiSettings.providers?.find(\n (p: any) => p.blockType === provider && p.enabled,\n )\n if (!providerBlock) {\n return null\n }\n\n // Get provider options by use case\n const optionsKey = `${useCase}ProviderOptions`\n return providerBlock[optionsKey] || null\n }, [provider, useCase, aiSettings])\n\n // Get field definitions from provider block\n const fields = useMemo(() => {\n if (!provider) {\n return []\n }\n return getProviderOptionsFields(provider, useCase)\n }, [provider, useCase])\n\n // Check if there are any overrides set\n const hasOverrides = useMemo(() => {\n return value && Object.keys(value).length > 0\n }, [value])\n\n if (!provider) {\n return (\n <div className=\"field-type\" style={{ padding: '12px 0' }}>\n <p style={{ color: 'var(--theme-elevation-600)', fontSize: '13px', margin: 0 }}>\n Please select a provider first to configure options.\n </p>\n </div>\n )\n }\n\n if (fields.length === 0) {\n return (\n <div className=\"field-type\" style={{ padding: '12px 0' }}>\n <p style={{ color: 'var(--theme-elevation-600)', fontSize: '13px', margin: 0 }}>\n No configurable options available for {provider} ({useCase}).\n </p>\n </div>\n )\n }\n\n return (\n <div className=\"field-type provider-options-editor\">\n <div style={{ marginBottom: '16px' }}>\n <label className=\"field-label\" style={{ display: 'block', marginBottom: '8px' }}>\n Provider Options\n </label>\n\n {configuredDefaults && (\n <div\n style={{\n background: 'var(--theme-elevation-50)',\n border: '1px solid var(--theme-elevation-100)',\n borderRadius: '4px',\n fontSize: '12px',\n marginBottom: '12px',\n padding: '12px',\n }}\n >\n <div\n style={{\n alignItems: 'center',\n display: 'flex',\n justifyContent: 'space-between',\n marginBottom: '8px',\n }}\n >\n <strong style={{ color: 'var(--theme-elevation-800)' }}>\n Defaults from AI Settings\n </strong>\n <span\n style={{\n background: 'var(--theme-elevation-100)',\n borderRadius: '10px',\n color: 'var(--theme-elevation-500)',\n fontSize: '11px',\n padding: '2px 8px',\n }}\n >\n Inherited\n </span>\n </div>\n <div\n style={{\n color: 'var(--theme-elevation-600)',\n display: 'flex',\n flexWrap: 'wrap',\n gap: '8px',\n }}\n >\n {Object.entries(configuredDefaults).map(([key, val]) => {\n // Skip nested objects for display\n if (typeof val === 'object' && val !== null) {\n return null\n }\n return (\n <span\n key={key}\n style={{\n background: 'var(--theme-elevation-100)',\n borderRadius: '3px',\n fontSize: '11px',\n padding: '2px 6px',\n }}\n >\n {key}: <strong>{String(val)}</strong>\n </span>\n )\n })}\n </div>\n </div>\n )}\n\n <p\n style={{\n color: 'var(--theme-elevation-500)',\n fontSize: '12px',\n fontStyle: 'italic',\n marginBottom: '12px',\n }}\n >\n Override defaults for this specific field. Empty values inherit from AI Settings.\n </p>\n </div>\n\n <RenderFields\n fields={fields}\n forceRender\n margins=\"small\"\n parentIndexPath=\"\"\n parentPath={path}\n parentSchemaPath={path}\n permissions={true}\n />\n\n {hasOverrides && (\n <button\n onClick={() => setValue({})}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'var(--theme-elevation-100)'\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'transparent'\n }}\n style={{\n background: 'transparent',\n border: '1px solid var(--theme-elevation-200)',\n borderRadius: '4px',\n color: 'var(--theme-text)',\n cursor: 'pointer',\n fontSize: '13px',\n marginTop: '12px',\n padding: '8px 16px',\n transition: 'all 0.15s ease',\n }}\n type=\"button\"\n >\n Reset to Defaults\n </button>\n )}\n </div>\n )\n}\n"],"names":["RenderFields","useField","useFormFields","React","useEffect","useMemo","useState","allProviderBlocks","findFieldInBlock","block","fieldName","searchFields","fields","field","name","type","tab","tabs","found","undefined","getProviderOptionsFields","providerSlug","useCase","find","b","slug","groupName","optionsGroup","ProviderOptionsEditor","props","path","parentPath","split","slice","join","providerField","provider","value","pathParts","parentName","length","includes","setValue","aiSettings","setAiSettings","fetch","then","res","json","data","catch","err","console","error","configuredDefaults","providerBlock","providers","p","blockType","enabled","optionsKey","hasOverrides","Object","keys","div","className","style","padding","color","fontSize","margin","marginBottom","label","display","background","border","borderRadius","alignItems","justifyContent","strong","span","flexWrap","gap","entries","map","key","val","String","fontStyle","forceRender","margins","parentIndexPath","parentSchemaPath","permissions","button","onClick","onMouseEnter","e","currentTarget","onMouseLeave","cursor","marginTop","transition"],"mappings":"AAAA;;AAEA,SAASA,YAAY,EAAEC,QAAQ,EAAEC,aAAa,QAAQ,iBAAgB;AACtE,OAAOC,SAASC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,QAAO;AAE3D,SAASC,iBAAiB,QAAQ,qCAAoC;AAStE;;CAEC,GACD,SAASC,iBAAiBC,KAAU,EAAEC,SAAiB;IACrD,MAAMC,eAAe,CAACC;QACpB,KAAK,MAAMC,SAASD,OAAQ;YAC1B,IAAI,UAAUC,SAASA,MAAMC,IAAI,KAAKJ,WAAW;gBAC/C,OAAOG;YACT;YACA,IAAIA,MAAME,IAAI,KAAK,UAAU,UAAUF,OAAO;gBAC5C,KAAK,MAAMG,OAAOH,MAAMI,IAAI,CAAE;oBAC5B,MAAMC,QAAQP,aAAaK,IAAIJ,MAAM;oBACrC,IAAIM,OAAO;wBACT,OAAOA;oBACT;gBACF;YACF;YACA,IAAIL,MAAME,IAAI,KAAK,WAAW,YAAYF,OAAO;gBAC/C,MAAMK,QAAQP,aAAaE,MAAMD,MAAM;gBACvC,IAAIM,OAAO;oBACT,OAAOA;gBACT;YACF;QACF;QACA,OAAOC;IACT;IAEA,OAAOR,aAAaF,MAAMG,MAAM;AAClC;AAEA;;CAEC,GACD,SAASQ,yBAAyBC,YAAoB,EAAEC,OAAgB;IACtE,MAAMb,QAAQF,kBAAkBgB,IAAI,CAAC,CAACC,IAAMA,EAAEC,IAAI,KAAKJ;IACvD,IAAI,CAACZ,OAAO;QACV,OAAO,EAAE;IACX;IAEA,MAAMiB,YAAY,CAAC,EAAEJ,QAAQ,eAAe,CAAC;IAC7C,MAAMK,eAAenB,iBAAiBC,OAAOiB;IAE7C,IAAIC,gBAAgBA,aAAaZ,IAAI,KAAK,WAAW,YAAYY,cAAc;QAC7E,OAAOA,aAAaf,MAAM;IAC5B;IAEA,OAAO,EAAE;AACX;AAEA,OAAO,MAAMgB,wBAA8D,CAACC;IAC1E,MAAM,EAAEC,IAAI,EAAE,GAAGD;IAEjB,iDAAiD;IACjD,MAAME,aAAaD,KAAKE,KAAK,CAAC,KAAKC,KAAK,CAAC,GAAG,CAAC,GAAGC,IAAI,CAAC;IACrD,MAAMC,gBAAgBjC,cAAc,CAAC,CAACU,OAAO,GAAKA,MAAM,CAAC,CAAC,EAAEmB,WAAW,SAAS,CAAC,CAAC;IAClF,MAAMK,WAAWD,eAAeE;IAEhC,2BAA2B;IAC3B,WAAW;IACX,6DAA6D;IAC7D,uEAAuE;IACvE,MAAMf,UAAmBjB,QAAQ;QAC/B,mEAAmE;QACnE,MAAMiC,YAAYR,KAAKE,KAAK,CAAC;QAC7B,MAAMO,aAAaD,SAAS,CAACA,UAAUE,MAAM,GAAG,EAAE;QAElD,IAAI;YAAC;YAAS;YAAQ;YAAO;SAAQ,CAACC,QAAQ,CAACF,aAAa;YAC1D,OAAOA;QACT;QAEA,+BAA+B;QAC/B,IAAIT,KAAKW,QAAQ,CAAC,iBAAiB;YACjC,OAAO;QACT;QACA,IAAIX,KAAKW,QAAQ,CAAC,mBAAmB;YACnC,OAAO;QACT;QACA,IAAIX,KAAKW,QAAQ,CAAC,mBAAmB;YACnC,OAAO;QACT;QACA,OAAO;IACT,GAAG;QAACX;KAAK;IAET,MAAM,EAAEY,QAAQ,EAAEL,KAAK,EAAE,GAAGpC,SAA8B;QAAE6B;IAAK;IACjE,MAAM,CAACa,YAAYC,cAAc,GAAGtC,SAAc;IAElD,qDAAqD;IACrDF,UAAU;QACRyC,MAAM,oCACHC,IAAI,CAAC,CAACC,MAAQA,IAAIC,IAAI,IACtBF,IAAI,CAAC,CAACG,OAASL,cAAcK,OAC7BC,KAAK,CAAC,CAACC,MAAQC,QAAQC,KAAK,CAAC,+BAA+BF;IACjE,GAAG,EAAE;IAEL,wEAAwE;IACxE,MAAMG,qBAAqBjD,QAAQ;QACjC,IAAI,CAAC+B,YAAY,CAACO,YAAY;YAC5B,OAAO;QACT;QAEA,MAAMY,gBAAgBZ,WAAWa,SAAS,EAAEjC,KAC1C,CAACkC,IAAWA,EAAEC,SAAS,KAAKtB,YAAYqB,EAAEE,OAAO;QAEnD,IAAI,CAACJ,eAAe;YAClB,OAAO;QACT;QAEA,mCAAmC;QACnC,MAAMK,aAAa,CAAC,EAAEtC,QAAQ,eAAe,CAAC;QAC9C,OAAOiC,aAAa,CAACK,WAAW,IAAI;IACtC,GAAG;QAACxB;QAAUd;QAASqB;KAAW;IAElC,4CAA4C;IAC5C,MAAM/B,SAASP,QAAQ;QACrB,IAAI,CAAC+B,UAAU;YACb,OAAO,EAAE;QACX;QACA,OAAOhB,yBAAyBgB,UAAUd;IAC5C,GAAG;QAACc;QAAUd;KAAQ;IAEtB,uCAAuC;IACvC,MAAMuC,eAAexD,QAAQ;QAC3B,OAAOgC,SAASyB,OAAOC,IAAI,CAAC1B,OAAOG,MAAM,GAAG;IAC9C,GAAG;QAACH;KAAM;IAEV,IAAI,CAACD,UAAU;QACb,qBACE,KAAC4B;YAAIC,WAAU;YAAaC,OAAO;gBAAEC,SAAS;YAAS;sBACrD,cAAA,KAACV;gBAAES,OAAO;oBAAEE,OAAO;oBAA8BC,UAAU;oBAAQC,QAAQ;gBAAE;0BAAG;;;IAKtF;IAEA,IAAI1D,OAAO4B,MAAM,KAAK,GAAG;QACvB,qBACE,KAACwB;YAAIC,WAAU;YAAaC,OAAO;gBAAEC,SAAS;YAAS;sBACrD,cAAA,MAACV;gBAAES,OAAO;oBAAEE,OAAO;oBAA8BC,UAAU;oBAAQC,QAAQ;gBAAE;;oBAAG;oBACvClC;oBAAS;oBAAGd;oBAAQ;;;;IAInE;IAEA,qBACE,MAAC0C;QAAIC,WAAU;;0BACb,MAACD;gBAAIE,OAAO;oBAAEK,cAAc;gBAAO;;kCACjC,KAACC;wBAAMP,WAAU;wBAAcC,OAAO;4BAAEO,SAAS;4BAASF,cAAc;wBAAM;kCAAG;;oBAIhFjB,oCACC,MAACU;wBACCE,OAAO;4BACLQ,YAAY;4BACZC,QAAQ;4BACRC,cAAc;4BACdP,UAAU;4BACVE,cAAc;4BACdJ,SAAS;wBACX;;0CAEA,MAACH;gCACCE,OAAO;oCACLW,YAAY;oCACZJ,SAAS;oCACTK,gBAAgB;oCAChBP,cAAc;gCAChB;;kDAEA,KAACQ;wCAAOb,OAAO;4CAAEE,OAAO;wCAA6B;kDAAG;;kDAGxD,KAACY;wCACCd,OAAO;4CACLQ,YAAY;4CACZE,cAAc;4CACdR,OAAO;4CACPC,UAAU;4CACVF,SAAS;wCACX;kDACD;;;;0CAIH,KAACH;gCACCE,OAAO;oCACLE,OAAO;oCACPK,SAAS;oCACTQ,UAAU;oCACVC,KAAK;gCACP;0CAECpB,OAAOqB,OAAO,CAAC7B,oBAAoB8B,GAAG,CAAC,CAAC,CAACC,KAAKC,IAAI;oCACjD,kCAAkC;oCAClC,IAAI,OAAOA,QAAQ,YAAYA,QAAQ,MAAM;wCAC3C,OAAO;oCACT;oCACA,qBACE,MAACN;wCAECd,OAAO;4CACLQ,YAAY;4CACZE,cAAc;4CACdP,UAAU;4CACVF,SAAS;wCACX;;4CAECkB;4CAAI;0DAAE,KAACN;0DAAQQ,OAAOD;;;uCARlBD;gCAWX;;;;kCAKN,KAAC5B;wBACCS,OAAO;4BACLE,OAAO;4BACPC,UAAU;4BACVmB,WAAW;4BACXjB,cAAc;wBAChB;kCACD;;;;0BAKH,KAACvE;gBACCY,QAAQA;gBACR6E,WAAW;gBACXC,SAAQ;gBACRC,iBAAgB;gBAChB5D,YAAYD;gBACZ8D,kBAAkB9D;gBAClB+D,aAAa;;YAGdhC,8BACC,KAACiC;gBACCC,SAAS,IAAMrD,SAAS,CAAC;gBACzBsD,cAAc,CAACC;oBACbA,EAAEC,aAAa,CAAChC,KAAK,CAACQ,UAAU,GAAG;gBACrC;gBACAyB,cAAc,CAACF;oBACbA,EAAEC,aAAa,CAAChC,KAAK,CAACQ,UAAU,GAAG;gBACrC;gBACAR,OAAO;oBACLQ,YAAY;oBACZC,QAAQ;oBACRC,cAAc;oBACdR,OAAO;oBACPgC,QAAQ;oBACR/B,UAAU;oBACVgC,WAAW;oBACXlC,SAAS;oBACTmC,YAAY;gBACd;gBACAvF,MAAK;0BACN;;;;AAMT,EAAC"}
|