{
  "cover": {
    "make": "Add cover",
    "agentGenerate": {
      "beautifyDisabled": "Enable 小花美术 in the main agent's tool settings first.",
      "defaultModelMissing": "Configure a default image model in settings first.",
      "defaultModelInvalid": "The default image model is unavailable. Reconfigure it in settings.",
      "imageGenUnavailable": "The image generation tool is disabled. Enable it in settings first.",
      "agentUnavailable": "The main agent is temporarily unavailable, so Agent generation can't start.",
      "disabled": "Agent generation is currently unavailable.",
      "label": "Agent generate"
    },
    "gallery": {
      "title": "Hana Gallery",
      "upload": "Upload your own",
      "close": "Close Hana Gallery"
    }
  },
  "selection": {
    "quoteToChat": "Quote to chat"
  },
  "quickChat": {
    "title": "Quick Chat",
    "close": "Close Quick Chat",
    "openFullSession": "Open full chat",
    "waitingReply": "Waiting for reply...",
    "attachImage": "Add image",
    "serviceUnavailable": "Could not connect to Hana service",
    "createSessionFailed": "Failed to create chat",
    "sendFailed": "Send failed"
  },
  "channel": {
    "tab": "Channels",
    "chatTab": "Chat",
    "moreTabs": "More tabs",
    "empty": "No channels yet ✿",
    "dmLabel": "Messages",
    "dmHint": "Primary Agent Only",
    "groupLabel": "Channels",
    "noMessages": "No messages yet",
    "selectHint": "Select a channel or DM to start",
    "nameExists": "This channel name already exists",
    "membersCount": " members",
    "info": "Channel info",
    "readOnly": "🔒 This is a private message between agents, view only",
    "inputPlaceholder": "Send a message...",
    "newMessages": "New messages",
    "sendFailed": "Send failed",
    "createTitle": "New Channel",
    "createName": "Channel name",
    "createNamePlaceholder": "e.g. design-team",
    "createMembers": "Agent members",
    "createIntro": "Description",
    "createIntroPlaceholder": "Describe what this channel is for...",
    "createCancel": "Cancel",
    "createConfirm": "Create",
    "nameRequired": "Please enter a channel name",
    "minMembers": "Select at least 2 Agent members",
    "created": "Channel #{name} created ✿",
    "createFailed": "Create failed",
    "alreadyExists": "Channel already exists",
    "deleteChannel": "Delete channel",
    "deleteConfirm": "Delete channel \"{name}\"? Message history cannot be recovered.",
    "deleted": "Channel deleted",
    "deleteFailed": "Delete failed",
    "warningTitle": "About Channels",
    "warningBody": "I believe letting assistants with different memories and thinking styles interact can spark more inspiration, so I built a place where agents can talk to each other, even when you're away.\n\nPlease note that channels are experimental and may cause:\n1. Higher token usage\n2. Unexpected responses\n3. Memory confusion\n\nUse with caution",
    "warningConfirm": "I understand, enable channels",
    "disabled": "Channels disabled",
    "toggleLabel": "Channel toggle",
    "members": "Members",
    "addMember": "Add member",
    "removeMember": "Remove member",
    "removeMemberConfirm": "Remove \"{name}\" from this channel?",
    "addMemberFailed": "Failed to add member",
    "removeMemberFailed": "Failed to remove member",
    "noAvailableMembers": "No agents available",
    "agentActivity": "Agent activity",
    "agentSettings": "Chat settings",
    "toolPermission": "Tool permission",
    "agentIdle": "Idle",
    "phoneReceivedNewMessages": "Received new channel messages",
    "deliveryActive": "Delivering to {agent} ({done}/{total})",
    "deliveryQueued": "Delivery queued",
    "nextReminder": "Next initiation: {time}",
    "replyRange": "Reply length",
    "replyMinPlaceholder": "Min",
    "replyMaxPlaceholder": "Max",
    "replyRangeInvalid": "Minimum length cannot exceed maximum length",
    "settingsSaveFailed": "Failed to save settings",
    "proactiveInitiation": "Assistant initiates",
    "proactiveOff": "Off",
    "proactiveOn": "On",
    "proactiveInterval": "Initiation interval (min)",
    "reminderInterval": "Initiation interval (min)",
    "guardLimit": "Turn guard limit",
    "modelOverride": "Model override",
    "modelDefault": "Default",
    "modelOverrideOn": "Override",
    "selectModel": "Select model",
    "noModelsAvailable": "No models available",
    "toolReadOnly": "Read",
    "toolWrite": "Write",
    "filesUnsupported": "Channels currently support text only; files will not be attached to chat",
    "createIntroOptional": "Description"
  },
  "sidebar": {
    "title": "Chats",
    "newChat": "New Chat",
    "collapse": "Collapse sidebar",
    "expand": "Expand chat list",
    "empty": "No chats yet ✿",
    "activity": "Activity",
    "jian": "Desk",
    "bridge": "Social Platforms",
    "toggle": "Sidebar",
    "bridgeShort": "Bridge",
    "pinned": "Pinned",
    "searchPlaceholder": "Search chats",
    "searchClear": "Clear search",
    "searchTitleMatches": "Titles",
    "searchContentMatches": "Content",
    "searchingTitles": "Searching titles…",
    "searchingContent": "Searching content…",
    "searchNoResults": "No matching chats",
    "searchFailed": "Search failed",
    "view": {
      "time": "Sort by time",
      "project": "Sort by project",
      "sort": "Sort view"
    },
    "projects": {
      "title": "Projects",
      "more": "Project view",
      "create": "New project",
      "newProject": "New project",
      "newFolder": "New folder",
      "renameProject": "Rename project",
      "renameFolder": "Rename folder",
      "deleteProject": "Delete project",
      "deleteFolder": "Delete folder",
      "deleteProjectConfirm": "Delete project \"{name}\"? Its chats will move to Uncategorized.",
      "deleteFolderConfirm": "Delete folder \"{name}\"? Its projects will move to the project root.",
      "newChatInProject": "Start a new chat in {name}",
      "newProjectPrompt": "Project name",
      "newFolderPrompt": "Folder name",
      "createAction": "Create",
      "save": "Save",
      "cancel": "Cancel",
      "showMore": "Show more",
      "loading": "Loading projects…",
      "empty": "No projects yet"
    }
  },
  "titlebar": {
    "currentChatTitle": "Current chat title"
  },
  "session": {
    "untitled": "New Chat",
    "messageCount": "{n} messages",
    "switchFailed": "Failed to switch session",
    "createFailed": "Failed to create session",
    "archiveFailed": "Failed to archive session",
    "rename": "Rename",
    "pin": "Pin",
    "unpin": "Unpin",
    "pinFailed": "Failed to pin session",
    "unpinFailed": "Failed to unpin session",
    "archive": "Archive",
    "deletedAgent": {
      "title": "Agent deleted",
      "description": "This chat is kept as read-only history. Continuing will create a new session on your primary Agent after compacting the old context.",
      "continueButton": "Migrate to primary Agent",
      "continuing": "Compacting and creating session",
      "continueFailed": "Migration failed",
      "meta": "Read-only"
    },
    "summary": {
      "title": "Session Summary",
      "open": "Session Summary",
      "loading": "Loading summary…",
      "empty": "No summary yet",
      "loadFailed": "Failed to load summary"
    },
    "archived": {
      "entry": "Archived Chats",
      "title": "Archived Chats",
      "empty": "No archived chats yet",
      "stats": "{count} items · {size}",
      "cleanup30": "Clean up >30 days",
      "cleanup90": "Clean up >90 days",
      "cleanupConfirm": "Permanently delete {count} archives ({size} total)? This cannot be undone.",
      "cleanupDone": "Cleaned up {count} archives",
      "cleanupNoMatch": "No archives match the criteria",
      "restore": "Restore",
      "restoreConfirm": "Restore this conversation to its original location?",
      "restoreConflict": "Original location is occupied; cannot restore",
      "restoreFailed": "Restore failed",
      "deleteForever": "Delete forever",
      "deleteConfirm": "Permanently delete this archive? This cannot be undone.",
      "deleteFailed": "Delete failed",
      "daysAgo": "Archived {days} days ago"
    },
    "subagentRunStateUnrecoverable": "Historical sub-session run state is unrecoverable",
    "subagentLinkUnrecoverable": "Historical sub-session link is unrecoverable",
    "capabilityDrift": {
      "title": "Tool capabilities have changed",
      "addedTools": "{count} new tools",
      "removedTools": "{count} tools no longer available",
      "promptUpdated": "prompt updated",
      "separator": ", ",
      "refreshButton": "Refresh agent tools",
      "dismissButton": "Dismiss",
      "confirmText": "Refreshing compacts the old conversation into a summary; details may be lost. Continue?",
      "confirmButton": "Refresh now",
      "cancelButton": "Cancel",
      "refreshing": "Compacting conversation and refreshing tools…",
      "refreshFailed": "Refresh failed"
    }
  },
  "common": {
    "on": "On",
    "off": "Off",
    "copy": "Copy",
    "copied": "Copied",
    "copyText": "Copy text",
    "regenerate": "Regenerate",
    "confirm": "Confirm",
    "cancel": "Cancel",
    "approve": "Approve",
    "reject": "Reject",
    "approved": "Approved",
    "rejected": "Rejected",
    "changeRejected": "{label} change cancelled",
    "changeTimeout": "{label} confirmation timed out",
    "noChats": "No chats",
    "noFiles": "No files",
    "executing": "Executing...",
    "user": "User",
    "me": "Me",
    "more": "More",
    "remove": "Remove",
    "empty": "Empty",
    "edit": "Edit",
    "screenshot": "Screenshot",
    "selectMessage": "Select message",
    "selectAllMessages": "Select all messages",
    "screenshotInProgress": "Taking screenshot",
    "screenshotProgressPage": "Taking screenshot, page {current}/{total}",
    "screenshotSaved": "Screenshot saved under \"OH-Works\" in your working directory",
    "screenshotSavedMultiple": "Saved {count} screenshot segments under \"OH-Works\" in your working directory",
    "screenshotFailed": "Screenshot save failed",
    "selectedCount": "{count} selected",
    "allDone": "All done",
    "markAllComplete": "Mark all as complete"
  },
  "chat": {
    "send": "Send",
    "steer": "Steer",
    "stop": "Stop",
    "browserScreenshot": "Browser screenshot",
    "compacting": "Compacting context",
    "visionAuxiliary": "Vision auxiliary",
    "fileExpired": "File expired",
    "fileActions": {
      "more": "More file actions",
      "revealInFinder": "Reveal in file manager",
      "copyPath": "Copy file path",
      "downloadToDevice": "Download to this device"
    },
    "media": {
      "kindVideo": "Video",
      "kindImage": "Image",
      "generationFailed": "{kind} generation failed",
      "generationInProgress": "{kind} generating",
      "retryFailed": "Regeneration failed",
      "submitting": "Submitting",
      "retryLabel": "Regenerate {kind}"
    },
    "subagentPreview": {
      "historyUnrecoverable": "Historical sub-session link is unrecoverable",
      "noSession": "No openable sub-agent session",
      "connecting": "Connecting to sub-agent session...",
      "loadingSession": "Loading session...",
      "waitingContent": "Waiting for session content...",
      "noContent": "No session content"
    },
    "timeline": {
      "navAriaLabel": "Turn navigation",
      "jumpTo": "Jump to {label}",
      "fallbackUser": "User message",
      "fallbackAssistant": "Assistant message"
    },
    "modelSwitching": "Switching model, please wait",
    "unknownCommand": "[Unknown command] {text}"
  },
  "time": {
    "justNow": "Just now",
    "minutesAgo": "{n}m ago",
    "hoursAgo": "{n}h ago",
    "daysAgo": "{n}d ago",
    "dateFormat": "{m}/{d}",
    "today": "Today",
    "yesterday": "Yesterday",
    "thisWeek": "This Week",
    "earlier": "Earlier"
  },
  "status": {
    "connecting": "Connecting...",
    "connected": "Connected",
    "disconnected": "Disconnected",
    "serverNotReady": "Server not ready",
    "loading": "Loading...",
    "reconnecting": "Reconnecting",
    "reconnect": "Reconnect"
  },
  "input": {
    "placeholder": "Say something...",
    "floatingInput": "Selection floating input",
    "selectFolder": "Select folder",
    "workspace": "Workspace: ",
    "project": "Project: ",
    "selectWorkspace": "Select workspace",
    "currentWorkspace": "This workspace",
    "cwdProject": "Workspace project: {name}",
    "customProjects": "Custom projects",
    "selectProject": "Select project",
    "noCustomProjects": "No custom projects",
    "selectOtherFolder": "Choose another folder",
    "extraFolders": "Extra folders",
    "addExternalFolder": "Add folder outside workspace",
    "planMode": "Access mode",
    "accessMode": "Session access mode",
    "autoMode": "Auto approval",
    "operateMode": "Full access",
    "askMode": "Ask before acting",
    "readOnlyMode": "Read-only mode",
    "accessModeLocked": "Access mode cannot be changed right now",
    "deskContext": "With desk context",
    "pastedImage": "Pasted image",
    "textModelImageFileOnly": "The current model cannot view images and auxiliary vision is not enabled: images are sent as files, so the model only sees the file path, not the image content.",
    "textModelVideoBlocked": "The current model does not support video input. Enable video capability in settings, or switch to a video-capable model.",
    "textModelAudioBlocked": "The current model does not support audio input. Switch to an audio-capable model.",
    "imageReadFailedSentAsFile": "Failed to read the image bytes; this image was sent as a file path instead, so the model will not see its content.",
    "videoReadFailed": "Could not read the video, so the message was not sent. Attach it again.",
    "audioReadFailed": "Could not read the audio, so the message was not sent. Attach it again.",
    "recordAudio": "Record audio",
    "stopRecording": "Stop recording",
    "audioRecording": "Recording",
    "audioRecordingStarting": "Starting",
    "audioRecordingSaving": "Saving",
    "audioRecordingUnavailable": "Microphone recording is unavailable in this environment.",
    "audioRecordingFailed": "Recording failed. Check microphone permission and try again.",
    "recordedAudioName": "Recording {index}.wav",
    "openModelSettings": "Open model settings",
    "attachFiles": "Add files",
    "commandMenu": "Command menu",
    "docContext": "With document",
    "thinkingLevel": {
      "off": "off",
      "auto": "auto",
      "medium": "medium",
      "high": "high",
      "xhigh": "max"
    },
    "thinkingDesc": {
      "off": "no reasoning",
      "auto": "model decides depth",
      "medium": "balanced reasoning",
      "high": "deep reasoning",
      "xhigh": "full reasoning"
    },
    "contextWindow": "Context {windowK}k",
    "tokensUsed": "Used {tokensK}k ({pct}%)",
    "contextActions": "Context actions",
    "refreshAndCompact": "Update and compact",
    "refreshAndCompactTooltip": "Update to the latest memory and tool set",
    "compact": "Compact"
  },
  "slash": {
    "diary": "Write today's diary",
    "diaryBusy": "Writing diary...",
    "diaryDone": "Diary saved under OH-Works",
    "diaryFailed": "Failed to write diary",
    "xing": "Create skill from conversation",
    "compact": "Compact context",
    "compactBusy": "Compacting...",
    "stop": "Stop current reply",
    "new": "Start new session (archive history)",
    "reset": "Reset session (clear history)",
    "commandError": "[Command error] {message}",
    "usage": "Usage: {usage}",
    "commandTimeout": "Command timed out (>{ms}ms)"
  },
  "welcome": {
    "messages": [
      "What do you need? Leave it to {name}",
      "What's on your mind today?",
      "{name} is always here",
      "Need a hand with anything?",
      "Just say whatever comes to mind."
    ],
    "memoryOn": "Memory",
    "memoryOff": "Memory not used for this chat",
    "memoryDisabled": "Memory is off",
    "agentSelector": "Choose agent",
    "placeholderTips": [
      "Type / to bring up the command menu",
      "Use @ to reference files in your workspace",
      "Drop a file into the input to send it along",
      "Paste an image to send it directly",
      "Select any text on the page — a floating input will appear",
      "The diamond button below the avatar toggles memory for this chat",
      "The workspace button lets you switch or add folders",
      "The right panel holds notes and context for this chat",
      "Tap the small dots under the avatar to switch assistants",
      "Ask-before-acting mode makes the assistant confirm before doing things",
      "Try /rc to control your computer from your phone",
      "Enable Vision Assist in settings — text models can understand images too",
      "Looking for something new? Check out the plugin marketplace",
      "File backup helps if you're worried about losing data",
      "Use subagents for Agent collaboration at work; channels are for play",
      "Each Agent can be configured with its own Skills",
      "Try sunbathing in Sunny mode!",
      "Markdown files in the workspace can be edited directly when opened",
      "After spending some time with your assistant, try the diary feature!",
      "Diaries and screenshots are saved in the main assistant's workspace",
      "Each assistant can have its own workspace; with Patrol on, they'll act on their own there"
    ]
  },
  "drop": {
    "hint": "Drop to send files to {name}"
  },
  "attach": {
    "folder": "Folder",
    "copy": "Copy",
    "copied": "Copied ✓"
  },
  "codeBlock": {
    "wordWrap": "Word Wrap"
  },
  "cron": {
    "typeAt": "Once",
    "typeEvery": "Interval",
    "typeCron": "Scheduled",
    "confirm": {
      "approve": "Confirm",
      "reject": "Cancel",
      "created": "✓ Created",
      "rejected": "Cancelled"
    },
    "everyHours": "Every {n} hours",
    "everyMinutes": "Every {n} minutes",
    "hourly": "Hourly",
    "dailyAt": "Daily at {hour}:{min}",
    "weeklyAt": "{days} {hour}:{min}",
    "monthlyAt": "Monthly on day {day} at {hour}:{min}",
    "dayNames": [
      "Sun",
      "Mon",
      "Tue",
      "Wed",
      "Thu",
      "Fri",
      "Sat"
    ],
    "weekPrefix": ""
  },
  "mood": {
    "label": "✿ MOOD"
  },
  "xing": {
    "title": "Reflection",
    "thinking": "{name} is thinking"
  },
  "yuan": {
    "types": {
      "hanako": {
        "label": "Balanced assistant",
        "avatar": "Hanako.png"
      },
      "butter": {
        "label": "More expressive",
        "avatar": "Butter.png"
      },
      "ming": {
        "label": "More dependable",
        "avatar": "Ming.png"
      },
      "kong": {
        "label": "Vanilla",
        "avatar": "Kong.png"
      }
    },
    "title": "Yuan",
    "splash": {
      "butter": [
        "{name} flipped to a page left unfinished yesterday",
        "Some words haven't been said yet, {name} remembers",
        "{name} is napping",
        "They're piecing together memories too precious to forget",
        "{name} carefully tucked away your last mood",
        "A sentence has been sitting on the tip of the tongue for a while",
        "When they woke up, they first wondered what you were doing",
        "There are unfinished stories hidden in those ellipses",
        "{name} is folding what they want to say into tiny tiny notes",
        "Today's clouds look just like the photo you took that day"
      ],
      "ming": [
        "{name} drew a reference line in the margin of the draft paper",
        "Old questions are settling, new ideas are emerging",
        "They reviewed yesterday's clues once more",
        "{name} thinks the derivation of that formula was beautiful",
        "Some answers take time",
        "{name} is thinking about how to optimize work",
        "{name} is trying to keep everything in order",
        "They verified last time's conclusion again",
        "{name} thinks your reasoning that day was sharp",
        "{name} organized their thoughts while waiting for the coffee to cool"
      ]
    },
    "welcome": {
      "butter": [
        "Hey there~",
        "You came to find me?",
        "How's your day going?",
        "{name} has been here waiting for you",
        "{name} was just thinking of saying something to you"
      ],
      "ming": [
        "Hello. Whenever you're ready.",
        "{name} is ready",
        "What needs handling?",
        "Go ahead, {name} is listening"
      ]
    },
    "placeholder": {
      "butter": "Say whatever's on your mind...",
      "ming": "Go ahead..."
    }
  },
  "thinking": {
    "phrases": [
      "Thinking",
      "Mumbling to themselves",
      "Choosing their words",
      "Gears turning",
      "Gathering thoughts",
      "Brewing inspiration",
      "Digging through memories",
      "Something came to mind",
      "Bubbling with ideas",
      "Digesting what you said",
      "Drafting in their head",
      "Weaving their thoughts"
    ],
    "butter": [
      "Gently sorting through what you said",
      "Slowly unfolding your feelings",
      "Looking for the softest way to say it",
      "Words are lining up inside",
      "Folding their thoughts neatly",
      "Quietly reflecting",
      "Searching through memories for something",
      "Crafting a hug-sized reply",
      "Some feelings need time to untangle",
      "Making a soft space for your words"
    ],
    "ming": [
      "Analyzing",
      "Running scenarios",
      "Fact-checking",
      "Organizing thoughts",
      "Tracing the logic",
      "Outlining in their head",
      "Retrieving relevant info",
      "Verifying",
      "Breaking down the problem",
      "Synthesizing"
    ],
    "done": "Thinking complete",
    "active": "Thinking"
  },
  "toolGroup": {
    "success": "✿ {name} all done, piece of cake ~ · {n} steps",
    "failed": "⚠ Something seems off · {n} steps",
    "countWithFail": "{total} tools ({fail} failed)",
    "count": "{n} tools",
    "running": "{n} tools running"
  },
  "processFold": {
    "summary": "✨ {name} worked for a while",
    "tools": "{n} tools",
    "thinking": "{n} thoughts",
    "unsuccessful": "{n} attempts not successful"
  },
  "tool": {
    "web_search": {
      "running": "🌐 {name} is surfing the web",
      "done": "🌐 {name} is back from surfing",
      "failed": "🌐 {name} couldn't catch a wave"
    },
    "web_fetch": {
      "running": "📄 {name} is peeking at a webpage",
      "done": "📄 {name} got it all",
      "failed": "📄 {name} couldn't reach the page"
    },
    "search_memory": {
      "running": "💭 {name} is trying to remember",
      "done": "💭 {name} remembered!",
      "failed": "💭 {name} can't seem to remember"
    },
    "bash": {
      "running": "💻 {name} is tiptoeing through your computer",
      "done": "💻 {name} is done with the computer",
      "failed": "💻 {name}'s computer didn't cooperate"
    },
    "read": {
      "running": "📖 {name} is flipping through a file",
      "done": "📖 {name} done flipping",
      "failed": "📖 {name} found nothing there"
    },
    "write": {
      "running": "✏️ {name} is putting pen to paper",
      "done": "✏️ {name} ink's down",
      "failed": "✏️ {name} ran out of ink"
    },
    "edit": {
      "running": "✏️ {name} is making edits",
      "done": "✏️ {name} all fixed up",
      "failed": "✏️ {name} made a bit of a mess"
    },
    "edit-diff": {
      "running": "✏️ {name} is making edits",
      "done": "✏️ {name} all fixed up",
      "failed": "✏️ {name} made a bit of a mess"
    },
    "glob": {
      "running": "🔍 {name} is looking for files",
      "done": "🔍 {name} found them",
      "failed": "🔍 {name} searched high and low, nothing"
    },
    "grep": {
      "running": "🔍 {name} is rummaging through files",
      "done": "🔍 {name} found something",
      "failed": "🔍 {name} rummaged through everything, nope"
    },
    "find": {
      "running": "🔍 {name} is looking for files",
      "done": "🔍 {name} found them",
      "failed": "🔍 {name} searched high and low, nothing"
    },
    "ls": {
      "running": "📂 {name} is peeking inside a folder",
      "done": "📂 {name} all seen",
      "failed": "📂 {name} couldn't open this folder"
    },
    "truncate": {
      "running": "✂️ {name} is tidying up a file",
      "done": "✂️ {name} all tidied up",
      "failed": "✂️ {name} couldn't tidy up"
    },
    "stage_files": {
      "running": "📎 {name} is preparing the file",
      "done": "📎 Here it is!",
      "failed": "📎 Couldn't hand it over"
    },
    "browser": {
      "running": "🌐 {name} is browsing the web",
      "done": "🌐 {name} done with the browser",
      "failed": "🌐 {name}'s browser wouldn't cooperate"
    },
    "subagent": {
      "running": "🧭 {name} is investigating",
      "done": "🧭 Clone dispatched",
      "failed": "🧭 Clone ran into trouble"
    },
    "check_pending_tasks": {
      "running": "📋 {name} is checking unfinished business",
      "done": "📋 {name} all caught up",
      "failed": "📋 Couldn't check"
    },
    "cron": {
      "running": "⏰ {name} is setting a scheduled task",
      "done": "⏰ All set",
      "failed": "⏰ Couldn't set it up"
    },
    "notify": {
      "running": "🔔 {name} is sending a notification",
      "done": "🔔 Notification sent",
      "failed": "🔔 Notification didn't go through"
    },
    "create_artifact": {
      "running": "🖼️ {name} is doodling away",
      "done": "🖼️ Masterpiece ready",
      "failed": "🖼️ Canvas fell apart"
    },
    "dm": {
      "running": "✉️ {name} picked up the phone",
      "done": "✉️ Message sent",
      "failed": "✉️ Message didn't go through"
    },
    "channel": {
      "running": "📢 {name} is posting in a channel",
      "done": "📢 Posted",
      "failed": "📢 Couldn't post",
      "heading": "# Channels",
      "ambiguousName": "Channel name \"{name}\" is not unique. Please use a channel ID instead: {choices}"
    },
    "install_skill": {
      "running": "📥 {name} is installing a skill",
      "done": "📥 Installed",
      "failed": "📥 Installation failed"
    },
    "update_settings": {
      "running": "⚙️ {name} is updating settings",
      "done": "⚙️ Settings updated",
      "failed": "⚙️ Couldn't update"
    },
    "automation": {
      "running": "🤖 {name} is dispatching a shortcut",
      "done": "🤖 Shortcut completed",
      "failed": "🤖 Shortcut execution failed"
    },
    "computer": {
      "running": "🖥️ {name} is controlling your screen",
      "done": "🖥️ Screen control done",
      "failed": "🖥️ Screen control failed"
    },
    "terminal": {
      "running": "💻 {name} is running a command",
      "done": "💻 Command done",
      "failed": "💻 Command execution failed"
    },
    "current_status": {
      "running": "🕐 {name} is checking what's going on",
      "done": "🕐 Got it",
      "failed": "🕐 Couldn't get the info"
    },
    "pin_memory": {
      "running": "📌 {name} is pinning this down",
      "done": "📌 Pinned",
      "failed": "📌 Pinning failed"
    },
    "unpin_memory": {
      "running": "📌 {name} is unpinning this",
      "done": "📌 Unpinned",
      "failed": "📌 Unpinning failed"
    },
    "recall_experience": {
      "running": "🧠 {name} is flipping through the experience notes",
      "done": "🧠 Found something",
      "failed": "🧠 Nothing relevant in the notes"
    },
    "record_experience": {
      "running": "🧠 {name} is jotting this down",
      "done": "🧠 Noted",
      "failed": "🧠 Couldn't save the note"
    },
    "session_folders": {
      "running": "📁 {name} is adjusting folder permissions",
      "done": "📁 Adjusted",
      "failed": "📁 Adjustment failed"
    },
    "stop_task": {
      "running": "🛑 {name} is stopping a background task",
      "done": "🛑 Stopped",
      "failed": "🛑 Couldn't stop"
    },
    "todo_write": {
      "running": "📝 {name} is writing a checklist",
      "done": "📝 Checklist ready",
      "failed": "📝 Checklist write failed"
    },
    "generate-image": {
      "running": "🎨 {name} is creating an image",
      "done": "🎨 Image ready",
      "failed": "🎨 Image generation failed"
    },
    "generate-video": {
      "running": "🎬 {name} is generating a video",
      "done": "🎬 Video ready",
      "failed": "🎬 Video generation failed"
    },
    "create-cover": {
      "running": "🎨 {name} is designing a cover",
      "done": "🎨 Cover ready",
      "failed": "🎨 Cover generation failed"
    },
    "apply-cover-candidate": {
      "running": "🖼️ {name} is applying the cover",
      "done": "🖼️ Cover applied",
      "failed": "🖼️ Couldn't apply the cover"
    },
    "get-cover-style-guide": {
      "running": "📖 {name} is looking up the style guide",
      "done": "📖 Found it",
      "failed": "📖 Couldn't find the style guide"
    },
    "list-capabilities": {
      "running": "📋 {name} is listing capabilities",
      "done": "📋 All listed",
      "failed": "📋 Listing failed"
    },
    "_fallback": {
      "running": "🔧 {name} is busy working…",
      "done": "🔧 {name} all done",
      "failed": "🔧 {name} that didn't go as planned"
    },
    "checkDeferred": {
      "storeNotInitialized": "Deferred task store not initialized.",
      "noActiveSession": "No active session.",
      "noTasks": "No background tasks in current conversation{qualifier}.",
      "noTasksQualifier": " (status: {status})"
    },
    "workflow": {
      "running": "🔄 {name} is orchestrating a workflow",
      "done": "🔄 Workflow complete",
      "failed": "🔄 Workflow execution failed",
      "scriptInvalid": "Workflow script invalid: {message}",
      "dispatched": "Workflow \"{summary}\" has been dispatched for background execution (task {taskId}). Results will automatically return to the conversation when complete.",
      "syncComplete": "Workflow \"{name}\" complete, dispatched {count} agents.\n\nResult:\n{result}",
      "executionFailed": "Workflow execution failed: {message}",
      "resumeFromRunIdDesc": "runId (taskId) of a previous workflow, used for checkpoint resume: completed agent nodes whose prompt+opts are unchanged return cached results instantly, re-execution starts from the first changed position.",
      "journalResuming": "Resuming from {count} cached entries"
    },
    "installSkill": {
      "safetyBlocked": "[Security Policy] Skill safety review failed. Installation blocked.\nReason: {reason}\n\nPlease inform the user that this skill did not pass the safety review and explain the specific reason. The user can disable safety review in settings (not recommended)."
    }
  },
  "file_output": {
    "open": "Open",
    "copied": "Path copied"
  },
  "model": {
    "unknown": "Unknown model",
    "notSelected": "Select a model",
    "noneConfigured": "No models configured",
    "unavailable": "Model unavailable",
    "offline": "Offline",
    "switchFailed": "Failed to switch model",
    "switchWhileStreaming": "Cannot switch models while replying",
    "adaptation": {
      "compacted": "Conversation history compacted for new model",
      "truncated": "Earlier conversation truncated for new model"
    }
  },
  "splash": {
    "lines": [
      "{name} remembers the evening light",
      "Some words sprouted in their memory",
      "They found your silhouette in memories",
      "Wind drifted through old conversations",
      "Those words soaked in time, turning soft",
      "{name} remembers you laughing that day",
      "A memory was dog-eared by you",
      "They gathered the scattered feelings",
      "{name} smelled oranges from an afternoon",
      "Those conversations still carry warmth"
    ],
    "installing": "{name} is updating to v{version}, please wait…"
  },
  "settings": {
    "title": "Settings",
    "back": "Back",
    "save": "Save",
    "saved": "Saved ✿",
    "saveFailed": "Failed to save",
    "fileChangedOnDisk": "The file changed on disk, so the stale save was skipped",
    "noChanges": "Nothing to save",
    "autoSaved": "Auto-saved ✿",
    "tabs": {
      "interface": "Interface",
      "general": "General",
      "browser": "Browser",
      "agent": "Agent",
      "me": "Me",
      "providers": "Providers",
      "media": "Media",
      "models": "Models",
      "memory": "Memory",
      "work": "Workspace",
      "skills": "Skills",
      "mcp": "Connectors",
      "bridge": "Social Platforms",
      "sharing": "Sharing",
      "access": "Access & Devices",
      "plugins": "Plugins",
      "experiments": "Experiments",
      "about": "About",
      "security": "Security",
      "pluginMarketplace": "Plugin Marketplace"
    },
    "browser": {
      "cookiesTitle": "Cookies",
      "acceptCookies": "Accept Cookies",
      "acceptCookiesHint": "When enabled, the in-app browser saves and sends website Cookies like a normal browser.",
      "clearCookies": "Clear Cookies",
      "clearCookiesHint": "Clear Cookies and site data saved by the in-app browser.",
      "clearCookiesButton": "Clear",
      "clearCookiesSuccess": "Cookies cleared",
      "agentTitle": "Agent Default Behavior",
      "agentOpenBehavior": "When opening webpages",
      "agentOpenBehaviorHint": "Choose whether the agent reuses the current tab or opens a new tab by default.",
      "agentOpenBehaviorCurrentTab": "Use current tab",
      "agentOpenBehaviorNewTab": "Open new tab"
    },
    "experiments": {
      "title": "Experiments",
      "compactionTitle": "Context Compaction",
      "compactionSectionDescription": "Choose whether compact prioritizes prompt-cache preservation or broad history compatibility.",
      "modelPersonaTitle": "Models & Persona",
      "modelPersonaDescription": "Observe how providers adapt to Hana's persona, mood, and output contracts.",
      "memoryTitle": "Cache Memory",
      "description": "Forward-looking features land here first. Once stable, they move to the settings page where they belong.",
      "empty": "No visible experiments",
      "owner": {
        "memory": "Memory",
        "session": "Session",
        "provider": "Provider"
      },
      "status": {
        "alpha": "Alpha",
        "beta": "Beta",
        "deprecated": "Deprecated",
        "retired": "Retired"
      },
      "risk": {
        "low": "Low risk",
        "medium": "Medium risk",
        "high": "High risk"
      },
      "restart": {
        "immediate": "Applies immediately",
        "new_session": "New sessions only",
        "restart_server": "Restart server",
        "restart_app": "Restart app"
      },
      "cacheSnapshot": {
        "title": "Cache Memory System",
        "description": "Build memory with cached context to improve cache hit rate and reduce spend.",
        "off": "Off",
        "shadow": "Observe",
        "write": "Write",
        "observeOnly": "Observe only, do not write memory",
        "observationNote": "Observation mode has no effect on formal memory. It only shows whether the new memory system behaves as expected.",
        "writeWarning": "This mode writes to formal memory.",
        "previewTitle": "Memory MD Preview",
        "summaryTitle": "Rolling Summary Preview",
        "emptyPreview": "No observation yet",
        "clearObservation": "Clear observation"
      },
      "compaction": {
        "title": "Compaction mode",
        "description": "Auto prefers cache-preserving compaction. Normal compaction lets Pi SDK run its native summarizer, which is better for unstable history formats.",
        "auto": "Auto",
        "cachePreserving": "Cache-preserving compaction",
        "piCompatible": "Normal compaction"
      },
      "deepseekRoleplay": {
        "title": "DeepSeek persona immersion patch",
        "description": "When enabled, new DeepSeek V4 thinking sessions temporarily append a persona-immersion marker to the first outbound user message. It is not displayed, saved, or restored in chat history. Turning it off keeps the old behavior."
      },
      "proactiveSubagent": {
        "title": "Proactive subagent delegation",
        "description": "When enabled, the agent proactively delegates broad exploration and research tasks to subagents, conserving the main chat's context attention. May yield better results for complex tasks."
      },
      "subagentTitle": "Subagent",
      "subagentSectionDescription": "Control how the agent decides when to delegate work to subagents."
    },
    "appearance": {
      "title": "Appearance",
      "theme": "Theme",
      "warmPaper": "Warm Paper",
      "warmPaperMode": "Light",
      "midnight": "Aoi Night",
      "midnightMode": "Dark",
      "highContrast": "Clean White",
      "highContrastMode": "High Contrast",
      "grassAroma": "Grass Aroma",
      "grassAromaMode": "Butter",
      "contemplation": "Contemplation",
      "contemplationMode": "Ming",
      "absolutely": "Absolutely",
      "absolutelyMode": "A bit familiar",
      "delve": "Delve",
      "delveMode": "Let's explore",
      "deepThink": "Deep Think",
      "deepThinkMode": "Little Whale",
      "newWarmPaper": "New Warm Paper",
      "newWarmPaperMode": "Paper",
      "midnightContrast": "Aoi Night Contrast",
      "midnightContrastMode": "Clear",
      "auto": "Auto",
      "autoMode": "System",
      "font": "Font",
      "fontHint": "Choose the font used for body reading.",
      "serifFont": "Serif Font",
      "serifFontHint": "Use serif font for body text",
      "paperTexture": "Paper Texture",
      "paperTextureHint": "Add a rice paper texture to the background",
      "paperTextureDarkDisabledHint": "Paper texture is unavailable in night themes and will return with your saved setting in light themes",
      "leavesOverlay": "Sunny Mode",
      "leavesOverlayHint": "Go touch some grass (and sunlight)"
    },
    "fonts": {
      "followReading": "Follow Reading Font",
      "serifName": "Serif",
      "serifDesc": "For body reading",
      "sansName": "Sans",
      "sansDesc": "Closer to system UI"
    },
    "interface": {
      "system": "System",
      "hardwareAcceleration": "Hardware Acceleration",
      "hardwareAccelerationHint": "Use the GPU to render app windows. Turning this off takes effect on next launch and uses software rendering for Windows GPU-driver startup recovery.",
      "shortcuts": "Shortcuts",
      "voiceRecordingShortcut": "Voice recording/send",
      "voiceRecordingShortcutHint": "When the main chat page is focused, press once to start recording, then press again to finish and send."
    },
    "editor": {
      "title": "Editor",
      "markdownFont": "Font",
      "markdownFontHint": "Follow the appearance reading font by default, or choose one just for the editor.",
      "markdownBodyFontSize": "Body Size",
      "markdownBodyFontSizeHint": "Markdown body text defaults to 15px.",
      "markdownHeading1FontSize": "Heading 1 Size",
      "markdownHeading1FontSizeHint": "Used for # headings.",
      "markdownHeading2FontSize": "Heading 2 Size",
      "markdownHeading2FontSizeHint": "Used for ## headings.",
      "markdownHeading3FontSize": "Heading 3 Size",
      "markdownHeading3FontSizeHint": "Used for ### headings.",
      "markdownHeading4FontSize": "Heading 4 Size",
      "markdownHeading4FontSizeHint": "Used for #### headings.",
      "markdownHeading5FontSize": "Heading 5 Size",
      "markdownHeading5FontSizeHint": "Used for ##### headings.",
      "markdownHeading6FontSize": "Heading 6 Size",
      "markdownHeading6FontSizeHint": "Used for ###### headings.",
      "markdownLineHeight": "Line Height",
      "markdownLineHeightHint": "Controls vertical rhythm inside the editor.",
      "markdownContentPadding": "Content Padding",
      "markdownContentPaddingHint": "Controls left and right padding for editor content."
    },
    "locale": {
      "title": "Language & Region",
      "language": "Language",
      "languageHint": "Page will reload after switching",
      "timezone": "Timezone",
      "timezoneHint": "Used for memory timestamps, journal entries, etc.",
      "zhCN": "简体中文",
      "zhTW": "繁體中文",
      "ja": "日本語",
      "ko": "한국어",
      "en": "English"
    },
    "computerUse": {
      "title": "Computer Use",
      "experimentalWarning": "Computer use is experimental and requires strong model performance. Enable it only after understanding the risks. Some apps are already known not to behave as expected; treat it as an early preview.",
      "description": "A global high-permission tool. When enabled, only the main agent can use computer control in Operate sessions, and only one session can hold it at a time.",
      "enabled": "Enable Computer Use",
      "enabledHint": "Off by default. When off, new sessions do not expose the computer control tool.",
      "provider": "Provider",
      "availability": "Availability",
      "available": "Available",
      "unavailable": "Unavailable",
      "permissions": "Request OS Permissions",
      "permissionsHint": "macOS requests Accessibility and Screen Recording permissions. Windows usually needs no extra OS permission.",
      "permissionsStatus": "OS Permissions",
      "permissionsEmpty": "No extra permissions or no status yet",
      "approvals": "Approved Apps",
      "approvalsEmpty": "None",
      "activeSession": "Current Holder",
      "active": "Active",
      "idle": "Idle",
      "requestPermissions": "Request Permissions",
      "requestPermissionsFailed": "Failed to request permissions",
      "refresh": "Refresh"
    },
    "agent": {
      "title": "Agent",
      "changeAvatar": "Change",
      "removeAvatar": "Remove avatar",
      "avatarRemoved": "Restored default avatar",
      "agentNameHint": "What they go by",
      "identity": "Identity",
      "identityHint": "A short description of who this agent is and what they're good at. Other agents use this to know them",
      "ishiki": "Ishiki",
      "ishikiHint": "Defines the assistant's character, tone and behavior. Separate from Yuan and does not affect it.",
      "publicIshiki": "Public Ishiki",
      "publicIshikiHint": "For privacy, the assistant cannot access memories, your personal info, or any files and tools on your computer when talking to visitors.\nYou can set the assistant's reply style and guidelines for visitor conversations here.",
      "chatModel": "Model",
      "chatModelHint": "The model used for conversations and tasks",
      "modelUnavailable": "Unavailable: {model}",
      "modelUnavailableHint": "The current model is no longer available. Select another model, or save the provider config again and fetch models.",
      "imageModel": "Image Model",
      "imageModelHint": "The model used for image generation",
      "addAgent": "New Agent",
      "createTitle": "New Agent",
      "namePlaceholder": "Give them a name",
      "cancel": "Cancel",
      "confirm": "Create",
      "creating": "Creating…",
      "nameRequired": "Please enter a name",
      "created": "{name} created ✿",
      "createFailed": "Create failed",
      "switched": "Switched to {name} ✿",
      "switchFailed": "Switch failed",
      "deleteBtn": "Delete agent",
      "deleteTitle1": "Delete {name}?",
      "deleteDesc1": "This will permanently delete all config, memory and conversations. This cannot be undone.",
      "deleteNext": "Continue",
      "deleteTitle2": "Type \"{name}\" to confirm",
      "deletePlaceholder": "Type agent name",
      "deleteConfirm": "Delete permanently",
      "deleteCancel": "Cancel",
      "deleted": "{name} deleted",
      "deleteFailed": "Delete failed",
      "setPrimary": "Set as primary",
      "setPrimaryFailed": "Set primary failed",
      "lastAgent": "Must keep at least one agent",
      "yuan": "Yuan",
      "yuanHint": "\"Yuan\" is the agent's subconscious. Build your unique companion from this foundation.",
      "tools": {
        "title": "Tools",
        "description": "Tool switches take effect after restarting or starting a conversation. Active conversations keep using the tool set they started with.",
        "items": {
          "automation": {
            "label": "Automation",
            "summary": "Let the agent create scheduled notifications and plugin actions"
          },
          "beautify": {
            "label": "小花美术",
            "summary": "Let the agent generate document covers and aesthetic enhancements"
          },
          "browser": {
            "label": "Browser",
            "summary": "Control a headless browser to navigate web pages"
          },
          "cron": {
            "label": "Scheduled Tasks",
            "summary": "Run tasks automatically at specified times"
          },
          "dm": {
            "label": "Direct Message",
            "summary": "Send a one-on-one message to another agent"
          },
          "install_skill": {
            "label": "Install Skill",
            "summary": "Install new skills from GitHub or the skill library"
          },
          "office": {
            "label": "Office",
            "summary": "Let the agent read documents and convert HTML to PDF"
          },
          "update_settings": {
            "label": "Update Settings",
            "summary": "Allow the agent to modify application configuration"
          },
          "workflow": {
            "label": "Workflow",
            "summary": "Let the agent orchestrate multi-agent workflow scripts as background tasks"
          }
        }
      },
      "generatingPreview": "Generating preview",
      "exportAgent": "Export Agent",
      "generatingCardPreview": "Generating character card preview",
      "exportedTo": "Exported to {path}"
    },
    "general": {
      "title": "General",
      "startup": {
        "title": "Startup & Background"
      },
      "launchAtLogin": "Launch at login",
      "keepAwake": "Keep running while locked",
      "quickChat": {
        "title": "Quick Chat",
        "shortcut": "Open shortcut",
        "shortcutHint": "Click and press a new key combo. Esc cancels recording.",
        "reuseTimeout": "Keep old input for",
        "reuseTimeoutHint": "After the mini window stays hidden this long, the shortcut opens a fresh input.",
        "minutes": "min",
        "recording": "Press shortcut...",
        "restoreDefault": "Restore default",
        "registrationFailed": "Shortcut is already in use"
      },
      "notifications": {
        "title": "Notifications",
        "turnCompletion": "Turn completion notification",
        "turnCompletionNever": "Never",
        "turnCompletionWhenUnfocused": "When HanaAgent is unfocused",
        "turnCompletionWhenSessionUnfocused": "When not focused on the completed Session"
      }
    },
    "about": {
      "title": "About Them",
      "tagline": "An assistant that lives in your computer, with a good memory.",
      "license": "License",
      "copyright": "Copyright",
      "licenseToggle": "License full text",
      "updateAvailable": "New version available: v{version}",
      "updateDownload": "Download",
      "updateChecking": "Checking for updates…",
      "updateDownloading": "{agentName} is preparing a new home {percent}%",
      "updateReadyInstall": "v{version} ready to install",
      "updateInstalling": "Installing update. HanaAgent will restart automatically…",
      "updateInstallManualHint": "Install after clicking Restart to update; quitting will not install automatically",
      "updateInstall": "Restart to update",
      "updateInstallNow": "Restart and update now",
      "updateProgress": "{percent}%",
      "updateError": "Update check failed",
      "updateLatest": "You're up to date",
      "updateCheckBtn": "Check for updates",
      "updateNeedInstall": "Please move HanaAgent to the Applications folder first",
      "updateDiskSpace": "Not enough disk space to download update",
      "launchAtLogin": "Launch at login",
      "keepAwake": "Keep running while locked",
      "betaUpdates": "Receive beta updates",
      "autoCheckUpdates": "Check for updates automatically"
    },
    "access": {
      "networkAccess": "LAN Access",
      "mobileAccess": "Mobile Access",
      "desktopAccess": "Computer Access",
      "lanToggle": "Allow LAN devices",
      "lanHint": "Allow phones and computers on the same LAN to reach this HanaAgent Server",
      "port": "Fixed Port",
      "portHint": "Used by bookmarks and QR codes. Restart Hana after changing it",
      "mobileUrl": "Mobile URL",
      "mobileUrlLanHint": "Open this address in the phone browser",
      "mobileUrlLocalHint": "Only this computer can connect until LAN access is enabled",
      "status": "Runtime Status",
      "statusHint": "Confirms where the server is listening and which mobile URL is currently effective",
      "runtimeEndpoint": "Listening Now",
      "effectiveMobileUrl": "Effective URL",
      "effectiveDesktopUrl": "Computer URL",
      "lanAddresses": "LAN Addresses",
      "noLanAddresses": "No LAN address found",
      "qrCode": "QR Code",
      "qrCodeHint": "Scan to open the PWA",
      "restartRequired": "Port change saved. Restart Hana to apply it",
      "saveNetwork": "Save Access Settings",
      "mobileKeys": "Mobile Keys",
      "generateMobileKey": "Generate Mobile Access Key",
      "mobileKeyHint": "Use this for first login on mobile. The browser session takes over afterwards",
      "mobileKey": "Access Key",
      "mobileKeyOnce": "The key is shown only once after creation",
      "mobileKeyCreated": "Mobile access key created",
      "mobileKeyFailed": "Creation failed",
      "desktopUrl": "Computer URL",
      "desktopUrlLanHint": "Open this address in another computer's browser",
      "desktopUrlLocalHint": "Only this computer can connect until LAN access is enabled",
      "generateDesktopKey": "Generate Computer Access Key",
      "desktopKeyHint": "Use this for the first browser login on another computer",
      "desktopKey": "Computer Access Key",
      "desktopKeyOnce": "The key is shown only once after creation",
      "desktopKeyCreated": "Computer access key created",
      "desktopKeyFailed": "Creation failed",
      "connectLanServer": "Connect LAN Server",
      "remoteServerUrl": "Server URL",
      "remoteServerUrlHint": "Enter the HanaAgent Server URL on another computer or NAS",
      "remoteServerKey": "Access key",
      "remoteServerKeyHint": "Enter the computer access key generated on that server",
      "remoteServerConnected": "LAN server connected",
      "remoteServerFailed": "Connection failed",
      "remoteConnection": "Connected to Remote Hana",
      "remoteConnectionDesc": "Local account, password, LAN switches, and access keys in Access & Devices belong only to the local Hana instance.",
      "remoteConnectionName": "Connection Name",
      "remoteConnectionKind": "Connection Type",
      "remoteConnectionUrl": "Server URL",
      "remoteConnectionUnknown": "Unknown",
      "remoteLocalOnlyNote": "Switch back to local Hana before managing this computer's LAN access, device keys, or local account.",
      "returnToLocal": "Return to Local Hana",
      "returnedToLocal": "Returned to local Hana",
      "localConnectionUnavailable": "Local Hana connection is not ready",
      "pairedDevices": "Paired Devices",
      "noDevices": "No paired devices",
      "revoke": "Revoke",
      "revokeCredential": "Revoke Key",
      "credentialRevoked": "Key revoked",
      "credentialRevokeFailed": "Failed to revoke key",
      "deviceRevoked": "Device revoked",
      "deviceRevokeFailed": "Failed to revoke",
      "localAccount": "Local Account",
      "username": "Username",
      "displayName": "Display Name",
      "saveAccount": "Save Account",
      "accountSaved": "Account saved",
      "password": "Password",
      "passwordSet": "Password set",
      "passwordNotSet": "No password set",
      "passwordHint": "For future secure remote login. LAN HTTP still prefers mobile access keys",
      "newPassword": "New Password",
      "savePassword": "Save Password",
      "passwordSaved": "Password saved",
      "clearPassword": "Clear Password",
      "passwordCleared": "Password cleared",
      "copy": "Copy",
      "copied": "Copied",
      "saved": "Saved",
      "invalidPort": "Port must be a number",
      "loadFailed": "Failed to load access settings"
    },
    "security": {
      "sandbox": "Sandbox",
      "sandboxDesc": "Restrict filesystem writes; ordinary external files are read-only, and workspace files remain readable and writable",
      "sandboxWarning": "Disabling the sandbox allows the AI to read, write, or delete any file on the system, which may have unexpected consequences",
      "sandboxNetwork": "Allow Sandbox Network",
      "sandboxNetworkDesc": "Allow sandboxed commands to reach the public internet while keeping filesystem write limits active",
      "sandboxNetworkDisabledDesc": "When the sandbox is off, commands already run as normal local processes; this only affects sandboxed commands",
      "sandboxNetworkWin32Unsupported": "The Windows command sandbox isolates file writes only and does not support network isolation; commands keep the current user's network access",
      "networkProxy": "Outbound Proxy",
      "networkProxyMode": "Proxy Mode",
      "networkProxyModeDesc": "In-app APIs, OAuth, Bridge, and web requests use this outbound proxy",
      "networkProxySystem": "System / Environment",
      "networkProxyManual": "Manual Proxy",
      "networkProxyDirect": "Direct",
      "networkProxyManualTitle": "Proxy URLs",
      "networkProxyManualDesc": "Supports http, https, socks, and socks5 URLs. HTTPS reuses HTTP when left empty",
      "networkProxyHttp": "HTTP proxy, for example http://127.0.0.1:7890",
      "networkProxyHttps": "HTTPS proxy, for example http://127.0.0.1:7890",
      "networkProxyWs": "WS proxy, optional",
      "networkProxyWss": "WSS proxy, optional",
      "networkProxyNoProxy": "Bypass proxy, for example localhost, 127.0.0.1, ::1",
      "networkProxySave": "Save Proxy Settings",
      "archivedChats": "Archived Conversations",
      "archivedChatsDesc": "Review archived chats, restore conversations you need again, or permanently delete records you no longer want",
      "viewArchivedChats": "View Archived Conversations",
      "fileBackup": "File Backup",
      "fileBackupDesc": "Automatically save original file content before AI modifications or deletions",
      "retention": "Retention",
      "retention1d": "1 day",
      "retention3d": "3 days",
      "retention7d": "7 days",
      "maxFileSize": "Ignore files larger than",
      "viewBackups": "View Backups",
      "hideBackups": "Hide",
      "restoreBtn": "Restore",
      "noBackups": "No backups yet",
      "restoreSuccess": "Restored",
      "restoreFailed": "Restore failed"
    },
    "me": {
      "title": "Me",
      "changeAvatar": "Change",
      "userNameHint": "How they address you",
      "userProfile": "User Profile",
      "userProfileHint": "Help the assistant know you: interests, habits, preferences. Injected into the system prompt",
      "nameLabel": "Name"
    },
    "crop": {
      "title": "Adjust avatar",
      "hint": "Drag to move, scroll to zoom",
      "cancel": "Cancel",
      "confirm": "Confirm",
      "updated": "Avatar updated ✿",
      "reset": "Avatar reset to default"
    },
    "providers": {
      "title": "Registered Providers",
      "addTitle": "Add Provider",
      "name": "Provider",
      "customName": "Name",
      "customUrl": "Base URL",
      "apiFormat": "API Protocol",
      "url": "Base URL",
      "apiKey": "API Key",
      "addBtn": "Add",
      "empty": "No providers registered yet",
      "fetchModels": "Fetch Models",
      "delete": "Delete provider",
      "modelCount": "{n} models",
      "fetchSuccess": "Fetched {n} models from {name}",
      "fetchFailed": "Fetch failed",
      "nameRequired": "Provider name is required",
      "urlRequired": "Base URL is required",
      "apiRequired": "API protocol is required",
      "added": "Added {name}",
      "deleted": "Deleted {name}",
      "noModels": "No models yet",
      "resetModels": "Reset Models",
      "apiType": "API Type",
      "verify": "Verify",
      "verifyConnection": "Verify Connection",
      "verifySuccess": "Connection verified",
      "verifyFailed": "Verification failed",
      "setupHint": "Enter API Key to activate this provider",
      "configInvalid": "This provider config is damaged and has been skipped temporarily. Save the config again, or delete and recreate it.",
      "configIncomplete": "This provider config is incomplete. Fill API Key, Base URL, and add or fetch models.",
      "selectHint": "Select a provider to view details",
      "addCustom": "Add Custom Provider",
      "noKey": "Not configured",
      "remove": "Remove",
      "deleteConfirm": "Delete provider {name}? Associated models will be removed."
    },
    "usage": {
      "title": "Usage",
      "note": "Usage is for reference only. Final totals are determined by the provider.",
      "refresh": "Refresh usage",
      "total": "All usage",
      "requests": "Requests",
      "totalTokens": "Total tokens",
      "cacheRead": "Cache read",
      "cacheHitRate": "Hit rate",
      "uncached": "Uncached",
      "modelMix": "Model mix",
      "dailyUsage": "Daily usage",
      "requestLedger": "Request ledger",
      "loading": "Loading usage…",
      "empty": "No usage records yet",
      "groupMeta": "{requests} requests · {errors} errors",
      "cacheShort": "cache {tokens}",
      "tokensShort": "{tokens} tok",
      "cacheSummary": "Cache {cache} · uncached {uncached}",
      "window": {
        "week": "Last 7 days",
        "month": "Last 30 days"
      },
      "period": {
        "week": "Week",
        "month": "Month"
      },
      "view": {
        "overall": "Overall",
        "daily": "By date",
        "category": "Category",
        "model": "Model"
      },
      "category": {
        "session": "Session",
        "phone": "Phone",
        "memory": "Memory",
        "automation": "Automation",
        "subagent": "Subagent",
        "compaction": "Compaction",
        "plugin": "Plugin",
        "utility": "Utility",
        "vision": "Vision",
        "unknown": "Unknown"
      },
      "status": {
        "ok": "Ok",
        "error": "Error",
        "aborted": "Aborted",
        "usage_missing": "No usage"
      }
    },
    "media": {
      "imageGeneration": "Image Generation",
      "defaultModel": "Default Image Model",
      "credentialOk": "API Key configured (reuses provider settings)",
      "credentialMissing": "Not configured, go to Provider settings",
      "adapterMissing": "Image adapter missing",
      "addModel": "Add Image Model",
      "providerDefaults": "Default Parameters",
      "size": "Size",
      "format": "Format",
      "quality": "Quality",
      "watermark": "Watermark",
      "aspectRatio": "Aspect Ratio",
      "speechRecognition": "Speech Recognition",
      "speechRecognitionEnabled": "Transcribe voice strips on send",
      "defaultSpeechModel": "Voice strip transcription model",
      "speechModels": "Transcription Models",
      "speechSynthesis": "Speech Synthesis",
      "comingSoon": "Coming Soon",
      "noProvider": "Select a provider to view details",
      "models": "Image Models",
      "globalDefault": "Global Default",
      "followGlobal": "Follow global default",
      "default": "Default",
      "defaultOption": "Default",
      "qualityLow": "Low",
      "qualityMedium": "Medium",
      "qualityHigh": "High"
    },
    "oauth": {
      "title": "Quick Login",
      "login": "Login",
      "logout": "Logout",
      "loggedIn": "Logged in",
      "codePlaceholder": "Paste authorization code",
      "submit": "Submit",
      "success": "Login successful",
      "loggedOut": "Logged out",
      "failed": "Login failed",
      "deviceHint": "Enter this code in the browser to authorize",
      "waiting": "Waiting for authorization…",
      "clickToCopy": "Click to copy",
      "codeCopied": "Code copied",
      "addModel": "Add Model",
      "customModelPlaceholder": "Enter model ID"
    },
    "api": {
      "title": "Models & API",
      "mainApi": "Main API",
      "provider": "Provider",
      "baseUrl": "Base URL",
      "baseUrlHint": "Enter the Base URL explicitly",
      "apiKey": "API Key",
      "apiKeyPlaceholder": "Enter a new key to update",
      "utilityApi": "Utility Model API",
      "utilityApiHint": "If configured separately, provider, Base URL, and API key must all be explicit",
      "showKey": "Show",
      "hideKey": "Hide",
      "selectModel": "Select model",
      "customModel": "Custom...",
      "mainModelSection": "Models",
      "mainModelHint": "These models will be available in the chat page",
      "addModel": "Add Model",
      "defaultModel": "Default",
      "removeModel": "Remove",
      "noModels": "No models added yet",
      "otherModelSection": "Other",
      "chatModel": "Primary model",
      "utilityModel": "Utility (small)",
      "utilityModelHint": "Titles, light classification, etc. A cheap small model is recommended",
      "utilityLargeModel": "Utility (large)",
      "utilityLargeModelHint": "Activity summaries, task breakdown, etc. Falls back to small utility if empty",
      "visionModel": "Vision auxiliary model",
      "visionAuxiliaryToggle": "Auxiliary vision",
      "visionModelHint": "Used only when the current chat model cannot accept images",
      "visionModelMissingHint": "Can't find your model? Enable its vision capability in the Providers page.",
      "searchProvider": "Search Service",
      "searchProviderField": "Search engine",
      "searchApiKey": "Search API Key",
      "searchApiKeyHint": "Enter the API key for the selected search provider",
      "searchApiKeysAutoHint": "Auto uses configured Tavily, Brave, and Serper keys first, then AnySearch free search, then browser search when quota, errors, empty results, or weak relevance get in the way.",
      "searchApiKeyNotRequired": "Browser search does not need an API key. It opens the search page locally in the background and structures the results.",
      "favorites": "Favorites",
      "searchModel": "Search models...",
      "noFavorites": "Click ☆ to favorite models",
      "customInput": "Custom...",
      "editModel": "Edit",
      "contextLength": "Context Length",
      "contextShort": "Context",
      "maxOutput": "Max Output",
      "outputLength": "Output Length",
      "modelName": "Model",
      "output": "out",
      "save": "Save",
      "cancel": "Cancel",
      "thinkingLevel": "Reasoning Effort",
      "thinkingLevelHint": "Controls reasoning depth, only affects models that support reasoning",
      "thinkingLevels": {
        "off": "Off",
        "low": "Low",
        "medium": "Medium",
        "high": "High",
        "auto": "Auto",
        "xhigh": "Max"
      },
      "addedModels": "Added models",
      "displayName": "Display name",
      "vision": "Vision",
      "video": "Video",
      "audio": "Audio",
      "reasoning": "Reasoning",
      "capability": {
        "image": "Supports image input",
        "video": "Supports video input",
        "audio": "Supports audio input",
        "reasoning": "Supports reasoning"
      }
    },
    "memory": {
      "sectionTitle": "Memory",
      "title": "Memory System",
      "needsUtilityModel": "Configure a Utility model in Models tab first",
      "compiled": "Current Memory",
      "compiledHint": "What the assistant remembers about you — important and recent things",
      "compiledView": "View Current Memory",
      "compiledEmpty": "No compiled memories yet",
      "compiledClear": "Clear",
      "compiledCleared": "Compiled memory cleared",
      "health": {
        "healthy": "Memory maintenance is healthy",
        "degraded": "Memory maintenance is delayed",
        "unhealthy": "Memory maintenance needs attention",
        "disabled": "Memory is turned off",
        "unavailable": "Memory status is unavailable",
        "stepSeparator": ", ",
        "failedSteps": "Affected steps: {steps}",
        "lastError": "Last error: {time}",
        "errorMessage": "Error: {message}",
        "steps": {
          "rollingSummary": "Rolling summary",
          "compileToday": "Today memory",
          "compileWeek": "Week memory",
          "compileLongterm": "Long-term memory",
          "compileFacts": "Fact memory",
          "deepMemory": "Deep memory"
        }
      },
      "allMemories": "All Memories",
      "tokenBudget": "Memory capacity",
      "tokenBudgetHint": "Target token budget for memory.md",
      "decayPerDay": "Decay coefficient",
      "decayPerDayHint": "Base λ for Gaussian decay",
      "hitBonus": "Hit bonus",
      "hitBonusHint": "Score added each time a memory is referenced",
      "baseImportance": "Base importance",
      "baseImportanceHint": "Default initial score for new memories",
      "forgetSpeed": "Forget speed",
      "forgetSpeedHint": "1.0 = normal, 2.0 = twice as fast",
      "compileThreshold": "Compile threshold",
      "compileThresholdHint": "Memories below this score are excluded",
      "timezone": "Timezone",
      "timezoneHint": "Used for memory timestamps",
      "actions": {
        "title": "Memory Management",
        "view": "View Memories",
        "clear": "Clear Memories",
        "more": "More",
        "export": "Export",
        "import": "Import",
        "clearConfirm": "Are you sure you want to clear all memories? This cannot be undone.",
        "cancel": "Cancel",
        "confirmClear": "Confirm Clear",
        "viewTitle": "All Memories",
        "clearSuccess": "Memories cleared",
        "exportSuccess": "Export successful",
        "importSuccess": "{count} memories imported",
        "importing": "Importing...",
        "empty": "No memories yet",
        "invalidFile": "Invalid memory file",
        "activeOnly": "Set this agent as active first"
      },
      "unknownDate": "Unknown date",
      "threshold": {
        "title": "Memory Waterline",
        "hint": "You decide how many memories are remembered. A little noise is fine — LLMs are good at filtering.",
        "stats": "{remembered} / {total} memories remembered"
      },
      "activeOnly": "Set this agent as active first"
    },
    "pins": {
      "title": "Pinned Memories",
      "hint": "Always injected into conversations, never decay",
      "empty": "No pinned memories yet",
      "delete": "Delete",
      "addPlaceholder": "Add a pinned memory..."
    },
    "experience": {
      "title": "Experience",
      "hint": "Lessons the agent has learned, organized by category. The agent checks relevant experience before starting work",
      "toggleLabel": "Enable experience",
      "toggleHint": "Off by default. When enabled, the assistant automatically summarizes work lessons and keeps growing, but this can pollute context.",
      "paused": "Experience is paused. Existing entries are kept, but the assistant cannot read or record them.",
      "empty": "No experience yet",
      "edit": "Edit",
      "deleteCategory": "Delete category"
    },
    "search": {
      "verify": "Verify",
      "verifying": "Verifying...",
      "verified": "Verified & saved ✿",
      "verifyFailed": "Verification failed",
      "noProvider": "Please select a search engine first",
      "noKey": "Please enter an API Key first"
    },
    "work": {
      "title": "Patrol",
      "heartbeatMaster": "Heartbeat Master Switch",
      "heartbeatMasterDesc": "When off, all agent heartbeats are paused",
      "heartbeatEnabled": "Patrol mode",
      "heartbeatOn": "On",
      "heartbeatOff": "Off",
      "heartbeatInterval": "Patrol interval",
      "heartbeatUnit": "minutes",
      "heartbeatDesc": "How often the assistant auto-checks the workspace",
      "automationPermissionMode": "Automation permission mode",
      "automationPermissionModeDesc": "Controls whether background automation Agent runs auto-review tool calls, run with full access, or stay read-only",
      "homeFolder": "Workspace",
      "homeFolderDesc": "Default working directory for new chats, patrol and cron tasks",
      "homeFolderPlaceholder": "Not set (choose manually each time)",
      "homeFolderClear": "Clear",
      "homeFolderBrowse": "Browse",
      "contextFilesTitle": "Workspace instruction injection",
      "contextFilesDesc": "Inject AGENTS.md / CLAUDE.md from the current workspace project into new session system prompts before memory.",
      "injectAgentsMd": "Inject AGENTS.md",
      "injectAgentsMdDesc": "When enabled, new sessions read AGENTS.md from the current working directory up to the Git root.",
      "injectClaudeMd": "Inject CLAUDE.md",
      "injectClaudeMdDesc": "When enabled, new sessions read CLAUDE.md from the current working directory up to the Git root."
    },
    "toolCaps": {
      "title": "Skill Installation Permissions"
    },
    "skills": {
      "title": "Skills",
      "desc": "Enable or disable skills for this agent. When enabled, the agent will automatically recognize and use matching skills in conversations.",
      "manageTitle": "Installed Skills",
      "agentConfigTitle": "Agent Skill Configuration",
      "configureFor": "Configuring:",
      "userSkillsTitle": "Agent Skill Toggles",
      "user": "User Skills",
      "system": "System Skills",
      "add": "Add Skill",
      "delete": "Delete",
      "deleteConfirm": "Delete skill \"{name}\"?",
      "installSuccess": "Skill \"{name}\" installed",
      "installError": "Install failed",
      "enabled": "Enabled",
      "disabled": "Disabled",
      "noSkills": "No skills available",
      "noUser": "No custom skills",
      "copyToSkills": "Copy to your skills",
      "copied": "Copied ✓",
      "copyFailed": "Copy failed",
      "dropzone": "Drop a skill folder to install, or click to browse",
      "learnHint": "Try asking your assistant: find me some safe and useful skills from GitHub",
      "reloaded": "Skills reloaded",
      "reload": "Reload skills",
      "compatTitle": "Compatible Skills",
      "compatDesc": "Auto-discover skills installed by other AI tools",
      "compatNoSkills": "No external skills found",
      "compatAddPath": "Add directory",
      "compatRemove": "Remove",
      "compatAutoDiscovered": "Auto-discovered",
      "compatNotInstalled": "Not installed",
      "learnCreate": "Create / install skills",
      "learnCreateDesc": "Allow the Agent to write new skills or install them into the shared skill pool, enabled only for the current Agent by default",
      "fetchRemote": "Fetch skills from GitHub / ClawHub",
      "fetchRemoteDesc": "When enabled, the Agent will proactively search and install suitable skills for specialized tasks. Use with caution",
      "safetyReview": "Safety review before install",
      "safetyReviewDesc": "Use AI to detect prompt injection and other security risks before installing skills",
      "fetchWarning": {
        "title": "About fetching remote skills",
        "body1": "When enabled, the Agent will proactively search, download and install suitable skills from GitHub and ClawHub during specialized tasks.",
        "body2": "Although automatic safety review and star-count checks are performed before installation, the following risks remain:",
        "risk1": "Skill content is not manually reviewed and may contain harmful instructions",
        "risk2": "The Agent may install skills that don't match expectations",
        "risk3": "Malicious skills may attempt to manipulate Agent behavior",
        "confirm": "I understand the risks, enable"
      },
      "safetyWarning": {
        "title": "Disable safety review",
        "body1": "Safety review detects potentially malicious content before installing skills, including:",
        "risk1": "Prompt injection (unauthorized instructions)",
        "risk2": "Overly broad trigger conditions",
        "risk3": "Social engineering and privilege escalation attempts",
        "body2": "After disabling, all skills will be installed without review.",
        "confirm": "I understand the risks, disable review"
      },
      "bundleDialog": {
        "createTitle": "Create Bundle",
        "renameTitle": "Rename Bundle",
        "dissolveTitle": "Dissolve Bundle",
        "cancel": "Cancel",
        "closeAriaLabel": "Cancel",
        "dissolveConfirm": "The skills in {name} will be kept in the shared library and shown as loose skills.",
        "bundleNameLabel": "Bundle name",
        "cancelBtn": "Cancel",
        "createBtn": "Create",
        "saveBtn": "Save",
        "dissolveBtn": "Dissolve"
      },
      "exportedWithSkipped": "Exported {fileName}, skipped {count} missing skills",
      "exported": "Exported {fileName}",
      "createBundleBtn": "Create Bundle",
      "createBundleTitle": "Create Skill Bundle",
      "createBundleAriaLabel": "Create Skill Bundle",
      "emptyBundle": "Empty bundle",
      "skillNotFound": "This skill no longer exists",
      "noLooseSkills": "No loose skills",
      "collapseBundleAriaLabel": "Collapse Bundle",
      "expandBundleAriaLabel": "Expand Bundle",
      "enableBundleTitle": "Enable entire Bundle",
      "disableBundleTitle": "Disable entire Bundle",
      "enableBundleAriaLabel": "Enable {name}",
      "disableBundleAriaLabel": "Disable {name}",
      "renameBundleTitle": "Rename Bundle",
      "renameBundleAriaLabel": "Rename {name}",
      "exportBundleTitle": "Export Skill Bundle",
      "exportBundleAriaLabel": "Export {name}",
      "dissolveBundleTitle": "Dissolve Bundle",
      "dissolveBundleAriaLabel": "Dissolve {name}",
      "removeFromBundleTitle": "Remove from bundle, make loose skill",
      "removeFromBundleAriaLabel": "Remove {name} from bundle"
    },
    "plugins": {
      "title": "Plugins",
      "desc": "Manage community plugins.",
      "empty": "No plugins installed",
      "reload": "Reload",
      "statusLoaded": "loaded",
      "statusFailed": "failed",
      "statusDisabled": "disabled",
      "fullAccessToggle": "Allow full-access plugins",
      "fullAccessDesc": "When enabled, plugins that declare full-access can use system-level APIs (routes, hooks, providers, etc.)",
      "devToolsToggle": "Allow Agent plugin dev tools",
      "devToolsDesc": "When enabled, the Agent can install, reload, enable, disable, and uninstall development plugins. This only affects the development plugin directory, not normally installed plugins.",
      "dropzone": "Drag plugin folder or .zip here to install, or click to select",
      "statusRestricted": "needs full access",
      "deleteConfirm": "Remove plugin \"{name}\"? Plugin data will be preserved.",
      "installSuccess": "Plugin \"{name}\" installed",
      "installError": "Plugin install failed",
      "invalidPlugin": "Not a valid plugin directory",
      "pluginsDir": "Plugin directory: {path}",
      "needsFullAccess": "Enable \"Allow full-access plugins\" to use this plugin",
      "configure": "Configure {name}",
      "configTitle": "{name} settings",
      "configLoadError": "Plugin settings failed to load",
      "sensitiveHint": "Stored value is hidden. Enter a new value to replace it.",
      "invalidJson": "Invalid JSON",
      "showDiagnostics": "Show plugin diagnostics",
      "diagnosticsTitle": "Plugin Diagnostics",
      "diagnosticsLoadError": "Plugin diagnostics failed to load",
      "diagnosticsSummary": "Capabilities {capabilities}/{total} · Tasks {tasks} · Schedules {schedules}",
      "noDiagnostics": "No diagnostics yet",
      "diagnosticActivation": "Activation: {state}",
      "diagnosticRoutes": "Pages {pages} · Widgets {widgets} · Settings {settingsTabs}",
      "diagnosticTools": "Tools {count}",
      "diagnosticCommands": "Commands {count}",
      "diagnosticConfig": "Config {count}",
      "openMarketplace": "Open plugin marketplace",
      "marketBack": "Back to plugin management",
      "marketplaceTitle": "Plugin Marketplace",
      "marketplaceHint": "Browse installable plugins, README files, permissions, and contribution types.",
      "marketplaceCount": "{count} plugins",
      "marketplaceNoSource": "No marketplace source",
      "marketplaceEmpty": "No plugins to browse",
      "marketLoading": "Loading plugin marketplace…",
      "marketLoadError": "Plugin marketplace failed to load",
      "marketReadmeLoadError": "README failed to load",
      "marketInstalled": "Installed",
      "marketInstall": "Install",
      "marketUpdate": "Update",
      "marketReinstall": "Reinstall",
      "marketDowngrade": "Downgrade",
      "marketIncompatible": "Incompatible",
      "marketUpdateAvailable": "Update available",
      "marketInstalledVersion": "Installed v{version}",
      "marketUpdateFrom": "Installed v{from}, update to v{to}",
      "marketDowngradeTo": "Only compatible version v{version} can be installed",
      "marketDowngradeConfirm": "Installed version is v{from}. Downgrade to v{to}?",
      "marketReadmeLoading": "Loading README…",
      "marketSelectPlugin": "Select a plugin to view its README",
      "manageTitle": "Manage Plugins",
      "permissionTitle": "Permissions"
    },
    "mcp": {
      "masterTitle": "Master Switch",
      "masterName": "Enable Connectors",
      "masterDesc": "When off, new sessions receive no MCP connector tools. Frozen sessions keep their snapshot, but calls return an explicit error.",
      "connectorsTitle": "Connectors",
      "connectorName": "Name",
      "description": "Description",
      "descriptionPlaceholder": "Optional note for what this connector does",
      "connectorMode": "Type",
      "modeRemote": "Remote",
      "modeLocal": "Local Command",
      "remoteUrl": "Remote URL",
      "transport": "Transport",
      "transportAuto": "Auto",
      "transportStreamable": "Streamable HTTP",
      "transportSse": "SSE",
      "authType": "Auth",
      "authNone": "None",
      "authBearer": "Bearer Token",
      "authOAuth": "OAuth",
      "authToken": "Access Token",
      "oauthClientId": "OAuth Client ID",
      "oauthClientSecret": "OAuth Client Secret",
      "oauthConnect": "Connect",
      "oauthConnected": "OAuth connected",
      "oauthDisconnected": "OAuth disconnected",
      "headers": "Headers",
      "headersHint": "One KEY=value pair per line. Values are stored for connector requests and masked after saving.",
      "statusRunning": "Running",
      "statusStopped": "Stopped",
      "statusConnecting": "Connecting",
      "statusReconnecting": "Reconnecting",
      "statusFailed": "Reconnect failed",
      "statusNeedsAuth": "Needs sign-in",
      "command": "Command",
      "args": "Arguments",
      "cwd": "Working Directory",
      "cwdPlaceholder": "Optional",
      "registryUrl": "Registry",
      "env": "Environment Variables",
      "envHint": "One KEY=value pair per line. Values are passed only to local stdio MCP server processes.",
      "timeout": "Timeout Seconds",
      "autoStart": "Auto Start",
      "addConnector": "Add Connector",
      "updateConnector": "Update Connector",
      "importJson": "Import JSON",
      "importJsonHint": "Supports Cherry Studio, Claude, and other mcpServers JSON config shapes.",
      "noConnectors": "No connectors yet",
      "envCount": "env vars",
      "headersCount": "headers",
      "toolsCount": "tools",
      "start": "Start",
      "stop": "Stop",
      "refresh": "Refresh Tools",
      "removeConfirm": "Remove this connector? Saved per-agent switches will remain but no longer take effect.",
      "agentTitle": "Agent Configuration",
      "agentConnectorDesc": "Enable for the selected agent, just like skills.",
      "saveError": "Save failed"
    },
    "screenshot": {
      "title": "Screenshot Sharing",
      "desc": "Choose the style and layout for sharing conversation screenshots",
      "color": "Color",
      "width": "Width",
      "font": "Font",
      "fontLabel": "Screenshot Font",
      "fontHint": "When no screenshot font is selected, screenshots follow the appearance reading font.",
      "light": "Light",
      "dark": "Dark",
      "sakura": "Sakura",
      "mobile": "Mobile",
      "desktop": "Desktop",
      "mobileTitle": "Mobile Layout",
      "mobileDesc": "Tall image, ideal for phone sharing",
      "desktopTitle": "Desktop Layout",
      "desktopDesc": "Wider, for desktop saving & sharing",
      "segmentTitle": "Auto Segmentation",
      "segmentLimitLabel": "Characters per page",
      "segmentLimitHint": "When visible text exceeds this limit, the next screenshot starts at a full conversation-round boundary. Default is 10000 characters.",
      "segmentLimitUnit": "chars"
    },
    "bridge": {
      "agent": "Agent",
      "telegram": "Telegram",
      "telegramToken": "Bot Token",
      "telegramHint": "Get from @BotFather",
      "feishu": "Feishu",
      "feishuAppId": "App ID",
      "feishuAppSecret": "App Secret",
      "feishuHint": "Get from Feishu Open Platform; events use long connection, no local callback URL needed",
      "whatsapp": "WhatsApp",
      "qq": "QQ",
      "qqAppId": "App ID",
      "qqAppSecret": "App Secret",
      "qqHint": "Get from QQ Bot Open Platform (q.qq.com/qqbot)",
      "wechat": "WeChat",
      "wechatHint": "Connect via WeChat iLink protocol",
      "wechatExclusive": "Each WeChat account can only be bound to one Agent. Binding a new Agent will invalidate the previous one.",
      "wechatReplyWindowReminder": "Proactive WeChat notifications require a recent incoming message or reply window. If reminders do not arrive, send this Agent a WeChat message to activate that window.",
      "wechatScan": "Scan to Login",
      "wechatRescan": "Re-login",
      "wechatLoggedIn": "Logged in",
      "wechatNeedScan": "Please scan QR code first",
      "wechatScanning": "Scan the QR code with WeChat",
      "wechatScanned": "Scanned, please confirm on your phone",
      "wechatExpired": "QR code expired",
      "wechatLoginSuccess": "Login successful",
      "wechatLoginFailed": "Login failed",
      "wechatUnbind": "Unbind",
      "wechatUnbound": "WeChat unbound",
      "connected": "Connected",
      "disconnected": "Not connected",
      "error": "Connection failed",
      "test": "Test Connection",
      "testOk": "Connection successful",
      "testFail": "Test failed",
      "noToken": "Please enter Bot Token first",
      "noCredentials": "Please enter App ID and App Secret first",
      "globalSettings": "Global Settings",
      "agentSettings": "Agents",
      "permissionMode": "Permission mode",
      "permissionModeDesc": "Controls whether Bridge bots auto-review tool calls, run with full access, or stay read-only",
      "permissionModeAuto": "Auto review",
      "permissionModeOperate": "Full access",
      "permissionModeReadOnly": "Read-only mode",
      "receiptEnabled": "Reply receipt",
      "receiptEnabledDesc": "Send a short \"received and replying\" notice before the actual response",
      "readOnly": "Read-only mode",
      "readOnlyDesc": "Bridge bots can only read files, no writing or command execution",
      "howTo": "Setup Guide",
      "tutorialTitle": "Platform Setup Guide",
      "tutorialTgSteps": [
        "Search for <code>@BotFather</code> in Telegram and open the chat",
        "Send <code>/newbot</code> and follow the prompts to set a name and username",
        "BotFather will reply with a Bot Token (like <code>123456:ABC-DEF...</code>)",
        "Paste the Token into the input field above and turn on the switch",
        "Find your Bot in Telegram and send a message to test it"
      ],
      "ownerSelect": "Which account is you",
      "ownerWarning": "Warning: The selected account will have access to your computer, memory, and private information. Make sure the account belongs to you.",
      "ownerNone": "Send a message first to select",
      "ownerSaved": "Saved",
      "ownerConfirmTitle": "Set as Owner?",
      "ownerConfirmText": "The Owner has full Agent access, including memory, tools, and personality. Make sure this is your own account.",
      "ownerConfirmCancel": "Cancel",
      "ownerConfirmSave": "Confirm",
      "tutorialFsSteps": [
        "Go to <code>open.feishu.cn</code>, log in and open the Developer Console",
        "Click \"Create Enterprise Custom App\", fill in the app name and description",
        "On the \"Credentials & Basic Info\" page, copy the <code>App ID</code> and <code>App Secret</code>",
        "Find \"Add App Capabilities\" in the left menu, add \"Bot\" capability and give it a name",
        "Go to \"Permissions\", search and enable <code>im:message</code> (send and receive messages)",
        "Go to \"Events & Callbacks\" → \"Event Configuration\", change to \"Receive events via long connection\"",
        "Click \"Add Event\", add <code>im.message.receive_v1</code> (receive messages)",
        "Important: Go to \"Version Management\", create and publish a version first (long connection config requires a published app)",
        "Paste the App ID and App Secret into the input fields above and turn on the switch"
      ],
      "whatsappHint": "Coming soon"
    },
    "characterCard": {
      "exportMemory": "Export memory",
      "importMemory": "Import memory",
      "noExportableMemory": "No exportable memory",
      "noImportableMemory": "No importable memory",
      "confirm": "Confirm",
      "exporting": "Exporting",
      "importing": "Importing",
      "noDescription": "This character card has no description.",
      "noIshiki": "No Ishiki provided",
      "viewDetail": "View character card details",
      "memoryCount": "{count} memory items, optional {action}",
      "memoryCountExport": "export",
      "memoryCountImport": "import",
      "noMemory": "No memory",
      "factsSectionTitle": "Key Facts",
      "todaySectionTitle": "Today",
      "weekSectionTitle": "Earlier This Week",
      "longtermSectionTitle": "Long-term Context",
      "emptySection": "None",
      "noIdentity": "No Identity provided",
      "noSkills": "No skills included",
      "cancel": "Cancel",
      "readingCard": "Reading character card",
      "dropOrClick": "Drop a character card or click to open",
      "readFailed": "Character card read failed",
      "importFailed": "Character card import failed"
    }
  },
  "onboarding": {
    "welcome": {
      "title": "Hi, I'm {name} ✿",
      "subtitle": "I'm your personal AI assistant.\nLet's do some quick setup to get started.",
      "next": "Get Started"
    },
    "remote": {
      "link": "Already have a server? Connect over LAN",
      "url": "Server URL",
      "key": "Access key",
      "connect": "Connect",
      "connecting": "Connecting...",
      "failed": "Failed to connect to LAN server"
    },
    "name": {
      "title": "Names and Memory",
      "subtitle": "Tell me what to call you, and give this Agent a name.",
      "userLabel": "What should I call you?",
      "placeholder": "Your name",
      "agentLabel": "What should this Agent be called?",
      "agentPlaceholder": "Hanako",
      "memoryTitle": "Memory system",
      "memoryHint": "When enabled, the system reviews chats after they end and turns them into memory. Because memory updates often, model cache hit rates may be lower. Turning memory off is usually cheaper.",
      "back": "Back",
      "next": "Next"
    },
    "provider": {
      "title": "Choose an AI Provider",
      "subtitle": "I need an AI model provider to work.\nPick your provider and enter your API Key.",
      "selectPlaceholder": "Choose provider",
      "searchPlaceholder": "Search providers...",
      "empty": "No providers found",
      "custom": "Custom...",
      "customName": "Name",
      "customNamePlaceholder": "e.g. my-provider",
      "customUrl": "API URL",
      "customUrlPlaceholder": "e.g. https://api.example.com/v1",
      "keyLabel": "API Key",
      "keyPlaceholder": "Paste your API Key",
      "test": "Test Connection",
      "testing": "Connecting...",
      "testSuccess": "Connected ✿",
      "testFailed": "Connection failed",
      "back": "Back",
      "next": "Next"
    },
    "model": {
      "title": "Choose a Chat Model",
      "subtitle": "This is the main model I'll use. Pick a smart, capable one.",
      "loading": "Fetching models...",
      "empty": "No models found",
      "addedModels": "Added Models",
      "noAddedModels": "No models added yet",
      "addModel": "Add Model",
      "addModelSearchPlaceholder": "Search models to add...",
      "manualModelPlaceholder": "Enter model ID manually",
      "addManualModel": "Add",
      "mainModel": "Main model",
      "setMainModel": "Set as main",
      "editModel": "Edit model",
      "removeModel": "Remove model",
      "editTitle": "Edit model",
      "displayName": "Display name",
      "contextLength": "Context length",
      "maxOutput": "Max output",
      "imageInput": "Image input",
      "audioInput": "Audio input",
      "reasoning": "Reasoning",
      "cancelEdit": "Cancel",
      "saveEdit": "Save",
      "invalidNumber": "Enter a valid positive integer",
      "utility": "Utility Model",
      "utilityHint": "Summaries, fact extraction — pick a fast, cheap model",
      "utilityLarge": "Utility Large",
      "utilityLargeHint": "Memory compilation, deep analysis — pick a capable model",
      "back": "Back",
      "next": "Next"
    },
    "theme": {
      "title": "Pick a Theme",
      "subtitle": "You can always change it later in Settings",
      "back": "Back",
      "next": "Next"
    },
    "workspace": {
      "title": "Create a Workspace",
      "subtitle": "The default workspace will be OH-WorkSpace on your Desktop.\nYou can choose another existing folder.",
      "defaultLabel": "Default workspace",
      "customLabel": "Chosen workspace",
      "defaultHint": "If you do not choose another folder, this directory will be created automatically.\nPatrol is off by default and can be enabled later in settings.",
      "choose": "Choose folder",
      "useDefault": "Use default",
      "back": "Back",
      "next": "Next",
      "saving": "Saving..."
    },
    "tutorial": {
      "title": "All Set ✿",
      "memory": {
        "title": "Memory",
        "desc": "I remember key points from your conversations. Older, less-referenced memories fade naturally, just like ours."
      },
      "skills": {
        "title": "Skills",
        "desc": "I can read/write files, run commands, and search the web. Manage more skills in Settings."
      },
      "workspace": {
        "title": "Workspace",
        "desc": "Set a folder as your workspace and I can help manage your projects and files."
      },
      "jian": {
        "title": "Jian",
        "desc": "Drop a jian.md in any folder with your instructions.\nI'll pick it up during patrol and execute automatically."
      },
      "agents": {
        "title": "Multi-Agent Collaboration",
        "desc": "Different agents can take on separate tasks and hand work off.\nUseful for breaking down complex work."
      },
      "finish": "Let's Go"
    }
  },
  "activity": {
    "title": "Activity",
    "empty": "No activity yet. Patrol runs and scheduled tasks will appear here.",
    "back": "Back",
    "heartbeat": "Routine patrol",
    "subagent": "Sub-agent task",
    "cron": "Scheduled task",
    "automationRuns": "Custom automations",
    "patrolRuns": "Patrols",
    "otherRuns": "Other background work",
    "agentTabs": "Filter activity by Agent",
    "previousAgent": "Show previous Agents",
    "nextAgent": "Show more Agents",
    "categoryTabs": "Filter by activity type",
    "emptyForCategory": "No activity in this category yet.",
    "patrolDone": "Patrol completed",
    "cronDone": "Scheduled task completed",
    "error": "Execution error",
    "viewSession": "Expand run",
    "expand": "Expand run",
    "collapse": "Collapse run",
    "loadingSession": "Loading this background session...",
    "sessionLoadFailed": "This background session cannot be loaded right now.",
    "noSessionMessages": "No messages to show for this background session.",
    "duration": "Took {text}",
    "promote": "Keep as chat"
  },
  "automation": {
    "title": "Scheduled Tasks",
    "empty": "No scheduled tasks yet.\nThe assistant will create them when needed.",
    "emptyForAgent": "No scheduled tasks for this Agent yet.",
    "agentTabs": "Filter automations by Agent",
    "previousAgent": "Show previous Agents",
    "nextAgent": "Show more Agents",
    "draftTitle": "Automation draft",
    "suggestionTitle": "Suggestion",
    "suggested": "Suggested",
    "viewSuggestion": "View suggestion",
    "openDraft": "Open automation draft",
    "closeDraft": "Close automation draft",
    "confirmCreate": "Confirm",
    "confirmUpdate": "Update",
    "defaultModel": "Default model",
    "add": "Add automation",
    "enable": "Enable",
    "disable": "Disable",
    "newAutomation": "New automation",
    "newPrompt": "",
    "promptPlaceholder": "Write what you want {agent} to do",
    "promptRequired": "Write what the Agent should do before enabling this automation.",
    "createFailed": "Failed to create automation",
    "agentRequired": "Choose an Agent first",
    "field": {
      "label": "Name",
      "agent": "Agent",
      "scheduleType": "Type",
      "schedule": "Time",
      "prompt": "Run prompt"
    },
    "schedule": {
      "at": "Once",
      "every": "Every",
      "unit": "Unit",
      "time": "Time",
      "hour": "Hour",
      "minute": "Minute",
      "weekday": "Day",
      "monthDay": "Date",
      "dateTime": "Date and time",
      "cronExpression": "Cron expression",
      "onceAt": "Once: {date}",
      "advancedCron": "Advanced Cron: {cron}",
      "mode": {
        "interval": "Every interval",
        "daily": "Daily",
        "weekly": "Weekly",
        "monthly": "Monthly",
        "once": "Once",
        "advanced": "Advanced Cron"
      },
      "unitLabel": {
        "minutes": "minutes",
        "hours": "hours",
        "days": "days"
      }
    },
    "executor": {
      "agentSession": "Agent",
      "notify": "Notify",
      "pluginAction": "Plugin action",
      "directAction": "Direct action"
    },
    "edit": "Edit",
    "delete": "Delete"
  },
  "ctx": {
    "cut": "Cut",
    "copy": "Copy",
    "paste": "Paste",
    "selectAll": "Select All"
  },
  "rightWorkspace": {
    "activity": {
      "title": "Activity"
    },
    "todo": {
      "title": "Progress",
      "waitForOutput": "Wait for output to finish"
    },
    "subagent": {
      "title": "Sub-agents"
    },
    "workflow": {
      "title": "Workflow",
      "running": "Running {text}",
      "agents": "{n} agents"
    },
    "session": {
      "title": "This Conversation",
      "cwd": "Workspace",
      "model": "Model",
      "files": "Files",
      "authorizedFolders": "Authorized folders",
      "addAuthorizedFolder": "Add authorized folder"
    },
    "tabs": {
      "label": "Right workspace",
      "sessionFiles": "Conversation Files",
      "workspace": "Workspace"
    },
    "sessionFiles": {
      "title": "Conversation Files",
      "empty": "This conversation has not created or uploaded any files yet.",
      "actions": {
        "preview": "Preview",
        "open": "Open",
        "reveal": "Reveal",
        "downloadToDevice": "Download to this device",
        "copyPath": "Copy path",
        "copySelectedPaths": "Copy {n} paths",
        "sendToBridge": "Send to...",
        "sendToBridgeLoading": "Loading Bridge conversations...",
        "sendToBridgeEmpty": "No Bridge conversation available",
        "sendToBridgeLoadFailed": "Failed to load Bridge conversations"
      },
      "bridgeLoadFailed": "Failed to load Bridge conversations: {error}",
      "sendSuccess": "Sent to {target}",
      "sendFailed": "Failed to send to {target}: {error}",
      "list": "Conversation file list",
      "sort": {
        "label": "Sort conversation files",
        "timeDesc": "Time ↓",
        "nameAsc": "Name ↑",
        "nameDesc": "Name ↓",
        "typeAsc": "Type ↑"
      },
      "status": {
        "available": "Available",
        "expired": "Expired"
      }
    },
    "jian": {
      "collapse": "Collapse Jian",
      "expand": "Expand Jian"
    }
  },
  "desk": {
    "title": "Desk",
    "workspaceTitle": "Workspace",
    "skills": "Skills",
    "cwdSkills": "Project Skills",
    "cwdSkillsEmpty": "No project skills in this folder",
    "cwdSkillsHint": "Create a .agents/skills/ directory to get started",
    "cwdSkillsDesc": "Skills follow workspace",
    "cwdSkillsDrop": "Drop folder or .zip to install skills",
    "deleteSkill": "Delete Skill",
    "openInFinder": "Open Folder",
    "jianLabel": "Jian",
    "jianPlaceholder": "Write something to tell the assistant how to handle files in this folder...",
    "execLogLabel": "Execution Log",
    "execLogDelete": "Delete this entry",
    "emptyTitle": "Desk is empty",
    "emptyHint": "The desk is the assistant's patrol workspace and the default directory for every chat.\nSet a folder in settings.",
    "goToSettings": "Go to Settings",
    "fileLabel": "file",
    "openWithDefault": "Open with default app",
    "refresh": "Refresh",
    "newMarkdownFileName": "Untitled.md",
    "newFolder": "New Folder",
    "ctx": {
      "open": "Open",
      "openInFinder": "Open Folder",
      "rename": "Rename",
      "copyPath": "Copy Path",
      "delete": "Delete",
      "deleteSelected": "Delete {count} items",
      "deleteN": "Delete {n} items",
      "newMdFile": "New Markdown Document",
      "newFolder": "New Folder"
    },
    "deleteConfirm": "Move \"{name}\" to the system Trash?",
    "deleteSelectedConfirm": "Move {count} selected items to the system Trash?",
    "trashFailed": "Failed to move item to the system Trash",
    "createFailed": "Create failed",
    "renameInvalid": "File names cannot contain path separators",
    "renameFailed": "Rename failed",
    "sort": {
      "label": "Sort",
      "mtime": "Modified",
      "nameAsc": "Name A→Z",
      "nameDesc": "Name Z→A",
      "size": "File size",
      "type": "File type",
      "mtimeShort": "Time",
      "nameAscShort": "Name↑",
      "nameDescShort": "Name↓",
      "sizeShort": "Size",
      "typeShort": "Type"
    },
    "filter": {
      "label": "Filter",
      "images": "Images",
      "text": "Text",
      "videos": "Videos",
      "clear": "Clear filter",
      "activeShort": "{count} types"
    },
    "search": {
      "placeholder": "Search workspace",
      "label": "Search workspace files",
      "results": "Search results",
      "empty": "No matching files",
      "root": "Root"
    }
  },
  "window": {
    "minimize": "Minimize",
    "maximize": "Maximize",
    "close": "Close"
  },
  "browser": {
    "using": "Using browser",
    "close": "Close browser",
    "closeBtn": "Close",
    "back": "Back",
    "forward": "Forward",
    "reload": "Reload",
    "newTab": "New Tab",
    "closeTab": "Close tab",
    "emergencyStop": "Emergency stop AI control",
    "backgroundHint": "Background browser running, click to view",
    "background": "Background browser"
  },
  "bridge": {
    "selectChat": "Select a conversation",
    "noSessions": "No conversations yet",
    "noMessages": "No messages yet",
    "empty": "No messages",
    "notConfigured": "{platform} not configured",
    "goToSettings": "Go to Settings",
    "resetContext": "Reset context",
    "resetContextTip": "Next message will start a new conversation",
    "replyInterrupted": "(Reply interrupted — the content above may be incomplete)",
    "replyFailed": "(Reply generation failed. Please try again later.)",
    "sessionBusy": "The desktop session is still responding, please try again later"
  },
  "notification": {
    "turnCompletionBody": "This turn is complete"
  },
  "error": {
    "pathsRequired": "paths array is required",
    "tooManyFiles": "Too many files (max {max}, got {n})",
    "pathNotFound": "Path not found",
    "missingParam": "Missing {param} parameter",
    "invalidJson": "Request body must be a JSON object",
    "sessionNotFound": "Session file not found",
    "stillStreaming": "{name} is still responding, please wait",
    "agentNameEmpty": "Agent name cannot be empty",
    "agentIdInvalid": "Agent ID contains invalid characters",
    "agentAlreadyExists": "Agent \"{id}\" already exists",
    "agentSwitching": "Agent switch in progress, please wait",
    "agentNotFound": "Agent \"{id}\" not found or not initialized",
    "agentModelNotAvailable": "Model \"{model}\" configured for agent \"{id}\" is not available",
    "agentDeleteActive": "Cannot delete the currently active agent",
    "agentNotExists": "Agent \"{id}\" does not exist",
    "modelNoResponse": "Model returned no content. Please check API configuration and network connection.",
    "noActiveSession": "No active session",
    "compacting": "Compaction in progress",
    "waitForReply": "Please wait for the response to finish before compacting",
    "compactFailed": "Compaction failed: {msg}",
    "maxImages": "Maximum {max} images allowed",
    "maxVideos": "Maximum {max} videos allowed",
    "maxAudios": "Maximum {max} audio files allowed",
    "unsupportedImageFormat": "Unsupported image format: {mime}",
    "unsupportedVideoFormat": "Unsupported video format: {mime}",
    "unsupportedAudioFormat": "Unsupported audio format: {mime}",
    "imageTooLarge": "Single image must not exceed 20MB",
    "videoTooLarge": "Single video must not exceed 20MB",
    "audioTooLarge": "Single audio file must not exceed 50MB",
    "viewImage": "(view image)",
    "viewVideo": "(view video)",
    "listenAudio": "(listen to audio)",
    "modelNoVision": "Current model does not support images. Please switch to a vision-capable model",
    "searchProviderNotConfigured": "Search provider not configured",
    "searchProviderMissingKey": "Search provider \"{provider}\" is missing API Key",
    "searchProviderUnknown": "Unknown search provider: {provider}",
    "searchFailed": "Search failed: {msg}",
    "searchEmptyQuery": "Please provide a search query.",
    "searchNoResults": "No relevant results found. (via {provider})",
    "searchResults": "Search results (via {provider}):\n\n{results}",
    "searchError": "Search error: {msg}",
    "fetchEmptyUrl": "Please provide a URL to fetch.",
    "fetchHttpOnly": "Only http/https URLs are supported.",
    "fetchInvalidUrl": "Invalid URL: {url}",
    "fetchSsrf": "Access to internal network address denied: {host}",
    "fetchRedirectLimit": "Redirect limit exceeded ({max})",
    "fetchHttpError": "Fetch failed: HTTP {status} {statusText}",
    "fetchTruncated": "\n\n[... content truncated, {len} characters total]",
    "fetchSource": "Source: {host}{path} ({format})\n\n",
    "fetchTimeout": "Fetch timeout ({sec}s): {url}",
    "fetchError": "Fetch error: {msg}",
    "browserError": "Error: {msg}",
    "browserAlreadyRunning": "Browser is already running",
    "browserLaunched": "Browser launched",
    "browserNotRunning": "Browser is not running",
    "browserClosed": "Browser closed",
    "browserNavigateNeedUrl": "navigate requires url parameter",
    "browserNavigated": "Navigated to {title}\nURL: {url}\n\n{snapshot}",
    "browserClickNeedRef": "click requires ref parameter",
    "browserClicked": "Clicked [{ref}]\n\n{snapshot}",
    "browserTypeNeedText": "type requires text parameter",
    "browserTyped": "Typed text{target}\n\n{snapshot}",
    "browserScrollNeedDir": "scroll requires direction parameter (up/down)",
    "browserScrolled": "Scrolled {dir}\n\n{snapshot}",
    "browserSelectNeedRef": "select requires ref parameter",
    "browserSelectNeedValue": "select requires value parameter",
    "browserSelected": "Selected [{ref}] → \"{value}\"\n\n{snapshot}",
    "browserKeyNeedKey": "key requires key parameter",
    "browserKeyPressed": "Pressed {key}\n\n{snapshot}",
    "browserWaitDone": "Wait complete\n\n{snapshot}",
    "browserEvalNeedExpr": "evaluate requires expression parameter",
    "browserOutputTruncated": "\n\n[... output truncated]",
    "browserShown": "Browser window brought to front",
    "browserUnknownAction": "Unknown action: {action}",
    "browserActionFailed": "Browser action failed: {msg}",
    "browserSessionUnavailable": "The browser instance for this session is unavailable{reason}. Start the browser again before continuing.",
    "skillNeedAbsolutePath": "Absolute path required",
    "skillPathNotExists": "Path does not exist",
    "skillMissingSkillMd": "SKILL.md not found in folder",
    "skillUnsupportedFormat": "Only .zip or .skill files are supported",
    "skillMissingSkillMdInZip": "SKILL.md not found in archive",
    "skillExtractFailed": "Extraction failed: {msg}",
    "skillMissingName": "Missing name field in SKILL.md",
    "skillNameInvalid": "Invalid skill name (\"{name}\"). Only letters, numbers, underscores, and hyphens are allowed.",
    "skillPathMustBeAbsolute": "Path must be absolute: {path}",
    "skillCannotAddSelfDir": "Cannot add HanaAgent's own skills directory",
    "skillInvalidName": "Invalid skill name",
    "skillExternalCannotDelete": "External skills cannot be deleted from here",
    "skillNotExists": "Skill does not exist",
    "channelsDisabled": "Channel system is disabled by the user",
    "channelReadNeedChannel": "Error: read requires channel parameter",
    "channelNotExists": "Channel \"{channel}\" does not exist",
    "agentNotChannelMember": "You are not a member of channel \"{channel}\" and cannot send messages",
    "channelNoMessages": "(No messages in channel)",
    "channelPostNeedParams": "Error: post requires channel and content parameters",
    "channelPosted": "Sent to #{channel}",
    "channelCreateNeedParams": "Error: create requires name and members parameters",
    "channelCreated": "Channel #{name} ({id}) created, members: {members}",
    "channelCreateFailed": "Creation failed: {msg}",
    "channelNoJoined": "Not joined any channels yet",
    "unknownAction": "Unknown action: {action}",
    "cannotSelfDm": "Cannot send DM to yourself",
    "dmSent": "DM sent to {name}",
    "agentNotFoundAvailable": "Agent \"{id}\" not found. Use the agent's id field value (not the display name). Available:\n{ids}",
    "noOtherAgents": "No other agents are currently available.",
    "cronNoJobs": "No scheduled tasks",
    "cronAddNeedParams": "Error: add requires scheduleType, schedule, prompt parameters",
    "cronEveryMustBeNumber": "Error: schedule for every type must be a positive integer (milliseconds)",
    "cronCreated": "Scheduled task created: {label} ({id})",
    "cronConfirmed": "User confirmed, scheduled task created: {label} ({id})",
    "cronRejected": "User cancelled scheduled task \"{label}\"",
    "cronTimeout": "Scheduled task \"{label}\" confirmation timed out",
    "cronPendingConfirm": "Ready to create scheduled task: {label}, awaiting confirmation",
    "cronRemoveNeedId": "Error: remove requires id parameter",
    "cronJobNotFound": "Task {id} not found",
    "cronRemoved": "Task {id} removed",
    "cronToggleNeedId": "Error: toggle requires id parameter",
    "cronToggled": "Task {id} {state}",
    "cronEnabled": "enabled",
    "cronDisabled": "disabled",
    "notifySent": "Notification sent: {title}",
    "notifyFailed": "Notification failed: {msg}",
    "artifactCreated": "Preview created: {title}",
    "pinnedAlreadyExists": "This is already in pinned memory.",
    "pinnedAdded": "Remembered: {content}",
    "pinnedEmpty": "Pinned memory is empty, nothing to remove.",
    "pinnedNotFound": "No pinned memory containing \"{keyword}\" found.",
    "pinnedRemoved": "Removed {count} items: {items}",
    "expEmpty": "Experience library is empty.",
    "expCategoryNotFound": "No experience found for category \"{category}\".",
    "expEmptyInput": "Category name and experience content cannot be empty.",
    "expDuplicate": "This experience has already been recorded.",
    "expRecorded": "Experience recorded [{category}]: {content}",
    "expPaused": "Experience is paused.",
    "outputFileNeedPaths": "filepaths array or filePath is required.",
    "outputFileNotAbsolute": "Path must be absolute: {path}",
    "outputFileNotFound": "File not found: {path}",
    "outputFilePresented": "Files presented: {summary}",
    "settingsUnknownKey": "Unknown setting \"{key}\". Use search to find the correct key.",
    "settingsInvalidValue": "\"{value}\" is not a valid option. Available: {options}",
    "settingsInvalidToggle": "Toggle settings only accept \"true\" or \"false\".",
    "settingsNotReady": "Settings system not ready",
    "settingsNoAgent": "No active agent, cannot modify this setting",
    "settingsApplied": "Changed \"{label}\" to {value}",
    "settingsApplyFailed": "Settings change failed: {msg}",
    "settingsCancelled": "User cancelled change of \"{label}\"",
    "settingsTimeout": "\"{label}\" change confirmation timed out, no changes made",
    "subagentMaxConcurrent": "{max} sub-agents are already running, please wait before starting new ones.",
    "subagentParentSessionRequired": "subagent requires an active parent session and deferred task store; cannot create a continuable instance in this context.",
    "subagentWriteAccessDenied": "Cannot grant write access: the parent session is in read-only mode, and a subagent's permission may not exceed its parent. Switch the session to an operable mode and retry, or re-dispatch with access:\"read\".",
    "subagentFailed": "Sub-agent execution failed: {msg}",
    "subagentTimeout": "Sub-agent timed out after {minutes} minutes",
    "subagentAborted": "Sub-agent was aborted",
    "subagentNoOutput": "(Sub-agent produced no output)",
    "subagentProducedFiles": "Sub-agent produced file output:\n{files}",
    "subagentStopError": "Sub-agent failed before completing the task.",
    "subagentStopLength": "Sub-agent did not finish cleanly (stopReason: length, output limit reached).",
    "subagentStopReason": "Sub-agent did not finish cleanly (stopReason: {reason}).",
    "subagentToolFailed": "Sub-agent tool failed: {msg}",
    "subagentDispatched": "Sub-task dispatched (task-id: {taskId}). Results will be delivered when ready.",
    "subagentThreadQueued": "Sub-task dispatched (task-id: {taskId}). Instance {threadId} is busy; queued to run after the current task finishes.",
    "subagentThreadClosed": "Sub-agent instance closed: {threadId}",
    "installSkillDisabled": "Skill installation is not enabled. Please enable \"Allow Agent to create/install skills\" in settings.",
    "installSkillGithubDisabled": "GitHub skill fetching not enabled. Please enable \"Allow fetching skills from GitHub\" in settings.",
    "installSkillInvalidGithubUrl": "Invalid GitHub URL: {url}",
    "installSkillGithubApiFailed": "Cannot retrieve repo info (HTTP {status}). Please check the URL.",
    "installSkillGithubApiError": "GitHub API access failed: {msg}",
    "installSkillStarTooLow": "This repo only has {stars} stars (threshold {min}), installation rejected for safety.",
    "installSkillNoSkillMd": "SKILL.md not found in {owner}/{repo} (tried paths: {paths}).",
    "installSkillSafetyFailed": "[Security] Skill safety review failed, installation blocked.\nReason: {reason}\n\nPlease inform the user about the safety review failure and the specific reason. Users can disable safety reviews in settings (not recommended).",
    "installSkillNameInvalid": "Invalid skill name{name}. Only letters, numbers, underscores, and hyphens are allowed.",
    "installSkillSuccess": "Skill \"{name}\" installed successfully!\nSource: {source} (⭐ {stars} stars)\nReason: {reason}",
    "installSkillNeedInput": "Please provide github_url or skill_content (SKILL.md content).",
    "installSkillNeedName": "skill_name is required when using skill_content mode.",
    "installSkillSuccessLocal": "Skill \"{name}\" installed successfully!\nReason: {reason}",
    "installSkillSizeLimit": "Skill content exceeds size limit ({size}KB > {max}KB)",
    "installSkillNoUtility": "Safety review unavailable: utility model not configured. Please configure it in settings.",
    "installSkillUtilityIncomplete": "Safety review unavailable: utility model config incomplete (missing API key or base URL). Please complete it in settings.",
    "installSkillSafetyPassed": "✓ Safety review passed",
    "installSkillSafetyEmpty": "Safety review returned empty response",
    "installSkillSafetyUnexpected": "Safety review returned unexpected format: {reply}",
    "installSkillSafetyTimeout": "Safety review timeout or network error",
    "activeSessionOnly": "Can only promote sessions of the current agent",
    "heartbeatTriggered": "Heartbeat triggered",
    "dirNotAllowed": "Directory not in allowed scope",
    "noWorkspace": "No workspace configured",
    "tokenSuccess": "Token obtained successfully",
    "verifyFailed": "Verification failed",
    "tokenFetchFailed": "Failed to obtain access_token",
    "botInfoFailed": "Failed to get bot info",
    "platformTestUnsupported": "Testing not supported for this platform",
    "codexNoHealthCheck": "Codex API does not support health check",
    "modelNotFound": "Model not found: {id}",
    "noUtilityModel": "Utility model not configured, please add one in settings",
    "noUtilityLargeModel": "utility_large model not configured, please add one in settings",
    "modelNoProvider": "{role} model \"{model}\" has no provider association",
    "providerMissingApi": "Provider \"{provider}\" missing API protocol config",
    "providerMissingCreds": "Provider \"{provider}\" missing credentials",
    "utilityApiProviderMismatch": "utility_api.provider must match the provider of model \"{model}\"",
    "utilityApiMissingCreds": "utility_api missing credentials (provider: {provider})",
    "noAvailableModel": "No available models. Please configure API key and models in settings first",
    "noActiveSessionPrompt": "No active session, please call createSession() first",
    "sessionNotInCache": "Session \"{path}\" not in cache",
    "agentNotInitialized": "Agent \"{id}\" does not exist or is not initialized",
    "resolveModelNoChatModel": "resolveModel: models.chat not specified, cannot select model",
    "resolveModelNotAvailable": "resolveModel: Model \"{id}\" not in available list",
    "executeIsolatedNoModel": "executeIsolated: Agent \"{name}\" has no available model",
    "bridgeAgentNoChatModel": "[bridge] Agent \"{name}\" has no models.chat configured",
    "bridgeAgentModelNotAvailable": "[bridge] Model \"{model}\" configured for agent \"{name}\" is not in available list",
    "noAgentsFound": "No agents found in agents/ directory, please create one first",
    "channelNotFoundById": "Channel \"{id}\" does not exist",
    "channelAlreadyExists": "Channel \"{id}\" already exists",
    "providerMissingBaseUrl": "Provider \"{provider}\" missing Base URL",
    "providerMissingApiKey": "Provider \"{provider}\" missing API Key",
    "modelNameEmpty": "Model name cannot be empty",
    "modelNotRegistered": "Model \"{model}\" not registered with any provider in models.json",
    "modelProviderMissingApi": "Provider \"{provider}\" for model \"{model}\" missing API protocol config",
    "modelProviderIncomplete": "Provider \"{provider}\" for model \"{model}\" has incomplete config",
    "browserDesktopOnly": "Browser is only available in Electron desktop mode",
    "browserCmdTimeout": "Browser command timed out: {cmd}",
    "agentExecNotInit": "Agent \"{id}\" does not exist or is not initialized",
    "bridgeMgrNotStarted": "Bridge manager not started",
    "qqTokenFailed": "Failed to get access_token: {detail}",
    "missingApiProtocol": "Missing API protocol config",
    "missingApiKey": "Missing API Key",
    "unsupportedApiProtocol": "Unsupported API protocol: {api}",
    "missingModelId": "Missing model ID",
    "missingBaseUrl": "Missing Base URL",
    "llmInvalidJson": "LLM returned unparseable JSON ({status})",
    "llmEmptyResponse": "LLM returned empty content",
    "xlsxParseFailed": "Cannot parse {ext} file: {msg}",
    "docxParseFailed": "Cannot parse {ext} file: {msg}",
    "compatDirCreated": "Created {count} missing directories",
    "compatConfigEmpty": "File is empty",
    "compatConfigInvalid": "Does not appear to be YAML format",
    "compatConfigCorrupted": "config.yaml corrupted ({msg}), rebuilt from template",
    "compatConfigBackedUp": "config.yaml corrupted ({msg}), backed up as {backup}",
    "compatFactsCorrupted": "facts.db corrupted and backed up, will rebuild empty database",
    "defaultChannelName": "Crew",
    "defaultChannelDesc": "Work coordination channel for daily tasks.",
    "memorySearchLabel": "Search Memory",
    "memorySearchDesc": "Search the memory bank. Use when you are unsure about something, think you discussed it before but cannot recall details, or need more context. Input natural language queries and optional tag filters. Results include matching meta-facts and timestamps.",
    "memorySearchQueryDesc": "Search query in natural language",
    "memorySearchTagsDesc": "Tag filter, 2-5 keyword tags for precise matching, e.g. [\"chocolate\", \"food preference\"]",
    "memorySearchDateFromDesc": "Start date, format YYYY-MM-DD",
    "memorySearchDateToDesc": "End date, format YYYY-MM-DD",
    "memorySearchCrossChannelDesc": "Whether to search memories from other channels. Defaults to false: a channel session only sees the current channel and general memories; pass true explicitly when needed",
    "memorySearchEmpty": "No relevant content found in memory.",
    "memorySearchError": "Memory search error: {msg}",
    "fallbackUserName": "User",
    "uploadFailed": "Failed to import files",
    "uploadPartialFail": "Some files could not be imported: {files}",
    "stopTaskNotFound": "Task {taskId} not found — it may have already completed",
    "stopTaskAlready": "Task {taskId} has already been stopped",
    "stopTaskNoHandler": "Task {taskId} does not support stopping",
    "stopTaskDone": "Task {taskId} has been stopped",
    "regionUnavailable": "This area is temporarily unavailable"
  },
  "main": {
    "tray": {
      "show": "Show HanaAgent",
      "settings": "Settings",
      "quit": "Quit"
    },
    "dialog": {
      "selectFolder": "Select Working Folder",
      "selectSkill": "Select Skill",
      "selectPlugin": "Select Plugin",
      "launchFailedTitle": "HanaAgent Launch Failed",
      "launchFailedBody": "HanaAgent v{version}\n\n{detail}\n\nDetailed log saved to:\n{logPath}\n\nPlease send this screenshot or log file to the developer.",
      "serverRestartFailed": "HanaAgent v{version}\n\nServer crashed and failed to restart.\n{error}\n\nPlease restart the application.",
      "serverMultipleCrash": "HanaAgent v{version}\n\nServer crashed multiple times ({reason}).\n\nPlease restart the application.",
      "serverStartTimeout": "Server start timed out",
      "serverKilledBySignal": "Server killed by signal ({signal})",
      "serverExitedWithCode": "Server exited with code {code}",
      "serverFilesNotReady": "Auto-update just completed; new version files still landing on disk (missing {missing}). Waited {waited}s without success. Please restart HanaAgent shortly.",
      "serverModuleMissing": "Server startup failed: cannot find module {module}.\nThis typically happens right after an auto-update, while new files are still being written to disk.\nRecommendation: wait 1-2 minutes and restart HanaAgent. Report on GitHub if it persists.",
      "installFailedTitle": "HanaAgent Update",
      "installFailedBody": "Update installation failed:\n{error}\n\nPlease restart HanaAgent and try again, or check for updates manually in Settings."
    },
    "notification": {
      "ready": "Notifications enabled"
    }
  },
  "devtools": {
    "heartbeat": "Heartbeat",
    "memoryExport": "Memory Export",
    "onboarding": "Onboarding",
    "previewGuide": "Preview Guide",
    "reloadFrontend": "Reload Frontend",
    "tabLogs": "Activity Logs",
    "tabSessions": "Session List",
    "tabPrompt": "System Prompt",
    "waitingConnection": "Waiting for connection...",
    "waitingServer": "Waiting for Server...",
    "loading": "Loading...",
    "loadFailed": "Load failed",
    "refreshBtn": "Refresh",
    "clickRefresh": "Click Refresh above to load",
    "noActivities": "No activities yet",
    "heartbeatLabel": "Auto heartbeat",
    "cronLabel": "Scheduled task",
    "heartbeatRunning": "Heartbeat running...",
    "heartbeatGenerating": "Generating summary...",
    "heartbeatDone": "Heartbeat completed",
    "heartbeatNoSummary": "Heartbeat completed (no summary)",
    "memoryExported": "Memory exported",
    "exportFailed": "Export failed",
    "onboardingOpened": "Onboarding window opened",
    "previewOpened": "Preview mode opened",
    "openFailed": "Open failed",
    "frontendReloaded": "Frontend reloaded",
    "refreshFailed": "Refresh failed",
    "triggerFailed": "Trigger failed",
    "requestFailed": "Request failed",
    "justNow": "Just now",
    "minutesAgo": "{n} min ago",
    "hoursAgo": "{n} hr ago",
    "chars": " chars",
    "empty": "empty",
    "serverConnected": "Server connected (port {port})"
  },
  "skillViewer": {
    "cantRead": "Cannot read file",
    "copied": "Copied to skill list",
    "installFailed": "Install failed: "
  },
  "toolDef": {
    "todoWrite": {
      "summaryEmpty": "Cleared todos",
      "summaryStats": "{total} todos: {completed} completed, {in_progress} in progress, {pending} pending"
    },
    "updateSettings": {
      "searchResult": "Found {count} matching setting(s):\n\n{results}\n\nUse action \"apply\" with key and value to change a setting.",
      "searchNoResults": "No settings matching \"{query}\". Try a broader keyword.",
      "searchMissingQuery": "The search action requires a query parameter.",
      "applyMissingParams": "The apply action requires both key and value parameters.",
      "frontendOnly": "client-side only",
      "sandbox": "Sandbox Security",
      "sandboxDesc": "Restrict file system write scope",
      "sandboxNetwork": "Sandbox Network",
      "sandboxNetworkDesc": "Allow sandboxed commands to access the public internet; Windows command sandboxing does not support network isolation and always keeps the current user's network access",
      "locale": "Language",
      "timezone": "Timezone",
      "timezoneDesc": "IANA timezone (e.g. Asia/Shanghai)",
      "bridgeMediaPublicBaseUrl": "Bridge File Public URL",
      "bridgeMediaPublicBaseUrlDesc": "Public HTTP/HTTPS base URL used by external platforms to fetch local staged files. Usually provided by a reverse proxy or tunnel. Leave empty to fall back to HANA_BRIDGE_PUBLIC_BASE_URL.",
      "computerUse": "Computer Use",
      "computerUseDesc": "When enabled, new conversations expose the computer tool to the primary Agent. When disabled, new conversations cannot see it, and frozen old conversations are rejected if they call it.",
      "thinkingBudget": "Thinking Depth",
      "memory": "Memory System",
      "memoryDesc": "Enable/disable memory for current Agent",
      "experience": "Experience",
      "experienceDesc": "Enable/disable the current Agent's experience library",
      "agentName": "Agent Name",
      "userName": "User Name",
      "workingDir": "Working Directory",
      "workingDirDesc": "Agent file system working directory",
      "theme": "Theme",
      "chatModel": "Chat Model",
      "fileBackup": "File Backup",
      "fileBackupDesc": "Auto-backup files before AI modifications"
    },
    "generateImage": {
      "description": "Generate images from text descriptions. Non-blocking: returns immediately after submission, displays automatically when complete.",
      "promptDesc": "Image description (Chinese or English)",
      "countDesc": "Number of concurrent generations, default 1, max 9",
      "imageDesc": "Reference image path (image-to-image)",
      "referenceImagesDesc": "Array of reference image paths. Use this for multiple references; single-image calls can keep using image. The selected adapter may cap the count with maxReferenceImages.",
      "ratioDesc": "Aspect ratio: 1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3, 21:9",
      "resolutionDesc": "Unified resolution tier: 1k, 2k, 4k; adapter maps to the closest vendor size",
      "qualityDesc": "Quality tier: low, medium, high, auto (adapter maps to vendor parameters)",
      "modelDesc": "Model ID or short name (e.g. 5.0, dall-e-3). Uses configured default when omitted",
      "providerDesc": "Specify provider (optional)",
      "suggestedFilenameDesc": "Short human filename hint for generated files, without extension. Use a concise slug or title, not the full prompt.",
      "submitted": "Submitted {count} image generation(s); results will appear in the card below when complete."
    },
    "generateVideo": {
      "description": "Generate videos from text descriptions. Non-blocking: returns immediately after submission, displays automatically when complete.",
      "promptDesc": "Video description (Chinese or English)",
      "imageDesc": "Reference image path (image-to-video)",
      "durationDesc": "Video duration 4-15 seconds (default 5)",
      "ratioDesc": "Aspect ratio: 1:1, 16:9, 9:16, 4:3, 3:4, 21:9",
      "modelDesc": "Model version: seedance2.0, seedance2.0fast (default seedance2.0)",
      "providerDesc": "Specify provider (optional)",
      "notInitialized": "Video generation plugin not initialized",
      "noProvider": "No available video generation provider",
      "submitFailed": "Video submission failed: {error}",
      "submitFailedUnknown": "Video submission failed: unknown error",
      "submitted": "Video generation submitted; result will appear in the card below when complete."
    },
    "getCoverStyleGuide": {
      "description": "When the user wants to generate, replace, or optimize a cover/header image for a Markdown document, call this tool first to read Hana's cover aesthetic guidelines; then write an image prompt or select an image based on the article content.",
      "themeToneDesc": "Current UI theme brightness; pass light when unsure.",
      "userGuidanceDesc": "Additional style direction from the user, optional.",
      "workflow": {
        "step1": "Confirm target Markdown path",
        "step2": "Call beautify_get-cover-style-guide",
        "step3": "Read the article and write an image prompt or select an image per the style guide",
        "step4": "Prepare existing images",
        "step5": "Call beautify_create-cover to apply the image"
      }
    },
    "getHtmlStyleGuide": {
      "description": "Call this before generating any full-page HTML (web page, landing page, report, typeset article) to get Hana's default aesthetic guide. Call with no arguments for the section router; pass section to fetch real guidance section by section (color and typography are required reading). This tool only returns guidance text — it does not generate or save HTML, and it is unrelated to in-chat interactive cards.",
      "sectionDesc": "The guide section to fetch. Omit to get the router (applicability + principles + section index, with no directly usable values)."
    },
    "applyCoverCandidate": {
      "description": "Apply an existing image file as a Markdown cover and write it back to frontmatter.",
      "targetFilePathDesc": "Absolute path to the Markdown file.",
      "generatedFilePathDesc": "Absolute path to an existing image, which can come from image generation tools, built-in covers, or user local images.",
      "pixelWidthDesc": "Image pixel width, optional.",
      "pixelHeightDesc": "Image pixel height, optional.",
      "targetFilePathRequired": "targetFilePath must be an absolute path to a Markdown file.",
      "generatedFilePathRequired": "generatedFilePath must be an absolute path to an image file.",
      "applied": "Cover applied and written to Markdown frontmatter.",
      "failed": "Failed to apply cover: {error}"
    },
    "createCover": {
      "description": "Apply an existing image as a Markdown Notion-like cover. To generate a new cover, first call beautify_get-cover-style-guide, then call the image generation tool to prepare the image, and finally use this tool to write it into the Markdown.",
      "targetFilePathDesc": "Absolute path to the Markdown file. Confirm with the user first if the path is uncertain.",
      "filePathDesc": "Compatibility alias for targetFilePath.",
      "generatedFilePathDesc": "Absolute path to an existing image, which can come from image generation tools, built-in covers, or user local images.",
      "imageFilePathDesc": "Compatibility alias for generatedFilePath.",
      "pixelWidthDesc": "Image pixel width, optional; the tool will try to read it from the image header if not provided.",
      "pixelHeightDesc": "Image pixel height, optional; the tool will try to read it from the image header if not provided.",
      "targetFilePathRequired": "An explicit absolute path to a Markdown file is required; if initiated from a regular chat, please confirm the target file path first.",
      "mustBeMarkdown": "Target file must be a .md Markdown file.",
      "generatedFilePathRequired": "An absolute path to an existing image (generatedFilePath) is required. Please call image-gen_generate-image first and wait for the task to complete, or select a built-in/local image, then pass the image filePath to this tool.",
      "applied": "Image applied as Markdown cover and written to frontmatter.",
      "failed": "Failed to apply cover: {error}"
    },
    "listCapabilities": {
      "description": "List the aesthetic enhancement capabilities currently supported by the Beautify tool.",
      "text": "Beautify currently offers two capabilities. 1) Markdown cover workflow: read the cover style guide first, prepare an image (from image-gen, a future built-in gallery, or a local file), then copy it into the attachments folder and write the cover frontmatter. 2) Full-page HTML aesthetic guide: before generating web pages / typeset pages / reports, call beautify_get-html-style-guide for Hana's default art direction (no-arg call returns the router, then fetch sections on demand)."
    }
  },
  "cli": {
    "disconnected": "Disconnected",
    "wsError": "WebSocket error: {msg}",
    "error": "Error: {msg}",
    "interrupted": "(interrupted)",
    "goodbye": "Goodbye ✿",
    "helpTitle": "Command List",
    "helpModel": "View current model",
    "helpModelSet": "Switch model (interactive)",
    "helpConfig": "View config",
    "helpSessionNew": "New session",
    "helpSessionList": "List sessions",
    "helpAgent": "View current agent",
    "helpAgentList": "List all agents",
    "helpAgentSwitch": "Switch agent",
    "helpJian": "View notes in current directory",
    "helpJianSub": "View notes in subdirectory",
    "helpLs": "List desk files",
    "helpLsSub": "List subdirectory files",
    "helpCat": "View file content",
    "helpHelp": "Show this help",
    "helpEsc": "Interrupt generation",
    "helpCtrlC": "Interrupt / Exit",
    "noModels": "No available models",
    "availableModels": "Available models:",
    "currentModel": "← current",
    "selectModel": "Enter number to select: ",
    "modelSwitched": "Switched to {name}",
    "cancelled": "Cancelled",
    "currentModelLabel": "Current model:",
    "noModel": "(none)",
    "currentConfig": "Current Config",
    "notSet": "(not set)",
    "sessionCreated": "New session created",
    "noSessions": "No sessions",
    "sessionList": "Session List",
    "untitled": "(untitled)",
    "sessionUsage": "Usage: /session new | /session list",
    "agentList": "Agent List",
    "agentSwitched": "Switched to {name}",
    "currentAgent": "Current Agent:",
    "jianTitle": "Notes",
    "jianEmpty": "No notes in this directory",
    "dirEmpty": "(empty)",
    "catUsage": "Usage: /cat <file path>",
    "catFailed": "Cannot read: {status}",
    "unknownCommand": "Unknown command: /{cmd}  Type /help for help",
    "inputHelp": "Type /help to see commands"
  },
  "sandbox": {
    "blocked": "[Security] {reason}\n\nThis operation was blocked by HanaAgent's sandbox security policy. This means the command crossed a path or permission boundary. Check the current workspace, the exact path syntax, and whether the target file belongs in an allowed workspace or session path. Explain the blocked path and reason to the user; discuss changing sandbox settings only if the user explicitly decides to do that.",
    "noSudo": "sudo is not allowed",
    "noSu": "su user switching is not allowed",
    "noChmod": "Changing file permissions is not allowed",
    "noChown": "Changing file ownership is not allowed",
    "noDelRecursive": "Recursive file deletion (del /s) is not allowed",
    "noRmdirRecursive": "Recursive directory deletion (rmdir /s) is not allowed",
    "noRegEdit": "Registry modification is not allowed",
    "noTakeown": "Taking file ownership is not allowed",
    "noIcacls": "Modifying file ACL permissions is not allowed",
    "noNetUser": "User/group management is not allowed",
    "noSchtasks": "Creating scheduled tasks is not allowed",
    "noScService": "Operating system services is not allowed",
    "noPsExecutionBypass": "Bypassing PowerShell execution policy is not allowed",
    "noFormat": "Formatting disks is not allowed",
    "noBcdedit": "Modifying boot configuration is not allowed",
    "noWmic": "WMI commands are not allowed",
    "restrictedPath": "Command accessed a restricted path: {path}",
    "writeRestricted": "[Security] File system writes are restricted to allowed workspace and session paths. Check the current workspace and path syntax before asking the user whether to change sandbox settings.",
    "osRequired": "[sandbox] Standard mode requires OS-level sandbox, but current platform does not support it ({platform}). Please install sandbox-exec (macOS) or bubblewrap (Linux), or switch to full-access mode.",
    "opRead": "Read",
    "opWrite": "Write",
    "opDelete": "Delete",
    "denied": "{op} denied: {path} (access level: {level})"
  },
  "error.llmTimeout": "Model request timed out",
  "error.llmRateLimited": "Model rate limited, please wait",
  "error.llmEmptyResponse": "Model returned empty response",
  "error.llmAuthFailed": "Model authentication failed",
  "error.llmSlowResponse": "Model is responding slowly, please wait",
  "error.fsPermission": "File permission denied",
  "error.fsNotFound": "File not found",
  "error.fsCopyFailed": "File copy failed",
  "error.wsDisconnected": "Connection lost",
  "error.fetchTimeout": "Request timed out",
  "error.fetchServerError": "Server error",
  "error.ipcFailed": "Internal communication error",
  "error.renderCrash": "Display error",
  "error.configParse": "Configuration file corrupted",
  "error.bridgeSendFailed": "Failed to send message to platform",
  "error.skillSyncFailed": "Skill sync failed",
  "error.memoryCompileFailed": "Memory compilation failed",
  "error.dbError": "Database error",
  "error.serverAuthFailed": "Authentication failed",
  "error.unknown": "An unexpected error occurred",
  "error.regionUnavailable": "This area is temporarily unavailable",
  "status.reconnecting": "Reconnecting...",
  "status.disconnected": "Connection lost",
  "status.reconnect": "Reconnect",
  "action.retry": "Retry",
  "subagentAbort": "Stop",
  "subagentAborted": "Stopped",
  "preview.toggle": "Preview panel",
  "preview.markdownPreview": "Preview",
  "preview.exitMarkdownPreview": "Back to editing",
  "preview.markdownEditorStatus": "Selected {selected} chars · Total {total} chars",
  "preview.markdownAttachmentInsertFailed": "Failed to insert attachment",
  "subagent": {
    "status": {
      "interrupted": "Interrupted",
      "aborted": "Stopped",
      "done": "Done",
      "failed": "Failed",
      "dispatched": "Dispatched",
      "preparing": "Preparing...",
      "thinking": "Thinking...",
      "callingTool": "Calling {name}...",
      "executing": "Executing..."
    }
  },
  "computerUse": {
    "overlay": {
      "foregroundTakeover": "Foreground Takeover",
      "foregroundMessage": "The target app does not support background operation; foreground takeover is active. Press Esc to force quit."
    }
  },
  "plugin": {
    "widget": {
      "loadFailed": "Load failed",
      "retry": "Retry",
      "hiddenPlugins": "Hidden plugins",
      "show": "Show",
      "desk": "Desk",
      "hideTitle": "Hide \"{title}\""
    },
    "page": {
      "notFound": "Plugin not found",
      "loadFailed": "Plugin load failed",
      "retry": "Retry"
    },
    "tab": {
      "pinToBar": "Pin to tab bar"
    },
    "imageGen": {
      "notInitialized": "Image generation plugin not initialized",
      "noSessionPath": "Image generation requires an explicit session context; the current tool call is missing sessionPath",
      "noProvider": "No available image generation provider",
      "noTaskIdOrFile": "Image generation provider returned neither taskId nor files",
      "unknownError": "unknown error",
      "providerUnavailable": "Specified image generation provider \"{providerId}\" is unavailable",
      "providerUnavailableDetail": "Specified image generation provider \"{providerId}\" is unavailable: {detail}",
      "modelUnavailable": "Specified image generation model \"{modelId}\" is unavailable",
      "modelUnavailableDetail": "Specified image generation model \"{modelId}\" is unavailable: {detail}",
      "noConfiguredModel": "no configured image generation model available",
      "modelNotFound": "model not found: {modelId}",
      "noRegisteredProtocol": "no registered protocol: {protocolId}",
      "multipleProvidersSameModel": "multiple providers have the same model name; please also specify provider",
      "modelNotInMediaProvider": "model not found in any media provider",
      "referenceImageLimitExceeded": "Image generation provider \"{providerId}\" supports at most {max} reference image(s); received {count}",
      "providerNoApiKey": "Provider \"{providerId}\" has no API Key configured. Please configure it in Settings → Providers.",
      "providerNotLoggedIn": "Provider \"{providerId}\" is not logged in. Please log in to OpenAI Codex in Settings → Providers.",
      "apiKeyNotConfigured": "API Key not configured",
      "volcengineUnsupportedFormat": "Volcengine Seedream only supports png/jpeg output format, not \"{format}\"",
      "volcengineAdapterName": "Volcengine Seedream"
    },
    "beautify": {
      "coverStyleGuide": "Hana Markdown cover default aesthetic guidelines:\n\n1. Art style: modern Anime / animated movie key visual; do not use traditional Eastern stereotypical symbols as the default style.\n2. Texture: strong paper texture, print grain, fine particles, warm material feel; like a frame bound into a paper book.\n3. Narrative: cinematic, story-driven, literary atmosphere; prefer real scenes, character actions, lighting, prop relationships, and environmental traces to express the theme.\n4. Content: extract imagery themes after reading the article; visualize the article's temperament rather than illustrating the summary word-for-word.\n5. Fantasy: starry skies, fantasy, and literary imagery may appear, but must be naturally carried by the scene with real-world weight and emotional justification.\n6. Restraint: avoid cheap AI-style floating symbol accumulation; surreal elements appear only when narratively necessary.\n7. Theme: light mode uses soft warm light, low contrast, clean whitespace, visible paper fiber; dark mode uses low illumination, restrained highlights, dark areas preserving material layers.\n8. Output: default to landscape 3:2 from the image generation tool; if the vendor doesn't support it, a close landscape ratio is acceptable, but never stretch the image.",
      "htmlStyleGuide": {
        "router": "Hana HTML aesthetic discipline. Before generating any full-page HTML, fetch the sections below first; do not generate from this router text alone. This discipline only covers standalone full-page HTML (web pages, typeset pages, reports, landing pages) — it is unrelated to in-chat interactive cards.\n\nApplicability: if the user explicitly specified a style, follow the user — this discipline steps aside (backstopping readability only). If the user specified nothing, follow this discipline.\n\nTemperament: literary, refined, serene — like a page from a finely bound private journal. Imagery: paper manuscripts, Song-style serif type, ink wash, xuan-paper texture, bookish calm.\n\nFive principles:\n1. Born of paper: spacing reads as page margins, color reads as ink density.\n2. Restraint is quality: prefer a single line over a box, transparency layering over stacked solids.\n3. Quiet feedback: hover is a gentle breath, transitions are soft fades; no bouncing, no flashing.\n4. Hierarchy is order: build hierarchy with font size / weight / lightness / containers. Pure typesetting for reading pages, card grouping for structural pages.\n5. Consistency is trust: same elements keep the same size / spacing / behavior across the page.\n\nSection index (fetch each via beautify_get-html-style-guide with the section parameter):\n- color: REQUIRED\n- typography: REQUIRED\n- layout: required for full pages / multi-block / complex layouts\n- components: when using cards / tables / buttons / badges / links (read it whenever the page contains <a>)\n- imagery: when icons / images are present\n- motion: for interactive pages / anything animated\n- anti-patterns: strongly recommended — avoids the cheap AI look",
        "color": "Hana HTML aesthetics · color\n\n**Single accent color**: `#537D96` (slate blue), hover `#456A80`, light wash `rgba(83,125,150,.08)`. The only chromatic accent on the whole page — never introduce a second primary; keep the accent's visual share ≤ 5%, punctuation rather than paint.\n\n**Backgrounds (never pure white)**: page base `#F8F4ED` (warm paper), cards / raised surfaces `#FCFAF5`. Keep overall contrast low.\n\n**Text (warm neutrals, no cold blue-gray)**: primary `#3B3D3F`, secondary `#6B6F73`, muted / metadata `#8E9196`. Never pure black `#000`.\n\n**Lines and borders**: hairlines in a warm tone `rgba(122,96,88,.18)`. Prefer lines + whitespace to divide regions, not solid blocks.\n\n**Overlays (transparency layering, not solid stacking)**: four steps `rgba(0,0,0,.03 / .05 / .08 / .15)`.\n\n**Semantic colors (low saturation, restrained)**: success `#7BAE7F`, danger `#8B3A3A`, coral accent `#EC8F8D` (use sparingly). Only when necessary.\n\n**Hard rules**: grays must be warm (with a tan undertone), cold blue-grays are forbidden; no large pure-white backgrounds / pure-black text; no gradient backdrops, high saturation, or neon.\n\nThis guide defines only the single warm-paper palette. When the user explicitly asks for dark mode or another style, follow the user's explicit direction (this guide steps aside, backstopping readability and contrast only).",
        "typography": "Hana HTML aesthetics · typography\n\n**Serif (the workhorse, carrying heading and body hierarchy)**: `'EB Garamond','Noto Serif SC','Source Han Serif SC','Songti SC','STSong','SimSun',serif`\n\nThe system fallbacks in the stack (`Songti SC` / `SimSun` / serif, etc.) stay as a backstop: characters the preceding fonts don't cover fall back to the system serif without breaking the layout.\n\n**UI / functional text (buttons, labels, forms, navigation)**: `system-ui,-apple-system,'PingFang SC',sans-serif`\n\n**Code / numeric metrics**: `'JetBrains Mono',ui-monospace,monospace`; add `font-variant-numeric:tabular-nums` for digit alignment.\n\n**Font weight**: 400 / 500 only. No 600+, no synthetic bold; build hierarchy with size + lightness + letter spacing, not piled-on boldness.\n\n**Type scale**:\n\n| Level | rem | Usage |\n|---|---|---|\n| display | 2 – 2.4 | page main title / hero |\n| h1 | 1.6 | chapter heading |\n| h2 | 1.25 | section heading (optionally with a left rule `border-left:2px solid #537D96;padding-left:8px;border-radius:0`) |\n| h3 | 1.05 | sub-heading |\n| body | 1 (16px) | body text, `line-height:1.7` |\n| small | 0.85 | auxiliary / caption |\n\n**Mixed CJK / Latin text**: Chinese serif body takes a slightly taller line-height (1.7 – 1.8); CJK headings may add `letter-spacing:.01em`.",
        "layout": "Hana HTML aesthetics · layout\n\n**Spacing rhythm**: `4 / 8 / 16 / 24 / 40`. No magic values outside the scale.\n\n**Content width**: reading body `max-width:60–72ch` (about 680–760px), centered; landing pages may run wider, but every text region still keeps a readable line length.\n\n**Whitespace**: 40 between blocks, 16 – 24 inside a block. Whitespace is a hierarchy tool, not waste.\n\n**Responsive**: single column on mobile, larger line spacing, touch targets ≥ 44px; narrow-screen breakpoints ~880 / ~480.\n\n**Layout modes (pick one per content type)**:\n\n| Type | Orientation | Means |\n|---|---|---|\n| Reading / editorial | pure typesetting layers | whitespace + type scale, no cards; centered body with readable line length |\n| Structural / dashboard | cards / grouping | `#FCFAF5` cards + hairline borders; group headings |\n| Landing / showcase | editorial hero + sections | large title + restrained imagery + the single accent as punctuation; no marketing clutter |\n| Interactive | centered content, restrained controls | quiet motion, clear states |\n\nUse pure typesetting for continuous reading to keep the flow; use cards for dense functional scenes to strengthen the blocks. Pick one — never both.",
        "components": "Hana HTML aesthetics · components\n\nBackground variables follow the color section. The defaults are below.\n\n```css\n/* 区块标题 */\nh2 { font-family: serif; font-size: 1.25rem; font-weight: 500; color: #3B3D3F;\n     border-left: 2px solid #537D96; padding-left: 8px; border-radius: 0; margin: 1.6em 0 .6em; }\n\n/* 卡片 / 面板（仅结构型场景用） */\n.card { background: #FCFAF5; border: 1px solid rgba(122,96,88,.18); border-radius: 4px;\n        padding: 1rem 1.25rem; }\n\n/* 分隔线 */\nhr { border: none; border-top: 1px solid rgba(122,96,88,.18); margin: 1.5rem 0; }\n\n/* 表格：细线、紧凑、左对齐表头 */\ntable { width: 100%; border-collapse: collapse; font-size: .9rem; }\nth { text-align: left; font-weight: 500; color: #6B6F73; padding: 6px 8px;\n     border-bottom: 1px solid rgba(122,96,88,.18); }\ntd { padding: 5px 8px; border-bottom: 1px solid rgba(0,0,0,.05); color: #3B3D3F; }\ntr:last-child td { border-bottom: none; }\n\n/* 列表 */\nul, ol { padding-left: 18px; }\nli { margin: .2em 0; }\nli::marker { color: #537D96; }\n\n/* 引用 */\nblockquote { border-left: 2px solid #537D96; padding: 4px 0 4px 12px;\n             color: #6B6F73; font-style: italic; border-radius: 0; }\n\n/* 代码 */\npre { background: #F8F4ED; border: 1px solid rgba(122,96,88,.18); border-radius: 4px;\n      padding: 8px 12px; overflow-x: auto; }\ncode { font-family: 'JetBrains Mono', ui-monospace, monospace; font-size: .85rem; color: #3B3D3F; }\n\n/* 按钮：方角、描边优先、hover 微底色，无 :active 缩放 */\n.btn { font-family: sans-serif; border: 1px solid rgba(122,96,88,.18); border-radius: 4px;\n       background: transparent; color: #537D96; padding: 6px 14px; cursor: pointer;\n       transition: background .15s cubic-bezier(.16,1,.3,1); }\n.btn:hover { background: rgba(83,125,150,.08); }\n/* 主行动按钮可用 background:#537D96;color:#FCFAF5 实色，但每屏 ≤ 1 个 */\n\n/* 徽章 / 标签 */\n.tag { display: inline-flex; padding: 2px 8px; font-size: .75rem; font-weight: 500;\n       border-radius: 4px; background: rgba(83,125,150,.08); color: #456A80; }\n\n/* 链接：accent 色 + 细下划线，hover 加深；不按钮化、不去下划线 */\na { color: #537D96; text-decoration: underline; text-decoration-thickness: 1px;\n    text-underline-offset: 2px; text-decoration-color: rgba(83,125,150,.4);\n    transition: color .15s cubic-bezier(.16,1,.3,1), text-decoration-color .15s cubic-bezier(.16,1,.3,1); }\na:hover { color: #456A80; text-decoration-color: currentColor; }\n\n/* focus：可见但克制（motion 章节原则的具体值） */\n:focus-visible { outline: 1px solid #537D96; outline-offset: 2px; }\n```\n\n**Depth and shadows**: build hierarchy primarily with hairlines + whitespace + slight background shifts; when elevation is needed, use the faintest shadow `box-shadow: 0 1px 4px rgba(59,61,63,.09)`. Heavy drop shadows, glow, and multi-layer drop-shadow are forbidden.",
        "imagery": "Hana HTML aesthetics · imagery\n\n- **Icons**: pure inline SVG, stroke-based line style (feather-like), `stroke=\"currentColor\" stroke-width=\"1.5\" fill=\"none\"`. **No emoji**, no solid fill icons.\n- **Decoration**: no piles of floating symbols / stars / bubbles or other cheap AI garnish; a faint-glow motif (soft, never dazzling) may appear sparingly as punctuation.\n- **Image ratios**: hero 16:9, editorial illustration 4:3, grid thumbnails 3:2; `object-fit:cover` + a sensible `object-position`, never stretch.\n- **Corner radius**: images / cards take a small 4px radius (square-leaning); no large pill rounding.\n- **When no real image assets exist**: **never hotlink external image hosts** (unsplash / picsum, etc. — privacy exposure, broken images offline). For placeholders use solid blocks (`#FCFAF5` + hairline border) or self-drawn inline SVG (linear, low saturation, conforming to the color section); prefer whitespace over external links. User-provided local / existing assets are exempt.",
        "motion": "Hana HTML aesthetics · motion\n\n- **Quiet**: transitions are soft and brief. Use the three duration steps `0.1 / 0.15 / 0.25`; easing `cubic-bezier(.16,1,.3,1)` for entrances, `cubic-bezier(.7,0,.84,0)` for exits.\n- **Hover is a gentle breath** (slight color / opacity shift), no scaling, no bouncing.\n- **Forbidden**: `:active` scale bounces, flashing, spinning showmanship, auto-carousels grabbing attention.\n- **States are clear and predictable**: focus gets a visible but restrained indicator (see :focus-visible in the components section for the exact values); disabled states lower opacity.\n- Respect `prefers-reduced-motion: reduce` and turn off non-essential motion.",
        "antiPatterns": "Hana HTML aesthetics · anti-patterns\n\n| ❌ Avoid | ✅ Use instead |\n|---|---|\n| Material Design feel / ripples | the restraint of a paper journal |\n| glassmorphism frosted glass, blur showmanship | solid grounds + hairlines |\n| large pure-white `#fff` backgrounds | warm paper `#F8F4ED` |\n| pure-black `#000` text | warm ink `#3B3D3F` |\n| cold blue-gray neutrals | warm-toned grays |\n| a second primary / piled-up colors | the single accent `#537D96` |\n| neon, high saturation, gradient backdrops | low saturation, low contrast |\n| heavy drop shadows / glow | the faintest shadow, or hairlines only |\n| large pill rounding | square corners / small 4px radius |\n| emoji as icons / decoration | SVG stroke icons |\n| 600+ bold to pile up hierarchy | size + lightness + 400/500 |\n| bounce / scale / spin animations | soft fades, breathing |\n| piles of floating decorative symbols | whitespace + restrained faint glow |",
        "mustReadFirst": "Read the required sections before fetching {section}. You have not fetched: {missing}. Fetch those required sections first via beautify_get-html-style-guide (every Hana page needs them), then come back for {section}.",
        "invalidSection": "Unknown section {section}. Valid sections: {valid}. Call without section to get the router."
      },
      "themeTone": {
        "dark": "Dark theme: low illumination, restrained highlights, dark areas still preserving paper fiber and material layers.",
        "light": "Light theme: soft warm light, low contrast, clean whitespace, visible paper fiber."
      },
      "userGuidancePrefix": "User additional direction: {guidance}",
      "attachmentDirName": "Attachments"
    }
  },
  "preview": {
    "cover": {
      "saveImage": "Save image",
      "regenerateWithPrompt": "Generate image with custom prompt",
      "deleteCover": "Delete cover"
    }
  },
  "mediaViewer": {
    "ariaLabel": "Media preview",
    "close": "Close",
    "prev": "Previous",
    "next": "Next"
  },
  "action": {
    "retry": "Retry"
  },
  "mobile": {
    "auth": {
      "scopeError": "Current login lacks workspace access. Please re-enter the access key.",
      "loginFailed": "Login failed",
      "title": "Mobile Access to Hana",
      "deviceHelp": "Enter the access key generated by the desktop app for this device. After login, an HttpOnly session cookie takes over.",
      "passwordHelp": "Sign in with the local account set up on the desktop app. Plaintext HTTP on LAN will be rejected by the server; use localhost, HTTPS, or a trusted tunnel.",
      "tabLabel": "Login method",
      "deviceTab": "Access Key",
      "passwordTab": "Username & Password",
      "deviceField": "Access Key",
      "usernameField": "Username",
      "passwordField": "Password",
      "plaintextWarning": "Remote plaintext connections do not accept username/password, to avoid exposing long-lived credentials on LAN or tunnels.",
      "submit": "Sign In"
    },
    "loading": "Connecting to Hana...",
    "closeSidebar": "Close sidebar",
    "update": {
      "available": "A new Hana version is ready",
      "reload": "Refresh"
    }
  },
  "approval": {
    "toolAction": {
      "title": "Allow Hana to perform this action",
      "body": "The current session is in ask-first mode. This action would modify local or external state."
    },
    "confirm": "Approve",
    "reject": "Deny",
    "computerApp": {
      "title": "Allow Hana to use the computer",
      "body": "Hana wants to control this app to continue the current task."
    },
    "sessionFolders": {
      "title": "Allow Hana to modify folder authorization for this conversation",
      "body": "Once confirmed, this folder will become an additional sandbox directory for the current conversation. It will not change the working directory or modify prompts.",
      "addLabel": "Add authorized directory",
      "removeLabel": "Remove authorized directory"
    }
  },
  "auth": {
    "oauthTimeout": "OAuth timed out: no browser callback received. Please check whether port 1455 is blocked by a firewall or already in use. Windows users should also verify that localhost is not resolving to IPv6.",
    "oauthConnectFailed": "Cannot connect to OAuth server{detail}. Please configure the global outbound proxy in Settings > Security, or check the HTTPS_PROXY environment variable."
  },
  "deferred": {
    "typeLabel": {
      "subagent": "Sub-assistant",
      "imageGeneration": "Image generation",
      "videoGeneration": "Video generation",
      "backgroundTask": "Background task"
    },
    "interlude": {
      "subagent": {
        "success": "{receiver} received a reply from {source}",
        "failed": "{receiver} received a reply from {source}",
        "aborted": "{receiver} received a reply from {source}"
      },
      "workflow": {
        "success": "{receiver} received results from {source} workflow",
        "failed": "{receiver} received results from {source} workflow",
        "aborted": "{receiver} received results from {source} workflow"
      },
      "tool": {
        "success": "{receiver} received results from {source} tool",
        "failed": "{receiver} received results from {source} tool",
        "aborted": "{receiver} received results from {source} tool"
      }
    },
    "noReason": "The background task did not return a displayable reason.",
    "noPreviewText": "The background task completed but did not return previewable text.",
    "fileSummaryMore": "- {count} more files",
    "fileSummaryHeader": "Generated files:",
    "mediaNoDisplayableFiles": "Generation result has no displayable files"
  }
}
