desic-okx-agent 0.1.9 → 0.2.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.
Files changed (47) hide show
  1. package/README.en.md +273 -0
  2. package/README.md +155 -175
  3. package/dist/account/private-websocket.d.ts +1 -0
  4. package/dist/account/private-websocket.js +27 -2
  5. package/dist/account/private-websocket.js.map +1 -1
  6. package/dist/cli/doctor.d.ts +14 -0
  7. package/dist/cli/doctor.js +133 -0
  8. package/dist/cli/doctor.js.map +1 -0
  9. package/dist/cli/index.js +186 -10
  10. package/dist/cli/index.js.map +1 -1
  11. package/dist/cli/prompts.d.ts +1 -0
  12. package/dist/cli/prompts.js +6 -0
  13. package/dist/cli/prompts.js.map +1 -1
  14. package/dist/cli/render.d.ts +8 -0
  15. package/dist/cli/render.js +73 -0
  16. package/dist/cli/render.js.map +1 -0
  17. package/dist/market/store.d.ts +1 -0
  18. package/dist/market/store.js +24 -0
  19. package/dist/market/store.js.map +1 -1
  20. package/dist/market/websocket.d.ts +1 -0
  21. package/dist/market/websocket.js +13 -0
  22. package/dist/market/websocket.js.map +1 -1
  23. package/dist/runtime/client.d.ts +1 -0
  24. package/dist/runtime/client.js +46 -2
  25. package/dist/runtime/client.js.map +1 -1
  26. package/dist/runtime/server.js +21 -2
  27. package/dist/runtime/server.js.map +1 -1
  28. package/dist/setup/installer.d.ts +21 -0
  29. package/dist/setup/installer.js +113 -27
  30. package/dist/setup/installer.js.map +1 -1
  31. package/dist/setup/wizard.d.ts +3 -0
  32. package/dist/setup/wizard.js +131 -3
  33. package/dist/setup/wizard.js.map +1 -1
  34. package/dist/storage/database.d.ts +2 -0
  35. package/dist/storage/database.js +23 -0
  36. package/dist/storage/database.js.map +1 -1
  37. package/dist/tools/catalog.js +1 -1
  38. package/dist/tools/catalog.js.map +1 -1
  39. package/dist/tools/help.d.ts +10 -0
  40. package/dist/tools/help.js +79 -0
  41. package/dist/tools/help.js.map +1 -0
  42. package/dist/update/service.d.ts +10 -0
  43. package/dist/update/service.js +104 -0
  44. package/dist/update/service.js.map +1 -0
  45. package/package.json +2 -1
  46. package/skills/okx-news-intelligence/SKILL.md +2 -0
  47. package/skills/okx-smart-money-analysis/SKILL.md +2 -0
package/README.md CHANGED
@@ -1,55 +1,54 @@
1
1
  # Desic OKX Agent
2
2
 
3
- An independent local OKX runtime, MCP server, CLI, and reusable agent skills for Codex, Claude Code, and other MCP clients.
3
+ [简体中文](README.md) | [English](README.en.md)
4
4
 
5
- > [!IMPORTANT]
6
- > Desic OKX Agent is an independent community project. It is not affiliated with, endorsed by, or an official product of OKX.
7
-
8
- ## What it provides
9
-
10
- - A shared local Runtime reused by multiple MCP and CLI clients
11
- - In-memory ticker, order book, trades, candles, funding, mark price, and open-interest data
12
- - Time-aligned decision snapshots with freshness and consistency metadata
13
- - Public market and derivatives tools that work without API credentials
14
- - Named OKX accounts for balances, positions, orders, fills, bills, and risk summaries
15
- - Direct ordinary-order, algo-order, leverage, amend, cancel, and close-position operations
16
- - Experimental News and Smart Money intelligence with SQLite history fallback
17
- - Seven reusable analysis and trading skills
18
- - SQLite WAL persistence for closed candles, intelligence history, derived events, and execution records
19
-
20
- The project does not expose withdrawal, deposit, transfer, asset-movement, or API-key-management tools.
5
+ 面向 Codex、Claude Code 及其他 MCP 客户端的独立 OKX 本地 Runtime、MCP Server、CLI 和 Agent Skills。
21
6
 
