/* English — Base language */

// MARK: - Migration
"migration.alertTitle" = "Database Update Failed";
"migration.alertMessage" = "The database cannot be migrated to the new version. You can reset the database and restart the app, but all existing data (sessions, agents, settings) will be permanently lost. Alternatively, exit the app without changes.";
"migration.resetAndRestart" = "Reset & Restart";
"migration.exitApp" = "Exit App";

// MARK: - Launch Tasks
"launch.cleaningUp" = "Cleaning up…";
"launch.buildingIndex" = "Building search index…";

// MARK: - Tabs
"tabs.sessions" = "Sessions";
"tabs.agents" = "Agents";
"tabs.skills" = "Skills";
"tabs.settings" = "Settings";

// MARK: - Common
"common.save" = "Save";
"common.cancel" = "Cancel";
"common.delete" = "Delete";
"common.create" = "Create";
"common.edit" = "Edit";
"common.done" = "Done";
"common.copy" = "Copy";
"common.copied" = "Copied";
"common.dismiss" = "Dismiss";
"common.enable" = "Enable";
"common.disable" = "Disable";
"common.default" = "Default";
"common.active" = "Active";
"common.preview" = "Preview";
"common.empty" = "*Empty*";
"common.refresh" = "Refresh";
"common.add" = "Add";
"common.name" = "Name";
"common.unknown" = "unknown";
"common.confirm" = "OK";
"common.import" = "Import";

// MARK: - Chat
"chat.messagePlaceholder" = "Message...";
"chat.cancelling" = "Cancelling…";
"chat.skillActivated" = "%@ activated — ask your question.";
"chat.thinking" = "Thinking…";
"chat.compressingContext" = "Compressing context…";
"chat.renameSession" = "Rename Session";
"chat.rename" = "Rename";
"chat.compressContext" = "Compress Context";
"chat.title" = "Title";
"chat.openLink" = "Open Link";
"chat.share" = "Share";
"chat.loadingImage" = "Loading image…";
"chat.imageLoadFailed" = "Image load failed";
"chat.newChat" = "New Chat";
"chat.aborted" = "\n\n⚠️ *[Aborted]*";
"chat.toolCallAborted" = "⚠️ *[Tool call aborted]*";
"chat.noAgent" = "No agent associated with this session";
"chat.noCompressModel" = "No model available for compression";
"chat.sessionBlocked" = "\"%@\" is processing. Only one active session per agent is allowed.";
"chat.compressionInfo" = "Context ≈%@ / %@ | %d messages (%d compressed)";
"chat.tokenUsage" = "%@ / %@ tokens";
"chat.messageStats" = "%d messages (%d compressed)";
"chat.pendingCompression" = "Compressing %d msgs";
"chat.compressedBadge" = "%d compressed";
"chat.cancelStuckReason" = "Stop is taking longer than expected — a tool call may still be running. Will force stop shortly…";
"chat.forceStoppedContent" = "\n\n⚠️ *[Force stopped — a tool call could not be interrupted in time]*";
"chat.deleteSessionTitle" = "Delete Session";
"chat.deleteSessionMessage" = "This session and all its messages will be permanently deleted. This cannot be undone.";
"chat.deleteAgentTitle" = "Delete Agent";
"chat.deleteAgentMessage" = "Agent \"%@\" and all its sessions, sub-agents, and data will be permanently deleted. This cannot be undone.";
"chat.thinkingProcess" = "Thinking Process";
"chat.addMedia" = "Add Media";
"chat.photosAndVideos" = "Photos & Videos";
"chat.camera" = "Camera";
"chat.pasteFromClipboard" = "Paste from Clipboard";
"chat.chooseFile" = "Choose File";
"chat.imagePlaceholder" = "[Image]";
"chat.saveImageToPhotos" = "Save Image";
"chat.imageSaved" = "Saved to Photos";
"chat.copyImage" = "Copy Image";
"chat.imageDeleted" = "Image deleted";
"chat.videoDeleted" = "Video deleted";
"chat.modalityStripped" = "%d image(s) temporarily excluded from context — %@ does not support vision.";
"chat.toolUseUnsupported" = "%@ does not support tool use — features like browsing, sub-agents, and code execution will be unavailable.";
"chat.exportSession" = "Export Session";
"chat.retry" = "Retry";
"chat.retryHint" = "Generation was stopped. You can retry or send a new message.";
"chat.verbose" = "Verbose";
"chat.silent" = "Silent";
"chat.switchToSilent" = "Switch to Silent Mode";
"chat.switchToVerbose" = "Switch to Verbose Mode";
"chat.silentThinking" = "Thinking (round %d)…";
"chat.silentRunningTool" = "Running %@…";
"chat.displayModeScope" = "Applies to all sessions of %@";
"chat.doubleTapToExpand" = "Double tap cell to expand";
"chat.cellDetail" = "Cell Detail";
"chat.videoSubmitting" = "Submitting...";
"chat.videoSubmitted" = "Task submitted";
"chat.videoGenerating" = "Generating video (%ds)";
"chat.videoDownloading" = "Downloading video...";
"chat.videoCompleted" = "Video complete";
"chat.videoFailed" = "Failed: %@";

// MARK: - Agents
"agents.title" = "Agents";
"agents.newAgent" = "New Agent";
"agents.agentName" = "Agent Name";
"agents.createAgent" = "Create Agent";
"agents.noAgents" = "No Agents";
"agents.createAgentDescription" = "Create an AI agent to get started.";
"agents.enterName" = "Enter a name for the new agent.";
"agents.renameAgent" = "Rename Agent";

