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.
- package/README.md +54 -6
- package/bin/install.js +30 -14
- package/dist/api-key-exchange.d.ts +20 -0
- package/dist/api-key-exchange.d.ts.map +1 -0
- package/dist/api-key-exchange.js +91 -0
- package/dist/api-key-exchange.js.map +1 -0
- package/dist/credentials.d.ts +16 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +75 -0
- package/dist/credentials.js.map +1 -0
- package/dist/diagnostic.d.ts +49 -0
- package/dist/diagnostic.d.ts.map +1 -0
- package/dist/diagnostic.js +438 -0
- package/dist/diagnostic.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +432 -49
- package/dist/index.js.map +1 -1
- package/dist/oauth.d.ts +2 -0
- package/dist/oauth.d.ts.map +1 -1
- package/dist/oauth.js +71 -26
- package/dist/oauth.js.map +1 -1
- package/dist/request-queue.d.ts +10 -0
- package/dist/request-queue.d.ts.map +1 -0
- package/dist/request-queue.js +22 -0
- package/dist/request-queue.js.map +1 -0
- package/dist/retry.d.ts.map +1 -1
- package/dist/retry.js +5 -0
- package/dist/retry.js.map +1 -1
- package/dist/token-test.d.ts +7 -0
- package/dist/token-test.d.ts.map +1 -0
- package/dist/token-test.js +69 -0
- package/dist/token-test.js.map +1 -0
- package/dist/validation.d.ts +6 -4
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +27 -15
- package/dist/validation.js.map +1 -1
- package/package.json +8 -6
package/dist/index.js
CHANGED
|
@@ -1,32 +1,407 @@
|
|
|
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
|
*/
|
|
8
|
+
const PLUGIN_VERSION = "2.3.0";
|
|
9
|
+
const QWEN_CODE_VERSION = "0.10.3";
|
|
10
|
+
const TOKEN_CACHE_DURATION = 5 * 60 * 1000;
|
|
11
|
+
const REFRESH_BEFORE_EXPIRY_MS = 5 * 60 * 1000;
|
|
12
|
+
let cachedToken = null;
|
|
13
|
+
let cachedTokenExpiry = 0;
|
|
14
|
+
let lastRefreshTime = 0;
|
|
7
15
|
import { QWEN_API_BASE_URL } from "./constants.js";
|
|
8
|
-
import { debugLog, warnLog } from "./logger.js";
|
|
9
16
|
import { openBrowser } from "./browser.js";
|
|
10
17
|
import { authorizeDevice, pollForToken, refreshAccessToken } from "./oauth.js";
|
|
11
18
|
import { Mutex } from "./mutex.js";
|
|
12
|
-
import {
|
|
13
|
-
|
|
19
|
+
import { getConfig } from "./config.js";
|
|
20
|
+
import { requestQueue } from "./request-queue.js";
|
|
21
|
+
import { saveCredentials, loadCredentials } from "./credentials.js";
|
|
14
22
|
const authorizationMutex = new Mutex();
|
|
15
|
-
|
|
23
|
+
const tokenRefreshMutex = new Mutex();
|
|
24
|
+
let cachedAuth = null;
|
|
25
|
+
function resetTokenCache() {
|
|
26
|
+
cachedToken = null;
|
|
27
|
+
cachedTokenExpiry = 0;
|
|
28
|
+
lastRefreshTime = 0;
|
|
29
|
+
}
|
|
30
|
+
export const QwenOAuthPlugin = async ({ project, client, directory, worktree, }) => {
|
|
31
|
+
const log = async (level, message, data) => {
|
|
32
|
+
try {
|
|
33
|
+
await client.app.log({
|
|
34
|
+
body: {
|
|
35
|
+
service: "qwen-oauth",
|
|
36
|
+
level,
|
|
37
|
+
message,
|
|
38
|
+
extra: data,
|
|
39
|
+
},
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// Fallback to console if client.app.log fails
|
|
44
|
+
console.log(`[${level}] ${message}`, data || "");
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
const debugLog = (message, data) => log("debug", message, data);
|
|
48
|
+
const infoLog = (message, data) => log("info", message, data);
|
|
49
|
+
const warnLog = (message, data) => log("warn", message, data);
|
|
16
50
|
debugLog("Plugin initialized", {
|
|
17
51
|
directory,
|
|
18
52
|
worktree,
|
|
19
53
|
project: project?.name || "N/A",
|
|
20
54
|
});
|
|
55
|
+
const config = getConfig();
|
|
21
56
|
return {
|
|
22
57
|
auth: {
|
|
23
58
|
provider: "qwen",
|
|
59
|
+
async loader(getAuth, provider) {
|
|
60
|
+
// First try to get auth from OpenCode runtime
|
|
61
|
+
let auth = await getAuth();
|
|
62
|
+
// If no valid runtime auth, try loading from file
|
|
63
|
+
if (!auth || auth.type !== "oauth" || !auth.access || !auth.refresh) {
|
|
64
|
+
console.log("[Qwen] No runtime auth, trying to load from file...");
|
|
65
|
+
const fileCredentials = loadCredentials();
|
|
66
|
+
if (fileCredentials && fileCredentials.accessToken && fileCredentials.refreshToken) {
|
|
67
|
+
console.log("[Qwen] Loaded credentials from file", {
|
|
68
|
+
hasAccess: !!fileCredentials.accessToken,
|
|
69
|
+
hasRefresh: !!fileCredentials.refreshToken,
|
|
70
|
+
expiryDate: fileCredentials.expiryDate,
|
|
71
|
+
});
|
|
72
|
+
// Use file credentials as fallback
|
|
73
|
+
auth = {
|
|
74
|
+
type: "oauth",
|
|
75
|
+
access: fileCredentials.accessToken,
|
|
76
|
+
refresh: fileCredentials.refreshToken,
|
|
77
|
+
expires: fileCredentials.expiryDate,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
debugLog("Auth loader called", {
|
|
82
|
+
hasAuth: !!auth,
|
|
83
|
+
authType: auth?.type,
|
|
84
|
+
hasAccess: !!auth?.access,
|
|
85
|
+
hasAccessToken: !!auth?.access_token,
|
|
86
|
+
hasAccessTokenCamel: !!auth?.accessToken,
|
|
87
|
+
hasRefresh: !!auth?.refresh,
|
|
88
|
+
hasRefreshToken: !!auth?.refresh_token,
|
|
89
|
+
hasRefreshTokenCamel: !!auth?.refreshToken,
|
|
90
|
+
expires: auth?.expires,
|
|
91
|
+
expiresAt: auth?.expires_at,
|
|
92
|
+
});
|
|
93
|
+
if (!auth || auth.type !== "oauth") {
|
|
94
|
+
return {};
|
|
95
|
+
}
|
|
96
|
+
// Handle multiple field name formats:
|
|
97
|
+
// - OpenCode uses camelCase: accessToken, refreshToken
|
|
98
|
+
// - OAuth spec uses snake_case: access_token, refresh_token
|
|
99
|
+
// - Plugin internal uses short names: access, refresh
|
|
100
|
+
// - Qwen-specific: apiKey or api_key for API endpoint access
|
|
101
|
+
const normalizedAuth = {
|
|
102
|
+
type: "oauth",
|
|
103
|
+
access: auth.access || auth.access_token || auth.accessToken || "",
|
|
104
|
+
refresh: auth.refresh || auth.refresh_token || auth.refreshToken || "",
|
|
105
|
+
expires: auth.expires || auth.expires_at || 0,
|
|
106
|
+
apiKey: auth.apiKey || auth.api_key || undefined,
|
|
107
|
+
};
|
|
108
|
+
// Defensive check: ensure we actually have tokens
|
|
109
|
+
if (!normalizedAuth.access || !normalizedAuth.refresh) {
|
|
110
|
+
warnLog("Empty tokens after normalization - authentication may have failed", {
|
|
111
|
+
hasAccess: !!normalizedAuth.access,
|
|
112
|
+
hasRefresh: !!normalizedAuth.refresh,
|
|
113
|
+
authKeys: Object.keys(auth),
|
|
114
|
+
authValue: JSON.stringify(auth).substring(0, 200), // First 200 chars for debugging
|
|
115
|
+
});
|
|
116
|
+
return {};
|
|
117
|
+
}
|
|
118
|
+
// Check if token is already expired
|
|
119
|
+
const now = Date.now();
|
|
120
|
+
const isExpired = normalizedAuth.expires && normalizedAuth.expires <= now;
|
|
121
|
+
const timeUntilExpiry = normalizedAuth.expires ? normalizedAuth.expires - now : 0;
|
|
122
|
+
debugLog("Auth successfully normalized", {
|
|
123
|
+
hasAccess: !!normalizedAuth.access,
|
|
124
|
+
hasRefresh: !!normalizedAuth.refresh,
|
|
125
|
+
hasApiKey: !!normalizedAuth.apiKey,
|
|
126
|
+
expiresAt: normalizedAuth.expires ? new Date(normalizedAuth.expires).toISOString() : "never",
|
|
127
|
+
expiresIn: timeUntilExpiry > 0 ? Math.round(timeUntilExpiry / 1000) + "s" : "EXPIRED",
|
|
128
|
+
isExpired,
|
|
129
|
+
});
|
|
130
|
+
// Log which token will be used for API calls
|
|
131
|
+
if (normalizedAuth.apiKey) {
|
|
132
|
+
infoLog("Using separate API key for Qwen API calls (different from OAuth access token)");
|
|
133
|
+
}
|
|
134
|
+
if (isExpired) {
|
|
135
|
+
warnLog("Token is already expired, will refresh on first request", {
|
|
136
|
+
expiredAt: normalizedAuth.expires ? new Date(normalizedAuth.expires).toISOString() : "unknown",
|
|
137
|
+
expiredAgo: Math.round((now - (normalizedAuth.expires || now)) / 1000) + " seconds ago",
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
infoLog("Auth loader: Tokens loaded successfully", {
|
|
142
|
+
expiresIn: normalizedAuth.expires ? Math.round((normalizedAuth.expires - Date.now()) / 1000 / 60) + " minutes" : "unknown",
|
|
143
|
+
hasApiKey: !!normalizedAuth.apiKey,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
cachedAuth = normalizedAuth;
|
|
147
|
+
const refreshTokenIfNeeded = async () => {
|
|
148
|
+
const now = Date.now();
|
|
149
|
+
if (cachedToken && now < cachedTokenExpiry && now - lastRefreshTime < TOKEN_CACHE_DURATION) {
|
|
150
|
+
if (cachedAuth) {
|
|
151
|
+
return cachedAuth;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
if (!cachedAuth) {
|
|
155
|
+
throw new Error("No authentication available");
|
|
156
|
+
}
|
|
157
|
+
const expiresAt = cachedAuth.expires || 0;
|
|
158
|
+
const timeUntilExpiry = expiresAt - now;
|
|
159
|
+
const hasValidExpiry = expiresAt > now;
|
|
160
|
+
const shouldRefresh = !cachedAuth.access ||
|
|
161
|
+
!hasValidExpiry ||
|
|
162
|
+
timeUntilExpiry < REFRESH_BEFORE_EXPIRY_MS;
|
|
163
|
+
debugLog("Token refresh check", {
|
|
164
|
+
hasAccess: !!cachedAuth.access,
|
|
165
|
+
expiresAt: expiresAt > 0 ? new Date(expiresAt).toISOString() : "not set",
|
|
166
|
+
timeUntilExpiry: timeUntilExpiry > 0 ? Math.round(timeUntilExpiry / 1000) + "s" : "EXPIRED",
|
|
167
|
+
hasValidExpiry,
|
|
168
|
+
refreshThreshold: REFRESH_BEFORE_EXPIRY_MS,
|
|
169
|
+
shouldRefresh,
|
|
170
|
+
cachedToken: !!cachedToken,
|
|
171
|
+
cacheValid: !!(cachedToken && now < cachedTokenExpiry),
|
|
172
|
+
});
|
|
173
|
+
if (!shouldRefresh && cachedToken) {
|
|
174
|
+
debugLog("Token is still valid (cached), no refresh needed");
|
|
175
|
+
return cachedAuth;
|
|
176
|
+
}
|
|
177
|
+
infoLog("Token refresh needed - attempting refresh", {
|
|
178
|
+
reason: !cachedAuth.access ? "no access token" :
|
|
179
|
+
!hasValidExpiry ? "token expired" :
|
|
180
|
+
"token expires soon",
|
|
181
|
+
timeUntilExpiry: timeUntilExpiry > 0 ? Math.round(timeUntilExpiry / 1000) + "s" : "EXPIRED",
|
|
182
|
+
});
|
|
183
|
+
return tokenRefreshMutex.runExclusive(async () => {
|
|
184
|
+
const currentAuth = cachedAuth;
|
|
185
|
+
if (!currentAuth || !currentAuth.refresh) {
|
|
186
|
+
throw new Error("No refresh token available");
|
|
187
|
+
}
|
|
188
|
+
const result = await refreshAccessToken(currentAuth.refresh);
|
|
189
|
+
if (result.success && result.access_token) {
|
|
190
|
+
const expiresIn = result.expires_in || 0;
|
|
191
|
+
// Only update expiry if valid (> 0), otherwise use 1 hour default
|
|
192
|
+
const newExpires = expiresIn > 0
|
|
193
|
+
? Date.now() + expiresIn * 1000
|
|
194
|
+
: Date.now() + 3600 * 1000; // Default: 1 hour from now
|
|
195
|
+
const newAuth = {
|
|
196
|
+
type: "oauth",
|
|
197
|
+
refresh: result.refresh_token || currentAuth.refresh,
|
|
198
|
+
access: result.access_token,
|
|
199
|
+
expires: newExpires,
|
|
200
|
+
apiKey: result.api_key || currentAuth.apiKey, // Preserve or update API key
|
|
201
|
+
};
|
|
202
|
+
cachedAuth = newAuth;
|
|
203
|
+
cachedToken = newAuth.access;
|
|
204
|
+
cachedTokenExpiry = newExpires;
|
|
205
|
+
lastRefreshTime = Date.now();
|
|
206
|
+
// Save refreshed credentials to file
|
|
207
|
+
saveCredentials({
|
|
208
|
+
accessToken: newAuth.access,
|
|
209
|
+
refreshToken: newAuth.refresh,
|
|
210
|
+
expiryDate: newExpires,
|
|
211
|
+
tokenType: "Bearer",
|
|
212
|
+
});
|
|
213
|
+
try {
|
|
214
|
+
await client.auth.set({
|
|
215
|
+
path: { id: "qwen" },
|
|
216
|
+
body: newAuth,
|
|
217
|
+
});
|
|
218
|
+
debugLog("Token refreshed and stored", {
|
|
219
|
+
expires: newAuth.expires,
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
catch (storeError) {
|
|
223
|
+
debugLog("Failed to store refreshed token", {
|
|
224
|
+
error: String(storeError),
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
return newAuth;
|
|
228
|
+
}
|
|
229
|
+
debugLog("Token refresh failed", { error: result.error });
|
|
230
|
+
throw new Error(result.error || "Token refresh failed");
|
|
231
|
+
});
|
|
232
|
+
};
|
|
233
|
+
return {
|
|
234
|
+
apiKey: "",
|
|
235
|
+
async fetch(input, init) {
|
|
236
|
+
let auth;
|
|
237
|
+
try {
|
|
238
|
+
auth = await refreshTokenIfNeeded();
|
|
239
|
+
}
|
|
240
|
+
catch (refreshError) {
|
|
241
|
+
warnLog("Failed to refresh token before API call", {
|
|
242
|
+
error: String(refreshError),
|
|
243
|
+
});
|
|
244
|
+
// Return a clear error response
|
|
245
|
+
return new Response(JSON.stringify({
|
|
246
|
+
error: {
|
|
247
|
+
code: "token_refresh_failed",
|
|
248
|
+
message: "Failed to refresh your Qwen authentication token. Please run '/connect' in OpenCode to re-authenticate.",
|
|
249
|
+
type: "auth_error",
|
|
250
|
+
details: refreshError instanceof Error ? refreshError.message : String(refreshError)
|
|
251
|
+
}
|
|
252
|
+
}), {
|
|
253
|
+
status: 401,
|
|
254
|
+
headers: { "Content-Type": "application/json" },
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
const userAgent = `QwenCode/${QWEN_CODE_VERSION} (${process.platform}; ${process.arch})`;
|
|
258
|
+
return requestQueue.enqueue(async () => {
|
|
259
|
+
for (let attempt = 0; attempt <= 2; attempt++) {
|
|
260
|
+
let url;
|
|
261
|
+
if (typeof input === "string") {
|
|
262
|
+
url = input;
|
|
263
|
+
}
|
|
264
|
+
else if (input instanceof URL) {
|
|
265
|
+
url = input.toString();
|
|
266
|
+
}
|
|
267
|
+
else {
|
|
268
|
+
url = input.url;
|
|
269
|
+
}
|
|
270
|
+
const headers = new Headers(init?.headers);
|
|
271
|
+
const tokenToUse = auth.apiKey || auth.access;
|
|
272
|
+
if (tokenToUse) {
|
|
273
|
+
headers.set("Authorization", `Bearer ${tokenToUse}`);
|
|
274
|
+
headers.set("User-Agent", userAgent);
|
|
275
|
+
headers.set("X-DashScope-CacheControl", "enable");
|
|
276
|
+
headers.set("X-DashScope-UserAgent", userAgent);
|
|
277
|
+
headers.set("X-DashScope-AuthType", "qwen-oauth");
|
|
278
|
+
debugLog("Making API request with token", {
|
|
279
|
+
url,
|
|
280
|
+
attempt,
|
|
281
|
+
tokenType: auth.apiKey ? "API Key" : "OAuth Access Token",
|
|
282
|
+
tokenLength: tokenToUse.length,
|
|
283
|
+
tokenPrefix: tokenToUse.substring(0, 20) + "...",
|
|
284
|
+
hasExpiry: !!auth.expires,
|
|
285
|
+
expiresAt: auth.expires ? new Date(auth.expires).toISOString() : "not set",
|
|
286
|
+
isExpired: auth.expires ? auth.expires <= Date.now() : "unknown",
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
warnLog("No access token or API key available for API request", { url });
|
|
291
|
+
}
|
|
292
|
+
const response = await fetch(url, {
|
|
293
|
+
...init,
|
|
294
|
+
headers,
|
|
295
|
+
});
|
|
296
|
+
debugLog("API response received", {
|
|
297
|
+
url,
|
|
298
|
+
status: response.status,
|
|
299
|
+
statusText: response.statusText,
|
|
300
|
+
attempt,
|
|
301
|
+
});
|
|
302
|
+
if (response.status === 429) {
|
|
303
|
+
const retryAfter = response.headers.get("Retry-After") || "60";
|
|
304
|
+
const waitTimeMs = Number.parseInt(retryAfter, 10) * 1000;
|
|
305
|
+
warnLog("Rate limited (429), waiting and retrying", {
|
|
306
|
+
retryAfter,
|
|
307
|
+
waitTimeMs,
|
|
308
|
+
url,
|
|
309
|
+
});
|
|
310
|
+
await new Promise(resolve => setTimeout(resolve, waitTimeMs));
|
|
311
|
+
continue;
|
|
312
|
+
}
|
|
313
|
+
if (response.status === 401 || response.status === 403) {
|
|
314
|
+
const errorBody = await response.clone().json().catch(() => ({}));
|
|
315
|
+
warnLog("Received 401/403 Unauthorized from Qwen API", {
|
|
316
|
+
attempt,
|
|
317
|
+
url,
|
|
318
|
+
error: errorBody.error || errorBody.message,
|
|
319
|
+
});
|
|
320
|
+
const refreshedAuth = await tokenRefreshMutex.runExclusive(async () => {
|
|
321
|
+
const currentAuth = cachedAuth;
|
|
322
|
+
if (!currentAuth || !currentAuth.refresh) {
|
|
323
|
+
throw new Error("No refresh token available");
|
|
324
|
+
}
|
|
325
|
+
const result = await refreshAccessToken(currentAuth.refresh);
|
|
326
|
+
if (result.success && result.access_token) {
|
|
327
|
+
const expiresIn = result.expires_in || 0;
|
|
328
|
+
const newExpires = expiresIn > 0
|
|
329
|
+
? Date.now() + expiresIn * 1000
|
|
330
|
+
: Date.now() + 3600 * 1000;
|
|
331
|
+
const newAuth = {
|
|
332
|
+
type: "oauth",
|
|
333
|
+
refresh: result.refresh_token || currentAuth.refresh,
|
|
334
|
+
access: result.access_token,
|
|
335
|
+
expires: newExpires,
|
|
336
|
+
apiKey: result.api_key || currentAuth.apiKey,
|
|
337
|
+
};
|
|
338
|
+
cachedAuth = newAuth;
|
|
339
|
+
// Save refreshed credentials to file
|
|
340
|
+
saveCredentials({
|
|
341
|
+
accessToken: newAuth.access,
|
|
342
|
+
refreshToken: newAuth.refresh,
|
|
343
|
+
expiryDate: newExpires,
|
|
344
|
+
tokenType: "Bearer",
|
|
345
|
+
});
|
|
346
|
+
try {
|
|
347
|
+
await client.auth.set({
|
|
348
|
+
path: { id: "qwen" },
|
|
349
|
+
body: newAuth,
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
catch (storeError) {
|
|
353
|
+
debugLog("Failed to store refreshed token after 401", {
|
|
354
|
+
error: String(storeError),
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
return newAuth;
|
|
358
|
+
}
|
|
359
|
+
debugLog("Token refresh failed after 401", { error: result.error });
|
|
360
|
+
return null;
|
|
361
|
+
});
|
|
362
|
+
if (refreshedAuth) {
|
|
363
|
+
auth = refreshedAuth;
|
|
364
|
+
debugLog("Retrying request with refreshed token", { attempt: attempt + 1 });
|
|
365
|
+
continue;
|
|
366
|
+
}
|
|
367
|
+
else {
|
|
368
|
+
warnLog("Authentication failed - please re-authenticate", {
|
|
369
|
+
url,
|
|
370
|
+
suggestion: "Run '/connect' in OpenCode to re-authenticate with Qwen"
|
|
371
|
+
});
|
|
372
|
+
return new Response(JSON.stringify({
|
|
373
|
+
error: {
|
|
374
|
+
code: "authentication_required",
|
|
375
|
+
message: "Your Qwen authentication has expired. Please run '/connect' in OpenCode and re-authenticate.",
|
|
376
|
+
type: "auth_error"
|
|
377
|
+
}
|
|
378
|
+
}), {
|
|
379
|
+
status: 401,
|
|
380
|
+
headers: { "Content-Type": "application/json" },
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
return response;
|
|
385
|
+
}
|
|
386
|
+
return new Response(JSON.stringify({
|
|
387
|
+
error: {
|
|
388
|
+
code: "max_retries_exceeded",
|
|
389
|
+
message: "Maximum retry attempts exceeded",
|
|
390
|
+
type: "server_error"
|
|
391
|
+
}
|
|
392
|
+
}), {
|
|
393
|
+
status: 500,
|
|
394
|
+
headers: { "Content-Type": "application/json" },
|
|
395
|
+
});
|
|
396
|
+
});
|
|
397
|
+
},
|
|
398
|
+
};
|
|
399
|
+
},
|
|
24
400
|
methods: [
|
|
25
401
|
{
|
|
26
402
|
type: "oauth",
|
|
27
403
|
label: "Qwen Code (qwen.ai OAuth)",
|
|
28
404
|
authorize: async () => {
|
|
29
|
-
// Check if authorization is already in progress
|
|
30
405
|
if (authorizationMutex.isLocked()) {
|
|
31
406
|
warnLog("Authorization already in progress");
|
|
32
407
|
throw new Error("Authorization already in progress. Please wait for the current flow to complete.");
|
|
@@ -35,7 +410,6 @@ export const QwenOAuthPlugin = async ({ project, client, $, directory, worktree,
|
|
|
35
410
|
debugLog("Starting Qwen OAuth device flow...");
|
|
36
411
|
const device = await authorizeDevice();
|
|
37
412
|
const url = device.verification_uri_complete || device.verification_uri;
|
|
38
|
-
// Try to open browser automatically
|
|
39
413
|
openBrowser(url);
|
|
40
414
|
debugLog("Device authorization received", {
|
|
41
415
|
user_code: device.user_code,
|
|
@@ -51,40 +425,50 @@ export const QwenOAuthPlugin = async ({ project, client, $, directory, worktree,
|
|
|
51
425
|
debugLog("Polling for OAuth token...");
|
|
52
426
|
const result = await pollForToken(device.device_code, device.verifier, device.interval, device.expires_in);
|
|
53
427
|
if (result.success) {
|
|
428
|
+
const expiresIn = result.expires_in || 0;
|
|
429
|
+
// Default to 6 hours (21600s) if not provided, matching Qwen's typical expiry
|
|
430
|
+
const expires = expiresIn > 0
|
|
431
|
+
? Date.now() + expiresIn * 1000
|
|
432
|
+
: Date.now() + 21600 * 1000;
|
|
433
|
+
const authResult = {
|
|
434
|
+
type: "oauth",
|
|
435
|
+
refresh: result.refresh_token || "",
|
|
436
|
+
access: result.access_token || "",
|
|
437
|
+
expires,
|
|
438
|
+
apiKey: result.api_key,
|
|
439
|
+
};
|
|
440
|
+
cachedAuth = authResult;
|
|
441
|
+
// Save credentials to file for persistence across sessions
|
|
442
|
+
console.log("[Qwen] Saving credentials after OAuth...");
|
|
443
|
+
saveCredentials({
|
|
444
|
+
accessToken: result.access_token || "",
|
|
445
|
+
refreshToken: result.refresh_token,
|
|
446
|
+
expiryDate: expires,
|
|
447
|
+
tokenType: "Bearer",
|
|
448
|
+
});
|
|
449
|
+
console.log("[Qwen] Credentials saved to ~/.qwen/oauth_creds.json");
|
|
54
450
|
debugLog("Qwen authentication successful!", {
|
|
55
451
|
expires_in: result.expires_in,
|
|
56
452
|
has_refresh: !!result.refresh_token,
|
|
453
|
+
has_api_key: !!result.api_key,
|
|
57
454
|
});
|
|
455
|
+
if (result.api_key) {
|
|
456
|
+
infoLog("Received separate API key for Qwen API - will use for API calls");
|
|
457
|
+
}
|
|
58
458
|
return {
|
|
59
459
|
type: "success",
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
expires:
|
|
460
|
+
refresh: result.refresh_token || "",
|
|
461
|
+
access: result.access_token || "",
|
|
462
|
+
expires: expires || 0,
|
|
463
|
+
apiKey: result.api_key, // Qwen-specific API key
|
|
464
|
+
api_key: result.api_key, // Also include snake_case version for compatibility
|
|
63
465
|
};
|
|
64
466
|
}
|
|
65
467
|
debugLog(`Authentication failed: ${result.error}`);
|
|
66
468
|
return { type: "failed", error: result.error };
|
|
67
469
|
},
|
|
68
470
|
};
|
|
69
|
-
});
|
|
70
|
-
},
|
|
71
|
-
refresh: async (refreshToken) => {
|
|
72
|
-
debugLog("Refreshing Qwen access token...");
|
|
73
|
-
const result = await refreshAccessToken(refreshToken);
|
|
74
|
-
if (result.success) {
|
|
75
|
-
debugLog("Token refresh successful", {
|
|
76
|
-
expires_in: result.expires_in,
|
|
77
|
-
has_refresh: !!result.refresh_token,
|
|
78
|
-
});
|
|
79
|
-
return {
|
|
80
|
-
type: "success",
|
|
81
|
-
access: result.access_token,
|
|
82
|
-
refresh: result.refresh_token,
|
|
83
|
-
expires: Date.now() + result.expires_in * 1000,
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
debugLog(`Token refresh failed: ${result.error}`);
|
|
87
|
-
throw new QwenTokenRefreshError(result.error || "Invalid refresh token or client_id");
|
|
471
|
+
});
|
|
88
472
|
},
|
|
89
473
|
},
|
|
90
474
|
],
|
|
@@ -99,21 +483,23 @@ export const QwenOAuthPlugin = async ({ project, client, $, directory, worktree,
|
|
|
99
483
|
baseURL: QWEN_API_BASE_URL,
|
|
100
484
|
},
|
|
101
485
|
models: {
|
|
102
|
-
"
|
|
103
|
-
id: "
|
|
104
|
-
name: "
|
|
486
|
+
"coder-model": {
|
|
487
|
+
id: "coder-model",
|
|
488
|
+
name: "Qwen Coder",
|
|
489
|
+
limit: { context: 1048576, output: 65536 },
|
|
490
|
+
modalities: { input: ["text"], output: ["text"] },
|
|
105
491
|
},
|
|
106
|
-
"
|
|
107
|
-
id: "
|
|
108
|
-
name: "
|
|
492
|
+
"vision-model": {
|
|
493
|
+
id: "vision-model",
|
|
494
|
+
name: "Qwen Vision",
|
|
495
|
+
limit: { context: 131072, output: 32768 },
|
|
496
|
+
modalities: { input: ["text", "image"], output: ["text"] },
|
|
109
497
|
attachment: true,
|
|
110
498
|
},
|
|
111
499
|
},
|
|
112
500
|
};
|
|
113
501
|
},
|
|
114
|
-
// Event monitoring hook
|
|
115
502
|
event: async ({ event }) => {
|
|
116
|
-
// Log important events for debugging
|
|
117
503
|
if (event.type === "session.error") {
|
|
118
504
|
debugLog("Session error occurred", {
|
|
119
505
|
type: event.type,
|
|
@@ -127,29 +513,28 @@ export const QwenOAuthPlugin = async ({ project, client, $, directory, worktree,
|
|
|
127
513
|
});
|
|
128
514
|
}
|
|
129
515
|
},
|
|
130
|
-
// Inject custom headers for Qwen API requests
|
|
131
516
|
"chat.headers": async (input, output) => {
|
|
132
|
-
|
|
133
|
-
if (
|
|
517
|
+
const providerId = input.provider?.info?.id || input.provider?.id;
|
|
518
|
+
if (providerId === "qwen" || providerId === "qwen-code") {
|
|
134
519
|
debugLog("Adding custom headers for Qwen request", {
|
|
135
520
|
model: input.model.id,
|
|
136
521
|
session: input.sessionID,
|
|
522
|
+
providerId,
|
|
137
523
|
});
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
output.headers["X-
|
|
141
|
-
output.headers["X-
|
|
524
|
+
const userAgent = `QwenCode/${QWEN_CODE_VERSION} (${process.platform}; ${process.arch})`;
|
|
525
|
+
output.headers["User-Agent"] = userAgent;
|
|
526
|
+
output.headers["X-DashScope-CacheControl"] = "enable";
|
|
527
|
+
output.headers["X-DashScope-UserAgent"] = userAgent;
|
|
528
|
+
output.headers["X-DashScope-AuthType"] = "qwen-oauth";
|
|
142
529
|
}
|
|
143
530
|
},
|
|
144
|
-
// Customize model parameters for Qwen
|
|
145
531
|
"chat.params": async (input, output) => {
|
|
146
|
-
|
|
532
|
+
const providerId = input.provider?.info?.id || input.provider?.id;
|
|
533
|
+
if (providerId === "qwen" || providerId === "qwen-code") {
|
|
147
534
|
debugLog("Customizing parameters for Qwen model", {
|
|
148
535
|
model: input.model.id,
|
|
149
536
|
current_temp: output.temperature,
|
|
150
537
|
});
|
|
151
|
-
// Qwen models work well with these defaults
|
|
152
|
-
// Users can override these in their config
|
|
153
538
|
if (output.temperature === undefined) {
|
|
154
539
|
output.temperature = 0.7;
|
|
155
540
|
}
|
|
@@ -158,13 +543,11 @@ export const QwenOAuthPlugin = async ({ project, client, $, directory, worktree,
|
|
|
158
543
|
}
|
|
159
544
|
}
|
|
160
545
|
},
|
|
161
|
-
// Expose Qwen credentials as environment variables if needed
|
|
162
546
|
"shell.env": async (input, output) => {
|
|
163
547
|
debugLog("Setting up shell environment", {
|
|
164
548
|
cwd: input.cwd,
|
|
165
549
|
hasSession: !!input.sessionID,
|
|
166
550
|
});
|
|
167
|
-
// Add Qwen-specific environment variables
|
|
168
551
|
output.env.QWEN_API_BASE_URL = QWEN_API_BASE_URL;
|
|
169
552
|
output.env.QWEN_PROVIDER = "qwen";
|
|
170
553
|
},
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/oauth.d.ts
CHANGED
|
@@ -16,6 +16,7 @@ export declare function pollForToken(deviceCode: string, codeVerifier: string, i
|
|
|
16
16
|
access_token?: string;
|
|
17
17
|
refresh_token?: string;
|
|
18
18
|
expires_in?: number;
|
|
19
|
+
api_key?: string;
|
|
19
20
|
error?: string;
|
|
20
21
|
}>;
|
|
21
22
|
/**
|
|
@@ -28,6 +29,7 @@ export declare function refreshAccessToken(refreshToken: string): Promise<{
|
|
|
28
29
|
access_token?: string;
|
|
29
30
|
refresh_token?: string;
|
|
30
31
|
expires_in?: number;
|
|
32
|
+
api_key?: string;
|
|
31
33
|
error?: string;
|
|
32
34
|
}>;
|
|
33
35
|
//# sourceMappingURL=oauth.d.ts.map
|