22
- ## Requirements
7
+ > [!IMPORTANT]
8
+ > Desic OKX Agent 是独立的社区项目,并非 OKX 官方产品,也未获得 OKX 的认可或背书。
23
9
 
24
- - Node.js 22.12 or newer
25
- - npm
26
- - Network access to OKX, or an HTTP/HTTPS proxy that can reach OKX
10
+ ## 安装
27
11
 
28
- ## Install
12
+ 要求 Node.js 22.12 或更高版本,以及能够访问 OKX 的网络或 HTTP/HTTPS 代理。
29
13
 
30
- Install the published package:
14
+ 首次安装只需两条命令:
31
15
 
32
16
  ```bash
33
17
  npm install --global desic-okx-agent
18
+ desic-okx setup
34
19
  ```
35
20
 
36
- This registers the `desic-okx` command on the local machine.
21
+ 两条命令作用不同:
22
+
23
+ 1. `npm install` 安装 `desic-okx` 程序。
24
+ 2. `desic-okx setup` 接入 AI 客户端、安装 Skills、检查网络,并询问是否配置 OKX API 账户。
37
25
 
38
- ## Set up an AI client
26
+ 首次安装后需要运行一次 `setup`。以后正常升级无需重复运行;只有新增 AI 客户端、修复配置或重新配置代理时才需要再次运行。
39
27
 
40
- Run the guided setup after installation:
28
+ 完成后重启已选择的 AI 客户端,并验证:
41
29
 
42
30
  ```bash
43
- desic-okx setup
31
+ desic-okx doctor
44
32
  ```
45
33
 
46
- The terminal guide lets you select Codex, Claude Code, Cursor, VS Code / GitHub Copilot, Cline, or all supported clients with the arrow keys and Space. It safely adds the `desic-okx` MCP entry without replacing other MCP servers.
34
+ ## Setup 会做什么
47
35
 
48
- For Codex and Claude Code, setup also installs all bundled Skills automatically. Cursor, VS Code / GitHub Copilot, and Cline receive MCP configuration only because they do not share a portable `SKILL.md` installation format.
36
+ 交互式向导会依次完成:
49
37
 
50
- Setup then checks both OKX REST and WebSocket connectivity. Transient TLS and network failures are retried before setup asks for action. When direct and detected system-proxy connections still fail, it offers to test and save an HTTP proxy URL, retry, or continue without network access.
38
+ 1. 选择 Codex、Claude Code、Cursor、VS Code / GitHub Copilot、Cline,或全部客户端。
39
+ 2. 注册 `desic-okx` MCP Server,保留已有 MCP 配置。
40
+ 3. 为 Codex 和 Claude Code 自动安装全部 7 个 Skills。
41
+ 4. 检查 OKX REST 与 WebSocket;连接失败时引导测试并保存 HTTP 代理。
42
+ 5. 解释不同功能的 API Key 要求,并让用户选择“现在配置”或“以后配置”。
43
+ 6. 如果现在配置,隐藏凭证输入,先向 OKX 验证,成功后才写入本地配置。
51
44
 
52
- For automation, choose explicit targets without opening the UI:
45
+ API 账户是可选的。跳过后公共行情和公共衍生品仍可使用,以后运行下面的命令即可配置:
46
+
47
+ ```bash
48
+ desic-okx account add
49
+ ```
50
+
51
+ 自动化或无人值守安装可以指定客户端;该模式不会询问或保存 API 凭证:
53
52
 
54
53
  ```bash
55
54
  desic-okx setup --targets codex --yes
@@ -58,106 +57,98 @@ desic-okx setup --all --yes
58
57
  desic-okx setup --targets codex --yes --skip-network-check
59
58
  ```
