localsbnb-mcp-server 1.0.9 → 1.0.11

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.
Files changed (193) hide show
  1. package/dist/auth/apiKeyManager.js +1 -121
  2. package/dist/auth/index.js +1 -3
  3. package/dist/auth/permissionChecker.js +1 -71
  4. package/dist/client/cacheManager.js +1 -64
  5. package/dist/client/httpClient.js +1 -125
  6. package/dist/client/index.js +1 -4
  7. package/dist/client/retryHandler.js +1 -68
  8. package/dist/config/index.js +1 -39
  9. package/dist/config/tools.js +1 -332
  10. package/dist/index.js +1 -33
  11. package/dist/package.json +5 -3
  12. package/dist/server.js +1 -129
  13. package/dist/start.mjs +1 -33
  14. package/dist/tools/channels/getChannelDetails.js +1 -30
  15. package/dist/tools/channels/index.js +1 -6
  16. package/dist/tools/channels/listChannels.js +1 -29
  17. package/dist/tools/finance/analyzeRevenue.js +1 -30
  18. package/dist/tools/finance/index.js +1 -8
  19. package/dist/tools/finance/queryFinancialData.js +1 -30
  20. package/dist/tools/finance/queryOperationalData.js +1 -30
  21. package/dist/tools/finance/queryOperationalDataV2.js +1 -175
  22. package/dist/tools/orders/cancelOrder.js +1 -27
  23. package/dist/tools/orders/getOrderDetails.js +1 -23
  24. package/dist/tools/orders/getOrderDetailsV2.js +1 -51
  25. package/dist/tools/orders/index.js +1 -16
  26. package/dist/tools/orders/ordersGetShared.js +1 -83
  27. package/dist/tools/orders/queryInHouseOrders.js +1 -34
  28. package/dist/tools/orders/queryOrders.js +1 -37
  29. package/dist/tools/orders/queryOrdersByDateRange.js +1 -79
  30. package/dist/tools/orders/queryPreArrivalOrders.js +1 -34
  31. package/dist/tools/orders/queryPreDepartureOrders.js +1 -34
  32. package/dist/tools/orders/queryTodayOrders.js +1 -49
  33. package/dist/tools/rooms/batchUpdatePrices.js +1 -40
  34. package/dist/tools/rooms/index.js +1 -7
  35. package/dist/tools/rooms/queryRoomPrices.js +1 -75
  36. package/dist/tools/rooms/queryRoomStatusNew.js +1 -70
  37. package/dist/tools/rooms/queryTodayRoomStatus.js +1 -70
  38. package/dist/tools/rooms/updateRoomPrice.js +1 -39
  39. package/dist/types/api.js +1 -3
  40. package/dist/types/index.js +1 -3
  41. package/dist/types/mcp.js +1 -2
  42. package/dist/types/tools.js +1 -2
  43. package/dist/utils/desensitize.js +1 -119
  44. package/dist/utils/errorHandler.js +1 -246
  45. package/dist/utils/index.js +1 -7
  46. package/dist/utils/logger.js +1 -37
  47. package/dist/utils/price.js +1 -9
  48. package/dist/utils/shanghaiDate.js +1 -44
  49. package/dist/utils/validator.js +1 -153
  50. package/package.json +5 -3
  51. package/dist/auth/apiKeyManager.d.ts +0 -61
  52. package/dist/auth/apiKeyManager.d.ts.map +0 -1
  53. package/dist/auth/apiKeyManager.js.map +0 -1
  54. package/dist/auth/index.d.ts +0 -3
  55. package/dist/auth/index.d.ts.map +0 -1
  56. package/dist/auth/index.js.map +0 -1
  57. package/dist/auth/permissionChecker.d.ts +0 -10
  58. package/dist/auth/permissionChecker.d.ts.map +0 -1
  59. package/dist/auth/permissionChecker.js.map +0 -1
  60. package/dist/client/cacheManager.d.ts +0 -24
  61. package/dist/client/cacheManager.d.ts.map +0 -1
  62. package/dist/client/cacheManager.js.map +0 -1
  63. package/dist/client/httpClient.d.ts +0 -12
  64. package/dist/client/httpClient.d.ts.map +0 -1
  65. package/dist/client/httpClient.js.map +0 -1
  66. package/dist/client/index.d.ts +0 -4
  67. package/dist/client/index.d.ts.map +0 -1
  68. package/dist/client/index.js.map +0 -1
  69. package/dist/client/retryHandler.d.ts +0 -18
  70. package/dist/client/retryHandler.d.ts.map +0 -1
  71. package/dist/client/retryHandler.js.map +0 -1
  72. package/dist/config/index.d.ts +0 -24
  73. package/dist/config/index.d.ts.map +0 -1
  74. package/dist/config/index.js.map +0 -1
  75. package/dist/config/tools.d.ts +0 -7
  76. package/dist/config/tools.d.ts.map +0 -1
  77. package/dist/config/tools.js.map +0 -1
  78. package/dist/index.d.ts +0 -3
  79. package/dist/index.d.ts.map +0 -1
  80. package/dist/index.js.map +0 -1
  81. package/dist/logs/combined.log +0 -30
  82. package/dist/logs/error.log +0 -0
  83. package/dist/server.d.ts +0 -26
  84. package/dist/server.d.ts.map +0 -1
  85. package/dist/server.js.map +0 -1
  86. package/dist/tools/channels/getChannelDetails.d.ts +0 -3
  87. package/dist/tools/channels/getChannelDetails.d.ts.map +0 -1
  88. package/dist/tools/channels/getChannelDetails.js.map +0 -1
  89. package/dist/tools/channels/index.d.ts +0 -1
  90. package/dist/tools/channels/index.d.ts.map +0 -1
  91. package/dist/tools/channels/index.js.map +0 -1
  92. package/dist/tools/channels/listChannels.d.ts +0 -3
  93. package/dist/tools/channels/listChannels.d.ts.map +0 -1
  94. package/dist/tools/channels/listChannels.js.map +0 -1
  95. package/dist/tools/finance/analyzeRevenue.d.ts +0 -3
  96. package/dist/tools/finance/analyzeRevenue.d.ts.map +0 -1
  97. package/dist/tools/finance/analyzeRevenue.js.map +0 -1
  98. package/dist/tools/finance/index.d.ts +0 -2
  99. package/dist/tools/finance/index.d.ts.map +0 -1
  100. package/dist/tools/finance/index.js.map +0 -1
  101. package/dist/tools/finance/queryFinancialData.d.ts +0 -3
  102. package/dist/tools/finance/queryFinancialData.d.ts.map +0 -1
  103. package/dist/tools/finance/queryFinancialData.js.map +0 -1
  104. package/dist/tools/finance/queryOperationalData.d.ts +0 -3
  105. package/dist/tools/finance/queryOperationalData.d.ts.map +0 -1
  106. package/dist/tools/finance/queryOperationalData.js.map +0 -1
  107. package/dist/tools/finance/queryOperationalDataV2.d.ts +0 -3
  108. package/dist/tools/finance/queryOperationalDataV2.d.ts.map +0 -1
  109. package/dist/tools/finance/queryOperationalDataV2.js.map +0 -1
  110. package/dist/tools/orders/cancelOrder.d.ts +0 -3
  111. package/dist/tools/orders/cancelOrder.d.ts.map +0 -1
  112. package/dist/tools/orders/cancelOrder.js.map +0 -1
  113. package/dist/tools/orders/getOrderDetails.d.ts +0 -3
  114. package/dist/tools/orders/getOrderDetails.d.ts.map +0 -1
  115. package/dist/tools/orders/getOrderDetails.js.map +0 -1
  116. package/dist/tools/orders/getOrderDetailsV2.d.ts +0 -3
  117. package/dist/tools/orders/getOrderDetailsV2.d.ts.map +0 -1
  118. package/dist/tools/orders/getOrderDetailsV2.js.map +0 -1
  119. package/dist/tools/orders/index.d.ts +0 -7
  120. package/dist/tools/orders/index.d.ts.map +0 -1
  121. package/dist/tools/orders/index.js.map +0 -1
  122. package/dist/tools/orders/ordersGetShared.d.ts +0 -33
  123. package/dist/tools/orders/ordersGetShared.d.ts.map +0 -1
  124. package/dist/tools/orders/ordersGetShared.js.map +0 -1
  125. package/dist/tools/orders/queryInHouseOrders.d.ts +0 -3
  126. package/dist/tools/orders/queryInHouseOrders.d.ts.map +0 -1
  127. package/dist/tools/orders/queryInHouseOrders.js.map +0 -1
  128. package/dist/tools/orders/queryOrders.d.ts +0 -3
  129. package/dist/tools/orders/queryOrders.d.ts.map +0 -1
  130. package/dist/tools/orders/queryOrders.js.map +0 -1
  131. package/dist/tools/orders/queryOrdersByDateRange.d.ts +0 -3
  132. package/dist/tools/orders/queryOrdersByDateRange.d.ts.map +0 -1
  133. package/dist/tools/orders/queryOrdersByDateRange.js.map +0 -1
  134. package/dist/tools/orders/queryPreArrivalOrders.d.ts +0 -3
  135. package/dist/tools/orders/queryPreArrivalOrders.d.ts.map +0 -1
  136. package/dist/tools/orders/queryPreArrivalOrders.js.map +0 -1
  137. package/dist/tools/orders/queryPreDepartureOrders.d.ts +0 -3
  138. package/dist/tools/orders/queryPreDepartureOrders.d.ts.map +0 -1
  139. package/dist/tools/orders/queryPreDepartureOrders.js.map +0 -1
  140. package/dist/tools/orders/queryTodayOrders.d.ts +0 -3
  141. package/dist/tools/orders/queryTodayOrders.d.ts.map +0 -1
  142. package/dist/tools/orders/queryTodayOrders.js.map +0 -1
  143. package/dist/tools/rooms/batchUpdatePrices.d.ts +0 -3
  144. package/dist/tools/rooms/batchUpdatePrices.d.ts.map +0 -1
  145. package/dist/tools/rooms/batchUpdatePrices.js.map +0 -1
  146. package/dist/tools/rooms/index.d.ts +0 -6
  147. package/dist/tools/rooms/index.d.ts.map +0 -1
  148. package/dist/tools/rooms/index.js.map +0 -1
  149. package/dist/tools/rooms/queryRoomPrices.d.ts +0 -3
  150. package/dist/tools/rooms/queryRoomPrices.d.ts.map +0 -1
  151. package/dist/tools/rooms/queryRoomPrices.js.map +0 -1
  152. package/dist/tools/rooms/queryRoomStatusNew.d.ts +0 -28
  153. package/dist/tools/rooms/queryRoomStatusNew.d.ts.map +0 -1
  154. package/dist/tools/rooms/queryRoomStatusNew.js.map +0 -1
  155. package/dist/tools/rooms/queryTodayRoomStatus.d.ts +0 -3
  156. package/dist/tools/rooms/queryTodayRoomStatus.d.ts.map +0 -1
  157. package/dist/tools/rooms/queryTodayRoomStatus.js.map +0 -1
  158. package/dist/tools/rooms/updateRoomPrice.d.ts +0 -3
  159. package/dist/tools/rooms/updateRoomPrice.d.ts.map +0 -1
  160. package/dist/tools/rooms/updateRoomPrice.js.map +0 -1
  161. package/dist/types/api.d.ts +0 -122
  162. package/dist/types/api.d.ts.map +0 -1
  163. package/dist/types/api.js.map +0 -1
  164. package/dist/types/index.d.ts +0 -5
  165. package/dist/types/index.d.ts.map +0 -1
  166. package/dist/types/index.js.map +0 -1
  167. package/dist/types/mcp.d.ts +0 -41
  168. package/dist/types/mcp.d.ts.map +0 -1
  169. package/dist/types/mcp.js.map +0 -1
  170. package/dist/types/tools.d.ts +0 -93
  171. package/dist/types/tools.d.ts.map +0 -1
  172. package/dist/types/tools.js.map +0 -1
  173. package/dist/utils/desensitize.d.ts +0 -38
  174. package/dist/utils/desensitize.d.ts.map +0 -1
  175. package/dist/utils/desensitize.js.map +0 -1
  176. package/dist/utils/errorHandler.d.ts +0 -36
  177. package/dist/utils/errorHandler.d.ts.map +0 -1
  178. package/dist/utils/errorHandler.js.map +0 -1
  179. package/dist/utils/index.d.ts +0 -7
  180. package/dist/utils/index.d.ts.map +0 -1
  181. package/dist/utils/index.js.map +0 -1
  182. package/dist/utils/logger.d.ts +0 -4
  183. package/dist/utils/logger.d.ts.map +0 -1
  184. package/dist/utils/logger.js.map +0 -1
  185. package/dist/utils/price.d.ts +0 -5
  186. package/dist/utils/price.d.ts.map +0 -1
  187. package/dist/utils/price.js.map +0 -1
  188. package/dist/utils/shanghaiDate.d.ts +0 -31
  189. package/dist/utils/shanghaiDate.d.ts.map +0 -1
  190. package/dist/utils/shanghaiDate.js.map +0 -1
  191. package/dist/utils/validator.d.ts +0 -273
  192. package/dist/utils/validator.d.ts.map +0 -1
  193. package/dist/utils/validator.js.map +0 -1
