@alpaca-editor/core 1.0.4103 → 1.0.4105

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 (134) hide show
  1. package/dist/components/ui/context-menu.d.ts +1 -1
  2. package/dist/components/ui/context-menu.js +8 -8
  3. package/dist/components/ui/context-menu.js.map +1 -1
  4. package/dist/config/config.js +8 -1
  5. package/dist/config/config.js.map +1 -1
  6. package/dist/config/types.d.ts +1 -0
  7. package/dist/editor/ContentTree.js +15 -16
  8. package/dist/editor/ContentTree.js.map +1 -1
  9. package/dist/editor/ContextMenu.js +37 -6
  10. package/dist/editor/ContextMenu.js.map +1 -1
  11. package/dist/editor/MainLayout.js +1 -1
  12. package/dist/editor/MainLayout.js.map +1 -1
  13. package/dist/editor/Terminal.js +2 -2
  14. package/dist/editor/Terminal.js.map +1 -1
  15. package/dist/editor/ai/AgentHistory.js +1 -1
  16. package/dist/editor/ai/AgentTerminal.js +191 -15
  17. package/dist/editor/ai/AgentTerminal.js.map +1 -1
  18. package/dist/editor/ai/Agents.js +9 -1
  19. package/dist/editor/ai/Agents.js.map +1 -1
  20. package/dist/editor/ai/AiResponseMessage.d.ts +1 -1
  21. package/dist/editor/ai/AiResponseMessage.js +4 -2
  22. package/dist/editor/ai/AiResponseMessage.js.map +1 -1
  23. package/dist/editor/ai/types.d.ts +25 -0
  24. package/dist/editor/ai/types.js +2 -0
  25. package/dist/editor/ai/types.js.map +1 -0
  26. package/dist/editor/client/EditorShell.js +31 -0
  27. package/dist/editor/client/EditorShell.js.map +1 -1
  28. package/dist/editor/client/editContext.d.ts +3 -0
  29. package/dist/editor/client/editContext.js.map +1 -1
  30. package/dist/editor/commands/agentCommands.d.ts +9 -0
  31. package/dist/editor/commands/agentCommands.js +30 -0
  32. package/dist/editor/commands/agentCommands.js.map +1 -0
  33. package/dist/editor/commands/itemCommands.js +14 -14
  34. package/dist/editor/commands/itemCommands.js.map +1 -1
  35. package/dist/editor/component-designer/aiContext.d.ts +1 -1
  36. package/dist/editor/context-menu/InsertMenu.d.ts +2 -1
  37. package/dist/editor/context-menu/InsertMenu.js +20 -15
  38. package/dist/editor/context-menu/InsertMenu.js.map +1 -1
  39. package/dist/editor/control-center/IndexOverview.js +3 -2
  40. package/dist/editor/control-center/IndexOverview.js.map +1 -1
  41. package/dist/editor/control-center/WebSocketMessages.js +3 -3
  42. package/dist/editor/control-center/WebSocketMessages.js.map +1 -1
  43. package/dist/editor/field-types/NameValueListEditor.d.ts +7 -0
  44. package/dist/editor/field-types/NameValueListEditor.js +99 -0
  45. package/dist/editor/field-types/NameValueListEditor.js.map +1 -0
  46. package/dist/editor/fieldTypes.d.ts +1 -1
  47. package/dist/editor/media-selector/MediaFolderBrowser.js +2 -2
  48. package/dist/editor/media-selector/MediaFolderBrowser.js.map +1 -1
  49. package/dist/editor/menubar/ActiveUsers.js +3 -2
  50. package/dist/editor/menubar/ActiveUsers.js.map +1 -1
  51. package/dist/editor/page-editor-chrome/FrameMenu.js +47 -10
  52. package/dist/editor/page-editor-chrome/FrameMenu.js.map +1 -1
  53. package/dist/editor/page-editor-chrome/PlaceholderDropZone.d.ts +3 -1
  54. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js +30 -4
  55. package/dist/editor/page-editor-chrome/PlaceholderDropZone.js.map +1 -1
  56. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +44 -5
  57. package/dist/editor/page-editor-chrome/PlaceholderDropZones.js.map +1 -1
  58. package/dist/editor/reviews/Comments.js +96 -35
  59. package/dist/editor/reviews/Comments.js.map +1 -1
  60. package/dist/editor/services/agentService.d.ts +22 -2
  61. package/dist/editor/services/agentService.js +26 -1
  62. package/dist/editor/services/agentService.js.map +1 -1
  63. package/dist/editor/services/aiService.d.ts +2 -1
  64. package/dist/editor/services/aiService.js.map +1 -1
  65. package/dist/editor/sidebar/Completions.js +2 -1
  66. package/dist/editor/sidebar/Completions.js.map +1 -1
  67. package/dist/editor/sidebar/GraphQL.js +47 -90
  68. package/dist/editor/sidebar/GraphQL.js.map +1 -1
  69. package/dist/editor/ui/DragPreview.d.ts +13 -0
  70. package/dist/editor/ui/DragPreview.js +35 -0
  71. package/dist/editor/ui/DragPreview.js.map +1 -0
  72. package/dist/editor/ui/Icons.d.ts +2 -1
  73. package/dist/editor/ui/Icons.js +2 -2
  74. package/dist/editor/ui/Icons.js.map +1 -1
  75. package/dist/editor/ui/ItemNameDialogNew.js +2 -2
  76. package/dist/editor/ui/ItemNameDialogNew.js.map +1 -1
  77. package/dist/editor/ui/PerfectTree.js +3 -15
  78. package/dist/editor/ui/PerfectTree.js.map +1 -1
  79. package/dist/editor/ui/SimpleTable.js +1 -1
  80. package/dist/editor/ui/SimpleTable.js.map +1 -1
  81. package/dist/editor/utils.d.ts +12 -1
  82. package/dist/editor/utils.js +60 -12
  83. package/dist/editor/utils.js.map +1 -1
  84. package/dist/revision.d.ts +2 -2
  85. package/dist/revision.js +2 -2
  86. package/dist/styles.css +37 -9
  87. package/dist/tour/default-tour.js +34 -38
  88. package/dist/tour/default-tour.js.map +1 -1
  89. package/package.json +1 -1
  90. package/src/components/ui/context-menu.tsx +31 -19
  91. package/src/config/config.tsx +9 -1
  92. package/src/config/types.ts +1 -0
  93. package/src/editor/ContentTree.tsx +13 -18
  94. package/src/editor/ContextMenu.tsx +112 -19
  95. package/src/editor/MainLayout.tsx +1 -1
  96. package/src/editor/Terminal.tsx +2 -2
  97. package/src/editor/ai/AgentHistory.tsx +2 -2
  98. package/src/editor/ai/AgentTerminal.tsx +234 -35
  99. package/src/editor/ai/Agents.tsx +14 -2
  100. package/src/editor/ai/AiResponseMessage.tsx +8 -6
  101. package/src/editor/ai/types.ts +27 -0
  102. package/src/editor/client/EditorShell.tsx +33 -0
  103. package/src/editor/client/editContext.ts +12 -1
  104. package/src/editor/commands/agentCommands.tsx +49 -0
  105. package/src/editor/commands/itemCommands.tsx +26 -14
  106. package/src/editor/component-designer/aiContext.ts +1 -1
  107. package/src/editor/context-menu/InsertMenu.tsx +64 -39
  108. package/src/editor/control-center/IndexOverview.tsx +3 -2
  109. package/src/editor/control-center/WebSocketMessages.tsx +3 -5
  110. package/src/editor/field-types/NameValueListEditor.tsx +197 -0
  111. package/src/editor/fieldTypes.ts +1 -1
  112. package/src/editor/media-selector/MediaFolderBrowser.tsx +2 -2
  113. package/src/editor/menubar/ActiveUsers.tsx +4 -3
  114. package/src/editor/page-editor-chrome/FrameMenu.tsx +61 -13
  115. package/src/editor/page-editor-chrome/PlaceholderDropZone.tsx +82 -20
  116. package/src/editor/page-editor-chrome/PlaceholderDropZones.tsx +77 -24
  117. package/src/editor/reviews/Comments.tsx +123 -38
  118. package/src/editor/services/agentService.ts +53 -2
  119. package/src/editor/services/aiService.ts +3 -1
  120. package/src/editor/sidebar/Completions.tsx +2 -1
  121. package/src/editor/sidebar/GraphQL.tsx +50 -99
  122. package/src/editor/ui/DragPreview.tsx +44 -0
  123. package/src/editor/ui/Icons.tsx +3 -0
  124. package/src/editor/ui/ItemNameDialogNew.tsx +7 -3
  125. package/src/editor/ui/PerfectTree.tsx +2 -17
  126. package/src/editor/ui/SimpleTable.tsx +2 -2
  127. package/src/editor/utils.ts +73 -15
  128. package/src/revision.ts +2 -2
  129. package/src/tour/default-tour.tsx +34 -46
  130. package/dist/editor/ai/AiTerminal.d.ts +0 -47
  131. package/dist/editor/ai/AiTerminal.js +0 -300
  132. package/dist/editor/ai/AiTerminal.js.map +0 -1
  133. package/src/editor/ai/AiTerminal.tsx +0 -570
  134. package/src/editor/component-designer/ComponentDesignerAiTerminal.tsx_ +0 -11
