@alpaca-editor/core 1.0.4027 → 1.0.4030
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ActionButton.js +2 -2
- package/dist/components/ActionButton.js.map +1 -1
- package/dist/components/SimpleLanguageSelector.js +3 -1
- package/dist/components/SimpleLanguageSelector.js.map +1 -1
- package/dist/components/ui/button.d.ts +1 -1
- package/dist/config/config.js +1 -1
- package/dist/config/config.js.map +1 -1
- package/dist/config/types.d.ts +1 -1
- package/dist/editor/ContextMenu.js +0 -1
- package/dist/editor/ContextMenu.js.map +1 -1
- package/dist/editor/Editor.js +9 -3
- package/dist/editor/Editor.js.map +1 -1
- package/dist/editor/FieldListField.js +16 -24
- package/dist/editor/FieldListField.js.map +1 -1
- package/dist/editor/ImageEditButton.js +1 -1
- package/dist/editor/ImageEditButton.js.map +1 -1
- package/dist/editor/ImageEditor.js +1 -1
- package/dist/editor/ImageEditor.js.map +1 -1
- package/dist/editor/MainLayout.js +2 -2
- package/dist/editor/MainLayout.js.map +1 -1
- package/dist/editor/Terminal.js +1 -1
- package/dist/editor/Terminal.js.map +1 -1
- package/dist/editor/Titlebar.js +0 -1
- package/dist/editor/Titlebar.js.map +1 -1
- package/dist/editor/ai/AgentCostDisplay.d.ts +26 -0
- package/dist/editor/ai/AgentCostDisplay.js +65 -0
- package/dist/editor/ai/AgentCostDisplay.js.map +1 -0
- package/dist/editor/ai/Agents.js +59 -15
- package/dist/editor/ai/Agents.js.map +1 -1
- package/dist/editor/ai/AiPromptPopover.d.ts +7 -0
- package/dist/editor/ai/AiPromptPopover.js +111 -0
- package/dist/editor/ai/AiPromptPopover.js.map +1 -0
- package/dist/editor/ai/AiResponseMessage.d.ts +1 -0
- package/dist/editor/ai/AiResponseMessage.js +101 -23
- package/dist/editor/ai/AiResponseMessage.js.map +1 -1
- package/dist/editor/ai/AiTerminal.d.ts +15 -1
- package/dist/editor/ai/AiTerminal.js +379 -48
- package/dist/editor/ai/AiTerminal.js.map +1 -1
- package/dist/editor/ai/editorAiContext.d.ts +0 -1
- package/dist/editor/ai/editorAiContext.js +0 -2
- package/dist/editor/ai/editorAiContext.js.map +1 -1
- package/dist/editor/client/EditorClient.d.ts +3 -2
- package/dist/editor/client/EditorClient.js +326 -68
- package/dist/editor/client/EditorClient.js.map +1 -1
- package/dist/editor/client/editContext.d.ts +6 -4
- package/dist/editor/client/editContext.js.map +1 -1
- package/dist/editor/client/fieldModificationStore.d.ts +19 -0
- package/dist/editor/client/fieldModificationStore.js +125 -0
- package/dist/editor/client/fieldModificationStore.js.map +1 -0
- package/dist/editor/client/itemsRepository.d.ts +1 -1
- package/dist/editor/client/itemsRepository.js +38 -28
- package/dist/editor/client/itemsRepository.js.map +1 -1
- package/dist/editor/client/operations.d.ts +1 -0
- package/dist/editor/client/operations.js +39 -31
- package/dist/editor/client/operations.js.map +1 -1
- package/dist/editor/commands/componentCommands.js +5 -3
- package/dist/editor/commands/componentCommands.js.map +1 -1
- package/dist/editor/commands/itemCommands.js.map +1 -1
- package/dist/editor/component-designer/aiContext.js +0 -2
- package/dist/editor/component-designer/aiContext.js.map +1 -1
- package/dist/editor/field-types/DropLinkEditor.js +1 -1
- package/dist/editor/field-types/DropLinkEditor.js.map +1 -1
- package/dist/editor/field-types/MultiLineText.js +5 -7
- package/dist/editor/field-types/MultiLineText.js.map +1 -1
- package/dist/editor/field-types/RichTextEditorComponent.js +5 -7
- package/dist/editor/field-types/RichTextEditorComponent.js.map +1 -1
- package/dist/editor/field-types/SingleLineText.js +5 -7
- package/dist/editor/field-types/SingleLineText.js.map +1 -1
- package/dist/editor/hooks/useEditorSettings.d.ts +17 -0
- package/dist/editor/hooks/useEditorSettings.js +61 -0
- package/dist/editor/hooks/useEditorSettings.js.map +1 -0
- package/dist/editor/menubar/ItemActionsMenu.js +2 -2
- package/dist/editor/menubar/ItemActionsMenu.js.map +1 -1
- package/dist/editor/menubar/PageSelector.js +1 -1
- package/dist/editor/menubar/PageSelector.js.map +1 -1
- package/dist/editor/menubar/toolbar-sections/EditControls.js +1 -1
- package/dist/editor/menubar/toolbar-sections/EditControls.js.map +1 -1
- package/dist/editor/menubar/toolbar-sections/InsertControls.js +1 -1
- package/dist/editor/menubar/toolbar-sections/InsertControls.js.map +1 -1
- package/dist/editor/menubar/toolbar-sections/UtilityControls.js +1 -1
- package/dist/editor/menubar/toolbar-sections/UtilityControls.js.map +1 -1
- package/dist/editor/menubar/toolbar-sections/ViewportControls.js +1 -1
- package/dist/editor/menubar/toolbar-sections/ViewportControls.js.map +1 -1
- package/dist/editor/page-editor-chrome/FieldEditedIndicators.js +4 -3
- package/dist/editor/page-editor-chrome/FieldEditedIndicators.js.map +1 -1
- package/dist/editor/page-editor-chrome/FrameMenu.js +9 -1
- package/dist/editor/page-editor-chrome/FrameMenu.js.map +1 -1
- package/dist/editor/page-editor-chrome/useInlineAICompletion.js +0 -1
- package/dist/editor/page-editor-chrome/useInlineAICompletion.js.map +1 -1
- package/dist/editor/page-viewer/EditorForm.js +1 -1
- package/dist/editor/page-viewer/EditorForm.js.map +1 -1
- package/dist/editor/page-viewer/PageViewer.js +9 -8
- package/dist/editor/page-viewer/PageViewer.js.map +1 -1
- package/dist/editor/page-viewer/PageViewerFrame.js +7 -1
- package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
- package/dist/editor/page-viewer/pageViewContext.js +40 -6
- package/dist/editor/page-viewer/pageViewContext.js.map +1 -1
- package/dist/editor/reviews/Comment.js +7 -6
- package/dist/editor/reviews/Comment.js.map +1 -1
- package/dist/editor/services/agentService.d.ts +84 -12
- package/dist/editor/services/agentService.js +256 -15
- package/dist/editor/services/agentService.js.map +1 -1
- package/dist/editor/services/aiService.d.ts +17 -3
- package/dist/editor/services/aiService.js +5 -3
- package/dist/editor/services/aiService.js.map +1 -1
- package/dist/editor/services/contextService.js +0 -1
- package/dist/editor/services/contextService.js.map +1 -1
- package/dist/editor/services/systemService.d.ts +2 -1
- package/dist/editor/services/systemService.js +3 -0
- package/dist/editor/services/systemService.js.map +1 -1
- package/dist/editor/sidebar/ComponentPalette.js +1 -1
- package/dist/editor/sidebar/ComponentPalette.js.map +1 -1
- package/dist/editor/sidebar/EditHistory.js +2 -2
- package/dist/editor/sidebar/EditHistory.js.map +1 -1
- package/dist/editor/sidebar/GraphQL.d.ts +1 -0
- package/dist/editor/sidebar/GraphQL.js +8 -2
- package/dist/editor/sidebar/GraphQL.js.map +1 -1
- package/dist/editor/sidebar/MainContentTree.js +1 -1
- package/dist/editor/sidebar/MainContentTree.js.map +1 -1
- package/dist/editor/sidebar/SEOInfo.js +1 -1
- package/dist/editor/sidebar/SEOInfo.js.map +1 -1
- package/dist/editor/sidebar/ViewSelector.d.ts +4 -1
- package/dist/editor/sidebar/ViewSelector.js +64 -48
- package/dist/editor/sidebar/ViewSelector.js.map +1 -1
- package/dist/editor/ui/PerfectTree.js +2 -11
- package/dist/editor/ui/PerfectTree.js.map +1 -1
- package/dist/editor/ui/SimpleIconButton.d.ts +2 -0
- package/dist/editor/ui/SimpleIconButton.js +8 -4
- package/dist/editor/ui/SimpleIconButton.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/page-wizard/steps/CollectStep.js +1 -1
- package/dist/page-wizard/steps/CollectStep.js.map +1 -1
- package/dist/page-wizard/steps/StructureStep.js +1 -1
- package/dist/page-wizard/steps/StructureStep.js.map +1 -1
- package/dist/page-wizard/steps/TranslateStep.js +233 -18
- package/dist/page-wizard/steps/TranslateStep.js.map +1 -1
- package/dist/revision.d.ts +2 -2
- package/dist/revision.js +2 -2
- package/dist/splash-screen/RecentPages.js +1 -13
- package/dist/splash-screen/RecentPages.js.map +1 -1
- package/dist/splash-screen/SplashScreen.js +1 -1
- package/dist/splash-screen/SplashScreen.js.map +1 -1
- package/dist/styles.css +88 -3
- package/dist/types.d.ts +6 -0
- package/package.json +2 -2
- package/src/components/ActionButton.tsx +3 -2
- package/src/components/SimpleLanguageSelector.tsx +6 -1
- package/src/config/config.tsx +1 -1
- package/src/config/types.ts +1 -1
- package/src/editor/ContextMenu.tsx +0 -3
- package/src/editor/Editor.tsx +11 -3
- package/src/editor/FieldListField.tsx +22 -31
- package/src/editor/ImageEditButton.tsx +1 -0
- package/src/editor/ImageEditor.tsx +1 -0
- package/src/editor/MainLayout.tsx +2 -2
- package/src/editor/Terminal.tsx +1 -1
- package/src/editor/Titlebar.tsx +0 -2
- package/src/editor/ai/AgentCostDisplay.tsx +237 -0
- package/src/editor/ai/Agents.tsx +69 -20
- package/src/editor/ai/AiPromptPopover.tsx +209 -0
- package/src/editor/ai/AiResponseMessage.tsx +201 -60
- package/src/editor/ai/AiTerminal.tsx +502 -71
- package/src/editor/ai/editorAiContext.ts +0 -3
- package/src/editor/client/EditorClient.tsx +409 -117
- package/src/editor/client/editContext.ts +7 -5
- package/src/editor/client/fieldModificationStore.ts +196 -0
- package/src/editor/client/itemsRepository.ts +41 -31
- package/src/editor/client/operations.ts +95 -76
- package/src/editor/commands/componentCommands.tsx +9 -3
- package/src/editor/commands/itemCommands.tsx +0 -1
- package/src/editor/component-designer/aiContext.ts +0 -2
- package/src/editor/field-types/DropLinkEditor.tsx +1 -1
- package/src/editor/field-types/MultiLineText.tsx +9 -9
- package/src/editor/field-types/RichTextEditorComponent.tsx +8 -8
- package/src/editor/field-types/SingleLineText.tsx +9 -9
- package/src/editor/hooks/useEditorSettings.ts +68 -0
- package/src/editor/menubar/ItemActionsMenu.tsx +3 -2
- package/src/editor/menubar/PageSelector.tsx +1 -1
- package/src/editor/menubar/toolbar-sections/EditControls.tsx +1 -0
- package/src/editor/menubar/toolbar-sections/InsertControls.tsx +1 -0
- package/src/editor/menubar/toolbar-sections/UtilityControls.tsx +2 -0
- package/src/editor/menubar/toolbar-sections/ViewportControls.tsx +2 -0
- package/src/editor/page-editor-chrome/FieldEditedIndicators.tsx +4 -3
- package/src/editor/page-editor-chrome/FrameMenu.tsx +10 -1
- package/src/editor/page-editor-chrome/useInlineAICompletion.tsx +0 -1
- package/src/editor/page-viewer/EditorForm.tsx +1 -0
- package/src/editor/page-viewer/PageViewer.tsx +9 -8
- package/src/editor/page-viewer/PageViewerFrame.tsx +7 -1
- package/src/editor/page-viewer/pageViewContext.ts +40 -5
- package/src/editor/reviews/Comment.tsx +7 -7
- package/src/editor/services/agentService.ts +405 -31
- package/src/editor/services/aiService.ts +22 -5
- package/src/editor/services/contextService.ts +0 -1
- package/src/editor/services/systemService.ts +7 -1
- package/src/editor/sidebar/ComponentPalette.tsx +4 -1
- package/src/editor/sidebar/EditHistory.tsx +2 -0
- package/src/editor/sidebar/GraphQL.tsx +19 -7
- package/src/editor/sidebar/MainContentTree.tsx +1 -1
- package/src/editor/sidebar/SEOInfo.tsx +1 -1
- package/src/editor/sidebar/ViewSelector.tsx +80 -64
- package/src/editor/ui/PerfectTree.tsx +2 -18
- package/src/editor/ui/SimpleIconButton.tsx +56 -38
- package/src/index.ts +2 -0
- package/src/page-wizard/steps/CollectStep.tsx +0 -2
- package/src/page-wizard/steps/StructureStep.tsx +3 -0
- package/src/page-wizard/steps/TranslateStep.tsx +473 -62
- package/src/revision.ts +2 -2
- package/src/splash-screen/RecentPages.tsx +0 -14
- package/src/splash-screen/SplashScreen.tsx +3 -2
- package/src/types.ts +7 -0
- package/dist/editor/ai/AiPopup.d.ts +0 -10
- package/dist/editor/ai/AiPopup.js +0 -23
- package/dist/editor/ai/AiPopup.js.map +0 -1
- package/dist/editor/ai/AiToolCall.d.ts +0 -5
- package/dist/editor/ai/AiToolCall.js +0 -28
- package/dist/editor/ai/AiToolCall.js.map +0 -1
- package/src/editor/ai/AiPopup.tsx +0 -59
- package/src/editor/ai/AiToolCall.tsx +0 -71
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiResponseMessage.js","sourceRoot":"","sources":["../../../src/editor/ai/AiResponseMessage.tsx"],"names":[],"mappings":";AAAA,
|
|
1
|
+
{"version":3,"file":"AiResponseMessage.js","sourceRoot":"","sources":["../../../src/editor/ai/AiResponseMessage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,13 @@ type Response = {
|
|
|
7
7
|
numCachedTokens: number;
|
|
8
8
|
state: string;
|
|
9
9
|
agentName?: string;
|
|
10
|
+
totalCost?: number;
|
|
11
|
+
totalInputTokenCost?: number;
|
|
12
|
+
totalOutputTokenCost?: number;
|
|
13
|
+
totalCachedTokenCost?: number;
|
|
14
|
+
totalInputTokens?: number;
|
|
15
|
+
totalOutputTokens?: number;
|
|
16
|
+
totalCachedTokens?: number;
|
|
10
17
|
};
|
|
11
18
|
export type ToolCall = {
|
|
12
19
|
id: string;
|
|
@@ -27,13 +34,20 @@ export type Message = {
|
|
|
27
34
|
};
|
|
28
35
|
export type AiContext = {
|
|
29
36
|
promptData: any;
|
|
30
|
-
endpoint: string;
|
|
31
37
|
callback?: (response: Response) => void;
|
|
32
38
|
};
|
|
33
39
|
export type AiTerminalOptions = {
|
|
34
40
|
initialPrompt?: string;
|
|
35
41
|
hiddenSystemPrompt?: string;
|
|
36
42
|
initialMessages?: Message[];
|
|
43
|
+
agentId?: string;
|
|
44
|
+
totalCost?: number;
|
|
45
|
+
totalInputTokenCost?: number;
|
|
46
|
+
totalOutputTokenCost?: number;
|
|
47
|
+
totalCachedTokenCost?: number;
|
|
48
|
+
totalInputTokens?: number;
|
|
49
|
+
totalOutputTokens?: number;
|
|
50
|
+
totalCachedTokens?: number;
|
|
37
51
|
};
|
|
38
52
|
export declare function AiTerminal({ closeButton, createAiContext, defaultProfile, options, onAgentNameUpdate, }: {
|
|
39
53
|
closeButton?: React.ReactNode;
|
|
@@ -7,9 +7,20 @@ import { useEditContext } from "../client/editContext";
|
|
|
7
7
|
import { Dropdown } from "primereact/dropdown";
|
|
8
8
|
import { WizardIcon } from "../ui/Icons";
|
|
9
9
|
import { AiResponseMessage } from "./AiResponseMessage";
|
|
10
|
-
import { loadAiProfiles
|
|
10
|
+
import { loadAiProfiles } from "../services/aiService";
|
|
11
|
+
import { startAgent, connectToAgentStream, AgentStreamMessageType, } from "../services/agentService";
|
|
11
12
|
import { SimpleIconButton } from "../ui/SimpleIconButton";
|
|
12
13
|
import { Settings } from "lucide-react";
|
|
14
|
+
import { AgentCostDisplay } from "./AgentCostDisplay";
|
|
15
|
+
// Helper function to format message content
|
|
16
|
+
function formatMessageContent(content) {
|
|
17
|
+
return (content
|
|
18
|
+
?.trim()
|
|
19
|
+
?.replaceAll("\n", "<br>")
|
|
20
|
+
?.replace(/\*\*(.*?)\*\*/g, "<b>$1</b>") // Bold markdown
|
|
21
|
+
?.replace(/\[([^\]]+)\]\(([^)]+)\)/g, '<a href="$2" target="_blank" class="text-blue-500" rel="noopener noreferrer">$1</a>') || "" // Links
|
|
22
|
+
);
|
|
23
|
+
}
|
|
13
24
|
export function AiTerminal({ closeButton, createAiContext, defaultProfile, options, onAgentNameUpdate, }) {
|
|
14
25
|
const editContext = useEditContext();
|
|
15
26
|
const [showPredefined, setShowPredefined] = useState(false);
|
|
@@ -22,7 +33,7 @@ export function AiTerminal({ closeButton, createAiContext, defaultProfile, optio
|
|
|
22
33
|
const [profiles, setProfiles] = useState([]);
|
|
23
34
|
const [activeProfile, setActiveProfile] = useState();
|
|
24
35
|
const [initialPromptExecuted, setInitialPromptExecuted] = useState(false);
|
|
25
|
-
const [agentId, setAgentId] = useState(() => crypto.randomUUID());
|
|
36
|
+
const [agentId, setAgentId] = useState(() => options?.agentId || crypto.randomUUID());
|
|
26
37
|
const selection = editContext.selection;
|
|
27
38
|
const terminalRef = useRef(null);
|
|
28
39
|
const [responseMessages, setResponseMessages] = useState(options?.initialMessages || []);
|
|
@@ -66,10 +77,7 @@ export function AiTerminal({ closeButton, createAiContext, defaultProfile, optio
|
|
|
66
77
|
console.log("AiTerminal: Loading initial messages", options.initialMessages);
|
|
67
78
|
// Format the initial messages for display
|
|
68
79
|
const formattedMessages = options.initialMessages.map((message) => {
|
|
69
|
-
const formattedContent = message.content
|
|
70
|
-
?.trim()
|
|
71
|
-
?.replaceAll("\n", "<br>")
|
|
72
|
-
?.replace(/\*\*(.*?)\*\*/g, "<b>$1</b>") || "";
|
|
80
|
+
const formattedContent = formatMessageContent(message.content || "");
|
|
73
81
|
return {
|
|
74
82
|
...message,
|
|
75
83
|
content: message.content || "",
|
|
@@ -77,7 +85,6 @@ export function AiTerminal({ closeButton, createAiContext, defaultProfile, optio
|
|
|
77
85
|
tool_calls: message.tool_calls || [],
|
|
78
86
|
};
|
|
79
87
|
});
|
|
80
|
-
console.log("AiTerminal: Formatted messages", formattedMessages);
|
|
81
88
|
// Update the internal message states
|
|
82
89
|
setMessages(formattedMessages);
|
|
83
90
|
setResponseMessages(formattedMessages);
|
|
@@ -85,12 +92,19 @@ export function AiTerminal({ closeButton, createAiContext, defaultProfile, optio
|
|
|
85
92
|
const initialResponse = {
|
|
86
93
|
messages: formattedMessages,
|
|
87
94
|
editOperations: [],
|
|
88
|
-
numInputTokens: 0,
|
|
89
|
-
numOutputTokens: 0,
|
|
90
|
-
numCachedTokens: 0,
|
|
95
|
+
numInputTokens: options?.totalInputTokens || 0,
|
|
96
|
+
numOutputTokens: options?.totalOutputTokens || 0,
|
|
97
|
+
numCachedTokens: options?.totalCachedTokens || 0,
|
|
91
98
|
state: "loaded",
|
|
99
|
+
// Include cost information from loaded agent session
|
|
100
|
+
totalCost: options?.totalCost,
|
|
101
|
+
totalInputTokenCost: options?.totalInputTokenCost,
|
|
102
|
+
totalOutputTokenCost: options?.totalOutputTokenCost,
|
|
103
|
+
totalCachedTokenCost: options?.totalCachedTokenCost,
|
|
104
|
+
totalInputTokens: options?.totalInputTokens,
|
|
105
|
+
totalOutputTokens: options?.totalOutputTokens,
|
|
106
|
+
totalCachedTokens: options?.totalCachedTokens,
|
|
92
107
|
};
|
|
93
|
-
console.log("AiTerminal: Setting response", initialResponse);
|
|
94
108
|
setResponse(initialResponse);
|
|
95
109
|
// Create individual Terminal messages for each conversation message
|
|
96
110
|
const terminalMessages = [];
|
|
@@ -165,10 +179,7 @@ export function AiTerminal({ closeButton, createAiContext, defaultProfile, optio
|
|
|
165
179
|
// Replace the conversation history with the authoritative response from AI
|
|
166
180
|
if (updatedMessages && Array.isArray(updatedMessages)) {
|
|
167
181
|
const formattedMessages = updatedMessages.map((message) => {
|
|
168
|
-
const formattedContent = message.content
|
|
169
|
-
?.trim()
|
|
170
|
-
?.replaceAll("\n", "<br>")
|
|
171
|
-
?.replace(/\*\*(.*?)\*\*/g, "<b>$1</b>") || "";
|
|
182
|
+
const formattedContent = formatMessageContent(message.content || "");
|
|
172
183
|
return {
|
|
173
184
|
...message,
|
|
174
185
|
content: message.content || "",
|
|
@@ -195,7 +206,6 @@ export function AiTerminal({ closeButton, createAiContext, defaultProfile, optio
|
|
|
195
206
|
tool_calls: [], // Add empty toolCalls array
|
|
196
207
|
};
|
|
197
208
|
const context = createAiContext({ editContext });
|
|
198
|
-
let lastOpIndex = 0;
|
|
199
209
|
const selectedText = editContext?.selectedRange?.text || null;
|
|
200
210
|
if (!activeProfile || !model)
|
|
201
211
|
return;
|
|
@@ -217,36 +227,337 @@ export function AiTerminal({ closeButton, createAiContext, defaultProfile, optio
|
|
|
217
227
|
// Update local state to include the new user message for UI display
|
|
218
228
|
setMessages((prevMessages) => [...prevMessages, userMessage]);
|
|
219
229
|
setResponseMessages((prevMessages) => [...prevMessages, userMessage]);
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
230
|
+
try {
|
|
231
|
+
// Step 1: Start the agent execution
|
|
232
|
+
const startRequest = {
|
|
233
|
+
agentId,
|
|
234
|
+
messages,
|
|
235
|
+
sessionId: editContext.sessionId,
|
|
236
|
+
profileId: activeProfile.id,
|
|
237
|
+
model,
|
|
238
|
+
itemid: context.promptData.itemid,
|
|
239
|
+
language: context.promptData.language,
|
|
240
|
+
version: context.promptData.version,
|
|
241
|
+
selection,
|
|
242
|
+
selectedText: selectedText || undefined,
|
|
243
|
+
allowedFunctions: context.promptData.allowedFunctions,
|
|
244
|
+
addContextContent: context.promptData.addContextContent,
|
|
245
|
+
addAllContent: context.promptData.addAllContent,
|
|
246
|
+
addSelectedComponents: true,
|
|
247
|
+
profile: activeProfile.name,
|
|
248
|
+
};
|
|
249
|
+
const startResponse = await startAgent(startRequest, context);
|
|
250
|
+
console.log("Agent started:", startResponse);
|
|
251
|
+
// Step 2: Connect to the agent stream for real-time updates
|
|
252
|
+
const abortController = new AbortController();
|
|
253
|
+
let accumulatedResponse = {
|
|
254
|
+
messages: [...messages],
|
|
255
|
+
editOperations: [],
|
|
256
|
+
numInputTokens: 0,
|
|
257
|
+
numOutputTokens: 0,
|
|
258
|
+
numCachedTokens: 0,
|
|
259
|
+
state: "running",
|
|
260
|
+
};
|
|
261
|
+
let completionProcessed = false;
|
|
262
|
+
try {
|
|
263
|
+
console.log("Connecting to agent stream");
|
|
264
|
+
await connectToAgentStream(agentId, context, (streamMessage) => {
|
|
265
|
+
// console.log(
|
|
266
|
+
// "Stream message:",
|
|
267
|
+
// streamMessage,
|
|
268
|
+
// new Date().toISOString(),
|
|
269
|
+
// );
|
|
270
|
+
// Message types are now normalized in agentService.ts
|
|
271
|
+
switch (streamMessage.type) {
|
|
272
|
+
case AgentStreamMessageType.StatusUpdate:
|
|
273
|
+
//console.log("Status update:", streamMessage.data);
|
|
274
|
+
break;
|
|
275
|
+
case AgentStreamMessageType.ContentChunk:
|
|
276
|
+
if (streamMessage.data) {
|
|
277
|
+
// Handle incremental content updates
|
|
278
|
+
if (streamMessage.data.isIncremental &&
|
|
279
|
+
streamMessage.data.deltaContent) {
|
|
280
|
+
// Find the last assistant message to append delta content to
|
|
281
|
+
const updatedMessages = [
|
|
282
|
+
...(accumulatedResponse.messages || []),
|
|
283
|
+
];
|
|
284
|
+
let lastAssistantMessage = null;
|
|
285
|
+
let lastAssistantIndex = -1;
|
|
286
|
+
// Find the last assistant message
|
|
287
|
+
for (let i = updatedMessages.length - 1; i >= 0; i--) {
|
|
288
|
+
if (updatedMessages[i].role === "assistant") {
|
|
289
|
+
lastAssistantMessage = updatedMessages[i];
|
|
290
|
+
lastAssistantIndex = i;
|
|
291
|
+
break;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
// If no assistant message exists, or the last one has tool calls, create a new one
|
|
295
|
+
if (!lastAssistantMessage ||
|
|
296
|
+
(lastAssistantMessage.tool_calls &&
|
|
297
|
+
lastAssistantMessage.tool_calls.length > 0)) {
|
|
298
|
+
lastAssistantMessage = {
|
|
299
|
+
id: crypto.randomUUID(),
|
|
300
|
+
role: "assistant",
|
|
301
|
+
name: "assistant",
|
|
302
|
+
content: "",
|
|
303
|
+
tool_calls: [],
|
|
304
|
+
};
|
|
305
|
+
updatedMessages.push(lastAssistantMessage);
|
|
306
|
+
lastAssistantIndex = updatedMessages.length - 1;
|
|
307
|
+
}
|
|
308
|
+
// Append the delta content to build up the full message
|
|
309
|
+
const currentContent = lastAssistantMessage.content || "";
|
|
310
|
+
const newContent = currentContent + streamMessage.data.deltaContent;
|
|
311
|
+
// Update the message with accumulated content
|
|
312
|
+
updatedMessages[lastAssistantIndex] = {
|
|
313
|
+
...lastAssistantMessage,
|
|
314
|
+
content: newContent,
|
|
315
|
+
};
|
|
316
|
+
// Update accumulated response with incremental content
|
|
317
|
+
accumulatedResponse = {
|
|
318
|
+
...accumulatedResponse,
|
|
319
|
+
...streamMessage.data,
|
|
320
|
+
messages: updatedMessages,
|
|
321
|
+
editOperations: streamMessage.data.editOperations ||
|
|
322
|
+
accumulatedResponse.editOperations,
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
else {
|
|
326
|
+
// Non-incremental update - use as provided
|
|
327
|
+
accumulatedResponse = {
|
|
328
|
+
...accumulatedResponse,
|
|
329
|
+
...streamMessage.data,
|
|
330
|
+
editOperations: streamMessage.data.editOperations ||
|
|
331
|
+
accumulatedResponse.editOperations,
|
|
332
|
+
};
|
|
333
|
+
}
|
|
334
|
+
// Always trigger UI update for content chunks
|
|
335
|
+
handleResponse(accumulatedResponse, callback, false);
|
|
336
|
+
}
|
|
337
|
+
break;
|
|
338
|
+
case AgentStreamMessageType.ToolCall:
|
|
339
|
+
// console.log("Tool call received:", streamMessage.data);
|
|
340
|
+
if (streamMessage.data) {
|
|
341
|
+
// Find or create the assistant message that contains this tool call
|
|
342
|
+
const updatedMessages = [
|
|
343
|
+
...(accumulatedResponse.messages || []),
|
|
344
|
+
];
|
|
345
|
+
let lastAssistantMessage = null;
|
|
346
|
+
let lastAssistantIndex = -1;
|
|
347
|
+
// Find the last assistant message
|
|
348
|
+
for (let i = updatedMessages.length - 1; i >= 0; i--) {
|
|
349
|
+
if (updatedMessages[i].role === "assistant") {
|
|
350
|
+
lastAssistantMessage = updatedMessages[i];
|
|
351
|
+
lastAssistantIndex = i;
|
|
352
|
+
break;
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
// If no assistant message exists, create one
|
|
356
|
+
if (!lastAssistantMessage) {
|
|
357
|
+
lastAssistantMessage = {
|
|
358
|
+
id: crypto.randomUUID(),
|
|
359
|
+
role: "assistant",
|
|
360
|
+
name: "assistant",
|
|
361
|
+
content: "",
|
|
362
|
+
tool_calls: [],
|
|
363
|
+
};
|
|
364
|
+
updatedMessages.push(lastAssistantMessage);
|
|
365
|
+
lastAssistantIndex = updatedMessages.length - 1;
|
|
366
|
+
}
|
|
367
|
+
// Add or update the tool call
|
|
368
|
+
const toolCall = {
|
|
369
|
+
id: streamMessage.data.id,
|
|
370
|
+
displayName: streamMessage.data.displayName,
|
|
371
|
+
function: {
|
|
372
|
+
name: streamMessage.data.function?.name ||
|
|
373
|
+
streamMessage.data.name,
|
|
374
|
+
arguments: streamMessage.data.function?.arguments ||
|
|
375
|
+
streamMessage.data.arguments,
|
|
376
|
+
},
|
|
377
|
+
};
|
|
378
|
+
// Update or add the tool call to the assistant message
|
|
379
|
+
const existingToolCalls = lastAssistantMessage.tool_calls || [];
|
|
380
|
+
const existingIndex = existingToolCalls.findIndex((tc) => tc.id === toolCall.id);
|
|
381
|
+
let updatedToolCalls;
|
|
382
|
+
if (existingIndex >= 0) {
|
|
383
|
+
// Update existing tool call
|
|
384
|
+
updatedToolCalls = [...existingToolCalls];
|
|
385
|
+
updatedToolCalls[existingIndex] = toolCall;
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
// Add new tool call
|
|
389
|
+
updatedToolCalls = [...existingToolCalls, toolCall];
|
|
390
|
+
}
|
|
391
|
+
// Update the assistant message with the tool call
|
|
392
|
+
updatedMessages[lastAssistantIndex] = {
|
|
393
|
+
...lastAssistantMessage,
|
|
394
|
+
tool_calls: updatedToolCalls,
|
|
395
|
+
};
|
|
396
|
+
// Update accumulated response
|
|
397
|
+
accumulatedResponse = {
|
|
398
|
+
...accumulatedResponse,
|
|
399
|
+
messages: updatedMessages,
|
|
400
|
+
};
|
|
401
|
+
// Trigger UI update to show the tool call
|
|
402
|
+
handleResponse(accumulatedResponse, callback, false);
|
|
403
|
+
}
|
|
404
|
+
break;
|
|
405
|
+
case AgentStreamMessageType.ToolResult:
|
|
406
|
+
console.log("Tool result received:", streamMessage.data);
|
|
407
|
+
if (streamMessage.data) {
|
|
408
|
+
// Find the assistant message and tool call to update with the result
|
|
409
|
+
const updatedMessages = [
|
|
410
|
+
...(accumulatedResponse.messages || []),
|
|
411
|
+
];
|
|
412
|
+
// Find the assistant message with the matching tool call ID
|
|
413
|
+
for (let i = updatedMessages.length - 1; i >= 0; i--) {
|
|
414
|
+
if (updatedMessages[i].role === "assistant" &&
|
|
415
|
+
updatedMessages[i].tool_calls) {
|
|
416
|
+
const toolCalls = updatedMessages[i].tool_calls || [];
|
|
417
|
+
const toolCallIndex = toolCalls.findIndex((tc) => tc.id === streamMessage.data.toolCallId);
|
|
418
|
+
if (toolCallIndex >= 0) {
|
|
419
|
+
// Update the tool call with the result
|
|
420
|
+
const updatedToolCalls = [...toolCalls];
|
|
421
|
+
updatedToolCalls[toolCallIndex] = {
|
|
422
|
+
...updatedToolCalls[toolCallIndex],
|
|
423
|
+
function: {
|
|
424
|
+
...updatedToolCalls[toolCallIndex].function,
|
|
425
|
+
result: streamMessage.data.result,
|
|
426
|
+
},
|
|
427
|
+
};
|
|
428
|
+
// Update the message
|
|
429
|
+
updatedMessages[i] = {
|
|
430
|
+
...updatedMessages[i],
|
|
431
|
+
tool_calls: updatedToolCalls,
|
|
432
|
+
};
|
|
433
|
+
break;
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
// Update accumulated response
|
|
438
|
+
accumulatedResponse = {
|
|
439
|
+
...accumulatedResponse,
|
|
440
|
+
messages: updatedMessages,
|
|
441
|
+
};
|
|
442
|
+
// Trigger UI update to show the tool result
|
|
443
|
+
handleResponse(accumulatedResponse, callback, false);
|
|
444
|
+
}
|
|
445
|
+
break;
|
|
446
|
+
case AgentStreamMessageType.Completed:
|
|
447
|
+
if (streamMessage.data) {
|
|
448
|
+
// Final completion data
|
|
449
|
+
const finalResponse = {
|
|
450
|
+
messages: streamMessage.data.messages ||
|
|
451
|
+
accumulatedResponse.messages,
|
|
452
|
+
editOperations: streamMessage.data.editOperations ||
|
|
453
|
+
accumulatedResponse.editOperations,
|
|
454
|
+
numInputTokens: streamMessage.data.tokenUsage?.inputTokens ||
|
|
455
|
+
accumulatedResponse.numInputTokens,
|
|
456
|
+
numOutputTokens: streamMessage.data.tokenUsage?.outputTokens ||
|
|
457
|
+
accumulatedResponse.numOutputTokens,
|
|
458
|
+
numCachedTokens: streamMessage.data.tokenUsage?.cachedTokens ||
|
|
459
|
+
accumulatedResponse.numCachedTokens,
|
|
460
|
+
state: "completed",
|
|
461
|
+
agentName: streamMessage.data.agentName,
|
|
462
|
+
// Add cost fields from backend (try both tokenUsage object and direct properties)
|
|
463
|
+
totalCost: streamMessage.data.totalCost ||
|
|
464
|
+
streamMessage.data.tokenUsage?.totalCost,
|
|
465
|
+
totalInputTokenCost: streamMessage.data.totalInputTokenCost ||
|
|
466
|
+
streamMessage.data.tokenUsage?.inputTokenCost,
|
|
467
|
+
totalOutputTokenCost: streamMessage.data.totalOutputTokenCost ||
|
|
468
|
+
streamMessage.data.tokenUsage?.outputTokenCost,
|
|
469
|
+
totalCachedTokenCost: streamMessage.data.totalCachedTokenCost ||
|
|
470
|
+
streamMessage.data.tokenUsage?.cachedTokenCost,
|
|
471
|
+
totalInputTokens: streamMessage.data.totalInputTokens ||
|
|
472
|
+
streamMessage.data.tokenUsage?.inputTokens,
|
|
473
|
+
totalOutputTokens: streamMessage.data.totalOutputTokens ||
|
|
474
|
+
streamMessage.data.tokenUsage?.outputTokens,
|
|
475
|
+
totalCachedTokens: streamMessage.data.totalCachedTokens ||
|
|
476
|
+
streamMessage.data.tokenUsage?.cachedTokens,
|
|
477
|
+
};
|
|
478
|
+
completionProcessed = true;
|
|
479
|
+
setResponse(finalResponse);
|
|
480
|
+
// On completion, just update the internal state and call the final callback
|
|
481
|
+
// Don't call handleResponse again as it would duplicate the message
|
|
482
|
+
// The Terminal component will clear the streaming response and add it to the message history
|
|
483
|
+
const formattedMessages = (finalResponse.messages || []).map((message) => {
|
|
484
|
+
const formattedContent = formatMessageContent(message.content || "");
|
|
485
|
+
return {
|
|
486
|
+
...message,
|
|
487
|
+
content: message.content || "",
|
|
488
|
+
formattedContent: formattedContent,
|
|
489
|
+
tool_calls: message.tool_calls || [],
|
|
490
|
+
};
|
|
491
|
+
});
|
|
492
|
+
// Update internal state without triggering a new render via handleResponse
|
|
493
|
+
setMessages([...formattedMessages]);
|
|
494
|
+
setResponseMessages([...formattedMessages]);
|
|
495
|
+
// Only call the terminal callback to mark completion (this will add to history)
|
|
496
|
+
callback(_jsx(AiResponseMessage, { messages: formattedMessages, editOperations: finalResponse.editOperations, finished: true }), true);
|
|
497
|
+
// Handle agent name update
|
|
498
|
+
if (finalResponse.agentName && onAgentNameUpdate) {
|
|
499
|
+
onAgentNameUpdate(finalResponse.agentName);
|
|
500
|
+
}
|
|
501
|
+
if (context.callback)
|
|
502
|
+
context.callback(finalResponse);
|
|
503
|
+
//editContext?.requestRefresh("immediate");
|
|
504
|
+
}
|
|
505
|
+
break;
|
|
506
|
+
case AgentStreamMessageType.Error:
|
|
507
|
+
console.error("Agent execution error:", streamMessage.error);
|
|
508
|
+
const errorResponse = {
|
|
509
|
+
...accumulatedResponse,
|
|
510
|
+
state: "error",
|
|
511
|
+
error: streamMessage.error,
|
|
512
|
+
};
|
|
513
|
+
setResponse(errorResponse);
|
|
514
|
+
handleResponse(errorResponse, callback, true);
|
|
515
|
+
break;
|
|
516
|
+
default:
|
|
517
|
+
console.log("Unhandled stream message type:", streamMessage.type);
|
|
518
|
+
break;
|
|
519
|
+
}
|
|
520
|
+
}, abortController.signal);
|
|
521
|
+
// If we reach here, the stream ended without a Completed message
|
|
522
|
+
if (!completionProcessed) {
|
|
523
|
+
// console.log("Stream ended without Completed message, cleaning up");
|
|
524
|
+
const finalResponse = {
|
|
525
|
+
...accumulatedResponse,
|
|
526
|
+
state: "completed",
|
|
527
|
+
};
|
|
528
|
+
setResponse(finalResponse);
|
|
529
|
+
handleResponse(finalResponse, callback, true);
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
catch (streamError) {
|
|
533
|
+
console.error("Stream connection error:", streamError);
|
|
534
|
+
const errorMessage = streamError instanceof Error
|
|
535
|
+
? streamError.message
|
|
536
|
+
: "Unknown stream error";
|
|
537
|
+
const errorResponse = {
|
|
538
|
+
...accumulatedResponse,
|
|
539
|
+
state: "error",
|
|
540
|
+
error: errorMessage,
|
|
541
|
+
};
|
|
542
|
+
setResponse(errorResponse);
|
|
543
|
+
handleResponse(errorResponse, callback, true);
|
|
237
544
|
}
|
|
238
|
-
if (context.callback)
|
|
239
|
-
context.callback(response);
|
|
240
|
-
editContext?.requestRefresh("immediate");
|
|
241
545
|
}
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
546
|
+
catch (error) {
|
|
547
|
+
console.error("Error starting agent:", error);
|
|
548
|
+
const errorMessage = error instanceof Error ? error.message : "Unknown error";
|
|
549
|
+
const errorResponse = {
|
|
550
|
+
messages: [...messages],
|
|
551
|
+
editOperations: [],
|
|
552
|
+
numInputTokens: 0,
|
|
553
|
+
numOutputTokens: 0,
|
|
554
|
+
numCachedTokens: 0,
|
|
555
|
+
state: "error",
|
|
556
|
+
error: errorMessage,
|
|
557
|
+
};
|
|
558
|
+
setResponse(errorResponse);
|
|
559
|
+
handleResponse(errorResponse, callback, true);
|
|
560
|
+
}
|
|
250
561
|
}
|
|
251
562
|
useEffect(() => {
|
|
252
563
|
TerminalService.on("command", commandHandler);
|
|
@@ -261,9 +572,29 @@ export function AiTerminal({ closeButton, createAiContext, defaultProfile, optio
|
|
|
261
572
|
setInitialTerminalMessages(undefined);
|
|
262
573
|
// Generate a new agentId when clearing the terminal to start fresh
|
|
263
574
|
setAgentId(crypto.randomUUID());
|
|
264
|
-
}, initialMessages: initialTerminalMessages, infobar:
|
|
265
|
-
|
|
266
|
-
:
|
|
575
|
+
}, initialMessages: initialTerminalMessages, infobar: _jsx(AgentCostDisplay, { response: response
|
|
576
|
+
? {
|
|
577
|
+
numInputTokens: response.numInputTokens,
|
|
578
|
+
numOutputTokens: response.numOutputTokens,
|
|
579
|
+
numCachedTokens: response.numCachedTokens,
|
|
580
|
+
totalCost: response.totalCost,
|
|
581
|
+
inputCost: response.totalInputTokenCost,
|
|
582
|
+
outputCost: response.totalOutputTokenCost,
|
|
583
|
+
cachedCost: response.totalCachedTokenCost,
|
|
584
|
+
}
|
|
585
|
+
: null, totalTokens: response
|
|
586
|
+
? {
|
|
587
|
+
input: response.totalInputTokens || response.numInputTokens,
|
|
588
|
+
output: response.totalOutputTokens ||
|
|
589
|
+
response.numOutputTokens,
|
|
590
|
+
cached: response.totalCachedTokens ||
|
|
591
|
+
response.numCachedTokens,
|
|
592
|
+
totalCost: response.totalCost || 0,
|
|
593
|
+
inputCost: response.totalInputTokenCost || 0,
|
|
594
|
+
outputCost: response.totalOutputTokenCost || 0,
|
|
595
|
+
cachedCost: response.totalCachedTokenCost || 0,
|
|
596
|
+
}
|
|
597
|
+
: undefined }), prompt: prompt, setPrompt: setPrompt, 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: () => {
|
|
267
598
|
setShowPredefined(!showPredefined);
|
|
268
599
|
}, 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: () => {
|
|
269
600
|
editContext.select([]);
|
|
@@ -271,7 +602,7 @@ export function AiTerminal({ closeButton, createAiContext, defaultProfile, optio
|
|
|
271
602
|
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: () => {
|
|
272
603
|
setPrompt(p.prompt);
|
|
273
604
|
setShowPredefined(false);
|
|
274
|
-
}, 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) => {
|
|
605
|
+
}, 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, optionLabel: "name", optionValue: "id" })] }))] }))] }), closeButton] }), commandHandler: (v, callback) => {
|
|
275
606
|
commandHandler(v, callback);
|
|
276
607
|
} }) }), 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" }))] }) }));
|
|
277
608
|
}
|