localsbnb-mcp-server 1.0.12 → 1.0.14
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 +108 -141
- package/dist/auth/apiKeyManager.js +1 -1
- package/dist/auth/index.js +1 -1
- package/dist/auth/permissionChecker.js +1 -1
- package/dist/client/cacheManager.js +1 -1
- package/dist/client/httpClient.js +1 -1
- package/dist/client/index.js +1 -1
- package/dist/client/retryHandler.js +1 -1
- package/dist/config/index.js +1 -1
- package/dist/config/tools.js +1 -1
- package/dist/index.js +1 -1
- package/dist/package.json +1 -1
- package/dist/region/api.js +1 -0
- package/dist/region/dates.js +1 -0
- package/dist/region/i18n.js +1 -0
- package/dist/region/index.js +1 -0
- package/dist/region/money.js +1 -0
- package/dist/region/resolve.js +1 -0
- package/dist/region/timezone.js +1 -0
- package/dist/region/toolDescriptions.js +1 -0
- package/dist/region/types.js +1 -0
- package/dist/run.cjs +2 -2
- package/dist/run.sh +1 -1
- package/dist/server.js +1 -1
- package/dist/start.mjs +1 -1
- package/dist/tools/finance/index.js +1 -1
- package/dist/tools/finance/queryOperationalDataV2.js +1 -1
- package/dist/tools/orders/getOrderDetailsV2.js +1 -1
- package/dist/tools/orders/index.js +1 -1
- package/dist/tools/orders/ordersGetShared.js +1 -1
- package/dist/tools/orders/queryInHouseOrders.js +1 -1
- package/dist/tools/orders/queryOrdersByDateRange.js +1 -1
- package/dist/tools/orders/queryPreArrivalOrders.js +1 -1
- package/dist/tools/orders/queryPreDepartureOrders.js +1 -1
- package/dist/tools/orders/queryTodayOrders.js +1 -1
- package/dist/tools/overseas/finance.js +1 -0
- package/dist/tools/overseas/index.js +1 -0
- package/dist/tools/overseas/orders.js +1 -0
- package/dist/tools/overseas/prices.js +1 -0
- package/dist/tools/overseas/rooms.js +1 -0
- package/dist/tools/overseas/writes.js +1 -0
- package/dist/tools/rooms/index.js +1 -1
- package/dist/tools/rooms/queryRoomPrices.js +1 -1
- package/dist/tools/rooms/queryRoomStatusNew.js +1 -1
- package/dist/tools/rooms/queryTodayRoomStatus.js +1 -1
- package/dist/types/index.js +1 -1
- package/dist/utils/desensitize.js +1 -1
- package/dist/utils/errorHandler.js +1 -1
- package/dist/utils/index.js +1 -1
- package/dist/utils/logger.js +1 -1
- package/dist/utils/price.js +1 -1
- package/dist/utils/shanghaiDate.js +1 -1
- package/mcp.sample.json +2 -2
- package/package.json +1 -1
- package/dist/tools/channels/getChannelDetails.js +0 -1
- package/dist/tools/channels/index.js +0 -1
- package/dist/tools/channels/listChannels.js +0 -1
- package/dist/tools/finance/analyzeRevenue.js +0 -1
- package/dist/tools/finance/queryFinancialData.js +0 -1
- package/dist/tools/finance/queryOperationalData.js +0 -1
- package/dist/tools/orders/cancelOrder.js +0 -1
- package/dist/tools/orders/getOrderDetails.js +0 -1
- package/dist/tools/orders/queryOrders.js +0 -1
- package/dist/tools/rooms/batchUpdatePrices.js +0 -1
- package/dist/tools/rooms/updateRoomPrice.js +0 -1
- package/dist/types/api.js +0 -1
- package/dist/types/tools.js +0 -1
- package/dist/utils/validator.js +0 -1
package/README.md
CHANGED
|
@@ -1,203 +1,170 @@
|
|
|
1
|
-
# LocalsBnb
|
|
1
|
+
# LocalsBnb
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
**Say it. Your property answers.**
|
|
4
|
+
No LocalsBnb app. No extra computer. The AI you already use **is** the front desk.
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
其中 **OpenClaw + 微信** 是当前落地最广、转化效率最高的组合,建议优先作为推广与实施路径。
|
|
6
|
+
**Language:** [English](README.md) · [简体中文](docs/readme/README.zh-CN.md) · [繁體中文](docs/readme/README.zh-TW.md) · [日本語](docs/readme/README.ja.md) · [ภาษาไทย](docs/readme/README.th.md) · [Bahasa Melayu](docs/readme/README.ms.md)
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
## 我们是什么
|
|
12
|
-
|
|
13
|
-
LocalsBnb AI 是一层“AI 到路客云 API 的标准连接层”:
|
|
14
|
-
|
|
15
|
-
- 对上:提供统一 MCP 工具能力
|
|
16
|
-
- 对下:调用路客云接口并处理鉴权、错误与权限
|
|
17
|
-
- 对业务:让查询与操作可以直接通过自然语言完成
|
|
18
|
-
|
|
19
|
-
适用对象:门店运营、前台、店长、区域管理、技术实施团队。
|
|
8
|
+

|
|
20
9
|
|
|
21
10
|
---
|
|
22
11
|
|
|
23
|
-
##
|
|
12
|
+
## What is this?
|
|
24
13
|
|
|
25
|
-
|
|
14
|
+
You already run listings on **Airbnb, Booking.com, Agoda, and Trip.com** through **路客云 / Locals Cloud**. LocalsBnb is that same system — built for hosts who will not live inside another dashboard.
|
|
26
15
|
|
|
27
|
-
|
|
28
|
-
- 订单详情:按订单号直达详情,减少前台和运营反复翻找
|
|
29
|
-
- 房态与可售:支持今日快照与多日区间查询,适合排班与排房决策
|
|
30
|
-
- 房价数据:支持按日期/自然周查看价格趋势,便于活动与调价判断
|
|
31
|
-
- 经营分析:支持查看入住率、营收等核心指标,用于复盘与晨会
|
|
16
|
+
The old way: unlock the phone, open four apps, wait for calendars, copy a name into a notebook, forget who is in 302.
|
|
32
17
|
|
|
33
|
-
|
|
18
|
+
The new way: open the chat you already have, and talk like you talk to a duty manager.
|
|
34
19
|
|
|
35
|
-
|
|
36
|
-
-
|
|
37
|
-
|
|
20
|
+
> “Who’s arriving today?”
|
|
21
|
+
> “Is the sea-view room free Saturday?”
|
|
22
|
+
> “Check Anna in — wait, show me the booking first.”
|
|
38
23
|
|
|
39
|
-
|
|
24
|
+
**Just say.** LocalsBnb sits behind your favorite AI and pulls the live store: real guests, real rooms, real money. You stay human. The clicking goes away.
|
|
40
25
|
|
|
41
|
-
-
|
|
42
|
-
- 写操作能力可按账号权限与部署策略逐步开放
|
|
26
|
+

