Skip to content

fix: unexpected re-auth when auth-token is expired#549

Merged
Mingholy merged 1 commit into
mainfrom
fix/expired-token-refresh
Sep 9, 2025
Merged

fix: unexpected re-auth when auth-token is expired#549
Mingholy merged 1 commit into
mainfrom
fix/expired-token-refresh

Conversation

@Mingholy

@Mingholy Mingholy commented Sep 8, 2025

Copy link
Copy Markdown
Collaborator

Fix: Unexpected Re-auth When Auth-token Is Expired

TLDR

Fixed unexpected re-authentication prompts when starting qwen-code after auth tokens expire (6-hour validity). The issue was caused by SharedTokenManager incorrectly using empty credentials from qwenClient to determine if re-authentication was needed, always triggering re-auth when credentials were empty. This PR fixes the logic to properly check token validity from persistent storage.

修复了在认证令牌过期(6小时有效期)后启动qwen-code时出现的意外重新认证提示。问题是由于SharedTokenManager错误地使用qwenClient中的空凭据来判断是否需要重新认证,当凭据为空时总是触发重新认证。此PR修复了逻辑,使其能够正确地从持久化存储中检查令牌有效性。

Dive Deeper

Problem

Users were experiencing unexpected re-authentication prompts when starting qwen-code after auth tokens expired (6-hour validity period), even when valid refresh tokens were available in the persistent storage. The root cause was that SharedTokenManager incorrectly relied on qwenClient's empty credentials to determine authentication status. When starting a fresh qwen-code session, qwenClient has no loaded credentials, causing the system to assume no valid credentials exist and trigger unnecessary re-authentication instead of checking the persistent oauth_creds.json file.

用户在认证令牌过期(6小时有效期)后启动qwen-code时遇到意外的重新认证提示,即使持久化存储中有有效的刷新令牌。根本原因是SharedTokenManager错误地依赖qwenClient的空凭据来判断认证状态。当启动新的qwen-code会话时,qwenClient没有加载凭据,导致系统认为没有有效凭据存在,触发不必要的重新认证,而不是检查持久化的oauth_creds.json文件。

This was caused by:

这是由以下原因造成的:

  1. Empty credentials on startup - Fresh sessions had no loaded credentials in qwenClient to evaluate

  2. Incorrect authentication logic - System assumed empty qwenClient credentials meant no valid credentials

  3. Missing persistent storage check - Failed to verify tokens in oauth_creds.json before prompting re-auth

  4. 启动时凭据为空 - 新会话在qwenClient中没有加载的凭据可供评估

  5. 错误的认证逻辑 - 系统假设qwenClient凭据为空意味着没有有效凭据

  6. 缺少持久化存储检查 - 在提示重新认证之前未能验证oauth_creds.json中的令牌

const currentCredentials = qwenClient.getCredentials();

