From 0c53b19a74f6f85ed4b0c38cd9572893453d87d1 Mon Sep 17 00:00:00 2001 From: "mingholy.lmh" Date: Thu, 26 Feb 2026 20:38:38 +0800 Subject: [PATCH 1/2] feat(auth): backup settings file before auth modification - Add backupSettingsFile() utility to create .orig backup before modifying settings - Update success message to indicate backup was created - Sync i18n translations for all supported languages - Update documentation to reflect the change Co-authored-by: Qwen-Coder --- docs/users/configuration/auth.md | 12 +++++------ docs/users/configuration/model-providers.md | 2 +- packages/cli/src/config/settingsSchema.ts | 2 +- packages/cli/src/i18n/locales/de.js | 4 ++-- packages/cli/src/i18n/locales/en.js | 4 ++-- packages/cli/src/i18n/locales/ja.js | 4 ++-- packages/cli/src/i18n/locales/pt.js | 4 ++-- packages/cli/src/i18n/locales/ru.js | 4 ++-- packages/cli/src/i18n/locales/zh.js | 4 ++-- packages/cli/src/ui/auth/useAuth.ts | 7 ++++++- packages/cli/src/utils/settingsUtils.ts | 22 +++++++++++++++++++++ 11 files changed, 48 insertions(+), 21 deletions(-) diff --git a/docs/users/configuration/auth.md b/docs/users/configuration/auth.md index 1d5d302406..5bd15e52b8 100644 --- a/docs/users/configuration/auth.md +++ b/docs/users/configuration/auth.md @@ -266,12 +266,12 @@ This is the approach used in the [one-file setup example](#recommended-one-file- **Priority summary:** -| Priority | Source | Override behavior | -| ----------- | ------------------------------ | ---------------------------------------- | -| 1 (highest) | CLI flags (`--openai-api-key`) | Always wins | -| 2 | System env (`export`, inline) | Overrides `.env` and `settings.env` | -| 3 | `.env` file | Only sets if not in system env | -| 4 (lowest) | `settings.json` → `env` | Only sets if not in system env or `.env` | +| Priority | Source | Override behavior | +| ----------- | ------------------------------ | -------------------------------------------- | +| 1 (highest) | CLI flags (`--openai-api-key`) | Always wins | +| 2 | System env (`export`, inline) | Overrides `.env` and `settings.json` → `env` | +| 3 | `.env` file | Only sets if not in system env | +| 4 (lowest) | `settings.json` → `env` | Only sets if not in system env or `.env` | #### Step 3: Switch models with `/model` diff --git a/docs/users/configuration/model-providers.md b/docs/users/configuration/model-providers.md index 2e62659172..f170f32e8a 100644 --- a/docs/users/configuration/model-providers.md +++ b/docs/users/configuration/model-providers.md @@ -314,7 +314,7 @@ The region is selected during authentication and stored in `settings.json` under ### API Key Storage -When you configure Coding Plan through the `/auth` command, the API key is stored using the reserved environment variable name `BAILIAN_CODING_PLAN_API_KEY`. By default, it is stored in the `settings.env` field of your `settings.json` file. +When you configure Coding Plan through the `/auth` command, the API key is stored using the reserved environment variable name `BAILIAN_CODING_PLAN_API_KEY`. By default, it is stored in the `env` field of your `settings.json` file. > [!warning] > **Security Recommendation**: For better security, it is recommended to move the API key from `settings.json` to a separate `.env` file and load it as an environment variable. For example: diff --git a/packages/cli/src/config/settingsSchema.ts b/packages/cli/src/config/settingsSchema.ts index 283baee26b..5ada27fc87 100644 --- a/packages/cli/src/config/settingsSchema.ts +++ b/packages/cli/src/config/settingsSchema.ts @@ -147,7 +147,7 @@ const SETTINGS_SCHEMA = { requiresRestart: true, default: {} as Record, description: - 'Environment variables to set as fallback defaults. These are loaded with the lowest priority: system environment variables > .env files > settings.env.', + 'Environment variables to set as fallback defaults. These are loaded with the lowest priority: system environment variables > .env files > settings.json env field.', showInDialog: false, mergeStrategy: MergeStrategy.SHALLOW_MERGE, }, diff --git a/packages/cli/src/i18n/locales/de.js b/packages/cli/src/i18n/locales/de.js index 431b709109..8ae18e16e4 100644 --- a/packages/cli/src/i18n/locales/de.js +++ b/packages/cli/src/i18n/locales/de.js @@ -1450,6 +1450,6 @@ export default { 'Neue Modellkonfigurationen sind für Coding Plan (Bailian, Global/Intl) verfügbar. Jetzt aktualisieren?', '{{region}} configuration updated successfully. Model switched to "{{model}}".': '{{region}}-Konfiguration erfolgreich aktualisiert. Modell auf "{{model}}" umgeschaltet.', - 'Authenticated successfully with {{region}}. API key is stored in settings.env.': - 'Erfolgreich mit {{region}} authentifiziert. API-Schlüssel ist in settings.env gespeichert.', + 'Authenticated successfully with {{region}}. API key and model configs saved to settings.json (backed up).': + 'Erfolgreich mit {{region}} authentifiziert. API-Schlüssel und Modellkonfigurationen wurden in settings.json gespeichert (gesichert).', }; diff --git a/packages/cli/src/i18n/locales/en.js b/packages/cli/src/i18n/locales/en.js index 775f470b79..0d3d422a70 100644 --- a/packages/cli/src/i18n/locales/en.js +++ b/packages/cli/src/i18n/locales/en.js @@ -1449,6 +1449,6 @@ export default { 'New model configurations are available for Coding Plan (Bailian, Global/Intl). Update now?', '{{region}} configuration updated successfully. Model switched to "{{model}}".': '{{region}} configuration updated successfully. Model switched to "{{model}}".', - 'Authenticated successfully with {{region}}. API key is stored in settings.env.': - 'Authenticated successfully with {{region}}. API key is stored in settings.env.', + 'Authenticated successfully with {{region}}. API key and model configs saved to settings.json (backed up).': + 'Authenticated successfully with {{region}}. API key and model configs saved to settings.json (backed up).', }; diff --git a/packages/cli/src/i18n/locales/ja.js b/packages/cli/src/i18n/locales/ja.js index c009548588..9632d5675f 100644 --- a/packages/cli/src/i18n/locales/ja.js +++ b/packages/cli/src/i18n/locales/ja.js @@ -955,6 +955,6 @@ export default { 'Coding Plan (Bailian, グローバル/国際) の新しいモデル設定が利用可能です。今すぐ更新しますか?', '{{region}} configuration updated successfully. Model switched to "{{model}}".': '{{region}} の設定が正常に更新されました。モデルが "{{model}}" に切り替わりました。', - 'Authenticated successfully with {{region}}. API key is stored in settings.env.': - '{{region}} での認証に成功しました。APIキーは settings.env に保存されています。', + 'Authenticated successfully with {{region}}. API key and model configs saved to settings.json (backed up).': + '{{region}} での認証に成功しました。APIキーとモデル設定が settings.json に保存されました(バックアップ済み)。', }; diff --git a/packages/cli/src/i18n/locales/pt.js b/packages/cli/src/i18n/locales/pt.js index a6130b2fb8..d630879d1a 100644 --- a/packages/cli/src/i18n/locales/pt.js +++ b/packages/cli/src/i18n/locales/pt.js @@ -1458,6 +1458,6 @@ export default { 'Novas configurações de modelo estão disponíveis para o Coding Plan (Bailian, Global/Intl). Atualizar agora?', '{{region}} configuration updated successfully. Model switched to "{{model}}".': 'Configuração do {{region}} atualizada com sucesso. Modelo alterado para "{{model}}".', - 'Authenticated successfully with {{region}}. API key is stored in settings.env.': - 'Autenticado com sucesso com {{region}}. A chave de API está armazenada em settings.env.', + 'Authenticated successfully with {{region}}. API key and model configs saved to settings.json (backed up).': + 'Autenticado com sucesso com {{region}}. Chave de API e configurações de modelo salvas em settings.json (com backup).', }; diff --git a/packages/cli/src/i18n/locales/ru.js b/packages/cli/src/i18n/locales/ru.js index a8299a762f..b8b332b769 100644 --- a/packages/cli/src/i18n/locales/ru.js +++ b/packages/cli/src/i18n/locales/ru.js @@ -1454,6 +1454,6 @@ export default { 'Доступны новые конфигурации моделей для Coding Plan (Bailian, Глобальный/Международный). Обновить сейчас?', '{{region}} configuration updated successfully. Model switched to "{{model}}".': 'Конфигурация {{region}} успешно обновлена. Модель переключена на "{{model}}".', - 'Authenticated successfully with {{region}}. API key is stored in settings.env.': - 'Успешная аутентификация с {{region}}. API-ключ сохранён в settings.env.', + 'Authenticated successfully with {{region}}. API key and model configs saved to settings.json (backed up).': + 'Успешная аутентификация с {{region}}. API-ключ и конфигурации моделей сохранены в settings.json (резервная копия создана).', }; diff --git a/packages/cli/src/i18n/locales/zh.js b/packages/cli/src/i18n/locales/zh.js index b0db2d0e53..02ae707b63 100644 --- a/packages/cli/src/i18n/locales/zh.js +++ b/packages/cli/src/i18n/locales/zh.js @@ -1282,6 +1282,6 @@ export default { 'Coding Plan (百炼, 全球/国际) 有新的模型配置可用。是否立即更新?', '{{region}} configuration updated successfully. Model switched to "{{model}}".': '{{region}} 配置更新成功。模型已切换至 "{{model}}"。', - 'Authenticated successfully with {{region}}. API key is stored in settings.env.': - '成功通过 {{region}} 认证。API Key 已存储在 settings.env 中。', + 'Authenticated successfully with {{region}}. API key and model configs saved to settings.json (backed up).': + '成功通过 {{region}} 认证。API Key 和模型配置已保存至 settings.json(已备份)。', }; diff --git a/packages/cli/src/ui/auth/useAuth.ts b/packages/cli/src/ui/auth/useAuth.ts index bb05172aa1..50b4890c26 100644 --- a/packages/cli/src/ui/auth/useAuth.ts +++ b/packages/cli/src/ui/auth/useAuth.ts @@ -35,6 +35,7 @@ import { CodingPlanRegion, CODING_PLAN_ENV_KEY, } from '../../constants/codingPlan.js'; +import { backupSettingsFile } from '../../utils/settingsUtils.js'; export type { QwenAuthState } from '../hooks/useQwenAuth.js'; @@ -304,6 +305,10 @@ export const useAuthCommand = ( // Get persist scope const persistScope = getPersistScopeForModelSelection(settings); + // Backup settings file before modification + const settingsFile = settings.forScope(persistScope); + backupSettingsFile(settingsFile.path); + // Store api-key in settings.env (unified env key) settings.setValue(persistScope, `env.${CODING_PLAN_ENV_KEY}`, apiKey); @@ -384,7 +389,7 @@ export const useAuthCommand = ( { type: MessageType.INFO, text: t( - 'Authenticated successfully with {{region}}. API key is stored in settings.env.', + 'Authenticated successfully with {{region}}. API key and model configs saved to settings.json (backed up).', { region: regionName }, ), }, diff --git a/packages/cli/src/utils/settingsUtils.ts b/packages/cli/src/utils/settingsUtils.ts index fe3b6df8d9..1bd5988ebb 100644 --- a/packages/cli/src/utils/settingsUtils.ts +++ b/packages/cli/src/utils/settingsUtils.ts @@ -4,6 +4,7 @@ * SPDX-License-Identifier: Apache-2.0 */ +import * as fs from 'node:fs'; import type { Settings, SettingScope, @@ -577,4 +578,25 @@ export function getEffectiveDisplayValue( return getSettingValue(key, settings, mergedSettings); } +/** + * Backup a settings file before modification. + * Creates a backup with `.orig` suffix if the file exists and backup doesn't already exist. + * @param filePath - Path to the settings file to backup + * @returns boolean indicating whether a backup was created + */ +export function backupSettingsFile(filePath: string): boolean { + try { + if (fs.existsSync(filePath)) { + const backupPath = `${filePath}.orig`; + if (!fs.existsSync(backupPath)) { + fs.renameSync(filePath, backupPath); + return true; + } + } + } catch (_e) { + // Ignore backup errors, proceed without backup + } + return false; +} + export const TEST_ONLY = { clearFlattenedSchema }; From be2b74ccab7a6b301b17628fd9d25c5c7f1d1d40 Mon Sep 17 00:00:00 2001 From: "mingholy.lmh" Date: Fri, 27 Feb 2026 15:30:10 +0800 Subject: [PATCH 2/2] fix: update `contextWindowSize` --- packages/cli/src/constants/codingPlan.ts | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/packages/cli/src/constants/codingPlan.ts b/packages/cli/src/constants/codingPlan.ts index 72e7fc1b0f..80c41f50bd 100644 --- a/packages/cli/src/constants/codingPlan.ts +++ b/packages/cli/src/constants/codingPlan.ts @@ -61,6 +61,7 @@ export function generateCodingPlanTemplate( extra_body: { enable_thinking: true, }, + contextWindowSize: 1000000, }, }, { @@ -68,12 +69,18 @@ export function generateCodingPlanTemplate( name: '[Bailian Coding Plan] qwen3-coder-plus', baseUrl: 'https://coding.dashscope.aliyuncs.com/v1', envKey: CODING_PLAN_ENV_KEY, + generationConfig: { + contextWindowSize: 1000000, + }, }, { id: 'qwen3-coder-next', name: '[Bailian Coding Plan] qwen3-coder-next', baseUrl: 'https://coding.dashscope.aliyuncs.com/v1', envKey: CODING_PLAN_ENV_KEY, + generationConfig: { + contextWindowSize: 262144, + }, }, { id: 'qwen3-max-2026-01-23', @@ -84,6 +91,7 @@ export function generateCodingPlanTemplate( extra_body: { enable_thinking: true, }, + contextWindowSize: 262144, }, }, { @@ -95,6 +103,7 @@ export function generateCodingPlanTemplate( extra_body: { enable_thinking: true, }, + contextWindowSize: 202752, }, }, { @@ -106,6 +115,7 @@ export function generateCodingPlanTemplate( extra_body: { enable_thinking: true, }, + contextWindowSize: 202752, }, }, { @@ -117,6 +127,7 @@ export function generateCodingPlanTemplate( extra_body: { enable_thinking: true, }, + contextWindowSize: 1000000, }, }, { @@ -128,6 +139,7 @@ export function generateCodingPlanTemplate( extra_body: { enable_thinking: true, }, + contextWindowSize: 262144, }, }, ]; @@ -144,6 +156,7 @@ export function generateCodingPlanTemplate( extra_body: { enable_thinking: true, }, + contextWindowSize: 1000000, }, }, { @@ -151,12 +164,18 @@ export function generateCodingPlanTemplate( name: '[Bailian Coding Plan for Global/Intl] qwen3-coder-plus', baseUrl: 'https://coding-intl.dashscope.aliyuncs.com/v1', envKey: CODING_PLAN_ENV_KEY, + generationConfig: { + contextWindowSize: 1000000, + }, }, { id: 'qwen3-coder-next', name: '[Bailian Coding Plan for Global/Intl] qwen3-coder-next', baseUrl: 'https://coding-intl.dashscope.aliyuncs.com/v1', envKey: CODING_PLAN_ENV_KEY, + generationConfig: { + contextWindowSize: 262144, + }, }, { id: 'qwen3-max-2026-01-23', @@ -167,6 +186,7 @@ export function generateCodingPlanTemplate( extra_body: { enable_thinking: true, }, + contextWindowSize: 262144, }, }, { @@ -178,6 +198,7 @@ export function generateCodingPlanTemplate( extra_body: { enable_thinking: true, }, + contextWindowSize: 202752, }, }, { @@ -189,6 +210,7 @@ export function generateCodingPlanTemplate( extra_body: { enable_thinking: true, }, + contextWindowSize: 202752, }, }, { @@ -200,6 +222,7 @@ export function generateCodingPlanTemplate( extra_body: { enable_thinking: true, }, + contextWindowSize: 1000000, }, }, { @@ -211,6 +234,7 @@ export function generateCodingPlanTemplate( extra_body: { enable_thinking: true, }, + contextWindowSize: 262144, }, }, ];