opencode-qwen-oauth 2.3.0 → 2.4.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 +83 -73
- package/bin/install.js +1 -1
- package/dist/api-key-exchange.js +1 -1
- package/dist/api-key-exchange.js.map +1 -1
- package/dist/browser.js +1 -1
- package/dist/browser.js.map +1 -1
- package/dist/index.d.ts +1 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +50 -443
- package/dist/index.js.map +1 -1
- package/dist/middleware/auth.middleware.d.ts +10 -0
- package/dist/middleware/auth.middleware.d.ts.map +1 -0
- package/dist/middleware/auth.middleware.js +102 -0
- package/dist/middleware/auth.middleware.js.map +1 -0
- package/dist/middleware/rate-limit.middleware.d.ts +10 -0
- package/dist/middleware/rate-limit.middleware.d.ts.map +1 -0
- package/dist/middleware/rate-limit.middleware.js +22 -0
- package/dist/middleware/rate-limit.middleware.js.map +1 -0
- package/dist/middleware/retry.middleware.d.ts +11 -0
- package/dist/middleware/retry.middleware.d.ts.map +1 -0
- package/dist/middleware/retry.middleware.js +43 -0
- package/dist/middleware/retry.middleware.js.map +1 -0
- package/dist/repositories/credential.repository.d.ts +13 -0
- package/dist/repositories/credential.repository.d.ts.map +1 -0
- package/dist/repositories/credential.repository.js +65 -0
- package/dist/repositories/credential.repository.js.map +1 -0
- package/dist/services/token.service.d.ts +20 -0
- package/dist/services/token.service.d.ts.map +1 -0
- package/dist/services/token.service.js +106 -0
- package/dist/services/token.service.js.map +1 -0
- package/dist/strategies/oauth.strategy.d.ts +9 -0
- package/dist/strategies/oauth.strategy.d.ts.map +1 -0
- package/dist/strategies/oauth.strategy.js +249 -0
- package/dist/strategies/oauth.strategy.js.map +1 -0
- package/dist/types.d.ts +38 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/logger.d.ts +24 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +32 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/mutex.d.ts +16 -0
- package/dist/utils/mutex.d.ts.map +1 -0
- package/dist/utils/mutex.js +54 -0
- package/dist/utils/mutex.js.map +1 -0
- package/dist/utils/pkce.d.ts +8 -0
- package/dist/utils/pkce.d.ts.map +1 -0
- package/dist/utils/pkce.js +17 -0
- package/dist/utils/pkce.js.map +1 -0
- package/package.json +4 -3
package/dist/index.js
CHANGED
|
@@ -1,400 +1,58 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Qwen OAuth Plugin for OpenCode
|
|
3
|
-
*
|
|
4
|
-
* With proactive token refresh via custom fetch loader
|
|
5
|
-
*
|
|
6
|
-
* @packageDocumentation
|
|
3
|
+
* Clean architecture with separated concerns
|
|
7
4
|
*/
|
|
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;
|
|
15
5
|
import { QWEN_API_BASE_URL } from "./constants.js";
|
|
16
6
|
import { openBrowser } from "./browser.js";
|
|
17
|
-
import { authorizeDevice, pollForToken
|
|
18
|
-
import {
|
|
7
|
+
import { authorizeDevice, pollForToken } from "./strategies/oauth.strategy.js";
|
|
8
|
+
import { tokenService } from "./services/token.service.js";
|
|
9
|
+
import { credentialRepository } from "./repositories/credential.repository.js";
|
|
10
|
+
import { createAuthMiddleware } from "./middleware/auth.middleware.js";
|
|
11
|
+
import { setLoggerClient } from "./utils/logger.js";
|
|
12
|
+
import { Mutex } from "./utils/mutex.js";
|
|
19
13
|
import { getConfig } from "./config.js";
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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);
|
|
50
|
-
debugLog("Plugin initialized", {
|
|
51
|
-
directory,
|
|
52
|
-
worktree,
|
|
53
|
-
project: project?.name || "N/A",
|
|
14
|
+
const PLUGIN_VERSION = "2.3.1";
|
|
15
|
+
export const QwenOAuthPlugin = async ({ client, directory, worktree, project }) => {
|
|
16
|
+
setLoggerClient({
|
|
17
|
+
app: {
|
|
18
|
+
log: async (entry) => {
|
|
19
|
+
try {
|
|
20
|
+
await client.app.log(entry);
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
console.log(`[${entry.body.level}] ${entry.body.message}`, entry.body.extra || "");
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
},
|
|
54
27
|
});
|
|
55
28
|
const config = getConfig();
|
|
29
|
+
const authMutex = new Mutex();
|
|
30
|
+
const debugLog = (message, data) => client.app.log({ body: { service: "qwen-oauth", level: "debug", message, extra: data } }).catch(() => { });
|
|
31
|
+
debugLog("Plugin initialized", { directory, worktree, project: project?.name || "N/A" });
|
|
56
32
|
return {
|
|
57
33
|
auth: {
|
|
58
34
|
provider: "qwen",
|
|
59
35
|
async loader(getAuth, provider) {
|
|
60
|
-
// First try to get auth from OpenCode runtime
|
|
61
36
|
let auth = await getAuth();
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
|
37
|
+
if (!auth || auth.type !== "oauth" || !auth.access) {
|
|
38
|
+
const fileCreds = credentialRepository.load();
|
|
39
|
+
if (fileCreds) {
|
|
73
40
|
auth = {
|
|
74
41
|
type: "oauth",
|
|
75
|
-
access:
|
|
76
|
-
refresh:
|
|
77
|
-
expires:
|
|
42
|
+
access: fileCreds.accessToken,
|
|
43
|
+
refresh: fileCreds.refreshToken,
|
|
44
|
+
expires: fileCreds.expiryDate,
|
|
78
45
|
};
|
|
46
|
+
tokenService.setCachedAuth(auth);
|
|
79
47
|
}
|
|
80
48
|
}
|
|
81
|
-
|
|
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") {
|
|
49
|
+
if (!auth || auth.type !== "oauth")
|
|
94
50
|
return {};
|
|
95
|
-
|
|
96
|
-
|
|
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
|
-
};
|
|
51
|
+
tokenService.setCachedAuth(auth);
|
|
52
|
+
const authMiddleware = createAuthMiddleware({ platform: process.platform, arch: process.arch });
|
|
233
53
|
return {
|
|
234
54
|
apiKey: "",
|
|
235
|
-
|
|
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
|
-
},
|
|
55
|
+
fetch: authMiddleware,
|
|
398
56
|
};
|
|
399
57
|
},
|
|
400
58
|
methods: [
|
|
@@ -402,21 +60,14 @@ export const QwenOAuthPlugin = async ({ project, client, directory, worktree, })
|
|
|
402
60
|
type: "oauth",
|
|
403
61
|
label: "Qwen Code (qwen.ai OAuth)",
|
|
404
62
|
authorize: async () => {
|
|
405
|
-
if (
|
|
406
|
-
|
|
407
|
-
throw new Error("Authorization already in progress. Please wait for the current flow to complete.");
|
|
63
|
+
if (authMutex.isLocked()) {
|
|
64
|
+
throw new Error("Authorization already in progress");
|
|
408
65
|
}
|
|
409
|
-
return
|
|
66
|
+
return authMutex.runExclusive(async () => {
|
|
410
67
|
debugLog("Starting Qwen OAuth device flow...");
|
|
411
68
|
const device = await authorizeDevice();
|
|
412
69
|
const url = device.verification_uri_complete || device.verification_uri;
|
|
413
70
|
openBrowser(url);
|
|
414
|
-
debugLog("Device authorization received", {
|
|
415
|
-
user_code: device.user_code,
|
|
416
|
-
verification_uri: device.verification_uri,
|
|
417
|
-
expires_in: device.expires_in,
|
|
418
|
-
interval: device.interval,
|
|
419
|
-
});
|
|
420
71
|
return {
|
|
421
72
|
url,
|
|
422
73
|
instructions: `Enter code: ${device.user_code}`,
|
|
@@ -426,10 +77,7 @@ export const QwenOAuthPlugin = async ({ project, client, directory, worktree, })
|
|
|
426
77
|
const result = await pollForToken(device.device_code, device.verifier, device.interval, device.expires_in);
|
|
427
78
|
if (result.success) {
|
|
428
79
|
const expiresIn = result.expires_in || 0;
|
|
429
|
-
|
|
430
|
-
const expires = expiresIn > 0
|
|
431
|
-
? Date.now() + expiresIn * 1000
|
|
432
|
-
: Date.now() + 21600 * 1000;
|
|
80
|
+
const expires = expiresIn > 0 ? Date.now() + expiresIn * 1000 : Date.now() + 21600 * 1000;
|
|
433
81
|
const authResult = {
|
|
434
82
|
type: "oauth",
|
|
435
83
|
refresh: result.refresh_token || "",
|
|
@@ -437,32 +85,19 @@ export const QwenOAuthPlugin = async ({ project, client, directory, worktree, })
|
|
|
437
85
|
expires,
|
|
438
86
|
apiKey: result.api_key,
|
|
439
87
|
};
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
console.log("[Qwen] Saving credentials after OAuth...");
|
|
443
|
-
saveCredentials({
|
|
88
|
+
tokenService.setCachedAuth(authResult);
|
|
89
|
+
credentialRepository.save({
|
|
444
90
|
accessToken: result.access_token || "",
|
|
445
|
-
refreshToken: result.refresh_token,
|
|
91
|
+
refreshToken: result.refresh_token || "",
|
|
446
92
|
expiryDate: expires,
|
|
447
93
|
tokenType: "Bearer",
|
|
448
94
|
});
|
|
449
|
-
console.log("[Qwen] Credentials saved to ~/.qwen/oauth_creds.json");
|
|
450
95
|
debugLog("Qwen authentication successful!", {
|
|
451
96
|
expires_in: result.expires_in,
|
|
452
97
|
has_refresh: !!result.refresh_token,
|
|
453
98
|
has_api_key: !!result.api_key,
|
|
454
99
|
});
|
|
455
|
-
|
|
456
|
-
infoLog("Received separate API key for Qwen API - will use for API calls");
|
|
457
|
-
}
|
|
458
|
-
return {
|
|
459
|
-
type: "success",
|
|
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
|
|
465
|
-
};
|
|
100
|
+
return authResult;
|
|
466
101
|
}
|
|
467
102
|
debugLog(`Authentication failed: ${result.error}`);
|
|
468
103
|
return { type: "failed", error: result.error };
|
|
@@ -473,15 +108,13 @@ export const QwenOAuthPlugin = async ({ project, client, directory, worktree, })
|
|
|
473
108
|
},
|
|
474
109
|
],
|
|
475
110
|
},
|
|
476
|
-
config: async (
|
|
477
|
-
const providers =
|
|
478
|
-
|
|
111
|
+
config: async (cfg) => {
|
|
112
|
+
const providers = cfg.provider || {};
|
|
113
|
+
cfg.provider = providers;
|
|
479
114
|
providers["qwen"] = {
|
|
480
115
|
npm: "@ai-sdk/openai-compatible",
|
|
481
116
|
name: "Qwen Code",
|
|
482
|
-
options: {
|
|
483
|
-
baseURL: QWEN_API_BASE_URL,
|
|
484
|
-
},
|
|
117
|
+
options: { baseURL: QWEN_API_BASE_URL },
|
|
485
118
|
models: {
|
|
486
119
|
"coder-model": {
|
|
487
120
|
id: "coder-model",
|
|
@@ -501,27 +134,13 @@ export const QwenOAuthPlugin = async ({ project, client, directory, worktree, })
|
|
|
501
134
|
},
|
|
502
135
|
event: async ({ event }) => {
|
|
503
136
|
if (event.type === "session.error") {
|
|
504
|
-
debugLog("Session error occurred", {
|
|
505
|
-
type: event.type,
|
|
506
|
-
timestamp: new Date().toISOString(),
|
|
507
|
-
});
|
|
508
|
-
}
|
|
509
|
-
if (event.type === "session.created") {
|
|
510
|
-
debugLog("New session created", {
|
|
511
|
-
type: event.type,
|
|
512
|
-
timestamp: new Date().toISOString(),
|
|
513
|
-
});
|
|
137
|
+
debugLog("Session error occurred", { timestamp: new Date().toISOString() });
|
|
514
138
|
}
|
|
515
139
|
},
|
|
516
140
|
"chat.headers": async (input, output) => {
|
|
517
141
|
const providerId = input.provider?.info?.id || input.provider?.id;
|
|
518
142
|
if (providerId === "qwen" || providerId === "qwen-code") {
|
|
519
|
-
|
|
520
|
-
model: input.model.id,
|
|
521
|
-
session: input.sessionID,
|
|
522
|
-
providerId,
|
|
523
|
-
});
|
|
524
|
-
const userAgent = `QwenCode/${QWEN_CODE_VERSION} (${process.platform}; ${process.arch})`;
|
|
143
|
+
const userAgent = `QwenCode/${PLUGIN_VERSION} (${process.platform}; ${process.arch})`;
|
|
525
144
|
output.headers["User-Agent"] = userAgent;
|
|
526
145
|
output.headers["X-DashScope-CacheControl"] = "enable";
|
|
527
146
|
output.headers["X-DashScope-UserAgent"] = userAgent;
|
|
@@ -531,23 +150,11 @@ export const QwenOAuthPlugin = async ({ project, client, directory, worktree, })
|
|
|
531
150
|
"chat.params": async (input, output) => {
|
|
532
151
|
const providerId = input.provider?.info?.id || input.provider?.id;
|
|
533
152
|
if (providerId === "qwen" || providerId === "qwen-code") {
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
current_temp: output.temperature,
|
|
537
|
-
});
|
|
538
|
-
if (output.temperature === undefined) {
|
|
539
|
-
output.temperature = 0.7;
|
|
540
|
-
}
|
|
541
|
-
if (output.topP === undefined) {
|
|
542
|
-
output.topP = 0.95;
|
|
543
|
-
}
|
|
153
|
+
output.temperature = output.temperature ?? 0.7;
|
|
154
|
+
output.topP = output.topP ?? 0.95;
|
|
544
155
|
}
|
|
545
156
|
},
|
|
546
157
|
"shell.env": async (input, output) => {
|
|
547
|
-
debugLog("Setting up shell environment", {
|
|
548
|
-
cwd: input.cwd,
|
|
549
|
-
hasSession: !!input.sessionID,
|
|
550
|
-
});
|
|
551
158
|
output.env.QWEN_API_BASE_URL = QWEN_API_BASE_URL;
|
|
552
159
|
output.env.QWEN_PROVIDER = "qwen";
|
|
553
160
|
},
|
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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"}
|