60
59
 
61
- Non-interactive setup exits with an error when the network check fails. Use `--skip-network-check` only when connectivity will be configured later.
60
+ ## 配置 OKX API
62
61
 
63
- Restart the selected client after setup. The MCP server starts the local Runtime automatically when it is first used.
62
+ 在 OKX 官方网站或 App 中创建 API Key。实盘账户与模拟交易账户使用各自环境的 API Key;在向导中必须选择对应的 `live` 或 `demo` 环境。
64
63
 
65
- ## Ask an AI to install it
64
+ 按实际用途授予权限:
66
65
 
67
- Paste this into Codex, Claude Code, Cursor, VS Code / GitHub Copilot, or Cline. Replace `codex` with `claude-code`, `cursor`, `vscode`, `cline`, or `all` when appropriate.
66
+ | 功能 | 是否需要 API Key | 所需条件 |
67
+ | --- | --- | --- |
68
+ | 公共行情、K 线、盘口、衍生品分析 | 否 | 无 |
69
+ | 余额、持仓、订单、成交、风险摘要 | 是 | 读取权限 |
70
+ | 远程 News、Smart Money | 是 | `live` 账户,读取权限即可 |
71
+ | 下单、改单、撤单、平仓、设置杠杆 | 是 | OKX API Key 具备交易权限 |
68
72
 
69
- ```text
70
- Install Desic OKX Agent for me. Check that Node.js is at least 22.12, then run:
71
- npm install --global desic-okx-agent
72
- desic-okx setup --targets codex --yes
73
-
74
- Verify the installation with `desic-okx status` and `desic-okx tools`. Do not ask for or configure any OKX API credentials. Confirm that public market tools are ready to use.
75
- ```
73
+ 本项目不提供提现、充值、资金划转、资产转出或 API Key 管理工具,不需要为此授予相关权限。建议先使用 OKX 模拟交易账户验证交易流程,并按自己的安全策略在 OKX 配置 IP 白名单。
76
74
 
77
- For development from source:
75
+ 交互式添加账户:
78
76
 
79
77
  ```bash
80
- git clone https://github.com/xiazhi88/desic-okx-agent.git
81
- cd desic-okx-agent
82
- npm ci
83
- npm run build
84
- npm link
78
+ desic-okx account add --name demo --environment demo
79
+ desic-okx account add --name main --environment live
85
80
  ```
86
81
 
87
- ## Quick start
88
-
89
- Public market tools do not require an account:
82
+ 输入 API Key、Secret Key 和 Passphrase 时终端会隐藏文本。`account add` 会先连接 OKX 验证,验证失败不会保存凭证。凭证保存在系统配置目录的 `config.json` 中;Unix 权限为 `0600`:
90
83
 
91
84
  ```bash
92
- desic-okx start
93
- desic-okx call market_get_ticker --json '{"instId":"BTC-USDT-SWAP"}'
94
- desic-okx call market_get_decision_snapshot --json '{"instId":"BTC-USDT-SWAP","bar":"1m"}'
85
+ desic-okx config-path
95
86
  ```
96
87
 
97
- The Runtime starts automatically when an MCP client or CLI call needs it. `desic-okx start` is optional.
98
- The stdio MCP adapter does not load the native SQLite module itself, which avoids holding the package binary open during Windows upgrades. Stop a running Runtime with `desic-okx stop` before upgrading.
99
-
100
- Useful Runtime commands:
88
+ 也支持环境变量覆盖同名账户:
101
89
 