// MARK: - Agent Detail
"agentDetail.config" = "Config";
"agentDetail.modelConfig" = "Model Config";
"agentDetail.skills" = "Skills";
"agentDetail.cronJobs" = "Cron Jobs";
"agentDetail.customConfigs" = "Custom Configs";
"agentDetail.subAgents" = "Sub-Agents";
"agentDetail.codeSnippets" = "Code Snippets";
"agentDetail.newConfig" = "New Config";
"agentDetail.keyPlaceholder" = "Key (e.g. RULES)";
"agentDetail.noSubAgents" = "No Sub-Agents";
"agentDetail.subAgentsDescription" = "Sub-agents are created by the AI during conversations.";
"agentDetail.sessionsCount" = "%d sessions";
"agentDetail.msgsCount" = "%d msgs";
"agentDetail.subAgentsTitle" = "Sub-Agents (%d)";
"agentDetail.noCodeSnippets" = "No Code Snippets";
"agentDetail.codeSnippetsDescription" = "Code snippets are saved by the AI agent.";
"agentDetail.snippetInfo" = "Info";
"agentDetail.snippetName" = "Name";
"agentDetail.snippetLanguage" = "Language";
"agentDetail.snippetCode" = "Code";
"agentDetail.newSnippet" = "New Snippet";
"agentDetail.applePermissions" = "Apple Permissions";

// MARK: - Apple Permissions
"applePermissions.title" = "Apple Permissions";
"applePermissions.description" = "Configure which Apple system features this agent can access. Read allows querying data; Write allows creating, modifying, or deleting data. The same level also gates the matching `apple.*` JavaScript API used by code execution and any installed skills that wrap it (e.g. Health Plus).";
"applePermissions.readWrite" = "Read & Write";
"applePermissions.readOnly" = "Read Only";
"applePermissions.writeOnly" = "Write Only";
"applePermissions.disabled" = "Disabled";
"applePermissions.enableAll" = "Enable All (Read & Write)";
"applePermissions.readOnlyAll" = "Set All to Read Only";
"applePermissions.disableAll" = "Disable All";
"applePermissions.calendar" = "Calendar";
"applePermissions.reminders" = "Reminders";
"applePermissions.contacts" = "Contacts";
"applePermissions.clipboard" = "Clipboard";
"applePermissions.notifications" = "Notifications";
"applePermissions.location" = "Location";
"applePermissions.map" = "Maps";
"applePermissions.health" = "Health";
"applePermissions.summaryReadWrite" = "%d tools enabled";
"applePermissions.summaryReadOnly" = "%d read tools enabled";
"applePermissions.summaryWriteOnly" = "%d write tools enabled";
"applePermissions.summaryDisabled" = "All tools disabled";

// MARK: - Model Config
"modelConfig.title" = "Model Config";
"modelConfig.globalDefault" = "Global Default";
"modelConfig.primaryModel" = "Primary Model";
"modelConfig.primaryModelFooter" = "The main model used for conversations with this agent.";
"modelConfig.noFallback" = "No fallback models configured";
"modelConfig.addFallback" = "Add Fallback";
"modelConfig.fallbackChain" = "Fallback Chain";
"modelConfig.fallbackFooter" = "When the primary model fails, these are tried in order. Drag to reorder.";
"modelConfig.inheritFromPrimary" = "Inherit from Primary";
"modelConfig.subAgentModel" = "Sub-Agent Model";
"modelConfig.subAgentDefault" = "Sub-Agent Default";
"modelConfig.subAgentFooter" = "The default model for sub-agents created by this agent.";
"modelConfig.compressionThreshold" = "Compression Threshold (tokens)";
"modelConfig.defaultThreshold" = "Default (%d)";
"modelConfig.systemDefault" = "0 = System default";
"modelConfig.resetDefault" = "Reset to Default";
"modelConfig.contextCompression" = "Context Compression";
"modelConfig.compressionFooter" = "When a session's cumulative tokens exceed this threshold, old messages are automatically compressed into a summary. Increasing this preserves more original context but increases API costs.";
"modelConfig.noToolUse" = "%@ — Tool Use not supported";
"modelConfig.noToolUse" = "%@ — No Tool Use";
"modelConfig.noModels" = "No models available — configure a provider in Settings";
"modelConfig.override" = "(override)";
"modelConfig.primary" = "Primary";
"modelConfig.fallback" = "Fallback";
"modelConfig.subAgent" = "Sub-Agent";
"modelConfig.resolutionOrder" = "Resolution Order";
"modelConfig.resolutionFooter" = "Models are tried in this order. Same provider can appear with different models.";
"modelConfig.modelWhitelist" = "Model Whitelist";
"modelConfig.whitelistAllModels" = "All available models allowed";
"modelConfig.addToWhitelist" = "Add to Whitelist";
"modelConfig.clearWhitelist" = "Clear Whitelist";
"modelConfig.whitelistFooter" = "Restrict which models sub-agents and tool calls can use. When empty, all available models are allowed.";
"modelConfig.whitelistStaleWarning" = "%d whitelist entry(s) reference deleted providers/models";
"modelConfig.whitelistMissingPrimary" = "Primary model is not in the whitelist — agent will fail to send messages";
"modelConfig.whitelistMissingSubAgent" = "Sub-agent default model is not in the whitelist";
"modelConfig.thinkingLevel" = "Thinking Level";
"modelConfig.thinkingLevelUseModelDefault" = "Use Model Default";
"modelConfig.thinkingLevelFooter" = "Overrides the model's default. Extra High requires Opus 4.7 or DeepSeek v4. Max requires Opus 4.5+, Sonnet 4.6+, or DeepSeek v4. Unsupported levels are clamped at request time.";
"modelConfig.imageProvider" = "Image Generation Model";
"modelConfig.imageProviderNone" = "Disabled";
"modelConfig.imageGenerationHeader" = "Image Generation";
"modelConfig.imageProviderFooter" = "Select a model for the generate_image tool. Only models with image generation capability are shown. When configured, the agent can generate images via tool calling.";
"modelConfig.videoProvider" = "Video Generation Model";
"modelConfig.videoProviderNone" = "Disabled";
"modelConfig.videoGenerationHeader" = "Video Generation";
"modelConfig.videoProviderFooter" = "Select a model for the generate_video tool. Only models with video generation capability are shown. Video generation typically takes 1-5 minutes per clip.";
"modelConfig.i2vProvider" = "Image-to-Video Model";
"modelConfig.i2vSameAsT2V" = "Same as Text-to-Video";

