@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.
Files changed (142) hide show
  1. package/dist/components/ui/button.d.ts +1 -1
  2. package/dist/components/ui/button.js +1 -0
  3. package/dist/components/ui/button.js.map +1 -1
  4. package/dist/components/ui/context-menu.d.ts +2 -2
  5. package/dist/components/ui/context-menu.js +16 -16
  6. package/dist/components/ui/context-menu.js.map +1 -1
  7. package/dist/editor/Editor.js +1 -1
  8. package/dist/editor/Editor.js.map +1 -1
  9. package/dist/editor/FieldActionsOverlay.js +40 -26
  10. package/dist/editor/FieldActionsOverlay.js.map +1 -1
  11. package/dist/editor/FieldListField.js +1 -1
  12. package/dist/editor/FieldListField.js.map +1 -1
  13. package/dist/editor/LinkEditorDialog.js +1 -1
  14. package/dist/editor/ai/AgentTerminal.js +203 -59
  15. package/dist/editor/ai/AgentTerminal.js.map +1 -1
  16. package/dist/editor/ai/Agents.js +23 -9
  17. package/dist/editor/ai/Agents.js.map +1 -1
  18. package/dist/editor/ai/ContextInfoBar.d.ts +11 -0
  19. package/dist/editor/ai/ContextInfoBar.js +357 -0
  20. package/dist/editor/ai/ContextInfoBar.js.map +1 -0
  21. package/dist/editor/ai/DancingDots.js +1 -1
  22. package/dist/editor/ai/DancingDots.js.map +1 -1
  23. package/dist/editor/ai/ToolCallDisplay.js +2 -0
  24. package/dist/editor/ai/ToolCallDisplay.js.map +1 -1
  25. package/dist/editor/client/AboutDialog.js +7 -5
  26. package/dist/editor/client/AboutDialog.js.map +1 -1
  27. package/dist/editor/client/EditorShell.js +7 -2
  28. package/dist/editor/client/EditorShell.js.map +1 -1
  29. package/dist/editor/client/editContext.d.ts +2 -2
  30. package/dist/editor/client/hooks/useSocketMessageHandler.js +3 -0
  31. package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -1
  32. package/dist/editor/client/itemsRepository.js +6 -2
  33. package/dist/editor/client/itemsRepository.js.map +1 -1
  34. package/dist/editor/control-center/Setup.js +1 -1
  35. package/dist/editor/control-center/Setup.js.map +1 -1
  36. package/dist/editor/control-center/setup-steps/AiSetupStep/EmbeddingsModelSection.d.ts +2 -0
  37. package/dist/editor/control-center/setup-steps/AiSetupStep/EmbeddingsModelSection.js +195 -0
  38. package/dist/editor/control-center/setup-steps/AiSetupStep/EmbeddingsModelSection.js.map +1 -0
  39. package/dist/editor/control-center/setup-steps/AiSetupStep/index.js +22 -0
  40. package/dist/editor/control-center/setup-steps/AiSetupStep/index.js.map +1 -0
  41. package/dist/editor/control-center/setup-steps/AiSetupStep/provider/ProviderSection.d.ts +1 -0
  42. package/dist/editor/control-center/setup-steps/AiSetupStep/provider/ProviderSection.js +233 -0
  43. package/dist/editor/control-center/setup-steps/AiSetupStep/provider/ProviderSection.js.map +1 -0
  44. package/dist/editor/control-center/setup-steps/AiSetupStep/required-containers/RequiredContainersList.d.ts +15 -0
  45. package/dist/editor/control-center/setup-steps/AiSetupStep/required-containers/RequiredContainersList.js +14 -0
  46. package/dist/editor/control-center/setup-steps/AiSetupStep/required-containers/RequiredContainersList.js.map +1 -0
  47. package/dist/editor/control-center/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.d.ts +1 -0
  48. package/dist/editor/control-center/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.js +94 -0
  49. package/dist/editor/control-center/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.js.map +1 -0
  50. package/dist/editor/control-center/setup-steps/AiSetupStep/tools/GenerateToolsSection.d.ts +1 -0
  51. package/dist/editor/control-center/setup-steps/AiSetupStep/tools/GenerateToolsSection.js +328 -0
  52. package/dist/editor/control-center/setup-steps/AiSetupStep/tools/GenerateToolsSection.js.map +1 -0
  53. package/dist/editor/control-center/setup-steps/AiSetupStep/types.d.ts +1 -0
  54. package/dist/editor/control-center/setup-steps/AiSetupStep/types.js +2 -0
  55. package/dist/editor/control-center/setup-steps/AiSetupStep/types.js.map +1 -0
  56. package/dist/editor/control-center/setup-steps/AiSetupStep/utils.d.ts +4 -0
  57. package/dist/editor/control-center/setup-steps/AiSetupStep/utils.js +25 -0
  58. package/dist/editor/control-center/setup-steps/AiSetupStep/utils.js.map +1 -0
  59. package/dist/editor/control-center/setup-steps/IndexSetupStep.js +2 -1
  60. package/dist/editor/control-center/setup-steps/IndexSetupStep.js.map +1 -1
  61. package/dist/editor/field-types/SingleLineText.js.map +1 -1
  62. package/dist/editor/field-types/TreeListEditor.js +102 -16
  63. package/dist/editor/field-types/TreeListEditor.js.map +1 -1
  64. package/dist/editor/field-types/richtext/components/ReactSlate.js +1 -1
  65. package/dist/editor/field-types/richtext/components/SimpleRichTextEditor.js +1 -1
  66. package/dist/editor/menubar/toolbar-sections/EditControls.js +2 -2
  67. package/dist/editor/menubar/toolbar-sections/EditControls.js.map +1 -1
  68. package/dist/editor/menubar/toolbar-sections/InsertControls.js +1 -1
  69. package/dist/editor/menubar/toolbar-sections/InsertControls.js.map +1 -1
  70. package/dist/editor/page-editor-chrome/FrameMenu.js +25 -12
  71. package/dist/editor/page-editor-chrome/FrameMenu.js.map +1 -1
  72. package/dist/editor/page-editor-chrome/InlineEditor.js +102 -7
  73. package/dist/editor/page-editor-chrome/InlineEditor.js.map +1 -1
  74. package/dist/editor/page-editor-chrome/SuggestionHighlighting.js +2 -2
  75. package/dist/editor/page-editor-chrome/SuggestionHighlighting.js.map +1 -1
  76. package/dist/editor/reviews/Comments.js +4 -4
  77. package/dist/editor/reviews/Comments.js.map +1 -1
  78. package/dist/editor/services/agentService.d.ts +2 -0
  79. package/dist/editor/services/agentService.js.map +1 -1
  80. package/dist/editor/services/aiService.d.ts +1 -0
  81. package/dist/editor/services/aiService.js.map +1 -1
  82. package/dist/editor/sidebar/ComponentTree.js +18 -6
  83. package/dist/editor/sidebar/ComponentTree.js.map +1 -1
  84. package/dist/editor/sidebar/Insert.js +1 -1
  85. package/dist/editor/ui/Splitter.js +2 -1
  86. package/dist/editor/ui/Splitter.js.map +1 -1
  87. package/dist/editor/utils.js +0 -1
  88. package/dist/editor/utils.js.map +1 -1
  89. package/dist/page-wizard/steps/ContentStep.js +5 -2
  90. package/dist/page-wizard/steps/ContentStep.js.map +1 -1
  91. package/dist/revision.d.ts +2 -2
  92. package/dist/revision.js +2 -2
  93. package/dist/styles.css +15 -18
  94. package/package.json +1 -1
  95. package/src/components/ui/button.tsx +1 -0
  96. package/src/components/ui/context-menu.tsx +44 -20
  97. package/src/editor/Editor.tsx +1 -1
  98. package/src/editor/FieldActionsOverlay.tsx +113 -91
  99. package/src/editor/FieldListField.tsx +4 -1
  100. package/src/editor/LinkEditorDialog.tsx +1 -1
  101. package/src/editor/ai/AgentTerminal.tsx +261 -157
  102. package/src/editor/ai/Agents.tsx +18 -5
  103. package/src/editor/ai/ContextInfoBar.tsx +567 -0
  104. package/src/editor/ai/DancingDots.tsx +1 -1
  105. package/src/editor/ai/ToolCallDisplay.tsx +2 -0
  106. package/src/editor/client/AboutDialog.tsx +22 -17
  107. package/src/editor/client/EditorShell.tsx +8 -2
  108. package/src/editor/client/editContext.ts +2 -2
  109. package/src/editor/client/hooks/useSocketMessageHandler.ts +3 -0
  110. package/src/editor/client/itemsRepository.ts +6 -5
  111. package/src/editor/control-center/Setup.tsx +1 -1
  112. package/src/editor/control-center/setup-steps/AiSetupStep/EmbeddingsModelSection.tsx +296 -0
  113. package/src/editor/control-center/setup-steps/AiSetupStep/index.tsx +38 -0
  114. package/src/editor/control-center/setup-steps/AiSetupStep/provider/ProviderSection.tsx +413 -0
  115. package/src/editor/control-center/setup-steps/AiSetupStep/required-containers/RequiredContainersList.tsx +92 -0
  116. package/src/editor/control-center/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.tsx +139 -0
  117. package/src/editor/control-center/setup-steps/AiSetupStep/tools/GenerateToolsSection.tsx +409 -0
  118. package/src/editor/control-center/setup-steps/AiSetupStep/types.ts +1 -0
  119. package/src/editor/control-center/setup-steps/AiSetupStep/utils.ts +43 -0
  120. package/src/editor/control-center/setup-steps/IndexSetupStep.tsx +2 -0
  121. package/src/editor/field-types/SingleLineText.tsx +0 -9
  122. package/src/editor/field-types/TreeListEditor.tsx +115 -16
  123. package/src/editor/field-types/richtext/components/ReactSlate.tsx +1 -1
  124. package/src/editor/field-types/richtext/components/SimpleRichTextEditor.tsx +1 -1
  125. package/src/editor/menubar/toolbar-sections/EditControls.tsx +3 -2
  126. package/src/editor/menubar/toolbar-sections/InsertControls.tsx +1 -1
  127. package/src/editor/page-editor-chrome/FrameMenu.tsx +81 -68
  128. package/src/editor/page-editor-chrome/InlineEditor.tsx +129 -7
  129. package/src/editor/page-editor-chrome/SuggestionHighlighting.tsx +5 -5
  130. package/src/editor/reviews/Comments.tsx +13 -8
  131. package/src/editor/services/agentService.ts +3 -0
  132. package/src/editor/services/aiService.ts +2 -0
  133. package/src/editor/sidebar/ComponentTree.tsx +20 -6
  134. package/src/editor/sidebar/Insert.tsx +1 -1
  135. package/src/editor/ui/Splitter.tsx +2 -2
  136. package/src/editor/utils.ts +0 -1
  137. package/src/page-wizard/steps/ContentStep.tsx +46 -0
  138. package/src/revision.ts +2 -2
  139. package/dist/editor/control-center/setup-steps/AiSetupStep.js +0 -531
  140. package/dist/editor/control-center/setup-steps/AiSetupStep.js.map +0 -1
  141. package/src/editor/control-center/setup-steps/AiSetupStep.tsx +0 -784
  142. /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