@@ -52,7 +52,8 @@ export function getDefaultTourSteps(
52
52
  className: "button button-secondary mt-2",
53
53
  },
54
54
  ],
55
- }, "new-page": {
55
+ },
56
+ "new-page": {
56
57
  title: "Create a New Page",
57
58
  description: (
58
59
  <>
@@ -65,20 +66,18 @@ export function getDefaultTourSteps(
65
66
  await waitForElement(".tour-pick-location");
66
67
  },
67
68
  nextStep: "pick-location",
68
- }, "pick-location": {
69
+ },
70
+ "pick-location": {
69
71
  title: "Choose Location",
70
- description: (
71
- <>
72
- Open up a folder for your page
73
- </>
74
- ),
72
+ description: <>Open up a folder for your page</>,
75
73
  focusElement: ".tour-pick-location",
76
74
  bubblePosition: "right",
77
75
  waitForUserInput: async () => {
78
76
  await waitForElement(".bg-theme-secondary-light");
79
77
  },
80
78
  nextStep: "choose-template",
81
- }, "choose-template": {
79
+ },
80
+ "choose-template": {
82
81
  title: "Select Template",
83
82
  description: "Select a template for your page",
84
83
  focusElement: ".tour-choose-template",
@@ -96,7 +95,8 @@ export function getDefaultTourSteps(
96
95
  },
97
96
  bubblePosition: "left",
98
97
  nextStep: "enter-name",
99
- }, "enter-name": {
98
+ },
99
+ "enter-name": {
100
100
  title: "Name Your Page",
101
101
  description: "Enter a name for your page",
102
102
  focusElement: "#new-page-name",
@@ -105,7 +105,8 @@ export function getDefaultTourSteps(
105
105
  await waitForElement("#create-new-page-button:not([disabled])");
106
106
  },
107
107
  nextStep: "create-page",
108
- }, "create-page": {
108
+ },
109
+ "create-page": {
109
110
  title: "Create Page",
110
111
  description: "Click the Create button",
111
112
  focusElement: "#create-new-page-button",
@@ -115,14 +116,16 @@ export function getDefaultTourSteps(
115
116
  await waitForElement(".pi-cog");
116
117
  },
117
118
  nextStep: "loading",
118
- }, "loading": {
119
+ },
120
+ loading: {
119
121
  title: "Loading...",
120
122
  description: "Waiting for your new page...",
121
123
  waitForUserInput: async () => {
122
124
  await waitForElementToDisappear(".pi-cog");
123
125
  },
124
126
  nextStep: "ready-to-add-component",
125
- }, "ready-to-add-component": {
127
+ },
128
+ "ready-to-add-component": {
126
129
  title: "Ready to Add Components",
127
130
  description: "Wanna add a component to your beautiful empty page?",
128
131
  buttons: [
@@ -141,7 +144,8 @@ export function getDefaultTourSteps(
141
144
  },
142
145
  },
143
146
  ],
144
- }, "insert-component": {
147
+ },
148
+ "insert-component": {
145
149
  title: "Insert Component",
146
150
  description: "Excellent, click on the plus button to insert a component.",
147
151
  focusElement: "#insert-component-button",
@@ -150,7 +154,8 @@ export function getDefaultTourSteps(
150
154
  await waitForElement(".tour-component-palette");
151
155
  },
152
156
  nextStep: "drag-component",
153
- }, "drag-component": {
157
+ },
158
+ "drag-component": {
154
159
  title: "Drag & Drop Component",
155
160
  description: `Drag and drop a ${config.firstComponentTemplateName} component to your page.`,
156
161
  focusElement: `#insert-component-${config.firstComponentTemplateId}`,
@@ -159,7 +164,8 @@ export function getDefaultTourSteps(
159
164
  await waitForElement(".tour-placeholder-dropzone");
160
165
  },
161
166
  nextStep: "drop-component-on-placeholder",
162
- }, "drop-component-on-placeholder": {
167
+ },
168
+ "drop-component-on-placeholder": {
163
169
  title: "Drop Here!",
164
170
  description: "Drop the component onto this placeholder!",
165
171
  focusElement: ".tour-placeholder-dropzone",
@@ -174,7 +180,8 @@ export function getDefaultTourSteps(
174
180
  return "drag-component";
175
181
  },
176
182
  nextStep: "enter-title",
177
- }, "enter-title": {
183
+ },
184
+ "enter-title": {
178
185
  title: "Fill in Content",
179
186
  description: `Excellent! Now lets fill in the fields. First enter a ${config.firstComponentTextFieldName}`,
180
187
  focusElement: `[data-field-id='${config.firstComponentTextFieldId}']`,
@@ -186,7 +193,8 @@ export function getDefaultTourSteps(
186
193
  );
187
194
  },