// MARK: - Cron Jobs
"cronJobs.title" = "Cron Jobs";
"cronJobs.noCronJobs" = "No Cron Jobs";
"cronJobs.noCronJobsDescription" = "Schedule recurring jobs from here or ask your AI agent to create one.";
"cronJobs.shortcutsTrigger" = "Shortcuts Trigger";
"cronJobs.shortcutsDescription" = "Use Apple Shortcuts to ensure reliable job execution";
"cronJobs.runsCount" = "%d runs";
"cronJobs.nextPrefix" = "Next: ";
"cronJobs.jobInfo" = "Job Info";
"cronJobs.schedule" = "Schedule";
"cronJobs.description" = "Description";
"cronJobs.enabled" = "Enabled";
"cronJobs.jobHint" = "Job Hint";
"cronJobs.statistics" = "Statistics";
"cronJobs.totalRuns" = "Total Runs";
"cronJobs.lastRun" = "Last Run";
"cronJobs.ago" = " ago";
"cronJobs.nextRun" = "Next Run";
"cronJobs.created" = "Created";
"cronJobs.triggerURL" = "Trigger URL";
"cronJobs.viewShortcutsGuide" = "View Shortcuts Guide";
"cronJobs.shortcutsIntegration" = "Shortcuts Integration";
"cronJobs.shortcutsIntegrationFooter" = "Use Apple Shortcuts automation to trigger this URL at the scheduled time for reliable execution.";
"cronJobs.lastSession" = "Last Session";
"cronJobs.editJob" = "Edit Job";
"cronJobs.newCronJob" = "New Cron Job";
"cronJobs.basic" = "Basic";
"cronJobs.jobName" = "Job Name";
"cronJobs.cronExpression" = "Cron Expression";
"cronJobs.nextFire" = "Next fire:";
"cronJobs.cronFormat" = "Format: minute hour day-of-month month day-of-week\nPresets: @hourly @daily @weekly @monthly @yearly";
"cronJobs.quickPresets" = "Quick Presets";
"cronJobs.everyHour" = "Every hour";
"cronJobs.daily9am" = "Daily 9am";
"cronJobs.weekdays9am" = "Weekdays 9am";
"cronJobs.weeklyMon" = "Weekly Mon";
"cronJobs.every30min" = "Every 30min";
"cronJobs.monthly1st" = "Monthly 1st";
"cronJobs.jobHintFooter" = "This prompt will be sent to the LLM each time the job triggers.";

// MARK: - Shortcuts Guide
"shortcuts.title" = "Shortcuts Guide";
"shortcuts.headerTitle" = "Use Shortcuts to Trigger Scheduled Tasks";
"shortcuts.headerSubtitle" = "Ensure cron jobs run reliably in the background";
"shortcuts.whyNeeded" = "Why Shortcuts?";
"shortcuts.whyDescription" = "iOS has strict limits on background tasks. The system may delay or skip BGAppRefreshTask, causing scheduled tasks to not trigger on time. You can pair iClaw's App Intents (or URL scheme as a fallback) with a Shortcuts automation to make cron runs land reliably at the scheduled time.";

"shortcuts.appIntentSection" = "Recommended: App Intent (no unlock needed)";
"shortcuts.appIntentDescription" = "Uses iClaw's native App Intent so Shortcuts can run cron jobs in the background without opening the app. Works even when your phone is locked — no Face ID or passcode prompt.";
"shortcuts.appIntentStep1Title" = "Create Personal Automation";
"shortcuts.appIntentStep1Detail" = "In the Shortcuts app go to Automation → Create Personal Automation → Time of Day, and set the trigger time.";
"shortcuts.appIntentStep2Title" = "Add iClaw Action";
"shortcuts.appIntentStep2Detail" = "Tap Add Action, search \"iClaw\", then pick \"Run Due Cron Jobs\" (or \"Trigger Cron Job\" to target a specific job by name).";
"shortcuts.appIntentStep3Title" = "Enable Run Immediately";
"shortcuts.appIntentStep3Detail" = "Turn on \"Run Immediately\" and turn off \"Notify When Run\". This lets the automation fire silently without any lock-screen prompt.";
"shortcuts.appIntentStep4Title" = "Done";
"shortcuts.appIntentStep4Detail" = "Save the automation. The cron job will now run at the scheduled time even while the phone is locked.";

