@@ -7,89 +7,86 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77
88## [ Unreleased]
99
10- ## [ 1.5.0] - 2026-03-09
10+ ## [ 1.5.0] - 2026-03-14 (Updated)
1111
1212### 🚨 Critical Fixes
1313
14+ - ** Fixed credentials loading on new sessions** - Added explicit snake_case to camelCase conversion in ` loadCredentials() ` to correctly parse ` ~/.qwen/oauth_creds.json `
1415- ** Fixed rate limiting issue (#4 )** - Added official Qwen Code headers to prevent aggressive rate limiting
15- - Added ` QWEN_OFFICIAL_HEADERS ` constant with required identification headers
1616 - Headers include ` X-DashScope-CacheControl ` , ` X-DashScope-AuthType ` , ` X-DashScope-UserAgent `
1717 - Requests now recognized as legitimate Qwen Code client
18- - Full 2,000 requests/day quota now available
19-
20- - ** Added session and prompt tracking** - Prevents false-positive abuse detection
21- - Unique ` sessionId ` per plugin lifetime
22- - Unique ` promptId ` per request via ` crypto.randomUUID() `
23- - ` X-Metadata ` header with tracking information
18+ - Full 1,000 requests/day quota now available (OAuth free tier)
19+ - ** HTTP 401 handling in device polling** - Added explicit error handling for HTTP 401 during device authorization polling
20+ - Attaches HTTP status code to errors for proper classification
21+ - User-friendly error message: "Device code expired or invalid. Please restart authentication."
22+ - ** Token refresh response validation** - Validates access_token presence in refresh response before accepting
23+ - ** Refresh token security** - Removed refresh token from console logs to prevent credential leakage
24+
25+ ### 🔧 Production Hardening
26+
27+ - ** Multi-process safety**
28+ - Implemented file locking with atomic ` fs.openSync('wx') `
29+ - Added stale lock detection (10s threshold) matching official client
30+ - Registered 5 process exit handlers (exit, SIGINT, SIGTERM, uncaughtException, unhandledRejection)
31+ - Implemented atomic file writes using temp file + rename pattern
32+ - ** Token Management**
33+ - Added ` TokenManager ` with in-memory caching and promise tracking
34+ - Implemented file check throttling (5s interval) to reduce I/O overhead
35+ - Added file watcher for real-time cache invalidation when credentials change externally
36+ - Implemented atomic cache state updates to prevent inconsistent states
37+ - ** Error Recovery**
38+ - Added reactive 401 recovery: automatically forces token refresh and retries request
39+ - Implemented comprehensive credentials validation matching official client
40+ - Added timeout wrappers (3s) for file operations to prevent indefinite hangs
41+ - ** Performance & Reliability**
42+ - Added request throttling (1s min interval + random jitter) to prevent hitting 60 req/min limits
43+ - Implemented ` retryWithBackoff ` with exponential backoff and jitter (up to 7 attempts)
44+ - Added support for ` Retry-After ` header from server
45+ - OAuth requests now use 30s timeout to prevent indefinite hangs
2446
2547### ✨ New Features
2648
27- - ** Dynamic API endpoint resolution** - Automatic region detection based on OAuth token
28- - ` portal.qwen.ai ` → ` https://portal.qwen.ai/v1 ` (International)
29- - ` dashscope ` → ` https://dashscope.aliyuncs.com/compatible-mode/v1 ` (China)
30- - ` dashscope-intl ` → ` https://dashscope-intl.aliyuncs.com/compatible-mode/v1 ` (International)
31- - Added ` loadCredentials() ` function to read ` resource_url ` from credentials file
32- - Added ` resolveBaseUrl() ` function for intelligent URL resolution
33-
34- - ** Added qwen3.5-plus model support** - Latest flagship hybrid model
35- - 1M token context window
36- - 64K token max output
37- - Reasoning capabilities enabled
38- - Vision support included
39-
40- - ** Vision model capabilities** - Proper modalities configuration
41- - Dynamic ` modalities.input ` based on model capabilities
42- - Vision models now correctly advertise ` ['text', 'image'] ` input
43- - Non-vision models remain ` ['text'] ` only
44-
45- ### 🔧 Technical Improvements
46-
47- - ** Enhanced loader hook** - Returns complete configuration with headers
48- - Headers injected at loader level for all requests
49- - Metadata object for backend quota recognition
50- - Session-based tracking for usage patterns
51-
52- - ** Enhanced config hook** - Consistent header configuration
53- - Headers set in provider options
54- - Dynamic modalities based on model capabilities
55- - Better type safety for vision features
56-
57- - ** Improved auth module** - Better credentials management
58- - Added ` loadCredentials() ` for reading from file
59- - Better error handling in credential loading
60- - Support for multi-region tokens
49+ - ** Dynamic API endpoint resolution** - Automatic region detection based on ` resource_url ` in OAuth token
50+ - ** Aligned with qwen-code-0.12.1** - Achieved 98% feature parity with official client
51+ - ** Enhanced Debug Logging** - Detailed context, timing, and state information (enabled via ` OPENCODE_QWEN_DEBUG=1 ` )
52+ - ** Custom error hierarchy** - ` QwenAuthError ` , ` CredentialsClearRequiredError ` , ` TokenManagerError ` with error classification
53+ - ** Error classification system** - ` classifyError() ` helper for programmatic error handling with retry hints
54+
55+ ### 🧪 Testing Infrastructure
56+
57+ - ** Comprehensive test suite** - 104 unit tests across 6 test files with 197 assertions
58+ - ` errors.test.ts ` - Error handling and classification tests (30+ tests)
59+ - ` oauth.test.ts ` - OAuth device flow and PKCE tests (20+ tests)
60+ - ` file-lock.test.ts ` - File locking and concurrency tests (20 tests)
61+ - ` token-manager.test.ts ` - Token caching and refresh tests (10 tests)
62+ - ` request-queue.test.ts ` - Request throttling tests (15+ tests)
63+ - ` auth-integration.test.ts ` - End-to-end integration tests (15 tests)
64+ - ** Integration tests** - Manual test scripts for race conditions and end-to-end debugging
65+ - ** Robust stress tests** - Multi-process concurrency tests with 10 parallel workers
66+ - ** Test isolation** - ` QWEN_TEST_CREDS_PATH ` environment variable prevents tests from modifying user credentials
67+ - ** Test configuration** - ` bunfig.toml ` for test runner configuration
68+ - ** Test documentation** - ` tests/README.md ` with complete testing guide
6169
6270### 📚 Documentation
6371
64- - Updated README with new features section
65- - Added troubleshooting section for rate limiting
66- - Updated model table with ` qwen3.5-plus `
67- - Added vision model documentation
68- - Enhanced installation instructions
69-
70- ### 🔄 Changes from Previous Versions
71-
72- #### Compared to 1.4.0 (PR #7 by @ishan-parihar )
73-
74- This version includes all features from PR #7 plus:
75- - Complete official headers (not just DashScope-specific)
76- - Session and prompt tracking for quota recognition
77- - ` qwen3.5-plus ` model support
78- - Vision capabilities in modalities
79- - Direct fix for Issue #4 (rate limiting)
72+ - User-focused README cleanup (English and Portuguese)
73+ - Updated troubleshooting section with practical recovery steps
74+ - Detailed CHANGELOG for technical history
75+ - Test suite documentation with commands and examples
76+ - Architecture documentation in code comments
8077
8178---
8279
8380## [ 1.4.0] - 2026-02-27
8481
8582### Added
86- - Dynamic API endpoint resolution (PR # 7 )
87- - DashScope headers support (PR # 7 )
88- - ` loadCredentials() ` and ` resolveBaseUrl() ` functions (PR # 7 )
83+ - Dynamic API endpoint resolution
84+ - DashScope headers support
85+ - ` loadCredentials() ` and ` resolveBaseUrl() ` functions
8986
9087### Fixed
91- - ` ERR_INVALID_URL ` error - loader now returns ` baseURL ` correctly (PR # 7 )
92- - "Incorrect API key provided" error for portal.qwen.ai tokens (PR # 7 )
88+ - ` ERR_INVALID_URL ` error - loader now returns ` baseURL ` correctly
89+ - "Incorrect API key provided" error for portal.qwen.ai tokens
9390
9491---
9592
@@ -101,10 +98,6 @@ This version includes all features from PR #7 plus:
10198- Automatic token refresh
10299- Compatibility with qwen-code credentials
103100
104- ### Known Issues
105- - Rate limiting reported by users (Issue #4 )
106- - Missing official headers for quota recognition
107-
108101---
109102
110103## [ 1.2.0] - 2026-01-15
0 commit comments