188
195
  nextStep: "see-content-update",
189
- }, "see-content-update": {
196
+ },
197
+ "see-content-update": {
190
198
  title: "Live Updates",
191
199
  description:
192
200
  "See how the content is automatically updating on your page?",
@@ -202,7 +210,8 @@ export function getDefaultTourSteps(
202
210
  );
203
211
  },
204
212
  nextStep: "edit-content-inline",
205
- }, "edit-content-inline": {
213
+ },
214
+ "edit-content-inline": {
206
215
  title: "Inline Editing",
207
216
  description:
208
217
  "You can also directly edit the content on the page. Click on the [Introduction] placeholder here and start typing!",
@@ -217,7 +226,8 @@ export function getDefaultTourSteps(
217
226
  );
218
227
  },
219
228
  nextStep: "ai-intro",
220
- }, "ai-intro": {
229
+ },
230
+ "ai-intro": {
221
231
  title: "AI-Powered Editing",
222
232
  description:
223
233
  "But hey, this is an AI editor, so why not let the AI do some of the work for you?",
@@ -231,45 +241,23 @@ export function getDefaultTourSteps(
231
241
  onClick: () => nextStep("ai-sidebar"),
232
242
  },
233
243
  ],
234
- }, "ai-sidebar": {
244
+ },
245
+ "ai-sidebar": {
235
246
  title: "Open AI Chat",
236
247
  description: "Click on the AI sidebar to open the AI chat.",
237
248
  focusElement: `[data-sidebarview-name='ai']`,
238
249
  bubblePosition: "right",
239
250
  nextStep: "ai-terminal",
240
251
  waitForElement: "[data-sidebarview-name='ai'].active",
241
- }, "ai-terminal": {
252
+ },
253
+ "ai-terminal": {
242
254
  title: "AI Assistant",
243
255
  description:
244
- "Let me take control and tell the AI to add some more components.",
245
- focusElement: `.tour-ai-terminal textarea`,
256
+ "Open the Agents panel (top-right) and start an agent to add components.",
246
257
  waitForUserInput: async () => {
247
258
  await delay(1000);
248
- const aiTerminal = document.querySelector(".tour-ai-terminal textarea");
249
- if (aiTerminal) {
250
- (aiTerminal as HTMLTextAreaElement).focus();
251
- await simulateTyping(
252
- aiTerminal as HTMLTextAreaElement,
253
- `Please add three components of type ${config.firstComponentTemplateName} with some funny dummy content to the page.`,
254
- );
255
- }
256
259
  },
257
260
  bubblePosition: "top-right",
258
- nextStep: "ai-submit",
259
- }, "ai-submit": {
260
- title: "Send AI Request",
261
- description: "Click on the Send button to submit the prompt to the AI.",
262
- focusElement: ".tour-ai-terminal .tour-send-button",
263
- bubblePosition: "top-right",
264
- nextStep: "ai-watch-components-added",
265
- waitForElement: ".tour-ai-terminal .prompt",
266
- }, "ai-watch-components-added": {
267
- title: "AI Magic in Action",
268
- description:
269
- "Watch how the AI adds the components to the page. This can take a few seconds.",
270
- focusElement: ".tour-ai-terminal",
271
- pointToElement: ".tour-ai-terminal .prompt",
272
- waitForElement: ".tour-ai-response-message-changes",
273
261
  nextStep: "congratulations",
274
262
  },
