@parhelia/core 0.1.11151 → 0.1.11180
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/agents-view/AgentsInbox.d.ts +2 -1
- package/dist/agents-view/AgentsInbox.js +2 -2
- package/dist/agents-view/AgentsInbox.js.map +1 -1
- package/dist/agents-view/AgentsView.js +30 -1
- package/dist/agents-view/AgentsView.js.map +1 -1
- package/dist/components/ui/card.d.ts +1 -1
- package/dist/components/ui/card.js +1 -1
- package/dist/components/ui/card.js.map +1 -1
- package/dist/components/ui/paste-button.d.ts +1 -1
- package/dist/components/ui/paste-button.js +79 -22
- package/dist/components/ui/paste-button.js.map +1 -1
- package/dist/config/config.js +83 -51
- package/dist/config/config.js.map +1 -1
- package/dist/config/types.d.ts +29 -4
- package/dist/editor/ContentTree.js +92 -22
- package/dist/editor/ContentTree.js.map +1 -1
- package/dist/editor/FieldActionsOverlay.d.ts +1 -0
- package/dist/editor/FieldActionsOverlay.js +17 -1
- package/dist/editor/FieldActionsOverlay.js.map +1 -1
- package/dist/editor/FieldListField.js +1 -1
- package/dist/editor/FieldListField.js.map +1 -1
- package/dist/editor/LinkEditorDialog.js +33 -24
- package/dist/editor/LinkEditorDialog.js.map +1 -1
- package/dist/editor/MainLayout.js +2 -2
- package/dist/editor/MainLayout.js.map +1 -1
- package/dist/editor/PictureEditor.js +1 -1
- package/dist/editor/PictureEditor.js.map +1 -1
- package/dist/editor/ai/AgentTerminal.js +63 -26
- package/dist/editor/ai/AgentTerminal.js.map +1 -1
- package/dist/editor/ai/Agents.js +7 -2
- package/dist/editor/ai/Agents.js.map +1 -1
- package/dist/editor/client/EditorShell.js +178 -79
- package/dist/editor/client/EditorShell.js.map +1 -1
- package/dist/editor/client/OperationDialogContent.d.ts +13 -0
- package/dist/editor/client/OperationDialogContent.js +13 -0
- package/dist/editor/client/OperationDialogContent.js.map +1 -0
- package/dist/editor/client/editContext.d.ts +2 -0
- package/dist/editor/client/editContext.js.map +1 -1
- package/dist/editor/client/hooks/useGlobalEditorKeyDown.js +5 -2
- package/dist/editor/client/hooks/useGlobalEditorKeyDown.js.map +1 -1
- package/dist/editor/client/hooks/useQuota.d.ts +4 -0
- package/dist/editor/client/hooks/useQuota.js.map +1 -1
- package/dist/editor/client/hooks/useSocketMessageHandler.d.ts +2 -2
- package/dist/editor/client/hooks/useSocketMessageHandler.js +5 -7
- package/dist/editor/client/hooks/useSocketMessageHandler.js.map +1 -1
- package/dist/editor/client/operations.d.ts +1 -0
- package/dist/editor/client/operations.js +332 -8
- package/dist/editor/client/operations.js.map +1 -1
- package/dist/editor/client/ui/EditorChrome.js +1 -1
- package/dist/editor/client/ui/EditorChrome.js.map +1 -1
- package/dist/editor/commands/itemCommands.d.ts +0 -1
- package/dist/editor/commands/itemCommands.js +1 -16
- package/dist/editor/commands/itemCommands.js.map +1 -1
- package/dist/editor/commands/undo.js +6 -2
- package/dist/editor/commands/undo.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/FieldActionIndicator.js +56 -2
- package/dist/editor/page-editor-chrome/FieldActionIndicator.js.map +1 -1
- package/dist/editor/page-editor-chrome/FrameMenu.js +5 -4
- package/dist/editor/page-editor-chrome/FrameMenu.js.map +1 -1
- package/dist/editor/page-editor-chrome/PlaceholderDropZones.js +5 -1
- package/dist/editor/page-editor-chrome/PlaceholderDropZones.js.map +1 -1
- package/dist/editor/page-viewer/PageViewerFrame.js +118 -13
- package/dist/editor/page-viewer/PageViewerFrame.js.map +1 -1
- package/dist/editor/reviews/CreateReviewDialog.js +1 -1
- package/dist/editor/reviews/CreateReviewDialog.js.map +1 -1
- package/dist/editor/reviews/DecisionsMatrix.js +1 -1
- package/dist/editor/reviews/DecisionsMatrix.js.map +1 -1
- package/dist/editor/reviews/ReviewsList.js +1 -1
- package/dist/editor/reviews/ReviewsList.js.map +1 -1
- package/dist/editor/services/editService.d.ts +20 -3
- package/dist/editor/services/editService.js +17 -17
- package/dist/editor/services/editService.js.map +1 -1
- package/dist/editor/services/indexService.d.ts +4 -1
- package/dist/editor/services/indexService.js +12 -0
- package/dist/editor/services/indexService.js.map +1 -1
- package/dist/editor/services/serviceHelper.js +1 -0
- package/dist/editor/services/serviceHelper.js.map +1 -1
- package/dist/editor/settings/About.d.ts +1 -0
- package/dist/editor/settings/About.js +9 -0
- package/dist/editor/settings/About.js.map +1 -0
- package/dist/editor/settings/AllAgentsPanel.d.ts +5 -0
- package/dist/editor/settings/AllAgentsPanel.js +126 -0
- package/dist/editor/settings/AllAgentsPanel.js.map +1 -0
- package/dist/editor/settings/IndexOverview.d.ts +1 -0
- package/dist/editor/settings/IndexOverview.js +471 -0
- package/dist/editor/settings/IndexOverview.js.map +1 -0
- package/dist/editor/settings/Info.d.ts +1 -0
- package/dist/editor/settings/Info.js +11 -0
- package/dist/editor/settings/Info.js.map +1 -0
- package/dist/editor/settings/LatestFeedback.d.ts +1 -0
- package/dist/editor/settings/LatestFeedback.js +136 -0
- package/dist/editor/settings/LatestFeedback.js.map +1 -0
- package/dist/editor/settings/QuotaInfo.d.ts +1 -0
- package/dist/editor/settings/QuotaInfo.js +102 -0
- package/dist/editor/settings/QuotaInfo.js.map +1 -0
- package/dist/editor/settings/SettingsMenu.d.ts +1 -0
- package/dist/editor/settings/SettingsMenu.js +74 -0
- package/dist/editor/settings/SettingsMenu.js.map +1 -0
- package/dist/editor/settings/SettingsView.d.ts +1 -0
- package/dist/editor/settings/SettingsView.js +85 -0
- package/dist/editor/settings/SettingsView.js.map +1 -0
- package/dist/editor/settings/Setup.d.ts +1 -0
- package/dist/editor/settings/Setup.js +211 -0
- package/dist/editor/settings/Setup.js.map +1 -0
- package/dist/editor/settings/Status.d.ts +1 -0
- package/dist/editor/settings/Status.js +85 -0
- package/dist/editor/settings/Status.js.map +1 -0
- package/dist/editor/settings/WebSocketMessages.d.ts +1 -0
- package/dist/editor/settings/WebSocketMessages.js +71 -0
- package/dist/editor/settings/WebSocketMessages.js.map +1 -0
- package/dist/editor/settings/panels/AgentsPanel.d.ts +6 -0
- package/dist/editor/settings/panels/AgentsPanel.js +186 -0
- package/dist/editor/settings/panels/AgentsPanel.js.map +1 -0
- package/dist/editor/settings/panels/DatabasePanel.d.ts +6 -0
- package/dist/editor/settings/panels/DatabasePanel.js +50 -0
- package/dist/editor/settings/panels/DatabasePanel.js.map +1 -0
- package/dist/editor/settings/panels/ItemConfigPanel.d.ts +13 -0
- package/dist/editor/settings/panels/ItemConfigPanel.js +52 -0
- package/dist/editor/settings/panels/ItemConfigPanel.js.map +1 -0
- package/dist/editor/settings/panels/ModelsPanel.d.ts +6 -0
- package/dist/editor/settings/panels/ModelsPanel.js +269 -0
- package/dist/editor/settings/panels/ModelsPanel.js.map +1 -0
- package/dist/editor/settings/panels/ProvidersPanel.d.ts +6 -0
- package/dist/editor/settings/panels/ProvidersPanel.js +206 -0
- package/dist/editor/settings/panels/ProvidersPanel.js.map +1 -0
- package/dist/editor/settings/panels/SearchConfigPanel.d.ts +6 -0
- package/dist/editor/settings/panels/SearchConfigPanel.js +134 -0
- package/dist/editor/settings/panels/SearchConfigPanel.js.map +1 -0
- package/dist/editor/settings/panels/SettingsPanel.d.ts +6 -0
- package/dist/editor/settings/panels/SettingsPanel.js +39 -0
- package/dist/editor/settings/panels/SettingsPanel.js.map +1 -0
- package/dist/editor/settings/panels/StatusPanel.d.ts +6 -0
- package/dist/editor/settings/panels/StatusPanel.js +141 -0
- package/dist/editor/settings/panels/StatusPanel.js.map +1 -0
- package/dist/editor/settings/panels/ToolsPanel.d.ts +6 -0
- package/dist/editor/settings/panels/ToolsPanel.js +192 -0
- package/dist/editor/settings/panels/ToolsPanel.js.map +1 -0
- package/dist/editor/settings/panels/index.d.ts +14 -0
- package/dist/editor/settings/panels/index.js +15 -0
- package/dist/editor/settings/panels/index.js.map +1 -0
- package/dist/editor/settings/panels/useSidebarEditor.d.ts +15 -0
- package/dist/editor/settings/panels/useSidebarEditor.js +24 -0
- package/dist/editor/settings/panels/useSidebarEditor.js.map +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/EmbeddingsModelSection.d.ts +2 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/EmbeddingsModelSection.js +195 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/EmbeddingsModelSection.js.map +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/index.d.ts +2 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/index.js +22 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/index.js.map +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/provider/ProviderSection.d.ts +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/provider/ProviderSection.js +233 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/provider/ProviderSection.js.map +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersList.d.ts +15 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersList.js +14 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersList.js.map +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.d.ts +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.js +94 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/required-containers/RequiredContainersSection.js.map +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/tools/GenerateToolsSection.d.ts +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/tools/GenerateToolsSection.js +367 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/tools/GenerateToolsSection.js.map +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/types.d.ts +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/types.js +2 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/types.js.map +1 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/utils.d.ts +5 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/utils.js +44 -0
- package/dist/editor/settings/setup-steps/AiSetupStep/utils.js.map +1 -0
- package/dist/editor/settings/setup-steps/IndexSetupStep.d.ts +2 -0
- package/dist/editor/settings/setup-steps/IndexSetupStep.js +36 -0
- package/dist/editor/settings/setup-steps/IndexSetupStep.js.map +1 -0
- package/dist/editor/settings/setup-steps/SettingsSetupStep.d.ts +2 -0
- package/dist/editor/settings/setup-steps/SettingsSetupStep.js +111 -0
- package/dist/editor/settings/setup-steps/SettingsSetupStep.js.map +1 -0
- package/dist/editor/settings/setup-steps/SetupOverview.d.ts +14 -0
- package/dist/editor/settings/setup-steps/SetupOverview.js +38 -0
- package/dist/editor/settings/setup-steps/SetupOverview.js.map +1 -0
- package/dist/editor/settings/status/coreStatusChecks.d.ts +25 -0
- package/dist/editor/settings/status/coreStatusChecks.js +231 -0
- package/dist/editor/settings/status/coreStatusChecks.js.map +1 -0
- package/dist/editor/settings/status/index.d.ts +3 -0
- package/dist/editor/settings/status/index.js +3 -0
- package/dist/editor/settings/status/index.js.map +1 -0
- package/dist/editor/settings/status/useStartupChecks.d.ts +17 -0
- package/dist/editor/settings/status/useStartupChecks.js +54 -0
- package/dist/editor/settings/status/useStartupChecks.js.map +1 -0
- package/dist/editor/sidebar/EditHistory.js +18 -14
- package/dist/editor/sidebar/EditHistory.js.map +1 -1
- package/dist/editor/sidebar/MainContentTree.js +0 -1
- package/dist/editor/sidebar/MainContentTree.js.map +1 -1
- package/dist/editor/sidebar/OperationItem.js +4 -3
- package/dist/editor/sidebar/OperationItem.js.map +1 -1
- package/dist/editor/ui/PerfectTree.js +1 -1
- package/dist/editor/ui/PerfectTree.js.map +1 -1
- package/dist/editor/ui/Section.js +3 -3
- package/dist/editor/ui/Section.js.map +1 -1
- package/dist/editor/ui/SimpleMenu.js +13 -4
- package/dist/editor/ui/SimpleMenu.js.map +1 -1
- package/dist/editor/ui/SimpleToolbar.js +1 -1
- package/dist/editor/ui/SimpleToolbar.js.map +1 -1
- package/dist/editor/utils/keyboardNavigation.js +89 -27
- package/dist/editor/utils/keyboardNavigation.js.map +1 -1
- package/dist/revision.d.ts +2 -2
- package/dist/revision.js +2 -2
- package/dist/setup/SetupWizardPage.js +2 -2
- package/dist/setup/SetupWizardPage.js.map +1 -1
- package/dist/setup/services/setupWizardService.d.ts +132 -12
- package/dist/setup/services/setupWizardService.js +82 -6
- package/dist/setup/services/setupWizardService.js.map +1 -1
- package/dist/setup/wizard/index.d.ts +5 -4
- package/dist/setup/wizard/index.js +6 -4
- package/dist/setup/wizard/index.js.map +1 -1
- package/dist/setup/wizard/steps/AddModelDialog.d.ts +10 -0
- package/dist/setup/wizard/steps/AddModelDialog.js +119 -0
- package/dist/setup/wizard/steps/AddModelDialog.js.map +1 -0
- package/dist/setup/wizard/steps/ImportModelDialog.d.ts +10 -0
- package/dist/setup/wizard/steps/ImportModelDialog.js +351 -0
- package/dist/setup/wizard/steps/ImportModelDialog.js.map +1 -0
- package/dist/splash-screen/ModernSplashScreen.js +1 -1
- package/dist/splash-screen/ModernSplashScreen.js.map +1 -1
- package/dist/styles.css +183 -10
- package/dist/types.d.ts +36 -1
- package/package.json +4 -4
|
@@ -559,6 +559,10 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, isActive =
|
|
|
559
559
|
useEffect(() => {
|
|
560
560
|
isWaitingRef.current = isWaitingForResponse;
|
|
561
561
|
}, [isWaitingForResponse]);
|
|
562
|
+
// Guard ref to prevent WebSocket handlers from re-enabling execution states
|
|
563
|
+
// while a stop operation is in progress. This prevents race conditions where
|
|
564
|
+
// messages arriving during the stop process could flip the UI back to "executing".
|
|
565
|
+
const isStoppingRef = useRef(false);
|
|
562
566
|
// Server-driven state: true when agent is actively processing (set by WebSocket messages)
|
|
563
567
|
const [isAgentThinking, setIsAgentThinking] = useState(false);
|
|
564
568
|
const hasActiveStreaming = useCallback(() => {
|
|
@@ -679,7 +683,6 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, isActive =
|
|
|
679
683
|
const shouldCreateNewMessage = useRef(false);
|
|
680
684
|
// Keep a ref to the current messages for immediate access
|
|
681
685
|
const messagesRef = useRef([]);
|
|
682
|
-
const abortControllerRef = useRef(null);
|
|
683
686
|
const messagesEndRef = useRef(null);
|
|
684
687
|
const textareaRef = useRef(null);
|
|
685
688
|
const placeholderInputRef = useRef(null);
|
|
@@ -1705,6 +1708,12 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, isActive =
|
|
|
1705
1708
|
return;
|
|
1706
1709
|
// Handle agent:run:start
|
|
1707
1710
|
if (messageType === "agent:run:start") {
|
|
1711
|
+
// If a stop operation is in progress, ignore this message to prevent
|
|
1712
|
+
// race conditions where the UI flips back to "executing" during stop
|
|
1713
|
+
if (isStoppingRef.current) {
|
|
1714
|
+
console.log("[AgentTerminal] Ignoring agent:run:start during stop operation");
|
|
1715
|
+
return;
|
|
1716
|
+
}
|
|
1708
1717
|
// Reset run-scoped deduplication so new run seq values (starting at 1)
|
|
1709
1718
|
// are not discarded due to previous run's lastSeqRef
|
|
1710
1719
|
lastSeqRef.current = 0;
|
|
@@ -1820,6 +1829,11 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, isActive =
|
|
|
1820
1829
|
}
|
|
1821
1830
|
// Handle agent:run:delta (content, tools, etc.)
|
|
1822
1831
|
if (messageType === "agent:run:delta") {
|
|
1832
|
+
// If a stop operation is in progress, ignore streaming deltas to prevent
|
|
1833
|
+
// new messages from being added during the stop process
|
|
1834
|
+
if (isStoppingRef.current) {
|
|
1835
|
+
return;
|
|
1836
|
+
}
|
|
1823
1837
|
// Allow deltas if the agent is running OR if we already have an active streaming message
|
|
1824
1838
|
// OR if the server provided a messageId for targeted updates.
|
|
1825
1839
|
// This avoids dropping early deltas that may arrive before the 'running' status update.
|
|
@@ -2024,6 +2038,31 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, isActive =
|
|
|
2024
2038
|
});
|
|
2025
2039
|
return;
|
|
2026
2040
|
}
|
|
2041
|
+
// Handle "completed" state (fallback for legacy code paths that send status instead of lifecycle event)
|
|
2042
|
+
if (normalizedStatus === "completed" ||
|
|
2043
|
+
normalizedStatus === "Completed") {
|
|
2044
|
+
// Reset deduplication for the next run
|
|
2045
|
+
lastSeqRef.current = 0;
|
|
2046
|
+
// Mark the last assistant message as completed
|
|
2047
|
+
setMessages((prev) => {
|
|
2048
|
+
const updated = prev.map((msg) => msg.role === "assistant" && !msg.isCompleted
|
|
2049
|
+
? {
|
|
2050
|
+
...msg,
|
|
2051
|
+
isCompleted: true,
|
|
2052
|
+
messageType: "completed",
|
|
2053
|
+
}
|
|
2054
|
+
: msg);
|
|
2055
|
+
messagesRef.current = updated;
|
|
2056
|
+
return updated;
|
|
2057
|
+
});
|
|
2058
|
+
setIsWaitingForResponse(false);
|
|
2059
|
+
isWaitingRef.current = false;
|
|
2060
|
+
setIsConnecting(false);
|
|
2061
|
+
shouldCreateNewMessage.current = false;
|
|
2062
|
+
// Server says agent finished thinking
|
|
2063
|
+
setIsAgentThinking(false);
|
|
2064
|
+
return;
|
|
2065
|
+
}
|
|
2027
2066
|
}
|
|
2028
2067
|
catch (err) {
|
|
2029
2068
|
console.error("[AgentTerminal] Error handling status update:", err);
|
|
@@ -2232,14 +2271,6 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, isActive =
|
|
|
2232
2271
|
}
|
|
2233
2272
|
setSelectedModelId(nextModelId || undefined);
|
|
2234
2273
|
}, [activeProfile?.id, agent?.model]);
|
|
2235
|
-
// Cleanup stream connection when component unmounts or agent changes
|
|
2236
|
-
useEffect(() => {
|
|
2237
|
-
return () => {
|
|
2238
|
-
if (abortControllerRef.current) {
|
|
2239
|
-
abortControllerRef.current.abort();
|
|
2240
|
-
}
|
|
2241
|
-
};
|
|
2242
|
-
}, [agent?.id]);
|
|
2243
2274
|
// Initialize mode from metadata; fall back to agent.Mode from server
|
|
2244
2275
|
useEffect(() => {
|
|
2245
2276
|
try {
|
|
@@ -2929,39 +2960,45 @@ export function AgentTerminal({ agentStub, initialMetadata, profiles, isActive =
|
|
|
2929
2960
|
// Stop current execution/stream safely
|
|
2930
2961
|
const handleStop = useCallback(async () => {
|
|
2931
2962
|
try {
|
|
2963
|
+
// 1. Set the stopping guard to prevent WebSocket handlers from re-enabling states
|
|
2964
|
+
// This must happen FIRST, before any other state changes
|
|
2965
|
+
isStoppingRef.current = true;
|
|
2966
|
+
// 2. Update all UI state to reflect stopped status
|
|
2932
2967
|
setIsWaitingForResponse(false);
|
|
2933
2968
|
isWaitingRef.current = false;
|
|
2969
|
+
setIsConnecting(false);
|
|
2970
|
+
setIsSubmitting(false);
|
|
2934
2971
|
// User stopped the agent, hide thinking dots
|
|
2935
2972
|
setIsAgentThinking(false);
|
|
2936
|
-
//
|
|
2973
|
+
// 3. Mark any in-progress streaming messages as completed in UI
|
|
2974
|
+
setMessages((prev) => {
|
|
2975
|
+
const updated = prev.map((msg) => !msg.isCompleted && msg.messageType === "streaming"
|
|
2976
|
+
? { ...msg, isCompleted: true, messageType: "completed" }
|
|
2977
|
+
: msg);
|
|
2978
|
+
messagesRef.current = updated;
|
|
2979
|
+
return updated;
|
|
2980
|
+
});
|
|
2981
|
+
// 4. Request backend to stop the current execution (does NOT close the agent)
|
|
2982
|
+
// Wait for backend confirmation to ensure agent actually stopped
|
|
2937
2983
|
if (agentStub?.id) {
|
|
2938
2984
|
try {
|
|
2939
2985
|
await cancelAgent(agentStub.id);
|
|
2940
2986
|
}
|
|
2941
2987
|
catch (err) {
|
|
2942
2988
|
console.error("Failed to cancel agent on backend:", err);
|
|
2943
|
-
// Continue
|
|
2989
|
+
// Continue - UI is already in stopped state, but backend may still be running
|
|
2990
|
+
// The isStoppingRef guard will be cleared below so future runs can proceed
|
|
2944
2991
|
}
|
|
2945
2992
|
}
|
|
2946
|
-
// Disconnect from the stream
|
|
2947
|
-
if (abortControllerRef.current) {
|
|
2948
|
-
abortControllerRef.current.abort();
|
|
2949
|
-
abortControllerRef.current = null;
|
|
2950
|
-
}
|
|
2951
|
-
setIsConnecting(false);
|
|
2952
|
-
setIsSubmitting(false);
|
|
2953
|
-
// Mark any in-progress streaming messages as completed in UI
|
|
2954
|
-
setMessages((prev) => {
|
|
2955
|
-
const updated = prev.map((msg) => !msg.isCompleted && msg.messageType === "streaming"
|
|
2956
|
-
? { ...msg, isCompleted: true, messageType: "completed" }
|
|
2957
|
-
: msg);
|
|
2958
|
-
messagesRef.current = updated;
|
|
2959
|
-
return updated;
|
|
2960
|
-
});
|
|
2961
2993
|
}
|
|
2962
2994
|
catch (e) {
|
|
2963
2995
|
console.error("Failed to stop agent execution", e);
|
|
2964
2996
|
}
|
|
2997
|
+
finally {
|
|
2998
|
+
// Clear the stopping guard so future runs can proceed normally
|
|
2999
|
+
// This happens after backend confirmation (or error)
|
|
3000
|
+
isStoppingRef.current = false;
|
|
3001
|
+
}
|
|
2965
3002
|
}, []);
|
|
2966
3003
|
// Determine effective cost limit from agent, profile, or metadata so the cost display
|
|
2967
3004
|
// is visible immediately even before any messages or server-side persistence.
|