"shortcuts.legacyFallbackSection" = "Legacy Fallback: URL Scheme";
"shortcuts.legacyFallbackDescription" = "The URL scheme below still works, but uses \"Open URL\" which brings iClaw to the foreground and therefore requires unlocking the phone. Prefer the App Intent path above for unattended runs.";

"shortcuts.setupSteps" = "Setup Steps";
"shortcuts.step1Title" = "Open Shortcuts App";
"shortcuts.step1Detail" = "Go to the Shortcuts app and select the \"Automation\" tab at the bottom.";
"shortcuts.step2Title" = "Create Personal Automation";
"shortcuts.step2Detail" = "Tap \"+\" in the upper right → \"Create Personal Automation\" → Select \"Time of Day\".";
"shortcuts.step3Title" = "Set Trigger Time";
"shortcuts.step3Detail" = "Set the time and repeat rules (daily/weekdays/specific dates) matching your cron job schedule.";
"shortcuts.step4Title" = "Add Action";
"shortcuts.step4Detail" = "Search for and add the \"Open URL\" action, then fill in the following URL:";
"shortcuts.step5Title" = "Disable \"Ask Before Running\"";
"shortcuts.step5Detail" = "Make sure \"Ask Before Running\" is turned off so the automation runs silently.";
"shortcuts.step6Title" = "Done";
"shortcuts.step6Detail" = "Tap \"Done\" to save the automation. Your cron job will now be reliably triggered via Shortcuts at the scheduled time.";
"shortcuts.urlReference" = "URL Reference";
"shortcuts.triggerSpecific" = "Trigger Specific Job";
"shortcuts.triggerSpecificDesc" = "Trigger the cron job with the specified ID";
"shortcuts.runAllDue" = "Run All Due Jobs";
"shortcuts.runAllDueDesc" = "Check and execute all due cron jobs";
"shortcuts.tips" = "Tips";
"shortcuts.tip1" = "For high-frequency tasks (e.g. hourly), keep both in-app scheduling and Shortcuts as dual safeguards.";
"shortcuts.tip2" = "Shortcuts automation can run even when the device is locked, but requires network connectivity.";
"shortcuts.tip3" = "If you have multiple cron jobs, use the \"Run All Due Jobs\" URL to trigger them all at once.";
"shortcuts.tip4" = "The first time a URL scheme is used, the system may show a confirmation dialog. After confirming, subsequent calls will run silently.";

// MARK: - App Intents (cron)
"appIntent.entity.cronJob" = "Cron Job";
"appIntent.runDue.title" = "Run Due Cron Jobs";
"appIntent.runDue.description" = "Runs every enabled iClaw cron job whose schedule is currently due. Does not open the app, so automations can fire while the phone is locked.";
"appIntent.trigger.title" = "Trigger Cron Job";
"appIntent.trigger.description" = "Runs the selected iClaw cron job now. Does not open the app, so automations can fire while the phone is locked.";
"appIntent.parameter.cronJob" = "Cron Job";

// AppShortcut shortTitle keys — the literal strings match `shortTitle:` in
// iClawAppShortcuts.swift. AppShortcuts.strings only accepts phrases, so the
// shortTitle localization has to live here in Localizable.strings.
"Run Due Cron Jobs" = "Run Due Cron Jobs";
"Trigger Cron Job" = "Trigger Cron Job";

// MARK: - Sessions
"sessions.title" = "Sessions";
"sessions.noSessions" = "No Sessions";
"sessions.noSessionsDescription" = "Create a new session to start chatting with an AI agent.";
"sessions.newSession" = "New Session";
"sessions.noAgents" = "No Agents";
"sessions.noAgentsDescription" = "Create an agent first in the Agents tab.";
"sessions.sessionsCount" = "%d sessions";
"sessions.selectAgent" = "Select Agent";
"sessions.messagesCount" = "%d messages";
"sessions.draft" = "Draft";
"sessions.searchSessions" = "Search sessions";
"sessions.selectSession" = "Select a Session";
"sessions.selectSessionDescription" = "Choose a session from the sidebar to start chatting.";

// MARK: - Settings
"settings.title" = "Settings";
"settings.llmProviders" = "LLM Providers";
"settings.imageProviders" = "Image Generation";
"settings.videoProviders" = "Video Generation";
"settings.addProvider" = "Add Provider";
"settings.deleteProviderTitle" = "Delete Provider";
"settings.deleteProviderMessage" = "This provider will be permanently deleted. This cannot be undone.";
"settings.deleteProviderAffectedMessage" = "The following agents use this provider and will fall back to the default provider after deletion: %@";
"settings.about" = "About";
"settings.version" = "Version";
"settings.build" = "Build";
"settings.aboutDescription" = "iClaw is an open-source iOS client for interacting with LLM agents. It supports multi-provider model routing, sub-agents, browser automation, code execution, cron scheduling, and Apple ecosystem integration (Calendar, Reminders, Contacts, Health, Maps, and more).";
"settings.sourceCode" = "Source Code";
"settings.license" = "Licensed under the MIT License";
"settings.backgroundExecution" = "Background Execution";
"settings.backgroundKeepAlive" = "Live Activity";
"settings.backgroundKeepAliveFooter" = "Pin a Live Activity to the Dynamic Island while background tasks are running, keeping the app visible and easy to return to. Disabled by default.";
"settings.skills" = "Skills";
"settings.progressiveSkillDisclosure" = "Progressive disclosure";
"settings.progressiveSkillDisclosureFooter" = "When on, each installed skill is dormant in your system prompt — only its name and description load until you activate it (type /<slug>, call one of its tools, or run one of its scripts). Saves significant prompt budget when many skills are installed. Default on.";
"liveActivity.running" = "Tasks running…";
"liveActivity.done" = "All tasks completed";
"liveActivity.error" = "Task failed";
"liveActivity.agentsRunning" = "%d Agent(s) running";