@@ -1,121 +1 @@
1
- import { logger } from '../utils/logger.js';
2
- export class APIKeyManager {
3
- apiKey = null;
4
- scopes = [];
5
- hudsonAccessToken = null;
6
- campId = null;
7
- /**
8
- * 从环境变量加载API密钥
9
- */
10
- loadFromEnv() {
11
- this.apiKey = process.env.LUKEYUN_API_KEY || null;
12
- const scopesStr = process.env.LUKEYUN_API_SCOPES;
13
- this.scopes = scopesStr ? scopesStr.split(',').map((s) => s.trim()) : [];
14
- // 加载应用鉴权信息(APP_SECRET / APP_ID)
15
- this.hudsonAccessToken = process.env.APP_SECRET || null;
16
- this.campId = process.env.APP_ID || null;
17
- if (!this.apiKey) {
18
- logger.warn('API key not found in environment variables');
19
- }
20
- else {
21
- logger.info('API key loaded from environment', { hasScopes: this.scopes.length > 0 });
22
- }
23
- if (!this.hudsonAccessToken || !this.campId) {
24
- logger.warn('APP_SECRET or APP_ID not found in environment variables');
25
- }
26
- else {
27
- logger.info('Hudson credentials loaded from environment');
28
- }
29
- }
30
- /**
31
- * 从配置文件加载API密钥
32
- */
33
- loadFromConfig(config) {
34
- this.apiKey = config.apiKey || null;
35
- this.scopes = config.scopes || [];
36
- this.hudsonAccessToken = config.hudsonAccessToken || null;
37
- this.campId = config.campId || null;
38
- if (this.apiKey) {
39
- logger.info('API key loaded from config', { hasScopes: this.scopes.length > 0 });
40
- }
41
- if (this.hudsonAccessToken && this.campId) {
42
- logger.info('Hudson credentials loaded from config');
43
- }
44
- }
45
- /**
46
- * 设置API密钥
47
- */
48
- setAPIKey(apiKey, scopes) {
49
- this.apiKey = apiKey;
50
- this.scopes = scopes || [];
51
- logger.info('API key set', { hasScopes: this.scopes.length > 0 });
52
- }
53
- /**
54
- * 设置Hudson认证信息
55
- */
56
- setHudsonCredentials(accessToken, campId) {
57
- this.hudsonAccessToken = accessToken;
58
- this.campId = campId;
59
- logger.info('Hudson credentials set');
60
- }
61
- /**
62
- * 获取API密钥
63
- * 如果未配置,返回空字符串(用于仅使用Hudson认证的场景)
64
- */
65
- getAPIKey() {
66
- return this.apiKey || '';
67
- }
68
- /**
69
- * 检查是否配置了API密钥
70
- */
71
- hasAPIKey() {
72
- return this.apiKey !== null && this.apiKey !== '';
73
- }
74
- /**
75
- * 检查是否有指定权限
76
- */
77
- hasScope(scope) {
78
- // 如果有 * 权限,则拥有所有权限
79
- if (this.scopes.includes('*')) {
80
- return true;
81
- }
82
- return this.scopes.includes(scope);
83
- }
84
- /**
85
- * 获取所有权限范围
86
- */
87
- getScopes() {
88
- return [...this.scopes];
89
- }
90
- /**
91
- * 检查是否已配置
92
- */
93
- isConfigured() {
94
- return this.apiKey !== null;
95
- }
96
- /**
97
- * 检查Hudson认证是否已配置
98
- */
99
- isHudsonConfigured() {
100
- return this.hudsonAccessToken !== null && this.campId !== null;
101
- }
102
- /**
103
- * 获取Hudson访问令牌
104
- */
105
- getHudsonAccessToken() {
106
- if (!this.hudsonAccessToken) {
107
- throw new Error('APP_SECRET not configured. Please set APP_SECRET environment variable.');
108
- }
109
- return this.hudsonAccessToken;
110
- }
111
- /**
112
- * 获取Camp ID
113
- */
114
- getCampId() {
115
- if (!this.campId) {
116
- throw new Error('APP_ID not configured. Please set APP_ID environment variable.');
117
- }
118
- return this.campId;
119
- }
120
- }
121
- //# sourceMappingURL=apiKeyManager.js.map
1
+ function _0x26d9(_0x29a545,_0x1bdfba){const _0x5e4387=_0x5e43();return _0x26d9=function(_0x26d987,_0x8bc682){_0x26d987=_0x26d987-0x95;let _0x50f5aa=_0x5e4387[_0x26d987];return _0x50f5aa;},_0x26d9(_0x29a545,_0x1bdfba);}function _0x5e43(){const _0x1a8504=['setAPIKey','getScopes','split','getCampId','info','79767VzKKGp','APP_SECRET','hudsonAccessToken','hasAPIKey','Hudson\x20credentials\x20loaded\x20from\x20config','LUKEYUN_API_SCOPES','APP_ID','API\x20key\x20loaded\x20from\x20environment','trim','includes','campId','length','API\x20key\x20set','warn','1832931JAxSRt','getHudsonAccessToken','APP_SECRET\x20or\x20APP_ID\x20not\x20found\x20in\x20environment\x20variables','Hudson\x20credentials\x20set','scopes','apiKey','loadFromEnv','APP_ID\x20not\x20configured.\x20Please\x20set\x20APP_ID\x20environment\x20variable.','isConfigured','1673960pvVQof','3242JyGaWP','6bsFmwW','getAPIKey','11BhKrvm','env','isHudsonConfigured','map','52crLjnJ','18933020iwMpCr','4271393IzNZze','132vjesYI','6444296IRGFoq','API\x20key\x20not\x20found\x20in\x20environment\x20variables'];_0x5e43=function(){return _0x1a8504;};return _0x5e43();}(function(_0x189880,_0x51a7da){const _0xd1c076=_0x189880();while(!![]){try{const _0xdf193e=parseInt(_0x26d9(0xb2))/0x1*(-parseInt(_0x26d9(0xbc))/0x2)+-parseInt(_0x26d9(0x9a))/0x3*(parseInt(_0x26d9(0xb9))/0x4)+parseInt(_0x26d9(0xb1))/0x5*(parseInt(_0x26d9(0xb3))/0x6)+-parseInt(_0x26d9(0xbb))/0x7+-parseInt(_0x26d9(0xbd))/0x8+parseInt(_0x26d9(0xa8))/0x9+parseInt(_0x26d9(0xba))/0xa*(parseInt(_0x26d9(0xb5))/0xb);if(_0xdf193e===_0x51a7da)break;else _0xd1c076['push'](_0xd1c076['shift']());}catch(_0x4afdd8){_0xd1c076['push'](_0xd1c076['shift']());}}}(_0x5e43,0x6f6c4));import{logger}from'../utils/logger.js';export class APIKeyManager{[_0x26d9(0xad)]=null;['scopes']=[];[_0x26d9(0x9c)]=null;[_0x26d9(0xa4)]=null;[_0x26d9(0xae)](){this['apiKey']=process[_0x26d9(0xb6)]['LUKEYUN_API_KEY']||null;const _0x4c1a54=process[_0x26d9(0xb6)][_0x26d9(0x9f)];this[_0x26d9(0xac)]=_0x4c1a54?_0x4c1a54[_0x26d9(0x97)](',')[_0x26d9(0xb8)](_0x5ea3d2=>_0x5ea3d2[_0x26d9(0xa2)]()):[],this[_0x26d9(0x9c)]=process[_0x26d9(0xb6)][_0x26d9(0x9b)]||null,this[_0x26d9(0xa4)]=process[_0x26d9(0xb6)][_0x26d9(0xa0)]||null,!this[_0x26d9(0xad)]?logger[_0x26d9(0xa7)](_0x26d9(0xbe)):logger[_0x26d9(0x99)](_0x26d9(0xa1),{'hasScopes':this[_0x26d9(0xac)]['length']>0x0}),!this[_0x26d9(0x9c)]||!this[_0x26d9(0xa4)]?logger[_0x26d9(0xa7)](_0x26d9(0xaa)):logger[_0x26d9(0x99)]('Hudson\x20credentials\x20loaded\x20from\x20environment');}['loadFromConfig'](_0x17a5ac){this[_0x26d9(0xad)]=_0x17a5ac['apiKey']||null,this[_0x26d9(0xac)]=_0x17a5ac[_0x26d9(0xac)]||[],this[_0x26d9(0x9c)]=_0x17a5ac['hudsonAccessToken']||null,this[_0x26d9(0xa4)]=_0x17a5ac[_0x26d9(0xa4)]||null,this[_0x26d9(0xad)]&&logger['info']('API\x20key\x20loaded\x20from\x20config',{'hasScopes':this['scopes'][_0x26d9(0xa5)]>0x0}),this[_0x26d9(0x9c)]&&this['campId']&&logger[_0x26d9(0x99)](_0x26d9(0x9e));}[_0x26d9(0x95)](_0x348ce2,_0x4938a2){this[_0x26d9(0xad)]=_0x348ce2,this[_0x26d9(0xac)]=_0x4938a2||[],logger[_0x26d9(0x99)](_0x26d9(0xa6),{'hasScopes':this['scopes'][_0x26d9(0xa5)]>0x0});}['setHudsonCredentials'](_0x15fd2d,_0x3dfa16){this['hudsonAccessToken']=_0x15fd2d,this[_0x26d9(0xa4)]=_0x3dfa16,logger[_0x26d9(0x99)](_0x26d9(0xab));}[_0x26d9(0xb4)](){return this[_0x26d9(0xad)]||'';}[_0x26d9(0x9d)](){return this[_0x26d9(0xad)]!==null&&this['apiKey']!=='';}['hasScope'](_0x28980c){if(this[_0x26d9(0xac)][_0x26d9(0xa3)]('*'))return!![];return this[_0x26d9(0xac)]['includes'](_0x28980c);}[_0x26d9(0x96)](){return[...this[_0x26d9(0xac)]];}[_0x26d9(0xb0)](){return this[_0x26d9(0xad)]!==null;}[_0x26d9(0xb7)](){return this[_0x26d9(0x9c)]!==null&&this[_0x26d9(0xa4)]!==null;}[_0x26d9(0xa9)](){if(!this[_0x26d9(0x9c)])throw new Error('APP_SECRET\x20not\x20configured.\x20Please\x20set\x20APP_SECRET\x20environment\x20variable.');return this[_0x26d9(0x9c)];}[_0x26d9(0x98)](){if(!this[_0x26d9(0xa4)])throw new Error(_0x26d9(0xaf));return this[_0x26d9(0xa4)];}}
@@ -1,3 +1 @@
1
- export { APIKeyManager } from './apiKeyManager.js';
2
- export { PermissionChecker } from './permissionChecker.js';
3
- //# sourceMappingURL=index.js.map
1
+ (function(_0x4f1810,_0x36bbd9){var _0x1df192=_0x4f1810();while(!![]){try{var _0x213f1f=parseInt(_0x1bfb(0x16a))/0x1*(-parseInt(_0x1bfb(0x15e))/0x2)+-parseInt(_0x1bfb(0x163))/0x3+-parseInt(_0x1bfb(0x167))/0x4*(parseInt(_0x1bfb(0x168))/0x5)+parseInt(_0x1bfb(0x165))/0x6*(-parseInt(_0x1bfb(0x161))/0x7)+parseInt(_0x1bfb(0x15f))/0x8*(-parseInt(_0x1bfb(0x162))/0x9)+-parseInt(_0x1bfb(0x160))/0xa*(-parseInt(_0x1bfb(0x166))/0xb)+parseInt(_0x1bfb(0x164))/0xc*(parseInt(_0x1bfb(0x169))/0xd);if(_0x213f1f===_0x36bbd9)break;else _0x1df192['push'](_0x1df192['shift']());}catch(_0x31a4ac){_0x1df192['push'](_0x1df192['shift']());}}}(_0x4ed9,0x466e7));function _0x1bfb(_0xb3e2c9,_0x5e62d9){var _0x4ed93c=_0x4ed9();return _0x1bfb=function(_0x1bfb60,_0xa44310){_0x1bfb60=_0x1bfb60-0x15e;var _0x2c9966=_0x4ed93c[_0x1bfb60];return _0x2c9966;},_0x1bfb(_0xb3e2c9,_0x5e62d9);}function _0x4ed9(){var _0x2d834c=['4GvAwtV','1133695FJRcxn','11230063UPKNis','59AOgFTC','606YYmOBU','159832NMagfo','790jKlqwo','14JpDcMD','171NSQZvn','1482402jQakAG','12khzXcJ','92844bgkZmf','79915htgGwR'];_0x4ed9=function(){return _0x2d834c;};return _0x4ed9();}export{APIKeyManager}from'./apiKeyManager.js';export{PermissionChecker}from'./permissionChecker.js';
@@ -1,71 +1 @@
1
- import { MCPError, ErrorCode, getPermissionDeniedMessage, } from '../utils/errorHandler.js';
2
- import { logger } from '../utils/logger.js';
3
- function toolToPermissionDomain(toolName) {
4
- switch (toolName) {
5
- case 'query_today_orders':
6
- case 'query_pre_arrival_orders':
7
- case 'query_in_house_orders':
8
- case 'query_pre_departure_orders':
9
- case 'query_orders_by_date_range':
10
- case 'get_order_details_v2':
11
- case 'query_orders':
12
- case 'get_order_details':
13
- return 'orders';
14
- case 'query_operational_data_v2':
15
- return 'finance';
16
- case 'query_today_room_status':
17
- case 'query_room_status_new':
18
- return 'room_status';
19
- case 'query_room_prices':
20
- return 'room_price';
21
- default:
22
- return 'generic';
23
- }
24
- }
25
- export class PermissionChecker {
26
- keyManager;
27
- constructor(keyManager) {
28
- this.keyManager = keyManager;
29
- }
30
- /**
31
- * 检查工具调用权限
32
- */
33
- checkPermission(toolName, requiredScopes) {
34
- if (requiredScopes.length === 0) {
35
- // 如果没有权限要求,则允许
36
- return;
37
- }
38
- // 如果只有Hudson认证(没有API key和权限范围),则允许所有操作
39
- // 因为Hudson认证本身就包含了权限验证
40
- if (!this.keyManager.hasAPIKey() && this.keyManager.isHudsonConfigured()) {
41
- logger.debug('Permission check passed (Hudson auth only)', {
42
- tool: toolName,
43
- requiredScopes,
44
- });
45
- return;
46
- }
47
- const hasPermission = requiredScopes.some((scope) => this.keyManager.hasScope(scope));
48
- if (!hasPermission) {
49
- const scopes = this.keyManager.getScopes();
50
- const domain = toolToPermissionDomain(toolName);
51
- logger.warn('Permission denied', {
52
- tool: toolName,
53
- required: requiredScopes,
54
- current: scopes,
55
- domain,
56
- });
57
- throw new MCPError(ErrorCode.PERMISSION_DENIED, getPermissionDeniedMessage(domain), {
58
- tool: toolName,
59
- requiredScopes,
60
- currentScopes: scopes,
61
- domain,
62
- source: '路客云AI',
63
- });
64
- }
65
- logger.debug('Permission check passed', {
66
- tool: toolName,
67
- scopes: requiredScopes,
68
- });
69
- }
70
- }
71
- //# sourceMappingURL=permissionChecker.js.map
1
+ (function(_0x1151f8,_0x36f166){const _0x1dfa77=_0x1151f8();while(!![]){try{const _0x4898dd=-parseInt(_0x5bc5(0x18f))/0x1*(parseInt(_0x5bc5(0x17e))/0x2)+parseInt(_0x5bc5(0x183))/0x3*(parseInt(_0x5bc5(0x178))/0x4)+-parseInt(_0x5bc5(0x195))/0x5*(-parseInt(_0x5bc5(0x189))/0x6)+-parseInt(_0x5bc5(0x197))/0x7*(-parseInt(_0x5bc5(0x182))/0x8)+parseInt(_0x5bc5(0x180))/0x9*(parseInt(_0x5bc5(0x199))/0xa)+-parseInt(_0x5bc5(0x18b))/0xb*(parseInt(_0x5bc5(0x184))/0xc)+-parseInt(_0x5bc5(0x18e))/0xd*(parseInt(_0x5bc5(0x198))/0xe);if(_0x4898dd===_0x36f166)break;else _0x1dfa77['push'](_0x1dfa77['shift']());}catch(_0x2f5006){_0x1dfa77['push'](_0x1dfa77['shift']());}}}(_0x1a06,0xe2be9));import{MCPError,ErrorCode,getPermissionDeniedMessage}from'../utils/errorHandler.js';function _0x1a06(){const _0x2f51f6=['query_today_orders','length','hasScope','getScopes','PERMISSION_DENIED','3392405QwXHiO','generic','2116051eDdzHT','209986UTBlaM','40Tumbkd','get_order_details_v2','4TDGdeq','query_pre_arrival_orders','finance','query_room_status_new','Permission\x20check\x20passed','hasAPIKey','14KumclP','keyManager','3391425flzVwD','query_pre_departure_orders','40ZjRbte','3359514ASOWfx','7008RTFHum','room_status','get_order_details','debug','some','6emETok','checkPermission','5346EQtUtR','isHudsonConfigured','query_in_house_orders','2470GALTtA','107815cVAZno'];_0x1a06=function(){return _0x2f51f6;};return _0x1a06();}function _0x5bc5(_0x5bf110,_0x5b2c29){const _0x1a0652=_0x1a06();return _0x5bc5=function(_0x5bc52d,_0x5cbfcb){_0x5bc52d=_0x5bc52d-0x177;let _0x5180bb=_0x1a0652[_0x5bc52d];return _0x5180bb;},_0x5bc5(_0x5bf110,_0x5b2c29);}import{logger}from'../utils/logger.js';function toolToPermissionDomain(_0x3b9cbb){switch(_0x3b9cbb){case _0x5bc5(0x190):case _0x5bc5(0x179):case _0x5bc5(0x18d):case _0x5bc5(0x181):case'query_orders_by_date_range':case _0x5bc5(0x177):case'query_orders':case _0x5bc5(0x186):return'orders';case'query_operational_data_v2':return _0x5bc5(0x17a);case'query_today_room_status':case _0x5bc5(0x17b):return _0x5bc5(0x185);case'query_room_prices':return'room_price';default:return _0x5bc5(0x196);}}export class PermissionChecker{[_0x5bc5(0x17f)];constructor(_0x5655e4){this[_0x5bc5(0x17f)]=_0x5655e4;}[_0x5bc5(0x18a)](_0x56c3ac,_0x2c8db3){if(_0x2c8db3[_0x5bc5(0x191)]===0x0)return;if(!this[_0x5bc5(0x17f)][_0x5bc5(0x17d)]()&&this['keyManager'][_0x5bc5(0x18c)]()){logger[_0x5bc5(0x187)]('Permission\x20check\x20passed\x20(Hudson\x20auth\x20only)',{'tool':_0x56c3ac,'requiredScopes':_0x2c8db3});return;}const _0x1fdd37=_0x2c8db3[_0x5bc5(0x188)](_0x1891c5=>this[_0x5bc5(0x17f)][_0x5bc5(0x192)](_0x1891c5));if(!_0x1fdd37){const _0x2b4418=this['keyManager'][_0x5bc5(0x193)](),_0x1ae448=toolToPermissionDomain(_0x56c3ac);logger['warn']('Permission\x20denied',{'tool':_0x56c3ac,'required':_0x2c8db3,'current':_0x2b4418,'domain':_0x1ae448});throw new MCPError(ErrorCode[_0x5bc5(0x194)],getPermissionDeniedMessage(_0x1ae448),{'tool':_0x56c3ac,'requiredScopes':_0x2c8db3,'currentScopes':_0x2b4418,'domain':_0x1ae448,'source':'路客云AI'});}logger[_0x5bc5(0x187)](_0x5bc5(0x17c),{'tool':_0x56c3ac,'scopes':_0x2c8db3});}}
@@ -1,64 +1 @@
1
- import { config } from '../config/index.js';
2
- import { logger } from '../utils/logger.js';
3
- export class CacheManager {
4
- cache = new Map();
5
- /**
6
- * 获取缓存数据
7
- */
8
- get(key) {
9
- if (!config.cache.enabled) {
10
- return null;
11
- }
12
- const entry = this.cache.get(key);
13
- if (!entry) {
14
- return null;
15
- }
16
- // 检查是否过期
17
- if (Date.now() > entry.expiresAt) {
18
- this.cache.delete(key);
19
- logger.debug('Cache expired', { key });
20
- return null;
21
- }
22
- logger.debug('Cache hit', { key });
23
- return entry.data;
24
- }
25
- /**
26
- * 设置缓存数据
27
- */
28
- set(key, data, ttl) {
29
- if (!config.cache.enabled) {
30
- return;
31
- }
32
- const ttlMs = ttl || config.cache.ttl;
33
- this.cache.set(key, {
34
- data,
35
- expiresAt: Date.now() + ttlMs,
36
- });
37
- logger.debug('Cache set', { key, ttl: ttlMs });
38
- }
39
- /**
40
- * 删除缓存
41
- */
42
- delete(key) {
43
- this.cache.delete(key);
44
- logger.debug('Cache deleted', { key });
45
- }
46
- /**
47
- * 清空所有缓存
48
- */
49
- clear() {
50
- this.cache.clear();
51
- logger.debug('Cache cleared');
52
- }
53
- /**
54
- * 生成缓存键
55
- */
56
- static generateKey(prefix, params) {
57
- const sortedParams = Object.keys(params)
58
- .sort()
59
- .map((key) => `${key}=${JSON.stringify(params[key])}`)
60
- .join('&');
61
- return `${prefix}:${sortedParams}`;
62
- }
63
- }
64
- //# sourceMappingURL=cacheManager.js.map
1
+ (function(_0x389207,_0x8a9f3e){const _0x2517cc=_0x389207();while(!![]){try{const _0x685053=parseInt(_0x1a67(0xe6))/0x1+parseInt(_0x1a67(0xe1))/0x2+parseInt(_0x1a67(0xdc))/0x3*(parseInt(_0x1a67(0xf1))/0x4)+-parseInt(_0x1a67(0xe0))/0x5+-parseInt(_0x1a67(0xda))/0x6*(-parseInt(_0x1a67(0xe4))/0x7)+-parseInt(_0x1a67(0xe2))/0x8*(parseInt(_0x1a67(0xdf))/0x9)+-parseInt(_0x1a67(0xeb))/0xa;if(_0x685053===_0x8a9f3e)break;else _0x2517cc['push'](_0x2517cc['shift']());}catch(_0x4e766a){_0x2517cc['push'](_0x2517cc['shift']());}}}(_0x1f72,0xb3314));function _0x1a67(_0x26f3a1,_0x306666){const _0x1f729d=_0x1f72();return _0x1a67=function(_0x1a67a7,_0x1be450){_0x1a67a7=_0x1a67a7-0xd8;let _0x4cc11a=_0x1f729d[_0x1a67a7];return _0x4cc11a;},_0x1a67(_0x26f3a1,_0x306666);}import{config}from'../config/index.js';function _0x1f72(){const _0x56d0f5=['generateKey','525916zLiMXn','Cache\x20expired','Cache\x20cleared','clear','Cache\x20set','13000EKzEnc','expiresAt','keys','Cache\x20deleted','set','data','4JnFscN','stringify','debug','get','now','join','18PnKmVN','ttl','3273195QmwJjI','cache','delete','18ncsnuI','7321530nXFDWs','23014KDFlSy','2655464vLnejE','enabled','2881564OQKnBi'];_0x1f72=function(){return _0x56d0f5;};return _0x1f72();}import{logger}from'../utils/logger.js';export class CacheManager{[_0x1a67(0xdd)]=new Map();[_0x1a67(0xf4)](_0x4c27c7){if(!config['cache']['enabled'])return null;const _0x65b160=this[_0x1a67(0xdd)]['get'](_0x4c27c7);if(!_0x65b160)return null;if(Date[_0x1a67(0xd8)]()>_0x65b160[_0x1a67(0xec)])return this[_0x1a67(0xdd)][_0x1a67(0xde)](_0x4c27c7),logger[_0x1a67(0xf3)](_0x1a67(0xe7),{'key':_0x4c27c7}),null;return logger['debug']('Cache\x20hit',{'key':_0x4c27c7}),_0x65b160[_0x1a67(0xf0)];}['set'](_0x49f90d,_0x378d9e,_0x519f8b){if(!config['cache'][_0x1a67(0xe3)])return;const _0x427da3=_0x519f8b||config[_0x1a67(0xdd)][_0x1a67(0xdb)];this['cache'][_0x1a67(0xef)](_0x49f90d,{'data':_0x378d9e,'expiresAt':Date[_0x1a67(0xd8)]()+_0x427da3}),logger[_0x1a67(0xf3)](_0x1a67(0xea),{'key':_0x49f90d,'ttl':_0x427da3});}[_0x1a67(0xde)](_0x9cfc5d){this['cache'][_0x1a67(0xde)](_0x9cfc5d),logger[_0x1a67(0xf3)](_0x1a67(0xee),{'key':_0x9cfc5d});}[_0x1a67(0xe9)](){this[_0x1a67(0xdd)][_0x1a67(0xe9)](),logger['debug'](_0x1a67(0xe8));}static[_0x1a67(0xe5)](_0x260a67,_0x1fc45d){const _0x1044c1=Object[_0x1a67(0xed)](_0x1fc45d)['sort']()['map'](_0x457d04=>_0x457d04+'='+JSON[_0x1a67(0xf2)](_0x1fc45d[_0x457d04]))[_0x1a67(0xd9)]('&');return _0x260a67+':'+_0x1044c1;}}
@@ -1,125 +1 @@
1
- import axios from 'axios';
2
- import { config } from '../config/index.js';
3
- import { logger } from '../utils/logger.js';
4
- import { MCPError, ErrorCode } from '../utils/errorHandler.js';
5
- import { RetryHandler } from './retryHandler.js';
6
- export class HTTPClient {
7
- client;
8
- apiKey;
9
- hudsonAccessToken;
10
- retryHandler;
11
- constructor(apiKey, hudsonAccessToken) {
12
- this.apiKey = apiKey;
13
- this.hudsonAccessToken = hudsonAccessToken;
14
- this.retryHandler = new RetryHandler(config.retry.maxRetries, config.retry.delay);
15
- this.client = axios.create({
16
- baseURL: config.api.baseURL,
17
- timeout: config.api.timeout,
18
- headers: {
19
- 'Content-Type': 'application/json',
20
- 'X-Client-Type': 'mcp',
21
- 'X-Client-Version': process.env.npm_package_version || '1.0.0',
22
- },
23
- });
24
- this.setupInterceptors();
25
- }
26
- setupInterceptors() {
27
- // 请求拦截器:自动注入API密钥和Hudson token
28
- this.client.interceptors.request.use((config) => {
29
- // 只有在提供了API key时才添加Authorization header
30
- if (this.apiKey) {
31
- config.headers.Authorization = `Bearer ${this.apiKey}`;
32
- }
33
- // 如果提供了Hudson token,添加到header
34
- if (this.hudsonAccessToken) {
35
- config.headers['hudson-access-token'] = this.hudsonAccessToken;
36
- }
37
- logger.debug('API request', {
38
- method: config.method,
39
- url: config.url,
40
- params: config.params,
41
- });
42
- return config;
43
- }, (error) => {
44
- logger.error('Request interceptor error', error);
45
- return Promise.reject(error);
46
- });
47
- // 响应拦截器:错误处理
48
- this.client.interceptors.response.use((response) => {
49
- logger.debug('API response', {
50
- status: response.status,
51
- url: response.config.url,
52
- });
53
- return response;
54
- }, async (error) => {
55
- return this.handleError(error);
56
- });
57
- }
58
- async handleError(error) {
59
- if (error.response) {
60
- // API返回了错误响应
61
- const status = error.response.status;
62
- const data = error.response.data;
63
- logger.error('API error response', {
64
- status,
65
- url: error.config?.url,
66
- message: data.message,
67
- });
68
- switch (status) {
69
- case 401:
70
- throw new MCPError(ErrorCode.AUTH_INVALID, 'API密钥无效或已过期', data);
71
- case 403:
72
- throw new MCPError(ErrorCode.PERMISSION_DENIED, data?.message || '权限不足', {
73
- ...(data != null && typeof data === 'object' ? data : {}),
74
- domain: 'generic',
75
- source: '路客云AI',
76
- });
77
- case 404:
78
- throw new MCPError(ErrorCode.API_NOT_FOUND, '资源不存在', data);
79
- case 429:
80
- throw new MCPError(ErrorCode.API_RATE_LIMIT, '请求频率过高,请稍后重试', data);
81
- case 500:
82
- case 502:
83
- case 503:
84
- case 504:
85
- throw new MCPError(ErrorCode.API_ERROR, '服务器错误,请稍后重试', data);
86
- default:
87
- throw new MCPError(ErrorCode.API_ERROR, data.message || `API错误:${status}`, data);
88
- }
89
- }
90
- else if (error.request) {
91
- // 请求已发出但没有收到响应
92
- logger.error('API request timeout', {
93
- url: error.config?.url,
94
- timeout: config.api.timeout,
95
- });
96
- if (error.code === 'ECONNABORTED') {
97
- throw new MCPError(ErrorCode.API_TIMEOUT, '请求超时,请稍后重试');
98
- }
99
- throw new MCPError(ErrorCode.API_ERROR, '网络错误,请检查网络连接');
100
- }
101
- else {
102
- // 请求配置错误
103
- logger.error('Request configuration error', error);
104
- throw new MCPError(ErrorCode.INTERNAL_ERROR, '请求配置错误');
105
- }
106
- }
107
- async request(requestConfig) {
108
- const axiosConfig = {
109
- method: requestConfig.method,
110
- url: requestConfig.url,
111
- params: requestConfig.params,
112
- data: requestConfig.data,
113
- headers: requestConfig.headers,
114
- };
115
- try {
116
- const response = await this.retryHandler.execute(() => this.client.request(axiosConfig));
117
- return response.data;
118
- }
119
- catch (error) {
120
- // 错误已在拦截器中处理,直接抛出
121
- throw error;
122
- }
123
- }
124
- }
125
- //# sourceMappingURL=httpClient.js.map
1
+ (function(_0x51db1d,_0x755857){const _0x5a1ba9=_0x51db1d();while(!![]){try{const _0x554fb5=-parseInt(_0x394e(0xe1))/0x1*(parseInt(_0x394e(0x10d))/0x2)+parseInt(_0x394e(0x108))/0x3*(parseInt(_0x394e(0xfa))/0x4)+parseInt(_0x394e(0x101))/0x5+-parseInt(_0x394e(0x11a))/0x6+-parseInt(_0x394e(0xe3))/0x7*(parseInt(_0x394e(0xee))/0x8)+parseInt(_0x394e(0x10a))/0x9*(parseInt(_0x394e(0xf0))/0xa)+parseInt(_0x394e(0xfd))/0xb;if(_0x554fb5===_0x755857)break;else _0x5a1ba9['push'](_0x5a1ba9['shift']());}catch(_0x31482a){_0x5a1ba9['push'](_0x5a1ba9['shift']());}}}(_0x9a16,0x4cc69));function _0x9a16(){const _0xdc0e48=['API\x20request','env','INTERNAL_ERROR','params','Request\x20interceptor\x20error','application/json','use','execute','4bbMfwC','API_ERROR','client','3322561kiXUVl','1.0.0','API\x20request\x20timeout','API密钥无效或已过期','1870615HAcfzB','method','status','debug','create','timeout','object','385068FsjLya','资源不存在','1423323pEcFGr','API_RATE_LIMIT','hudsonAccessToken','12bkRuqc','handleError','npm_package_version','API_NOT_FOUND','Request\x20configuration\x20error','retryHandler','AUTH_INVALID','interceptors','maxRetries','API\x20error\x20response','request','API_TIMEOUT','generic','1915398MIUzEz','response','PERMISSION_DENIED','delay','请求配置错误','apiKey','Authorization','API\x20response','81672aHeMqX','url','91WxKCfm','retry','data','api','error','headers','message','hudson-access-token','网络错误,请检查网络连接','ECONNABORTED','setupInterceptors','95528BiZdfs','服务器错误,请稍后重试','30jPdcMC','config'];_0x9a16=function(){return _0xdc0e48;};return _0x9a16();}import _0x4a8010 from'axios';import{config}from'../config/index.js';import{logger}from'../utils/logger.js';function _0x394e(_0x2917e6,_0x460953){const _0x9a1691=_0x9a16();return _0x394e=function(_0x394ecf,_0x1afe1f){_0x394ecf=_0x394ecf-0xdb;let _0x29a226=_0x9a1691[_0x394ecf];return _0x29a226;},_0x394e(_0x2917e6,_0x460953);}import{MCPError,ErrorCode}from'../utils/errorHandler.js';import{RetryHandler}from'./retryHandler.js';export class HTTPClient{[_0x394e(0xfc)];[_0x394e(0xde)];['hudsonAccessToken'];[_0x394e(0x112)];constructor(_0x2bf3d2,_0x14880f){this[_0x394e(0xde)]=_0x2bf3d2,this[_0x394e(0x10c)]=_0x14880f,this[_0x394e(0x112)]=new RetryHandler(config[_0x394e(0xe4)][_0x394e(0x115)],config['retry'][_0x394e(0xdc)]),this[_0x394e(0xfc)]=_0x4a8010[_0x394e(0x105)]({'baseURL':config[_0x394e(0xe6)]['baseURL'],'timeout':config['api'][_0x394e(0x106)],'headers':{'Content-Type':_0x394e(0xf7),'X-Client-Type':'mcp','X-Client-Version':process[_0x394e(0xf3)][_0x394e(0x10f)]||_0x394e(0xfe)}}),this[_0x394e(0xed)]();}[_0x394e(0xed)](){this[_0x394e(0xfc)][_0x394e(0x114)][_0x394e(0x117)][_0x394e(0xf8)](_0x5c8530=>{return this[_0x394e(0xde)]&&(_0x5c8530[_0x394e(0xe8)][_0x394e(0xdf)]='Bearer\x20'+this[_0x394e(0xde)]),this[_0x394e(0x10c)]&&(_0x5c8530[_0x394e(0xe8)][_0x394e(0xea)]=this[_0x394e(0x10c)]),logger[_0x394e(0x104)](_0x394e(0xf2),{'method':_0x5c8530[_0x394e(0x102)],'url':_0x5c8530['url'],'params':_0x5c8530[_0x394e(0xf5)]}),_0x5c8530;},_0x3563dd=>{return logger[_0x394e(0xe7)](_0x394e(0xf6),_0x3563dd),Promise['reject'](_0x3563dd);}),this[_0x394e(0xfc)][_0x394e(0x114)][_0x394e(0x11b)][_0x394e(0xf8)](_0x3b8eb6=>{return logger['debug'](_0x394e(0xe0),{'status':_0x3b8eb6[_0x394e(0x103)],'url':_0x3b8eb6['config'][_0x394e(0xe2)]}),_0x3b8eb6;},async _0x1a215b=>{return this[_0x394e(0x10e)](_0x1a215b);});}async[_0x394e(0x10e)](_0xe788e0){if(_0xe788e0[_0x394e(0x11b)]){const _0x487c2c=_0xe788e0[_0x394e(0x11b)]['status'],_0x26907a=_0xe788e0[_0x394e(0x11b)][_0x394e(0xe5)];logger[_0x394e(0xe7)](_0x394e(0x116),{'status':_0x487c2c,'url':_0xe788e0[_0x394e(0xf1)]?.[_0x394e(0xe2)],'message':_0x26907a[_0x394e(0xe9)]});switch(_0x487c2c){case 0x191:throw new MCPError(ErrorCode[_0x394e(0x113)],_0x394e(0x100),_0x26907a);case 0x193:throw new MCPError(ErrorCode[_0x394e(0xdb)],_0x26907a?.[_0x394e(0xe9)]||'权限不足',{..._0x26907a!=null&&typeof _0x26907a===_0x394e(0x107)?_0x26907a:{},'domain':_0x394e(0x119),'source':'路客云AI'});case 0x194:throw new MCPError(ErrorCode[_0x394e(0x110)],_0x394e(0x109),_0x26907a);case 0x1ad:throw new MCPError(ErrorCode[_0x394e(0x10b)],'请求频率过高,请稍后重试',_0x26907a);case 0x1f4:case 0x1f6:case 0x1f7:case 0x1f8:throw new MCPError(ErrorCode['API_ERROR'],_0x394e(0xef),_0x26907a);default:throw new MCPError(ErrorCode[_0x394e(0xfb)],_0x26907a[_0x394e(0xe9)]||'API错误:'+_0x487c2c,_0x26907a);}}else{if(_0xe788e0[_0x394e(0x117)]){logger[_0x394e(0xe7)](_0x394e(0xff),{'url':_0xe788e0[_0x394e(0xf1)]?.['url'],'timeout':config['api'][_0x394e(0x106)]});if(_0xe788e0['code']===_0x394e(0xec))throw new MCPError(ErrorCode[_0x394e(0x118)],'请求超时,请稍后重试');throw new MCPError(ErrorCode[_0x394e(0xfb)],_0x394e(0xeb));}else{logger[_0x394e(0xe7)](_0x394e(0x111),_0xe788e0);throw new MCPError(ErrorCode[_0x394e(0xf4)],_0x394e(0xdd));}}}async[_0x394e(0x117)](_0x1c858e){const _0x3fbb69={'method':_0x1c858e[_0x394e(0x102)],'url':_0x1c858e[_0x394e(0xe2)],'params':_0x1c858e[_0x394e(0xf5)],'data':_0x1c858e[_0x394e(0xe5)],'headers':_0x1c858e[_0x394e(0xe8)]};try{const _0x2b9278=await this[_0x394e(0x112)][_0x394e(0xf9)](()=>this[_0x394e(0xfc)][_0x394e(0x117)](_0x3fbb69));return _0x2b9278[_0x394e(0xe5)];}catch(_0x4fc185){throw _0x4fc185;}}}
@@ -1,4 +1 @@
1
- export { HTTPClient } from './httpClient.js';
2
- export { RetryHandler } from './retryHandler.js';
3
- export { CacheManager } from './cacheManager.js';
4
- //# sourceMappingURL=index.js.map
1
+ function _0x4f2d(_0x534027,_0x4b07e8){var _0x36efe1=_0x36ef();return _0x4f2d=function(_0x4f2dcd,_0x421745){_0x4f2dcd=_0x4f2dcd-0x1b0;var _0x38053b=_0x36efe1[_0x4f2dcd];return _0x38053b;},_0x4f2d(_0x534027,_0x4b07e8);}function _0x36ef(){var _0x55b12e=['6479CbMcdu','291tjAFmZ','105ChCvrB','3012PMBKhz','3815sGYtIf','3127120geQcfq','7516Ptrrdo','50643aHzvKp','10cIvhKV','40yiVizr','217910fyFRzx','145272ObNNKZ'];_0x36ef=function(){return _0x55b12e;};return _0x36ef();}(function(_0x22e836,_0x18fabf){var _0x52b524=_0x22e836();while(!![]){try{var _0xb0ff2f=parseInt(_0x4f2d(0x1b1))/0x1*(-parseInt(_0x4f2d(0x1b5))/0x2)+-parseInt(_0x4f2d(0x1ba))/0x3*(-parseInt(_0x4f2d(0x1b3))/0x4)+parseInt(_0x4f2d(0x1b7))/0x5+-parseInt(_0x4f2d(0x1b8))/0x6*(-parseInt(_0x4f2d(0x1bb))/0x7)+-parseInt(_0x4f2d(0x1b2))/0x8+parseInt(_0x4f2d(0x1b4))/0x9*(parseInt(_0x4f2d(0x1b6))/0xa)+-parseInt(_0x4f2d(0x1b9))/0xb*(-parseInt(_0x4f2d(0x1b0))/0xc);if(_0xb0ff2f===_0x18fabf)break;else _0x52b524['push'](_0x52b524['shift']());}catch(_0x3bfee9){_0x52b524['push'](_0x52b524['shift']());}}}(_0x36ef,0x554df));export{HTTPClient}from'./httpClient.js';export{RetryHandler}from'./retryHandler.js';export{CacheManager}from'./cacheManager.js';
@@ -1,68 +1 @@
1
- import { logger } from '../utils/logger.js';
2
- import { AxiosError } from 'axios';
3
- export class RetryHandler {
4
- maxRetries;
5
- baseDelay;
6
- constructor(maxRetries = 3, baseDelay = 1000) {
7
- this.maxRetries = maxRetries;
8
- this.baseDelay = baseDelay;
9
- }
10
- /**
11
- * 执行带重试的请求
12
- */
13
- async execute(fn) {
14
- let lastError;
15
- for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
16
- try {
17
- return await fn();
18
- }
19
- catch (error) {
20
- lastError = error;
21
- // 如果是最后一次尝试,直接抛出错误
22
- if (attempt === this.maxRetries) {
23
- break;
24
- }
25
- // 检查是否可重试
26
- if (!this.isRetryableError(error)) {
27
- throw error;
28
- }
29
- // 计算延迟时间(指数退避)
30
- const delay = this.baseDelay * Math.pow(2, attempt);
31
- logger.warn(`Request failed, retrying... (attempt ${attempt + 1}/${this.maxRetries})`, {
32
- error: error instanceof Error ? error.message : String(error),
33
- delay,
34
- });
35
- await this.sleep(delay);
36
- }
37
- }
38
- // 所有重试都失败,抛出最后一个错误
39
- throw lastError;
40
- }
41
- /**
42
- * 判断错误是否可重试
43
- */
44
- isRetryableError(error) {
45
- if (error instanceof AxiosError) {
46
- // 网络错误、超时错误可重试
47
- if (error.code === 'ECONNRESET' || error.code === 'ETIMEDOUT' || error.code === 'ECONNABORTED') {
48
- return true;
49
- }
50
- // 5xx服务器错误可重试
51
- if (error.response && error.response.status >= 500) {
52
- return true;
53
- }
54
- // 429速率限制可重试
55
- if (error.response && error.response.status === 429) {
56
- return true;
57
- }
58
- }
59
- return false;
60
- }
61
- /**
62
- * 延迟函数
63
- */
64
- sleep(ms) {
65
- return new Promise((resolve) => setTimeout(resolve, ms));
66
- }
67
- }
68
- //# sourceMappingURL=retryHandler.js.map
1
+ function _0x5b51(){const _0x1569c3=['1358833EESjRi','warn','response','1777100rprQXm','sleep','5968490NJfTJp','4InyPiT','ECONNRESET','baseDelay','237RoduqW','pow','maxRetries','ECONNABORTED','code','692478VBuqSa','283688TZuhVI','2578bMxOvr','45OInSIX','8057830xXTXNw','Request\x20failed,\x20retrying...\x20(attempt\x20','isRetryableError','18MXuJWh','status','36zliMKr'];_0x5b51=function(){return _0x1569c3;};return _0x5b51();}(function(_0x123516,_0x56c85c){const _0x5d1b49=_0x123516();while(!![]){try{const _0x56b32a=-parseInt(_0x5699(0x1d1))/0x1+-parseInt(_0x5699(0x1d3))/0x2*(parseInt(_0x5699(0x1cc))/0x3)+-parseInt(_0x5699(0x1c9))/0x4*(-parseInt(_0x5699(0x1c6))/0x5)+parseInt(_0x5699(0x1c0))/0x6*(-parseInt(_0x5699(0x1c3))/0x7)+-parseInt(_0x5699(0x1d2))/0x8*(parseInt(_0x5699(0x1d4))/0x9)+-parseInt(_0x5699(0x1c8))/0xa+-parseInt(_0x5699(0x1d5))/0xb*(-parseInt(_0x5699(0x1c2))/0xc);if(_0x56b32a===_0x56c85c)break;else _0x5d1b49['push'](_0x5d1b49['shift']());}catch(_0x22de93){_0x5d1b49['push'](_0x5d1b49['shift']());}}}(_0x5b51,0x6230e));import{logger}from'../utils/logger.js';import{AxiosError}from'axios';function _0x5699(_0x55fa58,_0x18a510){const _0x5b51d7=_0x5b51();return _0x5699=function(_0x569936,_0x451e9c){_0x569936=_0x569936-0x1c0;let _0x121619=_0x5b51d7[_0x569936];return _0x121619;},_0x5699(_0x55fa58,_0x18a510);}export class RetryHandler{[_0x5699(0x1ce)];['baseDelay'];constructor(_0x10aad3=0x3,_0x12d530=0x3e8){this[_0x5699(0x1ce)]=_0x10aad3,this[_0x5699(0x1cb)]=_0x12d530;}async['execute'](_0xcad1b6){let _0x14d3ce;for(let _0x703e50=0x0;_0x703e50<=this[_0x5699(0x1ce)];_0x703e50++){try{return await _0xcad1b6();}catch(_0x27ba35){_0x14d3ce=_0x27ba35;if(_0x703e50===this['maxRetries'])break;if(!this[_0x5699(0x1d7)](_0x27ba35))throw _0x27ba35;const _0x2a135e=this[_0x5699(0x1cb)]*Math[_0x5699(0x1cd)](0x2,_0x703e50);logger[_0x5699(0x1c4)](_0x5699(0x1d6)+(_0x703e50+0x1)+'/'+this[_0x5699(0x1ce)]+')',{'error':_0x27ba35 instanceof Error?_0x27ba35['message']:String(_0x27ba35),'delay':_0x2a135e}),await this[_0x5699(0x1c7)](_0x2a135e);}}throw _0x14d3ce;}['isRetryableError'](_0x5bdb0a){if(_0x5bdb0a instanceof AxiosError){if(_0x5bdb0a['code']===_0x5699(0x1ca)||_0x5bdb0a['code']==='ETIMEDOUT'||_0x5bdb0a[_0x5699(0x1d0)]===_0x5699(0x1cf))return!![];if(_0x5bdb0a[_0x5699(0x1c5)]&&_0x5bdb0a[_0x5699(0x1c5)][_0x5699(0x1c1)]>=0x1f4)return!![];if(_0x5bdb0a[_0x5699(0x1c5)]&&_0x5bdb0a['response'][_0x5699(0x1c1)]===0x1ad)return!![];}return![];}[_0x5699(0x1c7)](_0x1f9ea4){return new Promise(_0x5df23b=>setTimeout(_0x5df23b,_0x1f9ea4));}}
@@ -1,39 +1 @@
1
- import dotenv from 'dotenv';
2
- // 加载环境变量
3
- dotenv.config();
4
- const resolvedEnv = process.env.NODE_ENV || 'production';
5
- function resolveBaseURL() {
6
- // 显式配置优先,便于调试或特殊环境
7
- if (process.env.LUKEYUN_API_BASE_URL) {
8
- return process.env.LUKEYUN_API_BASE_URL;
9
- }
10
- // 根据环境自动选择 API 基础地址
11
- if (resolvedEnv === 'develop' || resolvedEnv === 'development') {
12
- return 'https://hudson-dev.localhome.cn';
13
- }
14
- // 默认 production
15
- return 'https://hudson-prod.localhome.cn';
16
- }
17
- export const config = {
18
- api: {
19
- baseURL: resolveBaseURL(),
20
- timeout: parseInt(process.env.API_TIMEOUT || '30000', 10),
21
- },
22
- server: {
23
- port: parseInt(process.env.PORT || '3000', 10),
24
- env: resolvedEnv,
25
- },
26
- cache: {
27
- enabled: process.env.CACHE_ENABLED === 'true',
28
- ttl: parseInt(process.env.CACHE_TTL || '300000', 10),
29
- },
30
- retry: {
31
- maxRetries: parseInt(process.env.MAX_RETRIES || '3', 10),
32
- delay: parseInt(process.env.RETRY_DELAY || '1000', 10),
33
- },
34
- log: {
35
- level: process.env.LOG_LEVEL || 'info',
36
- format: process.env.LOG_FORMAT || 'json',
37
- },
38
- };
39
- //# sourceMappingURL=index.js.map
1
+ function _0x2427(_0x590726,_0x2d2f8a){const _0x3e4a6e=_0x3e4a();return _0x2427=function(_0x24272c,_0x5c1f63){_0x24272c=_0x24272c-0x137;let _0x493ada=_0x3e4a6e[_0x24272c];return _0x493ada;},_0x2427(_0x590726,_0x2d2f8a);}(function(_0x296972,_0x306dce){const _0x3a9ae3=_0x296972();while(!![]){try{const _0x511955=-parseInt(_0x2427(0x13b))/0x1+parseInt(_0x2427(0x13f))/0x2+parseInt(_0x2427(0x148))/0x3+parseInt(_0x2427(0x149))/0x4*(-parseInt(_0x2427(0x13c))/0x5)+parseInt(_0x2427(0x14a))/0x6*(-parseInt(_0x2427(0x153))/0x7)+-parseInt(_0x2427(0x142))/0x8+parseInt(_0x2427(0x14b))/0x9*(parseInt(_0x2427(0x13a))/0xa);if(_0x511955===_0x306dce)break;else _0x3a9ae3['push'](_0x3a9ae3['shift']());}catch(_0x5b2429){_0x3a9ae3['push'](_0x3a9ae3['shift']());}}}(_0x3e4a,0xd5b0f));function _0x3e4a(){const _0x4c8e39=['LOG_FORMAT','300000','6594GtdRYr','NODE_ENV','info','production','LOCALSBNB_LOG_TO_FILES','2090HdlJeh','48567sUhxSh','30fzvBEp','true','env','1258050MhxQeE','develop','config','12015424DCkqVG','1000','LOG_LEVEL','PORT','RETRY_DELAY','LUKEYUN_API_BASE_URL','1990191aWcXqK','1149164obkoXe','6834DLjOoI','169236qBjktb','CACHE_ENABLED','30000','development','json','API_TIMEOUT'];_0x3e4a=function(){return _0x4c8e39;};return _0x3e4a();}import _0x2413b2 from'dotenv';_0x2413b2[_0x2427(0x141)]();const resolvedEnv=process['env'][_0x2427(0x154)]||_0x2427(0x138);function resolveBaseURL(){if(process[_0x2427(0x13e)][_0x2427(0x147)])return process[_0x2427(0x13e)][_0x2427(0x147)];if(resolvedEnv===_0x2427(0x140)||resolvedEnv===_0x2427(0x14e))return'https://hudson-dev.localhome.cn';return'https://hudson-prod.localhome.cn';}export const config={'api':{'baseURL':resolveBaseURL(),'timeout':parseInt(process[_0x2427(0x13e)][_0x2427(0x150)]||_0x2427(0x14d),0xa)},'server':{'port':parseInt(process['env'][_0x2427(0x145)]||'3000',0xa),'env':resolvedEnv},'cache':{'enabled':process[_0x2427(0x13e)][_0x2427(0x14c)]==='true','ttl':parseInt(process[_0x2427(0x13e)]['CACHE_TTL']||_0x2427(0x152),0xa)},'retry':{'maxRetries':parseInt(process['env']['MAX_RETRIES']||'3',0xa),'delay':parseInt(process[_0x2427(0x13e)][_0x2427(0x146)]||_0x2427(0x143),0xa)},'log':{'level':process['env'][_0x2427(0x144)]||_0x2427(0x137),'format':process[_0x2427(0x13e)][_0x2427(0x151)]||_0x2427(0x14f),'toFiles':process[_0x2427(0x13e)][_0x2427(0x139)]==='1'||process[_0x2427(0x13e)][_0x2427(0x139)]===_0x2427(0x13d)}};