hvip-mcp-server 0.6.0 → 0.6.1
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 +165 -165
- package/dist/hub-server.js +61 -12
- package/dist/index.js +493 -38905
- package/package.json +76 -76
package/README.md
CHANGED
|
@@ -1,165 +1,165 @@
|
|
|
1
|
-
# hvip MCP Server
|
|
2
|
-
|
|
3
|
-
> OKX 全部能力接入 AI —— 365 个 MCP 工具,覆盖 97.7% OKX REST API
|
|
4
|
-
|
|
5
|
-
[](https://www.npmjs.com/package/hvip-mcp-server)
|
|
6
|
-
[](https://github.com/okx-wallet-H/hvip-mcp/blob/master/LICENSE)
|
|
7
|
-
|
|
8
|
-
📦 [github.com/okx-wallet-H/hvip-mcp](https://github.com/okx-wallet-H/hvip-mcp) · 🐛 [提交反馈](https://github.com/okx-wallet-H/hvip-mcp/issues/new)
|
|
9
|
-
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## 🚀 一行安装
|
|
13
|
-
|
|
14
|
-
```bash
|
|
15
|
-
npx -y hvip-mcp-server
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
就这么简单。MCP 客户端(Claude Desktop / Claude Code / Cursor / VS Code)会自动接管。
|
|
19
|
-
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
## 配置到 AI 客户端
|
|
23
|
-
|
|
24
|
-
**这不是命令行工具**——hvip-mcp 是 MCP (Model Context Protocol) 服务器,由 AI 客户端在后台自动运行。你只需要在配置文件中加一行 JSON,AI 自己会启动它。
|
|
25
|
-
|
|
26
|
-
### Claude Desktop
|
|
27
|
-
|
|
28
|
-
Claude Desktop → 设置 → Developer → Edit Config:
|
|
29
|
-
|
|
30
|
-
```json
|
|
31
|
-
{
|
|
32
|
-
"mcpServers": {
|
|
33
|
-
"hvip": {
|
|
34
|
-
"command": "npx",
|
|
35
|
-
"args": ["-y", "hvip-mcp-server"]
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
### Claude Code
|
|
42
|
-
|
|
43
|
-
在项目根目录或全局 `.claude/settings.json`:
|
|
44
|
-
|
|
45
|
-
```json
|
|
46
|
-
{
|
|
47
|
-
"mcpServers": {
|
|
48
|
-
"hvip": {
|
|
49
|
-
"command": "npx",
|
|
50
|
-
"args": ["-y", "hvip-mcp-server@latest"]
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
### VS Code / Cline / 其他 MCP 客户端
|
|
57
|
-
|
|
58
|
-
在 MCP 配置中添加同样的 JSON。
|
|
59
|
-
|
|
60
|
-
> **配置完需要完全退出并重启客户端**,重开后 AI 自动连接 hvip。
|
|
61
|
-
|
|
62
|
-
### 需要 API Key?
|
|
63
|
-
|
|
64
|
-
行情、技术指标、市场扫描等公开数据无需 Key。查看账户、下单交易需要 OKX API Key:
|
|
65
|
-
|
|
66
|
-
```json
|
|
67
|
-
{
|
|
68
|
-
"mcpServers": {
|
|
69
|
-
"hvip": {
|
|
70
|
-
"command": "npx",
|
|
71
|
-
"args": ["-y", "hvip-mcp-server"],
|
|
72
|
-
"env": {
|
|
73
|
-
"OKX_API_KEY": "<你的 API Key>",
|
|
74
|
-
"OKX_SECRET_KEY": "<你的 Secret Key>",
|
|
75
|
-
"OKX_PASSPHRASE": "<你的 Passphrase>"
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
> API Key 在 [OKX 官网](https://www.okx.com) → 个人中心 → API 中创建,开通「读取」权限即可查账户,「交易」权限可下单。
|
|
83
|
-
|
|
84
|
-
---
|
|
85
|
-
|
|
86
|
-
## 工作流
|
|
87
|
-
|
|
88
|
-
AI 连接 hvip 后自动执行:
|
|
89
|
-
|
|
90
|
-
```
|
|
91
|
-
1. tools/list → 365 个工具,但只有 agent_catalog 带完整描述
|
|
92
|
-
2. agent_catalog → 15 个域的地图(7 公开 + 8 需 Key),按需直达
|
|
93
|
-
3. 用户说 "BTC 怎么样" → AI 调 okx_quick_market
|
|
94
|
-
4. 用户说 "买 0.1 BTC" → AI 先预检再下单
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
**无需手动操作,全程 AI 自己来。**
|
|
98
|
-
|
|
99
|
-
---
|
|
100
|
-
|
|
101
|
-
## 工具覆盖
|
|
102
|
-
|
|
103
|
-
| 模块 | 工具数 | 说明 |
|
|
104
|
-
|------|--------|------|
|
|
105
|
-
| 🔹 账户 | 40+ | 余额/持仓/配置/杠杆/估值 |
|
|
106
|
-
| 🔹 行情 | 17 | Ticker/K线/深度/成交 |
|
|
107
|
-
| 🔹 交易 | 27 | 下单/撤单/改单/批量/平仓 |
|
|
108
|
-
| 🔹 公共数据 | 34 | 产品规格/资金费率/标记价 |
|
|
109
|
-
| 🔹 资金 | 18 | 划转/提现/充值/兑换 |
|
|
110
|
-
| 🔹 策略委托 | 6 | 止损止盈/冰山/移动止盈 |
|
|
111
|
-
| 🔹 网格 | 13 | 现货网格/合约网格/定投 |
|
|
112
|
-
| 🔹 跟单 | 23 | 交易员/跟单/带单 |
|
|
113
|
-
| 🔹 信号 | 10 | 信号订阅/历史信号 |
|
|
114
|
-
| 🔹 价差 | 16 | 跨品种/跨期价差 |
|
|
115
|
-
| 🔹 RFQ | 12 | 大宗询价/报价/成交 |
|
|
116
|
-
| 🔹 金融 | 27 | 赚币/质押/借贷 |
|
|
117
|
-
| 🔹 预测市场 | 36 | 事件合约/预测交易 |
|
|
118
|
-
| 🔹 技术指标 | 2 | RSI/MACD/布林带等 17 种 |
|
|
119
|
-
| 🔹 聪明钱 | 3 | 交易员排行榜/市场情绪 |
|
|
120
|
-
| 🔹 WebSocket | 5 | 55 频道实时推送 |
|
|
121
|
-
| 🔹 代码图谱 | 2 | 函数调用链/符号搜索 |
|
|
122
|
-
| 🔹 系统工具 | 19 | 导航/偏好/反馈/Agent 协作 |
|
|
123
|
-
|
|
124
|
-
**365 个 MCP 工具 · 覆盖 97.7% OKX REST API**
|
|
125
|
-
|
|
126
|
-
---
|
|
127
|
-
|
|
128
|
-
## 本地开发
|
|
129
|
-
|
|
130
|
-
```bash
|
|
131
|
-
git clone https://github.com/okx-wallet-H/hvip-mcp.git
|
|
132
|
-
cd hvip-mcp
|
|
133
|
-
npm install
|
|
134
|
-
npm run build
|
|
135
|
-
npm start
|
|
136
|
-
```
|
|
137
|
-
|
|
138
|
-
---
|
|
139
|
-
|
|
140
|
-
## 架构
|
|
141
|
-
|
|
142
|
-
```
|
|
143
|
-
原子层 (350 工具) → [L:READ] 权限标记 → AI Agent 按需调用
|
|
144
|
-
↓
|
|
145
|
-
Skill 组合层 (13 个) → 串联多工具,一次完成复杂任务
|
|
146
|
-
↓
|
|
147
|
-
agent_catalog → 15 域地图 → 按意图路由 → 直达目标工具
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
---
|
|
151
|
-
|
|
152
|
-
## 贡献
|
|
153
|
-
|
|
154
|
-
1. 阅读 [`CLAUDE.md`](./CLAUDE.md) 了解项目规范
|
|
155
|
-
2. 阅读 [`CONTRIBUTING.md`](./CONTRIBUTING.md) 了解提交流程
|
|
156
|
-
3. Fork → 创建分支 → 开发 → `npm run build` → 提 PR
|
|
157
|
-
|
|
158
|
-
---
|
|
159
|
-
|
|
160
|
-
## 文档
|
|
161
|
-
|
|
162
|
-
- [`CLAUDE.md`](./CLAUDE.md) — AI Agent 项目指南
|
|
163
|
-
- [`CONTRIBUTING.md`](./CONTRIBUTING.md) — 贡献流程
|
|
164
|
-
- [`docs/OKX-MCP-API对接标准-v0.2.49.md`](./docs/OKX-MCP-API对接标准-v0.2.49.md) — API 对接规范
|
|
165
|
-
- [`docs/OKX-MCP-防幻觉对接SOP-v1.0.md`](./docs/OKX-MCP-防幻觉对接SOP-v1.0.md) — 防幻觉 SOP
|
|
1
|
+
# hvip MCP Server
|
|
2
|
+
|
|
3
|
+
> OKX 全部能力接入 AI —— 365 个 MCP 工具,覆盖 97.7% OKX REST API
|
|
4
|
+
|
|
5
|
+
[](https://www.npmjs.com/package/hvip-mcp-server)
|
|
6
|
+
[](https://github.com/okx-wallet-H/hvip-mcp/blob/master/LICENSE)
|
|
7
|
+
|
|
8
|
+
📦 [github.com/okx-wallet-H/hvip-mcp](https://github.com/okx-wallet-H/hvip-mcp) · 🐛 [提交反馈](https://github.com/okx-wallet-H/hvip-mcp/issues/new)
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 🚀 一行安装
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npx -y hvip-mcp-server
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
就这么简单。MCP 客户端(Claude Desktop / Claude Code / Cursor / VS Code)会自动接管。
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 配置到 AI 客户端
|
|
23
|
+
|
|
24
|
+
**这不是命令行工具**——hvip-mcp 是 MCP (Model Context Protocol) 服务器,由 AI 客户端在后台自动运行。你只需要在配置文件中加一行 JSON,AI 自己会启动它。
|
|
25
|
+
|
|
26
|
+
### Claude Desktop
|
|
27
|
+
|
|
28
|
+
Claude Desktop → 设置 → Developer → Edit Config:
|
|
29
|
+
|
|
30
|
+
```json
|
|
31
|
+
{
|
|
32
|
+
"mcpServers": {
|
|
33
|
+
"hvip": {
|
|
34
|
+
"command": "npx",
|
|
35
|
+
"args": ["-y", "hvip-mcp-server"]
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Claude Code
|
|
42
|
+
|
|
43
|
+
在项目根目录或全局 `.claude/settings.json`:
|
|
44
|
+
|
|
45
|
+
```json
|
|
46
|
+
{
|
|
47
|
+
"mcpServers": {
|
|
48
|
+
"hvip": {
|
|
49
|
+
"command": "npx",
|
|
50
|
+
"args": ["-y", "hvip-mcp-server@latest"]
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### VS Code / Cline / 其他 MCP 客户端
|
|
57
|
+
|
|
58
|
+
在 MCP 配置中添加同样的 JSON。
|
|
59
|
+
|
|
60
|
+
> **配置完需要完全退出并重启客户端**,重开后 AI 自动连接 hvip。
|
|
61
|
+
|
|
62
|
+
### 需要 API Key?
|
|
63
|
+
|
|
64
|
+
行情、技术指标、市场扫描等公开数据无需 Key。查看账户、下单交易需要 OKX API Key:
|
|
65
|
+
|
|
66
|
+
```json
|
|
67
|
+
{
|
|
68
|
+
"mcpServers": {
|
|
69
|
+
"hvip": {
|
|
70
|
+
"command": "npx",
|
|
71
|
+
"args": ["-y", "hvip-mcp-server"],
|
|
72
|
+
"env": {
|
|
73
|
+
"OKX_API_KEY": "<你的 API Key>",
|
|
74
|
+
"OKX_SECRET_KEY": "<你的 Secret Key>",
|
|
75
|
+
"OKX_PASSPHRASE": "<你的 Passphrase>"
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
> API Key 在 [OKX 官网](https://www.okx.com) → 个人中心 → API 中创建,开通「读取」权限即可查账户,「交易」权限可下单。
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 工作流
|
|
87
|
+
|
|
88
|
+
AI 连接 hvip 后自动执行:
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
1. tools/list → 365 个工具,但只有 agent_catalog 带完整描述
|
|
92
|
+
2. agent_catalog → 15 个域的地图(7 公开 + 8 需 Key),按需直达
|
|
93
|
+
3. 用户说 "BTC 怎么样" → AI 调 okx_quick_market
|
|
94
|
+
4. 用户说 "买 0.1 BTC" → AI 先预检再下单
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
**无需手动操作,全程 AI 自己来。**
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## 工具覆盖
|
|
102
|
+
|
|
103
|
+
| 模块 | 工具数 | 说明 |
|
|
104
|
+
|------|--------|------|
|
|
105
|
+
| 🔹 账户 | 40+ | 余额/持仓/配置/杠杆/估值 |
|
|
106
|
+
| 🔹 行情 | 17 | Ticker/K线/深度/成交 |
|
|
107
|
+
| 🔹 交易 | 27 | 下单/撤单/改单/批量/平仓 |
|
|
108
|
+
| 🔹 公共数据 | 34 | 产品规格/资金费率/标记价 |
|
|
109
|
+
| 🔹 资金 | 18 | 划转/提现/充值/兑换 |
|
|
110
|
+
| 🔹 策略委托 | 6 | 止损止盈/冰山/移动止盈 |
|
|
111
|
+
| 🔹 网格 | 13 | 现货网格/合约网格/定投 |
|
|
112
|
+
| 🔹 跟单 | 23 | 交易员/跟单/带单 |
|
|
113
|
+
| 🔹 信号 | 10 | 信号订阅/历史信号 |
|
|
114
|
+
| 🔹 价差 | 16 | 跨品种/跨期价差 |
|
|
115
|
+
| 🔹 RFQ | 12 | 大宗询价/报价/成交 |
|
|
116
|
+
| 🔹 金融 | 27 | 赚币/质押/借贷 |
|
|
117
|
+
| 🔹 预测市场 | 36 | 事件合约/预测交易 |
|
|
118
|
+
| 🔹 技术指标 | 2 | RSI/MACD/布林带等 17 种 |
|
|
119
|
+
| 🔹 聪明钱 | 3 | 交易员排行榜/市场情绪 |
|
|
120
|
+
| 🔹 WebSocket | 5 | 55 频道实时推送 |
|
|
121
|
+
| 🔹 代码图谱 | 2 | 函数调用链/符号搜索 |
|
|
122
|
+
| 🔹 系统工具 | 19 | 导航/偏好/反馈/Agent 协作 |
|
|
123
|
+
|
|
124
|
+
**365 个 MCP 工具 · 覆盖 97.7% OKX REST API**
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## 本地开发
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
git clone https://github.com/okx-wallet-H/hvip-mcp.git
|
|
132
|
+
cd hvip-mcp
|
|
133
|
+
npm install
|
|
134
|
+
npm run build
|
|
135
|
+
npm start
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## 架构
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
原子层 (350 工具) → [L:READ] 权限标记 → AI Agent 按需调用
|
|
144
|
+
↓
|
|
145
|
+
Skill 组合层 (13 个) → 串联多工具,一次完成复杂任务
|
|
146
|
+
↓
|
|
147
|
+
agent_catalog → 15 域地图 → 按意图路由 → 直达目标工具
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## 贡献
|
|
153
|
+
|
|
154
|
+
1. 阅读 [`CLAUDE.md`](./CLAUDE.md) 了解项目规范
|
|
155
|
+
2. 阅读 [`CONTRIBUTING.md`](./CONTRIBUTING.md) 了解提交流程
|
|
156
|
+
3. Fork → 创建分支 → 开发 → `npm run build` → 提 PR
|
|
157
|
+
|
|
158
|
+
---
|
|
159
|
+
|
|
160
|
+
## 文档
|
|
161
|
+
|
|
162
|
+
- [`CLAUDE.md`](./CLAUDE.md) — AI Agent 项目指南
|
|
163
|
+
- [`CONTRIBUTING.md`](./CONTRIBUTING.md) — 贡献流程
|
|
164
|
+
- [`docs/OKX-MCP-API对接标准-v0.2.49.md`](./docs/OKX-MCP-API对接标准-v0.2.49.md) — API 对接规范
|
|
165
|
+
- [`docs/OKX-MCP-防幻觉对接SOP-v1.0.md`](./docs/OKX-MCP-防幻觉对接SOP-v1.0.md) — 防幻觉 SOP
|
package/dist/hub-server.js
CHANGED
|
@@ -5012,11 +5012,29 @@ var HubCosts = class {
|
|
|
5012
5012
|
var CircuitBreaker = class {
|
|
5013
5013
|
circuits = /* @__PURE__ */ new Map();
|
|
5014
5014
|
failureThreshold = 3;
|
|
5015
|
-
|
|
5016
|
-
// 1 minute
|
|
5015
|
+
baseCooldownMs = 6e4;
|
|
5016
|
+
// 1 minute base
|
|
5017
|
+
maxCooldownMs = 3e5;
|
|
5018
|
+
// 5 minutes max
|
|
5019
|
+
listeners = /* @__PURE__ */ new Set();
|
|
5017
5020
|
constructor(opts) {
|
|
5018
5021
|
if (opts?.failureThreshold) this.failureThreshold = opts.failureThreshold;
|
|
5019
|
-
if (opts?.cooldownMs) this.
|
|
5022
|
+
if (opts?.cooldownMs) this.baseCooldownMs = opts.cooldownMs;
|
|
5023
|
+
if (opts?.maxCooldownMs) this.maxCooldownMs = opts.maxCooldownMs;
|
|
5024
|
+
}
|
|
5025
|
+
/** 注册状态变更监听 */
|
|
5026
|
+
onStateChange(handler) {
|
|
5027
|
+
this.listeners.add(handler);
|
|
5028
|
+
return () => this.listeners.delete(handler);
|
|
5029
|
+
}
|
|
5030
|
+
/** 内部通知 */
|
|
5031
|
+
notify(event, name, entry) {
|
|
5032
|
+
for (const h of this.listeners) {
|
|
5033
|
+
try {
|
|
5034
|
+
h(event, name, entry);
|
|
5035
|
+
} catch {
|
|
5036
|
+
}
|
|
5037
|
+
}
|
|
5020
5038
|
}
|
|
5021
5039
|
/** 获取或创建熔断器 */
|
|
5022
5040
|
get(name) {
|
|
@@ -5031,7 +5049,8 @@ var CircuitBreaker = class {
|
|
|
5031
5049
|
lastFailure: null,
|
|
5032
5050
|
lastSuccess: null,
|
|
5033
5051
|
openedAt: null,
|
|
5034
|
-
cooldownMs: this.
|
|
5052
|
+
cooldownMs: this.baseCooldownMs,
|
|
5053
|
+
backoffMultiplier: 1
|
|
5035
5054
|
};
|
|
5036
5055
|
this.circuits.set(name, c);
|
|
5037
5056
|
}
|
|
@@ -5046,6 +5065,7 @@ var CircuitBreaker = class {
|
|
|
5046
5065
|
const elapsed = Date.now() - new Date(c.openedAt).getTime();
|
|
5047
5066
|
if (elapsed >= c.cooldownMs) {
|
|
5048
5067
|
c.state = "HALF_OPEN";
|
|
5068
|
+
this.notify("half_open", name, c);
|
|
5049
5069
|
return true;
|
|
5050
5070
|
}
|
|
5051
5071
|
}
|
|
@@ -5059,27 +5079,36 @@ var CircuitBreaker = class {
|
|
|
5059
5079
|
if (c.state === "HALF_OPEN") {
|
|
5060
5080
|
c.state = "CLOSED";
|
|
5061
5081
|
c.failures = 0;
|
|
5082
|
+
c.backoffMultiplier = 1;
|
|
5083
|
+
this.notify("closed", name, c);
|
|
5062
5084
|
}
|
|
5063
5085
|
if (c.state === "CLOSED") {
|
|
5064
5086
|
c.failures = 0;
|
|
5065
5087
|
}
|
|
5066
5088
|
}
|
|
5067
|
-
/** 调用失败 */
|
|
5089
|
+
/** 调用失败 — 带指数退避 */
|
|
5068
5090
|
onFailure(name) {
|
|
5069
5091
|
const c = this.get(name);
|
|
5070
5092
|
c.failures++;
|
|
5071
5093
|
c.failureCount++;
|
|
5072
5094
|
c.lastFailure = (/* @__PURE__ */ new Date()).toISOString();
|
|
5073
5095
|
if (c.failures >= this.failureThreshold) {
|
|
5096
|
+
const backoffMs = Math.min(
|
|
5097
|
+
this.baseCooldownMs * Math.pow(2, c.backoffMultiplier - 1),
|
|
5098
|
+
this.maxCooldownMs
|
|
5099
|
+
);
|
|
5100
|
+
c.cooldownMs = backoffMs;
|
|
5101
|
+
c.backoffMultiplier++;
|
|
5074
5102
|
c.state = "OPEN";
|
|
5075
5103
|
c.openedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
5104
|
+
this.notify("opened", name, c);
|
|
5076
5105
|
}
|
|
5077
5106
|
}
|
|
5078
|
-
/**
|
|
5079
|
-
async wrap(name, fn, fallback) {
|
|
5107
|
+
/** 包裹一个异步函数,支持重试和 fallback */
|
|
5108
|
+
async wrap(name, fn, fallback, retries = 0) {
|
|
5080
5109
|
if (!this.canCall(name)) {
|
|
5081
5110
|
if (fallback) return fallback();
|
|
5082
|
-
throw new Error(`Circuit OPEN: ${name}`);
|
|
5111
|
+
throw new Error(`Circuit OPEN: ${name} (\u51B7\u5374\u4E2D, ${this.get(name).cooldownMs}ms)`);
|
|
5083
5112
|
}
|
|
5084
5113
|
try {
|
|
5085
5114
|
const result = await fn();
|
|
@@ -5087,6 +5116,11 @@ var CircuitBreaker = class {
|
|
|
5087
5116
|
return result;
|
|
5088
5117
|
} catch (e) {
|
|
5089
5118
|
this.onFailure(name);
|
|
5119
|
+
if (retries > 0) {
|
|
5120
|
+
const wait = Math.min(1e3 * Math.pow(2, 3 - retries), 9e3);
|
|
5121
|
+
await new Promise((r) => setTimeout(r, wait));
|
|
5122
|
+
return this.wrap(name, fn, fallback, retries - 1);
|
|
5123
|
+
}
|
|
5090
5124
|
if (fallback) return fallback();
|
|
5091
5125
|
throw e;
|
|
5092
5126
|
}
|
|
@@ -5095,12 +5129,27 @@ var CircuitBreaker = class {
|
|
|
5095
5129
|
status() {
|
|
5096
5130
|
return [...this.circuits.values()];
|
|
5097
5131
|
}
|
|
5098
|
-
/** 重置指定熔断器 */
|
|
5132
|
+
/** 重置指定熔断器 — 立即清除状态 */
|
|
5099
5133
|
reset(name) {
|
|
5100
|
-
this.circuits.
|
|
5134
|
+
const c = this.circuits.get(name);
|
|
5135
|
+
if (c) {
|
|
5136
|
+
this.notify("reset", name, c);
|
|
5137
|
+
this.circuits.delete(name);
|
|
5138
|
+
}
|
|
5139
|
+
}
|
|
5140
|
+
/** 重置所有熔断器 */
|
|
5141
|
+
resetAll() {
|
|
5142
|
+
for (const [name, c] of this.circuits) {
|
|
5143
|
+
this.notify("reset", name, c);
|
|
5144
|
+
}
|
|
5145
|
+
this.circuits.clear();
|
|
5101
5146
|
}
|
|
5102
5147
|
};
|
|
5103
|
-
var circuitBreaker = new CircuitBreaker({
|
|
5148
|
+
var circuitBreaker = new CircuitBreaker({
|
|
5149
|
+
failureThreshold: 3,
|
|
5150
|
+
cooldownMs: 6e4,
|
|
5151
|
+
maxCooldownMs: 3e5
|
|
5152
|
+
});
|
|
5104
5153
|
|
|
5105
5154
|
// src/hub-server.ts
|
|
5106
5155
|
var import_node_fs3 = require("node:fs");
|
|
@@ -6098,7 +6147,7 @@ if ((0, import_node_fs3.existsSync)(envPath)) {
|
|
|
6098
6147
|
}
|
|
6099
6148
|
});
|
|
6100
6149
|
}
|
|
6101
|
-
var VERSION = "0.6.
|
|
6150
|
+
var VERSION = "0.6.1";
|
|
6102
6151
|
function getDashboardHtml(host2, port) {
|
|
6103
6152
|
const paths = [(0, import_node_path3.join)(__dirname, "web", "dashboard.html"), (0, import_node_path3.join)(__dirname, "..", "src", "web", "dashboard.html")];
|
|
6104
6153
|
for (const p of paths) {
|