// MARK: - LLM Provider
"provider.editProvider" = "Edit Provider";
"provider.addProvider" = "Add Provider";
"provider.addModel" = "Add Model";
"provider.modelNamePlaceholder" = "Model name (e.g. gpt-4o-mini)";
"provider.provider" = "Provider";
"provider.endpoint" = "Endpoint";
"provider.authentication" = "Authentication";
"provider.apiKey" = "API Key";
"provider.defaultModel" = "Default Model";
"provider.defaultModelFooter" = "The default model used when no specific model is selected.";
"provider.noModelsEnabled" = "No models enabled";
"provider.setDefault" = "Set Default";
"provider.manuallyAddModel" = "Manually Add Model";
"provider.enabledModels" = "Enabled Models";
"provider.enabledModelsFooter" = "Swipe left to disable, swipe right to set as default. Only enabled models appear in agent model selection.";
"provider.fetchFromAPI" = "Fetch from API";
"provider.availableToEnable" = "Available to Enable (%d)";
"provider.allModelsEnabled" = "All %d fetched models are enabled";
"provider.enableAll" = "Enable All";
"provider.remoteModels" = "Remote Models";
"provider.remoteModelsFooter" = "Fetch models from the API endpoint, then enable the ones you need.";
"provider.maxTokens" = "Max Tokens: %d";
"provider.thinkingBudget" = "Thinking Budget: %d";
"provider.thinkingBudgetFooter" = "Token budget for extended thinking / reasoning. max_tokens is automatically adjusted to be larger than this value.";
"provider.parameters" = "Parameters";
"provider.supportsVision" = "Supports Vision";
"provider.supportsVisionFooter" = "Enable if this model supports image inputs (e.g. GPT-4o, Claude 3.5 Sonnet)";
"provider.supportsVideoInput" = "Supports Video Input";
"provider.supportsToolUse" = "Supports Tool Use";
"provider.supportsToolUseFooter" = "Disable if this model does not support function calling / tool use (some OpenRouter models)";
"provider.supportsImageGeneration" = "Image Generation";
"provider.supportsImageGenerationFooter" = "Enable for models that can generate images (e.g. Gemini 2.5 Flash Image / Nano Banana). Sends modalities parameter to the API.";
"provider.supportsVideoGeneration" = "Video Generation";
"provider.imageGenMode.none" = "None";
"provider.imageGenMode.chatInline" = "Chat Inline";
"provider.imageGenMode.dedicatedAPI" = "Dedicated API";
"provider.imageGenMode.dashScope" = "DashScope";
"provider.videoGenMode.none" = "None";
"provider.videoGenMode.auto" = "Auto Detect";
"provider.videoGenMode.restPolling" = "REST Polling (Sora, Runway, Luma)";
"provider.testConnection" = "Test Connection";
"provider.testConnectionSuccess" = "%lld models";
"provider.testConnectionOK" = "OK";
"provider.videoGenMode.googleVeo" = "Google Veo";
"provider.videoGenMode.dashScope" = "DashScope (Tongyi Wan)";
"provider.videoGenMode.kling" = "Kling";
"provider.videoGenMode.seedance" = "Seedance (ByteDance)";
"provider.supportsReasoning" = "Supports Reasoning";
"provider.supportsReasoningFooter" = "Enable for models with extended thinking / reasoning (e.g. Claude with extended thinking, DeepSeek R1, o1/o3). Thinking output will be captured and displayed.";
"provider.thinkingLevel" = "Thinking Level";
"provider.thinkingLevelFooter" = "Higher levels spend more reasoning tokens. On Claude Opus 4.5+, Sonnet 4.6+, and DeepSeek v4 this maps to effort; on legacy Claude it maps to budget tokens. On plain OpenAI o-series, Extra High and Max behave as High.";
"provider.thinkingLevelXHighSuffix" = "Opus 4.7 / DeepSeek v4";
"provider.thinkingLevelMaxSuffix" = "Opus 4.5+ / Sonnet 4.6+ / DeepSeek v4";
"provider.thinkingLevelXHighSuffixOpenAI" = "DeepSeek v4 (else High)";
"provider.thinkingLevelMaxSuffixOpenAI" = "DeepSeek v4 (else High)";
"provider.perModelMaxTokens" = "Override Max Tokens";
"provider.temperature" = "Temperature: %.2f";
"provider.perModelTemperature" = "Override Temperature";
"provider.parametersFooter" = "Default values for all models. Individual models can override these in the Enabled Models section above.";
"provider.providerType" = "Provider Type";
"provider.providerType.llm" = "LLM (Chat)";
"provider.providerType.image" = "Image Generation (Experimental)";
"provider.providerType.video" = "Video Generation (Experimental)";
"provider.providerTypeFooter" = "LLM providers handle chat completions. Video providers are dedicated to video generation APIs like Kling, Veo, or DashScope.";
"provider.apiStyle" = "API Protocol";
"provider.apiStyle.openAIResponses" = "OpenAI Responses";
"provider.apiStyle.openAI" = "OpenAI Compatible";
"provider.apiStyle.anthropic" = "Anthropic";
"provider.apiStyle.googleVeo" = "Google Veo";
"provider.apiStyle.dashScope" = "DashScope (Tongyi Wan)";
"provider.apiStyle.kling" = "Kling";
"provider.apiStyle.seedance" = "Seedance (ByteDance)";
"provider.apiStyleFooter" = "Specifies the API protocol for requests. OpenAI Compatible uses /chat/completions for most third-party providers (OpenAI-compatible gateways, DeepSeek, OpenRouter, Ollama, etc.). OpenAI Responses uses /responses and should be selected only for OpenAI or providers that explicitly support it. Anthropic is for Anthropic's native Messages API.";
"provider.modelCapabilities" = "Model Capabilities";
"provider.presets" = "Presets";

