refactor: move privacy consent from ChatBox to Login/SignUp (#1239)

Co-authored-by: a7m-1st <Ahmed.jimi.awelkeir500@gmail.com>
Co-authored-by: Wendong-Fan <133094783+Wendong-Fan@users.noreply.github.com>
This commit is contained in:
Dream 2026-03-07 05:55:48 -05:00 committed by GitHub
parent caa5742d92
commit 2e44ae0f0a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
41 changed files with 277 additions and 1030 deletions

View file

@ -153,12 +153,6 @@ Click the gear icon in the top-right corner to open Settings. Heres a brief o
![General](/docs/images/quickstart_settings_general.png)
### **Privacy**
Your privacy is important to us! Because Eigent agents operate on your desktop, they may need permissions to take screenshots or access local files to complete tasks. You can enable and manage all these permissions here.
![Privacy](/docs/images/quickstart_settings_privacy.png)
### **Models**
<aside>

View file

@ -32,6 +32,7 @@ class UserPrivacySettings(BaseModel):
access_local_software: bool | None = False
access_your_address: bool | None = False
password_storage: bool | None = False
help_improve: bool | None = False
# Fields that must all be True for the user to proceed
REQUIRED_FIELDS: ClassVar[list[str]] = [

Binary file not shown.

Before

Width:  |  Height:  |  Size: 371 KiB

View file

@ -76,8 +76,6 @@ export interface InputboxProps {
textareaRef?: React.RefObject<HTMLTextAreaElement>;
/** Allow drag and drop */
allowDragDrop?: boolean;
/** Privacy mode enabled */
privacy?: boolean;
/** Use cloud model in dev */
useCloudModelInDev?: boolean;
/** Callback when trigger is being created (for placeholder) */
@ -139,7 +137,6 @@ export const Inputbox = ({
className,
textareaRef: externalTextareaRef,
allowDragDrop = false,
privacy = true,
useCloudModelInDev = false,
onTriggerCreating,
onTriggerCreated,
@ -275,7 +272,7 @@ export const Inputbox = ({
};
const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {
if (!allowDragDrop || !privacy || useCloudModelInDev) return;
if (!allowDragDrop || useCloudModelInDev) return;
if (!isFileDrag(e)) return;
e.preventDefault();
e.stopPropagation();
@ -284,7 +281,7 @@ export const Inputbox = ({
};
const handleDragEnter = (e: React.DragEvent<HTMLDivElement>) => {
if (!allowDragDrop || !privacy || useCloudModelInDev) return;
if (!allowDragDrop || useCloudModelInDev) return;
if (!isFileDrag(e)) return;
e.preventDefault();
e.stopPropagation();
@ -304,8 +301,7 @@ export const Inputbox = ({
e.stopPropagation();
setIsDragging(false);
dragCounter.current = 0;
if (!allowDragDrop || !privacy || useCloudModelInDev) return;
if (!allowDragDrop || useCloudModelInDev) return;
try {
const dropped = Array.from(e.dataTransfer?.files || []);
if (dropped.length === 0) return;
@ -524,7 +520,7 @@ export const Inputbox = ({
size="icon"
className="rounded-lg shadow-none"
onClick={onAddFile}
disabled={disabled || !privacy || useCloudModelInDev}
disabled={disabled || useCloudModelInDev}
>
<Plus size={16} className="text-icon-primary" />
</Button>
@ -596,7 +592,6 @@ export const Inputbox = ({
onFilesChange,
onAddFile,
disabled,
privacy,
useCloudModelInDev,
}}
onClose={() => handleExpandedDialogChange(false)}

View file

@ -18,7 +18,6 @@ import {
fetchPut,
proxyFetchDelete,
proxyFetchGet,
proxyFetchPut,
} from '@/api/http';
import useChatStoreAdapter from '@/hooks/useChatStoreAdapter';
import { generateUniqueId, replayActiveTask } from '@/lib';
@ -29,7 +28,7 @@ import { AgentStep, ChatTaskStatus } from '@/types/constants';
import { TriangleAlert } from 'lucide-react';
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { useTranslation } from 'react-i18next';
import { useNavigate, useSearchParams } from 'react-router-dom';
import { useLocation, useNavigate, useSearchParams } from 'react-router-dom';
import { toast } from 'sonner';
import BottomBox from './BottomBox';
import { HeaderBox } from './HeaderBox';
@ -43,12 +42,11 @@ export default function ChatBox(): JSX.Element {
const { t } = useTranslation();
const textareaRef = useRef<HTMLTextAreaElement>(null);
const [hasModel, setHasModel] = useState(true);
const [hasModel, setHasModel] = useState(false);
const [isConfigLoaded, setIsConfigLoaded] = useState(false);
const scrollContainerRef = useRef<HTMLDivElement>(null);
const [privacy, setPrivacy] = useState<any>(false);
const [_hasSearchKey, setHasSearchKey] = useState<any>(false);
const scrollTimeoutRef = useRef<NodeJS.Timeout | null>(null);
// const [privacyDialogOpen, setPrivacyDialogOpen] = useState(false);
const { modelType } = useAuthStore();
const [useCloudModelInDev, setUseCloudModelInDev] = useState(false);
useEffect(() => {
@ -62,13 +60,43 @@ export default function ChatBox(): JSX.Element {
setUseCloudModelInDev(false);
}
}, [modelType]);
useEffect(() => {
proxyFetchGet('/api/user/privacy')
.then((res) => {
setPrivacy(res.all_required_granted);
})
.catch((err) => console.error('Failed to fetch settings:', err));
const [searchParams, setSearchParams] = useSearchParams();
const share_token = searchParams.get('share_token');
const skill_prompt = searchParams.get('skill_prompt');
const handleSendRef = useRef<
((messageStr?: string, taskId?: string) => Promise<void>) | null
>(null);
const navigate = useNavigate();
const location = useLocation();
// Shared function to check model configuration
const checkModelConfig = useCallback(async () => {
try {
if (modelType === 'cloud') {
// For cloud model, check if API key exists
const res = await proxyFetchGet('/api/user/key');
setHasModel(!!res.value);
} else if (modelType === 'local' || modelType === 'custom') {
// For local/custom model, check if provider exists
const res = await proxyFetchGet('/api/providers', { prefer: true });
const providerList = res.items || [];
setHasModel(providerList.length > 0);
} else {
setHasModel(false);
}
} catch (err) {
console.error('Failed to check model config:', err);
setHasModel(false);
} finally {
setIsConfigLoaded(true);
}
}, [modelType]);
// Check model config on mount and when modelType changes
useEffect(() => {
proxyFetchGet('/api/configs')
.then((configsRes) => {
const configs = Array.isArray(configsRes) ? configsRes : [];
@ -81,34 +109,29 @@ export default function ChatBox(): JSX.Element {
if (_hasApiKey && _hasApiId) setHasSearchKey(true);
})
.catch((err) => console.error('Failed to fetch configs:', err));
}, []);
// Refresh privacy status when dialog closes
// useEffect(() => {
// if (!privacyDialogOpen) {
// proxyFetchGet("/api/user/privacy")
// .then((res) => {
// let _privacy = 0;
// Object.keys(res).forEach((key) => {
// if (!res[key]) {
// _privacy++;
// return;
// }
// });
// setPrivacy(_privacy === 0 ? true : false);
// })
// .catch((err) => console.error("Failed to fetch settings:", err));
// }
// }, [privacyDialogOpen]);
const [searchParams, setSearchParams] = useSearchParams();
const share_token = searchParams.get('share_token');
const skill_prompt = searchParams.get('skill_prompt');
checkModelConfig();
}, [modelType, checkModelConfig]);
const handleSendRef = useRef<
((messageStr?: string, taskId?: string) => Promise<void>) | null
>(null);
// Re-check model config when returning from settings page
useEffect(() => {
// Check when location changes (user navigates)
if (location.pathname === '/') {
checkModelConfig();
}
}, [location.pathname, checkModelConfig]);
const navigate = useNavigate();
// Also check when window gains focus (user returns from settings)
useEffect(() => {
const handleFocus = () => {
checkModelConfig();
};
window.addEventListener('focus', handleFocus);
return () => {
window.removeEventListener('focus', handleFocus);
};
}, [checkModelConfig]);
// Task time tracking
const [taskTime, setTaskTime] = useState(
@ -226,9 +249,8 @@ export default function ChatBox(): JSX.Element {
if (isTaskBusy) return true;
// Standard checks - check model first, then privacy
// Standard checks - check model
if (!hasModel) return true;
if (!privacy) return true;
if (useCloudModelInDev) return true;
if (task.isContextExceeded) return true;
@ -236,7 +258,6 @@ export default function ChatBox(): JSX.Element {
}, [
chatStore?.activeTaskId,
chatStore?.tasks,
privacy,
hasModel,
useCloudModelInDev,
isTaskBusy,
@ -257,10 +278,6 @@ export default function ChatBox(): JSX.Element {
navigate('/history?tab=agents');
return;
}
if (!privacy) {
toast.error('Please accept the privacy policy first.');
return;
}
let _token: string = token.split('__')[0];
let taskId: string = token.split('__')[1];
@ -290,7 +307,7 @@ export default function ChatBox(): JSX.Element {
}
}
},
[chatStore, projectStore.activeProjectId, hasModel, privacy, navigate]
[chatStore, projectStore.activeProjectId, hasModel, navigate]
);
// Handle skill_prompt from URL - pre-fill message when navigating from Skills page
@ -358,16 +375,12 @@ export default function ChatBox(): JSX.Element {
const _taskId = taskId || chatStore.activeTaskId;
if (message.trim() === '' && !messageStr) return;
// Check model first, then privacy
// Check model configuration
if (!hasModel) {
toast.error('Please select a model first.');
navigate('/history?tab=agents');
return;
}
if (!privacy) {
toast.error('Please accept the privacy policy first.');
return;
}
const tempMessageContent = messageStr || message;
if (executionId && projectStore.activeProjectId) {
@ -542,23 +555,6 @@ export default function ChatBox(): JSX.Element {
setMessage('');
}
} else {
if (!privacy) {
const API_FIELDS = [
'take_screenshot',
'access_local_software',
'access_your_address',
'password_storage',
];
const requestData = {
[API_FIELDS[0]]: true,
[API_FIELDS[1]]: true,
[API_FIELDS[2]]: true,
[API_FIELDS[3]]: true,
};
proxyFetchPut('/api/user/privacy', requestData);
setPrivacy(true);
}
setTimeout(() => {
scrollToBottom();
}, 200);
@ -670,11 +666,11 @@ export default function ChatBox(): JSX.Element {
}, [projectStore]);
useEffect(() => {
// Wait for both config and privacy to be loaded before handling share token
if (share_token) {
// Wait for config to be loaded before handling share token
if (share_token && isConfigLoaded) {
handleSendShare(share_token);
}
}, [share_token, handleSendShare]);
}, [share_token, isConfigLoaded, handleSendShare]);
if (!chatStore) {
return <div>Loading...</div>;
@ -1053,7 +1049,6 @@ export default function ChatBox(): JSX.Element {
disabled: isInputDisabled,
textareaRef: textareaRef,
allowDragDrop: true,
privacy: privacy,
useCloudModelInDev: useCloudModelInDev,
}}
/>
@ -1076,61 +1071,7 @@ export default function ChatBox(): JSX.Element {
</div>
</div>
) : null}
{hasModel && !privacy ? (
<div className="flex items-center gap-2">
<div
onClick={(e) => {
const target = e.target as HTMLElement;
if (target.tagName === 'A') {
return;
}
const API_FIELDS = [
'take_screenshot',
'access_local_software',
'access_your_address',
'password_storage',
];
const requestData = {
[API_FIELDS[0]]: true,
[API_FIELDS[1]]: true,
[API_FIELDS[2]]: true,
[API_FIELDS[3]]: true,
};
proxyFetchPut('/api/user/privacy', requestData);
setPrivacy(true);
}}
className="flex cursor-pointer items-center gap-1 rounded-md bg-surface-information px-sm py-xs"
>
<TriangleAlert
size={20}
className="text-icon-information"
/>
<span className="flex-1 text-xs font-medium leading-[20px] text-text-information">
{t('layout.by-messaging-eigent')}{' '}
<a
href="https://www.eigent.ai/terms-of-use"
target="_blank"
className="text-text-information underline"
onClick={(e) => e.stopPropagation()}
rel="noreferrer"
>
{t('layout.terms-of-use')}
</a>{' '}
{t('layout.and')}{' '}
<a
href="https://www.eigent.ai/privacy-policy"
target="_blank"
className="text-text-information underline"
onClick={(e) => e.stopPropagation()}
rel="noreferrer"
>
{t('layout.privacy-policy')}
</a>
.
</span>
</div>
</div>
) : (
{hasModel && (
<div className="mr-2 flex flex-col items-center gap-2">
{[
{
@ -1210,7 +1151,6 @@ export default function ChatBox(): JSX.Element {
disabled: isInputDisabled,
textareaRef: textareaRef,
allowDragDrop: hasAnyMessages,
privacy: hasAnyMessages ? privacy : true,
useCloudModelInDev: useCloudModelInDev,
}}
/>

View file

@ -1,201 +0,0 @@
// ========= Copyright 2025-2026 @ Eigent.ai All Rights Reserved. =========
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ========= Copyright 2025-2026 @ Eigent.ai All Rights Reserved. =========
import { proxyFetchGet, proxyFetchPut } from '@/api/http';
import { Button } from '@/components/ui/button';
import {
Dialog,
DialogClose,
DialogContent,
DialogFooter,
DialogHeader,
DialogTitle,
DialogTrigger,
} from '@/components/ui/dialog';
import { Switch } from '@/components/ui/switch';
import {
Tooltip,
TooltipContent,
TooltipProvider,
TooltipTrigger,
} from '@/components/ui/tooltip';
import { AlertCircle } from 'lucide-react';
import { useEffect, useMemo, useState } from 'react';
import { useTranslation } from 'react-i18next';
interface PrivacyDialogProps {
open: boolean;
onOpenChange: (open: boolean) => void;
trigger?: React.ReactNode;
}
export function PrivacyDialog({
open,
onOpenChange,
trigger,
}: PrivacyDialogProps) {
const { t } = useTranslation();
const API_FIELDS = useMemo(
() => [
'take_screenshot',
'access_local_software',
'access_your_address',
'password_storage',
],
[]
);
const [settings, setSettings] = useState([
{
title: t('layout.allow-agent-to-take-screenshots'),
description: t('layout.permit-the-agent-to-capture'),
checked: false,
},
{
title: t('layout.allow-agent-to-access-local-software'),
description: t('layout.grant-the-agent-permission'),
checked: false,
},
{
title: t('layout.allow-agent-to-access-your-address'),
description: t('layout.authorize-the-agent-to-view'),
checked: false,
},
{
title: t('layout.password-storage'),
description: t('layout.determine-how-passwords-are-handled'),
checked: false,
},
]);
useEffect(() => {
proxyFetchGet('/api/user/privacy')
.then((res) => {
setSettings((prev) =>
prev.map((item, index) => ({
...item,
checked: res[API_FIELDS[index]] || false,
}))
);
})
.catch((err) => console.error('Failed to fetch settings:', err));
}, [API_FIELDS]);
const handleToggle = (index: number) => {
setSettings((prev) => {
const newSettings = [...prev];
newSettings[index] = {
...newSettings[index],
checked: !newSettings[index].checked,
};
return newSettings;
});
const requestData = {
[API_FIELDS[0]]: settings[0].checked,
[API_FIELDS[1]]: settings[1].checked,
[API_FIELDS[2]]: settings[2].checked,
[API_FIELDS[3]]: settings[3].checked,
};
requestData[API_FIELDS[index]] = !settings[index].checked;
proxyFetchPut('/api/user/privacy', requestData).catch((err) =>
console.error('Failed to update settings:', err)
);
};
const handleTurnOnAll = () => {
const newSettings = settings.map((item) => ({
...item,
checked: true,
}));
setSettings(newSettings);
const requestData = {
[API_FIELDS[0]]: true,
[API_FIELDS[1]]: true,
[API_FIELDS[2]]: true,
[API_FIELDS[3]]: true,
};
proxyFetchPut('/api/user/privacy', requestData)
.then(() => {
onOpenChange(false);
})
.catch((err) => console.error('Failed to update settings:', err));
};
return (
<Dialog open={open} onOpenChange={onOpenChange}>
{trigger && <DialogTrigger asChild>{trigger}</DialogTrigger>}
<DialogContent className="gap-0 !rounded-xl border border-border-subtle-strong !bg-popup-surface p-0 shadow-sm sm:max-w-[600px]">
<DialogHeader className="!rounded-t-xl !bg-popup-surface p-md">
<DialogTitle className="m-0">
<div className="flex items-center gap-2">
<div className="text-base font-bold leading-10 text-text-action">
{t('layout.turn-on-all-privacy-settings')}
</div>
<TooltipProvider>
<Tooltip>
<TooltipTrigger asChild>
<AlertCircle
size={16}
className="cursor-pointer text-icon-primary"
/>
</TooltipTrigger>
<TooltipContent className="max-w-[340px]">
<p className="text-sm text-text-body">
{t('layout.eigent-is-a-desktop-software')}
</p>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</div>
</DialogTitle>
</DialogHeader>
<div className="flex flex-col gap-md bg-popup-bg p-md">
{settings.map((item, index) => (
<div key={item.title} className="mb-4 flex items-start gap-md">
<div className="flex-1">
<div className="mb-1 text-sm font-bold text-text-primary">
{item.title}
</div>
<div className="text-xs text-text-body">{item.description}</div>
</div>
<div className="flex-shrink-0">
<Switch
checked={item.checked}
onCheckedChange={() => handleToggle(index)}
/>
</div>
</div>
))}
</div>
<DialogFooter className="!rounded-b-xl bg-white-100% p-md">
<DialogClose asChild>
<Button variant="ghost" size="md">
{t('layout.cancel')}
</Button>
</DialogClose>
<Button size="md" onClick={handleTurnOnAll} variant="primary">
{t('layout.turn-on-all-and-finish')}
</Button>
</DialogFooter>
</DialogContent>
</Dialog>
);
}

View file

@ -13,15 +13,11 @@
// ========= Copyright 2025-2026 @ Eigent.ai All Rights Reserved. =========
import { CarouselStep } from '@/components/InstallStep/Carousel';
import { Permissions } from '@/components/InstallStep/Permissions';
import { ProgressInstall } from '@/components/ui/progress-install';
import { useAuthStore } from '@/store/authStore';
import { useInstallationUI } from '@/store/installationStore';
import React from 'react';
export const InstallDependencies: React.FC = () => {
const { initState } = useAuthStore();
const { progress, latestLog, isInstalling, installationState } =
useInstallationUI();
@ -64,8 +60,7 @@ export const InstallDependencies: React.FC = () => {
</div>
</div>
<div className="flex h-full w-2/3 rounded-2xl bg-surface-tertiary p-md">
{initState === 'permissions' && <Permissions />}
{initState !== 'permissions' && <CarouselStep />}
<CarouselStep />
</div>
</div>
</div>

View file

@ -1,144 +0,0 @@
// ========= Copyright 2025-2026 @ Eigent.ai All Rights Reserved. =========
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ========= Copyright 2025-2026 @ Eigent.ai All Rights Reserved. =========
import { proxyFetchGet, proxyFetchPut } from '@/api/http';
import privacy_settings from '@/assets/privacy_settings.png';
import { useAuthStore } from '@/store/authStore';
import { ArrowRight, Square, SquareCheckBig } from 'lucide-react';
import React, { useEffect, useMemo, useState } from 'react';
import { Button } from '../ui/button';
export const Permissions: React.FC = () => {
const { setInitState } = useAuthStore();
const API_FIELDS = useMemo(
() => [
'take_screenshot',
'access_local_software',
'access_your_address',
'password_storage',
],
[]
);
const [settings, setSettings] = useState([
{
title: 'Enable screen recording',
checked: false,
},
{
title: 'Enable access Local Software',
checked: false,
},
{
title: 'Grant location access',
checked: false,
},
{
title: 'Share data to enhance Eigent',
checked: false,
},
]);
useEffect(() => {
proxyFetchGet('/api/user/privacy')
.then((res) => {
setSettings((prev) =>
prev.map((item, index) => ({
...item,
checked: res[API_FIELDS[index]] || false,
}))
);
})
.catch((err) => console.error('Failed to fetch settings:', err));
}, [API_FIELDS]);
const handleToggle = (index: number) => {
setSettings((prev) => {
const newSettings = [...prev];
newSettings[index] = {
...newSettings[index],
checked: !newSettings[index].checked,
};
return newSettings;
});
const requestData = {
[API_FIELDS[0]]: settings[0].checked,
[API_FIELDS[1]]: settings[1].checked,
[API_FIELDS[2]]: settings[2].checked,
[API_FIELDS[3]]: settings[3].checked,
};
requestData[API_FIELDS[index]] = !settings[index].checked;
proxyFetchPut('/api/user/privacy', requestData).catch((err) =>
console.error('Failed to update settings:', err)
);
};
return (
<div className="flex h-full w-full flex-col gap-lg">
<div className="flex h-full w-full gap-md">
<div className="flex w-full flex-col gap-md">
<div className="text-heading-sm font-bold text-text-heading">
Enable Permissions
</div>
<div className="text-body-md font-medium text-text-body">
${`Grant permission to activate the Agent's autonomous actions.`}
</div>
{settings.map((item, index) => (
<div
key={item.title}
onClick={() => handleToggle(index)}
className="flex cursor-pointer items-center gap-sm rounded-md p-xs hover:bg-fill-fill-tertiary-hover"
>
<div>
{item.checked ? (
<SquareCheckBig size={24} className="text-icon-success" />
) : (
<Square size={24} className="text-icon-primary" />
)}
</div>
<div className="flex-1 text-xl font-medium leading-2xl text-text-body">
{item.title}
</div>
</div>
))}
</div>
<div className="relative flex-1 rounded-3xl">
<img
className="absolute bottom-0 left-0 right-0 top-0 h-[533px] w-[899px]"
src={privacy_settings}
alt=""
/>
</div>
</div>
<div className="flex h-full w-full items-center justify-end gap-sm">
<div className="flex w-full items-center justify-center gap-sm">
<Button
onClick={() => setInitState('carousel')}
variant="ghost"
size="sm"
>
skip
</Button>
<Button
onClick={() => setInitState('carousel')}
variant="primary"
size="sm"
>
<div>Next</div>
<ArrowRight size={24} className="text-white-100%" />
</Button>
</div>
</div>
</div>
);
};

View file

@ -0,0 +1,42 @@
// ========= Copyright 2025-2026 @ Eigent.ai All Rights Reserved. =========
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ========= Copyright 2025-2026 @ Eigent.ai All Rights Reserved. =========
import * as CheckboxPrimitives from '@radix-ui/react-checkbox';
import { Check } from 'lucide-react';
import * as React from 'react';
import { cn } from '@/lib/utils';
const Checkbox = React.forwardRef<
React.ElementRef<typeof CheckboxPrimitives.Root>,
React.ComponentPropsWithoutRef<typeof CheckboxPrimitives.Root>
>(({ className, ...props }, ref) => (
<CheckboxPrimitives.Root
ref={ref}
className={cn(
'focus-visible:ring-ring peer h-4 w-4 shrink-0 rounded border border-solid border-input-border-default bg-input-bg-default transition-colors hover:border-input-border-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:border-switch-on-fill-track-fill data-[state=checked]:bg-switch-on-fill-track-fill data-[state=checked]:text-switch-on-fill-thumb-fill',
className
)}
{...props}
>
<CheckboxPrimitives.Indicator
className={cn('flex items-center justify-center text-current')}
>
<Check className="h-3.5 w-3.5" />
</CheckboxPrimitives.Indicator>
</CheckboxPrimitives.Root>
));
Checkbox.displayName = CheckboxPrimitives.Root.displayName;
export { Checkbox };

View file

@ -184,13 +184,11 @@ export const useInstallationSetup = () => {
startBackendPolling();
}
if (initState !== 'done') {
if (!result.isInstalled && initState === 'permissions') {
console.log(
'[useInstallationSetup] Tools not installed and initState is permissions, setting to carousel'
);
setInitState('carousel');
}
if (initState !== 'done' && !result.isInstalled) {
console.log(
'[useInstallationSetup] Tools not installed, ensuring carousel state'
);
setInitState('carousel');
}
}
return result;

View file

@ -97,17 +97,6 @@
"close-notice": "إشعار الإغلاق",
"a-task-is-currently-running": "مهمة قيد التشغيل حالياً. الخروج سينهيها. هل أنت متأكد من أنك تريد الخروج؟",
"yes": "نعم",
"turn-on-all-privacy-settings": "قم بتشغيل جميع إعدادات الخصوصية لبدء استخدام Eigent",
"eigent-is-a-desktop-software": "Eigent هو برنامج سطح مكتب، سيقوم بتشغيل المتصفح وأدوات الطرفية من جهاز الكمبيوتر الخاص بك لبدء المهام. من المهم التأكد من تمكين جميع إعدادات الخصوصية اللازمة قبل البدء في استخدام Eigent للحصول على الوظائف الكاملة.",
"allow-agent-to-take-screenshots": "السماح للوكيل بالتقاط لقطات الشاشة",
"permit-the-agent-to-capture": "السماح للوكيل بالتقاط لقطات شاشة لشاشة الكمبيوتر الخاص بك. يمكن استخدام هذا للدعم أو التشخيص أو أغراض المراقبة. قد تتضمن لقطات الشاشة معلومات شخصية مرئية، لذا يرجى التمكين بحذر.",
"allow-agent-to-access-local-software": "السماح للوكيل بالوصول إلى البرامج المحلية",
"grant-the-agent-permission": "منح الوكيل إذناً للتفاعل مع واستخدام البرامج المثبتة على جهازك المحلي. قد يكون هذا ضرورياً لاستكشاف الأخطاء وإصلاحها أو تشغيل التشخيصات أو أداء مهام محددة.",
"allow-agent-to-access-your-address": "السماح للوكيل بالوصول إلى عنوانك",
"authorize-the-agent-to-view": "السماح للوكيل بعرض واستخدام تفاصيل موقعك أو عنوانك. قد يكون هذا مطلوباً للخدمات القائمة على الموقع أو الدعم الشخصي.",
"password-storage": "تخزين كلمة المرور",
"determine-how-passwords-are-handled": "تحديد كيفية التعامل مع كلمات المرور وتخزينها. يمكنك اختيار تخزين كلمات المرور بأمان على الجهاز أو داخل التطبيق، أو اختيار إدخالها يدوياً في كل مرة. جميع كلمات المرور المخزنة مشفرة.",
"turn-on-all-and-finish": "تشغيل الكل وإنهاء",
"search": "بحث",
"are-you-sure-you-want-to-delete": "هل أنت متأكد من أنك تريد حذف هذه المهمة؟ لا يمكن التراجع عن هذا الإجراء.",
"share": "مشاركة",

View file

@ -23,6 +23,7 @@
"data-privacy-description": "يعتمد أيجنت على الوضع المحلي الجديد ويضمن خصوصيتك. تبقى بياناتك على جهازك افتراضيًا. أذونات السحابة اختيارية، ويُستخدم حد البيانات لأغراض العمل فقط",
"privacy-policy": "سياسة الخصوصية",
"how-we-handle-your-data": "كيف نتعامل مع بياناتك",
"we-only-use-the-essential-data-needed-to-run-your-tasks": "نحن نستخدم فقط البيانات الأساسية اللازمة لتنفيذ مهامك",
"how-we-handle-your-data-line-1": "نحن نستخدم فقط البيانات الأساسية اللازمة لتنفيذ مهامك",
"how-we-handle-your-data-line-1-line-1": ".يمكنك اختيار لقطات شاشة أيجنت لتحليل عناصر واجهة المستخدم وقراءة النص وتحديد الإجراء التالي، تمامًا كما تفعل",
"how-we-handle-your-data-line-1-line-2": ".يمكن استخدام الماوس ولوحة المفاتيح المحلية للوصول إلى البرامج والملفات المحلية التي تم تنشيطها",
@ -31,9 +32,6 @@
"how-we-handle-your-data-line-3": ".يتم تخزين بيانات الاعتماد محليًا، وتشفيرها، ولا تُستخدم إلا للخطوات المعتمدة",
"how-we-handle-your-data-line-4": ".لا تُستخدم بياناتك أبدًا لتدريب نماذج الذكاء الاصطناعي الخاصة بنا دون موافقتك الصريحة",
"how-we-handle-your-data-line-5": ".نحن لا نبيع بياناتك لأطراف ثالثة",
"enable-privacy-permissions-settings": "تمكين إعدادات أذونات الخصوصية",
"enable-privacy-permissions-settings-description": ".من خلال تفعيل هذا الخيار، فإنك تقر بأنك قد قرأت ووافقت على سياسة الخصوصية الخاصة بنا بشأن كيفية جمع بيانات مهامك ومعالجتها وحمايتها",
"api-key-can-not-be-empty": "!لا يمكن أن يكون مفتاح واجهة برمجة التطبيقات فارغًا",
"api-host-can-not-be-empty": "!لا يمكن أن يكون مضيف واجهة برمجة التطبيقات فارغًا",
"model-type-can-not-be-empty": "!لا يمكن أن يكون نوع النموذج فارغًا",
@ -117,14 +115,7 @@
"warning-google-search-not-configured": "تحذير: بحث Google غير مكوّن",
"search-functionality-may-be-limited-without-google-api": "قد تكون وظائف البحث محدودة بدون مفتاح Google API ومعرف محرك البحث. يمكنك تكوين هذه في إعدادات MCP والأدوات.",
"search-engine": "محرك البحث",
"allow-agent-to-take-screenshots": "السماح للوكيل بالتقاط لقطات الشاشة",
"allow-agent-to-take-screenshots-description": "السماح للوكيل بالتقاط لقطات شاشة لشاشة الكمبيوتر الخاص بك. يمكن استخدام هذا للدعم أو التشخيص أو أغراض المراقبة. قد تتضمن لقطات الشاشة معلومات شخصية مرئية، لذا يرجى التمكين بحذر.",
"allow-agent-to-access-local-software": "السماح للوكيل بالوصول إلى البرامج المحلية",
"allow-agent-to-access-local-software-description": "منح الوكيل إذناً للتفاعل مع واستخدام البرامج المثبتة على جهازك المحلي. قد يكون هذا ضرورياً لاستكشاف الأخطاء وإصلاحها أو تشغيل التشخيصات أو أداء مهام محددة.",
"allow-agent-to-access-your-address": "السماح للوكيل بالوصول إلى عنوانك",
"allow-agent-to-access-your-address-description": "السماح للوكيل بعرض واستخدام تفاصيل موقعك أو عنوانك. قد يكون هذا مطلوباً للخدمات القائمة على الموقع أو الدعم الشخصي.",
"password-storage": "تخزين كلمة المرور",
"password-storage-description": "تحديد كيفية التعامل مع كلمات المرور وتخزينها. يمكنك اختيار تخزين كلمات المرور بأمان على الجهاز أو داخل التطبيق، أو اختيار إدخالها يدوياً في كل مرة. جميع كلمات المرور المخزنة مشفرة.",
"notion-mcp-installed-successfully": "تم تثبيت Notion MCP بنجاح",
"failed-to-install-notion-mcp": "فشل في تثبيت Notion MCP",
"google-calendar-installed-successfully": "تم تثبيت Google Calendar بنجاح",
@ -208,6 +199,7 @@
"data-privacy-description": "يعتمد أيجنت على الوضع المحلي الجديد ويضمن خصوصيتك. تبقى بياناتك على جهازك افتراضيًا. أذونات السحابة اختيارية، ويُستخدم حد البيانات لأغراض العمل فقط",
"privacy-policy": "سياسة الخصوصية",
"how-we-handle-your-data": "كيف نتعامل مع بياناتك",
"we-only-use-the-essential-data-needed-to-run-your-tasks": "نحن نستخدم فقط البيانات الأساسية اللازمة لتنفيذ مهامك",
"how-we-handle-your-data-line-1": "نحن نستخدم فقط البيانات الأساسية اللازمة لتنفيذ مهامك",
"how-we-handle-your-data-line-1-line-1": ".يمكنك اختيار لقطات شاشة أيجنت لتحليل عناصر واجهة المستخدم وقراءة النص وتحديد الإجراء التالي، تمامًا كما تفعل",
"how-we-handle-your-data-line-1-line-2": ".يمكن استخدام الماوس ولوحة المفاتيح المحلية للوصول إلى البرامج والملفات المحلية التي تم تنشيطها",
@ -216,9 +208,6 @@
"how-we-handle-your-data-line-3": ".يتم تخزين بيانات الاعتماد محليًا، وتشفيرها، ولا تُستخدم إلا للخطوات المعتمدة",
"how-we-handle-your-data-line-4": ".لا تُستخدم بياناتك أبدًا لتدريب نماذج الذكاء الاصطناعي الخاصة بنا دون موافقتك الصريحة",
"how-we-handle-your-data-line-5": ".نحن لا نبيع بياناتك لأطراف ثالثة",
"enable-privacy-permissions-settings": "تمكين إعدادات أذونات الخصوصية",
"enable-privacy-permissions-settings-description": ".من خلال تفعيل هذا الخيار، فإنك تقر بأنك قد قرأت ووافقت على سياسة الخصوصية الخاصة بنا بشأن كيفية جمع بيانات مهامك ومعالجتها وحمايتها",
"api-key-can-not-be-empty": "!لا يمكن أن يكون مفتاح واجهة برمجة التطبيقات فارغًا",
"api-host-can-not-be-empty": "!لا يمكن أن يكون مضيف واجهة برمجة التطبيقات فارغًا",
"model-type-can-not-be-empty": "!لا يمكن أن يكون نوع النموذج فارغًا",
@ -301,14 +290,7 @@
"warning-google-search-not-configured": "تحذير: بحث Google غير مكوّن",
"search-functionality-may-be-limited-without-google-api": "قد تكون وظائف البحث محدودة بدون مفتاح Google API ومعرف محرك البحث. يمكنك تكوين هذه في إعدادات MCP والأدوات.",
"search-engine": "محرك البحث",
"allow-agent-to-take-screenshots": "السماح للوكيل بالتقاط لقطات الشاشة",
"allow-agent-to-take-screenshots-description": "السماح للوكيل بالتقاط لقطات شاشة لشاشة الكمبيوتر الخاص بك. يمكن استخدام هذا للدعم أو التشخيص أو أغراض المراقبة. قد تتضمن لقطات الشاشة معلومات شخصية مرئية، لذا يرجى التمكين بحذر.",
"allow-agent-to-access-local-software": "السماح للوكيل بالوصول إلى البرامج المحلية",
"allow-agent-to-access-local-software-description": "منح الوكيل إذناً للتفاعل مع واستخدام البرامج المثبتة على جهازك المحلي. قد يكون هذا ضرورياً لاستكشاف الأخطاء وإصلاحها أو تشغيل التشخيصات أو أداء مهام محددة.",
"allow-agent-to-access-your-address": "السماح للوكيل بالوصول إلى عنوانك",
"allow-agent-to-access-your-address-description": "السماح للوكيل بعرض واستخدام تفاصيل موقعك أو عنوانك. قد يكون هذا مطلوباً للخدمات القائمة على الموقع أو الدعم الشخصي.",
"password-storage": "تخزين كلمة المرور",
"password-storage-description": "تحديد كيفية التعامل مع كلمات المرور وتخزينها. يمكنك اختيار تخزين كلمات المرور بأمان على الجهاز أو داخل التطبيق، أو اختيار إدخالها يدوياً في كل مرة. جميع كلمات المرور المخزنة مشفرة.",
"notion-mcp-installed-successfully": "تم تثبيت Notion MCP بنجاح",
"failed-to-install-notion-mcp": "فشل في تثبيت Notion MCP",
"google-calendar-installed-successfully": "تم تثبيت Google Calendar بنجاح",
@ -349,5 +331,11 @@
"proxy-saved-restart-required": "تم حفظ تكوين الوكيل. أعد تشغيل التطبيق لتطبيق التغييرات.",
"proxy-save-failed": "فشل حفظ تكوين الوكيل.",
"proxy-invalid-url": "عنوان URL للوكيل غير صالح. يجب أن يبدأ بـ http:// أو https:// أو socks4:// أو socks5://.",
"proxy-restart-hint": "يجب إعادة التشغيل لتطبيق تغييرات الوكيل."
"proxy-restart-hint": "يجب إعادة التشغيل لتطبيق تغييرات الوكيل.",
"preferred-ide": "IDE المفضل",
"preferred-ide-description": "اختر التطبيق الذي سيتم استخدامه عند فتح مجلدات مشاريع الوكيل.",
"system-file-manager": "مدير ملفات النظام",
"help-improve-eigent": "ساعد في تحسين Eigent",
"help-improve-eigent-description": "اسمح لـ Eigent بجمع سجلات الأخطاء المجهولة وبيانات الاستخدام لتحسين الخدمة. هذا اختياري ويمكن تغييره في أي وقت."
}

View file

@ -97,17 +97,6 @@
"close-notice": "Hinweis schließen",
"a-task-is-currently-running": "Eine Aufgabe wird derzeit ausgeführt. Das Beenden wird sie beenden. Sind Sie sicher, dass Sie beenden möchten?",
"yes": "Ja",
"turn-on-all-privacy-settings": "Alle Datenschutzeinstellungen aktivieren, um Eigent zu verwenden",
"eigent-is-a-desktop-software": "Eigent ist eine Desktop-Software, die den Browser und Terminal-Tools von Ihrem Computer aus bedient, um die Aufgaben zu starten. Es ist wichtig sicherzustellen, dass alle notwendigen Datenschutzeinstellungen aktiviert sind, bevor Sie Eigent für die volle Funktionalität verwenden.",
"allow-agent-to-take-screenshots": "Agent erlauben, Screenshots zu machen",
"permit-the-agent-to-capture": "Erlauben Sie dem Agenten, Screenshots Ihres Computerbildschirms zu erfassen. Dies kann für Support, Diagnose oder Überwachungszwecke verwendet werden. Screenshots können sichtbare persönliche Informationen enthalten, daher aktivieren Sie dies mit Vorsicht.",
"allow-agent-to-access-local-software": "Agent erlauben, auf lokale Software zuzugreifen",
"grant-the-agent-permission": "Gewähren Sie dem Agenten die Berechtigung, mit Software zu interagieren und sie zu nutzen, die auf Ihrem lokalen Computer installiert ist. Dies kann für Fehlerbehebung, Diagnose oder die Ausführung spezifischer Aufgaben erforderlich sein.",
"allow-agent-to-access-your-address": "Agent erlauben, auf Ihre Adresse zuzugreifen",
"authorize-the-agent-to-view": "Autorisieren Sie den Agenten, Ihre Standort- oder Adressdetails anzuzeigen und zu verwenden. Dies kann für standortbasierte Dienste oder personalisierten Support erforderlich sein.",
"password-storage": "Passwort-Speicherung",
"determine-how-passwords-are-handled": "Bestimmen Sie, wie Passwörter behandelt und gespeichert werden. Sie können wählen, Passwörter sicher auf dem Gerät oder in der Anwendung zu speichern, oder sich dafür entscheiden, sie jedes Mal manuell einzugeben. Alle gespeicherten Passwörter sind verschlüsselt.",
"turn-on-all-and-finish": "Alle aktivieren und beenden",
"search": "Suchen",
"are-you-sure-you-want-to-delete": "Sind Sie sicher, dass Sie diese Aufgabe löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",
"share": "Teilen",

View file

@ -23,6 +23,7 @@
"data-privacy-description": "Eigent basiert auf einem Local-First-Prinzip, um Ihre Privatsphäre zu gewährleisten. Ihre Daten verbleiben standardmäßig auf Ihrem Gerät. Cloud-Funktionen sind optional und verwenden nur die minimal erforderlichen Daten, um zu funktionieren. Für vollständige Details besuchen Sie bitte unsere",
"privacy-policy": "Datenschutzrichtlinie",
"how-we-handle-your-data": "Wie wir Ihre Daten behandeln",
"we-only-use-the-essential-data-needed-to-run-your-tasks": "Wir verwenden nur die für die Ausführung Ihrer Aufgaben erforderlichen Daten",
"how-we-handle-your-data-line-1": "Wir verwenden nur die für die Ausführung Ihrer Aufgaben erforderlichen Daten",
"how-we-handle-your-data-line-1-line-1": "Eigent kann Screenshots erfassen, um UI-Elemente zu analysieren, Text zu lesen und die nächste Aktion zu bestimmen, genau wie Sie es tun würden.",
"how-we-handle-your-data-line-1-line-2": "Eigent kann Ihre Maus und Tastatur verwenden, um auf von Ihnen angegebene lokale Software und Dateien zuzugreifen.",
@ -31,9 +32,6 @@
"how-we-handle-your-data-line-3": "Anmeldeinformationen werden lokal, verschlüsselt gespeichert und nur für genehmigte Schritte verwendet.",
"how-we-handle-your-data-line-4": "Ihre Daten werden ohne Ihre ausdrückliche Zustimmung niemals zum Trainieren unserer KI-Modelle verwendet.",
"how-we-handle-your-data-line-5": "Wir verkaufen Ihre Daten nicht an Dritte.",
"enable-privacy-permissions-settings": "Datenschutzeinstellungen aktivieren",
"enable-privacy-permissions-settings-description": "Durch die Aktivierung dieser Option bestätigen Sie, dass Sie unsere Datenschutzrichtlinie bezüglich der Erfassung, Verarbeitung und des Schutzes Ihrer Aufgabendaten gelesen und akzeptiert haben.",
"api-key-can-not-be-empty": "API-Schlüssel darf nicht leer sein!",
"api-host-can-not-be-empty": "API-Host darf nicht leer sein!",
"model-type-can-not-be-empty": "Modelltyp darf nicht leer sein!",
@ -86,6 +84,7 @@
"data-privacy-description": "Eigent basiert auf einem Local-First-Prinzip, um Ihre Privatsphäre zu gewährleisten. Ihre Daten verbleiben standardmäßig auf Ihrem Gerät. Cloud-Funktionen sind optional und verwenden nur die minimal erforderlichen Daten, um zu funktionieren. Für vollständige Details besuchen Sie bitte unsere",
"privacy-policy": "Datenschutzrichtlinie",
"how-we-handle-your-data": "Wie wir Ihre Daten behandeln",
"we-only-use-the-essential-data-needed-to-run-your-tasks": "Wir verwenden nur die für die Ausführung Ihrer Aufgaben erforderlichen Daten",
"how-we-handle-your-data-line-1": "Wir verwenden nur die für die Ausführung Ihrer Aufgaben erforderlichen Daten",
"how-we-handle-your-data-line-1-line-1": "Eigent kann Screenshots erfassen, um UI-Elemente zu analysieren, Text zu lesen und die nächste Aktion zu bestimmen, genau wie Sie es tun würden.",
"how-we-handle-your-data-line-1-line-2": "Eigent kann Ihre Maus und Tastatur verwenden, um auf von Ihnen angegebene lokale Software und Dateien zuzugreifen.",
@ -94,9 +93,6 @@
"how-we-handle-your-data-line-3": "Anmeldeinformationen werden lokal, verschlüsselt gespeichert und nur für genehmigte Schritte verwendet.",
"how-we-handle-your-data-line-4": "Ihre Daten werden ohne Ihre ausdrückliche Zustimmung niemals zum Trainieren unserer KI-Modelle verwendet.",
"how-we-handle-your-data-line-5": "Wir verkaufen Ihre Daten nicht an Dritte.",
"enable-privacy-permissions-settings": "Datenschutzeinstellungen aktivieren",
"enable-privacy-permissions-settings-description": "Durch die Aktivierung dieser Option bestätigen Sie, dass Sie unsere Datenschutzrichtlinie bezüglich der Erfassung, Verarbeitung und des Schutzes Ihrer Aufgabendaten gelesen und akzeptiert haben.",
"api-key-can-not-be-empty": "API-Schlüssel darf nicht leer sein!",
"api-host-can-not-be-empty": "API-Host darf nicht leer sein!",
"model-type-can-not-be-empty": "Modelltyp darf nicht leer sein!",
@ -179,14 +175,7 @@
"warning-google-search-not-configured": "Warnung: Google Search nicht konfiguriert",
"search-functionality-may-be-limited-without-google-api": "Suchfunktionalität kann ohne Google API-Schlüssel und Search Engine ID eingeschränkt sein. Sie können diese in den MCP & Tools-Einstellungen konfigurieren.",
"search-engine": "Suchmaschine",
"allow-agent-to-take-screenshots": "Agent erlauben, Screenshots zu machen",
"allow-agent-to-take-screenshots-description": "Erlauben Sie dem Agenten, Screenshots Ihres Computerbildschirms zu erfassen. Dies kann für Support, Diagnose oder Überwachungszwecke verwendet werden. Screenshots können sichtbare persönliche Informationen enthalten, daher aktivieren Sie dies mit Vorsicht.",
"allow-agent-to-access-local-software": "Agent erlauben, auf lokale Software zuzugreifen",
"allow-agent-to-access-local-software-description": "Gewähren Sie dem Agenten die Berechtigung, mit Software zu interagieren und sie zu nutzen, die auf Ihrem lokalen Computer installiert ist. Dies kann für Fehlerbehebung, Diagnose oder die Ausführung spezifischer Aufgaben erforderlich sein.",
"allow-agent-to-access-your-address": "Agent erlauben, auf Ihre Adresse zuzugreifen",
"allow-agent-to-access-your-address-description": "Autorisieren Sie den Agenten, Ihre Standort- oder Adressdetails anzuzeigen und zu verwenden. Dies kann für standortbasierte Dienste oder personalisierten Support erforderlich sein.",
"password-storage": "Passwort-Speicherung",
"password-storage-description": "Bestimmen Sie, wie Passwörter behandelt und gespeichert werden. Sie können wählen, Passwörter sicher auf dem Gerät oder in der Anwendung zu speichern, oder sich dafür entscheiden, sie jedes Mal manuell einzugeben. Alle gespeicherten Passwörter sind verschlüsselt.",
"notion-mcp-installed-successfully": "Notion MCP erfolgreich installiert",
"failed-to-install-notion-mcp": "Fehler beim Installieren von Notion MCP",
"google-calendar-installed-successfully": "Google Calendar erfolgreich installiert",
@ -259,5 +248,11 @@
"proxy-saved-restart-required": "Proxy-Konfiguration gespeichert. Starten Sie die App neu, um die Änderungen anzuwenden.",
"proxy-save-failed": "Proxy-Konfiguration konnte nicht gespeichert werden.",
"proxy-invalid-url": "Ungültige Proxy-URL. Muss mit http://, https://, socks4:// oder socks5:// beginnen.",
"proxy-restart-hint": "Neustart erforderlich, um Proxy-Änderungen anzuwenden."
"proxy-restart-hint": "Neustart erforderlich, um Proxy-Änderungen anzuwenden.",
"preferred-ide": "Bevorzugte IDE",
"preferred-ide-description": "Wählen Sie die Anwendung aus, die beim Öffnen von Agent-Projektordnern verwendet werden soll.",
"system-file-manager": "System-Dateimanager",
"help-improve-eigent": "Helfen Sie, Eigent zu verbessern",
"help-improve-eigent-description": "Erlauben Sie Eigent, anonyme Fehlerprotokolle und Nutzungsdaten zu sammeln, um den Dienst zu verbessern. Dies ist optional und kann jederzeit geändert werden."
}

View file

@ -98,17 +98,6 @@
"close-notice": "Close notice",
"a-task-is-currently-running": "A task is currently running. Exiting will terminate it. Are you sure you want to exit?",
"yes": "Yes",
"turn-on-all-privacy-settings": "Turn on all privacy settings to start using Eigent",
"eigent-is-a-desktop-software": "Eigent is a desktop software, it will operate the browser, terminal tools from your computer to start the tasks. It's important to make sure all necessary privacy settings are enabled before you begin using Eigent for full functionality.",
"allow-agent-to-take-screenshots": "Allow Agent to Take Screenshots",
"permit-the-agent-to-capture": "Permit the agent to capture screenshots of your computer screen. This can be used for support, diagnostics, or monitoring purposes. Screenshots may include visible personal information, so please enable with care.",
"allow-agent-to-access-local-software": "Allow Agent to Access Local Software",
"grant-the-agent-permission": "Grant the agent permission to interact with and utilize software installed on your local machine. This may be necessary for troubleshooting, running diagnostics, or performing specific tasks.",
"allow-agent-to-access-your-address": "Allow Agent to Access Your Address",
"authorize-the-agent-to-view": "Authorize the agent to view and use your location or address details. This may be required for location-based services or personalized support.",
"password-storage": "Password Storage",
"determine-how-passwords-are-handled": "Determine how passwords are handled and stored. You can choose to store passwords securely on the device or within the application, or opt out to manually enter them each time. All stored passwords are encrypted.",
"turn-on-all-and-finish": "Turn on All and Finish",
"search": "Search",
"are-you-sure-you-want-to-delete": "Are you sure you want to delete this task? This action cannot be undone.",
"share": "Share",

View file

@ -23,6 +23,7 @@
"data-privacy-description": "Eigent is built on a local-first principle to ensure your privacy. Your data remains on your device by default. Cloud features are optional and only use the minimum data necessary to function. For full details, visit our",
"privacy-policy": "Privacy Policy",
"how-we-handle-your-data": "How we handle your data",
"we-only-use-the-essential-data-needed-to-run-your-tasks": "We only use the essential data needed to run your tasks",
"how-we-handle-your-data-line-1": "We only use the essential data needed to run your tasks",
"how-we-handle-your-data-line-1-line-1": "Eigent may capture screenshots to analyze UI elements, read text, and determine the next action, just as you would.",
"how-we-handle-your-data-line-1-line-2": "Eigent may use your mouse and keyboard to access local software and files you specify.",
@ -31,9 +32,6 @@
"how-we-handle-your-data-line-3": "Credentials are stored locally, encrypted, and used only for approved steps.",
"how-we-handle-your-data-line-4": "Your data is never used to train our AI models without your explicit consent.",
"how-we-handle-your-data-line-5": "We dont sell your data to third parties.",
"enable-privacy-permissions-settings": "Enable Privacy Permissions Settings",
"enable-privacy-permissions-settings-description": "By turning this on, you acknowledge that you have read and agree to our Privacy Policy regarding how your task data is collected, processed, and protected.",
"api-key-can-not-be-empty": "API Key can not be empty!",
"api-host-can-not-be-empty": "API Host can not be empty!",
"model-type-can-not-be-empty": "Model Type can not be empty!",
@ -117,14 +115,7 @@
"warning-google-search-not-configured": "Warning: Google Search not configured",
"search-functionality-may-be-limited-without-google-api": "Search functionality may be limited without Google API key and Search Engine ID. You can configure these in MCP & Tools settings.",
"search-engine": "Search Engine",
"allow-agent-to-take-screenshots": "Allow Agent to Take Screenshots",
"allow-agent-to-take-screenshots-description": "Permit the agent to capture screenshots of your computer screen. This can be used for support, diagnostics, or monitoring purposes. Screenshots may include visible personal information, so please enable with care.",
"allow-agent-to-access-local-software": "Allow Agent to Access Local Software",
"allow-agent-to-access-local-software-description": "Grant the agent permission to interact with and utilize software installed on your local machine. This may be necessary for troubleshooting, running diagnostics, or performing specific tasks.",
"allow-agent-to-access-your-address": "Allow Agent to Access Your Address",
"allow-agent-to-access-your-address-description": "Authorize the agent to view and use your location or address details. This may be required for location-based services or personalized support.",
"password-storage": "Password Storage",
"password-storage-description": "Determine how passwords are handled and stored. You can choose to store passwords securely on the device or within the application, or opt out to manually enter them each time. All stored passwords are encrypted.",
"notion-mcp-installed-successfully": "Notion MCP installed successfully",
"failed-to-install-notion-mcp": "Failed to install Notion MCP",
"google-calendar-installed-successfully": "Google Calendar installed successfully",
@ -236,6 +227,7 @@
"data-privacy-description": "Eigent is built on a local-first principle to ensure your privacy. Your data remains on your device by default. Cloud features are optional and only use the minimum data necessary to function. For full details, visit our",
"privacy-policy": "Privacy Policy",
"how-we-handle-your-data": "How we handle your data",
"we-only-use-the-essential-data-needed-to-run-your-tasks": "We only use the essential data needed to run your tasks",
"how-we-handle-your-data-line-1": "We only use the essential data needed to run your tasks",
"how-we-handle-your-data-line-1-line-1": "Eigent may capture screenshots to analyze UI elements, read text, and determine the next action, just as you would.",
"how-we-handle-your-data-line-1-line-2": "Eigent may use your mouse and keyboard to access local software and files you specify.",
@ -244,9 +236,6 @@
"how-we-handle-your-data-line-3": "Credentials are stored locally, encrypted, and used only for approved steps.",
"how-we-handle-your-data-line-4": "Your data is never used to train our AI models without your explicit consent.",
"how-we-handle-your-data-line-5": "We dont sell your data to third parties.",
"enable-privacy-permissions-settings": "Enable Privacy Permissions Settings",
"enable-privacy-permissions-settings-description": "By turning this on, you acknowledge that you have read and agree to our Privacy Policy regarding how your task data is collected, processed, and protected.",
"api-key-can-not-be-empty": "API Key can not be empty!",
"api-host-can-not-be-empty": "API Host can not be empty!",
"model-type-can-not-be-empty": "Model Type can not be empty!",
@ -330,14 +319,7 @@
"warning-google-search-not-configured": "Warning: Google Search not configured",
"search-functionality-may-be-limited-without-google-api": "Search functionality may be limited without Google API key and Search Engine ID. You can configure these in MCP & Tools settings.",
"search-engine": "Search Engine",
"allow-agent-to-take-screenshots": "Allow Agent to Take Screenshots",
"allow-agent-to-take-screenshots-description": "Permit the agent to capture screenshots of your computer screen. This can be used for support, diagnostics, or monitoring purposes. Screenshots may include visible personal information, so please enable with care.",
"allow-agent-to-access-local-software": "Allow Agent to Access Local Software",
"allow-agent-to-access-local-software-description": "Grant the agent permission to interact with and utilize software installed on your local machine. This may be necessary for troubleshooting, running diagnostics, or performing specific tasks.",
"allow-agent-to-access-your-address": "Allow Agent to Access Your Address",
"allow-agent-to-access-your-address-description": "Authorize the agent to view and use your location or address details. This may be required for location-based services or personalized support.",
"password-storage": "Password Storage",
"password-storage-description": "Determine how passwords are handled and stored. You can choose to store passwords securely on the device or within the application, or opt out to manually enter them each time. All stored passwords are encrypted.",
"notion-mcp-installed-successfully": "Notion MCP installed successfully",
"failed-to-install-notion-mcp": "Failed to install Notion MCP",
"google-calendar-installed-successfully": "Google Calendar installed successfully",
@ -407,5 +389,10 @@
"proxy-invalid-url": "Invalid proxy URL. Must start with http://, https://, socks4://, or socks5://.",
"proxy-restart-hint": "Restart required to apply proxy changes.",
"agents": "Agents"
"preferred-ide": "Preferred IDE",
"preferred-ide-description": "Choose which application to use when opening agent project folders.",
"system-file-manager": "System File Manager",
"agents": "Agents",
"help-improve-eigent": "Help Improve Eigent",
"help-improve-eigent-description": "Allow Eigent to collect anonymous error logs and usage data to improve the service. This is optional and can be changed at any time."
}

View file

@ -97,17 +97,6 @@
"close-notice": "Cerrar aviso",
"a-task-is-currently-running": "Una tarea se está ejecutando actualmente. Salir la terminará. ¿Estás seguro de que quieres salir?",
"yes": "Sí",
"turn-on-all-privacy-settings": "Activar todas las configuraciones de privacidad para comenzar a usar Eigent",
"eigent-is-a-desktop-software": "Eigent es un software de escritorio, operará el navegador, herramientas de terminal desde tu computadora para iniciar las tareas. Es importante asegurarse de que todas las configuraciones de privacidad necesarias estén habilitadas antes de comenzar a usar Eigent para funcionalidad completa.",
"allow-agent-to-take-screenshots": "Permitir que el Agente tome capturas de pantalla",
"permit-the-agent-to-capture": "Permite que el agente capture capturas de pantalla de tu pantalla de computadora. Esto puede usarse para soporte, diagnósticos o propósitos de monitoreo. Las capturas de pantalla pueden incluir información personal visible, así que habilita con cuidado.",
"allow-agent-to-access-local-software": "Permitir que el Agente acceda al software local",
"grant-the-agent-permission": "Otorga al agente permiso para interactuar y utilizar software instalado en tu máquina local. Esto puede ser necesario para resolución de problemas, ejecutar diagnósticos o realizar tareas específicas.",
"allow-agent-to-access-your-address": "Permitir que el Agente acceda a tu dirección",
"authorize-the-agent-to-view": "Autoriza al agente a ver y usar los detalles de tu ubicación o dirección. Esto puede ser requerido para servicios basados en ubicación o soporte personalizado.",
"password-storage": "Almacenamiento de contraseñas",
"determine-how-passwords-are-handled": "Determina cómo se manejan y almacenan las contraseñas. Puedes elegir almacenar contraseñas de forma segura en el dispositivo o dentro de la aplicación, o optar por ingresarlas manualmente cada vez. Todas las contraseñas almacenadas están encriptadas.",
"turn-on-all-and-finish": "Activar todo y terminar",
"search": "Buscar",
"are-you-sure-you-want-to-delete": "¿Estás seguro de que quieres eliminar esta tarea? Esta acción no se puede deshacer.",
"share": "Compartir",

View file

@ -23,6 +23,7 @@
"data-privacy-description": "Eigent está construido sobre un principio local-first para garantizar tu privacidad. Tus datos permanecen en tu dispositivo por defecto. Las características en la nube son opcionales y solo utilizan los datos mínimos necesarios para funcionar. Para obtener más detalles, visita nuestra",
"privacy-policy": "Política de privacidad",
"how-we-handle-your-data": "Cómo manejamos tus datos",
"we-only-use-the-essential-data-needed-to-run-your-tasks": "Solo utilizamos los datos esenciales necesarios para ejecutar tus tareas",
"how-we-handle-your-data-line-1": "Solo utilizamos los datos esenciales necesarios para ejecutar tus tareas",
"how-we-handle-your-data-line-1-line-1": "Eigent puede capturar capturas de pantalla para analizar elementos de la interfaz de usuario, leer texto y determinar la siguiente acción, como tú.",
"how-we-handle-your-data-line-1-line-2": "Eigent puede usar tu mouse y teclado para acceder a software y archivos locales que especifiques.",
@ -31,9 +32,6 @@
"how-we-handle-your-data-line-3": "Las credenciales se almacenan localmente, encriptadas, y solo se utilizan para pasos aprobados.",
"how-we-handle-your-data-line-4": "Tus datos nunca se utilizan para entrenar nuestros modelos de IA sin tu consentimiento explícito.",
"how-we-handle-your-data-line-5": "No vendemos tus datos a terceros.",
"enable-privacy-permissions-settings": "Habilitar ajustes de permisos de privacidad",
"enable-privacy-permissions-settings-description": "Al activar esta opción, aceptas que has leído y aceptado nuestra Política de privacidad respecto a cómo se recopilan, procesan y protegen tus datos de las tareas.",
"api-key-can-not-be-empty": "API Key no puede estar vacío!",
"api-host-can-not-be-empty": "API Host no puede estar vacío!",
"model-type-can-not-be-empty": "Model Type no puede estar vacío!",
@ -86,6 +84,7 @@
"data-privacy-description": "Eigent está construido sobre un principio local-first para garantizar tu privacidad. Tus datos permanecen en tu dispositivo por defecto. Las características en la nube son opcionales y solo utilizan los datos mínimos necesarios para funcionar. Para obtener más detalles, visita nuestra",
"privacy-policy": "Política de privacidad",
"how-we-handle-your-data": "Cómo manejamos tus datos",
"we-only-use-the-essential-data-needed-to-run-your-tasks": "Solo utilizamos los datos esenciales necesarios para ejecutar tus tareas",
"how-we-handle-your-data-line-1": "Solo utilizamos los datos esenciales necesarios para ejecutar tus tareas",
"how-we-handle-your-data-line-1-line-1": "Eigent puede capturar capturas de pantalla para analizar elementos de la interfaz de usuario, leer texto y determinar la siguiente acción, como tú.",
"how-we-handle-your-data-line-1-line-2": "Eigent puede usar tu mouse y teclado para acceder a software y archivos locales que especifiques.",
@ -94,9 +93,6 @@
"how-we-handle-your-data-line-3": "Las credenciales se almacenan localmente, encriptadas, y solo se utilizan para pasos aprobados.",
"how-we-handle-your-data-line-4": "Tus datos nunca se utilizan para entrenar nuestros modelos de IA sin tu consentimiento explícito.",
"how-we-handle-your-data-line-5": "No vendemos tus datos a terceros.",
"enable-privacy-permissions-settings": "Habilitar ajustes de permisos de privacidad",
"enable-privacy-permissions-settings-description": "Al activar esta opción, aceptas que has leído y aceptado nuestra Política de privacidad respecto a cómo se recopilan, procesan y protegen tus datos de las tareas.",
"api-key-can-not-be-empty": "API Key no puede estar vacío!",
"api-host-can-not-be-empty": "API Host no puede estar vacío!",
"model-type-can-not-be-empty": "Model Type no puede estar vacío!",
@ -179,14 +175,7 @@
"warning-google-search-not-configured": "Advertencia: Google Search no configurado",
"search-functionality-may-be-limited-without-google-api": "La funcionalidad de búsqueda puede estar limitada sin la clave API de Google y el ID del motor de búsqueda. Puedes configurar estos en la configuración de MCP y Herramientas.",
"search-engine": "Motor de búsqueda",
"allow-agent-to-take-screenshots": "Permitir que el Agente tome capturas de pantalla",
"allow-agent-to-take-screenshots-description": "Permite que el agente capture capturas de pantalla de tu pantalla de computadora. Esto puede usarse para soporte, diagnósticos o propósitos de monitoreo. Las capturas de pantalla pueden incluir información personal visible, así que habilita con cuidado.",
"allow-agent-to-access-local-software": "Permitir que el Agente acceda al software local",
"allow-agent-to-access-local-software-description": "Otorga al agente permiso para interactuar y utilizar software instalado en tu máquina local. Esto puede ser necesario para resolución de problemas, ejecutar diagnósticos o realizar tareas específicas.",
"allow-agent-to-access-your-address": "Permitir que el Agente acceda a tu dirección",
"allow-agent-to-access-your-address-description": "Autoriza al agente a ver y usar los detalles de tu ubicación o dirección. Esto puede ser requerido para servicios basados en ubicación o soporte personalizado.",
"password-storage": "Almacenamiento de contraseñas",
"password-storage-description": "Determina cómo se manejan y almacenan las contraseñas. Puedes elegir almacenar contraseñas de forma segura en el dispositivo o dentro de la aplicación, o optar por ingresarlas manualmente cada vez. Todas las contraseñas almacenadas están encriptadas.",
"notion-mcp-installed-successfully": "Notion MCP instalado exitosamente",
"failed-to-install-notion-mcp": "Error al instalar Notion MCP",
"google-calendar-installed-successfully": "Google Calendar instalado exitosamente",
@ -259,5 +248,11 @@
"proxy-saved-restart-required": "Configuración de proxy guardada. Reinicie la aplicación para aplicar los cambios.",
"proxy-save-failed": "Error al guardar la configuración del proxy.",
"proxy-invalid-url": "URL de proxy no válida. Debe comenzar con http://, https://, socks4:// o socks5://.",
"proxy-restart-hint": "Es necesario reiniciar para aplicar los cambios del proxy."
"proxy-restart-hint": "Es necesario reiniciar para aplicar los cambios del proxy.",
"preferred-ide": "IDE preferido",
"preferred-ide-description": "Elija qué aplicación usar al abrir las carpetas de proyectos del agente.",
"system-file-manager": "Administrador de archivos del sistema",
"help-improve-eigent": "Ayuda a mejorar Eigent",
"help-improve-eigent-description": "Permite que Eigent recopile registros de errores anónimos y datos de uso para mejorar el servicio. Esto es opcional y se puede cambiar en cualquier momento."
}

View file

@ -97,17 +97,6 @@
"close-notice": "Fermer l'avis",
"a-task-is-currently-running": "Une tâche est actuellement en cours d'exécution. Quitter la terminera. Êtes-vous sûr de vouloir quitter ?",
"yes": "Oui",
"turn-on-all-privacy-settings": "Activez tous les paramètres de confidentialité pour commencer à utiliser Eigent",
"eigent-is-a-desktop-software": "Eigent est un logiciel de bureau, il opérera le navigateur, les outils de terminal depuis votre ordinateur pour démarrer les tâches. Il est important de s'assurer que tous les paramètres de confidentialité nécessaires sont activés avant de commencer à utiliser Eigent pour une fonctionnalité complète.",
"allow-agent-to-take-screenshots": "Permettre à l'Agent de prendre des captures d'écran",
"permit-the-agent-to-capture": "Permettez à l'agent de capturer des captures d'écran de votre écran d'ordinateur. Cela peut être utilisé pour le support, les diagnostics ou les fins de surveillance. Les captures d'écran peuvent inclure des informations personnelles visibles, veuillez donc activer avec précaution.",
"allow-agent-to-access-local-software": "Permettre à l'Agent d'accéder au logiciel local",
"grant-the-agent-permission": "Accordez à l'agent la permission d'interagir et d'utiliser le logiciel installé sur votre machine locale. Cela peut être nécessaire pour le dépannage, l'exécution de diagnostics ou l'exécution de tâches spécifiques.",
"allow-agent-to-access-your-address": "Permettre à l'Agent d'accéder à votre adresse",
"authorize-the-agent-to-view": "Autorisez l'agent à voir et utiliser les détails de votre emplacement ou adresse. Cela peut être requis pour les services basés sur la localisation ou le support personnalisé.",
"password-storage": "Stockage des mots de passe",
"determine-how-passwords-are-handled": "Déterminez comment les mots de passe sont gérés et stockés. Vous pouvez choisir de stocker les mots de passe en toute sécurité sur l'appareil ou dans l'application, ou choisir de les saisir manuellement à chaque fois. Tous les mots de passe stockés sont cryptés.",
"turn-on-all-and-finish": "Tout activer et terminer",
"search": "Rechercher",
"are-you-sure-you-want-to-delete": "Êtes-vous sûr de vouloir supprimer cette tâche ? Cette action ne peut pas être annulée.",
"share": "Partager",

View file

@ -23,6 +23,7 @@
"data-privacy-description": "Eigent is built on a local-first principle to ensure your privacy. Your data remains on your device by default. Cloud features are optional and only use the minimum data necessary to function. For full details, visit our",
"privacy-policy": "Privacy Policy",
"how-we-handle-your-data": "How we handle your data",
"we-only-use-the-essential-data-needed-to-run-your-tasks": "We only use the essential data needed to run your tasks",
"how-we-handle-your-data-line-1": "We only use the essential data needed to run your tasks",
"how-we-handle-your-data-line-1-line-1": "Eigent may capture screenshots to analyze UI elements, read text, and determine the next action, just as you would.",
"how-we-handle-your-data-line-1-line-2": "Eigent may use your mouse and keyboard to access local software and files you specify.",
@ -31,9 +32,6 @@
"how-we-handle-your-data-line-3": "Credentials are stored locally, encrypted, and used only for approved steps.",
"how-we-handle-your-data-line-4": "Your data is never used to train our AI models without your explicit consent.",
"how-we-handle-your-data-line-5": "We dont sell your data to third parties.",
"enable-privacy-permissions-settings": "Enable Privacy Permissions Settings",
"enable-privacy-permissions-settings-description": "By turning this on, you acknowledge that you have read and agree to our Privacy Policy regarding how your task data is collected, processed, and protected.",
"api-key-can-not-be-empty": "API Key can not be empty!",
"api-host-can-not-be-empty": "API Host can not be empty!",
"model-type-can-not-be-empty": "Model Type can not be empty!",
@ -86,6 +84,7 @@
"data-privacy-description": "Eigent is built on a local-first principle to ensure your privacy. Your data remains on your device by default. Cloud features are optional and only use the minimum data necessary to function. For full details, visit our",
"privacy-policy": "Privacy Policy",
"how-we-handle-your-data": "How we handle your data",
"we-only-use-the-essential-data-needed-to-run-your-tasks": "We only use the essential data needed to run your tasks",
"how-we-handle-your-data-line-1": "We only use the essential data needed to run your tasks",
"how-we-handle-your-data-line-1-line-1": "Eigent may capture screenshots to analyze UI elements, read text, and determine the next action, just as you would.",
"how-we-handle-your-data-line-1-line-2": "Eigent may use your mouse and keyboard to access local software and files you specify.",
@ -94,9 +93,6 @@
"how-we-handle-your-data-line-3": "Credentials are stored locally, encrypted, and used only for approved steps.",
"how-we-handle-your-data-line-4": "Your data is never used to train our AI models without your explicit consent.",
"how-we-handle-your-data-line-5": "We dont sell your data to third parties.",
"enable-privacy-permissions-settings": "Enable Privacy Permissions Settings",
"enable-privacy-permissions-settings-description": "By turning this on, you acknowledge that you have read and agree to our Privacy Policy regarding how your task data is collected, processed, and protected.",
"api-key-can-not-be-empty": "API Key can not be empty!",
"api-host-can-not-be-empty": "API Host can not be empty!",
"model-type-can-not-be-empty": "Model Type can not be empty!",
@ -235,5 +231,11 @@
"proxy-saved-restart-required": "Configuration du proxy enregistrée. Redémarrez l'application pour appliquer les modifications.",
"proxy-save-failed": "Échec de l'enregistrement de la configuration du proxy.",
"proxy-invalid-url": "URL de proxy invalide. Doit commencer par http://, https://, socks4:// ou socks5://.",
"proxy-restart-hint": "Redémarrage nécessaire pour appliquer les modifications du proxy."
"proxy-restart-hint": "Redémarrage nécessaire pour appliquer les modifications du proxy.",
"preferred-ide": "IDE préféré",
"preferred-ide-description": "Choisissez l'application à utiliser lors de l'ouverture des dossiers de projets d'agent.",
"system-file-manager": "Gestionnaire de fichiers système",
"help-improve-eigent": "Aidez à améliorer Eigent",
"help-improve-eigent-description": "Autorisez Eigent à collecter des journaux d'erreurs anonymes et des données d'utilisation pour améliorer le service. Ceci est facultatif et peut être modifié à tout moment."
}

View file

@ -97,17 +97,6 @@
"close-notice": "Chiudi avviso",
"a-task-is-currently-running": "Un'attività è attualmente in esecuzione. Uscire la terminerà. Sei sicuro di voler uscire?",
"yes": "Sì",
"turn-on-all-privacy-settings": "Attiva tutte le impostazioni di privacy per iniziare a usare Eigent",
"eigent-is-a-desktop-software": "Eigent è un software desktop, opererà il browser, gli strumenti terminal dal tuo computer per avviare le attività. È importante assicurarsi che tutte le impostazioni di privacy necessarie siano abilitate prima di iniziare a usare Eigent per la funzionalità completa.",
"allow-agent-to-take-screenshots": "Consenti all'Agente di fare screenshot",
"permit-the-agent-to-capture": "Consenti all'agente di acquisire screenshot del tuo schermo del computer. Questo può essere utilizzato per supporto, diagnostica o scopi di monitoraggio. Gli screenshot possono includere informazioni personali visibili, quindi abilita con cautela.",
"allow-agent-to-access-local-software": "Consenti all'Agente di accedere al software locale",
"grant-the-agent-permission": "Concedi all'agente il permesso di interagire e utilizzare software installato sulla tua macchina locale. Questo può essere necessario per la risoluzione dei problemi, l'esecuzione di diagnostica o l'esecuzione di attività specifiche.",
"allow-agent-to-access-your-address": "Consenti all'Agente di accedere al tuo indirizzo",
"authorize-the-agent-to-view": "Autorizza l'agente a visualizzare e utilizzare i dettagli della tua posizione o indirizzo. Questo può essere richiesto per servizi basati sulla posizione o supporto personalizzato.",
"password-storage": "Archiviazione password",
"determine-how-passwords-are-handled": "Determina come vengono gestite e archiviate le password. Puoi scegliere di archiviare le password in modo sicuro sul dispositivo o all'interno dell'applicazione, o scegliere di inserirle manualmente ogni volta. Tutte le password archiviate sono crittografate.",
"turn-on-all-and-finish": "Attiva tutto e termina",
"search": "Cerca",
"are-you-sure-you-want-to-delete": "Sei sicuro di voler eliminare questa attività? Questa azione non può essere annullata.",
"share": "Condividi",

View file

@ -23,6 +23,7 @@
"data-privacy-description": "Eigent è costruito su un principio local-first per garantire la tua privacy. I tuoi dati rimangono sul tuo dispositivo per impostazione predefinita. Le funzionalità cloud sono opzionali e utilizzano solo i dati minimi necessari per funzionare. Per tutti i dettagli, visita la nostra",
"privacy-policy": "Informativa sulla privacy",
"how-we-handle-your-data": "Come gestiamo i tuoi dati",
"we-only-use-the-essential-data-needed-to-run-your-tasks": "Utilizziamo solo i dati essenziali necessari per eseguire le tue attività",
"how-we-handle-your-data-line-1": "Utilizziamo solo i dati essenziali necessari per eseguire le tue attività",
"how-we-handle-your-data-line-1-line-1": "Eigent può acquisire screenshot per analizzare elementi dell'interfaccia utente, leggere testo e determinare l'azione successiva, proprio come faresti tu.",
"how-we-handle-your-data-line-1-line-2": "Eigent può utilizzare il tuo mouse e la tua tastiera per accedere a software e file locali da te specificati.",
@ -31,9 +32,6 @@
"how-we-handle-your-data-line-3": "Le credenziali sono archiviate localmente, crittografate e utilizzate solo per i passaggi approvati.",
"how-we-handle-your-data-line-4": "I tuoi dati non vengono mai utilizzati per addestrare i nostri modelli AI senza il tuo esplicito consenso.",
"how-we-handle-your-data-line-5": "Non vendiamo i tuoi dati a terzi.",
"enable-privacy-permissions-settings": "Abilita impostazioni di autorizzazione per la privacy",
"enable-privacy-permissions-settings-description": "Attivando questa opzione, riconosci di aver letto e accettato la nostra Informativa sulla privacy riguardo a come i tuoi dati di attività vengono raccolti, elaborati e protetti.",
"api-key-can-not-be-empty": "La chiave API non può essere vuota!",
"api-host-can-not-be-empty": "L'host API non può essere vuoto!",
"model-type-can-not-be-empty": "Il tipo di modello non può essere vuoto!",
@ -86,6 +84,7 @@
"data-privacy-description": "Eigent è costruito su un principio local-first per garantire la tua privacy. I tuoi dati rimangono sul tuo dispositivo per impostazione predefinita. Le funzionalità cloud sono opzionali e utilizzano solo i dati minimi necessari per funzionare. Per tutti i dettagli, visita la nostra",
"privacy-policy": "Informativa sulla privacy",
"how-we-handle-your-data": "Come gestiamo i tuoi dati",
"we-only-use-the-essential-data-needed-to-run-your-tasks": "Utilizziamo solo i dati essenziali necessari per eseguire le tue attività",
"how-we-handle-your-data-line-1": "Utilizziamo solo i dati essenziali necessari per eseguire le tue attività",
"how-we-handle-your-data-line-1-line-1": "Eigent può acquisire screenshot per analizzare elementi dell'interfaccia utente, leggere testo e determinare l'azione successiva, proprio come faresti tu.",
"how-we-handle-your-data-line-1-line-2": "Eigent può utilizzare il tuo mouse e la tua tastiera per accedere a software e file locali da te specificati.",
@ -94,9 +93,6 @@
"how-we-handle-your-data-line-3": "Le credenziali sono archiviate localmente, crittografate e utilizzate solo per i passaggi approvati.",
"how-we-handle-your-data-line-4": "I tuoi dati non vengono mai utilizzati per addestrare i nostri modelli AI senza il tuo esplicito consenso.",
"how-we-handle-your-data-line-5": "Non vendiamo i tuoi dati a terzi.",
"enable-privacy-permissions-settings": "Abilita impostazioni di autorizzazione per la privacy",
"enable-privacy-permissions-settings-description": "Attivando questa opzione, riconosci di aver letto e accettato la nostra Informativa sulla privacy riguardo a come i tuoi dati di attività vengono raccolti, elaborati e protetti.",
"api-key-can-not-be-empty": "La chiave API non può essere vuota!",
"api-host-can-not-be-empty": "L'host API non può essere vuoto!",
"model-type-can-not-be-empty": "Il tipo di modello non può essere vuoto!",
@ -179,14 +175,7 @@
"warning-google-search-not-configured": "Avviso: Google Search non configurato",
"search-functionality-may-be-limited-without-google-api": "La funzionalità di ricerca può essere limitata senza la chiave API Google e l'ID del motore di ricerca. Puoi configurare questi nelle impostazioni MCP e Strumenti.",
"search-engine": "Motore di ricerca",
"allow-agent-to-take-screenshots": "Consenti all'Agente di fare screenshot",
"allow-agent-to-take-screenshots-description": "Consenti all'agente di acquisire screenshot del tuo schermo del computer. Questo può essere utilizzato per supporto, diagnostica o scopi di monitoraggio. Gli screenshot possono includere informazioni personali visibili, quindi abilita con cautela.",
"allow-agent-to-access-local-software": "Consenti all'Agente di accedere al software locale",
"allow-agent-to-access-local-software-description": "Concedi all'agente il permesso di interagire e utilizzare software installato sulla tua macchina locale. Questo può essere necessario per la risoluzione dei problemi, l'esecuzione di diagnostica o l'esecuzione di attività specifiche.",
"allow-agent-to-access-your-address": "Consenti all'Agente di accedere al tuo indirizzo",
"allow-agent-to-access-your-address-description": "Autorizza l'agente a visualizzare e utilizzare i dettagli della tua posizione o indirizzo. Questo può essere richiesto per servizi basati sulla posizione o supporto personalizzato.",
"password-storage": "Archiviazione password",
"password-storage-description": "Determina come vengono gestite e archiviate le password. Puoi scegliere di archiviare le password in modo sicuro sul dispositivo o all'interno dell'applicazione, o scegliere di inserirle manualmente ogni volta. Tutte le password archiviate sono crittografate.",
"notion-mcp-installed-successfully": "Notion MCP installato con successo",
"failed-to-install-notion-mcp": "Impossibile installare Notion MCP",
"google-calendar-installed-successfully": "Google Calendar installato con successo",
@ -259,5 +248,11 @@
"proxy-saved-restart-required": "Configurazione proxy salvata. Riavvia l'app per applicare le modifiche.",
"proxy-save-failed": "Impossibile salvare la configurazione del proxy.",
"proxy-invalid-url": "URL proxy non valido. Deve iniziare con http://, https://, socks4:// o socks5://.",
"proxy-restart-hint": "Riavvio necessario per applicare le modifiche del proxy."
"proxy-restart-hint": "Riavvio necessario per applicare le modifiche del proxy.",
"preferred-ide": "IDE preferito",
"preferred-ide-description": "Scegli quale applicazione utilizzare per aprire le cartelle dei progetti dell'agente.",
"system-file-manager": "Gestione file di sistema",
"help-improve-eigent": "Aiuta a migliorare Eigent",
"help-improve-eigent-description": "Consenti a Eigent di raccogliere log di errori anonimi e dati di utilizzo per migliorare il servizio. Questo è facoltativo e può essere modificato in qualsiasi momento."
}

View file

@ -97,17 +97,6 @@
"close-notice": "通知を閉じる",
"a-task-is-currently-running": "タスクが現在実行中です。終了するとタスクが停止します。終了してもよろしいですか?",
"yes": "はい",
"turn-on-all-privacy-settings": "Eigentの使用を開始するためにすべてのプライバシー設定をオンにする",
"eigent-is-a-desktop-software": "Eigentはデスクトップソフトウェアで、タスクを開始するためにコンピューターからブラウザーやターミナルツールを操作します。完全な機能のためにEigentの使用を開始する前に、必要なすべてのプライバシー設定が有効になっていることを確認することが重要です。",
"allow-agent-to-take-screenshots": "エージェントにスクリーンショットを撮ることを許可",
"permit-the-agent-to-capture": "エージェントがコンピューター画面のスクリーンショットをキャプチャすることを許可します。これは、サポート、診断、または監視目的で使用できます。スクリーンショットには個人情報が含まれる可能性があるため、注意して有効にしてください。",
"allow-agent-to-access-local-software": "エージェントにローカルソフトウェアへのアクセスを許可",
"grant-the-agent-permission": "エージェントに、ローカルマシンにインストールされたソフトウェアと対話し、使用する権限を付与します。これは、トラブルシューティング、診断の実行、または特定のタスクの実行に必要になる場合があります。",
"allow-agent-to-access-your-address": "エージェントにあなたの住所へのアクセスを許可",
"authorize-the-agent-to-view": "エージェントがあなたの場所や住所の詳細を表示し、使用することを許可します。これは、位置ベースのサービスやパーソナライズされたサポートに必要になる場合があります。",
"password-storage": "パスワードストレージ",
"determine-how-passwords-are-handled": "パスワードの処理と保存方法を決定します。デバイス上またはアプリケーション内でパスワードを安全に保存するか、毎回手動で入力するかを選択できます。保存されたすべてのパスワードは暗号化されています。",
"turn-on-all-and-finish": "すべてをオンにして完了",
"search": "検索",
"are-you-sure-you-want-to-delete": "このタスクを削除してもよろしいですか?この操作は元に戻せません。",
"share": "共有",

View file

@ -23,6 +23,7 @@
"data-privacy-description": "Eigentはプライバシーを確保するためにローカルファーストの原則に基づいて構築されています。デフォルトでは、データはお客様のデバイスに残ります。クラウド機能はオプションであり、機能するために必要な最小限のデータのみを使用します。詳細については、当社の",
"privacy-policy": "プライバシーポリシー",
"how-we-handle-your-data": "データの取り扱い方法",
"we-only-use-the-essential-data-needed-to-run-your-tasks": "タスクを実行するために必要な最小限のデータのみを使用します",
"how-we-handle-your-data-line-1": "タスクを実行するために必要な最小限のデータのみを使用します",
"how-we-handle-your-data-line-1-line-1": "Eigentは、UI要素を分析し、テキストを読み取り、次のアクションを決定するために、お客様が行うのと同じようにスクリーンショットをキャプチャする場合があります。",
"how-we-handle-your-data-line-1-line-2": "Eigentは、指定したローカルソフトウェアおよびファイルにアクセスするために、マウスとキーボードを使用する場合があります。",
@ -31,9 +32,6 @@
"how-we-handle-your-data-line-3": "認証情報はローカルに保存され、暗号化され、承認されたステップにのみ使用されます。",
"how-we-handle-your-data-line-4": "お客様の明示的な同意なしに、お客様のデータが当社のAIモデルのトレーニングに使用されることはありません。",
"how-we-handle-your-data-line-5": "お客様のデータを第三者に販売することはありません。",
"enable-privacy-permissions-settings": "プライバシー権限設定を有効にする",
"enable-privacy-permissions-settings-description": "これをオンにすることで、タスクデータの収集、処理、保護方法に関するプライバシーポリシーを読み、同意したことを認めます。",
"api-key-can-not-be-empty": "APIキーは空にできません",
"api-host-can-not-be-empty": "APIホストは空にできません",
"model-type-can-not-be-empty": "モデルタイプは空にできません!",
@ -86,6 +84,7 @@
"data-privacy-description": "Eigentはプライバシーを確保するためにローカルファーストの原則に基づいて構築されています。デフォルトでは、データはお客様のデバイスに残ります。クラウド機能はオプションであり、機能するために必要な最小限のデータのみを使用します。詳細については、当社の",
"privacy-policy": "プライバシーポリシー",
"how-we-handle-your-data": "データの取り扱い方法",
"we-only-use-the-essential-data-needed-to-run-your-tasks": "タスクを実行するために必要な最小限のデータのみを使用します",
"how-we-handle-your-data-line-1": "タスクを実行するために必要な最小限のデータのみを使用します",
"how-we-handle-your-data-line-1-line-1": "Eigentは、UI要素を分析し、テキストを読み取り、次のアクションを決定するために、お客様が行うのと同じようにスクリーンショットをキャプチャする場合があります。",
"how-we-handle-your-data-line-1-line-2": "Eigentは、指定したローカルソフトウェアおよびファイルにアクセスするために、マウスとキーボードを使用する場合があります。",
@ -94,9 +93,6 @@
"how-we-handle-your-data-line-3": "認証情報はローカルに保存され、暗号化され、承認されたステップにのみ使用されます。",
"how-we-handle-your-data-line-4": "お客様の明示的な同意なしに、お客様のデータが当社のAIモデルのトレーニングに使用されることはありません。",
"how-we-handle-your-data-line-5": "お客様のデータを第三者に販売することはありません。",
"enable-privacy-permissions-settings": "プライバシー権限設定を有効にする",
"enable-privacy-permissions-settings-description": "これをオンにすることで、タスクデータの収集、処理、保護方法に関するプライバシーポリシーを読み、同意したことを認めます。",
"api-key-can-not-be-empty": "APIキーは空にできません",
"api-host-can-not-be-empty": "APIホストは空にできません",
"model-type-can-not-be-empty": "モデルタイプは空にできません!",
@ -180,14 +176,7 @@
"warning-google-search-not-configured": "警告Google検索が設定されていません",
"search-functionality-may-be-limited-without-google-api": "Google APIキーと検索エンジンIDがないと、検索機能が制限される可能性があります。MCP & ツール設定でこれらを設定できます。",
"search-engine": "検索エンジン",
"allow-agent-to-take-screenshots": "エージェントにスクリーンショットを撮ることを許可",
"allow-agent-to-take-screenshots-description": "エージェントがコンピューター画面のスクリーンショットをキャプチャすることを許可します。これは、サポート、診断、または監視目的で使用できます。スクリーンショットには個人情報が含まれる可能性があるため、注意して有効にしてください。",
"allow-agent-to-access-local-software": "エージェントにローカルソフトウェアへのアクセスを許可",
"allow-agent-to-access-local-software-description": "エージェントに、ローカルマシンにインストールされたソフトウェアと対話し、使用する権限を付与します。これは、トラブルシューティング、診断の実行、または特定のタスクの実行に必要になる場合があります。",
"allow-agent-to-access-your-address": "エージェントにあなたの住所へのアクセスを許可",
"allow-agent-to-access-your-address-description": "エージェントがあなたの場所や住所の詳細を表示し、使用することを許可します。これは、位置ベースのサービスやパーソナライズされたサポートに必要になる場合があります。",
"password-storage": "パスワードストレージ",
"password-storage-description": "パスワードの処理と保存方法を決定します。デバイス上またはアプリケーション内でパスワードを安全に保存するか、毎回手動で入力するかを選択できます。保存されたすべてのパスワードは暗号化されています。",
"notion-mcp-installed-successfully": "Notion MCPが正常にインストールされました",
"failed-to-install-notion-mcp": "Notion MCPのインストールに失敗しました",
"google-calendar-installed-successfully": "Googleカレンダーが正常にインストールされました",
@ -260,5 +249,11 @@
"proxy-saved-restart-required": "プロキシ設定が保存されました。変更を適用するにはアプリを再起動してください。",
"proxy-save-failed": "プロキシ設定の保存に失敗しました。",
"proxy-invalid-url": "無効なプロキシURLです。http://、https://、socks4://、またはsocks5://で始まる必要があります。",
"proxy-restart-hint": "プロキシの変更を適用するには再起動が必要です。"
"proxy-restart-hint": "プロキシの変更を適用するには再起動が必要です。",
"preferred-ide": "優先IDE",
"preferred-ide-description": "エージェントプロジェクトフォルダを開くときに使用するアプリケーションを選択します。",
"system-file-manager": "システムファイルマネージャー",
"help-improve-eigent": "Eigentの改善に協力する",
"help-improve-eigent-description": "サービス向上のため、Eigentが匿名のエラーログと使用状況データを収集することを許可します。これは任意であり、いつでも変更できます。"
}

View file

@ -97,17 +97,6 @@
"close-notice": "알림 닫기",
"a-task-is-currently-running": "작업이 현재 실행 중입니다. 종료하면 작업이 중단됩니다. 종료하시겠습니까?",
"yes": "예",
"turn-on-all-privacy-settings": "모든 개인정보 보호 설정을 켜서 Eigent 사용 시작",
"eigent-is-a-desktop-software": "Eigent는 데스크톱 소프트웨어로, 작업을 시작하기 위해 컴퓨터의 브라우저, 터미널 도구를 조작합니다. 전체 기능을 위해 Eigent 사용을 시작하기 전에 모든 필요한 개인정보 보호 설정이 활성화되어 있는지 확인하는 것이 중요합니다.",
"allow-agent-to-take-screenshots": "에이전트 스크린샷 촬영 허용",
"permit-the-agent-to-capture": "에이전트가 컴퓨터 화면의 스크린샷을 캡처할 수 있도록 허용합니다. 이는 지원, 진단 또는 모니터링 목적으로 사용될 수 있습니다. 스크린샷에는 보이는 개인 정보가 포함될 수 있으므로 주의해서 활성화하세요.",
"allow-agent-to-access-local-software": "에이전트 로컬 소프트웨어 액세스 허용",
"grant-the-agent-permission": "에이전트가 로컬 머신에 설치된 소프트웨어와 상호 작용하고 사용할 수 있는 권한을 부여합니다. 문제 해결, 진단 실행 또는 특정 작업 수행에 필요할 수 있습니다.",
"allow-agent-to-access-your-address": "에이전트 주소 액세스 허용",
"authorize-the-agent-to-view": "에이전트가 위치 또는 주소 세부 정보를 보고 사용할 수 있도록 승인합니다. 위치 기반 서비스 또는 개인화된 지원에 필요할 수 있습니다.",
"password-storage": "비밀번호 저장",
"determine-how-passwords-are-handled": "비밀번호가 처리되고 저장되는 방식을 결정합니다. 장치나 애플리케이션 내에서 비밀번호를 안전하게 저장하거나 매번 수동으로 입력하도록 선택할 수 있습니다. 모든 저장된 비밀번호는 암호화됩니다.",
"turn-on-all-and-finish": "모두 켜고 완료",
"search": "검색",
"are-you-sure-you-want-to-delete": "이 작업을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.",
"share": "공유",

View file

@ -23,6 +23,7 @@
"data-privacy-description": "Eigent는 개인정보 보호를 위해 로컬 우선 원칙을 기반으로 구축되었습니다. 기본적으로 데이터는 사용자의 기기에 남아 있습니다. 클라우드 기능은 선택 사항이며 작동에 필요한 최소한의 데이터만 사용합니다. 자세한 내용은 당사의",
"privacy-policy": "개인정보 처리방침",
"how-we-handle-your-data": "데이터 처리 방식",
"we-only-use-the-essential-data-needed-to-run-your-tasks": "작업 실행에 필요한 필수 데이터만 사용합니다",
"how-we-handle-your-data-line-1": "작업 실행에 필요한 필수 데이터만 사용합니다",
"how-we-handle-your-data-line-1-line-1": "Eigent는 UI 요소를 분석하고 텍스트를 읽고 다음 작업을 결정하기 위해 스크린샷을 캡처할 수 있습니다. 사용자가 하는 방식과 같습니다.",
"how-we-handle-your-data-line-1-line-2": "Eigent는 사용자가 지정한 로컬 소프트웨어 및 파일에 액세스하기 위해 마우스와 키보드를 사용할 수 있습니다.",
@ -31,9 +32,6 @@
"how-we-handle-your-data-line-3": "자격 증명은 로컬에 암호화되어 저장되며 승인된 단계에만 사용됩니다.",
"how-we-handle-your-data-line-4": "귀하의 명시적인 동의 없이 귀하의 데이터는 당사 AI 모델을 학습시키는 데 사용되지 않습니다.",
"how-we-handle-your-data-line-5": "귀하의 데이터를 제3자에게 판매하지 않습니다.",
"enable-privacy-permissions-settings": "개인정보 보호 설정 활성화",
"enable-privacy-permissions-settings-description": "이 설정을 켜면 작업 데이터가 수집, 처리 및 보호되는 방식에 관한 개인정보 처리방침을 읽었으며 이에 동의했음을 인정하는 것입니다.",
"api-key-can-not-be-empty": "API 키는 비워둘 수 없습니다!",
"api-host-can-not-be-empty": "API 호스트는 비워둘 수 없습니다!",
"model-type-can-not-be-empty": "모델 유형은 비워둘 수 없습니다!",
@ -86,6 +84,7 @@
"data-privacy-description": "Eigent는 개인정보 보호를 위해 로컬 우선 원칙을 기반으로 구축되었습니다. 기본적으로 데이터는 사용자의 기기에 남아 있습니다. 클라우드 기능은 선택 사항이며 작동에 필요한 최소한의 데이터만 사용합니다. 자세한 내용은 당사의",
"privacy-policy": "개인정보 처리방침",
"how-we-handle-your-data": "데이터 처리 방식",
"we-only-use-the-essential-data-needed-to-run-your-tasks": "작업 실행에 필요한 필수 데이터만 사용합니다",
"how-we-handle-your-data-line-1": "작업 실행에 필요한 필수 데이터만 사용합니다",
"how-we-handle-your-data-line-1-line-1": "Eigent는 UI 요소를 분석하고 텍스트를 읽고 다음 작업을 결정하기 위해 스크린샷을 캡처할 수 있습니다. 사용자가 하는 방식과 같습니다.",
"how-we-handle-your-data-line-1-line-2": "Eigent는 사용자가 지정한 로컬 소프트웨어 및 파일에 액세스하기 위해 마우스와 키보드를 사용할 수 있습니다.",
@ -94,9 +93,6 @@
"how-we-handle-your-data-line-3": "자격 증명은 로컬에 암호화되어 저장되며 승인된 단계에만 사용됩니다.",
"how-we-handle-your-data-line-4": "귀하의 명시적인 동의 없이 귀하의 데이터는 당사 AI 모델을 학습시키는 데 사용되지 않습니다.",
"how-we-handle-your-data-line-5": "귀하의 데이터를 제3자에게 판매하지 않습니다.",
"enable-privacy-permissions-settings": "개인정보 보호 설정 활성화",
"enable-privacy-permissions-settings-description": "이 설정을 켜면 작업 데이터가 수집, 처리 및 보호되는 방식에 관한 개인정보 처리방침을 읽었으며 이에 동의했음을 인정하는 것입니다.",
"api-key-can-not-be-empty": "API 키는 비워둘 수 없습니다!",
"api-host-can-not-be-empty": "API 호스트는 비워둘 수 없습니다!",
"model-type-can-not-be-empty": "모델 유형은 비워둘 수 없습니다!",
@ -180,14 +176,7 @@
"warning-google-search-not-configured": "경고: Google 검색이 구성되지 않음",
"search-functionality-may-be-limited-without-google-api": "Google API 키와 검색 엔진 ID가 없으면 검색 기능이 제한될 수 있습니다. MCP 및 도구 설정에서 이를 구성할 수 있습니다.",
"search-engine": "검색 엔진",
"allow-agent-to-take-screenshots": "에이전트 스크린샷 촬영 허용",
"allow-agent-to-take-screenshots-description": "에이전트가 컴퓨터 화면의 스크린샷을 캡처할 수 있도록 허용합니다. 이는 지원, 진단 또는 모니터링 목적으로 사용될 수 있습니다. 스크린샷에는 보이는 개인 정보가 포함될 수 있으므로 주의해서 활성화하세요.",
"allow-agent-to-access-local-software": "에이전트 로컬 소프트웨어 액세스 허용",
"allow-agent-to-access-local-software-description": "에이전트가 로컬 머신에 설치된 소프트웨어와 상호 작용하고 사용할 수 있는 권한을 부여합니다. 문제 해결, 진단 실행 또는 특정 작업 수행에 필요할 수 있습니다.",
"allow-agent-to-access-your-address": "에이전트 주소 액세스 허용",
"allow-agent-to-access-your-address-description": "에이전트가 위치 또는 주소 세부 정보를 보고 사용할 수 있도록 승인합니다. 위치 기반 서비스 또는 개인화된 지원에 필요할 수 있습니다.",
"password-storage": "비밀번호 저장",
"password-storage-description": "비밀번호가 처리되고 저장되는 방식을 결정합니다. 장치나 애플리케이션 내에서 비밀번호를 안전하게 저장하거나 매번 수동으로 입력하도록 선택할 수 있습니다. 모든 저장된 비밀번호는 암호화됩니다.",
"notion-mcp-installed-successfully": "Notion MCP가 성공적으로 설치되었습니다",
"failed-to-install-notion-mcp": "Notion MCP 설치에 실패했습니다",
"google-calendar-installed-successfully": "Google Calendar가 성공적으로 설치되었습니다",
@ -260,5 +249,11 @@
"proxy-saved-restart-required": "프록시 설정이 저장되었습니다. 변경 사항을 적용하려면 앱을 다시 시작하세요.",
"proxy-save-failed": "프록시 설정 저장에 실패했습니다.",
"proxy-invalid-url": "잘못된 프록시 URL입니다. http://, https://, socks4://, 또는 socks5://로 시작해야 합니다.",
"proxy-restart-hint": "프록시 변경 사항을 적용하려면 다시 시작해야 합니다."
"proxy-restart-hint": "프록시 변경 사항을 적용하려면 다시 시작해야 합니다.",
"preferred-ide": "선호 IDE",
"preferred-ide-description": "에이전트 프로젝트 폴더를 열 때 사용할 애플리케이션을 선택합니다.",
"system-file-manager": "시스템 파일 관리자",
"help-improve-eigent": "Eigent 개선에 도움주기",
"help-improve-eigent-description": "서비스 개선을 위해 Eigent가 익명의 오류 로그와 사용 데이터를 수집하도록 허용합니다. 이는 선택 사항이며 언제든지 변경할 수 있습니다."
}

View file

@ -97,17 +97,6 @@
"close-notice": "Закрыть уведомление",
"a-task-is-currently-running": "В настоящее время выполняется задача. Выход завершит её. Вы уверены, что хотите выйти?",
"yes": "Да",
"turn-on-all-privacy-settings": "Включить все настройки конфиденциальности для начала использования Eigent",
"eigent-is-a-desktop-software": "Eigent — это настольное программное обеспечение, которое будет управлять браузером, терминальными инструментами с вашего компьютера для запуска задач. Важно убедиться, что все необходимые настройки конфиденциальности включены перед началом использования Eigent для полной функциональности.",
"allow-agent-to-take-screenshots": "Разрешить агенту делать скриншоты",
"permit-the-agent-to-capture": "Разрешить агенту захватывать скриншоты экрана вашего компьютера. Это может использоваться для поддержки, диагностики или мониторинга. Скриншоты могут содержать видимую личную информацию, поэтому включайте с осторожностью.",
"allow-agent-to-access-local-software": "Разрешить агенту доступ к локальному программному обеспечению",
"grant-the-agent-permission": "Предоставить агенту разрешение на взаимодействие с программным обеспечением, установленным на вашей локальной машине. Это может быть необходимо для устранения неполадок, запуска диагностики или выполнения определенных задач.",
"allow-agent-to-access-your-address": "Разрешить агенту доступ к вашему адресу",
"authorize-the-agent-to-view": "Авторизовать агента для просмотра и использования ваших данных о местоположении или адресе. Это может потребоваться для услуг на основе местоположения или персонализированной поддержки.",
"password-storage": "Хранение паролей",
"determine-how-passwords-are-handled": "Определить, как обрабатываются и хранятся пароли. Вы можете выбрать безопасное хранение паролей на устройстве или в приложении, или отказаться от этого, чтобы вводить их вручную каждый раз. Все сохраненные пароли зашифрованы.",
"turn-on-all-and-finish": "Включить все и завершить",
"search": "Поиск",
"are-you-sure-you-want-to-delete": "Вы уверены, что хотите удалить эту задачу? Это действие нельзя отменить.",
"share": "Поделиться",

View file

@ -23,6 +23,7 @@
"data-privacy-description": "Eigent построен по принципу \"сначала локально\", чтобы обеспечить вашу конфиденциальность. Ваши данные по умолчанию остаются на вашем устройстве. Облачные функции являются необязательными и используют только минимальные необходимые данные для функционирования. Полные сведения см. в нашей",
"privacy-policy": "Политике конфиденциальности",
"how-we-handle-your-data": "Как мы обрабатываем ваши данные",
"we-only-use-the-essential-data-needed-to-run-your-tasks": "Мы используем только необходимые данные для выполнения ваших задач",
"how-we-handle-your-data-line-1": "Мы используем только необходимые данные для выполнения ваших задач",
"how-we-handle-your-data-line-1-line-1": "Eigent может делать снимки экрана для анализа элементов пользовательского интерфейса, чтения текста и определения следующего действия, точно так же, как это сделали бы вы.",
"how-we-handle-your-data-line-1-line-2": "Eigent может использовать вашу мышь и клавиатуру для доступа к локальному программному обеспечению и файлам, которые вы указываете.",
@ -31,9 +32,6 @@
"how-we-handle-your-data-line-3": "Учетные данные хранятся локально, зашифрованы и используются только для одобренных шагов.",
"how-we-handle-your-data-line-4": "Ваши данные никогда не используются для обучения наших моделей ИИ без вашего явного согласия.",
"how-we-handle-your-data-line-5": "Мы не продаем ваши данные третьим лицам.",
"enable-privacy-permissions-settings": "Включить настройки разрешений конфиденциальности",
"enable-privacy-permissions-settings-description": "Включив эту опцию, вы подтверждаете, что прочитали и согласны с нашей Политикой конфиденциальности в отношении того, как ваши данные задачи собираются, обрабатываются и защищаются.",
"api-key-can-not-be-empty": "API-ключ не может быть пустым!",
"api-host-can-not-be-empty": "API-хост не может быть пустым!",
"model-type-can-not-be-empty": "Тип модели не может быть пустым!",
@ -86,6 +84,7 @@
"data-privacy-description": "Eigent построен по принципу \"сначала локально\", чтобы обеспечить вашу конфиденциальность. Ваши данные по умолчанию остаются на вашем устройстве. Облачные функции являются необязательными и используют только минимальные необходимые данные для функционирования. Полные сведения см. в нашей",
"privacy-policy": "Политике конфиденциальности",
"how-we-handle-your-data": "Как мы обрабатываем ваши данные",
"we-only-use-the-essential-data-needed-to-run-your-tasks": "Мы используем только необходимые данные для выполнения ваших задач",
"how-we-handle-your-data-line-1": "Мы используем только необходимые данные для выполнения ваших задач",
"how-we-handle-your-data-line-1-line-1": "Eigent может делать снимки экрана для анализа элементов пользовательского интерфейса, чтения текста и определения следующего действия, точно так же, как это сделали бы вы.",
"how-we-handle-your-data-line-1-line-2": "Eigent может использовать вашу мышь и клавиатуру для доступа к локальному программному обеспечению и файлам, которые вы указываете.",
@ -94,9 +93,6 @@
"how-we-handle-your-data-line-3": "Учетные данные хранятся локально, зашифрованы и используются только для одобренных шагов.",
"how-we-handle-your-data-line-4": "Ваши данные никогда не используются для обучения наших моделей ИИ без вашего явного согласия.",
"how-we-handle-your-data-line-5": "Мы не продаем ваши данные третьим лицам.",
"enable-privacy-permissions-settings": "Включить настройки разрешений конфиденциальности",
"enable-privacy-permissions-settings-description": "Включив эту опцию, вы подтверждаете, что прочитали и согласны с нашей Политикой конфиденциальности в отношении того, как ваши данные задачи собираются, обрабатываются и защищаются.",
"api-key-can-not-be-empty": "API-ключ не может быть пустым!",
"api-host-can-not-be-empty": "API-хост не может быть пустым!",
"model-type-can-not-be-empty": "Тип модели не может быть пустым!",
@ -179,14 +175,7 @@
"warning-google-search-not-configured": "Предупреждение: Google поиск не настроен",
"search-functionality-may-be-limited-without-google-api": "Функциональность поиска может быть ограничена без ключа Google API и ID поисковой системы. Вы можете настроить их в настройках MCP и инструментов.",
"search-engine": "Поисковая система",
"allow-agent-to-take-screenshots": "Разрешить агенту делать скриншоты",
"allow-agent-to-take-screenshots-description": "Разрешить агенту захватывать скриншоты экрана вашего компьютера. Это может использоваться для поддержки, диагностики или мониторинга. Скриншоты могут содержать видимую личную информацию, поэтому включайте с осторожностью.",
"allow-agent-to-access-local-software": "Разрешить агенту доступ к локальному программному обеспечению",
"allow-agent-to-access-local-software-description": "Предоставить агенту разрешение на взаимодействие с программным обеспечением, установленным на вашей локальной машине. Это может быть необходимо для устранения неполадок, запуска диагностики или выполнения определенных задач.",
"allow-agent-to-access-your-address": "Разрешить агенту доступ к вашему адресу",
"allow-agent-to-access-your-address-description": "Авторизовать агента для просмотра и использования ваших данных о местоположении или адресе. Это может потребоваться для услуг на основе местоположения или персонализированной поддержки.",
"password-storage": "Хранение паролей",
"password-storage-description": "Определить, как обрабатываются и хранятся пароли. Вы можете выбрать безопасное хранение паролей на устройстве или в приложении, или отказаться от этого, чтобы вводить их вручную каждый раз. Все сохраненные пароли зашифрованы.",
"notion-mcp-installed-successfully": "Notion MCP успешно установлен",
"failed-to-install-notion-mcp": "Не удалось установить Notion MCP",
"google-calendar-installed-successfully": "Google Calendar успешно установлен",
@ -259,5 +248,11 @@
"proxy-saved-restart-required": "Конфигурация прокси сохранена. Перезапустите приложение для применения изменений.",
"proxy-save-failed": "Не удалось сохранить конфигурацию прокси.",
"proxy-invalid-url": "Недопустимый URL прокси. Должен начинаться с http://, https://, socks4:// или socks5://.",
"proxy-restart-hint": "Для применения изменений прокси требуется перезапуск."
"proxy-restart-hint": "Для применения изменений прокси требуется перезапуск.",
"preferred-ide": "Предпочитаемая IDE",
"preferred-ide-description": "Выберите приложение для открытия папок проектов агента.",
"system-file-manager": "Системный файловый менеджер",
"help-improve-eigent": "Помогите улучшить Eigent",
"help-improve-eigent-description": "Разрешите Eigent собирать анонимные журналы ошибок и данные об использовании для улучшения сервиса. Это необязательно и может быть изменено в любое время."
}

View file

@ -99,17 +99,6 @@
"close-notice": "关闭通知",
"a-task-is-currently-running": "任务当前正在运行。退出将终止它。您确定要退出吗?",
"yes": "是",
"turn-on-all-privacy-settings": "开启所有隐私设置以开始使用 Eigent",
"eigent-is-a-desktop-software": "Eigent 是桌面软件,它将操作您计算机上的浏览器、终端工具来启动任务。在开始使用 Eigent 之前,确保所有必要的隐私设置都已启用以获得完整功能非常重要。",
"allow-agent-to-take-screenshots": "允许智能体截屏",
"permit-the-agent-to-capture": "允许智能体捕获您计算机屏幕的截图。这可用于支持、诊断或监控目的。截图可能包含可见的个人信息,请谨慎启用。",
"allow-agent-to-access-local-software": "允许智能体访问本地软件",
"grant-the-agent-permission": "授予智能体与您本地机器上安装的软件交互和使用的权限。这对于故障排除、运行诊断或执行特定任务可能是必要的。",
"allow-agent-to-access-your-address": "允许智能体访问您的地址",
"authorize-the-agent-to-view": "授权智能体查看和使用您的位置或地址详细信息。这对于基于位置的服务或个性化支持可能是必需的。",
"password-storage": "密码存储",
"determine-how-passwords-are-handled": "确定如何处理和存储密码。您可以选择在设备或应用程序中安全存储密码,或选择每次手动输入。所有存储的密码都经过加密。",
"turn-on-all-and-finish": "全部开启并完成",
"search": "搜索",
"are-you-sure-you-want-to-delete": "您确定要删除此任务吗?此操作无法撤销。",
"share": "分享",

View file

@ -33,9 +33,6 @@
"how-we-handle-your-data-line-3": "凭据存储在本地,加密,仅用于批准的步骤。",
"how-we-handle-your-data-line-4": "您的数据永远不会用于训练我们的 AI 模型,除非您明确同意。",
"how-we-handle-your-data-line-5": "我们不会出售您的数据给第三方。",
"enable-privacy-permissions-settings": "启用隐私权限设置",
"enable-privacy-permissions-settings-description": "通过打开此功能,您承认已阅读并同意我们的隐私政策,关于您的任务数据如何被收集、处理和保护。",
"api-key-can-not-be-empty": "API Key 不能为空!",
"api-host-can-not-be-empty": "API Host 不能为空!",
"model-type-can-not-be-empty": "Model Type 不能为空!",
@ -117,14 +114,7 @@
"warning-google-search-not-configured": "警告Google 搜索未配置",
"search-functionality-may-be-limited-without-google-api": "没有 Google API 密钥和搜索引擎 ID搜索功能可能受限。您可以在 MCP & 工具设置中配置这些。",
"search-engine": "搜索引擎",
"allow-agent-to-take-screenshots": "允许智能体截屏",
"allow-agent-to-take-screenshots-description": "允许智能体捕获您计算机屏幕的截图。这可用于支持、诊断或监控目的。截图可能包含可见的个人信息,请谨慎启用。",
"allow-agent-to-access-local-software": "允许智能体访问本地软件",
"allow-agent-to-access-local-software-description": "授予智能体与您本地机器上安装的软件交互和使用的权限。这对于故障排除、运行诊断或执行特定任务可能是必要的。",
"allow-agent-to-access-your-address": "允许智能体访问您的地址",
"allow-agent-to-access-your-address-description": "授权智能体查看和使用您的位置或地址详细信息。这对于基于位置的服务或个性化支持可能是必需的。",
"password-storage": "密码存储",
"password-storage-description": "确定如何处理和存储密码。您可以选择在设备或应用程序中安全存储密码,或选择每次手动输入。所有存储的密码都经过加密。",
"notion-mcp-installed-successfully": "Notion MCP 安装成功",
"failed-to-install-notion-mcp": "Notion MCP 安装失败",
"google-calendar-installed-successfully": "Google Calendar 安装成功",
@ -209,5 +199,11 @@
"gpt-5.4-name": "GPT-5.4",
"gpt-5-mini-name": "GPT-5 Mini",
"claude-sonnet-4-5-name": "Claude Sonnet 4-5",
"minimax-m2-5-name": "Minimax M2.5"
"minimax-m2-5-name": "Minimax M2.5",
"preferred-ide": "首选 IDE",
"preferred-ide-description": "选择打开智能体项目文件夹时使用的应用程序。",
"system-file-manager": "系统文件管理器",
"help-improve-eigent": "帮助改进 Eigent",
"help-improve-eigent-description": "允许 Eigent 收集匿名错误日志和使用数据以改进服务。此项为可选,可随时更改。"
}

View file

@ -99,17 +99,6 @@
"close-notice": "關閉通知",
"a-task-is-currently-running": "任務目前正在執行。退出將終止它。您確定要退出嗎?",
"yes": "是",
"turn-on-all-privacy-settings": "開啟所有隱私設定以開始使用 Eigent",
"eigent-is-a-desktop-software": "Eigent 是桌面軟體,它將操作您電腦上的瀏覽器、終端工具來啟動任務。在開始使用 Eigent 之前,確保所有必要的隱私設定都已啟用以獲得完整功能非常重要。",
"allow-agent-to-take-screenshots": "允許智能體截圖",
"permit-the-agent-to-capture": "允許智能體擷取您電腦螢幕的截圖。這可用於支援、診斷或監控目的。截圖可能包含可見的個人資訊,請謹慎啟用。",
"allow-agent-to-access-local-software": "允許智能體存取本地軟體",
"grant-the-agent-permission": "授予智能體與您本地機器上安裝的軟體互動和使用的權限。這對於故障排除、執行診斷或執行特定任務可能是必要的。",
"allow-agent-to-access-your-address": "允許智能體存取您的地址",
"authorize-the-agent-to-view": "授權智能體檢視和使用您的位置或地址詳細資訊。這對於基於位置的服務或個人化支援可能是必需的。",
"password-storage": "密碼儲存",
"determine-how-passwords-are-handled": "確定如何處理和儲存密碼。您可以選擇在裝置或應用程式中安全儲存密碼,或選擇每次手動輸入。所有儲存的密碼都經過加密。",
"turn-on-all-and-finish": "全部開啟並完成",
"search": "搜尋",
"are-you-sure-you-want-to-delete": "您確定要刪除此任務嗎?此操作無法撤銷。",
"share": "分享",

View file

@ -30,9 +30,6 @@
"how-we-handle-your-data-line-3": "憑證儲存在本地,經過加密,僅用於核准的步驟。",
"how-we-handle-your-data-line-4": "您的數據永遠不會用於訓練我們的 AI 模型,除非您明確同意。",
"how-we-handle-your-data-line-5": "我們不會將您的數據出售給第三方。",
"enable-privacy-permissions-settings": "啟用隱私權限設定",
"enable-privacy-permissions-settings-description": "透過啟用此功能,您即表示已閱讀並同意我們的隱私權政策,關於您的任務數據如何被收集、處理和保護。",
"api-key-can-not-be-empty": "API 金鑰不可為空!",
"api-host-can-not-be-empty": "API Host 不可為空!",
"model-type-can-not-be-empty": "模型類型不可為空!",
@ -115,14 +112,7 @@
"warning-google-search-not-configured": "警告Google 搜尋未設定",
"search-functionality-may-be-limited-without-google-api": "沒有 Google API 金鑰和搜尋引擎 ID搜尋功能可能受限。您可以在 MCP & 工具設定中設定這些。",
"search-engine": "搜尋引擎",
"allow-agent-to-take-screenshots": "允許智能體截圖",
"allow-agent-to-take-screenshots-description": "允許智能體擷取您電腦螢幕的截圖。這可用於支援、診斷或監控目的。截圖可能包含可見的個人資訊,請謹慎啟用。",
"allow-agent-to-access-local-software": "允許智能體存取本地軟體",
"allow-agent-to-access-local-software-description": "授予智能體與您本地機器上安裝的軟體互動和使用的權限。這對於故障排除、執行診斷或執行特定任務可能是必要的。",
"allow-agent-to-access-your-address": "允許智能體存取您的地址",
"allow-agent-to-access-your-address-description": "授權智能體檢視和使用您的位置或地址詳細資訊。這對於基於位置的服務或個人化支援可能是必需的。",
"password-storage": "密碼儲存",
"password-storage-description": "確定如何處理和儲存密碼。您可以選擇在裝置或應用程式中安全儲存密碼,或選擇每次手動輸入。所有儲存的密碼都經過加密。",
"notion-mcp-installed-successfully": "Notion MCP 安裝成功",
"failed-to-install-notion-mcp": "Notion MCP 安裝失敗",
"google-calendar-installed-successfully": "Google Calendar 安裝成功",
@ -188,5 +178,10 @@
"proxy-saved-restart-required": "代理設定已儲存。請重新啟動應用程式以套用變更。",
"proxy-save-failed": "儲存代理設定失敗。",
"proxy-invalid-url": "無效的代理 URL。必須以 http://、https://、socks4:// 或 socks5:// 開頭。",
"proxy-restart-hint": "需要重新啟動應用程式以套用代理變更。"
"proxy-restart-hint": "需要重新啟動應用程式以套用代理變更。",
"preferred-ide": "偏好 IDE",
"preferred-ide-description": "選擇開啟智能體專案資料夾時使用的應用程式。",
"system-file-manager": "系統檔案管理器",
"help-improve-eigent": "幫助改進 Eigent",
"help-improve-eigent-description": "允許 Eigent 收集匿名錯誤日誌和使用數據以改進服務。此項為可選,可隨時更改。"
}

View file

@ -486,19 +486,6 @@ export default function Login() {
</span>
</Button>
</div>
<Button
variant="ghost"
size="xs"
onClick={() =>
window.open(
'https://www.eigent.ai/privacy-policy',
'_blank',
'noopener,noreferrer'
)
}
>
{t('layout.privacy-policy')}
</Button>
</div>
</div>
</div>

View file

@ -15,118 +15,29 @@
import { proxyFetchGet, proxyFetchPut } from '@/api/http';
import { Button } from '@/components/ui/button';
import { Switch } from '@/components/ui/switch';
import { useAuthStore } from '@/store/authStore';
import { ChevronDown } from 'lucide-react';
import { useEffect, useMemo, useState } from 'react';
import { useEffect, useState } from 'react';
import { useTranslation } from 'react-i18next';
export default function SettingPrivacy() {
const { email } = useAuthStore();
const [_privacy, setPrivacy] = useState(false);
const [helpImprove, setHelpImprove] = useState(false);
const { t } = useTranslation();
const API_FIELDS = useMemo(
() => [
'take_screenshot',
'access_local_software',
'access_your_address',
'password_storage',
],
[]
);
const [settings, setSettings] = useState([
{
title: t('setting.allow-agent-to-take-screenshots'),
description: t('setting.allow-agent-to-take-screenshots-description'),
checked: false,
},
{
title: t('setting.allow-agent-to-access-local-software'),
description: t(
'setting.allow-agent-to-access-local-software-description'
),
checked: false,
},
{
title: t('setting.allow-agent-to-access-your-address'),
description: t('setting.allow-agent-to-access-your-address-description'),
checked: false,
},
{
title: t('setting.password-storage'),
description: t('setting.password-storage-description'),
checked: false,
},
]);
const [isHowWeHandleOpen, setIsHowWeHandleOpen] = useState(false);
useEffect(() => {
proxyFetchGet('/api/user/privacy')
.then((res) => {
setSettings((prev) =>
prev.map((item, index) => ({
...item,
checked: res[API_FIELDS[index]] || false,
}))
);
setPrivacy(res.all_required_granted);
setHelpImprove(res.help_improve || false);
})
.catch((err) => console.error('Failed to fetch settings:', err));
}, [API_FIELDS]);
}, []);
const handleTurnOnAll = (type: boolean) => {
const newSettings = settings.map((item) => ({
...item,
checked: type,
}));
setSettings(newSettings);
setPrivacy(type);
const requestData = {
[API_FIELDS[0]]: type,
[API_FIELDS[1]]: type,
[API_FIELDS[2]]: type,
[API_FIELDS[3]]: type,
};
proxyFetchPut('/api/user/privacy', requestData);
};
const _handleToggle = (index: number) => {
setSettings((prev) => {
const newSettings = [...prev];
newSettings[index] = {
...newSettings[index],
checked: !newSettings[index].checked,
};
return newSettings;
});
const requestData = {
[API_FIELDS[0]]: settings[0].checked,
[API_FIELDS[1]]: settings[1].checked,
[API_FIELDS[2]]: settings[2].checked,
[API_FIELDS[3]]: settings[3].checked,
};
requestData[API_FIELDS[index]] = !settings[index].checked;
proxyFetchPut('/api/user/privacy', requestData).catch((err) =>
const handleToggleHelpImprove = (checked: boolean) => {
setHelpImprove(checked);
proxyFetchPut('/api/user/privacy', { help_improve: checked }).catch((err) =>
console.error('Failed to update settings:', err)
);
};
const [logFolder, setLogFolder] = useState('');
const [isHowWeHandleOpen, setIsHowWeHandleOpen] = useState(false);
useEffect(() => {
window.ipcRenderer
.invoke('get-log-folder', email)
.then((logFolder: any) => {
setLogFolder(logFolder);
});
}, [email]);
const _handleOpenFolder = () => {
if (logFolder) {
window.ipcRenderer.invoke('reveal-in-folder', logFolder + '/');
}
};
return (
<div className="m-auto h-auto w-full flex-1">
{/* Header Section */}
@ -200,21 +111,21 @@ export default function SettingPrivacy() {
)}
</div>
{/* Enable Privacy Permissions Settings Section */}
{/* Help Improve Eigent Section */}
<div className="rounded-2xl bg-surface-secondary px-6 py-4">
<div className="flex items-center justify-between gap-md">
<div className="flex flex-col gap-2">
<div className="text-body-base font-bold text-text-heading">
{t('setting.enable-privacy-permissions-settings')}
{t('setting.help-improve-eigent')}
</div>
<div className="text-body-sm font-normal text-text-body">
{t('setting.enable-privacy-permissions-settings-description')}
{t('setting.help-improve-eigent-description')}
</div>
</div>
<div className="flex items-center justify-center">
<Switch
checked={_privacy}
onCheckedChange={() => handleTurnOnAll(!_privacy)}
checked={helpImprove}
onCheckedChange={handleToggleHelpImprove}
/>
</div>
</div>

View file

@ -434,19 +434,6 @@ export default function SignUp() {
</span>
</Button>
</div>
<Button
variant="ghost"
size="xs"
onClick={() =>
window.open(
'https://www.eigent.ai/privacy-policy',
'_blank',
'noopener,noreferrer'
)
}
>
{t('layout.privacy-policy')}
</Button>
</div>
</div>
</div>

View file

@ -16,7 +16,7 @@ import { create } from 'zustand';
import { persist } from 'zustand/middleware';
// type definition
type InitState = 'permissions' | 'carousel' | 'done';
type InitState = 'carousel' | 'done';
type ModelType = 'cloud' | 'local' | 'custom';
type PreferredIDE = 'vscode' | 'cursor' | 'system';
type CloudModelType =
@ -109,7 +109,7 @@ const authStore = create<AuthState>()(
modelType: 'cloud',
cloud_model_type: getRandomDefaultModel(),
preferredIDE: 'system',
initState: 'permissions',
initState: 'carousel',
share_token: null,
localProxyValue: null,
workerListData: {},

View file

@ -455,33 +455,23 @@ describe('ChatBox Integration Tests - Different ChatStore Configurations', () =>
expect(sendButton).toBeDisabled();
});
it('should display layout.terms-of-use and layout.privacy-policy links', async () => {
it('should not display privacy consent links (moved to login)', async () => {
render(
<TestWrapper>
<ChatBox />
</TestWrapper>
);
const termsLink = screen.getByRole('link', {
// Privacy consent links are now in Login/SignUp, not in ChatBox
const termsLink = screen.queryByRole('link', {
name: /layout.terms-of-use/i,
});
const privacyLink = screen.getByRole('link', {
const privacyLink = screen.queryByRole('link', {
name: /layout.privacy-policy/i,
});
expect(termsLink).toBeInTheDocument();
expect(termsLink).toHaveAttribute(
'href',
'https://www.eigent.ai/terms-of-use'
);
expect(termsLink).toHaveAttribute('target', '_blank');
expect(privacyLink).toBeInTheDocument();
expect(privacyLink).toHaveAttribute(
'href',
'https://www.eigent.ai/privacy-policy'
);
expect(privacyLink).toHaveAttribute('target', '_blank');
expect(termsLink).not.toBeInTheDocument();
expect(privacyLink).not.toBeInTheDocument();
});
});

View file

@ -25,7 +25,7 @@ vi.mock('../../src/store/authStore', () => ({
isFirstLaunch: true,
modelType: 'cloud' as const,
cloud_model_type: 'gpt-4.1' as const,
initState: 'permissions' as const,
initState: 'carousel' as const,
share_token: null,
workerListData: {},
},
@ -39,7 +39,7 @@ vi.mock('../../src/store/authStore', () => ({
isFirstLaunch: true,
modelType: 'cloud' as const,
cloud_model_type: 'gpt-4.1' as const,
initState: 'permissions' as const,
initState: 'carousel' as const,
share_token: null,
workerListData: {},
})),

View file

@ -17,24 +17,33 @@ import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import { BrowserRouter } from 'react-router-dom';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import * as fetchApi from '../../../src/api/http';
import {
fetchDelete,
fetchPost,
fetchPut,
proxyFetchDelete,
proxyFetchGet,
} from '../../../src/api/http';
import ChatBox from '../../../src/components/ChatBox/index';
import { useAuthStore } from '../../../src/store/authStore';
const { fetchPost, proxyFetchGet } = fetchApi;
// Mock dependencies (use the same relative paths as the imports above)
vi.mock('../../../src/store/authStore', () => ({ useAuthStore: vi.fn() }));
vi.mock('../../../src/api/http', () => ({
fetchPost: vi.fn(),
fetchPut: vi.fn(),
fetchDelete: vi.fn(),
proxyFetchGet: vi.fn(),
proxyFetchPut: vi.fn(),
proxyFetchDelete: vi.fn(),
}));
// Also mock the alias paths the component uses so the component picks up these mocks
vi.mock('@/store/authStore', () => ({ useAuthStore: vi.fn() }));
vi.mock('@/api/http', () => ({
fetchPost: vi.fn(),
fetchPut: vi.fn(),
fetchDelete: vi.fn(),
proxyFetchGet: vi.fn(),
proxyFetchPut: vi.fn(),
proxyFetchDelete: vi.fn(),
}));
vi.mock('../../../src/lib', () => ({
generateUniqueId: vi.fn(() => 'test-unique-id'),
@ -124,21 +133,13 @@ vi.mock('../../../src/components/ChatBox/TypeCardSkeleton', () => ({
TypeCardSkeleton: vi.fn(() => <div data-testid="skeleton">Loading...</div>),
}));
vi.mock('../../../src/components/Dialog/Privacy', () => ({
PrivacyDialog: vi.fn(({ open, onOpenChange }: any) =>
open ? (
<div data-testid="privacy-dialog">
Privacy Dialog
<button onClick={() => onOpenChange(false)}>Close</button>
</div>
) : null
),
}));
describe('ChatBox Component', async () => {
const mockUseAuthStore = vi.mocked(useAuthStore);
const mockFetchPost = vi.mocked(fetchPost);
const _mockFetchPost = vi.mocked(fetchPost);
const _mockFetchPut = vi.mocked(fetchPut);
const _mockFetchDelete = vi.mocked(fetchDelete);
const mockProxyFetchGet = vi.mocked(proxyFetchGet);
const _mockProxyFetchDelete = vi.mocked(proxyFetchDelete);
// Import the mocked hook
const mockUseChatStoreAdapter = vi.mocked(
@ -248,12 +249,8 @@ describe('ChatBox Component', async () => {
// Setup default API responses
mockProxyFetchGet.mockImplementation((url: string) => {
if (url === '/api/user/privacy') {
return Promise.resolve({
dataCollection: true,
analytics: true,
marketing: true,
});
if (url === '/api/user/key') {
return Promise.resolve({ value: 'test-api-key' });
}
if (url === '/api/configs') {
return Promise.resolve([
@ -264,7 +261,7 @@ describe('ChatBox Component', async () => {
return Promise.resolve({});
});
mockFetchPost.mockResolvedValue({ success: true });
_mockFetchPost.mockResolvedValue({ success: true });
// Mock import.meta.env
Object.defineProperty(import.meta, 'env', {
@ -299,11 +296,11 @@ describe('ChatBox Component', async () => {
expect(screen.getByTestId('bottom-box')).toBeInTheDocument();
});
it('should fetch privacy settings on mount', async () => {
it('should not fetch privacy settings on mount', async () => {
renderChatBox();
await waitFor(() => {
expect(mockProxyFetchGet).toHaveBeenCalledWith('/api/user/privacy');
expect(mockProxyFetchGet).not.toHaveBeenCalledWith('/api/user/privacy');
});
});
@ -316,73 +313,15 @@ describe('ChatBox Component', async () => {
});
});
describe('Privacy Dialog', () => {
it('should automatically accept privacy settings when incomplete', async () => {
mockProxyFetchGet.mockImplementation((url: string) => {
if (url === '/api/user/privacy') {
return Promise.resolve({
dataCollection: false,
analytics: true,
marketing: true,
});
}
return Promise.resolve([]);
});
const mockProxyFetchPut = vi.fn().mockResolvedValue({});
vi.mocked(fetchApi.proxyFetchPut).mockImplementation(mockProxyFetchPut);
const user = userEvent.setup();
describe('Privacy', () => {
it('should not fetch privacy settings on mount', async () => {
renderChatBox();
// Type a message and send it
const input = screen.getByPlaceholderText('Type your message...');
await user.type(input, 'Test message');
const sendButton = screen.getByTestId('send-button');
await user.click(sendButton);
// When privacy is incomplete, it should automatically accept all permissions
// Privacy is now handled at login, not in ChatBox
await waitFor(() => {
expect(mockProxyFetchPut).toHaveBeenCalledWith('/api/user/privacy', {
take_screenshot: true,
access_local_software: true,
access_your_address: true,
password_storage: true,
});
expect(mockProxyFetchGet).not.toHaveBeenCalledWith('/api/user/privacy');
});
});
it('should not auto-accept privacy when already complete', async () => {
mockProxyFetchGet.mockImplementation((url: string) => {
if (url === '/api/user/privacy') {
return Promise.resolve({
dataCollection: true,
analytics: true,
marketing: true,
});
}
return Promise.resolve([]);
});
const mockProxyFetchPut = vi.fn().mockResolvedValue({});
vi.mocked(fetchApi.proxyFetchPut).mockImplementation(mockProxyFetchPut);
const user = userEvent.setup();
renderChatBox();
// Type a message and send it
const input = screen.getByPlaceholderText('Type your message...');
await user.type(input, 'Test message');
const sendButton = screen.getByTestId('send-button');
await user.click(sendButton);
// Should not call privacy update when already complete
await new Promise((resolve) => setTimeout(resolve, 100));
expect(mockProxyFetchPut).not.toHaveBeenCalledWith(
'/api/user/privacy',
expect.anything()
);
});
});
describe('Chat Interface', () => {
@ -469,7 +408,7 @@ describe('ChatBox Component', async () => {
// The component should call fetchPost for continuing conversation
await waitFor(() => {
expect(mockFetchPost).toHaveBeenCalled();
expect(_mockFetchPost).toHaveBeenCalled();
});
});
@ -680,7 +619,7 @@ describe('ChatBox Component', async () => {
await waitFor(() => {
// The API call now uses project ID instead of task ID
expect(mockFetchPost).toHaveBeenCalledWith(
expect(_mockFetchPost).toHaveBeenCalledWith(
'/chat/test-project-id/human-reply',
{
agent: 'test-agent',
@ -731,7 +670,7 @@ describe('ChatBox Component', async () => {
const storeCalled =
(storeObj.setActiveAskList as any).mock.calls.length > 0 ||
(storeObj.addMessages as any).mock.calls.length > 0;
const apiCalled = (mockFetchPost as any).mock.calls.length > 0;
const apiCalled = (_mockFetchPost as any).mock.calls.length > 0;
expect(storeCalled || apiCalled).toBe(true);
});
});
@ -763,11 +702,9 @@ describe('ChatBox Component', async () => {
it('should show search key warning when missing API keys', async () => {
mockProxyFetchGet.mockImplementation((url: string) => {
if (url === '/api/user/privacy') {
if (url === '/api/providers') {
return Promise.resolve({
dataCollection: true,
analytics: true,
marketing: true,
items: [{ id: 'test-provider', name: 'Test' }],
});
}
if (url === '/api/configs') {
@ -796,11 +733,9 @@ describe('ChatBox Component', async () => {
describe('Example Prompts', () => {
beforeEach(() => {
mockProxyFetchGet.mockImplementation((url: string) => {
if (url === '/api/user/privacy') {
if (url === '/api/providers') {
return Promise.resolve({
dataCollection: true,
analytics: true,
marketing: true,
items: [{ id: 'test-provider', name: 'Test' }],
});
}
if (url === '/api/configs') {
@ -888,7 +823,7 @@ describe('ChatBox Component', async () => {
it('should handle API errors gracefully', async () => {
const user = userEvent.setup();
// Instead of asserting on console.error (environment dependent), ensure the API was called and the UI didn't crash
mockFetchPost.mockRejectedValue(new Error('API Error'));
_mockFetchPost.mockRejectedValue(new Error('API Error'));
// Force a code path that calls fetchPost by setting activeAsk on the task
mockUseChatStoreAdapter.mockReturnValue({
@ -914,7 +849,7 @@ describe('ChatBox Component', async () => {
await user.click(sendButton);
await waitFor(() => {
expect((mockFetchPost as any).mock.calls.length).toBeGreaterThan(0);
expect((_mockFetchPost as any).mock.calls.length).toBeGreaterThan(0);
});
});

View file

@ -104,8 +104,8 @@ describe('useInstallationSetup Hook', () => {
});
it('should set initState to carousel if tool is not installed', async () => {
// Set initial state to permissions (as would happen on fresh startup)
mockAuthStore.initState = 'permissions';
// Set initial state to carousel (as would happen on fresh startup)
mockAuthStore.initState = 'carousel';
// Mock tool not installed
window.ipcRenderer.invoke = vi.fn().mockResolvedValue({
@ -235,8 +235,8 @@ describe('useInstallationSetup Hook', () => {
it('should handle fresh installation scenario', async () => {
TestScenarios.freshInstall(electronAPI);
// Set initial state to permissions (as would happen on fresh startup)
mockAuthStore.initState = 'permissions';
// Set initial state to carousel (as would happen on fresh startup)
mockAuthStore.initState = 'carousel';
// Mock tool not installed
window.ipcRenderer.invoke = vi.fn().mockResolvedValue({

View file

@ -60,7 +60,7 @@ vi.mock('../../../src/store/authStore', () => ({
isFirstLaunch: true,
modelType: 'cloud' as const,
cloud_model_type: 'gpt-4.1' as const,
initState: 'permissions' as const,
initState: 'carousel' as const,
share_token: null,
workerListData: {},
},
@ -74,7 +74,7 @@ vi.mock('../../../src/store/authStore', () => ({
isFirstLaunch: true,
modelType: 'cloud' as const,
cloud_model_type: 'gpt-4.1' as const,
initState: 'permissions' as const,
initState: 'carousel' as const,
share_token: null,
workerListData: {},
})),