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,104 @@
1
+ #!/usr/bin/env node
2
+ import { spawn } from "node:child_process";
3
+ import { Command } from "commander";
4
+ import { dirname, join } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { VERSION } from "../meta/version.js";
7
+ function sleep(ms) {
8
+ return new Promise((resolve) => setTimeout(resolve, ms));
9
+ }
10
+ /** Split at first `--`: left = daemon flags, right = args forwarded to jcc_hyper_tool. */
11
+ function splitAtDoubleDash(argv) {
12
+ const i = argv.indexOf("--");
13
+ if (i === -1) {
14
+ return { daemonArgv: argv, childArgv: [] };
15
+ }
16
+ return { daemonArgv: argv.slice(0, i), childArgv: argv.slice(i + 1) };
17
+ }
18
+ function resolveToolInvocation(jccBin) {
19
+ if (jccBin?.trim()) {
20
+ return { file: jccBin.trim(), argsPrefix: [] };
21
+ }
22
+ const fromEnv = process.env.JCC_HYPER_TOOL_BIN?.trim();
23
+ if (fromEnv) {
24
+ return { file: fromEnv, argsPrefix: [] };
25
+ }
26
+ const here = dirname(fileURLToPath(import.meta.url));
27
+ const cliJs = join(here, "..", "cli", "index.js");
28
+ return { file: process.execPath, argsPrefix: [cliJs] };
29
+ }
30
+ function parseInterval(raw) {
31
+ const n = Number(raw);
32
+ if (!Number.isFinite(n) || n < 0) {
33
+ throw new Error("--interval must be a non-negative number");
34
+ }
35
+ return n;
36
+ }
37
+ function runChild(file, args) {
38
+ return new Promise((resolve, reject) => {
39
+ const child = spawn(file, args, { stdio: "inherit" });
40
+ child.on("error", reject);
41
+ child.on("close", (code, signal) => {
42
+ if (signal) {
43
+ resolve(1);
44
+ return;
45
+ }
46
+ resolve(code ?? 1);
47
+ });
48
+ });
49
+ }
50
+ async function main() {
51
+ const raw = process.argv.slice(2);
52
+ const { daemonArgv, childArgv } = splitAtDoubleDash(raw);
53
+ const program = new Command();
54
+ program
55
+ .name("jcc_hyper_daemon")
56
+ .description("Run jcc_hyper_tool on a loop: execute the child command, wait --interval seconds, repeat. " +
57
+ "Child arguments must follow a single `--` separator.")
58
+ .version(VERSION, "-V, --version", "output the version number")
59
+ .option("-i, --interval <seconds>", "Sleep after each child exit before the next run", (v) => parseInterval(v), 60)
60
+ .option("--once", "Run the child once and exit (no loop)", false)
61
+ .option("--jcc-bin <path>", "Executable for jcc_hyper_tool (default: env JCC_HYPER_TOOL_BIN, else current Node + bundled cli/index.js)");
62
+ try {
63
+ await program.parseAsync([...daemonArgv], { from: "user" });
64
+ }
65
+ catch (e) {
66
+ const msg = e instanceof Error ? e.message : String(e);
67
+ process.stderr.write(`${msg}\n`);
68
+ process.exitCode = 1;
69
+ return;
70
+ }
71
+ const opts = program.opts();
72
+ if (childArgv.length === 0) {
73
+ process.stderr.write("Missing child command: pass jcc_hyper_tool arguments after `--`.\n" +
74
+ "Example: jcc_hyper_daemon --interval 60 -- state reconcile --state-file ./trade-state.json\n");
75
+ process.stdout.write(program.helpInformation());
76
+ process.exitCode = 1;
77
+ return;
78
+ }
79
+ const { file, argsPrefix } = resolveToolInvocation(opts.jccBin);
80
+ const fullArgs = [...argsPrefix, ...childArgv];
81
+ const stop = () => {
82
+ process.exit(0);
83
+ };
84
+ process.once("SIGINT", stop);
85
+ process.once("SIGTERM", stop);
86
+ let again = true;
87
+ while (again) {
88
+ const code = await runChild(file, fullArgs);
89
+ if (code !== 0) {
90
+ process.stderr.write(`[jcc_hyper_daemon] child exited with code ${code}\n`);
91
+ }
92
+ if (opts.once) {
93
+ process.exitCode = code === 0 ? 0 : 1;
94
+ again = false;
95
+ continue;
96
+ }
97
+ await sleep(opts.interval * 1000);
98
+ }
99
+ }
100
+ main().catch((e) => {
101
+ process.stderr.write(`${e instanceof Error ? e.message : String(e)}\n`);
102
+ process.exit(1);
103
+ });
104
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/daemon/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,0FAA0F;AAC1F,SAAS,iBAAiB,CAAC,IAAc;IACvC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;QACb,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC;IAC7C,CAAC;IACD,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;AACxE,CAAC;AAED,SAAS,qBAAqB,CAAC,MAA0B;IACvD,IAAI,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;QACnB,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IACjD,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC;IACvD,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC;IAC3C,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IAClD,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;AACzD,CAAC;AAED,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY,EAAE,IAAc;IAC5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACtD,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC1B,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE;YACjC,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO,CAAC,CAAC,CAAC,CAAC;gBACX,OAAO;YACT,CAAC;YACD,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;QACrB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAEzD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAC9B,OAAO;SACJ,IAAI,CAAC,kBAAkB,CAAC;SACxB,WAAW,CACV,4FAA4F;QAC1F,sDAAsD,CACzD;SACA,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,2BAA2B,CAAC;SAC9D,MAAM,CACL,0BAA0B,EAC1B,iDAAiD,EACjD,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EACvB,EAAE,CACH;SACA,MAAM,CAAC,QAAQ,EAAE,uCAAuC,EAAE,KAAK,CAAC;SAChE,MAAM,CACL,kBAAkB,EAClB,2GAA2G,CAC5G,CAAC;IAEJ,IAAI,CAAC;QACH,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;QACjC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAwD,CAAC;IAElF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,oEAAoE;YAClE,8FAA8F,CACjG,CAAC;QACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,qBAAqB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,CAAC,GAAG,UAAU,EAAE,GAAG,SAAS,CAAC,CAAC;IAE/C,MAAM,IAAI,GAAG,GAAG,EAAE;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC7B,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAE9B,IAAI,KAAK,GAAG,IAAI,CAAC;IACjB,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC5C,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;YACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,6CAA6C,IAAI,IAAI,CAAC,CAAC;QAC9E,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,QAAQ,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACtC,KAAK,GAAG,KAAK,CAAC;YACd,SAAS;QACX,CAAC;QACD,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;IACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const VERSION: string;
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/meta/version.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,OAAO,QAAgB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ const __dirname = dirname(fileURLToPath(import.meta.url));
5
+ function readVersion() {
6
+ const pkgPath = join(__dirname, "..", "..", "package.json");
7
+ const raw = readFileSync(pkgPath, "utf8");
8
+ const pkg = JSON.parse(raw);
9
+ return pkg.version ?? "0.0.0";
10
+ }
11
+ export const VERSION = readVersion();
12
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/meta/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,SAAS,WAAW;IAClB,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;IACpD,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC"}
@@ -0,0 +1,46 @@
1
+ import type { TifName } from "../core/hyperliquid/orders.js";
2
+ export type GridBias = "symmetric" | "long" | "short";
3
+ /**
4
+ * Uniform prices from `lower` to `upper` inclusive (linear spacing).
5
+ * `levels` must be a positive integer (>=1).
6
+ */
7
+ export declare function linspaceInclusive(lower: number, upper: number, levels: number): number[];
8
+ /**
9
+ * Price levels for a grid. For `symmetric` bias and even `grids` (>= 2), uses the
10
+ * same step as `grids + 1` inclusive linspace but drops the midpoint so you get
11
+ * `grids/2` buy levels below mid and `grids/2` sell levels above (human-intuitive
12
+ * “no order at the center”). Other cases match uniform `linspaceInclusive`.
13
+ */
14
+ export declare function gridPriceLevels(lower: number, upper: number, grids: number, bias: GridBias): number[];
15
+ export declare function annotateGridSides(prices: number[], lower: number, upper: number, bias: GridBias): Array<{
16
+ px: number;
17
+ isBuy: boolean;
18
+ }>;
19
+ /**
20
+ * Replenish counter limit after a full fill: opposite side at **this leg's limit** (`legPx`)
21
+ * offset by `gapPx`. Anchor is the resting price in state, not VWAP — grid step (`lower`/`upper`/`grids`)
22
+ * and replenishment band (`gapPx`) stay independent (e.g. 50 rungs vs 100 replenish).
23
+ *
24
+ * - wasBuy → sell at legPx + gapPx
25
+ * - wasSell → buy at legPx - gapPx
26
+ */
27
+ export declare function gridReplenishCounterPx(params: {
28
+ legPx: number;
29
+ wasBuy: boolean;
30
+ gapPx: number;
31
+ }): {
32
+ px: number;
33
+ isBuy: boolean;
34
+ };
35
+ export declare function buildGridOrderAction(opts: {
36
+ assetIndex: number;
37
+ prices: number[];
38
+ lower: number;
39
+ upper: number;
40
+ bias: GridBias;
41
+ orderSz: number;
42
+ reduceOnly: boolean;
43
+ tif: TifName;
44
+ maxOrders?: number;
45
+ }): Record<string, unknown>;
46
+ //# sourceMappingURL=grid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../src/strategies/grid.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAG7D,MAAM,MAAM,QAAQ,GAAG,WAAW,GAAG,MAAM,GAAG,OAAO,CAAC;AAEtD;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAuBxF;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,QAAQ,GACb,MAAM,EAAE,CAOV;AAED,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EAAE,EAChB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,QAAQ,GACb,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAA;CAAE,CAAC,CAwBvC;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG;IACjG,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,OAAO,CAAC;CAChB,CAYA;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,QAAQ,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,GAAG,EAAE,OAAO,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsB1B"}
@@ -0,0 +1,101 @@
1
+ import { ConfigError } from "../core/errors.js";
2
+ import { batchLimitOrdersFromPrimitives, limitsToOrderAction } from "../core/hyperliquid/orders.js";
3
+ /**
4
+ * Uniform prices from `lower` to `upper` inclusive (linear spacing).
5
+ * `levels` must be a positive integer (>=1).
6
+ */
7
+ export function linspaceInclusive(lower, upper, levels) {
8
+ if (!(Number.isFinite(lower) && Number.isFinite(upper)) ||
9
+ levels < 1 ||
10
+ !Number.isInteger(levels)) {
11
+ throw new ConfigError("grid: invalid lower/upper/levels");
12
+ }
13
+ if (levels === 1) {
14
+ return [(lower + upper) / 2];
15
+ }
16
+ if (upper <= lower) {
17
+ throw new ConfigError("grid: --upper must be greater than --lower");
18
+ }
19
+ const out = [];
20
+ const steps = levels - 1;
21
+ for (let i = 0; i < levels; i++) {
22
+ out.push(lower + ((upper - lower) * i) / steps);
23
+ }
24
+ return out;
25
+ }
26
+ /**
27
+ * Price levels for a grid. For `symmetric` bias and even `grids` (>= 2), uses the
28
+ * same step as `grids + 1` inclusive linspace but drops the midpoint so you get
29
+ * `grids/2` buy levels below mid and `grids/2` sell levels above (human-intuitive
30
+ * “no order at the center”). Other cases match uniform `linspaceInclusive`.
31
+ */
32
+ export function gridPriceLevels(lower, upper, grids, bias) {
33
+ if (bias === "symmetric" && grids >= 2 && grids % 2 === 0) {
34
+ const withMid = linspaceInclusive(lower, upper, grids + 1);
35
+ const midIdx = grids / 2;
36
+ return withMid.filter((_, i) => i !== midIdx);
37
+ }
38
+ return linspaceInclusive(lower, upper, grids);
39
+ }
40
+ export function annotateGridSides(prices, lower, upper, bias) {
41
+ if (bias === "long") {
42
+ return prices.map((px) => ({ px, isBuy: true }));
43
+ }
44
+ if (bias === "short") {
45
+ return prices.map((px) => ({ px, isBuy: false }));
46
+ }
47
+ const mid = (lower + upper) / 2;
48
+ const span = upper - lower;
49
+ const eps = Math.max(span, Math.abs(mid)) * 1e-9;
50
+ return prices.map((px) => {
51
+ if (px < mid - eps) {
52
+ return { px, isBuy: true };
53
+ }
54
+ if (px > mid + eps) {
55
+ return { px, isBuy: false };
56
+ }
57
+ /** At midpoint: symmetric default is buy. */
58
+ return { px, isBuy: true };
59
+ });
60
+ }
61
+ /**
62
+ * Replenish counter limit after a full fill: opposite side at **this leg's limit** (`legPx`)
63
+ * offset by `gapPx`. Anchor is the resting price in state, not VWAP — grid step (`lower`/`upper`/`grids`)
64
+ * and replenishment band (`gapPx`) stay independent (e.g. 50 rungs vs 100 replenish).
65
+ *
66
+ * - wasBuy → sell at legPx + gapPx
67
+ * - wasSell → buy at legPx - gapPx
68
+ */
69
+ export function gridReplenishCounterPx(params) {
70
+ const { legPx, wasBuy, gapPx } = params;
71
+ if (!Number.isFinite(legPx) || !Number.isFinite(gapPx)) {
72
+ throw new ConfigError("grid: leg px and replenish gap must be finite");
73
+ }
74
+ if (gapPx <= 0) {
75
+ throw new ConfigError("grid: replenish gap must be positive");
76
+ }
77
+ if (wasBuy) {
78
+ return { px: legPx + gapPx, isBuy: false };
79
+ }
80
+ return { px: legPx - gapPx, isBuy: true };
81
+ }
82
+ export function buildGridOrderAction(opts) {
83
+ const annotated = annotateGridSides(opts.prices, opts.lower, opts.upper, opts.bias);
84
+ const cap = opts.maxOrders ?? Number.POSITIVE_INFINITY;
85
+ let rows = annotated.map((r) => ({
86
+ px: r.px,
87
+ isBuy: r.isBuy,
88
+ sz: opts.orderSz,
89
+ }));
90
+ if (rows.length > cap) {
91
+ rows = rows.slice(0, cap);
92
+ }
93
+ const wires = batchLimitOrdersFromPrimitives({
94
+ assetIndex: opts.assetIndex,
95
+ rows,
96
+ reduceOnly: opts.reduceOnly,
97
+ tif: opts.tif,
98
+ });
99
+ return limitsToOrderAction(wires);
100
+ }
101
+ //# sourceMappingURL=grid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid.js","sourceRoot":"","sources":["../../src/strategies/grid.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "jcc_hyper_tool",
3
+ "version": "0.1.1",
4
+ "description": "Hyperliquid perp-focused CLI",
5
+ "type": "module",
6
+ "bin": {
7
+ "jcc_hyper_tool": "./dist/cli/index.js",
8
+ "jcc_hyper_daemon": "./dist/daemon/index.js"
9
+ },
10
+ "files": [
11
+ "dist"
12
+ ],
13
+ "engines": {
14
+ "node": ">=20.0.0"
15
+ },
16
+ "scripts": {
17
+ "prepare": "npm run build",
18
+ "build": "node ./node_modules/typescript/bin/tsc -p tsconfig.json",
19
+ "typecheck": "node ./node_modules/typescript/bin/tsc -p tsconfig.json --noEmit",
20
+ "lint": "eslint . && prettier --check .",
21
+ "format": "prettier --write .",
22
+ "test": "node ./node_modules/vitest/vitest.mjs run",
23
+ "test:watch": "vitest",
24
+ "prepublishOnly": "npm run build",
25
+ "cli": "node ./dist/cli/index.js",
26
+ "cli:testnet": "node ./dist/cli/index.js --network testnet",
27
+ "daemon": "node ./dist/daemon/index.js"
28
+ },
29
+ "dependencies": {
30
+ "@msgpack/msgpack": "^3.1.1",
31
+ "commander": "^13.1.0",
32
+ "ethers": "^6.13.5",
33
+ "zod": "^3.24.2"
34
+ },
35
+ "devDependencies": {
36
+ "@eslint/js": "^9.22.0",
37
+ "@types/node": "^22.13.14",
38
+ "eslint": "^9.22.0",
39
+ "eslint-config-prettier": "^10.1.1",
40
+ "globals": "^16.0.0",
41
+ "prettier": "^3.5.3",
42
+ "typescript": "~5.8.2",
43
+ "typescript-eslint": "^8.28.0",
44
+ "vitest": "^3.1.4"
45
+ }
46
+ }