getCredentials(): QwenCredentials {

Solution

This PR implements several improvements to fix the empty credentials dependency issue and ensure proper token validation from persistent storage:

此PR实现了几个改进,以修复空凭据依赖问题并确保从持久化存储进行正确的令牌验证:

  1. Enhanced persistent storage checking - Always verify credentials from oauth_creds.json file before determining authentication status, not just relying on qwenClient's loaded credentials

增强的持久化存储检查 - 在确定认证状态之前始终从oauth_creds.json文件验证凭据,而不仅仅依赖qwenClient的已加载凭据

  1. Improved token refresh logic - Eliminated fallback to potentially stale local credentials in QwenOAuth2Client.getAccessToken() to ensure single source of truth through SharedTokenManager

改进的Token刷新逻辑 - 在QwenOAuth2Client.getAccessToken()中消除了对可能过时的本地凭据的回退,确保通过SharedTokenManager实现单一数据源

  1. Enhanced error handling with new CredentialsClearRequiredError class for better handling of 400 status errors during token refresh

增强的错误处理 - 新增CredentialsClearRequiredError类,更好地处理令牌刷新期间的400状态错误

  1. Improved SharedTokenManager synchronization:
    • Added promise-based locking for file check operations to prevent concurrent access
    • Implemented atomic cache state updates to avoid inconsistent intermediate states
    • Added atomic file write operations using temporary files and rename for consistency
    • Enhanced stale lock removal with atomic rename operations

改进的SharedTokenManager同步机制

  • 为文件检查操作添加基于Promise的锁定,防止并发访问
  • 实现原子缓存状态更新,避免不一致的中间状态
  • 使用临时文件和重命名添加原子文件写入操作,确保一致性
  • 通过原子重命名操作增强过期锁的移除

Key Changes

  • QwenContentGenerator: Simplified retry logic by removing nested try-catch and relying on SharedTokenManager
  • QwenOAuth2Client: Removed isTokenValid() method and fallback logic to prevent race conditions
  • SharedTokenManager: Added comprehensive synchronization mechanisms and atomic operations
  • Error Handling: New error class for clearer credential clearing requirements

Reviewer Test Plan

  1. Token Expiration Handling:

    • Set up Qwen authentication with valid credentials
    • Wait for access token to expire (or manually modify expiry time in oauth_creds.json)
    • Run any Qwen command - should automatically refresh without prompting for re-auth
    • Verify that oauth_creds.json is updated with new tokens
  2. Multi-Session Race Conditions:

    • Open multiple terminal sessions
    • Simultaneously run Qwen commands when tokens are expired
    • Verify only one session performs the refresh and others wait appropriately
    • Check that all sessions end up with the same valid credentials
  3. Invalid Refresh Token Handling:

    • Manually corrupt the refresh token in oauth_creds.json
    • Run a Qwen command
    • Should prompt for re-authentication with clear error message
    • Verify credentials file is properly cleared
  4. File System Edge Cases:

    • Test with concurrent file access (multiple processes)
    • Test with temporary file system issues (permissions, disk space)
    • Verify proper cleanup of temporary and lock files

Testing Matrix

🍏 🪟 🐧
npm run
npx
Docker
Podman - -
Seatbelt - -

Linked issues / bugs

Fixes #533
Fixes #524
Fixes #503
Fixes #378

@github-actions github-actions Bot added bug status/need-information More information is needed to resolve this issue. labels Sep 8, 2025
@github-actions

github-actions Bot commented Sep 8, 2025

Copy link
Copy Markdown
Contributor

📋 Review Summary

This PR fixes unexpected re-authentication prompts when starting qwen-code after auth tokens expire by improving the SharedTokenManager's handling of persistent storage credentials. The changes include enhanced synchronization mechanisms, better error handling with a new CredentialsClearRequiredError class, and elimination of race conditions that occurred due to reliance on empty qwenClient credentials.

🔍 General Feedback

  • The changes significantly improve the token management system by ensuring proper validation from persistent storage rather than relying on potentially empty client credentials
  • Good use of atomic operations and promise-based locking to prevent race conditions
  • Well-structured error handling with the new CredentialsClearRequiredError class
  • Comprehensive test coverage for the new functionality
  • Clear separation of concerns between the QwenOAuth2Client and SharedTokenManager

🎯 Specific Feedback

🔴 Critical

No critical issues identified in this review.

🟡 High

No high priority issues identified in this review.

🟢 Medium

  • File: packages/core/src/qwen/qwenContentGenerator.ts:157 - The retry logic in the executeWithCredentialManagement method has been simplified by removing the nested try-catch block. While this makes the code cleaner, ensure that this change doesn't affect error handling in edge cases. The previous implementation had more explicit error handling for refresh failures.

  • File: packages/core/src/qwen/qwenOAuth2.ts:270 - The removal of the fallback to cached tokens in getAccessToken may cause issues in scenarios where the shared manager fails but local credentials are still valid. Consider whether this change might impact offline scenarios or when the shared manager is temporarily unavailable.

  • File: packages/core/src/qwen/sharedTokenManager.ts:220 - The refreshPromise handling logic has been updated to use a local variable to avoid race conditions. This is a good improvement, but ensure that all edge cases are covered, especially when multiple concurrent requests occur.

🔵 Low

  • File: packages/core/src/qwen/sharedTokenManager.ts:432 - Consider adding more detailed logging for the atomic move operations to help with debugging in production environments.

  • File: packages/core/src/qwen/qwenOAuth2.ts:417 - The error message in CredentialsClearRequiredError could be more specific about what actions the user should take to resolve the issue.

  • File: packages/core/src/qwen/sharedTokenManager.ts:257 - The performFileCheck method could benefit from additional comments explaining why the time-based throttling is skipped during refresh operations.

✅ Highlights

  • Successfully addressed the root cause of unexpected re-authentication prompts by properly checking token validity from persistent storage
  • Implemented comprehensive synchronization mechanisms with promise-based locking to prevent concurrent access issues
  • Added atomic cache state updates and file write operations using temporary files and rename for consistency
  • Enhanced error handling with the new CredentialsClearRequiredError class for better handling of 400 status errors during token refresh
  • Improved test coverage with new test cases for the CredentialsClearRequiredError handling and atomic operations
  • Cleaned up race conditions in token refresh logic by eliminating fallback to potentially stale local credentials

@github-actions

github-actions Bot commented Sep 8, 2025

Copy link
Copy Markdown
Contributor

Code Coverage Summary

Package Lines Statements Functions Branches
CLI 73.4% 73.4% 78.41% 80.74%
Core 74.91% 74.91% 76.02% 82.55%
CLI Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |    73.4 |    80.74 |   78.41 |    73.4 |                   
 src               |   54.39 |       78 |   66.66 |   54.39 |                   
  gemini.tsx       |    31.4 |    66.66 |      50 |    31.4 | ...59-325,335-352 
  ...ractiveCli.ts |   93.85 |    72.72 |     100 |   93.85 | 34-37,68-70,116   
  ...ActiveAuth.ts |     100 |      100 |     100 |     100 |                   
 src/commands      |   94.11 |      100 |      50 |   94.11 |                   
  mcp.ts           |   94.11 |      100 |      50 |   94.11 | 26                
 src/commands/mcp  |   95.62 |       80 |    90.9 |   95.62 |                   
  add.ts           |    97.4 |    83.33 |     100 |    97.4 | 109-112,119       
  list.ts          |   90.56 |    80.76 |      80 |   90.56 | ...10-112,137-138 
  remove.ts        |     100 |    66.66 |     100 |     100 | 19-23             
 src/config        |   91.61 |    81.37 |   81.81 |   91.61 |                   
  auth.ts          |   79.16 |    90.47 |      25 |   79.16 | ...60,63-64,67-68 
  config.ts        |   96.53 |    87.09 |      70 |   96.53 | ...86,466,647-651 
  extension.ts     |   78.35 |    84.37 |     100 |   78.35 | ...07-111,120-121 
  keyBindings.ts   |     100 |      100 |     100 |     100 |                   
  sandboxConfig.ts |   51.35 |    16.66 |   66.66 |   51.35 | ...43,53-69,74-91 
  settings.ts      |   84.28 |       80 |   93.75 |   84.28 | ...93-394,467-468 
  ...ingsSchema.ts |     100 |      100 |     100 |     100 |                   
  ...tedFolders.ts |   90.67 |    76.92 |     100 |   90.67 | ...20,125-130,148 
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/patches       |       0 |        0 |       0 |       0 |                   
  is-in-ci.ts      |       0 |        0 |       0 |       0 | 1-17              
 src/services      |   61.58 |    88.13 |   72.22 |   61.58 |                   
  ...mandLoader.ts |     100 |      100 |     100 |     100 |                   
  ...andService.ts |     100 |      100 |     100 |     100 |                   
  ...mandLoader.ts |   92.17 |    91.89 |     100 |   92.17 | 173-178,252-259   
  ...omptLoader.ts |    9.39 |    57.14 |   33.33 |    9.39 | ...44-167,173-230 
  types.ts         |       0 |        0 |       0 |       0 | 1                 
 ...mpt-processors |   97.56 |    94.11 |     100 |   97.56 |                   
  ...tProcessor.ts |     100 |      100 |     100 |     100 |                   
  ...lProcessor.ts |   97.36 |    93.61 |     100 |   97.36 | 77-78,202-203     
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/test-utils    |    91.3 |    83.33 |      80 |    91.3 |                   
  ...omMatchers.ts |   69.69 |       50 |      50 |   69.69 | 31-34,36-38,44-46 
  ...andContext.ts |     100 |      100 |     100 |     100 |                   
  render.tsx       |     100 |      100 |     100 |     100 |                   
 src/ui            |   57.97 |    71.42 |      60 |   57.97 |                   
  App.tsx          |    56.6 |    60.95 |   33.33 |    56.6 | ...1249,1275-1304 
  ...tionNudge.tsx |    8.33 |      100 |       0 |    8.33 | 26-98             
  colors.ts        |   79.59 |      100 |   66.66 |   79.59 | ...43,45-46,48-49 
  constants.ts     |     100 |      100 |     100 |     100 |                   
  keyMatchers.ts   |   95.65 |    95.65 |     100 |   95.65 | 29-30             
  ...tic-colors.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/commands   |   81.99 |    82.21 |    83.6 |   81.99 |                   
  aboutCommand.ts  |     100 |       60 |     100 |     100 | 23-30             
  authCommand.ts   |     100 |      100 |     100 |     100 |                   
  bugCommand.ts    |   79.72 |     37.5 |     100 |   79.72 | 33-36,43,81-90    
  chatCommand.ts   |   94.21 |    83.33 |     100 |   94.21 | ...09-210,212-213 
  clearCommand.ts  |     100 |      100 |     100 |     100 |                   
  ...essCommand.ts |     100 |    88.88 |     100 |     100 | 69                
  copyCommand.ts   |     100 |      100 |     100 |     100 |                   
  corgiCommand.ts  |     100 |      100 |     100 |     100 |                   
  ...ryCommand.tsx |   71.77 |    73.07 |     100 |   71.77 | ...20-121,157-165 
  docsCommand.ts   |     100 |      100 |     100 |     100 |                   
  editorCommand.ts |     100 |      100 |     100 |     100 |                   
  ...onsCommand.ts |     100 |      100 |     100 |     100 |                   
  helpCommand.ts   |     100 |      100 |     100 |     100 |                   
  ideCommand.ts    |    62.6 |    66.66 |      60 |    62.6 | ...38-248,256-266 
  initCommand.ts   |   81.15 |    66.66 |     100 |   81.15 | 50,64-69,71-76    
  mcpCommand.ts    |   82.33 |    82.95 |   83.33 |   82.33 | ...84-385,438-445 
  memoryCommand.ts |   60.74 |    92.59 |   42.85 |   60.74 | ...15,222-243,267 
  ...acyCommand.ts |     100 |      100 |     100 |     100 |                   
  quitCommand.ts   |     100 |      100 |     100 |     100 |                   
  ...oreCommand.ts |   93.79 |    91.42 |     100 |   93.79 | 54-55,84-89       
  ...ngsCommand.ts |     100 |      100 |     100 |     100 |                   
  ...hubCommand.ts |   83.66 |    66.66 |     100 |   83.66 | ...57-160,163-166 
  statsCommand.ts  |   84.48 |       75 |     100 |   84.48 | 24-32             
  ...tupCommand.ts |     100 |      100 |     100 |     100 |                   
  themeCommand.ts  |     100 |      100 |     100 |     100 |                   
  toolsCommand.ts  |     100 |      100 |     100 |     100 |                   
  types.ts         |     100 |      100 |     100 |     100 |                   
  vimCommand.ts    |   44.44 |      100 |       0 |   44.44 | 14-24             
 src/ui/components |   64.18 |    82.43 |   65.62 |   64.18 |                   
  AboutBox.tsx     |     100 |       50 |     100 |     100 | 104               
  AsciiArt.ts      |     100 |      100 |     100 |     100 |                   
  AuthDialog.tsx   |   71.23 |       85 |      50 |   71.23 | ...25-129,137-143 
  ...nProgress.tsx |   16.66 |      100 |       0 |   16.66 | 18-62             
  ...Indicator.tsx |   15.15 |      100 |       0 |   15.15 | 17-47             
  ...ryDisplay.tsx |   89.47 |    33.33 |     100 |   89.47 | 20-21             
  ...ryDisplay.tsx |   92.04 |    94.44 |     100 |   92.04 | 82-87,92          
  ...geDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...gProfiler.tsx |      24 |      100 |       0 |      24 | 13-36             
  ...esDisplay.tsx |   10.52 |      100 |       0 |   10.52 | 24-82             
  ...ngsDialog.tsx |    7.29 |      100 |       0 |    7.29 | 27-172            
  ...ustDialog.tsx |     100 |      100 |     100 |     100 |                   
  Footer.tsx       |   84.82 |    82.35 |     100 |   84.82 | ...,89-91,136-143 
  ...ngSpinner.tsx |   86.66 |       75 |     100 |   86.66 | 31-32             
  Header.tsx       |   87.23 |    57.14 |     100 |   87.23 | 36-39,55,64       
  Help.tsx         |    3.27 |      100 |       0 |    3.27 | 17-173            
  ...emDisplay.tsx |   70.42 |    56.25 |     100 |   70.42 | ...59-64,85-92,95 
  InputPrompt.tsx  |   88.84 |    82.19 |     100 |   88.84 | ...98-500,601-605 
  ...Indicator.tsx |     100 |      100 |     100 |     100 |                   
  ...geDisplay.tsx |   25.92 |      100 |       0 |   25.92 | 14-36             
  ...tsDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...KeyPrompt.tsx |   62.33 |    31.25 |     100 |   62.33 | ...58-111,115-123 
  PrepareLabel.tsx |      60 |       80 |     100 |      60 | 35-48             
  ...hProgress.tsx |     100 |      100 |     100 |     100 |                   
  ...ryDisplay.tsx |     100 |      100 |     100 |     100 |                   
  ...ngsDialog.tsx |   31.75 |     62.5 |      25 |   31.75 | ...66-667,745-748 
  ...ionDialog.tsx |    85.5 |      100 |   33.33 |    85.5 | 37-40,45-52       
  ...Indicator.tsx |   44.44 |      100 |       0 |   44.44 | 12-17             
  ...MoreLines.tsx |      60 |       25 |     100 |      60 | 24-27,33-40       
  StatsDisplay.tsx |    98.5 |    93.33 |     100 |    98.5 | 177-179           
  ...nsDisplay.tsx |   88.05 |    71.42 |     100 |   88.05 | 36-41,96-98       
  ThemeDialog.tsx  |    5.33 |      100 |       0 |    5.33 | 34-310            
  Tips.tsx         |      16 |      100 |       0 |      16 | 17-45             
  TodoDisplay.tsx  |     100 |      100 |     100 |     100 |                   
  ...tsDisplay.tsx |     100 |     87.5 |     100 |     100 | 30-31             
  ...ification.tsx |   36.36 |      100 |       0 |   36.36 | 15-22             
 ...nents/messages |      65 |    80.71 |      60 |      65 |                   
  ...onMessage.tsx |   18.51 |      100 |       0 |   18.51 | 22-49             
  DiffRenderer.tsx |   96.41 |    83.14 |     100 |   96.41 | ...17-218,222,284 
  ErrorMessage.tsx |     100 |      100 |     100 |     100 |                   
  ...niMessage.tsx |   18.51 |      100 |       0 |   18.51 | 20-43             
  ...geContent.tsx |   19.04 |      100 |       0 |   19.04 | 25-43             
  InfoMessage.tsx  |     100 |      100 |     100 |     100 |                   
  ...onMessage.tsx |   37.55 |     62.5 |      20 |   37.55 | ...65-200,244-272 
  ...upMessage.tsx |   10.11 |      100 |       0 |   10.11 | 27-126            
  ToolMessage.tsx  |   85.12 |       75 |    87.5 |   85.12 | ...67,190,271-273 
  UserMessage.tsx  |     100 |      100 |     100 |     100 |                   
  ...llMessage.tsx |   36.36 |      100 |       0 |   36.36 | 17-25             
 ...ponents/shared |   80.42 |     76.6 |   95.45 |   80.42 |                   
  MaxSizedBox.tsx  |   81.14 |     82.2 |   88.88 |   81.14 | ...08-509,614-615 
  ...tonSelect.tsx |   75.65 |    71.05 |     100 |   75.65 | ...98,121-157,226 
  text-buffer.ts   |   78.02 |    78.08 |   96.77 |   78.02 | ...1841,1868,1918 
  ...er-actions.ts |   86.71 |    67.79 |     100 |   86.71 | ...08-609,810-812 
 src/ui/contexts   |   81.53 |     83.2 |     100 |   81.53 |                   
  ...ssContext.tsx |   78.57 |    85.26 |     100 |   78.57 | ...16-323,416-418 
  ...owContext.tsx |   91.07 |    81.81 |     100 |   91.07 | 46-47,59-61       
  ...onContext.tsx |    94.2 |      100 |     100 |    94.2 | 106-109           
  ...gsContext.tsx |   83.33 |       50 |     100 |   83.33 | 17-18             
  ...ngContext.tsx |   71.42 |       50 |     100 |   71.42 | 17-20             
  ...deContext.tsx |   76.08 |       50 |     100 |   76.08 | 46-47,51-58,76-77 
 src/ui/editors    |   93.18 |    85.71 |   66.66 |   93.18 |                   
  ...ngsManager.ts |   93.18 |    85.71 |   66.66 |   93.18 | 48,62-63          
 src/ui/hooks      |   82.33 |    82.24 |   89.18 |   82.33 |                   
  ...dProcessor.ts |   78.28 |       79 |     100 |   78.28 | ...52-455,466-484 
  ...dProcessor.ts |   96.32 |    76.31 |     100 |   96.32 | ...13-214,219-220 
  ...dProcessor.ts |   81.57 |    71.26 |   71.42 |   81.57 | ...85-389,455-483 
  ...Completion.ts |   92.69 |    89.09 |     100 |   92.69 | ...89-190,223-226 
  ...uthCommand.ts |    7.46 |      100 |       0 |    7.46 | 18-92             
  ...tIndicator.ts |     100 |      100 |     100 |     100 |                   
  ...ketedPaste.ts |     100 |      100 |     100 |     100 |                   
  ...ompletion.tsx |   94.73 |    81.81 |     100 |   94.73 | ...98-199,201-202 
  useCompletion.ts |    92.4 |     87.5 |     100 |    92.4 | ...,95-96,100-101 
  ...leMessages.ts |   98.68 |       95 |     100 |   98.68 | 55                
  ...orSettings.ts |     100 |      100 |     100 |     100 |                   
  useFocus.ts      |     100 |      100 |     100 |     100 |                   
  ...olderTrust.ts |     100 |      100 |     100 |     100 |                   
  ...miniStream.ts |   74.55 |    72.54 |     100 |   74.55 | ...3-884,914-1004 
  ...BranchName.ts |   91.66 |    84.61 |     100 |   91.66 | 57-63             
  ...oryManager.ts |   98.41 |    93.33 |     100 |   98.41 | 43                
  ...putHistory.ts |    92.5 |    85.71 |     100 |    92.5 | 62-63,71,93-95    
  useKeypress.ts   |     100 |      100 |     100 |     100 |                   
  ...rdProtocol.ts |     100 |      100 |     100 |     100 |                   
  ...gIndicator.ts |     100 |      100 |     100 |     100 |                   
  useLogger.ts     |      25 |      100 |       0 |      25 | 14-32             
  ...ssageQueue.ts |     100 |      100 |     100 |     100 |                   
  ...raseCycler.ts |   95.45 |       75 |     100 |   95.45 | ...64-165,183-185 
  ...cySettings.ts |   85.08 |       75 |     100 |   85.08 | ...15-116,127-138 
  useQwenAuth.ts   |     100 |      100 |     100 |     100 |                   
  ...lScheduler.ts |   78.92 |    94.44 |     100 |   78.92 | ...01-204,290-300 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-7               
  ...ompletion.tsx |     100 |     92.3 |     100 |     100 | 77                
  ...ngsCommand.ts |    87.5 |      100 |     100 |    87.5 | 13,17             
  ...ellHistory.ts |   91.26 |       80 |     100 |   91.26 | ...67,112-113,123 
  ...oryCommand.ts |       0 |        0 |       0 |       0 | 1-75              
  ...Completion.ts |      94 |    92.53 |     100 |      94 | 58-61,69-72,93    
  ...tateAndRef.ts |   13.63 |      100 |       0 |   13.63 | 16-36             
  ...rminalSize.ts |   18.18 |      100 |       0 |   18.18 | 12-32             
  ...emeCommand.ts |   46.98 |       75 |     100 |   46.98 | ...4,70-71,77-100 
  useTimer.ts      |   88.09 |    85.71 |     100 |   88.09 | 44-45,51-53       
  vim.ts           |   83.57 |     79.5 |     100 |   83.57 | ...38,742-750,759 
 src/ui/privacy    |   14.52 |      100 |       0 |   14.52 |                   
  ...acyNotice.tsx |   10.38 |      100 |       0 |   10.38 | 21-117            
  ...acyNotice.tsx |   14.28 |      100 |       0 |   14.28 | 16-59             
  ...acyNotice.tsx |   12.19 |      100 |       0 |   12.19 | 16-62             
  ...acyNotice.tsx |   30.76 |      100 |       0 |   30.76 | 19-36,39-41       
 src/ui/themes     |   99.52 |    66.35 |     100 |   99.52 |                   
  ansi-light.ts    |     100 |      100 |     100 |     100 |                   
  ansi.ts          |     100 |      100 |     100 |     100 |                   
  atom-one-dark.ts |     100 |      100 |     100 |     100 |                   
  ayu-light.ts     |     100 |      100 |     100 |     100 |                   
  ayu.ts           |     100 |      100 |     100 |     100 |                   
  color-utils.ts   |     100 |      100 |     100 |     100 |                   
  default-light.ts |     100 |      100 |     100 |     100 |                   
  default.ts       |     100 |      100 |     100 |     100 |                   
  dracula.ts       |     100 |      100 |     100 |     100 |                   
  github-dark.ts   |     100 |      100 |     100 |     100 |                   
  github-light.ts  |     100 |      100 |     100 |     100 |                   
  googlecode.ts    |     100 |      100 |     100 |     100 |                   
  no-color.ts      |     100 |      100 |     100 |     100 |                   
  qwen-dark.ts     |     100 |      100 |     100 |     100 |                   
  qwen-light.ts    |     100 |      100 |     100 |     100 |                   
  ...tic-tokens.ts |     100 |      100 |     100 |     100 |                   
  ...-of-purple.ts |     100 |      100 |     100 |     100 |                   
  theme-manager.ts |   91.66 |    79.54 |     100 |   91.66 | ...03,207,234-235 
  theme.ts         |     100 |     41.3 |     100 |     100 | 225-240           
  xcode.ts         |     100 |      100 |     100 |     100 |                   
 src/ui/utils      |   65.14 |    79.59 |   81.96 |   65.14 |                   
  ...Colorizer.tsx |   79.31 |    83.87 |     100 |   79.31 | ...51-154,190-216 
  ...olePatcher.ts |      96 |       75 |     100 |      96 | 59-60             
  ...nRenderer.tsx |   52.85 |    27.27 |     100 |   52.85 | ...26-132,142-144 
  ...wnDisplay.tsx |   85.84 |    87.69 |     100 |   85.84 | ...72-280,313-336 
  ...eRenderer.tsx |   78.09 |    76.19 |     100 |   78.09 | 55-83             
  ...boardUtils.ts |   32.25 |     37.5 |     100 |   32.25 | ...55-114,129-145 
  commandUtils.ts  |   97.36 |     92.3 |     100 |   97.36 | 68,72             
  computeStats.ts  |     100 |      100 |     100 |     100 |                   
  displayUtils.ts  |     100 |      100 |     100 |     100 |                   
  formatters.ts    |   90.47 |    95.83 |     100 |   90.47 | 57-60             
  isNarrowWidth.ts |     100 |      100 |     100 |     100 |                   
  ...olDetector.ts |   13.88 |      100 |      50 |   13.88 | 16-97             
  ...nUtilities.ts |   69.84 |    85.71 |     100 |   69.84 | 75-91,100-101     
  ...mConstants.ts |     100 |      100 |     100 |     100 |                   
  terminalSetup.ts |       4 |      100 |       0 |       4 | 40-342            
  textUtils.ts     |   88.88 |    83.33 |     100 |   88.88 | 14-15             
  updateCheck.ts   |     100 |    80.95 |     100 |     100 | 26-38             
 src/utils         |   44.66 |    90.99 |   84.21 |   44.66 |                   
  checks.ts        |   33.33 |      100 |       0 |   33.33 | 23-28             
  cleanup.ts       |      96 |    85.71 |     100 |      96 | 35                
  ...ScopeUtils.ts |   97.67 |     87.5 |     100 |   97.67 | 62                
  events.ts        |     100 |      100 |     100 |     100 |                   
  gitUtils.ts      |   94.66 |    82.35 |     100 |   94.66 | 75-78             
  ...AutoUpdate.ts |   81.14 |    95.23 |   66.66 |   81.14 | 85-99,125-132     
  ...lationInfo.ts |     100 |      100 |     100 |     100 |                   
  package.ts       |   88.88 |       80 |     100 |   88.88 | 33-34             
  readStdin.ts     |    2.43 |      100 |       0 |    2.43 | 7-51              
  resolvePath.ts   |   66.66 |       25 |     100 |   66.66 | 12-13,16,18-19    
  sandbox.ts       |       0 |        0 |       0 |       0 | 1-962             
  settingsUtils.ts |   80.52 |     92.3 |   93.33 |   80.52 | ...74-416,455-456 
  spawnWrapper.ts  |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |   23.07 |      100 |       0 |   23.07 | 14-40             
  ...entEmitter.ts |     100 |      100 |     100 |     100 |                   
  ...upWarnings.ts |     100 |      100 |     100 |     100 |                   
  version.ts       |     100 |       50 |     100 |     100 | 11                
 ...ed-integration |   24.81 |        0 |       0 |   24.81 |                   
  acp.ts           |    2.89 |        0 |       0 |    2.89 | ...52-288,291-338 
  ...temService.ts |   19.35 |      100 |       0 |   19.35 | 15-19,22-34,37-46 
  schema.ts        |     100 |      100 |     100 |     100 |                   
  ...ntegration.ts |    3.09 |        0 |       0 |    3.09 | ...07-879,894-944 
-------------------|---------|----------|---------|---------|-------------------
Core Package - Full Text Report
-------------------|---------|----------|---------|---------|-------------------
File               | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-------------------|---------|----------|---------|---------|-------------------
All files          |   74.91 |    82.55 |   76.02 |   74.91 |                   
 src               |     100 |      100 |     100 |     100 |                   
  index.ts         |     100 |      100 |     100 |     100 |                   
 src/__mocks__/fs  |     100 |      100 |     100 |     100 |                   
  promises.ts      |     100 |      100 |     100 |     100 |                   
 src/code_assist   |   73.54 |    77.19 |    75.6 |   73.54 |                   
  codeAssist.ts    |   18.51 |      100 |       0 |   18.51 | 13-35             
  converter.ts     |   89.31 |    96.15 |   81.81 |   89.31 | 179-183,202-212   
  oauth2.ts        |   78.33 |    66.07 |    92.3 |   78.33 | ...27-433,440-441 
  server.ts        |   50.29 |       80 |   53.84 |   50.29 | ...73-214,217-220 
  setup.ts         |   86.66 |    78.94 |     100 |   86.66 | ...,92-94,118-124 
  types.ts         |     100 |      100 |     100 |     100 |                   
 src/config        |   74.12 |    84.37 |   43.75 |   74.12 |                   
  config.ts        |   73.81 |    84.37 |   43.75 |   73.81 | ...96-897,917-918 
  models.ts        |     100 |      100 |     100 |     100 |                   
 src/core          |   78.72 |    77.86 |      80 |   78.72 |                   
  client.ts        |   79.95 |    80.74 |      75 |   79.95 | ...36,939,946-995 
  ...tGenerator.ts |   68.96 |    72.41 |     100 |   68.96 | ...51,185,205-248 
  ...lScheduler.ts |   70.25 |    75.89 |    82.6 |   70.25 | ...72-882,959-963 
  geminiChat.ts    |   70.15 |    81.81 |   61.29 |   70.15 | ...58-759,762-763 
  geminiRequest.ts |     100 |      100 |     100 |     100 |                   
  logger.ts        |   82.84 |    81.81 |     100 |   82.84 | ...41-345,385-396 
  ...tGenerator.ts |   16.32 |      100 |      20 |   16.32 | ...52-181,184-185 
  ...olExecutor.ts |      90 |    70.83 |     100 |      90 | ...,87-96,114,150 
  ...tGenerator.ts |   87.41 |    72.08 |     100 |   87.41 | ...1699,1702,1704 
  prompts.ts       |   93.95 |    88.23 |      75 |   93.95 | ...,97-98,485-542 
  subagent.ts      |   92.09 |    83.75 |     100 |   92.09 | ...00-608,651-652 
  tokenLimits.ts   |   14.28 |      100 |       0 |   14.28 | 15-32             
  turn.ts          |   83.68 |    83.33 |     100 |   83.68 | ...68-271,284-285 
 src/generated     |     100 |      100 |     100 |     100 |                   
  git-commit.ts    |     100 |      100 |     100 |     100 |                   
 src/ide           |   39.11 |    89.06 |   41.46 |   39.11 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  detect-ide.ts    |   49.35 |      100 |      50 |   49.35 | 23-62             
  ide-client.ts    |   26.84 |    92.85 |   20.83 |   26.84 | ...18-449,452-456 
  ide-installer.ts |   56.73 |     62.5 |     100 |   56.73 | ...,90-91,113-125 
  ideContext.ts    |   83.65 |      100 |     100 |   83.65 | 74-90             
  process-utils.ts |     7.6 |      100 |       0 |     7.6 | 22-157            
 src/mcp           |   73.99 |    67.08 |   81.57 |   73.99 |                   
  ...h-provider.ts |   86.36 |      100 |   33.33 |   86.36 | ...85,89,93,97-98 
  ...h-provider.ts |   74.19 |    51.64 |     100 |   74.19 | ...04-808,815-817 
  ...en-storage.ts |     100 |      100 |     100 |     100 |                   
  oauth-utils.ts   |   54.72 |    69.23 |      90 |   54.72 | ...16-240,265-314 
 src/mocks         |     100 |      100 |     100 |     100 |                   
  msw.ts           |     100 |      100 |     100 |     100 |                   
 src/prompts       |   26.41 |      100 |      25 |   26.41 |                   
  mcp-prompts.ts   |   18.18 |      100 |       0 |   18.18 | 11-19             
  ...t-registry.ts |   28.57 |      100 |   28.57 |   28.57 | ...42,48-55,68-73 
 src/qwen          |   86.93 |    80.55 |   96.96 |   86.93 |                   
  ...tGenerator.ts |    98.7 |    98.27 |     100 |    98.7 | 96-97             
  qwenOAuth2.ts    |   85.87 |    75.86 |    92.3 |   85.87 | ...69,799-810,849 
  ...kenManager.ts |   84.27 |    76.31 |     100 |   84.27 | ...77-682,703-708 
 src/services      |   89.12 |    86.95 |   91.52 |   89.12 |                   
  ...ingService.ts |   76.15 |     61.9 |     100 |   76.15 | ...03-405,429-431 
  ...eryService.ts |   93.33 |    88.46 |   85.71 |   93.33 | 31,39,84,109-110  
  ...temService.ts |     100 |      100 |     100 |     100 |                   
  gitService.ts    |   77.52 |      100 |      60 |   77.52 | ...08-112,115-119 
  ...ionService.ts |   99.23 |     97.1 |     100 |   99.23 | 287-288           
  ...ionService.ts |   92.19 |    88.15 |     100 |   92.19 | ...67-368,444-458 
 src/telemetry     |   66.26 |    85.96 |   72.41 |   66.26 |                   
  constants.ts     |     100 |      100 |     100 |     100 |                   
  ...-exporters.ts |   26.47 |      100 |       0 |   26.47 | ...80,83-84,87-88 
  index.ts         |     100 |      100 |     100 |     100 |                   
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-111             
  ...t.circular.ts |       0 |        0 |       0 |       0 | 1-125             
  loggers.ts       |   57.63 |    76.92 |   55.55 |   57.63 | ...65-484,487-506 
  metrics.ts       |   65.13 |    96.66 |      50 |   65.13 | ...69-271,277-279 
  sdk.ts           |   78.08 |    47.05 |     100 |   78.08 | ...82,186-187,189 
  ...l-decision.ts |     100 |      100 |     100 |     100 |                   
  types.ts         |   90.68 |     91.8 |   93.93 |   90.68 | ...14-325,352-361 
  uiTelemetry.ts   |    99.3 |       96 |     100 |    99.3 | 126               
 ...learcut-logger |   42.77 |    63.82 |    37.5 |   42.77 |                   
  ...cut-logger.ts |   35.58 |    63.04 |    37.5 |   35.58 | ...46-847,850-853 
  ...tadata-key.ts |     100 |      100 |     100 |     100 |                   
 ...ry/qwen-logger |   71.29 |    82.53 |   72.97 |   71.29 |                   
  event-types.ts   |       0 |        0 |       0 |       0 |                   
  qwen-logger.ts   |   71.29 |    82.25 |   72.22 |   71.29 | ...56-661,703-704 
 src/test-utils    |   88.75 |    95.45 |   80.95 |   88.75 |                   
  config.ts        |     100 |      100 |     100 |     100 |                   
  ...aceContext.ts |     100 |      100 |     100 |     100 |                   
  tools.ts         |   85.12 |    94.44 |   78.94 |   85.12 | ...59,127,131-132 
 src/tools         |   70.33 |    82.04 |   77.48 |   70.33 |                   
  diffOptions.ts   |     100 |      100 |     100 |     100 |                   
  edit.ts          |   81.18 |    84.81 |   85.71 |   81.18 | ...13-414,504-547 
  glob.ts          |   85.77 |    78.26 |    87.5 |   85.77 | ...34-241,312-313 
  grep.ts          |    61.4 |    80.64 |   78.57 |    61.4 | ...45-649,659-660 
  ls.ts            |   97.66 |    91.66 |     100 |   97.66 | 135-139           
  ...nt-manager.ts |   79.74 |    83.33 |      80 |   79.74 | ...98-105,113-114 
  mcp-client.ts    |   30.93 |    77.77 |   48.38 |   30.93 | ...1341,1345-1348 
  mcp-tool.ts      |   93.82 |    92.75 |   88.23 |   93.82 | ...85-195,257-258 
  memoryTool.ts    |   75.59 |    84.37 |   90.47 |   75.59 | ...38-349,483-567 
  ...iable-tool.ts |     100 |    84.61 |     100 |     100 | 94,101            
  read-file.ts     |      97 |       95 |    87.5 |      97 | 69-70,110-112     
  ...many-files.ts |   79.44 |    72.13 |   83.33 |   79.44 | ...14-515,522-523 
  shell.ts         |   87.78 |     78.4 |     100 |   87.78 | ...54-455,466-467 
  todoWrite.ts     |   78.21 |    79.48 |   71.42 |   78.21 | ...74-399,420-421 
  tool-error.ts    |     100 |      100 |     100 |     100 |                   
  tool-registry.ts |   49.24 |    66.66 |   57.14 |   49.24 | ...01-403,426-434 
  tools.ts         |   85.78 |     87.8 |   73.33 |   85.78 | ...57-358,374-380 
  web-fetch.ts     |    49.4 |    69.23 |      70 |    49.4 | ...23-224,226-227 
  web-search.ts    |   90.16 |    82.14 |     100 |   90.16 | 68-74,93-97       
  write-file.ts    |   82.27 |    79.68 |      75 |   82.27 | ...48-451,463-499 
 src/utils         |   84.15 |    87.98 |   88.08 |   84.15 |                   
  LruCache.ts      |   70.96 |     62.5 |     100 |   70.96 | 20-22,28,30-34    
  bfsFileSearch.ts |   89.02 |    90.47 |     100 |   89.02 | 86-94             
  browser.ts       |    7.69 |      100 |       0 |    7.69 | 17-56             
  editCorrector.ts |    77.3 |    61.11 |   91.66 |    77.3 | ...65-677,711,725 
  editor.ts        |   97.63 |    94.54 |     100 |   97.63 | 154,224,227-228   
  ...entContext.ts |     100 |      100 |     100 |     100 |                   
  errorParsing.ts  |     100 |     92.3 |     100 |     100 | 76,80,86          
  ...rReporting.ts |   83.72 |    84.61 |     100 |   83.72 | 82-86,107-115     
  errors.ts        |   39.02 |       60 |      75 |   39.02 | 21-25,41-57,61-67 
  fetch.ts         |   34.04 |      100 |       0 |   34.04 | 22-27,31-57       
  fileUtils.ts     |   95.27 |       90 |     100 |   95.27 | ...06-111,359-365 
  formatters.ts    |   54.54 |       50 |     100 |   54.54 | 12-16             
  ...eUtilities.ts |   96.03 |    95.83 |     100 |   96.03 | 28-29,57-58       
  ...rStructure.ts |   95.96 |    94.93 |     100 |   95.96 | ...14-117,345-347 
  getPty.ts        |    12.5 |      100 |       0 |    12.5 | 21-34             
  ...noreParser.ts |     100 |    89.47 |     100 |     100 | 27,47             
  gitUtils.ts      |   51.21 |     90.9 |      50 |   51.21 | 40-41,50-73       
  ...yDiscovery.ts |   83.56 |    74.07 |   77.77 |   83.56 | ...53-354,357-358 
  ...tProcessor.ts |   93.63 |    88.75 |   84.61 |   93.63 | ...81-282,385-386 
  ...Inspectors.ts |     100 |      100 |     100 |     100 |                   
  ...kerChecker.ts |   83.33 |    83.33 |     100 |   83.33 | 64-65,75-80,88-94 
  openaiLogger.ts  |    19.1 |      100 |   33.33 |    19.1 | ...96-116,124-131 
  partUtils.ts     |     100 |      100 |     100 |     100 |                   
  paths.ts         |   85.84 |    91.42 |      80 |   85.84 | ...92-193,201-202 
  ...rDetection.ts |   76.85 |    84.31 |     100 |   76.85 | ...25-126,166-167 
  retry.ts         |   63.98 |    76.19 |     100 |   63.98 | ...74-294,339-354 
  safeJsonParse.ts |     100 |      100 |     100 |     100 |                   
  ...nStringify.ts |     100 |      100 |     100 |     100 |                   
  ...aValidator.ts |      80 |    57.14 |     100 |      80 | 23-24,26-27       
  ...r-launcher.ts |   76.52 |     87.5 |   66.66 |   76.52 | ...33,135,153-191 
  session.ts       |     100 |      100 |     100 |     100 |                   
  shell-utils.ts   |   98.52 |     97.7 |     100 |   98.52 | 172-173,190-191   
  summarizer.ts    |     100 |    88.88 |     100 |     100 | 91                
  ...emEncoding.ts |      98 |    94.11 |     100 |      98 | 106-107           
  testUtils.ts     |   84.44 |    72.72 |   83.33 |   84.44 | 27-28,34-35,70-72 
  textUtils.ts     |    12.5 |      100 |       0 |    12.5 | 15-34             
  user_account.ts  |   96.87 |    94.44 |     100 |   96.87 | 36-38             
  user_id.ts       |    75.6 |       60 |      75 |    75.6 | 19-20,28-33,46-48 
  ...aceContext.ts |   96.63 |     97.5 |    92.3 |   96.63 | 88-89,103-104     
 ...ils/filesearch |    96.1 |     91.2 |     100 |    96.1 |                   
  crawlCache.ts    |     100 |      100 |     100 |     100 |                   
  crawler.ts       |   96.22 |     92.3 |     100 |   96.22 | 66-67             
  fileSearch.ts    |   92.94 |    86.56 |     100 |   92.94 | ...17-218,220-221 
  ignore.ts        |     100 |      100 |     100 |     100 |                   
  result-cache.ts  |     100 |     92.3 |     100 |     100 | 46                
-------------------|---------|----------|---------|---------|-------------------

For detailed HTML reports, please see the 'coverage-reports-22.x-ubuntu-latest' artifact from the main CI run.

@Mingholy Mingholy marked this pull request as ready for review September 9, 2025 03:06
@Mingholy Mingholy merged commit 621fe2e into main Sep 9, 2025
18 checks passed
zhutao100 pushed a commit to zhutao100/qwen-code that referenced this pull request Sep 9, 2025
@Mingholy Mingholy mentioned this pull request Sep 9, 2025
xaelistic pushed a commit to xaelistic/qwen-code that referenced this pull request Jun 7, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

status/need-information More information is needed to resolve this issue.

Projects

None yet

1 participant