open-design/apps/web/src/i18n/locales/en.ts
nettee 3fb849d047
Fix chat runs surviving web disconnects (#146)
* fix chat runs surviving web disconnects

* fix chat run create abort propagation

Generated-By: looper 0.0.0-dev (runner=fixer, agent=openai/gpt-5.5)

* fix daemon keepalive reconnect budget

Generated-By: looper 0.0.0-dev (runner=fixer, agent=gpt-5.5)

* fix daemon stream disconnect cancellation

Generated-By: looper 0.0.0-dev (runner=fixer, agent=openai/gpt-5.5)

* fix daemon stream abort cancellation race

Generated-By: looper 0.0.0-dev (runner=fixer, agent=openai/gpt-5.5)

* fix daemon run cancellation semantics

* fix load

* doc

* 2

* add run refresh recovery

* fix active run refresh status

* fix reattach abort handling

* fix

* fix chat initial scroll

* fix daemon start failures

Generated-By: looper 0.2.7 (runner=fixer, agent=openai/gpt-5.5)

* fix background run recovery

Generated-By: looper 0.2.7 (runner=fixer, agent=openai/gpt-5.5)

* fix stop run status

Generated-By: looper 0.2.7 (runner=fixer, agent=openai/gpt-5.5)

* fix background run recovery

Generated-By: looper 0.2.7 (runner=fixer, agent=openai/gpt-5.5)

* extract daemon run service

* move prompt composition to daemon

* fix prompt module resolution

* fix project id generation

* add project run status

* add designs kanban view with awaiting_input status

- add grid/kanban view toggle on Designs tab; persist choice in localStorage
- introduce awaiting_input project display status (daemon-derived from
  unanswered <question-form>) so projects asking the user aren't shown
  as Completed; ordered between Running and Completed with amber accent
- hide transient queued state from users: coerce queued/starting to
  running in daemon /api/projects projection and drop the queued kanban
  column
- a11y polish on Designs cards: Space activation, aria-labels on delete,
  focus-visible outlines, reveal delete on focus-within and touch,
  prefers-reduced-motion handling
- kanban layout uses flex sizing instead of viewport math; scoped icon-
  only pill button rule fixes view-toggle icon alignment

---------

Co-authored-by: mrcfps <mrc@powerformer.com>
2026-04-30 20:16:46 +08:00

537 lines
23 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import type { Dict } from '../types';
export const en: Dict = {
'common.cancel': 'Cancel',
'common.save': 'Save',
'common.close': 'Close',
'common.delete': 'Delete',
'common.rename': 'Rename',
'common.preview': 'Preview',
'common.share': 'Share',
'common.search': 'Search',
'common.searchEllipsis': 'Search…',
'common.loading': 'Loading…',
'common.all': 'All',
'common.none': 'None',
'common.default': 'Default',
'common.installed': 'installed',
'common.notInstalled': 'not installed',
'common.active': 'active',
'common.offline': 'offline',
'common.selected': 'selected',
'common.create': 'Create',
'common.openPreview': 'Open preview',
'common.exitFullscreen': 'Exit fullscreen',
'common.fullscreen': 'Fullscreen',
'common.openInNewTab': 'Open in new tab',
'common.exportPdf': 'Export as PDF',
'common.exportZip': 'Download as .zip',
'common.exportHtml': 'Export as standalone HTML',
'common.justNow': 'just now',
'common.minutesAgo': '{n}m ago',
'common.hoursAgo': '{n}h ago',
'common.daysAgo': '{n}d ago',
'common.now': 'now',
'common.minutesShort': '{n}m',
'common.hoursShort': '{n}h',
'common.daysShort': '{n}d',
'common.untitled': 'Untitled',
'app.brand': 'Open Design',
'app.brandPill': 'Research Preview',
'app.brandSubtitle': 'by Nexu Labs',
'app.welcomeLoading': 'Loading workspace…',
'settings.welcomeKicker': 'Welcome',
'settings.welcomeTitle': 'Set up Open Design',
'settings.welcomeSubtitle':
"Pick how you'd like to run generations. You can change this any time from the Settings button in the top bar.",
'settings.kicker': 'Settings',
'settings.title': 'Execution & model',
'settings.subtitle':
'Choose between a local code-agent CLI and the Anthropic API (BYOK). Your API key is stored only in this browser.',
'settings.modeAria': 'Execution mode',
'settings.modeDaemon': 'Local CLI',
'settings.modeDaemonHelp': 'Run via a code-agent CLI on your machine',
'settings.modeDaemonOffline': 'Daemon is not running',
'settings.modeDaemonOfflineMeta': 'daemon offline',
'settings.modeDaemonInstalledMeta': '{count} installed',
'settings.modeApi': 'Anthropic API',
'settings.modeApiMeta': 'BYOK',
'settings.codeAgent': 'Code agent',
'settings.codeAgentHint':
'Detected by scanning your PATH. Pick the CLI you want generations to flow through.',
'settings.rescan': '↻ Rescan',
'settings.rescanTitle': 'Re-scan PATH',
'settings.noAgentsDetected':
'No agents detected yet. Install one of Claude Code, Codex, Gemini CLI, OpenCode, Cursor Agent, Qwen, or GitHub Copilot CLI, then click Rescan.',
'settings.apiSection': 'Anthropic API',
'settings.apiKey': 'API key',
'settings.showKey': 'Show key',
'settings.hideKey': 'Hide key',
'settings.show': 'Show',
'settings.hide': 'Hide',
'settings.model': 'Model',
'settings.baseUrl': 'Base URL',
'settings.apiHint':
'Calls go directly from this browser to the base URL you set. No proxy. The key never leaves localStorage.',
'settings.skipForNow': 'Skip for now',
'settings.getStarted': 'Get started',
'settings.envConfigure': 'Configure execution mode',
'settings.localCli': 'Local CLI',
'settings.anthropicApi': 'Anthropic API',
'settings.noAgentSelected': 'no agent selected',
'settings.language': 'Language',
'settings.languageHint': 'Switch the interface language. Saved to this browser.',
'settings.modelPicker': 'Model',
'settings.reasoningPicker': 'Reasoning effort',
'settings.modelPickerHint':
'Fetched from the CLI when it exposes a `models` command. "Default" leaves the choice to the CLIs own config; "Custom…" lets you type any model id the CLI accepts.',
'settings.modelCustom': 'Custom (type below)…',
'settings.modelCustomLabel': 'Custom model id',
'settings.modelCustomPlaceholder': 'e.g. anthropic/claude-sonnet-4-6',
'entry.tabDesigns': 'Designs',
'entry.tabExamples': 'Examples',
'entry.tabDesignSystems': 'Design systems',
'entry.openSettingsTitle': 'Settings',
'entry.openSettingsAria': 'Open settings',
'entry.resizeAria': 'Resize sidebar',
'entry.loadingWorkspace': 'Loading workspace…',
'newproj.tabPrototype': 'Prototype',
'newproj.tabDeck': 'Slide deck',
'newproj.tabTemplate': 'From template',
'newproj.tabOther': 'Other',
'newproj.titlePrototype': 'New prototype',
'newproj.titleDeck': 'New slide deck',
'newproj.titleTemplate': 'Start from a template',
'newproj.titleOther': 'New project',
'newproj.namePlaceholder': 'Project name',
'newproj.fidelityLabel': 'Fidelity',
'newproj.fidelityWireframe': 'Wireframe',
'newproj.fidelityHigh': 'High fidelity',
'newproj.toggleSpeakerNotes': 'Use speaker notes',
'newproj.toggleSpeakerNotesHint': 'Less text on slides — keep talking points in notes.',
'newproj.toggleAnimations': 'Include animations',
'newproj.toggleAnimationsHint':
'Add motion (entrance, hover, transitions) on top of the template.',
'newproj.templateLabel': 'Template',
'newproj.noTemplatesTitle': 'No templates yet',
'newproj.noTemplatesBody':
'Open any project, then use the Share menu inside the file viewer to convert it into a template. Templates show up here.',
'newproj.savedTemplate': 'Saved template',
'newproj.fileSingular': 'file',
'newproj.filePlural': 'files',
'newproj.create': 'Create',
'newproj.createFromTemplate': 'Create from template',
'newproj.createDisabledTitle':
'Save a project as a template first (Share menu inside any project).',
'newproj.importClaudeZip': 'Import Claude Design ZIP',
'newproj.importClaudeZipTitle': 'Import a Claude Design .zip export',
'newproj.importingClaudeZip': 'Importing…',
'newproj.privacyFooter': 'Only you can see your project by default.',
'newproj.designSystem': 'Design system',
'newproj.dsNoneFreeform': 'None — freeform',
'newproj.dsNoneSubtitleEmpty': 'No system tokens, choose your own palette',
'newproj.dsNoneSubtitleSelected': 'Skip system tokens. The agent picks its own palette.',
'newproj.dsCategoryFallback': 'Design system',
'newproj.dsSearch': 'Search design systems…',
'newproj.dsModeAria': 'Selection mode',
'newproj.dsModeSingle': 'Single',
'newproj.dsModeMulti': 'Multi',
'newproj.dsNoneTitle': 'None — freeform',
'newproj.dsNoneSub': 'Skip system tokens. The agent picks its own palette.',
'newproj.dsEmpty': 'No design systems match “{query}”.',
'newproj.dsFootSingular': 'is inspiration only.',
'newproj.dsFootPlural': 'are inspiration only.',
'newproj.dsFootClear': 'Clear',
'newproj.dsBadgeDefault': 'DEFAULT',
'newproj.dsPrimaryFallback': 'Primary',
'designs.subRecent': 'Recent',
'designs.subYours': 'Your designs',
'designs.filterAria': 'Filter projects',
'designs.searchPlaceholder': 'Search…',
'designs.emptyNoProjects': 'No projects yet. Create one on the left.',
'designs.emptyNoMatch': 'No projects match your search.',
'designs.deleteTitle': 'Delete project',
'designs.deleteConfirm': 'Delete "{name}"?',
'designs.cardFreeform': 'freeform',
'designs.status.notStarted': 'Not started',
'designs.status.queued': 'Queued',
'designs.status.running': 'Running',
'designs.status.awaitingInput': 'Needs input',
'designs.status.succeeded': 'Completed',
'designs.status.failed': 'Failed',
'designs.status.canceled': 'Canceled',
'designs.viewToggleAria': 'View mode',
'designs.viewGrid': 'Grid view',
'designs.viewKanban': 'Board view',
'designs.kanbanEmptyColumn': 'No designs',
'designs.deleteAria': 'Delete project {name}',
'examples.typeLabel': 'Type',
'examples.scenarioLabel': 'Scenario',
'examples.modeAll': 'All',
'examples.modePrototypeDesktop': 'Prototypes · Desktop',
'examples.modePrototypeMobile': 'Prototypes · Mobile',
'examples.modeDeck': 'Slides',
'examples.modeDocument': 'Docs & templates',
'examples.scenarioGeneral': 'General',
'examples.scenarioEngineering': 'Engineering',
'examples.scenarioProduct': 'Product',
'examples.scenarioDesign': 'Design',
'examples.scenarioMarketing': 'Marketing',
'examples.scenarioSales': 'Sales',
'examples.scenarioFinance': 'Finance',
'examples.scenarioHr': 'HR',
'examples.scenarioOperations': 'Operations',
'examples.scenarioSupport': 'Support',
'examples.scenarioLegal': 'Legal',
'examples.scenarioEducation': 'Education',
'examples.scenarioPersonal': 'Personal',
'examples.emptyNoSkills': 'No skills available. Is the daemon running?',
'examples.emptyNoMatch': 'No examples match these filters.',
'examples.openPreview': '⤢ Open preview',
'examples.loadingPreview': 'Loading preview…',
'examples.hoverPreview': 'Hover to preview',
'examples.usePrompt': 'Use this prompt',
'examples.previewModalTitle': 'Open full preview (modal)',
'examples.shareTitle': 'Share this example',
'examples.shareLoadFirst': 'Hover to load preview first',
'examples.shareMenu': 'Share ▾',
'examples.exportPdfAllSlides': 'Export as PDF (all slides)',
'examples.exportPptxLocked': 'Export as PPTX… (open template first)',
'examples.tagSlideDeck': 'Slide deck',
'examples.tagTemplate': 'Template',
'examples.tagDesignSystem': 'Design system',
'examples.tagMobilePrototype': 'Mobile prototype',
'examples.tagDesktopPrototype': 'Desktop prototype',
'examples.previewLabel': 'Preview',
'ds.searchPlaceholder': 'Search design systems…',
'ds.emptyNoMatch': 'No design systems match your search.',
'ds.badgeDefault': 'DEFAULT',
'ds.preview': 'Preview',
'ds.previewTitle': 'Preview design system',
'ds.categoryAll': 'All',
'ds.categoryUncategorized': 'Uncategorized',
'ds.showcase': 'Showcase',
'ds.tokens': 'Tokens',
'avatar.title': 'Account & settings',
'avatar.localCli': 'Local CLI',
'avatar.anthropicApi': 'Anthropic API',
'avatar.useLocal': 'Use Local CLI',
'avatar.useApi': 'Use Anthropic API',
'avatar.codeAgent': 'Code agent',
'avatar.rescan': 'Rescan PATH',
'avatar.settings': 'Settings',
'avatar.backToProjects': 'Back to projects',
'avatar.metaActive': 'active',
'avatar.metaOffline': 'offline',
'avatar.metaSelected': 'selected',
'avatar.noAgentSelected': 'no agent selected',
'avatar.modelSection': 'Model',
'avatar.modelLabel': 'Model',
'avatar.reasoningLabel': 'Reasoning',
'avatar.customSuffix': '(custom)',
'project.backToProjects': 'Back to projects',
'project.metaFreeform': 'freeform',
'chat.tabChat': 'Chat',
'chat.tabComments': 'Comments',
'chat.commentsSoon': 'Comments — coming soon',
'chat.conversationsTitle': 'Conversations',
'chat.conversationsAria': 'Conversation history',
'chat.newConversation': 'New conversation',
'chat.newConversationsTitle': 'New conversation',
'chat.conversationsHeading': 'Conversations',
'chat.new': 'New',
'chat.emptyConversations': 'No conversations yet.',
'chat.deleteConversation': 'Delete conversation',
'chat.deleteConversationConfirm':
'Delete "{title}"? This removes its messages.',
'chat.untitledConversation': 'Untitled conversation',
'chat.startTitle': 'Start a conversation',
'chat.startHint':
'Drop or paste images for visual reference, or type @ to attach a file from this project. Or try one of these starters:',
'chat.fillInputTitle': 'Click to fill the input',
'chat.jumpToLatest': 'Jump to latest',
'chat.scrollToLatest': 'Scroll to latest',
'chat.you': 'You',
'chat.openFile': 'Open {name}',
'chat.composerPlaceholder':
'Describe the design you want — paste or drop images, or @ a file…',
'chat.composerHint':
'⌘/Ctrl + Enter to send · paste images · @ to reference files',
'chat.cliSettingsTitle': 'CLI & model settings',
'chat.cliSettingsAria': 'Open CLI and model settings',
'chat.attachTitle': 'Attach files (or paste / drop)',
'chat.attachAria': 'Attach files',
'chat.importTitle': 'Import sources (coming soon)',
'chat.importLabel': 'Import',
'chat.importComingSoon': 'Coming soon',
'chat.importSoon': 'Soon',
'chat.importFig': 'Upload .fig file',
'chat.importGitHub': 'Connect GitHub',
'chat.importWeb': 'Grab web element',
'chat.importFolder': 'Link code folder',
'chat.importSkills': 'Skills and design systems',
'chat.importProject': 'Reference another project',
'chat.send': 'Send',
'chat.stop': 'Stop',
'chat.removeAria': 'Remove {name}',
'chat.example1Title': 'Editorial pitch deck',
'chat.example1Tag': 'Magazine',
'chat.example1Prompt':
'A 10-slide editorial pitch deck for a design studio raising a seed round — Swiss-grid layout, oversized serif headlines with bold drop caps, monospace section numbers, generous negative space, and full-bleed photo slides interleaved with text-heavy ones. Cover, vision, market, product, traction, team, ask, contact.',
'chat.example2Title': 'SaaS analytics dashboard',
'chat.example2Tag': 'Data',
'chat.example2Prompt':
'A dense analytics dashboard for a developer-tools SaaS — KPI strip with week-over-week deltas, two stacked line charts (MRR and active workspaces), a world heatmap of usage, a cohort retention grid, a top-customers leaderboard, and a real-time event feed. Dark theme, tabular monospace numerals, sparkline accents.',
'chat.example3Title': 'Annual report long-scroll',
'chat.example3Tag': 'Editorial',
'chat.example3Prompt':
'An interactive annual report for a climate non-profit — long-scroll editorial layout mixing big pull-quote blocks, data visualizations (stacked bars, animated counters, a choropleth map of project sites), photography breakers, donor wall, and a final call-to-action. Modern serif body, sans-serif chart labels, earthy paper palette.',
'preview.shareMenu': 'Share ▾',
'preview.openInNewTab': 'Open in new tab',
'preview.exit': '⤓ Exit',
'preview.fullscreen': '⤢ Fullscreen',
'preview.closeTitle': 'Close (Esc)',
'preview.loading': 'Loading {label}…',
'misc.savedTemplate': 'Saved template',
'misc.primary': 'Primary',
'misc.designSystem': 'Design system',
'workspace.designFiles': 'Design Files',
'workspace.closeTab': 'Close tab',
'workspace.deleteFileConfirm': 'Delete "{name}" from the project folder?',
'workspace.openFromDesignFiles': 'Open a file from',
'workspace.designFilesLink': 'Design Files',
'workspace.loadingSketch': 'Loading sketch…',
'designFiles.title': 'Design Files',
'designFiles.upload': 'Upload files',
'designFiles.pasteText': 'Paste as text file',
'designFiles.newSketch': 'New sketch',
'designFiles.empty':
'Nothing here yet. Drop files below, or create a sketch / paste text.',
'designFiles.refresh': 'Refresh',
'designFiles.delete': 'Delete',
'designFiles.searchPlaceholder': 'Search files…',
'designFiles.up': 'Up',
'designFiles.back': 'Back',
'designFiles.crumbs': 'project',
'designFiles.rowMenu': 'Row menu',
'designFiles.openInTab': 'Open in tab',
'designFiles.download': 'Download',
'designFiles.dropTitle': '⤓ Drop files here',
'designFiles.dropDesc':
'Images, docs, references, Figma links, or folders — Claude will use them as context.',
'designFiles.upload.title': 'Upload files',
'designFiles.paste.title': 'Paste text as a file',
'designFiles.upload.label': 'Upload',
'designFiles.paste.label': 'Paste',
'designFiles.previewOpen': 'Open',
'designFiles.previewClose': 'Close preview',
'designFiles.modified': 'Modified {time} · {size}',
'designFiles.weeksAgo': '{n}w ago',
'designFiles.sectionPages': 'Pages',
'designFiles.sectionScripts': 'Scripts',
'designFiles.sectionImages': 'Images',
'designFiles.sectionSketches': 'Sketches',
'designFiles.sectionOther': 'Other',
'designFiles.kindHtml': 'HTML page',
'designFiles.kindImage': 'Image',
'designFiles.kindSketch': 'Sketch',
'designFiles.kindText': 'Text',
'designFiles.kindCode': 'Script',
'designFiles.kindPdf': 'PDF',
'designFiles.kindDocument': 'Document',
'designFiles.kindPresentation': 'Presentation',
'designFiles.kindSpreadsheet': 'Spreadsheet',
'designFiles.kindBinary': 'Binary',
'pasteDialog.title': 'Paste text',
'pasteDialog.hint': 'Saved into the project folder. Pick any name.',
'pasteDialog.fileNameLabel': 'File name',
'pasteDialog.namePlaceholder': 'notes.txt',
'pasteDialog.contentLabel': 'Content',
'pasteDialog.contentPlaceholder': 'Paste anything…',
'pasteDialog.save': 'Save',
'pasteDialog.cancel': 'Cancel',
'sketch.save': 'Save sketch',
'sketch.cancel': 'Cancel',
'sketch.saving': 'Saving…',
'sketch.tooltipDirty': 'Unsaved changes',
'sketch.tooltipClean': 'Saved',
'fileViewer.empty': 'Select a file to view.',
'fileViewer.loading': 'Loading…',
'fileViewer.exportPptx': 'Export as PPTX',
'fileViewer.openInNewTab': 'Open in new tab',
'fileViewer.copyPath': 'Copy path',
'fileViewer.copied': 'Copied!',
'fileViewer.share': 'Share',
'fileViewer.binaryMeta': 'Binary · {size}',
'fileViewer.binaryNote':
'Binary file ({size} bytes). Download or open from disk to inspect.',
'fileViewer.pdfMeta': 'PDF · {size}',
'fileViewer.documentMeta': 'Document',
'fileViewer.presentationMeta': 'Presentation',
'fileViewer.spreadsheetMeta': 'Spreadsheet',
'fileViewer.previewUnavailable': 'Preview unavailable. Download or open the file to inspect.',
'fileViewer.download': 'Download',
'fileViewer.open': 'Open',
'fileViewer.imageMeta': 'Image · {size}',
'fileViewer.sketchMeta': 'Sketch · {size}',
'fileViewer.markdownStreamingMeta': 'Streaming preview…',
'fileViewer.markdownErrorMeta': 'Preview may be incomplete (generation error).',
'fileViewer.markdownStreamingStatus': 'Streaming… showing partial markdown.',
'fileViewer.markdownErrorStatus': 'Generation error. Showing last available content.',
'fileViewer.reload': 'Reload',
'fileViewer.reloadDisk': 'Reload from disk',
'fileViewer.copy': 'Copy',
'fileViewer.copyTitle': 'Copy file contents',
'fileViewer.saveDisabled': 'Save (read-only viewer)',
'fileViewer.save': 'Save',
'fileViewer.preview': 'Preview',
'fileViewer.source': 'Source',
'fileViewer.tweaks': 'Tweaks',
'fileViewer.comment': 'Comment',
'fileViewer.edit': 'Edit',
'fileViewer.draw': 'Draw',
'fileViewer.zoomOut': 'Zoom out',
'fileViewer.zoomIn': 'Zoom in',
'fileViewer.resetZoom': 'Reset zoom',
'fileViewer.reloadAria': 'Reload',
'fileViewer.previousSlide': 'Previous slide',
'fileViewer.nextSlide': 'Next slide',
'fileViewer.slideNavAria': 'Slide navigation',
'fileViewer.present': 'Present',
'fileViewer.presentInTab': 'In this tab',
'fileViewer.presentFullscreen': 'Fullscreen',
'fileViewer.presentNewTab': 'New tab',
'fileViewer.exitPresentation': 'Exit presentation',
'fileViewer.shareLabel': 'Share',
'fileViewer.exportPdf': 'Export as PDF',
'fileViewer.exportPdfAllSlides': 'Export as PDF (all slides)',
'fileViewer.exportPptxBusy': 'Wait for the current turn to finish.',
'fileViewer.exportPptxHint':
'Send a request to the agent to convert this design to PPTX.',
'fileViewer.exportPptxNa': 'PPTX export is not available here.',
'fileViewer.exportZip': 'Download as .zip',
'fileViewer.exportHtml': 'Export as standalone HTML',
'fileViewer.saveAsTemplate': 'Save as template…',
'fileViewer.savingTemplate': 'Saving template…',
'fileViewer.savedTemplate': 'Saved as "{name}"',
'fileViewer.savedTemplateFail': 'Could not save template — try again.',
'fileViewer.templateNamePrompt': 'Template name',
'fileViewer.templateNameDefault': 'Untitled template',
'fileViewer.templateDescPrompt':
'Short description (optional — what makes this template useful?)',
'questionForm.submit': 'Submit',
'questionForm.skip': 'Skip',
'questionForm.locked': 'Answered',
'conv.switch': 'Switch conversation',
'conv.label': 'Conversation',
'conv.heading': 'Conversations',
'conv.new': '+ New',
'conv.empty': 'No conversations yet.',
'conv.untitled': 'Untitled conversation',
'conv.renameTooltip': 'Double-click to rename',
'conv.delete': 'Delete conversation',
'conv.deleteConfirm': 'Delete "{title}"? This removes its messages.',
'agentPicker.label': 'Agent',
'agentPicker.modeChoose': 'Choose execution mode',
'agentPicker.localCli': 'Local CLI',
'agentPicker.daemonOff': 'daemon off',
'agentPicker.byok': 'Anthropic API · BYOK',
'agentPicker.selectAgent': 'Select a detected code-agent CLI',
'agentPicker.noAgents': 'no agents on PATH',
'agentPicker.notInstalled': 'not installed',
'agentPicker.rescan': 'Re-scan local PATH for agents',
'tool.openInTab': 'Open {name} in a tab',
'tool.open': 'open',
'tool.todos': 'Todos',
'tool.write': 'Write',
'tool.edit': 'Edit',
'tool.read': 'Read',
'tool.bash': 'Bash',
'tool.glob': 'Glob',
'tool.grep': 'Grep',
'tool.fetch': 'Fetch',
'tool.search': 'Search',
'tool.lines': '{n} lines',
'tool.changeSingular': 'change',
'tool.changePlural': 'changes',
'tool.in': 'in {path}',
'tool.hide': 'hide',
'tool.output': 'output',
'tool.running': 'running…',
'tool.error': 'error',
'tool.done': 'done',
'assistant.role': 'Assistant',
'assistant.workingLabel': 'Working',
'assistant.doneLabel': 'Done',
'assistant.unfinishedLabel': 'Stopped with unfinished work',
'assistant.unfinishedSummary': '{n} task(s) remain',
'assistant.unfinishedMore': '+{n} more',
'assistant.continueRemaining': 'Continue remaining tasks',
'assistant.outTokens': '{n} out',
'assistant.producedFiles': 'Files from this turn',
'assistant.openFile': 'Open',
'assistant.downloadFile': 'Download',
'assistant.thinking': 'Thinking',
'assistant.systemReminder': 'System reminder',
'assistant.waitingFirstOutput': 'Waiting for first output',
'assistant.statusBootingAgent': 'Booting agent',
'assistant.statusStarting': 'Starting',
'assistant.statusRequesting': 'Sending request',
'assistant.statusThinking': 'Thinking',
'assistant.statusStreaming': 'Streaming',
'assistant.slowHint':
'Taking longer than usual. The form usually shows in 510s — you can Stop and rephrase.',
'assistant.verbEditing': 'Editing',
'assistant.verbWriting': 'Writing',
'assistant.verbReading': 'Reading',
'assistant.verbSearching': 'Searching',
'assistant.verbRunning': 'Running',
'assistant.verbTodos': 'Todos',
'assistant.verbFetching': 'Fetching',
'assistant.verbCalling': 'Calling',
'qf.answered': 'answered',
'qf.choose': 'Choose…',
'qf.required': 'required',
'qf.lockedSubmitted':
'Answers sent — agent is using these for the rest of the session.',
'qf.lockedPrev': 'This form is from a previous turn.',
'qf.hint':
"Pick what fits. Skip optional fields you don't care about — the agent will use sensible defaults.",
'qf.submitDefault': 'Send answers',
'qf.submitDisabledTitle': 'Fill in the required fields first',
'qf.submitTitle': 'Send answers',
'qf.cardSelected': 'selected',
'qf.cardRefs': 'Refs:',
'qf.cardSampleText': 'The quick brown fox · 0123',
'sketch.toolSelect': 'Select (no-op)',
'sketch.toolPen': 'Pen',
'sketch.toolText': 'Text',
'sketch.toolRect': 'Rectangle',
'sketch.toolArrow': 'Arrow',
'sketch.toolEraser': 'Eraser',
'sketch.color': 'Color',
'sketch.strokeSize': 'Stroke size',
'sketch.undo': 'Undo',
'sketch.clear': 'Clear',
'sketch.close': 'Close',
'sketch.textPrompt': 'Text:',
};