@alpaca-editor/core 1.0.0 → 1.0.3764-editor-mono

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 (223) hide show
  1. package/dist/client-components/api.js +6 -0
  2. package/dist/client-components/index.js +36 -0
  3. package/dist/components/ActionButton.js +9 -0
  4. package/dist/components/Error.js +28 -0
  5. package/dist/config/config.js +654 -0
  6. package/dist/config/types.js +2 -0
  7. package/dist/editor/ComponentInfo.js +31 -0
  8. package/dist/editor/ConfirmationDialog.js +32 -0
  9. package/dist/editor/ContentTree.js +406 -0
  10. package/dist/editor/ContextMenu.js +117 -0
  11. package/dist/editor/Editor.js +55 -0
  12. package/dist/editor/EditorWarning.js +13 -0
  13. package/dist/editor/EditorWarnings.js +24 -0
  14. package/dist/editor/FieldEditorPopup.js +24 -0
  15. package/dist/editor/FieldHistory.js +40 -0
  16. package/dist/editor/FieldList.js +63 -0
  17. package/dist/editor/FieldListField.js +164 -0
  18. package/dist/editor/FieldListFieldWithFallbacks.js +114 -0
  19. package/dist/editor/FloatingToolbar.js +92 -0
  20. package/dist/editor/ImageEditor.js +55 -0
  21. package/dist/editor/InsertMenu.js +164 -0
  22. package/dist/editor/ItemInfo.js +30 -0
  23. package/dist/editor/LinkEditorDialog.js +89 -0
  24. package/dist/editor/MainLayout.js +46 -0
  25. package/dist/editor/NewEditorClient.js +9 -0
  26. package/dist/editor/PictureCropper.js +332 -0
  27. package/dist/editor/PictureEditor.js +104 -0
  28. package/dist/editor/PictureEditorDialog.js +194 -0
  29. package/dist/editor/ScrollingContentTree.js +30 -0
  30. package/dist/editor/Terminal.js +109 -0
  31. package/dist/editor/Titlebar.js +11 -0
  32. package/dist/editor/ai/AiPopup.js +25 -0
  33. package/dist/editor/ai/AiResponseMessage.js +24 -0
  34. package/dist/editor/ai/AiTerminal.js +241 -0
  35. package/dist/editor/ai/AiToolCall.js +18 -0
  36. package/dist/editor/ai/EditorAiTerminal.js +9 -0
  37. package/dist/editor/ai/editorAiContext.js +14 -0
  38. package/dist/editor/client/DialogContext.js +29 -0
  39. package/dist/editor/client/EditorClient.js +1336 -0
  40. package/dist/editor/client/GenericDialog.js +27 -0
  41. package/dist/editor/client/editContext.js +59 -0
  42. package/dist/editor/client/helpers.js +31 -0
  43. package/dist/editor/client/itemsRepository.js +255 -0
  44. package/dist/editor/client/operations.js +398 -0
  45. package/dist/editor/client/pageModelBuilder.js +129 -0
  46. package/dist/editor/commands/commands.js +2 -0
  47. package/dist/editor/commands/componentCommands.js +277 -0
  48. package/dist/editor/commands/createVersionCommand.js +26 -0
  49. package/dist/editor/commands/deleteVersionCommand.js +55 -0
  50. package/dist/editor/commands/itemCommands.js +134 -0
  51. package/dist/editor/commands/localizeItem/LocalizeItemDialog.js +94 -0
  52. package/dist/editor/commands/undo.js +32 -0
  53. package/dist/editor/component-designer/ComponentDesigner.js +58 -0
  54. package/dist/editor/component-designer/ComponentDesignerAiTerminal.js +9 -0
  55. package/dist/editor/component-designer/ComponentDesignerMenu.js +67 -0
  56. package/dist/editor/component-designer/ComponentEditor.js +59 -0
  57. package/dist/editor/component-designer/ComponentRenderingCodeEditor.js +16 -0
  58. package/dist/editor/component-designer/ComponentRenderingEditor.js +71 -0
  59. package/dist/editor/component-designer/ComponentsDropdown.js +22 -0
  60. package/dist/editor/component-designer/PlaceholdersEditor.js +70 -0
  61. package/dist/editor/component-designer/RenderingsDropdown.js +25 -0
  62. package/dist/editor/component-designer/TemplateEditor.js +144 -0
  63. package/dist/editor/component-designer/aiContext.js +18 -0
  64. package/dist/editor/componentTreeHelper.js +97 -0
  65. package/dist/editor/control-center/ControlCenterMenu.js +59 -0
  66. package/dist/editor/control-center/IndexOverview.js +27 -0
  67. package/dist/editor/control-center/IndexSettings.js +106 -0
  68. package/dist/editor/control-center/Status.js +7 -0
  69. package/dist/editor/editor-warnings/ItemLocked.js +40 -0
  70. package/dist/editor/editor-warnings/NoLanguageWriteAccess.js +16 -0
  71. package/dist/editor/editor-warnings/NoWorkflowWriteAccess.js +16 -0
  72. package/dist/editor/editor-warnings/NoWriteAccess.js +14 -0
  73. package/dist/editor/editor-warnings/ValidationErrors.js +27 -0
  74. package/dist/editor/field-types/AttachmentEditor.js +7 -0
  75. package/dist/editor/field-types/CheckboxEditor.js +32 -0
  76. package/dist/editor/field-types/DropLinkEditor.js +51 -0
  77. package/dist/editor/field-types/DropListEditor.js +58 -0
  78. package/dist/editor/field-types/ImageFieldEditor.js +36 -0
  79. package/dist/editor/field-types/InternalLinkFieldEditor.js +64 -0
  80. package/dist/editor/field-types/LinkFieldEditor.js +58 -0
  81. package/dist/editor/field-types/MultiLineText.js +35 -0
  82. package/dist/editor/field-types/PictureFieldEditor.js +59 -0
  83. package/dist/editor/field-types/RawEditor.js +33 -0
  84. package/dist/editor/field-types/ReactQuill.js +366 -0
  85. package/dist/editor/field-types/RichTextEditor.js +46 -0
  86. package/dist/editor/field-types/RichTextEditorComponent.js +72 -0
  87. package/dist/editor/field-types/SingleLineText.js +92 -0
  88. package/dist/editor/field-types/TreeListEditor.js +137 -0
  89. package/dist/editor/fieldTypes.js +2 -0
  90. package/dist/editor/media-selector/AiImageSearch.js +110 -0
  91. package/dist/editor/media-selector/AiImageSearchPrompt.js +58 -0
  92. package/dist/editor/media-selector/MediaSelector.js +11 -0
  93. package/dist/editor/media-selector/Preview.js +9 -0
  94. package/dist/editor/media-selector/Thumbnails.js +11 -0
  95. package/dist/editor/media-selector/TreeSelector.js +171 -0
  96. package/dist/editor/media-selector/UploadZone.js +80 -0
  97. package/dist/editor/menubar/ActionsMenu.js +33 -0
  98. package/dist/editor/menubar/ActiveUsers.js +13 -0
  99. package/dist/editor/menubar/ApproveAndPublish.js +13 -0
  100. package/dist/editor/menubar/BrowseHistory.js +14 -0
  101. package/dist/editor/menubar/ItemLanguageVersion.js +36 -0
  102. package/dist/editor/menubar/LanguageSelector.js +33 -0
  103. package/dist/editor/menubar/Menu.js +65 -0
  104. package/dist/editor/menubar/NavButtons.js +43 -0
  105. package/dist/editor/menubar/PageSelector.js +50 -0
  106. package/dist/editor/menubar/PageViewerControls.js +37 -0
  107. package/dist/editor/menubar/Separator.js +8 -0
  108. package/dist/editor/menubar/SiteInfo.js +26 -0
  109. package/dist/editor/menubar/User.js +18 -0
  110. package/dist/editor/menubar/VersionSelector.js +49 -0
  111. package/dist/editor/page-editor-chrome/CommentHighlighting.js +214 -0
  112. package/dist/editor/page-editor-chrome/CommentHighlightings.js +17 -0
  113. package/dist/editor/page-editor-chrome/FieldActionIndicator.js +27 -0
  114. package/dist/editor/page-editor-chrome/FieldActionIndicators.js +15 -0
  115. package/dist/editor/page-editor-chrome/FieldEditedIndicator.js +27 -0
  116. package/dist/editor/page-editor-chrome/FieldEditedIndicators.js +15 -0
  117. package/dist/editor/page-editor-chrome/FrameMenu.js +178 -0
  118. package/dist/editor/page-editor-chrome/FrameMenus.js +24 -0
  119. package/dist/editor/page-editor-chrome/InlineEditor.js +101 -0
  120. package/dist/editor/page-editor-chrome/LockedFieldIndicator.js +35 -0
  121. package/dist/editor/page-editor-chrome/NoLayout.js +21 -0
  122. package/dist/editor/page-editor-chrome/PageEditorChrome.js +65 -0
  123. package/dist/editor/page-editor-chrome/PictureEditorOverlay.js +109 -0
  124. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +82 -0
  125. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +147 -0
  126. package/dist/editor/page-viewer/DeviceToolbar.js +21 -0
  127. package/dist/editor/page-viewer/EditorForm.js +130 -0
  128. package/dist/editor/page-viewer/MiniMap.js +257 -0
  129. package/dist/editor/page-viewer/PageViewer.js +64 -0
  130. package/dist/editor/page-viewer/PageViewerFrame.js +696 -0
  131. package/dist/editor/page-viewer/pageViewContext.js +117 -0
  132. package/dist/editor/pageModel.js +2 -0
  133. package/dist/editor/picture-shared.js +28 -0
  134. package/dist/editor/reviews/Comment.js +112 -0
  135. package/dist/editor/reviews/Comments.js +24 -0
  136. package/dist/editor/reviews/PreviewInfo.js +13 -0
  137. package/dist/editor/reviews/Reviews.js +165 -0
  138. package/dist/editor/reviews/reviewCommands.js +44 -0
  139. package/dist/editor/reviews/useReviews.js +48 -0
  140. package/dist/editor/services/aiService.js +99 -0
  141. package/dist/editor/services/componentDesignerService.js +79 -0
  142. package/dist/editor/services/contentService.js +104 -0
  143. package/dist/editor/services/editService.js +322 -0
  144. package/dist/editor/services/indexService.js +25 -0
  145. package/dist/editor/services/reviewsService.js +43 -0
  146. package/dist/editor/services/serviceHelper.js +67 -0
  147. package/dist/editor/services/systemService.js +7 -0
  148. package/dist/editor/services/translationService.js +15 -0
  149. package/dist/editor/services-server/api.js +119 -0
  150. package/dist/editor/services-server/graphQL.js +56 -0
  151. package/dist/editor/sidebar/ComponentPalette.js +55 -0
  152. package/dist/editor/sidebar/ComponentTree.js +362 -0
  153. package/dist/editor/sidebar/Debug.js +60 -0
  154. package/dist/editor/sidebar/DictionaryEditor.js +160 -0
  155. package/dist/editor/sidebar/EditHistory.js +74 -0
  156. package/dist/editor/sidebar/GraphQL.js +115 -0
  157. package/dist/editor/sidebar/Insert.js +24 -0
  158. package/dist/editor/sidebar/MainContentTree.js +52 -0
  159. package/dist/editor/sidebar/Performance.js +34 -0
  160. package/dist/editor/sidebar/Sessions.js +31 -0
  161. package/dist/editor/sidebar/Sidebar.js +15 -0
  162. package/dist/editor/sidebar/SidebarView.js +76 -0
  163. package/dist/editor/sidebar/Translations.js +160 -0
  164. package/dist/editor/sidebar/Validation.js +52 -0
  165. package/dist/editor/sidebar/ViewSelector.js +15 -0
  166. package/dist/editor/sidebar/Workbox.js +80 -0
  167. package/dist/editor/ui/CenteredMessage.js +7 -0
  168. package/dist/editor/ui/CopyToClipboardButton.js +17 -0
  169. package/dist/editor/ui/DialogButtons.js +7 -0
  170. package/dist/editor/ui/Icons.js +75 -0
  171. package/dist/editor/ui/ItemNameDialog.js +45 -0
  172. package/dist/editor/ui/ItemNameDialogNew.js +61 -0
  173. package/dist/editor/ui/ItemSearch.js +93 -0
  174. package/dist/editor/ui/PerfectTree.js +223 -0
  175. package/dist/editor/ui/Section.js +12 -0
  176. package/dist/editor/ui/SimpleIconButton.js +11 -0
  177. package/dist/editor/ui/SimpleMenu.js +9 -0
  178. package/dist/editor/ui/SimpleTable.js +11 -0
  179. package/dist/editor/ui/SimpleTabs.js +21 -0
  180. package/dist/editor/ui/SimpleToolbar.js +7 -0
  181. package/dist/editor/ui/Spinner.js +7 -0
  182. package/dist/editor/ui/Splitter.js +187 -0
  183. package/dist/editor/ui/StackedPanels.js +69 -0
  184. package/dist/editor/ui/Toolbar.js +7 -0
  185. package/dist/editor/utils/id-helper.js +7 -0
  186. package/dist/editor/utils/insertOptions.js +45 -0
  187. package/dist/editor/utils/itemutils.js +25 -0
  188. package/dist/editor/utils/useMemoDebug.js +20 -0
  189. package/dist/editor/utils.js +328 -0
  190. package/dist/editor/views/CompareView.js +147 -0
  191. package/dist/editor/views/EditView.js +17 -0
  192. package/dist/editor/views/ItemEditor.js +24 -0
  193. package/dist/editor/views/SingleEditView.js +25 -0
  194. package/dist/index.js +22 -0
  195. package/dist/page-wizard/PageWizard.js +62 -0
  196. package/dist/page-wizard/SelectWizard.js +43 -0
  197. package/dist/page-wizard/WizardSteps.js +71 -0
  198. package/dist/page-wizard/service.js +26 -0
  199. package/dist/page-wizard/startPageWizardCommand.js +23 -0
  200. package/dist/page-wizard/steps/BuildPageStep.js +138 -0
  201. package/dist/page-wizard/steps/CollectStep.js +124 -0
  202. package/dist/page-wizard/steps/ComponentTypesSelector.js +211 -0
  203. package/dist/page-wizard/steps/Components.js +94 -0
  204. package/dist/page-wizard/steps/CreatePage.js +142 -0
  205. package/dist/page-wizard/steps/CreatePageAndLayoutStep.js +230 -0
  206. package/dist/page-wizard/steps/EditButton.js +7 -0
  207. package/dist/page-wizard/steps/FieldEditor.js +30 -0
  208. package/dist/page-wizard/steps/Generate.js +11 -0
  209. package/dist/page-wizard/steps/ImagesStep.js +159 -0
  210. package/dist/page-wizard/steps/LayoutStep.js +120 -0
  211. package/dist/page-wizard/steps/SelectStep.js +150 -0
  212. package/dist/page-wizard/steps/schema.js +140 -0
  213. package/dist/page-wizard/steps/usePageCreator.js +194 -0
  214. package/dist/splash-screen/NewPage.js +131 -0
  215. package/dist/splash-screen/SectionHeadline.js +9 -0
  216. package/dist/splash-screen/SplashScreen.js +81 -0
  217. package/dist/tour/Tour.js +321 -0
  218. package/dist/tour/default-tour.js +231 -0
  219. package/dist/tour/preview-tour.js +93 -0
  220. package/dist/tsconfig.build.tsbuildinfo +1 -0
  221. package/dist/types.js +2 -0
  222. package/package.json +1 -1
  223. package/src/editor/sidebar/ComponentTree.tsx +512 -512
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Terminal = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const button_1 = require("primereact/button");
7
+ const inputtextarea_1 = require("primereact/inputtextarea");
8
+ const utils_1 = require("primereact/utils");
9
+ exports.Terminal = (0, react_1.forwardRef)((props, ref) => {
10
+ const { commandHandler, prompt, setPrompt, onReset, toolbar, statusbar, infobar, disabled, className, } = props;
11
+ const [response, setResponse] = (0, react_1.useState)();
12
+ const [messages, setMessages] = (0, react_1.useState)([]);
13
+ const bottomRef = (0, react_1.useRef)(null);
14
+ const messageRef = (0, react_1.useRef)(messages);
15
+ const inputRef = (0, react_1.useRef)(null);
16
+ const [promptHistory, setPromptHistory] = (0, react_1.useState)(() => {
17
+ if (typeof window !== "undefined") {
18
+ return JSON.parse(localStorage.getItem("editor.ai.promptHistory") || "[]");
19
+ }
20
+ return [];
21
+ });
22
+ const [currentHistoryIndex, setCurrentHistoryIndex] = (0, react_1.useState)(-1);
23
+ (0, react_1.useEffect)(() => {
24
+ localStorage.setItem("editor.ai.promptHistory", JSON.stringify(promptHistory));
25
+ }, [promptHistory]);
26
+ (0, react_1.useEffect)(() => {
27
+ if (inputRef.current) {
28
+ inputRef.current.focus();
29
+ }
30
+ }, []);
31
+ (0, react_1.useEffect)(() => {
32
+ messageRef.current = messages;
33
+ }, [messages]);
34
+ const callback = (text, finished) => {
35
+ if (!finished)
36
+ setResponse(text);
37
+ else {
38
+ setResponse(undefined);
39
+ setMessages([...messageRef.current, { type: "response", text }]);
40
+ }
41
+ };
42
+ const handleKeyPress = (e) => {
43
+ if (e.key === "Enter" && !e.shiftKey) {
44
+ e.preventDefault();
45
+ submit();
46
+ }
47
+ if (e.key === "ArrowUp") {
48
+ e.preventDefault();
49
+ if (promptHistory.length > 0) {
50
+ const newIndex = currentHistoryIndex < promptHistory.length - 1
51
+ ? currentHistoryIndex + 1
52
+ : currentHistoryIndex;
53
+ setCurrentHistoryIndex(newIndex);
54
+ const historicalPrompt = promptHistory[newIndex];
55
+ if (inputRef.current && historicalPrompt) {
56
+ setPrompt(historicalPrompt);
57
+ setTimeout(() => {
58
+ inputRef.current.selectionStart = historicalPrompt.length;
59
+ inputRef.current.selectionEnd = historicalPrompt.length;
60
+ }, 0);
61
+ }
62
+ }
63
+ }
64
+ if (e.key === "ArrowDown" && currentHistoryIndex >= 0) {
65
+ e.preventDefault();
66
+ const newIndex = currentHistoryIndex - 1;
67
+ setCurrentHistoryIndex(newIndex);
68
+ const historicalPrompt = newIndex >= 0 ? promptHistory[newIndex] : "";
69
+ if (inputRef.current && historicalPrompt) {
70
+ setPrompt(historicalPrompt);
71
+ setTimeout(() => {
72
+ inputRef.current.selectionStart = historicalPrompt.length;
73
+ inputRef.current.selectionEnd = historicalPrompt.length;
74
+ }, 0);
75
+ }
76
+ }
77
+ };
78
+ (0, react_1.useEffect)(() => {
79
+ // Scroll to bottom every time messages or response changes.
80
+ bottomRef.current?.scrollIntoView({ behavior: "smooth" });
81
+ }, [messages, response]);
82
+ const responseBoxClasses = "text-xs self-stretch text-gray-700 p-2 rounded shadow border border-gray-200";
83
+ const getClasses = (m) => {
84
+ if (m.type === "response")
85
+ return responseBoxClasses;
86
+ return "text-xs text-gray-700 bg-indigo-100 p-2 rounded prompt";
87
+ };
88
+ // Expose the submit function via the ref.
89
+ const submit = () => {
90
+ if (prompt.trim()) {
91
+ setPromptHistory((prev) => [
92
+ prompt,
93
+ ...prev.filter((p) => p !== prompt).slice(0, 9),
94
+ ]);
95
+ setCurrentHistoryIndex(-1);
96
+ }
97
+ setMessages([...messages, { type: "command", text: prompt }]);
98
+ setPrompt("");
99
+ setResponse("...");
100
+ commandHandler(prompt, callback);
101
+ };
102
+ (0, react_1.useImperativeHandle)(ref, () => ({
103
+ submit,
104
+ }));
105
+ return ((0, jsx_runtime_1.jsxs)("div", { className: (0, utils_1.classNames)("flex flex-col h-full", className), children: [(0, jsx_runtime_1.jsxs)("div", { className: "p-1 border-b border-gray-200 flex justify-between gap-2 text-xs items-center", children: [(0, jsx_runtime_1.jsx)("button", { onClick: () => {
106
+ setMessages([]);
107
+ onReset();
108
+ }, children: (0, jsx_runtime_1.jsx)("i", { className: "pi pi-trash text-sm m-1" }) }), toolbar] }), (0, jsx_runtime_1.jsx)("div", { className: "overflow-y-auto h-full overflow-x-hidden p-2", children: (0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col gap-3 items-end select-text", children: [messages.map((m, i) => ((0, jsx_runtime_1.jsx)("div", { className: getClasses(m), children: m.text }, i))), response != null && ((0, jsx_runtime_1.jsx)("div", { className: responseBoxClasses, children: (0, jsx_runtime_1.jsxs)("div", { className: "flex text-xs", children: [(0, jsx_runtime_1.jsxs)("div", { className: "text-xs mr-4", children: [(0, jsx_runtime_1.jsx)("i", { className: "pi pi-spin pi-spinner" }), " "] }), response] }) })), (0, jsx_runtime_1.jsx)("div", { ref: bottomRef })] }) }), (0, jsx_runtime_1.jsxs)("div", { className: "flex flex-col p-1 pb-0", children: [infobar, (0, jsx_runtime_1.jsx)(inputtextarea_1.InputTextarea, { ref: inputRef, value: prompt, className: "border-gray-300 border rounded flex-1 text-xs resize-none self-stretch", onKeyDown: handleKeyPress, onChange: (e) => setPrompt(e.target.value), rows: 4, cols: 30, disabled: disabled }), (0, jsx_runtime_1.jsxs)("div", { className: "flex justify-between items-center py-1", children: [statusbar, (0, jsx_runtime_1.jsx)(button_1.Button, { icon: "pi pi-send", text: true, size: "small", className: "tour-send-button", onClick: submit, disabled: prompt.trim().length === 0 })] })] })] }));
109
+ });
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Titlebar = Titlebar;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const editContext_1 = require("./client/editContext");
6
+ function Titlebar() {
7
+ const editContext = (0, editContext_1.useEditContext)();
8
+ if (!editContext?.view)
9
+ return null;
10
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "bg-gradient-to-r from-gray-900 from-10% vigray-500 to-indigo-950 h-12 flex justify-between items-center z-1 min-h-12", children: [(0, jsx_runtime_1.jsxs)("div", { className: "text-white flex gap-2 items-center relative pl-2 font-bold", children: [(0, jsx_runtime_1.jsx)("a", { href: "/sitecore/shell/sitecore/client/Applications/Launchpad", className: "glow-text", children: (0, jsx_runtime_1.jsx)("i", { className: "pi pi-sparkles text-pink-400" }) }), " ", (0, jsx_runtime_1.jsx)("span", { className: "ml-2 font-mono", children: "editor" })] }), (0, jsx_runtime_1.jsx)("div", { children: editContext?.view.primaryControls }), (0, jsx_runtime_1.jsx)("div", { children: editContext?.view.secondaryControls })] }));
11
+ }
@@ -0,0 +1,25 @@
1
+ "use client";
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.AiPopup = void 0;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const overlaypanel_1 = require("primereact/overlaypanel");
7
+ const button_1 = require("primereact/button");
8
+ const react_1 = require("react");
9
+ const EditorAiTerminal_1 = require("./EditorAiTerminal");
10
+ exports.AiPopup = (0, react_1.forwardRef)((_, ref) => {
11
+ const overlayRef = (0, react_1.useRef)(null);
12
+ const [terminalOptions, setTerminalOptions] = (0, react_1.useState)();
13
+ //const [components, setComponents] = useState<ComponentData[]>([]); // [componentId, componentId, ...]
14
+ (0, react_1.useImperativeHandle)(ref, () => ({
15
+ show: (ev, terminalOptions) => {
16
+ setTerminalOptions(terminalOptions);
17
+ //setComponents(components || []);
18
+ overlayRef.current?.toggle(ev);
19
+ },
20
+ close: () => {
21
+ overlayRef.current?.hide();
22
+ },
23
+ }));
24
+ return ((0, jsx_runtime_1.jsx)(overlaypanel_1.OverlayPanel, { ref: overlayRef, children: (0, jsx_runtime_1.jsx)("div", { className: "w-96 h-96 flex flex-col gap-2", onClick: (ev) => ev.stopPropagation(), children: (0, jsx_runtime_1.jsx)(EditorAiTerminal_1.EditorAiTerminal, { options: terminalOptions, closeButton: (0, jsx_runtime_1.jsx)(button_1.Button, { icon: "pi pi-times", onClick: () => overlayRef.current?.hide(), size: "small", text: true }) }) }) }));
25
+ });
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AiResponseMessage = AiResponseMessage;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const AiToolCall_1 = require("./AiToolCall");
7
+ const editContext_1 = require("../client/editContext");
8
+ function AiResponseMessage({ responseText, toolcalls, editOperations, finished, }) {
9
+ const editContext = (0, editContext_1.useEditContext)();
10
+ if (!editContext)
11
+ return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, {});
12
+ const [showFunctions, setShowFunctions] = (0, react_1.useState)(false);
13
+ const [changesRejected, setChangesRejected] = (0, react_1.useState)(undefined);
14
+ const reversedEditOperations = [...editOperations].reverse();
15
+ const canReject = editContext.editHistory.length >= editOperations.length &&
16
+ reversedEditOperations.find((x, index) => editContext.editHistory[index]?.id !== x.id ||
17
+ !editContext.editHistory[index]?.canUndo) === undefined;
18
+ return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("div", { dangerouslySetInnerHTML: {
19
+ __html: responseText.replaceAll("\\n", "<br>"),
20
+ } }), toolcalls.length > 0 && ((0, jsx_runtime_1.jsxs)("div", { className: "text-xs text-gray-400 cursor-pointer flex items-center gap-1 mt-1", onClick: () => setShowFunctions(!showFunctions), children: [(0, jsx_runtime_1.jsx)("i", { className: "pi pi-wrench text-xs" }), " Tool calls"] })), showFunctions && ((0, jsx_runtime_1.jsx)("div", { className: "text-xs text-gray-400", children: toolcalls.map((x, index) => ((0, jsx_runtime_1.jsx)(AiToolCall_1.AiToolCall, { toolCall: x }, index))) })), finished && editOperations.length > 0 && ((0, jsx_runtime_1.jsxs)("div", { className: "flex gap-2 my-2 items-center", children: [(0, jsx_runtime_1.jsxs)("div", { className: "text-xs tour-ai-response-message-changes", children: [editOperations.length, " changes"] }), canReject && !changesRejected && ((0, jsx_runtime_1.jsxs)("div", { className: "text-xs text-red-500 cursor-pointer flex items-center gap-1", onClick: async () => {
21
+ await editContext?.operations.undo(editOperations.length);
22
+ setChangesRejected(true);
23
+ }, children: [(0, jsx_runtime_1.jsx)("i", { className: "pi pi-times" }), " Reject"] })), changesRejected && ((0, jsx_runtime_1.jsx)("div", { className: "text-xs text-red-500", children: "rejected" }))] }))] }));
24
+ }
@@ -0,0 +1,241 @@
1
+ "use client";
2
+ "use strict";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.AiTerminal = AiTerminal;
8
+ const jsx_runtime_1 = require("react/jsx-runtime");
9
+ const react_1 = require("react");
10
+ const terminalservice_1 = require("primereact/terminalservice");
11
+ const Terminal_1 = require("../Terminal");
12
+ const editContext_1 = require("../client/editContext");
13
+ const dropdown_1 = require("primereact/dropdown");
14
+ const universal_cookie_1 = __importDefault(require("universal-cookie"));
15
+ const Icons_1 = require("../ui/Icons");
16
+ const AiResponseMessage_1 = require("./AiResponseMessage");
17
+ const aiService_1 = require("../services/aiService");
18
+ const SimpleIconButton_1 = require("../ui/SimpleIconButton");
19
+ function AiTerminal({ closeButton, createAiContext, defaultProfile, options, }) {
20
+ const editContext = (0, editContext_1.useEditContext)();
21
+ const [showPredefined, setShowPredefined] = (0, react_1.useState)(false);
22
+ if (!editContext)
23
+ return null;
24
+ const [messages, setMessages] = (0, react_1.useState)([]);
25
+ const [response, setResponse] = (0, react_1.useState)();
26
+ const [model, setModel] = (0, react_1.useState)();
27
+ const [prompt, setPrompt] = (0, react_1.useState)("");
28
+ const [profiles, setProfiles] = (0, react_1.useState)([]);
29
+ const [activeProfile, setActiveProfile] = (0, react_1.useState)();
30
+ const [initialPromptExecuted, setInitialPromptExecuted] = (0, react_1.useState)(false);
31
+ const selection = editContext.selection;
32
+ const terminalRef = (0, react_1.useRef)(null);
33
+ (0, react_1.useEffect)(() => {
34
+ if (options?.initialPrompt && !initialPromptExecuted && model) {
35
+ // Set the initial prompt text into the terminal's state.
36
+ console.log("setting prompt", options.initialPrompt);
37
+ setPrompt(options.initialPrompt);
38
+ setInitialPromptExecuted(true);
39
+ // Wait for the Terminal to update, then programmatically submit.
40
+ setTimeout(() => {
41
+ terminalRef.current?.submit();
42
+ }, 100);
43
+ }
44
+ }, [options?.initialPrompt, initialPromptExecuted, model]);
45
+ (0, react_1.useEffect)(() => {
46
+ async function fetchProfiles() {
47
+ if (!editContext?.currentItemDescriptor)
48
+ return;
49
+ const profiles = await (0, aiService_1.loadAiProfiles)(editContext.currentItemDescriptor);
50
+ setProfiles(profiles);
51
+ if (!activeProfile)
52
+ setActiveProfile(profiles.find((x) => x.name == defaultProfile) || profiles[0]);
53
+ }
54
+ fetchProfiles();
55
+ }, [editContext?.currentItemDescriptor]);
56
+ (0, react_1.useEffect)(() => {
57
+ if (activeProfile?.defaultModel)
58
+ setModel(activeProfile.defaultModel);
59
+ }, [activeProfile]);
60
+ const messagesRef = (0, react_1.useRef)(messages);
61
+ (0, react_1.useEffect)(() => {
62
+ messagesRef.current = messages;
63
+ }, [messages]);
64
+ async function commandHandler(text, callback) {
65
+ const newMessages = [
66
+ ...messagesRef.current,
67
+ { content: text, role: "user", name: "user" },
68
+ ];
69
+ const context = createAiContext({ editContext });
70
+ let lastOpIndex = 0;
71
+ const selectedText = editContext?.selectedRange?.text || null;
72
+ if (!activeProfile || !model)
73
+ return;
74
+ const messages = [
75
+ ...(options?.hiddenSystemPrompt
76
+ ? [
77
+ {
78
+ role: "system",
79
+ name: "system",
80
+ content: options.hiddenSystemPrompt,
81
+ },
82
+ ]
83
+ : []),
84
+ ...newMessages,
85
+ ];
86
+ console.log(messages);
87
+ const response = await executePrompt(activeProfile.id, messages, selection, editContext.sessionId, model, selectedText, context, (response) => {
88
+ setResponse(response);
89
+ handleResponse(response, callback, false);
90
+ if (response.editOperations.length) {
91
+ if (!editContext)
92
+ return;
93
+ const newOps = response.editOperations.slice(lastOpIndex);
94
+ if (newOps.length === 0)
95
+ return;
96
+ const isEditTextFieldOp = (op) => {
97
+ if (op.type !== "edit-field")
98
+ return false;
99
+ const editFieldOp = op;
100
+ return (editFieldOp.fieldType &&
101
+ editFieldOp.fieldType.indexOf("text") !== -1);
102
+ };
103
+ const isEditTextField = isEditTextFieldOp(newOps[newOps.length - 1]);
104
+ if (isEditTextField)
105
+ lastOpIndex = response.editOperations.length - 1;
106
+ else
107
+ lastOpIndex = response.editOperations.length;
108
+ newOps.forEach((op) => {
109
+ if (isEditTextFieldOp(op)) {
110
+ const editFieldOp = op;
111
+ if (editFieldOp.item) {
112
+ editContext.itemsRepository.updateFieldValue(editFieldOp, editFieldOp.user ?? { name: "unknown", ai: false }, false, editFieldOp.value);
113
+ editContext.select([editFieldOp.item.id]);
114
+ editContext.setScrollIntoView(editFieldOp.item.id);
115
+ editContext?.setFocusedField(editFieldOp, false);
116
+ }
117
+ }
118
+ else {
119
+ const addOp = op;
120
+ if (op.type === "add-component" && addOp.componentId) {
121
+ const newComponentId = addOp.componentId;
122
+ editContext.select([newComponentId]);
123
+ editContext.setScrollIntoView(newComponentId);
124
+ }
125
+ }
126
+ });
127
+ }
128
+ });
129
+ if (response) {
130
+ handleResponse(response, callback, true);
131
+ if (context.callback)
132
+ context.callback(response);
133
+ editContext?.requestRefresh("immediate");
134
+ }
135
+ if (response?.responseText)
136
+ newMessages.push({
137
+ content: response.responseText,
138
+ role: "assistant",
139
+ name: "assistant",
140
+ });
141
+ setResponse(response ? response : undefined);
142
+ setMessages(newMessages);
143
+ }
144
+ (0, react_1.useEffect)(() => {
145
+ terminalservice_1.TerminalService.on("command", commandHandler);
146
+ return () => {
147
+ terminalservice_1.TerminalService.off("command", commandHandler);
148
+ };
149
+ }, []);
150
+ return ((0, jsx_runtime_1.jsx)("div", { className: "h-full flex flex-col relative flex-1 pl-1.5", "data-testid": "ai-terminal", children: (0, jsx_runtime_1.jsxs)("div", { className: "flex-1 relative", children: [(0, jsx_runtime_1.jsx)("div", { className: "inset-0 absolute tour-ai-terminal", children: (0, jsx_runtime_1.jsx)(Terminal_1.Terminal, { disabled: !model, ref: terminalRef, onReset: () => {
151
+ setMessages([]);
152
+ setResponse(undefined);
153
+ }, infobar: response?.numInputTokens && ((0, jsx_runtime_1.jsxs)("div", { className: "text-gray-400 text-right", style: { fontSize: "10px" }, children: ["Tokens in: ", response?.numInputTokens?.toLocaleString(), " out:", " ", response?.numOutputTokens?.toLocaleString(), " ", response?.numCachedTokens
154
+ ? `cached: ${response?.numCachedTokens?.toLocaleString()} `
155
+ : "", response?.state] })), prompt: prompt, setPrompt: setPrompt, statusbar: (0, jsx_runtime_1.jsxs)("div", { className: "flex items-center justify-between gap-1 flex-1", children: [(0, jsx_runtime_1.jsxs)("a", { className: "text-xs text-blue-300 cursor-pointer flex items-center gap-1 ml-1", onClick: () => {
156
+ setShowPredefined(!showPredefined);
157
+ }, children: [(0, jsx_runtime_1.jsx)(Icons_1.WizardIcon, { className: "w-5 h-5" }), "Predefined prompts"] }), editContext.selection?.length > 0 && ((0, jsx_runtime_1.jsxs)("div", { className: "text-xs text-red-400 flex items-center mr-2", children: [editContext.selection.length, " items selected", (0, jsx_runtime_1.jsx)(SimpleIconButton_1.SimpleIconButton, { icon: "pi pi-times", label: "Clear selection", onClick: () => {
158
+ editContext.select([]);
159
+ } })] })), showPredefined && ((0, jsx_runtime_1.jsx)("div", { className: "absolute right-0 left-0 bottom-8 text-sm overflow-y-auto bg-white p-3 pb-1 flex flex-col gap-1 ", children: activeProfile &&
160
+ activeProfile.prompts.map((p, index) => ((0, jsx_runtime_1.jsx)("div", { className: "p-1.5 mb-1 border border-gray-200 rounded-lg cursor-pointer text-gray-700 text-xs", onClick: () => {
161
+ setPrompt(p.prompt);
162
+ setShowPredefined(false);
163
+ }, children: p.title }, index))) }))] }), toolbar: (0, jsx_runtime_1.jsxs)("div", { className: "flex items-stretch gap-1", children: [(0, jsx_runtime_1.jsx)(dropdown_1.Dropdown, { className: "text-sm", value: activeProfile, onChange: (e) => setActiveProfile(e.value), optionLabel: "name", options: profiles }), activeProfile && ((0, jsx_runtime_1.jsx)(dropdown_1.Dropdown, { className: "text-sm", value: model, onChange: (e) => setModel(e.value), options: activeProfile.models })), closeButton] }), commandHandler: (v, callback) => {
164
+ commandHandler(v, callback);
165
+ } }) }), activeProfile?.errorMessage && ((0, jsx_runtime_1.jsx)("div", { className: "text-red-500 text-sm p-2 inset-0 absolute grid items-center justify-center", children: activeProfile?.errorMessage })), !model && ((0, jsx_runtime_1.jsx)("div", { className: "inset-0 absolute grid items-center justify-center text-gray-400 text-sm", children: !activeProfile ? "No profile selected" : "No model selected" }))] }) }));
166
+ }
167
+ async function executePrompt(profileId, messages, selection, session, model, selectedText, context, callback) {
168
+ const response = await fetch(context.endpoint, {
169
+ method: "POST",
170
+ body: JSON.stringify({
171
+ ...context.promptData,
172
+ profileId,
173
+ messages,
174
+ selection,
175
+ selectedText,
176
+ model,
177
+ sessionId: session,
178
+ }),
179
+ credentials: "include",
180
+ headers: {
181
+ "Content-Type": "application/json",
182
+ Cookie: new universal_cookie_1.default().getAll(),
183
+ },
184
+ });
185
+ if (!response?.body)
186
+ return null;
187
+ const reader = response.body.getReader();
188
+ const decoder = new TextDecoder();
189
+ let buffer = "";
190
+ let result = null;
191
+ while (true) {
192
+ const { done, value } = await reader.read();
193
+ if (done) {
194
+ break;
195
+ }
196
+ buffer += decoder.decode(value, { stream: true }); // 'stream: true' ensures that any incomplete multi-byte characters aren't malformed.
197
+ // Split the buffer by newline and keep the last partial line for the next iteration.
198
+ const lines = buffer.split("\n");
199
+ if (lines.length > 0) {
200
+ buffer = lines.pop() || ""; // Incomplete line (if any) is kept for the next iteration.
201
+ for (let line of lines) {
202
+ if (line.trim() === "")
203
+ continue; // Skip empty lines if any.
204
+ try {
205
+ const jsonData = JSON.parse(line);
206
+ callback(jsonData);
207
+ result = jsonData;
208
+ }
209
+ catch (e) {
210
+ console.error("Error parsing line:" + line, e);
211
+ }
212
+ }
213
+ }
214
+ }
215
+ // If there's any remaining content in the buffer after processing all chunks, try to process it.
216
+ if (buffer.trim() !== "") {
217
+ try {
218
+ const jsonData = JSON.parse(buffer);
219
+ result = jsonData;
220
+ }
221
+ catch (e) {
222
+ console.error("Error parsing the final buffer content:", e);
223
+ }
224
+ }
225
+ return result;
226
+ }
227
+ function handleResponse(response, terminalCallback, isFinished) {
228
+ const toolcalls = response?.toolCalls?.map((tool_call) => {
229
+ return {
230
+ func: tool_call.function?.name,
231
+ arguments: tool_call.function?.arguments,
232
+ result: tool_call.result,
233
+ error: tool_call.error,
234
+ };
235
+ }) || [];
236
+ const responseText = response.responseText
237
+ ?.trim()
238
+ .replace(/\n/g, "<br/>")
239
+ ?.replace(/\*\*(.*?)\*\*/g, "<b>$1</b>");
240
+ terminalCallback((0, jsx_runtime_1.jsx)(AiResponseMessage_1.AiResponseMessage, { responseText: responseText, toolcalls: toolcalls, editOperations: response.editOperations, finished: isFinished }), isFinished);
241
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AiToolCall = AiToolCall;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const react_json_view_lite_1 = require("react-json-view-lite");
7
+ function AiToolCall({ toolCall }) {
8
+ const [expanded, setExpaded] = (0, react_1.useState)(false);
9
+ return ((0, jsx_runtime_1.jsxs)("div", { className: "mt-2", children: [(0, jsx_runtime_1.jsxs)("div", { onClick: () => setExpaded(!expanded), className: "flex items-center cursor-pointer", children: [(0, jsx_runtime_1.jsx)("i", { className: "pi pi-angle-right" }), " ", toolCall.func] }), expanded && ((0, jsx_runtime_1.jsxs)("div", { className: "ml-4", children: [(0, jsx_runtime_1.jsx)("div", { className: "italic", children: "Args:" }), (0, jsx_runtime_1.jsx)("div", { children: renderJsonOrText(toolCall.arguments) }), (0, jsx_runtime_1.jsx)("div", { className: "italic mt-1", children: "Result:" }), (0, jsx_runtime_1.jsxs)("div", { className: "mb-4", children: [toolCall.error && ((0, jsx_runtime_1.jsx)("div", { className: "text-red", children: toolCall.error })), renderJsonOrText(toolCall.result)] })] }))] }));
10
+ }
11
+ function renderJsonOrText(json) {
12
+ try {
13
+ return (0, jsx_runtime_1.jsx)(react_json_view_lite_1.JsonView, { data: JSON.parse(json), style: react_json_view_lite_1.defaultStyles });
14
+ }
15
+ catch (e) {
16
+ return (0, jsx_runtime_1.jsx)("div", { children: json });
17
+ }
18
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EditorAiTerminal = EditorAiTerminal;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const AiTerminal_1 = require("./AiTerminal");
6
+ const editorAiContext_1 = require("./editorAiContext");
7
+ function EditorAiTerminal({ closeButton, options, }) {
8
+ return ((0, jsx_runtime_1.jsx)(AiTerminal_1.AiTerminal, { options: options, closeButton: closeButton, createAiContext: editorAiContext_1.createEditorAiContext, defaultProfile: "Editor" }));
9
+ }
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createEditorAiContext = createEditorAiContext;
4
+ function createEditorAiContext({ editContext, }) {
5
+ const aiPromptUrl = editContext.configuration.services.aiService.promptUrl;
6
+ return {
7
+ endpoint: aiPromptUrl,
8
+ promptData: {
9
+ itemid: editContext.currentItemDescriptor?.id,
10
+ language: editContext.currentItemDescriptor?.language,
11
+ version: editContext.currentItemDescriptor?.version,
12
+ },
13
+ };
14
+ }
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useDialog = exports.DialogProvider = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ // DialogContext.tsx
6
+ const react_1 = require("react");
7
+ const DialogContext = (0, react_1.createContext)(undefined);
8
+ const DialogProvider = ({ children, }) => {
9
+ const [dialog, setDialog] = (0, react_1.useState)(null);
10
+ const openDialog = (Component, props) => {
11
+ return new Promise((resolve) => {
12
+ const handleClose = (result) => {
13
+ setDialog(null);
14
+ resolve(result);
15
+ };
16
+ setDialog((0, jsx_runtime_1.jsx)(Component, { ...props, onClose: handleClose }));
17
+ });
18
+ };
19
+ return ((0, jsx_runtime_1.jsxs)(DialogContext.Provider, { value: { openDialog }, children: [children, dialog] }));
20
+ };
21
+ exports.DialogProvider = DialogProvider;
22
+ const useDialog = () => {
23
+ const context = (0, react_1.useContext)(DialogContext);
24
+ if (!context) {
25
+ throw new Error("useDialog must be used within a DialogProvider");
26
+ }
27
+ return context;
28
+ };
29
+ exports.useDialog = useDialog;