102
- ```bash
103
- desic-okx status
104
- desic-okx tools
105
- desic-okx stop
90
+ ```text
91
+ OKX_ACCOUNT
92
+ OKX_API_KEY
93
+ OKX_API_SECRET
94
+ OKX_API_PASSPHRASE
95
+ OKX_ENVIRONMENT=demo|live
106
96
  ```
107
97
 
108
- ## Connect Codex
98
+ 三个凭证变量必须同时提供。能否交易完全取决于 OKX 为该 API Key 配置的官方权限。
109
99
 
110
- The recommended option is `desic-okx setup`, which also installs all Skills. To register only the local stdio MCP server manually:
111
-
112
- ```bash
113
- codex mcp add desic-okx -- desic-okx mcp
114
- ```
100
+ ## 让 AI 自动安装
115
101
 
116
- Or add it to `~/.codex/config.toml`:
102
+ 可将下面的提示词交给 Codex、Claude Code、Cursor、VS Code / GitHub Copilot 或 Cline。将 `codex` 替换为 `claude-code`、`cursor`、`vscode`、`cline` 或 `all`:
117
103
 
118
- ```toml
119
- [mcp_servers.desic-okx]
120
- command = "desic-okx"
121
- args = ["mcp"]
104
+ ```text
105
+ 请为我安装 Desic OKX Agent:
106
+ 1. 检查 Node.js 是否为 22.12 或更高版本。
107
+ 2. 运行 npm install --global desic-okx-agent。
108
+ 3. 运行 desic-okx setup --targets codex --yes。
109
+ 4. 运行 desic-okx doctor 验证 MCP、Skills 和 OKX 网络。
110
+ 5. 不要要求我在聊天中发送任何 API Key、Secret 或 Passphrase。
111
+ 6. 告诉我公共工具已可使用;如果我需要账户、News、Smart Money 或交易功能,引导我直接在自己的终端运行 desic-okx account add,并由我在隐藏输入框中填写凭证。
122
112
  ```
123
113
 
124
- ## Connect Claude Code
114
+ ## 快速开始
125
115
 
126
- The recommended option is `desic-okx setup`, which also installs all Skills. To register only the MCP server manually:
116
+ 公共行情不需要账户:
127
117
 
128
118
  ```bash
129
- claude mcp add --transport stdio --scope user desic-okx -- desic-okx mcp
119
+ desic-okx call market_get_ticker --json '{"instId":"BTC-USDT-SWAP"}'
120
+ desic-okx call market_get_decision_snapshot --json '{"instId":"BTC-USDT-SWAP","bar":"1m"}'
130
121
  ```
131
122
 
132
- Verify the connection with:
123
+ Runtime 会在 MCP 或 CLI 首次调用时自动启动,通常不需要手动运行 `desic-okx start`。
124
+
125
+ 常用命令:
133
126
 
134
127
  ```bash
135
- claude mcp get desic-okx
128
+ desic-okx status
129
+ desic-okx doctor
130
+ desic-okx tools
131
+ desic-okx tool market_get_decision_snapshot
132
+ desic-okx account list
133
+ desic-okx update --check
136
134
  ```
137
135
 
138
- A JSON example is available in `examples/claude-code/mcp.json`.
136
+ `status` 显示 Runtime 版本、运行时间、代理路径、WebSocket 状态、订阅与数据年龄、账户和数据库状态。`doctor` 主动检查安装、网络、SQLite、行情、账户、MCP 客户端和 Skills。两者均支持 `--json`。
139
137
 
140
- ## Skills
141
-
142
- `desic-okx setup` automatically installs all seven Skills for Codex and Claude Code. The MCP server exposes the tools; Skills add reusable analysis and trading workflows.
143
-
144
- To install selected Skills manually, copy their directories from the installed package:
145
-
146
- Codex personal skills:
147
-
148
- ```text
149
- ${CODEX_HOME:-~/.codex}/skills/<skill-name>/SKILL.md
150
- ```
138
+ ## 主要能力
151
139
 