// MARK: - Skills
"skills.title" = "Skills";
"skills.noSkills" = "No Skills";
"skills.noSkillsDescription" = "Create a skill or let your AI agent build one.";
"skills.createSkill" = "Create Skill";
"skills.importSkill" = "Import Skill…";
"skills.importContinue" = "Continue";
"skills.importReplace" = "Replace";
"skills.importSecurityTitle" = "Import a skill?";
"skills.importSecurityBody" = "Imported skills run JavaScript inside the agent sandbox with access to the filesystem and Apple ecosystem APIs (subject to your per-agent permissions). DO NOT IMPORT SKILLS FROM UNTRUSTED SOURCES — a malicious skill can read or modify any data the agent can reach. Continue only if you trust where this folder came from.";
"skills.importFailedTitle" = "Import failed";
"skills.importNotADirectory" = "The selected path is not a skill package directory.";
"skills.importWarningsTitle" = "Import with warnings?";
"skills.importCollisionTitle" = "Replace existing skill?";
"skills.importCollisionBody" = "A skill named '%@' is already installed. Replacing it will overwrite the on-disk package and the saved row.";
"skills.importCollisionFooter" = "Note: a skill named '%@' is already installed. Confirming will replace it.";
"skills.importBuiltInRefused" = "'%@' is a built-in skill and cannot be replaced. Pick a different folder name and import again.";
"skills.importValidationFailed" = "Validation found %d error(s):";
"skills.importValidationWarnings" = "Validation found %d warning(s) — review before importing:";
"skills.importedTitle" = "Imported";
"skills.importedBody" = "'%@' is now installed.";
"skills.revealInFiles" = "Reveal in Files";
"skills.showInFiles" = "Show Skills folder in Files";
"skills.shareSkill" = "Share Skill…";
"skills.validationErrorsTitle" = "Validation errors";
"skills.validationWarningsTitle" = "Validation warnings";
"skills.parameterOptional" = "(optional)";
"skills.editScriptTitle" = "Edit Script";
"skills.editToolTitle" = "Edit Tool";
"skills.customSkills" = "Custom Skills";
"skills.builtInSkills" = "Built-in Skills";
"skills.builtIn" = "built-in";
"skills.searchSkills" = "Search skills...";
"skills.deleteSkill" = "Delete Skill";
"skills.deleteSkillMessage" = "This will permanently delete '%@' and remove it from all agents.";
"skills.content" = "Content";
"skills.noAgents" = "No Agents";
"skills.noAgentsDescription" = "Create an agent first.";
"skills.install" = "Install %@";
"skills.skillsActive" = "%d skill(s) active";
"skills.agents" = "agents";
"skills.editSkill" = "Edit Skill";
"skills.newSkill" = "New Skill";
"skills.info" = "Info";
"skills.skillName" = "Skill Name";
"skills.summary" = "Summary (one-line description)";
"skills.tags" = "Tags (comma-separated)";
"skills.contentMarkdown" = "Content (Markdown)";
"skills.contentFooter" = "Write instructions, methodology, or knowledge that will be injected into the agent's system prompt when this skill is installed.";
"skills.noSkillsInstalled" = "No Skills Installed";
"skills.installDescription" = "Install skills from the library to give this agent specialized capabilities.";
"skills.browseLibrary" = "Browse Library";
"skills.uninstall" = "Uninstall";
"skills.skillLibrary" = "Skill Library";
"skills.activeInstalled" = "%d active / %d installed";
"skills.scriptsCount" = "Scripts (%d)";
"skills.customToolsCount" = "Custom Tools (%d)";
"skills.parameters" = "Parameters";
"skills.addScript" = "Add Script";
"skills.addTool" = "Add Tool";
"skills.addParameter" = "Add Parameter";
"skills.scripts" = "Scripts";
"skills.customTools" = "Custom Tools";
"skills.scriptsFooter" = "JavaScript snippets registered as code snippets when the skill is installed.";
"skills.customToolsFooter" = "Custom tools become callable functions for the agent, backed by JavaScript.";
"skills.scriptName" = "Script name";
"skills.descriptionOptional" = "Description (optional)";
"skills.jsCode" = "JavaScript Code";
"skills.toolName" = "Tool name";
"skills.toolInfo" = "Tool Info";
"skills.description" = "Description";
"skills.jsImplementation" = "JavaScript Implementation";
"skills.jsImplementationFooter" = "Access parameters via `args.paramName`. Installation config is available via `args.config`.";
"skills.configure" = "Configure";
"skills.skillConfiguration" = "Skill Configuration";
"skills.required" = "Required";

