codexmate 0.0.38 → 0.0.40
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/cli/builtin-proxy.js +626 -207
- package/cli/config-bootstrap.js +6 -1
- package/cli/openai-bridge.js +541 -210
- package/cli.js +189 -4
- package/package.json +1 -1
- package/plugins/prompt-templates/computed.mjs +61 -3
- package/plugins/prompt-templates/manifest.mjs +3 -0
- package/web-ui/app.js +14 -3
- package/web-ui/modules/app.computed.main-tabs.mjs +39 -30
- package/web-ui/modules/app.methods.claude-config.mjs +111 -9
- package/web-ui/modules/app.methods.index.mjs +2 -0
- package/web-ui/modules/app.methods.openclaw-editing.mjs +48 -0
- package/web-ui/modules/app.methods.openclaw-persist.mjs +13 -7
- package/web-ui/modules/app.methods.providers.mjs +36 -10
- package/web-ui/modules/app.methods.runtime.mjs +76 -1
- package/web-ui/modules/app.methods.startup-claude.mjs +7 -0
- package/web-ui/modules/app.methods.tool-config-permissions.mjs +87 -0
- package/web-ui/modules/config-mode.computed.mjs +3 -3
- package/web-ui/modules/i18n/locales/en.mjs +1140 -0
- package/web-ui/modules/i18n/locales/ja.mjs +1130 -0
- package/web-ui/modules/i18n/locales/vi.mjs +239 -0
- package/web-ui/modules/i18n/locales/zh.mjs +1143 -0
- package/web-ui/modules/i18n.dict.mjs +9 -3195
- package/web-ui/modules/i18n.mjs +65 -16
- package/web-ui/partials/index/layout-header.html +16 -46
- package/web-ui/partials/index/modal-openclaw-config.html +135 -71
- package/web-ui/partials/index/modal-webhook.html +8 -8
- package/web-ui/partials/index/modals-basic.html +56 -16
- package/web-ui/partials/index/panel-config-claude.html +51 -21
- package/web-ui/partials/index/panel-config-codex.html +34 -5
- package/web-ui/partials/index/panel-config-openclaw.html +70 -64
- package/web-ui/partials/index/panel-dashboard.html +62 -77
- package/web-ui/partials/index/panel-settings.html +28 -7
- package/web-ui/partials/index/panel-trash.html +14 -14
- package/web-ui/res/web-ui-render.precompiled.js +1783 -1386
- package/web-ui/styles/controls-forms.css +99 -0
- package/web-ui/styles/dashboard.css +46 -14
- package/web-ui/styles/layout-shell.css +45 -0
- package/web-ui/styles/navigation-panels.css +3 -3
- package/web-ui/styles/openclaw-structured.css +383 -33
- package/web-ui/styles/responsive.css +68 -0
- package/web-ui/styles/sessions-usage.css +105 -9
- package/web-ui/styles/settings-panel.css +4 -0
|
@@ -0,0 +1,1140 @@
|
|
|
1
|
+
const en = Object.freeze({
|
|
2
|
+
// Global
|
|
3
|
+
'lang.zh': '中文',
|
|
4
|
+
'lang.en': 'English',
|
|
5
|
+
'lang.vi': 'Vietnamese',
|
|
6
|
+
'lang.label': 'Language',
|
|
7
|
+
'nav.topTabs.aria': 'Navigation',
|
|
8
|
+
|
|
9
|
+
// Common
|
|
10
|
+
'common.all': 'All',
|
|
11
|
+
'common.copy': 'Copy',
|
|
12
|
+
'common.paste': 'Paste',
|
|
13
|
+
'common.edit': 'Edit',
|
|
14
|
+
'common.install': 'Install',
|
|
15
|
+
'common.update': 'Update',
|
|
16
|
+
'common.uninstall': 'Uninstall',
|
|
17
|
+
'common.official': 'Official',
|
|
18
|
+
'common.custom': 'Custom',
|
|
19
|
+
'common.rules': 'Rules',
|
|
20
|
+
'common.troubleshooting': 'Troubleshooting',
|
|
21
|
+
'common.command': 'Command',
|
|
22
|
+
'common.mirror': 'Registry',
|
|
23
|
+
'common.packageManager': 'Package manager',
|
|
24
|
+
'common.action': 'Action',
|
|
25
|
+
'common.targets': 'Targets',
|
|
26
|
+
'common.currentPm': 'Package manager',
|
|
27
|
+
'common.currentAction': 'Action',
|
|
28
|
+
'common.mirrorActive': 'Registry',
|
|
29
|
+
'common.defaultOfficial': 'Default',
|
|
30
|
+
'common.cancel': 'Cancel',
|
|
31
|
+
'common.confirm': 'Confirm',
|
|
32
|
+
'common.add': 'Add',
|
|
33
|
+
'common.save': 'Save',
|
|
34
|
+
'common.saveApply': 'Save & apply',
|
|
35
|
+
'common.close': 'Close',
|
|
36
|
+
'common.delete': 'Delete',
|
|
37
|
+
'common.clear': 'Clear',
|
|
38
|
+
'common.show': 'Show',
|
|
39
|
+
'common.hide': 'Hide',
|
|
40
|
+
'common.detail': 'Details',
|
|
41
|
+
'common.refresh': 'Refresh',
|
|
42
|
+
'common.refreshing': 'Refreshing...',
|
|
43
|
+
'common.loading': 'Loading...',
|
|
44
|
+
'common.saving': 'Saving...',
|
|
45
|
+
'common.sending': 'Sending...',
|
|
46
|
+
'common.scanning': 'Scanning...',
|
|
47
|
+
'common.export': 'Export',
|
|
48
|
+
'common.import': 'Import',
|
|
49
|
+
'common.apply': 'Apply',
|
|
50
|
+
'common.applying': 'Applying...',
|
|
51
|
+
'common.confirming': 'Confirming...',
|
|
52
|
+
'common.refreshFromText': 'Refresh from text',
|
|
53
|
+
'common.backToEdit': 'Back to edit',
|
|
54
|
+
'common.selectAll': 'Select all',
|
|
55
|
+
'common.unselectAll': 'Unselect all',
|
|
56
|
+
'common.resetFilters': 'Reset filters',
|
|
57
|
+
'common.notEditable': 'Not editable',
|
|
58
|
+
'common.notDeletable': 'Not deletable',
|
|
59
|
+
'common.notLoaded': 'Not loaded',
|
|
60
|
+
'common.exists': 'Exists',
|
|
61
|
+
'common.notExistsWillCreateOnApply': 'Not found. Will be created on apply.',
|
|
62
|
+
'common.notExistsWillCreateOnSave': 'Not found. Will be created on save.',
|
|
63
|
+
'common.none': 'None',
|
|
64
|
+
'cli.missing.title': '{name} CLI not installed',
|
|
65
|
+
'cli.missing.subtitle': 'Install {name} CLI before using this page.',
|
|
66
|
+
'cli.missing.openDocs': 'Open install guide',
|
|
67
|
+
'cli.missing.commandAria': '{name} CLI install command',
|
|
68
|
+
|
|
69
|
+
// Brand
|
|
70
|
+
'brand.kicker.workspace': 'Workspace',
|
|
71
|
+
'brand.subtitle.localConfigSessionsWorkspace': 'Local config & sessions workspace',
|
|
72
|
+
|
|
73
|
+
// Confirm dialog
|
|
74
|
+
'confirm.aria': 'Confirm action',
|
|
75
|
+
'confirm.title.default': 'Please confirm',
|
|
76
|
+
'confirm.ok': 'Confirm',
|
|
77
|
+
'confirm.cancel': 'Cancel',
|
|
78
|
+
|
|
79
|
+
// Shared fields
|
|
80
|
+
'field.name': 'Name',
|
|
81
|
+
'field.configName': 'Config name',
|
|
82
|
+
'field.apiEndpoint': 'API endpoint',
|
|
83
|
+
'field.apiKey': 'API key',
|
|
84
|
+
'field.baseUrl': 'Base URL',
|
|
85
|
+
'field.provider': 'Provider',
|
|
86
|
+
'field.providerName': 'Provider name',
|
|
87
|
+
'field.modelName': 'Model name',
|
|
88
|
+
'field.model': 'Model',
|
|
89
|
+
'field.message': 'Message',
|
|
90
|
+
'field.varName': 'Variable name',
|
|
91
|
+
'field.targetFile': 'Target file',
|
|
92
|
+
'field.modelId': 'Model ID',
|
|
93
|
+
'field.displayName': 'Display name',
|
|
94
|
+
'field.contextAndMaxOutput': 'Context and max output',
|
|
95
|
+
'field.apiType': 'API type',
|
|
96
|
+
'field.env': 'Environment variables',
|
|
97
|
+
'field.allow': 'Allow',
|
|
98
|
+
'field.deny': 'Deny',
|
|
99
|
+
|
|
100
|
+
// Shared placeholders/hints
|
|
101
|
+
'placeholder.providerNameExample': 'e.g. myapi',
|
|
102
|
+
'placeholder.apiEndpointExample': 'https://api.example.com/v1',
|
|
103
|
+
'placeholder.providerName': 'Provider name',
|
|
104
|
+
'placeholder.keepUnchanged': 'Leave blank to keep unchanged',
|
|
105
|
+
'hint.keepKeyUnchanged': 'Leave blank to keep current key',
|
|
106
|
+
'placeholder.modelExample': 'e.g. gpt-5',
|
|
107
|
+
'placeholder.configNameExample': 'e.g. My Claude Setup',
|
|
108
|
+
'placeholder.apiKeyExampleClaude': 'sk-ant-...',
|
|
109
|
+
'placeholder.baseUrlExampleClaude': 'https://open.bigmodel.cn/api/anthropic',
|
|
110
|
+
'placeholder.selectProvider': 'Select a provider',
|
|
111
|
+
|
|
112
|
+
// Roles / labels
|
|
113
|
+
'role.you': 'You',
|
|
114
|
+
'role.provider': 'Provider',
|
|
115
|
+
'label.model': 'Model:',
|
|
116
|
+
|
|
117
|
+
// Top tabs
|
|
118
|
+
'tab.dashboard': 'Dashboard',
|
|
119
|
+
'tab.docs': 'Docs',
|
|
120
|
+
'tab.config': 'Config',
|
|
121
|
+
'tab.config.codex': 'Codex',
|
|
122
|
+
'tab.config.claude': 'Claude',
|
|
123
|
+
'tab.config.openclaw': 'OpenClaw',
|
|
124
|
+
'tab.sessions': 'Sessions',
|
|
125
|
+
'tab.usage': 'Usage',
|
|
126
|
+
'tab.orchestration': 'Tasks',
|
|
127
|
+
'tab.market': 'Skills',
|
|
128
|
+
'tab.plugins': 'Plugins',
|
|
129
|
+
'tab.settings': 'Settings',
|
|
130
|
+
|
|
131
|
+
// Side rail section titles
|
|
132
|
+
'side.overview': 'Overview',
|
|
133
|
+
'side.docs': 'Docs',
|
|
134
|
+
'side.config': 'Config',
|
|
135
|
+
'side.sessions': 'Sessions',
|
|
136
|
+
'side.plugins': 'Plugins',
|
|
137
|
+
'side.system': 'System',
|
|
138
|
+
'side.orchestration': 'Tasks',
|
|
139
|
+
'side.skills': 'Skills',
|
|
140
|
+
|
|
141
|
+
// Side rail items
|
|
142
|
+
'side.overview.doctor': 'Doctor',
|
|
143
|
+
'side.overview.doctor.meta': 'Overview / Diagnostics',
|
|
144
|
+
'side.docs.cliInstall': 'CLI Install',
|
|
145
|
+
'side.docs.cliInstall.meta': 'Install / Update / Uninstall',
|
|
146
|
+
'side.config.codex': 'Codex',
|
|
147
|
+
'side.config.codex.meta': 'Provider / Model',
|
|
148
|
+
'side.config.claude': 'Claude Code',
|
|
149
|
+
'side.config.claude.meta': 'Claude Settings',
|
|
150
|
+
'side.config.openclaw': 'OpenClaw',
|
|
151
|
+
'side.config.openclaw.meta': 'JSON5 / AGENTS',
|
|
152
|
+
'side.sessions.browser': 'Session Browser',
|
|
153
|
+
'side.sessions.browser.meta': 'Browse / Export / Cleanup',
|
|
154
|
+
'side.plugins.tools': 'Prompt Tools',
|
|
155
|
+
'side.plugins.tools.meta': 'Templates / Variables',
|
|
156
|
+
'side.plugins.templatesCount': '{count} templates',
|
|
157
|
+
'side.system.settings': 'Runtime Settings',
|
|
158
|
+
'side.system.settings.meta': 'Data / Backup',
|
|
159
|
+
'side.newTab': 'New tab',
|
|
160
|
+
|
|
161
|
+
// Header titles
|
|
162
|
+
'kicker.dashboard': 'Doctor',
|
|
163
|
+
'kicker.config': 'Configuration',
|
|
164
|
+
'kicker.sessions': 'Sessions',
|
|
165
|
+
'kicker.usage': 'Usage',
|
|
166
|
+
'kicker.orchestration': 'Tasks',
|
|
167
|
+
'kicker.market': 'Skills',
|
|
168
|
+
'kicker.plugins': 'Plugins',
|
|
169
|
+
'kicker.docs': 'Docs',
|
|
170
|
+
'kicker.trash': 'Trash',
|
|
171
|
+
'kicker.settings': 'Settings',
|
|
172
|
+
|
|
173
|
+
'title.dashboard': 'Dashboard / Doctor',
|
|
174
|
+
'title.config': 'Local Configuration Console',
|
|
175
|
+
'title.sessions': 'Sessions & Export',
|
|
176
|
+
'title.usage': 'Local Usage & Trends',
|
|
177
|
+
'title.orchestration': 'Task Orchestration',
|
|
178
|
+
'title.market': 'Skills Install & Sync',
|
|
179
|
+
'title.plugins': 'Plugins & Templates',
|
|
180
|
+
'title.docs': 'CLI Install & Docs',
|
|
181
|
+
'title.settings': 'System & Data Settings',
|
|
182
|
+
|
|
183
|
+
'subtitle.dashboard': 'Aggregate status and diagnostics.',
|
|
184
|
+
'subtitle.config': 'Manage local configs and models.',
|
|
185
|
+
'subtitle.sessions': 'Browse and export sessions.',
|
|
186
|
+
'subtitle.usage': 'View usage for the last 7/30 days.',
|
|
187
|
+
'subtitle.orchestration': 'Plan, queue, run, and review local tasks.',
|
|
188
|
+
'subtitle.market': 'Manage local skills.',
|
|
189
|
+
'subtitle.plugins': 'Manage reusable prompt templates and plugins.',
|
|
190
|
+
'subtitle.docs': 'CLI install commands and troubleshooting.',
|
|
191
|
+
'subtitle.settings': 'Manage downloads, directories, and trash.',
|
|
192
|
+
'dashboard.doctor.title': 'Doctor',
|
|
193
|
+
'dashboard.doctor.runChecks': 'Run checks',
|
|
194
|
+
'dashboard.doctor.checking': 'Checking...',
|
|
195
|
+
'dashboard.doctor.export': 'Export report',
|
|
196
|
+
'dashboard.doctor.export.json': 'Export JSON',
|
|
197
|
+
'dashboard.doctor.export.md': 'Export Markdown',
|
|
198
|
+
'dashboard.doctor.open': 'Open',
|
|
199
|
+
'doctor.action.openConfig': 'Open Config',
|
|
200
|
+
'doctor.action.checkProvider': 'Check provider config',
|
|
201
|
+
'doctor.action.openUsage': 'Open Usage',
|
|
202
|
+
'doctor.action.openSessions': 'Open Sessions',
|
|
203
|
+
'doctor.action.openTasks': 'Open Tasks',
|
|
204
|
+
'doctor.action.viewTaskLogs': 'View Tasks / Logs',
|
|
205
|
+
'doctor.action.openSkills': 'Open Skills',
|
|
206
|
+
'doctor.issue.configNotReady.problem': 'Config is not ready',
|
|
207
|
+
'doctor.issue.configNotReady.impact': 'Provider/model cannot be read; model listing and requests may fail.',
|
|
208
|
+
'doctor.issue.providerUnreachable.problem.remote-model-probe-unreachable': 'Provider unreachable',
|
|
209
|
+
'doctor.issue.providerUnreachable.problem.remote-model-probe-auth-failed': 'Provider auth failed',
|
|
210
|
+
'doctor.issue.providerUnreachable.problem.remote-model-probe-not-found': 'Provider endpoint returned 404',
|
|
211
|
+
'doctor.issue.providerUnreachable.problem.remote-model-probe-http-error': 'Provider returned HTTP error',
|
|
212
|
+
'doctor.issue.providerUnreachable.problem.remote-model-probe-error': 'Provider probe failed',
|
|
213
|
+
'doctor.issue.providerUnreachable.problem.unknown': 'Provider unreachable',
|
|
214
|
+
'doctor.issue.providerUnreachable.impactAuth': 'Auth failure will cause model listing and chat requests to return 401/403.',
|
|
215
|
+
'doctor.issue.providerUnreachable.impactNetwork': 'Unreachable provider will cause model listing and chat requests to fail or timeout.',
|
|
216
|
+
'doctor.issue.configHealthFailed.problem': 'Config health check failed',
|
|
217
|
+
'doctor.issue.configHealthFailed.impact': 'Some features may be unavailable or behave unexpectedly.',
|
|
218
|
+
'doctor.issue.usageError.problem': 'Usage aggregation failed',
|
|
219
|
+
'doctor.issue.usageError.impact': 'Usage charts and summaries may be unavailable; Doctor usage diagnostics will be incomplete.',
|
|
220
|
+
'doctor.issue.usageMissingModel.problem': 'Some sessions miss model metadata',
|
|
221
|
+
'doctor.issue.usageMissingModel.impact': 'Usage attribution and cost estimates may be inaccurate.',
|
|
222
|
+
'doctor.issue.tasksError.problem': 'Task overview failed',
|
|
223
|
+
'doctor.issue.tasksError.impact': 'Task queue and run history may be unavailable.',
|
|
224
|
+
'doctor.issue.tasksFailed.problem': 'Failed task runs detected',
|
|
225
|
+
'doctor.issue.tasksFailed.impact': 'Automation pipelines may be blocked; inspect logs and retry after fixing inputs.',
|
|
226
|
+
'doctor.issue.skillsError.problem': 'Skills listing failed',
|
|
227
|
+
'doctor.issue.skillsError.impact': 'Skills marketplace may be unavailable.',
|
|
228
|
+
'doctor.issue.skillsRootMissing.problem': 'Skills directory is missing',
|
|
229
|
+
'doctor.issue.skillsRootMissing.impact': 'Skills install/scan will be empty; create the directory via Settings/Docs.',
|
|
230
|
+
'doctor.issue.skillsMissingFiles.problem': 'Some skills are missing skill.json',
|
|
231
|
+
'doctor.issue.skillsMissingFiles.impact': 'Those skills may not run or sync properly.',
|
|
232
|
+
'dashboard.card.config': 'Config',
|
|
233
|
+
'dashboard.card.sessions': 'Sessions',
|
|
234
|
+
'dashboard.card.usage': 'Usage',
|
|
235
|
+
'dashboard.card.tasks': 'Tasks',
|
|
236
|
+
'dashboard.card.skills': 'Skills',
|
|
237
|
+
'dashboard.kv.model': 'Model',
|
|
238
|
+
'dashboard.kv.issue': 'Issue',
|
|
239
|
+
'dashboard.kv.active': 'Active',
|
|
240
|
+
'dashboard.kv.sessions': 'Sessions',
|
|
241
|
+
'dashboard.kv.missingModel': 'Missing model',
|
|
242
|
+
'dashboard.kv.blockers': 'Blockers',
|
|
243
|
+
'dashboard.kv.runs': 'Runs',
|
|
244
|
+
'dashboard.kv.target': 'Target',
|
|
245
|
+
'dashboard.kv.root': 'Root',
|
|
246
|
+
'dashboard.status.health': 'Health',
|
|
247
|
+
'dashboard.status.busy': 'Busy',
|
|
248
|
+
'dashboard.status.models': 'Models',
|
|
249
|
+
'dashboard.busy.init': 'Init',
|
|
250
|
+
'dashboard.busy.sessions': 'Sessions',
|
|
251
|
+
'dashboard.busy.models': 'Models',
|
|
252
|
+
'dashboard.busy.configApply': 'Apply config',
|
|
253
|
+
'dashboard.busy.agents': 'Saving agents',
|
|
254
|
+
'dashboard.busy.skills': 'Skills',
|
|
255
|
+
'dashboard.busy.tasks': 'Tasks',
|
|
256
|
+
'dashboard.busy.idle': 'Idle',
|
|
257
|
+
'dashboard.message.none': 'No messages',
|
|
258
|
+
'dashboard.sessionSource.codex': 'Codex',
|
|
259
|
+
'dashboard.sessionSource.claude': 'Claude Code',
|
|
260
|
+
'dashboard.sessionSource.gemini': 'Gemini CLI',
|
|
261
|
+
'dashboard.sessionSource.codebuddy': 'CodeBuddy Code',
|
|
262
|
+
'dashboard.sessionSource.all': 'All',
|
|
263
|
+
'dashboard.sessionPath.all': 'All paths',
|
|
264
|
+
'dashboard.sessionQuery.unsupported': 'Unsupported source',
|
|
265
|
+
'dashboard.sessionQuery.unset': 'Not set',
|
|
266
|
+
'dashboard.healthStatus.failRead': 'Failed',
|
|
267
|
+
'dashboard.healthStatus.initializing': 'Initializing',
|
|
268
|
+
'dashboard.healthStatus.ok': 'OK',
|
|
269
|
+
'dashboard.modelStatus.loading': 'Loading',
|
|
270
|
+
'dashboard.modelStatus.error': 'Error',
|
|
271
|
+
'dashboard.modelStatus.ok': 'OK',
|
|
272
|
+
'dashboard.health.ok': 'Checks passed',
|
|
273
|
+
'dashboard.health.fail': 'Checks failed',
|
|
274
|
+
'dashboard.health.issues': '{count} issues',
|
|
275
|
+
'dashboard.issues.title': '{count} actionable issues',
|
|
276
|
+
'dashboard.state.loading': 'Loading',
|
|
277
|
+
'dashboard.state.ready': 'Ready',
|
|
278
|
+
'dashboard.state.idle': 'Idle',
|
|
279
|
+
'dashboard.none': 'None',
|
|
280
|
+
'dashboard.sessions.count': '{count} sessions',
|
|
281
|
+
'dashboard.usage.range': 'Range {value}',
|
|
282
|
+
'dashboard.tasks.queue': 'run {running} / queue {queued}',
|
|
283
|
+
'dashboard.skills.count': 'installed {installed} / import {importable}',
|
|
284
|
+
'dashboard.providersHealth.title': 'Provider Health',
|
|
285
|
+
'dashboard.providersHealth.current': '(current)',
|
|
286
|
+
'dashboard.providersHealth.checking': 'Checking...',
|
|
287
|
+
'dashboard.providersHealth.allOk': 'All providers OK',
|
|
288
|
+
'dashboard.providersHealth.hasIssues': '{count} provider(s) have issues',
|
|
289
|
+
|
|
290
|
+
// Plugins panel
|
|
291
|
+
'plugins.sidebar.title': 'Plugins',
|
|
292
|
+
'plugins.sidebar.note': 'Reusable, standardized utilities. Future custom plugins should follow the same structure.',
|
|
293
|
+
'plugins.sidebar.ariaList': 'Plugin list',
|
|
294
|
+
'plugins.catalog.promptTemplates.title': 'Prompt templates',
|
|
295
|
+
'plugins.catalog.promptTemplates.description': 'Standardized, template-driven prompt tools with variables, copy, and export helpers.',
|
|
296
|
+
'plugins.status.standard': 'standard',
|
|
297
|
+
'plugins.main.ariaWorkspace': 'Plugin workspace',
|
|
298
|
+
'plugins.refresh': 'Refresh',
|
|
299
|
+
'plugins.refreshing': 'Refreshing...',
|
|
300
|
+
'plugins.promptTemplates.title': 'Prompt templates',
|
|
301
|
+
'plugins.promptTemplates.subtitle': 'Built-in: comment polish ({{code}}). Copy and paste into Codex/Claude.',
|
|
302
|
+
'plugins.promptTemplates.mode.aria': 'Prompt templates mode',
|
|
303
|
+
'plugins.promptTemplates.mode.compose': 'Compose',
|
|
304
|
+
'plugins.promptTemplates.mode.manage': 'Manage',
|
|
305
|
+
'plugins.promptTemplates.compose.selectTemplate': 'Select template',
|
|
306
|
+
'plugins.promptTemplates.compose.chooseTemplate': 'Choose a template',
|
|
307
|
+
'plugins.promptTemplates.compose.chooseTemplateHint': 'Select a template to start composing.',
|
|
308
|
+
'plugins.promptTemplates.compose.builtinSuffix': ' (built-in)',
|
|
309
|
+
'plugins.promptTemplates.compose.empty': 'No templates available.',
|
|
310
|
+
'plugins.promptTemplates.compose.varsHint': 'Fill and add variables in “Manage”.',
|
|
311
|
+
'plugins.promptTemplates.compose.missingCount': '{count} missing',
|
|
312
|
+
'plugins.promptTemplates.compose.jumpToMissing': 'Jump to missing',
|
|
313
|
+
'plugins.promptTemplates.compose.goManage': 'Manage variables',
|
|
314
|
+
'plugins.promptTemplates.compose.outputTitle': 'Output',
|
|
315
|
+
'plugins.promptTemplates.compose.outputHint': 'Click “Copy” and paste into Codex/Claude.',
|
|
316
|
+
'plugins.promptTemplates.compose.outputAria': 'Rendered prompt',
|
|
317
|
+
'plugins.promptTemplates.compose.copy': 'Copy',
|
|
318
|
+
'plugins.promptTemplates.manage.searchAria': 'Search templates',
|
|
319
|
+
'plugins.promptTemplates.manage.searchPlaceholder': 'Search templates',
|
|
320
|
+
'plugins.promptTemplates.manage.create': 'New',
|
|
321
|
+
'plugins.promptTemplates.manage.export': 'Export',
|
|
322
|
+
'plugins.promptTemplates.manage.import': 'Import',
|
|
323
|
+
'plugins.promptTemplates.manage.loading': 'Loading templates...',
|
|
324
|
+
'plugins.promptTemplates.manage.empty': 'No templates.',
|
|
325
|
+
'plugins.promptTemplates.manage.vars': '{count} vars',
|
|
326
|
+
'plugins.promptTemplates.manage.builtin': 'built-in',
|
|
327
|
+
'plugins.promptTemplates.manage.custom': 'custom',
|
|
328
|
+
'plugins.promptTemplates.manage.newTemplateName': 'New template',
|
|
329
|
+
'plugins.promptTemplates.editor.selectHint': 'Select a template to edit.',
|
|
330
|
+
'plugins.promptTemplates.editor.namePlaceholder': 'Template name',
|
|
331
|
+
'plugins.promptTemplates.editor.nameAria': 'Template name',
|
|
332
|
+
'plugins.promptTemplates.editor.duplicate': 'Duplicate',
|
|
333
|
+
'plugins.promptTemplates.editor.delete': 'Delete',
|
|
334
|
+
'plugins.promptTemplates.editor.save': 'Save',
|
|
335
|
+
'plugins.promptTemplates.editor.builtinReadOnly': 'Built-in templates are read-only (no edit/save/delete/duplicate).',
|
|
336
|
+
'plugins.promptTemplates.editor.descPlaceholder': 'Description (optional)',
|
|
337
|
+
'plugins.promptTemplates.editor.descAria': 'Template description',
|
|
338
|
+
'plugins.promptTemplates.editor.templateLabel': 'Template',
|
|
339
|
+
'plugins.promptTemplates.editor.templateAria': 'Template body',
|
|
340
|
+
'plugins.promptTemplates.editor.templatePlaceholder': 'Write your template here. Use {{var}} placeholders.',
|
|
341
|
+
'plugins.promptTemplates.vars.title': 'Variables',
|
|
342
|
+
'plugins.promptTemplates.vars.hint': 'Detected from the template. Fill them to render the final prompt.',
|
|
343
|
+
'plugins.promptTemplates.vars.reset': 'Reset',
|
|
344
|
+
'plugins.promptTemplates.vars.empty': 'No variables detected.',
|
|
345
|
+
'plugins.promptTemplates.vars.valuePlaceholder': 'Value for {name}',
|
|
346
|
+
'plugins.promptTemplates.preview.title': 'Preview',
|
|
347
|
+
'plugins.promptTemplates.preview.hint': 'Rendered output (missing vars become empty).',
|
|
348
|
+
'plugins.promptTemplates.preview.copy': 'Copy',
|
|
349
|
+
'plugins.promptTemplates.preview.outputAria': 'Rendered prompt',
|
|
350
|
+
'plugins.promptTemplates.noPluginSelected': 'Select a plugin from the left panel first.',
|
|
351
|
+
|
|
352
|
+
'plugins.meta.attribution': 'Created by {createdBy} · Maintained by {maintainers}',
|
|
353
|
+
'plugins.meta.createdBy': 'Created by {createdBy}',
|
|
354
|
+
'plugins.meta.maintainedBy': 'Maintained by {maintainers}',
|
|
355
|
+
|
|
356
|
+
// Built-in prompt templates
|
|
357
|
+
'plugins.builtin.commentPolish.name': 'Comment polish',
|
|
358
|
+
'plugins.builtin.commentPolish.desc': 'Polish the following code comments {{code}}',
|
|
359
|
+
'plugins.builtin.commentPolish.line1': 'Polish the following code comments',
|
|
360
|
+
'plugins.builtin.ruleAck.name': 'Rule acknowledgement',
|
|
361
|
+
'plugins.builtin.ruleAck.desc': 'Please follow 【{{rule}}】, reply when received',
|
|
362
|
+
'plugins.builtin.ruleAck.line1': 'Please follow 【{{rule}}】, reply when received',
|
|
363
|
+
|
|
364
|
+
// Toasts
|
|
365
|
+
'toast.copy.empty': 'Nothing to copy',
|
|
366
|
+
'toast.copy.ok': 'Copied',
|
|
367
|
+
'toast.copy.fail': 'Copy failed',
|
|
368
|
+
'toast.save.ok': 'Saved',
|
|
369
|
+
'toast.save.fail': 'Save failed',
|
|
370
|
+
'toast.delete.ok': 'Deleted',
|
|
371
|
+
'toast.delete.fail': 'Delete failed',
|
|
372
|
+
'toast.export.empty': 'Nothing to export',
|
|
373
|
+
'toast.export.ok': 'Exported',
|
|
374
|
+
'toast.export.fail': 'Export failed',
|
|
375
|
+
'toast.import.ok': 'Imported',
|
|
376
|
+
'toast.import.fail': 'Import failed',
|
|
377
|
+
'toast.import.notAvailable': 'Import is not available',
|
|
378
|
+
'toast.import.readFileFail': 'Failed to read file',
|
|
379
|
+
'toast.import.invalidJson': 'Invalid JSON',
|
|
380
|
+
'toast.import.expectedArray': 'Expected an array',
|
|
381
|
+
'toast.export.notSupported': 'Export not supported',
|
|
382
|
+
'toast.plugins.loadFail': 'Failed to load plugins',
|
|
383
|
+
'toast.templates.builtinNotEditable': 'Built-in templates are not editable',
|
|
384
|
+
'toast.templates.builtinNotModifiable': 'Built-in templates are read-only. Duplicate first.',
|
|
385
|
+
'toast.templates.nameRequired': 'Template name is required',
|
|
386
|
+
'toast.templates.builtinNotDuplicable': 'Built-in templates cannot be duplicated',
|
|
387
|
+
'toast.templates.builtinNotDeletable': 'Built-in templates cannot be deleted',
|
|
388
|
+
'toast.templates.deleteTitle': 'Delete template',
|
|
389
|
+
'toast.templates.deleteMessage': 'Delete “{name}”? This action cannot be undone.',
|
|
390
|
+
'toast.templates.deleteConfirm': 'Delete',
|
|
391
|
+
'toast.templates.deleteCancel': 'Cancel',
|
|
392
|
+
|
|
393
|
+
// Basic modals
|
|
394
|
+
'modal.providerAdd.title': 'Add provider',
|
|
395
|
+
'modal.providerEdit.title': 'Edit provider',
|
|
396
|
+
'modal.modelAdd.title': 'Add model',
|
|
397
|
+
'modal.modelManage.title': 'Manage models',
|
|
398
|
+
'modal.claudeConfigAdd.title': 'Add Claude Code config',
|
|
399
|
+
'modal.claudeConfigEdit.title': 'Edit Claude Code config',
|
|
400
|
+
'field.useBuiltinTransform': 'Use built-in transform (OpenAI compatible)',
|
|
401
|
+
'hint.useBuiltinTransform': 'When enabled, base_url points to codexmate built-in transform service; Codex token is fixed to codexmate.',
|
|
402
|
+
|
|
403
|
+
// Config template / agents modals
|
|
404
|
+
'modal.configTemplate.label': 'config.toml template',
|
|
405
|
+
'modal.configTemplate.mode.twoStep': 'Two-step confirm: preview diff, then apply.',
|
|
406
|
+
'modal.configTemplate.mode.oneStep': 'One-step apply: write immediately.',
|
|
407
|
+
'diff.title.configTemplate': 'Diff preview (config.toml)',
|
|
408
|
+
'diff.generating': 'Generating...',
|
|
409
|
+
'diff.failed': 'Failed',
|
|
410
|
+
'diff.noChanges': 'No changes detected',
|
|
411
|
+
'diff.hint.busy': 'Generating diff or applying. Actions are temporarily disabled.',
|
|
412
|
+
'diff.hint.failedBack': 'Diff preview failed. Go back to edit and retry.',
|
|
413
|
+
'diff.hint.noChangesBack': 'No changes detected. Go back to edit or cancel.',
|
|
414
|
+
'diff.hint.previewMode': 'Preview mode. Click “Apply” to write or “Back to edit” to continue.',
|
|
415
|
+
|
|
416
|
+
'modal.agents.export': 'Export',
|
|
417
|
+
'modal.agents.copy': 'Copy',
|
|
418
|
+
'modal.agents.title': 'AGENTS.md editor',
|
|
419
|
+
'modal.agents.hint': 'Saved content will be written to the target AGENTS.md (next to config.toml).',
|
|
420
|
+
'modal.agents.targetFile': 'Target file',
|
|
421
|
+
'modal.agents.contentLabel': 'AGENTS.md content',
|
|
422
|
+
'modal.agents.placeholder': 'Edit AGENTS.md here',
|
|
423
|
+
'modal.agents.unsaved.previewModeHint': 'Preview mode: changes are not saved until you click “Apply”.',
|
|
424
|
+
'modal.agents.unsaved.detectedHint': 'Unsaved changes detected: save before closing or applying.',
|
|
425
|
+
'modal.agents.hint.shortcuts': 'Shortcut: Esc (back to edit in preview, close in edit).',
|
|
426
|
+
'modal.agents.hint.twoStepSave': 'Two-step save: “Confirm” to preview diff, then “Apply” to save.',
|
|
427
|
+
'diff.tooLargeSkip': 'Content too large. Line diff preview skipped.',
|
|
428
|
+
'diff.viewHint.preview': 'Preview mode. Click “Apply” to save or “Back to edit” to continue.',
|
|
429
|
+
'diff.viewHint.truncated': 'Preview skipped due to size. Click “Apply” to save or “Back to edit” to continue.',
|
|
430
|
+
|
|
431
|
+
// Skills modal
|
|
432
|
+
'modal.skills.title': 'Skills manager',
|
|
433
|
+
'modal.skills.subtitle': 'Manage local skills for the current host.',
|
|
434
|
+
'modal.skills.target.aria': 'Select skills target',
|
|
435
|
+
'modal.skills.rootDir': 'Skills directory ({label})',
|
|
436
|
+
'modal.skills.summary.target': 'Target',
|
|
437
|
+
'modal.skills.summary.total': 'Total',
|
|
438
|
+
'modal.skills.summary.withSkill': 'With SKILL.md',
|
|
439
|
+
'modal.skills.summary.missingSkill': 'Missing SKILL.md',
|
|
440
|
+
'modal.skills.summary.importable': 'Importable',
|
|
441
|
+
'modal.skills.panel.aria': 'Skills manager',
|
|
442
|
+
'modal.skills.local.title': 'Local skills',
|
|
443
|
+
'modal.skills.local.note': 'Search, filter, and bulk delete.',
|
|
444
|
+
'modal.skills.filter.keywordAria': 'Filter by name or description',
|
|
445
|
+
'modal.skills.filter.keywordPlaceholder': 'Search by dir name / display name / description',
|
|
446
|
+
'modal.skills.filter.statusAria': 'Filter by SKILL.md status',
|
|
447
|
+
'modal.skills.filter.status.all': 'All',
|
|
448
|
+
'modal.skills.filter.status.withSkill': 'With SKILL.md',
|
|
449
|
+
'modal.skills.filter.status.missingSkill': 'Missing SKILL.md',
|
|
450
|
+
'modal.skills.selection.stats': '{selected} selected (filtered {filtered} / {total}, selected in filtered {visibleSelected})',
|
|
451
|
+
'modal.skills.empty.local': 'No skills to manage.',
|
|
452
|
+
'modal.skills.empty.filtered': 'No skills match the current filters.',
|
|
453
|
+
'modal.skills.pill.hasSkillFile': 'Has SKILL.md',
|
|
454
|
+
'modal.skills.pill.missingSkillFile': 'Missing SKILL.md',
|
|
455
|
+
'modal.skills.pill.symlink': 'Symlink',
|
|
456
|
+
'modal.skills.pill.dir': 'Directory',
|
|
457
|
+
'modal.skills.import.title': 'Cross-app import',
|
|
458
|
+
'modal.skills.import.note': 'Scan and import into {label}.',
|
|
459
|
+
'modal.skills.import.scan': 'Scan importable',
|
|
460
|
+
'modal.skills.import.stats': '{selected} selected / {total}. With SKILL.md {configured}, missing {missing}.',
|
|
461
|
+
'modal.skills.import.emptyHint': 'No importable skills. Click “Scan importable”.',
|
|
462
|
+
'modal.skills.bulk.title': 'Bulk actions',
|
|
463
|
+
'modal.skills.bulk.note': 'Right side is import selection; left side is local selection.',
|
|
464
|
+
'modal.skills.actions.zipImport': 'Import ZIP',
|
|
465
|
+
'modal.skills.actions.zipImporting': 'Importing ZIP...',
|
|
466
|
+
'modal.skills.actions.exportSelected': 'Export selected',
|
|
467
|
+
'modal.skills.actions.exporting': 'Exporting...',
|
|
468
|
+
'modal.skills.actions.importSelected': 'Import selected',
|
|
469
|
+
'modal.skills.actions.importing': 'Importing...',
|
|
470
|
+
'modal.skills.actions.deleteSelected': 'Delete selected',
|
|
471
|
+
'modal.skills.actions.deleting': 'Deleting...',
|
|
472
|
+
|
|
473
|
+
// OpenClaw config modal (quick)
|
|
474
|
+
'placeholder.openclawConfigNameExample': 'e.g. Default',
|
|
475
|
+
'modal.openclaw.loadCurrent': 'Load current config',
|
|
476
|
+
'modal.openclaw.quick.title': 'Quick setup',
|
|
477
|
+
'modal.openclaw.quick.readFromEditor': 'Read from editor',
|
|
478
|
+
'modal.openclaw.quick.step1': 'Fill provider and model',
|
|
479
|
+
'modal.openclaw.quick.step3': 'Save & apply',
|
|
480
|
+
'modal.openclaw.quick.providerHint': 'Will be combined as provider/model for the primary model identifier.',
|
|
481
|
+
'modal.openclaw.quick.baseUrlHintDefault': 'Pre-filled from OpenClaw built-in provider defaults. You can edit it directly.',
|
|
482
|
+
'modal.openclaw.quick.baseUrlHintReadonly': 'Detected an external reference. Read-only in quick form; edit in raw editor.',
|
|
483
|
+
'modal.openclaw.quick.apiKeyHintFromAuth': 'Value comes from external auth profile; changes will be written back on save & apply.',
|
|
484
|
+
'modal.openclaw.quick.apiKeyHintReadonly': 'Detected external auth/reference. Read-only in quick form; edit in raw editor or auth config.',
|
|
485
|
+
'modal.openclaw.quick.apiKeyHintKeep': 'Leave blank to keep existing key.',
|
|
486
|
+
'placeholder.apiTypeExample': 'e.g. openai-responses',
|
|
487
|
+
'modal.openclaw.quick.modelTitle': 'Model',
|
|
488
|
+
'placeholder.modelIdExample': 'e.g. gpt-4.1',
|
|
489
|
+
'placeholder.modelNameOptional': 'Leave blank to use model ID',
|
|
490
|
+
'field.contextWindow': 'Context window',
|
|
491
|
+
'field.maxOutput': 'Max output',
|
|
492
|
+
'hint.emptyNoChange': 'Leave blank to keep existing values.',
|
|
493
|
+
'modal.openclaw.quick.optionsTitle': 'Options',
|
|
494
|
+
'modal.openclaw.quick.setPrimary': 'Set as primary model',
|
|
495
|
+
'modal.openclaw.quick.overrideProvider': 'Override provider base settings',
|
|
496
|
+
'modal.openclaw.quick.overrideModels': 'Override model list',
|
|
497
|
+
'modal.openclaw.quick.optionsHint': 'When override is off, only missing fields will be filled.',
|
|
498
|
+
'modal.openclaw.quick.writeToEditor': 'Write to editor',
|
|
499
|
+
|
|
500
|
+
// Docs panel
|
|
501
|
+
'docs.title': 'CLI Install',
|
|
502
|
+
'docs.subtitle': 'Install commands for Claude Code / Gemini CLI / CodeBuddy Code / Codex CLI.',
|
|
503
|
+
'docs.section.commands': 'Commands',
|
|
504
|
+
'docs.section.commandsNote': 'Copy and run directly.',
|
|
505
|
+
'docs.section.faq': 'FAQ',
|
|
506
|
+
'docs.section.faqNote': 'Common issues and tips.',
|
|
507
|
+
'docs.command.aria': '{name} command',
|
|
508
|
+
'docs.registryHintPrefix': 'Command will append:',
|
|
509
|
+
'docs.registryHintCustom': 'Enter a full URL (http/https) to append as registry.',
|
|
510
|
+
'docs.registry.tencent': 'Tencent Cloud',
|
|
511
|
+
'docs.meta.bin': 'bin: {bin}',
|
|
512
|
+
'docs.termuxLabel': 'Termux',
|
|
513
|
+
'docs.termuxAria': 'Termux Codex CLI command',
|
|
514
|
+
'docs.rule.1': 'Commands depend on package manager, registry and action.',
|
|
515
|
+
'docs.rule.2': 'Custom registry is used for install/update only.',
|
|
516
|
+
'docs.tip.win.1': 'If PowerShell reports permission errors (EACCES/EPERM), run the install command as Administrator.',
|
|
517
|
+
'docs.tip.win.2': 'If the command is still not found after install, reopen the terminal and run: where codex / where claude / where gemini / where codebuddy.',
|
|
518
|
+
'docs.tip.win.3': 'If your network blocks npm, try switching registry presets (npmmirror / Tencent / Custom).',
|
|
519
|
+
'docs.tip.unix.1': 'If you hit EACCES, fix your global Node directory permissions instead of using sudo npm.',
|
|
520
|
+
'docs.tip.unix.2': 'If the command is not available after install, reopen the terminal and run: which codex / which claude / which gemini / which codebuddy.',
|
|
521
|
+
'docs.tip.unix.3': 'If your network blocks npm, try switching registry presets (npmmirror / Tencent / Custom).',
|
|
522
|
+
|
|
523
|
+
// Sessions panel
|
|
524
|
+
'sessions.loading': 'Loading...',
|
|
525
|
+
'sessions.sourceTitle': 'Session Source',
|
|
526
|
+
'sessions.refresh': 'Refresh',
|
|
527
|
+
'sessions.refreshing': 'Refreshing...',
|
|
528
|
+
'sessions.allPaths': 'All paths',
|
|
529
|
+
'sessions.source.codex': 'Codex',
|
|
530
|
+
'sessions.source.claudeCode': 'Claude Code',
|
|
531
|
+
'sessions.source.gemini': 'Gemini CLI',
|
|
532
|
+
'sessions.source.codebuddy': 'CodeBuddy Code',
|
|
533
|
+
'sessions.loadingList': 'Loading sessions...',
|
|
534
|
+
'sessions.empty': 'No sessions found',
|
|
535
|
+
'sessions.unknownTime': 'unknown time',
|
|
536
|
+
|
|
537
|
+
|
|
538
|
+
'sessions.query.placeholder.enabled': 'Search keywords (Codex/Claude/Gemini/CodeBuddy, e.g. claude code)',
|
|
539
|
+
'sessions.query.placeholder.disabled': 'Keyword search is not available for this source',
|
|
540
|
+
'sessions.pin': 'Pin',
|
|
541
|
+
'sessions.unpin': 'Unpin',
|
|
542
|
+
'sessions.copyResume': 'Copy resume command',
|
|
543
|
+
'sessions.preview.refresh': 'Refresh content',
|
|
544
|
+
'sessions.preview.loading': 'Loading...',
|
|
545
|
+
'sessions.preview.deleteHard': 'Delete permanently',
|
|
546
|
+
'sessions.preview.moveToTrash': 'Move to trash',
|
|
547
|
+
'sessions.preview.deleting': 'Deleting...',
|
|
548
|
+
'sessions.preview.moving': 'Moving...',
|
|
549
|
+
'sessions.preview.export': 'Export',
|
|
550
|
+
'sessions.preview.exporting': 'Exporting...',
|
|
551
|
+
'sessions.preview.convert': 'Create derived',
|
|
552
|
+
'sessions.preview.converting': 'Creating...',
|
|
553
|
+
'sessions.preview.convert.loadedOnly': 'Converted loaded messages only',
|
|
554
|
+
'sessions.preview.importNative': 'Import to Native',
|
|
555
|
+
'sessions.preview.importingNative': 'Importing...',
|
|
556
|
+
'sessions.preview.importNative.unsupported': 'This operation is not supported',
|
|
557
|
+
'sessions.preview.importNative.confirmTitle': 'Overwrite native session file?',
|
|
558
|
+
'sessions.preview.importNative.confirmMessage': 'A native session file already exists. Overwriting will replace the matching session in the target tool native directory.',
|
|
559
|
+
'sessions.preview.importNative.confirmText': 'Overwrite',
|
|
560
|
+
'sessions.preview.importNative.cancelled': 'Import cancelled',
|
|
561
|
+
'sessions.preview.importNative.conflict': 'Native session already exists',
|
|
562
|
+
'sessions.preview.importNative.invalidSource': 'Invalid session source',
|
|
563
|
+
'sessions.preview.importNative.fileNotFound': 'Session file not found',
|
|
564
|
+
'sessions.preview.importNative.nativePathUnavailable': 'Native session path unavailable',
|
|
565
|
+
'sessions.preview.importNative.success': 'Imported to native directory',
|
|
566
|
+
'sessions.preview.importNative.failed': 'Import failed',
|
|
567
|
+
'sessions.preview.importNative.failedWithReason': 'Import to native failed: {reason}',
|
|
568
|
+
'sessions.preview.copyLink': 'Copy link',
|
|
569
|
+
'sessions.preview.loadingBody': 'Loading session content...',
|
|
570
|
+
'sessions.preview.emptyMsgs': 'No messages to display',
|
|
571
|
+
'sessions.preview.rendering': 'Rendering session content...',
|
|
572
|
+
'sessions.preview.rerender': 'Re-render',
|
|
573
|
+
'sessions.preview.preparing': 'Preparing session content...',
|
|
574
|
+
'sessions.preview.clipped': 'Showing the latest {count} messages only.',
|
|
575
|
+
'sessions.preview.shownCount': 'Shown {shown} / {total}',
|
|
576
|
+
'sessions.preview.loadMore': 'Load more (remaining {remain})',
|
|
577
|
+
'sessions.preview.loadingMore': 'Loading older messages...',
|
|
578
|
+
'sessions.timeline.aria': 'Session timeline',
|
|
579
|
+
'sessions.selectHint': 'Select a session on the left first',
|
|
580
|
+
'sessions.role.all': 'All roles',
|
|
581
|
+
'sessions.role.user': 'User only',
|
|
582
|
+
'sessions.role.assistant': 'Assistant only',
|
|
583
|
+
'sessions.role.system': 'System only',
|
|
584
|
+
'sessions.time.all': 'All time',
|
|
585
|
+
'sessions.time.7d': 'Last 7 days',
|
|
586
|
+
'sessions.time.30d': 'Last 30 days',
|
|
587
|
+
'sessions.time.90d': 'Last 90 days',
|
|
588
|
+
'sessions.sort.time': 'Sort: time',
|
|
589
|
+
'sessions.sort.hot': 'Sort: hot',
|
|
590
|
+
'sessions.sort.hotBadge': 'Hot',
|
|
591
|
+
'sessions.filters.copyLink': 'Copy filter link',
|
|
592
|
+
'sessions.filters.urlBuildFail': 'Failed to build link',
|
|
593
|
+
'sessions.filters.source': 'Source',
|
|
594
|
+
'sessions.filters.path': 'Path',
|
|
595
|
+
'sessions.filters.keyword': 'Keyword',
|
|
596
|
+
'sessions.filters.role': 'Role',
|
|
597
|
+
'sessions.filters.time': 'Time',
|
|
598
|
+
'sessions.roleLabel.user': 'User',
|
|
599
|
+
'sessions.roleLabel.system': 'System',
|
|
600
|
+
'sessions.roleLabel.assistant': 'Assistant',
|
|
601
|
+
|
|
602
|
+
// Usage panel
|
|
603
|
+
'usage.overview': 'Usage Overview',
|
|
604
|
+
'usage.range.aria': 'Usage time range',
|
|
605
|
+
'usage.range.7d': 'Last 7 days',
|
|
606
|
+
'usage.range.30d': 'Last 30 days',
|
|
607
|
+
'usage.compare.toggle': 'Compare previous',
|
|
608
|
+
'usage.compare.prev': 'Prev',
|
|
609
|
+
'usage.compare.delta': 'Delta',
|
|
610
|
+
'usage.refresh': 'Refresh stats',
|
|
611
|
+
'usage.refreshing': 'Refreshing...',
|
|
612
|
+
'usage.loading': 'Loading usage stats...',
|
|
613
|
+
'usage.empty': 'No session data available for usage stats',
|
|
614
|
+
'usage.refreshOverlay': 'Refreshing…',
|
|
615
|
+
'usage.copyTitle': 'Click to copy: {value}',
|
|
616
|
+
'usage.copySuccess': 'Copied: {label}',
|
|
617
|
+
'usage.copyFail': 'Copy failed',
|
|
618
|
+
'usage.copyNone': 'Nothing to copy',
|
|
619
|
+
'usage.daily.title': 'Daily usage',
|
|
620
|
+
'usage.daily.subtitle': 'Daily aggregated tokens and estimated cost (normalized by max values).',
|
|
621
|
+
'usage.daily.note': 'Note: Estimated cost excludes Claude by default; only computed when model pricing and input/output tokens are available.',
|
|
622
|
+
'usage.heatmap.title': 'Activity heatmap',
|
|
623
|
+
'usage.heatmap.subtitle': 'Aggregated by sessions per day; hover to see details.',
|
|
624
|
+
'usage.heatmap.legend.less': 'Less',
|
|
625
|
+
'usage.heatmap.legend.more': 'More',
|
|
626
|
+
'usage.heatmap.tooltip': '{date} · {sessions} sessions · {messages} messages · {tokens} tokens',
|
|
627
|
+
'usage.heatmap.aria': '{date}, {sessions} sessions',
|
|
628
|
+
'usage.hourlyHeatmap.title': '7×24 Activity Heatmap',
|
|
629
|
+
'usage.hourlyHeatmap.subtitle': 'Session distribution by weekday × hour; darker = more active.',
|
|
630
|
+
'usage.hourlyHeatmap.tooltip': '{weekday} {hour}:00 · {sessions} sessions · {messages} messages · {tokens} tokens',
|
|
631
|
+
'usage.hourlyHeatmap.legend.less': 'Less',
|
|
632
|
+
'usage.hourlyHeatmap.legend.more': 'More',
|
|
633
|
+
'usage.legend.tokens': 'Tokens',
|
|
634
|
+
'usage.legend.cost': 'Estimated cost',
|
|
635
|
+
'usage.table.date': 'Date',
|
|
636
|
+
'usage.table.sessions': 'Sessions',
|
|
637
|
+
'usage.table.messages': 'Messages',
|
|
638
|
+
'usage.table.tokens': 'Tokens',
|
|
639
|
+
'usage.table.cost': 'Estimated cost',
|
|
640
|
+
'usage.trend.sessions': 'Session trend',
|
|
641
|
+
'usage.trend.messages': 'Message trend',
|
|
642
|
+
'usage.trend.activeHours': 'Active hours',
|
|
643
|
+
'usage.trend.sources': 'Source insights',
|
|
644
|
+
'usage.legend.codex': 'Codex',
|
|
645
|
+
'usage.legend.claude': 'Claude',
|
|
646
|
+
'usage.trend.sessions.codexTitle': 'Codex {count}',
|
|
647
|
+
'usage.trend.sessions.claudeTitle': 'Claude {count}',
|
|
648
|
+
'usage.trend.messages.barTitle': '{count} messages',
|
|
649
|
+
'usage.hour.title': '{hour}:00 · {count} sessions',
|
|
650
|
+
'usage.source.row': '{sessions} sessions · {messages} messages · avg {avg}',
|
|
651
|
+
'usage.summary.sessions': 'Total sessions',
|
|
652
|
+
'usage.summary.messages': 'Total messages',
|
|
653
|
+
'usage.summary.tokens': 'Total tokens',
|
|
654
|
+
'usage.summary.contextWindow': 'Total context',
|
|
655
|
+
'usage.summary.estimatedCost': 'Estimated cost · {range}',
|
|
656
|
+
'usage.estimatedCost.note.excludesClaudePrefix': 'Excludes Claude. ',
|
|
657
|
+
'usage.estimatedCost.method.configured': 'Estimated using configured pricing',
|
|
658
|
+
'usage.estimatedCost.method.catalog': 'Estimated using public catalog pricing',
|
|
659
|
+
'usage.estimatedCost.method.configuredAndCatalog': 'Estimated using configured + public catalog pricing',
|
|
660
|
+
'usage.estimatedCost.detail.estimate': '{prefix}{method}. Estimate {estimate}. Coverage {covered}/{total} sessions (~{percent}% tokens).',
|
|
661
|
+
'usage.estimatedCost.detail.missing': '{prefix}Missing matching model pricing or token breakdown. Add models.cost or ensure sessions record input/output tokens.',
|
|
662
|
+
'usage.summary.activeDuration': 'Active duration',
|
|
663
|
+
'usage.summary.activeDuration.title': 'Active span {value}',
|
|
664
|
+
'usage.summary.totalDuration': 'Total duration',
|
|
665
|
+
'usage.summary.totalDuration.title': 'Overall span {value}',
|
|
666
|
+
'usage.summary.activeDays': 'Active days',
|
|
667
|
+
'usage.summary.avgMessagesPerSession': 'Avg messages/session',
|
|
668
|
+
'usage.summary.busiestDay': 'Busiest day',
|
|
669
|
+
'usage.summary.busiestHour': 'Peak hour',
|
|
670
|
+
'usage.currentSession.title': 'Current session',
|
|
671
|
+
'usage.currentSession.apiDuration': 'API duration',
|
|
672
|
+
'usage.currentSession.totalDuration': 'Total duration',
|
|
673
|
+
'usage.currentSession.tokens': 'Tokens',
|
|
674
|
+
'usage.range.kicker.all': 'All',
|
|
675
|
+
'usage.range.kicker.30d': 'Last 30 days',
|
|
676
|
+
'usage.range.kicker.7d': 'Last 7 days',
|
|
677
|
+
'usage.copyTokenDay': 'Copied: Tokens ({day})',
|
|
678
|
+
'usage.copyCostDay': 'Copied: Estimated cost ({day})',
|
|
679
|
+
'usage.dayDetail.title': '{day} detail',
|
|
680
|
+
'usage.dayDetail.subtitle': 'Pick a day to inspect its breakdown.',
|
|
681
|
+
'usage.dayDetail.pick': 'Pick a day',
|
|
682
|
+
'usage.dayDetail.empty': 'Pick a day to inspect its breakdown.',
|
|
683
|
+
'usage.dayDetail.clear': 'Clear',
|
|
684
|
+
'usage.dayDetail.topSessions': 'Top sessions',
|
|
685
|
+
'usage.dayDetail.topModels': 'Top models',
|
|
686
|
+
'usage.models.title': 'Models used',
|
|
687
|
+
'usage.models.subtitle': 'Only includes model names present in saved records.',
|
|
688
|
+
'usage.models.kicker': 'Identified {modeled}/{total}',
|
|
689
|
+
'usage.models.count': 'Models',
|
|
690
|
+
'usage.models.coverage': 'Coverage',
|
|
691
|
+
'usage.models.missing': 'Missing model',
|
|
692
|
+
'usage.models.noneTitle': 'No model names found in this range',
|
|
693
|
+
'usage.models.noneBody': 'Scanned {total} sessions, but no recognizable model field was found in raw records.',
|
|
694
|
+
'usage.models.providerOnly': '{count} older sessions only recorded provider.',
|
|
695
|
+
'usage.models.missingNote.providerOnly': '{count} sessions did not record model names and are excluded.',
|
|
696
|
+
'usage.models.missingNote': '{count} sessions are missing model and are excluded.',
|
|
697
|
+
'usage.models.missingListTitle': 'Sessions still missing model',
|
|
698
|
+
'usage.models.chipTitle': '{model} · {sessions} sessions · {messages} messages{tokens}',
|
|
699
|
+
'usage.models.meta': '{sessions} sessions · {messages} messages{tokens}',
|
|
700
|
+
'usage.weekday.title': 'Weekday distribution',
|
|
701
|
+
'usage.paths.title': 'Top paths',
|
|
702
|
+
'usage.paths.empty': 'No path data',
|
|
703
|
+
'usage.paths.count': '{count} hits',
|
|
704
|
+
'usage.paths.meta': '{messages} messages{recent}',
|
|
705
|
+
'usage.paths.recent': ' · last {label}',
|
|
706
|
+
'usage.recent.title': 'Recently active sessions',
|
|
707
|
+
'usage.sessions.empty': 'No session data',
|
|
708
|
+
'usage.sessions.messages': '{count} messages',
|
|
709
|
+
'usage.sessions.topDensity': 'Most messages',
|
|
710
|
+
|
|
711
|
+
// Config panel (Codex)
|
|
712
|
+
'config.addProvider': 'Add provider',
|
|
713
|
+
'toolConfig.allow': 'Write allowed',
|
|
714
|
+
'toolConfig.viewOnly': 'Read-only',
|
|
715
|
+
'toolConfig.enableWrite': 'Enable writes',
|
|
716
|
+
'toolConfig.allowToast': 'Writes enabled',
|
|
717
|
+
'toolConfig.viewOnlyToast': 'Switched back to read-only',
|
|
718
|
+
'toolConfig.saveFailed': 'Failed to save write setting',
|
|
719
|
+
'toolConfig.confirmTitle': 'Enable write access',
|
|
720
|
+
'toolConfig.confirmAllow': 'Enable writes',
|
|
721
|
+
'toolConfig.codex.title': 'Codex provider writes',
|
|
722
|
+
'toolConfig.codex.desc': 'Codex providers are read-only by default; enable this before writing ~/.codex config.',
|
|
723
|
+
'toolConfig.codex.lockedTitle': 'Codex providers are read-only',
|
|
724
|
+
'toolConfig.codex.lockedDesc': 'Codex account config will not be modified. Enable writes in this tab to add, switch, edit, or delete providers.',
|
|
725
|
+
'toolConfig.codex.confirmMessage': 'After enabling this, provider actions in the Codex tab may write ~/.codex/config.toml, auth, or model settings.',
|
|
726
|
+
'toolConfig.claude.title': 'Claude provider writes',
|
|
727
|
+
'toolConfig.claude.desc': 'Claude providers are read-only by default; enable this before writing Claude settings.',
|
|
728
|
+
'toolConfig.claude.lockedTitle': 'Claude providers are read-only',
|
|
729
|
+
'toolConfig.claude.lockedDesc': 'Claude config will not be modified. Enable writes in this tab to add, apply, edit, or delete providers.',
|
|
730
|
+
'toolConfig.claude.confirmMessage': 'After enabling this, apply actions in the Claude tab may write ~/.claude/settings.json and related Claude config.',
|
|
731
|
+
'config.providerTemplate.title': 'Provider presets',
|
|
732
|
+
'config.models': 'Model',
|
|
733
|
+
'config.modelLoading': 'Loading...',
|
|
734
|
+
'config.models.unlimited': 'No model list available. Enter manually.',
|
|
735
|
+
'config.models.error': 'Failed to fetch model list. Enter manually.',
|
|
736
|
+
'config.models.notInList.codex': 'Current model is not in the list. Enter manually or edit the template.',
|
|
737
|
+
'config.models.notInList.other': 'Current model is not in the list. Enter manually.',
|
|
738
|
+
'config.template.editFirst': 'Edit template first, then apply.',
|
|
739
|
+
'config.template.bridgeCodexOnly': '{hint} template is editable in Codex mode only.',
|
|
740
|
+
'config.localBridge.enabledCount': '{enabled}/{total} enabled',
|
|
741
|
+
'config.template.openEditor': 'Open template editor',
|
|
742
|
+
'modal.configTemplate.title': 'Config template editor (manual confirm)',
|
|
743
|
+
'modal.configTemplate.placeholder': 'Edit config.toml template here',
|
|
744
|
+
'config.serviceTier': 'Service tier',
|
|
745
|
+
'config.serviceTier.fast': 'fast (default)',
|
|
746
|
+
'config.serviceTier.standard': 'standard',
|
|
747
|
+
'config.serviceTier.hint': 'Only fast writes {field}.',
|
|
748
|
+
'config.reasoningEffort': 'Reasoning effort',
|
|
749
|
+
'config.reasoningEffort.medium': 'medium (default)',
|
|
750
|
+
'config.reasoningEffort.hint': 'Controls reasoning depth; high is deeper.',
|
|
751
|
+
'config.contextBudget': 'Compaction thresholds',
|
|
752
|
+
'config.reset': 'Reset',
|
|
753
|
+
'config.example': 'e.g. {value}',
|
|
754
|
+
'config.contextWindow.hint': 'Context window limit (default 190000).',
|
|
755
|
+
'config.autoCompact.hint': 'Auto-compaction threshold (default 185000).',
|
|
756
|
+
'config.agents.open': 'Open AGENTS.md',
|
|
757
|
+
'modal.agents.title.default': 'AGENTS.md editor',
|
|
758
|
+
'modal.agents.title.claudeMd': 'CLAUDE.md editor',
|
|
759
|
+
'modal.agents.title.openclaw': 'OpenClaw AGENTS.md editor',
|
|
760
|
+
'modal.agents.hint.default': 'Saved content will be written to AGENTS.md (next to config.toml).',
|
|
761
|
+
'modal.agents.hint.claudeMd': 'Saved content will be written to ~/.claude/CLAUDE.md.',
|
|
762
|
+
'modal.agents.contentLabel.claudeMd': 'CLAUDE.md content',
|
|
763
|
+
'modal.agents.placeholder.claudeMd': 'Edit CLAUDE.md here',
|
|
764
|
+
'modal.agents.hint.openclaw': 'Saved content will be written to OpenClaw workspace AGENTS.md.',
|
|
765
|
+
'modal.agents.title.openclawWorkspaceFile': 'OpenClaw workspace file: {fileName}',
|
|
766
|
+
'modal.agents.hint.openclawWorkspaceFile': 'Saved content will be written to OpenClaw workspace {fileName}.',
|
|
767
|
+
'config.url.unset': 'URL not set',
|
|
768
|
+
'config.model.unset': 'Model not set',
|
|
769
|
+
'config.badge.system': 'System',
|
|
770
|
+
'config.availabilityTest': 'Availability test',
|
|
771
|
+
'config.availabilityTestAria': 'Test availability for {name}',
|
|
772
|
+
'config.health.title': 'Config health check',
|
|
773
|
+
'config.health.run': 'Run check',
|
|
774
|
+
'config.health.running': 'Checking...',
|
|
775
|
+
'config.health.hint': 'Runs availability probes across all providers and refreshes latency badges.',
|
|
776
|
+
'config.health.progress': '{done}/{total} done · {failed} failed',
|
|
777
|
+
'config.health.ok': 'Passed',
|
|
778
|
+
'config.health.fail': 'Failed',
|
|
779
|
+
'config.health.issues': '{count} issues',
|
|
780
|
+
'config.shareCommand': 'Share command',
|
|
781
|
+
'config.shareDisabled': 'Not shareable',
|
|
782
|
+
'config.shareCommand.aria': 'Share import command',
|
|
783
|
+
'config.provider.edit.aria': 'Edit provider: {name}',
|
|
784
|
+
'config.provider.delete.aria': 'Delete provider: {name}',
|
|
785
|
+
'config.provider.clone': 'Clone',
|
|
786
|
+
'config.provider.clone.aria': 'Clone provider: {name}',
|
|
787
|
+
'app.loadingConfig': 'Loading configuration...',
|
|
788
|
+
'common.current': 'Current {value}',
|
|
789
|
+
'common.notSelected': 'Not selected',
|
|
790
|
+
'common.readFromEditor': 'Read from editor',
|
|
791
|
+
'common.writeToEditor': 'Write to editor',
|
|
792
|
+
'sessions.sourceLabel': 'Source: {value}',
|
|
793
|
+
'usage.rangeLabel': 'Range: {value}',
|
|
794
|
+
'sessions.source.all': 'All',
|
|
795
|
+
'usage.range.all': 'All',
|
|
796
|
+
'usage.range.7d.short': 'Last 7 days',
|
|
797
|
+
'usage.range.30d.short': 'Last 30 days',
|
|
798
|
+
'orchestration.queueStats': 'Queue: {running} running · {queued} queued',
|
|
799
|
+
'orchestration.hero.kicker': 'Task orchestration',
|
|
800
|
+
'orchestration.hero.title': 'Turn goals into executable steps',
|
|
801
|
+
'orchestration.hero.subtitle': 'Write a target, preview a plan, then run.',
|
|
802
|
+
'orchestration.draft.reset': 'Reset draft',
|
|
803
|
+
'orchestration.summary.aria': 'Task orchestration summary',
|
|
804
|
+
'orchestration.summary.running': 'Running',
|
|
805
|
+
'orchestration.summary.queued': 'Queued',
|
|
806
|
+
'orchestration.summary.runs': 'Runs',
|
|
807
|
+
'orchestration.readiness.target.label': 'Target',
|
|
808
|
+
'orchestration.readiness.target.done': 'Target written',
|
|
809
|
+
'orchestration.readiness.target.missing': 'Target not written yet',
|
|
810
|
+
'orchestration.readiness.engine.label': 'Execution strategy',
|
|
811
|
+
'orchestration.readiness.engine.codex': 'Use Codex to plan nodes',
|
|
812
|
+
'orchestration.readiness.workflow.done': '{count} workflow(s) selected',
|
|
813
|
+
'orchestration.readiness.workflow.missing': 'No Workflow ID selected yet',
|
|
814
|
+
'orchestration.readiness.scope.label': 'Scope',
|
|
815
|
+
'orchestration.readiness.scope.done': 'Notes added',
|
|
816
|
+
'orchestration.readiness.scope.writeHint': 'Add notes before writing',
|
|
817
|
+
'orchestration.readiness.scope.readonlyHint': 'Read-only mode is ready to try',
|
|
818
|
+
'orchestration.readiness.preview.label': 'Preview',
|
|
819
|
+
'orchestration.readiness.preview.missing': 'No plan generated yet',
|
|
820
|
+
'orchestration.readiness.preview.blocked': '{count} blocker(s)',
|
|
821
|
+
'orchestration.readiness.preview.ready': 'Plan ready, {count} node(s)',
|
|
822
|
+
'orchestration.readiness.empty.title': 'Write a target first',
|
|
823
|
+
'orchestration.readiness.empty.summary': 'Describe the outcome first, then let the orchestrator split it into nodes.',
|
|
824
|
+
'orchestration.readiness.workflow.title': 'Workflow missing',
|
|
825
|
+
'orchestration.readiness.workflow.summary': 'Workflow mode is selected, but no reusable workflow is specified yet.',
|
|
826
|
+
'orchestration.readiness.preview.title': 'Preview recommended',
|
|
827
|
+
'orchestration.readiness.preview.summary': 'The draft is ready; generate a plan first to confirm nodes and dependencies.',
|
|
828
|
+
'orchestration.readiness.blocked.title': 'Preview has blockers',
|
|
829
|
+
'orchestration.readiness.blocked.summary': 'The current plan still has {count} blocker(s). Resolve them first.',
|
|
830
|
+
'orchestration.readiness.warn.title': 'Runnable with warnings',
|
|
831
|
+
'orchestration.readiness.warn.summary': 'The plan is generated, but {count} warning(s) are worth checking first.',
|
|
832
|
+
'orchestration.readiness.dryRun.title': 'Good fit for dry run',
|
|
833
|
+
'orchestration.readiness.dryRun.summary': 'You can safely run a dry run now and inspect the result before executing for real.',
|
|
834
|
+
'orchestration.readiness.ready.title': 'Ready to run',
|
|
835
|
+
'orchestration.readiness.ready.withFollowUps': 'The main target and follow-up actions are ready; run directly or enqueue it.',
|
|
836
|
+
'orchestration.readiness.ready.summary': 'The main target is clear enough; run directly or enqueue it.',
|
|
837
|
+
'orchestration.step1.title': 'Start with the outcome',
|
|
838
|
+
'orchestration.step1.subtitle': 'Only include what affects execution.',
|
|
839
|
+
'orchestration.templates.title': 'Quick examples',
|
|
840
|
+
'orchestration.templates.reviewFix.label': 'Review fixes + regression',
|
|
841
|
+
'orchestration.templates.reviewFix.target': 'Address current PR review comments and add regression tests',
|
|
842
|
+
'orchestration.templates.reviewFix.notes': 'Avoid unrelated refactors; provide verification results',
|
|
843
|
+
'orchestration.templates.reviewFix.followUps': 'Handle newly added review comments\nUpdate the PR summary',
|
|
844
|
+
'orchestration.templates.planOnly.label': 'Plan only',
|
|
845
|
+
'orchestration.templates.planOnly.target': 'Investigate root cause and propose an execution plan without changing code',
|
|
846
|
+
'orchestration.templates.planOnly.notes': 'Focus on root cause, blast radius, and risk areas',
|
|
847
|
+
'orchestration.templates.workflowBatch.label': 'Workflow batch',
|
|
848
|
+
'orchestration.templates.workflowBatch.target': 'Run a fixed set of checks using workflows and summarize results',
|
|
849
|
+
'orchestration.templates.workflowBatch.workflowIds': 'diagnose-config\nsafe-provider-switch',
|
|
850
|
+
'orchestration.templates.workflowBatch.notes': 'Produce a unified conclusion; avoid repetitive narration',
|
|
851
|
+
'orchestration.fields.target': 'Target',
|
|
852
|
+
'orchestration.fields.target.placeholder': 'e.g. Address PR review comments and add regression tests; avoid unrelated modules',
|
|
853
|
+
'orchestration.fields.target.hint': 'One sentence is enough: outcome, constraints, and acceptance criteria.',
|
|
854
|
+
'orchestration.engine.codex': 'Codex',
|
|
855
|
+
'orchestration.engine.workflow': 'Workflow',
|
|
856
|
+
'orchestration.runMode.write': 'Write',
|
|
857
|
+
'orchestration.runMode.readOnly': 'Read-only',
|
|
858
|
+
'orchestration.runMode.dryRun': 'Dry run',
|
|
859
|
+
'orchestration.pills.hasTitle': 'Title set',
|
|
860
|
+
'orchestration.pills.workflowCount': 'Workflows {count}',
|
|
861
|
+
'orchestration.pills.planNodes': 'Plan {count} nodes',
|
|
862
|
+
'orchestration.step2.title': 'Choose how to run',
|
|
863
|
+
'orchestration.step2.subtitle': 'Common options are visible; the rest lives under Advanced.',
|
|
864
|
+
'orchestration.fields.engine': 'Engine',
|
|
865
|
+
'orchestration.fields.runMode': 'Run mode',
|
|
866
|
+
'orchestration.advanced.title': 'Advanced',
|
|
867
|
+
'orchestration.fields.title': 'Title',
|
|
868
|
+
'orchestration.fields.title.placeholder': 'Optional. Defaults to an inferred title from target.',
|
|
869
|
+
'orchestration.fields.notes': 'Notes',
|
|
870
|
+
'orchestration.fields.notes.placeholder': 'e.g. Do incremental changes only; do not rewrite architecture',
|
|
871
|
+
'orchestration.fields.notes.hint': 'Add boundaries, constraints, style rules, or verification requirements.',
|
|
872
|
+
'orchestration.fields.followUps': 'Follow-ups (one per line)',
|
|
873
|
+
'orchestration.fields.followUps.placeholder': 'e.g.\nAddress new review comments\nAdd regression tests',
|
|
874
|
+
'orchestration.fields.concurrency': 'Concurrency',
|
|
875
|
+
'orchestration.fields.concurrency.hint': 'Start with 1–2 for complex tasks.',
|
|
876
|
+
'orchestration.fields.autoFixRounds': 'Auto-fix',
|
|
877
|
+
'orchestration.fields.autoFixRounds.hint': 'Retry a few rounds after failures.',
|
|
878
|
+
'orchestration.fields.workflowIds': 'Workflow IDs (one per line)',
|
|
879
|
+
'orchestration.fields.workflowIds.placeholder': 'e.g.\ndiagnose-config\nsafe-provider-switch',
|
|
880
|
+
'orchestration.fields.workflowIds.hint': 'Required in Workflow mode. {count} available locally.',
|
|
881
|
+
'orchestration.workflow.stepCount': '{count} steps',
|
|
882
|
+
'orchestration.step3.title': 'Preview, then execute',
|
|
883
|
+
'orchestration.step3.subtitle': 'Confirm the plan, then decide to run now or queue.',
|
|
884
|
+
'orchestration.actions.planning': 'Planning...',
|
|
885
|
+
'orchestration.actions.previewOnly': 'Preview only',
|
|
886
|
+
'orchestration.actions.preparing': 'Preparing...',
|
|
887
|
+
'orchestration.actions.generatePlan': 'Generate plan',
|
|
888
|
+
'orchestration.actions.planAndRun': 'Plan & run',
|
|
889
|
+
'orchestration.actions.processing': 'Working...',
|
|
890
|
+
'orchestration.actions.queueAndStart': 'Queue & start',
|
|
891
|
+
'orchestration.actions.caption': '“Plan & run” refreshes the plan when needed; use “Queue & start” for batch runs.',
|
|
892
|
+
'orchestration.stage.title': 'Workspace opens when there is data',
|
|
893
|
+
'orchestration.stage.subtitle': 'Write the target first, then preview the plan.',
|
|
894
|
+
'orchestration.stage.pill.target': 'Write target',
|
|
895
|
+
'orchestration.stage.pill.preview': 'Preview',
|
|
896
|
+
'orchestration.stage.pill.run': 'Run or queue',
|
|
897
|
+
'orchestration.plan.title': 'Plan preview',
|
|
898
|
+
'orchestration.plan.subtitle': 'Confirm nodes, waves, and dependencies.',
|
|
899
|
+
'orchestration.plan.summary.nodes': 'Nodes',
|
|
900
|
+
'orchestration.plan.summary.waves': 'Waves',
|
|
901
|
+
'orchestration.plan.summary.engine': 'Engine',
|
|
902
|
+
'orchestration.plan.node.write': 'write',
|
|
903
|
+
'orchestration.plan.node.readOnly': 'read-only',
|
|
904
|
+
'orchestration.labels.dependencies': 'Dependencies: ',
|
|
905
|
+
'orchestration.labels.error': 'Error: ',
|
|
906
|
+
'orchestration.workbench.title': 'Workbench',
|
|
907
|
+
'orchestration.workbench.subtitle': 'Only expands when there is data.',
|
|
908
|
+
'orchestration.queue.start': 'Start queue',
|
|
909
|
+
'orchestration.queue.starting': 'Starting...',
|
|
910
|
+
'orchestration.workbench.tabs.aria': 'Workbench views',
|
|
911
|
+
'orchestration.workbench.tabs.queue': 'Queue {count}',
|
|
912
|
+
'orchestration.workbench.tabs.runs': 'Runs {count}',
|
|
913
|
+
'orchestration.workbench.tabs.detail': 'Run detail',
|
|
914
|
+
'orchestration.queue.empty.title': 'No queued tasks',
|
|
915
|
+
'orchestration.queue.empty.subtitle': 'Queue batch tasks first, then start the runner.',
|
|
916
|
+
'orchestration.runs.empty.title': 'No runs yet',
|
|
917
|
+
'orchestration.runs.empty.subtitle': 'Recent runs will appear after execution.',
|
|
918
|
+
'orchestration.detail.refresh': 'Refresh detail',
|
|
919
|
+
'orchestration.detail.retry': 'Retry',
|
|
920
|
+
'orchestration.detail.retrying': 'Retrying...',
|
|
921
|
+
'orchestration.detail.empty.title': 'Select a run to view details',
|
|
922
|
+
'orchestration.detail.empty.subtitle': 'This view shows node statuses, summaries, and logs.',
|
|
923
|
+
'orchestration.detail.summary.status': 'Status',
|
|
924
|
+
'orchestration.detail.summary.duration': 'Duration',
|
|
925
|
+
'orchestration.detail.summary.nodes': 'Nodes',
|
|
926
|
+
'orchestration.detail.summary.summary': 'Summary',
|
|
927
|
+
'orchestration.detail.node.meta': '{id} · attempts {attempts} · auto-fix {autoFix}',
|
|
928
|
+
'skills.localLabel': '{target} / Local skills',
|
|
929
|
+
'skills.counts': '{installed} installed · {importable} importable',
|
|
930
|
+
|
|
931
|
+
// Sidebar status labels (compact)
|
|
932
|
+
'status.currentSource': 'Current source',
|
|
933
|
+
'status.sessionCount': 'Sessions',
|
|
934
|
+
'status.range': 'Range',
|
|
935
|
+
'status.totalSessions': 'Total sessions',
|
|
936
|
+
'status.totalMessages': 'Total messages',
|
|
937
|
+
'status.engine': 'Engine',
|
|
938
|
+
'status.concurrency': 'Concurrency',
|
|
939
|
+
'status.running': 'Running',
|
|
940
|
+
'status.queued': 'Queued',
|
|
941
|
+
'status.runs': 'Runs',
|
|
942
|
+
'status.currentTarget': 'Current target',
|
|
943
|
+
'status.localSkills': 'Local skills',
|
|
944
|
+
'status.importable': 'Importable',
|
|
945
|
+
'status.importableDirect': 'Direct importable',
|
|
946
|
+
'status.pm': 'Package manager',
|
|
947
|
+
'status.action': 'Action',
|
|
948
|
+
'status.registry': 'Registry',
|
|
949
|
+
'status.claudeConfig': 'Claude config',
|
|
950
|
+
'status.claudeModel': 'Claude model',
|
|
951
|
+
'status.openclawConfig': 'OpenClaw config',
|
|
952
|
+
'status.workspaceFile': 'Workspace file',
|
|
953
|
+
'status.configMode': 'Config mode',
|
|
954
|
+
'status.currentProvider': 'Current provider',
|
|
955
|
+
'status.currentModel': 'Current model',
|
|
956
|
+
'status.quickSwitchProvider': 'Quick switch provider',
|
|
957
|
+
'side.usage.meta': 'Local stats / Trends',
|
|
958
|
+
'side.orchestration.meta': 'Plan / Queue / Runs',
|
|
959
|
+
|
|
960
|
+
// Settings panel
|
|
961
|
+
'settings.tab.general': 'General',
|
|
962
|
+
'settings.tab.data': 'Data',
|
|
963
|
+
'settings.tabs.aria': 'Settings categories',
|
|
964
|
+
'settings.quickSettings.title': 'Quick Settings',
|
|
965
|
+
'settings.language.sideLabel': 'Language: {language}',
|
|
966
|
+
'settings.language.title': 'Language',
|
|
967
|
+
'settings.language.meta': 'Choose the Web UI display language',
|
|
968
|
+
'settings.language.label': 'Interface language',
|
|
969
|
+
'settings.language.hint': 'Language preference is saved in this browser.',
|
|
970
|
+
'settings.sharePrefix.title': 'Share command prefix',
|
|
971
|
+
'settings.sharePrefix.meta': 'Used as the prefix for “Copy share command” in the Web UI',
|
|
972
|
+
'settings.sharePrefix.label': 'Prefix',
|
|
973
|
+
'settings.sharePrefix.hint': 'Defaults to npm start (project-local). You can switch to global codexmate. This setting is stored in the browser.',
|
|
974
|
+
'settings.claude.title': 'Claude config',
|
|
975
|
+
'settings.claude.meta': 'Backup / import ~/.claude',
|
|
976
|
+
'settings.codex.title': 'Codex config',
|
|
977
|
+
'settings.codex.meta': 'Backup / import ~/.codex',
|
|
978
|
+
'settings.backup.progress': 'Backing up {percent}%',
|
|
979
|
+
'settings.backup.oneClickClaude': 'Backup ~/.claude',
|
|
980
|
+
'settings.backup.importClaude': 'Import ~/.claude backup',
|
|
981
|
+
'settings.backup.oneClickCodex': 'Backup ~/.codex',
|
|
982
|
+
'settings.backup.importCodex': 'Import ~/.codex backup',
|
|
983
|
+
'settings.importing': 'Importing...',
|
|
984
|
+
|
|
985
|
+
'settings.deleteBehavior.title': 'Session deletion behavior',
|
|
986
|
+
'settings.deleteBehavior.meta': 'Whether “Delete” moves to trash first',
|
|
987
|
+
'settings.deleteBehavior.toggle': 'Move deleted sessions to trash first',
|
|
988
|
+
'settings.deleteBehavior.hint': 'Enabled by default. If disabled, deleting a session will permanently delete it.',
|
|
989
|
+
|
|
990
|
+
'settings.trash.title': 'Trash',
|
|
991
|
+
'settings.trash.meta': 'Deleted sessions (restore / purge)',
|
|
992
|
+
'settings.trash.refresh': 'Refresh',
|
|
993
|
+
'settings.trash.refreshing': 'Refreshing...',
|
|
994
|
+
'settings.trash.clear': 'Empty trash',
|
|
995
|
+
'settings.trash.clearing': 'Clearing...',
|
|
996
|
+
'settings.trash.loading': 'Loading trash...',
|
|
997
|
+
'settings.trash.empty': 'Trash is empty',
|
|
998
|
+
'settings.trash.emptyHint': 'No deleted sessions within the {days}-day retention window.',
|
|
999
|
+
'settings.trash.retry': 'Failed to load trash. Refresh to retry.',
|
|
1000
|
+
'settings.trash.restore': 'Restore',
|
|
1001
|
+
'settings.trash.restoring': 'Restoring...',
|
|
1002
|
+
'settings.trash.purge': 'Purge',
|
|
1003
|
+
'settings.trash.purging': 'Deleting...',
|
|
1004
|
+
'settings.trash.workspace': 'Workspace',
|
|
1005
|
+
'settings.trash.originalFile': 'Original file',
|
|
1006
|
+
'settings.trash.loadMore': 'Load more (remaining {count})',
|
|
1007
|
+
'settings.trash.retention': 'Auto-purge',
|
|
1008
|
+
'settings.trash.retentionMeta': 'Trash entries older than retention days are auto-purged',
|
|
1009
|
+
'settings.trash.retentionLabel': 'Retention days',
|
|
1010
|
+
'settings.trash.retentionUnit': 'days',
|
|
1011
|
+
'settings.trash.retentionHint': 'Range 1-365 days, default 30. Expired entries are purged on each trash load.',
|
|
1012
|
+
|
|
1013
|
+
'settings.webhook.title': 'Webhook',
|
|
1014
|
+
'settings.webhook.meta': 'Send event notifications to an external service',
|
|
1015
|
+
'settings.webhook.enabled': 'Enabled',
|
|
1016
|
+
'settings.webhook.disabled': 'Disabled',
|
|
1017
|
+
'settings.webhook.enable': 'Enable',
|
|
1018
|
+
'settings.webhook.edit': 'Edit',
|
|
1019
|
+
'settings.webhook.configure': 'Configure',
|
|
1020
|
+
'settings.webhook.modalTitle': 'Webhook settings',
|
|
1021
|
+
'settings.webhook.enabledLabel': 'Status',
|
|
1022
|
+
'settings.webhook.enableToggle': 'Enable webhook',
|
|
1023
|
+
'settings.webhook.urlLabel': 'Webhook URL',
|
|
1024
|
+
'settings.webhook.eventsLabel': 'Events',
|
|
1025
|
+
'settings.templateConfirm.title': 'Template apply confirmation',
|
|
1026
|
+
'settings.templateConfirm.meta': 'Reduce accidental writes',
|
|
1027
|
+
'settings.templateConfirm.toggle': 'Preview diffs before apply (Confirm → Apply)',
|
|
1028
|
+
'settings.templateConfirm.hint': 'When enabled: show a diff preview first, then confirm writing.',
|
|
1029
|
+
|
|
1030
|
+
'settings.reset.title': 'Config reset',
|
|
1031
|
+
'settings.reset.meta': 'Proceed with caution',
|
|
1032
|
+
'settings.reset.hint': 'Backs up config.toml, then writes default config.',
|
|
1033
|
+
'settings.reset.button': 'Reset config',
|
|
1034
|
+
'settings.reset.loading': 'Resetting...',
|
|
1035
|
+
|
|
1036
|
+
// Market (Skills)
|
|
1037
|
+
'market.title': 'Skills Overview',
|
|
1038
|
+
'market.subtitle': 'Switch target and inspect local skills.',
|
|
1039
|
+
'market.refresh': 'Refresh overview',
|
|
1040
|
+
'market.refreshing': 'Refreshing...',
|
|
1041
|
+
'market.openManager': 'Open Skills manager',
|
|
1042
|
+
'market.target.aria': 'Select skills target',
|
|
1043
|
+
'market.summary.target': 'Target',
|
|
1044
|
+
'market.summary.total': 'Local total',
|
|
1045
|
+
'market.summary.configured': 'With SKILL.md',
|
|
1046
|
+
'market.summary.missing': 'Missing SKILL.md',
|
|
1047
|
+
'market.summary.importable': 'Importable',
|
|
1048
|
+
'market.summary.importableDirect': 'Direct importable',
|
|
1049
|
+
'market.root.fallback': 'Default path',
|
|
1050
|
+
|
|
1051
|
+
'market.installed.title': 'Installed skills',
|
|
1052
|
+
'market.installed.note': 'Showing top 6 only.',
|
|
1053
|
+
'market.local.refresh': 'Refresh local',
|
|
1054
|
+
'market.local.refreshing': 'Refreshing...',
|
|
1055
|
+
'market.local.loading': 'Loading local skills...',
|
|
1056
|
+
'market.local.empty': 'No installed skills found.',
|
|
1057
|
+
'market.pill.verified': 'Verified',
|
|
1058
|
+
'market.pill.missingSkill': 'Missing SKILL.md',
|
|
1059
|
+
|
|
1060
|
+
'market.import.title': 'Import sources',
|
|
1061
|
+
'market.import.note': 'Scan and import into {target}.',
|
|
1062
|
+
'market.import.scan': 'Scan sources',
|
|
1063
|
+
'market.import.scanning': 'Scanning...',
|
|
1064
|
+
'market.import.loading': 'Scanning importable skills...',
|
|
1065
|
+
'market.import.empty': 'No importable skills found yet.',
|
|
1066
|
+
'market.pill.importableDirect': 'Direct import',
|
|
1067
|
+
'market.pill.importMissing': 'Missing SKILL.md',
|
|
1068
|
+
|
|
1069
|
+
'market.actions.title': 'Distribution',
|
|
1070
|
+
'market.actions.note': 'Actions apply to the current target.',
|
|
1071
|
+
'market.action.manage.title': 'Manage local skills',
|
|
1072
|
+
'market.action.manage.copy': 'Manage installed skills for {target}',
|
|
1073
|
+
'market.action.crossImport.title': 'Cross-app import',
|
|
1074
|
+
'market.action.crossImport.copy': 'Import into {target}',
|
|
1075
|
+
'market.action.zipImport.title': 'ZIP import',
|
|
1076
|
+
'market.action.zipImport.copy': 'Import from ZIP into target',
|
|
1077
|
+
|
|
1078
|
+
'market.help.title': 'How it works',
|
|
1079
|
+
'market.help.target.title': 'Target switch',
|
|
1080
|
+
'market.help.target.copy': 'Actions write into the {target} directory.',
|
|
1081
|
+
'market.help.crossImport.title': 'Cross-app import',
|
|
1082
|
+
'market.help.crossImport.copy': 'Import unmanaged skills from other hosts.',
|
|
1083
|
+
'market.help.zipImport.title': 'ZIP import',
|
|
1084
|
+
'market.help.zipImport.copy': 'Import local skills from a ZIP file.',
|
|
1085
|
+
|
|
1086
|
+
// Claude config panel
|
|
1087
|
+
'claude.addProvider': 'Add provider',
|
|
1088
|
+
'claude.applyDefault': 'Applies to ~/.claude/settings.json by default.',
|
|
1089
|
+
'claude.presetProviders': 'Provider presets',
|
|
1090
|
+
'claude.customConfig': 'Custom config',
|
|
1091
|
+
'claude.model': 'Model',
|
|
1092
|
+
'claude.model.placeholder': 'e.g. claude-3-7-sonnet',
|
|
1093
|
+
'claude.model.hint': 'Model changes are saved and applied to the current config automatically.',
|
|
1094
|
+
'claude.health.title': 'Config health check',
|
|
1095
|
+
'claude.health.run': 'Run check',
|
|
1096
|
+
'claude.health.running': 'Checking...',
|
|
1097
|
+
'claude.health.hint': 'Runs availability probes for all Claude configs and refreshes the latency badges.',
|
|
1098
|
+
'claude.health.progress': '{done}/{total} done · {failed} failed',
|
|
1099
|
+
'claude.md.title': 'CLAUDE.md',
|
|
1100
|
+
'claude.md.open': 'Open CLAUDE.md',
|
|
1101
|
+
'claude.md.hint': 'Read/write ~/.claude/CLAUDE.md.',
|
|
1102
|
+
'claude.model.unset': 'Model not set',
|
|
1103
|
+
'claude.configured': 'Configured',
|
|
1104
|
+
'claude.notConfigured': 'Not configured',
|
|
1105
|
+
'claude.action.edit': 'Edit',
|
|
1106
|
+
'claude.action.delete': 'Delete',
|
|
1107
|
+
'claude.action.shareDisabled': 'Share import command',
|
|
1108
|
+
'claude.action.editAria': 'Edit Claude config: {name}',
|
|
1109
|
+
'claude.action.deleteAria': 'Delete Claude config: {name}',
|
|
1110
|
+
'claude.action.clone': 'Clone',
|
|
1111
|
+
'claude.action.cloneAria': 'Clone Claude config: {name}',
|
|
1112
|
+
'claude.localBridge.poolTitle': 'Round-robin pool',
|
|
1113
|
+
'claude.localBridge.poolHint': 'Select providers for load balancing',
|
|
1114
|
+
'claude.localBridge.noProviders': 'No providers available. Add a provider first.',
|
|
1115
|
+
'claude.localBridge.disabled': 'Disabled',
|
|
1116
|
+
'claude.localBridge.enabled': 'Enabled',
|
|
1117
|
+
|
|
1118
|
+
// OpenClaw config panel
|
|
1119
|
+
'openclaw.applyHint': 'Writes to ~/.openclaw/openclaw.json (JSON5 supported).',
|
|
1120
|
+
'openclaw.workspace.title': 'OpenClaw workspace',
|
|
1121
|
+
'openclaw.configs.hint': 'Select a saved config, or open the editor to maintain full JSON5.',
|
|
1122
|
+
'openclaw.agents.hint': 'Read/write Workspace AGENTS.md. Default: ~/.openclaw/workspace/AGENTS.md.',
|
|
1123
|
+
'openclaw.agents.open': 'Open AGENTS.md',
|
|
1124
|
+
'openclaw.workspaceFile': 'Workspace file',
|
|
1125
|
+
'openclaw.workspace.placeholder': 'e.g. SOUL.md',
|
|
1126
|
+
'openclaw.workspace.hint': 'Only .md files inside the Workspace are supported.',
|
|
1127
|
+
'openclaw.workspace.open': 'Open workspace file',
|
|
1128
|
+
'openclaw.configured': 'Configured',
|
|
1129
|
+
'openclaw.notConfigured': 'Not configured',
|
|
1130
|
+
'openclaw.action.edit': 'Edit',
|
|
1131
|
+
'openclaw.action.delete': 'Delete',
|
|
1132
|
+
'modal.openclaw.quick.subtitle': '3 steps: fill provider/model, write to editor, save & apply.',
|
|
1133
|
+
'modal.openclaw.quick.step2': 'Write to editor',
|
|
1134
|
+
'modal.openclaw.structured.writeHint': 'Writing to editor may reformat JSON and drop comments.',
|
|
1135
|
+
'openclaw.action.applyAria': 'Apply OpenClaw config: {name}',
|
|
1136
|
+
'openclaw.action.editAria': 'Edit OpenClaw config: {name}',
|
|
1137
|
+
'openclaw.action.deleteAria': 'Delete OpenClaw config: {name}'
|
|
1138
|
+
});
|
|
1139
|
+
|
|
1140
|
+
export { en };
|