opencode-qwen-oauth 2.1.0 → 2.3.0

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.
@@ -0,0 +1,438 @@
1
+ /**
2
+ * Diagnostic utilities for testing Qwen OAuth endpoints
3
+ */
4
+ import { QWEN_OAUTH_BASE_URL, QWEN_DEVICE_CODE_ENDPOINT, QWEN_TOKEN_ENDPOINT, QWEN_API_BASE_URL, QWEN_CLIENT_ID, QWEN_SCOPES, } from "./constants.js";
5
+ import { createPkcePair } from "./pkce.js";
6
+ import { openBrowser } from "./browser.js";
7
+ import { writeFileSync, mkdirSync, existsSync, readFileSync } from "node:fs";
8
+ import { join } from "node:path";
9
+ import { homedir } from "node:os";
10
+ /**
11
+ * Test if Qwen OAuth device code endpoint is accessible
12
+ */
13
+ export async function testDeviceCodeEndpoint() {
14
+ const startTime = Date.now();
15
+ const endpoint = `${QWEN_OAUTH_BASE_URL}${QWEN_DEVICE_CODE_ENDPOINT}`;
16
+ try {
17
+ const { verifier, challenge } = createPkcePair();
18
+ const params = new URLSearchParams({
19
+ client_id: QWEN_CLIENT_ID,
20
+ scope: QWEN_SCOPES.join(" "),
21
+ code_challenge: challenge,
22
+ code_challenge_method: "S256",
23
+ });
24
+ const response = await fetch(endpoint, {
25
+ method: "POST",
26
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
27
+ body: params.toString(),
28
+ });
29
+ const responseTime = Date.now() - startTime;
30
+ const data = await response.json().catch(() => null);
31
+ return {
32
+ success: response.ok,
33
+ endpoint,
34
+ status: response.status,
35
+ statusText: response.statusText,
36
+ data,
37
+ responseTime,
38
+ error: response.ok ? undefined : (data && typeof data === 'object' && 'error' in data ? String(data.error) : response.statusText),
39
+ };
40
+ }
41
+ catch (error) {
42
+ return {
43
+ success: false,
44
+ endpoint,
45
+ error: error instanceof Error ? error.message : String(error),
46
+ responseTime: Date.now() - startTime,
47
+ };
48
+ }
49
+ }
50
+ /**
51
+ * Test if Qwen API endpoint is accessible
52
+ * Tests the /chat/completions endpoint (OpenAI-compatible)
53
+ */
54
+ export async function testAPIEndpoint(baseURL, token) {
55
+ const startTime = Date.now();
56
+ const endpoint = `${baseURL}/chat/completions`;
57
+ try {
58
+ const headers = {
59
+ "Content-Type": "application/json",
60
+ };
61
+ if (token) {
62
+ headers["Authorization"] = `Bearer ${token}`;
63
+ }
64
+ // Make a test request to the chat completions endpoint
65
+ const response = await fetch(endpoint, {
66
+ method: "POST",
67
+ headers,
68
+ body: JSON.stringify({
69
+ model: "qwen3-coder-plus",
70
+ messages: [{ role: "user", content: "test" }],
71
+ max_tokens: 1,
72
+ }),
73
+ });
74
+ const responseTime = Date.now() - startTime;
75
+ const data = await response.json().catch(() => null);
76
+ // For API endpoints, we consider:
77
+ // - 200 = success (with valid token)
78
+ // - 401 = endpoint exists but needs auth (without token)
79
+ // - Other statuses = endpoint might not exist or has issues
80
+ const endpointExists = response.status === 200 || response.status === 401;
81
+ return {
82
+ success: response.ok,
83
+ endpoint,
84
+ status: response.status,
85
+ statusText: response.statusText,
86
+ data,
87
+ responseTime,
88
+ error: response.ok ? undefined : (data && typeof data === 'object' && 'error' in data ?
89
+ JSON.stringify(data.error) : response.statusText),
90
+ };
91
+ }
92
+ catch (error) {
93
+ return {
94
+ success: false,
95
+ endpoint,
96
+ error: error instanceof Error ? error.message : String(error),
97
+ responseTime: Date.now() - startTime,
98
+ };
99
+ }
100
+ }
101
+ /**
102
+ * Test if the base OAuth URL is accessible
103
+ */
104
+ export async function testBaseURL() {
105
+ const startTime = Date.now();
106
+ const endpoint = QWEN_OAUTH_BASE_URL;
107
+ try {
108
+ const response = await fetch(endpoint, {
109
+ method: "GET",
110
+ redirect: "manual",
111
+ });
112
+ const responseTime = Date.now() - startTime;
113
+ return {
114
+ success: response.status < 400,
115
+ endpoint,
116
+ status: response.status,
117
+ statusText: response.statusText,
118
+ responseTime,
119
+ };
120
+ }
121
+ catch (error) {
122
+ return {
123
+ success: false,
124
+ endpoint,
125
+ error: error instanceof Error ? error.message : String(error),
126
+ responseTime: Date.now() - startTime,
127
+ };
128
+ }
129
+ }
130
+ /**
131
+ * Run all diagnostic tests
132
+ */
133
+ export async function runDiagnostics(token) {
134
+ console.log("Running Qwen OAuth diagnostics...\n");
135
+ const baseURL = await testBaseURL();
136
+ console.log(`[Base URL] ${baseURL.endpoint}`);
137
+ console.log(` Status: ${baseURL.success ? "āœ“" : "āœ—"} ${baseURL.status || "N/A"}`);
138
+ console.log(` Time: ${baseURL.responseTime}ms`);
139
+ if (baseURL.error)
140
+ console.log(` Error: ${baseURL.error}`);
141
+ console.log();
142
+ const deviceCode = await testDeviceCodeEndpoint();
143
+ console.log(`[Device Code] ${deviceCode.endpoint}`);
144
+ console.log(` Status: ${deviceCode.success ? "āœ“" : "āœ—"} ${deviceCode.status || "N/A"}`);
145
+ console.log(` Time: ${deviceCode.responseTime}ms`);
146
+ if (deviceCode.error)
147
+ console.log(` Error: ${deviceCode.error}`);
148
+ if (deviceCode.data) {
149
+ console.log(` Response: ${JSON.stringify(deviceCode.data, null, 2)}`);
150
+ }
151
+ console.log();
152
+ // Test only the API endpoint that supports OAuth tokens
153
+ // OAuth tokens from chat.qwen.ai only work with portal.qwen.ai
154
+ const apiEndpoints = [
155
+ QWEN_API_BASE_URL, // https://portal.qwen.ai/v1 - the only one that works with OAuth
156
+ ];
157
+ const apis = {};
158
+ console.log("[API Endpoints] Testing /chat/completions on multiple base URLs...\n");
159
+ for (const apiURL of apiEndpoints) {
160
+ const result = await testAPIEndpoint(apiURL, token);
161
+ apis[apiURL] = result;
162
+ const statusIcon = result.success ? "āœ“" :
163
+ (result.status === 401 ? "⚠" : "āœ—");
164
+ console.log(` ${statusIcon} ${apiURL}`);
165
+ console.log(` Status: ${result.status || "N/A"} (${result.responseTime}ms)`);
166
+ if (token && result.status === 401) {
167
+ console.log(` Note: Token provided but endpoint rejected it`);
168
+ }
169
+ else if (!token && result.status === 401) {
170
+ console.log(` Note: Endpoint exists but requires authentication`);
171
+ }
172
+ if (result.error)
173
+ console.log(` Error: ${result.error}`);
174
+ }
175
+ console.log();
176
+ return { baseURL, deviceCode, apis };
177
+ }
178
+ /**
179
+ * Run the OAuth device flow to get a token
180
+ */
181
+ export async function runOAuthFlow() {
182
+ console.log("\nšŸ” Starting OAuth Device Flow...\n");
183
+ const { verifier, challenge } = createPkcePair();
184
+ // Step 1: Request device code
185
+ console.log("1ļøāƒ£ Requesting device code...");
186
+ const deviceParams = new URLSearchParams({
187
+ client_id: QWEN_CLIENT_ID,
188
+ scope: QWEN_SCOPES.join(" "),
189
+ code_challenge: challenge,
190
+ code_challenge_method: "S256",
191
+ });
192
+ const deviceResponse = await fetch(`${QWEN_OAUTH_BASE_URL}${QWEN_DEVICE_CODE_ENDPOINT}`, {
193
+ method: "POST",
194
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
195
+ body: deviceParams.toString(),
196
+ });
197
+ if (!deviceResponse.ok) {
198
+ const error = await deviceResponse.json().catch(() => ({}));
199
+ console.log(`āŒ Failed to get device code: ${JSON.stringify(error)}`);
200
+ return null;
201
+ }
202
+ const deviceData = await deviceResponse.json();
203
+ const { device_code, user_code, verification_uri_complete, verification_uri, expires_in, interval = 5, } = deviceData;
204
+ console.log(` āœ“ Device code received`);
205
+ console.log(` šŸ“‹ User code: ${user_code}`);
206
+ console.log(` ā° Expires in: ${expires_in} seconds\n`);
207
+ // Step 2: Open browser and prompt user
208
+ console.log("2ļøāƒ£ Opening browser for authorization...");
209
+ openBrowser(verification_uri_complete || verification_uri);
210
+ console.log(` āœ“ Browser opened\n`);
211
+ // Step 3: Poll for token
212
+ console.log("3ļøāƒ£ Polling for authorization...");
213
+ console.log(` šŸ“Œ Enter code: ${user_code}`);
214
+ console.log(` ā³ Waiting for authorization...\n`);
215
+ const startTime = Date.now();
216
+ const timeout = expires_in * 1000;
217
+ const pollingInterval = interval * 1000;
218
+ while (Date.now() - startTime < timeout) {
219
+ await new Promise((resolve) => setTimeout(resolve, pollingInterval));
220
+ const tokenParams = new URLSearchParams({
221
+ client_id: QWEN_CLIENT_ID,
222
+ grant_type: "urn:ietf:params:oauth:grant-type:device_code",
223
+ device_code,
224
+ code_verifier: verifier,
225
+ });
226
+ const tokenResponse = await fetch(`${QWEN_OAUTH_BASE_URL}${QWEN_TOKEN_ENDPOINT}`, {
227
+ method: "POST",
228
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
229
+ body: tokenParams.toString(),
230
+ });
231
+ const tokenData = await tokenResponse.json();
232
+ if (tokenResponse.ok) {
233
+ console.log(` āœ“ Authorization successful!\n`);
234
+ console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
235
+ console.log(`šŸŽ‰ OAuth Flow Complete!`);
236
+ console.log(` Access token: ${tokenData.access_token?.substring(0, 20)}...`);
237
+ console.log(` Refresh token: ${tokenData.refresh_token?.substring(0, 20)}...`);
238
+ console.log(` Expires in: ${tokenData.expires_in} seconds`);
239
+ console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`);
240
+ return {
241
+ access_token: tokenData.access_token,
242
+ refresh_token: tokenData.refresh_token,
243
+ expires_in: tokenData.expires_in,
244
+ };
245
+ }
246
+ if (tokenData.error === "authorization_pending") {
247
+ process.stdout.write(" ā³ Still waiting...\n");
248
+ continue;
249
+ }
250
+ if (tokenData.error === "slow_down") {
251
+ console.log(` āš ļø Rate limited, slowing down...`);
252
+ await new Promise((resolve) => setTimeout(resolve, pollingInterval));
253
+ continue;
254
+ }
255
+ console.log(` āŒ Error: ${tokenData.error_description || tokenData.error}`);
256
+ return null;
257
+ }
258
+ console.log(` āŒ Authorization timed out`);
259
+ return null;
260
+ }
261
+ /**
262
+ * Refresh an access token
263
+ */
264
+ export async function refreshToken(refreshToken) {
265
+ const params = new URLSearchParams({
266
+ client_id: QWEN_CLIENT_ID,
267
+ grant_type: "refresh_token",
268
+ refresh_token: refreshToken,
269
+ });
270
+ const response = await fetch(`${QWEN_OAUTH_BASE_URL}${QWEN_TOKEN_ENDPOINT}`, {
271
+ method: "POST",
272
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
273
+ body: params.toString(),
274
+ });
275
+ if (!response.ok) {
276
+ const error = await response.json().catch(() => ({}));
277
+ console.log(`āŒ Token refresh failed: ${JSON.stringify(error)}`);
278
+ return null;
279
+ }
280
+ const data = await response.json();
281
+ return {
282
+ access_token: data.access_token,
283
+ expires_in: data.expires_in,
284
+ };
285
+ }
286
+ /**
287
+ * Save token to file for later use
288
+ */
289
+ function saveTokenToFile(token, refreshToken, expiresIn) {
290
+ const configDir = join(homedir(), ".config", "opencode");
291
+ if (!existsSync(configDir)) {
292
+ mkdirSync(configDir, { recursive: true });
293
+ }
294
+ const tokenData = {
295
+ access_token: token,
296
+ refresh_token: refreshToken,
297
+ expires_in: expiresIn,
298
+ expires_at: Date.now() + expiresIn * 1000,
299
+ saved_at: new Date().toISOString(),
300
+ };
301
+ const tokenPath = join(configDir, "qwen-test-token.json");
302
+ writeFileSync(tokenPath, JSON.stringify(tokenData, null, 2));
303
+ return tokenPath;
304
+ }
305
+ // CLI interface for running diagnostics
306
+ if (import.meta.url === `file://${process.argv[1]}`) {
307
+ const args = process.argv.slice(2);
308
+ const token = args[0];
309
+ const runOAuth = args.includes("--oauth") || args.includes("-o");
310
+ const loadToken = args.includes("--load") || args.includes("-l");
311
+ const doRefresh = args.includes("--refresh") || args.includes("-r");
312
+ async function main() {
313
+ let accessToken = token;
314
+ // Show usage if no args and no token
315
+ if (!token && !runOAuth && !loadToken && !doRefresh) {
316
+ console.log("\nšŸ“‹ Usage:");
317
+ console.log(" node dist/diagnostic.js # Run basic diagnostics");
318
+ console.log(" node dist/diagnostic.js <token> # Run diagnostics with token");
319
+ console.log(" node dist/diagnostic.js --oauth # Run OAuth flow + diagnostics");
320
+ console.log(" node dist/diagnostic.js --load # Load saved token and test");
321
+ console.log(" node dist/diagnostic.js --refresh # Refresh saved token and test\n");
322
+ }
323
+ // Load token from file if --load flag
324
+ if (loadToken) {
325
+ const configDir = join(homedir(), ".config", "opencode");
326
+ const tokenPath = join(configDir, "qwen-test-token.json");
327
+ try {
328
+ if (existsSync(tokenPath)) {
329
+ const tokenData = JSON.parse(readFileSync(tokenPath, "utf-8"));
330
+ if (tokenData.expires_at > Date.now()) {
331
+ accessToken = tokenData.access_token;
332
+ console.log(`šŸ“‚ Loaded token from: ${tokenPath}`);
333
+ }
334
+ else {
335
+ console.log(`ā° Token expired at: ${new Date(tokenData.expires_at).toISOString()}`);
336
+ console.log(` Run --oauth to get a new token`);
337
+ return; // Exit early
338
+ }
339
+ }
340
+ else {
341
+ console.log(`šŸ“‚ No saved token found at: ${tokenPath}`);
342
+ console.log(` Run --oauth to authenticate`);
343
+ return; // Exit early
344
+ }
345
+ }
346
+ catch (e) {
347
+ console.log(`āŒ Failed to load token: ${e}`);
348
+ return; // Exit early
349
+ }
350
+ }
351
+ // Refresh token if --refresh flag
352
+ if (doRefresh) {
353
+ const configDir = join(homedir(), ".config", "opencode");
354
+ const tokenPath = join(configDir, "qwen-test-token.json");
355
+ try {
356
+ if (existsSync(tokenPath)) {
357
+ const tokenData = JSON.parse(readFileSync(tokenPath, "utf-8"));
358
+ console.log(`šŸ”„ Refreshing token...`);
359
+ const refreshed = await refreshToken(tokenData.refresh_token);
360
+ if (refreshed) {
361
+ accessToken = refreshed.access_token;
362
+ const newTokenData = {
363
+ access_token: accessToken,
364
+ refresh_token: tokenData.refresh_token,
365
+ expires_in: refreshed.expires_in,
366
+ expires_at: Date.now() + refreshed.expires_in * 1000,
367
+ saved_at: new Date().toISOString(),
368
+ };
369
+ writeFileSync(tokenPath, JSON.stringify(newTokenData, null, 2));
370
+ console.log(`šŸ’¾ Token refreshed and saved to: ${tokenPath}`);
371
+ }
372
+ }
373
+ }
374
+ catch (e) {
375
+ console.log(`āŒ Failed to refresh token: ${e}`);
376
+ return; // Exit early
377
+ }
378
+ }
379
+ // Run OAuth flow if --oauth flag
380
+ if (runOAuth) {
381
+ const oauthResult = await runOAuthFlow();
382
+ if (oauthResult) {
383
+ accessToken = oauthResult.access_token;
384
+ // Save token to file
385
+ const tokenPath = saveTokenToFile(oauthResult.access_token, oauthResult.refresh_token, oauthResult.expires_in);
386
+ console.log(`šŸ’¾ Token saved to: ${tokenPath}`);
387
+ }
388
+ else {
389
+ console.log("āŒ OAuth flow failed or was cancelled");
390
+ process.exit(1);
391
+ }
392
+ }
393
+ const results = await runDiagnostics(accessToken);
394
+ const allSuccess = results.baseURL.success && results.deviceCode.success;
395
+ const anyAPIWorks = Object.values(results.apis).some(api => api.success);
396
+ const anyAPIExists = Object.values(results.apis).some(api => api.status === 401 || api.success);
397
+ console.log(`\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━`);
398
+ console.log(`OAuth Status: ${allSuccess ? "āœ“ PASS" : "āœ— FAIL"}`);
399
+ if (accessToken) {
400
+ console.log(`API Status: ${anyAPIWorks ? "āœ“ Working with token" : "āœ— Failed with token"}`);
401
+ // Show which endpoints work with the token
402
+ const workingEndpoints = Object.entries(results.apis)
403
+ .filter(([_, result]) => result.success)
404
+ .map(([url]) => url);
405
+ const failedEndpoints = Object.entries(results.apis)
406
+ .filter(([_, result]) => !result.success)
407
+ .map(([url]) => url);
408
+ if (workingEndpoints.length > 0) {
409
+ console.log(`\nāœ… Endpoints working with OAuth token:`);
410
+ workingEndpoints.forEach(url => console.log(` - ${url}`));
411
+ }
412
+ if (failedEndpoints.length > 0) {
413
+ console.log(`\nāš ļø Endpoints NOT supporting OAuth token:`);
414
+ failedEndpoints.forEach(url => console.log(` - ${url}`));
415
+ }
416
+ }
417
+ else {
418
+ console.log(`API Status: ${anyAPIExists ? "⚠ Endpoints exist (need token)" : "āœ— No endpoints found"}`);
419
+ }
420
+ if (anyAPIWorks) {
421
+ const workingEndpoint = Object.entries(results.apis).find(([_, result]) => result.success);
422
+ if (workingEndpoint) {
423
+ console.log(`\nšŸ’” Recommended API base URL: ${workingEndpoint[0]}`);
424
+ }
425
+ }
426
+ else if (anyAPIExists && !accessToken) {
427
+ const existingEndpoint = Object.entries(results.apis).find(([_, result]) => result.status === 401);
428
+ if (existingEndpoint) {
429
+ console.log(`\nšŸ’” Recommended API base URL: ${existingEndpoint[0]}`);
430
+ console.log(`ā„¹ļø Run with --oauth flag to test with authentication`);
431
+ }
432
+ }
433
+ console.log(`━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n`);
434
+ process.exit(allSuccess ? 0 : 1);
435
+ }
436
+ main();
437
+ }
438
+ //# sourceMappingURL=diagnostic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostic.js","sourceRoot":"","sources":["../src/diagnostic.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Qwen OAuth Plugin for OpenCode
3
3
  * Provides OAuth device flow authentication for Qwen.ai
4
+ * With proactive token refresh via custom fetch loader
4
5
  *
5
6
  * @packageDocumentation
6
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,qBAAqB,CAAC;AAW/D,eAAO,MAAM,eAAe,EAAE,MAoM7B,CAAC;AAEF,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAaH,OAAO,KAAK,EAAE,MAAM,EAAe,MAAM,qBAAqB,CAAC;AA8B/D,eAAO,MAAM,eAAe,EAAE,MAsmB7B,CAAC;AAEF,eAAe,eAAe,CAAC"}