// MARK: - Cron Description
"cron.invalidExpression" = "Invalid cron expression";
"cron.everyMinute" = "every minute";
"cron.atMinute" = "at minute %d";
"cron.atMinutes" = "at minutes %@";
"cron.ofEveryHour" = "of every hour";
"cron.ofHour" = "of hour %d";
"cron.ofHours" = "of hours %@";
"cron.onDays" = "on day(s) %@";
"cron.inMonths" = "in month(s) %@";
"cron.onWeekdays" = "on %@";
"cron.sun" = "Sun";
"cron.mon" = "Mon";
"cron.tue" = "Tue";
"cron.wed" = "Wed";
"cron.thu" = "Thu";
"cron.fri" = "Fri";
"cron.sat" = "Sat";

// MARK: - Cron Executor
"cronExec.completed" = "CronJob Completed";
"cronExec.completedBody" = "%@ finished. Tap to view the session.";
"cronExec.noProvider" = "[CronJob Error] No LLM provider configured.";

// MARK: - Chat Errors
"chatError.noProvider" = "No LLM provider configured. Please add one in Settings.";
"chatError.noAgent" = "No agent associated with this session.";
"chatError.whitelistBlocked" = "No available models — current model is not in the whitelist. Please check agent's model and whitelist settings.";

// MARK: - Browser
"tabs.browser" = "Browser";
"browser.title" = "Browser";
"browser.urlPlaceholder" = "Search or enter URL";
"browser.agentControlling" = "\"%@\" is controlling the browser";
"browser.takeOver" = "Take Over";
"browser.takeOverTitle" = "Take Over Browser";
"browser.takeOverMessage" = "Agent \"%@\" is currently automating the browser. Taking over will interrupt its operations. Continue?";
"browser.closePage" = "Close Page";
"browser.closePageTitle" = "Close Current Page";
"browser.closePageMessage" = "This will close the current page and return to a blank browser.";

// MARK: - Markdown Editor
"markdownEditor.preview" = "Preview";
"markdownEditor.edit" = "Edit";

// MARK: - Tool Card Display Names
"toolCard.javascript" = "JavaScript";
"toolCard.readConfig" = "Read Config";
"toolCard.writeConfig" = "Write Config";
"toolCard.saveCode" = "Save Code";
"toolCard.loadCode" = "Load Code";
"toolCard.listCode" = "List Code";
"toolCard.createAgent" = "Create Agent";
"toolCard.messageAgent" = "Message Agent";
"toolCard.collectOutput" = "Collect Output";
"toolCard.listAgents" = "List Agents";
"toolCard.stopAgent" = "Stop Agent";
"toolCard.deleteAgent" = "Delete Agent";
"toolCard.scheduleJob" = "Schedule Job";
"toolCard.removeJob" = "Remove Job";
"toolCard.listJobs" = "List Jobs";
"toolCard.createSkill" = "Create Skill";
"toolCard.deleteSkill" = "Delete Skill";
"toolCard.installSkill" = "Install Skill";
"toolCard.uninstallSkill" = "Uninstall Skill";
"toolCard.listSkills" = "List Skills";
"toolCard.readSkill" = "Read Skill";
"toolCard.setModel" = "Set Model";
"toolCard.getModel" = "Get Model";
"toolCard.listModels" = "List Models";
"toolCard.fileList" = "List Files";
"toolCard.fileRead" = "Read File";
"toolCard.fileWrite" = "Write File";
"toolCard.fileDelete" = "Delete File";
"toolCard.fileInfo" = "File Info";
"toolCard.attachMedia" = "Attach Media";
"toolCard.browse" = "Browse";
"toolCard.pageInfo" = "Page Info";
"toolCard.click" = "Click";
"toolCard.input" = "Input";
"toolCard.select" = "Select";
"toolCard.extract" = "Extract";
"toolCard.browserJS" = "Browser JS";
"toolCard.waitElement" = "Wait Element";
"toolCard.scroll" = "Scroll";
"toolCard.runSnippet" = "Run Snippet";
"toolCard.deleteCode" = "Delete Code";
"toolCard.calendarListCalendars" = "List Calendars";
"toolCard.calendarCreateEvent" = "Create Event";
"toolCard.calendarSearchEvents" = "Search Events";
"toolCard.calendarUpdateEvent" = "Update Event";
"toolCard.calendarDeleteEvent" = "Delete Event";
"toolCard.reminderLists" = "List Reminder Lists";
"toolCard.reminderList" = "List Reminders";
"toolCard.reminderCreate" = "Create Reminder";
"toolCard.reminderComplete" = "Complete Reminder";
"toolCard.reminderDelete" = "Delete Reminder";
"toolCard.contactsSearch" = "Search Contacts";
"toolCard.contactsGetDetail" = "Contact Detail";
"toolCard.clipboardRead" = "Read Clipboard";
"toolCard.clipboardWrite" = "Write Clipboard";
"toolCard.notificationSchedule" = "Schedule Notification";
"toolCard.notificationCancel" = "Cancel Notification";
"toolCard.notificationList" = "List Notifications";
"toolCard.locationGetCurrent" = "Current Location";
"toolCard.locationGeocode" = "Geocode";
"toolCard.locationReverseGeocode" = "Reverse Geocode";
"toolCard.mapSearchPlaces" = "Search Places";
"toolCard.mapGetDirections" = "Get Directions";
"toolCard.healthReadSteps" = "Read Steps";
"toolCard.healthReadHeartRate" = "Read Heart Rate";
"toolCard.healthReadSleep" = "Read Sleep";
"toolCard.healthReadBodyMass" = "Read Body Mass";
"toolCard.healthReadBloodPressure" = "Read Blood Pressure";
"toolCard.healthReadBloodGlucose" = "Read Blood Glucose";
"toolCard.healthReadBloodOxygen" = "Read Blood Oxygen";
"toolCard.healthReadBodyTemperature" = "Read Body Temperature";
"toolCard.healthWriteDietaryEnergy" = "Write Calories";
"toolCard.healthWriteBodyMass" = "Write Body Mass";
"toolCard.healthWriteDietaryWater" = "Write Water Intake";
"toolCard.healthWriteDietaryCarbohydrates" = "Write Carbohydrates";
"toolCard.healthWriteDietaryProtein" = "Write Protein";
"toolCard.healthWriteDietaryFat" = "Write Fat";
"toolCard.healthWriteBloodPressure" = "Write Blood Pressure";
"toolCard.healthWriteBodyFat" = "Write Body Fat";
"toolCard.healthWriteHeight" = "Write Height";
"toolCard.healthWriteBloodGlucose" = "Write Blood Glucose";
"toolCard.healthWriteBloodOxygen" = "Write Blood Oxygen";
"toolCard.healthWriteBodyTemperature" = "Write Body Temperature";
"toolCard.healthWriteHeartRate" = "Write Heart Rate";
"toolCard.healthWriteWorkout" = "Write Workout";
"toolCard.searchSessions" = "Search Sessions";
"toolCard.recallSession" = "Recall Session";
"toolCard.generateImage" = "Generate Image";
"toolCard.generateVideo" = "Generate Video";
"toolCard.skillScope" = "Skill";

