diff --git a/ui/desktop/src/components/ChatInput.tsx b/ui/desktop/src/components/ChatInput.tsx
index 3634b42157d7..7419f09909c8 100644
--- a/ui/desktop/src/components/ChatInput.tsx
+++ b/ui/desktop/src/components/ChatInput.tsx
@@ -28,7 +28,6 @@ import { DroppedFile, useFileDrop } from '../hooks/useFileDrop';
import { Recipe } from '../recipe';
import MessageQueue from './MessageQueue';
import { detectInterruption } from '../utils/interruptionDetector';
-import { getApiUrl } from '../config';
interface QueuedMessage {
id: string;
@@ -502,52 +501,19 @@ export default function ChatInput({
// Load auto-compact threshold
const loadAutoCompactThreshold = useCallback(async () => {
try {
- const secretKey = await window.electron.getSecretKey();
- const response = await fetch(getApiUrl('/config/read'), {
- method: 'POST',
- headers: {
- 'X-Secret-Key': secretKey,
- 'Content-Type': 'application/json',
- },
- body: JSON.stringify({
- key: 'GOOSE_AUTO_COMPACT_THRESHOLD',
- is_secret: false,
- }),
- });
- if (response.ok) {
- const data = await response.json();
- console.log('Loaded auto-compact threshold from config:', data);
- if (data !== undefined && data !== null) {
- setAutoCompactThreshold(data);
- console.log('Set auto-compact threshold to:', data);
- }
- } else {
- console.error('Failed to fetch auto-compact threshold, status:', response.status);
+ const threshold = await read('GOOSE_AUTO_COMPACT_THRESHOLD', false);
+ if (threshold !== undefined && threshold !== null) {
+ setAutoCompactThreshold(threshold as number);
}
} catch (err) {
console.error('Error fetching auto-compact threshold:', err);
}
- }, []);
+ }, [read]);
useEffect(() => {
loadAutoCompactThreshold();
}, [loadAutoCompactThreshold]);
- // Listen for threshold change events from AlertBox
- useEffect(() => {
- const handleThresholdChange = (event: CustomEvent<{ threshold: number }>) => {
- setAutoCompactThreshold(event.detail.threshold);
- };
-
- // Type assertion to handle the mismatch between CustomEvent and EventListener
- const eventListener = handleThresholdChange as (event: globalThis.Event) => void;
- window.addEventListener('autoCompactThresholdChanged', eventListener);
-
- return () => {
- window.removeEventListener('autoCompactThresholdChanged', eventListener);
- };
- }, []);
-
// Handle tool count alerts and token usage
useEffect(() => {
clearAlerts();
@@ -574,6 +540,9 @@ export default function ChatInput({
},
compactIcon: ,
autoCompactThreshold: autoCompactThreshold,
+ onThresholdChange: (newThreshold: number) => {
+ setAutoCompactThreshold(newThreshold);
+ },
});
}
diff --git a/ui/desktop/src/components/alerts/AlertBox.tsx b/ui/desktop/src/components/alerts/AlertBox.tsx
index 148920f36958..ebe50e911a4e 100644
--- a/ui/desktop/src/components/alerts/AlertBox.tsx
+++ b/ui/desktop/src/components/alerts/AlertBox.tsx
@@ -3,7 +3,7 @@ import { IoIosCloseCircle, IoIosWarning, IoIosInformationCircle } from 'react-ic
import { FaPencilAlt, FaSave } from 'react-icons/fa';
import { cn } from '../../utils';
import { Alert, AlertType } from './types';
-import { getApiUrl } from '../../config';
+import { upsertConfig } from '../../api';
const alertIcons: Record = {
[AlertType.Error]: ,
@@ -42,41 +42,21 @@ export const AlertBox = ({ alert, className }: AlertBoxProps) => {
setIsSaving(true);
try {
const newThreshold = validThreshold / 100; // Convert percentage to decimal
- console.log('Saving auto-compact threshold:', newThreshold);
- // Update the configuration via the upsert API
- const response = await fetch(getApiUrl('/config/upsert'), {
- method: 'POST',
- headers: {
- 'Content-Type': 'application/json',
- 'X-Secret-Key': await window.electron.getSecretKey(),
- },
- body: JSON.stringify({
+ await upsertConfig({
+ body: {
key: 'GOOSE_AUTO_COMPACT_THRESHOLD',
value: newThreshold,
is_secret: false,
- }),
+ },
});
- if (!response.ok) {
- const errorText = await response.text();
- throw new Error(`Failed to update threshold: ${errorText}`);
- }
-
- const responseText = await response.text();
- console.log('Threshold save response:', responseText);
-
setIsEditingThreshold(false);
- // Dispatch a custom event to notify other components that the threshold has changed
- // This allows ChatInput to reload the threshold without a page reload
- window.dispatchEvent(
- new CustomEvent('autoCompactThresholdChanged', {
- detail: { threshold: newThreshold },
- })
- );
-
- console.log('Dispatched autoCompactThresholdChanged event with threshold:', newThreshold);
+ // Notify parent component of the threshold change
+ if (alert.onThresholdChange) {
+ alert.onThresholdChange(newThreshold);
+ }
} catch (error) {
console.error('Error saving threshold:', error);
window.alert(
diff --git a/ui/desktop/src/components/alerts/types.ts b/ui/desktop/src/components/alerts/types.ts
index f7aba0815087..a4701d598208 100644
--- a/ui/desktop/src/components/alerts/types.ts
+++ b/ui/desktop/src/components/alerts/types.ts
@@ -21,4 +21,5 @@ export interface Alert {
onCompact?: () => void;
compactIcon?: React.ReactNode;
autoCompactThreshold?: number;
+ onThresholdChange?: (threshold: number) => void;
}