{
  "title": "Configuration",
  "description": "Manage gateway, agent defaults, tools, and integrations",
  "noConfig": "No configuration loaded",
  "noConfigDescription": "Could not load the configuration file. The gateway may be unreachable.",
  "retry": "Retry",
  "warning": "Changes here affect all agents and channels globally. Misconfiguration may break the gateway.",
  "save": "Save",
  "saving": "Saving...",
  "saved": "Saved",
  "failedToSave": "Failed to save configuration",
  "saveConfig": "Save Config",
  "usingGlobalDefaults": "Using global defaults",

  "tabs.server": "Server",
  "tabs.behavior": "Behavior",
  "tabs.aiDefaults": "AI Defaults",
  "tabs.quota": "Quota",
  "tabs.tools": "Tools",
  "tabs.integrations": "Integrations",

  "server.title": "Gateway Server",
  "server.description": "Network binding, authentication token, and access control",

  "gateway.host": "Host",
  "gateway.hostTip": "The network interface the gateway listens on. Use 0.0.0.0 to listen on all interfaces.",
  "gateway.port": "Port",
  "gateway.portTip": "The TCP port the gateway WebSocket and HTTP server binds to.",
  "gateway.token": "Auth Token",
  "gateway.tokenTip": "Bearer token required for all client connections. Leave empty to disable authentication.",
  "gateway.tokenManaged": "Token is managed via environment variable and cannot be edited here.",
  "gateway.ownerIds": "Owner IDs",
  "gateway.ownerIdsTip": "User IDs granted admin-level access. Separate multiple IDs with Enter.",
  "gateway.ownerIdsPlaceholder": "Enter owner ID...",
  "gateway.allowedOrigins": "Allowed Origins",
  "gateway.allowedOriginsTip": "CORS allowed origins for the HTTP API. Use * to allow all origins.",
  "gateway.allowedOriginsPlaceholder": "https://yourdomain.com",
  "gateway.toolStatus": "Tool Status Messages",
  "gateway.blockReply": "Block on Reply",
  "gateway.maxMessageChars": "Max Message Chars",
  "gateway.maxMessageCharsTip": "Maximum allowed character count per inbound message. Messages exceeding this limit are rejected.",
  "gateway.rateLimitRpm": "Rate Limit (RPM)",
  "gateway.rateLimitRpmTip": "Maximum requests per minute per user. Set to 0 to disable rate limiting.",
  "gateway.inboundDebounceMs": "Inbound Debounce (ms)",
  "gateway.inboundDebounceMsTip": "Delay in milliseconds before processing a new message, to coalesce rapid follow-ups. Set to -1 to disable.",
  "gateway.injectionAction": "Injection Detection Action",

  "agents.title": "Agent Defaults",
  "agents.description": "Default LLM provider, model, and runtime settings applied to all agents unless overridden",
  "agents.providerTip": "Default LLM provider used when an agent does not specify one.",
  "agents.modelTip": "Default model used when an agent does not specify one.",
  "agents.maxTokens": "Max Tokens",
  "agents.maxTokensTip": "Maximum tokens the model can generate in a single response.",
  "agents.temperature": "Temperature",
  "agents.temperatureTip": "Sampling temperature (0-2). Lower values produce more deterministic output.",
  "agents.maxToolIterations": "Max Tool Iterations",
  "agents.maxToolIterationsTip": "Maximum number of tool-call iterations per agent request.",
  "agents.contextWindow": "Context Window",
  "agents.contextWindowTip": "Total token budget for the model context window.",
  "agents.workspace": "Workspace Path",
  "agents.workspaceTip": "Root directory for agent file operations. Per-user subdirectories are created automatically.",
  "agents.restrictToWorkspace": "Restrict to Workspace",
  "agents.restrictToWorkspaceTip": "Prevent agents from reading or writing files outside the workspace path.",
  "agents.intentClassify": "Intent Classification",
  "agents.saveError": "Failed to save agent defaults",

  "agents.subagents.title": "Subagents",
  "agents.subagents.desc": "Sub-agent spawning limits",
  "agents.subagents.maxConcurrent": "Max Concurrent",
  "agents.subagents.maxConcurrentTip": "Maximum number of sub-agents that can run simultaneously.",
  "agents.subagents.maxSpawnDepth": "Max Spawn Depth",
  "agents.subagents.maxSpawnDepthTip": "Maximum nesting depth for sub-agent chains.",
  "agents.subagents.maxChildrenPerAgent": "Max Children Per Agent",
  "agents.subagents.maxChildrenPerAgentTip": "Maximum number of child sub-agents a single agent can spawn.",
  "agents.subagents.archiveAfterMin": "Archive After (min)",
  "agents.subagents.archiveAfterMinTip": "Minutes of inactivity before a sub-agent session is archived.",
  "agents.subagents.modelOverride": "Model Override",
  "agents.subagents.modelOverrideTip": "Force all sub-agents to use a specific model. Leave empty to inherit from the parent agent.",
  "agents.subagents.modelOverridePlaceholder": "(inherit from agent)",

  "agents.memory.title": "Memory",
  "agents.memory.desc": "Semantic memory search and embeddings",
  "agents.memory.enabled": "Enabled",
  "agents.memory.embeddingProvider": "Embedding Provider",
  "agents.memory.embeddingModel": "Embedding Model",
  "agents.memory.embeddingProviderTip": "Provider used to generate text embeddings for memory storage.",
  "agents.memory.embeddingModelTip": "Embedding model name. Leave empty to use the provider default.",
  "agents.memory.maxResults": "Max Results",
  "agents.memory.maxResultsTip": "Maximum number of memory entries returned per recall query.",
  "agents.memory.minScore": "Min Score",
  "agents.memory.minScoreTip": "Minimum similarity score (0-1) for a memory entry to be included in results.",

  "agents.compaction.title": "Compaction",
  "agents.compaction.desc": "Context window compaction settings",
  "agents.compaction.reserveTokensFloor": "Reserve Tokens Floor",
  "agents.compaction.reserveTokensFloorTip": "Minimum token buffer to reserve for new responses before compacting.",
  "agents.compaction.maxHistoryShare": "Max History Share (0-1)",
  "agents.compaction.maxHistoryShareTip": "Fraction of the context window that conversation history can occupy.",

  "agents.pruning.title": "Context Pruning",
  "agents.pruning.desc": "Trim old tool results to free context space",
  "agents.pruning.mode": "Mode",
  "agents.pruning.keepLastAssistants": "Keep Last Assistants",
  "agents.pruning.keepLastAssistantsTip": "Number of recent assistant turns to always preserve during pruning.",

  "agents.sandbox.title": "Sandbox",
  "agents.sandbox.desc": "Docker sandbox for code execution",
  "agents.sandbox.mode": "Mode",
  "agents.sandbox.image": "Docker Image",
  "agents.sandbox.imageTip": "Docker image used for the sandbox container.",
  "agents.sandbox.memoryMb": "Memory (MB)",
  "agents.sandbox.memoryMbTip": "Memory limit for the sandbox container in megabytes.",
  "agents.sandbox.cpus": "CPUs",
  "agents.sandbox.cpusTip": "CPU quota for the sandbox container (e.g. 1.0 = one full core).",
  "agents.sandbox.timeoutSec": "Timeout (sec)",
  "agents.sandbox.timeoutSecTip": "Maximum execution time in seconds before the sandbox is killed.",
  "agents.sandbox.networkEnabled": "Network Enabled",

  "behavior.uxTitle": "UX Behavior",
  "behavior.uxDescription": "High-impact toggles that change how the gateway interacts with users",
  "behavior.toolStatusHint": "Show real-time tool execution status messages to users during agent runs.",
  "behavior.toolStatusInfo": "Users will see live updates as the agent reads files, runs commands, and calls APIs.",
  "behavior.blockReplyHint": "Wait for the agent to finish before sending intermediate status updates.",
  "behavior.blockReplyInfo": "Only the final response is sent. Intermediate tool status messages are suppressed.",
  "behavior.intentClassifyHint": "Classify user intent before routing to reduce unnecessary agent invocations.",
  "behavior.intentClassifyInfo": "Agent will only be invoked when the classifier detects actionable intent.",
  "behavior.pendingCompactionTitle": "Pending Message Compaction",
  "behavior.pendingCompactionDescription": "Automatically summarize old group messages using LLM when the buffer exceeds a threshold",
  "behavior.pendingCompactionThreshold": "Threshold",
  "behavior.pendingCompactionThresholdTip": "Trigger compaction when a group accumulates more than this many pending messages. Set to 0 to use the default (50).",
  "behavior.pendingCompactionKeepRecent": "Keep Recent",
  "behavior.pendingCompactionKeepRecentTip": "Number of recent raw messages to keep after compaction. Older messages are replaced with an LLM summary. Default is 15.",
  "behavior.pendingCompactionMaxTokens": "Max Tokens",
  "behavior.pendingCompactionMaxTokensTip": "Maximum output tokens for LLM summarization. Default is 4096.",
  "behavior.pendingCompactionProvider": "Provider",
  "behavior.pendingCompactionProviderTip": "LLM provider for summarization. Leave empty to use the channel agent's provider.",
  "behavior.pendingCompactionProviderPlaceholder": "Use agent's provider",
  "behavior.pendingCompactionModel": "Model",
  "behavior.pendingCompactionModelTip": "Model for summarization. Leave empty to use the channel agent's model.",
  "behavior.pendingCompactionModelPlaceholder": "Use agent's model",
  "behavior.pendingCompactionInfo": "When a group chat exceeds the threshold, the LLM automatically summarizes older messages into a single compact entry, keeping the most recent ones intact for context.",
  "behavior.rateLimitTitle": "Rate Limiting",
  "behavior.rateLimitDescription": "Inbound message size limits and per-user request throttling",
  "behavior.sessionsTitle": "Session Scoping",
  "behavior.sessionsDescription": "Controls how conversation context is partitioned across users and channels",
  "behavior.securityTitle": "Input Security",
  "behavior.securityDescription": "Prompt injection detection and credential scrubbing to protect the gateway",
  "behavior.injectionActionHint": "What to do when a prompt injection attempt is detected in an inbound message.",
  "behavior.injectionBlockInfo": "All messages flagged as injection attempts will be blocked and the user will be notified.",
  "behavior.injectionOffInfo": "Injection detection is disabled. Malicious prompts will not be filtered.",
  "behavior.scrubCredentialsHint": "Automatically redact API keys, tokens, and passwords found in tool output before returning to the agent.",
  "behavior.scrubCredentialsInfo": "Credential patterns in tool responses are masked before the agent sees them.",
  "behavior.scrubCredentialsOffInfo": "Credential scrubbing is disabled. Secrets in tool output may be exposed to the agent.",

  "sessions.scope": "Session Scope",
  "sessions.scopeTip": "Determines how sessions are partitioned. 'Per Sender' gives each user a separate session; 'Global' shares one session across all users.",
  "sessions.dmScope": "DM Scope",
  "sessions.dmScopeTip": "How direct-message sessions are keyed. 'Per Channel Peer' is the recommended default.",

  "quota.title": "Usage Quota",
  "quota.description": "Per-user message quota limits with optional per-provider, channel, and group overrides",
  "quota.enabled": "Enable Quotas",
  "quota.enabledTip": "When enabled, users are limited to the message counts defined below.",
  "quota.defaultLimits": "Default Limits",
  "quota.defaultLimitsTip": "Fallback quota applied to all users not covered by a specific override.",
  "quota.hour": "Per Hour",
  "quota.hourTip": "Maximum messages allowed per hour.",
  "quota.day": "Per Day",
  "quota.dayTip": "Maximum messages allowed per day.",
  "quota.week": "Per Week",
  "quota.weekTip": "Maximum messages allowed per week.",
  "quota.keyLabel": "Key",
  "quota.addOverride": "Add Override",
  "quota.allOptionsAdded": "All options already added",
  "quota.providerOverrides": "Provider Overrides",
  "quota.providerOverridesTip": "Custom quota limits per LLM provider. Overrides the default when users interact through a specific provider.",
  "quota.channelOverrides": "Channel Overrides",
  "quota.channelOverridesTip": "Custom quota limits per channel type (e.g. telegram, discord).",
  "quota.groupOverrides": "Group Overrides",
  "quota.groupOverridesTip": "Custom quota limits for specific group chats.",
  "quota.selectProvider": "Select provider",
  "quota.selectChannel": "Select channel",
  "quota.selectGroup": "Select group",

  "tools.title": "Tool Profile",
  "tools.description": "Default tool availability and per-hour call rate limit for all agents",
  "tools.profile": "Profile",
  "tools.profileTip": "Predefined tool set. 'Minimal' exposes only safe read-only tools; 'Full' enables all tools.",
  "tools.profilePlaceholder": "Select profile...",
  "tools.rateLimitPerHour": "Rate Limit (per hour)",
  "tools.rateLimitPerHourTip": "Maximum tool calls allowed per agent per hour. Set to 0 to disable.",
  "tools.allow": "Allow",
  "tools.allowTip": "Explicitly allow additional tools not included in the selected profile.",
  "tools.allowPlaceholder": "Select tools to allow...",
  "tools.deny": "Deny",
  "tools.denyTip": "Explicitly block tools even if included in the selected profile.",
  "tools.denyPlaceholder": "Select tools to deny...",
  "tools.alsoAllow": "Also Allow",
  "tools.alsoAllowTip": "Additional tools to allow on top of the profile. Useful when using a restrictive profile.",
  "tools.alsoAllowPlaceholder": "Select additional tools...",
  "tools.execApproval": "Command Execution",
  "tools.execSecurity": "Security Mode",
  "tools.execSecurityTip": "Controls which shell commands agents are permitted to run. 'Allowlist' restricts to approved patterns.",
  "tools.execAskMode": "Ask Mode",
  "tools.execAskModeTip": "When to prompt the user for approval before executing a command.",
  "tools.execAllowlistLabel": "Allowed Commands (one pattern per line)",
  "tools.webSearch": "Web Search",
  "tools.webFetch": "Web fetch and browser automation",
  "tools.maxResults": "Max Results",
  "tools.webFetchPolicy": "Web Fetch Policy",
  "tools.webFetchPolicyTip": "Controls which URLs the agent can fetch. 'Allowlist' restricts to approved domains only.",
  "tools.allowedDomains": "Allowed Domains",
  "tools.blockedDomains": "Blocked Domains",
  "tools.blockedDomainsTip": "Domains always blocked regardless of policy. One entry per line, supports wildcards (*.example.com).",
  "tools.browser": "Browser Automation",
  "tools.browserEnabled": "Enabled",
  "tools.browserHeadless": "Headless",
  "tools.scrubCredentials": "Scrub Credentials",

  "tts.title": "Text-to-Speech",
  "tts.configured": "Configured",
  "tts.disabled": "Disabled",
  "tts.providerInfo": "Provider: {{provider}} — Auto: {{auto}}",
  "tts.noProvider": "No TTS provider configured.",
  "tts.manageLink": "Manage TTS settings",

  "cron.title": "Cron Scheduler",
  "cron.description": "Retry behaviour for failed scheduled tasks",
  "cron.maxRetries": "Max Retries",
  "cron.maxRetriesTip": "Maximum number of retry attempts for a failed cron task.",
  "cron.baseDelay": "Base Delay",
  "cron.baseDelayTip": "Initial backoff delay between retries (e.g. 2s, 500ms).",
  "cron.maxDelay": "Max Delay",
  "cron.maxDelayTip": "Maximum backoff delay between retries (e.g. 30s, 5m).",
  "cron.defaultTimezone": "Default Timezone",
  "cron.defaultTimezoneTip": "IANA timezone for cron expressions when not set per-job (e.g. Asia/Ho_Chi_Minh). Leave empty to use server system timezone.",
  "cron.defaultTimezonePlaceholder": "System timezone",

  "telemetry.title": "Telemetry (OpenTelemetry)",
  "telemetry.description": "Export traces and metrics to an OpenTelemetry-compatible backend",
  "telemetry.enabled": "Enabled",
  "telemetry.enabledTip": "Enable OpenTelemetry trace export. Requires the 'otel' build tag.",
  "telemetry.endpoint": "Endpoint",
  "telemetry.endpointTip": "OTLP exporter endpoint (host:port). For gRPC default is 4317, HTTP is 4318.",
  "telemetry.protocol": "Protocol",
  "telemetry.protocolTip": "Transport protocol for the OTLP exporter.",
  "telemetry.serviceName": "Service Name",
  "telemetry.serviceNameTip": "Service name reported in traces. Useful for filtering in the observability backend.",
  "telemetry.insecure": "Insecure",
  "telemetry.insecureTip": "Disable TLS for the OTLP connection. Only use in local/dev environments.",
  "telemetry.headers": "Export Headers",
  "telemetry.headersTip": "Additional HTTP headers sent with each OTLP export request (e.g. API keys for hosted backends).",
  "telemetry.headerKeyPlaceholder": "Header name",
  "telemetry.headerValuePlaceholder": "Header value",
  "telemetry.addHeader": "Add Header",

  "bindings.title": "Agent Bindings",
  "bindings.description": "Route specific channels, peers, or accounts to a designated agent",
  "bindings.add": "Add Binding",
  "bindings.noBindings": "No bindings configured. All messages are routed to the default agent.",
  "bindings.agentId": "Agent ID",
  "bindings.channel": "Channel",
  "bindings.peerKind": "Peer Kind",
  "bindings.peerId": "Peer ID",

  "providers.title": "Provider API Keys",
  "providers.description": "Override API keys and base URLs for configured LLM providers",
  "providers.noProviders": "No providers found in the configuration file.",
  "providers.apiKey": "API Key",
  "providers.apiBaseUrl": "Base URL",
  "providers.apiBaseUrlPlaceholder": "https://api.example.com/v1",
  "providers.managedVia": "Managed via {{envKey}} environment variable.",

  "channels.title": "Channel Settings",
  "channels.description": "Configure built-in channel integrations (tokens, policies, streaming)",
  "channels.noChannels": "No channels found in the configuration file.",
  "channels.enabled": "Enabled",
  "channels.token": "Token / Secret",
  "channels.managedVia": "Managed via {{envKey}} environment variable.",
  "channels.dmPolicy": "DM Policy",
  "channels.groupPolicy": "Group Policy",
  "channels.allowFrom": "Allow From",
  "channels.allowFromPlaceholder": "user_id_1, user_id_2, ...",
  "channels.dmStreaming": "DM Streaming",
  "channels.dmStreamingHint": "Progressive message updates in DMs",
  "channels.groupStreaming": "Group Streaming",
  "channels.groupStreamingHint": "Progressive message updates in groups",
  "channels.streaming": "Streaming",
  "channels.draftTransport": "Draft Preview",
  "channels.draftTransportHint": "Stealth streaming preview in DMs (no notifications per edit)",
  "channels.reasoningStream": "Show Reasoning",
  "channels.reasoningStreamHint": "Display AI thinking process as a separate message",
  "channels.reactionLevel": "Reaction Level",
  "channels.connectionMode": "Connection Mode",
  "channels.reactionOff": "Off",
  "channels.reactionMinimal": "Minimal",
  "channels.reactionFull": "Full",
  "channels.connectionWebsocket": "WebSocket",
  "channels.connectionWebhook": "Webhook",

  "bindings.any": "Any",

  "toast": {
    "saved": "Config saved",
    "saveFailed": "Failed to save config"
  }
}
