Merge branch 'main' into feature/add-context-window-size-config

Resolved conflicts in:
- packages/cli/src/ui/components/ContextUsageDisplay.tsx
- packages/cli/src/ui/components/Footer.tsx
- packages/cli/src/ui/components/Footer.test.tsx
- docs/users/configuration/settings.md

Changes:
- Merged main branch UI improvements with rightItems architecture
- Updated contextWindowSize documentation to be more concise
- Preserved all main branch features and functionality
This commit is contained in:
xwj02155382 2026-01-23 14:41:59 +08:00
commit 4ad4aab3fd
320 changed files with 21383 additions and 10420 deletions

View file

@ -132,7 +132,7 @@ const SETTINGS_SCHEMA = {
requiresRestart: false,
default: undefined as string | undefined,
description: 'The preferred editor to open files in.',
showInDialog: false,
showInDialog: true,
},
vimMode: {
type: 'boolean',
@ -163,13 +163,13 @@ const SETTINGS_SCHEMA = {
},
gitCoAuthor: {
type: 'boolean',
label: 'Git Co-Author',
label: 'Attribution: commit',
category: 'General',
requiresRestart: false,
default: true,
description:
'Automatically add a Co-authored-by trailer to git commit messages when commits are made through Qwen Code.',
showInDialog: false,
showInDialog: true,
},
checkpointing: {
type: 'object',
@ -198,13 +198,13 @@ const SETTINGS_SCHEMA = {
requiresRestart: false,
default: false,
description: 'Enable debug logging of keystrokes to the console.',
showInDialog: true,
showInDialog: false,
},
language: {
type: 'enum',
label: 'Language',
label: 'Language: UI',
category: 'General',
requiresRestart: false,
requiresRestart: true,
default: 'auto',
description:
'The language for the user interface. Use "auto" to detect from system settings. ' +
@ -219,9 +219,20 @@ const SETTINGS_SCHEMA = {
{ value: 'de', label: 'Deutsch (German)' },
],
},
outputLanguage: {
type: 'string',
label: 'Language: Model',
category: 'General',
requiresRestart: true,
default: 'auto',
description:
'The language for LLM output. Use "auto" to detect from system settings, ' +
'or set a specific language (e.g., "English", "中文", "日本語").',
showInDialog: true,
},
terminalBell: {
type: 'boolean',
label: 'Terminal Bell',
label: 'Terminal Bell Notification',
category: 'General',
requiresRestart: false,
default: true,
@ -257,7 +268,7 @@ const SETTINGS_SCHEMA = {
requiresRestart: false,
default: 'text',
description: 'The format of the CLI output.',
showInDialog: true,
showInDialog: false,
options: [
{ value: 'text', label: 'Text' },
{ value: 'json', label: 'JSON' },
@ -280,9 +291,9 @@ const SETTINGS_SCHEMA = {
label: 'Theme',
category: 'UI',
requiresRestart: false,
default: undefined as string | undefined,
default: 'Qwen Dark' as string,
description: 'The color theme for the UI.',
showInDialog: false,
showInDialog: true,
},
customThemes: {
type: 'object',
@ -300,7 +311,7 @@ const SETTINGS_SCHEMA = {
requiresRestart: true,
default: false,
description: 'Hide the window title bar',
showInDialog: true,
showInDialog: false,
},
showStatusInTitle: {
type: 'boolean',
@ -310,7 +321,7 @@ const SETTINGS_SCHEMA = {
default: false,
description:
'Show Qwen Code status and thoughts in the terminal window title',
showInDialog: true,
showInDialog: false,
},
hideTips: {
type: 'boolean',
@ -321,89 +332,13 @@ const SETTINGS_SCHEMA = {
description: 'Hide helpful tips in the UI',
showInDialog: true,
},
hideBanner: {
type: 'boolean',
label: 'Hide Banner',
category: 'UI',
requiresRestart: false,
default: false,
description: 'Hide the application banner',
showInDialog: true,
},
hideContextSummary: {
type: 'boolean',
label: 'Hide Context Summary',
category: 'UI',
requiresRestart: false,
default: false,
description:
'Hide the context summary (QWEN.md, MCP servers) above the input.',
showInDialog: true,
},
footer: {
type: 'object',
label: 'Footer',
category: 'UI',
requiresRestart: false,
default: {},
description: 'Settings for the footer.',
showInDialog: false,
properties: {
hideCWD: {
type: 'boolean',
label: 'Hide CWD',
category: 'UI',
requiresRestart: false,
default: false,
description:
'Hide the current working directory path in the footer.',
showInDialog: true,
},
hideSandboxStatus: {
type: 'boolean',
label: 'Hide Sandbox Status',
category: 'UI',
requiresRestart: false,
default: false,
description: 'Hide the sandbox status indicator in the footer.',
showInDialog: true,
},
hideModelInfo: {
type: 'boolean',
label: 'Hide Model Info',
category: 'UI',
requiresRestart: false,
default: false,
description: 'Hide the model name and context usage in the footer.',
showInDialog: true,
},
},
},
hideFooter: {
type: 'boolean',
label: 'Hide Footer',
category: 'UI',
requiresRestart: false,
default: false,
description: 'Hide the footer from the UI',
showInDialog: true,
},
showMemoryUsage: {
type: 'boolean',
label: 'Show Memory Usage',
category: 'UI',
requiresRestart: false,
default: false,
description: 'Display memory usage information in the UI',
showInDialog: true,
},
showLineNumbers: {
type: 'boolean',
label: 'Show Line Numbers',
label: 'Show Line Numbers in Code',
category: 'UI',
requiresRestart: false,
default: false,
description: 'Show line numbers in the chat.',
description: 'Show line numbers in the code output.',
showInDialog: true,
},
showCitations: {
@ -413,7 +348,7 @@ const SETTINGS_SCHEMA = {
requiresRestart: false,
default: false,
description: 'Show citations for generated text in the chat.',
showInDialog: true,
showInDialog: false,
},
customWittyPhrases: {
type: 'array',
@ -426,7 +361,7 @@ const SETTINGS_SCHEMA = {
},
enableWelcomeBack: {
type: 'boolean',
label: 'Enable Welcome Back',
label: 'Show Welcome Back Dialog',
category: 'UI',
requiresRestart: false,
default: true,
@ -434,6 +369,16 @@ const SETTINGS_SCHEMA = {
'Show welcome back dialog when returning to a project with conversation history.',
showInDialog: true,
},
enableUserFeedback: {
type: 'boolean',
label: 'Enable User Feedback',
category: 'UI',
requiresRestart: false,
default: true,
description:
'Show optional feedback dialog after conversations to help improve Qwen performance.',
showInDialog: true,
},
accessibility: {
type: 'object',
label: 'Accessibility',
@ -450,7 +395,7 @@ const SETTINGS_SCHEMA = {
requiresRestart: true,
default: false,
description: 'Disable loading phrases for accessibility',
showInDialog: true,
showInDialog: false,
},
screenReader: {
type: 'boolean',
@ -460,10 +405,19 @@ const SETTINGS_SCHEMA = {
default: undefined as boolean | undefined,
description:
'Render output in plain-text to be more screen reader accessible',
showInDialog: true,
showInDialog: false,
},
},
},
feedbackLastShownTimestamp: {
type: 'number',
label: 'Feedback Last Shown Timestamp',
category: 'UI',
requiresRestart: false,
default: 0,
description: 'The last time the feedback dialog was shown.',
showInDialog: false,
},
},
},
@ -478,7 +432,7 @@ const SETTINGS_SCHEMA = {
properties: {
enabled: {
type: 'boolean',
label: 'IDE Mode',
label: 'Auto-connect to IDE',
category: 'IDE',
requiresRestart: true,
default: false,
@ -513,7 +467,7 @@ const SETTINGS_SCHEMA = {
requiresRestart: true,
default: true,
description: 'Enable collection of usage statistics',
showInDialog: false,
showInDialog: true,
},
},
},
@ -554,7 +508,7 @@ const SETTINGS_SCHEMA = {
default: -1,
description:
'Maximum number of user/model/tool turns to keep in a session. -1 means unlimited.',
showInDialog: true,
showInDialog: false,
},
summarizeToolOutput: {
type: 'object',
@ -592,7 +546,7 @@ const SETTINGS_SCHEMA = {
requiresRestart: false,
default: true,
description: 'Skip the next speaker check.',
showInDialog: true,
showInDialog: false,
},
skipLoopDetection: {
type: 'boolean',
@ -601,7 +555,7 @@ const SETTINGS_SCHEMA = {
requiresRestart: false,
default: false,
description: 'Disable all loop detection checks (streaming and LLM).',
showInDialog: true,
showInDialog: false,
},
skipStartupContext: {
type: 'boolean',
@ -611,7 +565,7 @@ const SETTINGS_SCHEMA = {
default: false,
description:
'Avoid sending the workspace startup context at the beginning of each session.',
showInDialog: true,
showInDialog: false,
},
enableOpenAILogging: {
type: 'boolean',
@ -620,7 +574,7 @@ const SETTINGS_SCHEMA = {
requiresRestart: false,
default: false,
description: 'Enable OpenAI logging.',
showInDialog: true,
showInDialog: false,
},
openAILoggingDir: {
type: 'string',
@ -630,7 +584,7 @@ const SETTINGS_SCHEMA = {
default: undefined as string | undefined,
description:
'Custom directory path for OpenAI API logs. If not specified, defaults to logs/openai in the current working directory.',
showInDialog: true,
showInDialog: false,
},
generationConfig: {
type: 'object',
@ -650,7 +604,7 @@ const SETTINGS_SCHEMA = {
description: 'Request timeout in milliseconds.',
parentKey: 'generationConfig',
childKey: 'timeout',
showInDialog: true,
showInDialog: false,
},
maxRetries: {
type: 'number',
@ -661,7 +615,7 @@ const SETTINGS_SCHEMA = {
description: 'Maximum number of retries for failed requests.',
parentKey: 'generationConfig',
childKey: 'maxRetries',
showInDialog: true,
showInDialog: false,
},
disableCacheControl: {
type: 'boolean',
@ -672,7 +626,7 @@ const SETTINGS_SCHEMA = {
description: 'Disable cache control for DashScope providers.',
parentKey: 'generationConfig',
childKey: 'disableCacheControl',
showInDialog: true,
showInDialog: false,
},
schemaCompliance: {
type: 'enum',
@ -684,7 +638,7 @@ const SETTINGS_SCHEMA = {
'The compliance mode for tool schemas sent to the model. Use "openapi_30" for strict OpenAPI 3.0 compatibility (e.g., for Gemini).',
parentKey: 'generationConfig',
childKey: 'schemaCompliance',
showInDialog: true,
showInDialog: false,
options: [
{ value: 'auto', label: 'Auto (Default)' },
{ value: 'openapi_30', label: 'OpenAPI 3.0 Strict' },
@ -752,7 +706,7 @@ const SETTINGS_SCHEMA = {
requiresRestart: false,
default: false,
description: 'Whether to load memory files from include directories.',
showInDialog: true,
showInDialog: false,
},
fileFiltering: {
type: 'object',
@ -788,7 +742,7 @@ const SETTINGS_SCHEMA = {
requiresRestart: true,
default: true,
description: 'Enable recursive file search functionality',
showInDialog: true,
showInDialog: false,
},
disableFuzzySearch: {
type: 'boolean',
@ -797,7 +751,7 @@ const SETTINGS_SCHEMA = {
requiresRestart: true,
default: false,
description: 'Disable fuzzy search when searching for files.',
showInDialog: true,
showInDialog: false,
},
},
},
@ -834,7 +788,7 @@ const SETTINGS_SCHEMA = {
properties: {
enableInteractiveShell: {
type: 'boolean',
label: 'Enable Interactive Shell',
label: 'Interactive Shell (PTY)',
category: 'Tools',
requiresRestart: true,
default: false,
@ -859,20 +813,10 @@ const SETTINGS_SCHEMA = {
requiresRestart: false,
default: false,
description: 'Show color in shell output.',
showInDialog: true,
showInDialog: false,
},
},
},
autoAccept: {
type: 'boolean',
label: 'Auto Accept',
category: 'Tools',
requiresRestart: false,
default: false,
description:
'Automatically accept and execute tool calls that are considered safe (e.g., read-only operations).',
showInDialog: true,
},
core: {
type: 'array',
label: 'Core Tools',
@ -904,7 +848,7 @@ const SETTINGS_SCHEMA = {
},
approvalMode: {
type: 'enum',
label: 'Approval Mode',
label: 'Tool Approval Mode',
category: 'Tools',
requiresRestart: false,
default: ApprovalMode.DEFAULT,
@ -918,6 +862,16 @@ const SETTINGS_SCHEMA = {
{ value: ApprovalMode.YOLO, label: 'YOLO' },
],
},
autoAccept: {
type: 'boolean',
label: 'Auto Accept',
category: 'Tools',
requiresRestart: false,
default: false,
description:
'Automatically accept and execute tool calls that are considered safe (e.g., read-only operations) without explicit user confirmation.',
showInDialog: false,
},
discoveryCommand: {
type: 'string',
label: 'Tool Discovery Command',
@ -944,7 +898,7 @@ const SETTINGS_SCHEMA = {
default: true,
description:
'Use ripgrep for file content search instead of the fallback implementation. Provides faster search performance.',
showInDialog: true,
showInDialog: false,
},
useBuiltinRipgrep: {
type: 'boolean',
@ -954,7 +908,7 @@ const SETTINGS_SCHEMA = {
default: true,
description:
'Use the bundled ripgrep binary. When set to false, the system-level "rg" command will be used instead. This setting is only effective when useRipgrep is true.',
showInDialog: true,
showInDialog: false,
},
enableToolOutputTruncation: {
type: 'boolean',
@ -963,7 +917,7 @@ const SETTINGS_SCHEMA = {
requiresRestart: true,
default: true,
description: 'Enable truncation of large tool outputs.',
showInDialog: true,
showInDialog: false,
},
truncateToolOutputThreshold: {
type: 'number',
@ -973,7 +927,7 @@ const SETTINGS_SCHEMA = {
default: DEFAULT_TRUNCATE_TOOL_OUTPUT_THRESHOLD,
description:
'Truncate tool output if it is larger than this many characters. Set to -1 to disable.',
showInDialog: true,
showInDialog: false,
},
truncateToolOutputLines: {
type: 'number',
@ -982,28 +936,7 @@ const SETTINGS_SCHEMA = {
requiresRestart: true,
default: DEFAULT_TRUNCATE_TOOL_OUTPUT_LINES,
description: 'The number of lines to keep when truncating tool output.',
showInDialog: true,
},
experimental: {
type: 'object',
label: 'Experimental',
category: 'Tools',
requiresRestart: true,
default: {},
description: 'Experimental tool features.',
showInDialog: false,
properties: {
skills: {
type: 'boolean',
label: 'Skills',
category: 'Tools',
requiresRestart: true,
default: false,
description:
'Enable experimental Agent Skills feature. When enabled, Qwen Code can use Skills from .qwen/skills/ and ~/.qwen/skills/.',
showInDialog: true,
},
},
},
},
},
@ -1080,7 +1013,7 @@ const SETTINGS_SCHEMA = {
requiresRestart: true,
default: false,
description: 'Setting to track whether Folder trust is enabled.',
showInDialog: true,
showInDialog: false,
},
},
},
@ -1231,14 +1164,15 @@ const SETTINGS_SCHEMA = {
description: 'Setting to enable experimental features',
showInDialog: false,
properties: {
extensionManagement: {
skills: {
type: 'boolean',
label: 'Extension Management',
label: 'Experimental: Skills',
category: 'Experimental',
requiresRestart: true,
default: true,
description: 'Enable extension management features.',
showInDialog: false,
default: false,
description:
'Enable experimental Agent Skills feature. When enabled, Qwen Code can use Skills from .qwen/skills/ and ~/.qwen/skills/.',
showInDialog: true,
},
visionModelPreview: {
type: 'boolean',
@ -1248,7 +1182,7 @@ const SETTINGS_SCHEMA = {
default: true,
description:
'Enable vision model support and auto-switching functionality. When disabled, vision models like qwen-vl-max-latest will be hidden and auto-switching will not occur.',
showInDialog: true,
showInDialog: false,
},
vlmSwitchMode: {
type: 'string',
@ -1262,39 +1196,6 @@ const SETTINGS_SCHEMA = {
},
},
},
extensions: {
type: 'object',
label: 'Extensions',
category: 'Extensions',
requiresRestart: true,
default: {},
description: 'Settings for extensions.',
showInDialog: false,
properties: {
disabled: {
type: 'array',
label: 'Disabled Extensions',
category: 'Extensions',
requiresRestart: true,
default: [] as string[],
description: 'List of disabled extensions.',
showInDialog: false,
mergeStrategy: MergeStrategy.UNION,
},
workspacesWithMigrationNudge: {
type: 'array',
label: 'Workspaces with Migration Nudge',
category: 'Extensions',
requiresRestart: false,
default: [] as string[],
description:
'List of workspaces for which the migration nudge has been shown.',
showInDialog: false,
mergeStrategy: MergeStrategy.UNION,
},
},
},
} as const satisfies SettingsSchema;
export type SettingsSchemaType = typeof SETTINGS_SCHEMA;
@ -1316,9 +1217,3 @@ type InferSettings<T extends SettingsSchema> = {
};
export type Settings = InferSettings<SettingsSchemaType>;
export interface FooterSettings {
hideCWD?: boolean;
hideSandboxStatus?: boolean;
hideModelInfo?: boolean;
}