codexmate 0.1.1 → 0.1.3
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 +6 -3
- package/cli/openai-bridge-retry.js +17 -9
- package/cli/openai-bridge-runtime.js +14 -1
- package/cli/openai-bridge.js +20 -10
- package/cli.js +375 -4
- package/package.json +1 -1
- package/web-ui/app.js +18 -4
- package/web-ui/index.html +1 -0
- package/web-ui/modules/app.computed.dashboard.mjs +14 -0
- package/web-ui/modules/app.methods.agents.mjs +2 -2
- package/web-ui/modules/app.methods.index.mjs +2 -0
- package/web-ui/modules/app.methods.install.mjs +14 -0
- package/web-ui/modules/app.methods.kilocode-config.mjs +164 -0
- package/web-ui/modules/app.methods.navigation.mjs +12 -0
- package/web-ui/modules/app.methods.openclaw-core.mjs +87 -0
- package/web-ui/modules/app.methods.providers.mjs +5 -32
- package/web-ui/modules/app.methods.startup-claude.mjs +2 -1
- package/web-ui/modules/app.methods.tool-config-permissions.mjs +3 -2
- package/web-ui/modules/app.methods.web-ui-preferences.mjs +2 -1
- package/web-ui/modules/config-mode.computed.mjs +11 -1
- package/web-ui/modules/i18n/locales/en.mjs +31 -4
- package/web-ui/modules/i18n/locales/ja.mjs +34 -8
- package/web-ui/modules/i18n/locales/vi.mjs +35 -9
- package/web-ui/modules/i18n/locales/zh-tw.mjs +36 -9
- package/web-ui/modules/i18n/locales/zh.mjs +40 -13
- package/web-ui/partials/index/layout-header.html +32 -21
- package/web-ui/partials/index/modal-config-template-agents.html +8 -4
- package/web-ui/partials/index/modals-basic.html +0 -26
- package/web-ui/partials/index/panel-config-kilocode.html +101 -0
- package/web-ui/partials/index/panel-config-openclaw.html +42 -14
- package/web-ui/partials/index/panel-config-opencode.html +1 -0
- package/web-ui/partials/index/panel-docs.html +17 -1
- package/web-ui/res/web-ui-render.precompiled.js +400 -123
- package/web-ui/styles/controls-forms.css +10 -0
- package/web-ui/styles/docs-panel.css +51 -0
- package/web-ui/styles/layout-shell.css +12 -0
- package/web-ui/styles/modals-core.css +79 -0
- package/web-ui/styles/openclaw-structured.css +117 -71
|
@@ -143,7 +143,8 @@ const ja = Object.freeze({
|
|
|
143
143
|
'side.docs': 'ドキュメント',
|
|
144
144
|
'side.config': '設定',
|
|
145
145
|
'side.sessions': 'セッション',
|
|
146
|
-
'side.
|
|
146
|
+
'side.workspace': 'ワークスペース',
|
|
147
|
+
'side.prompts': 'プロンプト',
|
|
147
148
|
'side.prompts.meta': 'プロンプトファイルとプリセット',
|
|
148
149
|
'side.plugins': 'プラグイン',
|
|
149
150
|
'side.system': 'システム',
|
|
@@ -169,13 +170,13 @@ const ja = Object.freeze({
|
|
|
169
170
|
'side.update.currentOnly': '現在 v{current}',
|
|
170
171
|
'side.update.retry': 'バージョン確認を再試行',
|
|
171
172
|
'side.config.codex': 'Codex',
|
|
172
|
-
'side.config.codex.meta': '
|
|
173
|
+
'side.config.codex.meta': 'プロバイダー · モデル',
|
|
173
174
|
'side.config.claude': 'Claude Code',
|
|
174
|
-
'side.config.claude.meta': '
|
|
175
|
+
'side.config.claude.meta': '設定',
|
|
175
176
|
'side.config.openclaw': 'OpenClaw',
|
|
176
|
-
'side.config.openclaw.meta': '
|
|
177
|
+
'side.config.openclaw.meta': '設定',
|
|
177
178
|
'side.config.opencode': 'OpenCode',
|
|
178
|
-
'side.config.opencode.meta': '
|
|
179
|
+
'side.config.opencode.meta': 'プロバイダー',
|
|
179
180
|
'side.sessions.browser': 'セッション閲覧',
|
|
180
181
|
'side.sessions.browser.meta': '閲覧 / エクスポート / クリーンアップ',
|
|
181
182
|
'side.prompts.agents': 'AGENTS.md',
|
|
@@ -519,8 +520,6 @@ const ja = Object.freeze({
|
|
|
519
520
|
'modal.claudeConfigEdit.title': 'Claude Code 設定編集',
|
|
520
521
|
'field.useBuiltinTransform': '内蔵変換を使用(OpenAI 形式互換)',
|
|
521
522
|
'hint.useBuiltinTransform': '有効時:書き込まれる base_url は codexmate 内蔵変換サービスを指します。Codex のトークンは codexmate に固定されます。',
|
|
522
|
-
'field.transformMaxRetries': '内蔵変換の再試行回数',
|
|
523
|
-
'hint.transformMaxRetries': '既定値は 2、最小値も 2。初回失敗後に再試行する最大回数です。',
|
|
524
523
|
|
|
525
524
|
// Config template / agents modals
|
|
526
525
|
'modal.configTemplate.label': 'config.toml テンプレート',
|
|
@@ -622,9 +621,12 @@ const ja = Object.freeze({
|
|
|
622
621
|
|
|
623
622
|
// Docs panel
|
|
624
623
|
'docs.title': 'CLI インストールドキュメント',
|
|
625
|
-
'docs.subtitle': 'Claude Code / Gemini CLI / CodeBuddy Code / Codex CLI コマンドを表示。',
|
|
624
|
+
'docs.subtitle': 'Claude Code / Gemini CLI / CodeBuddy Code / Codex CLI / KiloCode CLI コマンドを表示。',
|
|
626
625
|
'docs.section.commands': 'インストールコマンド',
|
|
627
626
|
'docs.section.commandsNote': 'コマンドは直接コピーできます。',
|
|
627
|
+
'docs.installed.title': '現在インストール済みのコマンド',
|
|
628
|
+
'docs.installed.count': '{count} 個インストール済み',
|
|
629
|
+
'docs.installed.empty': 'インストール済みコマンドは検出されていません',
|
|
628
630
|
'docs.section.faq': 'よくある質問',
|
|
629
631
|
'docs.section.faqNote': 'よくある質問は以下をご覧ください。',
|
|
630
632
|
'docs.command.aria': '{name} コマンド',
|
|
@@ -1520,6 +1522,30 @@ const ja = Object.freeze({
|
|
|
1520
1522
|
'openclaw.action.applyAria': 'OpenClaw 設定を適用:{name}',
|
|
1521
1523
|
'openclaw.action.editAria': 'OpenClaw 設定を編集:{name}',
|
|
1522
1524
|
'openclaw.action.deleteAria': 'OpenClaw 設定を削除:{name}',
|
|
1525
|
+
|
|
1526
|
+
'tab.config.kilocode': 'KiloCode',
|
|
1527
|
+
'side.config.kilocode': 'KiloCode',
|
|
1528
|
+
'side.config.kilocode.meta': 'プロバイダー',
|
|
1529
|
+
'toolConfig.kilocode.title': 'KiloCode 設定の書き込みと起動',
|
|
1530
|
+
'toolConfig.kilocode.desc': '既定は読み取り専用。有効化すると KiloCode 設定を同期し、Web から起動できます。',
|
|
1531
|
+
'toolConfig.kilocode.lockedTitle': '読み取り専用モード',
|
|
1532
|
+
'toolConfig.kilocode.lockedDesc': '書き込み権限を有効化すると、設定の自動同期または KiloCode の起動ができます。',
|
|
1533
|
+
'toolConfig.kilocode.confirmMessage': '有効化すると、KiloCode タブ内の操作が ~/.config/kilo/kilo.jsonc または既存の kilo.json に書き込み、ローカル KiloCode を起動できます。',
|
|
1534
|
+
'kilocode.providerModel.title': 'KiloCode プロバイダー / モデル',
|
|
1535
|
+
'kilocode.connection.title': 'KiloCode 接続',
|
|
1536
|
+
'kilocode.targetFile': '有効な KiloCode 設定:{path} · {status}',
|
|
1537
|
+
'kilocode.saveConfig': '設定を保存',
|
|
1538
|
+
'kilocode.start': 'KiloCode を起動',
|
|
1539
|
+
'kilocode.starting': '起動中',
|
|
1540
|
+
'kilocode.saveAndStart': '保存して起動',
|
|
1541
|
+
'kilocode.summary.title': '現在の KiloCode プロバイダー',
|
|
1542
|
+
'kilocode.configPreview.title': 'KiloCode 設定プレビュー',
|
|
1543
|
+
'kilocode.configPreview.hint': 'API Key はマスク済みです。自動同期では実際の key が書き込まれます。',
|
|
1544
|
+
'kilocode.saveFailed': 'KiloCode 設定の保存に失敗しました',
|
|
1545
|
+
'kilocode.fillRequired': 'KiloCode URL と API Key を入力してください',
|
|
1546
|
+
'kilocode.writeRequired': '先に KiloCode の書き込みを有効化してください',
|
|
1547
|
+
'kilocode.saved': 'KiloCode 設定を保存しました',
|
|
1548
|
+
'kilocode.autoSaved': 'KiloCode 設定を同期しました',
|
|
1523
1549
|
});
|
|
1524
1550
|
|
|
1525
1551
|
export { ja };
|
|
@@ -103,8 +103,9 @@ const vi = Object.freeze({
|
|
|
103
103
|
'side.docs': 'Tài liệu',
|
|
104
104
|
'side.config': 'Cấu hình',
|
|
105
105
|
'side.sessions': 'Phiên',
|
|
106
|
-
'side.
|
|
107
|
-
'side.prompts
|
|
106
|
+
'side.workspace': 'Không gian làm việc',
|
|
107
|
+
'side.prompts': 'Lời nhắc',
|
|
108
|
+
'side.prompts.meta': 'Tệp lời nhắc và preset',
|
|
108
109
|
'side.plugins': 'Plugin',
|
|
109
110
|
'side.system': 'Hệ thống',
|
|
110
111
|
'side.orchestration': 'Tác vụ',
|
|
@@ -129,13 +130,13 @@ const vi = Object.freeze({
|
|
|
129
130
|
'side.update.currentOnly': 'Hiện tại v{current}',
|
|
130
131
|
'side.update.retry': 'Thử kiểm tra phiên bản lại',
|
|
131
132
|
'side.config.codex': 'Codex',
|
|
132
|
-
'side.config.codex.meta': '
|
|
133
|
+
'side.config.codex.meta': 'Nhà cung cấp · Mô hình',
|
|
133
134
|
'side.config.claude': 'Claude Code',
|
|
134
|
-
'side.config.claude.meta': '
|
|
135
|
+
'side.config.claude.meta': 'Cài đặt',
|
|
135
136
|
'side.config.openclaw': 'OpenClaw',
|
|
136
|
-
'side.config.openclaw.meta': '
|
|
137
|
+
'side.config.openclaw.meta': 'Cấu hình',
|
|
137
138
|
'side.config.opencode': 'OpenCode',
|
|
138
|
-
'side.config.opencode.meta': '
|
|
139
|
+
'side.config.opencode.meta': 'Nhà cung cấp',
|
|
139
140
|
'side.sessions.browser': 'Trình duyệt phiên',
|
|
140
141
|
'side.sessions.browser.meta': 'Duyệt / Xuất / Dọn dẹp',
|
|
141
142
|
'side.prompts.agents': 'AGENTS.md',
|
|
@@ -737,8 +738,6 @@ const vi = Object.freeze({
|
|
|
737
738
|
'modal.claudeConfigEdit.title': 'Chỉnh sửa cấu hình Claude Code',
|
|
738
739
|
'field.useBuiltinTransform': 'Dùng transform tích hợp (tương thích OpenAI)',
|
|
739
740
|
'hint.useBuiltinTransform': 'Khi bật, base_url trỏ đến dịch vụ transform tích hợp của codexmate.',
|
|
740
|
-
'field.transformMaxRetries': 'Số lần thử lại transform tích hợp',
|
|
741
|
-
'hint.transformMaxRetries': 'Mặc định 2, tối thiểu 2; số lần thử lại sau lần gọi đầu thất bại.',
|
|
742
741
|
'modal.configTemplate.title': 'Trình soạn thảo template cấu hình (xác nhận thủ công)',
|
|
743
742
|
'modal.configTemplate.label': 'Template config.toml',
|
|
744
743
|
'modal.configTemplate.placeholder': 'Chỉnh sửa template config.toml tại đây',
|
|
@@ -827,9 +826,12 @@ const vi = Object.freeze({
|
|
|
827
826
|
'modal.openclaw.quick.optionsHint': 'Khi tắt ghi đè, chỉ điền các trường còn thiếu.',
|
|
828
827
|
'modal.openclaw.quick.writeToEditor': 'Ghi vào editor',
|
|
829
828
|
'docs.title': 'Cài CLI',
|
|
830
|
-
'docs.subtitle': 'Lệnh cài đặt cho Claude Code / Gemini CLI / CodeBuddy Code / Codex CLI.',
|
|
829
|
+
'docs.subtitle': 'Lệnh cài đặt cho Claude Code / Gemini CLI / CodeBuddy Code / Codex CLI / KiloCode CLI.',
|
|
831
830
|
'docs.section.commands': 'Lệnh',
|
|
832
831
|
'docs.section.commandsNote': 'Sao chép và chạy trực tiếp.',
|
|
832
|
+
'docs.installed.title': 'Lệnh hiện đã cài đặt',
|
|
833
|
+
'docs.installed.count': 'Đã cài {count}',
|
|
834
|
+
'docs.installed.empty': 'Chưa phát hiện lệnh đã cài',
|
|
833
835
|
'docs.section.faq': 'FAQ',
|
|
834
836
|
'docs.section.faqNote': 'Vấn đề phổ biến và mẹo.',
|
|
835
837
|
'docs.command.aria': 'Lệnh {name}',
|
|
@@ -1505,6 +1507,30 @@ const vi = Object.freeze({
|
|
|
1505
1507
|
'openclaw.action.applyAria': 'Áp dụng cấu hình OpenClaw: {name}',
|
|
1506
1508
|
'openclaw.action.editAria': 'Chỉnh sửa cấu hình OpenClaw: {name}',
|
|
1507
1509
|
'openclaw.action.deleteAria': 'Xóa cấu hình OpenClaw: {name}',
|
|
1510
|
+
|
|
1511
|
+
'tab.config.kilocode': 'KiloCode',
|
|
1512
|
+
'side.config.kilocode': 'KiloCode',
|
|
1513
|
+
'side.config.kilocode.meta': 'Nhà cung cấp',
|
|
1514
|
+
'toolConfig.kilocode.title': 'Ghi cấu hình và khởi chạy KiloCode',
|
|
1515
|
+
'toolConfig.kilocode.desc': 'Mặc định chỉ đọc; bật ghi để đồng bộ cấu hình KiloCode và khởi chạy từ Web.',
|
|
1516
|
+
'toolConfig.kilocode.lockedTitle': 'Chế độ chỉ đọc',
|
|
1517
|
+
'toolConfig.kilocode.lockedDesc': 'Bật quyền ghi để tự động đồng bộ cấu hình hoặc khởi chạy KiloCode.',
|
|
1518
|
+
'toolConfig.kilocode.confirmMessage': 'Khi bật, các thao tác trong tab KiloCode có thể ghi ~/.config/kilo/kilo.jsonc hoặc kilo.json hiện có, và có thể khởi chạy KiloCode cục bộ.',
|
|
1519
|
+
'kilocode.providerModel.title': 'Nhà cung cấp / mô hình KiloCode',
|
|
1520
|
+
'kilocode.connection.title': 'Kết nối KiloCode',
|
|
1521
|
+
'kilocode.targetFile': 'Cấu hình KiloCode đang dùng: {path} · {status}',
|
|
1522
|
+
'kilocode.saveConfig': 'Lưu cấu hình',
|
|
1523
|
+
'kilocode.start': 'Khởi chạy KiloCode',
|
|
1524
|
+
'kilocode.starting': 'Đang khởi chạy',
|
|
1525
|
+
'kilocode.saveAndStart': 'Lưu và khởi chạy',
|
|
1526
|
+
'kilocode.summary.title': 'Nhà cung cấp KiloCode hiện tại',
|
|
1527
|
+
'kilocode.configPreview.title': 'Xem trước cấu hình KiloCode',
|
|
1528
|
+
'kilocode.configPreview.hint': 'API Key đã được che; tự động đồng bộ sẽ ghi key thật.',
|
|
1529
|
+
'kilocode.saveFailed': 'Không thể lưu cấu hình KiloCode',
|
|
1530
|
+
'kilocode.fillRequired': 'Điền URL và API Key KiloCode',
|
|
1531
|
+
'kilocode.writeRequired': 'Hãy bật quyền ghi KiloCode trước',
|
|
1532
|
+
'kilocode.saved': 'Đã lưu cấu hình KiloCode',
|
|
1533
|
+
'kilocode.autoSaved': 'Đã đồng bộ cấu hình KiloCode',
|
|
1508
1534
|
});
|
|
1509
1535
|
|
|
1510
1536
|
export { vi };
|
|
@@ -142,8 +142,9 @@ const zhTw = Object.freeze({
|
|
|
142
142
|
'side.docs': '文檔',
|
|
143
143
|
'side.config': '設定',
|
|
144
144
|
'side.sessions': '會話',
|
|
145
|
-
'side.
|
|
146
|
-
'side.prompts
|
|
145
|
+
'side.workspace': '工作區',
|
|
146
|
+
'side.prompts': '提示詞',
|
|
147
|
+
'side.prompts.meta': '提示詞文件與預設',
|
|
147
148
|
'side.plugins': '插件',
|
|
148
149
|
'side.system': '系統',
|
|
149
150
|
'side.orchestration': '任務',
|
|
@@ -168,13 +169,13 @@ const zhTw = Object.freeze({
|
|
|
168
169
|
'side.update.currentOnly': '目前 v{current}',
|
|
169
170
|
'side.update.retry': '重試版本檢查',
|
|
170
171
|
'side.config.codex': 'Codex',
|
|
171
|
-
'side.config.codex.meta': '
|
|
172
|
+
'side.config.codex.meta': '提供者 · 模型',
|
|
172
173
|
'side.config.claude': 'Claude Code',
|
|
173
|
-
'side.config.claude.meta': '
|
|
174
|
+
'side.config.claude.meta': '設定',
|
|
174
175
|
'side.config.openclaw': 'OpenClaw',
|
|
175
|
-
'side.config.openclaw.meta': '
|
|
176
|
+
'side.config.openclaw.meta': '設定',
|
|
176
177
|
'side.config.opencode': 'OpenCode',
|
|
177
|
-
'side.config.opencode.meta': '
|
|
178
|
+
'side.config.opencode.meta': '提供者',
|
|
178
179
|
'side.sessions.browser': '會話瀏覽',
|
|
179
180
|
'side.sessions.browser.meta': '瀏覽 / 匯出 / 清理',
|
|
180
181
|
'side.prompts.agents': 'AGENTS.md',
|
|
@@ -517,8 +518,6 @@ const zhTw = Object.freeze({
|
|
|
517
518
|
'modal.claudeConfigEdit.title': '編輯 Claude Code 設定',
|
|
518
519
|
'field.useBuiltinTransform': '使用內建轉換(兼容 OpenAI 格式)',
|
|
519
520
|
'hint.useBuiltinTransform': '開啟後:寫入的 base_url 會指向 codexmate 內建轉換服務;Codex 使用的令牌固定為 codexmate。',
|
|
520
|
-
'field.transformMaxRetries': '內建轉換重試次數',
|
|
521
|
-
'hint.transformMaxRetries': '預設 2,最小 2;表示失敗後最多重試的次數。',
|
|
522
521
|
|
|
523
522
|
// Config template / agents modals
|
|
524
523
|
'modal.configTemplate.label': 'config.toml 模板',
|
|
@@ -620,9 +619,12 @@ const zhTw = Object.freeze({
|
|
|
620
619
|
|
|
621
620
|
// Docs panel
|
|
622
621
|
'docs.title': 'CLI 安裝文檔',
|
|
623
|
-
'docs.subtitle': '查看 Claude Code / Gemini CLI / CodeBuddy Code / Codex CLI 命令。',
|
|
622
|
+
'docs.subtitle': '查看 Claude Code / Gemini CLI / CodeBuddy Code / Codex CLI / KiloCode CLI 命令。',
|
|
624
623
|
'docs.section.commands': '安裝命令',
|
|
625
624
|
'docs.section.commandsNote': '命令可直接複製。',
|
|
625
|
+
'docs.installed.title': '目前已安裝命令',
|
|
626
|
+
'docs.installed.count': '已安裝 {count} 個',
|
|
627
|
+
'docs.installed.empty': '未偵測到已安裝命令',
|
|
626
628
|
'docs.section.faq': '常見問題',
|
|
627
629
|
'docs.section.faqNote': '常見問題見下。',
|
|
628
630
|
'docs.command.aria': '{name} 命令',
|
|
@@ -1532,6 +1534,31 @@ const zhTw = Object.freeze({
|
|
|
1532
1534
|
'openclaw.action.applyAria': '應用 OpenClaw 設定:{name}',
|
|
1533
1535
|
'openclaw.action.editAria': '編輯 OpenClaw 設定:{name}',
|
|
1534
1536
|
'openclaw.action.deleteAria': '刪除 OpenClaw 設定:{name}'
|
|
1537
|
+
,
|
|
1538
|
+
|
|
1539
|
+
'tab.config.kilocode': 'KiloCode',
|
|
1540
|
+
'side.config.kilocode': 'KiloCode',
|
|
1541
|
+
'side.config.kilocode.meta': '提供者',
|
|
1542
|
+
'toolConfig.kilocode.title': 'KiloCode 設定寫入與啟動',
|
|
1543
|
+
'toolConfig.kilocode.desc': '預設唯讀;啟用後可寫入 KiloCode 設定並從 Web 啟動。',
|
|
1544
|
+
'toolConfig.kilocode.lockedTitle': '唯讀模式',
|
|
1545
|
+
'toolConfig.kilocode.lockedDesc': '啟用寫入權限後可自動同步設定或啟動 KiloCode。',
|
|
1546
|
+
'toolConfig.kilocode.confirmMessage': '開啟後,KiloCode tab 內的操作會寫入 ~/.config/kilo/kilo.jsonc 或既有的 kilo.json,並可啟動本機 KiloCode。',
|
|
1547
|
+
'kilocode.providerModel.title': 'KiloCode provider / 模型',
|
|
1548
|
+
'kilocode.connection.title': 'KiloCode 連線',
|
|
1549
|
+
'kilocode.targetFile': 'KiloCode 生效設定:{path} · {status}',
|
|
1550
|
+
'kilocode.saveConfig': '儲存設定',
|
|
1551
|
+
'kilocode.start': '啟動 KiloCode',
|
|
1552
|
+
'kilocode.starting': '啟動中',
|
|
1553
|
+
'kilocode.saveAndStart': '儲存並啟動',
|
|
1554
|
+
'kilocode.summary.title': '目前 KiloCode provider',
|
|
1555
|
+
'kilocode.configPreview.title': 'KiloCode 設定預覽',
|
|
1556
|
+
'kilocode.configPreview.hint': 'API Key 已遮罩;自動同步會寫入真實 key。',
|
|
1557
|
+
'kilocode.saveFailed': '儲存 KiloCode 設定失敗',
|
|
1558
|
+
'kilocode.fillRequired': '請填寫 KiloCode URL 與 API Key',
|
|
1559
|
+
'kilocode.writeRequired': '請先開啟 KiloCode 寫入開關',
|
|
1560
|
+
'kilocode.saved': 'KiloCode 設定已儲存',
|
|
1561
|
+
'kilocode.autoSaved': 'KiloCode 設定已同步',
|
|
1535
1562
|
});
|
|
1536
1563
|
|
|
1537
1564
|
export { zhTw };
|
|
@@ -142,8 +142,9 @@ const zh = Object.freeze({
|
|
|
142
142
|
'side.docs': '文档',
|
|
143
143
|
'side.config': '配置',
|
|
144
144
|
'side.sessions': '会话',
|
|
145
|
-
'side.
|
|
146
|
-
'side.prompts
|
|
145
|
+
'side.workspace': '工作区',
|
|
146
|
+
'side.prompts': '提示词',
|
|
147
|
+
'side.prompts.meta': '提示词文件与预设',
|
|
147
148
|
'side.plugins': '插件',
|
|
148
149
|
'side.system': '系统',
|
|
149
150
|
'side.orchestration': '任务',
|
|
@@ -168,13 +169,13 @@ const zh = Object.freeze({
|
|
|
168
169
|
'side.update.currentOnly': '当前 v{current}',
|
|
169
170
|
'side.update.retry': '重试版本检查',
|
|
170
171
|
'side.config.codex': 'Codex',
|
|
171
|
-
'side.config.codex.meta': '
|
|
172
|
+
'side.config.codex.meta': '提供商 · 模型',
|
|
172
173
|
'side.config.claude': 'Claude Code',
|
|
173
|
-
'side.config.claude.meta': '
|
|
174
|
+
'side.config.claude.meta': '设置',
|
|
174
175
|
'side.config.openclaw': 'OpenClaw',
|
|
175
|
-
'side.config.openclaw.meta': '
|
|
176
|
+
'side.config.openclaw.meta': '配置',
|
|
176
177
|
'side.config.opencode': 'OpenCode',
|
|
177
|
-
'side.config.opencode.meta': '
|
|
178
|
+
'side.config.opencode.meta': '提供商',
|
|
178
179
|
'side.sessions.browser': '会话浏览',
|
|
179
180
|
'side.sessions.browser.meta': '浏览 / 导出 / 清理',
|
|
180
181
|
'side.prompts.agents': 'AGENTS.md',
|
|
@@ -517,8 +518,6 @@ const zh = Object.freeze({
|
|
|
517
518
|
'modal.claudeConfigEdit.title': '编辑 Claude Code 配置',
|
|
518
519
|
'field.useBuiltinTransform': '使用内建转换(兼容 OpenAI 格式)',
|
|
519
520
|
'hint.useBuiltinTransform': '开启后:写入的 base_url 会指向 codexmate 内建转换服务;Codex 使用的令牌固定为 codexmate。',
|
|
520
|
-
'field.transformMaxRetries': '内建转换重试次数',
|
|
521
|
-
'hint.transformMaxRetries': '默认 2,最小 2;表示失败后最多重试的次数。',
|
|
522
521
|
|
|
523
522
|
// Config template / agents modals
|
|
524
523
|
'modal.configTemplate.label': 'config.toml 模板',
|
|
@@ -620,9 +619,12 @@ const zh = Object.freeze({
|
|
|
620
619
|
|
|
621
620
|
// Docs panel
|
|
622
621
|
'docs.title': 'CLI 安装文档',
|
|
623
|
-
'docs.subtitle': '查看 Claude Code / Gemini CLI / CodeBuddy Code / Codex CLI 命令。',
|
|
622
|
+
'docs.subtitle': '查看 Claude Code / Gemini CLI / CodeBuddy Code / Codex CLI / KiloCode CLI 命令。',
|
|
624
623
|
'docs.section.commands': '安装命令',
|
|
625
624
|
'docs.section.commandsNote': '命令可直接复制。',
|
|
625
|
+
'docs.installed.title': '当前已安装命令',
|
|
626
|
+
'docs.installed.count': '已安装 {count} 个',
|
|
627
|
+
'docs.installed.empty': '未检测到已安装命令',
|
|
626
628
|
'docs.section.faq': '常见问题',
|
|
627
629
|
'docs.section.faqNote': '常见问题见下。',
|
|
628
630
|
'docs.command.aria': '{name} 命令',
|
|
@@ -944,9 +946,9 @@ const zh = Object.freeze({
|
|
|
944
946
|
'modal.agents.hint.claudeProjectGlobal': '保存后会写入 ~/.claude/CLAUDE.md。',
|
|
945
947
|
'modal.agents.contentLabel.claudeProject': 'CLAUDE.md 内容',
|
|
946
948
|
'modal.agents.placeholder.claudeProject': '在这里编辑 CLAUDE.md',
|
|
947
|
-
'modal.agents.hint.openclaw': '
|
|
949
|
+
'modal.agents.hint.openclaw': 'Workspace / AGENTS.md',
|
|
948
950
|
'modal.agents.title.openclawWorkspaceFile': 'OpenClaw 工作区文件: {fileName}',
|
|
949
|
-
'modal.agents.hint.openclawWorkspaceFile': '
|
|
951
|
+
'modal.agents.hint.openclawWorkspaceFile': 'Workspace / {fileName}',
|
|
950
952
|
'config.url.unset': '未设 URL',
|
|
951
953
|
'config.model.unset': '未设置模型',
|
|
952
954
|
'config.badge.system': '系统',
|
|
@@ -1516,11 +1518,11 @@ const zh = Object.freeze({
|
|
|
1516
1518
|
'openclaw.applyHint': '写入 ~/.openclaw/openclaw.json,支持 JSON5。',
|
|
1517
1519
|
'openclaw.workspace.title': 'OpenClaw 工作区',
|
|
1518
1520
|
'openclaw.configs.hint': '选择常用配置,或进入编辑器维护完整 JSON5。',
|
|
1519
|
-
'openclaw.agents.hint': '
|
|
1521
|
+
'openclaw.agents.hint': 'Workspace / AGENTS.md',
|
|
1520
1522
|
'openclaw.agents.open': '打开 AGENTS.md',
|
|
1521
1523
|
'openclaw.workspaceFile': '工作区文件',
|
|
1522
1524
|
'openclaw.workspace.placeholder': '例如: SOUL.md',
|
|
1523
|
-
'openclaw.workspace.hint': '
|
|
1525
|
+
'openclaw.workspace.hint': 'Workspace .md',
|
|
1524
1526
|
'openclaw.workspace.open': '打开工作区文件',
|
|
1525
1527
|
'openclaw.configured': '已配置',
|
|
1526
1528
|
'openclaw.notConfigured': '未配置',
|
|
@@ -1532,6 +1534,31 @@ const zh = Object.freeze({
|
|
|
1532
1534
|
'openclaw.action.applyAria': '应用 OpenClaw 配置:{name}',
|
|
1533
1535
|
'openclaw.action.editAria': '编辑 OpenClaw 配置:{name}',
|
|
1534
1536
|
'openclaw.action.deleteAria': '删除 OpenClaw 配置:{name}'
|
|
1537
|
+
,
|
|
1538
|
+
|
|
1539
|
+
'tab.config.kilocode': 'KiloCode',
|
|
1540
|
+
'side.config.kilocode': 'KiloCode',
|
|
1541
|
+
'side.config.kilocode.meta': '提供商',
|
|
1542
|
+
'toolConfig.kilocode.title': 'KiloCode 配置写入与启动',
|
|
1543
|
+
'toolConfig.kilocode.desc': '默认只读;开启后可写入 KiloCode 配置并从 Web 启动。',
|
|
1544
|
+
'toolConfig.kilocode.lockedTitle': '只读模式',
|
|
1545
|
+
'toolConfig.kilocode.lockedDesc': '开启写入权限后可保存配置或启动 KiloCode。',
|
|
1546
|
+
'toolConfig.kilocode.confirmMessage': '打开后,KiloCode tab 内的操作会写入 ~/.config/kilo/kilo.jsonc 或已存在的 kilo.json,并可启动本机 KiloCode。',
|
|
1547
|
+
'kilocode.providerModel.title': 'KiloCode provider / model',
|
|
1548
|
+
'kilocode.connection.title': 'KiloCode 连接',
|
|
1549
|
+
'kilocode.targetFile': 'KiloCode 生效配置:{path} · {status}',
|
|
1550
|
+
'kilocode.saveConfig': '保存配置',
|
|
1551
|
+
'kilocode.start': '启动 KiloCode',
|
|
1552
|
+
'kilocode.starting': '启动中',
|
|
1553
|
+
'kilocode.saveAndStart': '保存并启动',
|
|
1554
|
+
'kilocode.summary.title': '当前 KiloCode provider',
|
|
1555
|
+
'kilocode.configPreview.title': 'KiloCode 配置预览',
|
|
1556
|
+
'kilocode.configPreview.hint': 'API Key 已脱敏;保存会写入真实 key。',
|
|
1557
|
+
'kilocode.saveFailed': '保存 KiloCode 配置失败',
|
|
1558
|
+
'kilocode.fillRequired': '请填写 KiloCode URL 和 API Key',
|
|
1559
|
+
'kilocode.writeRequired': '请先打开 KiloCode 写入开关',
|
|
1560
|
+
'kilocode.saved': 'KiloCode 配置已保存',
|
|
1561
|
+
'kilocode.autoSaved': 'KiloCode 配置已同步',
|
|
1535
1562
|
});
|
|
1536
1563
|
|
|
1537
1564
|
export { zh };
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
:data-config-mode="configMode"
|
|
40
40
|
:tabindex="mainTab === 'config' ? 0 : -1"
|
|
41
41
|
:aria-selected="mainTab === 'config'"
|
|
42
|
-
:aria-controls="configMode === 'claude' ? 'panel-config-claude' : (configMode === 'openclaw' ? 'panel-config-openclaw' : (configMode === 'opencode' ? 'panel-config-opencode' : 'panel-config-provider'))"
|
|
42
|
+
:aria-controls="configMode === 'claude' ? 'panel-config-claude' : (configMode === 'openclaw' ? 'panel-config-openclaw' : (configMode === 'opencode' ? 'panel-config-opencode' : (configMode === 'kilocode' ? 'panel-config-kilocode' : 'panel-config-provider')))"
|
|
43
43
|
:class="{ active: isMainTabNavActive('config') }"
|
|
44
44
|
@pointerdown="onMainTabPointerDown('config', $event)"
|
|
45
45
|
@click="onMainTabClick('config', $event)">{{ t('tab.config') }}</button>
|
|
@@ -196,14 +196,13 @@
|
|
|
196
196
|
data-main-tab="config"
|
|
197
197
|
data-config-mode="codex"
|
|
198
198
|
:aria-current="mainTab === 'config' && configMode === 'codex' ? 'page' : null"
|
|
199
|
-
:class="['side-item', { active: isConfigModeNavActive('codex') }]"
|
|
199
|
+
:class="['side-item', 'side-item-compact', { active: isConfigModeNavActive('codex') }]"
|
|
200
200
|
@pointerdown="onConfigTabPointerDown('codex', $event)"
|
|
201
201
|
@click="onConfigTabClick('codex', $event)">
|
|
202
202
|
<span class="side-item-icon" aria-hidden="true">C</span>
|
|
203
203
|
<div class="side-item-title">{{ t('side.config.codex') }}</div>
|
|
204
204
|
<div class="side-item-meta">
|
|
205
205
|
<span>{{ t('side.config.codex.meta') }}</span>
|
|
206
|
-
<span v-if="currentProvider">{{ t('common.current', { value: currentProvider }) }}</span>
|
|
207
206
|
</div>
|
|
208
207
|
</button>
|
|
209
208
|
<button
|
|
@@ -211,14 +210,13 @@
|
|
|
211
210
|
data-main-tab="config"
|
|
212
211
|
data-config-mode="claude"
|
|
213
212
|
:aria-current="mainTab === 'config' && configMode === 'claude' ? 'page' : null"
|
|
214
|
-
:class="['side-item', { active: isConfigModeNavActive('claude') }]"
|
|
213
|
+
:class="['side-item', 'side-item-compact', { active: isConfigModeNavActive('claude') }]"
|
|
215
214
|
@pointerdown="onConfigTabPointerDown('claude', $event)"
|
|
216
215
|
@click="onConfigTabClick('claude', $event)">
|
|
217
216
|
<span class="side-item-icon" aria-hidden="true">A</span>
|
|
218
217
|
<div class="side-item-title">{{ t('side.config.claude') }}</div>
|
|
219
218
|
<div class="side-item-meta">
|
|
220
219
|
<span>{{ t('side.config.claude.meta') }}</span>
|
|
221
|
-
<span v-if="currentClaudeConfig">{{ t('common.current', { value: currentClaudeConfig }) }}</span>
|
|
222
220
|
</div>
|
|
223
221
|
</button>
|
|
224
222
|
<button
|
|
@@ -226,14 +224,13 @@
|
|
|
226
224
|
data-main-tab="config"
|
|
227
225
|
data-config-mode="openclaw"
|
|
228
226
|
:aria-current="mainTab === 'config' && configMode === 'openclaw' ? 'page' : null"
|
|
229
|
-
:class="['side-item', { active: isConfigModeNavActive('openclaw') }]"
|
|
227
|
+
:class="['side-item', 'side-item-compact', { active: isConfigModeNavActive('openclaw') }]"
|
|
230
228
|
@pointerdown="onConfigTabPointerDown('openclaw', $event)"
|
|
231
229
|
@click="onConfigTabClick('openclaw', $event)">
|
|
232
230
|
<span class="side-item-icon" aria-hidden="true">O</span>
|
|
233
231
|
<div class="side-item-title">{{ t('side.config.openclaw') }}</div>
|
|
234
232
|
<div class="side-item-meta">
|
|
235
233
|
<span>{{ t('side.config.openclaw.meta') }}</span>
|
|
236
|
-
<span v-if="currentOpenclawConfig">{{ t('common.current', { value: currentOpenclawConfig }) }}</span>
|
|
237
234
|
</div>
|
|
238
235
|
</button>
|
|
239
236
|
<button
|
|
@@ -241,35 +238,35 @@
|
|
|
241
238
|
data-main-tab="config"
|
|
242
239
|
data-config-mode="opencode"
|
|
243
240
|
:aria-current="mainTab === 'config' && configMode === 'opencode' ? 'page' : null"
|
|
244
|
-
:class="['side-item', { active: isConfigModeNavActive('opencode') }]"
|
|
241
|
+
:class="['side-item', 'side-item-compact', { active: isConfigModeNavActive('opencode') }]"
|
|
245
242
|
@pointerdown="onConfigTabPointerDown('opencode', $event)"
|
|
246
243
|
@click="onConfigTabClick('opencode', $event)">
|
|
247
244
|
<span class="side-item-icon" aria-hidden="true">N</span>
|
|
248
245
|
<div class="side-item-title">{{ t('side.config.opencode') }}</div>
|
|
249
246
|
<div class="side-item-meta">
|
|
250
247
|
<span>{{ t('side.config.opencode.meta') }}</span>
|
|
251
|
-
<span v-if="opencodeModel">{{ t('common.current', { value: opencodeModel }) }}</span>
|
|
252
248
|
</div>
|
|
253
249
|
</button>
|
|
250
|
+
|
|
254
251
|
<button
|
|
255
|
-
id="side-tab-
|
|
256
|
-
data-main-tab="
|
|
257
|
-
|
|
258
|
-
:
|
|
259
|
-
|
|
260
|
-
@
|
|
261
|
-
|
|
262
|
-
<
|
|
252
|
+
id="side-tab-config-kilocode"
|
|
253
|
+
data-main-tab="config"
|
|
254
|
+
data-config-mode="kilocode"
|
|
255
|
+
:aria-current="mainTab === 'config' && configMode === 'kilocode' ? 'page' : null"
|
|
256
|
+
:class="['side-item', 'side-item-compact', { active: isConfigModeNavActive('kilocode') }]"
|
|
257
|
+
@pointerdown="onConfigTabPointerDown('kilocode', $event)"
|
|
258
|
+
@click="onConfigTabClick('kilocode', $event)">
|
|
259
|
+
<span class="side-item-icon" aria-hidden="true">K</span>
|
|
260
|
+
<div class="side-item-title">{{ t('side.config.kilocode') }}</div>
|
|
263
261
|
<div class="side-item-meta">
|
|
264
|
-
<span>{{ t('side.
|
|
262
|
+
<span>{{ t('side.config.kilocode.meta') }}</span>
|
|
265
263
|
</div>
|
|
266
264
|
</button>
|
|
267
|
-
|
|
268
265
|
</div>
|
|
269
266
|
|
|
270
267
|
|
|
271
|
-
<div class="side-section" role="navigation" :aria-label="t('side.
|
|
272
|
-
<div class="side-section-title">{{ t('side.
|
|
268
|
+
<div class="side-section" role="navigation" :aria-label="t('side.workspace')">
|
|
269
|
+
<div class="side-section-title">{{ t('side.workspace') }}</div>
|
|
273
270
|
<button
|
|
274
271
|
id="side-tab-sessions"
|
|
275
272
|
data-main-tab="sessions"
|
|
@@ -284,6 +281,20 @@
|
|
|
284
281
|
<span>{{ t('sessions.sourceLabel', { value: (sessionFilterSource === 'all' ? t('sessions.source.all') : (sessionFilterSource === 'claude' ? 'Claude Code' : (sessionFilterSource === 'gemini' ? 'Gemini CLI' : (sessionFilterSource === 'codebuddy' ? 'CodeBuddy Code' : 'Codex')))) }) }}</span>
|
|
285
282
|
</div>
|
|
286
283
|
</button>
|
|
284
|
+
<button
|
|
285
|
+
id="side-tab-prompts"
|
|
286
|
+
data-main-tab="prompts"
|
|
287
|
+
:aria-current="mainTab === 'prompts' ? 'page' : null"
|
|
288
|
+
:class="['side-item', { active: isMainTabNavActive('prompts') }]"
|
|
289
|
+
@pointerdown="onMainTabPointerDown('prompts', $event)"
|
|
290
|
+
@click="onMainTabClick('prompts', $event)">
|
|
291
|
+
<span class="side-item-icon" aria-hidden="true">P</span>
|
|
292
|
+
<div class="side-item-title">{{ t('side.prompts') }}</div>
|
|
293
|
+
<div class="side-item-meta">
|
|
294
|
+
<span>{{ t('side.prompts.meta') }}</span>
|
|
295
|
+
</div>
|
|
296
|
+
</button>
|
|
297
|
+
|
|
287
298
|
<button
|
|
288
299
|
id="side-tab-usage"
|
|
289
300
|
data-main-tab="usage"
|
|
@@ -117,8 +117,8 @@
|
|
|
117
117
|
</div>
|
|
118
118
|
</div>
|
|
119
119
|
|
|
120
|
-
<div class="modal-editor-body">
|
|
121
|
-
<div class="form-group">
|
|
120
|
+
<div class="modal-editor-body" :class="{ 'modal-editor-body--openclaw-workspace': agentsContext === 'openclaw-workspace' }">
|
|
121
|
+
<div class="form-group agents-target-file-group">
|
|
122
122
|
<label class="form-label">{{ t('modal.agents.targetFile') }}</label>
|
|
123
123
|
<div class="form-hint">
|
|
124
124
|
{{ agentsPath || t('common.notLoaded') }}
|
|
@@ -129,8 +129,12 @@
|
|
|
129
129
|
</div>
|
|
130
130
|
|
|
131
131
|
|
|
132
|
-
<div class="form-group">
|
|
133
|
-
<label class="form-label">
|
|
132
|
+
<div class="form-group agents-content-group">
|
|
133
|
+
<label class="form-label">
|
|
134
|
+
{{ agentsContext === 'openclaw-workspace'
|
|
135
|
+
? `${agentsWorkspaceFileName || '工作区文件'} 内容`
|
|
136
|
+
: t(agentsContext === 'claude-project' ? 'modal.agents.contentLabel.claudeProject' : 'modal.agents.contentLabel') }}
|
|
137
|
+
</label>
|
|
134
138
|
<div
|
|
135
139
|
v-if="!agentsLoading && (hasAgentsContentChanged() || agentsDiffVisible)"
|
|
136
140
|
class="agents-diff-save-alert">
|
|
@@ -53,19 +53,6 @@
|
|
|
53
53
|
{{ t('field.useBuiltinTransform') }}
|
|
54
54
|
</label>
|
|
55
55
|
</div>
|
|
56
|
-
<div class="form-group" v-if="newProvider.useTransform">
|
|
57
|
-
<label class="form-label">{{ t('field.transformMaxRetries') }}</label>
|
|
58
|
-
<input
|
|
59
|
-
v-model.number="newProvider.openaiBridgeMaxRetries"
|
|
60
|
-
type="number"
|
|
61
|
-
min="2"
|
|
62
|
-
max="10"
|
|
63
|
-
step="1"
|
|
64
|
-
:class="['form-input', { invalid: !!providerFieldError('add', 'openaiBridgeMaxRetries') }]"
|
|
65
|
-
@blur="normalizeProviderDraft('add')">
|
|
66
|
-
<div class="form-hint">{{ t('hint.transformMaxRetries') }}</div>
|
|
67
|
-
<div v-if="providerFieldError('add', 'openaiBridgeMaxRetries')" class="form-hint form-error">{{ providerFieldError('add', 'openaiBridgeMaxRetries') }}</div>
|
|
68
|
-
</div>
|
|
69
56
|
|
|
70
57
|
<div class="btn-group">
|
|
71
58
|
<button class="btn btn-cancel" @click="closeAddModal">{{ t('common.cancel') }}</button>
|
|
@@ -104,19 +91,6 @@
|
|
|
104
91
|
</button>
|
|
105
92
|
</div>
|
|
106
93
|
</div>
|
|
107
|
-
<div class="form-group" v-if="editingProvider.useTransform">
|
|
108
|
-
<label class="form-label">{{ t('field.transformMaxRetries') }}</label>
|
|
109
|
-
<input
|
|
110
|
-
v-model.number="editingProvider.openaiBridgeMaxRetries"
|
|
111
|
-
type="number"
|
|
112
|
-
min="2"
|
|
113
|
-
max="10"
|
|
114
|
-
step="1"
|
|
115
|
-
:class="['form-input', { invalid: !!providerFieldError('edit', 'openaiBridgeMaxRetries') }]"
|
|
116
|
-
@blur="normalizeProviderDraft('edit')">
|
|
117
|
-
<div class="form-hint">{{ t('hint.transformMaxRetries') }}</div>
|
|
118
|
-
<div v-if="providerFieldError('edit', 'openaiBridgeMaxRetries')" class="form-hint form-error">{{ providerFieldError('edit', 'openaiBridgeMaxRetries') }}</div>
|
|
119
|
-
</div>
|
|
120
94
|
|
|
121
95
|
<div class="btn-group">
|
|
122
96
|
<button class="btn btn-cancel" @click="closeEditModal">{{ t('common.cancel') }}</button>
|