jcc_hyper_tool 0.1.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 (163) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +394 -0
  3. package/dist/cli/confirm.d.ts +2 -0
  4. package/dist/cli/confirm.d.ts.map +1 -0
  5. package/dist/cli/confirm.js +22 -0
  6. package/dist/cli/confirm.js.map +1 -0
  7. package/dist/cli/index.d.ts +3 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +189 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/cli/perpKline.d.ts +19 -0
  12. package/dist/cli/perpKline.d.ts.map +1 -0
  13. package/dist/cli/perpKline.js +39 -0
  14. package/dist/cli/perpKline.js.map +1 -0
  15. package/dist/cli/stateCli.d.ts +3 -0
  16. package/dist/cli/stateCli.d.ts.map +1 -0
  17. package/dist/cli/stateCli.js +158 -0
  18. package/dist/cli/stateCli.js.map +1 -0
  19. package/dist/cli/strategyCli.d.ts +3 -0
  20. package/dist/cli/strategyCli.d.ts.map +1 -0
  21. package/dist/cli/strategyCli.js +198 -0
  22. package/dist/cli/strategyCli.js.map +1 -0
  23. package/dist/cli/tradingCli.d.ts +3 -0
  24. package/dist/cli/tradingCli.d.ts.map +1 -0
  25. package/dist/cli/tradingCli.js +587 -0
  26. package/dist/cli/tradingCli.js.map +1 -0
  27. package/dist/cli/util.d.ts +28 -0
  28. package/dist/cli/util.d.ts.map +1 -0
  29. package/dist/cli/util.js +62 -0
  30. package/dist/cli/util.js.map +1 -0
  31. package/dist/core/config.d.ts +32 -0
  32. package/dist/core/config.d.ts.map +1 -0
  33. package/dist/core/config.js +101 -0
  34. package/dist/core/config.js.map +1 -0
  35. package/dist/core/errors.d.ts +9 -0
  36. package/dist/core/errors.d.ts.map +1 -0
  37. package/dist/core/errors.js +17 -0
  38. package/dist/core/errors.js.map +1 -0
  39. package/dist/core/hyperliquid/asset.d.ts +24 -0
  40. package/dist/core/hyperliquid/asset.d.ts.map +1 -0
  41. package/dist/core/hyperliquid/asset.js +88 -0
  42. package/dist/core/hyperliquid/asset.js.map +1 -0
  43. package/dist/core/hyperliquid/candles.d.ts +24 -0
  44. package/dist/core/hyperliquid/candles.d.ts.map +1 -0
  45. package/dist/core/hyperliquid/candles.js +113 -0
  46. package/dist/core/hyperliquid/candles.js.map +1 -0
  47. package/dist/core/hyperliquid/client.d.ts +36 -0
  48. package/dist/core/hyperliquid/client.d.ts.map +1 -0
  49. package/dist/core/hyperliquid/client.js +92 -0
  50. package/dist/core/hyperliquid/client.js.map +1 -0
  51. package/dist/core/hyperliquid/exchange.d.ts +14 -0
  52. package/dist/core/hyperliquid/exchange.d.ts.map +1 -0
  53. package/dist/core/hyperliquid/exchange.js +42 -0
  54. package/dist/core/hyperliquid/exchange.js.map +1 -0
  55. package/dist/core/hyperliquid/exchangeParse.d.ts +7 -0
  56. package/dist/core/hyperliquid/exchangeParse.d.ts.map +1 -0
  57. package/dist/core/hyperliquid/exchangeParse.js +44 -0
  58. package/dist/core/hyperliquid/exchangeParse.js.map +1 -0
  59. package/dist/core/hyperliquid/float.d.ts +6 -0
  60. package/dist/core/hyperliquid/float.d.ts.map +1 -0
  61. package/dist/core/hyperliquid/float.js +24 -0
  62. package/dist/core/hyperliquid/float.js.map +1 -0
  63. package/dist/core/hyperliquid/klineCoin.d.ts +10 -0
  64. package/dist/core/hyperliquid/klineCoin.d.ts.map +1 -0
  65. package/dist/core/hyperliquid/klineCoin.js +90 -0
  66. package/dist/core/hyperliquid/klineCoin.js.map +1 -0
  67. package/dist/core/hyperliquid/orders.d.ts +91 -0
  68. package/dist/core/hyperliquid/orders.d.ts.map +1 -0
  69. package/dist/core/hyperliquid/orders.js +116 -0
  70. package/dist/core/hyperliquid/orders.js.map +1 -0
  71. package/dist/core/hyperliquid/prefixedPerpCoin.d.ts +3 -0
  72. package/dist/core/hyperliquid/prefixedPerpCoin.d.ts.map +1 -0
  73. package/dist/core/hyperliquid/prefixedPerpCoin.js +10 -0
  74. package/dist/core/hyperliquid/prefixedPerpCoin.js.map +1 -0
  75. package/dist/core/hyperliquid/signed-exchange.d.ts +10 -0
  76. package/dist/core/hyperliquid/signed-exchange.d.ts.map +1 -0
  77. package/dist/core/hyperliquid/signed-exchange.js +23 -0
  78. package/dist/core/hyperliquid/signed-exchange.js.map +1 -0
  79. package/dist/core/hyperliquid/signing.d.ts +23 -0
  80. package/dist/core/hyperliquid/signing.d.ts.map +1 -0
  81. package/dist/core/hyperliquid/signing.js +65 -0
  82. package/dist/core/hyperliquid/signing.js.map +1 -0
  83. package/dist/core/hyperliquid/types.d.ts +11 -0
  84. package/dist/core/hyperliquid/types.d.ts.map +1 -0
  85. package/dist/core/hyperliquid/types.js +2 -0
  86. package/dist/core/hyperliquid/types.js.map +1 -0
  87. package/dist/core/hyperliquid/watchOrders.d.ts +10 -0
  88. package/dist/core/hyperliquid/watchOrders.d.ts.map +1 -0
  89. package/dist/core/hyperliquid/watchOrders.js +38 -0
  90. package/dist/core/hyperliquid/watchOrders.js.map +1 -0
  91. package/dist/core/state/bracketReconcile.d.ts +23 -0
  92. package/dist/core/state/bracketReconcile.d.ts.map +1 -0
  93. package/dist/core/state/bracketReconcile.js +297 -0
  94. package/dist/core/state/bracketReconcile.js.map +1 -0
  95. package/dist/core/state/cancelOpenPlan.d.ts +23 -0
  96. package/dist/core/state/cancelOpenPlan.d.ts.map +1 -0
  97. package/dist/core/state/cancelOpenPlan.js +126 -0
  98. package/dist/core/state/cancelOpenPlan.js.map +1 -0
  99. package/dist/core/state/gcTradeState.d.ts +13 -0
  100. package/dist/core/state/gcTradeState.d.ts.map +1 -0
  101. package/dist/core/state/gcTradeState.js +48 -0
  102. package/dist/core/state/gcTradeState.js.map +1 -0
  103. package/dist/core/state/gridReconcile.d.ts +46 -0
  104. package/dist/core/state/gridReconcile.d.ts.map +1 -0
  105. package/dist/core/state/gridReconcile.js +307 -0
  106. package/dist/core/state/gridReconcile.js.map +1 -0
  107. package/dist/core/state/intentFactory.d.ts +58 -0
  108. package/dist/core/state/intentFactory.d.ts.map +1 -0
  109. package/dist/core/state/intentFactory.js +95 -0
  110. package/dist/core/state/intentFactory.js.map +1 -0
  111. package/dist/core/state/present.d.ts +17 -0
  112. package/dist/core/state/present.d.ts.map +1 -0
  113. package/dist/core/state/present.js +100 -0
  114. package/dist/core/state/present.js.map +1 -0
  115. package/dist/core/state/runCancelOpen.d.ts +32 -0
  116. package/dist/core/state/runCancelOpen.d.ts.map +1 -0
  117. package/dist/core/state/runCancelOpen.js +101 -0
  118. package/dist/core/state/runCancelOpen.js.map +1 -0
  119. package/dist/core/state/runReconcile.d.ts +20 -0
  120. package/dist/core/state/runReconcile.d.ts.map +1 -0
  121. package/dist/core/state/runReconcile.js +248 -0
  122. package/dist/core/state/runReconcile.js.map +1 -0
  123. package/dist/core/state/schema.d.ts +1161 -0
  124. package/dist/core/state/schema.d.ts.map +1 -0
  125. package/dist/core/state/schema.js +151 -0
  126. package/dist/core/state/schema.js.map +1 -0
  127. package/dist/core/state/snapshot.d.ts +22 -0
  128. package/dist/core/state/snapshot.d.ts.map +1 -0
  129. package/dist/core/state/snapshot.js +115 -0
  130. package/dist/core/state/snapshot.js.map +1 -0
  131. package/dist/core/state/statePaths.d.ts +2 -0
  132. package/dist/core/state/statePaths.d.ts.map +1 -0
  133. package/dist/core/state/statePaths.js +7 -0
  134. package/dist/core/state/statePaths.js.map +1 -0
  135. package/dist/core/state/store.d.ts +12 -0
  136. package/dist/core/state/store.d.ts.map +1 -0
  137. package/dist/core/state/store.js +95 -0
  138. package/dist/core/state/store.js.map +1 -0
  139. package/dist/core/state/types.d.ts +40 -0
  140. package/dist/core/state/types.d.ts.map +1 -0
  141. package/dist/core/state/types.js +2 -0
  142. package/dist/core/state/types.js.map +1 -0
  143. package/dist/core/trading.d.ts +8 -0
  144. package/dist/core/trading.d.ts.map +1 -0
  145. package/dist/core/trading.js +22 -0
  146. package/dist/core/trading.js.map +1 -0
  147. package/dist/core/wallet.d.ts +3 -0
  148. package/dist/core/wallet.d.ts.map +1 -0
  149. package/dist/core/wallet.js +14 -0
  150. package/dist/core/wallet.js.map +1 -0
  151. package/dist/daemon/index.d.ts +3 -0
  152. package/dist/daemon/index.d.ts.map +1 -0
  153. package/dist/daemon/index.js +104 -0
  154. package/dist/daemon/index.js.map +1 -0
  155. package/dist/meta/version.d.ts +2 -0
  156. package/dist/meta/version.d.ts.map +1 -0
  157. package/dist/meta/version.js +12 -0
  158. package/dist/meta/version.js.map +1 -0
  159. package/dist/strategies/grid.d.ts +46 -0
  160. package/dist/strategies/grid.d.ts.map +1 -0
  161. package/dist/strategies/grid.js +101 -0
  162. package/dist/strategies/grid.js.map +1 -0
  163. package/package.json +46 -0
