{
  "nav": {
    "chat": "Chat",
    "monitor": "Monitor",
    "overview": "Overview",
    "analytics": "Analytics",
    "logs": "Logs",
    "agents": "Agents",
    "sessions": "Sessions",
    "approvals": "Approvals",
    "comms": "Comms",
    "automation": "Automation",
    "workflows": "Workflows",
    "scheduler": "Scheduler",
    "goals": "Goals",
    "extensions": "Extensions",
    "channels": "Channels",
    "skills": "Skills",
    "hands": "Hands",
    "plugins": "Plugins",
    "system": "System",
    "runtime": "Runtime",
    "settings": "Settings",
    "memory": "Memory"
  },
  "status": {
    "connecting": "Connecting...",
    "reconnecting": "Reconnecting...",
    "disconnected": "disconnected",
    "ready": "ready",
    "error": "error",
    "notConfigured": "not configured",
    "unknown": "unknown"
  },
  "btn": {
    "refresh": "Refresh",
    "unlock": "Unlock Dashboard",
    "retry": "Retry",
    "send": "Send",
    "stop": "Stop",
    "cancel": "Cancel",
    "save": "Save",
    "delete": "Delete",
    "edit": "Edit",
    "add": "Add",
    "close": "Close",
    "back": "Back",
    "next": "Next",
    "skip": "Skip",
    "test": "Test Connection",
    "go": "Go",
    "chat": "Chat",
    "copy": "Copy",
    "copied": "Copied!"
  },
  "label": {
    "agents": "agent(s) running",
    "status": "Status",
    "version": "Version",
    "provider": "Provider",
    "model": "Model",
    "agent": "Agent",
    "messages": "Messages",
    "actions": "Actions",
    "name": "Name",
    "key": "Key",
    "value": "Value"
  },
  "auth": {
    "title": "API Key Required",
    "description": "This instance requires an API key. Enter the key from your config.toml.",
    "placeholder": "Enter API key...",
    "hint": "Add api_key = \"your-key\" at the top of ~/.librefang/config.toml"
  },
  "page": {
    "overview": "Overview",
    "sessions": "Sessions",
    "approvals": "Approvals",
    "logs": "Logs",
    "runtime": "Runtime"
  },
  "health": {
    "healthy": "Healthy",
    "unreachable": "Unreachable"
  },
  "stat": {
    "agentsRunning": "Agents Running",
    "tokensUsed": "Tokens Used",
    "totalCost": "Total Cost",
    "uptime": "Uptime",
    "channels": "Channels",
    "skills": "Skills",
    "mcpServers": "MCP Servers",
    "toolCalls": "Tool Calls",
    "providers": "Providers"
  },
  "card": {
    "gettingStarted": "Getting Started",
    "llmProviders": "LLM Providers",
    "systemHealth": "System Health",
    "securitySystems": "Security Systems",
    "connectedChannels": "Connected Channels"
  },
  "agents": {
    "newAgent": "+ New Agent",
    "stopAll": "Stop All",
    "yourAgents": "Your Agents",
    "startNew": "Or Start a New Agent",
    "startChatting": "Start Chatting"
  },
  "detail": {
    "info": "Info",
    "files": "Files",
    "config": "Config",
    "id": "ID",
    "state": "State",
    "mode": "Mode",
    "profile": "Profile",
    "provider": "Provider",
    "model": "Model",
    "change": "Change",
    "created": "Created",
    "fallbacks": "Fallbacks",
    "none": "None - add a fallback chain",
    "addFallback": "+ Add",
    "loadingFiles": "Loading files...",
    "notCreated": "Not created",
    "noWorkspaceFiles": "No workspace files found",
    "saving": "Saving...",
    "name": "Name",
    "systemPrompt": "System Prompt",
    "emoji": "Emoji",
    "color": "Color",
    "archetype": "Archetype",
    "vibe": "Vibe",
    "noneValue": "None",
    "saveConfig": "Save Config",
    "toolFilters": "Tool Filters",
    "toolFiltersDesc": "Allowlist: only these tools available (empty = all). Blocklist: these tools excluded.",
    "allowlist": "Allowlist",
    "blocklist": "Blocklist",
    "toolNamePlaceholder": "tool name",
    "clone": "Clone",
    "clearHistory": "Clear History",
    "removeTool": "Click to remove {tool}"
  },
  "mode": {
    "observe": "Observe",
    "assist": "Assist",
    "full": "Full"
  },
  "category": {
    "all": "All",
    "general": "General",
    "development": "Development",
    "research": "Research",
    "writing": "Writing",
    "business": "Business"
  },
  "profile": {
    "minimal": {
      "label": "Minimal",
      "desc": "Read-only file access"
    },
    "coding": {
      "label": "Coding",
      "desc": "Files + shell + web fetch"
    },
    "research": {
      "label": "Research",
      "desc": "Web search + file read/write"
    },
    "messaging": {
      "label": "Messaging",
      "desc": "Agents + memory access"
    },
    "automation": {
      "label": "Automation",
      "desc": "All tools except custom"
    },
    "balanced": {
      "label": "Balanced",
      "desc": "General-purpose tool set"
    },
    "precise": {
      "label": "Precise",
      "desc": "Focused tool set for accuracy"
    },
    "creative": {
      "label": "Creative",
      "desc": "Full tools with creative emphasis"
    },
    "full": {
      "label": "Full",
      "desc": "All 35+ tools"
    }
  },
  "template": {
    "GeneralAssistant": {
      "name": "General Assistant",
      "desc": "A versatile conversational agent that can help with everyday tasks, answer questions, and provide recommendations."
    },
    "CodeHelper": {
      "name": "Code Helper",
      "desc": "A programming-focused agent that writes, reviews, and debugs code across multiple languages."
    },
    "Researcher": {
      "name": "Researcher",
      "desc": "An analytical agent that breaks down complex topics, synthesizes information, and provides cited summaries."
    },
    "Writer": {
      "name": "Writer",
      "desc": "A creative writing agent that helps with drafting, editing, and improving written content of all kinds."
    },
    "DataAnalyst": {
      "name": "Data Analyst",
      "desc": "A data-focused agent that helps analyze datasets, create queries, and interpret statistical results."
    },
    "DevOpsEngineer": {
      "name": "DevOps Engineer",
      "desc": "A systems-focused agent for CI/CD, infrastructure, Docker, and deployment troubleshooting."
    },
    "CustomerSupport": {
      "name": "Customer Support",
      "desc": "A professional, empathetic agent for handling customer inquiries and resolving issues."
    },
    "Tutor": {
      "name": "Tutor",
      "desc": "A patient educational agent that explains concepts step-by-step and adapts to the learner's level."
    },
    "APIDesigner": {
      "name": "API Designer",
      "desc": "An agent specialized in RESTful API design, OpenAPI specs, and integration architecture."
    },
    "MeetingNotes": {
      "name": "Meeting Notes",
      "desc": "Summarizes meeting transcripts into structured notes with action items and key decisions."
    }
  },
  "time": {
    "now": "just now",
    "secondsAgo": "{count}s ago",
    "minutesAgo": "{count}m ago",
    "hoursAgo": "{count}h ago",
    "daysAgo": "{count}d ago"
  },
  "onboarding": {
    "welcome": "Welcome to LibreFang",
    "launchWizard": "Launch Setup Wizard",
    "configureManually": "Configure Manually",
    "dismiss": "Dismiss"
  },
  "provider": {
    "bannerText": "No AI provider configured — agents are paused.",
    "bannerAction": "Configure Provider",
    "tierFree": "Free / Local",
    "tierRecommended": "Recommended",
    "tierOther": "Other Providers",
    "getKey": "Get API Key",
    "ollamaDetected": "Ollama detected on this machine",
    "ollamaNotDetected": "Ollama not detected",
    "ollamaActivate": "Activate Ollama",
    "activateSuccess": "Provider activated — agents resuming",
    "setupTitle": "AI Provider Setup",
    "setupDesc": "Configure at least one AI provider to activate your agents."
  },
  "overview": {
    "connectionError": "Connection Error",
    "stepsCompleted": "{count} of 5 steps completed",
    "setupWizard": "Setup Wizard",
    "welcomeDesc": "Get started quickly with the guided Setup Wizard, or configure manually:",
    "llmProviders": "LLM Providers",
    "providersConfigured": "{configured}/{total} configured",
    "systemHealth": "System Health",
    "securitySystems": "Security Systems",
    "connectedChannels": "Connected Channels",
    "quickActions": "Quick Actions",
    "newAgent": "New Agent",
    "browseSkills": "Browse Skills",
    "addChannel": "Add Channel",
    "createWorkflow": "Create Workflow",
    "settings": "Settings",
    "recentActivity": "Recent Activity",
    "viewAll": "View All",
    "noRecentActivity": "No Recent Activity",
    "activityWillAppear": "Activity will appear here once agents start processing.",
    "chatWithAgent": "Chat with an Agent",
    "createAgent": "Create Agent",
    "spawnNewAgent": "Spawn a new agent",
    "configureProvider": "Configure Provider",
    "setupLlmProvider": "Set up an LLM provider",
    "exploreSkills": "Explore available skills",
    "defenseActive": "{count} defense-in-depth systems active",
    "channelsConnected": "{count} channel(s) connected",
    "toolsCount": "({count} tools)",
    "providerCoolingDown": "{provider} - cooling down (rate limited)",
    "providerCircuitOpen": "{provider} - circuit breaker open",
    "providerReady": "{provider} - ready",
    "providerNotConfigured": "{provider} - not configured",
    "setupProvider": "Configure an LLM provider",
    "setupAgent": "Create your first agent",
    "setupChat": "Send your first message",
    "setupChannel": "Connect a messaging channel",
    "setupSkill": "Browse or install a skill",
    "actionUnknown": "Unknown",
    "actionAgentCreated": "Agent Created",
    "actionAgentStopped": "Agent Stopped",
    "actionToolUsed": "Tool Used",
    "actionToolCompleted": "Tool Completed",
    "actionMessageIn": "Message In",
    "actionNetworkAccess": "Network Access",
    "actionShellCommand": "Shell Command",
    "actionFileAccess": "File Access",
    "actionMemoryAccess": "Memory Access",
    "actionResponseSent": "Response Sent",
    "actionSessionReset": "Session Reset",
    "actionCompacted": "Compacted",
    "actionModelChanged": "Model Changed",
    "actionLoginAttempt": "Login Attempt",
    "actionLoginOk": "Login OK",
    "actionLoginFailed": "Login Failed",
    "actionDenied": "Denied",
    "actionRateLimited": "Rate Limited",
    "actionWorkflowRun": "Workflow Run",
    "actionTriggerFired": "Trigger Fired",
    "actionSkillInstalled": "Skill Installed",
    "actionMcpConnected": "MCP Connected",
    "loadError": "Could not load overview data."
  },
  "security": {
    "merkleAudit": "Merkle Audit",
    "taintTracking": "Taint Tracking",
    "wasmSandbox": "WASM Sandbox",
    "gcraRateLimit": "GCRA Rate Limit",
    "ed25519Signing": "Ed25519 Signing",
    "ssrfProtection": "SSRF Protection",
    "secretZeroize": "Secret Zeroize",
    "loopGuard": "Loop Guard",
    "sessionRepair": "Session Repair"
  },
  "agentChat": {
    "backToAgents": "Back to Agents",
    "ready": "Ready",
    "generating": "Generating...",
    "queueCount": "+{count} queued",
    "queueCountCompact": "{count} queued",
    "sessions": "Sessions",
    "newSession": "+ New",
    "sessionDefault": "Session {id}",
    "messagesCount": "{count} messages",
    "noSessions": "No sessions",
    "searchMessages": "Search messages (Ctrl+F)",
    "searchMessagesPlaceholder": "Search messages...",
    "searchResults": "{filtered} of {total}",
    "selectAgentToChat": "Select an agent to start chatting",
    "chooseAgentFromSidebar": "Choose an agent from the sidebar or go to the Agents tab to create a new one.",
    "copyMessage": "Copy message",
    "copied": "Copied!",
    "dropFilesHere": "Drop files here",
    "running": "running...",
    "done": "done",
    "input": "Input",
    "result": "Result",
    "chars": "({count} chars)",
    "recordingRelease": "Recording... release to send",
    "messageLibreFang": "Message LibreFang... (/ for commands)",
    "stopGenerating": "Stop generating",
    "attachFile": "Attach file",
    "holdToRecord": "Hold to record voice",
    "availableModels": "Available models - pick one or keep typing",
    "switching": "Switching...",
    "noModelsFound": "No models found",
    "searchModels": "Search models...",
    "all": "All",
    "tokens": "tokens",
    "filesCount": "{count} file(s)",
    "audio": "Audio: {name}",
    "secondsShort": "{count}s",
    "loadingFiles": "Loading files...",
    "notCreated": "Not created",
    "noWorkspaceFiles": "No workspace files found",
    "saveConfig": "Save Config",
    "toolFilters": "Tool Filters",
    "toolFiltersDesc": "Allowlist: only these tools available (empty = all). Blocklist: these tools excluded.",
    "allowlist": "Allowlist",
    "blocklist": "Blocklist",
    "processing": "Processing...",
    "thinking": "Thinking...",
    "thinkingWithLevel": "Thinking ({level})...",
    "usingTool": "Using {tool}...",
    "working": "Working...",
    "usingHttpMode": "Using HTTP mode (no streaming)",
    "loadModelsFailed": "Failed to load models: {message}",
    "newSessionPrompt": "Session name (optional):",
    "newSessionCreated": "New session created",
    "newSessionFailed": "Failed to create session",
    "switchSessionFailed": "Failed to switch session",
    "errorPrefix": "Error: {message}",
    "memoryConflict": "Memory updated: Previously '{old}', now '{new}'",
    "runCancelled": "Run cancelled",
    "stopFailed": "Stop failed: {message}",
    "stopAgentTitle": "Stop Agent",
    "stopAgentConfirm": "Stop agent \"{name}\"? The agent will be shut down.",
    "agentStopped": "Agent \"{name}\" stopped",
    "fileTooLarge": "File \"{name}\" exceeds 10MB limit",
    "fileTypeNotSupported": "File type not supported: {name}",
    "microphoneDenied": "Microphone access denied",
    "transcribingAudio": "Transcribing audio...",
    "failedUploadAudio": "Failed to upload audio: {message}",
    "failedUploadFile": "Failed to upload {name}",
    "welcomeTips": "**Welcome to LibreFang Chat!**\n\n- Type `/` to see available commands\n- `/help` shows all commands\n- `/think on` enables extended reasoning\n- `/context` shows context window usage\n- `/verbose off` hides tool details\n- `Ctrl+Shift+F` toggles focus mode\n- Drag & drop files to attach them\n- `Ctrl+/` opens the command palette",
    "tipCommands": "Type / for commands",
    "tipThinking": "/think on for reasoning",
    "tipFocus": "Ctrl+Shift+F for focus mode",
    "tipAttach": "Drag files to attach",
    "tipModel": "/model to switch models",
    "tipContext": "/context to check usage",
    "tipVerbose": "/verbose off to hide tool details",
    "cmd": {
      "help": "Show available commands",
      "agents": "Switch to Agents page",
      "new": "Reset session (clear history)",
      "reboot": "Hard reset session (full context clear, no summary)",
      "compact": "Trigger LLM session compaction",
      "model": "Show or switch model (/model [name])",
      "stop": "Cancel current agent run",
      "usage": "Show session token usage & cost",
      "think": "Toggle extended thinking (/think [on|off|stream])",
      "context": "Show context window usage & pressure",
      "verbose": "Cycle tool detail level (/verbose [off|on|full])",
      "queue": "Check if agent is processing",
      "status": "Show system status",
      "clear": "Clear chat display",
      "exit": "Disconnect from agent",
      "budget": "Show spending limits and current costs",
      "peers": "Show OFP peer network status",
      "a2a": "List discovered external A2A agents"
    },
    "toast": {
      "modelSwitched": "Switched to {model}",
      "switchFailed": "Switch failed: {message}",
      "sessionReset": "Session reset",
      "sessionRebooted": "Session rebooted. Context cleared.",
      "resetFailed": "Reset failed: {message}",
      "rebootFailed": "Reboot failed: {message}",
      "compactFailed": "Compaction failed: {message}",
      "stopFailed": "Stop failed: {message}",
      "modelSwitchFailed": "Model switch failed: {message}"
    },
    "sys": {
      "compacting": "Compacting session...",
      "compactDone": "Compaction complete",
      "runCancelled": "Run cancelled",
      "sessionUsageTitle": "Session Usage",
      "messages": "Messages",
      "approxTokens": "Approx tokens",
      "thinkStatus": "Extended thinking",
      "thinkStream": "enabled (streaming reasoning)",
      "thinkOn": "enabled",
      "thinkOff": "disabled",
      "thinkStreamDesc": "Reasoning tokens will appear in a collapsible panel.",
      "thinkOnDesc": "The agent will show its reasoning when supported by the model.",
      "thinkOffDesc": "Normal response mode.",
      "notConnected": "Not connected. Connect to an agent first.",
      "notConnectedShort": "Not connected.",
      "systemStatus": "System Status",
      "agents": "Agents",
      "uptime": "Uptime",
      "version": "Version",
      "modelSwitchedTo": "Model switched to: `{model}`",
      "provider": "provider",
      "currentModel": "Current Model",
      "providerLabel": "Provider",
      "modelLabel": "Model",
      "noAgent": "No agent selected.",
      "budgetStatus": "Budget Status",
      "unlimited": "unlimited",
      "hourly": "Hourly",
      "daily": "Daily",
      "monthly": "Monthly",
      "ofpNetwork": "OFP Network",
      "status": "Status",
      "enabled": "Enabled",
      "disabled": "Disabled",
      "connectedPeers": "Connected peers",
      "noA2aAgents": "No external A2A agents discovered.",
      "a2aAgents": "A2A Agents"
    }
  },
  "sessionsPage": {
    "title": "Sessions",
    "filterByAgent": "Filter by agent...",
    "memory": "Memory",
    "loading": "Loading sessions...",
    "loadError": "Could not load sessions.",
    "conversationSessions": "Conversation Sessions",
    "conversationSessionsDesc": "Each conversation with an agent creates a session. Sessions store the full message history so you can resume conversations later, or review past interactions.",
    "session": "Session",
    "created": "Created",
    "noSessionsYet": "No sessions yet",
    "sessionsCreatedWhen": "Sessions are created when you chat with agents. Start a conversation to see session history here.",
    "startChatting": "Start Chatting",
    "noSessionsMatch": "No sessions match your filter.",
    "agentMemory": "Agent Memory",
    "agentMemoryDesc": "Each agent has its own key-value memory store. Agents use memory to persist preferences, notes, and context between conversations.",
    "selectAgent": "Select agent...",
    "loadingMemory": "Loading memory...",
    "loadMemoryError": "Could not load memory data.",
    "keysCount": "{count} key(s)",
    "addKey": "+ Add Key",
    "key": "Key",
    "value": "Value",
    "noKeysStored": "No keys stored",
    "noMemoryEntries": "This agent has no memory entries yet. Agents create memory entries automatically during conversations, or you can add them manually.",
    "addFirstKey": "+ Add First Key",
    "valueJson": "Value (JSON)",
    "selectAnAgent": "Select an Agent",
    "chooseAgentFromDropdown": "Choose an agent from the dropdown above to browse and edit its memory store.",
    "deleteSessionTitle": "Delete Session",
    "deleteSessionConfirm": "This will permanently remove the session and its messages.",
    "sessionDeleted": "Session deleted",
    "deleteSessionFailed": "Failed to delete session: {message}",
    "deleteKeyTitle": "Delete Key",
    "deleteKeyConfirm": "Delete key \"{key}\"? This cannot be undone.",
    "keySaved": "Key \"{key}\" saved",
    "saveKeyFailed": "Failed to save key: {message}",
    "keyDeleted": "Key \"{key}\" deleted",
    "deleteKeyFailed": "Failed to delete key: {message}",
    "keyUpdated": "Key \"{key}\" updated",
    "saveFailed": "Failed to save: {message}"
  },
  "agentsPage": {
    "createAgent": "Create Agent",
    "wizard": "Wizard",
    "rawToml": "Raw TOML",
    "agentManifest": "Agent Manifest (TOML)",
    "spawnAgent": "Spawn Agent",
    "spawning": "Spawning...",
    "agentName": "Agent Name",
    "agentNamePlaceholder": "my-agent",
    "providerModelPlaceholder": "provider/model",
    "choose": "Choose...",
    "systemPromptPlaceholder": "You are a helpful assistant.",
    "personality": "Personality",
    "soulPersona": "Soul / Persona",
    "editable": "(editable)",
    "soulPlaceholder": "Describe this agent's personality and communication style...",
    "toolProfile": "Tool Profile",
    "customCapabilities": "Custom (manual capabilities)",
    "toolsIncluded": "Tools included",
    "capabilities": "Capabilities",
    "memoryRead": "Memory Read",
    "memoryWrite": "Memory Write",
    "network": "Network",
    "shell": "Shell",
    "agentSpawn": "Agent Spawn",
    "unnamed": "Unnamed",
    "genericAgent": "agent",
    "waitingProvider": "Waiting for AI provider",
    "fileBytes": "{count} bytes",
    "loadAgentsFailed": "Could not load agents. Is the daemon running?",
    "loadAgentsFailedShort": "Could not load agents.",
    "loadTemplatesFailed": "Could not load templates.",
    "stopAgentTitle": "Stop Agent",
    "stopAgentConfirm": "Stop agent \"{name}\"? The agent will be shut down.",
    "agentStopped": "Agent \"{name}\" stopped",
    "stopAgentFailed": "Failed to stop agent: {message}",
    "stopAllTitle": "Stop All Agents",
    "stopAllConfirm": "Stop {count} agent(s)? All agents will be shut down.",
    "stopSomeFailed": "Some agents failed to stop: {errors}",
    "agentsStopped": "{count} agent(s) stopped",
    "pleaseEnterAgentName": "Please enter an agent name",
    "modeSet": "Mode set to {mode}",
    "setModeFailed": "Failed to set mode: {message}",
    "manifestEmpty": "Manifest is empty - enter agent config first",
    "agentSpawned": "Agent \"{name}\" spawned",
    "newAgentName": "new",
    "spawnFailed": "Spawn failed: {message}",
    "unknownError": "Unknown error",
    "spawnAgentFailed": "Failed to spawn agent: {message}",
    "loadFilesFailed": "Failed to load files: {message}",
    "readFileFailed": "Failed to read file: {message}",
    "fileSaved": "{file} saved",
    "saveFileFailed": "Failed to save file: {message}",
    "configUpdated": "Config updated",
    "saveConfigFailed": "Failed to save config: {message}",
    "clonedAs": "Cloned as \"{name}\"",
    "cloneFailed": "Clone failed: {message}",
    "spawnedFromTemplate": "Agent \"{name}\" spawned from template",
    "spawnFromTemplateFailed": "Failed to spawn from template: {message}",
    "clearHistoryTitle": "Clear History",
    "clearHistoryConfirm": "Clear all conversation history for \"{name}\"? This cannot be undone.",
    "historyCleared": "History cleared for \"{name}\"",
    "clearHistoryFailed": "Failed to clear history: {message}",
    "providerSuffix": " (provider: {provider})",
    "modelChanged": "Model changed{provider} (memory reset)",
    "changeModelFailed": "Failed to change model: {message}",
    "fallbackAdded": "Fallback added: {value}",
    "saveFallbacksFailed": "Failed to save fallbacks: {message}",
    "fallbackRemoved": "Fallback removed",
    "updateToolFiltersFailed": "Failed to update tool filters: {message}",
    "spawnBuiltinFailed": "Failed to spawn agent: {message}",
    "archetype": {
      "assistant": "Assistant",
      "researcher": "Researcher",
      "coder": "Coder",
      "writer": "Writer",
      "devops": "DevOps",
      "support": "Support",
      "analyst": "Analyst",
      "custom": "Custom"
    },
    "vibe": {
      "professional": "Professional",
      "friendly": "Friendly",
      "technical": "Technical",
      "creative": "Creative",
      "concise": "Concise",
      "mentor": "Mentor"
    }
  },
  "approvals": {
    "title": "Execution Approvals",
    "loading": "Loading...",
    "loadError": "Could not load approvals.",
    "pendingCount": "{count} pending",
    "filter": {
      "all": "All",
      "pending": "Pending",
      "approved": "Approved",
      "rejected": "Rejected"
    },
    "status": {
      "pending": "Pending",
      "approved": "Approved",
      "rejected": "Rejected",
      "expired": "Expired"
    },
    "emptyTitle": "No approvals",
    "emptyDesc": "When agents request permission for sensitive actions, they'll appear here.",
    "agentMeta": "Agent: {agent} - {time}",
    "approve": "Approve",
    "reject": "Reject",
    "approvedToast": "Approved",
    "rejectTitle": "Reject Action",
    "rejectConfirm": "Are you sure you want to reject this action?",
    "rejectedToast": "Rejected"
  },
  "logsPage": {
    "title": "Logs",
    "allLevels": "All",
    "searchPlaceholder": "Search...",
    "resume": "Resume",
    "pause": "Pause",
    "clear": "Clear",
    "export": "Export",
    "autoScroll": "Auto-scroll",
    "scrollLocked": "Scroll locked",
    "verifyChain": "Verify Chain",
    "liveTab": "Live",
    "auditTab": "Audit Trail",
    "connectingStream": "Connecting to log stream...",
    "loadError": "Could not load logs.",
    "noEntries": "No log entries yet",
    "noEntriesHint": "Activity will appear here as agents run.",
    "loadingAudit": "Loading audit log...",
    "auditLoadError": "Could not load audit log.",
    "auditTitle": "Tamper-Evident Audit Trail",
    "auditDesc": "Every agent action is logged with a cryptographic hash chain. Use \"Verify Chain\" to confirm no entries have been altered or deleted.",
    "allActions": "All Actions",
    "entriesCount": "{filtered} of {total} entries",
    "tipHash": "tip: {hash}",
    "timestamp": "Timestamp",
    "action": "Action",
    "detail": "Detail",
    "outcome": "Outcome",
    "noAuditEntries": "No audit entries yet",
    "noAuditEntriesHint": "Activity will appear here as agents operate.",
    "paused": "Paused",
    "live": "Live",
    "polling": "Polling",
    "disconnected": "Disconnected",
    "valid": "VALID",
    "broken": "BROKEN",
    "chainVerified": "Audit chain verified - {count} entries valid",
    "chainBrokenToast": "Audit chain broken!",
    "chainVerifyFailed": "Chain verification failed: {message}"
  },
  "runtimePage": {
    "title": "Runtime",
    "loading": "Loading runtime info...",
    "loadError": "Could not load runtime data.",
    "agents": "Agents",
    "defaultModel": "Default Model",
    "system": "System",
    "platform": "Platform",
    "architecture": "Architecture",
    "apiListen": "API Listen",
    "homeDirectory": "Home Directory",
    "logLevel": "Log Level",
    "network": "Network",
    "enabled": "Enabled",
    "disabled": "Disabled",
    "providers": "Providers",
    "models": "Models",
    "latency": "Latency",
    "online": "Online",
    "ready": "Ready",
    "notConfigured": "Not configured",
    "secondsShort": "{count}s",
    "minutesSecondsShort": "{minutes}m {seconds}s",
    "hoursMinutesShort": "{hours}h {minutes}m",
    "daysHoursShort": "{days}d {hours}h"
  },
  "settingsPage": {
    "title": "Settings",
    "loading": "Loading settings...",
    "loadError": "Could not load settings.",
    "providersTab": "Providers",
    "modelsTab": "Models",
    "toolsTab": "Tools",
    "securityTab": "Security",
    "networkTab": "Network",
    "budgetTab": "Budget",
    "proactiveMemoryTab": "Proactive Memory",
    "systemTab": "System",
    "migrationTab": "Migration",
    "proactiveMemory": "Proactive Memory",
    "proactiveMemoryDesc": "Configure mem0-style proactive memory that automatically extracts and recalls relevant memories during agent conversations.",
    "loadingProactiveMemory": "Loading proactive memory settings...",
    "loadProactiveMemoryFailed": "Failed to load proactive memory settings: {message}",
    "autoMemorize": "Auto-memorize",
    "autoMemorizeDesc": "Automatically extract and store memories from agent conversations after each execution.",
    "autoRetrieve": "Auto-retrieve",
    "autoRetrieveDesc": "Automatically recall relevant memories before each agent execution to enrich context.",
    "maxRetrieve": "Max Retrieve",
    "maxRetrieveDesc": "Maximum number of memories to retrieve per query.",
    "extractionThreshold": "Extraction Threshold",
    "extractionThresholdDesc": "Confidence threshold for near-duplicate detection during extraction (0.0 - 1.0).",
    "extractionModel": "Extraction Model",
    "extractionModelPlaceholder": "Leave empty to use agent's default model",
    "extractionModelDesc": "LLM model for memory extraction. If empty, uses the agent's default model.",
    "extractCategories": "Extract Categories",
    "extractCategoriesPlaceholder": "preference, frustration, workflow, fact, ...",
    "extractCategoriesDesc": "Comma-separated list of memory categories to extract. Leave empty for defaults.",
    "sessionTtlHours": "Session TTL (hours)",
    "sessionTtlHoursDesc": "Session memories older than this are automatically cleaned up before each agent execution.",
    "confidenceDecayRate": "Confidence Decay Rate",
    "confidenceDecayRateDesc": "Exponential decay rate per day. Lower values preserve memories longer (0.01 ≈ 70 days to halve).",
    "duplicateThreshold": "Duplicate Threshold",
    "duplicateThresholdDesc": "Jaccard word overlap threshold for duplicate detection. Memories above this similarity are merged.",
    "maxMemoriesPerAgent": "Max Memories Per Agent",
    "maxMemoriesPerAgentDesc": "Maximum number of memories per agent. Lowest-confidence memories are evicted when exceeded. Set to 0 to disable.",
    "proactiveMemorySaved": "Proactive memory settings saved.",
    "proactiveMemorySaveFailed": "Failed to save proactive memory settings: {message}",
    "llmProviders": "LLM Providers",
    "llmProvidersDesc": "LibreFang supports 12 LLM providers out of the box. Configure API keys to unlock models from each provider. Set environment variables and restart, or use the form below to save keys directly.",
    "providerModels": "{count} model(s) available",
    "envLabel": "Env: {env}",
    "enterEnv": "Enter {env}",
    "envRestart": "Or set {env} in your environment and restart",
    "loginWithGitHub": "Login with GitHub",
    "visitAndEnter": "Visit {url} and enter:",
    "waitingForAuthorization": "Waiting for authorization...",
    "installLabel": "Install:",
    "removeKey": "Remove Key",
    "noApiKeyNeeded": "No API key needed - runs locally or is free",
    "baseUrl": "Base URL",
    "localBaseUrlPlaceholder": "http://localhost:...",
    "addCustomProvider": "Add Custom Provider",
    "addCustomProviderDesc": "Connect any OpenAI-compatible API (vLLM, LiteLLM, LocalAI, etc.)",
    "providerName": "Provider Name",
    "baseUrlRequired": "Base URL (required)",
    "apiKeyOptional": "API Key (optional)",
    "addProvider": "Add Provider",
    "noProvidersFound": "No providers found",
    "noProvidersFoundDesc": "Provider information could not be loaded. Check that the API is running.",
    "modelCatalog": "Model Catalog",
    "modelCatalogDesc": "Browse all available models across providers. Models marked \"Available\" have their provider configured and ready to use.",
    "catalogSync": "Catalog Sync",
    "catalogSyncDesc": "Community-maintained model definitions from",
    "updateCatalog": "Update Catalog",
    "updating": "Updating...",
    "catalogUpdated": "Updated: {files} files, {models} models",
    "catalogError": "Error: {message}",
    "lastSynced": "Last synced: {time}",
    "neverSynced": "Never synced",
    "searchModels": "Search models...",
    "allProviders": "All Providers",
    "allTiers": "All Tiers",
    "customModelButton": "+ Custom Model",
    "addCustomModel": "Add Custom Model",
    "modelIdRequired": "Model ID (required)",
    "contextWindow": "Context Window",
    "maxOutputTokens": "Max Output Tokens",
    "addModel": "Add Model",
    "modelsSummary": "{filtered} of {total} models",
    "noModelsMatch": "No models match your search",
    "noModelsMatchDesc": "Try a different search term or clear filters.",
    "noModelsAvailable": "No models available",
    "noModelsAvailableDesc": "Configure an LLM provider to see available models.",
    "clearFilters": "Clear Filters",
    "tier": "Tier",
    "context": "Context",
    "inputCost": "Input Cost",
    "outputCost": "Output Cost",
    "available": "Available",
    "needsKey": "Needs Key",
    "deleteCustomModelTitle": "Delete custom model",
    "searchTools": "Search tools...",
    "toolsSummary": "{filtered} of {total} tools",
    "noToolsMatch": "No tools match your search",
    "noToolsMatchDesc": "Try a different search term.",
    "noToolsAvailable": "No tools available",
    "noToolsAvailableDesc": "Tools will appear once agents are configured.",
    "clearSearch": "Clear Search",
    "tool": "Tool",
    "description": "Description",
    "runtimeConfiguration": "Runtime Configuration",
    "runtimeConfigurationPrefix": "View and edit the active configuration. Changes are applied immediately. For advanced edits, modify",
    "runtimeConfigurationSuffix": "in your LibreFang data directory.",
    "rawConfigJson": "Raw Config JSON (click to toggle)",
    "loadingSecurityData": "Loading security data...",
    "securityHeroTitle": "Defense in Depth",
    "securityHeroDesc": "LibreFang implements 15 layered security features across the entire stack - from network ingress to agent sandboxing to cryptographic audit trails. Core protections cannot be disabled.",
    "coreProtections": "Core Protections",
    "coreProtectionsDesc": "Always active. Cannot be disabled.",
    "alwaysOn": "ALWAYS ON",
    "protectsAgainst": "Protects against:",
    "configurableControls": "Configurable Controls",
    "configurableControlsDesc": "Active with tunable parameters.",
    "configurable": "CONFIGURABLE",
    "monitoringAnalysis": "Monitoring & Analysis",
    "monitoringAnalysisDesc": "Active monitoring systems.",
    "monitoring": "MONITORING",
    "auditChainIntegrity": "Audit Chain Integrity",
    "verifyNow": "Verify Now",
    "auditChainIntegrityDesc": "Run cryptographic verification of the entire SHA-256 Merkle hash chain.",
    "chainValid": "CHAIN VALID - {count} entries verified",
    "chainBroken": "CHAIN BROKEN - {message}",
    "securityDependencies": "Security Dependencies",
    "securityDependency": {
      "sha256": "SHA-256",
      "hmacSha256": "HMAC-SHA256",
      "constantTime": "constant-time",
      "signing": "signing",
      "secretWiping": "secret wiping",
      "randomness": "randomness",
      "rateLimiting": "rate limiting"
    },
    "peerNetworkingTitle": "Peer Networking (OFP)",
    "peerNetworkingDesc": "Link multiple LibreFang instances into a mesh via the OFP wire protocol.",
    "nodeLabel": "Node:",
    "listeningOn": "Listening on",
    "loadingPeers": "Loading peers...",
    "connectedPeers": "Connected",
    "totalPeers": "Total Peers",
    "node": "Node",
    "address": "Address",
    "protocol": "Protocol",
    "noPeersConnected": "No peers connected",
    "noPeersConnectedPrefix": "Add a",
    "noPeersConnectedMiddle": "section to config.toml with",
    "noPeersConnectedSuffix": "and peer addresses.",
    "a2aExternalAgents": "A2A External Agents",
    "a2aExternalAgentsDesc": "Discovered agents on other LibreFang/A2A-compatible instances that this node can communicate with.",
    "remoteAgentPlaceholder": "https://remote-agent.example.com",
    "discover": "Discover",
    "noExternalAgents": "No external agents discovered yet. Enter a URL above to discover one.",
    "url": "URL",
    "accessDenied": "Access denied by user.",
    "active": "Active",
    "added": "Added!",
    "adding": "Adding...",
    "addProviderFailed": "Failed to add provider: {message}",
    "apiKeyRemoved": "API key removed for {provider}",
    "apiKeySaved": "API key saved for {provider}",
    "auditTrailValue": "{state} | {algorithm} | {count} entries logged",
    "authValue": "Mode: {mode}{suffix}",
    "configured": "Configured",
    "connectionFailed": "Connection failed",
    "copilotAuthenticated": "GitHub Copilot authenticated successfully!",
    "customModelIdPlaceholder": "e.g. my-org/my-model",
    "customModelProviderPlaceholder": "e.g. openai, groq, anthropic",
    "deleteCustomModelConfirm": "Delete custom model \"{model}\"?",
    "deleteFailed": "Failed to delete: {message}",
    "deviceCodeExpired": "Device code expired. Please try again.",
    "disabled": "Disabled",
    "enterApiKey": "Please enter an API key",
    "enterBaseUrl": "Please enter a base URL",
    "enterProviderName": "Please enter a provider name",
    "errorMessage": "Error: {message}",
    "failed": "Failed",
    "fieldSaved": "Saved {field}",
    "keyConfiguredSuffix": " (key configured)",
    "loadPeersFailed": "Could not load peers.",
    "manifestSigningValue": "Algorithm: {algorithm} | {availability}",
    "modelDeleted": "Model deleted",
    "noKeyNeeded": "No Key Needed",
    "noKeySetSuffix": " (no key set)",
    "notAvailable": "Not available",
    "notInstalled": "Not Installed",
    "notSet": "Not Set",
    "oauthError": "OAuth error: {message}",
    "off": "OFF",
    "on": "ON",
    "pollError": "Poll error: {message}",
    "providerAddedNotReachable": "Provider \"{name}\" added (not reachable yet)",
    "providerAddedReachable": "Provider \"{name}\" added (reachable)",
    "providerConnected": "{provider} connected ({latency}ms)",
    "providerConnectionFailed": "{provider}: {message}",
    "providerKeyOptionalPlaceholder": "sk-... (leave blank if not needed)",
    "providerNamePlaceholder": "e.g. my-local-llm",
    "providerUrlPlaceholder": "http://localhost:8080/v1",
    "rateLimiterValue": "Algorithm: {algorithm} | {count} tokens/min per IP",
    "removeKeyFailed": "Failed to remove key: {message}",
    "saveFailed": "Failed to save: {message}",
    "saving": "Saving...",
    "saveKeyFailed": "Failed to save key: {message}",
    "saveUrlFailed": "Failed to save URL: {message}",
    "scanError": "Scan error: {message}",
    "scanFailed": "Scan failed: {message}",
    "scanning": "Scanning...",
    "startCopilotFailed": "Failed to start Copilot login: {message}",
    "taintTrackingValue": "{state} | Tracking: {labels}",
    "testFailed": "Test failed: {message}",
    "unknownError": "Unknown error",
    "urlMustStart": "URL must start with http:// or https://",
    "urlSavedNotReachable": "{provider} URL saved but not reachable",
    "urlSavedReachable": "{provider} URL saved - reachable ({latency}ms)",
    "wasmSandboxValue": "Fuel: {fuel} | Epoch: {epoch} | Timeout: {timeout}s",
    "websocketLimitsValue": "Max {max} conn/IP | {idle}min idle timeout | {size}KB max msg",
    "perAgent": "per-agent",
    "unlimited": "unlimited",
    "ofLimit": "of {limit}",
    "budgetTitle": "Budget & Limits",
    "budgetDesc": "Set cost ceilings and token limits to keep agents within budget.",
    "editLimits": "Edit Limits",
    "loadingBudget": "Loading budget...",
    "hourly": "Hourly",
    "daily": "Daily",
    "monthly": "Monthly",
    "alertThreshold": "Alert threshold",
    "ofAnyLimit": "of any limit",
    "hourlyTokenLimitPerAgent": "Hourly token limit per agent",
    "hourlyLimit": "Hourly limit",
    "unlimitedPlaceholder": "Unlimited",
    "dailyLimit": "Daily limit",
    "monthlyLimit": "Monthly limit",
    "alertPercent": "Alert percent",
    "hourlyTokenLimitEdit": "Hourly token limit",
    "perAgentDefaultPlaceholder": "Per-agent default",
    "budgetEditHint": "Leave a value blank to remove the limit.",
    "topSpendersToday": "Top Spenders Today",
    "today": "Today",
    "hourlyLimitShort": "Hourly",
    "dailyLimitShort": "Daily",
    "monthlyLimitShort": "Monthly",
    "tokenLimitPerHour": "Token limit / hour",
    "noSpendingToday": "No spending recorded today.",
    "migrateFromOpenClaw": "Migrate from OpenClaw / OpenFang",
    "migrateFromOpenClawDesc": "Import manifests, tools, channels, and workspace data from an existing OpenClaw or OpenFang installation.",
    "autoDetect": "Auto-Detect",
    "autoDetectOpenClaw": "Auto-Detect",
    "enterPathManually": "Enter Path Manually",
    "specifySourcePath": "Specify Source Path",
    "specifyOpenClawPath": "Specify Source Path",
    "sourceFramework": "Source Framework",
    "sourceHomeDirectory": "Source Home Directory",
    "openClawHomeDirectory": "Source Home Directory",
    "libreFangTargetDirectory": "LibreFang target directory",
    "scanDirectory": "Scan Directory",
    "openClawWorkspaceFound": "OpenClaw workspace found",
    "readyToMigrate": "Ready to migrate",
    "migrateNow": "Migrate Now",
    "migrating": "Migrating...",
    "dryRun": "Dry Run",
    "startOver": "Start Over",
    "dryRunComplete": "Dry run complete",
    "migrationComplete": "Migration complete",
    "success": "Success",
    "failedShort": "Failed",
    "runMigrationForReal": "Run Migration for Real",
    "startNewMigration": "Start New Migration",
    "notFound": "Not Found",
    "openClawNotFound": "Not Found",
    "notFoundDesc": "No OpenClaw or OpenFang installation was detected. You can enter a path manually and scan it.",
    "openClawNotFoundDesc": "No OpenClaw or OpenFang installation was detected. You can enter a path manually and scan it.",
    "peerState": {
      "connected": "Connected",
      "disconnected": "Disconnected"
    },
    "migrationFeature": {
      "manifest": "Manifests & agents",
      "tools": "Tools & providers",
      "channels": "Channels & secrets",
      "workspace": "Workspace & memory"
    },
    "coreFeatures": {
      "path_traversal": {
        "name": "Path Traversal Prevention",
        "description": "Blocks directory escape attacks (../) in all file operations. Two-phase validation: syntactic rejection of path components, then canonicalization to normalize symlinks.",
        "threat": "Directory escape, privilege escalation via symlinks"
      },
      "ssrf_protection": {
        "name": "SSRF Protection",
        "description": "Blocks outbound requests to private IPs, localhost, and cloud metadata endpoints (AWS/GCP/Azure). Validates DNS resolution results to defeat rebinding attacks.",
        "threat": "Internal network reconnaissance, cloud credential theft"
      },
      "capability_system": {
        "name": "Capability-Based Access Control",
        "description": "Deny-by-default permission system. Every agent operation (file I/O, network, shell, memory, spawn) requires an explicit capability grant in the manifest.",
        "threat": "Unauthorized resource access, sandbox escape"
      },
      "privilege_escalation_prevention": {
        "name": "Privilege Escalation Prevention",
        "description": "When a parent agent spawns a child, the kernel enforces child capabilities are a subset of parent capabilities. No agent can grant rights it does not have.",
        "threat": "Capability escalation through agent spawning chains"
      },
      "subprocess_isolation": {
        "name": "Subprocess Environment Isolation",
        "description": "Child processes (shell tools) inherit only a safe allow-list of environment variables. API keys, database passwords, and secrets are never leaked to subprocesses.",
        "threat": "Secret exfiltration via child process environment"
      },
      "security_headers": {
        "name": "Security Headers",
        "description": "Every HTTP response includes CSP, X-Frame-Options: DENY, X-Content-Type-Options: nosniff, Referrer-Policy, and X-XSS-Protection headers.",
        "threat": "XSS, clickjacking, MIME sniffing, content injection"
      },
      "wire_hmac_auth": {
        "name": "Wire Protocol Authentication",
        "description": "Agent-to-agent OFP connections use HMAC-SHA256 mutual authentication with nonce-based handshake and constant-time signature comparison (subtle crate).",
        "threat": "Man-in-the-middle attacks on mesh network"
      },
      "request_id_tracking": {
        "name": "Request ID Tracking",
        "description": "Every API request receives a unique UUID (x-request-id header) and is logged with method, path, status code, and latency for full traceability.",
        "threat": "Untraceable actions, forensic blind spots"
      }
    },
    "configurableFeatures": {
      "rate_limiter": {
        "name": "API Rate Limiting",
        "description": "GCRA (Generic Cell Rate Algorithm) with cost-aware tokens. Different endpoints cost different amounts - spawning an agent costs 50 tokens, health check costs 1.",
        "hint": "Hard-coded: 500 tokens/minute per IP. Edit rate_limiter.rs to tune."
      },
      "websocket_limits": {
        "name": "WebSocket Connection Limits",
        "description": "Per-IP connection cap prevents connection exhaustion. Idle timeout closes abandoned connections. Message rate limiting prevents flooding.",
        "hint": "Hard-coded: 5 connections/IP, 30min idle timeout, 64KB max message. Edit ws.rs to tune."
      },
      "wasm_sandbox": {
        "name": "WASM Dual Metering",
        "description": "WASM modules run with two independent resource limits: fuel metering (CPU instruction count) and epoch interruption (wall-clock timeout with watchdog thread).",
        "hint": "Default: 1M fuel units, 30s timeout. Configurable per-agent via SandboxConfig."
      },
      "auth": {
        "name": "Bearer Token Authentication",
        "description": "All non-health endpoints require Authorization: Bearer header. When no API key is configured, all requests are restricted to localhost only.",
        "hint": "Set api_key in ~/.librefang/config.toml for remote access. Empty = localhost only."
      }
    },
    "monitoringFeatures": {
      "audit_trail": {
        "name": "Merkle Audit Trail",
        "description": "Every security-critical action is appended to an immutable, tamper-evident log. Each entry is cryptographically linked to the previous via SHA-256 hash chain.",
        "hint": "Always active. Verify chain integrity from the Audit Log page."
      },
      "taint_tracking": {
        "name": "Information Flow Taint Tracking",
        "description": "Labels data by provenance (ExternalNetwork, UserInput, PII, Secret, UntrustedAgent) and blocks unsafe flows: external data cannot reach shell_exec, secrets cannot reach network.",
        "hint": "Always active. Prevents data flow attacks automatically."
      },
      "manifest_signing": {
        "name": "Ed25519 Manifest Signing",
        "description": "Agent manifests can be cryptographically signed with Ed25519. Verify manifest integrity before loading to prevent supply chain tampering.",
        "hint": "Available for use. Sign manifests with ed25519-dalek for verification."
      }
    }
  },
  "workflowsPage": {
    "title": "Workflows",
    "listTab": "List",
    "builderTab": "Visual Builder",
    "loading": "Loading workflows...",
    "whatAreWorkflows": "What are workflows?",
    "whatAreWorkflowsDesc": "Workflows chain multiple agent steps into a reusable automation.",
    "tryVisualBuilderPrefix": "Want a faster way to design them? Try the",
    "tryVisualBuilderSuffix": "for drag-and-drop editing.",
    "newWorkflow": "+ New Workflow",
    "steps": "Steps",
    "run": "Run",
    "history": "History",
    "noWorkflows": "No workflows yet",
    "noWorkflowsDesc": "Create your first workflow to automate multi-step agent tasks.",
    "createWorkflow": "Create Workflow",
    "workflowNamePlaceholder": "My workflow",
    "workflowDescPlaceholder": "Describe what this workflow does",
    "stepsDescPrefix": "Define each step in order. You can use the",
    "stepsDescSuffix": "tab for a richer editor.",
    "stepNamePlaceholder": "Step name",
    "agentNamePlaceholder": "Agent name",
    "mode": {
      "sequential": "Sequential",
      "fanOut": "Fan-out",
      "conditional": "Conditional",
      "loop": "Loop"
    },
    "promptPlaceholder": "Prompt template",
    "addStep": "+ Add Step",
    "create": "Create",
    "input": "Input",
    "runInputPlaceholder": "Enter workflow input...",
    "execute": "Execute",
    "running": "Running...",
    "result": "Result",
    "stepsCount": "{count} step(s)",
    "runTitle": "Run: {name}",
    "loadError": "Could not load workflows.",
    "created": "Workflow \"{name}\" created",
    "createFailed": "Failed to create workflow: {message}",
    "completed": "Workflow completed",
    "errorMessage": "Error: {message}",
    "runFailed": "Workflow failed: {message}",
    "historyFailed": "Failed to load run history: {message}"
  },
  "workflowBuilder": {
    "nodePalette": "Node Palette",
    "dragNodes": "Drag nodes onto the canvas",
    "exportToml": "Export TOML",
    "saveWorkflow": "Save Workflow",
    "autoLayout": "Auto Layout",
    "zoomOut": "Zoom out",
    "zoomIn": "Zoom in",
    "resetView": "Reset view",
    "fit": "Fit",
    "canvasHint": "Drag from output ports to input ports to connect nodes.",
    "label": "Label",
    "selectAgent": "Select agent",
    "promptTemplate": "Prompt template",
    "modelOptional": "Model (optional)",
    "defaultModelPlaceholder": "Use default model",
    "expression": "Expression",
    "conditionPorts": "First output is true, second output is false.",
    "maxIterations": "Max iterations",
    "untilStopCondition": "Until / stop condition",
    "fanOutCount": "Fan-out count",
    "strategyLabel": "Strategy",
    "strategy": {
      "all": "Wait for all",
      "first": "First to finish",
      "majority": "Majority vote"
    },
    "duplicate": "Duplicate",
    "connectionSelected": "Connection selected",
    "deleteConnection": "Delete connection",
    "generatedToml": "Generated TOML",
    "copyToClipboard": "Copy to clipboard",
    "summary": "{nodes} node(s), {connections} connection(s)",
    "nodeType": {
      "agentStep": "Agent Step",
      "parallelFanOut": "Parallel Fan-out",
      "condition": "Condition",
      "loop": "Loop",
      "collect": "Collect",
      "start": "Start",
      "end": "End"
    },
    "noAgent": "No agent",
    "noCondition": "No condition",
    "maxIterationsShort": "max {count} iters",
    "branchesShort": "{count} branches",
    "branch": {
      "true": "Yes",
      "false": "No"
    },
    "copySuffix": "{label} copy",
    "untitled": "untitled",
    "saved": "Workflow saved!",
    "saveFailed": "Failed to save: {message}",
    "copied": "Copied!",
    "copyFailed": "Copy failed"
  },
  "schedulerPage": {
    "title": "Scheduler",
    "newJob": "+ New Job",
    "scheduledJobsTab": "Scheduled Jobs",
    "eventTriggersTab": "Event Triggers",
    "runHistoryTab": "Run History",
    "loadingJobs": "Loading jobs...",
    "scheduledJobsTitle": "Scheduled Jobs",
    "scheduledJobsDescPrefix": "Run agents on a cron schedule. Need more complex logic? Use",
    "scheduledJobsDescMiddle": "Workflows",
    "scheduledJobsDescSuffix": "for multi-step automations.",
    "schedule": "Schedule",
    "lastRun": "Last Run",
    "nextRun": "Next Run",
    "pause": "Pause",
    "enable": "Enable",
    "deleteShort": "Delete",
    "noJobs": "No scheduled jobs",
    "noJobsDesc": "Create a schedule to run an agent automatically.",
    "createScheduledJob": "Create Scheduled Job",
    "createScheduledJobTitle": "Create a Scheduled Job",
    "jobName": "Job name",
    "jobNamePlaceholder": "Daily summary",
    "cronExpression": "Cron expression",
    "cronPlaceholder": "0 9 * * *",
    "cronFormat": "Cron format: minute hour day-of-month month day-of-week",
    "quickPresets": "Quick presets",
    "targetAgent": "Target agent",
    "anyAvailableAgent": "Any available agent",
    "noAgentsRunningPrefix": "No agents are running right now. You can still save a schedule, or",
    "spawnOneFirst": "spawn one first",
    "messageToSend": "Message to send",
    "messagePlaceholder": "What should the agent do when this schedule runs?",
    "messageHelp": "If left blank, LibreFang will generate a default message from the job name.",
    "enabledCreate": "Enabled after create",
    "disabledCreate": "Create disabled",
    "createSchedule": "Create Schedule",
    "creating": "Creating...",
    "loadingTriggers": "Loading triggers...",
    "eventTriggersTitle": "Event Triggers",
    "eventTriggersDescPrefix": "Triggers react to lifecycle, system, or memory events and can launch",
    "eventTriggersDescSuffix": "automatically.",
    "pattern": "Pattern",
    "fires": "Fires",
    "enabledColumn": "Enabled",
    "noTriggers": "No triggers yet",
    "noTriggersPrefix": "Create one from the",
    "noTriggersSuffix": "page to react to runtime events.",
    "loadingHistory": "Loading history...",
    "runHistoryTitle": "Run History",
    "runHistoryDesc": "Recent scheduler and trigger activity.",
    "time": "Time",
    "type": "Type",
    "totalRuns": "Total Runs",
    "noHistory": "No run history yet",
    "noHistoryDesc": "Completed schedules and fired triggers will show up here.",
    "activeJobsCount": "{active}/{total} active",
    "triggersCount": "{count}",
    "active": "Active",
    "paused": "Paused",
    "cronJob": "Cron Job",
    "trigger": "Trigger",
    "loadError": "Could not load scheduler data.",
    "loadTriggersError": "Could not load triggers.",
    "unnamed": "(unnamed)",
    "completedStatus": "completed",
    "triggerPrefix": "Trigger: {type}",
    "firedStatus": "fired",
    "enterJobName": "Please enter a job name",
    "enterCron": "Please enter a cron expression",
    "defaultMessage": "Scheduled task: {name}",
    "created": "Schedule \"{name}\" created",
    "createFailed": "Failed to create schedule: {message}",
    "enabledToast": "Schedule enabled",
    "pausedToast": "Schedule paused",
    "toggleFailed": "Failed to toggle schedule: {message}",
    "deleteScheduleTitle": "Delete Schedule",
    "deleteScheduleConfirm": "Delete \"{name}\"? This cannot be undone.",
    "deleted": "Schedule \"{name}\" deleted",
    "deleteFailed": "Failed to delete schedule: {message}",
    "runSuccess": "Schedule \"{name}\" executed successfully",
    "job": "job",
    "runFailed": "Schedule run failed: {message}",
    "unknownError": "Unknown error",
    "runUnavailable": "Run Now is not yet available for cron jobs",
    "triggerEnabled": "Trigger enabled",
    "triggerDisabled": "Trigger disabled",
    "toggleTriggerFailed": "Failed to toggle trigger: {message}",
    "deleteTriggerTitle": "Delete Trigger",
    "deleteTriggerConfirm": "Delete this trigger? This cannot be undone.",
    "triggerDeleted": "Trigger deleted",
    "deleteTriggerFailed": "Failed to delete trigger: {message}",
    "anyAgent": "(any)",
    "oneTimeAt": "One-time: {time}",
    "everyMinutes": "Every {count} minutes",
    "everyHours": "Every {count} hours",
    "dailyAt": "Daily at {time}",
    "dayOfWeek": "DoW {value}",
    "dayAt": "{day} at {time}",
    "never": "never",
    "inLessThanMinute": "in <1m",
    "inMinutes": "in {count}m",
    "inHours": "in {count}h",
    "inDays": "in {count}d",
    "triggerType": {
      "lifecycle": "Lifecycle",
      "agentSpawned": "Agent Spawned",
      "agentTerminated": "Agent Terminated",
      "system": "System",
      "systemKeyword": "System Keyword",
      "memoryUpdate": "Memory Update",
      "memoryKey": "Memory Key",
      "allEvents": "All Events",
      "contentMatch": "Content Match"
    },
    "cron": {
      "everyMinute": "Every minute",
      "every2Minutes": "Every 2 minutes",
      "every5Minutes": "Every 5 minutes",
      "every10Minutes": "Every 10 minutes",
      "every15Minutes": "Every 15 minutes",
      "every30Minutes": "Every 30 minutes",
      "everyHour": "Every hour",
      "every2Hours": "Every 2 hours",
      "every4Hours": "Every 4 hours",
      "every6Hours": "Every 6 hours",
      "every12Hours": "Every 12 hours",
      "dailyMidnight": "Daily at midnight",
      "daily6am": "Daily at 6:00 AM",
      "daily9am": "Daily at 9:00 AM",
      "daily9amLong": "Daily at 9:00 AM",
      "dailyNoon": "Daily at noon",
      "daily6pm": "Daily at 6:00 PM",
      "weekdays9am": "Weekdays at 9:00 AM",
      "weekdays9amLong": "Weekdays at 9:00 AM",
      "everyMonday9am": "Every Monday 9:00 AM",
      "mondays9am": "Mondays at 9:00 AM",
      "sundaysMidnight": "Sundays at midnight",
      "firstOfMonth": "First of month",
      "firstOfMonthLong": "1st of every month",
      "mondaysMidnight": "Mondays at midnight"
    }
  },
  "channelsPage": {
    "title": "Channels",
    "loading": "Loading channels...",
    "searchPlaceholder": "Search channels...",
    "noResults": "No channels match your search.",
    "categoryCount": "{label} ({count})",
    "configuredSummary": "{configured}/{total} configured",
    "setUp": "Set up",
    "saving": "Saving...",
    "update": "Update",
    "saveAndTest": "Save & Test",
    "testing": "Testing...",
    "loadError": "Could not load channels.",
    "whatsAppConnected": "WhatsApp connected!",
    "qrStartFailed": "Could not start QR login",
    "connected": "Connected!",
    "whatsAppLinked": "WhatsApp linked successfully!",
    "qrExpired": "QR code expired. Click to generate a new one.",
    "waitingForScan": "Waiting for scan...",
    "activated": "{name} activated!",
    "savedWithMessage": "{name} saved. {message}",
    "savedTestToVerify": "{name} saved. Test to verify connection.",
    "failedMessage": "Failed: {message}",
    "unknownError": "Unknown error",
    "removeTitle": "Remove Channel",
    "removeConfirm": "Remove {name} configuration? This will deactivate the channel.",
    "removed": "{name} removed and deactivated.",
    "testFailed": "Test failed: {message}",
    "copied": "Copied to clipboard",
    "copyFailed": "Copy failed",
    "readyTitle": "{name} is ready!",
    "readyDesc": "Your channel is configured and can start receiving messages.",
    "editConfig": "Edit Config",
    "done": "Done",
    "connectingWhatsApp": "Connecting WhatsApp...",
    "generateNewQr": "Generate New QR",
    "channelActivatesAutomatically": "This channel activates automatically after the QR code is scanned.",
    "gatewayUnavailable": "Gateway unavailable in this environment.",
    "orUseBusinessApiPrefix": "You can also use the",
    "businessApi": "Business API",
    "orUseBusinessApiSuffix": "setup instead.",
    "haveMetaBusiness": "Have a Meta Business account?",
    "useBusinessApiInstead": "Use Business API instead",
    "refreshQr": "Refresh QR",
    "testingConnection": "Testing connection...",
    "testConnection": "Test Connection",
    "remove": "Remove",
    "backToQr": "Back to QR",
    "businessApiDesc": "Use a permanent token and phone number ID instead of QR login.",
    "howToGetCredentials": "How to get credentials",
    "secretPlaceholderKeep": "Leave blank to keep current value",
    "secretPlaceholderSet": "Enter secret value",
    "commaSeparated": "comma,separated,values",
    "envVarSet": "Set via environment variable",
    "hideAdvanced": "Hide advanced",
    "showAdvanced": "Show advanced",
    "step": {
      "configure": "Configure",
      "verify": "Verify",
      "ready": "Ready"
    },
    "status": {
      "notConfigured": "Not Configured",
      "missingToken": "Missing Token",
      "ready": "Ready",
      "configured": "Configured"
    },
    "category": {
      "all": "All",
      "messaging": "Messaging",
      "social": "Social",
      "enterprise": "Enterprise",
      "developer": "Developer",
      "notifications": "Notifications"
    }
  },
  "skillsPage": {
    "title": "Skills",
    "introTitle": "Skills & Ecosystem",
    "introDesc": "Skills extend your agents with new capabilities. LibreFang supports the OpenClaw/ClawHub ecosystem (3,000+ community skills) plus local skills.",
    "introPromptOnly": "Prompt-only - inject context and instructions into the agent's system prompt (most ClawHub skills)",
    "introCode": "Python / Node.js - executable tools that agents can call during conversations",
    "introMcp": "MCP Servers - external tools via Model Context Protocol (GitHub, filesystem, databases, etc.)",
    "loading": "Loading skills...",
    "loadError": "Could not load skills.",
    "installedTab": "Installed",
    "clawHubTab": "ClawHub",
    "mcpTab": "MCP Servers",
    "quickStartTab": "Quick Start",
    "toolCount": "{count} tool(s)",
    "promptContext": "(prompt context)",
    "uninstall": "Uninstall",
    "noSkillsTitle": "No skills installed",
    "noSkillsDesc": "Skills add new capabilities to your agents. Browse ClawHub for 3,000+ community skills or create your own.",
    "browseClawHub": "Browse ClawHub",
    "searchPlaceholder": "Search ClawHub skills... (type to search)",
    "clearSearchTitle": "Clear search (Esc)",
    "clearSearch": "Clear search",
    "sort": {
      "trending": "Trending",
      "downloads": "Most Downloaded",
      "stars": "Most Starred",
      "updated": "Recently Updated"
    },
    "categoriesTitle": "CATEGORIES",
    "searching": "Searching ClawHub...",
    "searchFailed": "Search failed",
    "browseFailed": "Browse failed",
    "clawHubUnavailable": "ClawHub may be temporarily unavailable. The OpenClaw ecosystem is hosted at clawhub.ai.",
    "resultsFor": "{count} result(s) for \"{query}\"",
    "downloads": "{count} downloads",
    "stars": "{count} stars",
    "install": "Install",
    "installed": "Installed",
    "installing": "Installing...",
    "loadMore": "Load More",
    "noResultsFor": "No skills found for \"{query}\"",
    "noResultsHint": "Try a different search term or browse by category.",
    "backToBrowse": "Back to browse",
    "mcpTitle": "MCP Servers (Model Context Protocol)",
    "mcpDesc": "MCP servers provide external tools to your agents - GitHub, filesystem, databases, APIs, and more. LibreFang is compatible with all OpenClaw MCP servers.",
    "mcpConfigHint": "Configure MCP servers in your config.toml under [mcp_servers].",
    "loadingMcp": "Loading MCP servers...",
    "connectedServers": "CONNECTED SERVERS",
    "configuredServers": "CONFIGURED SERVERS",
    "connected": "Connected",
    "toolsAvailable": "{count} tool(s) available",
    "toolsLabel": "Tools:",
    "andMore": "... and {count} more",
    "envPrefix": "Env: {value}",
    "noMcpTitle": "No MCP servers configured",
    "noMcpDesc": "MCP servers extend your agents with external tools. Add servers to your config.toml:",
    "noMcpHint": "LibreFang supports all OpenClaw-compatible MCP servers.",
    "quickStartTitle": "Quick Start Skills",
    "quickStartDesc": "Create prompt-only skills with one click. These inject context into your agent's system prompt - no code required. Perfect for adding domain expertise or workflow guidelines.",
    "createdShort": "Created",
    "createSkill": "Create Skill",
    "created": "Skill \"{name}\" created",
    "createFailed": "Failed to create skill: {message}",
    "loadingDetail": "Loading skill details...",
    "detailFailed": "Failed to load skill details",
    "codeFailed": "Could not load skill source code",
    "byAuthor": "by {name}",
    "securityWarnings": "Security Warnings",
    "alreadyInstalled": "Already Installed",
    "alreadyInstalledToast": "Skill is already installed",
    "installFromClawHub": "Install from ClawHub",
    "installedSuccess": "Skill \"{name}\" installed successfully",
    "installedWithWarnings": "Skill \"{name}\" installed with {count} warning(s)",
    "installFailedShort": "Install failed",
    "installFailed": "Install failed: {message}",
    "securityBlocked": "Skill blocked by security scan",
    "uninstallTitle": "Uninstall Skill",
    "uninstallConfirm": "Uninstall skill \"{name}\"? This cannot be undone.",
    "uninstalled": "Skill \"{name}\" uninstalled",
    "uninstallFailed": "Failed to uninstall skill: {message}",
    "loadingShort": "Loading...",
    "viewCode": "View Code",
    "hideCode": "Hide Code",
    "securityScanned": "Skills are security-scanned before installation. Prompt injection and malware patterns are blocked.",
    "runtime": {
      "prompt": "PROMPT"
    },
    "source": {
      "local": "Local",
      "clawhub": "ClawHub",
      "openclaw": "OpenClaw",
      "bundled": "Built-in"
    },
    "category": {
      "coding": "Coding & IDEs",
      "git": "Git & GitHub",
      "web": "Web & Frontend",
      "devops": "DevOps & Cloud",
      "browser": "Browser & Automation",
      "search": "Search & Research",
      "ai": "AI & LLMs",
      "data": "Data & Analytics",
      "productivity": "Productivity",
      "communication": "Communication",
      "media": "Media & Streaming",
      "notes": "Notes & PKM",
      "security": "Security",
      "cli": "CLI Utilities",
      "marketing": "Marketing & Sales",
      "finance": "Finance",
      "smart-home": "Smart Home & IoT",
      "docs": "PDF & Documents"
    },
    "quickStartSkill": {
      "code-review-guide": {
        "name": "Code Review Guide",
        "description": "Adds code review best practices and a checklist to agent context."
      },
      "writing-style": {
        "name": "Writing Style Guide",
        "description": "Configurable writing guidance for content generation."
      },
      "api-design": {
        "name": "API Design Patterns",
        "description": "REST API design patterns and conventions."
      },
      "security-checklist": {
        "name": "Security Checklist",
        "description": "OWASP-aligned security review checklist."
      }
    }
  },
  "handsPage": {
    "title": "Hands",
    "introTitle": "Hands - Curated Autonomous Capability Packages",
    "introDesc": "Hands are pre-configured AI agents that autonomously handle specific tasks. Each hand includes a tuned system prompt, required tools, and a dashboard for tracking work.",
    "loading": "Loading hands...",
    "loadError": "Could not load hands.",
    "availableTab": "Available",
    "activeTab": "Active",
    "requirementsTitle": "REQUIREMENTS",
    "toolsCount": "{count} tool(s)",
    "metricsCount": "{count} metric(s)",
    "details": "Details",
    "activate": "Activate",
    "activateNamed": "Activate {name}",
    "loadingShort": "Loading...",
    "noHandsTitle": "No hands available",
    "noHandsDesc": "Hands are curated AI capability packages. They will appear once the kernel loads bundled hands.",
    "loadingActive": "Loading active hands...",
    "activatedAt": "Activated: {time}",
    "agentLabel": "Agent: {id}",
    "stats": "Stats",
    "viewBrowser": "View Browser",
    "pause": "Pause",
    "resume": "Resume",
    "errorHint": "Error - deactivate and reactivate",
    "deactivate": "Deactivate",
    "noActiveTitle": "No active hands",
    "noActiveDesc": "Activate a hand from the Available tab to get started. Each hand spawns a dedicated agent.",
    "browseHands": "Browse Hands",
    "agentConfig": "AGENT CONFIG",
    "toolsLabel": "TOOLS",
    "dashboardMetrics": "DASHBOARD METRICS",
    "setupTitle": "Set up {name}",
    "step": {
      "dependencies": "Dependencies",
      "configure": "Configure",
      "launch": "Launch"
    },
    "detectedOnSystem": "Detected on your system",
    "noCommand": "No command available",
    "copy": "Copy",
    "copied": "Copied!",
    "getApiKey": "Get API Key ->",
    "docs": "Docs",
    "manualDownload": "Manual download ->",
    "installingDeps": "Installing dependencies...",
    "installComplete": "Installation complete!",
    "waiting": "Waiting...",
    "progressReady": "{ready} of {total} ready",
    "progressAllSet": "All set!",
    "progressInstallMissing": "Install missing dependencies above",
    "noConfigNeeded": "No configuration needed for this hand. Click Next to continue.",
    "requiresBinary": "Requires: {binary}",
    "optionReady": "Ready",
    "optionMissing": "Missing",
    "enabled": "Enabled",
    "disabled": "Disabled",
    "activating": "Activating...",
    "loadingBrowser": "Loading browser state...",
    "browserTitle": "Title:",
    "allDepsInstalled": "All dependencies already installed!",
    "installDepsSuccess": "All dependencies installed successfully!",
    "installDepsFailedCount": "{count} dependency(ies) failed to install. Check the details below.",
    "installRequestFailed": "Installation request failed",
    "allDepsSatisfied": "All dependencies satisfied!",
    "checkFailed": "Check failed: {message}",
    "checking": "Checking...",
    "verify": "Verify",
    "installAll": "Install All",
    "installingShort": "Installing...",
    "detailLoadFailed": "Could not load hand details: {message}",
    "activated": "Hand \"{hand}\" activated as {name}",
    "activationFailed": "Activation failed: {message}",
    "pauseFailed": "Pause failed: {message}",
    "resumeFailed": "Resume failed: {message}",
    "deactivateTitle": "Deactivate Hand",
    "deactivateConfirm": "Deactivate hand \"{name}\"? This will kill its agent.",
    "deactivated": "Hand deactivated.",
    "deactivationFailed": "Deactivation failed: {message}",
    "statsError": "Could not load stats: {message}",
    "errorLabel": "Error",
    "noBrowserSession": "No active browser session",
    "browserLoadFailed": "Could not load browser state",
    "ready": "Ready",
    "setupNeeded": "Setup needed",
    "unknownError": "unknown error",
    "status": {
      "active": "Active",
      "paused": "Paused",
      "inactive": "Inactive",
      "error": "Error"
    }
  },
  "pluginsPage": {
    "title": "Plugins",
    "newPlugin": "New Plugin",
    "install": "Install",
    "installedTab": "Installed",
    "registryTab": "Registry",
    "loading": "Loading...",
    "loadingRegistries": "Loading registries...",
    "noPlugins": "No plugins installed",
    "noPluginsDesc": "Install plugins from the Registry tab or use the Install button.",
    "noRegistries": "No registries configured",
    "noAvailable": "No plugins available",
    "name": "Name",
    "version": "Version",
    "description": "Description",
    "hooks": "Hooks",
    "size": "Size",
    "actions": "Actions",
    "deps": "Deps",
    "remove": "Remove",
    "installed": "Installed",
    "installTitle": "Install Plugin",
    "source": "Source",
    "sourceRegistry": "Registry",
    "sourceLocal": "Local Path",
    "sourceGit": "Git URL",
    "pluginName": "Plugin Name",
    "registryOptional": "Registry (optional)",
    "registryPlaceholder": "owner/repo (default: official)",
    "path": "Path",
    "url": "URL",
    "branch": "Branch (optional)",
    "cancel": "Cancel",
    "scaffoldTitle": "Create New Plugin",
    "scaffoldDesc": "What does this plugin do?",
    "create": "Create",
    "depsInstalled": "Dependencies installed",
    "ingest": "ingest",
    "afterTurn": "after_turn",
    "invalid": "invalid"
  },
  "commsPage": {
    "title": "Agent Comms",
    "loadError": "Could not load comms data.",
    "connectionError": "Connection Error",
    "sendMessage": "Send Message",
    "postTask": "Post Task",
    "agentTopology": "Agent Topology",
    "agentsCount": "{count} agents",
    "noAgentsRunning": "No agents running",
    "liveEventFeed": "Live Event Feed",
    "liveBadge": "LIVE",
    "eventsCount": "{count} events",
    "noEventsYet": "No inter-agent events yet",
    "sendAgentMessage": "Send Agent Message",
    "fromAgent": "From Agent",
    "toAgent": "To Agent",
    "messageLabel": "Message",
    "typeMessage": "Type a message...",
    "sending": "Sending...",
    "selectAgent": "Select agent...",
    "messageSent": "Message sent",
    "sendFailed": "Send failed",
    "titleLabel": "Title",
    "taskTitlePlaceholder": "Task title...",
    "taskDescriptionPlaceholder": "Task description...",
    "assignToOptional": "Assign To (optional)",
    "unassigned": "Unassigned",
    "posting": "Posting...",
    "taskPosted": "Task posted",
    "taskFailed": "Task failed",
    "event": {
      "message": "Message",
      "spawned": "Spawned",
      "terminated": "Terminated",
      "taskPosted": "Task Posted",
      "taskClaimed": "Task Claimed",
      "taskDone": "Task Done"
    },
    "state": {
      "running": "Running",
      "suspended": "Suspended",
      "terminated": "Terminated",
      "crashed": "Crashed"
    }
  },
  "setupWizard": {
    "title": "Setup Wizard",
    "skipSetup": "Skip Setup",
    "loading": "Loading...",
    "welcomeStep": "Welcome",
    "providerStep": "Provider",
    "agentStep": "Agent",
    "tryItStep": "Try It",
    "channelStep": "Channel",
    "doneStep": "Done",
    "welcomeToLibreFang": "Welcome to LibreFang",
    "libreFangDesc": "LibreFang is an open-source Agent Operating System. It lets you run AI agents that can chat, use tools, access memory, and connect to messaging channels - all from a single dashboard.",
    "wizardWillHelp": "This wizard will help you:",
    "connectLlmProvider": "Connect an LLM provider (Anthropic, OpenAI, Gemini, etc.)",
    "createFirstAgent": "Create your first AI agent from 10 templates",
    "tryWithTestMessage": "Try it out with a quick test message",
    "optionallyConnectChannel": "Optionally connect a messaging channel (Telegram, Discord, Slack)",
    "takesAbout2Min": "Takes about 2 minutes. You can skip any step and configure later.",
    "getStarted": "Get Started",
    "connectAnLlmProvider": "Connect an LLM Provider",
    "needsAtLeastOne": "LibreFang needs at least one LLM provider to power your agents. Select a provider and enter your API key.",
    "providerAlreadyConfigured": "Provider Already Configured",
    "alreadyHaveProvider": "You already have at least one provider set up. You can continue to the next step or configure additional providers.",
    "popularProviders": "Popular Providers",
    "otherProviders": "Other Providers",
    "ready": "READY",
    "modelsAvailable": "{count} models",
    "configureClaudeCode": "Configure Claude Code",
    "claudeCodeNoApiKey": "Claude Code uses its own CLI authentication - no API key needed.",
    "detectInstructions3": "Click Detect below to verify",
    "detect": "Detect Claude Code",
    "claudeCodeDetected": "Claude Code detected",
    "claudeCodeNotDetected": "Claude Code CLI not detected. Make sure you've run: npm install -g @anthropic-ai/claude-code && claude auth",
    "environmentVariable": "Environment variable:",
    "apiKey": "API Key",
    "enterApiKey": "Enter your {provider} API key",
    "saveAndTest": "Save & Test",
    "connectedSuccessfully": "Connected successfully",
    "connectionFailed": "Connection failed",
    "isConfiguredAndReady": "{provider} is configured and ready",
    "youCanTestOrContinue": "You can test the connection or continue to the next step.",
    "testConnection": "Test Connection",
    "createYourFirstAgent": "Create Your First Agent",
    "pickTemplateToStart": "Pick a template to get started quickly. You can customize the agent later or create more from the Agents page.",
    "agentName": "Agent Name",
    "createAgentButton": "Create Agent",
    "willUseWithProfile": "Will use {provider} / {model} with {profile} profile",
    "createdSuccessfully": "Agent \"{name}\" created successfully",
    "nextTryIt": "Next: Try It",
    "tryYourAgent": "Try Your Agent",
    "sendQuickMessage": "Send a quick message to test your new agent. Try one of the suggestions below or type your own.",
    "thinking": "Thinking...",
    "typeMessage": "Type a message...",
    "continue": "Continue",
    "connectChannel": "Connect a Channel",
    "optional": "Optional",
    "channelsLetAgent": "Channels let your agent communicate via messaging platforms. This is optional - you can always use the built-in web chat.",
    "save": "Save",
    "orSetEnv": "Or set {env} in your environment",
    "configuredAndActivated": "{channel} configured and activated.",
    "canSkipThis": "You can skip this step. The built-in web chat is always available from the Agents page. Add channels any time from Settings -> Channels.",
    "youreAllSet": "You're All Set!",
    "libreFangConfigured": "LibreFang is configured and ready to go. Here is a summary of what was set up:",
    "llmProvider": "LLM Provider",
    "preConfigured": "Pre-configured",
    "skipped": "Skipped",
    "firstAgent": "First Agent",
    "channel": "Channel",
    "noneWebChatAvailable": "None (web chat available)",
    "nextSteps": "Next Steps",
    "openAgentsToChat": "Open Agents to start talking to your agent",
    "goToAgentsToCreate": "Go to Agents to create your first agent",
    "browseSkillsToAdd": "Browse Skills to add capabilities (web search, code execution, etc.)",
    "checkSettingsForAdvanced": "Check Settings for advanced configuration",
    "visitChannelsToConnect": "Visit Channels to connect messaging platforms",
    "goToDashboard": "Go to Dashboard",
    "pleaseEnterApiKey": "Please enter an API key",
    "apiKeySavedFor": "API key saved for {provider}",
    "saveKeyFailed": "Failed to save key: {message}",
    "testFailed": "Test failed: {message}",
    "pleaseEnterAgentName": "Please enter a name for your agent",
    "agentCreatedToast": "Agent \"{name}\" created",
    "agentCreateFailed": "Failed to create agent: {message}",
    "pleaseEnterToken": "Please enter the {label}",
    "channelConfigFailed": "Failed: {message}"
  },
  "goalsPage": {
    "title": "Goals",
    "newGoal": "+ New Goal",
    "statTotal": "Total",
    "statInProgress": "In Progress",
    "statCompleted": "Completed",
    "statPending": "Pending",
    "loading": "Loading goals...",
    "loadError": "Failed to load goals",
    "noGoalsYet": "No goals yet",
    "createFirstGoal": "+ Create Your First Goal",
    "thTitle": "Title",
    "thStatus": "Status",
    "thProgress": "Progress",
    "thAgent": "Agent",
    "thActions": "Actions",
    "statusPending": "Pending",
    "statusInProgress": "In Progress",
    "statusCompleted": "Completed",
    "statusCancelled": "Cancelled",
    "addSubGoal": "Add sub-goal",
    "del": "Del",
    "createGoal": "Create Goal",
    "createFailed": "Failed to create goal",
    "updateFailed": "Failed to update goal",
    "deleteFailed": "Failed to delete goal",
    "deleteConfirm": "Delete this goal?",
    "deleteWithChildrenConfirm": "Delete this goal and all its sub-goals?",
    "labelTitle": "Title *",
    "placeholderTitle": "Goal title",
    "labelDescription": "Description",
    "placeholderDescription": "Describe the goal...",
    "labelParentGoal": "Parent Goal",
    "noneTopLevel": "None (top-level goal)",
    "labelStatus": "Status",
    "creating": "Creating..."
  },
  "analyticsPage": {
    "title": "Analytics",
    "loading": "Loading usage data...",
    "loadError": "Could not load usage data.",
    "totalTokens": "Total Tokens",
    "estimatedCost": "Estimated Cost",
    "apiCalls": "API Calls",
    "toolCalls": "Tool Calls",
    "tabSummary": "Summary",
    "tabByModel": "By Model",
    "tabByAgent": "By Agent",
    "tabCosts": "Costs",
    "tokenBreakdown": "Token Breakdown",
    "inputTokens": "Input Tokens",
    "outputTokens": "Output Tokens",
    "totalCost": "Total Cost",
    "thModel": "Model",
    "thCalls": "Calls",
    "thInputTokens": "Input Tokens",
    "thOutputTokens": "Output Tokens",
    "thCost": "Cost",
    "thUsage": "Usage",
    "noModelData": "No model usage data yet.",
    "thAgent": "Agent",
    "thTotalTokens": "Total Tokens",
    "thToolCalls": "Tool Calls",
    "noAgentData": "No agent usage data yet.",
    "totalSpend": "Total Spend",
    "todaysSpend": "Today's Spend",
    "projectedMonthly": "Projected Monthly",
    "avgCostPerMessage": "Avg Cost / Message",
    "costByProvider": "Cost by Provider",
    "noCostData": "No cost data yet.",
    "dailyCost": "Daily Cost (Last 7 Days)",
    "barTooltip": "{date}: {cost} ({calls} calls)",
    "noDailyData": "No daily data yet.",
    "costByModel": "Cost by Model",
    "thProvider": "Provider",
    "thTier": "Tier",
    "thCostShare": "Cost Share",
    "noModelCostData": "No model cost data yet.",
    "providerUnknown": "Unknown",
    "providerOther": "Other",
    "tierFrontier": "Frontier",
    "tierSmart": "Smart",
    "tierBalanced": "Balanced",
    "tierFast": "Fast",
    "dayShort": {
      "sun": "Sun",
      "mon": "Mon",
      "tue": "Tue",
      "wed": "Wed",
      "thu": "Thu",
      "fri": "Fri",
      "sat": "Sat"
    }
  },
  "memoryPage": {
    "title": "Memory",
    "subtitle": "Proactive memory system — what your agents remember about users.",
    "totalMemories": "Total Memories",
    "userLevel": "User Level",
    "sessionLevel": "Session Level",
    "agentLevel": "Agent Level",
    "searchPlaceholder": "Search memories...",
    "search": "Search",
    "all": "All",
    "content": "Content",
    "level": "Level",
    "category": "Category",
    "created": "Created",
    "noMemoriesFound": "No memories found",
    "versionHistory": "Version History",
    "replacedAt": "Replaced at:",
    "noPreviousVersions": "No previous versions",
    "allAgents": "All Agents",
    "filterByAgent": "Filter by agent",
    "addMemory": "Add Memory",
    "contentLabel": "Content",
    "contentPlaceholder": "Enter memory content...",
    "levelLabel": "Level",
    "save": "Save",
    "saving": "Saving...",
    "contentRequired": "Please enter memory content",
    "memoryAdded": "{count} memory/memories added",
    "addMemoryFailed": "Failed to add memory: {message}",
    "memoryDeleted": "Memory deleted",
    "deleteMemoryFailed": "Failed to delete memory",
    "confirmDelete": "Delete this memory?",
    "memoriesUsed": "memories used",
    "memoriesSaved": "memories saved",
    "recalled": "recalled",
    "saved": "saved"
  },
  "theme": {
    "light": "Light",
    "system": "System",
    "dark": "Dark"
  },
  "sidebar": {
    "shortcutHint": "Ctrl+K agents | Ctrl+N new"
  },
  "agentChat2": {
    "focusMode": "Focus mode (Ctrl+Shift+F)",
    "switchModel": "Switch model (Ctrl+M)",
    "vision": "Vision",
    "tools": "Tools",
    "agentSettings": "Agent settings",
    "providerModelPlaceholder": "provider/model",
    "doubleClickToEdit": "Double-click to edit"
  },
  "settingsPage2": {
    "enabled": "Enabled",
    "pmMasterToggleDesc": "Master toggle for the entire proactive memory subsystem. When off, no memories are stored or retrieved.",
    "pluginNamePlaceholder": "e.g. echo-memory"
  },
  "agentsPage2": {
    "modelPlaceholder": "e.g. llama-3.3-70b-versatile"
  },
  "schedulerPage2": {
    "deleteTrigger": "Delete"
  },
  "analyticsPage2": {
    "total": "TOTAL"
  },
  "memoryPage2": {
    "deleteSelected": "Delete {count} selected"
  },
  "confirm": {
    "cancel": "Cancel",
    "confirm": "Confirm"
  },
  "setupWizard2": {
    "configure": "Configure {name}"
  }
}