152
- Claude Code personal skills:
140
+ - 共享单例 Runtime,可被多个 MCP 和 CLI 客户端复用
141
+ - 内存中的 ticker、盘口、逐笔成交、K 线、资金费率、标记价格和持仓量
142
+ - 带新鲜度、交易所时间和一致性元数据的统一决策快照
143
+ - 公共行情、指标扫描和公共衍生品分析
144
+ - 账户余额、持仓、委托、成交、账单及风险摘要
145
+ - 普通单、策略单、杠杆、改单、撤单和平仓操作
146
+ - 实验性的 News 与 Smart Money 能力,以及 SQLite 历史回退
147
+ - SQLite WAL 持久化已收盘 K 线、情报历史、派生事件和执行记录
153
148
 
154
- ```text
155
- ~/.claude/skills/<skill-name>/SKILL.md
156
- ```
157
-
158
- Project-scoped alternatives are `.agents/skills/` for Codex and `.claude/skills/` for Claude Code.
149
+ ## Skills
159
150
 
160
- Included skills:
151
+ `desic-okx setup` 会为 Codex 和 Claude Code 自动安装:
161
152
 
162
153
  - `okx-market-analysis`
163
154
  - `okx-derivatives-analysis`
@@ -167,50 +158,49 @@ Included skills:
167
158
  - `okx-trading`
168
159
  - `trading-philosophy`
169
160
 
170
- Restart the client if a newly installed skill does not appear.
171
-
172
- ## Configure an OKX account
173
-
174
- Public tools work without credentials. Account and trading tools use a named account alias and never accept credentials as tool arguments.
175
-
176
- Add and verify an account interactively:
161
+ 升级后 Skills 会自动同步。也可手动检查或同步;被修改的旧版本会先备份:
177
162
 
178
163
  ```bash
179
- desic-okx account add --name demo --environment demo
180
- desic-okx account verify --name demo
181
- desic-okx account list
164
+ desic-okx skills status
165
+ desic-okx skills sync
166
+ desic-okx skills sync --targets codex --dry-run
182
167
  ```
183
168
 
184
- The credential prompts hide input. Credentials are stored in the system configuration directory in `config.json`; Unix permissions are set to `0600`. The active path is shown by:
169
+ ## 账户管理
185
170
 
186
171
  ```bash
187
- desic-okx config-path
172
+ desic-okx account list
173
+ desic-okx account verify --name main
174
+ desic-okx account verify --all
175
+ desic-okx account set-default main
176
+ desic-okx account rename main primary
177
+ desic-okx account edit primary
178
+ desic-okx account remove primary
188
179
  ```
189
180
 
190
- Environment variables can override a named account:
181
+ `account add` 和 `account edit` 均在写入配置前验证凭证。工具参数只接受账户别名,不接受 API Key、Secret 或 Passphrase。
191
182
 
192
- ```text
193
- OKX_ACCOUNT
194
- OKX_API_KEY
195
- OKX_API_SECRET
196
- OKX_API_PASSPHRASE
197
- OKX_ENVIRONMENT=demo|live
198
- ```
183
+ ## 工具帮助
199
184
 
200
- The three credential values must be provided together. Whether an account can trade is determined by the permissions assigned to its API key in OKX.
185
+ ```bash
186
+ desic-okx tools
187
+ desic-okx tool news_search
188
+ desic-okx tool trade_place_order
189
+ desic-okx tool trade_place_order --json
190
+ ```
201
191
 
202
- ## Proxy
192
+ 帮助会显示用途、账户要求、输入 Schema 和可直接运行的调用示例。远程 News 与 Smart Money 接口属于实验性能力,上游兼容性问题会返回 `CAPABILITY_UNAVAILABLE`,不会影响行情、账户和交易模块。
203
193
 
204
- REST and every public, business, and private WebSocket connection use the same proxy resolution order:
194
+ ## 代理
205
195
 
206
- 1. `proxy.url` in `config.json`
207
- 2. `HTTPS_PROXY`, `HTTP_PROXY`, or `ALL_PROXY` environment variables, with `NO_PROXY` support
208
- 3. The enabled Windows or macOS HTTP/HTTPS system proxy
209
- 4. Direct connection
196
+ REST 以及公共、业务和私有 WebSocket 统一按以下顺序解析代理:
210
197
 
