@alpaca-editor/core 1.0.4095 → 1.0.4097
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/components/ui/button.d.ts +1 -1
- package/dist/components/ui/button.js +1 -0
- package/dist/components/ui/button.js.map +1 -1
- package/dist/components/ui/context-menu.d.ts +2 -2
- package/dist/components/ui/context-menu.js +16 -16
- package/dist/components/ui/context-menu.js.map +1 -1
- package/dist/editor/Editor.js +1 -1
- package/dist/editor/Editor.js.map +1 -1
- package/dist/editor/FieldActionsOverlay.js +40 -26
- package/dist/editor/FieldActionsOverlay.js.map +1 -1
- package/dist/editor/FieldListField.js +1 -1
- package/dist/editor/FieldListField.js.map +1 -1
- package/dist/editor/LinkEditorDialog.js +1 -1
- package/dist/editor/ai/AgentTerminal.js +203 -59
- package/dist/editor/ai/AgentTerminal.js.map +1 -1
- package/dist/editor/ai/Agents.js +23 -9
- package/dist/editor/ai/Agents.js.map +1 -1
- package/dist/editor/ai/ContextInfoBar.d.ts +11 -0
- package/dist/editor/ai/ContextInfoBar.js +357 -0
- package/dist/editor/ai/ContextInfoBar.js.map +1 -0
- package/dist/editor/ai/DancingDots.js +1 -1
- package/dist/editor/ai/DancingDots.js.map +1 -1
- package/dist/editor/ai/ToolCallDisplay.js +2 -0
- package/dist/editor/ai/ToolCallDisplay.js.map +1 -1
- package/dist/editor/client/AboutDialog.js +7 -5
- package/dist/editor/client/AboutDialog.js.map +1 -1
- package/dist/editor/client/EditorShell.js +7 -2
- package/dist/editor/client/EditorShell.js.map +1 -1
- package/dist/editor/client/editContext.d.ts +2 -2
- package/dist/editor/client/hooks/useSocketMessageHandler.js +3 -0
- package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -1
- package/dist/editor/client/itemsRepository.js +6 -2
- package/dist/editor/client/itemsRepository.js.map +1 -1
- package/dist/editor/control-center/Setup.js +1 -1
- package/dist/editor/control-center/Setup.js.map +1 -1
- package/dist/editor/control-center/setup-steps/AiSetupStep/EmbeddingsModelSection.d.ts +2 -0
- package/dist/editor/control-center/setup-steps/AiSetupStep/EmbeddingsModelSection.js +195 -0
- package/dist/editor/control-center/setup-steps/AiSetupStep/EmbeddingsModelSection.js.map +1 -0
- package/dist/editor/control-center/setup-steps/AiSetupStep/index.js +22 -0
- package/dist/editor/control-center/setup-steps/AiSetupStep/index.js.map +1 -0
- package/dist/editor/control-center/setup-steps/AiSetupStep/provider/ProviderSection.d.ts +1 -0
- package/dist/editor/control-center/setup-steps/AiSetupStep/provider/ProviderSection.js +233 -0
- package/dist/editor/control-center/setup-steps/AiSetupStep/provider/ProviderSection.js.map +1 -0
- package/dist/editor/control-center/setup-steps/AiSetupStep/required-containers/RequiredContainersList.d.ts +15 -0
- package/dist/editor/control-center/setup-steps/AiSetupStep/required-containers/RequiredContainersList.js +14 -0
- package/dist/editor/control-center/setup-steps/AiSetupStep/required-containers/RequiredContainersList.js.map +1 -0
- package/dist/editor/control-center/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.d.ts +1 -0
- package/dist/editor/control-center/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.js +94 -0
- package/dist/editor/control-center/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.js.map +1 -0
- package/dist/editor/control-center/setup-steps/AiSetupStep/tools/GenerateToolsSection.d.ts +1 -0
- package/dist/editor/control-center/setup-steps/AiSetupStep/tools/GenerateToolsSection.js +328 -0
- package/dist/editor/control-center/setup-steps/AiSetupStep/tools/GenerateToolsSection.js.map +1 -0
- package/dist/editor/control-center/setup-steps/AiSetupStep/types.d.ts +1 -0
- package/dist/editor/control-center/setup-steps/AiSetupStep/types.js +2 -0
- package/dist/editor/control-center/setup-steps/AiSetupStep/types.js.map +1 -0
- package/dist/editor/control-center/setup-steps/AiSetupStep/utils.d.ts +4 -0
- package/dist/editor/control-center/setup-steps/AiSetupStep/utils.js +25 -0
- package/dist/editor/control-center/setup-steps/AiSetupStep/utils.js.map +1 -0
- package/dist/editor/control-center/setup-steps/IndexSetupStep.js +2 -1
- package/dist/editor/control-center/setup-steps/IndexSetupStep.js.map +1 -1
- package/dist/editor/field-types/SingleLineText.js.map +1 -1
- package/dist/editor/field-types/TreeListEditor.js +102 -16
- package/dist/editor/field-types/TreeListEditor.js.map +1 -1
- package/dist/editor/field-types/richtext/components/ReactSlate.js +1 -1
- package/dist/editor/field-types/richtext/components/SimpleRichTextEditor.js +1 -1
- package/dist/editor/menubar/toolbar-sections/EditControls.js +2 -2
- package/dist/editor/menubar/toolbar-sections/EditControls.js.map +1 -1
- package/dist/editor/menubar/toolbar-sections/InsertControls.js +1 -1
- package/dist/editor/menubar/toolbar-sections/InsertControls.js.map +1 -1
- package/dist/editor/page-editor-chrome/FrameMenu.js +25 -12
- package/dist/editor/page-editor-chrome/FrameMenu.js.map +1 -1
- package/dist/editor/page-editor-chrome/InlineEditor.js +102 -7
- package/dist/editor/page-editor-chrome/InlineEditor.js.map +1 -1
- package/dist/editor/page-editor-chrome/SuggestionHighlighting.js +2 -2
- package/dist/editor/page-editor-chrome/SuggestionHighlighting.js.map +1 -1
- package/dist/editor/reviews/Comments.js +4 -4
- package/dist/editor/reviews/Comments.js.map +1 -1
- package/dist/editor/services/agentService.d.ts +2 -0
- package/dist/editor/services/agentService.js.map +1 -1
- package/dist/editor/services/aiService.d.ts +1 -0
- package/dist/editor/services/aiService.js.map +1 -1
- package/dist/editor/sidebar/ComponentTree.js +18 -6
- package/dist/editor/sidebar/ComponentTree.js.map +1 -1
- package/dist/editor/sidebar/Insert.js +1 -1
- package/dist/editor/ui/Splitter.js +2 -1
- package/dist/editor/ui/Splitter.js.map +1 -1
- package/dist/editor/utils.js +0 -1
- package/dist/editor/utils.js.map +1 -1
- package/dist/page-wizard/steps/ContentStep.js +5 -2
- package/dist/page-wizard/steps/ContentStep.js.map +1 -1
- package/dist/revision.d.ts +2 -2
- package/dist/revision.js +2 -2
- package/dist/styles.css +15 -18
- package/package.json +1 -1
- package/src/components/ui/button.tsx +1 -0
- package/src/components/ui/context-menu.tsx +44 -20
- package/src/editor/Editor.tsx +1 -1
- package/src/editor/FieldActionsOverlay.tsx +113 -91
- package/src/editor/FieldListField.tsx +4 -1
- package/src/editor/LinkEditorDialog.tsx +1 -1
- package/src/editor/ai/AgentTerminal.tsx +261 -157
- package/src/editor/ai/Agents.tsx +18 -5
- package/src/editor/ai/ContextInfoBar.tsx +567 -0
- package/src/editor/ai/DancingDots.tsx +1 -1
- package/src/editor/ai/ToolCallDisplay.tsx +2 -0
- package/src/editor/client/AboutDialog.tsx +22 -17
- package/src/editor/client/EditorShell.tsx +8 -2
- package/src/editor/client/editContext.ts +2 -2
- package/src/editor/client/hooks/useSocketMessageHandler.ts +3 -0
- package/src/editor/client/itemsRepository.ts +6 -5
- package/src/editor/control-center/Setup.tsx +1 -1
- package/src/editor/control-center/setup-steps/AiSetupStep/EmbeddingsModelSection.tsx +296 -0
- package/src/editor/control-center/setup-steps/AiSetupStep/index.tsx +38 -0
- package/src/editor/control-center/setup-steps/AiSetupStep/provider/ProviderSection.tsx +413 -0
- package/src/editor/control-center/setup-steps/AiSetupStep/required-containers/RequiredContainersList.tsx +92 -0
- package/src/editor/control-center/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.tsx +139 -0
- package/src/editor/control-center/setup-steps/AiSetupStep/tools/GenerateToolsSection.tsx +409 -0
- package/src/editor/control-center/setup-steps/AiSetupStep/types.ts +1 -0
- package/src/editor/control-center/setup-steps/AiSetupStep/utils.ts +43 -0
- package/src/editor/control-center/setup-steps/IndexSetupStep.tsx +2 -0
- package/src/editor/field-types/SingleLineText.tsx +0 -9
- package/src/editor/field-types/TreeListEditor.tsx +115 -16
- package/src/editor/field-types/richtext/components/ReactSlate.tsx +1 -1
- package/src/editor/field-types/richtext/components/SimpleRichTextEditor.tsx +1 -1
- package/src/editor/menubar/toolbar-sections/EditControls.tsx +3 -2
- package/src/editor/menubar/toolbar-sections/InsertControls.tsx +1 -1
- package/src/editor/page-editor-chrome/FrameMenu.tsx +81 -68
- package/src/editor/page-editor-chrome/InlineEditor.tsx +129 -7
- package/src/editor/page-editor-chrome/SuggestionHighlighting.tsx +5 -5
- package/src/editor/reviews/Comments.tsx +13 -8
- package/src/editor/services/agentService.ts +3 -0
- package/src/editor/services/aiService.ts +2 -0
- package/src/editor/sidebar/ComponentTree.tsx +20 -6
- package/src/editor/sidebar/Insert.tsx +1 -1
- package/src/editor/ui/Splitter.tsx +2 -2
- package/src/editor/utils.ts +0 -1
- package/src/page-wizard/steps/ContentStep.tsx +46 -0
- package/src/revision.ts +2 -2
- package/dist/editor/control-center/setup-steps/AiSetupStep.js +0 -531
- package/dist/editor/control-center/setup-steps/AiSetupStep.js.map +0 -1
- package/src/editor/control-center/setup-steps/AiSetupStep.tsx +0 -784
- /package/dist/editor/control-center/setup-steps/{AiSetupStep.d.ts → AiSetupStep/index.d.ts} +0 -0
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { Button } from "../../../../components/ui/button";
|
|
4
|
+
import { AlertCircle, CheckCircle, RefreshCw } from "lucide-react";
|
|
5
|
+
import { useEditContext } from "../../../client/editContext";
|
|
6
|
+
import { getChildren } from "../../../services/contentService";
|
|
7
|
+
import { findByName, resolvePathUnderContent } from "./utils";
|
|
8
|
+
// Sitecore IDs and constants used by AI models/endpoints
|
|
9
|
+
const AI_MODELS_CONTAINER_TEMPLATE_ID = "e5f6a7b8-9c0d-1e2f-3a4b-5c6d7e8f9a0b";
|
|
10
|
+
const AI_MODEL_TEMPLATE_ID = "d2e3f4a5-4b5c-5c6d-bf0b-3e4f5a6b7c8e";
|
|
11
|
+
const MODEL_NAME_FIELD_ID = "f1e2d3c4-5b6a-7980-8e9f-1a2b3c4d5e6f";
|
|
12
|
+
const MODEL_ENDPOINT_FIELD_ID = "cbade708-ce95-4f54-81b7-308ea61a76a6";
|
|
13
|
+
const EDITOR_SETTINGS_EMBEDDINGS_MODEL_FIELD_ID = "08d0579d-3bf2-4777-981f-3f0856da948e"; // Embeddings Model (Droptree)
|
|
14
|
+
const DEFAULT_EMBEDDINGS_MODEL_NAME = "text-embedding-3-large";
|
|
15
|
+
export function EmbeddingsModelSection() {
|
|
16
|
+
const editContext = useEditContext();
|
|
17
|
+
const [state, setState] = React.useState("checking");
|
|
18
|
+
const [error, setError] = React.useState(null);
|
|
19
|
+
const [isBusy, setIsBusy] = React.useState(false);
|
|
20
|
+
const [currentModelName, setCurrentModelName] = React.useState(null);
|
|
21
|
+
const userLang = editContext?.contentEditorItem?.language || "en";
|
|
22
|
+
const statusIcon = React.useCallback((s) => {
|
|
23
|
+
if (s === "success")
|
|
24
|
+
return _jsx(CheckCircle, { className: "h-4 w-4 text-green-600", strokeWidth: 1 });
|
|
25
|
+
if (s === "error")
|
|
26
|
+
return _jsx(AlertCircle, { className: "h-4 w-4 text-red-600", strokeWidth: 1 });
|
|
27
|
+
return (_jsx(RefreshCw, { className: "h-4 w-4 animate-spin text-amber-600", strokeWidth: 1 }));
|
|
28
|
+
}, []);
|
|
29
|
+
const checkStatus = React.useCallback(async () => {
|
|
30
|
+
try {
|
|
31
|
+
setState("checking");
|
|
32
|
+
setError(null);
|
|
33
|
+
setCurrentModelName(null);
|
|
34
|
+
const settingsItem = await resolvePathUnderContent(editContext?.sessionId, userLang, ["Settings", "Editor"]);
|
|
35
|
+
if (!settingsItem) {
|
|
36
|
+
setState("error");
|
|
37
|
+
setError("Editor settings item not found. Create it first.");
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
// Read the Embeddings Model droptree field
|
|
41
|
+
const field = await editContext.itemsRepository.getField({
|
|
42
|
+
item: { id: settingsItem.id, language: userLang, version: 0 },
|
|
43
|
+
fieldId: EDITOR_SETTINGS_EMBEDDINGS_MODEL_FIELD_ID,
|
|
44
|
+
});
|
|
45
|
+
const raw = (field?.rawValue || "").trim();
|
|
46
|
+
if (!raw) {
|
|
47
|
+
setState("error");
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
// Normalize ID braces and load the model item to get its display name
|
|
51
|
+
const modelId = raw.replace(/^[{(]+|[})]+$/g, "");
|
|
52
|
+
const model = await editContext.itemsRepository.getItem({
|
|
53
|
+
id: `{${modelId}}`,
|
|
54
|
+
language: userLang,
|
|
55
|
+
version: 0,
|
|
56
|
+
});
|
|
57
|
+
if (!model) {
|
|
58
|
+
setState("error");
|
|
59
|
+
setError("Embeddings Model points to a missing item. Please fix to re-create and assign.");
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
setCurrentModelName(model.name);
|
|
63
|
+
setState("success");
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
setState("error");
|
|
67
|
+
setError(e?.message || "Failed to check embeddings model");
|
|
68
|
+
}
|
|
69
|
+
}, [editContext, userLang]);
|
|
70
|
+
React.useEffect(() => {
|
|
71
|
+
checkStatus();
|
|
72
|
+
}, [checkStatus]);
|
|
73
|
+
const ensureEmbeddingsModel = React.useCallback(async () => {
|
|
74
|
+
if (!editContext)
|
|
75
|
+
return;
|
|
76
|
+
try {
|
|
77
|
+
setIsBusy(true);
|
|
78
|
+
setError(null);
|
|
79
|
+
const settingsItem = await resolvePathUnderContent(editContext.sessionId, userLang, ["Settings", "Editor"]);
|
|
80
|
+
if (!settingsItem)
|
|
81
|
+
throw new Error("Editor settings item not found. Create it first.");
|
|
82
|
+
// Load children under /Settings/Editor
|
|
83
|
+
const editorChildren = (await getChildren(settingsItem.id, editContext.sessionId, [], false, userLang, "path"));
|
|
84
|
+
// Find endpoints container and choose OpenAI or Azure OpenAI endpoint
|
|
85
|
+
const endpointsContainer = findByName(editorChildren, "Ai Endpoints");
|
|
86
|
+
if (!endpointsContainer) {
|
|
87
|
+
throw new Error("No AI endpoints found. Please add an OpenAI or Azure OpenAI endpoint first.");
|
|
88
|
+
}
|
|
89
|
+
const endpointChildren = (await getChildren(endpointsContainer.id, editContext.sessionId, [], false, userLang, "path"));
|
|
90
|
+
const openAi = findByName(endpointChildren, "OpenAI");
|
|
91
|
+
const azureOpenAi = findByName(endpointChildren, "Azure OpenAI");
|
|
92
|
+
const selectedEndpoint = openAi || azureOpenAi;
|
|
93
|
+
if (!selectedEndpoint) {
|
|
94
|
+
throw new Error("No OpenAI or Azure OpenAI endpoint exists. Add one in 'Provider' section.");
|
|
95
|
+
}
|
|
96
|
+
// Ensure Ai Models container exists
|
|
97
|
+
let modelsContainer = findByName(editorChildren, "Ai Models");
|
|
98
|
+
if (!modelsContainer) {
|
|
99
|
+
const createdModels = await editContext.operations.createItem(settingsItem, AI_MODELS_CONTAINER_TEMPLATE_ID, "Ai Models");
|
|
100
|
+
if (!createdModels)
|
|
101
|
+
throw new Error("Failed to create 'Ai Models' container");
|
|
102
|
+
modelsContainer = {
|
|
103
|
+
id: createdModels.id,
|
|
104
|
+
name: "Ai Models",
|
|
105
|
+
displayName: "Ai Models",
|
|
106
|
+
thumbUrl: "",
|
|
107
|
+
previewUrl: "",
|
|
108
|
+
templateId: "",
|
|
109
|
+
icon: "",
|
|
110
|
+
hasChildren: false,
|
|
111
|
+
isComponent: false,
|
|
112
|
+
language: userLang,
|
|
113
|
+
version: 0,
|
|
114
|
+
hasLayout: false,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
// Find or create the "text-embedding-3-large" model
|
|
118
|
+
const modelChildren = (await getChildren(modelsContainer.id, editContext.sessionId, [], false, userLang, "path"));
|
|
119
|
+
let modelNode = findByName(modelChildren, DEFAULT_EMBEDDINGS_MODEL_NAME);
|
|
120
|
+
let modelDescriptor = null;
|
|
121
|
+
if (modelNode) {
|
|
122
|
+
modelDescriptor = {
|
|
123
|
+
id: modelNode.id,
|
|
124
|
+
language: userLang,
|
|
125
|
+
version: 0,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
const createdModel = await editContext.operations.createItem({
|
|
130
|
+
id: modelsContainer.id,
|
|
131
|
+
language: userLang,
|
|
132
|
+
version: 0,
|
|
133
|
+
}, AI_MODEL_TEMPLATE_ID, DEFAULT_EMBEDDINGS_MODEL_NAME);
|
|
134
|
+
if (!createdModel)
|
|
135
|
+
throw new Error(`Failed to create model '${DEFAULT_EMBEDDINGS_MODEL_NAME}'`);
|
|
136
|
+
modelDescriptor = createdModel;
|
|
137
|
+
// Set Model Name field
|
|
138
|
+
await editContext.operations.editField({
|
|
139
|
+
field: {
|
|
140
|
+
fieldId: MODEL_NAME_FIELD_ID,
|
|
141
|
+
item: {
|
|
142
|
+
id: modelDescriptor.id,
|
|
143
|
+
language: userLang,
|
|
144
|
+
version: 0,
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
value: DEFAULT_EMBEDDINGS_MODEL_NAME,
|
|
148
|
+
rawValue: DEFAULT_EMBEDDINGS_MODEL_NAME,
|
|
149
|
+
refresh: "delayed",
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
// Link model to the selected endpoint
|
|
153
|
+
const endpointGuid = `{${selectedEndpoint.id
|
|
154
|
+
.replace(/[{}()]/g, "")
|
|
155
|
+
.toUpperCase()}}`;
|
|
156
|
+
await editContext.operations.editField({
|
|
157
|
+
field: {
|
|
158
|
+
fieldId: MODEL_ENDPOINT_FIELD_ID,
|
|
159
|
+
item: { id: modelDescriptor.id, language: userLang, version: 0 },
|
|
160
|
+
},
|
|
161
|
+
rawValue: endpointGuid,
|
|
162
|
+
refresh: "delayed",
|
|
163
|
+
});
|
|
164
|
+
// Assign model to Editor settings' Embeddings Model field
|
|
165
|
+
const modelGuid = `{${modelDescriptor.id
|
|
166
|
+
.replace(/[{}()]/g, "")
|
|
167
|
+
.toUpperCase()}}`;
|
|
168
|
+
await editContext.operations.editField({
|
|
169
|
+
field: {
|
|
170
|
+
fieldId: EDITOR_SETTINGS_EMBEDDINGS_MODEL_FIELD_ID,
|
|
171
|
+
item: { id: settingsItem.id, language: userLang, version: 0 },
|
|
172
|
+
},
|
|
173
|
+
rawValue: modelGuid,
|
|
174
|
+
refresh: "immediate",
|
|
175
|
+
});
|
|
176
|
+
editContext.requestRefresh?.("immediate");
|
|
177
|
+
editContext.showToast?.(`Embeddings model set to '${DEFAULT_EMBEDDINGS_MODEL_NAME}'`);
|
|
178
|
+
await checkStatus();
|
|
179
|
+
}
|
|
180
|
+
catch (e) {
|
|
181
|
+
setError(e?.message || "Failed to ensure embeddings model");
|
|
182
|
+
setState("error");
|
|
183
|
+
}
|
|
184
|
+
finally {
|
|
185
|
+
setIsBusy(false);
|
|
186
|
+
}
|
|
187
|
+
}, [editContext, userLang, checkStatus]);
|
|
188
|
+
return (_jsxs("div", { className: "mt-3", children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [statusIcon(state), _jsx("span", { className: "text-sm text-gray-700", children: state === "success"
|
|
189
|
+
? `Embeddings model: ${currentModelName}`
|
|
190
|
+
: state === "error"
|
|
191
|
+
? "Embeddings model not assigned"
|
|
192
|
+
: "Checking embeddings model..." })] }), state !== "success" && (_jsxs(Button, { size: "sm", onClick: ensureEmbeddingsModel, disabled: isBusy, children: [isBusy ? (_jsx(RefreshCw, { strokeWidth: 1, className: "h-4 w-4 animate-spin" })) : (_jsx(CheckCircle, { strokeWidth: 1, className: "h-4 w-4" })), "Fix"] }))] }), error && (_jsx("div", { className: "mt-2 rounded border border-yellow-200 bg-yellow-50 p-2 text-xs whitespace-pre-wrap text-yellow-800", children: error }))] }));
|
|
193
|
+
}
|
|
194
|
+
export default EmbeddingsModelSection;
|
|
195
|
+
//# sourceMappingURL=EmbeddingsModelSection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmbeddingsModelSection.js","sourceRoot":"","sources":["../../../../../src/editor/control-center/setup-steps/AiSetupStep/EmbeddingsModelSection.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
import { Card } from "../../../../components/ui/card";
|
|
4
|
+
import { useEditContext } from "../../../client/editContext";
|
|
5
|
+
import { SparklesIcon } from "lucide-react";
|
|
6
|
+
import { RequiredContainersSection } from "./required-containers/RequiredContainersSection";
|
|
7
|
+
import { ProviderSection } from "./provider/ProviderSection";
|
|
8
|
+
import { GenerateToolsSection } from "./tools/GenerateToolsSection";
|
|
9
|
+
export function AiSetupStep() {
|
|
10
|
+
const editContext = useEditContext();
|
|
11
|
+
const [aiState, setAiState] = useState("idle");
|
|
12
|
+
const userLang = editContext?.contentEditorItem?.language || "en";
|
|
13
|
+
// IDs for tool templates/fields
|
|
14
|
+
const AI_TOOLS_TEMPLATE_ID = "7e3f9d9d-8e84-4e57-b12e-6e9c99d4fd11"; // container
|
|
15
|
+
const AI_TOOL_TEMPLATE_ID = "a2e8a0d9-7b1f-4d1a-a2d8-8f3ea6d6f0b1"; // item template
|
|
16
|
+
const FIELD_FUNCTION_NAME_ID = "3d9f2b1a-9d44-4d26-8a1b-92f0fb4d3a2c";
|
|
17
|
+
const FIELD_LABEL_ID = "5a19f5a5-1d21-4b6a-9f83-6f3fc0b34b2e";
|
|
18
|
+
const FIELD_DESCRIPTION_ID = "6b2e4b8e-8a9f-4d8f-9f6e-1a2b3c4d5e6f";
|
|
19
|
+
return (_jsxs(Card, { className: "w-full", icon: _jsx(SparklesIcon, { strokeWidth: 1, className: "h-5 w-5" }), title: "AI setup", description: "Add an AI endpoint (OpenAI, Azure OpenAI, or OpenRouter).", children: [_jsx(RequiredContainersSection, {}), _jsx(ProviderSection, {}), _jsx(GenerateToolsSection, {})] }));
|
|
20
|
+
}
|
|
21
|
+
export default AiSetupStep;
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/editor/control-center/setup-steps/AiSetupStep/index.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,yBAAyB,EAAE,MAAM,iDAAiD,CAAC;AAC5F,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAGpE,MAAM,UAAU,WAAW;IACzB,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAY,MAAM,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,WAAW,EAAE,iBAAiB,EAAE,QAAQ,IAAI,IAAI,CAAC;IAElE,gCAAgC;IAChC,MAAM,oBAAoB,GAAG,sCAAsC,CAAC,CAAC,YAAY;IACjF,MAAM,mBAAmB,GAAG,sCAAsC,CAAC,CAAC,gBAAgB;IACpF,MAAM,sBAAsB,GAAG,sCAAsC,CAAC;IACtE,MAAM,cAAc,GAAG,sCAAsC,CAAC;IAC9D,MAAM,oBAAoB,GAAG,sCAAsC,CAAC;IAEpE,OAAO,CACL,MAAC,IAAI,IACH,SAAS,EAAC,QAAQ,EAClB,IAAI,EAAE,KAAC,YAAY,IAAC,WAAW,EAAE,CAAC,EAAE,SAAS,EAAC,SAAS,GAAG,EAC1D,KAAK,EAAC,UAAU,EAChB,WAAW,EAAC,2DAA2D,aAEvE,KAAC,yBAAyB,KAAG,EAE7B,KAAC,eAAe,KAAG,EAEnB,KAAC,oBAAoB,KAAG,IACnB,CACR,CAAC;AACJ,CAAC;AAED,eAAe,WAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function ProviderSection(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { Select } from "../../../../../components/ui/select";
|
|
4
|
+
import { Input } from "../../../../../components/ui/input";
|
|
5
|
+
import { Button } from "../../../../../components/ui/button";
|
|
6
|
+
import { CheckCircle, RefreshCw } from "lucide-react";
|
|
7
|
+
import { useEditContext } from "../../../../client/editContext";
|
|
8
|
+
import { getChildren } from "../../../../services/contentService";
|
|
9
|
+
import { findByName, resolvePathUnderContent } from "../utils";
|
|
10
|
+
export function ProviderSection() {
|
|
11
|
+
const editContext = useEditContext();
|
|
12
|
+
const [aiProvider, setAiProvider] = React.useState("");
|
|
13
|
+
const [apiKey, setApiKey] = React.useState("");
|
|
14
|
+
const [aiBusy, setAiBusy] = React.useState(false);
|
|
15
|
+
const [aiError, setAiError] = React.useState(null);
|
|
16
|
+
const [endpoints, setEndpoints] = React.useState([]);
|
|
17
|
+
const [loadingEndpoints, setLoadingEndpoints] = React.useState(false);
|
|
18
|
+
const [endpointsError, setEndpointsError] = React.useState(null);
|
|
19
|
+
const lastLoadAtRef = React.useRef(0);
|
|
20
|
+
const isLoadingRef = React.useRef(false);
|
|
21
|
+
const userLang = editContext?.contentEditorItem?.language || "en";
|
|
22
|
+
const sessionId = editContext?.sessionId;
|
|
23
|
+
const aiOptions = React.useMemo(() => [
|
|
24
|
+
{ value: "openai", label: "OpenAI" },
|
|
25
|
+
{ value: "azure-openai", label: "Azure OpenAI" },
|
|
26
|
+
{ value: "openrouter", label: "OpenRouter" },
|
|
27
|
+
], []);
|
|
28
|
+
const loadEndpoints = React.useCallback(async (options) => {
|
|
29
|
+
if (!sessionId)
|
|
30
|
+
return;
|
|
31
|
+
try {
|
|
32
|
+
const now = Date.now();
|
|
33
|
+
const MIN_INTERVAL_MS = 2000;
|
|
34
|
+
if (!options?.force) {
|
|
35
|
+
if (isLoadingRef.current)
|
|
36
|
+
return;
|
|
37
|
+
if (now - lastLoadAtRef.current < MIN_INTERVAL_MS)
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
isLoadingRef.current = true;
|
|
41
|
+
lastLoadAtRef.current = now;
|
|
42
|
+
setLoadingEndpoints(true);
|
|
43
|
+
setEndpointsError(null);
|
|
44
|
+
const settingsItem = await resolvePathUnderContent(sessionId, userLang, ["Settings", "Editor"]);
|
|
45
|
+
if (!settingsItem) {
|
|
46
|
+
setEndpoints([]);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const children = (await getChildren(settingsItem.id, sessionId, [], false, userLang, "path"));
|
|
50
|
+
const aiEndpointsParent = findByName(children, "Ai Endpoints");
|
|
51
|
+
if (!aiEndpointsParent) {
|
|
52
|
+
setEndpoints([]);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const epChildren = (await getChildren(aiEndpointsParent.id, sessionId, [], false, userLang, "path"));
|
|
56
|
+
setEndpoints(epChildren || []);
|
|
57
|
+
}
|
|
58
|
+
catch (e) {
|
|
59
|
+
setEndpointsError(e?.message || "Failed to load AI endpoints");
|
|
60
|
+
}
|
|
61
|
+
finally {
|
|
62
|
+
isLoadingRef.current = false;
|
|
63
|
+
setLoadingEndpoints(false);
|
|
64
|
+
}
|
|
65
|
+
}, [sessionId, userLang]);
|
|
66
|
+
const createAiEndpoint = React.useCallback(async () => {
|
|
67
|
+
if (!aiProvider || !editContext)
|
|
68
|
+
return;
|
|
69
|
+
try {
|
|
70
|
+
setAiBusy(true);
|
|
71
|
+
setAiError(null);
|
|
72
|
+
const settingsItem = await resolvePathUnderContent(editContext.sessionId, userLang, ["Settings", "Editor"]);
|
|
73
|
+
if (!settingsItem)
|
|
74
|
+
throw new Error("Editor settings item not found. Create it first.");
|
|
75
|
+
const children = (await getChildren(settingsItem.id, editContext.sessionId, [], false, userLang, "path"));
|
|
76
|
+
let aiEndpointsParent = findByName(children, "Ai Endpoints");
|
|
77
|
+
if (!aiEndpointsParent) {
|
|
78
|
+
const aiEndpointsTemplateId = "4592f2e0-06e4-470e-9820-7fd4ea148e00";
|
|
79
|
+
const createdContainer = await editContext.operations.createItem(settingsItem, aiEndpointsTemplateId, "Ai Endpoints");
|
|
80
|
+
if (!createdContainer)
|
|
81
|
+
throw new Error("Failed to create 'Ai Endpoints' container");
|
|
82
|
+
aiEndpointsParent = {
|
|
83
|
+
id: createdContainer.id,
|
|
84
|
+
name: "Ai Endpoints",
|
|
85
|
+
thumbUrl: "",
|
|
86
|
+
previewUrl: "",
|
|
87
|
+
templateId: "",
|
|
88
|
+
icon: "",
|
|
89
|
+
hasChildren: false,
|
|
90
|
+
isComponent: false,
|
|
91
|
+
displayName: "Ai Endpoints",
|
|
92
|
+
language: userLang,
|
|
93
|
+
version: 0,
|
|
94
|
+
hasLayout: false,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
const endpointTemplateId = "a6358b92-a9ea-4dd8-b4e1-7d6d3a3b9c40";
|
|
98
|
+
const endpointName = aiProvider === "openai"
|
|
99
|
+
? "OpenAI"
|
|
100
|
+
: aiProvider === "azure-openai"
|
|
101
|
+
? "Azure OpenAI"
|
|
102
|
+
: "Open Router";
|
|
103
|
+
// Find or create endpoint
|
|
104
|
+
let endpointItem = null;
|
|
105
|
+
const epChildren = (await getChildren(aiEndpointsParent.id, editContext.sessionId, [], false, userLang, "path"));
|
|
106
|
+
const existingEndpoint = findByName(epChildren, endpointName);
|
|
107
|
+
if (existingEndpoint) {
|
|
108
|
+
endpointItem = {
|
|
109
|
+
id: existingEndpoint.id,
|
|
110
|
+
language: userLang,
|
|
111
|
+
version: 0,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
const created = await editContext.operations.createItem({
|
|
116
|
+
id: aiEndpointsParent.id,
|
|
117
|
+
language: userLang,
|
|
118
|
+
version: 0,
|
|
119
|
+
}, endpointTemplateId, endpointName);
|
|
120
|
+
if (!created)
|
|
121
|
+
throw new Error("Failed to create AI endpoint");
|
|
122
|
+
endpointItem = created;
|
|
123
|
+
}
|
|
124
|
+
// Set API key if provided
|
|
125
|
+
if (apiKey && endpointItem) {
|
|
126
|
+
const apiKeyFieldId = "db07ae53-459a-4314-89b3-ab2721df2b4f";
|
|
127
|
+
await editContext.operations.editField({
|
|
128
|
+
field: {
|
|
129
|
+
fieldId: apiKeyFieldId,
|
|
130
|
+
item: {
|
|
131
|
+
id: endpointItem.id,
|
|
132
|
+
language: userLang,
|
|
133
|
+
version: 0,
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
value: apiKey,
|
|
137
|
+
rawValue: apiKey,
|
|
138
|
+
refresh: "delayed",
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
// Ensure Ai Models container exists
|
|
142
|
+
let aiModelsParent = findByName(children, "Ai Models");
|
|
143
|
+
if (!aiModelsParent) {
|
|
144
|
+
const aiModelsTemplateId = "e5f6a7b8-9c0d-1e2f-3a4b-5c6d7e8f9a0b";
|
|
145
|
+
const createdModels = await editContext.operations.createItem(settingsItem, aiModelsTemplateId, "Ai Models");
|
|
146
|
+
if (!createdModels)
|
|
147
|
+
throw new Error("Failed to create 'Ai Models' container");
|
|
148
|
+
aiModelsParent = {
|
|
149
|
+
id: createdModels.id,
|
|
150
|
+
name: "Ai Models",
|
|
151
|
+
thumbUrl: "",
|
|
152
|
+
previewUrl: "",
|
|
153
|
+
templateId: "",
|
|
154
|
+
icon: "",
|
|
155
|
+
hasChildren: false,
|
|
156
|
+
isComponent: false,
|
|
157
|
+
displayName: "Ai Models",
|
|
158
|
+
language: userLang,
|
|
159
|
+
version: 0,
|
|
160
|
+
hasLayout: false,
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
// Create default models if missing and link to endpoint
|
|
164
|
+
const modelsToEnsure = ["gpt-5", "gpt5-high", "image-1"];
|
|
165
|
+
const modelTemplateId = "d2e3f4a5-4b5c-5c6d-bf0b-3e4f5a6b7c8e";
|
|
166
|
+
const modelNameFieldId = "f1e2d3c4-5b6a-7980-8e9f-1a2b3c4d5e6f";
|
|
167
|
+
const modelEndpointFieldId = "cbade708-ce95-4f54-81b7-308ea61a76a6";
|
|
168
|
+
const modelChildren = (await getChildren(aiModelsParent.id, editContext.sessionId, [], false, userLang, "path"));
|
|
169
|
+
for (const modelName of modelsToEnsure) {
|
|
170
|
+
let modelNode = findByName(modelChildren, modelName);
|
|
171
|
+
if (!modelNode) {
|
|
172
|
+
const createdModel = await editContext.operations.createItem({
|
|
173
|
+
id: aiModelsParent.id,
|
|
174
|
+
language: userLang,
|
|
175
|
+
version: 0,
|
|
176
|
+
}, modelTemplateId, modelName);
|
|
177
|
+
if (!createdModel)
|
|
178
|
+
throw new Error(`Failed to create model '${modelName}'`);
|
|
179
|
+
modelNode = {
|
|
180
|
+
id: createdModel.id,
|
|
181
|
+
name: modelName,
|
|
182
|
+
displayName: modelName,
|
|
183
|
+
thumbUrl: "",
|
|
184
|
+
previewUrl: "",
|
|
185
|
+
templateId: "",
|
|
186
|
+
icon: "",
|
|
187
|
+
hasChildren: false,
|
|
188
|
+
isComponent: false,
|
|
189
|
+
language: userLang,
|
|
190
|
+
version: 0,
|
|
191
|
+
hasLayout: false,
|
|
192
|
+
};
|
|
193
|
+
await editContext.operations.editField({
|
|
194
|
+
field: {
|
|
195
|
+
fieldId: modelNameFieldId,
|
|
196
|
+
item: { id: modelNode.id, language: userLang, version: 0 },
|
|
197
|
+
},
|
|
198
|
+
value: modelName,
|
|
199
|
+
rawValue: modelName,
|
|
200
|
+
refresh: "delayed",
|
|
201
|
+
});
|
|
202
|
+
const endpointGuid = `{${endpointItem.id
|
|
203
|
+
.replace(/[{}()]/g, "")
|
|
204
|
+
.toUpperCase()}}`;
|
|
205
|
+
await editContext.operations.editField({
|
|
206
|
+
field: {
|
|
207
|
+
fieldId: modelEndpointFieldId,
|
|
208
|
+
item: { id: modelNode.id, language: userLang, version: 0 },
|
|
209
|
+
},
|
|
210
|
+
rawValue: endpointGuid,
|
|
211
|
+
refresh: "delayed",
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
editContext.requestRefresh?.("immediate");
|
|
216
|
+
editContext.showToast?.(`Added '${endpointName}' AI endpoint successfully`);
|
|
217
|
+
await loadEndpoints({ force: true });
|
|
218
|
+
setAiProvider("");
|
|
219
|
+
setApiKey("");
|
|
220
|
+
}
|
|
221
|
+
catch (e) {
|
|
222
|
+
setAiError(e?.message || "Failed to add AI endpoint");
|
|
223
|
+
}
|
|
224
|
+
finally {
|
|
225
|
+
setAiBusy(false);
|
|
226
|
+
}
|
|
227
|
+
}, [aiProvider, editContext, userLang, apiKey, loadEndpoints]);
|
|
228
|
+
React.useEffect(() => {
|
|
229
|
+
loadEndpoints({ force: true });
|
|
230
|
+
}, [loadEndpoints]);
|
|
231
|
+
return (_jsxs(_Fragment, { children: [_jsx("div", { className: "flex items-center justify-between gap-2", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx(CheckCircle, { strokeWidth: 1, className: "h-4 w-4 text-green-600" }), _jsx("span", { className: "text-sm text-gray-700", children: "Select provider and add endpoint" })] }) }), _jsxs("div", { className: "mt-3", children: [_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsx("span", { className: "text-xs text-gray-600", children: "Existing endpoints" }), _jsxs(Button, { size: "sm", disabled: loadingEndpoints, onClick: () => loadEndpoints({ force: true }), children: [loadingEndpoints ? (_jsx(RefreshCw, { strokeWidth: 1, className: "h-4 w-4 animate-spin" })) : (_jsx(RefreshCw, { strokeWidth: 1, className: "h-4 w-4" })), "Refresh"] })] }), _jsxs("div", { className: "mt-2", children: [endpointsError && (_jsx("div", { className: "rounded border border-red-200 bg-red-50 p-2 text-xs whitespace-pre-wrap text-red-700", children: endpointsError })), !endpointsError && (_jsx(_Fragment, { children: loadingEndpoints ? (_jsxs("div", { className: "text-xs text-gray-500 flex items-center gap-2", children: [_jsx(RefreshCw, { strokeWidth: 1, className: "h-4 w-4 animate-spin" }), "Loading endpoints\u2026"] })) : endpoints.length > 0 ? (_jsx("ul", { className: "list-disc pl-5 text-xs text-gray-700", children: endpoints.map((ep) => (_jsx("li", { children: ep.displayName || ep.name }, ep.id))) })) : (_jsx("div", { className: "text-xs text-gray-500", children: "No AI endpoints found." })) }))] })] }), _jsxs("div", { className: "mt-3 flex flex-col items-stretch gap-2", children: [_jsx(Select, { value: aiProvider, onValueChange: setAiProvider, options: aiOptions, placeholder: "Choose provider" }), aiProvider && (_jsx(Input, { type: "password", placeholder: "API key", value: apiKey, onChange: (e) => setApiKey(e.target.value) })), _jsxs(Button, { size: "sm", disabled: !aiProvider || !apiKey || aiBusy, onClick: createAiEndpoint, children: [aiBusy ? (_jsx(RefreshCw, { strokeWidth: 1, className: "h-4 w-4 animate-spin" })) : (_jsx(CheckCircle, { strokeWidth: 1, className: "h-4 w-4" })), "Add endpoint"] })] }), aiError && (_jsx("div", { className: "mt-2 rounded border border-red-200 bg-red-50 p-2 text-xs whitespace-pre-wrap text-red-700", children: aiError }))] }));
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=ProviderSection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ProviderSection.js","sourceRoot":"","sources":["../../../../../../src/editor/control-center/setup-steps/AiSetupStep/provider/ProviderSection.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { StepState } from "../types";
|
|
2
|
+
interface RequiredContainerDef {
|
|
3
|
+
name: string;
|
|
4
|
+
templateId: string;
|
|
5
|
+
}
|
|
6
|
+
interface RequiredContainersListProps {
|
|
7
|
+
requiredContainers: RequiredContainerDef[];
|
|
8
|
+
containerStates: Record<string, StepState>;
|
|
9
|
+
busyMap: Record<string, boolean>;
|
|
10
|
+
canFix: boolean;
|
|
11
|
+
containersError: string | null;
|
|
12
|
+
onFixContainer: (name: string, templateId: string) => void;
|
|
13
|
+
}
|
|
14
|
+
export declare function RequiredContainersList(props: RequiredContainersListProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
+
import { Button } from "../../../../../components/ui/button";
|
|
3
|
+
import { AlertCircle, CheckCircle, RefreshCw } from "lucide-react";
|
|
4
|
+
export function RequiredContainersList(props) {
|
|
5
|
+
const { requiredContainers, containerStates, busyMap, canFix, containersError, onFixContainer, } = props;
|
|
6
|
+
return (_jsxs(_Fragment, { children: [_jsx("div", { className: "flex flex-col gap-2", children: requiredContainers
|
|
7
|
+
.filter((rc) => containerStates[rc.name] === "error")
|
|
8
|
+
.map((rc) => (_jsxs("div", { className: "flex items-center justify-between gap-2", children: [_jsxs("div", { className: "flex items-center gap-2", children: [containerStates[rc.name] === "checking" ? (_jsx(RefreshCw, { strokeWidth: 1, className: "h-4 w-4 animate-spin text-amber-600" })) : containerStates[rc.name] === "success" ? (_jsx(CheckCircle, { strokeWidth: 1, className: "h-4 w-4 text-green-600" })) : (_jsx(AlertCircle, { strokeWidth: 1, className: "h-4 w-4 text-red-600" })), _jsx("span", { className: "text-sm text-gray-700", children: containerStates[rc.name] === "checking"
|
|
9
|
+
? `Checking ${rc.name}...`
|
|
10
|
+
: containerStates[rc.name] === "success"
|
|
11
|
+
? `${rc.name} present`
|
|
12
|
+
: `${rc.name} missing` })] }), containerStates[rc.name] !== "success" && (_jsxs(Button, { size: "sm", onClick: () => onFixContainer(rc.name, rc.templateId), disabled: !canFix || !!busyMap[rc.name], children: [busyMap[rc.name] ? (_jsx(RefreshCw, { strokeWidth: 1, className: "h-4 w-4 animate-spin" })) : (_jsx(CheckCircle, { strokeWidth: 1, className: "h-4 w-4" })), "Fix"] }))] }, rc.name))) }), containersError && (_jsx("div", { className: "mt-2 rounded border border-yellow-200 bg-yellow-50 p-2 text-xs whitespace-pre-wrap text-yellow-800", children: containersError }))] }));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=RequiredContainersList.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequiredContainersList.js","sourceRoot":"","sources":["../../../../../../src/editor/control-center/setup-steps/AiSetupStep/required-containers/RequiredContainersList.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,MAAM,EAAE,MAAM,qCAAqC,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAiBnE,MAAM,UAAU,sBAAsB,CAAC,KAAkC;IACvE,MAAM,EACJ,kBAAkB,EAClB,eAAe,EACf,OAAO,EACP,MAAM,EACN,eAAe,EACf,cAAc,GACf,GAAG,KAAK,CAAC;IAEV,OAAO,CACL,8BACE,cAAK,SAAS,EAAC,qBAAqB,YACjC,kBAAkB;qBAChB,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC;qBACpD,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CACX,eAEE,SAAS,EAAC,yCAAyC,aAEnD,eAAK,SAAS,EAAC,yBAAyB,aACrC,eAAe,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,CACzC,KAAC,SAAS,IACR,WAAW,EAAE,CAAC,EACd,SAAS,EAAC,qCAAqC,GAC/C,CACH,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,CAC3C,KAAC,WAAW,IACV,WAAW,EAAE,CAAC,EACd,SAAS,EAAC,wBAAwB,GAClC,CACH,CAAC,CAAC,CAAC,CACF,KAAC,WAAW,IACV,WAAW,EAAE,CAAC,EACd,SAAS,EAAC,sBAAsB,GAChC,CACH,EACD,eAAM,SAAS,EAAC,uBAAuB,YACpC,eAAe,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,UAAU;wCACtC,CAAC,CAAC,YAAY,EAAE,CAAC,IAAI,KAAK;wCAC1B,CAAC,CAAC,eAAe,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,SAAS;4CACtC,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,UAAU;4CACtB,CAAC,CAAC,GAAG,EAAE,CAAC,IAAI,UAAU,GACrB,IACH,EACL,eAAe,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,SAAS,IAAI,CACzC,MAAC,MAAM,IACL,IAAI,EAAC,IAAI,EACT,OAAO,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,EACrD,QAAQ,EAAE,CAAC,MAAM,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,aAEtC,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAClB,KAAC,SAAS,IACR,WAAW,EAAE,CAAC,EACd,SAAS,EAAC,sBAAsB,GAChC,CACH,CAAC,CAAC,CAAC,CACF,KAAC,WAAW,IAAC,WAAW,EAAE,CAAC,EAAE,SAAS,EAAC,SAAS,GAAG,CACpD,WAEM,CACV,KA5CI,EAAE,CAAC,IAAI,CA6CR,CACP,CAAC,GACA,EACL,eAAe,IAAI,CAClB,cAAK,SAAS,EAAC,oGAAoG,YAChH,eAAe,GACZ,CACP,IACA,CACJ,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function RequiredContainersSection(): import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import React from "react";
|
|
3
|
+
import { useEditContext } from "../../../../client/editContext";
|
|
4
|
+
import { getChildren } from "../../../../services/contentService";
|
|
5
|
+
import { RequiredContainersList } from "./RequiredContainersList";
|
|
6
|
+
import { findByName, resolvePathUnderContent } from "../utils";
|
|
7
|
+
export function RequiredContainersSection() {
|
|
8
|
+
const editContext = useEditContext();
|
|
9
|
+
const userLang = editContext?.contentEditorItem?.language || "en";
|
|
10
|
+
const requiredContainers = React.useMemo(() => [
|
|
11
|
+
{ name: "Ai Models", templateId: "e5f6a7b8-9c0d-1e2f-3a4b-5c6d7e8f9a0b" },
|
|
12
|
+
{
|
|
13
|
+
name: "Ai Endpoints",
|
|
14
|
+
templateId: "4592f2e0-06e4-470e-9820-7fd4ea148e00",
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: "Ai Profiles",
|
|
18
|
+
templateId: "4298ab78-2aaa-4d5f-bb3a-0bd321b86063",
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: "Ai Schemas",
|
|
22
|
+
templateId: "5214a52b-6c45-4671-97f2-703fe24e3d09",
|
|
23
|
+
},
|
|
24
|
+
{ name: "Ai Quotas", templateId: "7a08ff28-70ed-459b-a7f2-db2a78d88f46" },
|
|
25
|
+
{
|
|
26
|
+
name: "AI Generators",
|
|
27
|
+
templateId: "9430a3e9-7397-4598-9a55-2b263c927497",
|
|
28
|
+
},
|
|
29
|
+
{ name: "AI Tools", templateId: "7e3f9d9d-8e84-4e57-b12e-6e9c99d4fd11" },
|
|
30
|
+
], []);
|
|
31
|
+
const [editorSettingsItem, setEditorSettingsItem] = React.useState(null);
|
|
32
|
+
const [containersError, setContainersError] = React.useState(null);
|
|
33
|
+
const [containerStates, setContainerStates] = React.useState({});
|
|
34
|
+
const [busyMap, setBusyMap] = React.useState({});
|
|
35
|
+
const checkRequiredContainers = React.useCallback(async () => {
|
|
36
|
+
try {
|
|
37
|
+
setContainersError(null);
|
|
38
|
+
const initialStates = {};
|
|
39
|
+
for (const rc of requiredContainers)
|
|
40
|
+
initialStates[rc.name] = "checking";
|
|
41
|
+
setContainerStates(initialStates);
|
|
42
|
+
const settingsItem = await resolvePathUnderContent(editContext?.sessionId, userLang, ["Settings", "Editor"]);
|
|
43
|
+
if (!settingsItem) {
|
|
44
|
+
setEditorSettingsItem(null);
|
|
45
|
+
const errorMsg = "Editor settings item not found. Create it first.";
|
|
46
|
+
setContainersError(errorMsg);
|
|
47
|
+
const errorStates = {};
|
|
48
|
+
for (const rc of requiredContainers)
|
|
49
|
+
errorStates[rc.name] = "error";
|
|
50
|
+
setContainerStates(errorStates);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
setEditorSettingsItem(settingsItem);
|
|
54
|
+
const children = (await getChildren(settingsItem.id, editContext.sessionId, [], false, userLang, "path"));
|
|
55
|
+
const states = {};
|
|
56
|
+
for (const rc of requiredContainers) {
|
|
57
|
+
const exists = !!findByName(children, rc.name);
|
|
58
|
+
states[rc.name] = exists ? "success" : "error";
|
|
59
|
+
}
|
|
60
|
+
setContainerStates(states);
|
|
61
|
+
}
|
|
62
|
+
catch (e) {
|
|
63
|
+
setContainersError(e?.message || "Failed to check AI containers");
|
|
64
|
+
const errorStates = {};
|
|
65
|
+
for (const rc of requiredContainers)
|
|
66
|
+
errorStates[rc.name] = "error";
|
|
67
|
+
setContainerStates(errorStates);
|
|
68
|
+
}
|
|
69
|
+
}, [editContext, requiredContainers, userLang]);
|
|
70
|
+
React.useEffect(() => {
|
|
71
|
+
checkRequiredContainers();
|
|
72
|
+
}, [checkRequiredContainers]);
|
|
73
|
+
const createContainer = React.useCallback(async (name, templateId) => {
|
|
74
|
+
if (!editorSettingsItem || !editContext)
|
|
75
|
+
return;
|
|
76
|
+
try {
|
|
77
|
+
setBusyMap((s) => ({ ...s, [name]: true }));
|
|
78
|
+
setContainersError(null);
|
|
79
|
+
const created = await editContext.operations.createItem(editorSettingsItem, templateId, name);
|
|
80
|
+
if (!created)
|
|
81
|
+
throw new Error(`Failed to create '${name}'`);
|
|
82
|
+
setContainerStates((s) => ({ ...s, [name]: "success" }));
|
|
83
|
+
}
|
|
84
|
+
catch (e) {
|
|
85
|
+
setContainersError(e?.message || `Failed to create '${name}'`);
|
|
86
|
+
setContainerStates((s) => ({ ...s, [name]: "error" }));
|
|
87
|
+
}
|
|
88
|
+
finally {
|
|
89
|
+
setBusyMap((s) => ({ ...s, [name]: false }));
|
|
90
|
+
}
|
|
91
|
+
}, [editorSettingsItem, editContext]);
|
|
92
|
+
return (_jsx(RequiredContainersList, { requiredContainers: requiredContainers, containerStates: containerStates, busyMap: busyMap, canFix: !!editorSettingsItem, containersError: containersError, onFixContainer: createContainer }));
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=RequiredContainersSection.js.map
|