// MARK: - Tool Result
"toolResult.stdout" = "stdout";
"toolResult.stderr" = "stderr";

// MARK: - Tool Permissions
"toolPermissions.title" = "Tool Permissions";
"toolPermissions.description" = "Configure which tools and capabilities this agent can use. Read allows querying data; Write allows creating, modifying, or deleting data. For categories that also expose a JavaScript bridge (e.g. `apple.*`, `fs.*`), the same level gates those calls from `execute_javascript` and from built-in skills that wrap them (File Ops, Health Plus).";
"toolPermissions.browser" = "Browser";
"toolPermissions.codeExecution" = "Code Execution";
"toolPermissions.subAgents" = "Sub-Agents";
"toolPermissions.sessions" = "Sessions";
"toolPermissions.cron" = "Cron Jobs";
"toolPermissions.skills" = "Skills";
"toolPermissions.config" = "Config";
"toolPermissions.model" = "Model";
"toolPermissions.files" = "Files";
"toolPermissions.imageGeneration" = "Image Generation";
"toolPermissions.videoGeneration" = "Video Generation";
"toolPermissions.appleSection" = "Apple Ecosystem";
"toolPermissions.agentSection" = "Agent Capabilities";
"agentDetail.toolPermissions" = "Tool Permissions";

// MARK: - Agent Files
"agentFiles.title" = "Files";
"agentFiles.empty" = "No Files";
"agentFiles.emptyDescription" = "Files created by the agent or uploaded by you will appear here.";
"agentFiles.deleteConfirmTitle" = "Delete File";
"agentFiles.deleteConfirmMessage" = "Are you sure you want to delete \"%@\"? This cannot be undone.";
"agentFiles.imagePermissionDisabled" = "File access is disabled for this agent";
"agentFiles.newFolder" = "New Folder";
"agentFiles.folderName" = "Folder name";
"agentFiles.invalidFolderName" = "Invalid folder name";

// MARK: - Permission Errors
"permError.calendarDenied" = "[Error] Calendar access denied. Please enable in Settings > Privacy > Calendars.";
"permError.calendarDeniedByUser" = "[Error] Calendar access denied by user.";
"permError.calendarWriteOnly" = "[Error] Only write access granted. Full access is required. Please update in Settings > Privacy > Calendars.";
"permError.calendarUnknown" = "[Error] Unknown calendar authorization status.";
"permError.remindersDenied" = "[Error] Reminders access denied. Please enable in Settings > Privacy > Reminders.";
"permError.remindersDeniedByUser" = "[Error] Reminders access denied by user.";
"permError.remindersUnknown" = "[Error] Unknown reminders authorization status.";
"permError.contactsDenied" = "[Error] Contacts access denied. Please enable in Settings > Privacy > Contacts.";
"permError.contactsDeniedByUser" = "[Error] Contacts access denied by user.";
"permError.contactsUnknown" = "[Error] Unknown contacts authorization status.";
"permError.notificationDenied" = "[Error] Notification access denied. Please enable in Settings > Notifications.";
"permError.notificationDeniedByUser" = "[Error] Notification access denied by user.";
"permError.notificationUnknown" = "[Error] Unknown notification authorization status.";
"permError.locationDenied" = "[Error] Location access denied. Please enable in Settings > Privacy > Location Services.";
"permError.locationDeniedByUser" = "[Error] Location access denied by user.";
"permError.locationUnknown" = "[Error] Unknown location authorization status.";
"permError.healthUnavailable" = "[Error] Health data is not available on this device.";
"permError.healthFailed" = "[Error] Failed to request HealthKit access: %@";
"permError.toolNotPermitted" = "[Error] Tool '%@' (%@) is not permitted for this agent. Check Tool Permissions in agent settings.";

// MARK: - Export
"export.roleUser" = "User";
"export.roleAssistant" = "Assistant";
"export.roleTool" = "Tool";
"export.toolCall" = "Tool Call";

// MARK: - Built-in Skills (Data)
// These describe user-visible skill content, tool descriptions, and parameter
// hints. The Markdown body of each skill lives in BuiltInSkills/<Name>.md.

// Deep Research

// File Ops

// Health Plus
