@xopcai/xopcbot 0.1.5 → 0.2.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 +6 -6
- package/README.zh-CN.md +6 -6
- package/dist/agent/__tests__/media-processing.test.d.ts +6 -0
- package/dist/agent/__tests__/media-processing.test.js +385 -0
- package/dist/agent/__tests__/media-processing.test.js.map +1 -0
- package/dist/agent/fallback/__tests__/index.test.js +16 -5
- package/dist/agent/fallback/__tests__/index.test.js.map +1 -1
- package/dist/agent/fallback/candidates.d.ts +2 -4
- package/dist/agent/fallback/candidates.js +19 -26
- package/dist/agent/fallback/candidates.js.map +1 -1
- package/dist/agent/helpers.d.ts +1 -0
- package/dist/agent/helpers.js.map +1 -1
- package/dist/agent/index.d.ts +6 -1
- package/dist/agent/index.js +10 -1
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/models/compat.d.ts +35 -0
- package/dist/agent/models/compat.js +110 -0
- package/dist/agent/models/compat.js.map +1 -0
- package/dist/agent/models/fallback.d.ts +38 -0
- package/dist/agent/models/fallback.js +133 -0
- package/dist/agent/models/fallback.js.map +1 -0
- package/dist/agent/models/index.d.ts +10 -0
- package/dist/agent/models/index.js +11 -0
- package/dist/agent/models/index.js.map +1 -0
- package/dist/agent/{model-manager.d.ts → models/manager.d.ts} +2 -8
- package/dist/agent/{model-manager.js → models/manager.js} +38 -24
- package/dist/agent/models/manager.js.map +1 -0
- package/dist/agent/models/scan.d.ts +46 -0
- package/dist/agent/models/scan.js +177 -0
- package/dist/agent/models/scan.js.map +1 -0
- package/dist/agent/models/selection.d.ts +44 -0
- package/dist/agent/models/selection.js +141 -0
- package/dist/agent/models/selection.js.map +1 -0
- package/dist/agent/prompt/index.js +1 -1
- package/dist/agent/prompt/index.js.map +1 -1
- package/dist/agent/service.js +34 -16
- package/dist/agent/service.js.map +1 -1
- package/dist/agent/skills/__tests__/test-framework.test.js +15 -7
- package/dist/agent/skills/__tests__/test-framework.test.js.map +1 -1
- package/dist/agent/skills/config.d.ts +1 -1
- package/dist/agent/skills/config.js +2 -2
- package/dist/agent/skills/config.js.map +1 -1
- package/dist/agent/skills/index.js +15 -28
- package/dist/agent/skills/index.js.map +1 -1
- package/dist/agent/skills/installer.d.ts +1 -1
- package/dist/agent/skills/installer.js +1 -1
- package/dist/agent/skills/scanner.d.ts +1 -1
- package/dist/agent/skills/scanner.js +1 -1
- package/dist/agent/skills/test-framework.js +21 -20
- package/dist/agent/skills/test-framework.js.map +1 -1
- package/dist/agent/skills/types.d.ts +3 -3
- package/dist/agent/skills/types.js +1 -1
- package/dist/agent/skills/watcher.d.ts +1 -1
- package/dist/agent/skills/watcher.js +1 -1
- package/dist/agent/system-prompt.d.ts +67 -0
- package/dist/agent/system-prompt.js +351 -0
- package/dist/agent/system-prompt.js.map +1 -0
- package/dist/agent/tools/__tests__/send-media.test.d.ts +6 -0
- package/dist/agent/tools/__tests__/send-media.test.js +251 -0
- package/dist/agent/tools/__tests__/send-media.test.js.map +1 -0
- package/dist/agent/types.agent-defaults.d.ts +48 -0
- package/dist/agent/types.agent-defaults.js +5 -0
- package/dist/agent/types.agent-defaults.js.map +1 -0
- package/dist/agent/types.d.ts +14 -6
- package/dist/agent/types.js +5 -0
- package/dist/agent/types.js.map +1 -1
- package/dist/agent/workspace.d.ts +94 -0
- package/dist/agent/workspace.js +625 -0
- package/dist/agent/workspace.js.map +1 -0
- package/dist/auth/index.js +1 -1
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/oauth/index.d.ts +1 -0
- package/dist/auth/oauth/index.js +1 -0
- package/dist/auth/oauth/index.js.map +1 -1
- package/dist/auth/oauth/kimi.d.ts +2 -1
- package/dist/auth/oauth/kimi.js +51 -48
- package/dist/auth/oauth/kimi.js.map +1 -1
- package/dist/auth/oauth/minimax-cn.d.ts +12 -0
- package/dist/auth/oauth/minimax-cn.js +111 -0
- package/dist/auth/oauth/minimax-cn.js.map +1 -0
- package/dist/auth/oauth/qwen.d.ts +5 -0
- package/dist/auth/oauth/qwen.js +54 -84
- package/dist/auth/oauth/qwen.js.map +1 -1
- package/dist/auth/profiles/index.d.ts +0 -2
- package/dist/auth/profiles/index.js +0 -2
- package/dist/auth/profiles/index.js.map +1 -1
- package/dist/auth/storage.js +7 -1
- package/dist/auth/storage.js.map +1 -1
- package/dist/channels/__tests__/media-integration.test.d.ts +6 -0
- package/dist/channels/__tests__/media-integration.test.js +398 -0
- package/dist/channels/__tests__/media-integration.test.js.map +1 -0
- package/dist/channels/__tests__/media.test.d.ts +6 -0
- package/dist/channels/__tests__/media.test.js +251 -0
- package/dist/channels/__tests__/media.test.js.map +1 -0
- package/dist/channels/access-control.d.ts +1 -1
- package/dist/channels/access-control.js +1 -1
- package/dist/channels/draft-stream.d.ts +1 -1
- package/dist/channels/draft-stream.js +1 -1
- package/dist/channels/format.d.ts +1 -1
- package/dist/channels/format.js +1 -1
- package/dist/channels/telegram/command-handler.js +15 -48
- package/dist/channels/telegram/command-handler.js.map +1 -1
- package/dist/channels/telegram/plugin.js +3 -2
- package/dist/channels/telegram/plugin.js.map +1 -1
- package/dist/channels/telegram/webhook.d.ts +1 -1
- package/dist/channels/telegram/webhook.js +1 -1
- package/dist/channels/types.d.ts +1 -1
- package/dist/channels/types.js +1 -1
- package/dist/channels/update-offset-store.d.ts +1 -1
- package/dist/channels/update-offset-store.js +1 -1
- package/dist/cli/commands/auth.js +8 -23
- package/dist/cli/commands/auth.js.map +1 -1
- package/dist/cli/commands/gateway.js +9 -1
- package/dist/cli/commands/gateway.js.map +1 -1
- package/dist/cli/commands/models.js +35 -29
- package/dist/cli/commands/models.js.map +1 -1
- package/dist/cli/commands/onboard.js +73 -58
- package/dist/cli/commands/onboard.js.map +1 -1
- package/dist/cli/commands/skills.js +6 -6
- package/dist/cli/commands/skills.js.map +1 -1
- package/dist/cli/index.js +0 -0
- package/dist/cli/templates.d.ts +2 -0
- package/dist/cli/templates.js +1 -1
- package/dist/cli/templates.js.map +1 -1
- package/dist/config/defaults.d.ts +19 -0
- package/dist/config/defaults.js +168 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.js +4 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/integration.d.ts +12 -0
- package/dist/config/integration.js +14 -0
- package/dist/config/integration.js.map +1 -0
- package/dist/config/models-json.d.ts +454 -0
- package/dist/config/models-json.js +323 -0
- package/dist/config/models-json.js.map +1 -0
- package/dist/config/paths.d.ts +2 -0
- package/dist/config/paths.js +4 -0
- package/dist/config/paths.js.map +1 -1
- package/dist/config/reload.d.ts +1 -1
- package/dist/config/reload.js +3 -3
- package/dist/config/reload.js.map +1 -1
- package/dist/config/resolve-config-value.d.ts +36 -0
- package/dist/config/resolve-config-value.js +218 -0
- package/dist/config/resolve-config-value.js.map +1 -0
- package/dist/config/rules.js +3 -2
- package/dist/config/rules.js.map +1 -1
- package/dist/config/schema.d.ts +17 -884
- package/dist/config/schema.js +36 -312
- package/dist/config/schema.js.map +1 -1
- package/dist/config/types.models.d.ts +54 -0
- package/dist/config/types.models.js +2 -0
- package/dist/config/types.models.js.map +1 -0
- package/dist/cron/validation.d.ts +4 -4
- package/dist/gateway/hono/app.js +230 -78
- package/dist/gateway/hono/app.js.map +1 -1
- package/dist/gateway/hono/oauth-async.d.ts +14 -0
- package/dist/gateway/hono/oauth-async.js +285 -0
- package/dist/gateway/hono/oauth-async.js.map +1 -0
- package/dist/gateway/hono/oauth.d.ts +9 -0
- package/dist/gateway/hono/oauth.js +157 -0
- package/dist/gateway/hono/oauth.js.map +1 -0
- package/dist/gateway/hono/sse.js +5 -2
- package/dist/gateway/hono/sse.js.map +1 -1
- package/dist/gateway/service.d.ts +6 -2
- package/dist/gateway/service.js +20 -6
- package/dist/gateway/service.js.map +1 -1
- package/dist/gateway/static/root/assets/flow-BqIEBwW6.js +2 -0
- package/dist/gateway/static/root/assets/flow-BqIEBwW6.js.map +1 -0
- package/dist/gateway/static/root/assets/main-Br2tw-87.js +5168 -0
- package/dist/gateway/static/root/assets/main-Br2tw-87.js.map +1 -0
- package/dist/gateway/static/root/assets/main-DwlbPf8Z.css +1 -0
- package/dist/gateway/static/root/index.html +2 -2
- package/dist/plugins/index.d.ts +0 -2
- package/dist/plugins/index.js +0 -2
- package/dist/plugins/index.js.map +1 -1
- package/dist/plugins/types.d.ts +0 -2
- package/dist/plugins/types.js +0 -2
- package/dist/plugins/types.js.map +1 -1
- package/dist/providers/index.d.ts +50 -22
- package/dist/providers/index.js +276 -50
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/model-registry.d.ts +84 -0
- package/dist/providers/model-registry.js +385 -0
- package/dist/providers/model-registry.js.map +1 -0
- package/dist/types/providers.d.ts +2 -63
- package/dist/types/providers.js +1 -1
- package/dist/utils/__tests__/frontmatter.test.js +4 -3
- package/dist/utils/__tests__/frontmatter.test.js.map +1 -1
- package/dist/utils/diagnostic-events.d.ts +230 -0
- package/dist/utils/diagnostic-events.js +189 -0
- package/dist/utils/diagnostic-events.js.map +1 -0
- package/dist/utils/frontmatter.d.ts +0 -1
- package/dist/utils/frontmatter.js +13 -77
- package/dist/utils/frontmatter.js.map +1 -1
- package/dist/utils/log-stream.d.ts +95 -0
- package/dist/utils/log-stream.js +229 -0
- package/dist/utils/log-stream.js.map +1 -0
- package/dist/utils/logger.d.ts +5 -0
- package/dist/utils/logger.js +25 -0
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/redact.d.ts +73 -0
- package/dist/utils/redact.js +245 -0
- package/dist/utils/redact.js.map +1 -0
- package/package.json +6 -4
- package/skills/find-skills/SKILL.md +0 -9
- package/dist/__tests__/core.test.d.ts +0 -1
- package/dist/__tests__/core.test.js +0 -72
- package/dist/__tests__/core.test.js.map +0 -1
- package/dist/agent/model-manager.js.map +0 -1
- package/dist/cli/commands/configure.d.ts +0 -1
- package/dist/cli/commands/configure.js +0 -171
- package/dist/cli/commands/configure.js.map +0 -1
- package/dist/cli/commands/gateway-daemon.d.ts +0 -1
- package/dist/cli/commands/gateway-daemon.js +0 -141
- package/dist/cli/commands/gateway-daemon.js.map +0 -1
- package/dist/config/__tests__/diff.test.d.ts +0 -1
- package/dist/config/__tests__/diff.test.js +0 -192
- package/dist/config/__tests__/diff.test.js.map +0 -1
- package/dist/config/__tests__/loader.test.d.ts +0 -1
- package/dist/config/__tests__/loader.test.js +0 -356
- package/dist/config/__tests__/loader.test.js.map +0 -1
- package/dist/config/__tests__/paths.test.d.ts +0 -1
- package/dist/config/__tests__/paths.test.js +0 -192
- package/dist/config/__tests__/paths.test.js.map +0 -1
- package/dist/config/__tests__/reload.test.d.ts +0 -1
- package/dist/config/__tests__/reload.test.js +0 -374
- package/dist/config/__tests__/reload.test.js.map +0 -1
- package/dist/config/__tests__/rules.test.d.ts +0 -1
- package/dist/config/__tests__/rules.test.js +0 -204
- package/dist/config/__tests__/rules.test.js.map +0 -1
- package/dist/config/__tests__/schema.test.d.ts +0 -1
- package/dist/config/__tests__/schema.test.js +0 -672
- package/dist/config/__tests__/schema.test.js.map +0 -1
- package/dist/daemon/background-start.d.ts +0 -33
- package/dist/daemon/background-start.js +0 -89
- package/dist/daemon/background-start.js.map +0 -1
- package/dist/daemon/gateway-manager.d.ts +0 -87
- package/dist/daemon/gateway-manager.js +0 -324
- package/dist/daemon/gateway-manager.js.map +0 -1
- package/dist/daemon/index.d.ts +0 -5
- package/dist/daemon/index.js +0 -6
- package/dist/daemon/index.js.map +0 -1
- package/dist/gateway/static/root/assets/main-DevbZW9K.js +0 -2227
- package/dist/gateway/static/root/assets/main-DevbZW9K.js.map +0 -1
- package/dist/gateway/static/root/assets/main-DxZg1Nmz.css +0 -1
- package/dist/providers/__tests__/registry.test.d.ts +0 -1
- package/dist/providers/__tests__/registry.test.js +0 -110
- package/dist/providers/__tests__/registry.test.js.map +0 -1
- package/dist/providers/api-strategies.d.ts +0 -15
- package/dist/providers/api-strategies.js +0 -96
- package/dist/providers/api-strategies.js.map +0 -1
- package/dist/providers/auto-discovery.d.ts +0 -39
- package/dist/providers/auto-discovery.js +0 -189
- package/dist/providers/auto-discovery.js.map +0 -1
- package/dist/providers/config.d.ts +0 -25
- package/dist/providers/config.js +0 -42
- package/dist/providers/config.js.map +0 -1
- package/dist/providers/model-catalog.d.ts +0 -92
- package/dist/providers/model-catalog.js +0 -998
- package/dist/providers/model-catalog.js.map +0 -1
- package/dist/providers/models-dev-data.d.ts +0 -11
- package/dist/providers/models-dev-data.js +0 -1035
- package/dist/providers/models-dev-data.js.map +0 -1
- package/dist/providers/models-dev.d.ts +0 -34
- package/dist/providers/models-dev.js +0 -33
- package/dist/providers/models-dev.js.map +0 -1
- package/dist/providers/pi-ai.d.ts +0 -62
- package/dist/providers/pi-ai.js +0 -221
- package/dist/providers/pi-ai.js.map +0 -1
- package/dist/providers/provider-catalog.d.ts +0 -91
- package/dist/providers/provider-catalog.js +0 -791
- package/dist/providers/provider-catalog.js.map +0 -1
- package/dist/providers/registry.d.ts +0 -135
- package/dist/providers/registry.js +0 -475
- package/dist/providers/registry.js.map +0 -1
- package/dist/providers/types.d.ts +0 -95
- package/dist/providers/types.js +0 -7
- package/dist/providers/types.js.map +0 -1
- package/dist/session/chat-manager.d.ts +0 -49
- package/dist/session/chat-manager.js +0 -167
- package/dist/session/chat-manager.js.map +0 -1
- package/dist/session/chat-types.d.ts +0 -53
- package/dist/session/chat-types.js +0 -63
- package/dist/session/chat-types.js.map +0 -1
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
* Kimi (Moonshot AI) OAuth Provider
|
|
3
3
|
*
|
|
4
4
|
* OAuth 2.0 authentication for Kimi Platform.
|
|
5
|
-
*
|
|
5
|
+
* Uses Device Code Flow per Kimi's official implementation.
|
|
6
|
+
* https://auth.kimi.com for OAuth endpoints.
|
|
6
7
|
*/
|
|
7
8
|
import type { OAuthProviderInterface } from './types.js';
|
|
8
9
|
export declare const kimiOAuthProvider: OAuthProviderInterface;
|
package/dist/auth/oauth/kimi.js
CHANGED
|
@@ -2,57 +2,71 @@
|
|
|
2
2
|
* Kimi (Moonshot AI) OAuth Provider
|
|
3
3
|
*
|
|
4
4
|
* OAuth 2.0 authentication for Kimi Platform.
|
|
5
|
-
*
|
|
5
|
+
* Uses Device Code Flow per Kimi's official implementation.
|
|
6
|
+
* https://auth.kimi.com for OAuth endpoints.
|
|
6
7
|
*/
|
|
7
|
-
const KIMI_OAUTH_BASE_URL = 'https://
|
|
8
|
-
const
|
|
9
|
-
const KIMI_OAUTH_TOKEN_URL = `${KIMI_OAUTH_BASE_URL}/oauth/token`;
|
|
10
|
-
const KIMI_OAUTH_CLIENT_ID = '
|
|
8
|
+
const KIMI_OAUTH_BASE_URL = 'https://auth.kimi.com';
|
|
9
|
+
const KIMI_OAUTH_DEVICE_URL = `${KIMI_OAUTH_BASE_URL}/api/oauth/device_authorization`;
|
|
10
|
+
const KIMI_OAUTH_TOKEN_URL = `${KIMI_OAUTH_BASE_URL}/api/oauth/token`;
|
|
11
|
+
const KIMI_OAUTH_CLIENT_ID = '17e5f671-d194-4dfb-9706-5516cb48c098';
|
|
11
12
|
export const kimiOAuthProvider = {
|
|
12
13
|
id: 'kimi',
|
|
13
14
|
name: 'Kimi (月之暗面)',
|
|
14
15
|
usesCallbackServer: true,
|
|
15
16
|
async login(callbacks) {
|
|
16
|
-
// Kimi uses
|
|
17
|
-
|
|
18
|
-
const
|
|
19
|
-
const authUrl = new URL(KIMI_OAUTH_AUTHORIZE_URL);
|
|
20
|
-
authUrl.searchParams.set('client_id', KIMI_OAUTH_CLIENT_ID);
|
|
21
|
-
authUrl.searchParams.set('redirect_uri', 'http://localhost:3000/callback');
|
|
22
|
-
authUrl.searchParams.set('response_type', 'code');
|
|
23
|
-
authUrl.searchParams.set('scope', 'api');
|
|
24
|
-
authUrl.searchParams.set('code_challenge', codeChallenge);
|
|
25
|
-
authUrl.searchParams.set('code_challenge_method', 'S256');
|
|
26
|
-
callbacks.onAuth({
|
|
27
|
-
url: authUrl.toString(),
|
|
28
|
-
instructions: 'Please authorize the application and enter the code shown.',
|
|
29
|
-
});
|
|
30
|
-
const code = await callbacks.onPrompt({
|
|
31
|
-
message: 'Enter the authorization code:',
|
|
32
|
-
});
|
|
33
|
-
const tokenResponse = await fetch(KIMI_OAUTH_TOKEN_URL, {
|
|
17
|
+
// Kimi uses Device Code Flow (not Authorization Code)
|
|
18
|
+
// First, request device code
|
|
19
|
+
const deviceResponse = await fetch(KIMI_OAUTH_DEVICE_URL, {
|
|
34
20
|
method: 'POST',
|
|
35
21
|
headers: {
|
|
36
22
|
'Content-Type': 'application/x-www-form-urlencoded',
|
|
37
23
|
},
|
|
38
24
|
body: new URLSearchParams({
|
|
39
|
-
grant_type: 'authorization_code',
|
|
40
25
|
client_id: KIMI_OAUTH_CLIENT_ID,
|
|
41
|
-
code,
|
|
42
|
-
redirect_uri: 'http://localhost:3000/callback',
|
|
43
|
-
code_verifier: codeVerifier,
|
|
26
|
+
scope: 'kimi-code',
|
|
44
27
|
}),
|
|
45
28
|
});
|
|
46
|
-
if (!
|
|
47
|
-
const error = await
|
|
48
|
-
throw new Error(`
|
|
29
|
+
if (!deviceResponse.ok) {
|
|
30
|
+
const error = await deviceResponse.text();
|
|
31
|
+
throw new Error(`Device code request failed: ${error}`);
|
|
49
32
|
}
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
};
|
|
33
|
+
const deviceData = await deviceResponse.json();
|
|
34
|
+
// Prompt user to auth
|
|
35
|
+
callbacks.onAuth({
|
|
36
|
+
url: deviceData.verification_uri_complete || deviceData.verification_uri,
|
|
37
|
+
instructions: `Please visit ${deviceData.verification_uri} and enter code: ${deviceData.user_code}`,
|
|
38
|
+
});
|
|
39
|
+
// Poll for token
|
|
40
|
+
const expiresAt = Date.now() + deviceData.expires_in * 1000;
|
|
41
|
+
const pollInterval = (deviceData.interval || 5) * 1000;
|
|
42
|
+
while (Date.now() < expiresAt) {
|
|
43
|
+
await new Promise(resolve => setTimeout(resolve, pollInterval));
|
|
44
|
+
const tokenResponse = await fetch(KIMI_OAUTH_TOKEN_URL, {
|
|
45
|
+
method: 'POST',
|
|
46
|
+
headers: {
|
|
47
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
48
|
+
},
|
|
49
|
+
body: new URLSearchParams({
|
|
50
|
+
grant_type: 'urn:ietf:params:oauth:grant-type:device_code',
|
|
51
|
+
client_id: KIMI_OAUTH_CLIENT_ID,
|
|
52
|
+
device_code: deviceData.device_code,
|
|
53
|
+
}),
|
|
54
|
+
});
|
|
55
|
+
if (tokenResponse.ok) {
|
|
56
|
+
const tokenData = await tokenResponse.json();
|
|
57
|
+
return {
|
|
58
|
+
access: tokenData.access_token,
|
|
59
|
+
refresh: tokenData.refresh_token,
|
|
60
|
+
expires: Date.now() + tokenData.expires_in * 1000,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const errorData = await tokenResponse.json();
|
|
64
|
+
if (errorData.error === 'expired_token') {
|
|
65
|
+
throw new Error('Device code expired. Please try again.');
|
|
66
|
+
}
|
|
67
|
+
// authorization_pending - continue polling
|
|
68
|
+
}
|
|
69
|
+
throw new Error('Device code expired. Please try again.');
|
|
56
70
|
},
|
|
57
71
|
async refreshToken(credentials) {
|
|
58
72
|
if (!credentials.refresh) {
|
|
@@ -85,18 +99,7 @@ export const kimiOAuthProvider = {
|
|
|
85
99
|
return credentials.access;
|
|
86
100
|
},
|
|
87
101
|
};
|
|
88
|
-
function
|
|
89
|
-
const array = new Uint8Array(32);
|
|
90
|
-
crypto.getRandomValues(array);
|
|
91
|
-
return base64UrlEncode(array);
|
|
92
|
-
}
|
|
93
|
-
async function generateCodeChallenge(verifier) {
|
|
94
|
-
const encoder = new TextEncoder();
|
|
95
|
-
const data = encoder.encode(verifier);
|
|
96
|
-
const digest = await crypto.subtle.digest('SHA-256', data);
|
|
97
|
-
return base64UrlEncode(new Uint8Array(digest));
|
|
98
|
-
}
|
|
99
|
-
function base64UrlEncode(buffer) {
|
|
102
|
+
function _base64UrlEncode(buffer) {
|
|
100
103
|
let str = '';
|
|
101
104
|
buffer.forEach(b => str += String.fromCharCode(b));
|
|
102
105
|
return btoa(str).replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kimi.js","sourceRoot":"","sources":["../../../src/auth/oauth/kimi.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"kimi.js","sourceRoot":"","sources":["../../../src/auth/oauth/kimi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MiniMax CN (国内版) OAuth Provider
|
|
3
|
+
*
|
|
4
|
+
* OAuth 2.0 authentication for MiniMax 国内版 Platform.
|
|
5
|
+
* https://platform.minimax.chat/ (国内版)
|
|
6
|
+
*
|
|
7
|
+
* 注意:国内版和国际版的 OAuth 端点不同
|
|
8
|
+
* - 国际版: platform.minimaxi.com
|
|
9
|
+
* - 国内版: platform.minimax.chat
|
|
10
|
+
*/
|
|
11
|
+
import type { OAuthProviderInterface } from './types.js';
|
|
12
|
+
export declare const minimaxCnOAuthProvider: OAuthProviderInterface;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MiniMax CN (国内版) OAuth Provider
|
|
3
|
+
*
|
|
4
|
+
* OAuth 2.0 authentication for MiniMax 国内版 Platform.
|
|
5
|
+
* https://platform.minimax.chat/ (国内版)
|
|
6
|
+
*
|
|
7
|
+
* 注意:国内版和国际版的 OAuth 端点不同
|
|
8
|
+
* - 国际版: platform.minimaxi.com
|
|
9
|
+
* - 国内版: platform.minimax.chat
|
|
10
|
+
*/
|
|
11
|
+
const MINIMAX_CN_OAUTH_BASE_URL = 'https://platform.minimax.chat';
|
|
12
|
+
const MINIMAX_CN_OAUTH_AUTHORIZE_URL = `${MINIMAX_CN_OAUTH_BASE_URL}/oauth/authorize`;
|
|
13
|
+
const MINIMAX_CN_OAUTH_TOKEN_URL = `${MINIMAX_CN_OAUTH_BASE_URL}/oauth/token`;
|
|
14
|
+
const MINIMAX_CN_OAUTH_CLIENT_ID = 'your_client_id'; // Users need to register their own app
|
|
15
|
+
export const minimaxCnOAuthProvider = {
|
|
16
|
+
id: 'minimax-cn',
|
|
17
|
+
name: 'MiniMax 国内版',
|
|
18
|
+
usesCallbackServer: true,
|
|
19
|
+
async login(callbacks) {
|
|
20
|
+
// MiniMax CN uses authorization code flow
|
|
21
|
+
const codeVerifier = generateCodeVerifier();
|
|
22
|
+
const codeChallenge = await generateCodeChallenge(codeVerifier);
|
|
23
|
+
const authUrl = new URL(MINIMAX_CN_OAUTH_AUTHORIZE_URL);
|
|
24
|
+
authUrl.searchParams.set('client_id', MINIMAX_CN_OAUTH_CLIENT_ID);
|
|
25
|
+
authUrl.searchParams.set('redirect_uri', 'http://localhost:3000/callback');
|
|
26
|
+
authUrl.searchParams.set('response_type', 'code');
|
|
27
|
+
authUrl.searchParams.set('scope', 'api');
|
|
28
|
+
authUrl.searchParams.set('code_challenge', codeChallenge);
|
|
29
|
+
authUrl.searchParams.set('code_challenge_method', 'S256');
|
|
30
|
+
// Show user the auth URL
|
|
31
|
+
callbacks.onAuth({
|
|
32
|
+
url: authUrl.toString(),
|
|
33
|
+
instructions: '请在浏览器中授权应用,然后输入返回的授权码。',
|
|
34
|
+
});
|
|
35
|
+
// Prompt for the authorization code
|
|
36
|
+
const code = await callbacks.onPrompt({
|
|
37
|
+
message: '请输入授权码:',
|
|
38
|
+
});
|
|
39
|
+
// Exchange code for token
|
|
40
|
+
const tokenResponse = await fetch(MINIMAX_CN_OAUTH_TOKEN_URL, {
|
|
41
|
+
method: 'POST',
|
|
42
|
+
headers: {
|
|
43
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
44
|
+
},
|
|
45
|
+
body: new URLSearchParams({
|
|
46
|
+
grant_type: 'authorization_code',
|
|
47
|
+
client_id: MINIMAX_CN_OAUTH_CLIENT_ID,
|
|
48
|
+
code,
|
|
49
|
+
redirect_uri: 'http://localhost:3000/callback',
|
|
50
|
+
code_verifier: codeVerifier,
|
|
51
|
+
}),
|
|
52
|
+
});
|
|
53
|
+
if (!tokenResponse.ok) {
|
|
54
|
+
const error = await tokenResponse.text();
|
|
55
|
+
throw new Error(`Token exchange failed: ${error}`);
|
|
56
|
+
}
|
|
57
|
+
const tokenData = await tokenResponse.json();
|
|
58
|
+
return {
|
|
59
|
+
access: tokenData.access_token,
|
|
60
|
+
refresh: tokenData.refresh_token,
|
|
61
|
+
expires: Date.now() + tokenData.expires_in * 1000,
|
|
62
|
+
};
|
|
63
|
+
},
|
|
64
|
+
async refreshToken(credentials) {
|
|
65
|
+
if (!credentials.refresh) {
|
|
66
|
+
throw new Error('MiniMax CN OAuth refresh token missing. Re-authenticate.');
|
|
67
|
+
}
|
|
68
|
+
const response = await fetch(MINIMAX_CN_OAUTH_TOKEN_URL, {
|
|
69
|
+
method: 'POST',
|
|
70
|
+
headers: {
|
|
71
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
72
|
+
},
|
|
73
|
+
body: new URLSearchParams({
|
|
74
|
+
grant_type: 'refresh_token',
|
|
75
|
+
client_id: MINIMAX_CN_OAUTH_CLIENT_ID,
|
|
76
|
+
refresh_token: credentials.refresh,
|
|
77
|
+
}),
|
|
78
|
+
});
|
|
79
|
+
if (!response.ok) {
|
|
80
|
+
const text = await response.text();
|
|
81
|
+
throw new Error(`MiniMax CN OAuth refresh failed: ${text}`);
|
|
82
|
+
}
|
|
83
|
+
const payload = await response.json();
|
|
84
|
+
return {
|
|
85
|
+
...credentials,
|
|
86
|
+
access: payload.access_token,
|
|
87
|
+
refresh: payload.refresh_token || credentials.refresh,
|
|
88
|
+
expires: Date.now() + payload.expires_in * 1000,
|
|
89
|
+
};
|
|
90
|
+
},
|
|
91
|
+
getApiKey(credentials) {
|
|
92
|
+
return credentials.access;
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
function generateCodeVerifier() {
|
|
96
|
+
const array = new Uint8Array(32);
|
|
97
|
+
crypto.getRandomValues(array);
|
|
98
|
+
return base64UrlEncode(array);
|
|
99
|
+
}
|
|
100
|
+
async function generateCodeChallenge(verifier) {
|
|
101
|
+
const encoder = new TextEncoder();
|
|
102
|
+
const data = encoder.encode(verifier);
|
|
103
|
+
const digest = await crypto.subtle.digest('SHA-256', data);
|
|
104
|
+
return base64UrlEncode(new Uint8Array(digest));
|
|
105
|
+
}
|
|
106
|
+
function base64UrlEncode(buffer) {
|
|
107
|
+
let str = '';
|
|
108
|
+
buffer.forEach(b => str += String.fromCharCode(b));
|
|
109
|
+
return btoa(str).replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, '');
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=minimax-cn.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"minimax-cn.js","sourceRoot":"","sources":["../../../src/auth/oauth/minimax-cn.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,yBAAyB,GAAG,+BAA+B,CAAC;AAClE,MAAM,8BAA8B,GAAG,GAAG,yBAAyB,kBAAkB,CAAC;AACtF,MAAM,0BAA0B,GAAG,GAAG,yBAAyB,cAAc,CAAC;AAC9E,MAAM,0BAA0B,GAAG,gBAAgB,CAAC,CAAC,uCAAuC;AAE5F,MAAM,CAAC,MAAM,sBAAsB,GAA2B;IAC7D,EAAE,EAAE,YAAY;IAChB,IAAI,EAAE,aAAa;IACnB,kBAAkB,EAAE,IAAI;IAExB,KAAK,CAAC,KAAK,CAAC,SAA8B;QACzC,0CAA0C;QAC1C,MAAM,YAAY,GAAG,oBAAoB,EAAE,CAAC;QAC5C,MAAM,aAAa,GAAG,MAAM,qBAAqB,CAAC,YAAY,CAAC,CAAC;QAEhE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,8BAA8B,CAAC,CAAC;QACxD,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,0BAA0B,CAAC,CAAC;QAClE,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,gCAAgC,CAAC,CAAC;QAC3E,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QAClD,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACzC,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,EAAE,aAAa,CAAC,CAAC;QAC1D,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;QAE1D,yBAAyB;QACzB,SAAS,CAAC,MAAM,CAAC;YAChB,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE;YACvB,YAAY,EAAE,wBAAwB;SACtC,CAAC,CAAC;QAEH,oCAAoC;QACpC,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,QAAQ,CAAC;YACrC,OAAO,EAAE,SAAS;SAClB,CAAC,CAAC;QAEH,0BAA0B;QAC1B,MAAM,aAAa,GAAG,MAAM,KAAK,CAAC,0BAA0B,EAAE;YAC7D,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACR,cAAc,EAAE,mCAAmC;aACnD;YACD,IAAI,EAAE,IAAI,eAAe,CAAC;gBACzB,UAAU,EAAE,oBAAoB;gBAChC,SAAS,EAAE,0BAA0B;gBACrC,IAAI;gBACJ,YAAY,EAAE,gCAAgC;gBAC9C,aAAa,EAAE,YAAY;aAC3B,CAAC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,CAAC,EAAE,EAAE,CAAC;YACvB,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,IAAI,EAAE,CAAC;YACzC,MAAM,IAAI,KAAK,CAAC,0BAA0B,KAAK,EAAE,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,IAAI,EAIzC,CAAC;QAEF,OAAO;YACN,MAAM,EAAE,SAAS,CAAC,YAAY;YAC9B,OAAO,EAAE,SAAS,CAAC,aAAa;YAChC,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,UAAU,GAAG,IAAI;SACjD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,WAA6B;QAC/C,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;QAC7E,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,0BAA0B,EAAE;YACxD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACR,cAAc,EAAE,mCAAmC;aACnD;YACD,IAAI,EAAE,IAAI,eAAe,CAAC;gBACzB,UAAU,EAAE,eAAe;gBAC3B,SAAS,EAAE,0BAA0B;gBACrC,aAAa,EAAE,WAAW,CAAC,OAAO;aAClC,CAAC;SACF,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YAClB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,oCAAoC,IAAI,EAAE,CAAC,CAAC;QAC7D,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAIlC,CAAC;QAEF,OAAO;YACN,GAAG,WAAW;YACd,MAAM,EAAE,OAAO,CAAC,YAAY;YAC5B,OAAO,EAAE,OAAO,CAAC,aAAa,IAAI,WAAW,CAAC,OAAO;YACrD,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI;SAC/C,CAAC;IACH,CAAC;IAED,SAAS,CAAC,WAA6B;QACtC,OAAO,WAAW,CAAC,MAAM,CAAC;IAC3B,CAAC;CACD,CAAC;AAEF,SAAS,oBAAoB;IAC5B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IACjC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,QAAgB;IACpD,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC3D,OAAO,eAAe,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,eAAe,CAAC,MAAkB;IAC1C,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAC5E,CAAC"}
|
|
@@ -2,6 +2,11 @@
|
|
|
2
2
|
* Qwen Portal OAuth Provider
|
|
3
3
|
*
|
|
4
4
|
* OAuth 2.0 authentication for Qwen (DashScope).
|
|
5
|
+
*
|
|
6
|
+
* NOTE: Qwen now uses browser-based OAuth. Users need to:
|
|
7
|
+
* 1. Install Qwen Client: pip install qwen-cli
|
|
8
|
+
* 2. Run 'qwen' to authenticate in browser
|
|
9
|
+
* 3. Credentials are stored at ~/.qwen/oauth_creds.json
|
|
5
10
|
*/
|
|
6
11
|
import type { OAuthProviderInterface } from './types.js';
|
|
7
12
|
export declare const qwenPortalOAuthProvider: OAuthProviderInterface;
|
package/dist/auth/oauth/qwen.js
CHANGED
|
@@ -2,110 +2,80 @@
|
|
|
2
2
|
* Qwen Portal OAuth Provider
|
|
3
3
|
*
|
|
4
4
|
* OAuth 2.0 authentication for Qwen (DashScope).
|
|
5
|
+
*
|
|
6
|
+
* NOTE: Qwen now uses browser-based OAuth. Users need to:
|
|
7
|
+
* 1. Install Qwen Client: pip install qwen-cli
|
|
8
|
+
* 2. Run 'qwen' to authenticate in browser
|
|
9
|
+
* 3. Credentials are stored at ~/.qwen/oauth_creds.json
|
|
5
10
|
*/
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
11
|
+
import { readFileSync, existsSync } from 'fs';
|
|
12
|
+
import { join } from 'path';
|
|
13
|
+
import { homedir } from 'os';
|
|
14
|
+
const QWEN_CREDENTIALS_PATH = join(homedir(), '.qwen', 'oauth_creds.json');
|
|
9
15
|
export const qwenPortalOAuthProvider = {
|
|
10
16
|
id: 'qwen',
|
|
11
17
|
name: 'Qwen (通义千问)',
|
|
12
18
|
usesCallbackServer: false,
|
|
13
19
|
async login(callbacks) {
|
|
14
|
-
// Qwen uses
|
|
15
|
-
|
|
16
|
-
const deviceResponse = await fetch(deviceCodeUrl, {
|
|
17
|
-
method: 'POST',
|
|
18
|
-
headers: {
|
|
19
|
-
'Content-Type': 'application/json',
|
|
20
|
-
Accept: 'application/json',
|
|
21
|
-
},
|
|
22
|
-
body: JSON.stringify({
|
|
23
|
-
client_id: QWEN_OAUTH_CLIENT_ID,
|
|
24
|
-
scope: 'user:email',
|
|
25
|
-
}),
|
|
26
|
-
});
|
|
27
|
-
if (!deviceResponse.ok) {
|
|
28
|
-
throw new Error(`Qwen device code request failed: ${deviceResponse.statusText}`);
|
|
29
|
-
}
|
|
30
|
-
const deviceData = await deviceResponse.json();
|
|
31
|
-
// Show user the verification URL and code
|
|
20
|
+
// Qwen now uses browser-based OAuth
|
|
21
|
+
// User needs to install qwen-cli and run 'qwen' to authenticate
|
|
32
22
|
callbacks.onAuth({
|
|
33
|
-
url:
|
|
34
|
-
instructions: `
|
|
23
|
+
url: 'https://qwen.ai/',
|
|
24
|
+
instructions: `Please install Qwen CLI and authenticate:
|
|
25
|
+
|
|
26
|
+
1. Install: pip install qwen-cli (or brew install qwen)
|
|
27
|
+
2. Run: qwen
|
|
28
|
+
3. Follow the browser login flow
|
|
29
|
+
|
|
30
|
+
Credentials will be saved to: ${QWEN_CREDENTIALS_PATH}`,
|
|
35
31
|
});
|
|
36
|
-
//
|
|
37
|
-
const
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
device_code: deviceData.device_code,
|
|
51
|
-
client_id: QWEN_OAUTH_CLIENT_ID,
|
|
52
|
-
}),
|
|
53
|
-
});
|
|
54
|
-
if (!tokenResponse.ok) {
|
|
55
|
-
const error = await tokenResponse.json();
|
|
56
|
-
if (error.error === 'authorization_pending') {
|
|
57
|
-
callbacks.onProgress?.('Waiting for authorization...');
|
|
58
|
-
continue;
|
|
32
|
+
// Wait and check for credentials file
|
|
33
|
+
const maxAttempts = 30;
|
|
34
|
+
const interval = 2000;
|
|
35
|
+
for (let i = 0; i < maxAttempts; i++) {
|
|
36
|
+
await new Promise(r => setTimeout(r, interval));
|
|
37
|
+
if (existsSync(QWEN_CREDENTIALS_PATH)) {
|
|
38
|
+
try {
|
|
39
|
+
const credsData = JSON.parse(readFileSync(QWEN_CREDENTIALS_PATH, 'utf-8'));
|
|
40
|
+
// Qwen stores: access_token, refresh_token, expires_at, scope, token_type
|
|
41
|
+
return {
|
|
42
|
+
access: credsData.access_token,
|
|
43
|
+
refresh: credsData.refresh_token,
|
|
44
|
+
expires: credsData.expires_at * 1000, // Unix timestamp to ms
|
|
45
|
+
};
|
|
59
46
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
await new Promise(r => setTimeout(r, 2000));
|
|
63
|
-
continue;
|
|
47
|
+
catch (e) {
|
|
48
|
+
throw new Error(`Failed to read Qwen credentials: ${e}`);
|
|
64
49
|
}
|
|
65
|
-
throw new Error(`Token request failed: ${error.error}`);
|
|
66
50
|
}
|
|
67
|
-
|
|
68
|
-
return {
|
|
69
|
-
access: tokenData.access_token,
|
|
70
|
-
refresh: tokenData.refresh_token,
|
|
71
|
-
expires: Date.now() + tokenData.expires_in * 1000,
|
|
72
|
-
};
|
|
51
|
+
callbacks.onProgress?.(`Waiting for authentication... (${i + 1}/${maxAttempts})`);
|
|
73
52
|
}
|
|
74
|
-
throw new Error('
|
|
53
|
+
throw new Error('Authentication timeout. Please run "qwen" and complete the login flow.');
|
|
75
54
|
},
|
|
76
55
|
async refreshToken(credentials) {
|
|
77
56
|
if (!credentials.refresh) {
|
|
78
57
|
throw new Error('Qwen OAuth refresh token missing. Re-authenticate.');
|
|
79
58
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
const text = await response.text();
|
|
94
|
-
if (response.status === 400) {
|
|
95
|
-
throw new Error('Qwen OAuth refresh token expired or invalid. Re-authenticate.');
|
|
59
|
+
// Qwen tokens are stored in file, so we need to read the latest
|
|
60
|
+
if (!existsSync(QWEN_CREDENTIALS_PATH)) {
|
|
61
|
+
throw new Error('Qwen credentials file not found. Re-authenticate with "qwen" command.');
|
|
62
|
+
}
|
|
63
|
+
try {
|
|
64
|
+
const credsData = JSON.parse(readFileSync(QWEN_CREDENTIALS_PATH, 'utf-8'));
|
|
65
|
+
// Check if token is still valid
|
|
66
|
+
if (credsData.expires_at * 1000 > Date.now()) {
|
|
67
|
+
return {
|
|
68
|
+
access: credsData.access_token,
|
|
69
|
+
refresh: credsData.refresh_token,
|
|
70
|
+
expires: credsData.expires_at * 1000,
|
|
71
|
+
};
|
|
96
72
|
}
|
|
97
|
-
|
|
73
|
+
// Token expired, need re-auth
|
|
74
|
+
throw new Error('Qwen OAuth token expired. Please run "qwen" to re-authenticate.');
|
|
98
75
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
throw new Error('Qwen OAuth refresh response missing access token.');
|
|
76
|
+
catch (e) {
|
|
77
|
+
throw new Error(`Failed to refresh Qwen credentials: ${e}`);
|
|
102
78
|
}
|
|
103
|
-
return {
|
|
104
|
-
...credentials,
|
|
105
|
-
access: payload.access_token,
|
|
106
|
-
refresh: payload.refresh_token || credentials.refresh,
|
|
107
|
-
expires: Date.now() + payload.expires_in * 1000,
|
|
108
|
-
};
|
|
109
79
|
},
|
|
110
80
|
getApiKey(credentials) {
|
|
111
81
|
return credentials.access;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qwen.js","sourceRoot":"","sources":["../../../src/auth/oauth/qwen.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"qwen.js","sourceRoot":"","sources":["../../../src/auth/oauth/qwen.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/auth/profiles/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/auth/profiles/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACrE,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
|
package/dist/auth/storage.js
CHANGED
|
@@ -6,7 +6,13 @@
|
|
|
6
6
|
*/
|
|
7
7
|
import { existsSync, mkdirSync, readFileSync, writeFileSync, chmodSync } from 'fs';
|
|
8
8
|
import { dirname, join } from 'path';
|
|
9
|
-
|
|
9
|
+
/**
|
|
10
|
+
* Resolve config value (handles ${ENV_VAR} syntax)
|
|
11
|
+
*/
|
|
12
|
+
function resolveConfigValue(value) {
|
|
13
|
+
const match = /^\$\{([A-Z0-9_]+)\}$/.exec(value);
|
|
14
|
+
return match ? process.env[match[1]] ?? value : value;
|
|
15
|
+
}
|
|
10
16
|
export class AuthStorage {
|
|
11
17
|
filePath;
|
|
12
18
|
cache = new Map();
|
package/dist/auth/storage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/auth/storage.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AACnF,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACrC,
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/auth/storage.ts"],"names":[],"mappings":"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"}
|