diff --git a/src/components/IntegrationList/index.tsx b/src/components/IntegrationList/index.tsx
index 6247f9a8e..8c7433e95 100644
--- a/src/components/IntegrationList/index.tsx
+++ b/src/components/IntegrationList/index.tsx
@@ -20,9 +20,9 @@ import {
TooltipSimple,
TooltipTrigger,
} from '@/components/ui/tooltip';
-import { CircleAlert, Settings2 } from 'lucide-react';
+import { AnimatePresence, motion } from 'framer-motion';
+import { Cable, CircleAlert, Settings2, X } from 'lucide-react';
-import ellipseIcon from '@/assets/mcp/Ellipse-25.svg';
import {
Select,
SelectContent,
@@ -36,8 +36,15 @@ import {
} from '@/hooks/useIntegrationManagement';
import { getProxyBaseURL } from '@/lib';
import { OAuth } from '@/lib/oauth';
+import { cn } from '@/lib/utils';
import { MCPEnvDialog } from '@/pages/Connectors/components/MCPEnvDialog';
-import React, { useCallback, useMemo, useState } from 'react';
+import React, {
+ useCallback,
+ useEffect,
+ useMemo,
+ useRef,
+ useState,
+} from 'react';
import { useTranslation } from 'react-i18next';
type IntegrationListVariant = 'select' | 'manage';
@@ -90,9 +97,32 @@ export default function IntegrationList({
const [activeMcp, setActiveMcp] = useState
(null);
const isSelectMode = variant === 'select';
+ // Per-item error state for status dot
+ const [errorKeys, setErrorKeys] = useState>({});
+ const errorTimers = useRef>>({});
+
+ const markError = useCallback((key: string) => {
+ setErrorKeys((prev) => ({ ...prev, [key]: true }));
+ if (errorTimers.current[key]) clearTimeout(errorTimers.current[key]);
+ errorTimers.current[key] = setTimeout(() => {
+ setErrorKeys((prev) => ({ ...prev, [key]: false }));
+ delete errorTimers.current[key];
+ }, 4000);
+ }, []);
+
+ useEffect(() => {
+ return () => {
+ for (const timer of Object.values(errorTimers.current)) {
+ clearTimeout(timer);
+ }
+ errorTimers.current = {};
+ };
+ }, []);
+
// Use shared hook for integration management
const {
installed,
+ configsHydrated: installStateReady,
fetchInstalled,
saveEnvAndConfig,
handleUninstall,
@@ -140,7 +170,12 @@ export default function IntegrationList({
}
if (installed[item.key]) return;
- await item.onInstall();
+ try {
+ await item.onInstall();
+ } catch {
+ markError(item.key);
+ return;
+ }
// Only refresh in select mode
if (isSelectMode) {
await fetchInstalled();
@@ -152,6 +187,7 @@ export default function IntegrationList({
isSelectMode,
onShowEnvConfig,
fetchInstalled,
+ markError,
]
);
@@ -294,7 +330,12 @@ export default function IntegrationList({
: 'flex flex-col w-full items-start justify-start gap-4';
const itemClassName = isSelectMode
- ? 'cursor-pointer hover:bg-surface-hover-subtle px-3 py-2 flex justify-between'
+ ? cn(
+ 'px-3 py-2 flex justify-between',
+ installStateReady
+ ? 'cursor-pointer hover:bg-surface-hover-subtle'
+ : 'cursor-wait opacity-70'
+ )
: 'w-full px-6 py-4 bg-surface-tertiary rounded-2xl';
const titleClassName = isSelectMode
@@ -312,6 +353,16 @@ export default function IntegrationList({
{sortedItems.map((item) => {
const isInstalled = !!installed[item.key];
const isComingSoon = COMING_SOON_ITEMS.includes(item.name);
+ const leadStatusDotClass = cn(
+ 'mr-2 h-3 w-3 shrink-0 rounded-full',
+ !installStateReady
+ ? 'bg-icon-secondary'
+ : errorKeys[item.key]
+ ? 'bg-icon-warning'
+ : isInstalled
+ ? 'bg-icon-success'
+ : 'bg-icon-secondary'
+ );
return (
@@ -320,38 +371,27 @@ export default function IntegrationList({
onClick={
isSelectMode
? () => {
- if (!isComingSoon) {
- if (item.env_vars.length === 0 || isInstalled) {
- // Ensure toolkit field is passed and normalized for known cases
- const normalizedToolkit =
- item.name === 'Notion'
- ? 'notion_mcp_toolkit'
- : item.toolkit;
- addOption?.(
- { ...item, toolkit: normalizedToolkit },
- true
- );
- } else {
- handleInstall(item);
- }
+ if (!installStateReady || isComingSoon) return;
+ if (item.env_vars.length === 0 || isInstalled) {
+ const normalizedToolkit =
+ item.name === 'Notion'
+ ? 'notion_mcp_toolkit'
+ : item.toolkit;
+ addOption?.(
+ { ...item, toolkit: normalizedToolkit },
+ true
+ );
+ } else {
+ handleInstall(item);
}
}
: undefined
}
>
{isSelectMode ? (
-
+
{(isSelectMode || showStatusDot) && (
-

+
)}
{item.name}
@@ -361,19 +401,10 @@ export default function IntegrationList({
) : (
-
-
+
+
{showStatusDot && (
-

+
)}
{item.name}
@@ -387,7 +418,7 @@ export default function IntegrationList({
-
+
{showConfigButton && (
)}
{isSelectMode && item.env_vars.length !== 0 && (
-
{
- e.stopPropagation();
- return isInstalled
- ? handleUninstall(item)
- : handleInstall(item);
- }}
- >
- {isComingSoon
- ? t(`${translationNamespace}.coming-soon`)
- : isInstalled
- ? t(`${translationNamespace}.uninstall`)
- : t(`${translationNamespace}.install`)}
-
+
)}
{!isSelectMode && showSelect && (
-
-
+
+
{' '}
Default {item.name}
@@ -487,3 +494,127 @@ export default function IntegrationList({
);
}
+
+// ── Connect / Disconnect button with hover X icon ──
+
+function InstallButton({
+ item,
+ isComingSoon,
+ installStateReady,
+ isInstalled,
+ onInstall,
+ onUninstall,
+ translationNamespace,
+}: {
+ item: IntegrationItem;
+ isComingSoon: boolean;
+ installStateReady: boolean;
+ isInstalled: boolean;
+ onInstall: (item: IntegrationItem) => void | Promise
;
+ onUninstall: (item: IntegrationItem) => void | Promise;
+ translationNamespace: string;
+}) {
+ const { t } = useTranslation();
+ const [hovered, setHovered] = useState(false);
+
+ // Reset hover when install state changes to avoid flicker
+ const prevInstalled = useRef(isInstalled);
+ useEffect(() => {
+ if (prevInstalled.current !== isInstalled) {
+ setHovered(false);
+ prevInstalled.current = isInstalled;
+ }
+ }, [isInstalled]);
+
+ // Coming soon
+ if (isComingSoon) {
+ return (
+
+ {t(`${translationNamespace}.coming-soon`)}
+
+ );
+ }
+
+ if (!installStateReady) {
+ return (
+
+ {t('setting.loading')}
+
+ );
+ }
+
+ // Connected → ghost "Disconnect" with leading X on hover
+ if (isInstalled) {
+ return (
+ setHovered(true)}
+ onMouseLeave={() => setHovered(false)}
+ onClick={(e) => {
+ e.preventDefault();
+ e.stopPropagation();
+ onUninstall(item);
+ }}
+ >
+
+ {hovered && (
+
+
+
+ )}
+
+ {t(`${translationNamespace}.disconnect`)}
+
+ );
+ }
+
+ // Not connected → "Connect" with leading Cable icon on hover
+ return (
+ setHovered(true)}
+ onMouseLeave={() => setHovered(false)}
+ onClick={(e) => {
+ e.preventDefault();
+ e.stopPropagation();
+ onInstall(item);
+ }}
+ >
+
+ {hovered && (
+
+
+
+ )}
+
+ {t(`${translationNamespace}.connect`)}
+
+ );
+}
diff --git a/src/components/ui/button.stories.tsx b/src/components/ui/button.stories.tsx
index a0e91af11..0959626e7 100644
--- a/src/components/ui/button.stories.tsx
+++ b/src/components/ui/button.stories.tsx
@@ -38,6 +38,10 @@ const meta: Meta = {
control: 'select',
options: ['xxs', 'xs', 'sm', 'md', 'lg', 'icon'],
},
+ rounded: {
+ control: 'select',
+ options: ['default', 'full'],
+ },
disabled: {
control: 'boolean',
},
@@ -134,7 +138,7 @@ export const IconOnly: Story = {
export const AllVariants: Story = {
render: () => (
-
+
Primary
Secondary
Outline
@@ -145,9 +149,17 @@ export const AllVariants: Story = {
),
};
+export const RoundedFull: Story = {
+ args: {
+ variant: 'primary',
+ rounded: 'full',
+ children: 'Connect',
+ },
+};
+
export const AllSizes: Story = {
render: () => (
-
+
XXS
diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx
index e0175999a..f8dc5e982 100644
--- a/src/components/ui/button.tsx
+++ b/src/components/ui/button.tsx
@@ -40,6 +40,10 @@ const buttonVariants = cva(
warning:
'bg-button-fill-warning !text-button-fill-warning-foreground font-bold rounded-xs shadow-button-shadow focus:ring-2 focus:ring-gray-4 focus:ring-offset-2 cursor-pointer',
},
+ rounded: {
+ default: '',
+ full: '!rounded-full',
+ },
size: {
xxs: 'inline-flex justify-start items-center gap-1 px-1 py-0.5 rounded-md text-label-xs font-bold [&_svg]:size-16',
xs: 'inline-flex justify-start items-center gap-1 px-2 py-1 rounded-md text-label-xs font-bold [&_svg]:size-10',
@@ -52,6 +56,7 @@ const buttonVariants = cva(
defaultVariants: {
variant: 'primary',
size: 'md',
+ rounded: 'default',
},
}
);
@@ -60,21 +65,26 @@ const Button = React.forwardRef<
HTMLButtonElement,
React.ComponentProps<'button'> &
VariantProps
& { asChild?: boolean }
->(({ className, variant, size, asChild = false, children, ...props }, ref) => {
- const Comp = asChild ? Slot : 'button';
+>(
+ (
+ { className, variant, size, rounded, asChild = false, children, ...props },
+ ref
+ ) => {
+ const Comp = asChild ? Slot : 'button';
- return (
-
- {children}
- {/* {variant === "primary" && } */}
-
- );
-});
+ return (
+
+ {children}
+ {/* {variant === "primary" && } */}
+
+ );
+ }
+);
Button.displayName = 'Button';
diff --git a/src/components/ui/dialog.tsx b/src/components/ui/dialog.tsx
index d6267f997..53a6eeed5 100644
--- a/src/components/ui/dialog.tsx
+++ b/src/components/ui/dialog.tsx
@@ -38,7 +38,7 @@ const DialogOverlay = React.forwardRef<
(
-
+
{showBackButton && (
(
)}
-
+
{title && (
-
+
-
+
{title}
@@ -216,7 +216,7 @@ const DialogContentSection = React.forwardRef<
HTMLDivElement,
React.HTMLAttributes
>(({ className, ...props }, ref) => (
-
+
));
DialogContentSection.displayName = 'DialogContentSection';
@@ -248,6 +248,9 @@ interface DialogFooterProps extends React.HTMLAttributes {
| 'warning';
confirmButtonDisabled?: boolean;
cancelButtonDisabled?: boolean;
+ /** Pill shape for footer actions (e.g. Connect flows). */
+ confirmButtonRounded?: 'default' | 'full';
+ cancelButtonRounded?: 'default' | 'full';
}
const DialogFooter = React.forwardRef(
@@ -264,6 +267,8 @@ const DialogFooter = React.forwardRef(
cancelButtonVariant = 'outline',
confirmButtonDisabled = false,
cancelButtonDisabled = false,
+ confirmButtonRounded = 'default',
+ cancelButtonRounded = 'default',
children,
...props
},
@@ -328,9 +333,9 @@ const DialogFooter = React.forwardRef(
(
@@ -350,6 +356,7 @@ const DialogFooter = React.forwardRef(
diff --git a/src/components/ui/input-select.tsx b/src/components/ui/input-select.tsx
index d8fec3558..ccf616da0 100644
--- a/src/components/ui/input-select.tsx
+++ b/src/components/ui/input-select.tsx
@@ -1,83 +1,100 @@
-import * as React from "react"
-import { Check, ChevronDown, CircleAlert } from "lucide-react"
-import { cn } from "@/lib/utils"
-import { TooltipSimple } from "@/components/ui/tooltip"
-
-export type InputSelectSize = "default" | "sm"
-export type InputSelectState = "error" | "success"
+// ========= 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 { TooltipSimple } from '@/components/ui/tooltip';
+import { cn } from '@/lib/utils';
+import { Check, ChevronDown, CircleAlert } from 'lucide-react';
+import * as React from 'react';
+
+export type InputSelectSize = 'default' | 'sm';
+export type InputSelectState = 'error' | 'success';
type InputSelectOption = {
- value: string
- label: string
-}
+ value: string;
+ label: string;
+};
type InputSelectProps = {
- value: string
- onChange: (value: string) => void
- options: InputSelectOption[]
- placeholder?: string
- title?: string
- tooltip?: string
- note?: string
- errorNote?: string
- required?: boolean
- disabled?: boolean
- size?: InputSelectSize
- state?: InputSelectState
- leadingIcon?: React.ReactNode
- className?: string
- maxDropdownHeight?: number
+ value: string;
+ onChange: (value: string) => void;
+ options: InputSelectOption[];
+ placeholder?: string;
+ title?: string;
+ tooltip?: string;
+ note?: string;
+ errorNote?: string;
+ required?: boolean;
+ disabled?: boolean;
+ size?: InputSelectSize;
+ state?: InputSelectState;
+ leadingIcon?: React.ReactNode;
+ className?: string;
+ maxDropdownHeight?: number;
/**
* Called when an option is selected from the dropdown
*/
- onOptionSelect?: (option: InputSelectOption) => void
+ onOptionSelect?: (option: InputSelectOption) => void;
/**
* Custom validation function for the input value
* Returns true if valid, false if invalid
* If returns false, component will show error state
*/
- validateInput?: (value: string) => boolean
+ validateInput?: (value: string) => boolean;
/**
* Called when input loses focus or dropdown closes
* Use this to transform/normalize the input value
* Return the normalized value, or undefined to keep as-is
* Return false to indicate validation failure (will show error state)
*/
- onInputCommit?: (value: string) => string | false | void
-}
+ onInputCommit?: (value: string) => string | false | void;
+};
const sizeClasses: Record = {
- default: "h-10 text-body-sm",
- sm: "h-8 text-body-sm",
-}
-
-function resolveStateClasses(state: InputSelectState | undefined, disabled: boolean) {
+ default: 'h-10 text-body-sm',
+ sm: 'h-8 text-body-sm',
+};
+
+function resolveStateClasses(
+ state: InputSelectState | undefined,
+ disabled: boolean
+) {
if (disabled) {
return {
- wrapper: "opacity-50 cursor-not-allowed",
- container: "border-transparent bg-input-bg-default",
- note: "text-text-label",
- }
+ wrapper: 'opacity-50 cursor-not-allowed',
+ container: 'border-transparent bg-input-bg-default',
+ note: 'text-text-label',
+ };
}
- if (state === "error") {
+ if (state === 'error') {
return {
- wrapper: "",
- container: "border-input-border-cuation bg-input-bg-default",
- note: "text-text-cuation",
- }
+ wrapper: '',
+ container: 'border-input-border-cuation bg-input-bg-default',
+ note: 'text-text-cuation',
+ };
}
- if (state === "success") {
+ if (state === 'success') {
return {
- wrapper: "",
- container: "border-input-border-success bg-input-bg-confirm",
- note: "text-text-success",
- }
+ wrapper: '',
+ container: 'border-input-border-success bg-input-bg-confirm',
+ note: 'text-text-success',
+ };
}
return {
- wrapper: "",
- container: "border-transparent bg-input-bg-default",
- note: "text-text-label",
- }
+ wrapper: '',
+ container: 'border-transparent bg-input-bg-default',
+ note: 'text-text-label',
+ };
}
const InputSelect = React.forwardRef(
@@ -93,7 +110,7 @@ const InputSelect = React.forwardRef(
errorNote,
required = false,
disabled = false,
- size = "default",
+ size = 'default',
state,
leadingIcon,
className,
@@ -104,209 +121,234 @@ const InputSelect = React.forwardRef(
},
ref
) => {
- const [isOpen, setIsOpen] = React.useState(false)
+ const [isOpen, setIsOpen] = React.useState(false);
const [inputValue, setInputValue] = React.useState(() => {
- const option = options.find((opt) => opt.value === value)
- return option ? option.label : value
- })
- const [hasError, setHasError] = React.useState(false)
- const containerRef = React.useRef(null)
- const inputRef = React.useRef(null)
- const dropdownRef = React.useRef(null)
- const isCommittingRef = React.useRef(false)
- const optionSelectedRef = React.useRef(false)
- const inputValueRef = React.useRef(inputValue)
+ const option = options.find((opt) => opt.value === value);
+ return option ? option.label : value;
+ });
+ const [hasError, setHasError] = React.useState(false);
+ const containerRef = React.useRef(null);
+ const inputRef = React.useRef(null);
+ const dropdownRef = React.useRef(null);
+ const isCommittingRef = React.useRef(false);
+ const optionSelectedRef = React.useRef(false);
+ const inputValueRef = React.useRef(inputValue);
+ const blurTimerRef = React.useRef | null>(
+ null
+ );
+ const isMountedRef = React.useRef(true);
// Merge refs
- React.useImperativeHandle(ref, () => inputRef.current as HTMLInputElement)
+ React.useImperativeHandle(ref, () => inputRef.current as HTMLInputElement);
// Keep inputValueRef in sync with inputValue
React.useEffect(() => {
- inputValueRef.current = inputValue
- }, [inputValue])
+ inputValueRef.current = inputValue;
+ }, [inputValue]);
+
+ // Clear blur deferral timer on unmount; avoid setState after unmount if a tick slips through
+ React.useEffect(() => {
+ isMountedRef.current = true;
+ return () => {
+ isMountedRef.current = false;
+ if (blurTimerRef.current !== null) {
+ clearTimeout(blurTimerRef.current);
+ blurTimerRef.current = null;
+ }
+ };
+ }, []);
// Sync input value with external value
React.useEffect(() => {
- const option = options.find((opt) => opt.value === value)
- setInputValue(option ? option.label : value)
- setHasError(false) // Clear error when external value changes
- }, [value, options])
+ const option = options.find((opt) => opt.value === value);
+ setInputValue(option ? option.label : value);
+ setHasError(false); // Clear error when external value changes
+ }, [value, options]);
// Commit value function - validates and saves input
const commitValue = React.useCallback(() => {
// Skip commit if an option was just selected (it handles its own update)
if (optionSelectedRef.current) {
- optionSelectedRef.current = false
- return
+ optionSelectedRef.current = false;
+ return;
}
// Prevent double commits
- if (isCommittingRef.current) return
- isCommittingRef.current = true
+ if (isCommittingRef.current) return;
+ isCommittingRef.current = true;
// Use ref to get the latest inputValue (avoids stale closure issue)
- const currentInputValue = inputValueRef.current
- let finalValue = currentInputValue
+ const currentInputValue = inputValueRef.current;
+ let finalValue = currentInputValue;
// Run custom commit handler if provided
if (onInputCommit) {
- const result = onInputCommit(currentInputValue)
+ const result = onInputCommit(currentInputValue);
if (result === false) {
// Validation failed - show error state
- setHasError(true)
- isCommittingRef.current = false
- return
+ setHasError(true);
+ isCommittingRef.current = false;
+ return;
}
- if (typeof result === "string") {
- finalValue = result
- setInputValue(result)
+ if (typeof result === 'string') {
+ finalValue = result;
+ setInputValue(result);
}
}
// Validate if validator is provided
if (validateInput && !validateInput(finalValue)) {
- setHasError(true)
- isCommittingRef.current = false
- return
+ setHasError(true);
+ isCommittingRef.current = false;
+ return;
}
// Validation passed - clear error and update value
- setHasError(false)
+ setHasError(false);
if (finalValue !== value) {
- onChange(finalValue)
+ onChange(finalValue);
}
- isCommittingRef.current = false
- }, [value, onInputCommit, validateInput, onChange])
+ isCommittingRef.current = false;
+ }, [value, onInputCommit, validateInput, onChange]);
// Handle click outside to close dropdown
React.useEffect(() => {
- if (!isOpen) return
+ if (!isOpen) return;
const handleClickOutside = (event: MouseEvent) => {
- const target = event.target as Node
+ const target = event.target as Node;
if (
containerRef.current &&
!containerRef.current.contains(target) &&
dropdownRef.current &&
!dropdownRef.current.contains(target)
) {
- commitValue()
- setIsOpen(false)
+ commitValue();
+ setIsOpen(false);
}
- }
+ };
const handleEscape = (event: KeyboardEvent) => {
- if (event.key === "Escape") {
- setInputValue(value) // Reset to original value
- setIsOpen(false)
- inputRef.current?.blur()
+ if (event.key === 'Escape') {
+ setInputValue(value); // Reset to original value
+ setIsOpen(false);
+ inputRef.current?.blur();
}
- }
+ };
// Use capture phase to handle events before they bubble
- document.addEventListener("mousedown", handleClickOutside, true)
- document.addEventListener("keydown", handleEscape, true)
+ document.addEventListener('mousedown', handleClickOutside, true);
+ document.addEventListener('keydown', handleEscape, true);
return () => {
- document.removeEventListener("mousedown", handleClickOutside, true)
- document.removeEventListener("keydown", handleEscape, true)
- }
- }, [isOpen, value, commitValue])
+ document.removeEventListener('mousedown', handleClickOutside, true);
+ document.removeEventListener('keydown', handleEscape, true);
+ };
+ }, [isOpen, value, commitValue]);
// Handle scroll within dropdown - prevent parent scroll only when necessary
- const handleDropdownWheel = React.useCallback((e: React.WheelEvent) => {
- const target = e.currentTarget
- const { scrollTop, scrollHeight, clientHeight } = target
- const hasScrollableContent = scrollHeight > clientHeight
-
- if (!hasScrollableContent) {
- // No scrollable content, prevent all scroll and stop propagation
- e.preventDefault()
- e.stopPropagation()
- return
- }
+ const handleDropdownWheel = React.useCallback(
+ (e: React.WheelEvent) => {
+ const target = e.currentTarget;
+ const { scrollTop, scrollHeight, clientHeight } = target;
+ const hasScrollableContent = scrollHeight > clientHeight;
+
+ if (!hasScrollableContent) {
+ // No scrollable content, prevent all scroll and stop propagation
+ e.preventDefault();
+ e.stopPropagation();
+ return;
+ }
- const isAtTop = scrollTop <= 0
- const isAtBottom = scrollTop + clientHeight >= scrollHeight - 1 // -1 for rounding
+ const isAtTop = scrollTop <= 0;
+ const isAtBottom = scrollTop + clientHeight >= scrollHeight - 1; // -1 for rounding
- // If at boundary and trying to scroll past it, prevent default to stop parent from scrolling
- if ((isAtTop && e.deltaY < 0) || (isAtBottom && e.deltaY > 0)) {
- e.preventDefault()
- }
+ // If at boundary and trying to scroll past it, prevent default to stop parent from scrolling
+ if ((isAtTop && e.deltaY < 0) || (isAtBottom && e.deltaY > 0)) {
+ e.preventDefault();
+ }
- // Always stop propagation to prevent parent dialog from scrolling
- e.stopPropagation()
- }, [])
+ // Always stop propagation to prevent parent dialog from scrolling
+ e.stopPropagation();
+ },
+ []
+ );
const handleInputChange = (e: React.ChangeEvent) => {
- setInputValue(e.target.value)
+ setInputValue(e.target.value);
// Clear error when user starts typing again
if (hasError) {
- setHasError(false)
+ setHasError(false);
}
- }
+ };
const handleInputFocus = () => {
if (!disabled) {
- setIsOpen(true)
+ setIsOpen(true);
}
- }
+ };
const handleInputBlur = () => {
// Use setTimeout to allow option clicks to process first
// If user clicks an option, the option handler will update the value
// If user clicks outside, we commit the current input value
- setTimeout(() => {
- commitValue()
- setIsOpen(false)
- }, 150)
- }
+ if (blurTimerRef.current !== null) {
+ clearTimeout(blurTimerRef.current);
+ }
+ blurTimerRef.current = setTimeout(() => {
+ blurTimerRef.current = null;
+ if (!isMountedRef.current) return;
+ commitValue();
+ setIsOpen(false);
+ }, 150);
+ };
const handleInputKeyDown = (e: React.KeyboardEvent) => {
- if (e.key === "Enter") {
- e.preventDefault()
- commitValue()
- setIsOpen(false)
- inputRef.current?.blur()
- } else if (e.key === "ArrowDown" && !isOpen) {
- e.preventDefault()
- setIsOpen(true)
+ if (e.key === 'Enter') {
+ e.preventDefault();
+ commitValue();
+ setIsOpen(false);
+ inputRef.current?.blur();
+ } else if (e.key === 'ArrowDown' && !isOpen) {
+ e.preventDefault();
+ setIsOpen(true);
}
- }
+ };
const handleOptionClick = (option: InputSelectOption) => {
// Mark that an option was selected so blur handler skips commit
- optionSelectedRef.current = true
- setInputValue(option.label)
- inputValueRef.current = option.label // Update ref immediately
- setHasError(false) // Clear error when selecting an option
- onChange(option.value)
- onOptionSelect?.(option)
- setIsOpen(false)
- }
+ optionSelectedRef.current = true;
+ setInputValue(option.label);
+ inputValueRef.current = option.label; // Update ref immediately
+ setHasError(false); // Clear error when selecting an option
+ onChange(option.value);
+ onOptionSelect?.(option);
+ setIsOpen(false);
+ };
const handleContainerClick = () => {
if (!disabled) {
- inputRef.current?.focus()
- setIsOpen(true)
+ inputRef.current?.focus();
+ setIsOpen(true);
}
- }
+ };
// Use internal error state if no external state is provided
- const effectiveState = hasError ? "error" : state
- const stateCls = resolveStateClasses(effectiveState, disabled)
+ const effectiveState = hasError ? 'error' : state;
+ const stateCls = resolveStateClasses(effectiveState, disabled);
// Determine which note to show
- const displayNote = effectiveState === "error" && errorNote ? errorNote : note
+ const displayNote =
+ effectiveState === 'error' && errorNote ? errorNote : note;
// Find the currently selected option
- const selectedOption = options.find((opt) => opt.value === value)
+ const selectedOption = options.find((opt) => opt.value === value);
return (
-
+
{title && (
-
+
{title}
{required && *}
{tooltip && (
@@ -322,20 +364,22 @@ const InputSelect = React.forwardRef(
ref={containerRef}
onClick={handleContainerClick}
className={cn(
- "relative flex w-full items-center rounded-lg border border-solid shadow-sm outline-none transition-all px-3 gap-2 text-text-body cursor-text",
+ 'rounded-lg shadow-sm px-3 gap-2 text-text-body relative flex w-full cursor-text items-center border border-solid transition-all outline-none',
sizeClasses[size],
stateCls.container,
!disabled &&
- state !== "error" &&
- state !== "success" && [
- "hover:bg-input-bg-hover hover:ring-1 hover:ring-input-border-hover hover:ring-offset-0",
- isOpen &&
- "bg-input-bg-input ring-1 ring-input-border-focus ring-offset-0",
- ]
+ state !== 'error' &&
+ state !== 'success' && [
+ 'hover:bg-input-bg-hover hover:ring-input-border-hover hover:ring-1 hover:ring-offset-0',
+ isOpen &&
+ 'bg-input-bg-input ring-input-border-focus ring-1 ring-offset-0',
+ ]
)}
>
{leadingIcon && (
- {leadingIcon}
+
+ {leadingIcon}
+
)}
(
onKeyDown={handleInputKeyDown}
placeholder={placeholder}
disabled={disabled}
- className="flex-1 bg-transparent outline-none placeholder:text-text-label/20 min-w-0"
+ className="placeholder:text-text-label/20 min-w-0 flex-1 bg-transparent outline-none"
/>
@@ -361,10 +405,10 @@ const InputSelect = React.forwardRef
(
{isOpen && (
@@ -373,14 +417,14 @@ const InputSelect = React.forwardRef
(
key={option.value}
onClick={() => handleOptionClick(option)}
className={cn(
- "relative flex w-full cursor-pointer select-none items-center rounded-lg py-1.5 pl-2 pr-8 text-sm outline-none hover:bg-menutabs-fill-hover transition-colors",
+ 'rounded-lg py-1.5 pl-2 pr-8 text-sm hover:bg-menutabs-fill-hover relative flex w-full cursor-pointer items-center transition-colors outline-none select-none',
selectedOption?.value === option.value &&
- "bg-menutabs-fill-hover"
+ 'bg-menutabs-fill-hover'
)}
>
{option.label}
{selectedOption?.value === option.value && (
-
+
)}
@@ -391,13 +435,20 @@ const InputSelect = React.forwardRef(
)}
{displayNote && (
- {displayNote}
+
+ {displayNote}
+
)}
- )
+ );
}
-)
+);
-InputSelect.displayName = "InputSelect"
+InputSelect.displayName = 'InputSelect';
-export { InputSelect, type InputSelectOption }
+export { InputSelect, type InputSelectOption };
diff --git a/src/components/ui/input.tsx b/src/components/ui/input.tsx
index e23e46faf..8f33525de 100644
--- a/src/components/ui/input.tsx
+++ b/src/components/ui/input.tsx
@@ -126,9 +126,9 @@ const Input = React.forwardRef
(
const hasRight = Boolean(backIcon) || Boolean(trailingButton);
return (
-
+
{title ? (
-
+
{title}
{required &&
*}
{optional && (
@@ -146,17 +146,17 @@ const Input = React.forwardRef
(
{leadingIcon ? (
-
+
{leadingIcon}
) : null}
@@ -167,7 +167,7 @@ const Input = React.forwardRef(
disabled={disabled}
placeholder={placeholder}
className={cn(
- 'peer w-full bg-transparent outline-none file:border-0 file:bg-transparent file:text-sm file:font-medium placeholder:transition-colors',
+ 'peer file:text-sm file:font-medium w-full bg-transparent outline-none file:border-0 file:bg-transparent placeholder:transition-colors',
stateCls.input,
stateCls.placeholder,
hasLeft ? 'pl-9' : 'pl-3',
@@ -189,7 +189,7 @@ const Input = React.forwardRef(
variant="ghost"
size="icon"
tabIndex={-1}
- className="absolute right-2 inline-flex h-5 w-5 items-center justify-center rounded-full text-icon-primary focus:ring-0 disabled:opacity-50"
+ className="right-2 h-5 w-5 text-icon-primary absolute inline-flex items-center justify-center rounded-full focus:ring-0 disabled:opacity-50"
disabled={disabled}
onClick={onBackIconClick}
>
@@ -198,7 +198,7 @@ const Input = React.forwardRef(
) : null}
{trailingButton ? (
-
+
{trailingButton}
) : null}
@@ -207,7 +207,7 @@ const Input = React.forwardRef
(
{note ? (
;
@@ -20,7 +22,9 @@ type ToasterProps = React.ComponentProps
;
const Toaster = ({ ...props }: ToasterProps) => {
const { theme = 'system' } = useTheme();
- return (
+ if (typeof document === 'undefined') return null;
+
+ return createPortal(
{
},
}}
{...props}
- />
+ />,
+ document.body
);
};
diff --git a/src/hooks/useIntegrationManagement.ts b/src/hooks/useIntegrationManagement.ts
index d562cc0dc..2e768cd95 100644
--- a/src/hooks/useIntegrationManagement.ts
+++ b/src/hooks/useIntegrationManagement.ts
@@ -42,6 +42,8 @@ export function useIntegrationManagement(items: IntegrationItem[]) {
const [installed, setInstalled] = useState<{ [key: string]: boolean }>({});
// Configs cache
const [configs, setConfigs] = useState([]);
+ /** False until the first configs fetch finishes — avoids flashing Connect before real install state. */
+ const [configsHydrated, setConfigsHydrated] = useState(false);
// Lock to prevent concurrent OAuth processing
const isLockedRef = useRef(false);
// Cache OAuth event when items are not ready
@@ -51,29 +53,36 @@ export function useIntegrationManagement(items: IntegrationItem[]) {
} | null>(null);
const [callBackUrl, setCallBackUrl] = useState(null);
+ /** Bumped on unmount and at the start of each configs fetch — stale responses must not call setState. */
+ const configsFetchSeqRef = useRef(0);
+
// Fetch installed configs
- const fetchInstalled = useCallback(async (ignore: boolean = false) => {
+ const fetchInstalled = useCallback(async () => {
+ const seq = ++configsFetchSeqRef.current;
try {
const configsRes = await proxyFetchGet('/api/v1/configs');
- if (!ignore) {
- setConfigs(Array.isArray(configsRes) ? configsRes : []);
- }
+ if (seq !== configsFetchSeqRef.current) return;
+ setConfigs(Array.isArray(configsRes) ? configsRes : []);
+ setConfigsHydrated(true);
} catch (_e) {
- if (!ignore) setConfigs([]);
+ if (seq !== configsFetchSeqRef.current) return;
+ setConfigs([]);
+ setConfigsHydrated(true);
}
}, []);
- // Fetch configs when mounted
+ // Fetch configs when mounted; invalidate in-flight fetches on unmount
useEffect(() => {
- let ignore = false;
- fetchInstalled(ignore);
+ fetchInstalled();
return () => {
- ignore = true;
+ configsFetchSeqRef.current += 1;
};
}, [fetchInstalled]);
- // Recalculate installed status when items or configs change
+ // Recalculate installed status when items or configs change (only after first configs load)
useEffect(() => {
+ if (!configsHydrated) return;
+
const map: { [key: string]: boolean } = {};
items.forEach((item) => {
@@ -107,7 +116,7 @@ export function useIntegrationManagement(items: IntegrationItem[]) {
});
setInstalled(map);
- }, [items, configs]);
+ }, [items, configs, configsHydrated]);
// Save environment variable and config
const saveEnvAndConfig = useCallback(
@@ -371,6 +380,7 @@ export function useIntegrationManagement(items: IntegrationItem[]) {
return {
installed,
configs,
+ configsHydrated,
callBackUrl,
fetchInstalled,
saveEnvAndConfig,
diff --git a/src/i18n/locales/ar/layout.json b/src/i18n/locales/ar/layout.json
index ae10e2abd..8f57bf1c6 100644
--- a/src/i18n/locales/ar/layout.json
+++ b/src/i18n/locales/ar/layout.json
@@ -29,6 +29,7 @@
"continue-with-google-login": "الدخول باستخدام جوجل",
"continue-with-github-login": "الدخول باستخدام جيت هاب",
"installation-failed": "فشل التثبيت",
+ "backend-startup-failed": "Backend Startup Failed",
"projects": "المشاريع",
"agents": "الوكلاء",
"mcp-tools": "MCP والأدوات",
@@ -69,7 +70,6 @@
"env-should-not-empty": "يجب ألا تكون المتغيرات البيئية فارغة",
"loading": "...",
"value-error": "خطأ في القيمة،",
- "connect": "اتصال",
"name-your-agent": "اسم وكيلك",
"add-an-agent-name": "أضف اسم وكيل...",
"im-an-agent-specially-designed-for": "أنا وكيل مصمم خصيصاً لـ...",
@@ -80,6 +80,8 @@
"coming-soon": "قريباً",
"uninstall": "إلغاء التثبيت",
"install": "تثبيت",
+ "connect": "اتصال",
+ "disconnect": "قطع الاتصال",
"installed": "مثبت",
"installing": "جاري التثبيت",
"agent-tool": "أداة الوكيل",
@@ -101,6 +103,7 @@
"are-you-sure-you-want-to-delete": "هل أنت متأكد من أنك تريد حذف هذه المهمة؟ لا يمكن التراجع عن هذا الإجراء.",
"share": "مشاركة",
"home": "الرئيسية",
+ "back": "رجوع",
"developer-agent": "وكيل المطور",
"browser-agent": "وكيل المتصفح",
"document-agent": "وكيل المستندات",
@@ -116,6 +119,7 @@
"project-ended-successfully": "تم إنهاء المشروع بنجاح",
"failed-to-end-project": "فشل في إنهاء المشروع",
"message-queued": "تم إدراج الرسالة في قائمة الانتظار. ستتم معالجتها عند انتهاء المهمة الحالية.",
+ "task-stopped-successfully": "Task stopped successfully",
"task-skipped-successfully": "تم تخطي المهمة بنجاح",
"failed-to-skip-task": "فشل في تخطي المهمة",
"no-reply-received-task-continue": "لم يتم استلام رد، تستمر المهمة",
@@ -153,7 +157,6 @@
"open-browser": "فتح المتصفح",
"no-cookies-saved-yet": "لم يتم حفظ ملفات تعريف الارتباط بعد",
"no-cookies-saved-yet-description": "انقر فوق \"فتح المتصفح\" أعلاه لتسجيل الدخول إلى المواقع وحفظ ملفات تعريف الارتباط الخاصة بها للمهام المستقبلية.",
- "back": "رجوع",
"total-tokens": "إجمالي الرموز",
"total-tasks": "إجمالي المهام",
"edit": "تعديل",
diff --git a/src/i18n/locales/ar/setting.json b/src/i18n/locales/ar/setting.json
index 766aad86e..b6703e734 100644
--- a/src/i18n/locales/ar/setting.json
+++ b/src/i18n/locales/ar/setting.json
@@ -18,7 +18,6 @@
"dark": "غامق",
"light": "فاتح",
"transparent": "شفاف",
-
"data-privacy": "خصوصية البيانات",
"data-privacy-description": "يعتمد أيجنت على الوضع المحلي الجديد ويضمن خصوصيتك. تبقى بياناتك على جهازك افتراضيًا. أذونات السحابة اختيارية، ويُستخدم حد البيانات لأغراض العمل فقط",
"privacy-policy": "سياسة الخصوصية",
@@ -67,7 +66,6 @@
"url": "عنوان URL",
"enter-your-model-type": "أدخل نوع النموذج الخاص بك",
"verifying": "جارٍ التحقق...",
-
"mcp-and-tools": "MCP الأدوات",
"add-mcp-server": "MCP إضافة خادم",
"market": "السوق",
@@ -82,6 +80,8 @@
"coming-soon": "قريبًا",
"uninstall": "إلغاء التثبيت",
"install": "تثبيت",
+ "connect": "اتصال",
+ "disconnect": "قطع الاتصال",
"add-your-agent": "أضف وكيلك",
"add-a-local-mcp-server-by-providing-a-valid-json-configuration": ".أضف مضيف مسيبي محليًا عن طريق توفير جسون صارم صالح",
"learn-more": "اتعلم اكثر",
@@ -101,7 +101,6 @@
"get-it-from": "احصل عليها من",
"google-custom-search-api": "Google واجهة برمجة تطبيقات البحث المخصص من",
"google-cloud-console": "Google Cloud وحدة تحكم",
- "connect": "اتصال",
"setting": "إعداد",
"all": "الكل",
"mcp-market": "MCP سوق",
@@ -150,6 +149,30 @@
"reset-success": "تمت إعادة التعيين بنجاح!",
"reset-failed": "فشل إعادة التعيين!",
"select-default-model": "اختر النموذج الافتراضي",
+ "browser-login": "Browser Login",
+ "browser-login-description": "Open a Chrome browser to log in to your accounts. Your login data will be saved locally in a secure profile.",
+ "open-browser-login": "Open Browser for Login",
+ "opening-browser": "Opening Browser...",
+ "browser-opened-successfully": "Browser opened successfully. Please log in to your accounts.",
+ "failed-to-open-browser": "Failed to open browser. Please try again.",
+ "restart-to-apply": "Restart to Apply",
+ "cookie-manager": "Cookie Manager",
+ "cookie-manager-description": "Manage cookies saved from your browser sessions. Delete cookies for specific sites or all at once.",
+ "refresh": "Refresh",
+ "delete-all": "Delete All",
+ "search-domains": "Search domains...",
+ "loading-cookies": "Loading cookies...",
+ "no-cookies-found": "No cookies found",
+ "no-matching-domains": "No matching domains",
+ "login-to-save-cookies": "Use the browser login feature above to save cookies from your accounts.",
+ "cookies-count": "{{count}} cookies",
+ "last-access": "Last access",
+ "cookies-deleted-successfully": "Successfully deleted cookies for {{domain}}",
+ "failed-to-load-cookies": "Failed to load cookies. Please try again.",
+ "failed-to-delete-cookies": "Failed to delete cookies. Please try again.",
+ "confirm-delete-all-cookies": "Are you sure you want to delete all cookies? This action cannot be undone.",
+ "all-cookies-deleted": "All cookies have been deleted successfully.",
+ "cookie-delete-warning": "Note: Deleting cookies will log you out of the associated websites. You may need to restart the browser to see changes take effect.",
"network-proxy": "وكيل الشبكة",
"network-proxy-description": "قم بتكوين خادم وكيل لطلبات الشبكة. هذا مفيد إذا كنت بحاجة إلى الوصول إلى واجهات برمجة التطبيقات الخارجية عبر وكيل.",
"proxy-placeholder": "http://127.0.0.1:7890",
@@ -157,7 +180,6 @@
"proxy-save-failed": "فشل حفظ تكوين الوكيل.",
"proxy-invalid-url": "عنوان URL للوكيل غير صالح. يجب أن يبدأ بـ http:// أو https:// أو socks4:// أو socks5://.",
"proxy-restart-hint": "يجب إعادة التشغيل لتطبيق تغييرات الوكيل.",
-
"cloud-not-available-in-local-proxy": "إصدار السحابة غير متاح في وضع الوكيل المحلي",
"set-as-default": "تعيين كافتراضي",
"api-key-setting": "إعداد مفتاح API",
@@ -165,11 +187,9 @@
"model-type-setting": "إعداد نوع النموذج",
"please-select": "يرجى الاختيار",
"configuring": "جارٍ التكوين...",
-
"models-default-setting-title": "الإعداد الافتراضي",
"models-default-setting-description": "اختر أحد النماذج المكوّنة ليكون النموذج الافتراضي لـ Eigent، وسيتم تطبيقه عالميًا عبر مساحة العمل الخاصة بك.",
"models-configuration": "التكوين",
-
"gemini-3-pro-preview-name": "Gemini 3 Pro Preview",
"gemini-3.1-pro-preview-name": "Gemini 3.1 Pro Preview",
"gemini-3-flash-preview-name": "Gemini 3 Flash Preview",
@@ -185,160 +205,10 @@
"claude-sonnet-4-6-name": "Claude Sonnet 4.6",
"claude-opus-4-6-name": "Claude Opus 4.6",
"minimax-m2-5-name": "Minimax M2.5",
-
- "account": "حساب",
- "you-are-currently-signed-in-with": "{{email}} أنت مسجل الدخول حاليًا باستخدام",
- "manage": "إدارة",
- "log-out": "تسجيل الخروج",
- "language": "اللغة",
- "select-language": "اختر اللغة",
- "system-default": "النظام الافتراضي",
- "appearance": "المظهر",
- "dark": "غامق",
- "light": "فاتح",
- "transparent": "شفاف",
-
- "data-privacy": "خصوصية البيانات",
- "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": ".يمكن استخدام الماوس ولوحة المفاتيح المحلية للوصول إلى البرامج والملفات المحلية التي تم تنشيطها",
- "how-we-handle-your-data-line-1-line-3": "لا يتم توفير سوى الحد الأدنى من البيانات ذات الصلة لنماذج الذكاء الاصطناعي أو عمليات التكامل مع جهات خارجية التي تمكنها؛ وليس لدينا أي احتفاظ بالبيانات",
- "how-we-handle-your-data-line-2": ".تبقى ملفات المهام والمخرجات ولقطات الشاشة في مجلد المهمة المخصص لك محليًا",
- "how-we-handle-your-data-line-3": ".يتم تخزين بيانات الاعتماد محليًا، وتشفيرها، ولا تُستخدم إلا للخطوات المعتمدة",
- "how-we-handle-your-data-line-4": ".لا تُستخدم بياناتك أبدًا لتدريب نماذج الذكاء الاصطناعي الخاصة بنا دون موافقتك الصريحة",
- "how-we-handle-your-data-line-5": ".نحن لا نبيع بياناتك لأطراف ثالثة",
- "api-key-can-not-be-empty": "!لا يمكن أن يكون مفتاح واجهة برمجة التطبيقات فارغًا",
- "api-host-can-not-be-empty": "!لا يمكن أن يكون مضيف واجهة برمجة التطبيقات فارغًا",
- "model-type-can-not-be-empty": "!لا يمكن أن يكون نوع النموذج فارغًا",
- "validate-success": "التحقق ناجح",
- "the-model-has-been-verified-to-support-function-calling-which-is-required-to-use-eigent": "ِ.تم التحقق من أن النموذج يدعم استدعاء الوظيفة، وهو أمر مطلوب للاستخدام",
- "validate-failed": "فشل التحقق",
- "copy": "نسخ",
- "copied-to-clipboard": "تم النسخ إلى الحافظة",
- "endpoint-url-can-not-be-empty": "!لا يمكن أن يكون عنوان يورل لنقطة النهاية فارغًا",
- "verification-failed-please-check-endpoint-url": "فشل التحقق، يرجى المراجعة على النقطة النهائية يورل",
- "eigent-cloud-version": "إصدار أيجنت السحابي",
- "you-are-currently-subscribed-to-the": "أنت مشترك حاليًا في",
- "discover-more-about-our": "اكتشف المزيد حول",
- "pricing-options": "خيارات التسعير",
- "credits": "رصيد",
- "select-model-type": "اختر نوع النموذج",
- "custom-model": "نموذج مخصص",
- "use-your-own-api-keys-or-set-up-a-local-model": ".استخدم مفاتيح واجهة برمجة التطبيقات الخاصة بك أو قم بإعداد نموذج محلي",
- "verify": "تحقق",
- "local-model": "نموذج محلي",
- "model-platform": "منصة النموذج",
- "model-endpoint-url": "للنموذج URL النقطة نهاية",
- "model-type": "نوع النموذج",
- "enter-your-local-model-type": "أدخل نوع نموذجك المحلي",
- "you-are-on-selft-host-mode": "أنت في وضع الاستضافة الذاتية",
- "you-are-using-self-hosted-mode": ".أنت تستخدم وضع الاستضافة الذاتية. للحصول على أفضل أداء لهذا المنتج، يرجى إدخال مفتاح بحث Google في \"MCP والأدوات\" لضمان عمل Eigent بشكل صحيح",
- "the-google-search-key-is-essential-for-delivering-accurate-search-results": ".مفتاح بحث Google ضروري لتقديم نتائج بحث دقيقة. مفتاح بحث Exa اختياري ولكنه موصى به بشدة للحصول على أداء أفضل",
- "close": "إغلاق",
- "enter-your-api-key": "أدخل مفتاح واجهة برمجة التطبيقات الخاص بك",
- "key": "مفتاح",
- "enter-your-api-host": "أدخل مضيف واجهة برمجة التطبيقات الخاص بك",
- "url": "عنوان URL",
- "enter-your-model-type": "أدخل نوع النموذج الخاص بك",
- "verifying": "جارٍ التحقق...",
-
- "mcp-and-tools": "MCP الأدوات",
- "add-mcp-server": "MCP إضافة خادم",
- "market": "السوق",
- "tools": "الأدوات",
- "added-external-servers": "تمت إضافة خوادم خارجية",
- "loading": "جارٍ التحميل...",
- "no-mcp-servers": "MCP لا توجد خوادم",
- "environmental-variables-required": "المتغيرات البيئية مطلوبة",
- "load-failed": "فشل التحميل",
- "save-failed": "فشل الحفظ",
- "invalid-json": "غير صالح JSON",
- "coming-soon": "قريبًا",
- "uninstall": "إلغاء التثبيت",
- "install": "تثبيت",
- "add-your-agent": "أضف وكيلك",
- "add-a-local-mcp-server-by-providing-a-valid-json-configuration": ".أضف مضيف مسيبي محليًا عن طريق توفير جسون صارم صالح",
- "learn-more": "اتعلم اكثر",
- "installing": "جارٍ التثبيت...",
- "edit-mcp-config": "MCP تعديل تكوين",
- "name": "الاسم",
- "description": "الوصف",
- "command": "الأمر",
- "args-one-per-line": "الوسائط (واحد في كل سطر)",
- "cancel": "إلغاء",
- "save": "حفظ",
- "confirm-delete": "تأكيد الحذف",
- "are-you-sure-you-want-to-delete": "هل أنت متأكد أنك تريد حذف",
- "deleting": "جارٍ الحذف...",
- "delete": "حذف",
- "configure {name} Toolkit": "{name} تكوين مجموعة أدوات",
- "get-it-from": "احصل عليها من",
- "google-custom-search-api": "Google واجهة برمجة تطبيقات البحث المخصص من",
- "google-cloud-console": "Google Cloud وحدة تحكم",
- "connect": "اتصال",
- "setting": "إعداد",
- "all": "الكل",
- "mcp-market": "MCP سوق",
- "no-mcp-services": "MCP لا توجد خدمات",
- "loading-more": "جارٍ تحميل المزيد...",
- "no-more-mcp-servers": "MCP لا مزيد من خوادم",
- "search-mcp": "MCP بحث",
- "installed": "مثبت",
- "worker-name-cannot-be-empty": "لا يمكن أن يكون اسم العامل فارغًا",
- "worker-name-already-exists": "اسم العامل موجود بالفعل",
- "warning-google-search-not-configured": "تحذير: بحث Google غير مكوّن",
- "search-functionality-may-be-limited-without-google-api": "قد تكون وظائف البحث محدودة بدون مفتاح Google API ومعرف محرك البحث. يمكنك تكوين هذه في إعدادات MCP والأدوات.",
- "search-engine": "محرك البحث",
- "password-storage": "تخزين كلمة المرور",
- "notion-mcp-installed-successfully": "تم تثبيت Notion MCP بنجاح",
- "failed-to-install-notion-mcp": "فشل في تثبيت Notion MCP",
- "google-calendar-installed-successfully": "تم تثبيت Google Calendar بنجاح",
- "failed-to-install-google-calendar": "فشل في تثبيت Google Calendar",
- "notion-workspace-integration": "تكامل مساحة عمل Notion لقراءة وإدارة صفحات Notion",
- "google-calendar-integration": "تكامل Google Calendar لإدارة الأحداث والجداول الزمنية",
- "mcp-server-already-exists": "خادم MCP \"{{name}}\" موجود بالفعل",
- "google-search": "بحث Google",
- "select-default-search-engine": "اختر محرك البحث الافتراضي",
- "your-own-mcps": "MCPs الخاصة بك",
- "get-google-search-api": "احصل على Google Search API",
- "get-exa-api": "احصل على Exa API",
- "exa-ai": "Exa AI",
- "search-engine-integrations": "تكاملات محرك البحث",
- "configured": "مكوّن",
- "incomplete": "غير مكتمل",
- "not-configured": "غير مكوّن",
- "saving": "جارٍ الحفظ...",
- "save-changes": "حفظ التغييرات",
- "enable": "تفعيل",
- "search": "بحث",
- "test-connection": "اختبار الاتصال",
- "your-api-keys-are-stored-securely-and-never-shared-externally": "مفاتيح واجهة برمجة التطبيقات الخاصة بك محفوظة بأمان ولا يتم مشاركتها خارجيًا أبدًا.",
- "this-service-is-public-and-does-not-require-credentials": "هذه الخدمة عامة ولا تتطلب بيانات اعتماد.",
- "this-service-does-not-require-an-api-key": "هذه الخدمة لا تتطلب مفتاح واجهة برمجة تطبيقات.",
- "connection-test-successful": "اختبار الاتصال ناجح!",
- "connection-test-failed": "فشل اختبار الاتصال.",
- "configuration-saved-successfully": "تم حفظ التكوين بنجاح!",
- "failed-to-save-configuration": "فشل في حفظ التكوين.",
- "recommended": "موصى به",
- "reset": "إعادة تعيين",
- "reset-success": "تمت إعادة التعيين بنجاح!",
- "reset-failed": "فشل إعادة التعيين!",
-
- "network-proxy": "وكيل الشبكة",
- "network-proxy-description": "قم بتكوين خادم وكيل لطلبات الشبكة. هذا مفيد إذا كنت بحاجة إلى الوصول إلى واجهات برمجة التطبيقات الخارجية عبر وكيل.",
- "proxy-placeholder": "http://127.0.0.1:7890",
- "proxy-saved-restart-required": "تم حفظ تكوين الوكيل. أعد تشغيل التطبيق لتطبيق التغييرات.",
- "proxy-save-failed": "فشل حفظ تكوين الوكيل.",
- "proxy-invalid-url": "عنوان URL للوكيل غير صالح. يجب أن يبدأ بـ http:// أو https:// أو socks4:// أو socks5://.",
- "proxy-restart-hint": "يجب إعادة التشغيل لتطبيق تغييرات الوكيل.",
-
"preferred-ide": "IDE المفضل",
"preferred-ide-description": "اختر التطبيق الذي سيتم استخدامه عند فتح مجلدات مشاريع الوكيل.",
"system-file-manager": "مدير ملفات النظام",
+ "agents": "Agents",
"help-improve-eigent": "ساعد في تحسين Eigent",
"help-improve-eigent-description": "اسمح لـ Eigent بجمع سجلات الأخطاء المجهولة وبيانات الاستخدام لتحسين الخدمة. هذا اختياري ويمكن تغييره في أي وقت."
}
diff --git a/src/i18n/locales/ar/triggers.json b/src/i18n/locales/ar/triggers.json
index 329909522..9123d8f1c 100644
--- a/src/i18n/locales/ar/triggers.json
+++ b/src/i18n/locales/ar/triggers.json
@@ -190,6 +190,7 @@
"got-it": "Got it",
"add-trigger": "Add Trigger",
"trigger-limit-reached": "تم الوصول إلى حد المشغلات: 5 لكل مشروع، 25 لكل مستخدم",
+ "activation-limit-reached": "Activation limit reached: Maximum 5 active triggers per project, 25 per user",
"never": "Never",
"duplicate": "Duplicate",
"no-task-prompt": "No task prompt",
diff --git a/src/i18n/locales/de/layout.json b/src/i18n/locales/de/layout.json
index d6f78e435..025787472 100644
--- a/src/i18n/locales/de/layout.json
+++ b/src/i18n/locales/de/layout.json
@@ -29,6 +29,7 @@
"continue-with-google-login": "Mit Google anmelden",
"continue-with-github-login": "Mit Github anmelden",
"installation-failed": "Installation fehlgeschlagen",
+ "backend-startup-failed": "Backend Startup Failed",
"projects": "Projekte",
"agents": "Agenten",
"mcp-tools": "MCP & Tools",
@@ -69,7 +70,6 @@
"env-should-not-empty": "Umgebungsvariablen dürfen nicht leer sein",
"loading": "...",
"value-error": "Wertfehler,",
- "connect": "Verbinden",
"name-your-agent": "Benennen Sie Ihren Agenten",
"add-an-agent-name": "Agentenname hinzufügen...",
"im-an-agent-specially-designed-for": "Ich bin ein Agent, der speziell für... entwickelt wurde",
@@ -80,6 +80,8 @@
"coming-soon": "Demnächst verfügbar",
"uninstall": "Deinstallieren",
"install": "Installieren",
+ "connect": "Verbinden",
+ "disconnect": "Trennen",
"installed": "Installiert",
"installing": "Wird installiert",
"agent-tool": "Agent-Tool",
@@ -101,6 +103,7 @@
"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",
"home": "Startseite",
+ "back": "Zurück",
"developer-agent": "Entwickler-Agent",
"browser-agent": "Browser-Agent",
"document-agent": "Dokument-Agent",
@@ -116,6 +119,7 @@
"project-ended-successfully": "Projekt erfolgreich beendet",
"failed-to-end-project": "Fehler beim Beenden des Projekts",
"message-queued": "Nachricht in Warteschlange. Sie wird verarbeitet, wenn die aktuelle Aufgabe beendet ist.",
+ "task-stopped-successfully": "Task stopped successfully",
"task-skipped-successfully": "Aufgabe erfolgreich übersprungen",
"failed-to-skip-task": "Fehler beim Überspringen der Aufgabe",
"no-reply-received-task-continue": "Keine Antwort erhalten, Aufgabe wird fortgesetzt",
@@ -153,7 +157,6 @@
"open-browser": "Browser öffnen",
"no-cookies-saved-yet": "Noch keine Cookies gespeichert",
"no-cookies-saved-yet-description": "Klicken Sie oben auf \"Browser öffnen\", um sich bei Websites anzumelden und deren Cookies für zukünftige Aufgaben zu speichern.",
- "back": "Zurück",
"total-tokens": "Gesamt-Tokens",
"total-tasks": "Gesamt-Aufgaben",
"edit": "Bearbeiten",
diff --git a/src/i18n/locales/de/setting.json b/src/i18n/locales/de/setting.json
index 9d58d7cf4..969af11d3 100644
--- a/src/i18n/locales/de/setting.json
+++ b/src/i18n/locales/de/setting.json
@@ -18,7 +18,6 @@
"dark": "Dunkel",
"light": "Hell",
"transparent": "Transparent",
-
"data-privacy": "Datenschutz",
"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",
@@ -67,67 +66,6 @@
"url": "URL",
"enter-your-model-type": "Geben Sie Ihren Modelltyp ein",
"verifying": "Wird überprüft...",
-
- "account": "Konto",
- "you-are-currently-signed-in-with": "Sie sind derzeit angemeldet mit {{email}}",
- "manage": "Verwalten",
- "log-out": "Abmelden",
- "language": "Sprache",
- "select-language": "Sprache auswählen",
- "system-default": "Systemstandard",
- "appearance": "Erscheinungsbild",
- "dark": "Dunkel",
- "light": "Hell",
- "transparent": "Transparent",
-
- "data-privacy": "Datenschutz",
- "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.",
- "how-we-handle-your-data-line-1-line-3": "Nur minimale Aufgabendaten werden an KI-Modellanbieter oder von Ihnen aktivierte Drittanbieter-Integrationen gesendet; wir speichern keine Daten.",
- "how-we-handle-your-data-line-2": "Aufgabendateien, Ausgaben und Screenshots verbleiben lokal in Ihrem angegebenen Aufgabenordner.",
- "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.",
- "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!",
- "validate-success": "Validierung erfolgreich",
- "the-model-has-been-verified-to-support-function-calling-which-is-required-to-use-eigent": "Das Modell wurde verifiziert und unterstützt Function Calling, was für die Verwendung von Eigent erforderlich ist.",
- "validate-failed": "Validierung fehlgeschlagen",
- "copy": "Kopieren",
- "copied-to-clipboard": "In die Zwischenablage kopiert",
- "endpoint-url-can-not-be-empty": "Endpunkt-URL darf nicht leer sein!",
- "verification-failed-please-check-endpoint-url": "Verifizierung fehlgeschlagen, bitte überprüfen Sie die Endpunkt-URL",
- "eigent-cloud-version": "Eigent Cloud-Version",
- "you-are-currently-subscribed-to-the": "Sie sind derzeit abonniert für das",
- "discover-more-about-our": "Entdecken Sie mehr über unsere",
- "pricing-options": "Preismodelle",
- "credits": "Credits",
- "select-model-type": "Modelltyp auswählen",
- "custom-model": "Benutzerdefiniertes Modell",
- "use-your-own-api-keys-or-set-up-a-local-model": "Verwenden Sie Ihre eigenen API-Schlüssel oder richten Sie ein lokales Modell ein.",
- "verify": "Überprüfen",
- "local-model": "Lokales Modell",
- "model-platform": "Modellplattform",
- "model-endpoint-url": "Modell-Endpunkt-URL",
- "model-type": "Modelltyp",
- "enter-your-local-model-type": "Geben Sie Ihren lokalen Modelltyp ein",
- "you-are-on-selft-host-mode": "Sie befinden sich im Self-Host-Modus",
- "you-are-using-self-hosted-mode": "Sie verwenden den Self-hosted-Modus. Um die beste Leistung dieses Produkts zu erzielen, geben Sie bitte den Google Search Key unter „MCP und Tools“ ein, um sicherzustellen, dass Eigent ordnungsgemäß funktioniert.",
- "the-google-search-key-is-essential-for-delivering-accurate-search-results": "Der Google Search Key ist unerlässlich für die Bereitstellung genauer Suchergebnisse. Der Exa Search Key ist optional, aber für eine bessere Leistung sehr empfehlenswert.",
- "close": "Schließen",
- "enter-your-api-key": "Geben Sie Ihren API-",
- "key": "Schlüssel ein",
- "enter-your-api-host": "Geben Sie Ihren API-Host ein",
- "url": "URL",
- "enter-your-model-type": "Geben Sie Ihren Modelltyp ein",
- "verifying": "Wird überprüft...",
-
"mcp-and-tools": "MCP & Tools",
"add-mcp-server": "MCP-Server hinzufügen",
"market": "Markt",
@@ -142,6 +80,8 @@
"coming-soon": "Demnächst verfügbar",
"uninstall": "Deinstallieren",
"install": "Installieren",
+ "connect": "Verbinden",
+ "disconnect": "Trennen",
"add-your-agent": "Ihren Agenten hinzufügen",
"add-a-local-mcp-server-by-providing-a-valid-json-configuration": "Fügen Sie einen lokalen MCP-Server hinzu, indem Sie eine gültige JSON-Konfiguration bereitstellen.",
"learn-more": "Mehr erfahren",
@@ -161,7 +101,6 @@
"get-it-from": "Erhalten Sie es von",
"google-custom-search-api": "Google Custom Search API",
"google-cloud-console": "Google Cloud Console",
- "connect": "Verbinden",
"setting": "Einstellung",
"all": "Alle",
"mcp-market": "MCP-Markt",
@@ -210,6 +149,30 @@
"reset-success": "Zurücksetzen erfolgreich!",
"reset-failed": "Zurücksetzen fehlgeschlagen!",
"select-default-model": "Standardmodell auswählen",
+ "browser-login": "Browser Login",
+ "browser-login-description": "Open a Chrome browser to log in to your accounts. Your login data will be saved locally in a secure profile.",
+ "open-browser-login": "Open Browser for Login",
+ "opening-browser": "Opening Browser...",
+ "browser-opened-successfully": "Browser opened successfully. Please log in to your accounts.",
+ "failed-to-open-browser": "Failed to open browser. Please try again.",
+ "restart-to-apply": "Restart to Apply",
+ "cookie-manager": "Cookie Manager",
+ "cookie-manager-description": "Manage cookies saved from your browser sessions. Delete cookies for specific sites or all at once.",
+ "refresh": "Refresh",
+ "delete-all": "Delete All",
+ "search-domains": "Search domains...",
+ "loading-cookies": "Loading cookies...",
+ "no-cookies-found": "No cookies found",
+ "no-matching-domains": "No matching domains",
+ "login-to-save-cookies": "Use the browser login feature above to save cookies from your accounts.",
+ "cookies-count": "{{count}} cookies",
+ "last-access": "Last access",
+ "cookies-deleted-successfully": "Successfully deleted cookies for {{domain}}",
+ "failed-to-load-cookies": "Failed to load cookies. Please try again.",
+ "failed-to-delete-cookies": "Failed to delete cookies. Please try again.",
+ "confirm-delete-all-cookies": "Are you sure you want to delete all cookies? This action cannot be undone.",
+ "all-cookies-deleted": "All cookies have been deleted successfully.",
+ "cookie-delete-warning": "Note: Deleting cookies will log you out of the associated websites. You may need to restart the browser to see changes take effect.",
"network-proxy": "Netzwerk-Proxy",
"network-proxy-description": "Konfigurieren Sie einen Proxy-Server für Netzwerkanfragen. Dies ist nützlich, wenn Sie über einen Proxy auf externe APIs zugreifen müssen.",
"proxy-placeholder": "http://127.0.0.1:7890",
@@ -217,7 +180,6 @@
"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.",
-
"cloud-not-available-in-local-proxy": "Cloud-Version ist im lokalen Proxy-Modus nicht verfügbar",
"set-as-default": "Als Standard festlegen",
"api-key-setting": "API-Schlüssel-Einstellung",
@@ -225,11 +187,9 @@
"model-type-setting": "Modelltyp-Einstellung",
"please-select": "Bitte auswählen",
"configuring": "Wird konfiguriert...",
-
"models-default-setting-title": "Standard-Einstellung",
"models-default-setting-description": "Wähle eines deiner konfigurierten Modelle als Standardmodell für Eigent. Es wird global in deinem Arbeitsbereich angewendet.",
"models-configuration": "Konfiguration",
-
"gemini-3-pro-preview-name": "Gemini 3 Pro Preview",
"gemini-3.1-pro-preview-name": "Gemini 3.1 Pro Preview",
"gemini-3-flash-preview-name": "Gemini 3 Flash Preview",
@@ -245,17 +205,10 @@
"claude-sonnet-4-6-name": "Claude Sonnet 4.6",
"claude-opus-4-6-name": "Claude Opus 4.6",
"minimax-m2-5-name": "Minimax M2.5",
- "network-proxy": "Netzwerk-Proxy",
- "network-proxy-description": "Konfigurieren Sie einen Proxy-Server für Netzwerkanfragen. Dies ist nützlich, wenn Sie über einen Proxy auf externe APIs zugreifen müssen.",
- "proxy-placeholder": "http://127.0.0.1:7890",
- "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.",
-
"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",
+ "agents": "Agents",
"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."
}
diff --git a/src/i18n/locales/de/triggers.json b/src/i18n/locales/de/triggers.json
index 58190dfdf..a73f0f8f9 100644
--- a/src/i18n/locales/de/triggers.json
+++ b/src/i18n/locales/de/triggers.json
@@ -190,6 +190,7 @@
"got-it": "Got it",
"add-trigger": "Add Trigger",
"trigger-limit-reached": "Trigger-Limit erreicht: 5 pro Projekt, 25 pro Benutzer",
+ "activation-limit-reached": "Activation limit reached: Maximum 5 active triggers per project, 25 per user",
"never": "Never",
"duplicate": "Duplicate",
"no-task-prompt": "No task prompt",
diff --git a/src/i18n/locales/en-us/layout.json b/src/i18n/locales/en-us/layout.json
index f56d4ebc4..894ae6808 100644
--- a/src/i18n/locales/en-us/layout.json
+++ b/src/i18n/locales/en-us/layout.json
@@ -70,7 +70,6 @@
"env-should-not-empty": "env should not empty",
"loading": "...",
"value-error": "Value error,",
- "connect": "Connect",
"name-your-agent": "Name Your Agent",
"add-an-agent-name": "add an agent name...",
"im-an-agent-specially-designed-for": "I'm an agent specially designed for...",
@@ -81,6 +80,8 @@
"coming-soon": "Coming Soon",
"uninstall": "Uninstall",
"install": "Install",
+ "connect": "Connect",
+ "disconnect": "Disconnect",
"installed": "Installed",
"installing": "Installing",
"agent-tool": "Agent Tool",
diff --git a/src/i18n/locales/en-us/setting.json b/src/i18n/locales/en-us/setting.json
index 11f0485c2..e466f2b4b 100644
--- a/src/i18n/locales/en-us/setting.json
+++ b/src/i18n/locales/en-us/setting.json
@@ -82,6 +82,8 @@
"coming-soon": "Coming Soon",
"uninstall": "Uninstall",
"install": "Install",
+ "connect": "Connect",
+ "disconnect": "Disconnect",
"add-your-agent": "Add Your Agent",
"add-a-local-mcp-server-by-providing-a-valid-json-configuration": "Add a local MCP server by providing a valid JSON configuration.",
"learn-more": "Learn more",
@@ -101,7 +103,6 @@
"get-it-from": "Get it from",
"google-custom-search-api": "Google Custom Search API",
"google-cloud-console": "Google Cloud Console",
- "connect": "Connect",
"setting": "Setting",
"all": "All",
"mcp-market": "MCP Market",
@@ -213,185 +214,6 @@
"claude-sonnet-4-6-name": "Claude Sonnet 4.6",
"claude-opus-4-6-name": "Claude Opus 4.6",
"minimax-m2-5-name": "Minimax M2.5",
-
- "account": "Account",
- "you-are-currently-signed-in-with": "You are currently signed in with {{email}}",
- "manage": "Manage",
- "log-out": "Log out",
- "language": "Language",
- "select-language": "Select language",
- "system-default": "System Default",
- "appearance": "Appearance",
- "dark": "Dark",
- "light": "Light",
- "transparent": "Transparent",
-
- "data-privacy": "Data Privacy",
- "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.",
- "how-we-handle-your-data-line-1-line-3": "Only the minimum task data is sent to AI model providers or the third-party integrations you enable; we have zero data-retention",
- "how-we-handle-your-data-line-2": "Task files, outputs and screenshots remain in your designated task folder locally.",
- "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 don’t sell your data to third parties.",
- "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!",
- "validate-success": "Validate success",
- "the-model-has-been-verified-to-support-function-calling-which-is-required-to-use-eigent": "The model has been verified to support function calling, which is required to use Eigent.",
- "validate-failed": "Validate failed",
- "copy": "Copy",
- "copied-to-clipboard": "Copied to clipboard",
- "failed-to-copy-to-clipboard": "Failed to copy to clipboard",
- "endpoint-url-can-not-be-empty": "Endpoint URL can not be empty!",
- "verification-failed-please-check-endpoint-url": "Verification failed, please check Endpoint URL",
- "eigent-cloud-version": "Eigent Cloud Version",
- "you-are-currently-subscribed-to-the": "You are currently subscribed to the",
- "discover-more-about-our": "Discover more about our",
- "pricing-options": "pricing options",
- "credits": "Credits",
- "select-model-type": "Select Model Type",
- "custom-model": "Custom Model",
- "use-your-own-api-keys-or-set-up-a-local-model": "Use your own API keys or set up a local model.",
- "verify": "Verify",
- "local-model": "Local Model",
- "model-platform": "Model Platform",
- "model-endpoint-url": "Model Endpoint URL",
- "model-type": "Model Type",
- "enter-your-local-model-type": "Enter your local model type",
- "you-are-on-selft-host-mode": "You are on Selft Host Mode",
- "you-are-using-self-hosted-mode": "You're using Self-hosted mode. To get the best performance from this product, please enter the Google Search Key in \"MCP and Tools\" to ensure Eigent works properly.",
- "the-google-search-key-is-essential-for-delivering-accurate-search-results": "The Google Search Key is essential for delivering accurate search results. Exa Search Key is optional but highly recommended for better performance.",
- "close": "Close",
- "enter-your-api-key": "Enter your API",
- "key": "Key",
- "enter-your-api-host": "Enter your API Host",
- "url": "URL",
- "enter-your-model-type": "Enter your Model Type",
- "verifying": "Verifying...",
-
- "mcp-and-tools": "MCP & Tools",
- "add-mcp-server": "Add MCP Server",
- "market": "Market",
- "tools": "Tools",
- "added-external-servers": "Added external servers",
- "loading": "Loading...",
- "no-mcp-servers": "No MCP servers",
- "environmental-variables-required": "Environmental variables required",
- "load-failed": "Load failed",
- "save-failed": "Save failed",
- "invalid-json": "Invalid JSON",
- "coming-soon": "Coming Soon",
- "uninstall": "Uninstall",
- "install": "Install",
- "add-your-agent": "Add Your Agent",
- "add-a-local-mcp-server-by-providing-a-valid-json-configuration": "Add a local MCP server by providing a valid JSON configuration.",
- "learn-more": "Learn more",
- "installing": "Installing...",
- "edit-mcp-config": "Edit MCP Config",
- "name": "Name",
- "description": "Description",
- "command": "Command",
- "args-one-per-line": "Args (one per line)",
- "cancel": "Cancel",
- "save": "Save",
- "confirm-delete": "Confirm Delete",
- "are-you-sure-you-want-to-delete": "Are you sure you want to delete",
- "deleting": "Deleting...",
- "delete": "Delete",
- "configure {name} Toolkit": "Configure {{name}} Toolkit",
- "get-it-from": "Get it from",
- "google-custom-search-api": "Google Custom Search API",
- "google-cloud-console": "Google Cloud Console",
- "connect": "Connect",
- "setting": "Setting",
- "all": "All",
- "mcp-market": "MCP Market",
- "no-mcp-services": "No MCP services",
- "loading-more": "Loading more...",
- "no-more-mcp-servers": "No more MCP servers",
- "search-mcp": "Search MCPs",
- "installed": "Installed",
- "worker-name-cannot-be-empty": "Worker name cannot be empty",
- "worker-name-already-exists": "Worker name already exists",
- "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",
- "password-storage": "Password Storage",
- "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",
- "failed-to-install-google-calendar": "Failed to install Google Calendar",
- "notion-workspace-integration": "Notion workspace integration for reading and managing Notion pages",
- "google-calendar-integration": "Google Calendar integration for managing events and schedules",
- "mcp-server-already-exists": "MCP server \"{{name}}\" already exists",
- "google-search": "Google Search",
- "select-default-search-engine": "Select default search engine",
- "your-own-mcps": "Your own MCPs",
- "get-google-search-api": "Get Google Search API",
- "get-exa-api": "Get Exa API",
- "exa-ai": "Exa AI",
- "search-engine-integrations": "Search Engine Integrations",
- "configured": "Configured",
- "incomplete": "Incomplete",
- "not-configured": "Not Configured",
- "saving": "Saving...",
- "save-changes": "Save Changes",
- "enable": "Enable",
- "search": "Search",
- "test-connection": "Test Connection",
- "your-api-keys-are-stored-securely-and-never-shared-externally": "Your API keys are stored securely and never shared externally.",
- "this-service-is-public-and-does-not-require-credentials": "This service is public and does not require credentials.",
- "this-service-does-not-require-an-api-key": "This service does not require an API key.",
- "connection-test-successful": "Connection test successful!",
- "connection-test-failed": "Connection test failed.",
- "configuration-saved-successfully": "Configuration saved successfully!",
- "failed-to-save-configuration": "Failed to save configuration.",
- "recommended": "Recommended",
- "reset": "Reset",
- "reset-success": "Reset successfully!",
- "reset-failed": "Reset failed!",
-
- "browser-login": "Browser Login",
- "browser-login-description": "Open a Chrome browser to log in to your accounts. Your login data will be saved locally in a secure profile.",
- "open-browser-login": "Open Browser for Login",
- "opening-browser": "Opening Browser...",
- "browser-opened-successfully": "Browser opened successfully. Please log in to your accounts.",
- "failed-to-open-browser": "Failed to open browser. Please try again.",
- "restart-to-apply": "Restart to Apply",
-
- "cookie-manager": "Cookie Manager",
- "cookie-manager-description": "Manage cookies saved from your browser sessions. Delete cookies for specific sites or all at once.",
- "refresh": "Refresh",
- "delete-all": "Delete All",
- "search-domains": "Search domains...",
- "loading-cookies": "Loading cookies...",
- "no-cookies-found": "No cookies found",
- "no-matching-domains": "No matching domains",
- "login-to-save-cookies": "Use the browser login feature above to save cookies from your accounts.",
- "cookies-count": "{{count}} cookies",
- "last-access": "Last access",
- "deleting": "Deleting...",
- "cookies-deleted-successfully": "Successfully deleted cookies for {{domain}}",
- "failed-to-load-cookies": "Failed to load cookies. Please try again.",
- "failed-to-delete-cookies": "Failed to delete cookies. Please try again.",
- "confirm-delete-all-cookies": "Are you sure you want to delete all cookies? This action cannot be undone.",
- "all-cookies-deleted": "All cookies have been deleted successfully.",
- "cookie-delete-warning": "Note: Deleting cookies will log you out of the associated websites. You may need to restart the browser to see changes take effect.",
-
- "network-proxy": "Network Proxy",
- "network-proxy-description": "Configure a proxy server for network requests. This is useful if you need to access external APIs through a proxy.",
- "proxy-placeholder": "http://127.0.0.1:7890",
- "proxy-saved-restart-required": "Proxy configuration saved. Restart the app to apply changes.",
- "proxy-save-failed": "Failed to save proxy configuration.",
- "proxy-invalid-url": "Invalid proxy URL. Must start with http://, https://, socks4://, or socks5://.",
- "proxy-restart-hint": "Restart required to apply proxy changes.",
-
"preferred-ide": "Preferred IDE",
"preferred-ide-description": "Choose which application to use when opening agent project folders.",
"system-file-manager": "System File Manager",
diff --git a/src/i18n/locales/es/layout.json b/src/i18n/locales/es/layout.json
index 164cdb25e..fd5b8313d 100644
--- a/src/i18n/locales/es/layout.json
+++ b/src/i18n/locales/es/layout.json
@@ -29,6 +29,7 @@
"continue-with-google-login": "Continuar con Google",
"continue-with-github-login": "Continuar con Github",
"installation-failed": "Error al instalar",
+ "backend-startup-failed": "Backend Startup Failed",
"projects": "Proyectos",
"agents": "Agentes",
"mcp-tools": "MCP & Herramientas",
@@ -69,7 +70,6 @@
"env-should-not-empty": "Las variables de entorno no deben estar vacías",
"loading": "...",
"value-error": "Error de valor,",
- "connect": "Conectar",
"name-your-agent": "Nombra tu Agente",
"add-an-agent-name": "agregar un nombre de agente...",
"im-an-agent-specially-designed-for": "Soy un agente especialmente diseñado para...",
@@ -80,6 +80,8 @@
"coming-soon": "Próximamente",
"uninstall": "Desinstalar",
"install": "Instalar",
+ "connect": "Conectar",
+ "disconnect": "Desconectar",
"installed": "Instalado",
"installing": "Instalando",
"agent-tool": "Herramienta de Agente",
@@ -101,6 +103,7 @@
"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",
"home": "Inicio",
+ "back": "Atrás",
"developer-agent": "Agente Desarrollador",
"browser-agent": "Agente de Navegador",
"document-agent": "Agente de Documentos",
@@ -116,6 +119,7 @@
"project-ended-successfully": "Proyecto finalizado exitosamente",
"failed-to-end-project": "Error al finalizar proyecto",
"message-queued": "Mensaje en cola. Se procesará cuando la tarea actual termine.",
+ "task-stopped-successfully": "Task stopped successfully",
"task-skipped-successfully": "Tarea omitida exitosamente",
"failed-to-skip-task": "Error al omitir tarea",
"no-reply-received-task-continue": "No se recibió respuesta, la tarea continúa",
@@ -153,7 +157,6 @@
"open-browser": "Abrir Navegador",
"no-cookies-saved-yet": "Aún no se han guardado cookies",
"no-cookies-saved-yet-description": "Haga clic en \"Abrir Navegador\" arriba para iniciar sesión en sitios web y guardar sus cookies para tareas futuras.",
- "back": "Atrás",
"total-tokens": "Total de Tokens",
"total-tasks": "Total de Tareas",
"edit": "Editar",
diff --git a/src/i18n/locales/es/setting.json b/src/i18n/locales/es/setting.json
index 926a8e104..d216c0ac2 100644
--- a/src/i18n/locales/es/setting.json
+++ b/src/i18n/locales/es/setting.json
@@ -18,7 +18,6 @@
"dark": "Oscuro",
"light": "Claro",
"transparent": "Transparente",
-
"data-privacy": "Privacidad de datos",
"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",
@@ -67,67 +66,6 @@
"url": "URL",
"enter-your-model-type": "Ingresa tu Model Type",
"verifying": "Verificando...",
-
- "account": "Cuenta",
- "you-are-currently-signed-in-with": "Estás actualmente conectado con {{email}}",
- "manage": "Gestionar",
- "log-out": "Cerrar sesión",
- "language": "Idioma",
- "select-language": "Seleccionar idioma",
- "system-default": "Sistema predeterminado",
- "appearance": "Apariencia",
- "dark": "Oscuro",
- "light": "Claro",
- "transparent": "Transparente",
-
- "data-privacy": "Privacidad de datos",
- "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.",
- "how-we-handle-your-data-line-1-line-3": "Solo se envían los datos mínimos de las tareas a proveedores de modelos de IA o a las integraciones de terceros que activas; no tenemos ninguna retención de datos",
- "how-we-handle-your-data-line-2": "Los archivos de tareas, salidas y capturas de pantalla permanecen en tu carpeta de tareas designada localmente.",
- "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.",
- "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!",
- "validate-success": "Validación exitosa",
- "the-model-has-been-verified-to-support-function-calling-which-is-required-to-use-eigent": "El modelo ha sido verificado para soportar la llamada de funciones, lo que es necesario para usar Eigent.",
- "validate-failed": "Validación fallida",
- "copy": "Copiar",
- "copied-to-clipboard": "Copiado al portapapeles",
- "endpoint-url-can-not-be-empty": "Endpoint URL no puede estar vacío!",
- "verification-failed-please-check-endpoint-url": "Verificación fallida, por favor verifique Endpoint URL",
- "eigent-cloud-version": "Eigent Cloud Version",
- "you-are-currently-subscribed-to-the": "Actualmente estás suscrito a la",
- "discover-more-about-our": "Descubre más sobre nuestra",
- "pricing-options": "opciones de precios",
- "credits": "Créditos",
- "select-model-type": "Seleccionar Model Type",
- "custom-model": "Modelo personalizado",
- "use-your-own-api-keys-or-set-up-a-local-model": "Usa tus propias API keys o configura un modelo local.",
- "verify": "Verificar",
- "local-model": "Modelo local",
- "model-platform": "Plataforma de modelo",
- "model-endpoint-url": "URL de endpoint de modelo",
- "model-type": "Tipo de modelo",
- "enter-your-local-model-type": "Ingresa tu tipo de modelo local",
- "you-are-on-selft-host-mode": "Estás en modo Selft Host",
- "you-are-using-self-hosted-mode": "Estás usando modo Self-hosted. Para obtener el mejor rendimiento de este producto, por favor ingresa la Clave de Búsqueda de Google en \"MCP y Herramientas\" para asegurar que Eigent funcione correctamente.",
- "the-google-search-key-is-essential-for-delivering-accurate-search-results": "La Clave de Búsqueda de Google es esencial para entregar resultados de búsqueda precisos. La Clave de Búsqueda de Exa es opcional pero altamente recomendada para mejor rendimiento.",
- "close": "Cerrar",
- "enter-your-api-key": "Ingresa tu API",
- "key": "Key",
- "enter-your-api-host": "Ingresa tu API Host",
- "url": "URL",
- "enter-your-model-type": "Ingresa tu Model Type",
- "verifying": "Verificando...",
-
"mcp-and-tools": "MCP & Herramientas",
"add-mcp-server": "Agregar MCP Server",
"market": "Mercado",
@@ -142,6 +80,8 @@
"coming-soon": "Próximamente",
"uninstall": "Desinstalar",
"install": "Instalar",
+ "connect": "Conectar",
+ "disconnect": "Desconectar",
"add-your-agent": "Añade tu Agente",
"add-a-local-mcp-server-by-providing-a-valid-json-configuration": "Agregar un servidor MCP local proporcionando una configuración JSON válida.",
"learn-more": "Aprender más",
@@ -161,7 +101,6 @@
"get-it-from": "Obtenerlo de",
"google-custom-search-api": "Google Custom Search API",
"google-cloud-console": "Google Cloud Console",
- "connect": "Conectar",
"setting": "Configuración",
"all": "Todos",
"mcp-market": "MCP Mercado",
@@ -210,6 +149,30 @@
"reset-success": "¡Restablecido correctamente!",
"reset-failed": "¡Error al restablecer!",
"select-default-model": "Seleccionar modelo predeterminado",
+ "browser-login": "Browser Login",
+ "browser-login-description": "Open a Chrome browser to log in to your accounts. Your login data will be saved locally in a secure profile.",
+ "open-browser-login": "Open Browser for Login",
+ "opening-browser": "Opening Browser...",
+ "browser-opened-successfully": "Browser opened successfully. Please log in to your accounts.",
+ "failed-to-open-browser": "Failed to open browser. Please try again.",
+ "restart-to-apply": "Restart to Apply",
+ "cookie-manager": "Cookie Manager",
+ "cookie-manager-description": "Manage cookies saved from your browser sessions. Delete cookies for specific sites or all at once.",
+ "refresh": "Refresh",
+ "delete-all": "Delete All",
+ "search-domains": "Search domains...",
+ "loading-cookies": "Loading cookies...",
+ "no-cookies-found": "No cookies found",
+ "no-matching-domains": "No matching domains",
+ "login-to-save-cookies": "Use the browser login feature above to save cookies from your accounts.",
+ "cookies-count": "{{count}} cookies",
+ "last-access": "Last access",
+ "cookies-deleted-successfully": "Successfully deleted cookies for {{domain}}",
+ "failed-to-load-cookies": "Failed to load cookies. Please try again.",
+ "failed-to-delete-cookies": "Failed to delete cookies. Please try again.",
+ "confirm-delete-all-cookies": "Are you sure you want to delete all cookies? This action cannot be undone.",
+ "all-cookies-deleted": "All cookies have been deleted successfully.",
+ "cookie-delete-warning": "Note: Deleting cookies will log you out of the associated websites. You may need to restart the browser to see changes take effect.",
"network-proxy": "Proxy de red",
"network-proxy-description": "Configure un servidor proxy para las solicitudes de red. Esto es útil si necesita acceder a APIs externas a través de un proxy.",
"proxy-placeholder": "http://127.0.0.1:7890",
@@ -217,7 +180,6 @@
"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.",
-
"cloud-not-available-in-local-proxy": "La versión en la nube no está disponible en modo proxy local",
"set-as-default": "Establecer como predeterminado",
"api-key-setting": "Configuración de clave API",
@@ -225,11 +187,9 @@
"model-type-setting": "Configuración de tipo de modelo",
"please-select": "Por favor seleccione",
"configuring": "Configurando...",
-
"models-default-setting-title": "Configuración predeterminada",
"models-default-setting-description": "Elige uno de tus modelos configurados como modelo predeterminado para Eigent. Se aplicará globalmente en tu espacio de trabajo.",
"models-configuration": "Configuración",
-
"gemini-3-pro-preview-name": "Gemini 3 Pro Preview",
"gemini-3.1-pro-preview-name": "Gemini 3.1 Pro Preview",
"gemini-3-flash-preview-name": "Gemini 3 Flash Preview",
@@ -245,17 +205,10 @@
"claude-sonnet-4-6-name": "Claude Sonnet 4.6",
"claude-opus-4-6-name": "Claude Opus 4.6",
"minimax-m2-5-name": "Minimax M2.5",
- "network-proxy": "Proxy de red",
- "network-proxy-description": "Configure un servidor proxy para las solicitudes de red. Esto es útil si necesita acceder a APIs externas a través de un proxy.",
- "proxy-placeholder": "http://127.0.0.1:7890",
- "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.",
-
"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",
+ "agents": "Agents",
"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."
}
diff --git a/src/i18n/locales/es/triggers.json b/src/i18n/locales/es/triggers.json
index c7b99fdb7..19ce41457 100644
--- a/src/i18n/locales/es/triggers.json
+++ b/src/i18n/locales/es/triggers.json
@@ -190,6 +190,7 @@
"got-it": "Got it",
"add-trigger": "Add Trigger",
"trigger-limit-reached": "Límite de triggers alcanzado: 5 por proyecto, 25 por usuario",
+ "activation-limit-reached": "Activation limit reached: Maximum 5 active triggers per project, 25 per user",
"never": "Never",
"duplicate": "Duplicate",
"no-task-prompt": "No task prompt",
diff --git a/src/i18n/locales/fr/layout.json b/src/i18n/locales/fr/layout.json
index 562de3fc5..f0fbffe24 100644
--- a/src/i18n/locales/fr/layout.json
+++ b/src/i18n/locales/fr/layout.json
@@ -29,6 +29,7 @@
"continue-with-google-login": "Continuer avec Google",
"continue-with-github-login": "Continuer avec Github",
"installation-failed": "Échec de l'installation",
+ "backend-startup-failed": "Backend Startup Failed",
"projects": "Projets",
"agents": "Agents",
"mcp-tools": "MCP & Outils",
@@ -69,7 +70,6 @@
"env-should-not-empty": "Les variables d'environnement ne doivent pas être vides",
"loading": "...",
"value-error": "Erreur de valeur,",
- "connect": "Connecter",
"name-your-agent": "Nommez votre Agent",
"add-an-agent-name": "ajouter un nom d'agent...",
"im-an-agent-specially-designed-for": "Je suis un agent spécialement conçu pour...",
@@ -80,6 +80,8 @@
"coming-soon": "Bientôt disponible",
"uninstall": "Désinstaller",
"install": "Installer",
+ "connect": "Connecter",
+ "disconnect": "Déconnecter",
"installed": "Installé",
"installing": "Installation",
"agent-tool": "Outil Agent",
@@ -101,6 +103,7 @@
"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",
"home": "Accueil",
+ "back": "Retour",
"developer-agent": "Agent Développeur",
"browser-agent": "Agent Navigateur",
"document-agent": "Agent de Documents",
@@ -116,6 +119,7 @@
"project-ended-successfully": "Projet terminé avec succès",
"failed-to-end-project": "Échec de la fin du projet",
"message-queued": "Message en file d'attente. Il sera traité lorsque la tâche actuelle se terminera.",
+ "task-stopped-successfully": "Task stopped successfully",
"task-skipped-successfully": "Tâche ignorée avec succès",
"failed-to-skip-task": "Échec de l'ignorance de la tâche",
"no-reply-received-task-continue": "Aucune réponse reçue, la tâche continue",
@@ -153,7 +157,6 @@
"open-browser": "Ouvrir le Navigateur",
"no-cookies-saved-yet": "Aucun cookie enregistré pour le moment",
"no-cookies-saved-yet-description": "Cliquez sur \"Ouvrir le Navigateur\" ci-dessus pour vous connecter aux sites web et enregistrer leurs cookies pour les tâches futures.",
- "back": "Retour",
"total-tokens": "Total des Tokens",
"total-tasks": "Total des Tâches",
"edit": "Modifier",
diff --git a/src/i18n/locales/fr/setting.json b/src/i18n/locales/fr/setting.json
index 2cdbd4234..092fd7aa9 100644
--- a/src/i18n/locales/fr/setting.json
+++ b/src/i18n/locales/fr/setting.json
@@ -18,7 +18,6 @@
"dark": "Dark",
"light": "Light",
"transparent": "Transparent",
-
"data-privacy": "Data Privacy",
"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",
@@ -67,67 +66,6 @@
"url": "URL",
"enter-your-model-type": "Enter your Model Type",
"verifying": "Verifying...",
-
- "account": "Account",
- "you-are-currently-signed-in-with": "You are currently signed in with {{email}}",
- "manage": "Manage",
- "log-out": "Log out",
- "language": "Language",
- "select-language": "Select language",
- "system-default": "System Default",
- "appearance": "Appearance",
- "dark": "Dark",
- "light": "Light",
- "transparent": "Transparent",
-
- "data-privacy": "Data Privacy",
- "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.",
- "how-we-handle-your-data-line-1-line-3": "Only the minimum task data is sent to AI model providers or the third-party integrations you enable; we have zero data-retention",
- "how-we-handle-your-data-line-2": "Task files, outputs and screenshots remain in your designated task folder locally.",
- "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 don’t sell your data to third parties.",
- "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!",
- "validate-success": "Validate success",
- "the-model-has-been-verified-to-support-function-calling-which-is-required-to-use-eigent": "The model has been verified to support function calling, which is required to use Eigent.",
- "validate-failed": "Validate failed",
- "copy": "Copy",
- "copied-to-clipboard": "Copied to clipboard",
- "endpoint-url-can-not-be-empty": "Endpoint URL can not be empty!",
- "verification-failed-please-check-endpoint-url": "Verification failed, please check Endpoint URL",
- "eigent-cloud-version": "Eigent Cloud Version",
- "you-are-currently-subscribed-to-the": "You are currently subscribed to the",
- "discover-more-about-our": "Discover more about our",
- "pricing-options": "pricing options",
- "credits": "Credits",
- "select-model-type": "Select Model Type",
- "custom-model": "Custom Model",
- "use-your-own-api-keys-or-set-up-a-local-model": "Use your own API keys or set up a local model.",
- "verify": "Verify",
- "local-model": "Local Model",
- "model-platform": "Model Platform",
- "model-endpoint-url": "Model Endpoint URL",
- "model-type": "Model Type",
- "enter-your-local-model-type": "Enter your local model type",
- "you-are-on-selft-host-mode": "You are on Selft Host Mode",
- "you-are-using-self-hosted-mode": "You're using Self-hosted mode. To get the best performance from this product, please enter the Google Search Key in \"MCP and Tools\" to ensure Eigent works properly.",
- "the-google-search-key-is-essential-for-delivering-accurate-search-results": "The Google Search Key is essential for delivering accurate search results. Exa Search Key is optional but highly recommended for better performance.",
- "close": "Close",
- "enter-your-api-key": "Enter your API",
- "key": "Key",
- "enter-your-api-host": "Enter your API Host",
- "url": "URL",
- "enter-your-model-type": "Enter your Model Type",
- "verifying": "Verifying...",
-
"mcp-and-tools": "MCP & Tools",
"add-mcp-server": "Add MCP Server",
"market": "Market",
@@ -142,6 +80,8 @@
"coming-soon": "Coming Soon",
"uninstall": "Uninstall",
"install": "Installer",
+ "connect": "Connecter",
+ "disconnect": "Déconnecter",
"add-your-agent": "Ajoutez votre Agent",
"add-a-local-mcp-server-by-providing-a-valid-json-configuration": "Ajoutez un serveur MCP local en fournissant une configuration JSON valide.",
"learn-more": "En savoir plus",
@@ -161,7 +101,6 @@
"get-it-from": "Get it from",
"google-custom-search-api": "Google Custom Search API",
"google-cloud-console": "Google Cloud Console",
- "connect": "Connect",
"setting": "Setting",
"all": "All",
"mcp-market": "MCP Market",
@@ -172,6 +111,23 @@
"installed": "Installed",
"worker-name-cannot-be-empty": "Worker name cannot be empty",
"worker-name-already-exists": "Worker name already exists",
+ "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",
+ "password-storage": "Password Storage",
+ "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",
+ "failed-to-install-google-calendar": "Failed to install Google Calendar",
+ "notion-workspace-integration": "Notion workspace integration for reading and managing Notion pages",
+ "google-calendar-integration": "Google Calendar integration for managing events and schedules",
+ "mcp-server-already-exists": "MCP server \"{{name}}\" already exists",
+ "google-search": "Google Search",
+ "select-default-search-engine": "Select default search engine",
+ "your-own-mcps": "Your own MCPs",
+ "get-google-search-api": "Get Google Search API",
+ "get-exa-api": "Get Exa API",
+ "exa-ai": "Exa AI",
"search-engine-integrations": "Intégrations de Moteur de Recherche",
"configured": "Configuré",
"incomplete": "Incomplet",
@@ -193,6 +149,30 @@
"reset-success": "Réinitialisation réussie !",
"reset-failed": "Échec de la réinitialisation !",
"select-default-model": "Sélectionner le modèle par défaut",
+ "browser-login": "Browser Login",
+ "browser-login-description": "Open a Chrome browser to log in to your accounts. Your login data will be saved locally in a secure profile.",
+ "open-browser-login": "Open Browser for Login",
+ "opening-browser": "Opening Browser...",
+ "browser-opened-successfully": "Browser opened successfully. Please log in to your accounts.",
+ "failed-to-open-browser": "Failed to open browser. Please try again.",
+ "restart-to-apply": "Restart to Apply",
+ "cookie-manager": "Cookie Manager",
+ "cookie-manager-description": "Manage cookies saved from your browser sessions. Delete cookies for specific sites or all at once.",
+ "refresh": "Refresh",
+ "delete-all": "Delete All",
+ "search-domains": "Search domains...",
+ "loading-cookies": "Loading cookies...",
+ "no-cookies-found": "No cookies found",
+ "no-matching-domains": "No matching domains",
+ "login-to-save-cookies": "Use the browser login feature above to save cookies from your accounts.",
+ "cookies-count": "{{count}} cookies",
+ "last-access": "Last access",
+ "cookies-deleted-successfully": "Successfully deleted cookies for {{domain}}",
+ "failed-to-load-cookies": "Failed to load cookies. Please try again.",
+ "failed-to-delete-cookies": "Failed to delete cookies. Please try again.",
+ "confirm-delete-all-cookies": "Are you sure you want to delete all cookies? This action cannot be undone.",
+ "all-cookies-deleted": "All cookies have been deleted successfully.",
+ "cookie-delete-warning": "Note: Deleting cookies will log you out of the associated websites. You may need to restart the browser to see changes take effect.",
"network-proxy": "Proxy réseau",
"network-proxy-description": "Configurez un serveur proxy pour les requêtes réseau. Utile si vous devez accéder à des API externes via un proxy.",
"proxy-placeholder": "http://127.0.0.1:7890",
@@ -200,7 +180,6 @@
"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.",
-
"cloud-not-available-in-local-proxy": "La version cloud n'est pas disponible en mode proxy local",
"set-as-default": "Définir comme défaut",
"api-key-setting": "Paramètre de clé API",
@@ -208,11 +187,9 @@
"model-type-setting": "Paramètre de type de modèle",
"please-select": "Veuillez sélectionner",
"configuring": "Configuration...",
-
"models-default-setting-title": "Paramètre par défaut",
"models-default-setting-description": "Choisissez l'un de vos modèles configurés comme modèle par défaut pour Eigent. Il sera appliqué globalement dans votre espace de travail.",
"models-configuration": "Configuration",
-
"gemini-3-pro-preview-name": "Gemini 3 Pro Preview",
"gemini-3.1-pro-preview-name": "Gemini 3.1 Pro Preview",
"gemini-3-flash-preview-name": "Gemini 3 Flash Preview",
@@ -228,17 +205,10 @@
"claude-sonnet-4-6-name": "Claude Sonnet 4.6",
"claude-opus-4-6-name": "Claude Opus 4.6",
"minimax-m2-5-name": "Minimax M2.5",
- "network-proxy": "Proxy réseau",
- "network-proxy-description": "Configurez un serveur proxy pour les requêtes réseau. Utile si vous devez accéder à des API externes via un proxy.",
- "proxy-placeholder": "http://127.0.0.1:7890",
- "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.",
-
"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",
+ "agents": "Agents",
"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."
}
diff --git a/src/i18n/locales/fr/triggers.json b/src/i18n/locales/fr/triggers.json
index 431ad89a3..86042e2fe 100644
--- a/src/i18n/locales/fr/triggers.json
+++ b/src/i18n/locales/fr/triggers.json
@@ -190,6 +190,7 @@
"got-it": "Got it",
"add-trigger": "Add Trigger",
"trigger-limit-reached": "Limite de déclencheurs atteinte : 5 par projet, 25 par utilisateur",
+ "activation-limit-reached": "Activation limit reached: Maximum 5 active triggers per project, 25 per user",
"never": "Never",
"duplicate": "Duplicate",
"no-task-prompt": "No task prompt",
diff --git a/src/i18n/locales/it/layout.json b/src/i18n/locales/it/layout.json
index 29289b3ba..d7e8bd7ee 100644
--- a/src/i18n/locales/it/layout.json
+++ b/src/i18n/locales/it/layout.json
@@ -29,6 +29,7 @@
"continue-with-google-login": "Continua con Google",
"continue-with-github-login": "Continua con Github",
"installation-failed": "Installazione fallita",
+ "backend-startup-failed": "Backend Startup Failed",
"projects": "Progetti",
"agents": "Agenti",
"mcp-tools": "MCP e Strumenti",
@@ -69,7 +70,6 @@
"env-should-not-empty": "Le variabili d'ambiente non devono essere vuote",
"loading": "...",
"value-error": "Errore di valore,",
- "connect": "Connetti",
"name-your-agent": "Nomina il tuo Agente",
"add-an-agent-name": "aggiungi un nome agente...",
"im-an-agent-specially-designed-for": "Sono un agente progettato specificamente per...",
@@ -80,6 +80,8 @@
"coming-soon": "Prossimamente",
"uninstall": "Disinstalla",
"install": "Installa",
+ "connect": "Connetti",
+ "disconnect": "Disconnetti",
"installed": "Installato",
"installing": "Installazione",
"agent-tool": "Strumento Agente",
@@ -101,6 +103,7 @@
"are-you-sure-you-want-to-delete": "Sei sicuro di voler eliminare questa attività? Questa azione non può essere annullata.",
"share": "Condividi",
"home": "Home",
+ "back": "Indietro",
"developer-agent": "Agente Sviluppatore",
"browser-agent": "Agente Browser",
"document-agent": "Agente Documenti",
@@ -116,6 +119,7 @@
"project-ended-successfully": "Progetto terminato con successo",
"failed-to-end-project": "Impossibile terminare il progetto",
"message-queued": "Messaggio in coda. Verrà elaborato quando l'attività corrente finirà.",
+ "task-stopped-successfully": "Task stopped successfully",
"task-skipped-successfully": "Attività saltata con successo",
"failed-to-skip-task": "Impossibile saltare l'attività",
"no-reply-received-task-continue": "Nessuna risposta ricevuta, l'attività continua",
@@ -153,7 +157,6 @@
"open-browser": "Apri Browser",
"no-cookies-saved-yet": "Nessun cookie salvato ancora",
"no-cookies-saved-yet-description": "Fai clic su \"Apri Browser\" sopra per accedere ai siti web e salvare i loro cookie per le attività future.",
- "back": "Indietro",
"total-tokens": "Totale Token",
"total-tasks": "Totale Attività",
"edit": "Modifica",
diff --git a/src/i18n/locales/it/setting.json b/src/i18n/locales/it/setting.json
index 68d6db58f..e52171638 100644
--- a/src/i18n/locales/it/setting.json
+++ b/src/i18n/locales/it/setting.json
@@ -18,7 +18,6 @@
"dark": "Scuro",
"light": "Chiaro",
"transparent": "Trasparente",
-
"data-privacy": "Privacy dei dati",
"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",
@@ -67,67 +66,6 @@
"url": "URL",
"enter-your-model-type": "Inserisci il tuo tipo di modello",
"verifying": "Verifica in corso...",
-
- "account": "Account",
- "you-are-currently-signed-in-with": "Sei attualmente connesso con {{email}}",
- "manage": "Gestisci",
- "log-out": "Esci",
- "language": "Lingua",
- "select-language": "Seleziona lingua",
- "system-default": "Predefinito di sistema",
- "appearance": "Aspetto",
- "dark": "Scuro",
- "light": "Chiaro",
- "transparent": "Trasparente",
-
- "data-privacy": "Privacy dei dati",
- "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.",
- "how-we-handle-your-data-line-1-line-3": "Solo i dati minimi necessari per l'attività vengono inviati ai fornitori di modelli AI o alle integrazioni di terze parti da te abilitate; non abbiamo alcuna conservazione dei dati",
- "how-we-handle-your-data-line-2": "I file delle attività, gli output e gli screenshot rimangono nella tua cartella attività designata localmente.",
- "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.",
- "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!",
- "validate-success": "Validazione riuscita",
- "the-model-has-been-verified-to-support-function-calling-which-is-required-to-use-eigent": "Il modello è stato verificato per supportare la chiamata di funzione, necessaria per utilizzare Eigent.",
- "validate-failed": "Validazione fallita",
- "copy": "Copia",
- "copied-to-clipboard": "Copiato negli appunti",
- "endpoint-url-can-not-be-empty": "L'URL dell'endpoint non può essere vuoto!",
- "verification-failed-please-check-endpoint-url": "Verifica fallita, controlla l'URL dell'endpoint",
- "eigent-cloud-version": "Versione cloud di Eigent",
- "you-are-currently-subscribed-to-the": "Sei attualmente iscritto al",
- "discover-more-about-our": "Scopri di più sulle nostre",
- "pricing-options": "opzioni di prezzo",
- "credits": "Crediti",
- "select-model-type": "Seleziona tipo di modello",
- "custom-model": "Modello personalizzato",
- "use-your-own-api-keys-or-set-up-a-local-model": "Usa le tue chiavi API o imposta un modello locale.",
- "verify": "Verifica",
- "local-model": "Modello locale",
- "model-platform": "Piattaforma modello",
- "model-endpoint-url": "URL endpoint modello",
- "model-type": "Tipo modello",
- "enter-your-local-model-type": "Inserisci il tuo tipo di modello locale",
- "you-are-on-selft-host-mode": "Sei in modalità Self Host",
- "you-are-using-self-hosted-mode": "Stai usando la modalità Self-hosted. Per ottenere le migliori prestazioni da questo prodotto, inserisci la chiave di ricerca Google in \"MCP e Strumenti\" per garantire il corretto funzionamento di Eigent.",
- "the-google-search-key-is-essential-for-delivering-accurate-search-results": "La chiave di ricerca Google è essenziale per fornire risultati di ricerca accurati. La chiave di ricerca Exa è opzionale ma altamente raccomandata per prestazioni migliori.",
- "close": "Chiudi",
- "enter-your-api-key": "Inserisci la tua API",
- "key": "Chiave",
- "enter-your-api-host": "Inserisci il tuo host API",
- "url": "URL",
- "enter-your-model-type": "Inserisci il tuo tipo di modello",
- "verifying": "Verifica in corso...",
-
"mcp-and-tools": "MCP e Strumenti",
"add-mcp-server": "Aggiungi server MCP",
"market": "Mercato",
@@ -142,6 +80,8 @@
"coming-soon": "Prossimamente",
"uninstall": "Disinstalla",
"install": "Installa",
+ "connect": "Connetti",
+ "disconnect": "Disconnetti",
"add-your-agent": "Aggiungi il tuo Agente",
"add-a-local-mcp-server-by-providing-a-valid-json-configuration": "Aggiungi un server MCP locale fornendo una configurazione JSON valida.",
"learn-more": "Scopri di più",
@@ -161,7 +101,6 @@
"get-it-from": "Ottienilo da",
"google-custom-search-api": "API di ricerca personalizzata Google",
"google-cloud-console": "Console Google Cloud",
- "connect": "Connetti",
"setting": "Impostazione",
"all": "Tutto",
"mcp-market": "Mercato MCP",
@@ -210,6 +149,30 @@
"reset-success": "Reimpostazione riuscita!",
"reset-failed": "Reimpostazione non riuscita!",
"select-default-model": "Seleziona modello predefinito",
+ "browser-login": "Browser Login",
+ "browser-login-description": "Open a Chrome browser to log in to your accounts. Your login data will be saved locally in a secure profile.",
+ "open-browser-login": "Open Browser for Login",
+ "opening-browser": "Opening Browser...",
+ "browser-opened-successfully": "Browser opened successfully. Please log in to your accounts.",
+ "failed-to-open-browser": "Failed to open browser. Please try again.",
+ "restart-to-apply": "Restart to Apply",
+ "cookie-manager": "Cookie Manager",
+ "cookie-manager-description": "Manage cookies saved from your browser sessions. Delete cookies for specific sites or all at once.",
+ "refresh": "Refresh",
+ "delete-all": "Delete All",
+ "search-domains": "Search domains...",
+ "loading-cookies": "Loading cookies...",
+ "no-cookies-found": "No cookies found",
+ "no-matching-domains": "No matching domains",
+ "login-to-save-cookies": "Use the browser login feature above to save cookies from your accounts.",
+ "cookies-count": "{{count}} cookies",
+ "last-access": "Last access",
+ "cookies-deleted-successfully": "Successfully deleted cookies for {{domain}}",
+ "failed-to-load-cookies": "Failed to load cookies. Please try again.",
+ "failed-to-delete-cookies": "Failed to delete cookies. Please try again.",
+ "confirm-delete-all-cookies": "Are you sure you want to delete all cookies? This action cannot be undone.",
+ "all-cookies-deleted": "All cookies have been deleted successfully.",
+ "cookie-delete-warning": "Note: Deleting cookies will log you out of the associated websites. You may need to restart the browser to see changes take effect.",
"network-proxy": "Proxy di rete",
"network-proxy-description": "Configura un server proxy per le richieste di rete. Utile se devi accedere ad API esterne tramite un proxy.",
"proxy-placeholder": "http://127.0.0.1:7890",
@@ -217,7 +180,6 @@
"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.",
-
"cloud-not-available-in-local-proxy": "La versione cloud non è disponibile in modalità proxy locale",
"set-as-default": "Imposta come predefinito",
"api-key-setting": "Impostazione chiave API",
@@ -225,11 +187,9 @@
"model-type-setting": "Impostazione tipo di modello",
"please-select": "Seleziona",
"configuring": "Configurazione in corso...",
-
"models-default-setting-title": "Impostazione predefinita",
"models-default-setting-description": "Seleziona uno dei modelli configurati come modello predefinito per Eigent. Verrà applicato globalmente nel tuo spazio di lavoro.",
"models-configuration": "Configurazione",
-
"gemini-3-pro-preview-name": "Gemini 3 Pro Preview",
"gemini-3.1-pro-preview-name": "Gemini 3.1 Pro Preview",
"gemini-3-flash-preview-name": "Gemini 3 Flash Preview",
@@ -245,17 +205,10 @@
"claude-sonnet-4-6-name": "Claude Sonnet 4.6",
"claude-opus-4-6-name": "Claude Opus 4.6",
"minimax-m2-5-name": "Minimax M2.5",
- "network-proxy": "Proxy di rete",
- "network-proxy-description": "Configura un server proxy per le richieste di rete. Utile se devi accedere ad API esterne tramite un proxy.",
- "proxy-placeholder": "http://127.0.0.1:7890",
- "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.",
-
"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",
+ "agents": "Agents",
"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."
}
diff --git a/src/i18n/locales/it/triggers.json b/src/i18n/locales/it/triggers.json
index 16083035e..eed237826 100644
--- a/src/i18n/locales/it/triggers.json
+++ b/src/i18n/locales/it/triggers.json
@@ -190,6 +190,7 @@
"got-it": "Got it",
"add-trigger": "Add Trigger",
"trigger-limit-reached": "Limite trigger raggiunto: 5 per progetto, 25 per utente",
+ "activation-limit-reached": "Activation limit reached: Maximum 5 active triggers per project, 25 per user",
"never": "Never",
"duplicate": "Duplicate",
"no-task-prompt": "No task prompt",
diff --git a/src/i18n/locales/ja/layout.json b/src/i18n/locales/ja/layout.json
index cdbdcddb3..5570a61db 100644
--- a/src/i18n/locales/ja/layout.json
+++ b/src/i18n/locales/ja/layout.json
@@ -29,6 +29,7 @@
"continue-with-google-login": "Googleでログイン",
"continue-with-github-login": "Githubでログイン",
"installation-failed": "インストールに失敗しました",
+ "backend-startup-failed": "Backend Startup Failed",
"projects": "プロジェクト",
"agents": "エージェント",
"mcp-tools": "MCP & ツール",
@@ -69,7 +70,6 @@
"env-should-not-empty": "環境変数は空にできません",
"loading": "...",
"value-error": "値エラー、",
- "connect": "接続",
"name-your-agent": "エージェントに名前を付ける",
"add-an-agent-name": "エージェント名を追加...",
"im-an-agent-specially-designed-for": "私は...のために特別に設計されたエージェントです",
@@ -80,6 +80,8 @@
"coming-soon": "近日公開",
"uninstall": "アンインストール",
"install": "インストール",
+ "connect": "接続",
+ "disconnect": "切断",
"installed": "インストール済み",
"installing": "インストール中",
"agent-tool": "エージェントツール",
@@ -101,6 +103,7 @@
"are-you-sure-you-want-to-delete": "このタスクを削除してもよろしいですか?この操作は元に戻せません。",
"share": "共有",
"home": "ホーム",
+ "back": "戻る",
"developer-agent": "開発者エージェント",
"browser-agent": "ブラウザエージェント",
"document-agent": "ドキュメントエージェント",
@@ -116,6 +119,7 @@
"project-ended-successfully": "プロジェクトが正常に終了しました",
"failed-to-end-project": "プロジェクトの終了に失敗しました",
"message-queued": "メッセージがキューに入りました。現在のタスクが終了したときに処理されます。",
+ "task-stopped-successfully": "Task stopped successfully",
"task-skipped-successfully": "タスクが正常にスキップされました",
"failed-to-skip-task": "タスクのスキップに失敗しました",
"no-reply-received-task-continue": "返信が受信されませんでした、タスクは続行されます",
@@ -153,7 +157,6 @@
"open-browser": "ブラウザを開く",
"no-cookies-saved-yet": "まだCookieが保存されていません",
"no-cookies-saved-yet-description": "上記の「ブラウザを開く」をクリックして、ウェブサイトにログインし、将来のタスクのためにCookieを保存します。",
- "back": "戻る",
"total-tokens": "合計トークン",
"total-tasks": "合計タスク",
"edit": "編集",
diff --git a/src/i18n/locales/ja/setting.json b/src/i18n/locales/ja/setting.json
index a9ecb59d2..2aea4df75 100644
--- a/src/i18n/locales/ja/setting.json
+++ b/src/i18n/locales/ja/setting.json
@@ -18,7 +18,6 @@
"dark": "ダーク",
"light": "ライト",
"transparent": "透明",
-
"data-privacy": "データプライバシー",
"data-privacy-description": "Eigentはプライバシーを確保するためにローカルファーストの原則に基づいて構築されています。デフォルトでは、データはお客様のデバイスに残ります。クラウド機能はオプションであり、機能するために必要な最小限のデータのみを使用します。詳細については、当社の",
"privacy-policy": "プライバシーポリシー",
@@ -67,68 +66,6 @@
"url": "URL",
"enter-your-model-type": "モデルタイプを入力",
"verifying": "検証中...",
-
- "account": "アカウント",
- "you-are-currently-signed-in-with": "{{email}}で現在サインインしています",
- "manage": "管理",
- "log-out": "ログアウト",
- "language": "言語",
- "select-language": "言語を選択",
- "system-default": "システムデフォルト",
- "appearance": "外観",
- "dark": "ダーク",
- "light": "ライト",
- "transparent": "透明",
-
- "data-privacy": "データプライバシー",
- "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は、指定したローカルソフトウェアおよびファイルにアクセスするために、マウスとキーボードを使用する場合があります。",
- "how-we-handle-your-data-line-1-line-3": "有効にしたAIモデルプロバイダーまたはサードパーティ統合に送信されるのは、タスクの最小限のデータのみです。データ保持はありません。",
- "how-we-handle-your-data-line-2": "タスクファイル、出力、およびスクリーンショットは、ローカルの指定されたタスクフォルダに残ります。",
- "how-we-handle-your-data-line-3": "認証情報はローカルに保存され、暗号化され、承認されたステップにのみ使用されます。",
- "how-we-handle-your-data-line-4": "お客様の明示的な同意なしに、お客様のデータが当社のAIモデルのトレーニングに使用されることはありません。",
- "how-we-handle-your-data-line-5": "お客様のデータを第三者に販売することはありません。",
- "api-key-can-not-be-empty": "APIキーは空にできません!",
- "api-host-can-not-be-empty": "APIホストは空にできません!",
- "model-type-can-not-be-empty": "モデルタイプは空にできません!",
- "validate-success": "検証成功",
- "the-model-has-been-verified-to-support-function-calling-which-is-required-to-use-eigent": "モデルは関数呼び出しをサポートしていることが確認されました。これはEigentの使用に必要です。",
- "validate-failed": "検証失敗",
- "copy": "コピー",
- "copied-to-clipboard": "クリップボードにコピーしました",
- "failed-to-copy-to-clipboard": "クリップボードにコピーに失敗しました",
- "endpoint-url-can-not-be-empty": "エンドポイントURLは空にできません!",
- "verification-failed-please-check-endpoint-url": "検証に失敗しました。エンドポイントURLを確認してください",
- "eigent-cloud-version": "Eigentクラウドバージョン",
- "you-are-currently-subscribed-to-the": "現在、次のプランに登録しています",
- "discover-more-about-our": "当社の",
- "pricing-options": "料金オプション",
- "credits": "クレジット",
- "select-model-type": "モデルタイプを選択",
- "custom-model": "カスタムモデル",
- "use-your-own-api-keys-or-set-up-a-local-model": "独自のAPIキーを使用するか、ローカルモデルを設定します。",
- "verify": "検証",
- "local-model": "ローカルモデル",
- "model-platform": "モデルプラットフォーム",
- "model-endpoint-url": "モデルエンドポイントURL",
- "model-type": "モデルタイプ",
- "enter-your-local-model-type": "ローカルモデルタイプを入力",
- "you-are-on-selft-host-mode": "セルフホストモードです",
- "you-are-using-self-hosted-mode": "セルフホストモードを使用しています。この製品を最大限に活用するには、「MCP & ツール」にGoogle検索キーを入力して、Eigentが正しく機能するようにしてください。",
- "the-google-search-key-is-essential-for-delivering-accurate-search-results": "Google検索キーは、正確な検索結果を提供するために不可欠です。Exa検索キーはオプションですが、パフォーマンス向上のために強く推奨されます。",
- "close": "閉じる",
- "enter-your-api-key": "APIキーを入力",
- "key": "キー",
- "enter-your-api-host": "APIホストを入力",
- "url": "URL",
- "enter-your-model-type": "モデルタイプを入力",
- "verifying": "検証中...",
-
"mcp-and-tools": "MCP & ツール",
"add-mcp-server": "MCPサーバーを追加",
"market": "マーケット",
@@ -143,6 +80,8 @@
"coming-soon": "近日公開",
"uninstall": "アンインストール",
"install": "インストール",
+ "connect": "接続",
+ "disconnect": "切断",
"add-your-agent": "エージェントを追加",
"add-a-local-mcp-server-by-providing-a-valid-json-configuration": "有効なJSON構成を提供して、ローカルMCPサーバーを追加します。",
"learn-more": "詳細はこちら",
@@ -162,7 +101,6 @@
"get-it-from": "から入手",
"google-custom-search-api": "Googleカスタム検索API",
"google-cloud-console": "Google Cloud Console",
- "connect": "接続",
"setting": "設定",
"all": "すべて",
"mcp-market": "MCPマーケット",
@@ -211,6 +149,30 @@
"reset-success": "リセットに成功しました!",
"reset-failed": "リセットに失敗しました!",
"select-default-model": "デフォルトモデルを選択",
+ "browser-login": "Browser Login",
+ "browser-login-description": "Open a Chrome browser to log in to your accounts. Your login data will be saved locally in a secure profile.",
+ "open-browser-login": "Open Browser for Login",
+ "opening-browser": "Opening Browser...",
+ "browser-opened-successfully": "Browser opened successfully. Please log in to your accounts.",
+ "failed-to-open-browser": "Failed to open browser. Please try again.",
+ "restart-to-apply": "Restart to Apply",
+ "cookie-manager": "Cookie Manager",
+ "cookie-manager-description": "Manage cookies saved from your browser sessions. Delete cookies for specific sites or all at once.",
+ "refresh": "Refresh",
+ "delete-all": "Delete All",
+ "search-domains": "Search domains...",
+ "loading-cookies": "Loading cookies...",
+ "no-cookies-found": "No cookies found",
+ "no-matching-domains": "No matching domains",
+ "login-to-save-cookies": "Use the browser login feature above to save cookies from your accounts.",
+ "cookies-count": "{{count}} cookies",
+ "last-access": "Last access",
+ "cookies-deleted-successfully": "Successfully deleted cookies for {{domain}}",
+ "failed-to-load-cookies": "Failed to load cookies. Please try again.",
+ "failed-to-delete-cookies": "Failed to delete cookies. Please try again.",
+ "confirm-delete-all-cookies": "Are you sure you want to delete all cookies? This action cannot be undone.",
+ "all-cookies-deleted": "All cookies have been deleted successfully.",
+ "cookie-delete-warning": "Note: Deleting cookies will log you out of the associated websites. You may need to restart the browser to see changes take effect.",
"network-proxy": "ネットワークプロキシ",
"network-proxy-description": "ネットワークリクエスト用のプロキシサーバーを設定します。プロキシ経由で外部APIにアクセスする必要がある場合に便利です。",
"proxy-placeholder": "http://127.0.0.1:7890",
@@ -218,7 +180,6 @@
"proxy-save-failed": "プロキシ設定の保存に失敗しました。",
"proxy-invalid-url": "無効なプロキシURLです。http://、https://、socks4://、またはsocks5://で始まる必要があります。",
"proxy-restart-hint": "プロキシの変更を適用するには再起動が必要です。",
-
"cloud-not-available-in-local-proxy": "ローカルプロキシモードではクラウド版は利用できません",
"set-as-default": "デフォルトに設定",
"api-key-setting": "APIキー設定",
@@ -226,11 +187,9 @@
"model-type-setting": "モデルタイプ設定",
"please-select": "選択してください",
"configuring": "設定中...",
-
"models-default-setting-title": "デフォルト設定",
"models-default-setting-description": "設定済みモデルの中から、Eigent のデフォルトモデルを1つ選択します。ワークスペース全体にグローバルに適用されます。",
"models-configuration": "構成",
-
"gemini-3-pro-preview-name": "Gemini 3 Pro Preview",
"gemini-3.1-pro-preview-name": "Gemini 3.1 Pro Preview",
"gemini-3-flash-preview-name": "Gemini 3 Flash Preview",
@@ -246,17 +205,10 @@
"claude-sonnet-4-6-name": "Claude Sonnet 4.6",
"claude-opus-4-6-name": "Claude Opus 4.6",
"minimax-m2-5-name": "Minimax M2.5",
- "network-proxy": "ネットワークプロキシ",
- "network-proxy-description": "ネットワークリクエスト用のプロキシサーバーを設定します。プロキシ経由で外部APIにアクセスする必要がある場合に便利です。",
- "proxy-placeholder": "http://127.0.0.1:7890",
- "proxy-saved-restart-required": "プロキシ設定が保存されました。変更を適用するにはアプリを再起動してください。",
- "proxy-save-failed": "プロキシ設定の保存に失敗しました。",
- "proxy-invalid-url": "無効なプロキシURLです。http://、https://、socks4://、またはsocks5://で始まる必要があります。",
- "proxy-restart-hint": "プロキシの変更を適用するには再起動が必要です。",
-
"preferred-ide": "優先IDE",
"preferred-ide-description": "エージェントプロジェクトフォルダを開くときに使用するアプリケーションを選択します。",
"system-file-manager": "システムファイルマネージャー",
+ "agents": "Agents",
"help-improve-eigent": "Eigentの改善に協力する",
"help-improve-eigent-description": "サービス向上のため、Eigentが匿名のエラーログと使用状況データを収集することを許可します。これは任意であり、いつでも変更できます。"
}
diff --git a/src/i18n/locales/ja/triggers.json b/src/i18n/locales/ja/triggers.json
index 3bc437c20..785bfa47c 100644
--- a/src/i18n/locales/ja/triggers.json
+++ b/src/i18n/locales/ja/triggers.json
@@ -190,6 +190,7 @@
"got-it": "了解",
"add-trigger": "トリガーを追加",
"trigger-limit-reached": "トリガー制限に達しました:プロジェクトあたり5個、ユーザーあたり25個",
+ "activation-limit-reached": "Activation limit reached: Maximum 5 active triggers per project, 25 per user",
"never": "なし",
"duplicate": "複製",
"no-task-prompt": "タスクプロンプトなし",
diff --git a/src/i18n/locales/ko/chat.json b/src/i18n/locales/ko/chat.json
index 72fe22d26..1bf17fd6e 100644
--- a/src/i18n/locales/ko/chat.json
+++ b/src/i18n/locales/ko/chat.json
@@ -65,5 +65,7 @@
"open-in-vscode": "VS Code에서 열기",
"open-in-cursor": "Cursor에서 열기",
"open-in-file-manager": "파일 관리자에서 열기",
- "failed-to-open-folder": "폴더를 열 수 없습니다"
+ "failed-to-open-folder": "폴더를 열 수 없습니다",
+ "task-completed-card-title": "Task completed",
+ "task-completed-card-subtitle": "Automate your task with a trigger"
}
diff --git a/src/i18n/locales/ko/layout.json b/src/i18n/locales/ko/layout.json
index 8d63e507b..0945c01fd 100644
--- a/src/i18n/locales/ko/layout.json
+++ b/src/i18n/locales/ko/layout.json
@@ -29,6 +29,7 @@
"continue-with-google-login": "Google로 로그인",
"continue-with-github-login": "Github로 로그인",
"installation-failed": "설치 실패",
+ "backend-startup-failed": "Backend Startup Failed",
"projects": "프로젝트",
"agents": "에이전트",
"mcp-tools": "MCP 및 도구",
@@ -69,7 +70,6 @@
"env-should-not-empty": "환경 변수는 비워둘 수 없습니다",
"loading": "...",
"value-error": "값 오류,",
- "connect": "연결",
"name-your-agent": "에이전트 이름 지정",
"add-an-agent-name": "에이전트 이름 추가...",
"im-an-agent-specially-designed-for": "저는 특별히 ...을 위해 설계된 에이전트입니다",
@@ -80,6 +80,8 @@
"coming-soon": "출시 예정",
"uninstall": "제거",
"install": "설치",
+ "connect": "연결",
+ "disconnect": "연결 해제",
"installed": "설치됨",
"installing": "설치 중...",
"agent-tool": "에이전트 도구",
@@ -101,6 +103,7 @@
"are-you-sure-you-want-to-delete": "이 작업을 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.",
"share": "공유",
"home": "홈",
+ "back": "뒤로",
"developer-agent": "개발자 에이전트",
"browser-agent": "브라우저 에이전트",
"document-agent": "문서 에이전트",
@@ -116,6 +119,7 @@
"project-ended-successfully": "프로젝트가 성공적으로 종료되었습니다",
"failed-to-end-project": "프로젝트 종료에 실패했습니다",
"message-queued": "메시지가 대기열에 추가되었습니다. 현재 작업이 완료되면 처리됩니다.",
+ "task-stopped-successfully": "Task stopped successfully",
"task-skipped-successfully": "작업이 성공적으로 건너뛰어졌습니다",
"failed-to-skip-task": "작업 건너뛰기에 실패했습니다",
"no-reply-received-task-continue": "응답이 없으므로 작업을 계속합니다",
@@ -153,7 +157,6 @@
"open-browser": "브라우저 열기",
"no-cookies-saved-yet": "아직 쿠키가 저장되지 않았습니다",
"no-cookies-saved-yet-description": "위의 \"브라우저 열기\"를 클릭하여 웹사이트에 로그인하고 향후 작업을 위해 쿠키를 저장하세요.",
- "back": "뒤로",
"total-tokens": "총 토큰",
"total-tasks": "총 작업",
"edit": "편집",
diff --git a/src/i18n/locales/ko/setting.json b/src/i18n/locales/ko/setting.json
index 7566dca35..364acd239 100644
--- a/src/i18n/locales/ko/setting.json
+++ b/src/i18n/locales/ko/setting.json
@@ -18,7 +18,6 @@
"dark": "다크",
"light": "라이트",
"transparent": "투명",
-
"data-privacy": "데이터 개인정보 보호",
"data-privacy-description": "Eigent는 개인정보 보호를 위해 로컬 우선 원칙을 기반으로 구축되었습니다. 기본적으로 데이터는 사용자의 기기에 남아 있습니다. 클라우드 기능은 선택 사항이며 작동에 필요한 최소한의 데이터만 사용합니다. 자세한 내용은 당사의",
"privacy-policy": "개인정보 처리방침",
@@ -67,68 +66,6 @@
"url": "URL",
"enter-your-model-type": "모델 유형 입력",
"verifying": "확인 중...",
-
- "account": "계정",
- "you-are-currently-signed-in-with": "{{email}} 계정으로 로그인되어 있습니다.",
- "manage": "관리",
- "log-out": "로그아웃",
- "language": "언어",
- "select-language": "언어 선택",
- "system-default": "시스템 기본값",
- "appearance": "테마",
- "dark": "다크",
- "light": "라이트",
- "transparent": "투명",
-
- "data-privacy": "데이터 개인정보 보호",
- "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는 사용자가 지정한 로컬 소프트웨어 및 파일에 액세스하기 위해 마우스와 키보드를 사용할 수 있습니다.",
- "how-we-handle-your-data-line-1-line-3": "AI 모델 제공업체 또는 사용자가 활성화한 타사 통합에 전송되는 데이터는 최소한의 작업 데이터뿐이며, 데이터 보존은 전혀 없습니다.",
- "how-we-handle-your-data-line-2": "작업 파일, 출력 및 스크린샷은 로컬의 지정된 작업 폴더에 유지됩니다.",
- "how-we-handle-your-data-line-3": "자격 증명은 로컬에 암호화되어 저장되며 승인된 단계에만 사용됩니다.",
- "how-we-handle-your-data-line-4": "귀하의 명시적인 동의 없이 귀하의 데이터는 당사 AI 모델을 학습시키는 데 사용되지 않습니다.",
- "how-we-handle-your-data-line-5": "귀하의 데이터를 제3자에게 판매하지 않습니다.",
- "api-key-can-not-be-empty": "API 키는 비워둘 수 없습니다!",
- "api-host-can-not-be-empty": "API 호스트는 비워둘 수 없습니다!",
- "model-type-can-not-be-empty": "모델 유형은 비워둘 수 없습니다!",
- "validate-success": "유효성 검사 성공",
- "the-model-has-been-verified-to-support-function-calling-which-is-required-to-use-eigent": "모델이 함수 호출을 지원하는 것으로 확인되었습니다. 이는 Eigent를 사용하는 데 필요합니다.",
- "validate-failed": "유효성 검사 실패",
- "copy": "복사",
- "copied-to-clipboard": "클립보드에 복사됨",
- "failed-to-copy-to-clipboard": "클립보드에 복사에 실패했습니다",
- "endpoint-url-can-not-be-empty": "엔드포인트 URL은 비워둘 수 없습니다!",
- "verification-failed-please-check-endpoint-url": "확인 실패, 엔드포인트 URL을 확인하세요",
- "eigent-cloud-version": "Eigent 클라우드 버전",
- "you-are-currently-subscribed-to-the": "현재 다음 플랜을 구독 중입니다.",
- "discover-more-about-our": "당사의",
- "pricing-options": "가격 옵션",
- "credits": "크레딧",
- "select-model-type": "모델 유형 선택",
- "custom-model": "사용자 정의 모델",
- "use-your-own-api-keys-or-set-up-a-local-model": "자신의 API 키를 사용하거나 로컬 모델을 설정하십시오.",
- "verify": "확인",
- "local-model": "로컬 모델",
- "model-platform": "모델 플랫폼",
- "model-endpoint-url": "모델 엔드포인트 URL",
- "model-type": "모델 유형",
- "enter-your-local-model-type": "로컬 모델 유형 입력",
- "you-are-on-selft-host-mode": "셀프 호스트 모드입니다.",
- "you-are-using-self-hosted-mode": "셀프 호스트 모드를 사용 중입니다. 이 제품의 최적 성능을 얻으려면 \"MCP 및 도구\"에 Google 검색 키를 입력하여 Eigent가 올바르게 작동하도록 하세요.",
- "the-google-search-key-is-essential-for-delivering-accurate-search-results": "Google 검색 키는 정확한 검색 결과를 제공하는 데 필수적입니다. Exa 검색 키는 선택 사항이지만 더 나은 성능을 위해 강력히 권장됩니다.",
- "close": "닫기",
- "enter-your-api-key": "API 키 입력",
- "key": "키",
- "enter-your-api-host": "API 호스트 입력",
- "url": "URL",
- "enter-your-model-type": "모델 유형 입력",
- "verifying": "확인 중...",
-
"mcp-and-tools": "MCP 및 도구",
"add-mcp-server": "MCP 서버 추가",
"market": "마켓",
@@ -143,6 +80,8 @@
"coming-soon": "출시 예정",
"uninstall": "제거",
"install": "설치",
+ "connect": "연결",
+ "disconnect": "연결 해제",
"add-your-agent": "에이전트 추가",
"add-a-local-mcp-server-by-providing-a-valid-json-configuration": "유효한 JSON 구성을 제공하여 로컬 MCP 서버를 추가하세요.",
"learn-more": "더 알아보기",
@@ -162,7 +101,6 @@
"get-it-from": "여기서 다운로드",
"google-custom-search-api": "Google 맞춤 검색 API",
"google-cloud-console": "Google Cloud Console",
- "connect": "연결",
"setting": "설정",
"all": "전체",
"mcp-market": "MCP 마켓",
@@ -211,6 +149,30 @@
"reset-success": "초기화 완료!",
"reset-failed": "초기화 실패!",
"select-default-model": "기본 모델 선택",
+ "browser-login": "Browser Login",
+ "browser-login-description": "Open a Chrome browser to log in to your accounts. Your login data will be saved locally in a secure profile.",
+ "open-browser-login": "Open Browser for Login",
+ "opening-browser": "Opening Browser...",
+ "browser-opened-successfully": "Browser opened successfully. Please log in to your accounts.",
+ "failed-to-open-browser": "Failed to open browser. Please try again.",
+ "restart-to-apply": "Restart to Apply",
+ "cookie-manager": "Cookie Manager",
+ "cookie-manager-description": "Manage cookies saved from your browser sessions. Delete cookies for specific sites or all at once.",
+ "refresh": "Refresh",
+ "delete-all": "Delete All",
+ "search-domains": "Search domains...",
+ "loading-cookies": "Loading cookies...",
+ "no-cookies-found": "No cookies found",
+ "no-matching-domains": "No matching domains",
+ "login-to-save-cookies": "Use the browser login feature above to save cookies from your accounts.",
+ "cookies-count": "{{count}} cookies",
+ "last-access": "Last access",
+ "cookies-deleted-successfully": "Successfully deleted cookies for {{domain}}",
+ "failed-to-load-cookies": "Failed to load cookies. Please try again.",
+ "failed-to-delete-cookies": "Failed to delete cookies. Please try again.",
+ "confirm-delete-all-cookies": "Are you sure you want to delete all cookies? This action cannot be undone.",
+ "all-cookies-deleted": "All cookies have been deleted successfully.",
+ "cookie-delete-warning": "Note: Deleting cookies will log you out of the associated websites. You may need to restart the browser to see changes take effect.",
"network-proxy": "네트워크 프록시",
"network-proxy-description": "네트워크 요청을 위한 프록시 서버를 구성합니다. 프록시를 통해 외부 API에 접근해야 하는 경우 유용합니다.",
"proxy-placeholder": "http://127.0.0.1:7890",
@@ -218,7 +180,6 @@
"proxy-save-failed": "프록시 설정 저장에 실패했습니다.",
"proxy-invalid-url": "잘못된 프록시 URL입니다. http://, https://, socks4://, 또는 socks5://로 시작해야 합니다.",
"proxy-restart-hint": "프록시 변경 사항을 적용하려면 다시 시작해야 합니다.",
-
"cloud-not-available-in-local-proxy": "로컬 프록시 모드에서는 클라우드 버전을 사용할 수 없습니다",
"set-as-default": "기본값으로 설정",
"api-key-setting": "API 키 설정",
@@ -226,11 +187,9 @@
"model-type-setting": "모델 타입 설정",
"please-select": "선택하세요",
"configuring": "구성 중...",
-
"models-default-setting-title": "기본 설정",
"models-default-setting-description": "구성된 모델 중 하나를 Eigent의 기본 모델로 선택하세요. 워크스페이스 전체에 전역으로 적용됩니다.",
"models-configuration": "구성",
-
"gemini-3-pro-preview-name": "Gemini 3 Pro Preview",
"gemini-3.1-pro-preview-name": "Gemini 3.1 Pro Preview",
"gemini-3-flash-preview-name": "Gemini 3 Flash Preview",
@@ -246,17 +205,10 @@
"claude-sonnet-4-6-name": "Claude Sonnet 4.6",
"claude-opus-4-6-name": "Claude Opus 4.6",
"minimax-m2-5-name": "Minimax M2.5",
- "network-proxy": "네트워크 프록시",
- "network-proxy-description": "네트워크 요청을 위한 프록시 서버를 구성합니다. 프록시를 통해 외부 API에 접근해야 하는 경우 유용합니다.",
- "proxy-placeholder": "http://127.0.0.1:7890",
- "proxy-saved-restart-required": "프록시 설정이 저장되었습니다. 변경 사항을 적용하려면 앱을 다시 시작하세요.",
- "proxy-save-failed": "프록시 설정 저장에 실패했습니다.",
- "proxy-invalid-url": "잘못된 프록시 URL입니다. http://, https://, socks4://, 또는 socks5://로 시작해야 합니다.",
- "proxy-restart-hint": "프록시 변경 사항을 적용하려면 다시 시작해야 합니다.",
-
"preferred-ide": "선호 IDE",
"preferred-ide-description": "에이전트 프로젝트 폴더를 열 때 사용할 애플리케이션을 선택합니다.",
"system-file-manager": "시스템 파일 관리자",
+ "agents": "Agents",
"help-improve-eigent": "Eigent 개선에 도움주기",
"help-improve-eigent-description": "서비스 개선을 위해 Eigent가 익명의 오류 로그와 사용 데이터를 수집하도록 허용합니다. 이는 선택 사항이며 언제든지 변경할 수 있습니다."
}
diff --git a/src/i18n/locales/ko/triggers.json b/src/i18n/locales/ko/triggers.json
index eb1c67ae6..1409ea0b0 100644
--- a/src/i18n/locales/ko/triggers.json
+++ b/src/i18n/locales/ko/triggers.json
@@ -190,6 +190,7 @@
"got-it": "확인",
"add-trigger": "트리거 추가",
"trigger-limit-reached": "트리거 한도 도달: 프로젝트당 5개, 사용자당 25개",
+ "activation-limit-reached": "Activation limit reached: Maximum 5 active triggers per project, 25 per user",
"never": "안 함",
"duplicate": "복제",
"no-task-prompt": "작업 프롬프트 없음",
diff --git a/src/i18n/locales/ru/layout.json b/src/i18n/locales/ru/layout.json
index 07079bd04..3196fd7f3 100644
--- a/src/i18n/locales/ru/layout.json
+++ b/src/i18n/locales/ru/layout.json
@@ -29,6 +29,7 @@
"continue-with-google-login": "Продолжить с Google",
"continue-with-github-login": "Продолжить с Github",
"installation-failed": "Установка не удалась",
+ "backend-startup-failed": "Backend Startup Failed",
"projects": "Проекты",
"agents": "Агенты",
"mcp-tools": "MCP и Инструменты",
@@ -69,7 +70,6 @@
"env-should-not-empty": "переменная окружения не должна быть пустой",
"loading": "...",
"value-error": "Ошибка значения,",
- "connect": "Подключить",
"name-your-agent": "Назовите своего агента",
"add-an-agent-name": "добавить имя агента...",
"im-an-agent-specially-designed-for": "Я агент, специально разработанный для...",
@@ -80,6 +80,8 @@
"coming-soon": "Скоро",
"uninstall": "Удалить",
"install": "Установить",
+ "connect": "Подключить",
+ "disconnect": "Отключить",
"installed": "Установлено",
"installing": "Установка...",
"agent-tool": "Инструмент агента",
@@ -101,6 +103,7 @@
"are-you-sure-you-want-to-delete": "Вы уверены, что хотите удалить эту задачу? Это действие нельзя отменить.",
"share": "Поделиться",
"home": "Главная",
+ "back": "Назад",
"developer-agent": "Агент разработчика",
"browser-agent": "Агент браузера",
"document-agent": "Агент документов",
@@ -116,6 +119,7 @@
"project-ended-successfully": "Проект успешно завершен",
"failed-to-end-project": "Не удалось завершить проект",
"message-queued": "Сообщение поставлено в очередь. Оно будет обработано, когда текущая задача завершится.",
+ "task-stopped-successfully": "Task stopped successfully",
"task-skipped-successfully": "Задача успешно пропущена",
"failed-to-skip-task": "Не удалось пропустить задачу",
"no-reply-received-task-continue": "Ответ не получен, задача продолжается",
@@ -153,7 +157,6 @@
"open-browser": "Открыть браузер",
"no-cookies-saved-yet": "Файлы cookie ещё не сохранены",
"no-cookies-saved-yet-description": "Нажмите \"Открыть браузер\" выше, чтобы войти на веб-сайты и сохранить их файлы cookie для будущих задач.",
- "back": "Назад",
"total-tokens": "Всего токенов",
"total-tasks": "Всего задач",
"edit": "Редактировать",
diff --git a/src/i18n/locales/ru/setting.json b/src/i18n/locales/ru/setting.json
index 84381dc2e..80ac0ec31 100644
--- a/src/i18n/locales/ru/setting.json
+++ b/src/i18n/locales/ru/setting.json
@@ -18,7 +18,6 @@
"dark": "Тёмный",
"light": "Светлый",
"transparent": "Прозрачный",
-
"data-privacy": "Конфиденциальность данных",
"data-privacy-description": "Eigent построен по принципу \"сначала локально\", чтобы обеспечить вашу конфиденциальность. Ваши данные по умолчанию остаются на вашем устройстве. Облачные функции являются необязательными и используют только минимальные необходимые данные для функционирования. Полные сведения см. в нашей",
"privacy-policy": "Политике конфиденциальности",
@@ -67,67 +66,6 @@
"url": "URL",
"enter-your-model-type": "Введите ваш тип модели",
"verifying": "Проверка...",
-
- "account": "Аккаунт",
- "you-are-currently-signed-in-with": "Вы вошли с аккаунтом {{email}}",
- "manage": "Управление",
- "log-out": "Выйти",
- "language": "Язык",
- "select-language": "Выберите язык",
- "system-default": "По умолчанию в системе",
- "appearance": "Внешний вид",
- "dark": "Тёмный",
- "light": "Светлый",
- "transparent": "Прозрачный",
-
- "data-privacy": "Конфиденциальность данных",
- "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 может использовать вашу мышь и клавиатуру для доступа к локальному программному обеспечению и файлам, которые вы указываете.",
- "how-we-handle-your-data-line-1-line-3": "Только минимальные данные задачи отправляются поставщикам моделей ИИ или сторонним интеграциям, которые вы включаете; мы не храним данные.",
- "how-we-handle-your-data-line-2": "Файлы задач, результаты и снимки экрана остаются в вашей целевой папке задач локально.",
- "how-we-handle-your-data-line-3": "Учетные данные хранятся локально, зашифрованы и используются только для одобренных шагов.",
- "how-we-handle-your-data-line-4": "Ваши данные никогда не используются для обучения наших моделей ИИ без вашего явного согласия.",
- "how-we-handle-your-data-line-5": "Мы не продаем ваши данные третьим лицам.",
- "api-key-can-not-be-empty": "API-ключ не может быть пустым!",
- "api-host-can-not-be-empty": "API-хост не может быть пустым!",
- "model-type-can-not-be-empty": "Тип модели не может быть пустым!",
- "validate-success": "Проверка прошла успешно",
- "the-model-has-been-verified-to-support-function-calling-which-is-required-to-use-eigent": "Модель была проверена на поддержку вызовов функций, что требуется для использования Eigent.",
- "validate-failed": "Проверка не удалась",
- "copy": "Копировать",
- "copied-to-clipboard": "Скопировано в буфер обмена",
- "endpoint-url-can-not-be-empty": "URL конечной точки не может быть пустым!",
- "verification-failed-please-check-endpoint-url": "Проверка не удалась, проверьте URL конечной точки",
- "eigent-cloud-version": "Eigent Cloud Версия",
- "you-are-currently-subscribed-to-the": "В настоящее время вы подписаны на",
- "discover-more-about-our": "Узнайте больше о наших",
- "pricing-options": "вариантах ценообразования",
- "credits": "Кредиты",
- "select-model-type": "Выберите тип модели",
- "custom-model": "Пользовательская модель",
- "use-your-own-api-keys-or-set-up-a-local-model": "Используйте свои собственные API-ключи или настройте локальную модель.",
- "verify": "Проверить",
- "local-model": "Локальная модель",
- "model-platform": "Платформа модели",
- "model-endpoint-url": "URL конечной точки модели",
- "model-type": "Тип модели",
- "enter-your-local-model-type": "Введите тип вашей локальной модели",
- "you-are-on-selft-host-mode": "Вы находитесь в режиме самостоятельного хостинга",
- "you-are-using-self-hosted-mode": "Вы используете режим самостоятельного хостинга. Для достижения наилучшей производительности этого продукта введите ключ поиска Google в разделе \"MCP и Инструменты\", чтобы Eigent работал должным образом.",
- "the-google-search-key-is-essential-for-delivering-accurate-search-results": "Ключ поиска Google необходим для предоставления точных результатов поиска. Ключ Exa Search является необязательным, но настоятельно рекомендуется для лучшей производительности.",
- "close": "Закрыть",
- "enter-your-api-key": "Введите ваш API",
- "key": "ключ",
- "enter-your-api-host": "Введите ваш API-хост",
- "url": "URL",
- "enter-your-model-type": "Введите ваш тип модели",
- "verifying": "Проверка...",
-
"mcp-and-tools": "MCP и Инструменты",
"add-mcp-server": "Добавить MCP-сервер",
"market": "Рынок",
@@ -142,6 +80,8 @@
"coming-soon": "Скоро",
"uninstall": "Удалить",
"install": "Установить",
+ "connect": "Подключить",
+ "disconnect": "Отключить",
"add-your-agent": "Добавьте своего агента",
"add-a-local-mcp-server-by-providing-a-valid-json-configuration": "Добавьте локальный MCP-сервер, предоставив допустимую JSON-конфигурацию.",
"learn-more": "Подробнее",
@@ -161,7 +101,6 @@
"get-it-from": "Получить из",
"google-custom-search-api": "API поиска Google",
"google-cloud-console": "Консоль Google Cloud",
- "connect": "Подключить",
"setting": "Настройка",
"all": "Все",
"mcp-market": "MCP Маркет",
@@ -210,6 +149,30 @@
"reset-success": "Сброс выполнен успешно!",
"reset-failed": "Сбой сброса!",
"select-default-model": "Выбрать модель по умолчанию",
+ "browser-login": "Browser Login",
+ "browser-login-description": "Open a Chrome browser to log in to your accounts. Your login data will be saved locally in a secure profile.",
+ "open-browser-login": "Open Browser for Login",
+ "opening-browser": "Opening Browser...",
+ "browser-opened-successfully": "Browser opened successfully. Please log in to your accounts.",
+ "failed-to-open-browser": "Failed to open browser. Please try again.",
+ "restart-to-apply": "Restart to Apply",
+ "cookie-manager": "Cookie Manager",
+ "cookie-manager-description": "Manage cookies saved from your browser sessions. Delete cookies for specific sites or all at once.",
+ "refresh": "Refresh",
+ "delete-all": "Delete All",
+ "search-domains": "Search domains...",
+ "loading-cookies": "Loading cookies...",
+ "no-cookies-found": "No cookies found",
+ "no-matching-domains": "No matching domains",
+ "login-to-save-cookies": "Use the browser login feature above to save cookies from your accounts.",
+ "cookies-count": "{{count}} cookies",
+ "last-access": "Last access",
+ "cookies-deleted-successfully": "Successfully deleted cookies for {{domain}}",
+ "failed-to-load-cookies": "Failed to load cookies. Please try again.",
+ "failed-to-delete-cookies": "Failed to delete cookies. Please try again.",
+ "confirm-delete-all-cookies": "Are you sure you want to delete all cookies? This action cannot be undone.",
+ "all-cookies-deleted": "All cookies have been deleted successfully.",
+ "cookie-delete-warning": "Note: Deleting cookies will log you out of the associated websites. You may need to restart the browser to see changes take effect.",
"network-proxy": "Сетевой прокси",
"network-proxy-description": "Настройте прокси-сервер для сетевых запросов. Это полезно, если вам нужен доступ к внешним API через прокси.",
"proxy-placeholder": "http://127.0.0.1:7890",
@@ -217,7 +180,6 @@
"proxy-save-failed": "Не удалось сохранить конфигурацию прокси.",
"proxy-invalid-url": "Недопустимый URL прокси. Должен начинаться с http://, https://, socks4:// или socks5://.",
"proxy-restart-hint": "Для применения изменений прокси требуется перезапуск.",
-
"cloud-not-available-in-local-proxy": "Облачная версия недоступна в режиме локального прокси",
"set-as-default": "Сделать по умолчанию",
"api-key-setting": "Настройка API-ключа",
@@ -225,11 +187,9 @@
"model-type-setting": "Настройка типа модели",
"please-select": "Пожалуйста, выберите",
"configuring": "Конфигурирование...",
-
"models-default-setting-title": "Настройка по умолчанию",
"models-default-setting-description": "Выберите одну из настроенных моделей как модель по умолчанию для Eigent. Она будет применяться глобально во всём рабочем пространстве.",
"models-configuration": "Конфигурация",
-
"gemini-3-pro-preview-name": "Gemini 3 Pro Preview",
"gemini-3.1-pro-preview-name": "Gemini 3.1 Pro Preview",
"gemini-3-flash-preview-name": "Gemini 3 Flash Preview",
@@ -245,17 +205,10 @@
"claude-sonnet-4-6-name": "Claude Sonnet 4.6",
"claude-opus-4-6-name": "Claude Opus 4.6",
"minimax-m2-5-name": "Minimax M2.5",
- "network-proxy": "Сетевой прокси",
- "network-proxy-description": "Настройте прокси-сервер для сетевых запросов. Это полезно, если вам нужен доступ к внешним API через прокси.",
- "proxy-placeholder": "http://127.0.0.1:7890",
- "proxy-saved-restart-required": "Конфигурация прокси сохранена. Перезапустите приложение для применения изменений.",
- "proxy-save-failed": "Не удалось сохранить конфигурацию прокси.",
- "proxy-invalid-url": "Недопустимый URL прокси. Должен начинаться с http://, https://, socks4:// или socks5://.",
- "proxy-restart-hint": "Для применения изменений прокси требуется перезапуск.",
-
"preferred-ide": "Предпочитаемая IDE",
"preferred-ide-description": "Выберите приложение для открытия папок проектов агента.",
"system-file-manager": "Системный файловый менеджер",
+ "agents": "Agents",
"help-improve-eigent": "Помогите улучшить Eigent",
"help-improve-eigent-description": "Разрешите Eigent собирать анонимные журналы ошибок и данные об использовании для улучшения сервиса. Это необязательно и может быть изменено в любое время."
}
diff --git a/src/i18n/locales/ru/triggers.json b/src/i18n/locales/ru/triggers.json
index f440b1a31..c2b651d72 100644
--- a/src/i18n/locales/ru/triggers.json
+++ b/src/i18n/locales/ru/triggers.json
@@ -190,6 +190,7 @@
"got-it": "Got it",
"add-trigger": "Add Trigger",
"trigger-limit-reached": "Достигнут лимит триггеров: 5 на проект, 25 на пользователя",
+ "activation-limit-reached": "Activation limit reached: Maximum 5 active triggers per project, 25 per user",
"never": "Never",
"duplicate": "Duplicate",
"no-task-prompt": "No task prompt",
diff --git a/src/i18n/locales/zh-Hans/layout.json b/src/i18n/locales/zh-Hans/layout.json
index ce7bce0cb..b1bd6d2ba 100644
--- a/src/i18n/locales/zh-Hans/layout.json
+++ b/src/i18n/locales/zh-Hans/layout.json
@@ -10,8 +10,6 @@
"sign-up-failed-please-check-your-email-and-password": "注册失败, 请检查您的邮箱和密码",
"login-failed-please-try-again": "登录失败, 请重试",
"login-failed-please-check-your-email-and-password": "登录失败, 请检查您的邮箱和密码",
- "continue-with-google": "使用Google注册",
- "continue-with-github": "使用Github注册",
"or": "或",
"sign-up": "注册",
"login": "登录",
@@ -62,6 +60,7 @@
"save": "保存",
"not-found": "未找到",
"tasks": "任务",
+ "ongoing": "Ongoing",
"token": "# 令牌",
"configuring": "配置中...",
"not-configured": "未配置",
@@ -71,7 +70,6 @@
"env-should-not-empty": "环境变量不应为空",
"loading": "...",
"value-error": "值错误,",
- "connect": "连接",
"name-your-agent": "为您的智能体命名",
"add-an-agent-name": "添加智能体名称...",
"im-an-agent-specially-designed-for": "我是专门为...设计的智能体",
@@ -82,6 +80,8 @@
"coming-soon": "即将推出",
"uninstall": "卸载",
"install": "安装",
+ "connect": "连接",
+ "disconnect": "断开连接",
"installed": "已安装",
"installing": "安装中...",
"agent-tool": "智能体工具",
@@ -119,6 +119,7 @@
"project-ended-successfully": "项目成功结束",
"failed-to-end-project": "结束项目失败",
"message-queued": "消息已排队。它将在当前任务完成时处理。",
+ "task-stopped-successfully": "Task stopped successfully",
"task-skipped-successfully": "任务成功跳过",
"failed-to-skip-task": "跳过任务失败",
"no-reply-received-task-continue": "未收到回复,任务继续",
diff --git a/src/i18n/locales/zh-Hans/setting.json b/src/i18n/locales/zh-Hans/setting.json
index 109ceff52..b4b418cd3 100644
--- a/src/i18n/locales/zh-Hans/setting.json
+++ b/src/i18n/locales/zh-Hans/setting.json
@@ -7,9 +7,8 @@
"eigent-cloud": "Eigent Cloud",
"default": "默认",
"profile": "个人资料",
-
"account": "账户",
- "you-are-currently-signed-in-with": "你当前使用的是 {{email}} 账户",
+ "you-are-currently-signed-in-with": "你当前使用的是 {{email}} 账户",
"manage": "管理",
"log-out": "退出",
"language": "语言",
@@ -19,7 +18,6 @@
"dark": "深色",
"light": "亮色",
"transparent": "透明",
-
"data-privacy": "数据隐私",
"data-privacy-description": "Eigent 基于本地优先原则确保您的隐私。您的数据默认存储在您的设备上。云功能是可选的,仅使用最小的数据来实现功能。详细信息请访问我们的",
"privacy-policy": "隐私政策",
@@ -82,6 +80,8 @@
"coming-soon": "即将推出",
"uninstall": "卸载",
"install": "安装",
+ "connect": "连接",
+ "disconnect": "断开连接",
"add-your-agent": "添加您的智能体",
"add-a-local-mcp-server-by-providing-a-valid-json-configuration": "通过提供有效的 JSON 配置添加本地 MCP 服务器。",
"learn-more": "了解更多",
@@ -95,12 +95,12 @@
"save": "保存",
"confirm-delete": "确认删除",
"are-you-sure-you-want-to-delete": "你确定要删除",
+ "deleting": "删除中...",
"delete": "删除",
"configure {name} Toolkit": "配置 {{name}} 工具包",
"get-it-from": "获取它来自",
"google-custom-search-api": "Google Custom Search API",
"google-cloud-console": "Google Cloud Console",
- "connect": "连接",
"setting": "设置",
"all": "全部",
"mcp-market": "MCP 市场",
@@ -148,7 +148,7 @@
"reset": "重置",
"reset-success": "重置成功!",
"reset-failed": "重置失败!",
-
+ "select-default-model": "Select Default Model",
"browser-login": "浏览器登录",
"browser-login-description": "打开 Chrome 浏览器以登录您的账户。您的登录数据将安全地保存在本地配置文件中。",
"open-browser-login": "打开浏览器登录",
@@ -156,7 +156,6 @@
"browser-opened-successfully": "浏览器已成功打开。请登录您的账户。",
"failed-to-open-browser": "打开浏览器失败,请重试。",
"restart-to-apply": "重启应用",
-
"cookie-manager": "Cookie 管理器",
"cookie-manager-description": "管理从浏览器会话中保存的 Cookie。可以删除特定网站或全部 Cookie。",
"refresh": "刷新",
@@ -168,14 +167,19 @@
"login-to-save-cookies": "使用上面的浏览器登录功能来保存您账户的 Cookie。",
"cookies-count": "{{count}} 个 Cookie",
"last-access": "最后访问",
- "deleting": "删除中...",
"cookies-deleted-successfully": "已成功删除 {{domain}} 的 Cookie",
"failed-to-load-cookies": "加载 Cookie 失败,请重试。",
"failed-to-delete-cookies": "删除 Cookie 失败,请重试。",
"confirm-delete-all-cookies": "确定要删除所有 Cookie 吗?此操作无法撤销。",
"all-cookies-deleted": "所有 Cookie 已成功删除。",
"cookie-delete-warning": "注意:删除 Cookie 会使您从相关网站登出。您可能需要重启浏览器才能看到更改生效。",
-
+ "network-proxy": "Network Proxy",
+ "network-proxy-description": "Configure a proxy server for network requests. This is useful if you need to access external APIs through a proxy.",
+ "proxy-placeholder": "http://127.0.0.1:7890",
+ "proxy-saved-restart-required": "Proxy configuration saved. Restart the app to apply changes.",
+ "proxy-save-failed": "Failed to save proxy configuration.",
+ "proxy-invalid-url": "Invalid proxy URL. Must start with http://, https://, socks4://, or socks5://.",
+ "proxy-restart-hint": "Restart required to apply proxy changes.",
"cloud-not-available-in-local-proxy": "在本地代理模式下无法使用云端版本",
"set-as-default": "设为默认",
"api-key-setting": "API 密钥设置",
@@ -183,11 +187,9 @@
"model-type-setting": "模型类型设置",
"please-select": "请选择",
"configuring": "正在配置...",
-
"models-default-setting-title": "默认设置",
"models-default-setting-description": "从已配置的模型中选择一个作为 Eigent 的默认模型,它将全局应用到您的工作区。",
"models-configuration": "配置",
-
"gemini-3-pro-preview-name": "Gemini 3 Pro Preview",
"gemini-3.1-pro-preview-name": "Gemini 3.1 Pro Preview",
"gemini-3-flash-preview-name": "Gemini 3 Flash Preview",
@@ -203,10 +205,10 @@
"claude-sonnet-4-6-name": "Claude Sonnet 4.6",
"claude-opus-4-6-name": "Claude Opus 4.6",
"minimax-m2-5-name": "Minimax M2.5",
-
"preferred-ide": "首选 IDE",
"preferred-ide-description": "选择打开智能体项目文件夹时使用的应用程序。",
"system-file-manager": "系统文件管理器",
+ "agents": "Agents",
"help-improve-eigent": "帮助改进 Eigent",
"help-improve-eigent-description": "允许 Eigent 收集匿名错误日志和使用数据以改进服务。此项为可选,可随时更改。"
}
diff --git a/src/i18n/locales/zh-Hans/triggers.json b/src/i18n/locales/zh-Hans/triggers.json
index e0a822dc3..84f5d692e 100644
--- a/src/i18n/locales/zh-Hans/triggers.json
+++ b/src/i18n/locales/zh-Hans/triggers.json
@@ -190,6 +190,7 @@
"got-it": "知道了",
"add-trigger": "添加触发器",
"trigger-limit-reached": "触发器数量已达上限:每个项目 5 个,每个用户 25 个",
+ "activation-limit-reached": "Activation limit reached: Maximum 5 active triggers per project, 25 per user",
"never": "从不",
"duplicate": "复制",
"no-task-prompt": "暂无提示词",
diff --git a/src/i18n/locales/zh-Hant/layout.json b/src/i18n/locales/zh-Hant/layout.json
index 184a24ab5..1d5da6528 100644
--- a/src/i18n/locales/zh-Hant/layout.json
+++ b/src/i18n/locales/zh-Hant/layout.json
@@ -10,8 +10,6 @@
"sign-up-failed-please-check-your-email-and-password": "注册失败, 请检查您的邮箱和密码",
"login-failed-please-try-again": "登录失败, 请重试",
"login-failed-please-check-your-email-and-password": "登录失败, 请检查您的邮箱和密码",
- "continue-with-google": "使用Google注册",
- "continue-with-github": "使用Github注册",
"or": "或",
"sign-up": "注册",
"login": "登录",
@@ -31,6 +29,7 @@
"continue-with-google-login": "使用 Google 登录",
"continue-with-github-login": "使用 Github 登录",
"installation-failed": "安装失败",
+ "backend-startup-failed": "Backend Startup Failed",
"projects": "專案",
"agents": "智能體",
"mcp-tools": "MCP & 工具",
@@ -71,7 +70,6 @@
"env-should-not-empty": "環境變數不應為空",
"loading": "...",
"value-error": "值錯誤,",
- "connect": "連接",
"name-your-agent": "為您的智能體命名",
"add-an-agent-name": "新增智能體名稱...",
"im-an-agent-specially-designed-for": "我是專門為...設計的智能體",
@@ -82,6 +80,8 @@
"coming-soon": "即將推出",
"uninstall": "解除安裝",
"install": "安裝",
+ "connect": "連接",
+ "disconnect": "斷開連線",
"installed": "已安裝",
"installing": "安裝中...",
"agent-tool": "智能體工具",
@@ -119,6 +119,7 @@
"project-ended-successfully": "專案成功結束",
"failed-to-end-project": "結束專案失敗",
"message-queued": "訊息已排隊。它將在當前任務完成時處理。",
+ "task-stopped-successfully": "Task stopped successfully",
"task-skipped-successfully": "任務成功跳過",
"failed-to-skip-task": "跳過任務失敗",
"no-reply-received-task-continue": "未收到回覆,任務繼續",
diff --git a/src/i18n/locales/zh-Hant/setting.json b/src/i18n/locales/zh-Hant/setting.json
index 2a4091eb0..05da8a174 100644
--- a/src/i18n/locales/zh-Hant/setting.json
+++ b/src/i18n/locales/zh-Hant/setting.json
@@ -4,9 +4,11 @@
"privacy": "隱私",
"models": "模型",
"mcp": "MCP & 工具",
-
+ "eigent-cloud": "Eigent Cloud",
+ "default": "Default",
+ "profile": "Profile",
"account": "帳戶",
- "you-are-currently-signed-in-with": "您目前使用的是 {{email}} 帳戶",
+ "you-are-currently-signed-in-with": "您目前使用的是 {{email}} 帳戶",
"manage": "管理",
"log-out": "登出",
"language": "語言",
@@ -16,7 +18,6 @@
"dark": "深色",
"light": "淺色",
"transparent": "透明",
-
"data-privacy": "數據隱私",
"data-privacy-description": "Eigent 以本地優先原則確保您的隱私。您的數據預設儲存在您的設備上。雲端功能是可選的,僅使用最少量的數據來實現功能。詳細資訊請參閱我們的",
"privacy-policy": "隱私政策",
@@ -79,6 +80,8 @@
"coming-soon": "即將推出",
"uninstall": "解除安裝",
"install": "安裝",
+ "connect": "連接",
+ "disconnect": "斷開連線",
"add-your-agent": "新增您的智能體",
"add-a-local-mcp-server-by-providing-a-valid-json-configuration": "透過提供有效的 JSON 設定新增本地 MCP 伺服器。",
"learn-more": "了解更多",
@@ -98,7 +101,6 @@
"get-it-from": "從此處取得",
"google-custom-search-api": "Google Custom Search API",
"google-cloud-console": "Google Cloud Console",
- "connect": "連接",
"setting": "設定",
"all": "全部",
"mcp-market": "MCP 市場",
@@ -147,6 +149,37 @@
"reset-success": "重設成功!",
"reset-failed": "重設失敗!",
"select-default-model": "選擇預設模型",
+ "browser-login": "Browser Login",
+ "browser-login-description": "Open a Chrome browser to log in to your accounts. Your login data will be saved locally in a secure profile.",
+ "open-browser-login": "Open Browser for Login",
+ "opening-browser": "Opening Browser...",
+ "browser-opened-successfully": "Browser opened successfully. Please log in to your accounts.",
+ "failed-to-open-browser": "Failed to open browser. Please try again.",
+ "restart-to-apply": "Restart to Apply",
+ "cookie-manager": "Cookie Manager",
+ "cookie-manager-description": "Manage cookies saved from your browser sessions. Delete cookies for specific sites or all at once.",
+ "refresh": "Refresh",
+ "delete-all": "Delete All",
+ "search-domains": "Search domains...",
+ "loading-cookies": "Loading cookies...",
+ "no-cookies-found": "No cookies found",
+ "no-matching-domains": "No matching domains",
+ "login-to-save-cookies": "Use the browser login feature above to save cookies from your accounts.",
+ "cookies-count": "{{count}} cookies",
+ "last-access": "Last access",
+ "cookies-deleted-successfully": "Successfully deleted cookies for {{domain}}",
+ "failed-to-load-cookies": "Failed to load cookies. Please try again.",
+ "failed-to-delete-cookies": "Failed to delete cookies. Please try again.",
+ "confirm-delete-all-cookies": "Are you sure you want to delete all cookies? This action cannot be undone.",
+ "all-cookies-deleted": "All cookies have been deleted successfully.",
+ "cookie-delete-warning": "Note: Deleting cookies will log you out of the associated websites. You may need to restart the browser to see changes take effect.",
+ "network-proxy": "網路代理",
+ "network-proxy-description": "設定網路請求的代理伺服器。如果您需要透過代理存取外部 API,這將非常有用。",
+ "proxy-placeholder": "http://127.0.0.1:7890",
+ "proxy-saved-restart-required": "代理設定已儲存。請重新啟動應用程式以套用變更。",
+ "proxy-save-failed": "儲存代理設定失敗。",
+ "proxy-invalid-url": "無效的代理 URL。必須以 http://、https://、socks4:// 或 socks5:// 開頭。",
+ "proxy-restart-hint": "需要重新啟動應用程式以套用代理變更。",
"cloud-not-available-in-local-proxy": "在本機代理模式下無法使用雲端版本",
"set-as-default": "設為預設",
"api-key-setting": "API 金鑰設定",
@@ -154,11 +187,9 @@
"model-type-setting": "模型類型設定",
"please-select": "請選擇",
"configuring": "正在配置...",
-
"models-default-setting-title": "預設設定",
"models-default-setting-description": "從已配置的模型中選擇一個作為 Eigent 的預設模型,它將全域套用於您的工作區。",
"models-configuration": "配置",
-
"gemini-3-pro-preview-name": "Gemini 3 Pro Preview",
"gemini-3.1-pro-preview-name": "Gemini 3.1 Pro Preview",
"gemini-3-flash-preview-name": "Gemini 3 Flash Preview",
@@ -174,17 +205,10 @@
"claude-sonnet-4-6-name": "Claude Sonnet 4.6",
"claude-opus-4-6-name": "Claude Opus 4.6",
"minimax-m2-5-name": "Minimax M2.5",
-
- "network-proxy": "網路代理",
- "network-proxy-description": "設定網路請求的代理伺服器。如果您需要透過代理存取外部 API,這將非常有用。",
- "proxy-placeholder": "http://127.0.0.1:7890",
- "proxy-saved-restart-required": "代理設定已儲存。請重新啟動應用程式以套用變更。",
- "proxy-save-failed": "儲存代理設定失敗。",
- "proxy-invalid-url": "無效的代理 URL。必須以 http://、https://、socks4:// 或 socks5:// 開頭。",
- "proxy-restart-hint": "需要重新啟動應用程式以套用代理變更。",
"preferred-ide": "偏好 IDE",
"preferred-ide-description": "選擇開啟智能體專案資料夾時使用的應用程式。",
"system-file-manager": "系統檔案管理器",
+ "agents": "Agents",
"help-improve-eigent": "幫助改進 Eigent",
"help-improve-eigent-description": "允許 Eigent 收集匿名錯誤日誌和使用數據以改進服務。此項為可選,可隨時更改。"
}
diff --git a/src/i18n/locales/zh-Hant/triggers.json b/src/i18n/locales/zh-Hant/triggers.json
index 56f63cb99..bade33c05 100644
--- a/src/i18n/locales/zh-Hant/triggers.json
+++ b/src/i18n/locales/zh-Hant/triggers.json
@@ -190,6 +190,7 @@
"got-it": "知道了",
"add-trigger": "添加觸發器",
"trigger-limit-reached": "觸發器數量已達上限:每個項目 5 個,每個用戶 25 個",
+ "activation-limit-reached": "Activation limit reached: Maximum 5 active triggers per project, 25 per user",
"never": "從不",
"duplicate": "複製",
"no-task-prompt": "暫無提示詞",
diff --git a/src/pages/Browser/CDP.tsx b/src/pages/Browser/CDP.tsx
index 12d1e9293..e2d4dbcef 100644
--- a/src/pages/Browser/CDP.tsx
+++ b/src/pages/Browser/CDP.tsx
@@ -188,14 +188,14 @@ export default function CDP() {
confirmVariant="cuation"
/>
-
+
{t('layout.cdp-browser-connection')}
-
-
+
+
{t('layout.open-new-browser')}
@@ -203,6 +203,7 @@ export default function CDP() {
@@ -210,20 +211,20 @@ export default function CDP() {
-
+
{t('layout.cdp-browser-pool')}
{cdpBrowsers.length > 0 ? (
-
+
{cdpBrowsers.map((browser) => (
-
-
+
+
{browser.name || `Browser ${browser.port}`}
@@ -246,12 +247,12 @@ export default function CDP() {
))}
) : (
-
+
-
+
{t('layout.no-browsers-in-pool')}
-
+
{t('layout.add-browsers-hint')}
@@ -260,8 +261,8 @@ export default function CDP() {
{showConnectDialog && (
-
-
+
+
{t('layout.connect-existing-browser')}
@@ -276,7 +277,7 @@ export default function CDP() {
setConnectError('');
}}
placeholder={t('layout.enter-port-number')}
- className="w-full rounded-lg border border-border-disabled bg-surface-secondary px-4 py-2 text-body-sm text-text-body outline-none focus:border-border-focus"
+ className="rounded-lg border-border-disabled bg-surface-secondary px-4 py-2 text-body-sm text-text-body focus:border-border-focus w-full border outline-none"
onKeyDown={(event) => {
if (event.key === 'Enter') handleCheckAndConnect();
}}
@@ -286,7 +287,7 @@ export default function CDP() {
{connectError}
)}
-
+
diff --git a/src/pages/Connectors/components/MCPAddDialog.tsx b/src/pages/Connectors/components/MCPAddDialog.tsx
index 5bc890049..66e400eed 100644
--- a/src/pages/Connectors/components/MCPAddDialog.tsx
+++ b/src/pages/Connectors/components/MCPAddDialog.tsx
@@ -106,11 +106,11 @@ export default function MCPAddDialog({
size="lg"
showCloseButton
onClose={onClose}
- className="p-0"
+ className="p-0 flex max-h-[90vh] min-h-[min(90vh,32rem)] flex-col"
>
-
-
+
+
{t(
'setting.add-a-local-mcp-server-by-providing-a-valid-json-configuration'
)}
@@ -124,28 +124,32 @@ export default function MCPAddDialog({
{jsonError && (
-
+
{jsonError}
)}
-
-
{
- setLocalJson(v ?? '');
- }}
- options={{
- minimap: { enabled: false },
- fontSize: 14,
- scrollBeyondLastLine: false,
- readOnly: installing,
- automaticLayout: true,
- }}
- />
+
+
+ {
+ setLocalJson(v ?? '');
+ }}
+ options={{
+ minimap: { enabled: false },
+ fontSize: 14,
+ scrollBeyondLastLine: false,
+ readOnly: installing,
+ automaticLayout: true,
+ wordWrap: 'on',
+ wrappingStrategy: 'advanced',
+ }}
+ />
+
= ({
cancelButtonText={t('setting.cancel')}
onCancel={handleCloseMcpEnvSetting}
cancelButtonVariant="ghost"
+ cancelButtonRounded="full"
showConfirmButton
confirmButtonText={
isValidating ? 'Validating...' : t('setting.connect')
}
onConfirm={handleConfigureMcpEnvSetting}
confirmButtonVariant="primary"
+ confirmButtonRounded="full"
// Optional: consumers of DialogFooter may support disabled prop
{...(isValidating ? ({ confirmButtonDisabled: true } as any) : {})}
/>
diff --git a/src/pages/Connectors/components/MCPListItem.tsx b/src/pages/Connectors/components/MCPListItem.tsx
index 6c6661645..caeb51cd7 100644
--- a/src/pages/Connectors/components/MCPListItem.tsx
+++ b/src/pages/Connectors/components/MCPListItem.tsx
@@ -27,6 +27,12 @@ interface MCPListItemProps {
loading: boolean;
}
+function mcpUserLeadDotClass(status: number): string {
+ if (status === 1) return 'bg-icon-success';
+ if (status === 2 || status === 0) return 'bg-icon-secondary';
+ return 'bg-icon-warning';
+}
+
export default function MCPListItem({
item,
onSetting: _onSetting,
@@ -39,7 +45,10 @@ export default function MCPListItem({
return (
-
+
{item.mcp_name}
diff --git a/src/pages/Connectors/components/MCPMarket.tsx b/src/pages/Connectors/components/MCPMarket.tsx
index e4ff96351..4932cf618 100644
--- a/src/pages/Connectors/components/MCPMarket.tsx
+++ b/src/pages/Connectors/components/MCPMarket.tsx
@@ -91,6 +91,7 @@ export default function MCPMarket({
const [installing, setInstalling] = useState<{ [id: number]: boolean }>({});
const [installed, setInstalled] = useState<{ [id: number]: boolean }>({});
const [installedIds, setInstalledIds] = useState
([]);
+ const [userInstallsHydrated, setUserInstallsHydrated] = useState(false);
const [mcpCategory, setMcpCategory] = useState<
{ id: number; name: string }[]
>([]);
@@ -104,17 +105,23 @@ export default function MCPMarket({
const [userInstallMcp, setUserInstallMcp] = useState([]);
// get installed MCP list
useEffect(() => {
- proxyFetchGet('/api/v1/mcp/users').then((res) => {
- let ids: number[] = [];
- if (Array.isArray(res)) {
- setUserInstallMcp(res);
- ids = res.map((item: any) => item.mcp_id);
- } else if (Array.isArray(res.items)) {
- setUserInstallMcp(res.items);
- ids = res.items.map((item: any) => item.mcp_id);
- }
- setInstalledIds(ids);
- });
+ proxyFetchGet('/api/v1/mcp/users')
+ .then((res) => {
+ let ids: number[] = [];
+ if (Array.isArray(res)) {
+ setUserInstallMcp(res);
+ ids = res.map((item: any) => item.mcp_id);
+ } else if (Array.isArray(res.items)) {
+ setUserInstallMcp(res.items);
+ ids = res.items.map((item: any) => item.mcp_id);
+ }
+ setInstalledIds(ids);
+ })
+ .catch(() => {
+ setUserInstallMcp([]);
+ setInstalledIds([]);
+ })
+ .finally(() => setUserInstallsHydrated(true));
}, []);
// get MCP categories
@@ -273,7 +280,7 @@ export default function MCPMarket({
{externalKeyword === undefined && (
<>
-
+
+
-
+
{isLoading && items.length === 0 && (
-
+
{t('setting.loading')}
)}
{error && (
-
{error}
+
{error}
)}
{!isLoading && !error && items.length === 0 && (
-
+
{t('setting.no-mcp-services')}
)}
{items.map((item) => (
{/* Left: Icon */}
@@ -356,10 +363,10 @@ export default function MCPMarket({
);
})()}
-
-
-
-
+
+
+
+
{item.name}
@@ -368,22 +375,29 @@ export default function MCPMarket({
+ rounded="full"
+ disabled={!userInstallsHydrated || installing[item.id]}
+ onClick={() => {
+ if (!userInstallsHydrated) return;
installedIds.includes(item.id)
? handleDelete(item)
- : checkEnv(item.id)
- }
+ : checkEnv(item.id);
+ }}
>
- {installedIds.includes(item.id)
- ? t('setting.uninstall')
- : installing[item.id]
- ? t('setting.installing')
- : installed[item.id]
- ? t('setting.uninstall')
- : t('setting.install')}
+ {!userInstallsHydrated
+ ? t('setting.loading')
+ : installedIds.includes(item.id)
+ ? t('setting.disconnect')
+ : installing[item.id]
+ ? t('setting.installing')
+ : installed[item.id]
+ ? t('setting.disconnect')
+ : t('setting.connect')}
{item.home_page &&
@@ -400,7 +414,7 @@ export default function MCPMarket({
verticalAlign: 'middle',
}}
/>
-
+
{(() => {
const parts = item.home_page.split('/');
return parts.length > 4 ? parts[4] : item.home_page;
@@ -408,7 +422,7 @@ export default function MCPMarket({
)}
-
@@ -416,12 +430,12 @@ export default function MCPMarket({
))}
{isLoading && items.length > 0 && (
-
+
{t('setting.loading-more')}
)}
{!hasMore && items.length > 0 && (
-
+
{t('setting.no-more-mcp-servers')}
)}
diff --git a/src/style/index.css b/src/style/index.css
index 0d39423c9..24b082609 100644
--- a/src/style/index.css
+++ b/src/style/index.css
@@ -501,6 +501,11 @@ code {
background: rgba(255, 255, 255, 0.8);
}
+/* Ensure toast notifications are always visible above dialogs and modals */
+[data-sonner-toaster] {
+ z-index: 2147483647 !important;
+}
+
.stack-login-btn,
.stack-login-btn button {
width: 100%;