perp-cli 0.14.3 → 0.16.0

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 (363) hide show
  1. package/README.ja.md +243 -0
  2. package/README.ko.md +243 -0
  3. package/README.md +138 -405
  4. package/README.zh.md +243 -0
  5. package/dist/agent-wallet/store.d.ts +3 -2
  6. package/dist/agent-wallet/store.js +2 -2
  7. package/dist/api/public/hyperliquid.js +4 -0
  8. package/dist/api/public/lighter.d.ts +5 -0
  9. package/dist/api/public/lighter.js +5 -0
  10. package/dist/api/public/pacifica.js +85 -15
  11. package/dist/api/public/urls.d.ts +2 -0
  12. package/dist/api/public/urls.js +3 -0
  13. package/dist/arb/sizing.js +4 -2
  14. package/dist/arb/state.d.ts +6 -0
  15. package/dist/arb/utils.d.ts +1 -2
  16. package/dist/arb/utils.js +1 -2
  17. package/dist/balance-by-address.d.ts +39 -0
  18. package/dist/balance-by-address.js +44 -0
  19. package/dist/bot/apex/pulse.js +3 -0
  20. package/dist/bot/apex/radar.js +2 -1
  21. package/dist/bot/engine.d.ts +10 -1
  22. package/dist/bot/engine.js +14 -6
  23. package/dist/bot/indicators.d.ts +7 -0
  24. package/dist/bot/indicators.js +16 -0
  25. package/dist/bot/perp-order.d.ts +4 -4
  26. package/dist/bot/perp-order.js +5 -5
  27. package/dist/bot/quarantine.d.ts +1 -1
  28. package/dist/bot/quarantine.js +1 -1
  29. package/dist/bot/quote-rules.js +1 -1
  30. package/dist/bot/strategies/apex-strategy.js +3 -2
  31. package/dist/bot/strategies/engine-mm.js +6 -5
  32. package/dist/bot/strategies/funding-arb-strategy.js +12 -5
  33. package/dist/bot/strategies/funding-arb-utils.d.ts +15 -3
  34. package/dist/bot/strategies/funding-arb-utils.js +53 -20
  35. package/dist/bot/strategies/funding-auto.js +2 -2
  36. package/dist/bot/strategies/liquidation-mm.d.ts +1 -0
  37. package/dist/bot/strategies/liquidation-mm.js +8 -2
  38. package/dist/bot/strategies/momentum-breakout.d.ts +1 -0
  39. package/dist/bot/strategies/momentum-breakout.js +11 -3
  40. package/dist/bot/strategies/spot-perp-arb-strategy.d.ts +1 -1
  41. package/dist/bot/strategies/spot-perp-arb-strategy.js +6 -4
  42. package/dist/bot/strategies/spot-perp-executor.d.ts +1 -1
  43. package/dist/bot/strategies/spot-perp-executor.js +3 -3
  44. package/dist/bot/strategy-types.d.ts +2 -1
  45. package/dist/bot/tui/BotDashboard.d.ts +1 -1
  46. package/dist/bot/tui/BotDashboard.js +1 -1
  47. package/dist/cache.js +12 -6
  48. package/dist/cli-program.d.ts +15 -0
  49. package/dist/cli-program.js +126 -6
  50. package/dist/commands/account.js +168 -24
  51. package/dist/commands/agent-import.d.ts +7 -0
  52. package/dist/commands/agent-import.js +30 -1
  53. package/dist/commands/agent.d.ts +6 -3
  54. package/dist/commands/agent.js +160 -12
  55. package/dist/commands/arb/index.js +23 -81
  56. package/dist/commands/arb-auto.d.ts +24 -0
  57. package/dist/commands/arb-auto.js +175 -97
  58. package/dist/commands/arb.d.ts +20 -0
  59. package/dist/commands/arb.js +107 -163
  60. package/dist/commands/backtest.js +23 -21
  61. package/dist/commands/bot.js +1 -1
  62. package/dist/commands/builder.js +1 -1
  63. package/dist/commands/funds.js +113 -3
  64. package/dist/commands/init.d.ts +1 -1
  65. package/dist/commands/init.js +27 -7
  66. package/dist/commands/manage.js +23 -21
  67. package/dist/commands/market.d.ts +48 -0
  68. package/dist/commands/market.js +395 -100
  69. package/dist/commands/options.d.ts +14 -0
  70. package/dist/commands/options.js +151 -0
  71. package/dist/commands/pacifica-earn.d.ts +5 -0
  72. package/dist/commands/pacifica-earn.js +455 -0
  73. package/dist/commands/pacifica-orders.d.ts +14 -0
  74. package/dist/commands/pacifica-orders.js +142 -0
  75. package/dist/commands/portfolio.d.ts +16 -0
  76. package/dist/commands/portfolio.js +83 -55
  77. package/dist/commands/rebalance.d.ts +1 -0
  78. package/dist/commands/rebalance.js +15 -0
  79. package/dist/commands/risk.d.ts +11 -2
  80. package/dist/commands/risk.js +39 -44
  81. package/dist/commands/trade.d.ts +1 -0
  82. package/dist/commands/trade.js +67 -62
  83. package/dist/commands/wallet.js +1 -1
  84. package/dist/config.d.ts +2 -2
  85. package/dist/config.js +15 -4
  86. package/dist/constants.js +6 -0
  87. package/dist/cross-chain-margin.d.ts +3 -1
  88. package/dist/cross-chain-margin.js +4 -2
  89. package/dist/dashboard/server.js +3 -3
  90. package/dist/dashboard/ui.js +9 -6
  91. package/dist/errors.d.ts +29 -1
  92. package/dist/errors.js +35 -3
  93. package/dist/exchanges/address.d.ts +8 -0
  94. package/dist/exchanges/address.js +47 -0
  95. package/dist/exchanges/arcus/adapter.d.ts +16 -12
  96. package/dist/exchanges/arcus/adapter.js +45 -18
  97. package/dist/exchanges/arcus/agent.d.ts +1 -1
  98. package/dist/exchanges/arcus/agent.js +1 -1
  99. package/dist/exchanges/arcus/client.js +1 -1
  100. package/dist/exchanges/arcus/public.js +3 -2
  101. package/dist/exchanges/arcus/signing.d.ts +2 -3
  102. package/dist/exchanges/arcus/signing.js +1 -1
  103. package/dist/exchanges/arcus/spot-chain.d.ts +1 -1
  104. package/dist/exchanges/arcus/spot-chain.js +1 -1
  105. package/dist/exchanges/arcus/spot-router.d.ts +1 -1
  106. package/dist/exchanges/arcus/spot-router.js +2 -2
  107. package/dist/exchanges/arcus/spot.d.ts +2 -3
  108. package/dist/exchanges/arcus/spot.js +2 -3
  109. package/dist/exchanges/aster-spot.d.ts +3 -3
  110. package/dist/exchanges/aster-spot.js +6 -9
  111. package/dist/exchanges/aster-typed-data.d.ts +1 -1
  112. package/dist/exchanges/aster-typed-data.js +1 -1
  113. package/dist/exchanges/aster.d.ts +30 -10
  114. package/dist/exchanges/aster.js +153 -53
  115. package/dist/exchanges/builder-fee.d.ts +1 -1
  116. package/dist/exchanges/builder-fee.js +13 -2
  117. package/dist/exchanges/canonical-symbols.d.ts +8 -2
  118. package/dist/exchanges/canonical-symbols.js +46 -2
  119. package/dist/exchanges/capabilities.d.ts +2 -0
  120. package/dist/exchanges/capabilities.js +2 -1
  121. package/dist/exchanges/derive/client.d.ts +37 -0
  122. package/dist/exchanges/derive/client.js +135 -0
  123. package/dist/exchanges/derive/options.d.ts +73 -0
  124. package/dist/exchanges/derive/options.js +379 -0
  125. package/dist/exchanges/extended/adapter.d.ts +96 -0
  126. package/dist/exchanges/extended/adapter.js +241 -0
  127. package/dist/exchanges/extended/client.d.ts +38 -0
  128. package/dist/exchanges/extended/client.js +88 -0
  129. package/dist/exchanges/extended/public.d.ts +133 -0
  130. package/dist/exchanges/extended/public.js +436 -0
  131. package/dist/exchanges/grvt/adapter.d.ts +100 -0
  132. package/dist/exchanges/grvt/adapter.js +283 -0
  133. package/dist/exchanges/grvt/client.d.ts +25 -0
  134. package/dist/exchanges/grvt/client.js +86 -0
  135. package/dist/exchanges/grvt/public.d.ts +151 -0
  136. package/dist/exchanges/grvt/public.js +438 -0
  137. package/dist/exchanges/hyperliquid-outcome.d.ts +2 -0
  138. package/dist/exchanges/hyperliquid-outcome.js +29 -1
  139. package/dist/exchanges/hyperliquid-spot.d.ts +9 -1
  140. package/dist/exchanges/hyperliquid-spot.js +24 -16
  141. package/dist/exchanges/hyperliquid.d.ts +199 -22
  142. package/dist/exchanges/hyperliquid.js +550 -202
  143. package/dist/exchanges/index.d.ts +1 -1
  144. package/dist/exchanges/index.js +1 -1
  145. package/dist/exchanges/interface.d.ts +157 -13
  146. package/dist/exchanges/interface.js +47 -0
  147. package/dist/exchanges/ioc-outcome.d.ts +1 -1
  148. package/dist/exchanges/ioc-outcome.js +1 -1
  149. package/dist/exchanges/legacy-trading-v2.d.ts +2 -2
  150. package/dist/exchanges/legacy-trading-v2.js +7 -2
  151. package/dist/exchanges/lighter-public.d.ts +67 -12
  152. package/dist/exchanges/lighter-public.js +250 -82
  153. package/dist/exchanges/lighter-signer.d.ts +1 -1
  154. package/dist/exchanges/lighter-signer.js +1 -1
  155. package/dist/exchanges/lighter-spot.d.ts +10 -5
  156. package/dist/exchanges/lighter-spot.js +105 -97
  157. package/dist/exchanges/lighter.d.ts +80 -21
  158. package/dist/exchanges/lighter.js +312 -105
  159. package/dist/exchanges/ondo/adapter.d.ts +38 -13
  160. package/dist/exchanges/ondo/adapter.js +86 -27
  161. package/dist/exchanges/ondo/agent.d.ts +1 -1
  162. package/dist/exchanges/ondo/agent.js +1 -1
  163. package/dist/exchanges/ondo/client.d.ts +1 -1
  164. package/dist/exchanges/ondo/client.js +2 -2
  165. package/dist/exchanges/ondo/public.d.ts +35 -3
  166. package/dist/exchanges/ondo/public.js +75 -32
  167. package/dist/exchanges/ondo/spot.d.ts +2 -2
  168. package/dist/exchanges/ondo/spot.js +3 -3
  169. package/dist/exchanges/options-interface.d.ts +158 -0
  170. package/dist/exchanges/options-interface.js +17 -0
  171. package/dist/exchanges/options-venues.d.ts +12 -0
  172. package/dist/exchanges/options-venues.js +35 -0
  173. package/dist/exchanges/outcome-interface.d.ts +4 -0
  174. package/dist/exchanges/pacifica-atomic.d.ts +211 -0
  175. package/dist/exchanges/pacifica-atomic.js +440 -0
  176. package/dist/exchanges/pacifica-decimal.d.ts +10 -0
  177. package/dist/exchanges/pacifica-decimal.js +51 -0
  178. package/dist/exchanges/pacifica-presigned.d.ts +53 -0
  179. package/dist/exchanges/pacifica-presigned.js +141 -0
  180. package/dist/exchanges/pacifica-print.d.ts +200 -0
  181. package/dist/exchanges/pacifica-print.js +417 -0
  182. package/dist/exchanges/pacifica-spot.d.ts +8 -2
  183. package/dist/exchanges/pacifica-spot.js +26 -18
  184. package/dist/exchanges/pacifica-typed-data.d.ts +1 -1
  185. package/dist/exchanges/pacifica-typed-data.js +1 -1
  186. package/dist/exchanges/pacifica-vaults.d.ts +130 -0
  187. package/dist/exchanges/pacifica-vaults.js +277 -0
  188. package/dist/exchanges/pacifica.d.ts +108 -10
  189. package/dist/exchanges/pacifica.js +428 -171
  190. package/dist/exchanges/precision.d.ts +3 -1
  191. package/dist/exchanges/precision.js +9 -2
  192. package/dist/exchanges/public-balances.d.ts +25 -0
  193. package/dist/exchanges/public-balances.js +158 -0
  194. package/dist/exchanges/public-positions.d.ts +43 -0
  195. package/dist/exchanges/public-positions.js +154 -0
  196. package/dist/exchanges/qfex/adapter.d.ts +69 -13
  197. package/dist/exchanges/qfex/adapter.js +102 -17
  198. package/dist/exchanges/qfex/agent.d.ts +1 -1
  199. package/dist/exchanges/qfex/agent.js +1 -1
  200. package/dist/exchanges/qfex/client.d.ts +1 -1
  201. package/dist/exchanges/qfex/client.js +1 -1
  202. package/dist/exchanges/qfex/errors.d.ts +1 -1
  203. package/dist/exchanges/qfex/errors.js +2 -2
  204. package/dist/exchanges/qfex/public.d.ts +65 -12
  205. package/dist/exchanges/qfex/public.js +131 -25
  206. package/dist/exchanges/qfex/signing.d.ts +2 -2
  207. package/dist/exchanges/qfex/signing.js +4 -5
  208. package/dist/exchanges/qfex/ws-transport.d.ts +3 -3
  209. package/dist/exchanges/qfex/ws-transport.js +3 -3
  210. package/dist/exchanges/rate-limiter.d.ts +1 -1
  211. package/dist/exchanges/rate-limiter.js +5 -2
  212. package/dist/exchanges/registry.d.ts +1 -1
  213. package/dist/exchanges/registry.js +1 -1
  214. package/dist/exchanges/risex/adapter.d.ts +160 -0
  215. package/dist/exchanges/risex/adapter.js +842 -0
  216. package/dist/exchanges/risex/agent.d.ts +154 -0
  217. package/dist/exchanges/risex/agent.js +384 -0
  218. package/dist/exchanges/risex/client.d.ts +47 -0
  219. package/dist/exchanges/risex/client.js +174 -0
  220. package/dist/exchanges/risex/nonce.d.ts +43 -0
  221. package/dist/exchanges/risex/nonce.js +212 -0
  222. package/dist/exchanges/risex/public.d.ts +64 -0
  223. package/dist/exchanges/risex/public.js +150 -0
  224. package/dist/exchanges/risex/session.d.ts +71 -0
  225. package/dist/exchanges/risex/session.js +171 -0
  226. package/dist/exchanges/risex/typed-data.d.ts +173 -0
  227. package/dist/exchanges/risex/typed-data.js +240 -0
  228. package/dist/exchanges/risex/units.d.ts +29 -0
  229. package/dist/exchanges/risex/units.js +104 -0
  230. package/dist/exchanges/slippage.d.ts +1 -1
  231. package/dist/exchanges/slippage.js +1 -1
  232. package/dist/exchanges/spot-factory.d.ts +3 -3
  233. package/dist/exchanges/spot-factory.js +8 -8
  234. package/dist/exchanges/spot-interface.d.ts +5 -5
  235. package/dist/exchanges/spot-interface.js +2 -2
  236. package/dist/exchanges/spot-result.d.ts +3 -3
  237. package/dist/exchanges/spot-result.js +3 -3
  238. package/dist/exchanges/trading-v2.d.ts +3 -3
  239. package/dist/exchanges/trading-v2.js +9 -6
  240. package/dist/exchanges/txflow/adapter.d.ts +61 -0
  241. package/dist/exchanges/txflow/adapter.js +150 -0
  242. package/dist/exchanges/txflow/client.d.ts +47 -0
  243. package/dist/exchanges/txflow/client.js +155 -0
  244. package/dist/exchanges/txflow/public.d.ts +87 -0
  245. package/dist/exchanges/txflow/public.js +355 -0
  246. package/dist/exchanges/unknown-symbol.d.ts +34 -0
  247. package/dist/exchanges/unknown-symbol.js +56 -0
  248. package/dist/exchanges/variational/adapter.d.ts +67 -0
  249. package/dist/exchanges/variational/adapter.js +137 -0
  250. package/dist/exchanges/variational/client.d.ts +21 -0
  251. package/dist/exchanges/variational/client.js +66 -0
  252. package/dist/exchanges/variational/public.d.ts +126 -0
  253. package/dist/exchanges/variational/public.js +430 -0
  254. package/dist/exchanges/venue-types.d.ts +52 -10
  255. package/dist/exchanges/venue-types.js +82 -11
  256. package/dist/exchanges/venue.d.ts +150 -11
  257. package/dist/exchanges/venue.js +126 -4
  258. package/dist/exchanges/venues/arcus.d.ts +1 -2
  259. package/dist/exchanges/venues/arcus.js +5 -4
  260. package/dist/exchanges/venues/aster.d.ts +2 -2
  261. package/dist/exchanges/venues/aster.js +6 -4
  262. package/dist/exchanges/venues/create-helpers.d.ts +1 -1
  263. package/dist/exchanges/venues/create-helpers.js +3 -3
  264. package/dist/exchanges/venues/extended.d.ts +21 -0
  265. package/dist/exchanges/venues/extended.js +96 -0
  266. package/dist/exchanges/venues/grvt.d.ts +30 -0
  267. package/dist/exchanges/venues/grvt.js +98 -0
  268. package/dist/exchanges/venues/hyperliquid.d.ts +2 -2
  269. package/dist/exchanges/venues/hyperliquid.js +19 -8
  270. package/dist/exchanges/venues/index.d.ts +7 -2
  271. package/dist/exchanges/venues/index.js +8 -2
  272. package/dist/exchanges/venues/lighter-family.d.ts +7 -9
  273. package/dist/exchanges/venues/lighter-family.js +9 -11
  274. package/dist/exchanges/venues/lighter-rh.d.ts +2 -2
  275. package/dist/exchanges/venues/lighter-rh.js +20 -8
  276. package/dist/exchanges/venues/lighter.d.ts +1 -1
  277. package/dist/exchanges/venues/lighter.js +18 -6
  278. package/dist/exchanges/venues/ondo.d.ts +1 -1
  279. package/dist/exchanges/venues/ondo.js +5 -3
  280. package/dist/exchanges/venues/pacifica.d.ts +2 -2
  281. package/dist/exchanges/venues/pacifica.js +15 -4
  282. package/dist/exchanges/venues/qfex.d.ts +1 -1
  283. package/dist/exchanges/venues/qfex.js +4 -2
  284. package/dist/exchanges/venues/risex-release.d.ts +14 -0
  285. package/dist/exchanges/venues/risex-release.js +14 -0
  286. package/dist/exchanges/venues/risex.d.ts +31 -0
  287. package/dist/exchanges/venues/risex.js +131 -0
  288. package/dist/exchanges/venues/txflow.d.ts +18 -0
  289. package/dist/exchanges/venues/txflow.js +77 -0
  290. package/dist/exchanges/venues/variational.d.ts +21 -0
  291. package/dist/exchanges/venues/variational.js +85 -0
  292. package/dist/execution-log.d.ts +1 -1
  293. package/dist/funding/legacy-public.d.ts +6 -4
  294. package/dist/funding/legacy-public.js +42 -41
  295. package/dist/funding/normalize.d.ts +1 -1
  296. package/dist/funding/normalize.js +1 -1
  297. package/dist/funding/rates.d.ts +95 -6
  298. package/dist/funding/rates.js +99 -19
  299. package/dist/index.js +7 -6
  300. package/dist/jobs.d.ts +1 -0
  301. package/dist/jobs.js +25 -1
  302. package/dist/landing.d.ts +2 -0
  303. package/dist/landing.js +1 -1
  304. package/dist/liquidity.d.ts +3 -1
  305. package/dist/liquidity.js +8 -4
  306. package/dist/mcp-pacifica-earn.d.ts +9 -0
  307. package/dist/mcp-pacifica-earn.js +64 -0
  308. package/dist/mcp-server.js +211 -68
  309. package/dist/pacifica/client.d.ts +69 -5
  310. package/dist/pacifica/client.js +181 -8
  311. package/dist/pacifica/rate-limit.d.ts +144 -0
  312. package/dist/pacifica/rate-limit.js +267 -0
  313. package/dist/pacifica/types/order.d.ts +2 -1
  314. package/dist/plan-executor.js +7 -2
  315. package/dist/positions-by-address.d.ts +34 -0
  316. package/dist/positions-by-address.js +46 -0
  317. package/dist/rebalance.js +1 -1
  318. package/dist/risk.d.ts +2 -1
  319. package/dist/risk.js +2 -4
  320. package/dist/settings.d.ts +32 -3
  321. package/dist/signer/ows-evm.d.ts +1 -1
  322. package/dist/signer/ows-evm.js +1 -1
  323. package/dist/smart-order.d.ts +1 -1
  324. package/dist/smart-order.js +1 -1
  325. package/dist/strategies/funding-arb.d.ts +1 -1
  326. package/dist/strategies/funding-arb.js +36 -63
  327. package/dist/trade-validator.js +2 -2
  328. package/dist/utils.d.ts +22 -3
  329. package/dist/utils.js +11 -3
  330. package/dist/venue-health.d.ts +40 -0
  331. package/dist/venue-health.js +75 -0
  332. package/dist/withdraw-gate.d.ts +1 -1
  333. package/dist/withdraw-gate.js +1 -1
  334. package/dist/ws/arcus-market.d.ts +9 -0
  335. package/dist/ws/arcus-market.js +9 -0
  336. package/dist/ws/aster-market.d.ts +33 -0
  337. package/dist/ws/aster-market.js +30 -0
  338. package/dist/ws/index.d.ts +980 -0
  339. package/dist/ws/index.js +4460 -0
  340. package/dist/ws/lighter-market.d.ts +14 -0
  341. package/dist/ws/lighter-market.js +13 -0
  342. package/dist/ws/node.d.ts +996 -0
  343. package/dist/ws/node.js +4554 -0
  344. package/dist/ws/pacifica-instrument.d.ts +8 -0
  345. package/dist/ws/pacifica-instrument.js +8 -0
  346. package/dist/ws/unclassified.d.ts +16 -0
  347. package/dist/ws/unclassified.js +43 -0
  348. package/dist/ws-cli/credentials.d.ts +62 -0
  349. package/dist/ws-cli/credentials.js +126 -0
  350. package/package.json +71 -10
  351. package/skills/perp-cli/SKILL.md +153 -36
  352. package/skills/perp-cli/package.json +15 -2
  353. package/skills/perp-cli/references/agent-operations.md +22 -12
  354. package/skills/perp-cli/references/commands.md +143 -17
  355. package/skills/perp-cli/references/strategies.md +38 -3
  356. package/skills/perp-cli/references/ws-library.md +523 -0
  357. package/skills/perp-cli/scripts/arb-monitor.sh +13 -10
  358. package/skills/perp-cli/scripts/funding-analysis.sh +57 -29
  359. package/skills/perp-cli/scripts/preflight.sh +27 -19
  360. package/skills/perp-cli/scripts/spot-perp-scan.sh +58 -38
  361. package/skills/perp-cli/scripts/validate-arb.sh +56 -39
  362. package/dist/cli-spec.d.ts +0 -46
  363. package/dist/cli-spec.js +0 -81
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Pacifica GET /info `instrument_type` (docs.pacifica.fi get-market-info; live: "perpetual" / "spot").
3
+ * The one perp rule for every Pacifica surface (WS directory, CLI adapter, funding, arb): only
4
+ * "perpetual" rows are perps — spot (SOL-USDC) and any other / future type are not.
5
+ */
6
+ export declare function isPacificaPerpetual(row: {
7
+ instrument_type?: unknown;
8
+ }): boolean;
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Pacifica GET /info `instrument_type` (docs.pacifica.fi get-market-info; live: "perpetual" / "spot").
3
+ * The one perp rule for every Pacifica surface (WS directory, CLI adapter, funding, arb): only
4
+ * "perpetual" rows are perps — spot (SOL-USDC) and any other / future type are not.
5
+ */
6
+ export function isPacificaPerpetual(row) {
7
+ return row.instrument_type === "perpetual";
8
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Tickers that name DIFFERENT instruments on different venues — listed everywhere, never matched
3
+ * across venues (canonical null): the one table for the CLI (assetClass "unclassified"), the
4
+ * public directory / MCP / arb and the WS directory (defaultCanonicalize). src/ws keeps it so the
5
+ * WS bundle needs no CLI module.
6
+ * - SPX: the SPX6900 token on Hyperliquid / Aster / Lighter / Pacifica; its ticker equals the
7
+ * canonical key of the S&P 500 index.
8
+ * - Pacifica BP / CHIP: tickers that collide with a listed equity / ETF.
9
+ * - Lighter BB / BOT / WEN / QNT: grouped with US equities there, each also a live crypto ticker.
10
+ * - Lighter RH: every listed perp is classified (LIGHTER_RH_CLASS); an unlisted one is not.
11
+ */
12
+ export declare const UNCLASSIFIED_TICKERS: Readonly<Record<string, ReadonlySet<string>>>;
13
+ /** Lighter RH listing classification (live listings 2026-09-30). */
14
+ export declare const LIGHTER_RH_CLASS: Readonly<Record<string, "crypto" | "commodity" | "etf" | "equity" | "preIpo">>;
15
+ /** true = `base` on `venue` is never matched across venues (native markets only — not HIP-3 dexes). */
16
+ export declare function isUnclassifiedTicker(venue: string, base: string): boolean;
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Tickers that name DIFFERENT instruments on different venues — listed everywhere, never matched
3
+ * across venues (canonical null): the one table for the CLI (assetClass "unclassified"), the
4
+ * public directory / MCP / arb and the WS directory (defaultCanonicalize). src/ws keeps it so the
5
+ * WS bundle needs no CLI module.
6
+ * - SPX: the SPX6900 token on Hyperliquid / Aster / Lighter / Pacifica; its ticker equals the
7
+ * canonical key of the S&P 500 index.
8
+ * - Pacifica BP / CHIP: tickers that collide with a listed equity / ETF.
9
+ * - Lighter BB / BOT / WEN / QNT: grouped with US equities there, each also a live crypto ticker.
10
+ * - Lighter RH: every listed perp is classified (LIGHTER_RH_CLASS); an unlisted one is not.
11
+ */
12
+ export const UNCLASSIFIED_TICKERS = {
13
+ hyperliquid: new Set(["SPX"]),
14
+ aster: new Set(["SPX"]),
15
+ pacifica: new Set(["SPX", "BP", "CHIP"]),
16
+ lighter: new Set(["BB", "BOT", "WEN", "QNT", "SPX"]),
17
+ };
18
+ /** Lighter RH listing classification (live listings 2026-09-30). */
19
+ export const LIGHTER_RH_CLASS = {
20
+ // crypto
21
+ BTC: "crypto", ETH: "crypto", SOL: "crypto", HYPE: "crypto", ZEC: "crypto", LIT: "crypto",
22
+ VVV: "crypto", SUI: "crypto", NEAR: "crypto", XRP: "crypto", CASHCAT: "crypto", PONS: "crypto",
23
+ // commodity (canonical via EXPLICIT_CANONICAL: XAU → GOLD, XAG → SILVER)
24
+ XAU: "commodity", XAG: "commodity",
25
+ // etf
26
+ SPY: "etf", QQQ: "etf", SOXL: "etf", SLV: "etf", USO: "etf", SGOV: "etf",
27
+ // equity
28
+ AAPL: "equity", AMZN: "equity", GOOGL: "equity", META: "equity", MSFT: "equity", NVDA: "equity",
29
+ TSLA: "equity", AMD: "equity", INTC: "equity", MU: "equity", TSM: "equity", ORCL: "equity",
30
+ PLTR: "equity", COIN: "equity", CRCL: "equity", CRWV: "equity", BABA: "equity", SNDK: "equity",
31
+ SMCI: "equity", SOFI: "equity", AMC: "equity", RGTI: "equity", QBTS: "equity", CLSK: "equity",
32
+ IREN: "equity", WULF: "equity", LUNR: "equity", ASTS: "equity", BE: "equity", USAR: "equity",
33
+ SPCX: "equity", SKHY: "equity",
34
+ // pre-IPO / private (explicit-only canonical → null unless mapped)
35
+ OPENAI: "preIpo", ANTHROPIC: "preIpo", SHEIN: "preIpo", ANSEM: "preIpo", AI: "preIpo",
36
+ };
37
+ /** true = `base` on `venue` is never matched across venues (native markets only — not HIP-3 dexes). */
38
+ export function isUnclassifiedTicker(venue, base) {
39
+ const up = base.toUpperCase();
40
+ if (venue === "lighter-rh")
41
+ return LIGHTER_RH_CLASS[up] === undefined;
42
+ return UNCLASSIFIED_TICKERS[venue]?.has(up) === true;
43
+ }
@@ -0,0 +1,62 @@
1
+ /**
2
+ * CredentialProvider for perp-cli/ws backed by the CLI's existing stores (plan ws-0.14.4 §5.1).
3
+ * Node only (not part of perp-cli/ws). Identifiers come from the active OWS wallet and the registered
4
+ * venue agents in ~/.perp/settings.json; the Lighter auth token is created in memory by the same path
5
+ * the CLI uses (agent keystore → WASM signer). Never reads argv or env, never prompts: a keystore that
6
+ * needs a passphrase → PASSPHRASE_REQUIRED (the stream reports WS_AUTH_FAILED). Keys never leave this
7
+ * module; only the short-lived token is handed to the stream.
8
+ */
9
+ import { getAgentForNetwork } from "../agent-wallet/store.js";
10
+ type Network = "mainnet" | "testnet";
11
+ type UserRef = {
12
+ venue: "hyperliquid";
13
+ address: `0x${string}`;
14
+ } | {
15
+ venue: "pacifica";
16
+ account: string;
17
+ } | {
18
+ venue: "lighter" | "lighter-rh";
19
+ accountIndex: number;
20
+ } | {
21
+ venue: "arcus";
22
+ address: `0x${string}`;
23
+ subaccount: number | null;
24
+ };
25
+ export interface CliCredentialProvider {
26
+ /** Non-fatal notes about the resolved identity (e.g. Arcus all-subaccounts agent → subaccount 0). */
27
+ readonly warnings: string[];
28
+ user(): Promise<UserRef>;
29
+ authToken?(req: {
30
+ purpose: string;
31
+ maxTtlSec: number;
32
+ }): Promise<{
33
+ token: string;
34
+ expiresAt: number;
35
+ }>;
36
+ }
37
+ export type CliWsVenue = "hyperliquid" | "pacifica" | "lighter" | "lighter-rh" | "arcus";
38
+ type LighterAgentMeta = NonNullable<ReturnType<typeof getAgentForNetwork>> & {
39
+ accountIndex: number;
40
+ apiKeyIndex: number;
41
+ };
42
+ /** Mints Lighter auth tokens; holds the agent key inside its WASM signer for the provider's lifetime. */
43
+ export interface LighterTokenSigner {
44
+ createAuthToken(deadlineSec: number): Promise<string>;
45
+ }
46
+ /** Injectable for tests; the defaults are the CLI's own stores and signer. */
47
+ export interface CliCredentialDeps {
48
+ owsAddresses(): {
49
+ evm: string;
50
+ solana: string;
51
+ };
52
+ lighterAgent(venue: "lighter" | "lighter-rh", network: Network): LighterAgentMeta;
53
+ arcusAgent(network: Network): {
54
+ ownerAddress: `0x${string}`;
55
+ accountIndex: number;
56
+ } | null;
57
+ /** Decrypt the agent key with the empty passphrase (never prompts). */
58
+ loadLighterKey(venue: "lighter" | "lighter-rh", network: Network, meta: LighterAgentMeta): Promise<string>;
59
+ makeLighterSigner(venue: "lighter" | "lighter-rh", network: Network, meta: LighterAgentMeta, key: string): Promise<LighterTokenSigner>;
60
+ }
61
+ export declare function createCliCredentialProvider(venue: CliWsVenue, network: Network, deps?: Partial<CliCredentialDeps>): CliCredentialProvider;
62
+ export {};
@@ -0,0 +1,126 @@
1
+ /**
2
+ * CredentialProvider for perp-cli/ws backed by the CLI's existing stores (plan ws-0.14.4 §5.1).
3
+ * Node only (not part of perp-cli/ws). Identifiers come from the active OWS wallet and the registered
4
+ * venue agents in ~/.perp/settings.json; the Lighter auth token is created in memory by the same path
5
+ * the CLI uses (agent keystore → WASM signer). Never reads argv or env, never prompts: a keystore that
6
+ * needs a passphrase → PASSPHRASE_REQUIRED (the stream reports WS_AUTH_FAILED). Keys never leave this
7
+ * module; only the short-lived token is handed to the stream.
8
+ */
9
+ import { PerpError } from "../errors.js";
10
+ import { loadSettings } from "../settings.js";
11
+ import { loadOws } from "../signer/ows-loader.js";
12
+ import { getAgentForNetwork, getVenueAgentForNetwork } from "../agent-wallet/store.js";
13
+ function activeOwsAddresses() {
14
+ const name = loadSettings().owsActiveWallet;
15
+ if (!name) {
16
+ throw new PerpError("NO_SIGNER_AVAILABLE", "No active OWS wallet", { remediation: "Run: perp wallet use <name>" });
17
+ }
18
+ const w = loadOws().getWallet(name);
19
+ const evm = w.accounts.find(a => a.chainId.startsWith("eip155:"))?.address;
20
+ const solana = w.accounts.find(a => a.chainId.startsWith("solana:"))?.address;
21
+ if (evm === undefined || solana === undefined) {
22
+ throw new PerpError("NO_SIGNER_AVAILABLE", `OWS wallet "${name}" has no EVM or Solana account`, { remediation: "Run: perp wallet show" });
23
+ }
24
+ return { evm, solana };
25
+ }
26
+ function lighterAgent(venue, network) {
27
+ const meta = getAgentForNetwork(venue, network);
28
+ if (!meta || typeof meta.accountIndex !== "number" || typeof meta.apiKeyIndex !== "number") {
29
+ throw new PerpError("AGENT_NOT_REGISTERED", `No ${venue} agent registered on ${network}`, { remediation: `Run: perp -e ${venue} wallet agent approve` });
30
+ }
31
+ return meta;
32
+ }
33
+ const DEFAULT_DEPS = {
34
+ owsAddresses: activeOwsAddresses,
35
+ lighterAgent,
36
+ arcusAgent: (network) => getVenueAgentForNetwork("arcus", network),
37
+ async loadLighterKey(venue, network, meta) {
38
+ const { loadLighterFamilyKey } = await import("../agent-wallet/lighter-keystore.js");
39
+ return loadLighterFamilyKey(venue, network, meta.accountIndex, meta.apiKeyIndex, "");
40
+ },
41
+ async makeLighterSigner(venue, network, meta, key) {
42
+ const { LighterAdapter } = await import("../exchanges/lighter.js");
43
+ const adapter = LighterAdapter.forVenue(venue, "", network === "testnet");
44
+ adapter.setAgentSigner(meta, key);
45
+ if (meta.userEvmAddress)
46
+ adapter.setAddress(meta.userEvmAddress);
47
+ await adapter.init();
48
+ return { createAuthToken: async (deadlineSec) => (await adapter.signer.createAuthToken(deadlineSec)).authToken };
49
+ },
50
+ };
51
+ /**
52
+ * Keystore decrypt failures with the empty passphrase mean "this keystore has a passphrase" →
53
+ * PASSPHRASE_REQUIRED. Every other keystore error keeps its code with a generic message (no path,
54
+ * no crypto detail, no key material).
55
+ */
56
+ function keystoreError(venue, e) {
57
+ const code = e instanceof PerpError ? e.structured.code : "UNKNOWN";
58
+ const msg = e instanceof Error ? e.message : "";
59
+ if (code === "SIGNATURE_FAILED" && /LIGHTER_KEYSTORE_DECRYPT_FAILED: (?!corrupt JSON|unsupported)|Keystore decrypt failed/.test(msg)) {
60
+ return new PerpError("PASSPHRASE_REQUIRED", `${venue} agent keystore needs a passphrase (not prompted for a stream)`, {
61
+ remediation: "Use a keystore without a passphrase for streaming, or pass your own CredentialProvider.authToken",
62
+ });
63
+ }
64
+ const remediation = e instanceof PerpError ? e.structured.remediation : undefined;
65
+ return new PerpError(code, `${venue} agent keystore could not be read (${code})`, remediation === undefined ? undefined : { remediation });
66
+ }
67
+ export function createCliCredentialProvider(venue, network, deps = {}) {
68
+ const d = { ...DEFAULT_DEPS, ...deps };
69
+ const warnings = [];
70
+ let signer = null;
71
+ const provider = {
72
+ warnings,
73
+ async user() {
74
+ switch (venue) {
75
+ case "hyperliquid":
76
+ return { venue, address: d.owsAddresses().evm };
77
+ case "pacifica":
78
+ return { venue, account: d.owsAddresses().solana };
79
+ case "lighter":
80
+ case "lighter-rh":
81
+ return { venue, accountIndex: d.lighterAgent(venue, network).accountIndex };
82
+ case "arcus": {
83
+ const a = d.arcusAgent(network);
84
+ if (a === null)
85
+ throw new PerpError("AGENT_NOT_REGISTERED", `No arcus agent registered on ${network}`, { remediation: "Run: perp -e arcus wallet agent approve" });
86
+ if (a.accountIndex === 255) {
87
+ // 255 = an API key for ALL subaccounts; a stream follows one account → the venue default (0).
88
+ const w = "arcus agent covers all subaccounts (255): streaming subaccount 0 (the venue default); pass your own CredentialProvider.user() for another subaccount";
89
+ if (!warnings.includes(w))
90
+ warnings.push(w);
91
+ return { venue, address: a.ownerAddress, subaccount: null };
92
+ }
93
+ return { venue, address: a.ownerAddress, subaccount: a.accountIndex };
94
+ }
95
+ }
96
+ },
97
+ };
98
+ if (venue === "lighter" || venue === "lighter-rh") {
99
+ // One signer per provider: the agent key is decrypted once and lives only inside the WASM signer
100
+ // until the provider is dropped. A failed creation is not cached (the next call retries).
101
+ const getSigner = () => {
102
+ if (signer === null) {
103
+ signer = (async () => {
104
+ const meta = d.lighterAgent(venue, network);
105
+ let key;
106
+ try {
107
+ key = await d.loadLighterKey(venue, network, meta);
108
+ }
109
+ catch (e) {
110
+ throw keystoreError(venue, e);
111
+ }
112
+ return d.makeLighterSigner(venue, network, meta, key);
113
+ })();
114
+ signer.catch(() => { signer = null; });
115
+ }
116
+ return signer;
117
+ };
118
+ provider.authToken = async ({ maxTtlSec }) => {
119
+ const s = await getSigner();
120
+ const deadlineSec = Math.floor(Date.now() / 1000) + maxTtlSec;
121
+ const token = await s.createAuthToken(deadlineSec);
122
+ return { token, expiresAt: deadlineSec * 1000 };
123
+ };
124
+ }
125
+ return provider;
126
+ }
package/package.json CHANGED
@@ -1,12 +1,40 @@
1
1
  {
2
2
  "name": "perp-cli",
3
- "version": "0.14.3",
4
- "description": "Multi-DEX Perpetual Futures CLI - Pacifica, Hyperliquid, Lighter, Aster, Lighter RH, Ondo Perps, Arcus",
3
+ "version": "0.16.0",
4
+ "description": "Multi-DEX perpetual futures CLI + MCP server for traders and AI agents — trade on Hyperliquid (incl. HIP-3), Pacifica, Lighter, Aster, Ondo, Arcus, QFEX and more; funding-rate arb, portfolio, bots, bridge. 31 MCP tools, agent skill, JSON output.",
5
5
  "bin": {
6
6
  "perp": "dist/index.js",
7
7
  "perp-mcp": "dist/mcp-server.js",
8
8
  "perp-guardrail": "dist/guardrail/perp-guardrail.js"
9
9
  },
10
+ "exports": {
11
+ "./ws": {
12
+ "types": "./dist/ws/index.d.ts",
13
+ "import": "./dist/ws/index.js",
14
+ "default": "./dist/ws/index.js"
15
+ },
16
+ "./ws/node": {
17
+ "types": "./dist/ws/node.d.ts",
18
+ "import": "./dist/ws/node.js",
19
+ "default": "./dist/ws/node.js"
20
+ },
21
+ "./package.json": "./package.json"
22
+ },
23
+ "typesVersions": {
24
+ "*": {
25
+ "ws": [
26
+ "dist/ws/index.d.ts"
27
+ ],
28
+ "ws/node": [
29
+ "dist/ws/node.d.ts"
30
+ ]
31
+ }
32
+ },
33
+ "sideEffects": [
34
+ "./dist/index.js",
35
+ "./dist/mcp-server.js",
36
+ "./dist/guardrail/perp-guardrail.js"
37
+ ],
10
38
  "files": [
11
39
  "dist",
12
40
  "skills",
@@ -14,16 +42,20 @@
14
42
  ],
15
43
  "type": "module",
16
44
  "scripts": {
17
- "build": "tsc",
45
+ "build": "tsc && tsup --config tsup.ws.config.ts && tsup --config tsup.perp-ws.config.ts",
18
46
  "dev": "tsc --watch",
19
47
  "test": "vitest run --exclude '**/integration/**'",
20
48
  "test:integration": "vitest run -c vitest.integration.config.ts",
21
49
  "test:all": "vitest run",
50
+ "test:conformance": "vitest run src/__tests__/conformance",
51
+ "test:conformance:live": "PERP_LIVE=1 vitest run -c vitest.conformance.live.config.ts",
52
+ "conformance:record": "tsx scripts/conformance/record.ts",
53
+ "release-qa": "node scripts/release-qa/run.mjs",
22
54
  "e2e": "tsx scripts/e2e/run.ts",
23
55
  "e2e:typecheck": "tsc -p scripts/e2e/tsconfig.json",
24
56
  "typecheck:test": "tsc -p tsconfig.test.json",
25
57
  "sync-skill-version": "node scripts/sync-skill-version.mjs",
26
- "prepublishOnly": "node scripts/sync-skill-version.mjs && pnpm run build"
58
+ "prepublishOnly": "node scripts/sync-skill-version.mjs --check && node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && pnpm run build"
27
59
  },
28
60
  "keywords": [
29
61
  "pacifica",
@@ -35,6 +67,12 @@
35
67
  "ondo",
36
68
  "ondo-perps",
37
69
  "arcus",
70
+ "qfex",
71
+ "risex",
72
+ "rise-chain",
73
+ "txflow",
74
+ "variational",
75
+ "grvt",
38
76
  "solana",
39
77
  "perps",
40
78
  "dex",
@@ -51,32 +89,41 @@
51
89
  "ethereum"
52
90
  ],
53
91
  "license": "MIT",
92
+ "author": "HypurrQuant",
93
+ "repository": {
94
+ "type": "git",
95
+ "url": "git+https://github.com/hypurrquant/perp-cli.git"
96
+ },
97
+ "homepage": "https://github.com/hypurrquant/perp-cli#readme",
98
+ "bugs": {
99
+ "url": "https://github.com/hypurrquant/perp-cli/issues"
100
+ },
54
101
  "engines": {
55
102
  "node": "^20.0.0 || ^22.0.0 || ^24.0.0"
56
103
  },
57
104
  "dependencies": {
58
- "@modelcontextprotocol/sdk": "^1.27.1",
105
+ "@modelcontextprotocol/sdk": "^1.32.1",
59
106
  "@msgpack/msgpack": "^3.1.3",
60
107
  "@open-wallet-standard/core": "1.3.2",
61
- "@solana/web3.js": "^1.98.0",
62
- "@types/react": "^19.2.14",
108
+ "@solana/web3.js": "^1.99.0",
63
109
  "bs58": "^6.0.0",
64
110
  "chalk": "^5.4.1",
65
111
  "cli-table3": "^0.6.5",
66
112
  "commander": "^13.1.0",
67
113
  "dotenv": "^16.5.0",
68
- "ethers": "^6.13.2",
114
+ "ethers": "^6.17.0",
69
115
  "ink": "^6.8.0",
70
116
  "ink-spinner": "^5.0.0",
71
117
  "ink-table": "^3.1.0",
72
118
  "react": "^19.2.4",
73
119
  "tweetnacl": "^1.0.3",
74
- "ws": "^8.19.0",
75
- "yaml": "^2.8.2",
120
+ "ws": "^8.22.0",
121
+ "yaml": "^2.9.1",
76
122
  "zod": "^4.3.6"
77
123
  },
78
124
  "devDependencies": {
79
125
  "@types/node": "^25.3.3",
126
+ "@types/react": "^19.2.14",
80
127
  "@types/ws": "^8.18.1",
81
128
  "@vitest/coverage-v8": "^4.1.6",
82
129
  "ts-morph": "^27.0.2",
@@ -84,5 +131,19 @@
84
131
  "tsx": "^4.21.0",
85
132
  "typescript": "^5.7.0",
86
133
  "vitest": "^4.1.6"
134
+ },
135
+ "pnpm": {
136
+ "overrides": {
137
+ "hono@<4.13.7": "^4.13.13",
138
+ "@hono/node-server@<1.19.15": "^1.19.15",
139
+ "fast-uri@<3.1.8": "^3.1.8",
140
+ "proxy-addr@<2.0.8": "^2.0.8",
141
+ "path-to-regexp@>=8.0.0 <8.4.0": "^8.4.2",
142
+ "ip-address@<=10.7.0": "^10.7.4",
143
+ "qs@<6.16.0": "^6.16.0",
144
+ "body-parser@>=2.0.0 <2.3.0": "^2.3.0",
145
+ "ws@>=7.0.0 <7.5.11": "^7.5.13",
146
+ "uuid@>=11.0.0 <11.1.1": "^11.1.1"
147
+ }
87
148
  }
88
149
  }