@ouraihub/aether-ui 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +789 -0
- package/fixtures/model-classify.json +42 -0
- package/fixtures/pricing-cost.json +56 -0
- package/fixtures/reasoning-infer.json +44 -0
- package/fixtures/sse/anthropic-messages/chinese.sse +24 -0
- package/fixtures/sse/anthropic-messages/multi-tool.sse +33 -0
- package/fixtures/sse/anthropic-messages/single-tool.sse +39 -0
- package/fixtures/sse/anthropic-messages/text.sse +27 -0
- package/fixtures/sse/anthropic-messages/truncated.sse +21 -0
- package/fixtures/sse/anthropic-messages/upstream-error.sse +12 -0
- package/fixtures/sse/expect.json +20 -0
- package/fixtures/sse/openai-chat/chinese.sse +14 -0
- package/fixtures/sse/openai-chat/multi-tool.sse +18 -0
- package/fixtures/sse/openai-chat/single-tool.sse +22 -0
- package/fixtures/sse/openai-chat/text.sse +14 -0
- package/fixtures/sse/openai-chat/truncated.sse +12 -0
- package/fixtures/sse/openai-chat/upstream-error.sse +6 -0
- package/fixtures/sse/openai-responses/chinese.sse +33 -0
- package/fixtures/sse/openai-responses/multi-tool.sse +36 -0
- package/fixtures/sse/openai-responses/single-tool.sse +27 -0
- package/fixtures/sse/openai-responses/text.sse +33 -0
- package/fixtures/sse/openai-responses/truncated.sse +30 -0
- package/fixtures/sse/openai-responses/upstream-error.sse +9 -0
- package/package.json +71 -3
- package/src/CopyInput.svelte +33 -0
- package/src/KitNotifier.svelte +33 -0
- package/src/chat/ApprovalCard.svelte +29 -0
- package/src/chat/ChatComposer.svelte +277 -0
- package/src/chat/ChatMessage.svelte +262 -0
- package/src/chat/ChatPanel.css +386 -0
- package/src/chat/ChatPanel.svelte +496 -0
- package/src/chat/ChatPanelApprovals.svelte +28 -0
- package/src/chat/ChatPanelComposer.svelte +317 -0
- package/src/chat/ChatPanelDialogs.svelte +242 -0
- package/src/chat/ChatPanelHeader.svelte +132 -0
- package/src/chat/ChatPanelMessages.svelte +166 -0
- package/src/chat/ChatPanelMode.svelte +190 -0
- package/src/chat/ChatPanelState.svelte.ts +1 -0
- package/src/chat/ChatPanelToolbar.svelte +425 -0
- package/src/chat/ChatSurface.svelte +168 -0
- package/src/chat/MessageItem.svelte +480 -0
- package/src/chat/ReasoningControl.svelte +286 -0
- package/src/chat/SkillPicker.svelte +133 -0
- package/src/chat/ToolCallItem.svelte +23 -0
- package/src/chat/UsageControl.svelte +216 -0
- package/src/chat/UsageDetails.svelte +76 -0
- package/src/chat/chat-attachments.svelte.ts +74 -0
- package/src/chat/chat-panel-history.svelte.ts +430 -0
- package/src/chat/chat-panel-props.ts +32 -0
- package/src/chat/index.ts +6 -0
- package/src/chat/run-session-history.ts +56 -0
- package/src/chat/run-session-types.ts +69 -0
- package/src/chat/run-session.svelte.ts +494 -0
- package/src/chat/test-support/chat-fixture.ts +178 -0
- package/src/chat/test-support/conversation-fixtures.ts +32 -0
- package/src/chat/test-support/run-session-fixture.ts +112 -0
- package/src/components/ui/alert/alert-action.svelte +20 -0
- package/src/components/ui/alert/alert-description.svelte +23 -0
- package/src/components/ui/alert/alert-title.svelte +23 -0
- package/src/components/ui/alert/alert.svelte +43 -0
- package/src/components/ui/alert/index.ts +17 -0
- package/src/components/ui/alert-dialog/alert-dialog-action.svelte +27 -0
- package/src/components/ui/alert-dialog/alert-dialog-cancel.svelte +27 -0
- package/src/components/ui/alert-dialog/alert-dialog-content.svelte +32 -0
- package/src/components/ui/alert-dialog/alert-dialog-description.svelte +17 -0
- package/src/components/ui/alert-dialog/alert-dialog-footer.svelte +23 -0
- package/src/components/ui/alert-dialog/alert-dialog-header.svelte +20 -0
- package/src/components/ui/alert-dialog/alert-dialog-media.svelte +20 -0
- package/src/components/ui/alert-dialog/alert-dialog-overlay.svelte +17 -0
- package/src/components/ui/alert-dialog/alert-dialog-portal.svelte +7 -0
- package/src/components/ui/alert-dialog/alert-dialog-title.svelte +17 -0
- package/src/components/ui/alert-dialog/alert-dialog-trigger.svelte +7 -0
- package/src/components/ui/alert-dialog/alert-dialog.svelte +7 -0
- package/src/components/ui/alert-dialog/index.ts +40 -0
- package/src/components/ui/button/button.svelte +81 -0
- package/src/components/ui/button/index.ts +17 -0
- package/src/components/ui/dialog/dialog-close.svelte +11 -0
- package/src/components/ui/dialog/dialog-content.svelte +48 -0
- package/src/components/ui/dialog/dialog-description.svelte +17 -0
- package/src/components/ui/dialog/dialog-footer.svelte +32 -0
- package/src/components/ui/dialog/dialog-header.svelte +20 -0
- package/src/components/ui/dialog/dialog-overlay.svelte +17 -0
- package/src/components/ui/dialog/dialog-portal.svelte +7 -0
- package/src/components/ui/dialog/dialog-title.svelte +17 -0
- package/src/components/ui/dialog/dialog-trigger.svelte +11 -0
- package/src/components/ui/dialog/dialog.svelte +7 -0
- package/src/components/ui/dialog/index.ts +34 -0
- package/src/components/ui/dropdown-menu/dropdown-menu-checkbox-group.svelte +16 -0
- package/src/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +46 -0
- package/src/components/ui/dropdown-menu/dropdown-menu-content.svelte +31 -0
- package/src/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte +22 -0
- package/src/components/ui/dropdown-menu/dropdown-menu-group.svelte +7 -0
- package/src/components/ui/dropdown-menu/dropdown-menu-item.svelte +27 -0
- package/src/components/ui/dropdown-menu/dropdown-menu-label.svelte +24 -0
- package/src/components/ui/dropdown-menu/dropdown-menu-portal.svelte +7 -0
- package/src/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte +17 -0
- package/src/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte +36 -0
- package/src/components/ui/dropdown-menu/dropdown-menu-separator.svelte +17 -0
- package/src/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte +20 -0
- package/src/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte +31 -0
- package/src/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +29 -0
- package/src/components/ui/dropdown-menu/dropdown-menu-sub.svelte +7 -0
- package/src/components/ui/dropdown-menu/dropdown-menu-trigger.svelte +7 -0
- package/src/components/ui/dropdown-menu/dropdown-menu.svelte +7 -0
- package/src/components/ui/dropdown-menu/index.ts +54 -0
- package/src/components/ui/empty/empty-content.svelte +23 -0
- package/src/components/ui/empty/empty-description.svelte +23 -0
- package/src/components/ui/empty/empty-header.svelte +20 -0
- package/src/components/ui/empty/empty-media.svelte +41 -0
- package/src/components/ui/empty/empty-title.svelte +20 -0
- package/src/components/ui/empty/empty.svelte +23 -0
- package/src/components/ui/empty/index.ts +22 -0
- package/src/components/ui/field/field-content.svelte +20 -0
- package/src/components/ui/field/field-description.svelte +25 -0
- package/src/components/ui/field/field-error.svelte +58 -0
- package/src/components/ui/field/field-group.svelte +23 -0
- package/src/components/ui/field/field-label.svelte +25 -0
- package/src/components/ui/field/field-legend.svelte +24 -0
- package/src/components/ui/field/field-separator.svelte +35 -0
- package/src/components/ui/field/field-set.svelte +20 -0
- package/src/components/ui/field/field-title.svelte +20 -0
- package/src/components/ui/field/field.svelte +47 -0
- package/src/components/ui/field/index.ts +33 -0
- package/src/components/ui/input/index.ts +7 -0
- package/src/components/ui/input/input.svelte +48 -0
- package/src/components/ui/label/index.ts +7 -0
- package/src/components/ui/label/label.svelte +20 -0
- package/src/components/ui/select/index.ts +40 -0
- package/src/components/ui/select/select-content.svelte +45 -0
- package/src/components/ui/select/select-group-heading.svelte +21 -0
- package/src/components/ui/select/select-group.svelte +17 -0
- package/src/components/ui/select/select-item.svelte +43 -0
- package/src/components/ui/select/select-label.svelte +20 -0
- package/src/components/ui/select/select-portal.svelte +7 -0
- package/src/components/ui/select/select-scroll-down-button.svelte +20 -0
- package/src/components/ui/select/select-scroll-up-button.svelte +20 -0
- package/src/components/ui/select/select-separator.svelte +18 -0
- package/src/components/ui/select/select-trigger.svelte +29 -0
- package/src/components/ui/select/select-value.svelte +7 -0
- package/src/components/ui/select/select.svelte +11 -0
- package/src/components/ui/separator/index.ts +7 -0
- package/src/components/ui/separator/separator.svelte +21 -0
- package/src/components/ui/sonner/index.ts +1 -0
- package/src/components/ui/sonner/sonner.svelte +40 -0
- package/src/components/ui/switch/index.ts +7 -0
- package/src/components/ui/switch/switch.svelte +34 -0
- package/src/components/ui/textarea/index.ts +7 -0
- package/src/components/ui/textarea/textarea.svelte +22 -0
- package/src/context.ts +34 -0
- package/src/dev/Demo.svelte +47 -0
- package/src/dev/main.ts +7 -0
- package/src/i18n/en.ts +645 -0
- package/src/i18n/index.ts +28 -0
- package/src/i18n/zh-CN.ts +610 -0
- package/src/index.ts +10 -0
- package/src/logs/LogPanel.svelte +103 -0
- package/src/logs/LogSettings.svelte +58 -0
- package/src/logs/index.ts +5 -0
- package/src/logs/logger.ts +96 -0
- package/src/markdown.ts +8 -0
- package/src/mcp/McpClientEditor.svelte +204 -0
- package/src/mcp/McpClientSettings.svelte +418 -0
- package/src/mcp/McpServerSettings.svelte +363 -0
- package/src/mcp/config.ts +26 -0
- package/src/mcp/index.ts +3 -0
- package/src/mcp/input.ts +74 -0
- package/src/notify.svelte.ts +43 -0
- package/src/ports/contract.ts +174 -0
- package/src/ports/fake-optional.ts +81 -0
- package/src/ports/fake.ts +488 -0
- package/src/ports/index.ts +7 -0
- package/src/ports/search.ts +56 -0
- package/src/ports/skill-sources.ts +45 -0
- package/src/ports/test-support/fake-fixture.ts +63 -0
- package/src/providers/EndpointKeysDialog.svelte +357 -0
- package/src/providers/EndpointModels.svelte +311 -0
- package/src/providers/EndpointPanel.svelte +266 -0
- package/src/providers/ModelPickerDialog.svelte +230 -0
- package/src/providers/ModelPricing.svelte +125 -0
- package/src/providers/ModelSelect.svelte +448 -0
- package/src/providers/ModelSettingsDialog.svelte +388 -0
- package/src/providers/ProviderDialogs.svelte +120 -0
- package/src/providers/ProviderList.svelte +159 -0
- package/src/providers/ProvidersSettings.svelte +491 -0
- package/src/providers/RequestConfigDialog.svelte +278 -0
- package/src/providers/SecretInput.svelte +284 -0
- package/src/providers/draft.ts +355 -0
- package/src/providers/edit-session.ts +170 -0
- package/src/providers/index.ts +5 -0
- package/src/providers/reasoning.ts +55 -0
- package/src/providers/revision.svelte.ts +6 -0
- package/src/providers/test-support/providers-fixture.ts +120 -0
- package/src/search/SearchAdvancedTools.svelte +182 -0
- package/src/search/SearchProviderCard.svelte +195 -0
- package/src/search/SearchSettings.svelte +500 -0
- package/src/search/index.ts +13 -0
- package/src/search/settings-flow.ts +67 -0
- package/src/session.ts +20 -0
- package/src/skills/SkillAdd.svelte +380 -0
- package/src/skills/SkillAuthoring.svelte +430 -0
- package/src/skills/SkillEditor.svelte +104 -0
- package/src/skills/SkillPreviewDialog.svelte +136 -0
- package/src/skills/SkillsSettings.svelte +147 -0
- package/src/skills/error.ts +32 -0
- package/src/skills/index.ts +4 -0
- package/src/skills/test-support/skills-fixture.ts +139 -0
- package/src/styles/kit.css +137 -0
- package/src/styles/tokens.css +22 -0
- package/src/tauri/index.ts +298 -0
- package/src/utils.ts +22 -0
- package/src/web/index.ts +441 -0
- package/README.md +0 -3
package/src/i18n/en.ts
ADDED
|
@@ -0,0 +1,645 @@
|
|
|
1
|
+
import type { KitErrorCode } from '../ports'
|
|
2
|
+
|
|
3
|
+
/** Every `errors.<code>` must exist, so a new KitErrorCode fails typecheck until it is translated; other keys are free-form (`pnpm kit:i18n` checks them). */
|
|
4
|
+
export type Messages = Record<
|
|
5
|
+
`errors.${KitErrorCode}` | 'common.confirm' | 'common.cancel',
|
|
6
|
+
string
|
|
7
|
+
> &
|
|
8
|
+
Record<string, string>
|
|
9
|
+
|
|
10
|
+
export const en: Messages = {
|
|
11
|
+
'common.confirm': 'OK',
|
|
12
|
+
'common.cancel': 'Cancel',
|
|
13
|
+
'skills.add.title': 'Add skill',
|
|
14
|
+
'skills.add.agent': 'Create with Agent',
|
|
15
|
+
'skills.add.online': 'Search online',
|
|
16
|
+
'skills.add.system': 'Search this computer',
|
|
17
|
+
'skills.add.local': 'Import local file or folder',
|
|
18
|
+
'skills.add.review_notice':
|
|
19
|
+
'Nothing is installed until you review the full skill and confirm. Scripts never run automatically.',
|
|
20
|
+
'skills.add.query': 'Keywords or GitHub URL',
|
|
21
|
+
'skills.add.query_hint': 'Search skills or paste a GitHub repository / skill URL',
|
|
22
|
+
'skills.add.search': 'Search',
|
|
23
|
+
'skills.add.results': 'Available skills',
|
|
24
|
+
'skills.add.preview': 'Preview skill',
|
|
25
|
+
'skills.add.system_hint':
|
|
26
|
+
'Scan known CLI skill folders in your home directory, or choose a project folder to search.',
|
|
27
|
+
'skills.add.rescan': 'Scan home folders',
|
|
28
|
+
'skills.add.pick_search_directory': 'Choose skill folder',
|
|
29
|
+
'skills.add.local_hint':
|
|
30
|
+
'Choose SKILL.md, a .zip package, or a skill folder. Packaged references and scripts are included in the preview.',
|
|
31
|
+
'skills.add.pick_directory': 'Choose folder',
|
|
32
|
+
'skills.add.model': 'Model',
|
|
33
|
+
'skills.add.choose_model': 'Choose a configured chat model before sending',
|
|
34
|
+
'skills.add.authoring_notice':
|
|
35
|
+
'This assistant can create and test skill files with tools running as your current user. Its working directory is not a sandbox. Review each permission request; nothing is installed until you preview the package and confirm.',
|
|
36
|
+
'skills.add.creator_review': 'Review the built-in skill-creator before starting',
|
|
37
|
+
'skills.add.review_creator': 'Review skill-creator',
|
|
38
|
+
'skills.add.confirm_creator': 'Confirm skill-creator and start',
|
|
39
|
+
'skills.add.conversation': 'Skill authoring conversation',
|
|
40
|
+
'skills.add.authoring_input': 'Message to the skill creation assistant',
|
|
41
|
+
'skills.add.preview_artifact': 'Preview artifact',
|
|
42
|
+
'skills.add.tool_warning':
|
|
43
|
+
'Arguments preview. Allowing this tool grants current-user filesystem and network permissions, not sandboxed access. Allow only a call you trust.',
|
|
44
|
+
'skills.add.working': 'Working…',
|
|
45
|
+
'skills.add.no_results': 'No skills found.',
|
|
46
|
+
'skills.add.ignored': 'Files not imported',
|
|
47
|
+
'chat.networkOn': 'Web search on · click to turn off',
|
|
48
|
+
'chat.networkOff': 'Web search off · click to turn on',
|
|
49
|
+
'chat.title': 'Chat',
|
|
50
|
+
'chat.history': 'Conversation',
|
|
51
|
+
'chat.historyFailed': 'Could not load conversations',
|
|
52
|
+
'chat.newConversation': 'New conversation',
|
|
53
|
+
'chat.close': 'Close',
|
|
54
|
+
'chat.messages': 'Messages',
|
|
55
|
+
'chat.input': 'Message',
|
|
56
|
+
'chat.placeholder': 'Type a message, Ctrl/Cmd+Enter to send',
|
|
57
|
+
'chat.send': 'Send',
|
|
58
|
+
'chat.stop': 'Stop',
|
|
59
|
+
'chat.regenerate': 'Regenerate',
|
|
60
|
+
'chat.stopped': 'Stopped',
|
|
61
|
+
'chat.interrupted': 'Interrupted: the app closed during this reply',
|
|
62
|
+
'chat.exhausted': 'Reached the tool call round limit',
|
|
63
|
+
'chat.copy': 'Copy',
|
|
64
|
+
'chat.copied': 'Copied',
|
|
65
|
+
'chat.copyFailed': 'Could not copy',
|
|
66
|
+
'chat.insert': 'Insert',
|
|
67
|
+
'chat.retry': 'Retry',
|
|
68
|
+
'chat.more': 'More actions',
|
|
69
|
+
'chat.translationReply': 'Translation',
|
|
70
|
+
'chat.noSourceModel': 'Source model unknown',
|
|
71
|
+
'chat.switchModel': 'Switch model',
|
|
72
|
+
'chat.translate': 'Translate',
|
|
73
|
+
'chat.editReply': 'Edit',
|
|
74
|
+
'chat.replyText': 'Reply Markdown',
|
|
75
|
+
'chat.replyModel': 'Reply model',
|
|
76
|
+
'chat.targetLanguage': 'Target language',
|
|
77
|
+
'chat.branch': 'Branch',
|
|
78
|
+
'chat.copyConversation': 'Copy as new conversation',
|
|
79
|
+
'chat.save': 'Save',
|
|
80
|
+
'chat.saveFile': 'Save to local file',
|
|
81
|
+
'chat.export': 'Export',
|
|
82
|
+
'chat.exportMarkdown': 'Export as Markdown',
|
|
83
|
+
'chat.exportFailed': 'Could not download Markdown',
|
|
84
|
+
'chat.saveNote': 'Save to note',
|
|
85
|
+
'chat.saveNoteFailed': 'Could not save the note',
|
|
86
|
+
'chat.useContext': 'Set as context',
|
|
87
|
+
'chat.deleteReply': 'Delete',
|
|
88
|
+
'chat.deleteReplyTitle': 'Delete this message?',
|
|
89
|
+
'chat.deleteReparentBody':
|
|
90
|
+
'Later turns will attach to the previous reply. This cannot be undone.',
|
|
91
|
+
'chat.sourceModelUnavailable': 'The source model is unavailable. Use @ to pick another model.',
|
|
92
|
+
'chat.candidateHint':
|
|
93
|
+
'The original reply is retained. Click 👍 to set a candidate as context and continue from it.',
|
|
94
|
+
'chat.editReplyHint':
|
|
95
|
+
'Edits only replace this reply. A concurrent change will reject the edit and keep your draft.',
|
|
96
|
+
'chat.replyRefreshFailed': 'Could not reload the saved replies.',
|
|
97
|
+
'chat.delete': 'Delete conversation',
|
|
98
|
+
'chat.deleteTitle': 'Delete this conversation?',
|
|
99
|
+
'chat.network': 'Web search',
|
|
100
|
+
'chat.sources': 'Sources',
|
|
101
|
+
'chat.networkPrivacy':
|
|
102
|
+
'External search sends this question; preferred native search may send conversation and attached note context to the model provider.',
|
|
103
|
+
'chat.searching': 'Searching the web…',
|
|
104
|
+
'chat.searchResults': '{count} results found',
|
|
105
|
+
'chat.reasoning': 'Reasoning',
|
|
106
|
+
'chat.toolProcess': 'Tool activity',
|
|
107
|
+
'chat.showMore': 'Show more',
|
|
108
|
+
'chat.showLess': 'Show less',
|
|
109
|
+
'chat.reasoningEffort': 'Reasoning effort',
|
|
110
|
+
'chat.reasoningStrength': 'Strength',
|
|
111
|
+
'chat.reasoningFaster': 'Faster',
|
|
112
|
+
'chat.reasoningSmarter': 'Smarter',
|
|
113
|
+
'chat.resetReasoning': 'Reset to default',
|
|
114
|
+
'chat.reasoningDefaultHint':
|
|
115
|
+
'Default sends no reasoning control; the provider decides. Choose an effort to override it.',
|
|
116
|
+
'chat.reasoningUnconfigured':
|
|
117
|
+
'No reasoning capabilities are configured for this model. Turn on “Reasoning” in model settings and choose its supported efforts to enable the slider.',
|
|
118
|
+
'chat.unknown': 'Unknown',
|
|
119
|
+
'chat.contextUsage': 'Context usage',
|
|
120
|
+
'chat.usage': 'Token usage',
|
|
121
|
+
'chat.usageSettings': 'Usage and settings',
|
|
122
|
+
'chat.runSettings': 'Run settings',
|
|
123
|
+
'chat.reported': 'Measured',
|
|
124
|
+
'chat.estimated': 'Estimated',
|
|
125
|
+
'chat.modelsFailed': 'Could not load model capabilities',
|
|
126
|
+
'chat.modelsLoading': 'Loading models…',
|
|
127
|
+
'chat.retryModels': 'Retry loading models',
|
|
128
|
+
'chat.historyLoading': 'Loading conversations…',
|
|
129
|
+
'chat.retryHistory': 'Retry conversation operation',
|
|
130
|
+
'chat.rename': 'Rename conversation',
|
|
131
|
+
'chat.conversationTitle': 'Conversation title',
|
|
132
|
+
'chat.expandInput': 'Expand input',
|
|
133
|
+
'chat.collapseInput': 'Collapse input',
|
|
134
|
+
'chat.backToBottom': 'Back to bottom',
|
|
135
|
+
'chat.draftRecoverable':
|
|
136
|
+
'Your unsent message is available to restore after clearing the current draft.',
|
|
137
|
+
'chat.restoreDraft': 'Restore unsent message',
|
|
138
|
+
'chat.tools': 'More tools',
|
|
139
|
+
'chat.uploadAttachment': 'Upload attachment',
|
|
140
|
+
'chat.generateImage': 'Generate image',
|
|
141
|
+
'chat.generateImageOff': 'Turn off image generation',
|
|
142
|
+
'chat.quickPanel': 'Quick panel',
|
|
143
|
+
'chat.toolbarCustomize': 'Customize toolbar',
|
|
144
|
+
'chat.toolbarRestore': 'Restore default',
|
|
145
|
+
'chat.toolbarDrag': 'Drag or use ↑/↓ to reorder {name}',
|
|
146
|
+
'chat.paintingUnconfigured': 'Choose a painting model in settings first',
|
|
147
|
+
'chat.toolsUnsupported': 'The current model does not support tools',
|
|
148
|
+
'chat.generatedImages': 'Generated images',
|
|
149
|
+
'chat.openGeneratedImage': 'Open generated image {index}',
|
|
150
|
+
'chat.removeImage': 'Remove image {index}',
|
|
151
|
+
'chat.openImage': 'Open image {index}',
|
|
152
|
+
'chat.imageExpired': 'Image expired',
|
|
153
|
+
'chat.visionUnsupported': 'The current model does not support images',
|
|
154
|
+
'chat.imageLimit': 'Up to {max} images per message',
|
|
155
|
+
'chat.imageType': 'Only PNG, JPEG, WebP and GIF images are supported',
|
|
156
|
+
'chat.imageSize': 'Each image must be 4 MiB or smaller',
|
|
157
|
+
'chat.currentUsage': 'This turn',
|
|
158
|
+
'chat.totalUsage': 'Known conversation total',
|
|
159
|
+
'chat.usage.inputTokens': 'Input',
|
|
160
|
+
'chat.usage.outputTokens': 'Output',
|
|
161
|
+
'chat.usage.cacheReadTokens': 'Cache read',
|
|
162
|
+
'chat.usage.cacheWriteTokens': 'Cache write',
|
|
163
|
+
'chat.usage.reasoningTokens': 'Reasoning tokens',
|
|
164
|
+
'chat.usageHint':
|
|
165
|
+
'Cache is included in input; reasoning is included in output. Unknown counts are not treated as zero.',
|
|
166
|
+
'chat.cost': 'Cost',
|
|
167
|
+
'chat.effort.default': 'Default',
|
|
168
|
+
'chat.effort.none': 'None',
|
|
169
|
+
'chat.effort.auto': 'Auto',
|
|
170
|
+
'chat.effort.minimal': 'Minimal',
|
|
171
|
+
'chat.effort.low': 'Low',
|
|
172
|
+
'chat.effort.medium': 'Medium',
|
|
173
|
+
'chat.effort.high': 'High',
|
|
174
|
+
'chat.effort.xhigh': 'Very high',
|
|
175
|
+
'chat.effort.max': 'Maximum',
|
|
176
|
+
'chat.mode.label': 'Permission mode',
|
|
177
|
+
'chat.mode.default': 'Ask each time',
|
|
178
|
+
'chat.mode.defaultHint': 'Follow each tool’s approval setting.',
|
|
179
|
+
'chat.mode.plan': 'Plan only',
|
|
180
|
+
'chat.mode.planHint': 'Read and plan without changes.',
|
|
181
|
+
'chat.mode.accept_edits': 'Accept edits',
|
|
182
|
+
'chat.mode.accept_editsHint': 'Approve edits; other actions follow their rules.',
|
|
183
|
+
'chat.mode.auto': 'Smart approval',
|
|
184
|
+
'chat.mode.autoHint': 'Approve app tools; rules may require a prompt.',
|
|
185
|
+
'chat.mode.full_access': 'Full access',
|
|
186
|
+
'chat.mode.full_accessHint': 'No prompts for this run; blocked tools stay blocked.',
|
|
187
|
+
'chat.mode.planBadge': 'Plan only',
|
|
188
|
+
'chat.mode.fullAccessTitle': 'Allow full access for this run?',
|
|
189
|
+
'chat.mode.fullAccessBody':
|
|
190
|
+
'For this run only, tools may change data and execute commands without asking. Blocked tools stay blocked. This choice is not saved.',
|
|
191
|
+
'chat.mode.ruleNotice':
|
|
192
|
+
'Rules can miss risks and are not a sandbox. MCP tools keep their approval settings.',
|
|
193
|
+
'chat.mode.navigate': 'Select',
|
|
194
|
+
'chat.mode.confirm': 'Confirm',
|
|
195
|
+
'chat.mode.close': 'Close',
|
|
196
|
+
'providers.max_output': 'Maximum output (tokens)',
|
|
197
|
+
'search.search': 'Web search',
|
|
198
|
+
'search.fetch': 'Read webpage',
|
|
199
|
+
'search.searchHint': 'Your question is sent to the selected search provider.',
|
|
200
|
+
'search.fetchHint': 'Read a URL through the selected provider.',
|
|
201
|
+
'search.defaultProvider': 'Default provider',
|
|
202
|
+
'search.baseUrl': 'Base URL',
|
|
203
|
+
'search.username': 'Basic auth username',
|
|
204
|
+
'search.apiKey': 'API key',
|
|
205
|
+
'search.keyCleared': 'Key will be cleared on save',
|
|
206
|
+
'search.keyNotSet': 'Not configured',
|
|
207
|
+
'search.clearKey': 'Clear',
|
|
208
|
+
'search.replaceKey': 'Replace',
|
|
209
|
+
'search.reveal': 'Reveal',
|
|
210
|
+
'search.currentPassword': 'Current password',
|
|
211
|
+
'search.website': 'Website',
|
|
212
|
+
'search.apiKeyWebsite': 'Get a key',
|
|
213
|
+
'search.save': 'Save',
|
|
214
|
+
'search.saved': 'Saved',
|
|
215
|
+
'search.check': 'Check',
|
|
216
|
+
'search.checking': 'Checking…',
|
|
217
|
+
'search.resultCount': '{count} results',
|
|
218
|
+
'search.maxResults': 'Maximum results (1–50)',
|
|
219
|
+
'search.loading': 'Loading…',
|
|
220
|
+
'search.unavailable': 'Search is unavailable on this host',
|
|
221
|
+
'search.tools': 'Search and read URL',
|
|
222
|
+
'search.query': 'Query',
|
|
223
|
+
'search.runSearch': 'Search',
|
|
224
|
+
'search.pageUrl': 'URL',
|
|
225
|
+
'search.password': 'Password',
|
|
226
|
+
'search.read': 'Read',
|
|
227
|
+
'chat.deleteBody': 'Its messages cannot be restored.',
|
|
228
|
+
'search.manageKeys': 'Manage keys',
|
|
229
|
+
'search.newKey': 'New key',
|
|
230
|
+
'search.addKey': 'Add key',
|
|
231
|
+
'search.copy': 'Copy',
|
|
232
|
+
'search.delete': 'Delete',
|
|
233
|
+
'search.copied': 'Copied',
|
|
234
|
+
'search.copyFailed': 'Could not copy the key',
|
|
235
|
+
'search.advanced': 'Advanced search settings',
|
|
236
|
+
'search.compression': 'Compression',
|
|
237
|
+
'search.compressionNone': 'None',
|
|
238
|
+
'search.compressionCutoff': 'Cutoff',
|
|
239
|
+
'search.editKey': 'Edit key',
|
|
240
|
+
'search.cutoffLimit': 'Cutoff characters',
|
|
241
|
+
'search.blacklist': 'Blacklist (one rule per line)',
|
|
242
|
+
'search.nativePreferred': 'Prefer native model web search',
|
|
243
|
+
'search.nativePrivacy':
|
|
244
|
+
'Declared compatible models can use native search; others use the selected external provider. Native search may send conversation and note context to the model provider. Local blacklist and cutoff do not control provider-native search.',
|
|
245
|
+
'providers.nativeWebSearch': 'Model supports native web search',
|
|
246
|
+
'chat.deleteFailed': 'Could not delete the conversation',
|
|
247
|
+
'chat.empty': 'Ask anything to start',
|
|
248
|
+
'chat.noModels': 'No chat model yet. Add a provider and its models first.',
|
|
249
|
+
'chat.openSettings': 'Open settings',
|
|
250
|
+
'chat.context.remove': 'Do not send {label} with the next message',
|
|
251
|
+
'chat.tool.calling': 'Calling {name}',
|
|
252
|
+
'chat.tool.ok': '{name}: {summary}',
|
|
253
|
+
'chat.tool.error': '{name} failed: {summary}',
|
|
254
|
+
'chat.tool.denied': '{name}: denied',
|
|
255
|
+
'chat.tool.unknown': '{name}: result unknown, it may have run',
|
|
256
|
+
'chat.approval.title': 'Allow {name}?',
|
|
257
|
+
'chat.approval.host': 'App tool',
|
|
258
|
+
'chat.approval.mcp': 'MCP server {server}',
|
|
259
|
+
'chat.approval.allow': 'Allow once',
|
|
260
|
+
'chat.approval.deny': 'Deny',
|
|
261
|
+
'logs.title': 'Logs',
|
|
262
|
+
'logs.problemsOnly': 'Problems only',
|
|
263
|
+
'logs.openDir': 'Open folder',
|
|
264
|
+
'logs.empty': 'No log entries',
|
|
265
|
+
'logs.loadFailed': 'Could not read the log',
|
|
266
|
+
'logs.level': 'Log level',
|
|
267
|
+
'logs.levelHint': 'Takes effect immediately.',
|
|
268
|
+
'logs.unavailable': 'Writing the log file failed; recent entries may be missing.',
|
|
269
|
+
'errors.bad_request': 'Invalid request',
|
|
270
|
+
'errors.not_found': 'Not found',
|
|
271
|
+
'errors.conflict': 'Conflicts with existing data',
|
|
272
|
+
'errors.unsupported': 'Not supported',
|
|
273
|
+
'errors.cancelled': 'Cancelled',
|
|
274
|
+
'errors.unauthorized': 'Authentication failed, check the key',
|
|
275
|
+
'errors.forbidden': 'Not allowed',
|
|
276
|
+
'errors.rate_limited': 'Too many requests, try again later',
|
|
277
|
+
'errors.upstream': 'The upstream service failed',
|
|
278
|
+
'errors.timeout': 'The request timed out',
|
|
279
|
+
'errors.network': 'Network connection failed',
|
|
280
|
+
'errors.needs_config': 'Configuration required',
|
|
281
|
+
'errors.budget_exceeded': 'Budget exceeded',
|
|
282
|
+
'errors.incompatible_db': 'Incompatible data file version',
|
|
283
|
+
'errors.internal': 'Internal error',
|
|
284
|
+
'providers.title': 'Providers',
|
|
285
|
+
'providers.add': 'Add provider',
|
|
286
|
+
'providers.empty': 'No providers yet',
|
|
287
|
+
'providers.empty_hint': 'Add a provider, then fetch its models.',
|
|
288
|
+
'providers.name': 'Name',
|
|
289
|
+
'providers.enabled': 'Enabled',
|
|
290
|
+
'providers.endpoints': 'Endpoints',
|
|
291
|
+
'providers.add_endpoint': 'Add endpoint',
|
|
292
|
+
'providers.remove_endpoint': 'Remove endpoint',
|
|
293
|
+
'providers.base_url': 'API URL',
|
|
294
|
+
'providers.protocol': 'Protocol',
|
|
295
|
+
'providers.protocol.openai-chat': 'OpenAI compatible (Chat Completions)',
|
|
296
|
+
'providers.protocol.openai-responses': 'OpenAI Responses',
|
|
297
|
+
'providers.protocol.anthropic-messages': 'Anthropic compatible (Messages)',
|
|
298
|
+
'providers.search': 'Search model platforms…',
|
|
299
|
+
'providers.filter': 'Filter providers',
|
|
300
|
+
'providers.filter_all': 'All',
|
|
301
|
+
'providers.filter_enabled': 'Enabled',
|
|
302
|
+
'providers.filter_disabled': 'Disabled',
|
|
303
|
+
'providers.no_matches': 'No matching providers',
|
|
304
|
+
'providers.api_key': 'API key',
|
|
305
|
+
'providers.key_show': 'Show key',
|
|
306
|
+
'providers.key_hide': 'Hide key',
|
|
307
|
+
'providers.key_copy': 'Copy key',
|
|
308
|
+
'providers.key_edit': 'Edit key',
|
|
309
|
+
'providers.key_delete': 'Delete key',
|
|
310
|
+
'providers.key_copied': 'Key copied',
|
|
311
|
+
'providers.key_copy_failed': 'Could not copy key',
|
|
312
|
+
'providers.key_current_password': 'Current password',
|
|
313
|
+
'providers.key_reveal_failed': 'Could not reveal key',
|
|
314
|
+
'providers.models': 'Models',
|
|
315
|
+
'providers.no_models': 'No models selected',
|
|
316
|
+
'providers.model_invalid': 'Selected model is unavailable',
|
|
317
|
+
'providers.model_placeholder': 'Select a model',
|
|
318
|
+
'providers.model_search': 'Search models…',
|
|
319
|
+
'providers.model_no_match': 'No matching models',
|
|
320
|
+
'providers.model_configure': 'Configure models',
|
|
321
|
+
'providers.cap_vision': 'Vision',
|
|
322
|
+
'providers.cap_reasoning': 'Reasoning',
|
|
323
|
+
'providers.cap_tools': 'Tools',
|
|
324
|
+
'providers.cap_web': 'Web search',
|
|
325
|
+
'providers.save': 'Save',
|
|
326
|
+
'providers.delete': 'Delete provider',
|
|
327
|
+
'providers.delete_confirm': 'Delete "{name}" and all its endpoints?',
|
|
328
|
+
'providers.model_type': 'Model type',
|
|
329
|
+
'providers.picker_title': 'Pick models',
|
|
330
|
+
'providers.picker_hint': 'Use + to add a model and − to remove it.',
|
|
331
|
+
'providers.search_models': 'Search model ID',
|
|
332
|
+
'providers.all_types': 'All',
|
|
333
|
+
'providers.add_all': 'Add all',
|
|
334
|
+
'providers.remove_all': 'Remove all',
|
|
335
|
+
'providers.no_model_matches': 'No matching models',
|
|
336
|
+
'providers.picked': 'Added',
|
|
337
|
+
'providers.picked_count': '{count} selected',
|
|
338
|
+
'providers.add_model': 'Add {id}',
|
|
339
|
+
'providers.remove_model': 'Remove {id}',
|
|
340
|
+
'providers.type_for': 'Model type for {id}',
|
|
341
|
+
'providers.vision': 'Vision',
|
|
342
|
+
'providers.no_group': 'Other',
|
|
343
|
+
'providers.model_settings': 'Model settings',
|
|
344
|
+
'providers.reasoning_dialect': 'Reasoning dialect',
|
|
345
|
+
'providers.dialect.openai': 'OpenAI reasoning effort (reasoning_effort)',
|
|
346
|
+
'providers.dialect.anthropic-budget': 'Anthropic thinking budget (budget_tokens)',
|
|
347
|
+
'providers.dialect.anthropic-adaptive': 'Anthropic adaptive thinking (effort)',
|
|
348
|
+
'providers.dialect.thinking-type': 'Thinking switch (thinking.type; DeepSeek, GLM, Doubao, Kimi)',
|
|
349
|
+
'providers.dialect.qwen': 'Qwen thinking (enable_thinking + thinking_budget)',
|
|
350
|
+
'providers.reasoning_efforts': 'Allowed reasoning efforts',
|
|
351
|
+
'providers.reasoning_budget': 'Reasoning budget (tokens)',
|
|
352
|
+
'providers.context_window': 'Context window (tokens)',
|
|
353
|
+
'providers.type.chat': 'Chat',
|
|
354
|
+
'providers.type.image': 'Image',
|
|
355
|
+
'providers.type.video': 'Video',
|
|
356
|
+
'providers.type.tts': 'TTS',
|
|
357
|
+
'providers.type.stt': 'STT',
|
|
358
|
+
'providers.type.embedding': 'Embedding',
|
|
359
|
+
'providers.type.rerank': 'Rerank',
|
|
360
|
+
'providers.type.unknown': 'Unknown',
|
|
361
|
+
'providers.type_other': 'Other',
|
|
362
|
+
'providers.type_in_use': '{roles} use this model; pick it again after changing its type',
|
|
363
|
+
'providers.list_separator': ', ',
|
|
364
|
+
'providers.edit_model': 'Edit model',
|
|
365
|
+
'providers.model_name': 'Model name',
|
|
366
|
+
'providers.group_name': 'Group name',
|
|
367
|
+
'providers.purpose': 'Purpose',
|
|
368
|
+
'providers.purpose.chat': 'Chat',
|
|
369
|
+
'providers.purpose.image': 'Image generation',
|
|
370
|
+
'providers.purpose.edit': 'Image editing',
|
|
371
|
+
'providers.more_settings': 'More settings',
|
|
372
|
+
'providers.capabilities': 'Capabilities',
|
|
373
|
+
'providers.tools_state.unknown': 'Not probed',
|
|
374
|
+
'providers.tools_state.true': 'Supports tools',
|
|
375
|
+
'providers.tools_state.false': 'No tool support',
|
|
376
|
+
'providers.input_modalities': 'Input modalities',
|
|
377
|
+
'providers.pricing': 'Pricing',
|
|
378
|
+
'providers.pricing_add': 'Set pricing',
|
|
379
|
+
'providers.pricing_clear': 'Clear pricing',
|
|
380
|
+
'providers.pricing_unit': 'Prices per million tokens',
|
|
381
|
+
'providers.currency': 'Currency',
|
|
382
|
+
'providers.currency.USD': 'US dollar',
|
|
383
|
+
'providers.currency.CNY': 'Chinese yuan',
|
|
384
|
+
'providers.tier': 'Tier {n}',
|
|
385
|
+
'providers.tier_add': 'Add tier',
|
|
386
|
+
'providers.tier_remove': 'Remove tier {n}',
|
|
387
|
+
'providers.tier_start': 'From input tokens',
|
|
388
|
+
'providers.price.input': 'Input',
|
|
389
|
+
'providers.price.output': 'Output',
|
|
390
|
+
'providers.price.cacheRead': 'Cache read',
|
|
391
|
+
'providers.price.cacheWrite': 'Cache write',
|
|
392
|
+
'providers.price_same_as_input': 'Same as input',
|
|
393
|
+
'providers.applies_next':
|
|
394
|
+
'Takes effect from the next message; a reply in progress is not affected.',
|
|
395
|
+
'providers.save_model_invalid': 'Settings for model {model} are invalid: {error}',
|
|
396
|
+
'providers.error.name.too_long': 'At most 80 characters',
|
|
397
|
+
'providers.error.groupName.too_long': 'At most 80 characters',
|
|
398
|
+
'providers.error.contextWindow.invalid': 'Enter a positive whole number',
|
|
399
|
+
'providers.error.maxOutput.invalid': 'Enter a positive whole number',
|
|
400
|
+
'providers.error.maxOutput.exceeds_context': 'Max output must be smaller than the context window',
|
|
401
|
+
'providers.error.reasoning.invalid_efforts': 'Select at least one effort',
|
|
402
|
+
'providers.error.reasoning.protocol_mismatch':
|
|
403
|
+
'The reasoning dialect does not match the endpoint protocol',
|
|
404
|
+
'providers.error.reasoning.invalid_budget':
|
|
405
|
+
'Budget must be at least 1024 and below max output (default 4096)',
|
|
406
|
+
'providers.error.reasoning.unexpected_budget': 'This reasoning dialect takes no budget',
|
|
407
|
+
'providers.error.pricing.invalid':
|
|
408
|
+
'Prices must be 0 to 1,000,000; the first tier starts at 0, starts increase, at most 8 tiers',
|
|
409
|
+
'providers.probe.missing_key': 'An API key is required',
|
|
410
|
+
'providers.probe.unauthorized': 'Authentication failed',
|
|
411
|
+
'providers.probe.not_found': 'Model list not found (404)',
|
|
412
|
+
'providers.probe.rate_limited': 'Rate limited',
|
|
413
|
+
'providers.probe.status': 'Upstream returned HTTP {status}',
|
|
414
|
+
'providers.probe.timeout': 'Request timed out',
|
|
415
|
+
'providers.probe.connect': 'Could not connect',
|
|
416
|
+
'providers.probe.blocked_address': 'This address is not allowed',
|
|
417
|
+
'providers.probe.invalid_body': 'Unrecognised model list',
|
|
418
|
+
'providers.hint.missing_v1': 'The address may need to end with /v1',
|
|
419
|
+
'providers.hint.check_network': 'Check the network and the address',
|
|
420
|
+
'providers.hint.check_key': 'Check the API key',
|
|
421
|
+
'providers.settings': 'Provider settings',
|
|
422
|
+
'providers.row_menu': 'More actions for {name}',
|
|
423
|
+
'providers.edit': 'Edit',
|
|
424
|
+
'providers.remove': 'Delete',
|
|
425
|
+
'providers.notes': 'Model notes',
|
|
426
|
+
'providers.notes_placeholder': 'Enter Markdown content...',
|
|
427
|
+
'providers.get_key': 'Get a key',
|
|
428
|
+
'providers.needs_setup': 'Needs an API key',
|
|
429
|
+
'providers.save_failed': 'Could not save. Your changes are kept.',
|
|
430
|
+
'providers.retry': 'Retry',
|
|
431
|
+
'providers.discard_title': 'Discard unsaved changes?',
|
|
432
|
+
'providers.discard_body': 'The last change could not be saved. Switch anyway?',
|
|
433
|
+
'providers.endpoint_new': 'New endpoint',
|
|
434
|
+
'providers.remove_endpoint_confirm': 'Remove this endpoint and its models?',
|
|
435
|
+
'providers.url_invalid': 'Enter an address starting with http:// or https://',
|
|
436
|
+
'providers.request_config': 'Request configuration',
|
|
437
|
+
'providers.request_config_tip': 'Configure API URL and custom headers',
|
|
438
|
+
'providers.default': 'Default',
|
|
439
|
+
'providers.base_url_hint': 'Custom API request URL: {url}',
|
|
440
|
+
'providers.image_base_url': 'Image generation base URL',
|
|
441
|
+
'providers.image_base_url_hint': 'Used for /images/generations; leave empty to use the API URL',
|
|
442
|
+
'providers.image_edit_base_url': 'Image edit base URL',
|
|
443
|
+
'providers.image_edit_base_url_hint': 'Used for /images/edits; leave empty to use the API URL',
|
|
444
|
+
'providers.headers': 'Custom headers',
|
|
445
|
+
'providers.headers_add': 'Add header',
|
|
446
|
+
'providers.header_name': 'Header name',
|
|
447
|
+
'providers.header_value': 'Header value',
|
|
448
|
+
'providers.header_remove': 'Remove header {name}',
|
|
449
|
+
'providers.headers_to_json': 'Switch to JSON editing',
|
|
450
|
+
'providers.headers_to_list': 'Switch to key-value list',
|
|
451
|
+
'providers.headers_invalid_json': 'Invalid JSON',
|
|
452
|
+
'providers.headers_invalid': 'Invalid header name or value',
|
|
453
|
+
'providers.headers_reserved': '{name} is set by the system and cannot be customized',
|
|
454
|
+
'providers.headers_too_many': 'At most 20 headers',
|
|
455
|
+
'providers.check': 'Check',
|
|
456
|
+
'providers.check_ok': 'Connected · {count} models available',
|
|
457
|
+
'providers.suggest_protocol':
|
|
458
|
+
'This endpoint also speaks Anthropic Messages; Claude images and thinking work natively there',
|
|
459
|
+
'providers.suggest_protocol_apply': 'Use Anthropic protocol',
|
|
460
|
+
'providers.sync_models': 'Sync models',
|
|
461
|
+
'providers.add_model_manual': 'Add model',
|
|
462
|
+
'providers.model_id': 'Model ID',
|
|
463
|
+
'providers.remove_group': 'Remove group',
|
|
464
|
+
'providers.model_settings_for': 'Settings for {id}',
|
|
465
|
+
'providers.cap_filter': 'Filter by capability',
|
|
466
|
+
'providers.expand_all': 'Expand all',
|
|
467
|
+
'providers.collapse_all': 'Collapse all',
|
|
468
|
+
'providers.key_unreadable': 'The saved key cannot be read on this device',
|
|
469
|
+
'providers.key_placeholder': 'Enter API key',
|
|
470
|
+
'providers.key_delete_confirm': 'Delete the saved API key?',
|
|
471
|
+
'providers.keys_manage': 'Manage API keys',
|
|
472
|
+
'providers.keys_desc': 'A key that is rejected or out of quota falls through to the next',
|
|
473
|
+
'providers.key_strategy': 'Key use',
|
|
474
|
+
'providers.key_strategy_round_robin': 'Rotate',
|
|
475
|
+
'providers.key_strategy_round_robin_desc':
|
|
476
|
+
'Each request starts at the next key; spreads rate limits across keys',
|
|
477
|
+
'providers.key_strategy_fill_first': 'Use up, then next',
|
|
478
|
+
'providers.key_strategy_fill_first_desc':
|
|
479
|
+
'Always start at the first key; a key that ran out is skipped until it recovers',
|
|
480
|
+
'providers.key_exhausted': 'Paused until {time}',
|
|
481
|
+
'providers.key_restore': 'Restore',
|
|
482
|
+
'providers.keys_add': 'Add API key',
|
|
483
|
+
'providers.keys_enabled_count': '{enabled} / {total} enabled',
|
|
484
|
+
'providers.keys_empty': 'No API keys',
|
|
485
|
+
'providers.keys_label': 'Label',
|
|
486
|
+
'providers.keys_keep': 'Leave empty to keep the key',
|
|
487
|
+
'providers.keys_enable_for': 'Enable {name}',
|
|
488
|
+
'providers.keys_save': 'Save',
|
|
489
|
+
'providers.keys_cancel': 'Cancel',
|
|
490
|
+
'providers.keys_err_empty': 'API key is required',
|
|
491
|
+
'providers.keys_err_duplicate': 'This API key already exists',
|
|
492
|
+
'providers.keys_err_too_many': 'At most 16 keys per endpoint',
|
|
493
|
+
'providers.keys_err_label': 'Label is at most 40 characters',
|
|
494
|
+
'providers.keys_save_failed': 'Failed to save the API key',
|
|
495
|
+
'mcp.server.title': 'MCP server',
|
|
496
|
+
'mcp.server.running': 'Running at {url}',
|
|
497
|
+
'mcp.server.stopped': 'Stopped',
|
|
498
|
+
'mcp.server.toolCount': '{count} tools',
|
|
499
|
+
'mcp.server.start': 'Start',
|
|
500
|
+
'mcp.server.stop': 'Stop',
|
|
501
|
+
'mcp.server.port': 'Port',
|
|
502
|
+
'mcp.server.savePort': 'Save port',
|
|
503
|
+
'mcp.server.scopes': 'Enabled scopes',
|
|
504
|
+
'mcp.server.scopesHint':
|
|
505
|
+
'A token can only call tools whose scope is both granted to it and enabled here.',
|
|
506
|
+
'mcp.server.destructiveTitle': 'Enable a destructive scope?',
|
|
507
|
+
'mcp.server.destructiveBody':
|
|
508
|
+
'External AI clients will be able to change data through “{scope}”.',
|
|
509
|
+
'mcp.server.newToken': 'New token',
|
|
510
|
+
'mcp.server.tokenName': 'Name',
|
|
511
|
+
'mcp.server.issue': 'Issue token',
|
|
512
|
+
'mcp.server.issuedTitle': 'Token “{name}” issued',
|
|
513
|
+
'mcp.server.issuedOnce': 'Copy it now: it is shown only once.',
|
|
514
|
+
'mcp.server.copyClaude': 'Copy Claude Code command (POSIX shell)',
|
|
515
|
+
'mcp.server.copyJson': 'Copy JSON config',
|
|
516
|
+
'mcp.server.copied': 'Copied',
|
|
517
|
+
'mcp.server.dismiss': 'Done',
|
|
518
|
+
'mcp.server.tokens': 'Tokens',
|
|
519
|
+
'mcp.server.noTokens': 'No tokens yet',
|
|
520
|
+
'mcp.server.lastUsed': 'Last used',
|
|
521
|
+
'mcp.server.revoke': 'Revoke',
|
|
522
|
+
'mcp.server.revoked': 'Revoked',
|
|
523
|
+
'mcp.server.revokeTitle': 'Revoke this token?',
|
|
524
|
+
'mcp.server.revokeBody': 'Clients using “{name}” lose access immediately.',
|
|
525
|
+
'mcp.client.title': 'External MCP servers',
|
|
526
|
+
'mcp.client.hint':
|
|
527
|
+
'Tools of enabled and trusted servers are offered to the in-app AI; each call follows its approval setting.',
|
|
528
|
+
'mcp.client.add': 'Add server',
|
|
529
|
+
'mcp.client.editTitle': 'Edit server',
|
|
530
|
+
'mcp.client.empty': 'No MCP servers yet',
|
|
531
|
+
'mcp.client.emptyHint':
|
|
532
|
+
'Add a remote (HTTP) server or a local command (stdio), test the connection, then trust it.',
|
|
533
|
+
'mcp.client.secretKeys': 'Credentials: {keys}',
|
|
534
|
+
'mcp.client.test': 'Test connection',
|
|
535
|
+
'mcp.client.testFailed': 'Connection failed: {error}',
|
|
536
|
+
'mcp.client.edit': 'Edit',
|
|
537
|
+
'mcp.client.delete': 'Delete',
|
|
538
|
+
'mcp.client.deleteTitle': 'Delete this server?',
|
|
539
|
+
'mcp.client.deleteBody': '“{name}” and its stored credentials will be removed.',
|
|
540
|
+
'mcp.client.enabled': 'Enabled',
|
|
541
|
+
'mcp.client.trusted': 'Trusted',
|
|
542
|
+
'mcp.client.allowPrivate': 'Allow private network',
|
|
543
|
+
'mcp.client.trustTitle': 'Trust this server?',
|
|
544
|
+
'mcp.client.trustBody':
|
|
545
|
+
'The AI will see the tools of “{name}” and may call them; calls still follow each tool’s approval.',
|
|
546
|
+
'mcp.client.privateTitle': 'Allow a private-network address?',
|
|
547
|
+
'mcp.client.privateBody':
|
|
548
|
+
'Requests to {url} will be allowed even though it is on the local network.',
|
|
549
|
+
'mcp.client.tools': 'Tools',
|
|
550
|
+
'mcp.client.noTools': 'No tools discovered yet: test the connection.',
|
|
551
|
+
'mcp.client.readOnlyHint': 'read-only, can be set to auto',
|
|
552
|
+
'mcp.client.approvalFor': 'Approval for {tool}',
|
|
553
|
+
'mcp.client.approval.auto': 'Auto',
|
|
554
|
+
'mcp.client.approval.ask': 'Ask',
|
|
555
|
+
'mcp.client.approval.deny': 'Deny',
|
|
556
|
+
'mcp.client.name': 'Name',
|
|
557
|
+
'mcp.client.slug': 'Tool prefix',
|
|
558
|
+
'mcp.client.transport': 'Connection',
|
|
559
|
+
'mcp.client.transport.http': 'Remote (HTTP)',
|
|
560
|
+
'mcp.client.transport.stdio': 'Local command (stdio)',
|
|
561
|
+
'mcp.client.command': 'Command',
|
|
562
|
+
'mcp.client.args': 'Arguments, one per line',
|
|
563
|
+
'mcp.client.argsHint':
|
|
564
|
+
'Passed as is, without a shell. Put tokens in the environment variables below.',
|
|
565
|
+
'mcp.client.cwd': 'Working directory',
|
|
566
|
+
'mcp.client.cwdHint': 'Absolute path; leave empty to inherit the app’s directory.',
|
|
567
|
+
'mcp.client.env': 'Environment variables, one “NAME=value” per line',
|
|
568
|
+
'mcp.client.envHint':
|
|
569
|
+
'Stored encrypted and never shown again. The app’s own keys and tokens are not passed on.',
|
|
570
|
+
'mcp.client.url': 'URL',
|
|
571
|
+
'mcp.client.urlHint': 'Without credentials: put keys in the headers or query below.',
|
|
572
|
+
'mcp.client.replaceSecret': 'Replace credentials (now: {keys})',
|
|
573
|
+
'mcp.client.headers': 'Headers, one “Name: value” per line',
|
|
574
|
+
'mcp.client.query': 'Query parameters, one “name=value” per line',
|
|
575
|
+
'mcp.client.secretHint': 'Stored encrypted and never shown again. Leave both empty to send none.',
|
|
576
|
+
'mcp.client.save': 'Save',
|
|
577
|
+
'mcp.client.err.credentialQuery':
|
|
578
|
+
'The URL carries a credential: move it to the query parameters below',
|
|
579
|
+
'mcp.client.err.duplicateSlug': 'Another server already uses this prefix',
|
|
580
|
+
'mcp.client.err.secretLine': 'Each credential line needs a name and a value',
|
|
581
|
+
'mcp.client.err.credentialArg':
|
|
582
|
+
'An argument looks like a credential: move it to the environment variables',
|
|
583
|
+
'mcp.client.err.transportChanged': 'The connection type changed: replace the credentials too',
|
|
584
|
+
'skills.title': 'Skills',
|
|
585
|
+
'skills.list': 'Installed skills',
|
|
586
|
+
'skills.import': 'Import SKILL.md or .zip',
|
|
587
|
+
'skills.new': 'New skill',
|
|
588
|
+
'skills.empty': 'No skills yet',
|
|
589
|
+
'skills.empty_hint': 'Import a SKILL.md or .zip, or write one.',
|
|
590
|
+
'skills.name': 'Name',
|
|
591
|
+
'skills.version': 'Version',
|
|
592
|
+
'skills.unversioned': 'Unversioned',
|
|
593
|
+
'skills.description': 'Description',
|
|
594
|
+
'skills.body': 'Full text',
|
|
595
|
+
'skills.license': 'License',
|
|
596
|
+
'skills.origin.imported': 'Imported',
|
|
597
|
+
'skills.origin.manual': 'Hand-written',
|
|
598
|
+
'skills.origin.builtin': 'Built-in',
|
|
599
|
+
'skills.revision': 'rev {revision}',
|
|
600
|
+
'skills.chars': '{count} chars',
|
|
601
|
+
'skills.view': 'View',
|
|
602
|
+
'skills.edit': 'Edit',
|
|
603
|
+
'skills.edit_title': 'Edit {name}',
|
|
604
|
+
'skills.save': 'Save',
|
|
605
|
+
'skills.duplicate': 'Duplicate',
|
|
606
|
+
'skills.delete': 'Delete',
|
|
607
|
+
'skills.delete_confirm': 'Delete skill "{name}"? Past conversations are not affected.',
|
|
608
|
+
'skills.up': 'Move {name} up',
|
|
609
|
+
'skills.down': 'Move {name} down',
|
|
610
|
+
'skills.preview_title': 'Review before installing',
|
|
611
|
+
'skills.preview_desc':
|
|
612
|
+
'Read the full text. A skill only guides the model; it grants no tools or access.',
|
|
613
|
+
'skills.replace': 'Replace the installed version ({version}, rev {revision})',
|
|
614
|
+
'skills.install': 'Install',
|
|
615
|
+
'skills.installed': 'Installed {name}',
|
|
616
|
+
'skills.content_changed':
|
|
617
|
+
'The file changed after the preview. Review the new text and confirm again.',
|
|
618
|
+
'skills.picker': 'Skills for this message',
|
|
619
|
+
'skills.picker_none': 'No skills',
|
|
620
|
+
'skills.picker_count': '{count} skills',
|
|
621
|
+
'skills.budget': '{chars} / {budget} chars',
|
|
622
|
+
'skills.changed_title': 'Skill updated, confirm again',
|
|
623
|
+
'skills.use': 'Use this version',
|
|
624
|
+
'skills.removed': 'A selected skill was deleted and has been removed',
|
|
625
|
+
'skills.err.exists': 'A skill with this name already exists',
|
|
626
|
+
'skills.err.builtin_name': 'This name is reserved for a built-in skill',
|
|
627
|
+
'skills.err.revision_changed': 'The skill was changed elsewhere; reopen it and edit again',
|
|
628
|
+
'skills.err.secret_detected': 'Looks like a credential at {field}; remove it first',
|
|
629
|
+
'skills.err.unsupported_files': 'Unsupported files in the package: {field}',
|
|
630
|
+
'skills.err.too_large': '{field} is too large (limit {limit})',
|
|
631
|
+
'skills.err.frontmatter': 'Unsupported frontmatter at line {field}',
|
|
632
|
+
'skills.err.invalid_name':
|
|
633
|
+
'Invalid file name in the package: {field} (letters, digits, ".", "_", "-" only)',
|
|
634
|
+
'skills.err.too_deep': '{field} is nested too deep (at most {limit} levels)',
|
|
635
|
+
'skills.err.not_utf8': '{field} is not UTF-8 text',
|
|
636
|
+
'skills.has_scripts': 'Has scripts',
|
|
637
|
+
'skills.file_count': '{count} files',
|
|
638
|
+
'skills.files': 'Packaged files ({count})',
|
|
639
|
+
'skills.file_kind.script': 'Script',
|
|
640
|
+
'skills.file_kind.reference': 'Reference',
|
|
641
|
+
'skills.file_kind.asset': 'Asset',
|
|
642
|
+
'skills.file_size': '{size} B',
|
|
643
|
+
'skills.scripts_notice':
|
|
644
|
+
'Contains scripts. This app never runs them automatically; the host may run them after you approve.',
|
|
645
|
+
}
|