|
|
43
27
|
|
|
44
28
|
---
|
|
45
29
|
|
|
46
|
-
##
|
|
30
|
+
## Where can I use it?
|
|
47
31
|
|
|
48
|
-
|
|
32
|
+
If the software can add a “tool” or “MCP”, LocalsBnb can live there. You install **once**. After that, any chat in that app can run your property.
|
|
49
33
|
|
|
50
|
-
|
|
34
|
+
**Use it on the computer**
|
|
51
35
|
|
|
52
|
-
|
|
36
|
+
| App | Who usually likes it |
|
|
37
|
+
|-----|----------------------|
|
|
38
|
+
| **Claude** (Claude Desktop) | The easiest start. Talk in plain language. |
|
|
39
|
+
| **ChatGPT** | If you already live in ChatGPT every day. |
|
|
40
|
+
| **Cursor** | If you already write or work in Cursor. |
|
|
41
|
+
| **Windsurf** | Same idea: an AI editor that accepts tools. |
|
|
42
|
+
| **VS Code + GitHub Copilot** | If your laptop is already VS Code. |
|
|
53
43
|
|
|
54
|
-
|
|
55
|
-
- 企业微信
|
|
56
|
-
- QQ
|
|
57
|
-
- 飞书
|
|
58
|
-
- 钉钉
|
|
59
|
-
- iMessage
|
|
44
|
+
**Use it where you already chat**
|
|
60
45
|
|
|
61
|
-
|
|
46
|
+
Most overseas hosts stay in Claude / ChatGPT / Cursor. OpenClaw and Hermes are not the usual overseas install — they matter when you already use an assistant that lives inside a chat app.
|
|
62
47
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
- 「看下本周入住率和营收」
|
|
68
|
-
- 「帮我根据当前经营情况,并结合近期天气、节假日等情况给出调价建议」
|
|
69
|
-
- 「拉取近 30 天入住率、房价、渠道占比和订单取消率,结合周末与节假日,给我一版下周调价策略(含涨降幅区间和执行优先级)」
|
|
70
|
-
- 「基于今日预抵/预离/在住结构,识别今晚可能的满房风险与空置风险,并给出房态和价格联动建议」
|
|
71
|
-
- 「结合最近一周经营数据与历史同周表现,输出门店晨会简报:异常指标、可能原因、今日行动项」
|
|
72
|
-
- 「对比近 14 天不同渠道订单质量(ADR、间夜、取消率),给出渠道投放与限房建议」
|
|
48
|
+
| Where you talk | How LocalsBnb gets there |
|
|
49
|
+
|----------------|--------------------------|
|
|
50
|
+
| **WeChat / WeCom / Feishu / DingTalk** | China: add the same two codes to OpenClaw or Hermes, then ask while you walk. |
|
|
51
|
+
| **WhatsApp / LINE / Telegram / iMessage** | Overseas: only if you already run OpenClaw or Hermes as that chat’s assistant. Same two codes. If you do not have that setup, start in Claude / ChatGPT / Cursor. |
|
|
73
52
|
|
|
74
|
-
|
|
53
|
+

