codexmate 0.0.28 → 0.0.30

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 (50) hide show
  1. package/cli/builtin-proxy.js +107 -2
  2. package/cli/config-bootstrap.js +30 -12
  3. package/cli/config-health.js +117 -1
  4. package/cli/local-bridge.js +324 -0
  5. package/cli/openai-bridge.js +195 -31
  6. package/cli.js +245 -28
  7. package/lib/cli-webhook.js +126 -0
  8. package/package.json +1 -1
  9. package/web-ui/app.js +28 -8
  10. package/web-ui/index.html +1 -0
  11. package/web-ui/logic.codex.mjs +13 -0
  12. package/web-ui/modules/app.computed.dashboard.mjs +25 -2
  13. package/web-ui/modules/app.computed.session.mjs +22 -17
  14. package/web-ui/modules/app.methods.claude-config.mjs +12 -2
  15. package/web-ui/modules/app.methods.codex-config.mjs +25 -0
  16. package/web-ui/modules/app.methods.index.mjs +2 -0
  17. package/web-ui/modules/app.methods.navigation.mjs +39 -8
  18. package/web-ui/modules/app.methods.providers.mjs +125 -8
  19. package/web-ui/modules/app.methods.session-actions.mjs +1 -1
  20. package/web-ui/modules/app.methods.session-browser.mjs +1 -1
  21. package/web-ui/modules/app.methods.session-trash.mjs +3 -4
  22. package/web-ui/modules/app.methods.startup-claude.mjs +1 -0
  23. package/web-ui/modules/app.methods.webhook.mjs +79 -0
  24. package/web-ui/modules/i18n.dict.mjs +1109 -72
  25. package/web-ui/modules/i18n.mjs +9 -3
  26. package/web-ui/modules/skills.methods.mjs +1 -0
  27. package/web-ui/partials/index/layout-header.html +25 -0
  28. package/web-ui/partials/index/modals-basic.html +0 -3
  29. package/web-ui/partials/index/panel-config-claude.html +8 -2
  30. package/web-ui/partials/index/panel-config-codex.html +28 -3
  31. package/web-ui/partials/index/panel-dashboard.html +33 -0
  32. package/web-ui/partials/index/panel-market.html +3 -3
  33. package/web-ui/partials/index/panel-plugins.html +2 -2
  34. package/web-ui/partials/index/panel-sessions.html +1 -9
  35. package/web-ui/partials/index/panel-settings.html +71 -134
  36. package/web-ui/partials/index/panel-trash.html +88 -0
  37. package/web-ui/session-helpers.mjs +20 -2
  38. package/web-ui/styles/dashboard.css +132 -0
  39. package/web-ui/styles/docs-panel.css +63 -39
  40. package/web-ui/styles/layout-shell.css +54 -34
  41. package/web-ui/styles/plugins-panel.css +121 -80
  42. package/web-ui/styles/sessions-list.css +41 -43
  43. package/web-ui/styles/sessions-preview.css +34 -38
  44. package/web-ui/styles/sessions-toolbar-trash.css +31 -27
  45. package/web-ui/styles/settings-panel.css +197 -33
  46. package/web-ui/styles/skills-list.css +12 -10
  47. package/web-ui/styles/skills-market.css +67 -44
  48. package/web-ui/styles/trash-panel.css +90 -0
  49. package/web-ui/styles/webhook.css +81 -0
  50. package/web-ui/styles.css +2 -0