@@ -0,0 +1,189 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from "commander";
3
+ import { ConfigError } from "../core/errors.js";
4
+ import { VERSION } from "../meta/version.js";
5
+ import { loadEffectiveConfig, printEffectiveConfig, requireUserContext } from "../core/config.js";
6
+ import { HyperliquidInfoClient } from "../core/hyperliquid/client.js";
7
+ import { attachTradingCli } from "./tradingCli.js";
8
+ import { attachStrategyCli } from "./strategyCli.js";
9
+ import { attachStateCli } from "./stateCli.js";
10
+ import { runPerpKlineCommand } from "./perpKline.js";
11
+ import { inferHlDexFromPrefixedCoin, readGlobalOptions, printJson, logVerbose } from "./util.js";
12
+ function mainWrapped() {
13
+ main().catch((e) => {
14
+ const msg = e instanceof Error ? e.message : String(e);
15
+ process.stderr.write(`${msg}\n`);
16
+ process.exitCode = 1;
17
+ });
18
+ }
19
+ async function main() {
20
+ const program = new Command();
21
+ program.name("jcc_hyper_tool");
22
+ program.description("Hyperliquid perpetuals CLI (read-only queries + trading + strategies)");
23
+ program.version(VERSION, "-V, --version", "output the version number");
24
+ program
25
+ .option("--network <network>", "mainnet | testnet — selects HL API origin and /exchange signing (main=a, test=b); overrides JCC_HYPER_NETWORK when set", process.env.JCC_HYPER_NETWORK ?? "mainnet")
26
+ .option("--api-url <url>", "Override Hyperliquid API origin (https://host)")
27
+ .option("-v, --verbose", "verbose logging to stderr", false)
28
+ .option("--state-file <path>", "Default trade-state file (subcommand --state-file wins); env JCC_HYPER_STATE_FILE if set; else ~/.jcc_hyper_tool/trade-state.json")
29
+ .option("--no-state", "Disable reading/writing trade state for order/strategy placements (still rejected by `state` commands that manage local JSON)", false);
30
+ attachTradingCli(program);
31
+ attachStrategyCli(program);
32
+ attachStateCli(program);
33
+ program
34
+ .command("config")
35
+ .description("Configuration commands")
36
+ .addCommand(new Command("print")
37
+ .description("Print sanitized configuration (no secrets)")
38
+ .action((options, command) => {
39
+ logVerbose(command, "[config print]");
40
+ const globals = readGlobalOptions(command);
41
+ const cfg = loadEffectiveConfig({
42
+ network: globals.network,
43
+ apiUrl: globals.apiUrl,
44
+ });
45
+ process.stdout.write(`${printEffectiveConfig(cfg)}\n`);
46
+ }));
47
+ program
48
+ .command("wallet")
49
+ .description("Wallet helpers")
50
+ .addCommand(new Command("address")
51
+ .description("Print wallet address derived from env private key")
52
+ .action((_opts, command) => {
53
+ const globals = readGlobalOptions(command);
54
+ const cfg = loadEffectiveConfig({
55
+ network: globals.network,
56
+ apiUrl: globals.apiUrl,
57
+ });
58
+ if (!cfg.hasPrivateKey) {
59
+ throw new ConfigError("Missing HYPERLIQUID_PRIVATE_KEY or JCC_HYPER_WALLET_PRIVATE_KEY in the environment.");
60
+ }
61
+ if (!cfg.userAddress) {
62
+ throw new ConfigError("Unexpected: hasPrivateKey without userAddress.");
63
+ }
64
+ process.stdout.write(`${cfg.userAddress}\n`);
65
+ }));
66
+ const perp = program.command("perp").description("Perpetuals (read-only)");
67
+ perp
68
+ .command("meta")
69
+ .description("Fetch perp metadata (universe)")
70
+ .option("--dex <dex>", "Perp dex name (optional; default first perp dex)")
71
+ .action(async (opts, command) => {
72
+ const globals = readGlobalOptions(command);
73
+ const cfg = loadEffectiveConfig({ network: globals.network, apiUrl: globals.apiUrl });
74
+ const client = new HyperliquidInfoClient({ infoOrigin: cfg.infoOrigin });
75
+ logVerbose(command, `[perp meta] POST ${client.infoUrl}`);
76
+ const out = await client.meta(opts.dex);
77
+ printJson(out);
78
+ });
79
+ perp
80
+ .command("mid <coin>")
81
+ .description("Print mid price string for a coin (from allMids)")
82
+ .option("--dex <dex>", "HIP-3 perp dex for allMids (omit: infer from COIN when it looks like dex:ASSET, else default dex)")
83
+ .action(async (coin, opts, command) => {
84
+ const globals = readGlobalOptions(command);
85
+ const cfg = loadEffectiveConfig({ network: globals.network, apiUrl: globals.apiUrl });
86
+ const client = new HyperliquidInfoClient({ infoOrigin: cfg.infoOrigin });
87
+ const dex = opts.dex ?? inferHlDexFromPrefixedCoin(coin);
88
+ logVerbose(command, `[perp mid ${coin}] dex=${dex ?? "default"}`);
89
+ const mids = await client.allMids(dex);
90
+ if (typeof mids !== "object" || mids === null || Array.isArray(mids)) {
91
+ throw new ConfigError("Unexpected allMids response shape");
92
+ }
93
+ const v = mids[coin];
94
+ if (typeof v !== "string") {
95
+ throw new ConfigError(`Coin '${coin}' not found in allMids for dex '${dex ?? "default (first perp dex)"}'. ` +
96
+ `HIP-3 markets need the correct \`dex:\` (passed via --dex or inferred from COIN prefix). ` +
97
+ `If this came from the HL web app URL, the API \`coin\` may differ from the path (e.g. crude may be xyz:CL). ` +
98
+ `Cross-check with: perp meta --dex xyz`);
99
+ }
100
+ process.stdout.write(`${v}\n`);
101
+ });
102
+ perp
103
+ .command("book <coin>")
104
+ .description("Fetch L2 book snapshot (at most 20 levels per side)")
105
+ .action(async (coin, _opts, command) => {
106
+ const globals = readGlobalOptions(command);
107
+ const cfg = loadEffectiveConfig({ network: globals.network, apiUrl: globals.apiUrl });
108
+ const client = new HyperliquidInfoClient({ infoOrigin: cfg.infoOrigin });
109
+ const out = await client.l2Book(coin);
110
+ if (out === null) {
111
+ throw new ConfigError(`l2Book returned null for '${coin}'. Usually the API has no such market name — confirm the exact \`coin\` from perp meta / allMids (URLs like /trade/xyz:WTIOIL may differ from the REST \`coin\`; try e.g. \`xyz:CL\` for WTI-style crude on deployer \`xyz\`).`);
112
+ }
113
+ printJson(out);
114
+ });
115
+ perp
116
+ .command("kline <coin>")
117
+ .description("Fetch OHLCV candles (POST /info candleSnapshot; HIP-3 coin only — no separate dex field)")
118
+ .requiredOption("--interval <iv>", "Candle interval (e.g. 5m, 1h, 1d)")
119
+ .option("--dex <dex>", "When coin has no ':', prefix as dex:coin (e.g. CL --dex xyz → xyz:CL). Ignored / must match when coin is already deployer:ASSET.")
120
+ .option("--start-time <ms>", "Range start (unix ms, positive integer); omit with --end-time omitted for automatic window")
121
+ .option("--end-time <ms>", "Range end (unix ms); omit with --start-time omitted — defaults to now")
122
+ .action(async (coin, opts, command) => {
123
+ const globals = readGlobalOptions(command);
124
+ const cfg = loadEffectiveConfig({ network: globals.network, apiUrl: globals.apiUrl });
125
+ logVerbose(command, `[perp kline ${coin}] POST ${cfg.infoOrigin}/info candleSnapshot`);
126
+ const custom = (opts.startTime !== undefined && opts.startTime.trim() !== "") ||
127
+ (opts.endTime !== undefined && opts.endTime.trim() !== "");
128
+ if (!custom) {
129
+ logVerbose(command, `[perp kline ${coin}] using built-in default window for interval ${opts.interval} (--start-time/--end-time omitted)`);
130
+ }
131
+ await runPerpKlineCommand(coin, opts, cfg.infoOrigin);
132
+ });
133
+ program
134
+ .command("positions")
135
+ .description("Fetch clearinghouse/perp positions for the configured wallet")
136
+ .action(async (_opts, command) => {
137
+ const globals = readGlobalOptions(command);
138
+ const cfg = loadEffectiveConfig({ network: globals.network, apiUrl: globals.apiUrl });
139
+ const user = requireUserContext(cfg);
140
+ const client = new HyperliquidInfoClient({ infoOrigin: user.infoOrigin });
141
+ const out = await client.clearinghouseState(user.userAddress);
142
+ printJson(out);
143
+ });
144
+ const orders = program.command("orders").description("Order queries (read-only)");
145
+ orders
146
+ .command("list")
147
+ .description("List open orders for the configured wallet")
148
+ .option("--coin <coin>", "Filter to a single perp coin symbol (client-side filter)")
149
+ .action(async (opts, command) => {
150
+ const globals = readGlobalOptions(command);
151
+ const cfg = loadEffectiveConfig({ network: globals.network, apiUrl: globals.apiUrl });
152
+ const user = requireUserContext(cfg);
153
+ const client = new HyperliquidInfoClient({ infoOrigin: user.infoOrigin });
154
+ let out = await client.openOrders(user.userAddress);
155
+ if (opts.coin) {
156
+ if (!Array.isArray(out)) {
157
+ throw new ConfigError("Unexpected openOrders response shape");
158
+ }
159
+ out = out.filter((o) => {
160
+ if (typeof o !== "object" || o === null) {
161
+ return false;
162
+ }
163
+ const c = o.coin;
164
+ return c === opts.coin;
165
+ });
166
+ }
167
+ printJson(out);
168
+ });
169
+ program
170
+ .command("fills")
171
+ .description("Fetch recent perp fills for the configured wallet (<= 2000)")
172
+ .action(async (_opts, command) => {
173
+ const globals = readGlobalOptions(command);
174
+ const cfg = loadEffectiveConfig({ network: globals.network, apiUrl: globals.apiUrl });
175
+ const user = requireUserContext(cfg);
176
+ const client = new HyperliquidInfoClient({ infoOrigin: user.infoOrigin });
177
+ const out = await client.info({ type: "userFills", user: user.userAddress });
178
+ printJson(out);
179
+ });
180
+ const userArgs = process.argv.slice(2);
181
+ if (userArgs.length === 0) {
182
+ process.stdout.write(`${program.helpInformation()}`);
183
+ process.exitCode = 1;
184
+ return;
185
+ }
186
+ await program.parseAsync(process.argv);
187
+ }
188
+ mainWrapped();
189
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { FetchLike } from "../core/hyperliquid/client.js";
2
+ export type PerpKlineCliOpts = {
3
+ interval: string;
4
+ startTime?: string;
5
+ endTime?: string;
6
+ dex?: string;
7
+ };
8
+ export type PerpKlineRunDeps = {
9
+ fetchImpl?: FetchLike;
10
+ /** Override stdout writer for tests (receives JSON.stringify result + newline) */
11
+ writeLine?: (line: string) => void;
12
+ /** Fixed "now" for default windows (tests) */
13
+ nowMs?: number;
14
+ };
15
+ /**
16
+ * Fetch candles for `perp kline` (mock-friendly via `deps.fetchImpl` / `deps.writeLine`).
17
+ */
18
+ export declare function runPerpKlineCommand(coin: string, opts: PerpKlineCliOpts, infoOrigin: string, deps?: PerpKlineRunDeps): Promise<void>;
19
+ //# sourceMappingURL=perpKline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"perpKline.d.ts","sourceRoot":"","sources":["../../src/cli/perpKline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAW/D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,kFAAkF;IAClF,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,8CAA8C;IAC9C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,gBAAgB,EACtB,UAAU,EAAE,MAAM,EAClB,IAAI,CAAC,EAAE,gBAAgB,GACtB,OAAO,CAAC,IAAI,CAAC,CAsCf"}
@@ -0,0 +1,39 @@
1
+ import { HyperliquidInfoClient } from "../core/hyperliquid/client.js";
2
+ import { resolveKlineRequest } from "../core/hyperliquid/candles.js";
3
+ import { assertPerpKlineCoinInMeta, resolvePerpKlineCoinArg, } from "../core/hyperliquid/klineCoin.js";
4
+ import { inferHlDexFromPrefixedPerpCoin } from "../core/hyperliquid/prefixedPerpCoin.js";
5
+ import { printJson } from "./util.js";
6
+ /**
7
+ * Fetch candles for `perp kline` (mock-friendly via `deps.fetchImpl` / `deps.writeLine`).
8
+ */
9
+ export async function runPerpKlineCommand(coin, opts, infoOrigin, deps) {
10
+ const resolvedCoin = resolvePerpKlineCoinArg(coin, opts.dex);
11
+ const nowMs = deps?.nowMs ?? Date.now();
12
+ const { interval, startTime, endTime } = resolveKlineRequest(opts.interval, {
13
+ startTime: opts.startTime,
14
+ endTime: opts.endTime,
15
+ }, nowMs);
16
+ const client = new HyperliquidInfoClient({
17
+ infoOrigin,
18
+ fetchImpl: deps?.fetchImpl,
19
+ });
20
+ const dexForMeta = inferHlDexFromPrefixedPerpCoin(resolvedCoin);
21
+ if (dexForMeta) {
22
+ const meta = await client.meta(dexForMeta);
23
+ assertPerpKlineCoinInMeta(meta, resolvedCoin);
24
+ }
25
+ const out = await client.candleSnapshot({
26
+ coin: resolvedCoin,
27
+ interval,
28
+ startTime,
29
+ endTime,
30
+ });
31
+ const body = `${JSON.stringify(out, null, 2)}\n`;
32
+ if (deps?.writeLine) {
33
+ deps.writeLine(body);
34
+ }
35
+ else {
36
+ printJson(out);
37
+ }
38
+ }
39
+ //# sourceMappingURL=perpKline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"perpKline.js","sourceRoot":"","sources":["../../src/cli/perpKline.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EACL,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,8BAA8B,EAAE,MAAM,yCAAyC,CAAC;AAEzF,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAiBtC;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAY,EACZ,IAAsB,EACtB,UAAkB,EAClB,IAAuB;IAEvB,MAAM,YAAY,GAAG,uBAAuB,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAE7D,MAAM,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IAExC,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,mBAAmB,CAC1D,IAAI,CAAC,QAAQ,EACb;QACE,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,EACD,KAAK,CACN,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,qBAAqB,CAAC;QACvC,UAAU;QACV,SAAS,EAAE,IAAI,EAAE,SAAS;KAC3B,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,8BAA8B,CAAC,YAAY,CAAC,CAAC;IAChE,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC3C,yBAAyB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC;QACtC,IAAI,EAAE,YAAY;QAClB,QAAQ;QACR,SAAS;QACT,OAAO;KACR,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IACjD,IAAI,IAAI,EAAE,SAAS,EAAE,CAAC;QACpB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;SAAM,CAAC;QACN,SAAS,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function attachStateCli(program: Command): void;
3
+ //# sourceMappingURL=stateCli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stateCli.d.ts","sourceRoot":"","sources":["../../src/cli/stateCli.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0LrD"}
@@ -0,0 +1,158 @@
1
+ import { loadEffectiveConfig } from "../core/config.js";
2
+ import { ConfigError } from "../core/errors.js";
3
+ import { formatStateList, summarizeIntent } from "../core/state/present.js";
4
+ import { runTradeReconcile } from "../core/state/runReconcile.js";
5
+ import { runStateCancelOpen } from "../core/state/runCancelOpen.js";
6
+ import { readOrCreateTradeStateFile, writeTradeStateFileAtomic } from "../core/state/store.js";
7
+ import { requireStdinYes } from "./confirm.js";
8
+ import { printJson, readGlobalOptions, requireStateCliEnabled, resolveTradeStatePath, } from "./util.js";
9
+ function requireRecordedStatePath(cmd, label, explicit) {
10
+ requireStateCliEnabled(cmd, label);
11
+ const path = resolveTradeStatePath(cmd, explicit);
12
+ if (!path) {
13
+ throw new ConfigError(`Unexpected: ${label}: state path resolution returned empty.`);
14
+ }
15
+ return path;
16
+ }
17
+ export function attachStateCli(program) {
18
+ const state = program
19
+ .command("state")
20
+ .description("Local JSON state: intents, reconcile, human-readable views");
21
+ state
22
+ .command("reconcile")
23
+ .description("Fetch open orders + positions, advance bracket/grid state, optionally LIVE act")
24
+ .option("--state-file <path>", "Trade state JSON path (omit: root/default ~/.jcc_hyper_tool/trade-state.json)")
25
+ .option("--intent <id>", "Only reconcile a single intent id")
26
+ .option("--live", "Execute generated exchange actions (requires private key env)", false)
27
+ .option("--assume-yes", "With --live: skip interactive confirmations", false)
28
+ .action(async (opts, command) => {
29
+ const globals = readGlobalOptions(command);
30
+ const cfg = loadEffectiveConfig({
31
+ network: globals.network,
32
+ apiUrl: globals.apiUrl,
33
+ });
34
+ const statePath = requireRecordedStatePath(command, "`state reconcile`", opts.stateFile);
35
+ const mode = opts.live ? "live" : "dry";
36
+ const out = await runTradeReconcile({
37
+ statePath,
38
+ cfg,
39
+ mode,
40
+ assumeYes: Boolean(opts.assumeYes),
41
+ intentFilter: opts.intent?.trim() || undefined,
42
+ confirmLive: (prompt) => requireStdinYes(prompt),
43
+ });
44
+ printJson({
45
+ mode,
46
+ actionsExecuted: out.actionsExecuted,
47
+ dryPlan: out.dryPlan,
48
+ tasks: formatStateList(out.state).tasks,
49
+ });
50
+ });
51
+ state
52
+ .command("cancel-open")
53
+ .description("Cancel resting orders referenced by trade state that are still visible in openOrders")
54
+ .option("--state-file <path>", "Trade state JSON path (omit: root/default ~/.jcc_hyper_tool/trade-state.json)")
55
+ .option("--intent <id>", "Only cancel oids originating from one intent row")
56
+ .option("--live", "sign + POST /exchange (requires private key)", false)
57
+ .option("--assume-yes", "with --live: skip stdin YES (dangerous)", false)
58
+ .action(async (opts, command) => {
59
+ readGlobalOptions(command);
60
+ const globals = readGlobalOptions(command);
61
+ const cfg = loadEffectiveConfig({ network: globals.network, apiUrl: globals.apiUrl });
62
+ const statePath = requireRecordedStatePath(command, "`state cancel-open`", opts.stateFile);
63
+ const out = await runStateCancelOpen({
64
+ statePath,
65
+ cfg,
66
+ mode: opts.live ? "live" : "dry",
67
+ assumeYes: Boolean(opts.assumeYes),
68
+ intentFilter: opts.intent?.trim() || undefined,
69
+ confirmLive: (p) => requireStdinYes(p),
70
+ });
71
+ printJson(out);
72
+ });
73
+ state
74
+ .command("list")
75
+ .description("Task-readable summary of all intents in state file")
76
+ .option("--state-file <path>", "Trade state JSON path (omit: root/default ~/.jcc_hyper_tool/trade-state.json)")
77
+ .action(async (opts, command) => {
78
+ readGlobalOptions(command);
79
+ const statePath = requireRecordedStatePath(command, "`state list`", opts.stateFile);
80
+ const file = await readOrCreateTradeStateFile(statePath, Date.now());
81
+ printJson(formatStateList(file));
82
+ });
83
+ state
84
+ .command("show")
85
+ .description("Show one intent (structured + summary)")
86
+ .argument("<intentId>", "Intent id (uuid)")
87
+ .option("--state-file <path>", "Trade state JSON path (omit: root/default ~/.jcc_hyper_tool/trade-state.json)")
88
+ .action(async (intentId, opts, command) => {
89
+ readGlobalOptions(command);
90
+ const statePath = requireRecordedStatePath(command, "`state show`", opts.stateFile);
91
+ const file = await readOrCreateTradeStateFile(statePath, Date.now());
92
+ const row = file.intents[intentId];
93
+ if (!row) {
94
+ throw new ConfigError(`Unknown intent id: ${intentId}`);
95
+ }
96
+ printJson({
97
+ summary: summarizeIntent(row),
98
+ intent: row,
99
+ recentEvents: file.events.filter((e) => e.intentId === intentId).slice(-12),
100
+ });
101
+ });
102
+ state
103
+ .command("events")
104
+ .description("Event log for an intent (newest last unless --newest-first)")
105
+ .argument("<intentId>", "Intent id (uuid)")
106
+ .option("--state-file <path>", "Trade state JSON path (omit: root/default ~/.jcc_hyper_tool/trade-state.json)")
107
+ .option("--tail <n>", "Only last N events", "50")
108
+ .option("--newest-first", "Print newest events first", false)
109
+ .action(async (intentId, opts, command) => {
110
+ readGlobalOptions(command);
111
+ const statePath = requireRecordedStatePath(command, "`state events`", opts.stateFile);
112
+ const file = await readOrCreateTradeStateFile(statePath, Date.now());
113
+ const tail = Number(opts.tail ?? "50");
114
+ if (!Number.isFinite(tail) || tail < 1) {
115
+ throw new ConfigError("--tail must be a positive number");
116
+ }
117
+ let ev = file.events.filter((e) => e.intentId === intentId);
118
+ if (opts.newestFirst) {
119
+ ev = [...ev].reverse().slice(0, tail);
120
+ }
121
+ else if (ev.length > tail) {
122
+ ev = ev.slice(-tail);
123
+ }
124
+ printJson({
125
+ intentId,
126
+ count: ev.length,
127
+ events: ev,
128
+ });
129
+ });
130
+ state
131
+ .command("request-cancel")
132
+ .description("Mark a bracket intent for graceful entry cancel on next reconcile")
133
+ .argument("<intentId>", "Bracket intent id")
134
+ .option("--state-file <path>", "Trade state JSON path (omit: root/default ~/.jcc_hyper_tool/trade-state.json)")
135
+ .action(async (intentId, opts, command) => {
136
+ readGlobalOptions(command);
137
+ const statePath = requireRecordedStatePath(command, "`state request-cancel`", opts.stateFile);
138
+ const now = Date.now();
139
+ const cur = await readOrCreateTradeStateFile(statePath, now);
140
+ const row = cur.intents[intentId];
141
+ if (!row || row.kind !== "bracket") {
142
+ throw new ConfigError(`Bracket intent not found: ${intentId}`);
143
+ }
144
+ const nextB = { ...row, cancelRequested: true, updatedAtMs: now };
145
+ const next = {
146
+ ...cur,
147
+ updatedAtMs: now,
148
+ intents: { ...cur.intents, [intentId]: nextB },
149
+ events: [
150
+ ...cur.events,
151
+ { t: now, intentId, type: "user_cancel_request", message: "cancelRequested=true" },
152
+ ],
153
+ };
154
+ await writeTradeStateFileAtomic(statePath, next);
155
+ printJson({ ok: true, intentId, phase: nextB.phase });
156
+ });
157
+ }
158
+ //# sourceMappingURL=stateCli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stateCli.js","sourceRoot":"","sources":["../../src/cli/stateCli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function attachStrategyCli(program: Command): void;
3
+ //# sourceMappingURL=strategyCli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategyCli.d.ts","sourceRoot":"","sources":["../../src/cli/strategyCli.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8CzC,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+NxD"}