codexmate 0.0.43 → 0.0.45
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/README.zh.md +2 -0
- package/cli/claude-proxy.js +611 -14
- package/cli/update.js +77 -7
- package/cli.js +188 -21
- package/package.json +1 -1
- package/web-ui/app.js +36 -3
- package/web-ui/index.html +1 -0
- package/web-ui/logic.claude.mjs +65 -2
- package/web-ui/logic.runtime.mjs +0 -7
- package/web-ui/modules/app.computed.index.mjs +3 -1
- package/web-ui/modules/app.computed.main-tabs.mjs +3 -0
- package/web-ui/modules/app.computed.prompts.mjs +28 -0
- package/web-ui/modules/app.computed.session.mjs +23 -1
- package/web-ui/modules/app.methods.agents.mjs +50 -4
- package/web-ui/modules/app.methods.claude-config.mjs +28 -12
- package/web-ui/modules/app.methods.index.mjs +1 -1
- package/web-ui/modules/app.methods.install.mjs +129 -1
- package/web-ui/modules/app.methods.navigation.mjs +2 -1
- package/web-ui/modules/app.methods.session-actions.mjs +17 -2
- package/web-ui/modules/app.methods.session-timeline.mjs +0 -1
- package/web-ui/modules/app.methods.startup-claude.mjs +26 -3
- package/web-ui/modules/i18n/locales/en.mjs +42 -5
- package/web-ui/modules/i18n/locales/ja.mjs +42 -5
- package/web-ui/modules/i18n/locales/vi.mjs +51 -0
- package/web-ui/modules/i18n/locales/zh.mjs +42 -5
- package/web-ui/partials/index/layout-footer.html +1 -1
- package/web-ui/partials/index/layout-header.html +64 -0
- package/web-ui/partials/index/modal-config-template-agents.html +12 -13
- package/web-ui/partials/index/modals-basic.html +18 -1
- package/web-ui/partials/index/panel-config-claude.html +4 -7
- package/web-ui/partials/index/panel-config-codex.html +2 -6
- package/web-ui/partials/index/panel-prompts.html +100 -0
- package/web-ui/partials/index/panel-sessions.html +30 -10
- package/web-ui/partials/index/panel-usage.html +34 -18
- package/web-ui/res/web-ui-render.precompiled.js +579 -149
- package/web-ui/styles/controls-forms.css +5 -5
- package/web-ui/styles/layout-shell.css +145 -0
- package/web-ui/styles/modals-core.css +162 -0
- package/web-ui/styles/responsive.css +77 -5
- package/web-ui/styles/sessions-toolbar-trash.css +45 -10
- package/web-ui/styles/sessions-usage.css +31 -2
|
@@ -49,6 +49,8 @@ const en = Object.freeze({
|
|
|
49
49
|
'common.apply': 'Apply',
|
|
50
50
|
'common.applying': 'Applying...',
|
|
51
51
|
'common.confirming': 'Confirming...',
|
|
52
|
+
'common.preview': 'Preview',
|
|
53
|
+
'common.previewing': 'Previewing...',
|
|
52
54
|
'common.refreshFromText': 'Refresh from text',
|
|
53
55
|
'common.backToEdit': 'Back to edit',
|
|
54
56
|
'common.selectAll': 'Select all',
|
|
@@ -129,12 +131,14 @@ const en = Object.freeze({
|
|
|
129
131
|
'tab.market': 'Skills',
|
|
130
132
|
'tab.plugins': 'Plugins',
|
|
131
133
|
'tab.settings': 'Settings',
|
|
134
|
+
'tab.prompts': 'Prompts',
|
|
132
135
|
|
|
133
136
|
// Side rail section titles
|
|
134
137
|
'side.overview': 'Overview',
|
|
135
138
|
'side.docs': 'Docs',
|
|
136
139
|
'side.config': 'Config',
|
|
137
140
|
'side.sessions': 'Sessions',
|
|
141
|
+
'side.prompts': 'Prompts',
|
|
138
142
|
'side.plugins': 'Plugins',
|
|
139
143
|
'side.system': 'System',
|
|
140
144
|
'side.orchestration': 'Tasks',
|
|
@@ -145,6 +149,17 @@ const en = Object.freeze({
|
|
|
145
149
|
'side.overview.doctor.meta': 'Overview / Diagnostics',
|
|
146
150
|
'side.docs.cliInstall': 'CLI Install',
|
|
147
151
|
'side.docs.cliInstall.meta': 'Install / Update / Uninstall',
|
|
152
|
+
'side.update.available': 'Update available',
|
|
153
|
+
'side.update.availableWithVersion': 'Update available v{version}',
|
|
154
|
+
'side.update.meta': 'Open update command',
|
|
155
|
+
'side.update.metaVersions': 'Current v{current} → latest v{latest}',
|
|
156
|
+
'side.update.checkFailed': 'Failed to check latest version',
|
|
157
|
+
'side.update.check': 'Check for updates',
|
|
158
|
+
'side.update.checking': 'Checking for updates…',
|
|
159
|
+
'side.update.checkingMeta': 'Contacting npm registry',
|
|
160
|
+
'side.update.upToDate': 'Up to date',
|
|
161
|
+
'side.update.currentOnly': 'Current v{current}',
|
|
162
|
+
'side.update.retry': 'Retry version check',
|
|
148
163
|
'side.config.codex': 'Codex',
|
|
149
164
|
'side.config.codex.meta': 'Provider / Model',
|
|
150
165
|
'side.config.claude': 'Claude Code',
|
|
@@ -153,6 +168,10 @@ const en = Object.freeze({
|
|
|
153
168
|
'side.config.openclaw.meta': 'JSON5 / AGENTS',
|
|
154
169
|
'side.sessions.browser': 'Session Browser',
|
|
155
170
|
'side.sessions.browser.meta': 'Browse / Export / Cleanup',
|
|
171
|
+
'side.prompts.agents': 'AGENTS.md',
|
|
172
|
+
'side.prompts.agents.meta': 'Codex prompt file',
|
|
173
|
+
'side.prompts.claude': 'CLAUDE.md',
|
|
174
|
+
'side.prompts.claude.meta': 'Claude prompt file',
|
|
156
175
|
'side.plugins.tools': 'Prompt Tools',
|
|
157
176
|
'side.plugins.tools.meta': 'Templates / Variables',
|
|
158
177
|
'side.plugins.templatesCount': '{count} templates',
|
|
@@ -171,6 +190,7 @@ const en = Object.freeze({
|
|
|
171
190
|
'kicker.docs': 'Docs',
|
|
172
191
|
'kicker.trash': 'Trash',
|
|
173
192
|
'kicker.settings': 'Settings',
|
|
193
|
+
'kicker.prompts': 'Prompts',
|
|
174
194
|
|
|
175
195
|
'title.dashboard': 'Dashboard / Doctor',
|
|
176
196
|
'title.config': 'Local Configuration Console',
|
|
@@ -181,6 +201,7 @@ const en = Object.freeze({
|
|
|
181
201
|
'title.plugins': 'Plugins & Templates',
|
|
182
202
|
'title.docs': 'CLI Install & Docs',
|
|
183
203
|
'title.settings': 'System & Data Settings',
|
|
204
|
+
'title.prompts': 'Prompt Files Editor',
|
|
184
205
|
|
|
185
206
|
'subtitle.dashboard': 'Aggregate status and diagnostics.',
|
|
186
207
|
'subtitle.config': 'Manage local configs and models.',
|
|
@@ -191,6 +212,9 @@ const en = Object.freeze({
|
|
|
191
212
|
'subtitle.plugins': 'Manage reusable prompt templates and plugins.',
|
|
192
213
|
'subtitle.docs': 'CLI install commands and troubleshooting.',
|
|
193
214
|
'subtitle.settings': 'Manage downloads, directories, and trash.',
|
|
215
|
+
'subtitle.prompts': 'Edit AGENTS.md and CLAUDE.md.',
|
|
216
|
+
'prompts.subTab.codex': 'AGENTS.md (Codex)',
|
|
217
|
+
'prompts.subTab.claude': 'CLAUDE.md (Claude)',
|
|
194
218
|
'dashboard.doctor.title': 'Doctor',
|
|
195
219
|
'dashboard.doctor.runChecks': 'Run checks',
|
|
196
220
|
'dashboard.doctor.checking': 'Checking...',
|
|
@@ -367,8 +391,13 @@ const en = Object.freeze({
|
|
|
367
391
|
'toast.copy.empty': 'Nothing to copy',
|
|
368
392
|
'toast.copy.ok': 'Copied',
|
|
369
393
|
'toast.copy.fail': 'Copy failed',
|
|
394
|
+
'toast.link.fail': 'Failed to generate link',
|
|
370
395
|
'toast.save.ok': 'Saved',
|
|
371
396
|
'toast.save.fail': 'Save failed',
|
|
397
|
+
'toast.agents.saved.agents': 'AGENTS.md saved',
|
|
398
|
+
'toast.agents.saved.claudeMd': 'CLAUDE.md saved',
|
|
399
|
+
'toast.agents.saved.openclaw': 'OpenClaw AGENTS.md saved',
|
|
400
|
+
'toast.agents.saved.workspace': 'Workspace file saved: {name}',
|
|
372
401
|
'toast.delete.ok': 'Deleted',
|
|
373
402
|
'toast.delete.fail': 'Delete failed',
|
|
374
403
|
'toast.export.empty': 'Nothing to export',
|
|
@@ -457,7 +486,7 @@ const en = Object.freeze({
|
|
|
457
486
|
'diff.hint.busy': 'Generating diff or applying. Actions are temporarily disabled.',
|
|
458
487
|
'diff.hint.failedBack': 'Diff preview failed. Go back to edit and retry.',
|
|
459
488
|
'diff.hint.noChangesBack': 'No changes detected. Go back to edit or cancel.',
|
|
460
|
-
'diff.hint.previewMode': 'Preview mode. Click “
|
|
489
|
+
'diff.hint.previewMode': 'Preview mode. Click “Save” to write or “Back to edit” to continue.',
|
|
461
490
|
|
|
462
491
|
'modal.agents.export': 'Export',
|
|
463
492
|
'modal.agents.copy': 'Copy',
|
|
@@ -466,13 +495,13 @@ const en = Object.freeze({
|
|
|
466
495
|
'modal.agents.targetFile': 'Target file',
|
|
467
496
|
'modal.agents.contentLabel': 'AGENTS.md content',
|
|
468
497
|
'modal.agents.placeholder': 'Edit AGENTS.md here',
|
|
469
|
-
'modal.agents.unsaved.previewModeHint': 'Preview mode: changes are not saved until you click “
|
|
498
|
+
'modal.agents.unsaved.previewModeHint': 'Preview mode: changes are not saved until you click “Save”.',
|
|
470
499
|
'modal.agents.unsaved.detectedHint': 'Unsaved changes detected: save before closing or applying.',
|
|
471
500
|
'modal.agents.hint.shortcuts': 'Shortcut: Esc (back to edit in preview, close in edit).',
|
|
472
|
-
'modal.agents.hint.twoStepSave': 'Two-step save: “
|
|
501
|
+
'modal.agents.hint.twoStepSave': 'Two-step save: “Preview” to review diff, then “Save” to write.',
|
|
473
502
|
'diff.tooLargeSkip': 'Content too large. Line diff preview skipped.',
|
|
474
|
-
'diff.viewHint.preview': 'Preview mode. Click “
|
|
475
|
-
'diff.viewHint.truncated': 'Preview skipped due to size. Click “
|
|
503
|
+
'diff.viewHint.preview': 'Preview mode. Click “Save” to write or “Back to edit” to continue.',
|
|
504
|
+
'diff.viewHint.truncated': 'Preview skipped due to size. Click “Save” to write or “Back to edit” to continue.',
|
|
476
505
|
|
|
477
506
|
// Skills modal
|
|
478
507
|
'modal.skills.title': 'Skills manager',
|
|
@@ -613,6 +642,7 @@ const en = Object.freeze({
|
|
|
613
642
|
'sessions.preview.importNative.failedWithReason': 'Import to native failed: {reason}',
|
|
614
643
|
'sessions.preview.copyLink': 'Copy link',
|
|
615
644
|
'sessions.preview.copyPath': 'Copy path',
|
|
645
|
+
'sessions.preview.openLink': 'Open link',
|
|
616
646
|
'sessions.preview.loadingBody': 'Loading session content...',
|
|
617
647
|
'sessions.preview.emptyMsgs': 'No messages to display',
|
|
618
648
|
'sessions.preview.rendering': 'Rendering session content...',
|
|
@@ -1138,6 +1168,13 @@ const en = Object.freeze({
|
|
|
1138
1168
|
'claude.model': 'Model',
|
|
1139
1169
|
'claude.model.placeholder': 'e.g. claude-3-7-sonnet',
|
|
1140
1170
|
'claude.model.hint': 'Model changes are saved and applied to the current config automatically.',
|
|
1171
|
+
'claude.targetApi.label': 'Target API',
|
|
1172
|
+
'claude.targetApi.responses': 'Anthropic',
|
|
1173
|
+
'claude.targetApi.chatCompletions': 'OpenAI Chat Completions (/v1/chat/completions)',
|
|
1174
|
+
'claude.targetApi.ollama': 'Ollama Chat (/api/chat)',
|
|
1175
|
+
'claude.targetApi.chatCompletionsBadge': 'OpenAI Chat Completions',
|
|
1176
|
+
'claude.targetApi.ollamaBadge': 'Ollama',
|
|
1177
|
+
'claude.targetApi.hint': 'When Chat Completions or Ollama is selected, the Claude-compatible proxy performs the built-in conversion without changing the Codex provider wire_api; Ollama does not require an API key.',
|
|
1141
1178
|
'claude.health.title': 'Config health check',
|
|
1142
1179
|
'claude.health.run': 'Run check',
|
|
1143
1180
|
'claude.health.running': 'Checking...',
|
|
@@ -50,6 +50,8 @@ const ja = Object.freeze({
|
|
|
50
50
|
'common.apply': '適用',
|
|
51
51
|
'common.applying': '適用中...',
|
|
52
52
|
'common.confirming': '確認中...',
|
|
53
|
+
'common.preview': 'プレビュー',
|
|
54
|
+
'common.previewing': 'プレビュー中...',
|
|
53
55
|
'common.refreshFromText': 'テキストから更新',
|
|
54
56
|
'common.backToEdit': '編集に戻る',
|
|
55
57
|
'common.selectAll': 'すべて選択',
|
|
@@ -130,12 +132,14 @@ const ja = Object.freeze({
|
|
|
130
132
|
'tab.market': 'Skills',
|
|
131
133
|
'tab.plugins': 'プラグイン',
|
|
132
134
|
'tab.settings': '設定',
|
|
135
|
+
'tab.prompts': 'Prompts',
|
|
133
136
|
|
|
134
137
|
// Side rail section titles
|
|
135
138
|
'side.overview': '概要',
|
|
136
139
|
'side.docs': 'ドキュメント',
|
|
137
140
|
'side.config': '設定',
|
|
138
141
|
'side.sessions': 'セッション',
|
|
142
|
+
'side.prompts': 'Prompts',
|
|
139
143
|
'side.plugins': 'プラグイン',
|
|
140
144
|
'side.system': 'システム',
|
|
141
145
|
'side.orchestration': 'タスク',
|
|
@@ -146,6 +150,17 @@ const ja = Object.freeze({
|
|
|
146
150
|
'side.overview.doctor.meta': '概要 / 診断 / ジャンプ',
|
|
147
151
|
'side.docs.cliInstall': 'CLI インストール',
|
|
148
152
|
'side.docs.cliInstall.meta': 'インストール / 更新 / 削除',
|
|
153
|
+
'side.update.available': '新しいバージョンがあります',
|
|
154
|
+
'side.update.availableWithVersion': '新しいバージョン v{version}',
|
|
155
|
+
'side.update.meta': '更新コマンドを開く',
|
|
156
|
+
'side.update.metaVersions': '現在 v{current} → 最新 v{latest}',
|
|
157
|
+
'side.update.checkFailed': '最新バージョンの確認に失敗しました',
|
|
158
|
+
'side.update.check': '更新を確認',
|
|
159
|
+
'side.update.checking': '更新を確認中…',
|
|
160
|
+
'side.update.checkingMeta': 'npm registry に接続中',
|
|
161
|
+
'side.update.upToDate': '最新です',
|
|
162
|
+
'side.update.currentOnly': '現在 v{current}',
|
|
163
|
+
'side.update.retry': 'バージョン確認を再試行',
|
|
149
164
|
'side.config.codex': 'Codex',
|
|
150
165
|
'side.config.codex.meta': 'Provider / Model',
|
|
151
166
|
'side.config.claude': 'Claude Code',
|
|
@@ -154,6 +169,10 @@ const ja = Object.freeze({
|
|
|
154
169
|
'side.config.openclaw.meta': 'JSON5 / AGENTS',
|
|
155
170
|
'side.sessions.browser': 'セッション閲覧',
|
|
156
171
|
'side.sessions.browser.meta': '閲覧 / エクスポート / クリーンアップ',
|
|
172
|
+
'side.prompts.agents': 'AGENTS.md',
|
|
173
|
+
'side.prompts.agents.meta': 'Codex プロンプトファイル',
|
|
174
|
+
'side.prompts.claude': 'CLAUDE.md',
|
|
175
|
+
'side.prompts.claude.meta': 'Claude プロンプトファイル',
|
|
157
176
|
'side.plugins.tools': 'プロンプトツール',
|
|
158
177
|
'side.plugins.tools.meta': 'テンプレート / 変数',
|
|
159
178
|
'side.plugins.templatesCount': '{count} 件のテンプレート',
|
|
@@ -172,6 +191,7 @@ const ja = Object.freeze({
|
|
|
172
191
|
'kicker.docs': 'Docs',
|
|
173
192
|
'kicker.trash': 'ゴミ箱',
|
|
174
193
|
'kicker.settings': 'Settings',
|
|
194
|
+
'kicker.prompts': 'Prompts',
|
|
175
195
|
|
|
176
196
|
'title.dashboard': 'Dashboard / Doctor',
|
|
177
197
|
'title.config': 'ローカル設定コンソール',
|
|
@@ -182,6 +202,7 @@ const ja = Object.freeze({
|
|
|
182
202
|
'title.plugins': 'プラグインとテンプレート',
|
|
183
203
|
'title.docs': 'CLI インストールとドキュメント',
|
|
184
204
|
'title.settings': 'システムとデータ設定',
|
|
205
|
+
'title.prompts': 'プロンプトファイルエディタ',
|
|
185
206
|
|
|
186
207
|
'subtitle.dashboard': '集約状態と診断エントリ。',
|
|
187
208
|
'subtitle.config': 'ローカル設定とモデルの管理。',
|
|
@@ -192,6 +213,9 @@ const ja = Object.freeze({
|
|
|
192
213
|
'subtitle.plugins': 'テンプレート化されたプロンプトと再利用可能なプラグインの管理。',
|
|
193
214
|
'subtitle.docs': 'CLI インストールコマンドとトラブルシューティング。',
|
|
194
215
|
'subtitle.settings': 'ダウンロード・ディレクトリ・ゴミ箱の管理。',
|
|
216
|
+
'subtitle.prompts': 'AGENTS.md と CLAUDE.md を編集。',
|
|
217
|
+
'prompts.subTab.codex': 'AGENTS.md (Codex)',
|
|
218
|
+
'prompts.subTab.claude': 'CLAUDE.md (Claude)',
|
|
195
219
|
|
|
196
220
|
'dashboard.doctor.title': 'Doctor',
|
|
197
221
|
'dashboard.doctor.runChecks': 'チェックを実行',
|
|
@@ -369,8 +393,13 @@ const ja = Object.freeze({
|
|
|
369
393
|
'toast.copy.empty': 'コピーする内容がありません',
|
|
370
394
|
'toast.copy.ok': 'コピーしました',
|
|
371
395
|
'toast.copy.fail': 'コピーに失敗しました',
|
|
396
|
+
'toast.link.fail': 'リンクの生成に失敗しました',
|
|
372
397
|
'toast.save.ok': '保存しました',
|
|
373
398
|
'toast.save.fail': '保存に失敗しました',
|
|
399
|
+
'toast.agents.saved.agents': 'AGENTS.md 保存しました',
|
|
400
|
+
'toast.agents.saved.claudeMd': 'CLAUDE.md 保存しました',
|
|
401
|
+
'toast.agents.saved.openclaw': 'OpenClaw AGENTS.md 保存しました',
|
|
402
|
+
'toast.agents.saved.workspace': 'ワークスペースファイル保存済み: {name}',
|
|
374
403
|
'toast.delete.ok': '削除しました',
|
|
375
404
|
'toast.delete.fail': '削除に失敗しました',
|
|
376
405
|
'toast.export.empty': 'エクスポートする内容がありません',
|
|
@@ -459,7 +488,7 @@ const ja = Object.freeze({
|
|
|
459
488
|
'diff.hint.busy': '差分生成中または適用中のため、操作は一時的に利用できません。',
|
|
460
489
|
'diff.hint.failedBack': '差分プレビューに失敗しました。編集に戻って再試行してください。',
|
|
461
490
|
'diff.hint.noChangesBack': '変更が検出されませんでした。編集に戻って修正を続けるか、キャンセルして終了してください。',
|
|
462
|
-
'diff.hint.previewMode': '
|
|
491
|
+
'diff.hint.previewMode': '現在プレビューモードです。「保存」をクリックして書き込むか、「編集に戻る」で修正を続けてください。',
|
|
463
492
|
|
|
464
493
|
'modal.agents.export': 'エクスポート',
|
|
465
494
|
'modal.agents.copy': 'コピー',
|
|
@@ -468,13 +497,13 @@ const ja = Object.freeze({
|
|
|
468
497
|
'modal.agents.targetFile': '対象ファイル',
|
|
469
498
|
'modal.agents.contentLabel': 'AGENTS.md 内容',
|
|
470
499
|
'modal.agents.placeholder': 'ここに AGENTS.md の内容を編集してください',
|
|
471
|
-
'modal.agents.unsaved.previewModeHint': '
|
|
500
|
+
'modal.agents.unsaved.previewModeHint': 'プレビューモード:現在の変更はまだ保存されていません。「保存」をクリックするとファイルに書き込まれます。',
|
|
472
501
|
'modal.agents.unsaved.detectedHint': '未保存の変更が検出されました:ページを閉じるか適用する前に保存してください。',
|
|
473
502
|
'modal.agents.hint.shortcuts': 'ショートカット:Esc(差分プレビュー時は編集に戻る、編集時はウィンドウを閉じる)。',
|
|
474
|
-
'modal.agents.hint.twoStepSave': '保存は2
|
|
503
|
+
'modal.agents.hint.twoStepSave': '保存は2段階:「プレビュー」で差分を確認し、「保存」で書き込みます。',
|
|
475
504
|
'diff.tooLargeSkip': '内容が大きすぎるため、行単位の差分プレビューをスキップしました',
|
|
476
|
-
'diff.viewHint.preview': '
|
|
477
|
-
'diff.viewHint.truncated': '
|
|
505
|
+
'diff.viewHint.preview': '現在プレビューモードです。「保存」で書き込むか、「編集に戻る」で修正を続けてください。',
|
|
506
|
+
'diff.viewHint.truncated': '内容が大きすぎるためプレビューをスキップしました。「保存」で書き込むか、「編集に戻る」で修正を続けてください。',
|
|
478
507
|
|
|
479
508
|
// Skills modal
|
|
480
509
|
'modal.skills.title': 'Skills 管理',
|
|
@@ -602,6 +631,7 @@ const ja = Object.freeze({
|
|
|
602
631
|
'sessions.preview.openStandalone': 'スタンドアロンで開く',
|
|
603
632
|
'sessions.preview.copyLink': 'リンクをコピー',
|
|
604
633
|
'sessions.preview.copyPath': 'パスをコピー',
|
|
634
|
+
'sessions.preview.openLink': 'リンクを開く',
|
|
605
635
|
'sessions.preview.loadingBody': 'メッセージ読み込み中...',
|
|
606
636
|
'sessions.preview.emptyMsgs': 'メッセージがありません',
|
|
607
637
|
'sessions.preview.rendering': 'レンダリング中...',
|
|
@@ -1131,6 +1161,13 @@ const ja = Object.freeze({
|
|
|
1131
1161
|
'claude.model': 'モデル',
|
|
1132
1162
|
'claude.model.placeholder': '例: claude-3-7-sonnet',
|
|
1133
1163
|
'claude.model.hint': 'モデル変更後は自動保存され、現在の設定に適用されます。',
|
|
1164
|
+
'claude.targetApi.label': 'ターゲット API',
|
|
1165
|
+
'claude.targetApi.responses': 'Anthropic',
|
|
1166
|
+
'claude.targetApi.chatCompletions': 'OpenAI Chat Completions (/v1/chat/completions)',
|
|
1167
|
+
'claude.targetApi.ollama': 'Ollama Chat (/api/chat)',
|
|
1168
|
+
'claude.targetApi.chatCompletionsBadge': 'OpenAI Chat Completions',
|
|
1169
|
+
'claude.targetApi.ollamaBadge': 'Ollama',
|
|
1170
|
+
'claude.targetApi.hint': 'Chat Completions または Ollama を選ぶと Claude 互換プロキシが内蔵変換します。Codex provider の wire_api は変更しません。Ollama では API Key は不要です。',
|
|
1134
1171
|
'claude.health.title': '設定ヘルスチェック',
|
|
1135
1172
|
'claude.health.run': 'チェック実行',
|
|
1136
1173
|
'claude.health.running': 'チェック中...',
|
|
@@ -58,6 +58,8 @@ const vi = Object.freeze({
|
|
|
58
58
|
'common.apply': 'Áp dụng',
|
|
59
59
|
'common.applying': 'Đang áp dụng...',
|
|
60
60
|
'common.confirming': 'Đang xác nhận...',
|
|
61
|
+
'common.preview': 'Xem trước',
|
|
62
|
+
'common.previewing': 'Đang xem trước...',
|
|
61
63
|
'common.writeToEditor': 'Ghi vào trình soạn thảo',
|
|
62
64
|
'common.refreshFromText': 'Làm mới từ văn bản',
|
|
63
65
|
'common.backToEdit': 'Quay lại chỉnh sửa',
|
|
@@ -90,12 +92,14 @@ const vi = Object.freeze({
|
|
|
90
92
|
'tab.market': 'Skills',
|
|
91
93
|
'tab.plugins': 'Plugin',
|
|
92
94
|
'tab.settings': 'Cài đặt',
|
|
95
|
+
'tab.prompts': 'Prompts',
|
|
93
96
|
|
|
94
97
|
// Side rail section titles
|
|
95
98
|
'side.overview': 'Tổng quan',
|
|
96
99
|
'side.docs': 'Tài liệu',
|
|
97
100
|
'side.config': 'Cấu hình',
|
|
98
101
|
'side.sessions': 'Phiên',
|
|
102
|
+
'side.prompts': 'Prompts',
|
|
99
103
|
'side.plugins': 'Plugin',
|
|
100
104
|
'side.system': 'Hệ thống',
|
|
101
105
|
'side.orchestration': 'Tác vụ',
|
|
@@ -106,6 +110,17 @@ const vi = Object.freeze({
|
|
|
106
110
|
'side.overview.doctor.meta': 'Tổng quan / Chẩn đoán',
|
|
107
111
|
'side.docs.cliInstall': 'Cài CLI',
|
|
108
112
|
'side.docs.cliInstall.meta': 'Cài đặt / Cập nhật / Gỡ',
|
|
113
|
+
'side.update.available': 'Có bản cập nhật',
|
|
114
|
+
'side.update.availableWithVersion': 'Có bản cập nhật v{version}',
|
|
115
|
+
'side.update.meta': 'Mở lệnh cập nhật',
|
|
116
|
+
'side.update.metaVersions': 'Hiện tại v{current} → mới nhất v{latest}',
|
|
117
|
+
'side.update.checkFailed': 'Không thể kiểm tra phiên bản mới nhất',
|
|
118
|
+
'side.update.check': 'Kiểm tra cập nhật',
|
|
119
|
+
'side.update.checking': 'Đang kiểm tra cập nhật…',
|
|
120
|
+
'side.update.checkingMeta': 'Đang kết nối npm registry',
|
|
121
|
+
'side.update.upToDate': 'Đã là phiên bản mới nhất',
|
|
122
|
+
'side.update.currentOnly': 'Hiện tại v{current}',
|
|
123
|
+
'side.update.retry': 'Thử kiểm tra phiên bản lại',
|
|
109
124
|
'side.config.codex': 'Codex',
|
|
110
125
|
'side.config.codex.meta': 'Provider / Model',
|
|
111
126
|
'side.config.claude': 'Claude Code',
|
|
@@ -114,6 +129,10 @@ const vi = Object.freeze({
|
|
|
114
129
|
'side.config.openclaw.meta': 'JSON5 / AGENTS',
|
|
115
130
|
'side.sessions.browser': 'Trình duyệt phiên',
|
|
116
131
|
'side.sessions.browser.meta': 'Duyệt / Xuất / Dọn dẹp',
|
|
132
|
+
'side.prompts.agents': 'AGENTS.md',
|
|
133
|
+
'side.prompts.agents.meta': 'Tệp lệnh Codex',
|
|
134
|
+
'side.prompts.claude': 'CLAUDE.md',
|
|
135
|
+
'side.prompts.claude.meta': 'Tệp lệnh Claude',
|
|
117
136
|
'side.plugins.tools': 'Công cụ prompt',
|
|
118
137
|
'side.plugins.tools.meta': 'Mẫu / Biến',
|
|
119
138
|
'side.system.settings': 'Cài đặt runtime',
|
|
@@ -151,6 +170,7 @@ const vi = Object.freeze({
|
|
|
151
170
|
'kicker.plugins': 'Plugin',
|
|
152
171
|
'kicker.docs': 'Tài liệu',
|
|
153
172
|
'kicker.settings': 'Cài đặt',
|
|
173
|
+
'kicker.prompts': 'Prompts',
|
|
154
174
|
'kicker.trash': 'Thùng rác',
|
|
155
175
|
|
|
156
176
|
'title.dashboard': 'Dashboard / Doctor',
|
|
@@ -162,6 +182,7 @@ const vi = Object.freeze({
|
|
|
162
182
|
'title.plugins': 'Plugin & Mẫu',
|
|
163
183
|
'title.docs': 'Cài CLI & Tài liệu',
|
|
164
184
|
'title.settings': 'Hệ thống & Dữ liệu',
|
|
185
|
+
'title.prompts': 'Trình chỉnh sửa tệp lệnh',
|
|
165
186
|
|
|
166
187
|
'subtitle.dashboard': 'Tổng hợp trạng thái và chẩn đoán.',
|
|
167
188
|
'subtitle.config': 'Quản lý cấu hình và mô hình cục bộ.',
|
|
@@ -172,6 +193,9 @@ const vi = Object.freeze({
|
|
|
172
193
|
'subtitle.plugins': 'Quản lý plugin và mẫu tái sử dụng.',
|
|
173
194
|
'subtitle.docs': 'Lệnh cài CLI và hướng dẫn.',
|
|
174
195
|
'subtitle.settings': 'Quản lý tải xuống, thư mục và dữ liệu.',
|
|
196
|
+
'subtitle.prompts': 'Chỉnh sửa AGENTS.md và CLAUDE.md.',
|
|
197
|
+
'prompts.subTab.codex': 'AGENTS.md (Codex)',
|
|
198
|
+
'prompts.subTab.claude': 'CLAUDE.md (Claude)',
|
|
175
199
|
|
|
176
200
|
|
|
177
201
|
// Task orchestration readiness
|
|
@@ -237,12 +261,26 @@ const vi = Object.freeze({
|
|
|
237
261
|
'dashboard.doctor.checking': 'Đang kiểm tra...',
|
|
238
262
|
'dashboard.doctor.export': 'Xuất báo cáo',
|
|
239
263
|
|
|
264
|
+
// Claude target API
|
|
265
|
+
'claude.targetApi.label': 'API đích',
|
|
266
|
+
'claude.targetApi.responses': 'Anthropic',
|
|
267
|
+
'claude.targetApi.chatCompletions': 'OpenAI Chat Completions (/v1/chat/completions)',
|
|
268
|
+
'claude.targetApi.ollama': 'Ollama Chat (/api/chat)',
|
|
269
|
+
'claude.targetApi.chatCompletionsBadge': 'OpenAI Chat Completions',
|
|
270
|
+
'claude.targetApi.ollamaBadge': 'Ollama',
|
|
271
|
+
'claude.targetApi.hint': 'Khi chọn Chat Completions hoặc Ollama, proxy tương thích Claude sẽ chuyển đổi nội bộ mà không thay đổi wire_api của Codex provider; Ollama không cần API key.',
|
|
272
|
+
|
|
240
273
|
// Toasts
|
|
241
274
|
'toast.copy.empty': 'Không có gì để sao chép',
|
|
242
275
|
'toast.copy.ok': 'Đã sao chép',
|
|
243
276
|
'toast.copy.fail': 'Sao chép thất bại',
|
|
277
|
+
'toast.link.fail': 'Không thể tạo liên kết',
|
|
244
278
|
'toast.save.ok': 'Đã lưu',
|
|
245
279
|
'toast.save.fail': 'Lưu thất bại',
|
|
280
|
+
'toast.agents.saved.agents': 'AGENTS.md đã lưu',
|
|
281
|
+
'toast.agents.saved.claudeMd': 'CLAUDE.md đã lưu',
|
|
282
|
+
'toast.agents.saved.openclaw': 'OpenClaw AGENTS.md đã lưu',
|
|
283
|
+
'toast.agents.saved.workspace': 'Tệp workspace đã lưu: {name}',
|
|
246
284
|
'toast.delete.ok': 'Đã xóa',
|
|
247
285
|
'toast.delete.fail': 'Xóa thất bại',
|
|
248
286
|
'toast.operation.success': 'Thao tác thành công',
|
|
@@ -289,6 +327,19 @@ const vi = Object.freeze({
|
|
|
289
327
|
'modal.claudeDelete.message': 'Xóa cấu hình "{name}"?',
|
|
290
328
|
'modal.claudeDelete.confirm': 'Xóa',
|
|
291
329
|
'modal.claudeDelete.cancel': 'Hủy',
|
|
330
|
+
|
|
331
|
+
// Sessions
|
|
332
|
+
'sessions.preview.openLink': 'Mở liên kết',
|
|
333
|
+
|
|
334
|
+
// Diff / Agents hints
|
|
335
|
+
'diff.hint.busy': 'Đang tạo diff hoặc áp dụng. Thao tác tạm thời bị vô hiệu hóa.',
|
|
336
|
+
'diff.hint.failedBack': 'Xem trước diff thất bại. Hãy quay lại chỉnh sửa và thử lại.',
|
|
337
|
+
'diff.hint.noChangesBack': 'Không phát hiện thay đổi. Quay lại chỉnh sửa hoặc hủy.',
|
|
338
|
+
'diff.hint.previewMode': 'Đang xem trước. Nhấp "Lưu" để ghi hoặc "Quay lại chỉnh sửa" để tiếp tục.',
|
|
339
|
+
'modal.agents.unsaved.detectedHint': 'Phát hiện thay đổi chưa lưu: lưu trước khi đóng hoặc áp dụng.',
|
|
340
|
+
'modal.agents.hint.twoStepSave': 'Lưu hai bước: "Xem trước" để kiểm tra diff, rồi "Lưu" để ghi.',
|
|
341
|
+
'diff.viewHint.preview': 'Đang xem trước. Nhấp "Lưu" để ghi hoặc "Quay lại chỉnh sửa" để tiếp tục.',
|
|
342
|
+
'diff.viewHint.truncated': 'Bỏ qua xem trước do nội dung quá lớn. Nhấp "Lưu" để ghi hoặc "Quay lại chỉnh sửa" để tiếp tục.',
|
|
292
343
|
});
|
|
293
344
|
|
|
294
345
|
export { vi };
|
|
@@ -49,6 +49,8 @@ const zh = Object.freeze({
|
|
|
49
49
|
'common.apply': '应用',
|
|
50
50
|
'common.applying': '应用中...',
|
|
51
51
|
'common.confirming': '确认中...',
|
|
52
|
+
'common.preview': '预览',
|
|
53
|
+
'common.previewing': '预览中...',
|
|
52
54
|
'common.refreshFromText': '从文本刷新',
|
|
53
55
|
'common.backToEdit': '返回编辑',
|
|
54
56
|
'common.selectAll': '全选',
|
|
@@ -129,12 +131,14 @@ const zh = Object.freeze({
|
|
|
129
131
|
'tab.market': 'Skills',
|
|
130
132
|
'tab.plugins': '插件',
|
|
131
133
|
'tab.settings': '设置',
|
|
134
|
+
'tab.prompts': 'Prompts',
|
|
132
135
|
|
|
133
136
|
// Side rail section titles
|
|
134
137
|
'side.overview': '概览',
|
|
135
138
|
'side.docs': '文档',
|
|
136
139
|
'side.config': '配置',
|
|
137
140
|
'side.sessions': '会话',
|
|
141
|
+
'side.prompts': 'Prompts',
|
|
138
142
|
'side.plugins': '插件',
|
|
139
143
|
'side.system': '系统',
|
|
140
144
|
'side.orchestration': '任务',
|
|
@@ -145,6 +149,17 @@ const zh = Object.freeze({
|
|
|
145
149
|
'side.overview.doctor.meta': '总览 / 诊断 / 跳转',
|
|
146
150
|
'side.docs.cliInstall': 'CLI 安装',
|
|
147
151
|
'side.docs.cliInstall.meta': '安装 / 升级 / 卸载',
|
|
152
|
+
'side.update.available': '有新版本',
|
|
153
|
+
'side.update.availableWithVersion': '有新版本 v{version}',
|
|
154
|
+
'side.update.meta': '点击查看更新命令',
|
|
155
|
+
'side.update.metaVersions': '当前 v{current} → 最新 v{latest}',
|
|
156
|
+
'side.update.checkFailed': '检查最新版本失败',
|
|
157
|
+
'side.update.check': '检查更新',
|
|
158
|
+
'side.update.checking': '正在检查更新…',
|
|
159
|
+
'side.update.checkingMeta': '正在连接 npm registry',
|
|
160
|
+
'side.update.upToDate': '已是最新',
|
|
161
|
+
'side.update.currentOnly': '当前 v{current}',
|
|
162
|
+
'side.update.retry': '重试版本检查',
|
|
148
163
|
'side.config.codex': 'Codex',
|
|
149
164
|
'side.config.codex.meta': 'Provider / Model',
|
|
150
165
|
'side.config.claude': 'Claude Code',
|
|
@@ -153,6 +168,10 @@ const zh = Object.freeze({
|
|
|
153
168
|
'side.config.openclaw.meta': 'JSON5 / AGENTS',
|
|
154
169
|
'side.sessions.browser': '会话浏览',
|
|
155
170
|
'side.sessions.browser.meta': '浏览 / 导出 / 清理',
|
|
171
|
+
'side.prompts.agents': 'AGENTS.md',
|
|
172
|
+
'side.prompts.agents.meta': 'Codex 指令文件',
|
|
173
|
+
'side.prompts.claude': 'CLAUDE.md',
|
|
174
|
+
'side.prompts.claude.meta': 'Claude 指令文件',
|
|
156
175
|
'side.plugins.tools': '提示词工具',
|
|
157
176
|
'side.plugins.tools.meta': '模板 / 变量',
|
|
158
177
|
'side.plugins.templatesCount': '{count} 个模板',
|
|
@@ -171,6 +190,7 @@ const zh = Object.freeze({
|
|
|
171
190
|
'kicker.docs': 'Docs',
|
|
172
191
|
'kicker.trash': '回收站',
|
|
173
192
|
'kicker.settings': 'Settings',
|
|
193
|
+
'kicker.prompts': 'Prompts',
|
|
174
194
|
|
|
175
195
|
'title.dashboard': 'Dashboard / Doctor',
|
|
176
196
|
'title.config': '本地配置控制台',
|
|
@@ -181,6 +201,7 @@ const zh = Object.freeze({
|
|
|
181
201
|
'title.plugins': '插件与模板',
|
|
182
202
|
'title.docs': 'CLI 安装与文档',
|
|
183
203
|
'title.settings': '系统与数据设置',
|
|
204
|
+
'title.prompts': '指令文件编辑器',
|
|
184
205
|
|
|
185
206
|
'subtitle.dashboard': '聚合状态与诊断入口。',
|
|
186
207
|
'subtitle.config': '管理本地配置与模型。',
|
|
@@ -191,6 +212,9 @@ const zh = Object.freeze({
|
|
|
191
212
|
'subtitle.plugins': '管理模板化 prompt 与可复用插件。',
|
|
192
213
|
'subtitle.docs': '查看 CLI 安装命令与排障。',
|
|
193
214
|
'subtitle.settings': '管理下载、目录与回收站。',
|
|
215
|
+
'subtitle.prompts': '编辑 AGENTS.md 与 CLAUDE.md。',
|
|
216
|
+
'prompts.subTab.codex': 'AGENTS.md (Codex)',
|
|
217
|
+
'prompts.subTab.claude': 'CLAUDE.md (Claude)',
|
|
194
218
|
'dashboard.doctor.title': 'Doctor',
|
|
195
219
|
'dashboard.doctor.runChecks': '运行检查',
|
|
196
220
|
'dashboard.doctor.checking': '检查中...',
|
|
@@ -367,8 +391,13 @@ const zh = Object.freeze({
|
|
|
367
391
|
'toast.copy.empty': '没有可复制内容',
|
|
368
392
|
'toast.copy.ok': '已复制',
|
|
369
393
|
'toast.copy.fail': '复制失败',
|
|
394
|
+
'toast.link.fail': '无法生成链接',
|
|
370
395
|
'toast.save.ok': '已保存',
|
|
371
396
|
'toast.save.fail': '保存失败',
|
|
397
|
+
'toast.agents.saved.agents': 'AGENTS.md 已保存',
|
|
398
|
+
'toast.agents.saved.claudeMd': 'CLAUDE.md 已保存',
|
|
399
|
+
'toast.agents.saved.openclaw': 'OpenClaw AGENTS.md 已保存',
|
|
400
|
+
'toast.agents.saved.workspace': '工作区文件已保存: {name}',
|
|
372
401
|
'toast.delete.ok': '已删除',
|
|
373
402
|
'toast.delete.fail': '删除失败',
|
|
374
403
|
'toast.export.empty': '没有可导出内容',
|
|
@@ -457,7 +486,7 @@ const zh = Object.freeze({
|
|
|
457
486
|
'diff.hint.busy': '正在生成差异或应用中,操作暂不可用。',
|
|
458
487
|
'diff.hint.failedBack': '差异预览失败,请返回编辑后重试。',
|
|
459
488
|
'diff.hint.noChangesBack': '未检测到改动,可返回编辑继续修改或取消退出。',
|
|
460
|
-
'diff.hint.previewMode': '
|
|
489
|
+
'diff.hint.previewMode': '当前为预览模式,可点击”保存”写入或”返回编辑”继续修改。',
|
|
461
490
|
|
|
462
491
|
'modal.agents.export': '导出',
|
|
463
492
|
'modal.agents.copy': '复制',
|
|
@@ -466,13 +495,13 @@ const zh = Object.freeze({
|
|
|
466
495
|
'modal.agents.targetFile': '目标文件',
|
|
467
496
|
'modal.agents.contentLabel': 'AGENTS.md 内容',
|
|
468
497
|
'modal.agents.placeholder': '在这里编辑 AGENTS.md 内容',
|
|
469
|
-
'modal.agents.unsaved.previewModeHint': '
|
|
498
|
+
'modal.agents.unsaved.previewModeHint': '预览模式:当前改动尚未保存,只有点击”保存”后才会写入文件。',
|
|
470
499
|
'modal.agents.unsaved.detectedHint': '检测到未保存改动:关闭页面或应用前请先保存。',
|
|
471
500
|
'modal.agents.hint.shortcuts': '快捷键:Esc(差异预览时返回编辑,编辑时关闭窗口)。',
|
|
472
|
-
'modal.agents.hint.twoStepSave': '
|
|
501
|
+
'modal.agents.hint.twoStepSave': '保存需两步:先点击”预览”查看差异,再点击”保存”写入。',
|
|
473
502
|
'diff.tooLargeSkip': '内容过大,已跳过逐行差异预览',
|
|
474
|
-
'diff.viewHint.preview': '
|
|
475
|
-
'diff.viewHint.truncated': '
|
|
503
|
+
'diff.viewHint.preview': '当前为预览模式,可点击”保存”写入或”返回编辑”继续修改。',
|
|
504
|
+
'diff.viewHint.truncated': '内容过大,已跳过预览,可点击”保存”写入或”返回编辑”继续修改。',
|
|
476
505
|
|
|
477
506
|
// Skills modal
|
|
478
507
|
'modal.skills.title': 'Skills 管理',
|
|
@@ -612,6 +641,7 @@ const zh = Object.freeze({
|
|
|
612
641
|
'sessions.preview.importNative.failedWithReason': '导入原生目录失败:{reason}',
|
|
613
642
|
'sessions.preview.copyLink': '复制链接',
|
|
614
643
|
'sessions.preview.copyPath': '复制路径',
|
|
644
|
+
'sessions.preview.openLink': '打开链接',
|
|
615
645
|
'sessions.preview.loadingBody': '正在加载会话内容...',
|
|
616
646
|
'sessions.preview.emptyMsgs': '当前会话暂无可展示消息',
|
|
617
647
|
'sessions.preview.rendering': '正在渲染会话内容...',
|
|
@@ -1141,6 +1171,13 @@ const zh = Object.freeze({
|
|
|
1141
1171
|
'claude.model': '模型',
|
|
1142
1172
|
'claude.model.placeholder': '例如: claude-3-7-sonnet',
|
|
1143
1173
|
'claude.model.hint': '模型修改后会自动保存并应用到当前配置。',
|
|
1174
|
+
'claude.targetApi.label': '目标 API',
|
|
1175
|
+
'claude.targetApi.responses': 'Anthropic',
|
|
1176
|
+
'claude.targetApi.chatCompletions': 'OpenAI Chat Completions (/v1/chat/completions)',
|
|
1177
|
+
'claude.targetApi.ollama': 'Ollama Chat (/api/chat)',
|
|
1178
|
+
'claude.targetApi.chatCompletionsBadge': 'OpenAI Chat Completions',
|
|
1179
|
+
'claude.targetApi.ollamaBadge': 'Ollama',
|
|
1180
|
+
'claude.targetApi.hint': '选择 Chat Completions 或 Ollama 时由 Claude 兼容代理内建转换,不修改 Codex provider 的 wire_api;Ollama 可不填 API Key。',
|
|
1144
1181
|
'claude.health.title': '配置健康检查',
|
|
1145
1182
|
'claude.health.run': '运行检查',
|
|
1146
1183
|
'claude.health.running': '检查中...',
|
|
@@ -1,4 +1,16 @@
|
|
|
1
1
|
<div id="app" class="container" v-cloak>
|
|
2
|
+
<div v-if="!sessionStandalone" class="mobile-brand-bar">
|
|
3
|
+
<div class="mobile-brand-title">Codex Mate<span v-if="appVersion" class="brand-version"> v{{ appVersion }}</span></div>
|
|
4
|
+
<button
|
|
5
|
+
v-if="isAppVersionStatusVisible()"
|
|
6
|
+
type="button"
|
|
7
|
+
:class="['mobile-update-chip', 'mobile-update-chip--' + appVersionStatusKind()]"
|
|
8
|
+
:title="appVersionStatusTitle()"
|
|
9
|
+
@click="handleAppVersionStatusClick">
|
|
10
|
+
<span class="side-update-dot"></span>
|
|
11
|
+
<span class="mobile-update-text">{{ appUpdateNoticeText() }}</span>
|
|
12
|
+
</button>
|
|
13
|
+
</div>
|
|
2
14
|
<div v-if="!sessionStandalone" class="top-tabs" role="tablist" :aria-label="t('nav.topTabs.aria')">
|
|
3
15
|
<button type="button" class="top-tab"
|
|
4
16
|
id="tab-dashboard"
|
|
@@ -81,6 +93,16 @@
|
|
|
81
93
|
:class="{ active: isMainTabNavActive('plugins') }"
|
|
82
94
|
@pointerdown="onMainTabPointerDown('plugins', $event)"
|
|
83
95
|
@click="onMainTabClick('plugins', $event)">{{ t('tab.plugins') }}</button>
|
|
96
|
+
<button type="button" class="top-tab"
|
|
97
|
+
id="tab-prompts"
|
|
98
|
+
role="tab"
|
|
99
|
+
data-main-tab="prompts"
|
|
100
|
+
:tabindex="mainTab === 'prompts' ? 0 : -1"
|
|
101
|
+
:aria-selected="mainTab === 'prompts'"
|
|
102
|
+
aria-controls="panel-prompts"
|
|
103
|
+
:class="{ active: isMainTabNavActive('prompts') }"
|
|
104
|
+
@pointerdown="onMainTabPointerDown('prompts', $event)"
|
|
105
|
+
@click="onMainTabClick('prompts', $event)">{{ t('tab.prompts') }}</button>
|
|
84
106
|
<button type="button" class="top-tab"
|
|
85
107
|
id="tab-settings"
|
|
86
108
|
role="tab"
|
|
@@ -110,6 +132,18 @@
|
|
|
110
132
|
<div class="brand-kicker">Codex Mate<span v-if="appVersion" class="brand-version"> v{{ appVersion }}</span></div>
|
|
111
133
|
</div>
|
|
112
134
|
</div>
|
|
135
|
+
<button
|
|
136
|
+
v-if="isAppVersionStatusVisible()"
|
|
137
|
+
type="button"
|
|
138
|
+
:class="['side-update-notice', 'side-update-notice--' + appVersionStatusKind()]"
|
|
139
|
+
:title="appVersionStatusTitle()"
|
|
140
|
+
@click="handleAppVersionStatusClick">
|
|
141
|
+
<span class="side-update-dot"></span>
|
|
142
|
+
<span class="side-update-copy">
|
|
143
|
+
<span class="side-update-title">{{ appUpdateNoticeText() }}</span>
|
|
144
|
+
<span class="side-update-meta">{{ appUpdateNoticeMeta() }}</span>
|
|
145
|
+
</span>
|
|
146
|
+
</button>
|
|
113
147
|
</div>
|
|
114
148
|
|
|
115
149
|
<div class="side-rail-nav">
|
|
@@ -191,6 +225,36 @@
|
|
|
191
225
|
</button>
|
|
192
226
|
</div>
|
|
193
227
|
|
|
228
|
+
<div class="side-section" role="navigation" :aria-label="t('side.prompts')">
|
|
229
|
+
<div class="side-section-title">{{ t('side.prompts') }}</div>
|
|
230
|
+
<button
|
|
231
|
+
id="side-tab-prompts-agents"
|
|
232
|
+
data-main-tab="prompts"
|
|
233
|
+
data-prompts-sub-tab="codex"
|
|
234
|
+
:aria-current="mainTab === 'prompts' && promptsSubTab === 'codex' ? 'page' : null"
|
|
235
|
+
:class="['side-item', { active: isMainTabNavActive('prompts') && promptsSubTab === 'codex' }]"
|
|
236
|
+
@pointerdown="onMainTabPointerDown('prompts', $event)"
|
|
237
|
+
@click="switchPromptsSubTab('codex'); onMainTabClick('prompts')">
|
|
238
|
+
<div class="side-item-title">{{ t('side.prompts.agents') }}</div>
|
|
239
|
+
<div class="side-item-meta">
|
|
240
|
+
<span>{{ t('side.prompts.agents.meta') }}</span>
|
|
241
|
+
</div>
|
|
242
|
+
</button>
|
|
243
|
+
<button
|
|
244
|
+
id="side-tab-prompts-claude"
|
|
245
|
+
data-main-tab="prompts"
|
|
246
|
+
data-prompts-sub-tab="claude-md"
|
|
247
|
+
:aria-current="mainTab === 'prompts' && promptsSubTab === 'claude-md' ? 'page' : null"
|
|
248
|
+
:class="['side-item', { active: isMainTabNavActive('prompts') && promptsSubTab === 'claude-md' }]"
|
|
249
|
+
@pointerdown="onMainTabPointerDown('prompts', $event)"
|
|
250
|
+
@click="switchPromptsSubTab('claude-md'); onMainTabClick('prompts')">
|
|
251
|
+
<div class="side-item-title">{{ t('side.prompts.claude') }}</div>
|
|
252
|
+
<div class="side-item-meta">
|
|
253
|
+
<span>{{ t('side.prompts.claude.meta') }}</span>
|
|
254
|
+
</div>
|
|
255
|
+
</button>
|
|
256
|
+
</div>
|
|
257
|
+
|
|
194
258
|
<div class="side-section" role="navigation" :aria-label="t('side.sessions')">
|
|
195
259
|
<div class="side-section-title">{{ t('side.sessions') }}</div>
|
|
196
260
|
<button
|