211
- Linux system-wide desktop proxy settings vary by distribution; use the standard environment variables or `config.json`. Only HTTP and HTTPS proxy URLs are supported. PAC-only and SOCKS-only system settings require an HTTP proxy endpoint.
198
+ 1. `config.json` 中的 `proxy.url`
199
+ 2. `HTTPS_PROXY`、`HTTP_PROXY` 或 `ALL_PROXY`,并支持 `NO_PROXY`
200
+ 3. Windows 或 macOS 已启用的系统 HTTP/HTTPS 代理
201
+ 4. 直接连接
212
202
 
213
- Example explicit configuration:
203
+ 只支持 HTTP/HTTPS 代理 URL。仅有 PAC 或 SOCKS 的环境需要提供 HTTP 代理入口。示例:
214
204
 
215
205
  ```json
216
206
  {
@@ -220,74 +210,64 @@ Example explicit configuration:
220
210
  }
221
211
  ```
222
212
 
223
- The guided `desic-okx setup` flow tests a manually entered proxy before saving it. See `examples/config.example.json` for a complete credential-free configuration template. Restart the Runtime after changing configuration.
224
-
225
- ## Runtime behavior
226
-
227
- - Binds a random port on `127.0.0.1`
228
- - Stores PID, port, and a random access token in private local state files
229
- - Prewarms `BTC-USDT-SWAP` and `ETH-USDT-SWAP`
230
- - Subscribes to other instruments on demand and releases them after 15 minutes of inactivity
231
- - Serves fresh data from memory and uses REST for cold or stale data
232
- - Reconnects WebSockets automatically
233
- - Rebuilds the order book after sequence gaps or checksum failures
234
- - Restores persisted candle and intelligence history before live prewarming
213
+ 修改配置后重启 Runtime:
235
214
 
236
- `market_get_decision_snapshot` combines market components around one observation time. It reports every component's exchange timestamp, receive time, age, warnings, and maximum observed time skew. Trading prechecks reject inconsistent snapshots.
215
+ ```bash
216
+ desic-okx stop
217
+ ```
237
218
 
238
- ## Trading behavior
219
+ ## 更新
239
220
 
240
- Trading tools require a stable `executionKey`. Client order IDs are derived from that key, and execution state is recorded locally. When a write times out or returns an unclear result, the Runtime queries remote order state before deciding whether a retry is safe.
221
+ ```bash
222
+ desic-okx update --check
223
+ desic-okx update
224
+ desic-okx update --yes
225
+ ```
241
226
 
242
- Supported order families include:
227
+ 更新器会检查 npm 官方 Registry、停止 Runtime、等待 Windows 释放 SQLite 原生模块、执行全局升级、同步已安装 Skills,最后运行 Doctor。新版 CLI 或 MCP 适配器遇到旧 Runtime 时也会自动切换版本。
243
228
 
244
- - `limit`
245
- - `market`
246
- - `post_only`
247
- - `ioc`
248
- - `fok`
249
- - `trigger`
250
- - `conditional`
251
- - `trailing`
229
+ ## 手动接入客户端
252
230
 
253
- Ordinary and strategy orders are checked against instrument increments, minimum size, current account permission, and market snapshot consistency before submission.
231
+ 推荐使用 `desic-okx setup`。只注册 MCP 时,可运行:
254
232
 
255
- Use an OKX Demo account first. Trading software can lose money, and the project provides no investment advice or guarantee of execution quality.
233
+ ```bash
234
+ codex mcp add desic-okx -- desic-okx mcp
235
+ claude mcp add --transport stdio --scope user desic-okx -- desic-okx mcp
236
+ ```
256
237
 
257
- ## Experimental intelligence
238
+ Codex 的手动配置:
258
239
 
