@ouraihub/aether-ui 0.1.0 → 0.1.2
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/package.json +3 -3
- package/src/chat/ApprovalCard.svelte +8 -2
- package/src/chat/ChatComposer.svelte +319 -0
- package/src/chat/ChatMessage.svelte +262 -0
- package/src/chat/ChatPanel.css +386 -0
- package/src/chat/ChatPanel.svelte +276 -1880
- package/src/chat/ChatPanelApprovals.svelte +28 -0
- package/src/chat/ChatPanelComposer.svelte +336 -0
- package/src/chat/ChatPanelDialogs.svelte +242 -0
- package/src/chat/ChatPanelHeader.svelte +108 -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 +436 -0
- package/src/chat/ChatSurface.svelte +168 -0
- package/src/chat/ContextUsageStatus.svelte +97 -0
- package/src/chat/MessageItem.svelte +111 -214
- package/src/chat/ModelEffortPicker.svelte +326 -0
- package/src/chat/PickerEffort.svelte +71 -0
- package/src/chat/ReasoningControl.svelte +184 -0
- package/src/chat/ReasoningSlider.svelte +174 -0
- package/src/chat/SkillPicker.svelte +14 -6
- package/src/chat/UsageControl.svelte +223 -0
- package/src/chat/UsageDetails.svelte +44 -90
- package/src/chat/chat-attachments.svelte.ts +78 -0
- package/src/chat/chat-panel-history.svelte.ts +430 -0
- package/src/chat/chat-panel-models.svelte.ts +97 -0
- package/src/chat/chat-panel-props.ts +38 -0
- package/src/chat/context-status.ts +101 -0
- package/src/chat/icons/LICENSE-REMIX +186 -0
- package/src/chat/icons/LICENSE-SIMPLE-ICONS +30 -0
- package/src/chat/icons/PathIcon.svelte +8 -0
- package/src/chat/icons/effort-icons.ts +65 -0
- package/src/chat/icons/status-icons.ts +105 -0
- package/src/chat/index.ts +25 -1
- package/src/chat/model-effort.ts +177 -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 +73 -135
- package/src/chat/test-support/chat-fixture.ts +194 -0
- package/src/chat/test-support/conversation-fixtures.ts +32 -0
- package/src/chat/test-support/run-session-fixture.ts +112 -0
- package/src/dev/Demo.svelte +3 -1
- package/src/i18n/en-chat.d.ts +1 -0
- package/src/i18n/en-chat.js +201 -0
- package/src/i18n/en.ts +58 -180
- package/src/i18n/index.ts +7 -2
- package/src/i18n/zh-CN-chat.d.ts +1 -0
- package/src/i18n/zh-CN-chat.js +190 -0
- package/src/i18n/zh-CN.ts +8 -153
- package/src/logs/LogPanel.svelte +9 -3
- package/src/logs/LogSettings.svelte +3 -1
- package/src/mcp/McpClientEditor.svelte +204 -0
- package/src/mcp/McpClientSettings.svelte +57 -130
- package/src/mcp/McpServerSettings.svelte +47 -11
- package/src/mcp/input.ts +2 -1
- package/src/ports/contract.ts +11 -2
- package/src/ports/fake-optional.ts +81 -0
- package/src/ports/fake.ts +90 -86
- package/src/ports/search.ts +11 -2
- package/src/ports/test-support/fake-fixture.ts +63 -0
- package/src/providers/EndpointKeysDialog.svelte +27 -13
- package/src/providers/EndpointModels.svelte +311 -0
- package/src/providers/EndpointPanel.svelte +33 -258
- package/src/providers/ModelPickerDialog.svelte +59 -16
- package/src/providers/ModelPricing.svelte +125 -0
- package/src/providers/ModelSelect.svelte +22 -8
- package/src/providers/ModelSettingsDialog.svelte +61 -126
- package/src/providers/ProviderDialogs.svelte +120 -0
- package/src/providers/ProviderList.svelte +159 -0
- package/src/providers/ProvidersSettings.svelte +67 -207
- package/src/providers/RequestConfigDialog.svelte +40 -12
- package/src/providers/SecretInput.svelte +11 -3
- package/src/providers/draft.ts +39 -13
- package/src/providers/edit-session.ts +31 -7
- package/src/providers/reasoning.ts +18 -4
- package/src/providers/revision.svelte.ts +3 -1
- 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 +62 -265
- package/src/search/settings-flow.ts +8 -3
- package/src/skills/SkillAdd.svelte +51 -18
- package/src/skills/SkillAuthoring.svelte +69 -20
- package/src/skills/SkillEditor.svelte +13 -3
- package/src/skills/SkillPreviewDialog.svelte +19 -5
- package/src/skills/SkillsSettings.svelte +11 -4
- package/src/skills/test-support/skills-fixture.ts +139 -0
- package/src/tauri/index.ts +23 -7
- package/src/web/index.ts +90 -25
package/src/i18n/en.ts
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
1
|
import type { KitErrorCode } from '../ports'
|
|
2
|
+
import { enChat } from './en-chat.js'
|
|
2
3
|
|
|
3
|
-
/**
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Every `errors.<code>` must exist, so a new KitErrorCode fails typecheck until it is translated;
|
|
6
|
+
* other keys are free-form (`pnpm kit:i18n` checks them).
|
|
7
|
+
*/
|
|
8
|
+
export type Messages = Record<
|
|
9
|
+
`errors.${KitErrorCode}` | 'common.confirm' | 'common.cancel',
|
|
10
|
+
string
|
|
11
|
+
> &
|
|
5
12
|
Record<string, string>
|
|
6
13
|
|
|
7
14
|
export const en: Messages = {
|
|
15
|
+
...enChat,
|
|
8
16
|
'common.confirm': 'OK',
|
|
9
17
|
'common.cancel': 'Cancel',
|
|
10
18
|
'skills.add.title': 'Add skill',
|
|
@@ -13,7 +21,8 @@ export const en: Messages = {
|
|
|
13
21
|
'skills.add.system': 'Search this computer',
|
|
14
22
|
'skills.add.local': 'Import local file or folder',
|
|
15
23
|
'skills.add.review_notice':
|
|
16
|
-
'Nothing is installed until you review the full skill and confirm.
|
|
24
|
+
'Nothing is installed until you review the full skill and confirm. ' +
|
|
25
|
+
'Scripts never run automatically.',
|
|
17
26
|
'skills.add.query': 'Keywords or GitHub URL',
|
|
18
27
|
'skills.add.query_hint': 'Search skills or paste a GitHub repository / skill URL',
|
|
19
28
|
'skills.add.search': 'Search',
|
|
@@ -24,12 +33,15 @@ export const en: Messages = {
|
|
|
24
33
|
'skills.add.rescan': 'Scan home folders',
|
|
25
34
|
'skills.add.pick_search_directory': 'Choose skill folder',
|
|
26
35
|
'skills.add.local_hint':
|
|
27
|
-
'Choose SKILL.md, a .zip package, or a skill folder.
|
|
36
|
+
'Choose SKILL.md, a .zip package, or a skill folder. ' +
|
|
37
|
+
'Packaged references and scripts are included in the preview.',
|
|
28
38
|
'skills.add.pick_directory': 'Choose folder',
|
|
29
39
|
'skills.add.model': 'Model',
|
|
30
40
|
'skills.add.choose_model': 'Choose a configured chat model before sending',
|
|
31
41
|
'skills.add.authoring_notice':
|
|
32
|
-
'This assistant can create and test skill files with tools running as your current user.
|
|
42
|
+
'This assistant can create and test skill files with tools running as your current user. ' +
|
|
43
|
+
'Its working directory is not a sandbox. Review each permission request; ' +
|
|
44
|
+
'nothing is installed until you preview the package and confirm.',
|
|
33
45
|
'skills.add.creator_review': 'Review the built-in skill-creator before starting',
|
|
34
46
|
'skills.add.review_creator': 'Review skill-creator',
|
|
35
47
|
'skills.add.confirm_creator': 'Confirm skill-creator and start',
|
|
@@ -37,149 +49,11 @@ export const en: Messages = {
|
|
|
37
49
|
'skills.add.authoring_input': 'Message to the skill creation assistant',
|
|
38
50
|
'skills.add.preview_artifact': 'Preview artifact',
|
|
39
51
|
'skills.add.tool_warning':
|
|
40
|
-
'Arguments preview. Allowing this tool grants current-user filesystem and network permissions,
|
|
52
|
+
'Arguments preview. Allowing this tool grants current-user filesystem and network permissions, ' +
|
|
53
|
+
'not sandboxed access. Allow only a call you trust.',
|
|
41
54
|
'skills.add.working': 'Working…',
|
|
42
55
|
'skills.add.no_results': 'No skills found.',
|
|
43
56
|
'skills.add.ignored': 'Files not imported',
|
|
44
|
-
'chat.networkOn': 'Web search on · click to turn off',
|
|
45
|
-
'chat.networkOff': 'Web search off · click to turn on',
|
|
46
|
-
'chat.title': 'Chat',
|
|
47
|
-
'chat.history': 'Conversation',
|
|
48
|
-
'chat.historyFailed': 'Could not load conversations',
|
|
49
|
-
'chat.newConversation': 'New conversation',
|
|
50
|
-
'chat.close': 'Close',
|
|
51
|
-
'chat.messages': 'Messages',
|
|
52
|
-
'chat.input': 'Message',
|
|
53
|
-
'chat.placeholder': 'Type a message, Ctrl/Cmd+Enter to send',
|
|
54
|
-
'chat.send': 'Send',
|
|
55
|
-
'chat.stop': 'Stop',
|
|
56
|
-
'chat.regenerate': 'Regenerate',
|
|
57
|
-
'chat.stopped': 'Stopped',
|
|
58
|
-
'chat.interrupted': 'Interrupted: the app closed during this reply',
|
|
59
|
-
'chat.exhausted': 'Reached the tool call round limit',
|
|
60
|
-
'chat.copy': 'Copy',
|
|
61
|
-
'chat.copied': 'Copied',
|
|
62
|
-
'chat.copyFailed': 'Could not copy',
|
|
63
|
-
'chat.insert': 'Insert',
|
|
64
|
-
'chat.retry': 'Retry',
|
|
65
|
-
'chat.more': 'More actions',
|
|
66
|
-
'chat.translationReply': 'Translation',
|
|
67
|
-
'chat.noSourceModel': 'Source model unknown',
|
|
68
|
-
'chat.switchModel': 'Switch model',
|
|
69
|
-
'chat.translate': 'Translate',
|
|
70
|
-
'chat.editReply': 'Edit',
|
|
71
|
-
'chat.replyText': 'Reply Markdown',
|
|
72
|
-
'chat.replyModel': 'Reply model',
|
|
73
|
-
'chat.targetLanguage': 'Target language',
|
|
74
|
-
'chat.branch': 'Branch',
|
|
75
|
-
'chat.copyConversation': 'Copy as new conversation',
|
|
76
|
-
'chat.save': 'Save',
|
|
77
|
-
'chat.saveFile': 'Save to local file',
|
|
78
|
-
'chat.export': 'Export',
|
|
79
|
-
'chat.exportMarkdown': 'Export as Markdown',
|
|
80
|
-
'chat.exportFailed': 'Could not download Markdown',
|
|
81
|
-
'chat.saveNote': 'Save to note',
|
|
82
|
-
'chat.saveNoteFailed': 'Could not save the note',
|
|
83
|
-
'chat.useContext': 'Set as context',
|
|
84
|
-
'chat.deleteReply': 'Delete',
|
|
85
|
-
'chat.deleteReplyTitle': 'Delete this message?',
|
|
86
|
-
'chat.deleteReparentBody': 'Later turns will attach to the previous reply. This cannot be undone.',
|
|
87
|
-
'chat.sourceModelUnavailable': 'The source model is unavailable. Use @ to pick another model.',
|
|
88
|
-
'chat.candidateHint': 'The original reply is retained. Click 👍 to set a candidate as context and continue from it.',
|
|
89
|
-
'chat.editReplyHint': 'Edits only replace this reply. A concurrent change will reject the edit and keep your draft.',
|
|
90
|
-
'chat.replyRefreshFailed': 'Could not reload the saved replies.',
|
|
91
|
-
'chat.delete': 'Delete conversation',
|
|
92
|
-
'chat.deleteTitle': 'Delete this conversation?',
|
|
93
|
-
'chat.network': 'Web search',
|
|
94
|
-
'chat.sources': 'Sources',
|
|
95
|
-
'chat.networkPrivacy':
|
|
96
|
-
'External search sends this question; preferred native search may send conversation and attached note context to the model provider.',
|
|
97
|
-
'chat.searching': 'Searching the web…',
|
|
98
|
-
'chat.searchResults': '{count} results found',
|
|
99
|
-
'chat.reasoning': 'Reasoning',
|
|
100
|
-
'chat.reasoningEffort': 'Reasoning effort',
|
|
101
|
-
'chat.reasoningStrength': 'Strength',
|
|
102
|
-
'chat.reasoningFaster': 'Faster',
|
|
103
|
-
'chat.reasoningSmarter': 'Smarter',
|
|
104
|
-
'chat.resetReasoning': 'Reset to default',
|
|
105
|
-
'chat.reasoningDefaultHint':
|
|
106
|
-
'Default sends no reasoning control; the provider decides. Choose an effort to override it.',
|
|
107
|
-
'chat.reasoningUnconfigured':
|
|
108
|
-
'No reasoning capabilities are configured for this model. Turn on “Reasoning” in model settings and choose its supported efforts to enable the slider.',
|
|
109
|
-
'chat.unknown': 'Unknown',
|
|
110
|
-
'chat.contextUsage': 'Context usage',
|
|
111
|
-
'chat.usage': 'Token usage',
|
|
112
|
-
'chat.reported': 'Measured',
|
|
113
|
-
'chat.estimated': 'Estimated',
|
|
114
|
-
'chat.modelsFailed': 'Could not load model capabilities',
|
|
115
|
-
'chat.modelsLoading': 'Loading models…',
|
|
116
|
-
'chat.retryModels': 'Retry loading models',
|
|
117
|
-
'chat.historyLoading': 'Loading conversations…',
|
|
118
|
-
'chat.retryHistory': 'Retry conversation operation',
|
|
119
|
-
'chat.rename': 'Rename conversation',
|
|
120
|
-
'chat.conversationTitle': 'Conversation title',
|
|
121
|
-
'chat.expandInput': 'Expand input',
|
|
122
|
-
'chat.collapseInput': 'Collapse input',
|
|
123
|
-
'chat.backToBottom': 'Back to bottom',
|
|
124
|
-
'chat.draftRecoverable': 'Your unsent message is available to restore after clearing the current draft.',
|
|
125
|
-
'chat.restoreDraft': 'Restore unsent message',
|
|
126
|
-
'chat.tools': 'More tools',
|
|
127
|
-
'chat.uploadAttachment': 'Upload attachment',
|
|
128
|
-
'chat.generateImage': 'Generate image',
|
|
129
|
-
'chat.generateImageOff': 'Turn off image generation',
|
|
130
|
-
'chat.quickPanel': 'Quick panel',
|
|
131
|
-
'chat.toolbarCustomize': 'Customize toolbar',
|
|
132
|
-
'chat.toolbarRestore': 'Restore default',
|
|
133
|
-
'chat.toolbarDrag': 'Drag or use ↑/↓ to reorder {name}',
|
|
134
|
-
'chat.paintingUnconfigured': 'Choose a painting model in settings first',
|
|
135
|
-
'chat.toolsUnsupported': 'The current model does not support tools',
|
|
136
|
-
'chat.generatedImages': 'Generated images',
|
|
137
|
-
'chat.openGeneratedImage': 'Open generated image {index}',
|
|
138
|
-
'chat.removeImage': 'Remove image {index}',
|
|
139
|
-
'chat.openImage': 'Open image {index}',
|
|
140
|
-
'chat.imageExpired': 'Image expired',
|
|
141
|
-
'chat.visionUnsupported': 'The current model does not support images',
|
|
142
|
-
'chat.imageLimit': 'Up to {max} images per message',
|
|
143
|
-
'chat.imageType': 'Only PNG, JPEG, WebP and GIF images are supported',
|
|
144
|
-
'chat.imageSize': 'Each image must be 4 MiB or smaller',
|
|
145
|
-
'chat.currentUsage': 'This turn',
|
|
146
|
-
'chat.totalUsage': 'Known conversation total',
|
|
147
|
-
'chat.usage.inputTokens': 'Input',
|
|
148
|
-
'chat.usage.outputTokens': 'Output',
|
|
149
|
-
'chat.usage.cacheReadTokens': 'Cache read',
|
|
150
|
-
'chat.usage.cacheWriteTokens': 'Cache write',
|
|
151
|
-
'chat.usage.reasoningTokens': 'Reasoning tokens',
|
|
152
|
-
'chat.usageHint':
|
|
153
|
-
'Cache is included in input; reasoning is included in output. Unknown counts are not treated as zero.',
|
|
154
|
-
'chat.cost': 'Cost',
|
|
155
|
-
'chat.effort.default': 'Default',
|
|
156
|
-
'chat.effort.none': 'None',
|
|
157
|
-
'chat.effort.auto': 'Auto',
|
|
158
|
-
'chat.effort.minimal': 'Minimal',
|
|
159
|
-
'chat.effort.low': 'Low',
|
|
160
|
-
'chat.effort.medium': 'Medium',
|
|
161
|
-
'chat.effort.high': 'High',
|
|
162
|
-
'chat.effort.xhigh': 'Very high',
|
|
163
|
-
'chat.effort.max': 'Maximum',
|
|
164
|
-
'chat.mode.label': 'Permission mode',
|
|
165
|
-
'chat.mode.default': 'Ask each time',
|
|
166
|
-
'chat.mode.defaultHint': 'Follow each tool’s approval setting.',
|
|
167
|
-
'chat.mode.plan': 'Plan only',
|
|
168
|
-
'chat.mode.planHint': 'Read and plan without changes.',
|
|
169
|
-
'chat.mode.accept_edits': 'Accept edits',
|
|
170
|
-
'chat.mode.accept_editsHint': 'Approve edits; other actions follow their rules.',
|
|
171
|
-
'chat.mode.auto': 'Smart approval',
|
|
172
|
-
'chat.mode.autoHint': 'Approve app tools; rules may require a prompt.',
|
|
173
|
-
'chat.mode.full_access': 'Full access',
|
|
174
|
-
'chat.mode.full_accessHint': 'No prompts for this run; blocked tools stay blocked.',
|
|
175
|
-
'chat.mode.planBadge': 'Plan only',
|
|
176
|
-
'chat.mode.fullAccessTitle': 'Allow full access for this run?',
|
|
177
|
-
'chat.mode.fullAccessBody':
|
|
178
|
-
'For this run only, tools may change data and execute commands without asking. Blocked tools stay blocked. This choice is not saved.',
|
|
179
|
-
'chat.mode.ruleNotice': 'Rules can miss risks and are not a sandbox. MCP tools keep their approval settings.',
|
|
180
|
-
'chat.mode.navigate': 'Select',
|
|
181
|
-
'chat.mode.confirm': 'Confirm',
|
|
182
|
-
'chat.mode.close': 'Close',
|
|
183
57
|
'providers.max_output': 'Maximum output (tokens)',
|
|
184
58
|
'search.search': 'Web search',
|
|
185
59
|
'search.fetch': 'Read webpage',
|
|
@@ -211,7 +85,6 @@ export const en: Messages = {
|
|
|
211
85
|
'search.pageUrl': 'URL',
|
|
212
86
|
'search.password': 'Password',
|
|
213
87
|
'search.read': 'Read',
|
|
214
|
-
'chat.deleteBody': 'Its messages cannot be restored.',
|
|
215
88
|
'search.manageKeys': 'Manage keys',
|
|
216
89
|
'search.newKey': 'New key',
|
|
217
90
|
'search.addKey': 'Add key',
|
|
@@ -228,23 +101,10 @@ export const en: Messages = {
|
|
|
228
101
|
'search.blacklist': 'Blacklist (one rule per line)',
|
|
229
102
|
'search.nativePreferred': 'Prefer native model web search',
|
|
230
103
|
'search.nativePrivacy':
|
|
231
|
-
'Declared compatible models can use native search; others use the selected external provider.
|
|
104
|
+
'Declared compatible models can use native search; others use the selected external provider. ' +
|
|
105
|
+
'Native search may send conversation and note context to the model provider. ' +
|
|
106
|
+
'Local blacklist and cutoff do not control provider-native search.',
|
|
232
107
|
'providers.nativeWebSearch': 'Model supports native web search',
|
|
233
|
-
'chat.deleteFailed': 'Could not delete the conversation',
|
|
234
|
-
'chat.empty': 'Ask anything to start',
|
|
235
|
-
'chat.noModels': 'No chat model yet. Add a provider and its models first.',
|
|
236
|
-
'chat.openSettings': 'Open settings',
|
|
237
|
-
'chat.context.remove': 'Do not send {label} with the next message',
|
|
238
|
-
'chat.tool.calling': 'Calling {name}',
|
|
239
|
-
'chat.tool.ok': '{name}: {summary}',
|
|
240
|
-
'chat.tool.error': '{name} failed: {summary}',
|
|
241
|
-
'chat.tool.denied': '{name}: denied',
|
|
242
|
-
'chat.tool.unknown': '{name}: result unknown, it may have run',
|
|
243
|
-
'chat.approval.title': 'Allow {name}?',
|
|
244
|
-
'chat.approval.host': 'App tool',
|
|
245
|
-
'chat.approval.mcp': 'MCP server {server}',
|
|
246
|
-
'chat.approval.allow': 'Allow once',
|
|
247
|
-
'chat.approval.deny': 'Deny',
|
|
248
108
|
'logs.title': 'Logs',
|
|
249
109
|
'logs.problemsOnly': 'Problems only',
|
|
250
110
|
'logs.openDir': 'Open folder',
|
|
@@ -377,7 +237,8 @@ export const en: Messages = {
|
|
|
377
237
|
'providers.price.cacheRead': 'Cache read',
|
|
378
238
|
'providers.price.cacheWrite': 'Cache write',
|
|
379
239
|
'providers.price_same_as_input': 'Same as input',
|
|
380
|
-
'providers.applies_next':
|
|
240
|
+
'providers.applies_next':
|
|
241
|
+
'Takes effect from the next message; a reply in progress is not affected.',
|
|
381
242
|
'providers.save_model_invalid': 'Settings for model {model} are invalid: {error}',
|
|
382
243
|
'providers.error.name.too_long': 'At most 80 characters',
|
|
383
244
|
'providers.error.groupName.too_long': 'At most 80 characters',
|
|
@@ -385,8 +246,10 @@ export const en: Messages = {
|
|
|
385
246
|
'providers.error.maxOutput.invalid': 'Enter a positive whole number',
|
|
386
247
|
'providers.error.maxOutput.exceeds_context': 'Max output must be smaller than the context window',
|
|
387
248
|
'providers.error.reasoning.invalid_efforts': 'Select at least one effort',
|
|
388
|
-
'providers.error.reasoning.protocol_mismatch':
|
|
389
|
-
|
|
249
|
+
'providers.error.reasoning.protocol_mismatch':
|
|
250
|
+
'The reasoning dialect does not match the endpoint protocol',
|
|
251
|
+
'providers.error.reasoning.invalid_budget':
|
|
252
|
+
'Budget must be at least 1024 and below max output (default 4096)',
|
|
390
253
|
'providers.error.reasoning.unexpected_budget': 'This reasoning dialect takes no budget',
|
|
391
254
|
'providers.error.pricing.invalid':
|
|
392
255
|
'Prices must be 0 to 1,000,000; the first tier starts at 0, starts increase, at most 8 tiers',
|
|
@@ -456,7 +319,8 @@ export const en: Messages = {
|
|
|
456
319
|
'providers.keys_desc': 'A key that is rejected or out of quota falls through to the next',
|
|
457
320
|
'providers.key_strategy': 'Key use',
|
|
458
321
|
'providers.key_strategy_round_robin': 'Rotate',
|
|
459
|
-
'providers.key_strategy_round_robin_desc':
|
|
322
|
+
'providers.key_strategy_round_robin_desc':
|
|
323
|
+
'Each request starts at the next key; spreads rate limits across keys',
|
|
460
324
|
'providers.key_strategy_fill_first': 'Use up, then next',
|
|
461
325
|
'providers.key_strategy_fill_first_desc':
|
|
462
326
|
'Always start at the first key; a key that ran out is skipped until it recovers',
|
|
@@ -484,9 +348,11 @@ export const en: Messages = {
|
|
|
484
348
|
'mcp.server.port': 'Port',
|
|
485
349
|
'mcp.server.savePort': 'Save port',
|
|
486
350
|
'mcp.server.scopes': 'Enabled scopes',
|
|
487
|
-
'mcp.server.scopesHint':
|
|
351
|
+
'mcp.server.scopesHint':
|
|
352
|
+
'A token can only call tools whose scope is both granted to it and enabled here.',
|
|
488
353
|
'mcp.server.destructiveTitle': 'Enable a destructive scope?',
|
|
489
|
-
'mcp.server.destructiveBody':
|
|
354
|
+
'mcp.server.destructiveBody':
|
|
355
|
+
'External AI clients will be able to change data through “{scope}”.',
|
|
490
356
|
'mcp.server.newToken': 'New token',
|
|
491
357
|
'mcp.server.tokenName': 'Name',
|
|
492
358
|
'mcp.server.issue': 'Issue token',
|
|
@@ -505,11 +371,13 @@ export const en: Messages = {
|
|
|
505
371
|
'mcp.server.revokeBody': 'Clients using “{name}” lose access immediately.',
|
|
506
372
|
'mcp.client.title': 'External MCP servers',
|
|
507
373
|
'mcp.client.hint':
|
|
508
|
-
'Tools of enabled and trusted servers are offered to the in-app AI;
|
|
374
|
+
'Tools of enabled and trusted servers are offered to the in-app AI; ' +
|
|
375
|
+
'each call follows its approval setting.',
|
|
509
376
|
'mcp.client.add': 'Add server',
|
|
510
377
|
'mcp.client.editTitle': 'Edit server',
|
|
511
378
|
'mcp.client.empty': 'No MCP servers yet',
|
|
512
|
-
'mcp.client.emptyHint':
|
|
379
|
+
'mcp.client.emptyHint':
|
|
380
|
+
'Add a remote (HTTP) server or a local command (stdio), test the connection, then trust it.',
|
|
513
381
|
'mcp.client.secretKeys': 'Credentials: {keys}',
|
|
514
382
|
'mcp.client.test': 'Test connection',
|
|
515
383
|
'mcp.client.testFailed': 'Connection failed: {error}',
|
|
@@ -522,9 +390,11 @@ export const en: Messages = {
|
|
|
522
390
|
'mcp.client.allowPrivate': 'Allow private network',
|
|
523
391
|
'mcp.client.trustTitle': 'Trust this server?',
|
|
524
392
|
'mcp.client.trustBody':
|
|
525
|
-
'The AI will see the tools of “{name}” and may call them;
|
|
393
|
+
'The AI will see the tools of “{name}” and may call them; ' +
|
|
394
|
+
'calls still follow each tool’s approval.',
|
|
526
395
|
'mcp.client.privateTitle': 'Allow a private-network address?',
|
|
527
|
-
'mcp.client.privateBody':
|
|
396
|
+
'mcp.client.privateBody':
|
|
397
|
+
'Requests to {url} will be allowed even though it is on the local network.',
|
|
528
398
|
'mcp.client.tools': 'Tools',
|
|
529
399
|
'mcp.client.noTools': 'No tools discovered yet: test the connection.',
|
|
530
400
|
'mcp.client.readOnlyHint': 'read-only, can be set to auto',
|
|
@@ -539,11 +409,13 @@ export const en: Messages = {
|
|
|
539
409
|
'mcp.client.transport.stdio': 'Local command (stdio)',
|
|
540
410
|
'mcp.client.command': 'Command',
|
|
541
411
|
'mcp.client.args': 'Arguments, one per line',
|
|
542
|
-
'mcp.client.argsHint':
|
|
412
|
+
'mcp.client.argsHint':
|
|
413
|
+
'Passed as is, without a shell. Put tokens in the environment variables below.',
|
|
543
414
|
'mcp.client.cwd': 'Working directory',
|
|
544
415
|
'mcp.client.cwdHint': 'Absolute path; leave empty to inherit the app’s directory.',
|
|
545
416
|
'mcp.client.env': 'Environment variables, one “NAME=value” per line',
|
|
546
|
-
'mcp.client.envHint':
|
|
417
|
+
'mcp.client.envHint':
|
|
418
|
+
'Stored encrypted and never shown again. The app’s own keys and tokens are not passed on.',
|
|
547
419
|
'mcp.client.url': 'URL',
|
|
548
420
|
'mcp.client.urlHint': 'Without credentials: put keys in the headers or query below.',
|
|
549
421
|
'mcp.client.replaceSecret': 'Replace credentials (now: {keys})',
|
|
@@ -551,10 +423,12 @@ export const en: Messages = {
|
|
|
551
423
|
'mcp.client.query': 'Query parameters, one “name=value” per line',
|
|
552
424
|
'mcp.client.secretHint': 'Stored encrypted and never shown again. Leave both empty to send none.',
|
|
553
425
|
'mcp.client.save': 'Save',
|
|
554
|
-
'mcp.client.err.credentialQuery':
|
|
426
|
+
'mcp.client.err.credentialQuery':
|
|
427
|
+
'The URL carries a credential: move it to the query parameters below',
|
|
555
428
|
'mcp.client.err.duplicateSlug': 'Another server already uses this prefix',
|
|
556
429
|
'mcp.client.err.secretLine': 'Each credential line needs a name and a value',
|
|
557
|
-
'mcp.client.err.credentialArg':
|
|
430
|
+
'mcp.client.err.credentialArg':
|
|
431
|
+
'An argument looks like a credential: move it to the environment variables',
|
|
558
432
|
'mcp.client.err.transportChanged': 'The connection type changed: replace the credentials too',
|
|
559
433
|
'skills.title': 'Skills',
|
|
560
434
|
'skills.list': 'Installed skills',
|
|
@@ -583,11 +457,13 @@ export const en: Messages = {
|
|
|
583
457
|
'skills.up': 'Move {name} up',
|
|
584
458
|
'skills.down': 'Move {name} down',
|
|
585
459
|
'skills.preview_title': 'Review before installing',
|
|
586
|
-
'skills.preview_desc':
|
|
460
|
+
'skills.preview_desc':
|
|
461
|
+
'Read the full text. A skill only guides the model; it grants no tools or access.',
|
|
587
462
|
'skills.replace': 'Replace the installed version ({version}, rev {revision})',
|
|
588
463
|
'skills.install': 'Install',
|
|
589
464
|
'skills.installed': 'Installed {name}',
|
|
590
|
-
'skills.content_changed':
|
|
465
|
+
'skills.content_changed':
|
|
466
|
+
'The file changed after the preview. Review the new text and confirm again.',
|
|
591
467
|
'skills.picker': 'Skills for this message',
|
|
592
468
|
'skills.picker_none': 'No skills',
|
|
593
469
|
'skills.picker_count': '{count} skills',
|
|
@@ -602,7 +478,8 @@ export const en: Messages = {
|
|
|
602
478
|
'skills.err.unsupported_files': 'Unsupported files in the package: {field}',
|
|
603
479
|
'skills.err.too_large': '{field} is too large (limit {limit})',
|
|
604
480
|
'skills.err.frontmatter': 'Unsupported frontmatter at line {field}',
|
|
605
|
-
'skills.err.invalid_name':
|
|
481
|
+
'skills.err.invalid_name':
|
|
482
|
+
'Invalid file name in the package: {field} (letters, digits, ".", "_", "-" only)',
|
|
606
483
|
'skills.err.too_deep': '{field} is nested too deep (at most {limit} levels)',
|
|
607
484
|
'skills.err.not_utf8': '{field} is not UTF-8 text',
|
|
608
485
|
'skills.has_scripts': 'Has scripts',
|
|
@@ -613,5 +490,6 @@ export const en: Messages = {
|
|
|
613
490
|
'skills.file_kind.asset': 'Asset',
|
|
614
491
|
'skills.file_size': '{size} B',
|
|
615
492
|
'skills.scripts_notice':
|
|
616
|
-
'Contains scripts. This app never runs them automatically;
|
|
493
|
+
'Contains scripts. This app never runs them automatically; ' +
|
|
494
|
+
'the host may run them after you approve.',
|
|
617
495
|
}
|
package/src/i18n/index.ts
CHANGED
|
@@ -10,8 +10,13 @@ export interface KitI18n {
|
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
/** `zh*` locales get Chinese, everything else English; `overrides` replace kit texts per key. */
|
|
13
|
-
export function createI18n(
|
|
14
|
-
|
|
13
|
+
export function createI18n(
|
|
14
|
+
locale: string,
|
|
15
|
+
overrides: Readonly<Record<string, string>> = {},
|
|
16
|
+
): KitI18n {
|
|
17
|
+
const messages: Readonly<Record<string, string>> = locale.toLowerCase().startsWith('zh')
|
|
18
|
+
? zhCN
|
|
19
|
+
: en
|
|
15
20
|
return {
|
|
16
21
|
locale,
|
|
17
22
|
t(key, params = {}) {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export const zhCNChat: Readonly<Record<string, string>>
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
export const zhCNChat = {
|
|
2
|
+
'chat.usageEntry': '用量',
|
|
3
|
+
'chat.networkOn': '联网搜索已开启 · 点击关闭',
|
|
4
|
+
'chat.networkOff': '联网搜索已关闭 · 点击开启',
|
|
5
|
+
'chat.title': '对话',
|
|
6
|
+
'chat.history': '会话',
|
|
7
|
+
'chat.historyFailed': '读取会话失败',
|
|
8
|
+
'chat.newConversation': '新对话',
|
|
9
|
+
'chat.close': '关闭',
|
|
10
|
+
'chat.messages': '消息',
|
|
11
|
+
'chat.input': '消息',
|
|
12
|
+
'chat.placeholder': '输入消息,Ctrl/Cmd+Enter 发送',
|
|
13
|
+
'chat.send': '发送',
|
|
14
|
+
'chat.stop': '停止',
|
|
15
|
+
'chat.regenerate': '重新生成',
|
|
16
|
+
'chat.stopped': '已停止',
|
|
17
|
+
'chat.interrupted': '已中断:回复过程中应用被关闭',
|
|
18
|
+
'chat.exhausted': '已达到工具调用轮数上限',
|
|
19
|
+
'chat.copy': '复制',
|
|
20
|
+
'chat.copied': '已复制',
|
|
21
|
+
'chat.copyFailed': '复制失败',
|
|
22
|
+
'chat.insert': '插入',
|
|
23
|
+
'chat.retry': '重试',
|
|
24
|
+
'chat.more': '更多操作',
|
|
25
|
+
'chat.translationReply': '译文',
|
|
26
|
+
'chat.noSourceModel': '来源模型未知',
|
|
27
|
+
'chat.switchModel': '切换模型',
|
|
28
|
+
'chat.translate': '翻译',
|
|
29
|
+
'chat.editReply': '编辑',
|
|
30
|
+
'chat.replyText': '回复 Markdown',
|
|
31
|
+
'chat.replyModel': '回复模型',
|
|
32
|
+
'chat.targetLanguage': '目标语言',
|
|
33
|
+
'chat.branch': '分支',
|
|
34
|
+
'chat.copyConversation': '复制为新对话',
|
|
35
|
+
'chat.save': '保存',
|
|
36
|
+
'chat.saveFile': '保存到本地文件',
|
|
37
|
+
'chat.export': '导出',
|
|
38
|
+
'chat.exportMarkdown': '导出为 Markdown',
|
|
39
|
+
'chat.exportFailed': '下载 Markdown 失败',
|
|
40
|
+
'chat.saveNote': '保存到笔记',
|
|
41
|
+
'chat.saveNoteFailed': '保存笔记失败',
|
|
42
|
+
'chat.useContext': '设置为上下文',
|
|
43
|
+
'chat.deleteReply': '删除',
|
|
44
|
+
'chat.deleteReplyTitle': '确定要删除此消息吗?',
|
|
45
|
+
'chat.deleteReparentBody': '后续对话会接到上一条回复上。此操作无法撤销。',
|
|
46
|
+
'chat.sourceModelUnavailable': '来源模型已不可用,请点 @ 选择其他模型。',
|
|
47
|
+
'chat.candidateHint': '原回复将保留。点 👍 设置为上下文后,可从候选回复继续对话。',
|
|
48
|
+
'chat.editReplyHint': '编辑只替换此回复。若回复被同时修改,将拒绝保存并保留你的草稿。',
|
|
49
|
+
'chat.replyRefreshFailed': '重新加载已保存回复失败。',
|
|
50
|
+
'chat.delete': '删除对话',
|
|
51
|
+
'chat.network': '联网搜索',
|
|
52
|
+
'chat.sources': '来源',
|
|
53
|
+
'chat.networkPrivacy':
|
|
54
|
+
'外部搜索只发送本轮问题;原生搜索优先时,可能向模型服务商发送会话及附带笔记上下文。',
|
|
55
|
+
'chat.searching': '正在搜索网页…',
|
|
56
|
+
'chat.searchResults': '找到 {count} 条结果',
|
|
57
|
+
'chat.reasoning': '思考',
|
|
58
|
+
'chat.toolProcess': '工具过程',
|
|
59
|
+
'chat.showMore': '展开更多',
|
|
60
|
+
'chat.showLess': '收起',
|
|
61
|
+
'chat.reasoningEffort': '思考强度',
|
|
62
|
+
'chat.reasoningStrength': '强度',
|
|
63
|
+
'chat.reasoningFaster': '更快',
|
|
64
|
+
'chat.reasoningSmarter': '更智能',
|
|
65
|
+
'chat.resetReasoning': '恢复默认',
|
|
66
|
+
'chat.reasoningDefaultHint': '默认不发送思考参数,由服务商决定。选择档位可指定强度。',
|
|
67
|
+
'chat.reasoningUnconfigured':
|
|
68
|
+
'此模型尚未配置思考能力。在模型设置中打开“推理”能力并选择支持的档位后,即可使用滑块。',
|
|
69
|
+
'chat.unknown': '未知',
|
|
70
|
+
'chat.contextUsage': '上下文用量',
|
|
71
|
+
'chat.usage': 'Token 用量',
|
|
72
|
+
'chat.usageSettings': '用量与设置',
|
|
73
|
+
'chat.runSettings': '运行设置',
|
|
74
|
+
'chat.reported': '实测',
|
|
75
|
+
'chat.estimated': '估算',
|
|
76
|
+
'chat.modelsFailed': '无法加载模型能力',
|
|
77
|
+
'chat.modelsLoading': '正在加载模型…',
|
|
78
|
+
'chat.retryModels': '重新加载模型',
|
|
79
|
+
'chat.historyLoading': '正在加载会话…',
|
|
80
|
+
'chat.retryHistory': '重试会话操作',
|
|
81
|
+
'chat.rename': '重命名对话',
|
|
82
|
+
'chat.conversationTitle': '对话标题',
|
|
83
|
+
'chat.expandInput': '展开输入框',
|
|
84
|
+
'chat.collapseInput': '收起输入框',
|
|
85
|
+
'chat.backToBottom': '回到底部',
|
|
86
|
+
'chat.draftRecoverable': '未发送的消息已保留,清空当前草稿后可恢复。',
|
|
87
|
+
'chat.restoreDraft': '恢复未发送消息',
|
|
88
|
+
'chat.tools': '更多工具',
|
|
89
|
+
'chat.uploadAttachment': '上传附件',
|
|
90
|
+
'chat.generateImage': '生成图片',
|
|
91
|
+
'chat.generateImageOff': '关闭生成图片',
|
|
92
|
+
'chat.quickPanel': '输入快捷面板',
|
|
93
|
+
'chat.toolbarCustomize': '自定义工具栏',
|
|
94
|
+
'chat.toolbarRestore': '恢复默认',
|
|
95
|
+
'chat.toolbarDrag': '拖动或按 ↑/↓ 调整 {name} 的顺序',
|
|
96
|
+
'chat.paintingUnconfigured': '请先在设置中选择绘图模型',
|
|
97
|
+
'chat.toolsUnsupported': '当前模型不支持工具',
|
|
98
|
+
'chat.generatedImages': '生成的图片',
|
|
99
|
+
'chat.openGeneratedImage': '打开生成的第 {index} 张图片',
|
|
100
|
+
'chat.removeImage': '移除第 {index} 张图片',
|
|
101
|
+
'chat.openImage': '打开第 {index} 张图片',
|
|
102
|
+
'chat.imageExpired': '图片已过期',
|
|
103
|
+
'chat.visionUnsupported': '当前模型不支持图片',
|
|
104
|
+
'chat.imageLimit': '每条消息最多 {max} 张图片',
|
|
105
|
+
'chat.imageType': '仅支持 PNG、JPEG、WebP 和 GIF 图片',
|
|
106
|
+
'chat.imageSize': '单张图片不能超过 4 MiB',
|
|
107
|
+
'chat.currentUsage': '本轮',
|
|
108
|
+
'chat.totalUsage': '会话已知累计',
|
|
109
|
+
'chat.usage.inputTokens': '输入',
|
|
110
|
+
'chat.usage.outputTokens': '输出',
|
|
111
|
+
'chat.usage.cacheReadTokens': '缓存读取',
|
|
112
|
+
'chat.usage.cacheWriteTokens': '缓存写入',
|
|
113
|
+
'chat.usage.reasoningTokens': '思考 tokens',
|
|
114
|
+
'chat.usageHint': '缓存计入输入,思考计入输出;未知数量不当作零。',
|
|
115
|
+
'chat.cost': '费用',
|
|
116
|
+
'chat.effort.default': '默认',
|
|
117
|
+
'chat.effort.none': '关闭',
|
|
118
|
+
'chat.effort.auto': '自动',
|
|
119
|
+
'chat.effort.minimal': '最低',
|
|
120
|
+
'chat.effort.low': '低',
|
|
121
|
+
'chat.effort.medium': '中',
|
|
122
|
+
'chat.effort.high': '高',
|
|
123
|
+
'chat.effort.xhigh': '很高',
|
|
124
|
+
'chat.effort.max': '最大',
|
|
125
|
+
'chat.effortHint.default': '使用服务商默认强度',
|
|
126
|
+
'chat.effortHint.none': '无推理 — 最快·最省',
|
|
127
|
+
'chat.effortHint.auto': '由服务商自动决定推理深度',
|
|
128
|
+
'chat.effortHint.minimal': '最简推理',
|
|
129
|
+
'chat.effortHint.low': '轻量推理 — 最快',
|
|
130
|
+
'chat.effortHint.medium': '均衡推理',
|
|
131
|
+
'chat.effortHint.high': '深度推理',
|
|
132
|
+
'chat.effortHint.xhigh': '超深度推理',
|
|
133
|
+
'chat.effortHint.max': '最高推理',
|
|
134
|
+
'chat.picker.search': '搜索模型…(可附加等级:opus high)',
|
|
135
|
+
'chat.picker.searchLabel': '搜索模型,可附加等级',
|
|
136
|
+
'chat.picker.trigger': '模型与推理强度:{name} · {effort}',
|
|
137
|
+
'chat.picker.choose': '选择模型',
|
|
138
|
+
'chat.picker.keyed': 'API 密钥',
|
|
139
|
+
'chat.picker.price': '{currency} {input} / {output} 每百万 token 起',
|
|
140
|
+
'chat.picker.context': '{size} 上下文',
|
|
141
|
+
'chat.picker.group': '模型分组 {provider},{state}',
|
|
142
|
+
'chat.picker.expanded': '已展开',
|
|
143
|
+
'chat.picker.collapsed': '已折叠',
|
|
144
|
+
'chat.picker.select': '选择模型 {name} · {provider}',
|
|
145
|
+
'chat.picker.effortFor': '力度 · {name}',
|
|
146
|
+
'chat.picker.setDefault': '设为默认',
|
|
147
|
+
'chat.picker.resetOff': '重置为 off',
|
|
148
|
+
'chat.picker.refresh': '刷新',
|
|
149
|
+
'chat.picker.refreshing': '更新中…',
|
|
150
|
+
'chat.picker.empty': '没有可用模型,请先配置服务商',
|
|
151
|
+
'chat.picker.noMatch': '没有匹配的模型',
|
|
152
|
+
'chat.picker.reloaded': '已重新载入本地目录:{count} 个聊天模型',
|
|
153
|
+
'chat.status.label': '{platform}上下文用量:{summary} · {spending}。查看用量详情',
|
|
154
|
+
'chat.mode.label': '权限模式',
|
|
155
|
+
'chat.mode.default': '逐次确认',
|
|
156
|
+
'chat.mode.defaultHint': '按工具设置逐次确认。',
|
|
157
|
+
'chat.mode.plan': '仅规划',
|
|
158
|
+
'chat.mode.planHint': '只读与规划,不执行改动。',
|
|
159
|
+
'chat.mode.accept_edits': '自动接受编辑',
|
|
160
|
+
'chat.mode.accept_editsHint': '自动批准编辑,其他操作按规则确认。',
|
|
161
|
+
'chat.mode.auto': '智能批准',
|
|
162
|
+
'chat.mode.autoHint': '自动批准应用工具,规则可要求确认。',
|
|
163
|
+
'chat.mode.full_access': '完全访问',
|
|
164
|
+
'chat.mode.full_accessHint': '本次运行免确认,禁用工具除外。',
|
|
165
|
+
'chat.mode.planBadge': '仅规划',
|
|
166
|
+
'chat.mode.fullAccessTitle': '本次运行允许完全访问?',
|
|
167
|
+
'chat.mode.fullAccessBody':
|
|
168
|
+
'仅本次运行,工具可不经确认改动数据和执行命令;已禁止的工具仍不执行。此选择不会保存。',
|
|
169
|
+
'chat.mode.ruleNotice': '规则检查可能漏判,不是安全沙箱;MCP 工具保留各自审批设置。',
|
|
170
|
+
'chat.mode.navigate': '选择',
|
|
171
|
+
'chat.mode.confirm': '确认',
|
|
172
|
+
'chat.mode.close': '关闭',
|
|
173
|
+
'chat.deleteTitle': '删除这个对话?',
|
|
174
|
+
'chat.deleteBody': '删除后消息无法恢复。',
|
|
175
|
+
'chat.deleteFailed': '删除对话失败',
|
|
176
|
+
'chat.empty': '输入问题开始对话',
|
|
177
|
+
'chat.noModels': '还没有对话模型,请先添加服务商和模型。',
|
|
178
|
+
'chat.openSettings': '打开设置',
|
|
179
|
+
'chat.context.remove': '下一条消息不附带 {label}',
|
|
180
|
+
'chat.tool.calling': '正在调用 {name}',
|
|
181
|
+
'chat.tool.ok': '{name}:{summary}',
|
|
182
|
+
'chat.tool.error': '{name} 失败:{summary}',
|
|
183
|
+
'chat.tool.denied': '{name}:已拒绝',
|
|
184
|
+
'chat.tool.unknown': '{name}:结果未知,可能已执行',
|
|
185
|
+
'chat.approval.title': '允许调用 {name}?',
|
|
186
|
+
'chat.approval.host': '应用工具',
|
|
187
|
+
'chat.approval.mcp': 'MCP 服务 {server}',
|
|
188
|
+
'chat.approval.allow': '允许本次',
|
|
189
|
+
'chat.approval.deny': '拒绝',
|
|
190
|
+
}
|