|
|
75
54
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
- OpenClaw
|
|
79
|
-
- Hermes Agent
|
|
80
|
-
- Cursor
|
|
81
|
-
- Claude Desktop
|
|
82
|
-
- Claude Code
|
|
83
|
-
- 其他 MCP 客户端
|
|
55
|
+
Pick the app you already open in the morning. Do not download a fifth “hotel app”.
|
|
84
56
|
|
|
85
57
|
---
|
|
86
58
|
|
|
87
|
-
##
|
|
59
|
+
## What can it actually do?
|
|
88
60
|
|
|
89
|
-
###
|
|
61
|
+
### A day in the life — just ask
|
|
90
62
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
- `APP_ID`(访问ID)
|
|
63
|
+
**7:10, still in bed, another city**
|
|
64
|
+
“What’s the board for today — arrivals, staying, leaving?”
|
|
65
|
+
One answer. Names, rooms, dates. You text the cleaner before coffee.
|
|
95
66
|
|
|
96
|
-
|
|
67
|
+
**8:00, front desk handover**
|
|
68
|
+
“Who is checking out before 11? Any dirty rooms left?”
|
|
69
|
+
The new hire does not need a two-hour system class. They already know how to ask a question.
|
|
97
70
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
"LocalsBnb MCP": {
|
|
102
|
-
"command": "npx",
|
|
103
|
-
"args": ["--yes", "localsbnb-mcp-server"],
|
|
104
|
-
"env": {
|
|
105
|
-
"APP_SECRET": "<你的 APP_SECRET>",
|
|
106
|
-
"APP_ID": "<你的 APP_ID>"
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
```
|
|
71
|
+
**10:30, guest on the phone**
|
|
72
|
+
“Can the Lin family check in early? What time does the last person leave that room?”
|
|
73
|
+
You answer in thirty seconds, not after ‘let me open the computer’.
|
|
112
74
|
|
|
113
|
-
|
|
75
|
+
**12:00, thinking about the weekend**
|
|
76
|
+
“What’s our Airbnb price Friday to Sunday? What about Agoda?”
|
|
77
|
+
Compare channels in one breath. No four logins.
|
|
114
78
|
|
|
115
|
-
|
|
79
|
+
**15:00, housekeeper in the corridor**
|
|
80
|
+
“Which rooms are empty and clean right now?”
|
|
81
|
+
She does not need your password. You look, you tell her.
|
|
116
82
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
4. 配置常用意图路由(如:今日房态、今日订单、订单详情、经营数据)
|
|
121
|
-
5. 以“查询今天房态 / 查询今日订单 / 输出晨会简报”完成联调验收
|
|
83
|
+
**18:00, owner group chat**
|
|
84
|
+
“How did we do this week? Occupancy, average price, revenue.”
|
|
85
|
+
The number comes back in **your store’s language and currency** — the ones you already set in Locals Cloud.
|
|
122
86
|
|
|
123
|
-
|
|
87
|
+
**21:40, last-minute request**
|
|
88
|
+
“They want one more night. Can we extend?” *(overseas store)*
|
|
89
|
+
The AI shows **who, which room, which dates**. You say yes. Then it happens. Not before.
|
|
124
90
|
|
|
125
|
-
|
|
91
|
+
**22:15, wrong room**
|
|
92
|
+
“Move tonight’s guest from 201 to 305.” *(overseas store)*
|
|
93
|
+
Same rule: it names the booking. You confirm. Then the room changes.
|
|
126
94
|
|
|
127
|
-
|
|
95
|
+
**Holiday / rain / a concert next door**
|
|
96
|
+
“How full are we this week versus last week?”
|
|
97
|
+
You decide whether to raise the weekend or leave it — with the week in front of you, not a gut feel.
|
|
128
98
|
|
|
129
|
-
|
|
99
|
+
**First day of a new staff member**
|
|
100
|
+
They do not learn menus. They learn three sentences: *today’s arrivals, today’s rooms, this week’s numbers.*
|
|
130
101
|
|
|
131
|
-
|
|
132
|
-
- 确认当前账号已开通对应查询权限(订单、房态、房价、经营数据)
|
|
102
|
+
### Handle the stay — overseas LocalsBnb stores only
|
|
133
103
|
|
|
134
|
-
|
|
104
|
+
You can ask the AI to **check in, check out, extend, or change a room**.
|
|
135
105
|
|
|
136
|
-
|
|
106
|
+
It will never do it quietly. You always see the guest and the dates first. You say “that’s the one.” Only then it goes through.
|
|
137
107
|
|
|
138
|
-
|
|
139
|
-
请帮我安装 localsbnb-mcp-server,并配置 MCP 服务名为 LocalsBnb MCP。
|
|
140
|
-
使用环境变量:
|
|
141
|
-
APP_SECRET=<你的APP_SECRET>
|
|
142
|
-
APP_ID=<你的APP_ID>
|
|
143
|
-
安装完成后请先执行“查询今天房态”和“查询今日订单”做连通性验证。
|
|
144
|
-
```
|
|
108
|
+

|
|
145
109
|
|
|
146
|
-
|
|
110
|
+
**If your store is in China:** you can ask all the “what’s going on” questions. **Check-in, check-out, extend, and room change are not available in China yet.** Cancel, change the listed price, or sync a calendar — still do that in Locals Cloud.
|
|
147
111
|
|
|
148
|
-
|
|
149
|
-
- 能成功返回“今日订单(预抵/在住/预离)”
|
|
150
|
-
- 若失败,按错误提示检查 `APP_SECRET` / `APP_ID` 是否正确
|
|
112
|
+
---
|
|
151
113
|
|
|
152
|
-
|
|
114
|
+
## How do I start? (three steps)
|
|
153
115
|
|
|
154
|
-
###
|
|
116
|
+
### 1. Take two codes from Locals Cloud
|
|
155
117
|
|
|
156
|
-
|
|
118
|
+
Log in to Locals Cloud (路客云) and copy:
|
|
157
119
|
|
|
158
|
-
|
|
120
|
+
- **APP_SECRET** — your key
|
|
121
|
+
- **APP_ID** — your property
|
|
159
122
|
|
|
160
|
-
|
|
123
|
+
Yours only. Not for the class WeChat group.
|
|
161
124
|
|
|
162
|
-
|
|
163
|
-
- Windows: `%APPDATA%\\Claude\\claude_desktop_config.json`
|
|
164
|
-
- Linux: `~/.config/Claude/claude_desktop_config.json`
|
|
125
|
+
### 2. Drop them into the AI you picked
|
|
165
126
|
|
|
166
|
-
|
|
127
|
+
Open **Claude, ChatGPT, or Cursor**. Add a tool / MCP, paste this, replace the two lines:
|
|
167
128
|
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
129
|
+
```json
|
|
130
|
+
{
|
|
131
|
+
"mcpServers": {
|
|
132
|
+
"LocalsBnb MCP": {
|
|
133
|
+
"command": "npx",
|
|
134
|
+
"args": ["--yes", "localsbnb-mcp-server"],
|
|
135
|
+
"env": {
|
|
136
|
+
"APP_SECRET": "<your APP_SECRET>",
|
|
137
|
+
"APP_ID": "<your APP_ID>"
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
173
142
|
```
|
|
174
143
|
|
|
175
|
-
|
|
144
|
+
| You use… | Where it usually goes |
|
|
145
|
+
|----------|------------------------|
|
|
146
|
+
| Cursor | Settings → MCP, or the `mcp.json` file |
|
|
147
|
+
| Claude Desktop | Settings → custom tools / MCP |
|
|
148
|
+
| ChatGPT | Settings → apps / developer tools (when your plan allows it) |
|
|
149
|
+
| WeChat / Feishu (China) | Ask the person who set up OpenClaw or Hermes to add the same two codes |
|
|
150
|
+
| WhatsApp / LINE / iMessage | Only if OpenClaw or Hermes already talks in that chat — same two codes. Otherwise use Claude / ChatGPT / Cursor |
|
|
176
151
|
|
|
177
|
-
|
|
152
|
+
Hate config? Tell the AI itself:
|
|
178
153
|
|
|
179
|
-
|
|
180
|
-
|---|---|
|
|
181
|
-
| 连接失败 / 无权限 | 核对 `APP_SECRET`、`APP_ID`,并确认路客云侧已开通权限 |
|
|
182
|
-
| 秘钥错误 | 当前秘钥信息错误,请前往登录路客云 SPMS 获取秘钥,或联系路客云客户经理咨询 |
|
|
183
|
-
| 找不到 MCP 工具 | 检查 JSON 格式、命令路径并重启客户端 |
|
|
184
|
-
| `ERR_REQUIRE_ESM` | 优先使用 `dist/run.sh` 或 `dist/run.cjs` |
|
|
154
|
+
> Help me install localsbnb-mcp-server. Here is my APP_SECRET and APP_ID.
|
|
185
155
|
|
|
186
|
-
|
|
156
|
+
### 3. Talk like a host, not like a programmer
|
|
187
157
|
|
|
188
|
-
|
|
158
|
+
- “Who arrives today?”
|
|
159
|
+
- “Show today’s rooms.”
|
|
160
|
+
- “Airbnb prices this week.”
|
|
161
|
+
- “How is this week going?”
|
|
162
|
+
- “Check Maria in — show me the booking first.” *(overseas)*
|
|
189
163
|
|
|
190
|
-
|
|
191
|
-
- 不提交真实 `APP_SECRET` 到仓库
|
|
192
|
-
- 关键操作建议保留审核/确认流程
|
|
164
|
+
Answers follow the **language of the property** in Locals Cloud. You do not pick English or Japanese again here.
|
|
193
165
|
|
|
194
166
|
---
|
|
195
167
|
|
|
196
|
-
##
|
|
197
|
-
|
|
198
|
-
- 技术支持: [https://minsubao.localhome.cn/](https://minsubao.localhome.cn/)
|
|
199
|
-
|
|
200
|
-
---
|
|
168
|
+
## Need a hand?
|
|
201
169
|
|
|
202
|
-
|
|
203
|
-
**最后更新**: 2026-04
|
|
170
|
+
[localsbnb.com](https://localsbnb.com/)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(
|
|
1
|
+
function _0x58a1(_0x543f27,_0x482e9a){const _0x2c3aba=_0x2c3a();return _0x58a1=function(_0x58a1b8,_0x6e89da){_0x58a1b8=_0x58a1b8-0x1ac;let _0x47aa71=_0x2c3aba[_0x58a1b8];return _0x47aa71;},_0x58a1(_0x543f27,_0x482e9a);}(function(_0x3c3ad6,_0x3c0152){const _0x4c5c6c=_0x3c3ad6();while(!![]){try{const _0x119521=parseInt(_0x58a1(0x1c5))/0x1*(parseInt(_0x58a1(0x1c3))/0x2)+-parseInt(_0x58a1(0x1d2))/0x3+parseInt(_0x58a1(0x1ad))/0x4*(-parseInt(_0x58a1(0x1bb))/0x5)+-parseInt(_0x58a1(0x1ca))/0x6*(-parseInt(_0x58a1(0x1d3))/0x7)+-parseInt(_0x58a1(0x1c6))/0x8*(-parseInt(_0x58a1(0x1b8))/0x9)+-parseInt(_0x58a1(0x1bc))/0xa+parseInt(_0x58a1(0x1b2))/0xb;if(_0x119521===_0x3c0152)break;else _0x4c5c6c['push'](_0x4c5c6c['shift']());}catch(_0x301387){_0x4c5c6c['push'](_0x4c5c6c['shift']());}}}(_0x2c3a,0x39861));import{logger}from'../utils/logger.js';function _0x2c3a(){const _0x33fb6b=['getAPIKey','length','API\x20key\x20set','trim','1324518BkDtlQ','535822TIyKiD','info','Hudson\x20credentials\x20loaded\x20from\x20config','env','60RLnGkb','LUKEYUN_API_KEY','Hudson\x20credentials\x20set','includes','warn','9984953fGySQL','hudsonAccessToken','APP_SECRET\x20or\x20APP_ID\x20not\x20found\x20in\x20environment\x20variables','scopes','APP_ID\x20not\x20configured.\x20Please\x20set\x20APP_ID\x20environment\x20variable.','APP_ID','144ggImsp','getScopes','map','105015tgyQAR','4443840ShLkvA','LUKEYUN_API_SCOPES','campId','HUDSON_ACCESS_TOKEN','loadFromConfig','API\x20key\x20not\x20found\x20in\x20environment\x20variables','apiKey','2RJpfjc','API\x20key\x20loaded\x20from\x20config','78409nTzQlr','148664FrXMUd','setAPIKey','setHudsonCredentials','isHudsonConfigured','12EjBvBF','Hudson\x20credentials\x20loaded\x20from\x20environment','split','hasAPIKey'];_0x2c3a=function(){return _0x33fb6b;};return _0x2c3a();}export class APIKeyManager{[_0x58a1(0x1c2)]=null;['scopes']=[];[_0x58a1(0x1b3)]=null;[_0x58a1(0x1be)]=null;['loadFromEnv'](){this[_0x58a1(0x1c2)]=process[_0x58a1(0x1ac)][_0x58a1(0x1ae)]||null;const _0x132a87=process[_0x58a1(0x1ac)][_0x58a1(0x1bd)];this[_0x58a1(0x1b5)]=_0x132a87?_0x132a87[_0x58a1(0x1cc)](',')[_0x58a1(0x1ba)](_0xde1c21=>_0xde1c21[_0x58a1(0x1d1)]()):[],this[_0x58a1(0x1b3)]=process[_0x58a1(0x1ac)]['APP_SECRET']||process[_0x58a1(0x1ac)][_0x58a1(0x1bf)]||null,this[_0x58a1(0x1be)]=process[_0x58a1(0x1ac)][_0x58a1(0x1b7)]||process[_0x58a1(0x1ac)]['CAMP_ID']||null,!this[_0x58a1(0x1c2)]?logger[_0x58a1(0x1b1)](_0x58a1(0x1c1)):logger['info']('API\x20key\x20loaded\x20from\x20environment',{'hasScopes':this[_0x58a1(0x1b5)][_0x58a1(0x1cf)]>0x0}),!this['hudsonAccessToken']||!this[_0x58a1(0x1be)]?logger[_0x58a1(0x1b1)](_0x58a1(0x1b4)):logger[_0x58a1(0x1d4)](_0x58a1(0x1cb));}[_0x58a1(0x1c0)](_0x38d785){this[_0x58a1(0x1c2)]=_0x38d785['apiKey']||null,this[_0x58a1(0x1b5)]=_0x38d785['scopes']||[],this[_0x58a1(0x1b3)]=_0x38d785[_0x58a1(0x1b3)]||null,this[_0x58a1(0x1be)]=_0x38d785[_0x58a1(0x1be)]||null,this[_0x58a1(0x1c2)]&&logger[_0x58a1(0x1d4)](_0x58a1(0x1c4),{'hasScopes':this[_0x58a1(0x1b5)]['length']>0x0}),this[_0x58a1(0x1b3)]&&this[_0x58a1(0x1be)]&&logger[_0x58a1(0x1d4)](_0x58a1(0x1d5));}[_0x58a1(0x1c7)](_0x2cd91a,_0xe57321){this['apiKey']=_0x2cd91a,this[_0x58a1(0x1b5)]=_0xe57321||[],logger[_0x58a1(0x1d4)](_0x58a1(0x1d0),{'hasScopes':this[_0x58a1(0x1b5)]['length']>0x0});}[_0x58a1(0x1c8)](_0x41a6fa,_0x38a523){this[_0x58a1(0x1b3)]=_0x41a6fa,this[_0x58a1(0x1be)]=_0x38a523,logger[_0x58a1(0x1d4)](_0x58a1(0x1af));}[_0x58a1(0x1ce)](){return this[_0x58a1(0x1c2)]||'';}[_0x58a1(0x1cd)](){return this[_0x58a1(0x1c2)]!==null&&this[_0x58a1(0x1c2)]!=='';}['hasScope'](_0x2af36e){if(this['scopes'][_0x58a1(0x1b0)]('*'))return!![];return this[_0x58a1(0x1b5)][_0x58a1(0x1b0)](_0x2af36e);}[_0x58a1(0x1b9)](){return[...this[_0x58a1(0x1b5)]];}['isConfigured'](){return this[_0x58a1(0x1c2)]!==null;}[_0x58a1(0x1c9)](){return this[_0x58a1(0x1b3)]!==null&&this[_0x58a1(0x1be)]!==null;}['getHudsonAccessToken'](){if(!this[_0x58a1(0x1b3)])throw new Error('APP_SECRET\x20not\x20configured.\x20Please\x20set\x20APP_SECRET\x20environment\x20variable.');return this[_0x58a1(0x1b3)];}['getCampId'](){if(!this['campId'])throw new Error(_0x58a1(0x1b6));return this[_0x58a1(0x1be)];}}
|
package/dist/auth/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(
|
|
1
|
+
(function(_0x399066,_0x1a74a6){var _0x4202f2=_0x399066();while(!![]){try{var _0x12cd77=-parseInt(_0x4b83(0x1e8))/0x1+-parseInt(_0x4b83(0x1df))/0x2*(parseInt(_0x4b83(0x1de))/0x3)+-parseInt(_0x4b83(0x1e5))/0x4*(parseInt(_0x4b83(0x1dd))/0x5)+-parseInt(_0x4b83(0x1e0))/0x6+-parseInt(_0x4b83(0x1e2))/0x7*(parseInt(_0x4b83(0x1e4))/0x8)+parseInt(_0x4b83(0x1e1))/0x9*(parseInt(_0x4b83(0x1e7))/0xa)+parseInt(_0x4b83(0x1e6))/0xb*(parseInt(_0x4b83(0x1e3))/0xc);if(_0x12cd77===_0x1a74a6)break;else _0x4202f2['push'](_0x4202f2['shift']());}catch(_0x27dcb7){_0x4202f2['push'](_0x4202f2['shift']());}}}(_0x219c,0x5e225));function _0x219c(){var _0x891f19=['26831eLvDyJ','17375748FudzkU','1120kCIaHe','20uCfcjo','22DantyW','2382220vQCAjJ','585597dpmmBA','591865whqQXg','39mfEIDc','113272vUvsvJ','1789542qPAdxq','9cWXRgq'];_0x219c=function(){return _0x891f19;};return _0x219c();}function _0x4b83(_0x417e93,_0x48c90d){var _0x219c36=_0x219c();return _0x4b83=function(_0x4b832c,_0x558cdb){_0x4b832c=_0x4b832c-0x1dd;var _0x1af428=_0x219c36[_0x4b832c];return _0x1af428;},_0x4b83(_0x417e93,_0x48c90d);}export{APIKeyManager}from'./apiKeyManager.js';export{PermissionChecker}from'./permissionChecker.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
(function(_0x1a55af,_0x5ab8e7){const _0x269fb0=_0x1a55af();while(!![]){try{const _0x127761=parseInt(_0x5c95(0x161))/0x1*(-parseInt(_0x5c95(0x15e))/0x2)+-parseInt(_0x5c95(0x146))/0x3+parseInt(_0x5c95(0x142))/0x4*(parseInt(_0x5c95(0x156))/0x5)+parseInt(_0x5c95(0x165))/0x6*(parseInt(_0x5c95(0x14a))/0x7)+-parseInt(_0x5c95(0x160))/0x8*(parseInt(_0x5c95(0x140))/0x9)+-parseInt(_0x5c95(0x152))/0xa*(parseInt(_0x5c95(0x153))/0xb)+parseInt(_0x5c95(0x14b))/0xc;if(_0x127761===_0x5ab8e7)break;else _0x269fb0['push'](_0x269fb0['shift']());}catch(_0x1c7809){_0x269fb0['push'](_0x269fb0['shift']());}}}(_0x4d35,0xa6467));import{MCPError,ErrorCode,getPermissionDeniedMessage}from'../utils/errorHandler.js';import{logger}from'../utils/logger.js';function _0x5c95(_0x1fb81c,_0x4a80e3){const _0x4d354a=_0x4d35();return _0x5c95=function(_0x5c95c7,_0x3f6dca){_0x5c95c7=_0x5c95c7-0x140;let _0x3b3cb6=_0x4d354a[_0x5c95c7];return _0x3b3cb6;},_0x5c95(_0x1fb81c,_0x4a80e3);}function _0x4d35(){const _0x41dae6=['get_order_details_v2','626018ofZIXk','checkPermission','24bRGtGu','2wuxadn','query_in_house_orders','query_pre_arrival_orders','some','521016jDhlxc','getScopes','668007Krrzqw','debug','1183024aFSnkG','query_pre_departure_orders','Permission\x20check\x20passed\x20(Hudson\x20auth\x20only)','query_today_room_status','2860203SeCbIi','Permission\x20denied','orders','Permission\x20check\x20passed','21igrSvU','27848796zGVxeM','query_operational_data_v2','hasScope','arrange_room','keyManager','query_room_prices','check_in_order','1312820iumSad','33zTBhCl','PERMISSION_DENIED','query_orders_by_date_range','5yWWBEL','finance','isHudsonConfigured','hasAPIKey','query_today_orders','路客云AI','room_status'];_0x4d35=function(){return _0x41dae6;};return _0x4d35();}function toolToPermissionDomain(_0x2c67cc){switch(_0x2c67cc){case _0x5c95(0x15a):case _0x5c95(0x163):case _0x5c95(0x162):case _0x5c95(0x143):case _0x5c95(0x155):case _0x5c95(0x15d):case _0x5c95(0x151):case'check_out_order':case'extend_order':case _0x5c95(0x14e):return _0x5c95(0x148);case _0x5c95(0x14c):return _0x5c95(0x157);case _0x5c95(0x145):case'query_room_status_new':return _0x5c95(0x15c);case _0x5c95(0x150):return'room_price';default:return'generic';}}export class PermissionChecker{['keyManager'];constructor(_0x3a0356){this[_0x5c95(0x14f)]=_0x3a0356;}[_0x5c95(0x15f)](_0x275014,_0x5563a0){if(_0x5563a0['length']===0x0)return;if(!this['keyManager'][_0x5c95(0x159)]()&&this[_0x5c95(0x14f)][_0x5c95(0x158)]()){logger[_0x5c95(0x141)](_0x5c95(0x144),{'tool':_0x275014,'requiredScopes':_0x5563a0});return;}const _0x1ab88f=_0x5563a0[_0x5c95(0x164)](_0x1f8b94=>this[_0x5c95(0x14f)][_0x5c95(0x14d)](_0x1f8b94));if(!_0x1ab88f){const _0x39df3d=this[_0x5c95(0x14f)][_0x5c95(0x166)](),_0x3747ed=toolToPermissionDomain(_0x275014);logger['warn'](_0x5c95(0x147),{'tool':_0x275014,'required':_0x5563a0,'current':_0x39df3d,'domain':_0x3747ed});throw new MCPError(ErrorCode[_0x5c95(0x154)],getPermissionDeniedMessage(_0x3747ed),{'tool':_0x275014,'requiredScopes':_0x5563a0,'currentScopes':_0x39df3d,'domain':_0x3747ed,'source':_0x5c95(0x15b)});}logger[_0x5c95(0x141)](_0x5c95(0x149),{'tool':_0x275014,'scopes':_0x5563a0});}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
(function(_0x4c2864,_0x1a7558){const _0x51252d=_0x4c2864();while(!![]){try{const _0x557b39=parseInt(_0x470c(0xf5))/0x1*(parseInt(_0x470c(0xed))/0x2)+-parseInt(_0x470c(0xe3))/0x3*(-parseInt(_0x470c(0xf1))/0x4)+-parseInt(_0x470c(0xe5))/0x5*(-parseInt(_0x470c(0xf3))/0x6)+parseInt(_0x470c(0xf6))/0x7*(-parseInt(_0x470c(0xe7))/0x8)+parseInt(_0x470c(0xfb))/0x9+-parseInt(_0x470c(0xf4))/0xa*(-parseInt(_0x470c(0xec))/0xb)+-parseInt(_0x470c(0xf7))/0xc;if(_0x557b39===_0x1a7558)break;else _0x51252d['push'](_0x51252d['shift']());}catch(_0x3e7a3f){_0x51252d['push'](_0x51252d['shift']());}}}(_0x210e,0x9cdc7));function _0x470c(_0x5686e7,_0x4d5f3e){const _0x210e12=_0x210e();return _0x470c=function(_0x470cca,_0x4cb1dd){_0x470cca=_0x470cca-0xdf;let _0x4adbf1=_0x210e12[_0x470cca];return _0x4adbf1;},_0x470c(_0x5686e7,_0x4d5f3e);}import{config}from'../config/index.js';import{logger}from'../utils/logger.js';function _0x210e(){const _0x1f498a=['6220926rJgrwG','map','ttl','enabled','clear','Cache\x20deleted','3xzTgYZ','generateKey','2001360MNqdNT','sort','264skaffA','now','Cache\x20hit','join','data','11hxaRlI','5578edhAnb','debug','cache','expiresAt','3826036YxRDMJ','delete','12miCpfT','3085210QhDlBk','110kbtVIU','17710UwiZQb','28051020AftGBw','set','Cache\x20expired','keys'];_0x210e=function(){return _0x1f498a;};return _0x210e();}export class CacheManager{['cache']=new Map();['get'](_0x2e4bb0){if(!config[_0x470c(0xef)][_0x470c(0xe0)])return null;const _0x31d35f=this[_0x470c(0xef)]['get'](_0x2e4bb0);if(!_0x31d35f)return null;if(Date[_0x470c(0xe8)]()>_0x31d35f[_0x470c(0xf0)])return this[_0x470c(0xef)][_0x470c(0xf2)](_0x2e4bb0),logger[_0x470c(0xee)](_0x470c(0xf9),{'key':_0x2e4bb0}),null;return logger[_0x470c(0xee)](_0x470c(0xe9),{'key':_0x2e4bb0}),_0x31d35f[_0x470c(0xeb)];}[_0x470c(0xf8)](_0x378f90,_0x27ea29,_0x493520){if(!config[_0x470c(0xef)]['enabled'])return;const _0x2a938c=_0x493520||config[_0x470c(0xef)][_0x470c(0xdf)];this[_0x470c(0xef)][_0x470c(0xf8)](_0x378f90,{'data':_0x27ea29,'expiresAt':Date[_0x470c(0xe8)]()+_0x2a938c}),logger[_0x470c(0xee)]('Cache\x20set',{'key':_0x378f90,'ttl':_0x2a938c});}[_0x470c(0xf2)](_0x275c60){this['cache'][_0x470c(0xf2)](_0x275c60),logger[_0x470c(0xee)](_0x470c(0xe2),{'key':_0x275c60});}[_0x470c(0xe1)](){this[_0x470c(0xef)][_0x470c(0xe1)](),logger[_0x470c(0xee)]('Cache\x20cleared');}static[_0x470c(0xe4)](_0x2ba171,_0x1fc8bf){const _0x1051c1=Object[_0x470c(0xfa)](_0x1fc8bf)[_0x470c(0xe6)]()[_0x470c(0xfc)](_0x205e49=>_0x205e49+'='+JSON['stringify'](_0x1fc8bf[_0x205e49]))[_0x470c(0xea)]('&');return _0x2ba171+':'+_0x1051c1;}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
function _0x491f(){const _0x577592=['API\x20request','response','39782rdLknp','execute','object','请求配置错误','status','21145hzQIzf','headers','mcp','API_NOT_FOUND','7YBWgFx','baseURL','reject','handleError','API_TIMEOUT','retry','apiKey','912cnjqyU','API密钥无效或已过期','config','debug','setupInterceptors','INTERNAL_ERROR','服务器错误,请稍后重试','message','API_ERROR','1793oOAnvn','PERMISSION_DENIED','client','interceptors','hudson-access-token','request','hudsonAccessToken','retryHandler','网络错误,请检查网络连接','路客云AI','params','url','api','use','error','AUTH_INVALID','extraHeaders','delay','192798gPOmtu','10518794JsVFTO','method','7970kbYaAm','env','9804AhXxyc','API_RATE_LIMIT','API错误:','29dVHxfh','application/json','1390352oCbgOy','data','API\x20response','Authorization','code','npm_package_version','4kMFcDu','entries','generic','setExtraHeaders','6741NOLFVz','请求超时,请稍后重试'];_0x491f=function(){return _0x577592;};return _0x491f();}(function(_0x24ffea,_0x1e6bd9){const _0x45b3d3=_0x24ffea();while(!![]){try{const _0x2e26ea=parseInt(_0x3d27(0x1d8))/0x1*(parseInt(_0x3d27(0x1e8))/0x2)+-parseInt(_0x3d27(0x1d0))/0x3*(-parseInt(_0x3d27(0x1e0))/0x4)+parseInt(_0x3d27(0x1ed))/0x5*(-parseInt(_0x3d27(0x1f8))/0x6)+parseInt(_0x3d27(0x1f1))/0x7*(parseInt(_0x3d27(0x1da))/0x8)+parseInt(_0x3d27(0x1e4))/0x9*(-parseInt(_0x3d27(0x1d3))/0xa)+-parseInt(_0x3d27(0x201))/0xb*(-parseInt(_0x3d27(0x1d5))/0xc)+parseInt(_0x3d27(0x1d1))/0xd;if(_0x2e26ea===_0x1e6bd9)break;else _0x45b3d3['push'](_0x45b3d3['shift']());}catch(_0x5b9ebc){_0x45b3d3['push'](_0x45b3d3['shift']());}}}(_0x491f,0x7e547));import _0x308374 from'axios';import{config}from'../config/index.js';import{logger}from'../utils/logger.js';import{MCPError,ErrorCode}from'../utils/errorHandler.js';import{RetryHandler}from'./retryHandler.js';function _0x3d27(_0x5b96cb,_0xa486df){const _0x491fd2=_0x491f();return _0x3d27=function(_0x3d27b8,_0x268ff9){_0x3d27b8=_0x3d27b8-0x1c5;let _0x2073e2=_0x491fd2[_0x3d27b8];return _0x2073e2;},_0x3d27(_0x5b96cb,_0xa486df);}export class HTTPClient{[_0x3d27(0x203)];['apiKey'];['hudsonAccessToken'];[_0x3d27(0x1c5)];[_0x3d27(0x1ce)]={};constructor(_0x5e2d65,_0x1d1f0e){this[_0x3d27(0x1f7)]=_0x5e2d65,this[_0x3d27(0x207)]=_0x1d1f0e,this[_0x3d27(0x1c5)]=new RetryHandler(config[_0x3d27(0x1f6)]['maxRetries'],config[_0x3d27(0x1f6)][_0x3d27(0x1cf)]),this['client']=_0x308374['create']({'baseURL':config[_0x3d27(0x1ca)][_0x3d27(0x1f2)],'timeout':config['api']['timeout'],'headers':{'Content-Type':_0x3d27(0x1d9),'X-Client-Type':_0x3d27(0x1ef),'X-Client-Version':process[_0x3d27(0x1d4)][_0x3d27(0x1df)]||'1.0.0'}}),this[_0x3d27(0x1fc)]();}[_0x3d27(0x1fc)](){this['client']['interceptors'][_0x3d27(0x206)][_0x3d27(0x1cb)](_0x159ed7=>{this[_0x3d27(0x1f7)]&&(_0x159ed7[_0x3d27(0x1ee)][_0x3d27(0x1dd)]='Bearer\x20'+this[_0x3d27(0x1f7)]);this[_0x3d27(0x207)]&&(_0x159ed7[_0x3d27(0x1ee)][_0x3d27(0x205)]=this[_0x3d27(0x207)]);for(const [_0x4a44d9,_0x222d95]of Object[_0x3d27(0x1e1)](this[_0x3d27(0x1ce)])){if(_0x222d95)_0x159ed7[_0x3d27(0x1ee)][_0x4a44d9]=_0x222d95;}return logger[_0x3d27(0x1fb)](_0x3d27(0x1e6),{'method':_0x159ed7['method'],'url':_0x159ed7['url'],'params':_0x159ed7[_0x3d27(0x1c8)]}),_0x159ed7;},_0x2a218a=>{return logger[_0x3d27(0x1cc)]('Request\x20interceptor\x20error',_0x2a218a),Promise[_0x3d27(0x1f3)](_0x2a218a);}),this[_0x3d27(0x203)][_0x3d27(0x204)][_0x3d27(0x1e7)][_0x3d27(0x1cb)](_0x4b501e=>{return logger[_0x3d27(0x1fb)](_0x3d27(0x1dc),{'status':_0x4b501e[_0x3d27(0x1ec)],'url':_0x4b501e[_0x3d27(0x1fa)][_0x3d27(0x1c9)]}),_0x4b501e;},async _0x3694d7=>{return this[_0x3d27(0x1f4)](_0x3694d7);});}async[_0x3d27(0x1f4)](_0x376b33){if(_0x376b33['response']){const _0x13b7f2=_0x376b33[_0x3d27(0x1e7)][_0x3d27(0x1ec)],_0x52505b=_0x376b33[_0x3d27(0x1e7)][_0x3d27(0x1db)];logger[_0x3d27(0x1cc)]('API\x20error\x20response',{'status':_0x13b7f2,'url':_0x376b33[_0x3d27(0x1fa)]?.['url'],'message':_0x52505b[_0x3d27(0x1ff)]});switch(_0x13b7f2){case 0x191:throw new MCPError(ErrorCode[_0x3d27(0x1cd)],_0x3d27(0x1f9),_0x52505b);case 0x193:throw new MCPError(ErrorCode[_0x3d27(0x202)],_0x52505b?.[_0x3d27(0x1ff)]||'权限不足',{..._0x52505b!=null&&typeof _0x52505b===_0x3d27(0x1ea)?_0x52505b:{},'domain':_0x3d27(0x1e2),'source':_0x3d27(0x1c7)});case 0x194:throw new MCPError(ErrorCode[_0x3d27(0x1f0)],'资源不存在',_0x52505b);case 0x1ad:throw new MCPError(ErrorCode[_0x3d27(0x1d6)],'请求频率过高,请稍后重试',_0x52505b);case 0x1f4:case 0x1f6:case 0x1f7:case 0x1f8:throw new MCPError(ErrorCode[_0x3d27(0x200)],_0x3d27(0x1fe),_0x52505b);default:throw new MCPError(ErrorCode[_0x3d27(0x200)],_0x52505b[_0x3d27(0x1ff)]||_0x3d27(0x1d7)+_0x13b7f2,_0x52505b);}}else{if(_0x376b33[_0x3d27(0x206)]){logger[_0x3d27(0x1cc)]('API\x20request\x20timeout',{'url':_0x376b33[_0x3d27(0x1fa)]?.[_0x3d27(0x1c9)],'timeout':config[_0x3d27(0x1ca)]['timeout']});if(_0x376b33[_0x3d27(0x1de)]==='ECONNABORTED')throw new MCPError(ErrorCode[_0x3d27(0x1f5)],_0x3d27(0x1e5));throw new MCPError(ErrorCode[_0x3d27(0x200)],_0x3d27(0x1c6));}else{logger[_0x3d27(0x1cc)]('Request\x20configuration\x20error',_0x376b33);throw new MCPError(ErrorCode[_0x3d27(0x1fd)],_0x3d27(0x1eb));}}}[_0x3d27(0x1e3)](_0x3c277b){this['extraHeaders']={..._0x3c277b};}async[_0x3d27(0x206)](_0x6af391){const _0x1f73e8={'method':_0x6af391[_0x3d27(0x1d2)],'url':_0x6af391['url'],'params':_0x6af391[_0x3d27(0x1c8)],'data':_0x6af391[_0x3d27(0x1db)],'headers':_0x6af391['headers']};try{const _0x261eb6=await this[_0x3d27(0x1c5)][_0x3d27(0x1e9)](()=>this[_0x3d27(0x203)][_0x3d27(0x206)](_0x1f73e8));return _0x261eb6[_0x3d27(0x1db)];}catch(_0x1d1167){throw _0x1d1167;}}}
|
package/dist/client/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(
|
|
1
|
+
(function(_0x4f8621,_0x4c48fc){var _0x39ab2d=_0x4f8621();while(!![]){try{var _0x49adf2=-parseInt(_0x2198(0x64))/0x1*(-parseInt(_0x2198(0x6e))/0x2)+-parseInt(_0x2198(0x6c))/0x3+parseInt(_0x2198(0x6d))/0x4*(-parseInt(_0x2198(0x6f))/0x5)+-parseInt(_0x2198(0x67))/0x6*(-parseInt(_0x2198(0x69))/0x7)+-parseInt(_0x2198(0x65))/0x8*(-parseInt(_0x2198(0x68))/0x9)+parseInt(_0x2198(0x66))/0xa*(-parseInt(_0x2198(0x6b))/0xb)+parseInt(_0x2198(0x6a))/0xc;if(_0x49adf2===_0x4c48fc)break;else _0x39ab2d['push'](_0x39ab2d['shift']());}catch(_0x39ff8d){_0x39ab2d['push'](_0x39ab2d['shift']());}}}(_0x3c7e,0x417cb));export{HTTPClient}from'./httpClient.js';export{RetryHandler}from'./retryHandler.js';function _0x2198(_0x1b0bcd,_0x47c105){var _0x3c7e84=_0x3c7e();return _0x2198=function(_0x2198f6,_0x4d4706){_0x2198f6=_0x2198f6-0x64;var _0x5708aa=_0x3c7e84[_0x2198f6];return _0x5708aa;},_0x2198(_0x1b0bcd,_0x47c105);}export{CacheManager}from'./cacheManager.js';function _0x3c7e(){var _0x1cfc0f=['8602800BsHyuH','22AbxmzL','1374234LoeVGD','4bGmrti','16rtqAhN','2450420yPMBza','21426qsiUrX','7416XKakmv','2502130gboYrH','12HNeWue','4923sCuOSS','1125061fxxHnd'];_0x3c7e=function(){return _0x1cfc0f;};return _0x3c7e();}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
function _0x9d79(_0x3b8538,_0x1fa262){const _0x18dfed=_0x18df();return _0x9d79=function(_0x9d790d,_0x544c00){_0x9d790d=_0x9d790d-0x96;let _0x2247e5=_0x18dfed[_0x9d790d];return _0x2247e5;},_0x9d79(_0x3b8538,_0x1fa262);}function _0x18df(){const _0x3733a7=['maxRetries','response','12638980PHztww','isRetryableError','2599214xmAKoR','ECONNRESET','58554VgmNqy','40YnNOvD','Request\x20failed,\x20retrying...\x20(attempt\x20','status','5245970lVBqCK','sleep','baseDelay','4omhZhl','96417eyYTUc','469YEzBhi','code','2207673TqdCsF','ETIMEDOUT','4630917SYOitG','warn'];_0x18df=function(){return _0x3733a7;};return _0x18df();}(function(_0x5e4ff9,_0x1fe102){const _0x5371ce=_0x5e4ff9();while(!![]){try{const _0x44bb6f=parseInt(_0x9d79(0x9f))/0x1+-parseInt(_0x9d79(0xaa))/0x2+parseInt(_0x9d79(0xa4))/0x3*(parseInt(_0x9d79(0x9e))/0x4)+parseInt(_0x9d79(0x9b))/0x5+parseInt(_0x9d79(0x97))/0x6*(-parseInt(_0x9d79(0xa0))/0x7)+-parseInt(_0x9d79(0x98))/0x8*(parseInt(_0x9d79(0xa2))/0x9)+parseInt(_0x9d79(0xa8))/0xa;if(_0x44bb6f===_0x1fe102)break;else _0x5371ce['push'](_0x5371ce['shift']());}catch(_0x6b964d){_0x5371ce['push'](_0x5371ce['shift']());}}}(_0x18df,0xbcc53));import{logger}from'../utils/logger.js';import{AxiosError}from'axios';export class RetryHandler{['maxRetries'];[_0x9d79(0x9d)];constructor(_0x737b3b=0x3,_0x1ee56c=0x3e8){this[_0x9d79(0xa6)]=_0x737b3b,this['baseDelay']=_0x1ee56c;}async['execute'](_0x205122){let _0x199fe4;for(let _0x5654d1=0x0;_0x5654d1<=this['maxRetries'];_0x5654d1++){try{return await _0x205122();}catch(_0x5477f7){_0x199fe4=_0x5477f7;if(_0x5654d1===this[_0x9d79(0xa6)])break;if(!this[_0x9d79(0xa9)](_0x5477f7))throw _0x5477f7;const _0x27634a=this[_0x9d79(0x9d)]*Math['pow'](0x2,_0x5654d1);logger[_0x9d79(0xa5)](_0x9d79(0x99)+(_0x5654d1+0x1)+'/'+this[_0x9d79(0xa6)]+')',{'error':_0x5477f7 instanceof Error?_0x5477f7['message']:String(_0x5477f7),'delay':_0x27634a}),await this[_0x9d79(0x9c)](_0x27634a);}}throw _0x199fe4;}[_0x9d79(0xa9)](_0x500a32){if(_0x500a32 instanceof AxiosError){if(_0x500a32['code']===_0x9d79(0x96)||_0x500a32['code']===_0x9d79(0xa3)||_0x500a32[_0x9d79(0xa1)]==='ECONNABORTED')return!![];if(_0x500a32[_0x9d79(0xa7)]&&_0x500a32['response']['status']>=0x1f4)return!![];if(_0x500a32[_0x9d79(0xa7)]&&_0x500a32[_0x9d79(0xa7)][_0x9d79(0x9a)]===0x1ad)return!![];}return![];}[_0x9d79(0x9c)](_0x23253c){return new Promise(_0x5b8fd7=>setTimeout(_0x5b8fd7,_0x23253c));}}
|
package/dist/config/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(
|
|
1
|
+
function _0x4c67(_0x376201,_0x20719e){const _0x5e994d=_0x5e99();return _0x4c67=function(_0x4c67c4,_0x331f59){_0x4c67c4=_0x4c67c4-0xc1;let _0x27bc21=_0x5e994d[_0x4c67c4];return _0x27bc21;},_0x4c67(_0x376201,_0x20719e);}(function(_0x404be8,_0x5c489f){const _0x128df3=_0x404be8();while(!![]){try{const _0x475dcf=parseInt(_0x4c67(0xc5))/0x1*(-parseInt(_0x4c67(0xdf))/0x2)+-parseInt(_0x4c67(0xcd))/0x3*(parseInt(_0x4c67(0xcc))/0x4)+-parseInt(_0x4c67(0xd6))/0x5*(parseInt(_0x4c67(0xd8))/0x6)+-parseInt(_0x4c67(0xcf))/0x7+parseInt(_0x4c67(0xe0))/0x8*(parseInt(_0x4c67(0xd5))/0x9)+-parseInt(_0x4c67(0xd4))/0xa*(-parseInt(_0x4c67(0xc3))/0xb)+parseInt(_0x4c67(0xc4))/0xc;if(_0x475dcf===_0x5c489f)break;else _0x128df3['push'](_0x128df3['shift']());}catch(_0x3e2590){_0x128df3['push'](_0x128df3['shift']());}}}(_0x5e99,0x28004));function _0x5e99(){const _0x2afc32=['CACHE_TTL','PORT','MAX_RETRIES','55tdYLkZ','5734080HkYLju','170755uBVmvf','NODE_ENV','env','CACHE_ENABLED','LOG_LEVEL','true','https://hudson-prod.localhome.cn','4KPOcpg','505059mwMXjV','API_TIMEOUT','1560671aZnLRd','300000','development','LOCALSBNB_LOG_TO_FILES','3000','104530thpzFR','3141hoccIE','553110HGeAtK','LOG_FORMAT','6VtKglW','https://hudson-dev.localhome.cn','1000','info','LUKEYUN_API_BASE_URL','develop','config','2TSSsVy','7024AwJgph'];_0x5e99=function(){return _0x2afc32;};return _0x5e99();}import _0x1932a7 from'dotenv';_0x1932a7[_0x4c67(0xde)]();const resolvedEnv=process[_0x4c67(0xc7)][_0x4c67(0xc6)]||'production';function resolveBaseURL(){if(process[_0x4c67(0xc7)][_0x4c67(0xdc)])return process[_0x4c67(0xc7)][_0x4c67(0xdc)];if(resolvedEnv===_0x4c67(0xdd)||resolvedEnv===_0x4c67(0xd1))return _0x4c67(0xd9);return _0x4c67(0xcb);}export const config={'api':{'baseURL':resolveBaseURL(),'timeout':parseInt(process[_0x4c67(0xc7)][_0x4c67(0xce)]||'30000',0xa)},'server':{'port':parseInt(process[_0x4c67(0xc7)][_0x4c67(0xc1)]||_0x4c67(0xd3),0xa),'env':resolvedEnv},'cache':{'enabled':process['env'][_0x4c67(0xc8)]===_0x4c67(0xca),'ttl':parseInt(process[_0x4c67(0xc7)][_0x4c67(0xe1)]||_0x4c67(0xd0),0xa)},'retry':{'maxRetries':parseInt(process[_0x4c67(0xc7)][_0x4c67(0xc2)]||'3',0xa),'delay':parseInt(process[_0x4c67(0xc7)]['RETRY_DELAY']||_0x4c67(0xda),0xa)},'log':{'level':process[_0x4c67(0xc7)][_0x4c67(0xc9)]||_0x4c67(0xdb),'format':process[_0x4c67(0xc7)][_0x4c67(0xd7)]||'json','toFiles':process['env'][_0x4c67(0xd2)]==='1'||process[_0x4c67(0xc7)][_0x4c67(0xd2)]===_0x4c67(0xca)}};
|