259
- News and Smart Money use upstream interfaces that may change without notice. Compatibility failures return `CAPABILITY_UNAVAILABLE`, or locally persisted history when available. A failure in these modules does not disable market, account, or trading tools.
240
+ ```toml
241
+ [mcp_servers.desic-okx]
242
+ command = "desic-okx"
243
+ args = ["mcp"]
244
+ ```
260
245
 
261
- ## Development
246
+ ## 从源码开发
262
247
 
263
248
  ```bash
249
+ git clone https://github.com/xiazhi88/desic-okx-agent.git
250
+ cd desic-okx-agent
264
251
  npm ci
265
252
  npm run check
253
+ npm link
266
254
  ```
267
255
 
268
- The check pipeline runs:
269
-
270
- - TypeScript type checking
271
- - Unit tests
272
- - Skill validation
273
- - Sensitive-information scanning
274
- - Production build
275
- - MCP SDK smoke tests
276
-
277
- The optional end-to-end trading test is restricted to OKX Demo. Export the four environment variables listed in the account section, using `demo` as the environment, and then run:
278
-
279
- ```bash
280
- npm run test:demo
281
- ```
256
+ 检查流程包含 TypeScript 类型检查、单元测试、Skill 校验、敏感信息扫描、生产构建和 MCP 传输冒烟测试。普通测试不会提交订单;真实交易端到端测试仅允许 OKX Demo 环境。
282
257
 
283
- Normal tests never submit orders.
258
+ ## 运行机制
284
259
 
285
- ## Status
260
+ - Runtime 绑定 `127.0.0.1` 随机端口,并以私有状态文件保存 PID、端口和访问令牌。
261
+ - 默认预热 `BTC-USDT-SWAP` 和 `ETH-USDT-SWAP`,其他合约按需订阅并在空闲 15 分钟后释放。
262
+ - 热数据从内存返回,冷数据或过期数据由 REST 补齐。
263
+ - WebSocket 自动重连;盘口序列、校验失败时重新建立快照。
264
+ - `market_get_decision_snapshot` 对齐多个数据组件并报告最大时间偏差;交易预检拒绝不一致快照。
265
+ - 交易写操作使用稳定 `executionKey`。超时或结果不明确时先查询远端状态,不直接重复提交。
286
266
 
287
- This repository is currently pre-release software at version `0.1.9`. Unit, packaging, Skill, and MCP transport checks are automated. Real OKX Demo trading should be validated in the target network environment before a `1.0.0` release.
267
+ 交易软件可能造成资金损失。本项目不提供投资建议,也不保证执行结果。
288
268
 
289
- ## License
269
+ ## 状态与许可
290
270
 
291
- MIT. See `LICENSE`.
271
+ 当前为 `0.2.1` 预发布版本。正式发布 `1.0.0` 前,应在目标网络环境中完成 OKX Demo 交易验证。
292
272
 
