codexmate 0.0.41 → 0.0.43

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