@mikoto_zero/minigame-open-mcp 1.5.8 → 1.5.9
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/bin/minigame-open-mcp +5 -5
- package/dist/__tests__/version.test.d.ts +4 -0
- package/dist/__tests__/version.test.d.ts.map +1 -0
- package/dist/__tests__/version.test.js +18 -0
- package/dist/__tests__/version.test.js.map +1 -0
- package/dist/core/auth/oauth.d.ts +34 -0
- package/dist/core/auth/oauth.d.ts.map +1 -0
- package/dist/core/auth/oauth.js +118 -0
- package/dist/core/auth/oauth.js.map +1 -0
- package/dist/core/auth/oauthState.d.ts +41 -0
- package/dist/core/auth/oauthState.d.ts.map +1 -0
- package/dist/core/auth/oauthState.js +46 -0
- package/dist/core/auth/oauthState.js.map +1 -0
- package/dist/core/auth/tokenStorage.d.ts +33 -0
- package/dist/core/auth/tokenStorage.d.ts.map +1 -0
- package/dist/core/auth/tokenStorage.js +108 -0
- package/dist/core/auth/tokenStorage.js.map +1 -0
- package/dist/core/network/httpClient.d.ts +90 -0
- package/dist/core/network/httpClient.d.ts.map +1 -0
- package/dist/core/network/httpClient.js +360 -0
- package/dist/core/network/httpClient.js.map +1 -0
- package/dist/core/types/index.d.ts +116 -0
- package/dist/core/types/index.d.ts.map +1 -0
- package/dist/core/types/index.js +5 -0
- package/dist/core/types/index.js.map +1 -0
- package/dist/core/types/privateParams.d.ts +151 -0
- package/dist/core/types/privateParams.d.ts.map +1 -0
- package/dist/core/types/privateParams.js +129 -0
- package/dist/core/types/privateParams.js.map +1 -0
- package/dist/core/utils/cache.d.ts +63 -0
- package/dist/core/utils/cache.d.ts.map +1 -0
- package/dist/core/utils/cache.js +130 -0
- package/dist/core/utils/cache.js.map +1 -0
- package/dist/core/utils/contextResolver.d.ts +106 -0
- package/dist/core/utils/contextResolver.d.ts.map +1 -0
- package/dist/core/utils/contextResolver.js +118 -0
- package/dist/core/utils/contextResolver.js.map +1 -0
- package/dist/core/utils/docHelpers.d.ts +92 -0
- package/dist/core/utils/docHelpers.d.ts.map +1 -0
- package/dist/core/utils/docHelpers.js +138 -0
- package/dist/core/utils/docHelpers.js.map +1 -0
- package/dist/core/utils/env.d.ts +98 -0
- package/dist/core/utils/env.d.ts.map +1 -0
- package/dist/core/utils/env.js +227 -0
- package/dist/core/utils/env.js.map +1 -0
- package/dist/core/utils/handlerHelpers.d.ts +73 -0
- package/dist/core/utils/handlerHelpers.d.ts.map +1 -0
- package/dist/core/utils/handlerHelpers.js +157 -0
- package/dist/core/utils/handlerHelpers.js.map +1 -0
- package/dist/core/utils/logger.d.ts +111 -0
- package/dist/core/utils/logger.d.ts.map +1 -0
- package/dist/core/utils/logger.js +374 -0
- package/dist/core/utils/logger.js.map +1 -0
- package/dist/core/utils/pathResolver.d.ts +59 -0
- package/dist/core/utils/pathResolver.d.ts.map +1 -0
- package/dist/core/utils/pathResolver.js +115 -0
- package/dist/core/utils/pathResolver.js.map +1 -0
- package/dist/features/app/api.d.ts +146 -0
- package/dist/features/app/api.d.ts.map +1 -0
- package/dist/features/app/api.js +233 -0
- package/dist/features/app/api.js.map +1 -0
- package/dist/features/app/handlers.d.ts +40 -0
- package/dist/features/app/handlers.d.ts.map +1 -0
- package/dist/features/app/handlers.js +274 -0
- package/dist/features/app/handlers.js.map +1 -0
- package/dist/features/app/index.d.ts +10 -0
- package/dist/features/app/index.d.ts.map +1 -0
- package/dist/features/app/index.js +14 -0
- package/dist/features/app/index.js.map +1 -0
- package/dist/features/app/tools.d.ts +11 -0
- package/dist/features/app/tools.d.ts.map +1 -0
- package/dist/features/app/tools.js +183 -0
- package/dist/features/app/tools.js.map +1 -0
- package/dist/features/h5Game/api.d.ts +20 -0
- package/dist/features/h5Game/api.d.ts.map +1 -0
- package/dist/features/h5Game/api.js +16 -0
- package/dist/features/h5Game/api.js.map +1 -0
- package/dist/features/h5Game/handlers.d.ts +49 -0
- package/dist/features/h5Game/handlers.d.ts.map +1 -0
- package/dist/features/h5Game/handlers.js +356 -0
- package/dist/features/h5Game/handlers.js.map +1 -0
- package/dist/features/h5Game/index.d.ts +7 -0
- package/dist/features/h5Game/index.d.ts.map +1 -0
- package/dist/features/h5Game/index.js +11 -0
- package/dist/features/h5Game/index.js.map +1 -0
- package/dist/features/h5Game/messages.d.ts +79 -0
- package/dist/features/h5Game/messages.d.ts.map +1 -0
- package/dist/features/h5Game/messages.js +141 -0
- package/dist/features/h5Game/messages.js.map +1 -0
- package/dist/features/h5Game/tools.d.ts +14 -0
- package/dist/features/h5Game/tools.d.ts.map +1 -0
- package/dist/features/h5Game/tools.js +181 -0
- package/dist/features/h5Game/tools.js.map +1 -0
- package/dist/features/leaderboard/api.d.ts +157 -0
- package/dist/features/leaderboard/api.d.ts.map +1 -0
- package/dist/features/leaderboard/api.js +196 -0
- package/dist/features/leaderboard/api.js.map +1 -0
- package/dist/features/leaderboard/docTools.d.ts +66 -0
- package/dist/features/leaderboard/docTools.d.ts.map +1 -0
- package/dist/features/leaderboard/docTools.js +342 -0
- package/dist/features/leaderboard/docTools.js.map +1 -0
- package/dist/features/leaderboard/docs.d.ts +11 -0
- package/dist/features/leaderboard/docs.d.ts.map +1 -0
- package/dist/features/leaderboard/docs.js +498 -0
- package/dist/features/leaderboard/docs.js.map +1 -0
- package/dist/features/leaderboard/handlers.d.ts +52 -0
- package/dist/features/leaderboard/handlers.d.ts.map +1 -0
- package/dist/features/leaderboard/handlers.js +370 -0
- package/dist/features/leaderboard/handlers.js.map +1 -0
- package/dist/features/leaderboard/index.d.ts +10 -0
- package/dist/features/leaderboard/index.d.ts.map +1 -0
- package/dist/features/leaderboard/index.js +27 -0
- package/dist/features/leaderboard/index.js.map +1 -0
- package/dist/features/leaderboard/resources.d.ts +11 -0
- package/dist/features/leaderboard/resources.d.ts.map +1 -0
- package/dist/features/leaderboard/resources.js +68 -0
- package/dist/features/leaderboard/resources.js.map +1 -0
- package/dist/features/leaderboard/tools.d.ts +11 -0
- package/dist/features/leaderboard/tools.d.ts.map +1 -0
- package/dist/features/leaderboard/tools.js +146 -0
- package/dist/features/leaderboard/tools.js.map +1 -0
- package/dist/features/vibrate/api.d.ts +16 -0
- package/dist/features/vibrate/api.d.ts.map +1 -0
- package/dist/features/vibrate/api.js +17 -0
- package/dist/features/vibrate/api.js.map +1 -0
- package/dist/features/vibrate/docTools.d.ts +55 -0
- package/dist/features/vibrate/docTools.d.ts.map +1 -0
- package/dist/features/vibrate/docTools.js +503 -0
- package/dist/features/vibrate/docTools.js.map +1 -0
- package/dist/features/vibrate/docs.d.ts +11 -0
- package/dist/features/vibrate/docs.d.ts.map +1 -0
- package/dist/features/vibrate/docs.js +183 -0
- package/dist/features/vibrate/docs.js.map +1 -0
- package/dist/features/vibrate/index.d.ts +14 -0
- package/dist/features/vibrate/index.d.ts.map +1 -0
- package/dist/features/vibrate/index.js +28 -0
- package/dist/features/vibrate/index.js.map +1 -0
- package/dist/features/vibrate/resources.d.ts +9 -0
- package/dist/features/vibrate/resources.d.ts.map +1 -0
- package/dist/features/vibrate/resources.js +54 -0
- package/dist/features/vibrate/resources.js.map +1 -0
- package/dist/features/vibrate/tools.d.ts +11 -0
- package/dist/features/vibrate/tools.d.ts.map +1 -0
- package/dist/features/vibrate/tools.js +27 -0
- package/dist/features/vibrate/tools.js.map +1 -0
- package/dist/mcp-proxy/config.d.ts +17 -0
- package/dist/mcp-proxy/config.d.ts.map +1 -0
- package/dist/mcp-proxy/config.js +144 -0
- package/dist/mcp-proxy/config.js.map +1 -0
- package/dist/mcp-proxy/index.d.ts +13 -0
- package/dist/mcp-proxy/index.d.ts.map +1 -0
- package/dist/mcp-proxy/index.js +51 -0
- package/dist/mcp-proxy/index.js.map +1 -0
- package/dist/mcp-proxy/proxy.d.ts +61 -0
- package/dist/mcp-proxy/proxy.d.ts.map +1 -0
- package/dist/mcp-proxy/proxy.js +334 -0
- package/dist/mcp-proxy/proxy.js.map +1 -0
- package/dist/mcp-proxy/types.d.ts +55 -0
- package/dist/mcp-proxy/types.d.ts.map +1 -0
- package/dist/mcp-proxy/types.js +5 -0
- package/dist/mcp-proxy/types.js.map +1 -0
- package/dist/proxy.js +1 -1
- package/dist/server.d.ts +6 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +514 -0
- package/dist/server.js.map +1 -0
- package/dist/version.d.ts +9 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +29 -0
- package/dist/version.js.map +1 -0
- package/package.json +14 -14
- package/dist/server-bundle.js +0 -54848
package/bin/minigame-open-mcp
CHANGED
|
@@ -16,17 +16,17 @@ const __dirname = dirname(__filename);
|
|
|
16
16
|
// Get package root directory
|
|
17
17
|
const packageRoot = join(__dirname, '..');
|
|
18
18
|
|
|
19
|
-
// Check if
|
|
20
|
-
const distPath = join(packageRoot, 'dist', 'server
|
|
19
|
+
// Check if compiled version exists
|
|
20
|
+
const distPath = join(packageRoot, 'dist', 'server.js');
|
|
21
21
|
|
|
22
22
|
if (existsSync(distPath)) {
|
|
23
|
-
// Use
|
|
23
|
+
// Use compiled version (ES Module dynamic import)
|
|
24
24
|
import(distPath).catch(error => {
|
|
25
25
|
console.error('❌ Failed to start server:', error);
|
|
26
26
|
process.exit(1);
|
|
27
27
|
});
|
|
28
28
|
} else {
|
|
29
|
-
console.error('❌ Server
|
|
30
|
-
console.error(' npm run build
|
|
29
|
+
console.error('❌ Server not found. Please build the project first:');
|
|
30
|
+
console.error(' npm run build');
|
|
31
31
|
process.exit(1);
|
|
32
32
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/version.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* 基础测试 - 确保测试框架正常工作
|
|
4
|
+
*/
|
|
5
|
+
describe('Basic Tests', () => {
|
|
6
|
+
test('simple math should work', () => {
|
|
7
|
+
expect(1 + 1).toBe(2);
|
|
8
|
+
});
|
|
9
|
+
test('string concatenation should work', () => {
|
|
10
|
+
expect('hello' + ' ' + 'world').toBe('hello world');
|
|
11
|
+
});
|
|
12
|
+
test('array operations should work', () => {
|
|
13
|
+
const arr = [1, 2, 3];
|
|
14
|
+
expect(arr.length).toBe(3);
|
|
15
|
+
expect(arr[0]).toBe(1);
|
|
16
|
+
});
|
|
17
|
+
});
|
|
18
|
+
//# sourceMappingURL=version.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.test.js","sourceRoot":"","sources":["../../src/__tests__/version.test.ts"],"names":[],"mappings":";AAAA;;GAEG;AAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,OAAO,GAAG,GAAG,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACxC,MAAM,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACtB,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth 2.0 Device Code Flow 实现
|
|
3
|
+
* 职责:处理 OAuth 网络请求
|
|
4
|
+
*/
|
|
5
|
+
import type { MacToken } from '../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* Device Code Response
|
|
8
|
+
*/
|
|
9
|
+
export interface DeviceCodeData {
|
|
10
|
+
device_code: string;
|
|
11
|
+
qrcode_url: string;
|
|
12
|
+
expires_in?: number;
|
|
13
|
+
interval?: number;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Poll options
|
|
17
|
+
*/
|
|
18
|
+
export interface PollOptions {
|
|
19
|
+
maxAttempts?: number;
|
|
20
|
+
intervalMs?: number;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* 请求 device code
|
|
24
|
+
*/
|
|
25
|
+
export declare function requestDeviceCode(environment?: string): Promise<DeviceCodeData>;
|
|
26
|
+
/**
|
|
27
|
+
* 生成授权 URL
|
|
28
|
+
*/
|
|
29
|
+
export declare function generateAuthUrl(qrcodeUrl: string, environment?: string): string;
|
|
30
|
+
/**
|
|
31
|
+
* 轮询获取 token
|
|
32
|
+
*/
|
|
33
|
+
export declare function pollForToken(deviceCode: string, environment?: string, options?: PollOptions): Promise<MacToken>;
|
|
34
|
+
//# sourceMappingURL=oauth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../../src/core/auth/oauth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,GAAE,MAAqB,GAAG,OAAO,CAAC,cAAc,CAAC,CA0CnG;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,GAAE,MAAqB,GAAG,MAAM,CAG7F;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,MAAM,EAClB,WAAW,GAAE,MAAqB,EAClC,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,QAAQ,CAAC,CA8EnB"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth 2.0 Device Code Flow 实现
|
|
3
|
+
* 职责:处理 OAuth 网络请求
|
|
4
|
+
*/
|
|
5
|
+
import { EnvConfig } from '../utils/env.js';
|
|
6
|
+
/**
|
|
7
|
+
* 请求 device code
|
|
8
|
+
*/
|
|
9
|
+
export async function requestDeviceCode(environment = 'production') {
|
|
10
|
+
const endpoints = EnvConfig.getEndpoints(environment);
|
|
11
|
+
const clientId = EnvConfig.clientId;
|
|
12
|
+
if (!clientId) {
|
|
13
|
+
throw new Error('❌ 未配置 Client ID\n\n' +
|
|
14
|
+
'请设置环境变量:TAPTAP_MCP_CLIENT_ID\n\n' +
|
|
15
|
+
'获取方式:\n' +
|
|
16
|
+
'1. 登录 TapTap 开放平台: https://developer.taptap.cn\n' +
|
|
17
|
+
'2. 创建或选择应用\n' +
|
|
18
|
+
'3. 在「开发者中心 - 应用配置」中获取 Client ID');
|
|
19
|
+
}
|
|
20
|
+
const url = `https://${endpoints.authHost}/oauth2/v1/device/code`;
|
|
21
|
+
const params = new URLSearchParams({
|
|
22
|
+
client_id: clientId,
|
|
23
|
+
response_type: 'device_code',
|
|
24
|
+
scope: 'public_profile'
|
|
25
|
+
});
|
|
26
|
+
const response = await fetch(url, {
|
|
27
|
+
method: 'POST',
|
|
28
|
+
headers: {
|
|
29
|
+
'Content-Type': 'application/x-www-form-urlencoded'
|
|
30
|
+
},
|
|
31
|
+
body: params
|
|
32
|
+
});
|
|
33
|
+
if (!response.ok) {
|
|
34
|
+
throw new Error(`Failed to get device code: ${response.status} ${response.statusText}`);
|
|
35
|
+
}
|
|
36
|
+
const json = await response.json();
|
|
37
|
+
if (json.success === true && json.data) {
|
|
38
|
+
return json.data;
|
|
39
|
+
}
|
|
40
|
+
throw new Error(`Failed to get device code: ${json.data?.msg || 'Unknown error'}`);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 生成授权 URL
|
|
44
|
+
*/
|
|
45
|
+
export function generateAuthUrl(qrcodeUrl, environment = 'production') {
|
|
46
|
+
const endpoints = EnvConfig.getEndpoints(environment);
|
|
47
|
+
return endpoints.qrcodeBaseUrl + encodeURIComponent(qrcodeUrl);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* 轮询获取 token
|
|
51
|
+
*/
|
|
52
|
+
export async function pollForToken(deviceCode, environment = 'production', options) {
|
|
53
|
+
const endpoints = EnvConfig.getEndpoints(environment);
|
|
54
|
+
const clientId = EnvConfig.clientId;
|
|
55
|
+
if (!clientId) {
|
|
56
|
+
throw new Error('❌ 未配置 Client ID,请设置环境变量:TAPTAP_MCP_CLIENT_ID');
|
|
57
|
+
}
|
|
58
|
+
const url = `https://${endpoints.authHost}/oauth2/v1/token`;
|
|
59
|
+
const maxAttempts = options?.maxAttempts || 60;
|
|
60
|
+
const intervalMs = options?.intervalMs || 2000;
|
|
61
|
+
let attempts = 0;
|
|
62
|
+
while (attempts < maxAttempts) {
|
|
63
|
+
attempts++;
|
|
64
|
+
await new Promise(resolve => setTimeout(resolve, intervalMs));
|
|
65
|
+
const params = new URLSearchParams({
|
|
66
|
+
grant_type: 'device_token',
|
|
67
|
+
client_id: clientId,
|
|
68
|
+
secret_type: 'hmac-sha-1',
|
|
69
|
+
code: deviceCode
|
|
70
|
+
});
|
|
71
|
+
try {
|
|
72
|
+
const response = await fetch(url, {
|
|
73
|
+
method: 'POST',
|
|
74
|
+
headers: {
|
|
75
|
+
'Content-Type': 'application/x-www-form-urlencoded'
|
|
76
|
+
},
|
|
77
|
+
body: params
|
|
78
|
+
});
|
|
79
|
+
const json = await response.json();
|
|
80
|
+
// 成功获取 token
|
|
81
|
+
if (json.success === true && json.data) {
|
|
82
|
+
return {
|
|
83
|
+
kid: json.data.kid,
|
|
84
|
+
mac_key: json.data.mac_key,
|
|
85
|
+
token_type: json.data.token_type || 'mac',
|
|
86
|
+
mac_algorithm: json.data.mac_algorithm || 'hmac-sha-1'
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
// 检查错误类型
|
|
90
|
+
const error = json.data?.error;
|
|
91
|
+
if (error === 'authorization_pending' || error === 'authorization_waiting') {
|
|
92
|
+
// 继续等待
|
|
93
|
+
if (attempts % 5 === 0) {
|
|
94
|
+
const elapsed = attempts * (intervalMs / 1000);
|
|
95
|
+
process.stderr.write(`⏳ 等待授权中... (${elapsed}秒)\n`);
|
|
96
|
+
}
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
// 其他错误
|
|
100
|
+
if (error === 'expired_token') {
|
|
101
|
+
throw new Error('❌ 授权码已过期,请重新获取授权链接');
|
|
102
|
+
}
|
|
103
|
+
if (error === 'access_denied') {
|
|
104
|
+
throw new Error('❌ 用户拒绝授权');
|
|
105
|
+
}
|
|
106
|
+
throw new Error(`❌ 授权失败: ${json.data?.error_description || error || 'Unknown error'}`);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
if (error instanceof Error && error.message.includes('❌')) {
|
|
110
|
+
throw error;
|
|
111
|
+
}
|
|
112
|
+
// 网络错误,继续轮询
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
throw new Error('⏰ 授权超时(2分钟),请重新获取授权链接');
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../../src/core/auth/oauth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth 全局状态管理
|
|
3
|
+
* 用于在 server.ts 和 handlers 之间共享 OAuth 状态
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* OAuth 待完成状态
|
|
7
|
+
*/
|
|
8
|
+
interface PendingOAuthState {
|
|
9
|
+
deviceCode: string;
|
|
10
|
+
environment: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* 全局 OAuth 状态
|
|
14
|
+
*/
|
|
15
|
+
declare class OAuthStateManager {
|
|
16
|
+
private pendingState;
|
|
17
|
+
private authInProgress;
|
|
18
|
+
/**
|
|
19
|
+
* 设置待完成的 OAuth 状态
|
|
20
|
+
*/
|
|
21
|
+
setPendingState(state: PendingOAuthState | null): void;
|
|
22
|
+
/**
|
|
23
|
+
* 获取待完成的 OAuth 状态
|
|
24
|
+
*/
|
|
25
|
+
getPendingState(): PendingOAuthState | null;
|
|
26
|
+
/**
|
|
27
|
+
* 清除待完成的 OAuth 状态
|
|
28
|
+
*/
|
|
29
|
+
clearPendingState(): void;
|
|
30
|
+
/**
|
|
31
|
+
* 设置授权进行中标志
|
|
32
|
+
*/
|
|
33
|
+
setAuthInProgress(inProgress: boolean): void;
|
|
34
|
+
/**
|
|
35
|
+
* 检查是否有授权正在进行
|
|
36
|
+
*/
|
|
37
|
+
isAuthInProgress(): boolean;
|
|
38
|
+
}
|
|
39
|
+
export declare const oauthState: OAuthStateManager;
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=oauthState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauthState.d.ts","sourceRoot":"","sources":["../../../src/core/auth/oauthState.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,UAAU,iBAAiB;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,cAAM,iBAAiB;IACrB,OAAO,CAAC,YAAY,CAAkC;IACtD,OAAO,CAAC,cAAc,CAAkB;IAExC;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,iBAAiB,GAAG,IAAI,GAAG,IAAI;IAItD;;OAEG;IACH,eAAe,IAAI,iBAAiB,GAAG,IAAI;IAI3C;;OAEG;IACH,iBAAiB,IAAI,IAAI;IAIzB;;OAEG;IACH,iBAAiB,CAAC,UAAU,EAAE,OAAO,GAAG,IAAI;IAI5C;;OAEG;IACH,gBAAgB,IAAI,OAAO;CAG5B;AAGD,eAAO,MAAM,UAAU,mBAA0B,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OAuth 全局状态管理
|
|
3
|
+
* 用于在 server.ts 和 handlers 之间共享 OAuth 状态
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* 全局 OAuth 状态
|
|
7
|
+
*/
|
|
8
|
+
class OAuthStateManager {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.pendingState = null;
|
|
11
|
+
this.authInProgress = false;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 设置待完成的 OAuth 状态
|
|
15
|
+
*/
|
|
16
|
+
setPendingState(state) {
|
|
17
|
+
this.pendingState = state;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 获取待完成的 OAuth 状态
|
|
21
|
+
*/
|
|
22
|
+
getPendingState() {
|
|
23
|
+
return this.pendingState;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* 清除待完成的 OAuth 状态
|
|
27
|
+
*/
|
|
28
|
+
clearPendingState() {
|
|
29
|
+
this.pendingState = null;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* 设置授权进行中标志
|
|
33
|
+
*/
|
|
34
|
+
setAuthInProgress(inProgress) {
|
|
35
|
+
this.authInProgress = inProgress;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 检查是否有授权正在进行
|
|
39
|
+
*/
|
|
40
|
+
isAuthInProgress() {
|
|
41
|
+
return this.authInProgress;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// 导出单例
|
|
45
|
+
export const oauthState = new OAuthStateManager();
|
|
46
|
+
//# sourceMappingURL=oauthState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oauthState.js","sourceRoot":"","sources":["../../../src/core/auth/oauthState.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH;;GAEG;AACH,MAAM,iBAAiB;IAAvB;QACU,iBAAY,GAA6B,IAAI,CAAC;QAC9C,mBAAc,GAAY,KAAK,CAAC;IAoC1C,CAAC;IAlCC;;OAEG;IACH,eAAe,CAAC,KAA+B;QAC7C,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC5B,CAAC;IAED;;OAEG;IACH,eAAe;QACb,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,iBAAiB;QACf,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;IAC3B,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,UAAmB;QACnC,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,gBAAgB;QACd,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;CACF;AAED,OAAO;AACP,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,iBAAiB,EAAE,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token 持久化管理
|
|
3
|
+
* 职责:Token 的读取、保存、清除
|
|
4
|
+
*/
|
|
5
|
+
import type { MacToken } from '../types/index.js';
|
|
6
|
+
export interface TokenStorageOptions {
|
|
7
|
+
environment?: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* 获取 token 文件路径
|
|
11
|
+
*/
|
|
12
|
+
export declare function getTokenPath(): string;
|
|
13
|
+
/**
|
|
14
|
+
* 从环境变量加载 token(优先级最高)
|
|
15
|
+
*/
|
|
16
|
+
export declare function loadTokenFromEnv(): MacToken | null;
|
|
17
|
+
/**
|
|
18
|
+
* 从本地文件加载 token
|
|
19
|
+
*/
|
|
20
|
+
export declare function loadTokenFromFile(filePath?: string): MacToken | null;
|
|
21
|
+
/**
|
|
22
|
+
* 加载 token(优先级:环境变量 > 本地文件)
|
|
23
|
+
*/
|
|
24
|
+
export declare function loadToken(filePath?: string): MacToken | null;
|
|
25
|
+
/**
|
|
26
|
+
* 保存 token 到本地文件
|
|
27
|
+
*/
|
|
28
|
+
export declare function saveToken(token: MacToken, options?: TokenStorageOptions): void;
|
|
29
|
+
/**
|
|
30
|
+
* 清除本地 token 文件
|
|
31
|
+
*/
|
|
32
|
+
export declare function clearToken(filePath?: string): void;
|
|
33
|
+
//# sourceMappingURL=tokenStorage.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenStorage.d.ts","sourceRoot":"","sources":["../../../src/core/auth/tokenStorage.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,WAAW,mBAAmB;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAGrC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,QAAQ,GAAG,IAAI,CAalD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAgBpE;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAiB5D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,IAAI,CAoB9E;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAWlD"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token 持久化管理
|
|
3
|
+
* 职责:Token 的读取、保存、清除
|
|
4
|
+
*/
|
|
5
|
+
import * as path from 'node:path';
|
|
6
|
+
import * as fs from 'node:fs';
|
|
7
|
+
import { EnvConfig } from '../utils/env.js';
|
|
8
|
+
/**
|
|
9
|
+
* 获取 token 文件路径
|
|
10
|
+
*/
|
|
11
|
+
export function getTokenPath() {
|
|
12
|
+
const cacheDir = EnvConfig.cacheDir;
|
|
13
|
+
return path.join(cacheDir, 'global', 'oauth-token.json');
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* 从环境变量加载 token(优先级最高)
|
|
17
|
+
*/
|
|
18
|
+
export function loadTokenFromEnv() {
|
|
19
|
+
const envToken = EnvConfig.macToken;
|
|
20
|
+
if (envToken) {
|
|
21
|
+
try {
|
|
22
|
+
const token = JSON.parse(envToken);
|
|
23
|
+
if (token.kid && token.mac_key) {
|
|
24
|
+
return token;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
process.stderr.write('⚠️ Invalid TAPTAP_MCP_MAC_TOKEN format in environment\n');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 从本地文件加载 token
|
|
35
|
+
*/
|
|
36
|
+
export function loadTokenFromFile(filePath) {
|
|
37
|
+
const tokenPath = filePath || getTokenPath();
|
|
38
|
+
if (fs.existsSync(tokenPath)) {
|
|
39
|
+
try {
|
|
40
|
+
const content = fs.readFileSync(tokenPath, 'utf8');
|
|
41
|
+
const token = JSON.parse(content);
|
|
42
|
+
if (token.kid && token.mac_key) {
|
|
43
|
+
return token;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
catch (error) {
|
|
47
|
+
process.stderr.write(`⚠️ Invalid token file: ${tokenPath}\n`);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* 加载 token(优先级:环境变量 > 本地文件)
|
|
54
|
+
*/
|
|
55
|
+
export function loadToken(filePath) {
|
|
56
|
+
// 1. Try environment variable
|
|
57
|
+
const envToken = loadTokenFromEnv();
|
|
58
|
+
if (envToken) {
|
|
59
|
+
process.stderr.write('✅ Loaded MAC Token from environment variable\n');
|
|
60
|
+
return envToken;
|
|
61
|
+
}
|
|
62
|
+
// 2. Try local file
|
|
63
|
+
const fileToken = loadTokenFromFile(filePath);
|
|
64
|
+
if (fileToken) {
|
|
65
|
+
const tokenPath = filePath || getTokenPath();
|
|
66
|
+
process.stderr.write(`✅ Loaded MAC Token from: ${tokenPath}\n`);
|
|
67
|
+
return fileToken;
|
|
68
|
+
}
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* 保存 token 到本地文件
|
|
73
|
+
*/
|
|
74
|
+
export function saveToken(token, options) {
|
|
75
|
+
const tokenPath = getTokenPath();
|
|
76
|
+
try {
|
|
77
|
+
const dir = path.dirname(tokenPath);
|
|
78
|
+
if (!fs.existsSync(dir)) {
|
|
79
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
80
|
+
}
|
|
81
|
+
const tokenData = {
|
|
82
|
+
...token,
|
|
83
|
+
saved_at: new Date().toISOString(),
|
|
84
|
+
environment: options?.environment
|
|
85
|
+
};
|
|
86
|
+
fs.writeFileSync(tokenPath, JSON.stringify(tokenData, null, 2), 'utf8');
|
|
87
|
+
process.stderr.write(`✅ Token saved to: ${tokenPath}\n`);
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
process.stderr.write(`⚠️ Failed to save token: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* 清除本地 token 文件
|
|
95
|
+
*/
|
|
96
|
+
export function clearToken(filePath) {
|
|
97
|
+
const tokenPath = filePath || getTokenPath();
|
|
98
|
+
if (fs.existsSync(tokenPath)) {
|
|
99
|
+
try {
|
|
100
|
+
fs.unlinkSync(tokenPath);
|
|
101
|
+
process.stderr.write(`✅ Token cleared: ${tokenPath}\n`);
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
process.stderr.write(`⚠️ Failed to clear token: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=tokenStorage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokenStorage.js","sourceRoot":"","sources":["../../../src/core/auth/tokenStorage.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP Client for TapTap API Requests
|
|
3
|
+
* Handles MAC authentication, request signing, headers, and error responses
|
|
4
|
+
*/
|
|
5
|
+
import { MacToken } from '../types/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* API 配置管理
|
|
8
|
+
* 管理 API 请求相关的配置和认证信息
|
|
9
|
+
*/
|
|
10
|
+
export declare class ApiConfig {
|
|
11
|
+
private static instance;
|
|
12
|
+
macToken: MacToken;
|
|
13
|
+
readonly clientId: string;
|
|
14
|
+
readonly signingKey: string;
|
|
15
|
+
readonly apiBaseUrl: string;
|
|
16
|
+
readonly environment: 'rnd' | 'production';
|
|
17
|
+
private constructor();
|
|
18
|
+
private validateConfig;
|
|
19
|
+
static getInstance(): ApiConfig;
|
|
20
|
+
/**
|
|
21
|
+
* Set MAC Token (called by Device Flow or manual configuration)
|
|
22
|
+
*/
|
|
23
|
+
setMacToken(token: MacToken): void;
|
|
24
|
+
isConfigured(): boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* HTTP request options
|
|
28
|
+
*/
|
|
29
|
+
export interface RequestOptions {
|
|
30
|
+
headers?: Record<string, string>;
|
|
31
|
+
body?: unknown;
|
|
32
|
+
params?: Record<string, string>;
|
|
33
|
+
timeout?: number;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* HTTP response wrapper
|
|
37
|
+
*/
|
|
38
|
+
export interface ApiResponse<T = unknown> {
|
|
39
|
+
success: boolean;
|
|
40
|
+
data?: T;
|
|
41
|
+
message?: string;
|
|
42
|
+
error?: string;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Generic HTTP Client for TapTap API
|
|
46
|
+
*/
|
|
47
|
+
export declare class HttpClient {
|
|
48
|
+
private config;
|
|
49
|
+
private overrideMacToken?;
|
|
50
|
+
/**
|
|
51
|
+
* @param context - Optional handler context (for macToken and projectPath)
|
|
52
|
+
*/
|
|
53
|
+
constructor(context?: import('../types/index.js').HandlerContext);
|
|
54
|
+
/**
|
|
55
|
+
* Make a GET request
|
|
56
|
+
*/
|
|
57
|
+
get<T = unknown>(path: string, options?: RequestOptions): Promise<T>;
|
|
58
|
+
/**
|
|
59
|
+
* Make a POST request
|
|
60
|
+
*/
|
|
61
|
+
post<T = unknown>(path: string, options?: RequestOptions): Promise<T>;
|
|
62
|
+
/**
|
|
63
|
+
* Generic request method with MAC authentication and signature
|
|
64
|
+
*/
|
|
65
|
+
private request;
|
|
66
|
+
/**
|
|
67
|
+
* Generate MAC Authorization header
|
|
68
|
+
* Format: MAC id="kid", ts="timestamp", nonce="random", mac="signature"
|
|
69
|
+
*/
|
|
70
|
+
private generateMacAuthorization;
|
|
71
|
+
/**
|
|
72
|
+
* Build MAC signature base string
|
|
73
|
+
*/
|
|
74
|
+
private buildMacSignatureBase;
|
|
75
|
+
/**
|
|
76
|
+
* Generate request signature for X-Tap-Sign header
|
|
77
|
+
* Format: HMAC-SHA256(method + url + headers + body, signing_key)
|
|
78
|
+
*/
|
|
79
|
+
private generateSignature;
|
|
80
|
+
/**
|
|
81
|
+
* Get headers part for signature
|
|
82
|
+
* Only includes X-Tap-* headers (excluding X-Tap-Sign)
|
|
83
|
+
*/
|
|
84
|
+
private getHeadersPart;
|
|
85
|
+
/**
|
|
86
|
+
* Generate random string
|
|
87
|
+
*/
|
|
88
|
+
private generateRandomString;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=httpClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpClient.d.ts","sourceRoot":"","sources":["../../../src/core/network/httpClient.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAI7C;;;GAGG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAY;IAE5B,QAAQ,EAAE,QAAQ,CAAC;IAC1B,SAAgB,QAAQ,EAAE,MAAM,CAAC;IACjC,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,UAAU,EAAE,MAAM,CAAC;IACnC,SAAgB,WAAW,EAAE,KAAK,GAAG,YAAY,CAAC;IAElD,OAAO;IA0BP,OAAO,CAAC,cAAc;WAqBR,WAAW,IAAI,SAAS;IAOtC;;OAEG;IACI,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAIlC,YAAY,IAAI,OAAO;CAG/B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,gBAAgB,CAAC,CAAW;IAEpC;;OAEG;gBACS,OAAO,CAAC,EAAE,OAAO,mBAAmB,EAAE,cAAc;IAQhE;;OAEG;IACG,GAAG,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,CAAC,CAAC;IAI9E;;OAEG;IACG,IAAI,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,CAAC,CAAC;IAI/E;;OAEG;YACW,OAAO;IAqMrB;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IAoChC;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAoB7B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAiCzB;;;OAGG;IACH,OAAO,CAAC,cAAc;IAuBtB;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAQ7B"}
|