jcc_hyper_tool 0.1.4 → 0.1.5
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 +43 -12
- package/dist/advisor/actionRunner.d.ts +29 -0
- package/dist/advisor/actionRunner.d.ts.map +1 -0
- package/dist/advisor/actionRunner.js +163 -0
- package/dist/advisor/actionRunner.js.map +1 -0
- package/dist/advisor/actionSchema.d.ts +417 -0
- package/dist/advisor/actionSchema.d.ts.map +1 -0
- package/dist/advisor/actionSchema.js +90 -0
- package/dist/advisor/actionSchema.js.map +1 -0
- package/dist/advisor/adviseEngine.d.ts +43 -0
- package/dist/advisor/adviseEngine.d.ts.map +1 -0
- package/dist/advisor/adviseEngine.js +91 -0
- package/dist/advisor/adviseEngine.js.map +1 -0
- package/dist/advisor/contextBuilder.d.ts +34 -0
- package/dist/advisor/contextBuilder.d.ts.map +1 -0
- package/dist/advisor/contextBuilder.js +134 -0
- package/dist/advisor/contextBuilder.js.map +1 -0
- package/dist/advisor/deepseekClient.d.ts +26 -0
- package/dist/advisor/deepseekClient.d.ts.map +1 -0
- package/dist/advisor/deepseekClient.js +96 -0
- package/dist/advisor/deepseekClient.js.map +1 -0
- package/dist/advisor/guards.d.ts +17 -0
- package/dist/advisor/guards.d.ts.map +1 -0
- package/dist/advisor/guards.js +71 -0
- package/dist/advisor/guards.js.map +1 -0
- package/dist/advisor/promptTemplate.d.ts +5 -0
- package/dist/advisor/promptTemplate.d.ts.map +1 -0
- package/dist/advisor/promptTemplate.js +78 -0
- package/dist/advisor/promptTemplate.js.map +1 -0
- package/dist/advisor/sessionLog.d.ts +41 -0
- package/dist/advisor/sessionLog.d.ts.map +1 -0
- package/dist/advisor/sessionLog.js +7 -0
- package/dist/advisor/sessionLog.js.map +1 -0
- package/dist/cli/advisorCli.d.ts +3 -0
- package/dist/cli/advisorCli.d.ts.map +1 -0
- package/dist/cli/advisorCli.js +354 -0
- package/dist/cli/advisorCli.js.map +1 -0
- package/dist/cli/index.js +4 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/strategyCli.js +1 -1
- package/dist/cli/tradingCli.d.ts.map +1 -1
- package/dist/cli/tradingCli.js +3 -1
- package/dist/cli/tradingCli.js.map +1 -1
- package/dist/core/cliBin.d.ts +8 -0
- package/dist/core/cliBin.d.ts.map +1 -0
- package/dist/core/cliBin.js +15 -0
- package/dist/core/cliBin.js.map +1 -0
- package/dist/core/errorFormat.d.ts +7 -0
- package/dist/core/errorFormat.d.ts.map +1 -0
- package/dist/core/errorFormat.js +59 -0
- package/dist/core/errorFormat.js.map +1 -0
- package/dist/core/errors.d.ts +2 -1
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +3 -1
- package/dist/core/errors.js.map +1 -1
- package/dist/core/hyperliquid/client.d.ts +3 -0
- package/dist/core/hyperliquid/client.d.ts.map +1 -1
- package/dist/core/hyperliquid/client.js +31 -21
- package/dist/core/hyperliquid/client.js.map +1 -1
- package/dist/core/hyperliquid/exchange.d.ts +3 -0
- package/dist/core/hyperliquid/exchange.d.ts.map +1 -1
- package/dist/core/hyperliquid/exchange.js +31 -21
- package/dist/core/hyperliquid/exchange.js.map +1 -1
- package/dist/core/hyperliquid/exchangeParse.d.ts +3 -0
- package/dist/core/hyperliquid/exchangeParse.d.ts.map +1 -1
- package/dist/core/hyperliquid/exchangeParse.js +62 -0
- package/dist/core/hyperliquid/exchangeParse.js.map +1 -1
- package/dist/core/hyperliquid/httpRequest.d.ts +36 -0
- package/dist/core/hyperliquid/httpRequest.d.ts.map +1 -0
- package/dist/core/hyperliquid/httpRequest.js +171 -0
- package/dist/core/hyperliquid/httpRequest.js.map +1 -0
- package/dist/core/state/gcTradeState.js +1 -1
- package/dist/core/state/gcTradeState.js.map +1 -1
- package/dist/core/state/profileStore.d.ts +6 -0
- package/dist/core/state/profileStore.d.ts.map +1 -0
- package/dist/core/state/profileStore.js +30 -0
- package/dist/core/state/profileStore.js.map +1 -0
- package/dist/core/state/runReconcile.d.ts.map +1 -1
- package/dist/core/state/runReconcile.js +40 -13
- package/dist/core/state/runReconcile.js.map +1 -1
- package/dist/core/state/schema.d.ts +188 -118
- package/dist/core/state/schema.d.ts.map +1 -1
- package/dist/core/state/schema.js +11 -0
- package/dist/core/state/schema.js.map +1 -1
- package/dist/core/state/statePaths.d.ts +1 -0
- package/dist/core/state/statePaths.d.ts.map +1 -1
- package/dist/core/state/statePaths.js +4 -0
- package/dist/core/state/statePaths.js.map +1 -1
- package/dist/core/state/store.js +1 -1
- package/dist/core/state/store.js.map +1 -1
- package/dist/daemon/index.js +3 -3
- package/dist/daemon/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,10 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
面向 Hyperliquid 永续合约的命令行工具:
|
|
4
4
|
|
|
5
|
-
-
|
|
6
|
-
-
|
|
7
|
-
-
|
|
8
|
-
-
|
|
5
|
+
- **只读 `/info` 查询**:配置、行情、盘口、K 线、持仓、挂单、成交等
|
|
6
|
+
- **签名 `/exchange`**:限价 / 触发单 / bracket 等下单与撤单,以及 HTTP 轮询 **`watch orders`**
|
|
7
|
+
- **网格策略(`strategy grid`)**:在价格区间内批量铺限价
|
|
8
|
+
- **本地 JSON 状态**(默认 **`~/.jcc_hyper_tool/trade-state.json`**;根或子命令 **`--state-file`** 可改路径;根 **`--no-state`** 可关闭挂单类命令的读写):**`state reconcile`** / **`state cancel-open`**,跟踪 bracket / grid 意图,并在入场视为成交后再推进 TP/SL
|
|
9
|
+
- **LLM 顾问(`advise`)**:DeepSeek 推理接口 + K 线与持仓上下文 → 结构化动作(`wait` / `open_with_bracket` / `close_position` / `cancel_all`);默认 **dry-run**,真下单时经子命令既有 **`YES`** / **`--assume-yes`** 流程;用户偏好写入同文件 **`userProfile`**(**`advisor profile`**)
|
|
9
10
|
|
|
10
11
|
私钥**仅**通过**环境变量**提供,请勿写入仓库或配置文件;变量名、何时必填与安全注意见 **[环境变量](#环境变量)**。
|
|
11
12
|
|
|
@@ -67,6 +68,8 @@ npm run lint
|
|
|
67
68
|
| -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
68
69
|
| `JCC_HYPER_NETWORK` | 全局 **`--network`** 的默认值:`mainnet` 或 `testnet`。不传 CLI 且未设置时 **默认为 `mainnet`**。与 **[测试网](#测试网)** 行为一致。 |
|
|
69
70
|
| `JCC_HYPER_API_URL` 或 `HYPERLIQUID_API_URL` | 可选:覆盖 **`/info` / `/exchange` 所用 HTTP 源**(仅 **`https://` 或 `http://` 的 origin**,误写 `.../info` 会被规范成 origin)。同全局 **`--api-url`**。 |
|
|
71
|
+
| `DEEPSEEK_API_KEY` | **`advise`** 必填:DeepSeek OpenAI 兼容 **`/v1/chat/completions`**。勿提交到仓库。 |
|
|
72
|
+
| `DEEPSEEK_MODEL` | 可选:覆盖默认模型 ID(默认 **`deepseek-v4-pro`**;若 DeepSeek 调整命名可改此项)。 |
|
|
70
73
|
|
|
71
74
|
### 钱包私钥(签名 / `--live`)
|
|
72
75
|
|
|
@@ -90,6 +93,7 @@ npm run lint
|
|
|
90
93
|
| `HYPERLIQUID_ADDRESS` / `JCC_HYPER_WALLET_ADDRESS` | 可选账户地址;只读查询或与私钥交叉校验 |
|
|
91
94
|
| `JCC_HYPER_NETWORK` | 默认 `mainnet` \| `testnet` |
|
|
92
95
|
| `JCC_HYPER_API_URL` / `HYPERLIQUID_API_URL` | 可选 API origin,同 **`--api-url`** |
|
|
96
|
+
| `DEEPSEEK_API_KEY` / `DEEPSEEK_MODEL` | **`advise`**:API 密钥;可选模型覆盖 |
|
|
93
97
|
|
|
94
98
|
### 示例(勿照抄私钥值)
|
|
95
99
|
|
|
@@ -115,7 +119,7 @@ Hyperliquid 提供 **[测试网 / 预览环境](https://hyperliquid.gitbook.io/h
|
|
|
115
119
|
|
|
116
120
|
全局选项:`--network mainnet|testnet`、`--api-url <origin>`、`-v` / `--verbose`、**`--state-file <path>`**(覆盖默认 **`~/.jcc_hyper_tool/trade-state.json`**)、**`--no-state`**(本次调用中 **`order place` / `order tpsl` / `strategy grid`** 不写、不读 trade state;与 **`state …`** 子命令同用会报错)。
|
|
117
121
|
|
|
118
|
-
###
|
|
122
|
+
### 只读查询
|
|
119
123
|
|
|
120
124
|
- `config print`、`wallet address`
|
|
121
125
|
- `perp meta`、`perp mid <coin>`、`perp book <coin>`、**`perp kline <coin>`**(K 线 / OHLCV,见下)
|
|
@@ -168,17 +172,17 @@ jcc_hyper_tool perp kline xyz:CL --interval 1h
|
|
|
168
172
|
|
|
169
173
|
HIP-3 合约名称形如 `deployer:ASSET`(例如 `xyz:CL`)。调用 `/info` 的 `allMids` 时需要正确的 **`dex`**(部署方);本 CLI 在 `perp mid` 中会从 `coin` 里 `:` 前缀推断(也可用 **`--dex`** 覆盖)。**REST 里的 `coin` 字符串可能与网页 URL 路径不一致** — 若接口返回 `null` 或异常,请用 `perp meta --dex xyz` 核对 `universe[].name`(例如 WTI 类原油在 API 快照里常为 `xyz:CL`,而非路径里的 `xyz:WTIOIL`)。
|
|
170
174
|
|
|
171
|
-
###
|
|
175
|
+
### 交易
|
|
172
176
|
|
|
173
177
|
官方 HTTP 接口说明见 [Exchange endpoint](https://hyperliquid.gitbook.io/hyperliquid-docs/for-developers/api/exchange-endpoint)。签名遵循 Python SDK 的 `action_hash` + phantom **EIP-712** `Agent`(链 ID `1337`,域名为 `Exchange`)。
|
|
174
178
|
|
|
175
179
|
- **`jcc_hyper_tool order place`** — 构造**限价单** wire;默认输出 **dry-run** JSON(无需私钥、不访问交易所)。
|
|
176
180
|
- **`--live`** — 签名并 `POST /exchange`(需要私钥)。提交前须在终端输入 **`YES`**,除非使用 **`--assume-yes`**。
|
|
177
|
-
- **`--state-file <path>`**(可选)— 覆盖根默认路径;在未使用根 **`--no-state`** 时,会在本地写入 / 更新 **`single_limit`** 意图(详见 **
|
|
181
|
+
- **`--state-file <path>`**(可选)— 覆盖根默认路径;在未使用根 **`--no-state`** 时,会在本地写入 / 更新 **`single_limit`** 意图(详见 **[本地状态与对账](#本地状态与对账)**)。
|
|
178
182
|
- 示例:
|
|
179
183
|
`jcc_hyper_tool order place --coin ETH --side buy --limit-px 2000 --sz 0.01 --tif Gtc`
|
|
180
184
|
|
|
181
|
-
- **`jcc_hyper_tool order tpsl`** — **触发类**止盈 / 止损(`--tpsl tp|sl`,wire 为 `t.trigger`)。必填:`--coin`、`--side`、`--sz`、`--trigger-px`、`--tpsl`。二选一:**`--is-market`**(触发后按市价成交)或 **`--limit-px`**(触发后限价),不可同时使用。默认 **仅减仓(reduce-only)**;**`--no-reduce-only`** 允许加仓(与 **`--grouping positionTpsl`** 互斥)。可选 **`--grouping na|normalTpsl|positionTpsl`**(默认 **`na`**);**`positionTpsl`** 下 **`--sz 0`** 表示按仓位全量 TP/SL。另有:`--cloid`、**`--dex`**(HIP-3;省略时从 `--coin` 的 `deployer:` 前缀推断,与 `order place` 一致)、**`--live`**、**`--assume-yes`**、**`--state-file`**(写入 **`standalone_tpsl`**,见
|
|
185
|
+
- **`jcc_hyper_tool order tpsl`** — **触发类**止盈 / 止损(`--tpsl tp|sl`,wire 为 `t.trigger`)。必填:`--coin`、`--side`、`--sz`、`--trigger-px`、`--tpsl`。二选一:**`--is-market`**(触发后按市价成交)或 **`--limit-px`**(触发后限价),不可同时使用。默认 **仅减仓(reduce-only)**;**`--no-reduce-only`** 允许加仓(与 **`--grouping positionTpsl`** 互斥)。可选 **`--grouping na|normalTpsl|positionTpsl`**(默认 **`na`**);**`positionTpsl`** 下 **`--sz 0`** 表示按仓位全量 TP/SL。另有:`--cloid`、**`--dex`**(HIP-3;省略时从 `--coin` 的 `deployer:` 前缀推断,与 `order place` 一致)、**`--live`**、**`--assume-yes`**、**`--state-file`**(写入 **`standalone_tpsl`**,见 **[本地状态与对账](#本地状态与对账)**)。默认 dry-run;**`--live`** 行为类似 `order place`(除非 **`--assume-yes`** 否则需输入 **`YES`**)。**风险**:务必先 dry-run;**`--live`** 请仅在测试网 + 一次性密钥上初次验证。
|
|
182
186
|
- 测试网 dry-run(触发后市价):
|
|
183
187
|
`jcc_hyper_tool --network testnet order tpsl --coin BTC --side sell --sz 0.001 --trigger-px 95000 --tpsl sl --is-market`
|
|
184
188
|
- 测试网 dry-run(整仓 TP/SL,`sz=0`,`positionTpsl`):
|
|
@@ -190,7 +194,7 @@ HIP-3 合约名称形如 `deployer:ASSET`(例如 `xyz:CL`)。调用 `/info`
|
|
|
190
194
|
|
|
191
195
|
- **`jcc_hyper_tool watch orders`** — 轮询合并后的 `openOrders`(默认 perp + 各 builder dex),在 oid 集合或 payload 变化时打印 JSON 行。选项:`--poll-ms`、`--coin`、`--full`。
|
|
192
196
|
|
|
193
|
-
###
|
|
197
|
+
### 策略
|
|
194
198
|
|
|
195
199
|
**`jcc_hyper_tool strategy grid`** — 在 **`--lower`** 与 **`--upper`** 之间按 **`--grids`** 档均匀铺限价,每档 **`--order-sz`**。默认输出 **dry-run** JSON(含解析后的 `prices` 与 `action`)。**`--live`** 时签名并 POST `/exchange`,与 `order place` 类似(需私钥;除非 **`--assume-yes`** 否则输入 **`YES`**)。
|
|
196
200
|
|
|
@@ -206,11 +210,38 @@ Dry-run 示例:
|
|
|
206
210
|
|
|
207
211
|
- **`--state-file <path>`**(可选)— 覆盖根默认;未使用 **`--no-state`** 时写入网格意图;配合 **`--live`** 时尝试从响应解析 **oid** 写回各 **leg**,便于 **`state reconcile`**。
|
|
208
212
|
|
|
213
|
+
### LLM 顾问(`advise`)
|
|
214
|
+
|
|
215
|
+
使用 **DeepSeek** OpenAI 兼容接口(环境变量 **`DEEPSEEK_API_KEY`**,可选 **`DEEPSEEK_MODEL`**,默认模型 **`deepseek-v4-pro`**)。拉取当前 **`coin`** 的 **5m / 1h / 1d** K 线与 **clearinghouse 持仓**,拼成结构化上下文;模型只允许输出 **JSON** 动作(经 Zod 校验,失败会自动重试最多 2 次)。**`--max-sz`** 为强制硬顶;价格相对 **mid** 偏离超过 profile / 默认 **3%** 的限价会被拒绝。
|
|
216
|
+
|
|
217
|
+
**动作枚举**:`wait` | `open_with_bracket` | `close_position` | `cancel_all`。执行时通过 **`spawnSync`** 调本包 **`jcc_hyper_tool`** 子命令,**继承**现有 **`--live` / `--assume-yes` / `YES`** 与 dry-run 语义。**`open_with_bracket`**、**`cancel_all`** 需要可写 **`trade-state.json`**(勿与根 **`--no-state`** 同用)。**`close_position`** 的 **market** 在实现上为 **IOC** + 相对 mid 的激进限价(近似市价减仓)。
|
|
218
|
+
|
|
219
|
+
会话留痕目录(默认 **`~/.jcc_hyper_tool/advisor-log/<uuid>.json`**)包含 **`reasoning_content`**(仅落盘;按 DeepSeek 要求**不会**回传到下一轮的 `messages`)。
|
|
220
|
+
|
|
221
|
+
```bash
|
|
222
|
+
export DEEPSEEK_API_KEY='sk-…'
|
|
223
|
+
# 交互 REPL(默认):模型回合后输入自然语言 / show / execute / quit
|
|
224
|
+
jcc_hyper_tool advise --coin BTC --max-sz 0.002
|
|
225
|
+
|
|
226
|
+
# 单轮
|
|
227
|
+
jcc_hyper_tool advise --coin BTC --max-sz 0.002 --note "manual note" --once
|
|
228
|
+
|
|
229
|
+
# 单轮后立刻走执行分支(仍可 dry-run,不加 --live 则子命令亦 dry-run)
|
|
230
|
+
jcc_hyper_tool advise --coin BTC --max-sz 0.002 --auto
|
|
231
|
+
|
|
232
|
+
# 用户风险偏好写入 trade-state(与 intents 并存;reconcile / cancel-open 不改此块)
|
|
233
|
+
jcc_hyper_tool advisor profile set --risk conservative --max-sz 0.005 --notes "short swing"
|
|
234
|
+
jcc_hyper_tool advisor profile show
|
|
235
|
+
jcc_hyper_tool advisor profile clear
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
K 线条数默认 **48 / 48 / 30**,可用 **`--bars5m` / `--bars1h` / `--bars1d`** 覆盖。
|
|
239
|
+
|
|
209
240
|
---
|
|
210
241
|
|
|
211
242
|
## 实战:单边 / 双边网格、定时补单、一键撤销
|
|
212
243
|
|
|
213
|
-
|
|
244
|
+
(默认 state 路径与 **`state cancel-open`** 等行为与下文 **[本地状态与对账](#本地状态与对账)** 一致。)
|
|
214
245
|
|
|
215
246
|
本 CLI **不会替你自动「成交后在对侧按价差补单」**;典型做法是:**用脚本读行情或读 `state` + 你自己的步长公式**,算出新的区间后再调一次 **`strategy grid --live`**。下面用 **`ST`** 表示你的 `coin`;**`/path/to/state.json`** 在示例里显式写出,若你使用默认 state 文件,可省略所有 **`--state-file`**(见上文全局选项)。
|
|
216
247
|
|
|
@@ -305,9 +336,9 @@ jcc_hyper_tool state cancel-open --state-file ./trade-state.json --intent <意
|
|
|
305
336
|
|
|
306
337
|
---
|
|
307
338
|
|
|
308
|
-
##
|
|
339
|
+
## 本地状态与对账
|
|
309
340
|
|
|
310
|
-
**默认**使用 **`~/.jcc_hyper_tool/trade-state.json`**;根 **`--state-file`** 或各子命令 **`--state-file`** 可覆盖。**`--no-state`** 时 **`order place` / `order tpsl` / `strategy grid`** 不写 state;**`order bracket`** 与 **`state`** 子命令不可用 **`--no-state
|
|
341
|
+
**默认**使用 **`~/.jcc_hyper_tool/trade-state.json`**;根 **`--state-file`** 或各子命令 **`--state-file`** 可覆盖。**`--no-state`** 时 **`order place` / `order tpsl` / `strategy grid`** 不写 state;**`order bracket`** 与 **`state`** 子命令不可用 **`--no-state`**。工具在本地 JSON 中保存各**意图**及其推进情况,面向**任务可读**的追踪,而不是 HL 原始 payload 的完整镜像。
|
|
311
342
|
|
|
312
343
|
### 状态文件结构
|
|
313
344
|
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { AdvisorAction } from "./actionSchema.js";
|
|
2
|
+
export type GlobalCliPrefixedArgs = {
|
|
3
|
+
network?: string;
|
|
4
|
+
apiUrl?: string;
|
|
5
|
+
stateFile?: string;
|
|
6
|
+
noState?: boolean;
|
|
7
|
+
};
|
|
8
|
+
export declare function buildGlobalPrefix(opts: GlobalCliPrefixedArgs): string[];
|
|
9
|
+
/** Aggressive IOC-style limit (best-effort) to unwind quickly. */
|
|
10
|
+
export declare function aggressiveCloseLimitPx(side: "buy" | "sell", mid: number): number;
|
|
11
|
+
export declare function assertAdviseActionNeedsState(action: AdvisorAction, noState: boolean, stateFile: string | undefined): void;
|
|
12
|
+
export declare function advisorActionToCliArgs(action: AdvisorAction, params: {
|
|
13
|
+
coin: string;
|
|
14
|
+
mid: number | null;
|
|
15
|
+
positionSignedSz: number | undefined;
|
|
16
|
+
globals: string[];
|
|
17
|
+
live: boolean;
|
|
18
|
+
assumeYes: boolean;
|
|
19
|
+
}): string[];
|
|
20
|
+
export declare function formatCliInvocation(args: string[]): string;
|
|
21
|
+
export type SpawnCapture = {
|
|
22
|
+
status: number | null;
|
|
23
|
+
stdout: string;
|
|
24
|
+
stderr: string;
|
|
25
|
+
};
|
|
26
|
+
export declare function spawnJccHyperTool(args: string[], opts?: {
|
|
27
|
+
stdio?: "inherit" | "pipe";
|
|
28
|
+
}): SpawnCapture;
|
|
29
|
+
//# sourceMappingURL=actionRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actionRunner.d.ts","sourceRoot":"","sources":["../../src/advisor/actionRunner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,MAAM,MAAM,qBAAqB,GAAG;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,MAAM,EAAE,CAcvE;AAED,kEAAkE;AAClE,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,KAAK,GAAG,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAKhF;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,aAAa,EACrB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,MAAM,GAAG,SAAS,GAC5B,IAAI,CASN;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,aAAa,EACrB,MAAM,EAAE;IACN,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;CACpB,GACA,MAAM,EAAE,CAkGV;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAS1D;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,SAAS,GAAG,MAAM,CAAA;CAAE,GACpC,YAAY,CAmBd"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { ConfigError } from "../core/errors.js";
|
|
2
|
+
import { inferHlDexFromPrefixedPerpCoin } from "../core/hyperliquid/prefixedPerpCoin.js";
|
|
3
|
+
import { resolveJccHyperToolSpawn } from "../core/cliBin.js";
|
|
4
|
+
import { spawnSync } from "node:child_process";
|
|
5
|
+
export function buildGlobalPrefix(opts) {
|
|
6
|
+
const out = [];
|
|
7
|
+
if (opts.network) {
|
|
8
|
+
out.push("--network", opts.network);
|
|
9
|
+
}
|
|
10
|
+
if (opts.apiUrl) {
|
|
11
|
+
out.push("--api-url", opts.apiUrl);
|
|
12
|
+
}
|
|
13
|
+
if (opts.noState) {
|
|
14
|
+
out.push("--no-state");
|
|
15
|
+
}
|
|
16
|
+
else if (opts.stateFile) {
|
|
17
|
+
out.push("--state-file", opts.stateFile);
|
|
18
|
+
}
|
|
19
|
+
return out;
|
|
20
|
+
}
|
|
21
|
+
/** Aggressive IOC-style limit (best-effort) to unwind quickly. */
|
|
22
|
+
export function aggressiveCloseLimitPx(side, mid) {
|
|
23
|
+
if (side === "sell") {
|
|
24
|
+
return mid * 0.92;
|
|
25
|
+
}
|
|
26
|
+
return mid * 1.08;
|
|
27
|
+
}
|
|
28
|
+
export function assertAdviseActionNeedsState(action, noState, stateFile) {
|
|
29
|
+
if (action.action !== "open_with_bracket" && action.action !== "cancel_all") {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (noState || !stateFile) {
|
|
33
|
+
throw new ConfigError(`advise: action "${action.action}" requires a writable trade state path (do not use --no-state; pass --state-file if needed).`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
export function advisorActionToCliArgs(action, params) {
|
|
37
|
+
const g = [...params.globals];
|
|
38
|
+
const dex = inferHlDexFromPrefixedPerpCoin(params.coin);
|
|
39
|
+
if (action.action === "open_with_bracket") {
|
|
40
|
+
const args = [
|
|
41
|
+
...g,
|
|
42
|
+
"order",
|
|
43
|
+
"bracket",
|
|
44
|
+
"--coin",
|
|
45
|
+
params.coin,
|
|
46
|
+
"--side",
|
|
47
|
+
action.side,
|
|
48
|
+
"--limit-px",
|
|
49
|
+
String(action.limit_px),
|
|
50
|
+
"--sz",
|
|
51
|
+
String(action.sz),
|
|
52
|
+
"--tp",
|
|
53
|
+
String(action.tp_px),
|
|
54
|
+
"--sl",
|
|
55
|
+
String(action.sl_px),
|
|
56
|
+
];
|
|
57
|
+
if (dex) {
|
|
58
|
+
args.push("--dex", dex);
|
|
59
|
+
}
|
|
60
|
+
if (action.is_market) {
|
|
61
|
+
args.push("--is-market");
|
|
62
|
+
}
|
|
63
|
+
else if (action.protection_limit_px !== undefined) {
|
|
64
|
+
args.push("--protection-limit-px", String(action.protection_limit_px));
|
|
65
|
+
}
|
|
66
|
+
if (params.live) {
|
|
67
|
+
args.push("--live");
|
|
68
|
+
}
|
|
69
|
+
if (params.assumeYes) {
|
|
70
|
+
args.push("--assume-yes");
|
|
71
|
+
}
|
|
72
|
+
return args;
|
|
73
|
+
}
|
|
74
|
+
if (action.action === "close_position") {
|
|
75
|
+
const pos = params.positionSignedSz;
|
|
76
|
+
if (pos === undefined || !Number.isFinite(pos) || pos === 0) {
|
|
77
|
+
throw new ConfigError("close_position: no open position for this coin.");
|
|
78
|
+
}
|
|
79
|
+
const closeSide = pos > 0 ? "sell" : "buy";
|
|
80
|
+
const sz = Math.abs(pos);
|
|
81
|
+
let limitPx;
|
|
82
|
+
if (action.method === "market") {
|
|
83
|
+
if (params.mid === null || params.mid <= 0) {
|
|
84
|
+
throw new ConfigError("close_position: market close needs mid price.");
|
|
85
|
+
}
|
|
86
|
+
limitPx = aggressiveCloseLimitPx(closeSide, params.mid);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
if (action.limit_px === undefined || !Number.isFinite(action.limit_px)) {
|
|
90
|
+
throw new ConfigError("close_position: limit method needs limit_px.");
|
|
91
|
+
}
|
|
92
|
+
limitPx = action.limit_px;
|
|
93
|
+
}
|
|
94
|
+
const args = [
|
|
95
|
+
...g,
|
|
96
|
+
"order",
|
|
97
|
+
"place",
|
|
98
|
+
"--coin",
|
|
99
|
+
params.coin,
|
|
100
|
+
"--side",
|
|
101
|
+
closeSide,
|
|
102
|
+
"--limit-px",
|
|
103
|
+
String(limitPx),
|
|
104
|
+
"--sz",
|
|
105
|
+
String(sz),
|
|
106
|
+
"--tif",
|
|
107
|
+
action.method === "market" ? "Ioc" : "Gtc",
|
|
108
|
+
"--reduce-only",
|
|
109
|
+
];
|
|
110
|
+
if (dex) {
|
|
111
|
+
args.push("--dex", dex);
|
|
112
|
+
}
|
|
113
|
+
if (params.live) {
|
|
114
|
+
args.push("--live");
|
|
115
|
+
}
|
|
116
|
+
if (params.assumeYes) {
|
|
117
|
+
args.push("--assume-yes");
|
|
118
|
+
}
|
|
119
|
+
return args;
|
|
120
|
+
}
|
|
121
|
+
if (action.action === "cancel_all") {
|
|
122
|
+
const args = [...g, "state", "cancel-open"];
|
|
123
|
+
if (params.live) {
|
|
124
|
+
args.push("--live");
|
|
125
|
+
}
|
|
126
|
+
if (params.assumeYes) {
|
|
127
|
+
args.push("--assume-yes");
|
|
128
|
+
}
|
|
129
|
+
return args;
|
|
130
|
+
}
|
|
131
|
+
return [];
|
|
132
|
+
}
|
|
133
|
+
export function formatCliInvocation(args) {
|
|
134
|
+
const { cmd, prefixArgs } = resolveJccHyperToolSpawn();
|
|
135
|
+
const all = [...prefixArgs, ...args];
|
|
136
|
+
const quote = (s) => (/\s/.test(s) ? JSON.stringify(s) : s);
|
|
137
|
+
const tail = all.map(quote).join(" ");
|
|
138
|
+
if (prefixArgs.length === 0) {
|
|
139
|
+
return `${quote(cmd)} ${tail}`;
|
|
140
|
+
}
|
|
141
|
+
return `${quote(cmd)} ${tail}`;
|
|
142
|
+
}
|
|
143
|
+
export function spawnJccHyperTool(args, opts) {
|
|
144
|
+
const { cmd, prefixArgs } = resolveJccHyperToolSpawn();
|
|
145
|
+
const mode = opts?.stdio ?? "pipe";
|
|
146
|
+
if (mode === "inherit") {
|
|
147
|
+
const r = spawnSync(cmd, [...prefixArgs, ...args], {
|
|
148
|
+
stdio: "inherit",
|
|
149
|
+
encoding: "utf-8",
|
|
150
|
+
});
|
|
151
|
+
return { status: r.status ?? 1, stdout: "", stderr: "" };
|
|
152
|
+
}
|
|
153
|
+
const r = spawnSync(cmd, [...prefixArgs, ...args], {
|
|
154
|
+
encoding: "utf-8",
|
|
155
|
+
maxBuffer: 20 * 1024 * 1024,
|
|
156
|
+
});
|
|
157
|
+
return {
|
|
158
|
+
status: r.status,
|
|
159
|
+
stdout: r.stdout ?? "",
|
|
160
|
+
stderr: r.stderr ?? "",
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=actionRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actionRunner.js","sourceRoot":"","sources":["../../src/advisor/actionRunner.ts"],"names":[],"mappings":"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"}
|