275
263
  congratulations: {
@@ -1,47 +0,0 @@
1
- import { EditContextType } from "../client/editContext";
2
- import { EditOperation } from "../../types";
3
- type Response = {
4
- messages: Message[];
5
- editOperations: EditOperation[];
6
- numInputTokens: number;
7
- numOutputTokens: number;
8
- numCachedTokens: number;
9
- state: string;
10
- };
11
- export type ToolCall = {
12
- id: string;
13
- displayName: string;
14
- function: {
15
- name: string;
16
- arguments: string;
17
- };
18
- };
19
- export type Message = {
20
- id: string;
21
- content: string;
22
- formattedContent?: string;
23
- name: string;
24
- role: string;
25
- tool_calls?: ToolCall[];
26
- tool_call_id?: string;
27
- createdDate?: string;
28
- };
29
- export type AiContext = {
30
- promptData: any;
31
- endpoint?: string;
32
- callback?: (response: Response) => void;
33
- };
34
- export type AiTerminalOptions = {
35
- initialPrompt?: string;
36
- hiddenSystemPrompt?: string;
37
- initialMessages?: Message[];
38
- };
39
- export declare function AiTerminal({ closeButton, createAiContext, defaultProfile, options, }: {
40
- closeButton?: React.ReactNode;
41
- createAiContext: ({ editContext, }: {
42
- editContext: EditContextType;
43
- }) => AiContext;
44
- defaultProfile?: string;
45
- options?: AiTerminalOptions;
46
- }): import("react/jsx-runtime").JSX.Element | null;
47
- export {};
@@ -1,300 +0,0 @@
1
- "use client";
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useEffect, useRef, useState } from "react";
4
- import { TerminalService } from "primereact/terminalservice";
5
- import { Terminal } from "../Terminal";
6
- import { useEditContext } from "../client/editContext";
7
- import { Dropdown } from "primereact/dropdown";
8
- import { WizardIcon } from "../ui/Icons";
9
- import { AiResponseMessage } from "./AiResponseMessage";
10
- import { loadAiProfiles, executePrompt, } from "../services/aiService";
11
- import { SimpleIconButton } from "../ui/SimpleIconButton";
12
- import { Settings } from "lucide-react";
13
- export function AiTerminal({ closeButton, createAiContext, defaultProfile, options, }) {
14
- const editContext = useEditContext();
15
- const [showPredefined, setShowPredefined] = useState(false);
16
- if (!editContext)
17
- return null;
18
- const [messages, setMessages] = useState(options?.initialMessages || []);
19
- const [response, setResponse] = useState();
20
- const [model, setModel] = useState();
21
- const [prompt, setPrompt] = useState("");
22
- const [profiles, setProfiles] = useState([]);
23
- const [activeProfile, setActiveProfile] = useState();
24
- const [initialPromptExecuted, setInitialPromptExecuted] = useState(false);
25
- const [agentId] = useState(() => crypto.randomUUID());
26
- const selection = editContext.selection;
27
- const terminalRef = useRef(null);
28
- const [responseMessages, setResponseMessages] = useState(options?.initialMessages || []);
29
- const [showSettings, setShowSettings] = useState(false);
30
- const settingsRef = useRef(null);
31
- const [inputPlaceholder, setInputPlaceholder] = useState(undefined);
32
- useEffect(() => {
33
- if (options?.initialPrompt && !initialPromptExecuted && model) {
34
- // Set the initial prompt text into the terminal's state.
35
- console.log("setting prompt", options.initialPrompt);
36
- setPrompt(options.initialPrompt);
37
- setInitialPromptExecuted(true);
38
- // Wait for the Terminal to update, then programmatically submit.
39
- setTimeout(() => {
40
- terminalRef.current?.submit();
41
- }, 100);
42
- }
43
- }, [options?.initialPrompt, initialPromptExecuted, model]);
44
- useEffect(() => {
45
- async function fetchProfiles() {
46
- if (!editContext?.currentItemDescriptor)
47
- return;
48
- const profiles = await loadAiProfiles(editContext.currentItemDescriptor);
49
- setProfiles(profiles);
50
- if (!activeProfile)
51
- setActiveProfile(profiles.find((x) => x.name == defaultProfile) || profiles[0]);
52
- }
53
- fetchProfiles();
54
- }, [editContext?.currentItemDescriptor]);
55
- useEffect(() => {
56
- if (activeProfile?.defaultModelId)
57
- setModel(activeProfile.defaultModelId);
58
- }, [activeProfile]);
59
- const messagesRef = useRef(messages);
60
- useEffect(() => {
61
- messagesRef.current = responseMessages;
62
- }, [responseMessages]);
63
- const [initialTerminalMessages, setInitialTerminalMessages] = useState(undefined);
64
- // Effect to set up initial messages for display
65
- useEffect(() => {
66
- if (options?.initialMessages && options.initialMessages.length > 0) {
67
- console.log("AiTerminal: Loading initial messages", options.initialMessages);
68
- // Format the initial messages for display
69
- const formattedMessages = options.initialMessages.map((message) => {
70
- const formattedContent = message.content
71
- ?.trim()
72
- ?.replaceAll("\n", "<br>")
73
- ?.replace(/\*\*(.*?)\*\*/g, "<b>$1</b>") || "";
74
- return {
75
- ...message,
76
- content: message.content || "",
77
- formattedContent: formattedContent,
78
- tool_calls: message.tool_calls || [],
79
- };
80
- });
81
- console.log("AiTerminal: Formatted messages", formattedMessages);
82
- // Update the internal message states
83
- setMessages(formattedMessages);
84
- setResponseMessages(formattedMessages);
85
- // Create a response object for internal state
86
- const initialResponse = {
87
- messages: formattedMessages,
88
- editOperations: [],
89
- numInputTokens: 0,
90
- numOutputTokens: 0,
91
- numCachedTokens: 0,
92
- state: "loaded",
93
- };
94
- console.log("AiTerminal: Setting response", initialResponse);
95
- setResponse(initialResponse);
96
- // Create individual Terminal messages for each conversation message
97
- const terminalMessages = [];
98
- formattedMessages.forEach((message) => {
99
- if (message.role === "user") {
100
- // User messages appear as commands
101
- terminalMessages.push({
102
- type: "command",
103
- text: message.content,
104
- });
105
- }
106
- else if (message.role === "assistant") {
107
- // Assistant messages appear as responses
108
- terminalMessages.push({
109
- type: "response",
110
- text: (_jsx("div", { dangerouslySetInnerHTML: {
111
- __html: message.formattedContent || message.content || "",
112
- } })),
113
- });
114
- }
115
- // Add tool calls if present
116
- if (message.tool_calls && message.tool_calls.length > 0) {
117
- message.tool_calls.forEach((toolCall) => {
118
- terminalMessages.push({
119
- type: "response",
120
- text: (_jsxs("div", { className: "text-gray-1 text-xs", children: ["\uD83D\uDD27 ", toolCall.displayName] })),
121
- });
122
- });
123
- }
124
- });
125
- setInitialTerminalMessages(terminalMessages);
126
- }
127
- }, [options?.initialMessages]);
128
- // Handle click outside for settings popover
129
- useEffect(() => {
130
- function handleClickOutside(event) {
131
- if (settingsRef.current &&
132
- !settingsRef.current.contains(event.target)) {
133
- setShowSettings(false);
134
- }
135
- }
136
- if (showSettings) {
137
- document.addEventListener("click", handleClickOutside);
138
- return () => {
139
- document.removeEventListener("click", handleClickOutside);
140
- };
141
- }
142
- }, [showSettings]);
143
- function handleResponse(response, terminalCallback, isFinished) {
144
- const updatedMessages = response.messages;
145
- // Replace the conversation history with the authoritative response from AI
146
- if (updatedMessages && Array.isArray(updatedMessages)) {
147
- const formattedMessages = updatedMessages.map((message) => {
148
- const formattedContent = message.content
149
- ?.trim()
150
- ?.replaceAll("\n", "<br>")
151
- ?.replace(/\*\*(.*?)\*\*/g, "<b>$1</b>") || "";
152
- return {
153
- ...message,
154
- content: message.content || "",
155
- formattedContent: formattedContent,
156
- tool_calls: message.tool_calls || [],
157
- };
158
- });
159
- // Update the messages state with the complete conversation from AI
160
- setMessages([...formattedMessages]);
161
- setResponseMessages([...formattedMessages]);
162
- terminalCallback(_jsx(AiResponseMessage, { messages: formattedMessages, editOperations: response.editOperations, finished: isFinished, onQuickAction: (action) => {
163
- const text = (action.prompt ||
164
- action.value ||
165
- action.label ||
166
- "").trim();
167
- if (!text)
168
- return;
169
- if (action.behavior === "compose") {
170
- setPrompt(text);
171
- setInputPlaceholder(action.placeholder);
172
- setTimeout(() => terminalRef.current?.focusPrompt(), 0);
173
- return;
174
- }
175
- // Submit this as a new command
176
- commandHandler(text, (node, done) => {
177
- TerminalService.emit("response", node);
178
- if (done)
179
- TerminalService.emit("response", undefined);
180
- });
181
- } }), isFinished);
182
- }
183
- else {
184
- // Fallback: if no messages in response, keep current state
185
- terminalCallback(_jsx(AiResponseMessage, { messages: messagesRef.current, editOperations: response.editOperations, finished: isFinished, onQuickAction: (action) => {
186
- const text = (action.prompt ||
187
- action.value ||
188
- action.label ||
189
- "").trim();
190
- if (!text)
191
- return;
192
- if (action.behavior === "compose") {
193
- setPrompt(text);
194
- setInputPlaceholder(action.placeholder);
195
- setTimeout(() => terminalRef.current?.focusPrompt(), 0);
196
- return;
197
- }
198
- commandHandler(text, (node, done) => {
199
- TerminalService.emit("response", node);
200
- if (done)
201
- TerminalService.emit("response", undefined);
202
- });
203
- } }), isFinished);
204
- }
205
- }
206
- async function commandHandler(text, callback) {
207
- const userMessage = {
208
- id: crypto.randomUUID(), // Add unique id
209
- content: text,
210
- role: "user",
211
- name: "user",
212
- tool_calls: [], // Add empty toolCalls array
213
- };
214
- const context = createAiContext({ editContext: editContext });
215
- let lastOpIndex = 0;
216
- const selectedText = editContext?.selectedRange?.text || null;
217
- if (!activeProfile || !model)
218
- return;
219
- // Build complete message history for API call
220
- const conversationHistory = [...messagesRef.current, userMessage];
221
- const shouldAddTodoFormat = /\b(to-?do|check\s*list|task\s*list)\b/i.test(text);
222
- const todoFormatInstructions = "If you produce a to-do list, output it as a 'todo_list' JSON block. Prefer one of these two forms only, with no extra commentary before/after it: \n" +
223
- '```todo_list\n{ "title": "<optional title>", "items": [ { "text": "<task>", "done": false, "note": "<optional>" } ] }\n```\n' +
224
- "or a plain header: todo_list: { ... }. Include only fields: title (optional), items (array of {text, done?, note?}).";
225
- const systemMessages = options?.hiddenSystemPrompt
226
- ? [
227
- {
228
- role: "system",
229
- name: "system",
230
- content: options.hiddenSystemPrompt,
231
- id: crypto.randomUUID(),
232
- toolCalls: [],
233
- },
234
- ]
235
- : [];
236
- const todoSystem = shouldAddTodoFormat
237
- ? [
238
- {
239
- role: "system",
240
- name: "system",
241
- content: todoFormatInstructions,
242
- id: crypto.randomUUID(),
243
- toolCalls: [],
244
- },
245
- ]
246
- : [];
247
- const messages = [...systemMessages, ...todoSystem, ...conversationHistory];
248
- const response = await executePrompt(messages, context, {
249
- profileId: activeProfile.id,
250
- selection,
251
- selectedText,
252
- model,
253
- sessionId: editContext.sessionId,
254
- agentId,
255
- addSelectedComponents: true,
256
- }, undefined, (response) => {
257
- setResponse(response);
258
- handleResponse(response, callback, false);
259
- });
260
- if (response) {
261
- handleResponse(response, callback, true);
262
- if (context.callback)
263
- context.callback(response);
264
- editContext?.requestRefresh("immediate");
265
- }
266
- // if (response?.responseText)
267
- // newMessages.push({
268
- // content: response.responseText,
269
- // role: "assistant",
270
- // name: "assistant",
271
- // });
272
- setResponse(response ? response : undefined);
273
- // setMessages(newMessages);
274
- }
275
- useEffect(() => {
276
- TerminalService.on("command", commandHandler);
277
- return () => {
278
- TerminalService.off("command", commandHandler);
279
- };
280
- }, []);
281
- return (_jsx("div", { className: "relative flex h-full flex-1 flex-col", "data-testid": "ai-terminal", children: _jsxs("div", { className: "relative flex-1", children: [_jsx("div", { className: "tour-ai-terminal absolute inset-0", children: _jsx(Terminal, { disabled: !model, ref: terminalRef, onReset: () => {
282
- setMessages([]);
283
- setResponseMessages([]);
284
- setResponse(undefined);
285
- setInitialTerminalMessages(undefined);
286
- }, initialMessages: initialTerminalMessages, infobar: response?.numInputTokens && response?.numInputTokens > 0 ? (_jsxs("div", { className: "text-right text-gray-400", style: { fontSize: "10px" }, children: ["Tokens in: ", response?.numInputTokens?.toLocaleString(), " out:", " ", response?.numOutputTokens?.toLocaleString(), " ", response?.numCachedTokens
287
- ? `cached: ${response?.numCachedTokens?.toLocaleString()} `
288
- : "", response?.state] })) : null, prompt: prompt, setPrompt: setPrompt, placeholder: inputPlaceholder, statusbar: _jsxs("div", { className: "flex flex-1 items-center justify-between gap-1", children: [_jsxs("a", { className: "ml-1 flex cursor-pointer items-center gap-1 text-xs", onClick: () => {
289
- setShowPredefined(!showPredefined);
290
- }, children: [_jsx(WizardIcon, { className: "h-5 w-5" }), "Predefined prompts"] }), editContext.selection?.length > 0 && (_jsxs("div", { className: "mr-2 flex items-center text-xs text-red-400", children: [editContext.selection.length, " items selected", _jsx(SimpleIconButton, { icon: "pi pi-times", label: "Clear selection", onClick: () => {
291
- editContext.select([]);
292
- } })] })), showPredefined && (_jsx("div", { className: "absolute right-0 bottom-8 left-0 flex flex-col gap-1 overflow-y-auto bg-white p-3 pb-1 text-sm", children: activeProfile &&
293
- activeProfile.prompts.map((p, index) => (_jsx("div", { className: "mb-1 cursor-pointer rounded-lg border border-gray-200 p-1.5 text-xs text-gray-700", onClick: () => {
294
- setPrompt(p.prompt);
295
- setShowPredefined(false);
296
- }, children: p.title }, index))) }))] }), toolbar: _jsxs("div", { className: "flex items-stretch gap-1", children: [_jsxs("div", { className: "relative", ref: settingsRef, children: [_jsx(SimpleIconButton, { icon: _jsx(Settings, { size: 16, strokeWidth: 1 }), label: "Settings", onClick: () => setShowSettings(!showSettings) }), showSettings && (_jsxs("div", { className: "absolute top-8 right-0 z-50 flex flex-col gap-2 rounded-lg border border-gray-200 bg-white p-3 shadow-lg", children: [_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("label", { className: "text-xs font-medium text-gray-700", children: "Profile" }), _jsx(Dropdown, { className: "text-sm", value: activeProfile, onChange: (e) => setActiveProfile(e.value), optionLabel: "name", options: profiles })] }), activeProfile && (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("label", { className: "text-xs font-medium text-gray-700", children: "Model" }), _jsx(Dropdown, { className: "text-sm", value: model, onChange: (e) => setModel(e.value), options: activeProfile.models })] }))] }))] }), closeButton] }), commandHandler: (v, callback) => {
297
- commandHandler(v, callback);
298
- } }) }), activeProfile?.errorMessage && (_jsx("div", { className: "absolute inset-0 grid items-center justify-center p-2 text-sm text-red-500", children: activeProfile?.errorMessage })), !model && (_jsx("div", { className: "absolute inset-0 grid items-center justify-center text-sm text-gray-400", children: !activeProfile ? "No profile selected" : "No model selected" }))] }) }));
299
- }
300
- //# sourceMappingURL=AiTerminal.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"AiTerminal.js","sourceRoot":"","sources":["../../../src/editor/ai/AiTerminal.tsx"],"names":[],"mappings":"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"}