export default { aiChat: { // ── Conversation sidebar ── sidebarTitle: 'Chats', newConversation: 'New chat', doubleClickToRename: 'Double-click to rename', generating: 'Generating…', archive: 'Archive', unarchive: 'Unarchive', pinConversation: 'Pin', unpinConversation: 'Unpin', moreActions: 'More actions', archived: 'Archived', archivedCount: 'Archived ({n})', emptyConversation: 'No conversations', // UX-06 §3.1: conversation search (live title filter, Ctrl+K to focus) searchPlaceholder: 'Search chats…', searchEmpty: 'No matching chats', searchShortcutHint: 'Ctrl+K', // ── Time grouping (sidebar) ── today: 'Today', yesterday: 'Yesterday', earlier: 'Earlier', groupEmpty: 'None', // ── Header buttons ── conversationList: 'Chat list', maximize: 'Maximize', pendingApprovalCount: '{n} pending', pendingApprovalHint: 'Click to jump to the first pending approval', restoreSidebar: 'Restore sidebar', sidebarResizeHint: 'Drag to resize sidebar', detachWindow: 'Detach window', closePanel: 'Close panel', dockRight: 'Dock to main window right', undock: 'Undock', pinOnTop: 'Pin on top', unpin: 'Unpin', closeWindow: 'Close window', // ── Provider status ── clickToSwitchProvider: 'Click to switch provider', providerNotConfigured: 'No AI provider configured. Please add one in settings.', notConfigured: 'Not configured', // ── F-01 阶段6: model picker (auto/specify toggle + dropdown) ── autoMode: 'Auto', specifyMode: 'Specify', autoModeHint: 'Auto mode: router picks the best model per scenario', specifyModeHint: 'Specify mode: use the selected model, overriding the router (main chat only)', selectModel: 'Select model', noModels: 'No models available. Please fetch in settings.', // ── Empty states (UX-2025-20: example prompt cards + no-provider guidance) ── emptyNoProvider: 'No AI provider configured', emptyNoProviderHint: 'Please add a provider in settings to start chatting', emptyTitle: 'Chat with AI assistant', emptyHint: 'Try "create a project" or "list all tasks"', // Example prompt cards: click to fill and send (4 prompts, DevFlow scenarios) examplePrompt1: 'Analyze this project’s dependencies', examplePrompt2: 'Help me write a workflow node', examplePrompt3: 'List all current tasks', examplePrompt4: 'Generate a project idea', goToSettings: 'Open settings', goToSettingsHint: 'The detached window cannot open settings directly. Configure AI providers on the main window’s Settings page.', // ── Provider switch feedback (UX-2025-14) ── providerSwitched: 'Switched to {model}', providerSwitchHint: 'Current model: {model}', // ── Back to bottom ── backToBottom: 'Back to bottom', // ── Pending queue ── queueTitle: 'Queued {n}/10', clearQueue: 'Clear', // UX-260616-06/07: queue item edit + send now queueEdit: 'Edit', queueSave: 'Save', queueCancel: 'Cancel', queueSendNow: 'Send now', // ── Skill ── clearSkill: 'Clear skill', placeholderWithSkill: 'Skill selected. Type arguments and press Enter', placeholderDefault: "Type a message... (/ for skills, {'@'} to mention)", skillNoMatch: 'No matching skill', skillNotLoaded: 'No local skills loaded', // ── UX-10: @ entity mention (@ opens popover, select inserts [Type:Name] token) ── mentionHint: "{'@'} to mention project/task", mentionGroupProject: 'Projects', mentionGroupTask: 'Tasks', mentionGroupIdea: 'Ideas', mentionNoMatch: 'No matching entity', mentionEmpty: 'No project/task to mention', // ── Send ── stopGenerating: 'Stop generating', // L2 状态机停止按钮三态(ConvState 派生) stopping: 'Stopping', stopFailedRetry: 'Stop failed, click to retry', // ── Input hint ── inputHint: 'Enter to send · Shift+Enter for newline', // ── F-260614-05 Phase 2b: image input (paste / drag-drop) ── removeImage: 'Remove image', imagePreviewAlt: 'Pending image', imageTooLarge: 'Image too large (max 10MB), skipped', imageLimit: 'Up to {n} images, extras ignored', imageReadFailed: 'Failed to read image', // ── Confirm dialog ── confirmDeleteConversation: 'Delete chat "{title}"? This cannot be undone.', // UX-260617-24: stronger warning when deleting the currently active conversation confirmDeleteActiveConversation: '"{title}" is the chat you are currently viewing. Deleting it will clear the current view and cannot be undone. Continue?', clearChat: 'Clear', confirmClearChat: 'Are you sure you want to clear all messages in this chat? This cannot be undone.', toastSendFail: 'Send failed: {msg}', // ── Message copy (F-260615-13) ── copyMsg: 'Copy message', copied: 'Copied', copyFailed: 'Copy failed', // ── Message actions bar (UX-02) ── regenerate: 'Regenerate', regenerateFailed: 'Regenerate failed: {msg}', regenerateUnavailable: 'No reply to regenerate', // ── UX-09: edit last user message and regenerate ── editMessage: 'Edit', editMessageFailed: 'Edit failed: {msg}', editNotLastUser: 'Only the last user message can be edited', placeholderEditing: 'Edit message then Enter to regenerate (Esc to cancel)', // ── Error bubble actions (UX-03 / UX-260616-01) ── retry: 'Retry', goToSettingsAction: 'Open settings', // ── F-260616-03: max iterations reached pause action card ── maxRoundsReached: 'Max rounds reached. Continue?', maxRoundsHint: 'Continue runs another full round; stop ends with current results', continueLoop: 'Continue', stopLoop: 'Stop', continueLoopFailed: 'Continue failed: {msg}', stopLoopFailed: 'Stop failed: {msg}', // ── L1 help protocol (aichat experience & agent capability redesign §2.3, 2026-06-21): circuit-breaker help card ── helpRequiredAck: 'Choice noted. Please rephrase your request to try another approach / continue', // ── F-260619-03 Phase B: path authorization dialog (LLM accessing dir outside whitelist) ── dirAuthRequired: 'Path authorization required', dirAuthHint: '{tool} wants to access: {path}', dirAuthOnce: 'This time', dirAuthSession: 'This session', dirAuthAlways: 'Always', dirAuthDeny: 'Deny', dirAuthFailed: 'Authorization failed: {msg}', // ── Input Augmentation layer: mention/skill injection feedback ── // search_files blind search denied by whitelist fallback (no auth dialog; prompt user to use @mention or absolute path) searchFilesBlocked: 'search_files only works inside authorized dirs. Use @[project] to reference or provide an absolute path.', // /skill hot reload (ai_reload_skills IPC) success toast skillReloaded: 'Skills reloaded', // @mention entity resolve failed (id points to a project/task/idea/skill that was deleted or unavailable) mentionUnresolved: 'The mentioned {kind} was deleted or is unavailable', // Same-name skill conflict (scan_skills returns conflicts; frontend warns, injection takes first by skills>commands>plugins priority) skillConflict: 'Skill "{name}" has multiple definitions; using skills priority', // ── ⑥.4 Phase 4: @project expansion summary (input area preview) ── enrichmentBadge: '📎 Referenced "{project}" ({tasks} tasks, {ideas} ideas)', enrichmentExpand: 'Show context preview', enrichmentCollapse: 'Hide context preview', enrichmentLabel: 'Context preview', // ── F-15 phase 2: manual context management (clear / compress) ── // Buttons (Header action area: trash + compress icon) clearContext: 'Clear context', compressContext: 'Compress context', // Confirm dialog (clear is semantically irreversible; history archived, not deleted) // Title "Clear context" folded into the lead sentence; stress irreversible + archived segment + AI no longer sees history clearContextConfirm: 'Clear context? This action is irreversible. The current chat context will be archived as a segment (the AI will no longer see these history messages). New chats are not affected.', // Danger button label for the confirm dialog (ConfirmDialog dangerLabel); falls back to common.confirm if omitted clearContextDangerLabel: 'Clear', // Collapsed separator (consecutive same-status merged into one bar; {n}=merged message count) contextArchived: 'Archived {n} messages', compressed: 'Context compressed', compressing: 'Compressing…', clearSuccess: 'Context cleared', compressSuccess: 'Context compressed', compressError: 'Compression failed: {msg}', clearError: 'Clear failed: {msg}', // Separator expand / collapse expand: 'Expand', collapse: 'Collapse', // Compressed summary block label (before the system summary message when expanded) compressedSummaryLabel: 'Context summary', // ── AE-2025-04 Session Trust ── // Auto-approval toast (same-session already approved same-kind op: same tool + same dir) autoApprovedToast: 'Auto-approved: {tool}({dir})', }, }