293
- OKX and related marks belong to their respective owners.
273
+ MIT License,详见 `LICENSE`。OKX 及相关商标归其各自权利人所有。
@@ -7,6 +7,7 @@ export declare class PrivateAccountWebSockets {
7
7
  constructor(config: RuntimeConfig, store: AccountStore);
8
8
  start(): void;
9
9
  stop(): void;
10
+ status(): Array<Record<string, unknown>>;
10
11
  private connect;
11
12
  private reconnect;
12
13
  private message;
@@ -8,7 +8,9 @@ export class PrivateAccountWebSockets {
8
8
  agent;
9
9
  constructor(config, store) {
10
10
  this.store = store;
11
- this.connections = Object.entries(config.accounts).map(([name, account]) => ({ account: { name, ...account }, stopping: false, attempt: 0 }));
11
+ this.connections = Object.entries(config.accounts).map(([name, account]) => ({
12
+ account: { name, ...account }, stopping: false, attempt: 0, authenticated: false
13
+ }));
12
14
  const proxyUrl = resolveProxy(config.proxy.url).url;
13
15
  this.agent = proxyUrl ? new HttpsProxyAgent(proxyUrl) : undefined;
14
16
  }
@@ -26,6 +28,18 @@ export class PrivateAccountWebSockets {
26
28
  connection.socket?.close();
27
29
  }
28
30
  }
31
+ status() {
32
+ const states = ["connecting", "open", "closing", "closed"];
33
+ return this.connections.map((connection) => ({
34
+ account: connection.account.name,
35
+ environment: connection.account.environment,
36
+ state: connection.socket ? states[connection.socket.readyState] ?? "unknown" : "not-started",
37
+ authenticated: connection.authenticated,
38
+ reconnectAttempt: connection.attempt,
39
+ lastMessageAt: connection.lastMessageAt ?? null,
40
+ lastError: connection.lastError ?? null
41
+ }));
42
+ }
29
43
  connect(connection) {
30
44
  if (connection.stopping)
31
45
  return;
@@ -34,10 +48,14 @@ export class PrivateAccountWebSockets {
34
48
  : "wss://ws.okx.com:8443/ws/v5/private";
35
49
  const socket = new WebSocket(url, this.agent ? { agent: this.agent } : undefined);
36
50
  connection.socket = socket;
51
+ connection.authenticated = false;
37
52
  socket.on("open", () => socket.send(JSON.stringify({ op: "login", args: [loginArgs(connection.account)] })));
38
53
  socket.on("message", (buffer) => this.message(connection, buffer.toString()));
39
54
  socket.on("close", () => this.reconnect(connection));
40
- socket.on("error", () => socket.close());
55
+ socket.on("error", (error) => {
56
+ connection.lastError = error.message;
57
+ socket.close();
58
+ });
41
59
  }
42
60
  reconnect(connection) {
43
61
  if (connection.stopping || connection.reconnect)
@@ -55,6 +73,7 @@ export class PrivateAccountWebSockets {
55
73
  message(connection, text) {
56
74
  if (text === "pong")
57
75
  return;
76
+ connection.lastMessageAt = Date.now();
58
77
  let message;
59
78
  try {
60
79
  message = JSON.parse(text);
@@ -64,6 +83,8 @@ export class PrivateAccountWebSockets {
64
83
  }
65
84
  if (message.event === "login" && message.code === "0") {
66
85
  connection.attempt = 0;
86
+ connection.authenticated = true;
87
+ connection.lastError = undefined;
67
88
  connection.socket?.send(JSON.stringify({
68
89
  op: "subscribe",
69
90
  args: [
@@ -80,6 +101,10 @@ export class PrivateAccountWebSockets {
80
101
  connection.heartbeat.unref();
81
102
  return;
82
103
  }
104
+ if (message.event === "login" && message.code !== "0") {
105
+ connection.authenticated = false;
106
+ connection.lastError = String(message.msg ?? `Login failed with code ${String(message.code ?? "unknown")}`);
107
+ }
83
108
  const arg = message.arg;
84
109
  const data = Array.isArray(message.data) ? message.data : [];
85
110
  if (!arg?.channel || !data.length)
@@ -1 +1 @@
1
- {"version":3,"file":"private-websocket.js","sourceRoot":"","sources":["../../src/account/private-websocket.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"private-websocket.js","sourceRoot":"","sources":["../../src/account/private-websocket.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export type DoctorStatus = "pass" | "warn" | "fail";
2
+ export interface DoctorCheck {
3
+ name: string;
4
+ status: DoctorStatus;
5
+ details: string;
6
+ }
7
+ export interface DoctorReport {
8
+ ok: boolean;
9
+ version: string;
10
+ checkedAt: number;
11
+ checks: DoctorCheck[];
12
+ }
13
+ export declare function runDoctor(): Promise<DoctorReport>;
14
+ export declare function formatDoctor(reportValue: DoctorReport): string;