{
  "common": {
    "save": "Save",
    "cancel": "Cancel",
    "submit": "Submit",
    "next": "Next",
    "back": "Back",
    "change": "Change",
    "resume": "Resume",
    "on": "On",
    "off": "Off",
    "default": "(Default)",
    "selectOne": "Select one",
    "selectOneOrMore": "Select one or more",
    "processing": "Processing `/{command}`...",
    "submitted": "Submitted"
  },
  "error": {
    "channelNotEnabled": "This channel is not enabled. Please go to the control panel to enable it.",
    "unknownCommand": "Unknown command: `/{command}`\n\nPlease use `@avibe /start` to access all bot features.",
    "clearSession": "Error clearing session: {error}",
    "settingsFailed": "Failed to open settings. Please try again.",
    "cwdChangeFailed": "Failed to open directory change dialog. Please try again.",
    "resumeFailed": "Failed to open resume dialog. Please try again.",
    "stopFailed": "Error sending stop command: {error}",
    "cwdSetFailed": "Error setting working directory: {error}",
    "cwdCreateFailed": "Cannot create directory: {error}",
    "cwdNotDirectory": "Path exists but is not a directory: `{path}`",
    "cwdGetFailed": "Error getting working directory: {error}",
    "showSettings": "Error showing settings: {error}",
    "toggleSettingFailed": "Failed to toggle setting: {error}",
    "messageTypesInfoFailed": "Error showing message types info",
    "helpInfoFailed": "Error showing help information",
    "routingFailed": "Error showing routing settings: {error}",
    "routingModalFailed": "Failed to open agent settings. Please try again.",
    "settingsUpdateFailed": "Failed to update settings: {error}",
    "languageUpdateFailed": "Language update failed. Please try again.",
    "resumeSubmitFailed": "Failed to resume session: {error}",
    "routingUpdateFailed": "Failed to update routing: {error}",
    "updateUnavailable": "Update action is not available right now.",
    "unknownAction": "Unknown action: {action}",
    "processActionFailed": "Error processing action: {error}",
    "agentNotConfigured": "Agent `{agent}` is not configured. Make sure the Codex CLI is installed and environment variables are set if this channel is routed to Codex.",
    "processMessageFailed": "Error: {error}",
    "streamTurnInProgress": "⚠️ A reply is already streaming for this session — wait for it to finish, then try again.",
    "sessionReset": "Session error detected. Session has been reset. Please try your message again.",
    "sessionConnectionLost": "Connection to Claude was lost. Please try your message again.",
    "claudeSessionNotFound": "Claude Code could not find the historical session `{sessionId}` in the current working directory:\n`{path}`\n\nClaude Code sessions are scoped to a working directory. This usually means the conversation was resumed after switching workdirs, or the local Claude Code session data changed. Switch back to the original working directory to continue that session, or start a new Claude Code session from the current directory.",
    "sessionGeneric": "An error occurred: {error}",
    "resultAttachmentUploadFailed": "Failed to upload attachment. Want me to split the result into multiple messages?",
    "resultDeliveryFailed": "⚠️ Message delivery failed. The content may be too long or incompatible. Ask me to resend it.",
    "opencodeQuestionToolDisabled": "OpenCode asked an interactive question, but Avibe disables the OpenCode question tool. Please send a new follow-up message with your answer or direction.",
    "opencodeQuestionToolDisabledRestored": "Restored OpenCode session asked an interactive question, but Avibe disables the OpenCode question tool. Please send a new follow-up message with your answer or direction."
  },
  "success": {
    "settingsUpdated": "Settings updated successfully!",
    "cwdChanged": "Working directory changed to:\n`{path}`",
    "sessionResumed": "Resumed {agent} session.\nSession ID: `{sessionId}`",
    "sessionResumedContinueThread": "💬 *Reply in this thread* to continue with this session.",
    "sessionResumedContinueFeishuThread": "💬 *Reply to this message* to continue with this session.",
    "sessionResumedContinueDiscordThread": "💬 *Reply in the subchannel to this message* to continue with this session.",
    "sessionResumedContinueDirect": "💬 *Send your next message directly* to continue with this session.",
    "sessionResumedThreadFreshTip": "_(Sending a new message in the main channel will start a fresh session.)_",
    "routingUpdated": "Agent routing updated!"
  },
  "settings": {
    "personalizationTitle": "Personalization Settings",
    "personalizationDesc": "Configure how {agent} messages appear in your Slack workspace.",
    "visibilityTitle": "Settings - Message Visibility",
    "visibilityDesc": "Select which message types to hide from {agent} output:",
    "showMessageType": "Show {name}",
    "visibilityShown": "shown",
    "visibilityHidden": "hidden",
    "messageTypeStatus": "{name} messages are now {action}"
  },
  "audio": {
    "transcriptEchoSingle": "Voice transcript:",
    "transcriptEchoMultiple": "Voice transcripts:"
  },
  "update": {
    "actionUnavailable": "Update action unavailable for this message.",
    "alreadyInProgress": "Upgrade already in progress. Please wait.",
    "alreadyInProgressShort": "Upgrade already in progress",
    "alreadyInProgressWarning": "⚠️ An upgrade is already in progress. Please wait.",
    "alreadyUpToDate": "Already up to date.",
    "latestVersionSlack": "✅ Already running the latest version.",
    "checkFailed": "Update check failed. Please try again later.",
    "infoUnavailable": "Update information unavailable. Please try again later.",
    "upgradeFailed": "Upgrade failed. Please check logs.",
    "upgradeFailedShort": "Upgrade failed",
    "upgradeFailedSlack": "❌ *Upgrade Failed*\n\nPlease check the logs for details.",
    "updating": "Updating Avibe...",
    "updatingSlack": "⏳ *Updating Avibe...*\n\nPlease wait, the service will restart shortly.",
    "restartRequired": "Upgrade complete. Please restart Avibe.",
    "restartRequiredShort": "Upgrade completed - restart required",
    "restartRequiredSlack": "✅ *Upgrade complete*\n\nPlease restart Avibe to apply the update.",
    "updated": "✅ Avibe has been updated to `{version}`",
    "updatedSlack": "✅ *Avibe Updated Successfully*\n\nNow running version `{version}`",
    "availablePlain": "Avibe update available: {current} → {latest} ({releaseUrl})",
    "availableSlack": "🚀 *Avibe Update Available*\n\nA new version is available: `{current}` → {latestLink}",
    "availableDiscord": "🚀 **Avibe Update Available**\n\nUpdate from `{current}` → {latestLink}",
    "availableMarkdown": "🚀 Avibe Update Available\n\nUpdate from `{current}` → {latestLink}",
    "availableText": "🚀 Avibe Update Available\n\nUpdate from {current} → {latestLink}",
    "actionUpdateNow": "Update Now"
  },
  "discord": {
    "settingsSubtitle": "Adjust message visibility, mention behavior, and language.",
    "routingSubtitle": "Select backend and model settings for this channel.",
    "labels": {
      "messageTypes": "Message types",
      "mentionPolicy": "Mention policy",
      "language": "Language",
      "backend": "Backend",
      "opencodeAgent": "OpenCode agent",
      "claudeAgent": "Claude agent",
      "codexAgent": "Codex agent",
      "model": "Model",
      "reasoningEffort": "Reasoning effort"
    }
  },
  "info": {
    "messageTypesTitle": "Message Types Info:",
    "messageTypesFooter": "Hidden messages won't be sent to your IM platform.",
    "howItWorksTitle": "Tips & Features:",
    "howItWorksRealtimeLabel": "Agent Routing",
    "howItWorksRealtimeDesc": "Prefix your message with `AgentName:` to route to a specific agent, e.g. `Plan: design a caching layer`",
    "howItWorksPersistentLabel": "Interrupt Anytime",
    "howItWorksPersistentDesc": "Send a new message while the agent is running — it will stop and start your new task. Or type `stop` to cancel.",
    "howItWorksCommandsLabel": "Thread = Session",
    "howItWorksCommandsDesc": "Each thread is an isolated session. Open multiple threads to run parallel tasks.",
    "howItWorksResumeLabel": "Resume Anywhere",
    "howItWorksResumeDesc": "Switch from desktop to mobile without losing momentum. Reopen recent Claude Code, OpenCode, or Codex sessions from this working directory and continue instantly.",
    "howItWorksWorkDirLabel": "File Attachments",
    "howItWorksWorkDirDesc": "Attach images or files to your message — the agent can read them directly.",
    "howItWorksTasksLabel": "Scheduled Tasks & Hooks",
    "howItWorksTasksDesc": "Ask the agent to schedule recurring or one-off prompts, or queue a single async follow-up after a long-running job.",
    "howItWorksSettingsLabel": "Flexible Settings",
    "howItWorksSettingsDesc": "Mention @bot to switch agents, models, reasoning effort, or hide verbose message types.",
    "howItWorksFooter": "Just type to chat with {agent}. No special commands needed!",
    "genericTitle": "Info: {topic}",
    "genericFooter": "This feature is coming soon!",
    "resultDeliveredAsAttachment": "⚠️ The message could not be sent inline, so I sent it as `result.md` above.",
    "generatedImagesFallback": "Generated image:"
  },
  "modal": {
    "settings": {
      "title": "Settings",
      "channelBehavior": "Channel Behavior",
      "requireMention": "Require @mention to respond",
      "requireMentionHint": "When enabled, the bot only responds when @mentioned in channels (DMs always work).",
      "messageVisibility": "Message Visibility",
      "messageVisibilityDesc": "Choose which message types to *show* from agent output. Unselected types won't appear in your Slack workspace.",
      "showMessageTypes": "Show these message types:",
      "showMessageTypesPlaceholder": "Select message types to show",
      "tip": "You can show/hide message types at any time. Changes apply immediately to new messages.",
      "current": "Current",
      "selectMentionBehavior": "Select @mention behavior",
      "optionDefault": "(Default) - {status}",
      "optionRequireMention": "Require @mention",
      "optionDontRequireMention": "Don't require @mention",
      "mentionStatusOn": "Require @",
      "mentionStatusOff": "Don't require @",
      "requireMentionLarkNote": "Note: To receive non-mention messages in groups, the Feishu app needs the `im:message.group_msg` permission.",
      "language": "Language / \u8bed\u8a00",
      "languageHint": "Changes the language for bot messages in Slack and the Web UI."
    },
    "cwd": {
      "title": "Change Working Directory",
      "current": "Current working directory:",
      "new": "New Working Directory:",
      "placeholder": "Enter new directory path",
      "hint": "Use absolute path (e.g., /home/user/project) or ~ for home directory",
      "tip": "The directory will be created if it doesn't exist."
    },
    "resume": {
      "title": "Resume Session",
      "description": "Select a recent agent session from the current working directory, or paste a session ID to resume work in this thread.",
      "chooseOneOf": "Choose one of the two options below:",
      "discordPickOrPaste": "Select a recent session below, or use the OR button to paste a Session ID manually.",
      "pickExisting": "Pick a recent session",
      "selectSession": "Select a session",
      "pasteId": "Or paste a session ID",
      "pasteIdPlaceholder": "e.g., ses_12345",
      "sessionIdLabel": "Session ID",
      "manualInputTitle": "Paste Session ID",
      "manualInputButton": "OR: Paste Session ID",
      "manualCaptured": "Session ID captured. Click Resume to continue.",
      "agentBackend": "Agent backend",
      "selectAgentBackend": "Select agent backend",
      "showingFirst100": "Showing the first 100 recent sessions for this working directory. Paste a session ID below for others.",
      "noSessionsFound": "No recent agent sessions found for this working directory. Use the OR button below to paste a session ID and resume manually.",
      "noRecentSessionsOption": "No recent sessions"
    },
    "routing": {
      "title": "Agent Settings",
      "currentBackend": "Current Backend:",
      "backend": "Backend",
      "selectBackend": "Select backend",
      "opencodeSettings": "OpenCode Settings",
      "opencodeAgent": "OpenCode Agent",
      "selectOpencodeAgent": "Select OpenCode agent",
      "model": "Model",
      "selectModel": "Select model",
      "reasoningEffort": "Reasoning Effort (Thinking Mode)",
      "selectReasoningEffort": "Select reasoning effort",
      "claudeSettings": "Claude Settings",
      "claudeAgent": "Claude Agent",
      "selectClaudeAgent": "Select Claude agent",
      "codexSettings": "Codex Settings",
      "codexAgent": "Codex Agent",
      "selectCodexAgent": "Select Codex agent",
      "codexReasoningEffort": "Reasoning Effort",
      "tip": "Select (Default) to use the backend's configured defaults."
    },
    "question": {
      "opencode": "OpenCode",
      "claudeCode": "Claude Code"
    }
  },
  "command": {
    "start": {
      "welcome": "Welcome to Avibe!",
      "greeting": "Hello {name}!",
      "userFallback": "User",
      "platform": "Platform: {platform}",
      "agent": "Agent: {agent}",
      "channel": "Channel: {channel}",
      "commandsTitle": "Available Commands:",
      "commandStart": "/start - Show this welcome message",
      "commandCwd": "/cwd - Show current working directory",
      "commandSetCwd": "/setcwd <path> - Set working directory",
      "commandResume": "/resume - Restore a recent session for this working directory",
      "commandSetup": "/setup [claude|codex|opencode] - Repair backend login/auth",
      "commandStop": "/stop - Interrupt {agent} execution",
      "commandNew": "/new - Start a fresh session",
      "quickActions": "Quick Actions:",
      "quickActionsDesc": "Use the buttons below to manage your {agent} sessions, or simply type any message to start chatting with {agent}!",
      "directMessage": "Direct Message"
    },
    "new": {
      "started": "Started a fresh session. Your next message will begin a new conversation."
    },
    "clear": {
      "noSessions": "No active sessions to clear.\nSession state has been reset.",
      "cleared": "Cleared active sessions for:\n{details}\nAll sessions reset.",
      "sessionItem": "{agent} \u2192 {count} session(s)"
    },
    "cwd": {
      "current": "Current Working Directory:",
      "exists": "Directory exists",
      "notExists": "Directory does not exist",
      "hint": "This is where Agent will execute commands",
      "usage": "Usage: /setcwd <path>",
      "changeInstructions": "To change working directory, use:\n`/setcwd <path>`\n\nExample:\n`/setcwd ~/projects/myapp`",
      "clickButton": "Click the 'Change Work Dir' button in the /start menu to change working directory."
    },
    "resume": {
      "slackOnly": "Resume is currently available only on Slack. Continue in the same thread to auto-resume.",
      "scopeOnly": "⏮️ /resume can only be used at the channel level, not inside an existing thread. Start it from the main channel — it opens a fresh session you can continue.",
      "clickButton": "Please click the Resume Session button in the menu message below to open the picker.",
      "noStoredSessions": "No recent agent sessions found for this working directory.",
      "noStoredSessionsForBackend": "No recent {backend} sessions found for this working directory.",
      "listTitle": "Recent agent sessions for the current working directory",
      "listPage": "Page {page} / {total}",
      "listItemTitle": "{index}. {prefix} {preview}",
      "listItemTime": "   {time}",
      "usageTitle": "Usage:",
      "usageList": "/resume - Show recent sessions",
      "usagePick": "/resume 1 - Restore item 1 from the current list",
      "usageMore": "/resume more - Show the next page",
      "usageLatest": "/resume latest [oc|cc|cx] - Restore the latest session",
      "usageManual": "/resume <oc|cc|cx> <session_id> - Restore a session manually",
      "snapshotExpired": "The last shown session list expired. Please run /resume again first.",
      "invalidSelection": "Choose a valid number from the current list.",
      "unknownBackend": "Unknown backend. Use oc, cc, cx, or a full backend name.",
      "unknownCommand": "Unknown resume command.",
      "noMorePages": "There are no more sessions to show."
    },
    "setup": {
      "starting": "Starting {backend} setup...",
      "unsupportedBackend": "Backend `{backend}` does not support setup yet.",
      "codeUsage": "Usage: `/setup code <value>` or `/setup code <backend> <value>`",
      "claudeMethodUsage": "Usage: `/setup claude <claudeai|console>`",
      "noActiveFlow": "There is no active setup flow for this channel.",
      "notFlowOwner": "Only the user who started this setup flow can submit the follow-up code.",
      "codeNotSupported": "This backend does not accept follow-up setup codes.",
      "notAwaitingCode": "This setup flow is not waiting for a code right now.",
      "codeSubmitted": "{backend} setup code submitted. Waiting for login confirmation...",
      "claudeCallbackSubmitted": "Claude OAuth callback submitted. Waiting for login confirmation...",
      "claudeCallbackUsage": "For Claude, send the full `authorizationCode#state` value from the browser callback page directly in this chat.",
      "claudeMethodPrompt": "Choose the Claude sign-in source before starting OAuth.",
      "claudeMethodFallback": "Choose a Claude sign-in source with `/setup claude claudeai` or `/setup claude console`.",
      "resetPrompt": "{backend} looks logged out. Use the button below to restart OAuth setup.",
      "resetPromptPlain": "{backend} looks logged out. Run `/setup {backend}` to restart OAuth setup.",
      "manualFallback": "If inline buttons are unavailable, run `/setup {backend}`.",
      "codexInstructions": "Codex setup started.\n\n1. Open this URL in your browser:\n{url}\n\n2. Enter this one-time code:\n`{code}`\n\nThe bot will keep waiting here and confirm when login finishes.",
      "claudeInstructions": "Claude setup started.\n\nOpen this URL in your browser and finish the login flow:\n{url}\n\nWhen the browser callback page shows the final `authorizationCode#state` value, send it back directly in this chat.",
      "claudeCodePrompt": "Claude is waiting for a follow-up value. Send it directly in this chat.",
      "opencodeDeviceInstructions": "OpenCode setup started.\n\n1. Open this URL in your browser:\n{url}\n\n2. Enter this one-time code:\n`{code}`\n\nThe bot will keep waiting here and confirm when authorization finishes.",
      "opencodeInstructions": "OpenCode setup started for `{provider}`.\n\nOpen this page to create or retrieve a credential:\n{url}\n\nWhen you get the key, reply with it directly in this chat.",
      "opencodeCodePrompt": "OpenCode is waiting for the `{provider}` API key. Reply with the key directly in this chat.",
      "opencodeCodeRetryPrompt": "OpenCode is still waiting for the `{provider}` API key. The previous value may not have been accepted. Reply with the key directly in this chat.",
      "timedOut": "{backend} setup timed out. Start setup again to retry.",
      "success": "{backend} login is active again.",
      "failed": "{backend} setup failed: {detail}",
      "unknownFailure": "Unknown login failure."
    },
    "stop": {
      "noActiveSession": "No active session to stop for this channel."
    }
  },
  "button": {
    "currentDir": "Current Dir",
    "changeDir": "Change Work Dir",
    "newSession": "New Session",
    "clearSession": "Clear All Session",
    "settings": "Settings",
    "resumeSession": "Resume Session",
    "agentSettings": "Agent Settings",
    "howItWorks": "Features",
    "aboutMessageTypes": "About Message Types",
    "resetOAuth": "Reset OAuth",
    "claudeAi": "Claude.ai",
    "console": "Console"
  },
  "messageType": {
    "system": "System",
    "assistant": "Assistant",
    "toolcall": "Toolcall",
    "result": "Result",
    "systemDesc": "System initialization and status messages",
    "assistantDesc": "Agent responses and explanations",
    "toolcallDesc": "Agent tool name + params (one line)",
    "resultDesc": "Final execution result (always sent)"
  },
  "routing": {
    "slackOnly": "🤖 Agent switching is currently only available in Slack. Use Slack Agent Settings to configure routing.",
    "introTitle": "Agent & Model Settings",
    "introDesc": "Configure which backend to use for this channel.",
    "label": {
      "backend": "Backend",
      "agent": "Agent",
      "model": "Model",
      "reasoningEffort": "Reasoning Effort"
    }
  },
  "message": {
    "ack": "{agent} received, processing...",
    "quickReplyNote": "Reply: {text}"
  },
  "backend": {
    "claude": "ClaudeCode",
    "codex": "Codex",
    "opencode": "OpenCode"
  },
  "reasoning": {
    "none": "None",
    "minimal": "Minimal",
    "low": "Low",
    "medium": "Medium",
    "high": "High",
    "xhigh": "Extra High",
    "max": "Max"
  },
  "bind": {
    "success": "✅ Bind successful! Welcome, {name}. You can now use Avibe via DM.",
    "successAdmin": "✅ Bind successful! Welcome, {name}. You are the first user and have been granted admin privileges.",
    "menuHintButtons": "To open the action menu, mention the bot with no extra text, for example `@bot`.",
    "menuHintStart": "Send `/start` to open more action menus.",
    "alreadyBound": "You are already bound. No action needed.",
    "invalidCode": "❌ Invalid or expired bind code. Please check and try again.",
    "usage": "Usage: `bind <code>`\n\n`/bind <code>` also works. Please enter the bind code provided by an admin.",
    "dmOnly": "The bind command can only be used in a direct message. Please DM the bot with `bind <code>`.",
    "dmNotBound": "🔒 You haven't bound your account yet.\nUse `bind <code>` to get started. (`/bind <code>` is also supported.)",
    "error": "❌ Bind failed: {error}"
  },
  "permission": {
    "adminOnly": "🔒 Only admins can change bot settings. Contact an admin if you need access."
  },
  "language": {
    "systemDefault": "(System Default)",
    "en": "English",
    "zh": "\u4e2d\u6587"
  },
  "telegram": {
    "autoTopicGeneralNotice": "Started a new topic for this request: {topic}. Continue there.",
    "autoTopicIntro": "New session topic created: {topic}",
    "cwdPromptTitle": "Change working directory",
    "cwdPromptBody": "Send the new path as your next message. Use `/cancel` or the button below to abort.",
    "cwdPromptCanceled": "Working directory change canceled.",
    "resumeTitle": "Resume a saved session",
    "resumeBody": "Pick one of the saved sessions below.",
    "resumeNoStoredSessions": "No stored sessions are available for this chat yet.",
    "resumeCanceled": "Resume canceled.",
    "resumeSubmitting": "Resuming the selected session...",
    "routingTitle": "Agent & model settings",
    "routingChoosePrefix": "Choose a value for",
    "routingSaving": "Saving routing settings...",
    "routingCanceled": "Routing update canceled."
  }
}