@@ -185,8 +185,7 @@ const DICT = Object.freeze({
185
185
  'subtitle.market': '管理本地 Skills。',
186
186
  'subtitle.plugins': '管理模板化 prompt 与可复用插件。',
187
187
  'subtitle.docs': '查看 CLI 安装命令与排障。',
188
- 'subtitle.settings': '管理下载、目录与回收站。'
189
- ,
188
+ 'subtitle.settings': '管理下载、目录与回收站。',
190
189
  'dashboard.doctor.title': 'Doctor',
191
190
  'dashboard.doctor.runChecks': '运行检查',
192
191
  'dashboard.doctor.checking': '检查中...',
@@ -279,6 +278,11 @@ const DICT = Object.freeze({
279
278
  'dashboard.usage.range': '范围 {value}',
280
279
  'dashboard.tasks.queue': 'run {running} / queue {queued}',
281
280
  'dashboard.skills.count': 'installed {installed} / import {importable}',
281
+ 'dashboard.providersHealth.title': 'Provider 健康状态',
282
+ 'dashboard.providersHealth.current': '(当前)',
283
+ 'dashboard.providersHealth.checking': '检查中...',
284
+ 'dashboard.providersHealth.allOk': '所有 Provider 正常',
285
+ 'dashboard.providersHealth.hasIssues': '{count} 个 Provider 存在问题',
282
286
 
283
287
  // Plugins panel
284
288
  'plugins.sidebar.title': 'Plugins',
@@ -506,15 +510,13 @@ const DICT = Object.freeze({
506
510
  'docs.termuxLabel': 'Termux',
507
511
  'docs.termuxAria': 'Termux Codex CLI command',
508
512
  'docs.rule.1': '命令按当前包管理器、镜像与操作生成。',
509
- 'docs.rule.2': '自定义镜像仅用于安装与升级。'
510
- ,
513
+ 'docs.rule.2': '自定义镜像仅用于安装与升级。',
511
514
  'docs.tip.win.1': 'PowerShell 报权限不足(EACCES/EPERM)时,请以管理员身份执行安装命令。',
512
515
  'docs.tip.win.2': '安装后若仍提示找不到命令,重开终端并执行:where codex / where claude / where gemini / where codebuddy。',
513
516
  'docs.tip.win.3': '公司网络受限时,可先切换镜像源快捷项(npmmirror / 腾讯云 / 自定义)。',
514
517
  'docs.tip.unix.1': '出现 EACCES 权限错误时,优先修复 Node 全局目录权限,不建议直接 sudo npm。',
515
518
  'docs.tip.unix.2': '安装后若命令未生效,重开终端并执行:which codex / which claude / which gemini / which codebuddy。',
516
- 'docs.tip.unix.3': '公司网络受限时,可先切换镜像源快捷项(npmmirror / 腾讯云 / 自定义)。'
517
- ,
519
+ 'docs.tip.unix.3': '公司网络受限时,可先切换镜像源快捷项(npmmirror / 腾讯云 / 自定义)。',
518
520
 
519
521
  // Sessions panel
520
522
  'sessions.loading': '加载中...',
@@ -554,8 +556,7 @@ const DICT = Object.freeze({
554
556
  'sessions.preview.clipped': '仅展示最近 {count} 条消息。',
555
557
  'sessions.preview.shownCount': '已显示 {shown} / {total} 条',
556
558
  'sessions.preview.loadMore': '加载更多(剩余 {remain})',
557
- 'sessions.preview.loadingMore': '正在加载更早消息...'
558
- ,
559
+ 'sessions.preview.loadingMore': '正在加载更早消息...',
559
560
  'sessions.timeline.aria': '会话时间轴',
560
561
  'sessions.selectHint': '请先在左侧选择一个会话',
561
562
  'sessions.role.all': '全部角色',
@@ -565,12 +566,10 @@ const DICT = Object.freeze({
565
566
  'sessions.time.all': '全部时间',
566
567
  'sessions.time.7d': '近 7 天',
567
568
  'sessions.time.30d': '近 30 天',
568
- 'sessions.time.90d': '近 90 天'
569
- ,
569
+ 'sessions.time.90d': '近 90 天',
570
570
  'sessions.sort.time': '按时间',
571
571
  'sessions.sort.hot': '按热度',
572
- 'sessions.sort.hotBadge': '热'
573
- ,
572
+ 'sessions.sort.hotBadge': '热',
574
573
  'sessions.filters.copyLink': '复制筛选链接',
575
574
  'sessions.filters.urlBuildFail': '无法生成链接',
576
575
  'sessions.filters.source': '来源',
@@ -580,8 +579,7 @@ const DICT = Object.freeze({
580
579
  'sessions.filters.time': '时间',
581
580
  'sessions.roleLabel.user': 'User',
582
581
  'sessions.roleLabel.system': 'System',
583
- 'sessions.roleLabel.assistant': 'Assistant'
584
- ,
582
+ 'sessions.roleLabel.assistant': 'Assistant',
585
583
 
586
584
  // Usage panel
587
585
  'usage.overview': 'Usage 概览',
@@ -660,16 +658,14 @@ const DICT = Object.freeze({
660
658
  'usage.range.kicker.30d': '近 30 天',
661
659
  'usage.range.kicker.7d': '近 7 天',
662
660
  'usage.copyTokenDay': '已复制:Token({day})',
663
- 'usage.copyCostDay': '已复制:预估费用({day})'
664
- ,
661
+ 'usage.copyCostDay': '已复制:预估费用({day})',
665
662
  'usage.dayDetail.title': '{day} 详情',
666
663
  'usage.dayDetail.subtitle': '选择日期可快速查看当天构成。',
667
664
  'usage.dayDetail.pick': '选择日期',
668
665
  'usage.dayDetail.empty': '请选择一个日期以查看当天构成。',
669
666
  'usage.dayDetail.clear': '清除',
670
667
  'usage.dayDetail.topSessions': 'Top 会话',
671
- 'usage.dayDetail.topModels': 'Top 模型'
672
- ,
668
+ 'usage.dayDetail.topModels': 'Top 模型',
673
669
  'usage.models.title': '使用模型',
674
670
  'usage.models.subtitle': '只列真实落盘的 model 名。',
675
671
  'usage.models.kicker': '已识别 {modeled}/{total}',
@@ -693,8 +689,7 @@ const DICT = Object.freeze({
693
689
  'usage.recent.title': '近期活跃会话',
694
690
  'usage.sessions.empty': '暂无会话数据',
695
691
  'usage.sessions.messages': '{count} 消息',
696
- 'usage.sessions.topDensity': '消息密度最高'
697
- ,
692
+ 'usage.sessions.topDensity': '消息密度最高',
698
693
 
699
694
  // Config panel (Codex)
700
695
  'config.addProvider': '新增提供商',
@@ -747,13 +742,13 @@ const DICT = Object.freeze({
747
742
  'config.health.fail': '检查未通过',
748
743
  'config.health.issues': '{count} 项问题',
749
744
  'config.shareCommand': '分享命令',
750
- 'config.shareDisabled': '不可分享'
751
- ,
745
+ 'config.shareDisabled': '不可分享',
752
746
  'config.shareCommand.aria': '分享导入命令',
753
747
  'config.provider.edit.aria': '编辑提供商:{name}',
754
748
  'config.provider.delete.aria': '删除提供商:{name}',
755
- 'app.loadingConfig': '加载配置中...'
756
- ,
749
+ 'config.provider.clone': '克隆',
750
+ 'config.provider.clone.aria': '克隆提供商:{name}',
751
+ 'app.loadingConfig': '加载配置中...',
757
752
  'common.current': '当前 {value}',
758
753
  'common.notSelected': '未选择',
759
754
  'common.readFromEditor': '从编辑器读取',
@@ -892,11 +887,9 @@ const DICT = Object.freeze({
892
887
  'status.configMode': '配置模式',
893
888
  'status.currentProvider': '当前 Provider',
894
889
  'status.currentModel': '当前模型',
895
- 'status.quickSwitchProvider': '快速切换提供商'
896
- ,
890
+ 'status.quickSwitchProvider': '快速切换提供商',
897
891
  'side.usage.meta': '本地统计 / 趋势',
898
- 'side.orchestration.meta': '计划 / 队列 / Runs'
899
- ,
892
+ 'side.orchestration.meta': '计划 / 队列 / Runs',
900
893
 
901
894
  // Settings panel
902
895
  'settings.tab.general': '通用',
@@ -906,6 +899,8 @@ const DICT = Object.freeze({
906
899
  'settings.sharePrefix.meta': '影响 Web UI 里“复制分享命令”的前缀',
907
900
  'settings.sharePrefix.label': '前缀',
908
901
  'settings.sharePrefix.hint': '默认走项目内 npm start,也可切到全局 codexmate。该设置会缓存到浏览器本地。',
902
+ 'settings.backup.title': '数据备份',
903
+ 'settings.backup.meta': '导出 / 导入 Claude 与 Codex 配置',
909
904
  'settings.claude.title': 'Claude 配置',
910
905
  'settings.claude.meta': '备份 / 导入 ~/.claude',
911
906
  'settings.codex.title': 'Codex 配置',
@@ -917,6 +912,8 @@ const DICT = Object.freeze({
917
912
  'settings.backup.importCodex': '导入 ~/.codex 备份',
918
913
  'settings.importing': '导入中...',
919
914
 
915
+ 'settings.trashConfig.title': '回收站配置',
916
+ 'settings.trashConfig.meta': '回收站开关与自动清理天数',
920
917
  'settings.deleteBehavior.title': '会话删除行为',
921
918
  'settings.deleteBehavior.meta': '决定“删除”是否先进入回收站',
922
919
  'settings.deleteBehavior.toggle': '删除会话时先移入回收站',
@@ -952,8 +949,7 @@ const DICT = Object.freeze({
952
949
  'settings.reset.meta': '谨慎操作',
953
950
  'settings.reset.hint': '会先备份 config.toml,再写入默认配置。',
954
951
  'settings.reset.button': '重装配置',
955
- 'settings.reset.loading': '重装中...'
956
- ,
952
+ 'settings.reset.loading': '重装中...',
957
953
 
958
954
  // Market (Skills)
959
955
  'market.title': 'Skills 概览',
@@ -1003,8 +999,7 @@ const DICT = Object.freeze({
1003
999
  'market.help.crossImport.title': '跨应用导入',
1004
1000
  'market.help.crossImport.copy': '从其他宿主导入未托管 skill。',
1005
1001
  'market.help.zipImport.title': 'ZIP 导入',
1006
- 'market.help.zipImport.copy': '从 ZIP 导入本地 skill。'
1007
- ,
1002
+ 'market.help.zipImport.copy': '从 ZIP 导入本地 skill。',
1008
1003
 
1009
1004
  // Claude config panel
1010
1005
  'claude.addProvider': '添加提供商',
@@ -1027,10 +1022,11 @@ const DICT = Object.freeze({
1027
1022
  'claude.notConfigured': '未配置',
1028
1023
  'claude.action.edit': '编辑',
1029
1024
  'claude.action.delete': '删除',
1030
- 'claude.action.shareDisabled': '分享导入命令(暂时禁用)'
1031
- ,
1025
+ 'claude.action.shareDisabled': '分享导入命令(暂时禁用)',
1032
1026
  'claude.action.editAria': '编辑 Claude 配置:{name}',
1033
1027
  'claude.action.deleteAria': '删除 Claude 配置:{name}',
1028
+ 'claude.action.clone': '克隆',
1029
+ 'claude.action.cloneAria': '克隆 Claude 配置:{name}',
1034
1030
 
1035
1031
  // OpenClaw config panel
1036
1032
  'openclaw.applyHint': '写入 ~/.openclaw/openclaw.json,支持 JSON5。',
@@ -1046,11 +1042,1061 @@ const DICT = Object.freeze({
1046
1042
  'openclaw.action.delete': '删除',
1047
1043
  'modal.openclaw.quick.subtitle': '按 3 步完成:填 Provider 和模型,写入编辑器,保存并应用。',
1048
1044
  'modal.openclaw.quick.step2': '点击写入编辑器',
1049
- 'modal.openclaw.structured.writeHint': '写入编辑器会重排 JSON,注释可能丢失。'
1050
- ,
1045
+ 'modal.openclaw.structured.writeHint': '写入编辑器会重排 JSON,注释可能丢失。',
1051
1046
  'openclaw.action.editAria': '编辑 OpenClaw 配置:{name}',
1052
1047
  'openclaw.action.deleteAria': '删除 OpenClaw 配置:{name}'
1053
1048
  },
1049
+ ja: {
1050
+
1051
+ // Global
1052
+ 'lang.zh': '中国語',
1053
+ 'lang.en': 'English',
1054
+ 'lang.label': '言語',
1055
+ 'nav.topTabs.aria': 'ナビゲーション',
1056
+
1057
+ // Common
1058
+ 'common.all': 'すべて',
1059
+ 'common.copy': 'コピー',
1060
+ 'common.edit': '編集',
1061
+ 'common.install': 'インストール',
1062
+ 'common.update': 'アップグレード',
1063
+ 'common.uninstall': 'アンインストール',
1064
+ 'common.official': '公式',
1065
+ 'common.custom': 'カスタム',
1066
+ 'common.rules': 'ルール',
1067
+ 'common.troubleshooting': 'トラブルシューティング',
1068
+ 'common.command': 'コマンド',
1069
+ 'common.mirror': 'ミラー',
1070
+ 'common.packageManager': 'パッケージマネージャー',
1071
+ 'common.action': '操作',
1072
+ 'common.targets': 'ターゲット数',
1073
+ 'common.currentPm': '現在のパッケージマネージャー',
1074
+ 'common.currentAction': '現在の操作',
1075
+ 'common.mirrorActive': 'ミラー有効',
1076
+ 'common.defaultOfficial': '公式デフォルト',
1077
+ 'common.cancel': 'キャンセル',
1078
+ 'common.confirm': '確認',
1079
+ 'common.add': '追加',
1080
+ 'common.save': '保存',
1081
+ 'common.saveApply': '保存して適用',
1082
+ 'common.close': '閉じる',
1083
+ 'common.delete': '削除',
1084
+ 'common.clear': 'クリア',
1085
+ 'common.show': '表示',
1086
+ 'common.hide': '非表示',
1087
+ 'common.detail': '詳細',
1088
+ 'common.refresh': '更新',
1089
+ 'common.refreshing': '更新中...',
1090
+ 'common.loading': '読み込み中...',
1091
+ 'common.saving': '保存中...',
1092
+ 'common.sending': '送信中...',
1093
+ 'common.scanning': 'スキャン中...',
1094
+ 'common.export': 'エクスポート',
1095
+ 'common.import': 'インポート',
1096
+ 'common.apply': '適用',
1097
+ 'common.applying': '適用中...',
1098
+ 'common.confirming': '確認中...',
1099
+ 'common.writeToEditor': 'エディタに書き込み',
1100
+ 'common.refreshFromText': 'テキストから更新',
1101
+ 'common.backToEdit': '編集に戻る',
1102
+ 'common.selectAll': 'すべて選択',
1103
+ 'common.unselectAll': '選択解除',
1104
+ 'common.resetFilters': 'フィルターをリセット',
1105
+ 'common.notEditable': '編集不可',
1106
+ 'common.notDeletable': '削除不可',
1107
+ 'common.notLoaded': '未読み込み',
1108
+ 'common.exists': '存在します',
1109
+ 'common.notExistsWillCreateOnApply': '存在しません。適用時に作成されます',
1110
+ 'common.notExistsWillCreateOnSave': '存在しません。保存時に作成されます',
1111
+ 'common.none': 'なし',
1112
+ 'cli.missing.title': '{name} CLI がインストールされていません',
1113
+ 'cli.missing.subtitle': '{name} CLI をインストールしてからこのページをご利用ください。',
1114
+ 'cli.missing.openDocs': 'インストールガイドを開く',
1115
+ 'cli.missing.commandAria': '{name} CLI インストールコマンド',
1116
+
1117
+ // Brand
1118
+ 'brand.kicker.workspace': 'ワークスペース',
1119
+ 'brand.subtitle.localConfigSessionsWorkspace': 'ローカル設定とセッションワークスペース',
1120
+
1121
+ // Confirm dialog
1122
+ 'confirm.aria': '操作確認',
1123
+ 'confirm.title.default': '操作を確認してください',
1124
+ 'confirm.ok': '確認',
1125
+ 'confirm.cancel': 'キャンセル',
1126
+
1127
+ // Shared fields
1128
+ 'field.name': '名前',
1129
+ 'field.configName': '設定名',
1130
+ 'field.apiEndpoint': 'API エンドポイント',
1131
+ 'field.apiKey': '認証キー',
1132
+ 'field.baseUrl': 'Base URL',
1133
+ 'field.provider': 'プロバイダー',
1134
+ 'field.providerName': 'プロバイダー名',
1135
+ 'field.modelName': 'モデル名',
1136
+ 'field.model': 'モデル',
1137
+ 'field.message': 'メッセージ',
1138
+ 'field.varName': '変数名',
1139
+ 'field.targetFile': '対象ファイル',
1140
+ 'field.modelId': 'モデル ID',
1141
+ 'field.displayName': '表示名',
1142
+ 'field.contextAndMaxOutput': 'コンテキストと最大出力',
1143
+ 'field.apiType': 'API タイプ',
1144
+ 'field.env': '環境変数',
1145
+ 'field.allow': '許可',
1146
+ 'field.deny': '拒否',
1147
+
1148
+ // Shared placeholders/hints
1149
+ 'placeholder.providerNameExample': '例: myapi',
1150
+ 'placeholder.apiEndpointExample': 'https://api.example.com/v1',
1151
+ 'placeholder.providerName': 'プロバイダー名',
1152
+ 'placeholder.keepUnchanged': '空白のままにすると変更されません',
1153
+ 'hint.keepKeyUnchanged': '空白のままにするとキーは変更されません',
1154
+ 'placeholder.modelExample': '例: gpt-5',
1155
+ 'placeholder.configNameExample': '例: 智譜GLM',
1156
+ 'placeholder.apiKeyExampleClaude': 'sk-ant-...',
1157
+ 'placeholder.baseUrlExampleClaude': 'https://open.bigmodel.cn/api/anthropic',
1158
+ 'placeholder.selectProvider': 'プロバイダーを選択してください',
1159
+
1160
+ // Roles / labels
1161
+ 'role.you': 'あなた',
1162
+ 'role.provider': 'プロバイダー',
1163
+ 'label.model': 'モデル:',
1164
+
1165
+ // Top tabs
1166
+ 'tab.dashboard': '概要',
1167
+ 'tab.docs': 'ドキュメント',
1168
+ 'tab.config': '設定',
1169
+ 'tab.config.codex': 'Codex',
1170
+ 'tab.config.claude': 'Claude',
1171
+ 'tab.config.openclaw': 'OpenClaw',
1172
+ 'tab.sessions': 'セッション',
1173
+ 'tab.usage': '使用量',
1174
+ 'tab.orchestration': 'タスク',
1175
+ 'tab.market': 'Skills',
1176
+ 'tab.plugins': 'プラグイン',
1177
+ 'tab.settings': '設定',
1178
+
1179
+ // Side rail section titles
1180
+ 'side.overview': '概要',
1181
+ 'side.docs': 'ドキュメント',
1182
+ 'side.config': '設定',
1183
+ 'side.sessions': 'セッション',
1184
+ 'side.plugins': 'プラグイン',
1185
+ 'side.system': 'システム',
1186
+ 'side.orchestration': 'タスク',
1187
+ 'side.skills': 'Skills',
1188
+
1189
+ // Side rail items
1190
+ 'side.overview.doctor': 'Doctor パネル',
1191
+ 'side.overview.doctor.meta': '概要 / 診断 / ジャンプ',
1192
+ 'side.docs.cliInstall': 'CLI インストール',
1193
+ 'side.docs.cliInstall.meta': 'インストール / 更新 / 削除',
1194
+ 'side.config.codex': 'Codex',
1195
+ 'side.config.codex.meta': 'Provider / Model',
1196
+ 'side.config.claude': 'Claude Code',
1197
+ 'side.config.claude.meta': 'Claude Settings',
1198
+ 'side.config.openclaw': 'OpenClaw',
1199
+ 'side.config.openclaw.meta': 'JSON5 / AGENTS',
1200
+ 'side.sessions.browser': 'セッション閲覧',
1201
+ 'side.sessions.browser.meta': '閲覧 / エクスポート / クリーンアップ',
1202
+ 'side.plugins.tools': 'プロンプトツール',
1203
+ 'side.plugins.tools.meta': 'テンプレート / 変数',
1204
+ 'side.system.settings': '実行設定',
1205
+ 'side.system.settings.meta': 'データ / バックアップ',
1206
+
1207
+ // Header titles
1208
+ 'kicker.dashboard': 'Doctor',
1209
+ 'kicker.config': 'Configuration',
1210
+ 'kicker.sessions': 'Sessions',
1211
+ 'kicker.usage': 'Usage',
1212
+ 'kicker.orchestration': 'Tasks',
1213
+ 'kicker.market': 'Skills',
1214
+ 'kicker.plugins': 'Plugins',
1215
+ 'kicker.docs': 'Docs',
1216
+ 'kicker.settings': 'Settings',
1217
+
1218
+ 'title.dashboard': 'Dashboard / Doctor',
1219
+ 'title.config': 'ローカル設定コンソール',
1220
+ 'title.sessions': 'セッションとエクスポート',
1221
+ 'title.usage': 'ローカル使用量と推移',
1222
+ 'title.orchestration': 'タスクオーケストレーション',
1223
+ 'title.market': 'Skills インストールと同期',
1224
+ 'title.plugins': 'プラグインとテンプレート',
1225
+ 'title.docs': 'CLI インストールとドキュメント',
1226
+ 'title.settings': 'システムとデータ設定',
1227
+
1228
+ 'subtitle.dashboard': '集約状態と診断エントリ。',
1229
+ 'subtitle.config': 'ローカル設定とモデルの管理。',
1230
+ 'subtitle.sessions': 'セッションの閲覧とエクスポート。',
1231
+ 'subtitle.usage': '過去 7 / 30 日間の使用量を表示。',
1232
+ 'subtitle.orchestration': 'ローカルタスクの計画・キュー・実行・振り返り。',
1233
+ 'subtitle.market': 'ローカル Skills の管理。',
1234
+ 'subtitle.plugins': 'テンプレート化されたプロンプトと再利用可能なプラグインの管理。',
1235
+ 'subtitle.docs': 'CLI インストールコマンドとトラブルシューティング。',
1236
+ 'subtitle.settings': 'ダウンロード・ディレクトリ・ゴミ箱の管理。',
1237
+
1238
+ 'dashboard.doctor.title': 'Doctor',
1239
+ 'dashboard.doctor.runChecks': 'チェックを実行',
1240
+ 'dashboard.doctor.checking': 'チェック中...',
1241
+ 'dashboard.doctor.export': 'レポートをエクスポート',
1242
+ 'dashboard.doctor.export.json': 'JSON エクスポート',
1243
+ 'dashboard.doctor.export.md': 'Markdown エクスポート',
1244
+ 'dashboard.doctor.open': '開く',
1245
+ 'doctor.action.openConfig': 'Config を開く',
1246
+ 'doctor.action.checkProvider': 'Provider 設定をチェック',
1247
+ 'doctor.action.openUsage': 'Usage を開く',
1248
+ 'doctor.action.openSessions': 'Sessions を開く',
1249
+ 'doctor.action.openTasks': 'Tasks を開く',
1250
+ 'doctor.action.viewTaskLogs': 'Tasks / Logs を表示',
1251
+ 'doctor.action.openSkills': 'Skills を開く',
1252
+ 'doctor.issue.configNotReady.problem': '設定ファイルが準備できていません',
1253
+ 'doctor.issue.configNotReady.impact': 'provider/model が読み取れず、モデル一覧とリクエストが利用できなくなる可能性があります。',
1254
+ 'doctor.issue.providerUnreachable.problem.remote-model-probe-unreachable': 'Provider に到達できません',
1255
+ 'doctor.issue.providerUnreachable.problem.remote-model-probe-auth-failed': 'Provider 認証失敗',
1256
+ 'doctor.issue.providerUnreachable.problem.remote-model-probe-not-found': 'Provider が 404 を返しました',
1257
+ 'doctor.issue.providerUnreachable.problem.remote-model-probe-http-error': 'Provider が HTTP エラーを返しました',
1258
+ 'doctor.issue.providerUnreachable.problem.remote-model-probe-error': 'Provider プローブ失敗',
1259
+ 'doctor.issue.providerUnreachable.problem.unknown': 'Provider が利用できません',
1260
+ 'doctor.issue.providerUnreachable.impactAuth': '認証失敗によりモデル一覧/会話リクエストが 401/403 を返します。',
1261
+ 'doctor.issue.providerUnreachable.impactNetwork': 'リモートに到達できないためモデル一覧/会話リクエストが失敗またはタイムアウトします。',
1262
+ 'doctor.issue.configHealthFailed.problem': '設定ヘルスチェックが失敗しました',
1263
+ 'doctor.issue.configHealthFailed.impact': '一部の機能が利用できなかったり、期待通りの動作をしない可能性があります。',
1264
+ 'doctor.issue.usageError.problem': 'Usage 統計異常',
1265
+ 'doctor.issue.usageError.impact': 'Usage ページでトレンド/サマリーが表示できず、Doctor の使用量診断も欠落します。',
1266
+ 'doctor.issue.usageMissingModel.problem': '一部のセッションにモデル情報がありません',
1267
+ 'doctor.issue.usageMissingModel.impact': '使用量の帰属とコスト見積もりが不正確になります。',
1268
+ 'doctor.issue.tasksError.problem': 'Tasks 状態の読み取りに失敗しました',
1269
+ 'doctor.issue.tasksError.impact': 'オーケストレーションキュー/実行記録が表示できなくなる可能性があります。',
1270
+ 'doctor.issue.tasksFailed.problem': '失敗したタスク実行があります',
1271
+ 'doctor.issue.tasksFailed.impact': '自動化パイプラインが中断される可能性があります。ログを確認して再試行または入力を修正してください。',
1272
+ 'doctor.issue.skillsError.problem': 'Skills 一覧の読み取りに失敗しました',
1273
+ 'doctor.issue.skillsError.impact': 'Skills ページが正常に表示またはインストールできなくなります。',
1274
+ 'doctor.issue.skillsRootMissing.problem': 'Skills ディレクトリが存在しません',
1275
+ 'doctor.issue.skillsRootMissing.impact': 'Skills のインストール/スキャンが空になります。Settings/Docs でガイドに従ってディレクトリを初期化してください。',
1276
+ 'doctor.issue.skillsMissingFiles.problem': 'skill.json が欠落しているスキルがあります',
1277
+ 'doctor.issue.skillsMissingFiles.impact': '一部のスキルが実行または同期できなくなります。',
1278
+ 'dashboard.card.config': '設定',
1279
+ 'dashboard.card.sessions': 'セッション',
1280
+ 'dashboard.card.usage': '使用量',
1281
+ 'dashboard.card.tasks': 'タスク',
1282
+ 'dashboard.card.skills': 'Skills',
1283
+ 'dashboard.kv.model': 'モデル',
1284
+ 'dashboard.kv.issue': '異常',
1285
+ 'dashboard.kv.active': '現在',
1286
+ 'dashboard.kv.sessions': 'セッション数',
1287
+ 'dashboard.kv.missingModel': 'モデル欠落',
1288
+ 'dashboard.kv.blockers': 'ブロッカー',
1289
+ 'dashboard.kv.runs': '実行',
1290
+ 'dashboard.kv.target': 'ターゲット',
1291
+ 'dashboard.kv.root': 'ディレクトリ',
1292
+ 'dashboard.status.health': '健全',
1293
+ 'dashboard.status.busy': 'ビジー',
1294
+ 'dashboard.status.models': 'モデル',
1295
+ 'dashboard.busy.init': '初期化',
1296
+ 'dashboard.busy.sessions': 'セッション読み込み',
1297
+ 'dashboard.busy.models': 'モデル読み込み',
1298
+ 'dashboard.busy.configApply': '設定適用',
1299
+ 'dashboard.busy.agents': 'AGENTS 保存',
1300
+ 'dashboard.busy.skills': 'Skills 管理',
1301
+ 'dashboard.busy.tasks': 'タスクオーケストレーション',
1302
+ 'dashboard.busy.idle': 'アイドル',
1303
+ 'dashboard.message.none': 'メッセージなし',
1304
+ 'dashboard.sessionSource.codex': 'Codex',
1305
+ 'dashboard.sessionSource.claude': 'Claude Code',
1306
+ 'dashboard.sessionSource.gemini': 'Gemini CLI',
1307
+ 'dashboard.sessionSource.codebuddy': 'CodeBuddy Code',
1308
+ 'dashboard.sessionSource.all': 'すべて',
1309
+ 'dashboard.sessionPath.all': 'すべてのパス',
1310
+ 'dashboard.sessionQuery.unsupported': '現在のソースは非対応',
1311
+ 'dashboard.sessionQuery.unset': '未設定',
1312
+ 'dashboard.healthStatus.failRead': '読み取り失敗',
1313
+ 'dashboard.healthStatus.initializing': '初期化中',
1314
+ 'dashboard.healthStatus.ok': '正常',
1315
+ 'dashboard.modelStatus.loading': '読み込み中',
1316
+ 'dashboard.modelStatus.error': '読み込みエラー',
1317
+ 'dashboard.modelStatus.ok': '正常',
1318
+ 'dashboard.health.ok': 'チェック通過',
1319
+ 'dashboard.health.fail': 'チェック失敗',
1320
+ 'dashboard.health.issues': '{count} 件の問題',
1321
+ 'dashboard.issues.title': '{count} 件の対応可能な問題が見つかりました',
1322
+ 'dashboard.state.loading': '読み込み中',
1323
+ 'dashboard.state.ready': '準備完了',
1324
+ 'dashboard.state.idle': '未読み込み',
1325
+ 'dashboard.none': 'なし',
1326
+ 'dashboard.sessions.count': '{count} 件のセッション',
1327
+ 'dashboard.usage.range': '範囲 {value}',
1328
+ 'dashboard.tasks.queue': '実行 {running} / キュー {queued}',
1329
+ 'dashboard.skills.count': 'インストール済 {installed} / インポート可 {importable}',
1330
+ 'dashboard.providersHealth.title': 'Provider 健全性',
1331
+ 'dashboard.providersHealth.current': '(現在)',
1332
+ 'dashboard.providersHealth.checking': 'チェック中...',
1333
+ 'dashboard.providersHealth.allOk': 'すべての Provider が正常',
1334
+ 'dashboard.providersHealth.hasIssues': '{count} 件の Provider に問題あり',
1335
+
1336
+ // Plugins panel
1337
+ 'plugins.sidebar.title': 'Plugins',
1338
+ 'plugins.sidebar.note': '再利用可能な標準化ツール。将来のカスタムプラグインも同じ構造に従います。',
1339
+ 'plugins.sidebar.ariaList': 'プラグイン一覧',
1340
+ 'plugins.main.ariaWorkspace': 'プラグインワークスペース',
1341
+ 'plugins.refresh': '更新',
1342
+ 'plugins.refreshing': '更新中...',
1343
+ 'plugins.promptTemplates.title': 'プロンプトテンプレート',
1344
+ 'plugins.promptTemplates.subtitle': '内蔵:コードコメントのブラッシュアップ({{code}})。コピーして入力欄に貼り付けてください。',
1345
+ 'plugins.promptTemplates.mode.aria': 'プロンプトテンプレートモード',
1346
+ 'plugins.promptTemplates.mode.compose': '生成',
1347
+ 'plugins.promptTemplates.mode.manage': '管理',
1348
+ 'plugins.promptTemplates.compose.selectTemplate': 'テンプレートを選択',
1349
+ 'plugins.promptTemplates.compose.chooseTemplate': 'テンプレートを選択',
1350
+ 'plugins.promptTemplates.compose.chooseTemplateHint': 'テンプレートを選択して生成を開始してください。',
1351
+ 'plugins.promptTemplates.compose.builtinSuffix': '(内蔵)',
1352
+ 'plugins.promptTemplates.compose.empty': '利用可能なテンプレートがありません。',
1353
+ 'plugins.promptTemplates.compose.varsHint': '変数の入力と追加は「管理」で行ってください。',
1354
+ 'plugins.promptTemplates.compose.missingCount': '{count} 項目未入力',
1355
+ 'plugins.promptTemplates.compose.jumpToMissing': '未入力にジャンプ',
1356
+ 'plugins.promptTemplates.compose.goManage': '管理で変数を入力',
1357
+ 'plugins.promptTemplates.compose.outputTitle': '生成結果',
1358
+ 'plugins.promptTemplates.compose.outputHint': '「コピー」をクリックして Codex/Claude の入力欄に貼り付けてください。',
1359
+ 'plugins.promptTemplates.compose.outputAria': '生成結果(プロンプト)',
1360
+ 'plugins.promptTemplates.compose.copy': 'コピー',
1361
+ 'plugins.promptTemplates.manage.searchAria': 'テンプレート検索',
1362
+ 'plugins.promptTemplates.manage.searchPlaceholder': 'テンプレート検索',
1363
+ 'plugins.promptTemplates.manage.create': '新規作成',
1364
+ 'plugins.promptTemplates.manage.export': 'エクスポート',
1365
+ 'plugins.promptTemplates.manage.import': 'インポート',
1366
+ 'plugins.promptTemplates.manage.loading': 'テンプレート読み込み中...',
1367
+ 'plugins.promptTemplates.manage.empty': 'テンプレートがありません。',
1368
+ 'plugins.promptTemplates.manage.vars': '{count} vars',
1369
+ 'plugins.promptTemplates.manage.builtin': 'built-in',
1370
+ 'plugins.promptTemplates.manage.custom': 'custom',
1371
+ 'plugins.promptTemplates.manage.newTemplateName': '新しいテンプレート',
1372
+ 'plugins.promptTemplates.editor.selectHint': '編集するテンプレートを選択してください。',
1373
+ 'plugins.promptTemplates.editor.namePlaceholder': 'テンプレート名',
1374
+ 'plugins.promptTemplates.editor.nameAria': 'テンプレート名',
1375
+ 'plugins.promptTemplates.editor.duplicate': '複製',
1376
+ 'plugins.promptTemplates.editor.delete': '削除',
1377
+ 'plugins.promptTemplates.editor.save': '保存',
1378
+ 'plugins.promptTemplates.editor.builtinReadOnly': '内蔵テンプレートは読み取り専用です。編集/保存/削除/複製はできません。',
1379
+ 'plugins.promptTemplates.editor.descPlaceholder': '説明(任意)',
1380
+ 'plugins.promptTemplates.editor.descAria': 'テンプレート説明',
1381
+ 'plugins.promptTemplates.editor.templateLabel': 'テンプレート',
1382
+ 'plugins.promptTemplates.editor.templateAria': 'テンプレート内容',
1383
+ 'plugins.promptTemplates.editor.templatePlaceholder': 'ここにテンプレートを記述します。{{var}} プレースホルダーを使用してください。',
1384
+ 'plugins.promptTemplates.vars.title': '変数',
1385
+ 'plugins.promptTemplates.vars.hint': 'テンプレートから検出されました。入力後に最終プロンプトをレンダリングできます。',
1386
+ 'plugins.promptTemplates.vars.reset': 'リセット',
1387
+ 'plugins.promptTemplates.vars.empty': '変数が検出されませんでした。',
1388
+ 'plugins.promptTemplates.vars.valuePlaceholder': '変数値:{name}',
1389
+ 'plugins.promptTemplates.preview.title': 'プレビュー',
1390
+ 'plugins.promptTemplates.preview.hint': 'レンダリング結果(欠落変数は空に置換されます)。',
1391
+ 'plugins.promptTemplates.preview.copy': 'コピー',
1392
+ 'plugins.promptTemplates.preview.outputAria': 'レンダリング結果(プロンプト)',
1393
+ 'plugins.promptTemplates.noPluginSelected': '左側からプラグインを選択してください。',
1394
+
1395
+ 'plugins.meta.attribution': '作成者:{createdBy} · メンテナー:{maintainers}',
1396
+ 'plugins.meta.createdBy': '作成者:{createdBy}',
1397
+ 'plugins.meta.maintainedBy': 'メンテナー:{maintainers}',
1398
+
1399
+ // Built-in prompt templates
1400
+ 'plugins.builtin.commentPolish.name': 'コードコメントブラッシュアップ',
1401
+ 'plugins.builtin.commentPolish.desc': '以下のコードコメントを軽く整えてください {{code}}',
1402
+ 'plugins.builtin.commentPolish.line1': '以下のコードコメントを軽く整えてください',
1403
+ 'plugins.builtin.ruleAck.name': 'ルール確認返信',
1404
+ 'plugins.builtin.ruleAck.desc': '【{{rule}}】に従って、受信確認を返してください',
1405
+ 'plugins.builtin.ruleAck.line1': '【{{rule}}】に従って、受信確認を返してください',
1406
+
1407
+ // Toasts
1408
+ 'toast.copy.empty': 'コピーする内容がありません',
1409
+ 'toast.copy.ok': 'コピーしました',
1410
+ 'toast.copy.fail': 'コピーに失敗しました',
1411
+ 'toast.save.ok': '保存しました',
1412
+ 'toast.save.fail': '保存に失敗しました',
1413
+ 'toast.delete.ok': '削除しました',
1414
+ 'toast.delete.fail': '削除に失敗しました',
1415
+ 'toast.export.empty': 'エクスポートする内容がありません',
1416
+ 'toast.export.ok': 'エクスポートしました',
1417
+ 'toast.export.fail': 'エクスポートに失敗しました',
1418
+ 'toast.import.ok': 'インポート成功',
1419
+ 'toast.import.fail': 'インポート失敗',
1420
+ 'toast.import.notAvailable': 'インポートは利用できません',
1421
+ 'toast.import.readFileFail': 'ファイル読み取り失敗',
1422
+ 'toast.import.invalidJson': '無効な JSON',
1423
+ 'toast.import.expectedArray': 'JSON は配列である必要があります',
1424
+ 'toast.export.notSupported': '現在エクスポートはサポートされていません',
1425
+ 'toast.plugins.loadFail': 'Plugins 読み込み失敗',
1426
+ 'toast.templates.builtinNotEditable': '内蔵テンプレートは編集できません',
1427
+ 'toast.templates.builtinNotModifiable': '内蔵テンプレートは変更できません。先に複製してから編集してください',
1428
+ 'toast.templates.nameRequired': 'テンプレート名は必須です',
1429
+ 'toast.templates.builtinNotDuplicable': '内蔵テンプレートは複製できません',
1430
+ 'toast.templates.builtinNotDeletable': '内蔵テンプレートは削除できません',
1431
+ 'toast.templates.deleteTitle': 'テンプレート削除',
1432
+ 'toast.templates.deleteMessage': '「{name}」を削除しますか?この操作は取り消せません。',
1433
+ 'toast.templates.deleteConfirm': '削除',
1434
+ 'toast.templates.deleteCancel': 'キャンセル',
1435
+
1436
+ // Basic modals
1437
+ 'modal.providerAdd.title': 'プロバイダー追加',
1438
+ 'modal.providerEdit.title': 'プロバイダー編集',
1439
+ 'modal.modelAdd.title': 'モデル追加',
1440
+ 'modal.modelManage.title': 'モデル管理',
1441
+ 'modal.claudeConfigAdd.title': 'Claude Code 設定追加',
1442
+ 'modal.claudeConfigEdit.title': 'Claude Code 設定編集',
1443
+ 'field.useBuiltinTransform': '内蔵変換を使用(OpenAI 形式互換)',
1444
+ 'hint.useBuiltinTransform': '有効時:書き込まれる base_url は codexmate 内蔵変換サービスを指します。Codex のトークンは codexmate に固定されます。',
1445
+
1446
+ // Config template / agents modals
1447
+ 'modal.configTemplate.title': 'Config テンプレートエディタ(手動確認適用)',
1448
+ 'modal.configTemplate.label': 'config.toml テンプレート',
1449
+ 'modal.configTemplate.placeholder': 'ここに config.toml テンプレート内容を編集してください',
1450
+ 'modal.configTemplate.mode.twoStep': '二段階確認:先に差分をプレビューし、その後適用します。',
1451
+ 'modal.configTemplate.mode.oneStep': '一段階適用:「適用」をクリックすると直接書き込みます。',
1452
+ 'diff.title.configTemplate': '差分プレビュー(config.toml)',
1453
+ 'diff.generating': '生成中...',
1454
+ 'diff.failed': '生成失敗',
1455
+ 'diff.noChanges': '変更が検出されませんでした',
1456
+ 'diff.hint.busy': '差分生成中または適用中のため、操作は一時的に利用できません。',
1457
+ 'diff.hint.failedBack': '差分プレビューに失敗しました。編集に戻って再試行してください。',
1458
+ 'diff.hint.noChangesBack': '変更が検出されませんでした。編集に戻って修正を続けるか、キャンセルして終了してください。',
1459
+ 'diff.hint.previewMode': '現在プレビューモードです。「適用」をクリックして書き込むか、「編集に戻る」で修正を続けてください。',
1460
+
1461
+ 'modal.agents.export': 'エクスポート',
1462
+ 'modal.agents.copy': 'コピー',
1463
+ 'modal.agents.title': 'AGENTS.md エディタ',
1464
+ 'modal.agents.hint': '保存すると対象の AGENTS.md(config.toml と同階層)に書き込まれます。',
1465
+ 'modal.agents.targetFile': '対象ファイル',
1466
+ 'modal.agents.contentLabel': 'AGENTS.md 内容',
1467
+ 'modal.agents.placeholder': 'ここに AGENTS.md の内容を編集してください',
1468
+ 'modal.agents.unsaved.previewModeHint': 'プレビューモード:現在の変更はまだ保存されていません。「適用」をクリックするとファイルに書き込まれます。',
1469
+ 'modal.agents.unsaved.detectedHint': '未保存の変更が検出されました:ページを閉じるか適用する前に保存してください。',
1470
+ 'modal.agents.hint.shortcuts': 'ショートカット:Esc(差分プレビュー時は編集に戻る、編集時はウィンドウを閉じる)。',
1471
+ 'modal.agents.hint.twoStepSave': '保存は2段階:「確認」で差分をプレビューし、「適用」で保存します。',
1472
+ 'diff.tooLargeSkip': '内容が大きすぎるため、行単位の差分プレビューをスキップしました',
1473
+ 'diff.viewHint.preview': '現在プレビューモードです。「適用」で保存するか、「編集に戻る」で修正を続けてください。',
1474
+ 'diff.viewHint.truncated': '内容が大きすぎるためプレビューをスキップしました。「適用」で保存するか、「編集に戻る」で修正を続けてください。',
1475
+
1476
+ // Skills modal
1477
+ 'modal.skills.title': 'Skills 管理',
1478
+ 'modal.skills.subtitle': '現在のホストのローカル Skills を管理します。',
1479
+ 'modal.skills.target.aria': 'Skills 管理ターゲットを選択',
1480
+ 'modal.skills.rootDir': 'Skills ディレクトリ({label})',
1481
+ 'modal.skills.summary.target': 'インストールターゲット',
1482
+ 'modal.skills.summary.total': 'ローカル総数',
1483
+ 'modal.skills.summary.withSkill': 'SKILL.md あり',
1484
+ 'modal.skills.summary.missingSkill': 'SKILL.md なし',
1485
+ 'modal.skills.summary.importable': 'インポート可',
1486
+ 'modal.skills.panel.aria': 'Skills 管理パネル',
1487
+ 'modal.skills.local.title': 'ローカル Skills',
1488
+ 'modal.skills.local.note': '検索・フィルター・一括削除が可能です。',
1489
+ 'modal.skills.filter.keywordAria': '名前または説明で skill をフィルター',
1490
+ 'modal.skills.filter.keywordPlaceholder': 'ディレクトリ名/表示名/説明で検索',
1491
+ 'modal.skills.filter.statusAria': 'SKILL.md 状態で skill をフィルター',
1492
+ 'modal.skills.filter.status.all': 'すべての状態',
1493
+ 'modal.skills.filter.status.withSkill': 'SKILL.md ありのみ',
1494
+ 'modal.skills.filter.status.missingSkill': 'SKILL.md なしのみ',
1495
+ 'modal.skills.selection.stats': '選択 {selected}(フィルターヒット {filtered} / {total}、フィルター内選択 {visibleSelected})',
1496
+ 'modal.skills.empty.local': '管理可能な skill がありません。',
1497
+ 'modal.skills.empty.filtered': '現在のフィルター条件に一致する skill がありません。',
1498
+ 'modal.skills.pill.hasSkillFile': 'SKILL.md あり',
1499
+ 'modal.skills.pill.missingSkillFile': 'SKILL.md なし',
1500
+ 'modal.skills.pill.symlink': 'シンボリックリンク',
1501
+ 'modal.skills.pill.dir': 'ディレクトリ',
1502
+ 'modal.skills.import.title': 'クロスアプリインポート',
1503
+ 'modal.skills.import.note': 'スキャンして現在の {label} にインポートします。',
1504
+ 'modal.skills.import.scan': 'インポート可能をスキャン',
1505
+ 'modal.skills.import.stats': '選択 {selected} / {total}、SKILL.md あり {configured}、なし {missing}',
1506
+ 'modal.skills.import.emptyHint': 'インポート可能な skill がありません。「インポート可能をスキャン」をクリックしてください。',
1507
+ 'modal.skills.bulk.title': '一括操作',
1508
+ 'modal.skills.bulk.note': '右側はインポート操作、左側はローカル選択です。',
1509
+ 'modal.skills.actions.zipImport': 'ZIP インポート',
1510
+ 'modal.skills.actions.zipImporting': 'ZIP インポート中...',
1511
+ 'modal.skills.actions.exportSelected': '選択をエクスポート',
1512
+ 'modal.skills.actions.exporting': 'エクスポート中...',
1513
+ 'modal.skills.actions.importSelected': '選択をインポート',
1514
+ 'modal.skills.actions.importing': 'インポート中...',
1515
+ 'modal.skills.actions.deleteSelected': '選択を削除',
1516
+ 'modal.skills.actions.deleting': '削除中...',
1517
+
1518
+ // OpenClaw config modal (quick)
1519
+ 'placeholder.openclawConfigNameExample': '例: デフォルト設定',
1520
+ 'modal.openclaw.loadCurrent': '現在の設定を読み込む',
1521
+ 'modal.openclaw.quick.title': '初心者向けクイック設定',
1522
+ 'modal.openclaw.quick.subtitle': '3ステップで完了:Provider とモデルを入力、エディタに書き込み、保存して適用。',
1523
+ 'modal.openclaw.quick.readFromEditor': 'エディタから読み取り',
1524
+ 'modal.openclaw.quick.step1': 'Provider とモデルを入力',
1525
+ 'modal.openclaw.quick.step2': 'エディタに書き込みをクリック',
1526
+ 'modal.openclaw.quick.step3': '保存して適用',
1527
+ 'modal.openclaw.quick.providerHint': 'provider/model として主モデル識別子に結合されます。',
1528
+ 'modal.openclaw.quick.baseUrlHintDefault': 'OpenClaw 内蔵 provider のデフォルト値で補完されています。直接変更可能です。',
1529
+ 'modal.openclaw.quick.baseUrlHintReadonly': '外部参照が検出されたため、クイックフォームでは読み取り専用で表示されます。変更するには原文編集を使用してください。',
1530
+ 'modal.openclaw.quick.apiKeyHintFromAuth': '現在の値は OpenClaw 外部認証設定から取得されています。変更後「保存して適用」時に対応する auth profile に書き戻されます。',
1531
+ 'modal.openclaw.quick.apiKeyHintReadonly': '外部認証または参照が検出されたため、クイックフォームでは読み取り専用で表示されます。変更するには原文編集または対応する認証設定を使用してください。',
1532
+ 'modal.openclaw.quick.apiKeyHintKeep': '空白のままにすると既存のキーは上書きされません。',
1533
+ 'placeholder.apiTypeExample': '例: openai',
1534
+ 'modal.openclaw.quick.modelTitle': 'モデル',
1535
+ 'placeholder.modelIdExample': '例: gpt-5',
1536
+ 'placeholder.modelNameOptional': 'モデル表示名(任意)',
1537
+ 'field.contextWindow': 'コンテキスト長',
1538
+ 'field.maxOutput': '最大出力',
1539
+ 'hint.emptyNoChange': '空白のままにすると既存の設定は変更されません。',
1540
+ 'modal.openclaw.quick.optionsTitle': 'オプション',
1541
+ 'modal.openclaw.quick.setPrimary': '主モデルに設定',
1542
+ 'modal.openclaw.quick.overrideProvider': '同名 Provider 基本情報を上書き',
1543
+ 'modal.openclaw.quick.overrideModels': '同名モデルリストを上書き',
1544
+ 'modal.openclaw.quick.optionsHint': '上書きをオフにすると欠落フィールドのみ補完されます。',
1545
+ 'modal.openclaw.quick.writeToEditor': 'エディタに書き込み',
1546
+
1547
+ // Docs panel
1548
+ 'docs.title': 'CLI インストールドキュメント',
1549
+ 'docs.subtitle': 'Claude Code / Gemini CLI / CodeBuddy Code / Codex CLI コマンドを表示。',
1550
+ 'docs.section.commands': 'インストールコマンド',
1551
+ 'docs.section.commandsNote': 'コマンドは直接コピーできます。',
1552
+ 'docs.section.faq': 'よくある質問',
1553
+ 'docs.section.faqNote': 'よくある質問は以下をご覧ください。',
1554
+ 'docs.command.aria': '{name} コマンド',
1555
+ 'docs.registryHintPrefix': 'コマンドに付加:',
1556
+ 'docs.registryHintCustom': '完全な URL(http/https 含む)を入力してください。コマンドに自動付加されます。',
1557
+ 'docs.registry.tencent': 'Tencent Cloud',
1558
+ 'docs.meta.bin': 'bin: {bin}',
1559
+ 'docs.termuxLabel': 'Termux',
1560
+ 'docs.termuxAria': 'Termux Codex CLI command',
1561
+ 'docs.rule.1': 'コマンドは現在のパッケージマネージャー、ミラー、操作に基づいて生成されます。',
1562
+ 'docs.rule.2': 'カスタムミラーはインストールとアップグレードにのみ使用されます。',
1563
+ 'docs.tip.win.1': 'PowerShell で権限不足(EACCES/EPERM)エラーが発生した場合は、管理者としてインストールコマンドを実行してください。',
1564
+ 'docs.tip.win.2': 'インストール後にコマンドが見つからない場合は、ターミナルを再起動して実行:where codex / where claude / where gemini / where codebuddy。',
1565
+ 'docs.tip.win.3': '企業ネットワークで制限がある場合は、ミラーソース(npmmirror / Tencent Cloud / カスタム)を切り替えてください。',
1566
+ 'docs.tip.unix.1': 'EACCES 権限エラーが発生した場合は、Node グローバルディレクトリの権限を修正してください。sudo npm は推奨しません。',
1567
+ 'docs.tip.unix.2': 'インストール後にコマンドが認識されない場合は、ターミナルを再起動して実行:which codex / which claude / which gemini / which codebuddy。',
1568
+ 'docs.tip.unix.3': '企業ネットワークで制限がある場合は、ミラーソース(npmmirror / Tencent Cloud / カスタム)を切り替えてください。',
1569
+
1570
+ // Sessions panel
1571
+ 'sessions.loading': 'セッション読み込み中...',
1572
+ 'sessions.sourceTitle': 'ソース',
1573
+ 'sessions.refresh': '更新',
1574
+ 'sessions.refreshing': '更新中...',
1575
+ 'sessions.allPaths': 'すべてのパス',
1576
+ 'sessions.source.codex': 'Codex',
1577
+ 'sessions.source.claudeCode': 'Claude Code',
1578
+ 'sessions.source.gemini': 'Gemini',
1579
+ 'sessions.source.codebuddy': 'CodeBuddy',
1580
+ 'sessions.loadingList': 'セッション一覧を読み込み中...',
1581
+ 'sessions.empty': 'セッションがありません',
1582
+ 'sessions.unknownTime': '不明な時間',
1583
+ 'sessions.query.placeholder.enabled': 'セッションを検索...',
1584
+ 'sessions.query.placeholder.disabled': '現在のソースでは検索は利用できません',
1585
+ 'sessions.pin': 'ピン留め',
1586
+ 'sessions.unpin': 'ピン留め解除',
1587
+ 'sessions.copyResume': '再開コマンドをコピー',
1588
+ 'sessions.preview.refresh': '更新',
1589
+ 'sessions.preview.loading': 'プレビュー読み込み中...',
1590
+ 'sessions.preview.deleteHard': '直接削除',
1591
+ 'sessions.preview.moveToTrash': 'ゴミ箱に移動',
1592
+ 'sessions.preview.deleting': '削除中...',
1593
+ 'sessions.preview.moving': '移動中...',
1594
+ 'sessions.preview.export': 'エクスポート',
1595
+ 'sessions.preview.exporting': 'エクスポート中...',
1596
+ 'sessions.preview.convert': '派生セッションを生成',
1597
+ 'sessions.preview.converting': '変換中...',
1598
+ 'sessions.preview.convert.loadedOnly': '読み込み済みのみ変換',
1599
+ 'sessions.preview.openStandalone': 'スタンドアロンで開く',
1600
+ 'sessions.preview.loadingBody': 'メッセージ読み込み中...',
1601
+ 'sessions.preview.emptyMsgs': 'メッセージがありません',
1602
+ 'sessions.preview.rendering': 'レンダリング中...',
1603
+ 'sessions.preview.rerender': '再レンダリング',
1604
+ 'sessions.preview.preparing': '準備中...',
1605
+ 'sessions.preview.clipped': 'プレビューは一部のみ表示されています',
1606
+ 'sessions.preview.shownCount': '{shown} / {total} 件表示',
1607
+ 'sessions.preview.loadMore': 'さらに読み込む',
1608
+ 'sessions.preview.loadingMore': 'さらに読み込み中...',
1609
+ 'sessions.timeline.aria': 'セッションタイムライン',
1610
+ 'sessions.selectHint': '左側からセッションを選択してください',
1611
+ 'sessions.role.all': 'すべてのロール',
1612
+ 'sessions.role.user': 'ユーザー',
1613
+ 'sessions.role.assistant': 'アシスタント',
1614
+ 'sessions.role.system': 'システム',
1615
+ 'sessions.time.all': 'すべての期間',
1616
+ 'sessions.time.7d': '直近 7 日',
1617
+ 'sessions.time.30d': '直近 30 日',
1618
+ 'sessions.time.90d': '直近 90 日',
1619
+ 'sessions.sort.time': '時間順',
1620
+ 'sessions.sort.hot': '話題順',
1621
+ 'sessions.sort.hotBadge': '話題',
1622
+ 'sessions.filters.copyLink': 'リンクをコピー',
1623
+ 'sessions.filters.urlBuildFail': 'リンク生成失敗',
1624
+ 'sessions.filters.source': 'ソース',
1625
+ 'sessions.filters.path': 'パス',
1626
+ 'sessions.filters.keyword': 'キーワード',
1627
+ 'sessions.filters.role': 'ロール',
1628
+ 'sessions.filters.time': '期間',
1629
+ 'sessions.roleLabel.user': 'User',
1630
+ 'sessions.roleLabel.system': 'System',
1631
+ 'sessions.roleLabel.assistant': 'Assistant',
1632
+
1633
+ // Usage panel
1634
+ 'usage.overview': 'Usage 概要',
1635
+ 'usage.range.aria': 'Usage 時間範囲',
1636
+ 'usage.range.7d': '直近 7 日',
1637
+ 'usage.range.30d': '直近 30 日',
1638
+ 'usage.range.all': 'すべて',
1639
+ 'usage.compare.toggle': '前期間と比較',
1640
+ 'usage.compare.prev': '前期間',
1641
+ 'usage.compare.delta': '変化',
1642
+ 'usage.refresh': '統計を更新',
1643
+ 'usage.refreshing': '更新中...',
1644
+ 'usage.loading': 'Usage 統計を読み込み中...',
1645
+ 'usage.empty': '統計に使用できるセッションデータがありません',
1646
+ 'usage.refreshOverlay': '更新中…',
1647
+ 'usage.copyTitle': 'クリックでコピー:{value}',
1648
+ 'usage.copySuccess': 'コピー済:{label}',
1649
+ 'usage.copyFail': 'コピー失敗',
1650
+ 'usage.copyNone': 'コピーする内容がありません',
1651
+ 'usage.daily.title': '日別消費',
1652
+ 'usage.daily.subtitle': '日別 token と推定費用のサマリー(費用はそれぞれ最大値で正規化表示)。',
1653
+ 'usage.daily.note': '注:推定費用はデフォルトで Claude を含みません。モデル単価が一致し、セッションが input/output token を記録している場合のみ計算されます。',
1654
+ 'usage.heatmap.title': 'ヒートマップ',
1655
+ 'usage.heatmap.subtitle': '日別セッション数。色が濃いほど多い。',
1656
+ 'usage.heatmap.legend.less': '少',
1657
+ 'usage.heatmap.legend.more': '多',
1658
+ 'usage.heatmap.tooltip': '{date} · {sessions} セッション · {messages} メッセージ · {tokens} token',
1659
+ 'usage.heatmap.aria': '{date}、{sessions} セッション',
1660
+ 'usage.hourlyHeatmap.title': '7×24 アクティブヒートマップ',
1661
+ 'usage.hourlyHeatmap.subtitle': '曜日 × 時間帯でセッション分布を集計、濃色 = 高アクティブ。',
1662
+ 'usage.hourlyHeatmap.tooltip': '{weekday} {hour}:00 · {sessions} セッション · {messages} メッセージ · {tokens} token',
1663
+ 'usage.hourlyHeatmap.legend.less': '少',
1664
+ 'usage.hourlyHeatmap.legend.more': '多',
1665
+ 'usage.legend.tokens': 'Token',
1666
+ 'usage.legend.cost': '推定費用',
1667
+ 'usage.table.date': '日付',
1668
+ 'usage.table.sessions': 'セッション',
1669
+ 'usage.table.messages': 'メッセージ',
1670
+ 'usage.table.tokens': 'Token',
1671
+ 'usage.table.cost': '推定費用',
1672
+ 'usage.trend.sessions': 'セッション推移',
1673
+ 'usage.trend.messages': 'メッセージ推移',
1674
+ 'usage.trend.activeHours': 'アクティブ時間帯',
1675
+ 'usage.trend.sources': 'ソースインサイト',
1676
+ 'usage.legend.codex': 'Codex',
1677
+ 'usage.legend.claude': 'Claude',
1678
+ 'usage.trend.sessions.codexTitle': 'Codex {count}',
1679
+ 'usage.trend.sessions.claudeTitle': 'Claude {count}',
1680
+ 'usage.trend.messages.barTitle': '{count} 件のメッセージ',
1681
+ 'usage.hour.title': '{hour}:00 · {count} 回のセッション',
1682
+ 'usage.source.row': '{sessions} セッション · {messages} メッセージ · 平均 {avg}',
1683
+ 'usage.summary.sessions': '総セッション数',
1684
+ 'usage.summary.messages': '総メッセージ数',
1685
+ 'usage.summary.tokens': '総 Token 数',
1686
+ 'usage.summary.contextWindow': '総コンテキスト数',
1687
+ 'usage.summary.estimatedCost': '推定費用 · {range}',
1688
+ 'usage.estimatedCost.note.excludesClaudePrefix': '現在 Claude を除く、',
1689
+ 'usage.estimatedCost.method.configured': '設定済み単価で推定',
1690
+ 'usage.estimatedCost.method.catalog': '公開モデルカタログで推定',
1691
+ 'usage.estimatedCost.method.configuredAndCatalog': '設定済み単価 + 公開モデルカタログで推定',
1692
+ 'usage.estimatedCost.detail.estimate': '{prefix}{method}、推定 {estimate}、カバー {covered}/{total} セッション、約 {percent}% token',
1693
+ 'usage.estimatedCost.detail.missing': '{prefix}一致するモデル単価または token 分割がありません。先に models.cost を補完するか、セッションが input/output token を記録しているか確認してください。',
1694
+ 'usage.summary.activeDuration': 'アクティブ期間',
1695
+ 'usage.summary.activeDuration.title': '累積セッションスパン {value}',
1696
+ 'usage.summary.totalDuration': '総期間',
1697
+ 'usage.summary.totalDuration.title': '全体の時間スパン {value}',
1698
+ 'usage.summary.activeDays': 'アクティブ日数',
1699
+ 'usage.summary.avgMessagesPerSession': 'セッションあたり平均メッセージ',
1700
+ 'usage.summary.busiestDay': '最も忙しい日',
1701
+ 'usage.summary.busiestHour': 'ピーク時間帯',
1702
+ 'usage.currentSession.title': '現在のセッション',
1703
+ 'usage.currentSession.apiDuration': 'API 時間',
1704
+ 'usage.currentSession.totalDuration': '総時間',
1705
+ 'usage.currentSession.tokens': 'Token',
1706
+ 'usage.range.kicker.all': 'すべて',
1707
+ 'usage.range.kicker.30d': '直近 30 日',
1708
+ 'usage.range.kicker.7d': '直近 7 日',
1709
+ 'usage.copyTokenDay': 'コピー済:Token({day})',
1710
+ 'usage.copyCostDay': 'コピー済:推定費用({day})',
1711
+ 'usage.dayDetail.title': '{day} 詳細',
1712
+ 'usage.dayDetail.subtitle': '日付を選択すると当日の構成をすばやく確認できます。',
1713
+ 'usage.dayDetail.pick': '日付を選択',
1714
+ 'usage.dayDetail.empty': '日付を選択して当日の構成を確認してください。',
1715
+ 'usage.dayDetail.clear': 'クリア',
1716
+ 'usage.dayDetail.topSessions': 'トップセッション',
1717
+ 'usage.dayDetail.topModels': 'トップモデル',
1718
+ 'usage.models.title': '使用モデル',
1719
+ 'usage.models.subtitle': '実際に記録されたモデル名のみを表示します。',
1720
+ 'usage.models.kicker': '識別済 {modeled}/{total}',
1721
+ 'usage.models.count': 'モデル数',
1722
+ 'usage.models.coverage': 'セッションカバレッジ',
1723
+ 'usage.models.missing': 'モデル欠落',
1724
+ 'usage.models.noneTitle': '現在の範囲でモデル名が読み取れません',
1725
+ 'usage.models.noneBody': '{total} セッションをスキャンしましたが、元のレコードに識別可能な model フィールドがありません。',
1726
+ 'usage.models.providerOnly': 'うち {count} 件の古いセッションは provider のみ記録されています。',
1727
+ 'usage.models.missingNote.providerOnly': '別途 {count} 件のセッションにモデル名がなく、一覧に含まれていません。',
1728
+ 'usage.models.missingNote': '別途 {count} 件のセッションに model がなく、一覧に含まれていません。',
1729
+ 'usage.models.missingListTitle': 'まだモデル名が欠落しているセッション',
1730
+ 'usage.models.chipTitle': '{model} · {sessions} セッション · {messages} メッセージ{tokens}',
1731
+ 'usage.models.meta': '{sessions} セッション · {messages} メッセージ{tokens}',
1732
+ 'usage.weekday.title': '曜日分布',
1733
+ 'usage.paths.title': '高頻度パス',
1734
+ 'usage.paths.empty': 'パスデータがありません',
1735
+ 'usage.paths.count': '{count} 回',
1736
+ 'usage.paths.meta': '{messages} メッセージ{recent}',
1737
+ 'usage.paths.recent': ' · 最近 {label}',
1738
+ 'usage.recent.title': '最近アクティブなセッション',
1739
+ 'usage.sessions.empty': 'セッションデータがありません',
1740
+ 'usage.sessions.messages': '{count} メッセージ',
1741
+ 'usage.sessions.topDensity': 'メッセージ密度最高',
1742
+
1743
+ // Config panel (Codex)
1744
+ 'config.addProvider': 'プロバイダー追加',
1745
+ 'config.providerTemplate.title': 'プリセットプロバイダー',
1746
+ 'config.models': 'モデル',
1747
+ 'config.modelLoading': '読み込み中...',
1748
+ 'config.models.unlimited': '現在モデル一覧がありません。手動入力可能です。',
1749
+ 'config.models.error': 'モデル一覧の取得に失敗しました。手動入力可能です。',
1750
+ 'config.models.notInList.codex': '現在のモデルは一覧にありません。手動入力またはテンプレート変更が可能です。',
1751
+ 'config.models.notInList.other': '現在のモデルは一覧にありません。手動入力可能です。',
1752
+ 'config.template.editFirst': '先にテンプレートを編集してから適用してください。',
1753
+ 'config.template.bridgeCodexOnly': '{hint} テンプレートは Codex のみ編集可能です。',
1754
+ 'config.template.openEditor': 'テンプレートエディタを開く',
1755
+ 'modal.configTemplate.title': 'Config テンプレートエディタ(手動確認適用)',
1756
+ 'modal.configTemplate.placeholder': 'ここに config.toml テンプレート内容を編集してください',
1757
+ 'config.serviceTier': 'サービスティア',
1758
+ 'config.serviceTier.fast': 'fast(デフォルト)',
1759
+ 'config.serviceTier.standard': 'standard',
1760
+ 'config.serviceTier.hint': 'fast のみ {field} に書き込みます。',
1761
+ 'config.reasoningEffort': '推論強度',
1762
+ 'config.reasoningEffort.medium': 'medium(デフォルト)',
1763
+ 'config.reasoningEffort.hint': '推論の深さを制御します。high はより深く推論します。',
1764
+ 'config.contextBudget': '圧縮閾値',
1765
+ 'config.reset': 'リセット',
1766
+ 'config.example': '例: {value}',
1767
+ 'config.contextWindow.hint': 'コンテキスト上限、デフォルト 190000。',
1768
+ 'config.autoCompact.hint': '自動圧縮閾値、デフォルト 185000。',
1769
+ 'config.agents.open': 'AGENTS.md を開く',
1770
+ 'modal.agents.title.default': 'AGENTS.md エディタ',
1771
+ 'modal.agents.title.claudeMd': 'CLAUDE.md エディタ',
1772
+ 'modal.agents.title.openclaw': 'OpenClaw AGENTS.md エディタ',
1773
+ 'modal.agents.hint.default': '保存すると対象の AGENTS.md(config.toml と同階層)に書き込まれます。',
1774
+ 'modal.agents.hint.claudeMd': '保存すると ~/.claude/CLAUDE.md に書き込まれます。',
1775
+ 'modal.agents.contentLabel.claudeMd': 'CLAUDE.md 内容',
1776
+ 'modal.agents.placeholder.claudeMd': 'ここに CLAUDE.md の内容を編集してください',
1777
+ 'modal.agents.hint.openclaw': '保存すると OpenClaw Workspace の AGENTS.md に書き込まれます。',
1778
+ 'modal.agents.title.openclawWorkspaceFile': 'OpenClaw ワークスペースファイル: {fileName}',
1779
+ 'modal.agents.hint.openclawWorkspaceFile': '保存すると OpenClaw Workspace の {fileName} に書き込まれます。',
1780
+ 'config.url.unset': 'URL 未設定',
1781
+ 'config.model.unset': 'モデル未設定',
1782
+ 'config.badge.system': 'システム',
1783
+ 'config.availabilityTest': '可用性テスト',
1784
+ 'config.availabilityTestAria': '{name} の可用性をテスト',
1785
+ 'config.health.title': '設定ヘルスチェック',
1786
+ 'config.health.run': 'チェック実行',
1787
+ 'config.health.running': 'チェック中...',
1788
+ 'config.health.hint': 'すべてのプロバイダーの可用性を一括プローブし、遅延表示を更新します。',
1789
+ 'config.health.progress': '完了 {done}/{total} · 失敗 {failed}',
1790
+ 'config.health.ok': 'チェック通過',
1791
+ 'config.health.fail': 'チェック失敗',
1792
+ 'config.health.issues': '{count} 件の問題',
1793
+ 'config.shareCommand': 'コマンド共有',
1794
+ 'config.shareDisabled': '共有不可',
1795
+ 'config.shareCommand.aria': 'インポートコマンドを共有',
1796
+ 'config.provider.edit.aria': 'プロバイダーを編集:{name}',
1797
+ 'config.provider.delete.aria': 'プロバイダーを削除:{name}',
1798
+ 'config.provider.clone': 'クローン',
1799
+ 'config.provider.clone.aria': 'プロバイダーをクローン:{name}',
1800
+ 'app.loadingConfig': '設定読み込み中...',
1801
+ 'common.current': '現在 {value}',
1802
+ 'common.notSelected': '未選択',
1803
+ 'common.readFromEditor': 'エディタから読み取り',
1804
+ 'common.writeToEditor': 'エディタに書き込み',
1805
+ 'sessions.sourceLabel': 'ソース:{value}',
1806
+ 'usage.rangeLabel': '範囲:{value}',
1807
+ 'sessions.source.all': 'すべて',
1808
+ 'usage.range.all': 'すべて',
1809
+ 'usage.range.7d.short': '直近 7 日',
1810
+ 'usage.range.30d.short': '直近 30 日',
1811
+ 'orchestration.queueStats': 'キュー {running} 実行中 · {queued} 待機中',
1812
+ 'orchestration.hero.kicker': 'タスクオーケストレーション',
1813
+ 'orchestration.hero.title': '要件を実行可能なステップに分解',
1814
+ 'orchestration.hero.subtitle': '最初に目標を書き、計画をプレビューし、実行します。',
1815
+ 'orchestration.draft.reset': '下書きをリセット',
1816
+ 'orchestration.summary.aria': 'タスクオーケストレーション概要',
1817
+ 'orchestration.summary.running': '実行中',
1818
+ 'orchestration.summary.queued': '待機中',
1819
+ 'orchestration.summary.runs': '実行記録',
1820
+ 'orchestration.step1.title': '最初に結果を明確に書く',
1821
+ 'orchestration.step1.subtitle': '実行に影響する内容だけを書いてください。',
1822
+ 'orchestration.templates.title': 'クイックサンプル',
1823
+ 'orchestration.templates.reviewFix.label': 'レビュー修正 + 回帰',
1824
+ 'orchestration.templates.reviewFix.target': '現在の PR レビューを修正',
1825
+ 'orchestration.templates.reviewFix.notes': '输出统一结论,避免重复描述',
1826
+ 'orchestration.templates.reviewFix.followUps': '继续处理新增 review 评论\n最后更新 PR 摘要',
1827
+ 'orchestration.templates.planOnly.label': '計画のみ',
1828
+ 'orchestration.templates.planOnly.target': '計画を生成するだけ',
1829
+ 'orchestration.templates.planOnly.notes': '出力統一結論,避免重复描述',
1830
+ 'orchestration.templates.workflowBatch.label': 'Workflow 批处理',
1831
+ 'orchestration.templates.workflowBatch.target': 'Workflow 一括実行',
1832
+ 'orchestration.templates.workflowBatch.workflowIds': 'review-fix\nregression-test',
1833
+ 'orchestration.templates.workflowBatch.notes': '用 Workflow 跑一组固定检查并整理结果',
1834
+ 'orchestration.fields.target': 'ターゲット',
1835
+ 'orchestration.fields.target.placeholder': '例: /path/to/project',
1836
+ 'orchestration.fields.target.hint': '作業ディレクトリまたはファイルパス。',
1837
+ 'orchestration.engine.codex': 'Codex',
1838
+ 'orchestration.engine.workflow': 'Workflow',
1839
+ 'orchestration.runMode.write': '書き込み',
1840
+ 'orchestration.runMode.readOnly': '読み取り専用',
1841
+ 'orchestration.runMode.dryRun': 'ドライラン',
1842
+ 'orchestration.pills.hasTitle': 'タイトルあり',
1843
+ 'orchestration.pills.workflowCount': 'Workflow {count}',
1844
+ 'orchestration.pills.planNodes': '計画 {count} ノード',
1845
+ 'orchestration.step2.title': '計画をプレビュー',
1846
+ 'orchestration.step2.subtitle': 'AI が生成した計画を確認・調整します。',
1847
+ 'orchestration.fields.engine': 'エンジン',
1848
+ 'orchestration.fields.runMode': '実行モード',
1849
+ 'orchestration.advanced.title': '詳細設定',
1850
+ 'orchestration.fields.title': 'タイトル',
1851
+ 'orchestration.fields.title.placeholder': '例: PR #42 のレビュー指摘を修正',
1852
+ 'orchestration.fields.notes': '説明',
1853
+ 'orchestration.fields.notes.placeholder': '例:既存アーキテクチャを書き換えず、増分実装のみ行う',
1854
+ 'orchestration.fields.notes.hint': '境界条件、禁止事項、スタイル要件、検証要件を補足してください。',
1855
+ 'orchestration.fields.followUps': '後続アクション(1行1件)',
1856
+ 'orchestration.fields.followUps.placeholder': '例:\nレビューコメントの続きを処理\n最後に回帰テストを実行',
1857
+ 'orchestration.fields.concurrency': '並列度',
1858
+ 'orchestration.fields.concurrency.hint': '複雑なタスクは 1~2 から始めると安定します。',
1859
+ 'orchestration.fields.autoFixRounds': '自動修正',
1860
+ 'orchestration.fields.autoFixRounds.hint': '失敗後に自動で再試行する回数。',
1861
+ 'orchestration.fields.workflowIds': 'Workflow ID(1行1件)',
1862
+ 'orchestration.fields.workflowIds.placeholder': '例:\nreview-fix\nregression-test',
1863
+ 'orchestration.fields.workflowIds.hint': 'Workflow エンジン使用時に必須。',
1864
+ 'orchestration.workflow.stepCount': '{count} ステップ',
1865
+ 'orchestration.step3.title': '実行して確認',
1866
+ 'orchestration.step3.subtitle': '計画を実行し、結果を確認します。',
1867
+ 'orchestration.actions.planning': '計画中...',
1868
+ 'orchestration.actions.previewOnly': 'プレビューのみ',
1869
+ 'orchestration.actions.preparing': '準備中...',
1870
+ 'orchestration.actions.generatePlan': '計画を生成',
1871
+ 'orchestration.actions.planAndRun': '計画して実行',
1872
+ 'orchestration.actions.processing': '処理中...',
1873
+ 'orchestration.actions.queueAndStart': 'キューに入れて開始',
1874
+ 'orchestration.actions.caption': '「計画して実行」は必要に応じて計画を自動更新します。バッチタスクは「キューに入れて開始」を使用してください。',
1875
+ 'orchestration.stage.title': 'タスクステージ',
1876
+ 'orchestration.stage.subtitle': '3ステップでタスクを完了:計画 → プレビュー → 実行。',
1877
+ 'orchestration.stage.pill.target': 'ターゲット',
1878
+ 'orchestration.stage.pill.preview': 'プレビュー',
1879
+ 'orchestration.stage.pill.run': '実行',
1880
+ 'orchestration.plan.title': '計画',
1881
+ 'orchestration.plan.subtitle': 'AI が生成した実行計画。各ノードは1つのステップを表します。',
1882
+ 'orchestration.plan.summary.nodes': 'ノード数',
1883
+ 'orchestration.plan.summary.waves': '波数',
1884
+ 'orchestration.plan.summary.engine': 'エンジン',
1885
+ 'orchestration.plan.node.write': '書き込み',
1886
+ 'orchestration.plan.node.readOnly': '読み取り専用',
1887
+ 'orchestration.labels.dependencies': '依存',
1888
+ 'orchestration.labels.error': 'エラー',
1889
+ 'orchestration.workbench.title': 'タスクワークベンチ',
1890
+ 'orchestration.workbench.subtitle': 'タスクの計画・キュー・実行・振り返り。',
1891
+ 'orchestration.queue.start': '開始',
1892
+ 'orchestration.queue.starting': '開始中...',
1893
+ 'orchestration.workbench.tabs.aria': 'タスクタブ',
1894
+ 'orchestration.workbench.tabs.queue': 'キュー {count}',
1895
+ 'orchestration.workbench.tabs.runs': '実行記録 {count}',
1896
+ 'orchestration.workbench.tabs.detail': '詳細',
1897
+ 'orchestration.queue.empty.title': 'キューは空です',
1898
+ 'orchestration.queue.empty.subtitle': 'キューにタスクがありません。',
1899
+ 'orchestration.runs.empty.title': '実行記録なし',
1900
+ 'orchestration.runs.empty.subtitle': 'まだ実行記録がありません。',
1901
+ 'orchestration.detail.refresh': '詳細を更新',
1902
+ 'orchestration.detail.retry': '再試行',
1903
+ 'orchestration.detail.retrying': '再試行中...',
1904
+ 'orchestration.detail.empty.title': '実行記録を選択して詳細を表示',
1905
+ 'orchestration.detail.empty.subtitle': 'ここにノードの状態、サマリー、ログが表示されます。',
1906
+ 'orchestration.detail.summary.status': '状態',
1907
+ 'orchestration.detail.summary.duration': '所要時間',
1908
+ 'orchestration.detail.summary.nodes': 'ノード数',
1909
+ 'orchestration.detail.summary.summary': 'サマリー',
1910
+ 'orchestration.detail.node.meta': '{id} · 試行 {attempts} · 自動修正 {autoFix}',
1911
+ 'skills.localLabel': '{target} / ローカル Skills',
1912
+ 'skills.counts': 'インストール済 {installed} · インポート可 {importable}',
1913
+
1914
+ // Sidebar status labels (compact)
1915
+ 'status.currentSource': '現在のソース',
1916
+ 'status.sessionCount': 'セッション数',
1917
+ 'status.range': '統計範囲',
1918
+ 'status.totalSessions': '総セッション数',
1919
+ 'status.totalMessages': '総メッセージ数',
1920
+ 'status.engine': 'エンジン',
1921
+ 'status.concurrency': '並列度',
1922
+ 'status.running': '実行中',
1923
+ 'status.queued': '待機中',
1924
+ 'status.runs': '履歴実行',
1925
+ 'status.currentTarget': '現在のターゲット',
1926
+ 'status.localSkills': 'ローカル Skills',
1927
+ 'status.importable': 'インポート可',
1928
+ 'status.importableDirect': '直接インポート可',
1929
+ 'status.pm': 'パッケージマネージャー',
1930
+ 'status.action': '現在の操作',
1931
+ 'status.registry': 'ミラー',
1932
+ 'status.claudeConfig': 'Claude 設定',
1933
+ 'status.claudeModel': 'Claude モデル',
1934
+ 'status.openclawConfig': 'OpenClaw 設定',
1935
+ 'status.workspaceFile': 'ワークスペースファイル',
1936
+ 'status.configMode': '設定モード',
1937
+ 'status.currentProvider': '現在の Provider',
1938
+ 'status.currentModel': '現在のモデル',
1939
+ 'status.quickSwitchProvider': 'プロバイダーをクイック切替',
1940
+ 'side.usage.meta': 'ローカル統計 / トレンド',
1941
+ 'side.orchestration.meta': '計画 / キュー / 実行',
1942
+
1943
+ // Settings panel
1944
+ 'settings.tab.general': '一般',
1945
+ 'settings.tab.data': 'データ',
1946
+ 'settings.tabs.aria': '設定カテゴリ',
1947
+ 'settings.sharePrefix.title': '共有コマンドプレフィックス',
1948
+ 'settings.sharePrefix.meta': 'Web UI の「共有コマンドをコピー」のプレフィックスに影響',
1949
+ 'settings.sharePrefix.label': 'プレフィックス',
1950
+ 'settings.sharePrefix.hint': 'デフォルトはプロジェクト内の npm start を使用します。グローバル codexmate に切り替えることもできます。この設定はブラウザローカルにキャッシュされます。',
1951
+ 'settings.backup.title': 'データバックアップ',
1952
+ 'settings.backup.meta': 'Claude と Codex 設定のエクスポート / インポート',
1953
+ 'settings.claude.title': 'Claude 設定',
1954
+ 'settings.claude.meta': '~/.claude のバックアップ / インポート',
1955
+ 'settings.codex.title': 'Codex 設定',
1956
+ 'settings.codex.meta': '~/.codex のバックアップ / インポート',
1957
+ 'settings.backup.progress': 'バックアップ中 {percent}%',
1958
+ 'settings.backup.oneClickClaude': '~/.claude をワンクリックバックアップ',
1959
+ 'settings.backup.importClaude': '~/.claude バックアップをインポート',
1960
+ 'settings.backup.oneClickCodex': '~/.codex をワンクリックバックアップ',
1961
+ 'settings.backup.importCodex': '~/.codex バックアップをインポート',
1962
+ 'settings.importing': 'インポート中...',
1963
+
1964
+ 'settings.trashConfig.title': 'ゴミ箱設定',
1965
+ 'settings.trashConfig.meta': 'ゴミ箱の有効/無効と自動クリーンアップ日数',
1966
+ 'settings.deleteBehavior.title': 'セッション削除動作',
1967
+ 'settings.deleteBehavior.meta': '「削除」を先にゴミ箱に入れるかどうかを決定',
1968
+ 'settings.deleteBehavior.toggle': 'セッション削除時に先にゴミ箱に移動',
1969
+ 'settings.deleteBehavior.hint': 'デフォルトで有効。オフにすると、セッション閲覧での削除は直接完全削除され、ゴミ箱に入りません。',
1970
+
1971
+ 'settings.trash.title': 'ゴミ箱',
1972
+ 'settings.trash.meta': '削除済みセッション(復元/完全削除可能)',
1973
+ 'settings.trash.refresh': 'リストを更新',
1974
+ 'settings.trash.refreshing': '更新中...',
1975
+ 'settings.trash.clear': 'ゴミ箱を空にする',
1976
+ 'settings.trash.clearing': 'クリア中...',
1977
+ 'settings.trash.loading': 'ゴミ箱を読み込み中...',
1978
+ 'settings.trash.empty': 'ゴミ箱は空です',
1979
+ 'settings.trash.retry': 'ゴミ箱リストの読み込みに失敗しました。更新して再試行してください',
1980
+ 'settings.trash.restore': '復元',
1981
+ 'settings.trash.restoring': '復元中...',
1982
+ 'settings.trash.purge': '完全に削除',
1983
+ 'settings.trash.purging': '削除中...',
1984
+ 'settings.trash.workspace': 'ワークスペース',
1985
+ 'settings.trash.originalFile': '元ファイル',
1986
+ 'settings.trash.loadMore': 'さらに読み込む(残り {count} 件)',
1987
+ 'settings.trash.retention': '自動クリーンアップ',
1988
+ 'settings.trash.retentionMeta': '保持日数を超えたゴミ箱レコードは自動的に削除されます',
1989
+ 'settings.trash.retentionLabel': '保持日数',
1990
+ 'settings.trash.retentionHint': '範囲 1-365 日、デフォルト 30 日。ゴミ箱読み込み時に期限切れレコードを自動クリーンアップします。',
1991
+
1992
+ 'settings.templateConfirm.title': '設定テンプレートの二次確認',
1993
+ 'settings.templateConfirm.meta': '誤書き込みリスクを低減',
1994
+ 'settings.templateConfirm.toggle': 'テンプレート適用前に差分をプレビュー(2段階:確認 → 適用)',
1995
+ 'settings.templateConfirm.hint': '有効時:先に差分プレビューを表示し、確認後に書き込みます。',
1996
+
1997
+ 'settings.reset.title': '設定リセット',
1998
+ 'settings.reset.meta': '注意して操作してください',
1999
+ 'settings.reset.hint': '先に config.toml をバックアップし、デフォルト設定を書き込みます。',
2000
+ 'settings.reset.button': '設定を再インストール',
2001
+ 'settings.reset.loading': '再インストール中...',
2002
+
2003
+ // Market (Skills)
2004
+ 'market.title': 'Skills 概要',
2005
+ 'market.subtitle': 'ターゲットを切り替えてローカル Skills を表示。',
2006
+ 'market.refresh': '概要を更新',
2007
+ 'market.refreshing': '更新中...',
2008
+ 'market.openManager': 'Skills 管理を開く',
2009
+ 'market.target.aria': 'Skills インストールターゲットを選択',
2010
+ 'market.summary.target': 'インストールターゲット',
2011
+ 'market.summary.total': 'ローカル総数',
2012
+ 'market.summary.configured': 'SKILL.md あり',
2013
+ 'market.summary.missing': 'SKILL.md なし',
2014
+ 'market.summary.importable': 'インポート可',
2015
+ 'market.summary.importableDirect': '直接インポート可',
2016
+ 'market.root.fallback': 'デフォルトディレクトリ',
2017
+
2018
+ 'market.installed.title': 'インストール済 Skills',
2019
+ 'market.installed.note': '上位 6 項目のみ表示。',
2020
+ 'market.local.refresh': 'ローカルを更新',
2021
+ 'market.local.refreshing': '更新中...',
2022
+ 'market.local.loading': 'ローカル Skills 読み込み中...',
2023
+ 'market.local.empty': '現在インストール済の skill はありません。',
2024
+ 'market.pill.verified': '検証済',
2025
+ 'market.pill.missingSkill': 'SKILL.md 要追加',
2026
+
2027
+ 'market.import.title': 'インポート可能ソース',
2028
+ 'market.import.note': 'スキャンして現在の {target} にインポートします。',
2029
+ 'market.import.scan': 'ソースをスキャン',
2030
+ 'market.import.scanning': 'スキャン中...',
2031
+ 'market.import.loading': 'インポート可能 skill をスキャン中...',
2032
+ 'market.import.empty': 'インポート可能な skill がスキャンされませんでした。',
2033
+ 'market.pill.importableDirect': '直接インポート可',
2034
+ 'market.pill.importMissing': 'SKILL.md なし',
2035
+
2036
+ 'market.actions.title': '配布エントリ',
2037
+ 'market.actions.note': '操作はすべて現在のインストールターゲットに適用されます。',
2038
+ 'market.action.manage.title': 'ローカル Skills 管理',
2039
+ 'market.action.manage.copy': '現在の {target} のインストール済 skills を管理',
2040
+ 'market.action.crossImport.title': 'クロスアプリインポート',
2041
+ 'market.action.crossImport.copy': '現在の {target} にインポート',
2042
+ 'market.action.zipImport.title': 'ZIP インポート',
2043
+ 'market.action.zipImport.copy': 'ZIP から現在のターゲットにインポート',
2044
+
2045
+ 'market.help.title': '操作説明',
2046
+ 'market.help.target.title': 'ターゲット切替',
2047
+ 'market.help.target.copy': '現在の操作は {target} ディレクトリに書き込まれます。',
2048
+ 'market.help.crossImport.title': 'クロスアプリインポート',
2049
+ 'market.help.crossImport.copy': '他のホストから未管理の skill をインポートします。',
2050
+ 'market.help.zipImport.title': 'ZIP インポート',
2051
+ 'market.help.zipImport.copy': 'ZIP からローカル skill をインポートします。',
2052
+
2053
+ // Claude config panel
2054
+ 'claude.addProvider': 'プロバイダー追加',
2055
+ 'claude.applyDefault': 'デフォルトで ~/.claude/settings.json に適用されます。',
2056
+ 'claude.presetProviders': 'プリセットプロバイダー',
2057
+ 'claude.customConfig': 'カスタム設定',
2058
+ 'claude.model': 'モデル',
2059
+ 'claude.model.placeholder': '例: claude-3-7-sonnet',
2060
+ 'claude.model.hint': 'モデル変更後は自動保存され、現在の設定に適用されます。',
2061
+ 'claude.health.title': '設定ヘルスチェック',
2062
+ 'claude.health.run': 'チェック実行',
2063
+ 'claude.health.running': 'チェック中...',
2064
+ 'claude.health.hint': 'すべての Claude 設定の可用性を一括プローブし、遅延表示を更新します。',
2065
+ 'claude.health.progress': '完了 {done}/{total} · 失敗 {failed}',
2066
+ 'claude.md.title': 'CLAUDE.md',
2067
+ 'claude.md.open': 'CLAUDE.md を開く',
2068
+ 'claude.md.hint': '~/.claude/CLAUDE.md の読み書き。',
2069
+ 'claude.model.unset': 'モデル未設定',
2070
+ 'claude.configured': '設定済み',
2071
+ 'claude.notConfigured': '未設定',
2072
+ 'claude.action.edit': '編集',
2073
+ 'claude.action.delete': '削除',
2074
+ 'claude.action.shareDisabled': 'インポートコマンド共有(一時無効)',
2075
+ 'claude.action.editAria': 'Claude 設定を編集:{name}',
2076
+ 'claude.action.deleteAria': 'Claude 設定を削除:{name}',
2077
+ 'claude.action.clone': 'クローン',
2078
+ 'claude.action.cloneAria': 'Claude 設定をクローン:{name}',
2079
+
2080
+ // OpenClaw config panel
2081
+ 'openclaw.applyHint': '~/.openclaw/openclaw.json に書き込みます。JSON5 対応。',
2082
+ 'openclaw.agents.hint': 'Workspace の AGENTS.md を読み書きします。デフォルトパス ~/.openclaw/workspace/AGENTS.md。',
2083
+ 'openclaw.agents.open': 'AGENTS.md を開く',
2084
+ 'openclaw.workspaceFile': 'ワークスペースファイル',
2085
+ 'openclaw.workspace.placeholder': '例: SOUL.md',
2086
+ 'openclaw.workspace.hint': 'Workspace 内の .md ファイルのみ。',
2087
+ 'openclaw.workspace.open': 'ワークスペースファイルを開く',
2088
+ 'openclaw.configured': '設定済み',
2089
+ 'openclaw.notConfigured': '未設定',
2090
+ 'openclaw.action.edit': '編集',
2091
+ 'openclaw.action.delete': '削除',
2092
+ 'modal.openclaw.quick.subtitle': '3ステップで完了:Provider とモデルを入力、エディタに書き込み、保存して適用。',
2093
+ 'modal.openclaw.quick.step2': 'エディタに書き込みをクリック',
2094
+ 'modal.openclaw.structured.writeHint': 'エディタに書き込むと JSON が再配置され、コメントが失われる可能性があります。',
2095
+ 'openclaw.action.editAria': 'OpenClaw 設定を編集:{name}',
2096
+ 'openclaw.action.deleteAria': 'OpenClaw 設定を削除:{name}',
2097
+
2098
+ },
2099
+
1054
2100
  en: {
1055
2101
  // Global
1056
2102
  'lang.zh': '中文',
@@ -1237,8 +2283,7 @@ const DICT = Object.freeze({
1237
2283
  'subtitle.market': 'Manage local skills.',
1238
2284
  'subtitle.plugins': 'Manage reusable prompt templates and plugins.',
1239
2285
  'subtitle.docs': 'CLI install commands and troubleshooting.',
1240
- 'subtitle.settings': 'Manage downloads, directories, and trash.'
1241
- ,
2286
+ 'subtitle.settings': 'Manage downloads, directories, and trash.',
1242
2287
  'dashboard.doctor.title': 'Doctor',
1243
2288
  'dashboard.doctor.runChecks': 'Run checks',
1244
2289
  'dashboard.doctor.checking': 'Checking...',
@@ -1331,6 +2376,11 @@ const DICT = Object.freeze({
1331
2376
  'dashboard.usage.range': 'Range {value}',
1332
2377
  'dashboard.tasks.queue': 'run {running} / queue {queued}',
1333
2378
  'dashboard.skills.count': 'installed {installed} / import {importable}',
2379
+ 'dashboard.providersHealth.title': 'Provider Health',
2380
+ 'dashboard.providersHealth.current': '(current)',
2381
+ 'dashboard.providersHealth.checking': 'Checking...',
2382
+ 'dashboard.providersHealth.allOk': 'All providers OK',
2383
+ 'dashboard.providersHealth.hasIssues': '{count} provider(s) have issues',
1334
2384
 
1335
2385
  // Plugins panel
1336
2386
  'plugins.sidebar.title': 'Plugins',
@@ -1558,15 +2608,13 @@ const DICT = Object.freeze({
1558
2608
  'docs.termuxLabel': 'Termux',
1559
2609
  'docs.termuxAria': 'Termux Codex CLI command',
1560
2610
  'docs.rule.1': 'Commands depend on package manager, registry and action.',
1561
- 'docs.rule.2': 'Custom registry is used for install/update only.'
1562
- ,
2611
+ 'docs.rule.2': 'Custom registry is used for install/update only.',
1563
2612
  'docs.tip.win.1': 'If PowerShell reports permission errors (EACCES/EPERM), run the install command as Administrator.',
1564
2613
  '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.',
1565
2614
  'docs.tip.win.3': 'If your network blocks npm, try switching registry presets (npmmirror / Tencent / Custom).',
1566
2615
  'docs.tip.unix.1': 'If you hit EACCES, fix your global Node directory permissions instead of using sudo npm.',
1567
2616
  '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.',
1568
- 'docs.tip.unix.3': 'If your network blocks npm, try switching registry presets (npmmirror / Tencent / Custom).'
1569
- ,
2617
+ 'docs.tip.unix.3': 'If your network blocks npm, try switching registry presets (npmmirror / Tencent / Custom).',
1570
2618
 
1571
2619
  // Sessions panel
1572
2620
  'sessions.loading': 'Loading...',
@@ -1606,8 +2654,7 @@ const DICT = Object.freeze({
1606
2654
  'sessions.preview.clipped': 'Showing the latest {count} messages only.',
1607
2655
  'sessions.preview.shownCount': 'Shown {shown} / {total}',
1608
2656
  'sessions.preview.loadMore': 'Load more (remaining {remain})',
1609
- 'sessions.preview.loadingMore': 'Loading older messages...'
1610
- ,
2657
+ 'sessions.preview.loadingMore': 'Loading older messages...',
1611
2658
  'sessions.timeline.aria': 'Session timeline',
1612
2659
  'sessions.selectHint': 'Select a session on the left first',
1613
2660
  'sessions.role.all': 'All roles',
@@ -1617,12 +2664,10 @@ const DICT = Object.freeze({
1617
2664
  'sessions.time.all': 'All time',
1618
2665
  'sessions.time.7d': 'Last 7 days',
1619
2666
  'sessions.time.30d': 'Last 30 days',
1620
- 'sessions.time.90d': 'Last 90 days'
1621
- ,
2667
+ 'sessions.time.90d': 'Last 90 days',
1622
2668
  'sessions.sort.time': 'Sort: time',
1623
2669
  'sessions.sort.hot': 'Sort: hot',
1624
- 'sessions.sort.hotBadge': 'Hot'
1625
- ,
2670
+ 'sessions.sort.hotBadge': 'Hot',
1626
2671
  'sessions.filters.copyLink': 'Copy filter link',
1627
2672
  'sessions.filters.urlBuildFail': 'Failed to build link',
1628
2673
  'sessions.filters.source': 'Source',
@@ -1632,8 +2677,7 @@ const DICT = Object.freeze({
1632
2677
  'sessions.filters.time': 'Time',
1633
2678
  'sessions.roleLabel.user': 'User',
1634
2679
  'sessions.roleLabel.system': 'System',
1635
- 'sessions.roleLabel.assistant': 'Assistant'
1636
- ,
2680
+ 'sessions.roleLabel.assistant': 'Assistant',
1637
2681
 
1638
2682
  // Usage panel
1639
2683
  'usage.overview': 'Usage Overview',
@@ -1712,16 +2756,14 @@ const DICT = Object.freeze({
1712
2756
  'usage.range.kicker.30d': 'Last 30 days',
1713
2757
  'usage.range.kicker.7d': 'Last 7 days',
1714
2758
  'usage.copyTokenDay': 'Copied: Tokens ({day})',
1715
- 'usage.copyCostDay': 'Copied: Estimated cost ({day})'
1716
- ,
2759
+ 'usage.copyCostDay': 'Copied: Estimated cost ({day})',
1717
2760
  'usage.dayDetail.title': '{day} detail',
1718
2761
  'usage.dayDetail.subtitle': 'Pick a day to inspect its breakdown.',
1719
2762
  'usage.dayDetail.pick': 'Pick a day',
1720
2763
  'usage.dayDetail.empty': 'Pick a day to inspect its breakdown.',
1721
2764
  'usage.dayDetail.clear': 'Clear',
1722
2765
  'usage.dayDetail.topSessions': 'Top sessions',
1723
- 'usage.dayDetail.topModels': 'Top models'
1724
- ,
2766
+ 'usage.dayDetail.topModels': 'Top models',
1725
2767
  'usage.models.title': 'Models used',
1726
2768
  'usage.models.subtitle': 'Only includes model names present in saved records.',
1727
2769
  'usage.models.kicker': 'Identified {modeled}/{total}',
@@ -1745,8 +2787,7 @@ const DICT = Object.freeze({
1745
2787
  'usage.recent.title': 'Recently active sessions',
1746
2788
  'usage.sessions.empty': 'No session data',
1747
2789
  'usage.sessions.messages': '{count} messages',
1748
- 'usage.sessions.topDensity': 'Most messages'
1749
- ,
2790
+ 'usage.sessions.topDensity': 'Most messages',
1750
2791
 
1751
2792
  // Config panel (Codex)
1752
2793
  'config.addProvider': 'Add provider',
@@ -1799,13 +2840,13 @@ const DICT = Object.freeze({
1799
2840
  'config.health.fail': 'Failed',
1800
2841
  'config.health.issues': '{count} issues',
1801
2842
  'config.shareCommand': 'Share command',
1802
- 'config.shareDisabled': 'Not shareable'
1803
- ,
2843
+ 'config.shareDisabled': 'Not shareable',
1804
2844
  'config.shareCommand.aria': 'Share import command',
1805
2845
  'config.provider.edit.aria': 'Edit provider: {name}',
1806
2846
  'config.provider.delete.aria': 'Delete provider: {name}',
1807
- 'app.loadingConfig': 'Loading configuration...'
1808
- ,
2847
+ 'config.provider.clone': 'Clone',
2848
+ 'config.provider.clone.aria': 'Clone provider: {name}',
2849
+ 'app.loadingConfig': 'Loading configuration...',
1809
2850
  'common.current': 'Current {value}',
1810
2851
  'common.notSelected': 'Not selected',
1811
2852
  'common.readFromEditor': 'Read from editor',
@@ -1944,11 +2985,9 @@ const DICT = Object.freeze({
1944
2985
  'status.configMode': 'Config mode',
1945
2986
  'status.currentProvider': 'Current provider',
1946
2987
  'status.currentModel': 'Current model',
1947
- 'status.quickSwitchProvider': 'Quick switch provider'
1948
- ,
2988
+ 'status.quickSwitchProvider': 'Quick switch provider',
1949
2989
  'side.usage.meta': 'Local stats / Trends',
1950
- 'side.orchestration.meta': 'Plan / Queue / Runs'
1951
- ,
2990
+ 'side.orchestration.meta': 'Plan / Queue / Runs',
1952
2991
 
1953
2992
  // Settings panel
1954
2993
  'settings.tab.general': 'General',
@@ -2004,8 +3043,7 @@ const DICT = Object.freeze({
2004
3043
  'settings.reset.meta': 'Proceed with caution',
2005
3044
  'settings.reset.hint': 'Backs up config.toml, then writes default config.',
2006
3045
  'settings.reset.button': 'Reset config',
2007
- 'settings.reset.loading': 'Resetting...'
2008
- ,
3046
+ 'settings.reset.loading': 'Resetting...',
2009
3047
 
2010
3048
  // Market (Skills)
2011
3049
  'market.title': 'Skills Overview',
@@ -2055,8 +3093,7 @@ const DICT = Object.freeze({
2055
3093
  'market.help.crossImport.title': 'Cross-app import',
2056
3094
  'market.help.crossImport.copy': 'Import unmanaged skills from other hosts.',
2057
3095
  'market.help.zipImport.title': 'ZIP import',
2058
- 'market.help.zipImport.copy': 'Import local skills from a ZIP file.'
2059
- ,
3096
+ 'market.help.zipImport.copy': 'Import local skills from a ZIP file.',
2060
3097
 
2061
3098
  // Claude config panel
2062
3099
  'claude.addProvider': 'Add provider',
@@ -2079,10 +3116,11 @@ const DICT = Object.freeze({
2079
3116
  'claude.notConfigured': 'Not configured',
2080
3117
  'claude.action.edit': 'Edit',
2081
3118
  'claude.action.delete': 'Delete',
2082
- 'claude.action.shareDisabled': 'Share import command (disabled)'
2083
- ,
3119
+ 'claude.action.shareDisabled': 'Share import command (disabled)',
2084
3120
  'claude.action.editAria': 'Edit Claude config: {name}',
2085
3121
  'claude.action.deleteAria': 'Delete Claude config: {name}',
3122
+ 'claude.action.clone': 'Clone',
3123
+ 'claude.action.cloneAria': 'Clone Claude config: {name}',
2086
3124
 
2087
3125
  // OpenClaw config panel
2088
3126
  'openclaw.applyHint': 'Writes to ~/.openclaw/openclaw.json (JSON5 supported).',
@@ -2098,8 +3136,7 @@ const DICT = Object.freeze({
2098
3136
  'openclaw.action.delete': 'Delete',
2099
3137
  'modal.openclaw.quick.subtitle': '3 steps: fill provider/model, write to editor, save & apply.',
2100
3138
  'modal.openclaw.quick.step2': 'Write to editor',
2101
- 'modal.openclaw.structured.writeHint': 'Writing to editor may reformat JSON and drop comments.'
2102
- ,
3139
+ 'modal.openclaw.structured.writeHint': 'Writing to editor may reformat JSON and drop comments.',
2103
3140
  'openclaw.action.editAria': 'Edit OpenClaw config: {name}',
2104
3141
  'openclaw.action.deleteAria': 'Delete OpenClaw config: {name}'
2105
3142
  }