@reefclaw/connect 0.1.10 → 0.1.12

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 (396) hide show
  1. package/assets/bridge/gateway/event-parser.d.ts +6 -1
  2. package/assets/bridge/gateway/event-parser.js +19 -2
  3. package/assets/bridge/gateway/heartbeat-cron.d.ts +27 -0
  4. package/assets/bridge/gateway/heartbeat-cron.js +85 -0
  5. package/assets/bridge/gateway/poller.d.ts +1 -0
  6. package/assets/bridge/gateway/poller.js +14 -2
  7. package/assets/bridge/providers/gateway.d.ts +24 -2
  8. package/assets/bridge/providers/gateway.js +124 -25
  9. package/assets/bridge/setup.js +6 -51
  10. package/assets/shared/signals/conditions/registry.js +11 -2
  11. package/assets/shared/signals/strategy-adapter.js +17 -7
  12. package/assets/skill/SKILL.md +2 -0
  13. package/dist/deps.js +2 -2
  14. package/dist/plugin.js +35 -7
  15. package/package.json +1 -1
  16. package/assets/plugin/audit/mode-transition-audit.d.ts +0 -11
  17. package/assets/plugin/audit/mode-transition-audit.js +0 -29
  18. package/assets/plugin/balance-utils.d.ts +0 -36
  19. package/assets/plugin/balance-utils.js +0 -98
  20. package/assets/plugin/ccxt/binance-ban-gate.d.ts +0 -47
  21. package/assets/plugin/ccxt/binance-ban-gate.js +0 -420
  22. package/assets/plugin/ccxt/binance-private.d.ts +0 -346
  23. package/assets/plugin/ccxt/binance-private.js +0 -1525
  24. package/assets/plugin/ccxt/binance-public.d.ts +0 -34
  25. package/assets/plugin/ccxt/binance-public.js +0 -180
  26. package/assets/plugin/ccxt/intel-public.d.ts +0 -25
  27. package/assets/plugin/ccxt/intel-public.js +0 -80
  28. package/assets/plugin/ccxt/public-market-data-api.d.ts +0 -12
  29. package/assets/plugin/ccxt/public-market-data-api.js +0 -9
  30. package/assets/plugin/config/agent-config-client.d.ts +0 -77
  31. package/assets/plugin/config/agent-config-client.js +0 -188
  32. package/assets/plugin/config/agent-config-poller.d.ts +0 -32
  33. package/assets/plugin/config/agent-config-poller.js +0 -101
  34. package/assets/plugin/config/brackets-config.d.ts +0 -22
  35. package/assets/plugin/config/brackets-config.js +0 -58
  36. package/assets/plugin/config/entitlement-gate.d.ts +0 -51
  37. package/assets/plugin/config/entitlement-gate.js +0 -137
  38. package/assets/plugin/config/gate-store.d.ts +0 -18
  39. package/assets/plugin/config/gate-store.js +0 -61
  40. package/assets/plugin/config/plugin-config-io.d.ts +0 -215
  41. package/assets/plugin/config/plugin-config-io.js +0 -111
  42. package/assets/plugin/config/position-review-config.d.ts +0 -35
  43. package/assets/plugin/config/position-review-config.js +0 -105
  44. package/assets/plugin/config/tool-gate.d.ts +0 -53
  45. package/assets/plugin/config/tool-gate.js +0 -128
  46. package/assets/plugin/config/user-data-stream-config.d.ts +0 -89
  47. package/assets/plugin/config/user-data-stream-config.js +0 -239
  48. package/assets/plugin/connector-supervisor.d.ts +0 -36
  49. package/assets/plugin/connector-supervisor.js +0 -149
  50. package/assets/plugin/exchange-adapter.d.ts +0 -65
  51. package/assets/plugin/exchange-adapter.js +0 -4
  52. package/assets/plugin/index.d.ts +0 -30
  53. package/assets/plugin/index.js +0 -2678
  54. package/assets/plugin/ingest/pending-entry-metadata.d.ts +0 -74
  55. package/assets/plugin/ingest/pending-entry-metadata.js +0 -236
  56. package/assets/plugin/ingest/position-auto-capture.d.ts +0 -103
  57. package/assets/plugin/ingest/position-auto-capture.js +0 -411
  58. package/assets/plugin/ingest/position-decisions-client.d.ts +0 -322
  59. package/assets/plugin/ingest/position-decisions-client.js +0 -296
  60. package/assets/plugin/ingest/readiness-reporter.d.ts +0 -42
  61. package/assets/plugin/ingest/readiness-reporter.js +0 -163
  62. package/assets/plugin/ingest/reconcile-db-vs-exchange.d.ts +0 -13
  63. package/assets/plugin/ingest/reconcile-db-vs-exchange.js +0 -114
  64. package/assets/plugin/ingest/reconciler-cleanup.d.ts +0 -37
  65. package/assets/plugin/ingest/reconciler-cleanup.js +0 -147
  66. package/assets/plugin/ingest/rest-gap-filler.d.ts +0 -191
  67. package/assets/plugin/ingest/rest-gap-filler.js +0 -565
  68. package/assets/plugin/ingest/touched-symbols-store.d.ts +0 -25
  69. package/assets/plugin/ingest/touched-symbols-store.js +0 -96
  70. package/assets/plugin/ingest/trade-store-client.d.ts +0 -40
  71. package/assets/plugin/ingest/trade-store-client.js +0 -125
  72. package/assets/plugin/ingest/ws-ingest.d.ts +0 -43
  73. package/assets/plugin/ingest/ws-ingest.js +0 -126
  74. package/assets/plugin/learning/setup-family.d.ts +0 -21
  75. package/assets/plugin/learning/setup-family.js +0 -103
  76. package/assets/plugin/lifecycle/install-signal-handlers.d.ts +0 -33
  77. package/assets/plugin/lifecycle/install-signal-handlers.js +0 -112
  78. package/assets/plugin/lifecycle/shutdown-coordinator.d.ts +0 -43
  79. package/assets/plugin/lifecycle/shutdown-coordinator.js +0 -131
  80. package/assets/plugin/lifecycle/trading-operation-lock.d.ts +0 -17
  81. package/assets/plugin/lifecycle/trading-operation-lock.js +0 -14
  82. package/assets/plugin/live/bracket-id.d.ts +0 -26
  83. package/assets/plugin/live/bracket-id.js +0 -112
  84. package/assets/plugin/live/bracket-ledger.d.ts +0 -54
  85. package/assets/plugin/live/bracket-ledger.js +0 -267
  86. package/assets/plugin/live/bracket-manager.d.ts +0 -82
  87. package/assets/plugin/live/bracket-manager.js +0 -478
  88. package/assets/plugin/live/bracket-params.d.ts +0 -22
  89. package/assets/plugin/live/bracket-params.js +0 -124
  90. package/assets/plugin/live/bracket-reconciler.d.ts +0 -95
  91. package/assets/plugin/live/bracket-reconciler.js +0 -573
  92. package/assets/plugin/live/bracket-types.d.ts +0 -102
  93. package/assets/plugin/live/bracket-types.js +0 -8
  94. package/assets/plugin/live/deposit-tracker.d.ts +0 -62
  95. package/assets/plugin/live/deposit-tracker.js +0 -97
  96. package/assets/plugin/live/emergency-controls.d.ts +0 -32
  97. package/assets/plugin/live/emergency-controls.js +0 -226
  98. package/assets/plugin/live/exchange-errors.d.ts +0 -12
  99. package/assets/plugin/live/exchange-errors.js +0 -130
  100. package/assets/plugin/live/exchange-info-cache.d.ts +0 -37
  101. package/assets/plugin/live/exchange-info-cache.js +0 -134
  102. package/assets/plugin/live/fact-subscriber.d.ts +0 -78
  103. package/assets/plugin/live/fact-subscriber.js +0 -182
  104. package/assets/plugin/live/intent-journal.d.ts +0 -42
  105. package/assets/plugin/live/intent-journal.js +0 -122
  106. package/assets/plugin/live/listen-key-manager.d.ts +0 -70
  107. package/assets/plugin/live/listen-key-manager.js +0 -169
  108. package/assets/plugin/live/live-adapter.d.ts +0 -287
  109. package/assets/plugin/live/live-adapter.js +0 -1777
  110. package/assets/plugin/live/live-balance-enricher.d.ts +0 -32
  111. package/assets/plugin/live/live-balance-enricher.js +0 -104
  112. package/assets/plugin/live/live-bracket-api.d.ts +0 -13
  113. package/assets/plugin/live/live-bracket-api.js +0 -20
  114. package/assets/plugin/live/live-state-store.d.ts +0 -194
  115. package/assets/plugin/live/live-state-store.js +0 -450
  116. package/assets/plugin/live/local-signal-service.d.ts +0 -57
  117. package/assets/plugin/live/local-signal-service.js +0 -151
  118. package/assets/plugin/live/local-strategy-evaluator.d.ts +0 -62
  119. package/assets/plugin/live/local-strategy-evaluator.js +0 -131
  120. package/assets/plugin/live/microstructure-assembler.d.ts +0 -54
  121. package/assets/plugin/live/microstructure-assembler.js +0 -148
  122. package/assets/plugin/live/order-poller.d.ts +0 -29
  123. package/assets/plugin/live/order-poller.js +0 -125
  124. package/assets/plugin/live/position-state-store.d.ts +0 -83
  125. package/assets/plugin/live/position-state-store.js +0 -237
  126. package/assets/plugin/live/proposal-decision-listener.d.ts +0 -70
  127. package/assets/plugin/live/proposal-decision-listener.js +0 -292
  128. package/assets/plugin/live/proposal-manager.d.ts +0 -76
  129. package/assets/plugin/live/proposal-manager.js +0 -140
  130. package/assets/plugin/live/rate-limiter.d.ts +0 -47
  131. package/assets/plugin/live/rate-limiter.js +0 -159
  132. package/assets/plugin/live/reconciler.d.ts +0 -39
  133. package/assets/plugin/live/reconciler.js +0 -175
  134. package/assets/plugin/live/setup-buckets.d.ts +0 -7
  135. package/assets/plugin/live/setup-buckets.js +0 -33
  136. package/assets/plugin/live/slippage-tracker.d.ts +0 -45
  137. package/assets/plugin/live/slippage-tracker.js +0 -78
  138. package/assets/plugin/live/stop-watcher.d.ts +0 -60
  139. package/assets/plugin/live/stop-watcher.js +0 -215
  140. package/assets/plugin/live/user-data-active-probe.d.ts +0 -54
  141. package/assets/plugin/live/user-data-active-probe.js +0 -180
  142. package/assets/plugin/live/user-data-stream-controller.d.ts +0 -200
  143. package/assets/plugin/live/user-data-stream-controller.js +0 -579
  144. package/assets/plugin/live/user-data-stream-ws.d.ts +0 -22
  145. package/assets/plugin/live/user-data-stream-ws.js +0 -63
  146. package/assets/plugin/live/user-data-stream.d.ts +0 -243
  147. package/assets/plugin/live/user-data-stream.js +0 -704
  148. package/assets/plugin/logger.d.ts +0 -2
  149. package/assets/plugin/logger.js +0 -2
  150. package/assets/plugin/mfe.d.ts +0 -21
  151. package/assets/plugin/mfe.js +0 -68
  152. package/assets/plugin/onboarding/mode-ladder.d.ts +0 -1
  153. package/assets/plugin/onboarding/mode-ladder.js +0 -3
  154. package/assets/plugin/onboarding/runtime.d.ts +0 -84
  155. package/assets/plugin/onboarding/runtime.js +0 -173
  156. package/assets/plugin/openclaw.plugin.json +0 -92
  157. package/assets/plugin/paper-adapter.d.ts +0 -24
  158. package/assets/plugin/paper-adapter.js +0 -91
  159. package/assets/plugin/persistence/state-manager.d.ts +0 -66
  160. package/assets/plugin/persistence/state-manager.js +0 -222
  161. package/assets/plugin/pinned-plan.d.ts +0 -9
  162. package/assets/plugin/pinned-plan.js +0 -23
  163. package/assets/plugin/portfolio/wave9-admission.d.ts +0 -67
  164. package/assets/plugin/portfolio/wave9-admission.js +0 -262
  165. package/assets/plugin/portfolio/wave9-policy.d.ts +0 -36
  166. package/assets/plugin/portfolio/wave9-policy.js +0 -183
  167. package/assets/plugin/risk/pre-trade-check.d.ts +0 -38
  168. package/assets/plugin/risk/pre-trade-check.js +0 -345
  169. package/assets/plugin/risk/pre-trade-types.d.ts +0 -60
  170. package/assets/plugin/risk/pre-trade-types.js +0 -3
  171. package/assets/plugin/shadow/shadow-tracker.d.ts +0 -36
  172. package/assets/plugin/shadow/shadow-tracker.js +0 -151
  173. package/assets/plugin/shadow/types.d.ts +0 -42
  174. package/assets/plugin/shadow/types.js +0 -20
  175. package/assets/plugin/shared/indicators-extended.d.ts +0 -52
  176. package/assets/plugin/shared/indicators-extended.js +0 -291
  177. package/assets/plugin/shared/indicators.d.ts +0 -15
  178. package/assets/plugin/shared/indicators.js +0 -114
  179. package/assets/plugin/signals/conditions/registry.d.ts +0 -16
  180. package/assets/plugin/signals/conditions/registry.js +0 -1324
  181. package/assets/plugin/signals/conditions/types.d.ts +0 -1
  182. package/assets/plugin/signals/conditions/types.js +0 -4
  183. package/assets/plugin/signals/direction-rules.d.ts +0 -3
  184. package/assets/plugin/signals/direction-rules.js +0 -24
  185. package/assets/plugin/signals/entry-rules.d.ts +0 -6
  186. package/assets/plugin/signals/entry-rules.js +0 -33
  187. package/assets/plugin/signals/serialize-context.d.ts +0 -4
  188. package/assets/plugin/signals/serialize-context.js +0 -39
  189. package/assets/plugin/signals/stop-rules.d.ts +0 -3
  190. package/assets/plugin/signals/stop-rules.js +0 -48
  191. package/assets/plugin/signals/strategy-adapter.d.ts +0 -47
  192. package/assets/plugin/signals/strategy-adapter.js +0 -199
  193. package/assets/plugin/signals/types.d.ts +0 -1
  194. package/assets/plugin/signals/types.js +0 -8
  195. package/assets/plugin/simulator/exchange-simulator.d.ts +0 -93
  196. package/assets/plugin/simulator/exchange-simulator.js +0 -689
  197. package/assets/plugin/simulator/fill-engine.d.ts +0 -53
  198. package/assets/plugin/simulator/fill-engine.js +0 -280
  199. package/assets/plugin/simulator/paper-market-feed.d.ts +0 -26
  200. package/assets/plugin/simulator/paper-market-feed.js +0 -104
  201. package/assets/plugin/simulator/realistic-fills.d.ts +0 -59
  202. package/assets/plugin/simulator/realistic-fills.js +0 -175
  203. package/assets/plugin/simulator/types.d.ts +0 -224
  204. package/assets/plugin/simulator/types.js +0 -43
  205. package/assets/plugin/strategy/builtin-strategies.d.ts +0 -2
  206. package/assets/plugin/strategy/builtin-strategies.js +0 -113
  207. package/assets/plugin/strategy/condition-registry.d.ts +0 -3
  208. package/assets/plugin/strategy/condition-registry.js +0 -153
  209. package/assets/plugin/strategy/evaluator.d.ts +0 -70
  210. package/assets/plugin/strategy/evaluator.js +0 -98
  211. package/assets/plugin/tools/assessment-validation.d.ts +0 -120
  212. package/assets/plugin/tools/assessment-validation.js +0 -415
  213. package/assets/plugin/tools/attach-brackets.d.ts +0 -39
  214. package/assets/plugin/tools/attach-brackets.js +0 -399
  215. package/assets/plugin/tools/audit-bracket-protection.d.ts +0 -49
  216. package/assets/plugin/tools/audit-bracket-protection.js +0 -527
  217. package/assets/plugin/tools/cancel-all-orders.d.ts +0 -9
  218. package/assets/plugin/tools/cancel-all-orders.js +0 -8
  219. package/assets/plugin/tools/cancel-order.d.ts +0 -14
  220. package/assets/plugin/tools/cancel-order.js +0 -60
  221. package/assets/plugin/tools/check-position-health.d.ts +0 -46
  222. package/assets/plugin/tools/check-position-health.js +0 -194
  223. package/assets/plugin/tools/clear-exchange-credentials.d.ts +0 -24
  224. package/assets/plugin/tools/clear-exchange-credentials.js +0 -70
  225. package/assets/plugin/tools/close-position.d.ts +0 -45
  226. package/assets/plugin/tools/close-position.js +0 -722
  227. package/assets/plugin/tools/create-order.d.ts +0 -82
  228. package/assets/plugin/tools/create-order.js +0 -1516
  229. package/assets/plugin/tools/exit-gate.d.ts +0 -58
  230. package/assets/plugin/tools/exit-gate.js +0 -162
  231. package/assets/plugin/tools/fetch-balance.d.ts +0 -5
  232. package/assets/plugin/tools/fetch-balance.js +0 -4
  233. package/assets/plugin/tools/fetch-ohlcv.d.ts +0 -11
  234. package/assets/plugin/tools/fetch-ohlcv.js +0 -8
  235. package/assets/plugin/tools/fetch-open-orders.d.ts +0 -7
  236. package/assets/plugin/tools/fetch-open-orders.js +0 -4
  237. package/assets/plugin/tools/fetch-positions.d.ts +0 -7
  238. package/assets/plugin/tools/fetch-positions.js +0 -4
  239. package/assets/plugin/tools/fetch-ticker.d.ts +0 -11
  240. package/assets/plugin/tools/fetch-ticker.js +0 -5
  241. package/assets/plugin/tools/get-agent-profile.d.ts +0 -4
  242. package/assets/plugin/tools/get-agent-profile.js +0 -6
  243. package/assets/plugin/tools/get-analytics.d.ts +0 -6
  244. package/assets/plugin/tools/get-analytics.js +0 -7
  245. package/assets/plugin/tools/get-backtest.d.ts +0 -12
  246. package/assets/plugin/tools/get-backtest.js +0 -91
  247. package/assets/plugin/tools/get-basis.d.ts +0 -7
  248. package/assets/plugin/tools/get-basis.js +0 -7
  249. package/assets/plugin/tools/get-bracket-config.d.ts +0 -11
  250. package/assets/plugin/tools/get-bracket-config.js +0 -24
  251. package/assets/plugin/tools/get-cascade-risk.d.ts +0 -7
  252. package/assets/plugin/tools/get-cascade-risk.js +0 -8
  253. package/assets/plugin/tools/get-crypto-metrics.d.ts +0 -18
  254. package/assets/plugin/tools/get-crypto-metrics.js +0 -62
  255. package/assets/plugin/tools/get-cvd.d.ts +0 -6
  256. package/assets/plugin/tools/get-cvd.js +0 -6
  257. package/assets/plugin/tools/get-divergences.d.ts +0 -6
  258. package/assets/plugin/tools/get-divergences.js +0 -6
  259. package/assets/plugin/tools/get-funding-context.d.ts +0 -6
  260. package/assets/plugin/tools/get-funding-context.js +0 -16
  261. package/assets/plugin/tools/get-liquidation-levels.d.ts +0 -7
  262. package/assets/plugin/tools/get-liquidation-levels.js +0 -7
  263. package/assets/plugin/tools/get-liquidation-pulse.d.ts +0 -9
  264. package/assets/plugin/tools/get-liquidation-pulse.js +0 -22
  265. package/assets/plugin/tools/get-market-breadth.d.ts +0 -6
  266. package/assets/plugin/tools/get-market-breadth.js +0 -8
  267. package/assets/plugin/tools/get-market-intel.d.ts +0 -19
  268. package/assets/plugin/tools/get-market-intel.js +0 -116
  269. package/assets/plugin/tools/get-market-structure.d.ts +0 -47
  270. package/assets/plugin/tools/get-market-structure.js +0 -198
  271. package/assets/plugin/tools/get-my-mined-patterns.d.ts +0 -20
  272. package/assets/plugin/tools/get-my-mined-patterns.js +0 -61
  273. package/assets/plugin/tools/get-my-proposed-learnings.d.ts +0 -20
  274. package/assets/plugin/tools/get-my-proposed-learnings.js +0 -55
  275. package/assets/plugin/tools/get-my-recent-reviews.d.ts +0 -22
  276. package/assets/plugin/tools/get-my-recent-reviews.js +0 -66
  277. package/assets/plugin/tools/get-orderbook.d.ts +0 -21
  278. package/assets/plugin/tools/get-orderbook.js +0 -32
  279. package/assets/plugin/tools/get-pattern-scan.d.ts +0 -7
  280. package/assets/plugin/tools/get-pattern-scan.js +0 -8
  281. package/assets/plugin/tools/get-regime.d.ts +0 -6
  282. package/assets/plugin/tools/get-regime.js +0 -7
  283. package/assets/plugin/tools/get-relevant-learnings.d.ts +0 -21
  284. package/assets/plugin/tools/get-relevant-learnings.js +0 -65
  285. package/assets/plugin/tools/get-resting-liquidity.d.ts +0 -6
  286. package/assets/plugin/tools/get-resting-liquidity.js +0 -11
  287. package/assets/plugin/tools/get-risk-scenario.d.ts +0 -29
  288. package/assets/plugin/tools/get-risk-scenario.js +0 -47
  289. package/assets/plugin/tools/get-risk-summary.d.ts +0 -51
  290. package/assets/plugin/tools/get-risk-summary.js +0 -118
  291. package/assets/plugin/tools/get-sentiment.d.ts +0 -4
  292. package/assets/plugin/tools/get-sentiment.js +0 -6
  293. package/assets/plugin/tools/get-session-review.d.ts +0 -7
  294. package/assets/plugin/tools/get-session-review.js +0 -8
  295. package/assets/plugin/tools/get-setup-detail.d.ts +0 -7
  296. package/assets/plugin/tools/get-setup-detail.js +0 -311
  297. package/assets/plugin/tools/get-signals.d.ts +0 -15
  298. package/assets/plugin/tools/get-signals.js +0 -54
  299. package/assets/plugin/tools/get-sizing.d.ts +0 -6
  300. package/assets/plugin/tools/get-sizing.js +0 -6
  301. package/assets/plugin/tools/get-trade-feedback.d.ts +0 -7
  302. package/assets/plugin/tools/get-trade-feedback.js +0 -8
  303. package/assets/plugin/tools/get-trade-flow.d.ts +0 -7
  304. package/assets/plugin/tools/get-trade-flow.js +0 -7
  305. package/assets/plugin/tools/get-volume-analysis.d.ts +0 -21
  306. package/assets/plugin/tools/get-volume-analysis.js +0 -74
  307. package/assets/plugin/tools/get-volume-profile.d.ts +0 -7
  308. package/assets/plugin/tools/get-volume-profile.js +0 -7
  309. package/assets/plugin/tools/get-wave9-status.d.ts +0 -127
  310. package/assets/plugin/tools/get-wave9-status.js +0 -796
  311. package/assets/plugin/tools/helpers.d.ts +0 -26
  312. package/assets/plugin/tools/helpers.js +0 -39
  313. package/assets/plugin/tools/intel-api.d.ts +0 -34
  314. package/assets/plugin/tools/intel-api.js +0 -119
  315. package/assets/plugin/tools/intel-cache.d.ts +0 -25
  316. package/assets/plugin/tools/intel-cache.js +0 -148
  317. package/assets/plugin/tools/list-strategies.d.ts +0 -17
  318. package/assets/plugin/tools/list-strategies.js +0 -23
  319. package/assets/plugin/tools/modify-stop.d.ts +0 -21
  320. package/assets/plugin/tools/modify-stop.js +0 -120
  321. package/assets/plugin/tools/modify-target.d.ts +0 -21
  322. package/assets/plugin/tools/modify-target.js +0 -110
  323. package/assets/plugin/tools/propose-learning.d.ts +0 -22
  324. package/assets/plugin/tools/propose-learning.js +0 -65
  325. package/assets/plugin/tools/query-review-outcomes.d.ts +0 -30
  326. package/assets/plugin/tools/query-review-outcomes.js +0 -64
  327. package/assets/plugin/tools/query-trades.d.ts +0 -21
  328. package/assets/plugin/tools/query-trades.js +0 -37
  329. package/assets/plugin/tools/record-position-reviews.d.ts +0 -38
  330. package/assets/plugin/tools/record-position-reviews.js +0 -147
  331. package/assets/plugin/tools/save-strategy.d.ts +0 -16
  332. package/assets/plugin/tools/save-strategy.js +0 -46
  333. package/assets/plugin/tools/scan-pairs.d.ts +0 -18
  334. package/assets/plugin/tools/scan-pairs.js +0 -231
  335. package/assets/plugin/tools/score-setup.d.ts +0 -31
  336. package/assets/plugin/tools/score-setup.js +0 -268
  337. package/assets/plugin/tools/set-bracket-requirement.d.ts +0 -18
  338. package/assets/plugin/tools/set-bracket-requirement.js +0 -81
  339. package/assets/plugin/tools/set-exchange-credentials.d.ts +0 -25
  340. package/assets/plugin/tools/set-exchange-credentials.js +0 -80
  341. package/assets/plugin/tools/set-trading-mode.d.ts +0 -26
  342. package/assets/plugin/tools/set-trading-mode.js +0 -135
  343. package/assets/plugin/tools/test-exchange-credentials.d.ts +0 -16
  344. package/assets/plugin/tools/test-exchange-credentials.js +0 -100
  345. package/assets/plugin/tools/toggle-strategy.d.ts +0 -8
  346. package/assets/plugin/tools/toggle-strategy.js +0 -15
  347. package/assets/plugin/trading-params-cache.d.ts +0 -26
  348. package/assets/plugin/trading-params-cache.js +0 -52
  349. package/assets/plugin/types.d.ts +0 -134
  350. package/assets/plugin/types.js +0 -7
  351. package/assets/plugin/util/plugin-paths.d.ts +0 -3
  352. package/assets/plugin/util/plugin-paths.js +0 -15
  353. package/assets/plugin/venues/hyperliquid/hl-balance.d.ts +0 -116
  354. package/assets/plugin/venues/hyperliquid/hl-balance.js +0 -145
  355. package/assets/plugin/venues/hyperliquid/hl-brackets.d.ts +0 -102
  356. package/assets/plugin/venues/hyperliquid/hl-brackets.js +0 -172
  357. package/assets/plugin/venues/hyperliquid/hl-cloid.d.ts +0 -22
  358. package/assets/plugin/venues/hyperliquid/hl-cloid.js +0 -82
  359. package/assets/plugin/venues/hyperliquid/hl-info-cache.d.ts +0 -46
  360. package/assets/plugin/venues/hyperliquid/hl-info-cache.js +0 -125
  361. package/assets/plugin/venues/hyperliquid/hl-live-adapter.d.ts +0 -88
  362. package/assets/plugin/venues/hyperliquid/hl-live-adapter.js +0 -353
  363. package/assets/plugin/venues/hyperliquid/hl-precision.d.ts +0 -61
  364. package/assets/plugin/venues/hyperliquid/hl-precision.js +0 -176
  365. package/assets/plugin/venues/hyperliquid/hl-private.d.ts +0 -88
  366. package/assets/plugin/venues/hyperliquid/hl-private.js +0 -357
  367. package/assets/plugin/venues/hyperliquid/hl-public.d.ts +0 -79
  368. package/assets/plugin/venues/hyperliquid/hl-public.js +0 -429
  369. package/assets/plugin/venues/hyperliquid/hl-rate-gate.d.ts +0 -57
  370. package/assets/plugin/venues/hyperliquid/hl-rate-gate.js +0 -220
  371. package/assets/plugin/venues/hyperliquid/hl-user-stream.d.ts +0 -90
  372. package/assets/plugin/venues/hyperliquid/hl-user-stream.js +0 -220
  373. package/assets/plugin/venues/registry.d.ts +0 -38
  374. package/assets/plugin/venues/registry.js +0 -46
  375. package/assets/plugin/venues/symbols.d.ts +0 -43
  376. package/assets/plugin/venues/symbols.js +0 -107
  377. package/assets/plugin/wave9/live-account-capture.d.ts +0 -67
  378. package/assets/plugin/wave9/live-account-capture.js +0 -435
  379. package/assets/plugin/wave9/live-autonomous-protection.d.ts +0 -39
  380. package/assets/plugin/wave9/live-autonomous-protection.js +0 -112
  381. package/assets/plugin/wave9/live-durable-reconciliation-scheduler.d.ts +0 -33
  382. package/assets/plugin/wave9/live-durable-reconciliation-scheduler.js +0 -115
  383. package/assets/plugin/wave9/live-execution-ledger.d.ts +0 -107
  384. package/assets/plugin/wave9/live-execution-ledger.js +0 -498
  385. package/assets/plugin/wave9/live-position-confirmation.d.ts +0 -18
  386. package/assets/plugin/wave9/live-position-confirmation.js +0 -111
  387. package/assets/plugin/wave9/live-residual-protection.d.ts +0 -18
  388. package/assets/plugin/wave9/live-residual-protection.js +0 -250
  389. package/assets/plugin/wave9/live-startup-reconciliation.d.ts +0 -38
  390. package/assets/plugin/wave9/live-startup-reconciliation.js +0 -454
  391. package/assets/plugin/wave9/live-symbol-ownership.d.ts +0 -20
  392. package/assets/plugin/wave9/live-symbol-ownership.js +0 -132
  393. package/assets/plugin/wave9/paper-admission-guard.d.ts +0 -199
  394. package/assets/plugin/wave9/paper-admission-guard.js +0 -650
  395. package/assets/plugin/wave9/usdm-evidence-provider.d.ts +0 -42
  396. package/assets/plugin/wave9/usdm-evidence-provider.js +0 -133
@@ -1,116 +0,0 @@
1
- import type { CcxtBalance } from '../../types.js';
2
- import type { CloseReason } from '../../simulator/types.js';
3
- export interface HlClearinghouseState {
4
- marginSummary?: {
5
- accountValue?: string | number;
6
- totalMarginUsed?: string | number;
7
- totalNtlPos?: string | number;
8
- };
9
- withdrawable?: string | number;
10
- assetPositions?: Array<{
11
- position?: {
12
- coin?: string;
13
- szi?: string | number;
14
- entryPx?: string | number;
15
- unrealizedPnl?: string | number;
16
- positionValue?: string | number;
17
- liquidationPx?: string | number;
18
- marginUsed?: string | number;
19
- };
20
- }>;
21
- }
22
- export interface HlNav {
23
- /** accountValue — what the HL app's portfolio panel shows. */
24
- equity: number;
25
- /** equity − Σ uPnl. The Binance "wallet"/margin-balance analog. */
26
- wallet: number;
27
- totalUnrealizedPnl: number;
28
- /** Free collateral (HL `withdrawable`). */
29
- available: number;
30
- }
31
- /** Derive NAV/wallet from a clearinghouseState payload.
32
- *
33
- * ★ Returns null when the payload is UNREADABLE — never a zeroed NAV. A phantom
34
- * "$0 equity" would trip risk limits and look like a catastrophic loss; null
35
- * means "unknown", which the caller must refuse to act on (null ≠ empty). */
36
- export declare function deriveHlNav(state: HlClearinghouseState | null | undefined): HlNav | null;
37
- /** CcxtBalance shape the rest of the plugin (KPI strip, sizing, LiveBalanceEnricher)
38
- * already consumes. USDC is HL's settlement asset. */
39
- export declare function toCcxtBalance(nav: HlNav): CcxtBalance;
40
- export interface HlFillForAnchor {
41
- time: number;
42
- closedPnl?: string | number;
43
- fee?: string | number;
44
- builderFee?: string | number;
45
- }
46
- export interface HlFundingForAnchor {
47
- time: number;
48
- /** HL funding deltas are signed USDC (negative = paid). */
49
- usdc?: string | number;
50
- delta?: {
51
- usdc?: string | number;
52
- };
53
- }
54
- /** Σ(closedPnl − fee − builderFee) + Σ funding, over rows at/after `sinceMs`.
55
- *
56
- * This is the exact analog of Binance's `netNonTransfer` (REALIZED_PNL +
57
- * COMMISSION + FUNDING_FEE), and — critically — it is NET of fees. The Binance
58
- * lesson (the ledger was systematically gross, causing a visible KPI gap) applies
59
- * verbatim: a gross anchor WILL disagree with the HL app. */
60
- export declare function computeNetNonTransfer(args: {
61
- fills: HlFillForAnchor[];
62
- fundings: HlFundingForAnchor[];
63
- sinceMs: number;
64
- }): {
65
- netNonTransfer: number;
66
- realizedPnlGross: number;
67
- fees: number;
68
- funding: number;
69
- };
70
- /** UTC-midnight epoch ms for a given instant (the Day-P&L boundary). */
71
- export declare function utcMidnightMs(now?: number): number;
72
- /** sessionStartNav = wallet_now − netNonTransfer_since_midnight.
73
- * dayPnl = NAV − sessionStartNav (computed by the caller each tick). */
74
- export declare function deriveSessionStartNav(args: {
75
- walletNow: number;
76
- netNonTransfer: number;
77
- }): number;
78
- /** A capital flow (deposit / withdraw / internal transfer) changes the wallet
79
- * WITHOUT being trading P&L — bump the anchor by the same signed amount so it
80
- * never shows up as Day-P&L (the DepositTracker rule).
81
- *
82
- * T-3 note: the `delta.type` enum is OPEN (docs incomplete; only
83
- * `internalTransfer` observed so far). We therefore treat any ledger row that
84
- * carries a usdc delta as a capital flow rather than switch on a closed set — an
85
- * UNKNOWN type must never be silently dropped, or the anchor drifts. */
86
- export declare function applyLedgerDelta(args: {
87
- sessionStartNav: number;
88
- ledgerRows: Array<{
89
- time: number;
90
- delta?: {
91
- usdc?: string | number;
92
- type?: string;
93
- };
94
- }>;
95
- sinceMs: number;
96
- seenHashes?: Set<string>;
97
- }): {
98
- sessionStartNav: number;
99
- applied: number;
100
- };
101
- /** ★ Close-bypass mapping (§5.9) — HL signals → journal close reasons.
102
- *
103
- * A position can leave our control without our close path running: a bracket
104
- * triggering, a LIQUIDATION, an ADL, or a delisting. Each must land in the
105
- * journal honestly (the KPI and the learning loop both read these), never as a
106
- * silent disappearance. */
107
- export declare function mapHlCloseReason(signal: {
108
- /** Fill-level liquidation object (authoritative). */
109
- liquidation?: {
110
- method?: string;
111
- } | null;
112
- /** Order status from `orderUpdates`. */
113
- orderStatus?: string;
114
- /** Our own cloid role, when the closing order was one of our legs. */
115
- bracketRole?: 'stop' | 'target';
116
- }): CloseReason | 'liquidated' | 'adl' | 'venue_delisted' | null;
@@ -1,145 +0,0 @@
1
- // Hyperliquid balance / NAV / Day-P&L anchor (plan §5.8) + close-bypass mapping
2
- // (§5.9). Pure functions — the adapter feeds them raw HL payloads.
3
- //
4
- // ★ THE INVARIANT THIS FILE EXISTS TO KEEP: "KPI must equal the exchange app to
5
- // the cent." On Binance that meant anchoring Day-P&L to the UTC-midnight income
6
- // endpoint (a multi-dollar gap there was ALWAYS a bug, never a formula quirk).
7
- // HL has no income endpoint, so the anchor is RECONSTRUCTED:
8
- //
9
- // wallet = accountValue − Σ unrealizedPnl (accountValue INCLUDES uPnl)
10
- // NAV/equity = accountValue (so equity = wallet + Σ uPnl
11
- // stays literally true)
12
- // netNonTransfer(since UTC midnight)
13
- // = Σ closedPnl − Σ fee − Σ builderFee (fills)
14
- // + Σ funding (userFunding)
15
- // sessionStartNav = wallet_now − netNonTransfer
16
- // dayPnl = NAV − sessionStartNav
17
- //
18
- // Deposits/withdrawals/transfers are NOT trading P&L: they bump the anchor
19
- // instead (the DepositTracker rule), via `applyLedgerDelta`.
20
- //
21
- // ★ FILL-HISTORY SHALLOWNESS: only the 10,000 most recent fills exist server-side
22
- // on HL (deep history is NOT queryable). The anchor must therefore be able to
23
- // run off WS-captured fills persisted in our own `trades` table — which is why
24
- // the WS-first audit-trail rule is a hard prerequisite here, not hygiene.
25
- const num = (v) => {
26
- const n = typeof v === 'number' ? v : Number(v);
27
- return Number.isFinite(n) ? n : 0;
28
- };
29
- /** Derive NAV/wallet from a clearinghouseState payload.
30
- *
31
- * ★ Returns null when the payload is UNREADABLE — never a zeroed NAV. A phantom
32
- * "$0 equity" would trip risk limits and look like a catastrophic loss; null
33
- * means "unknown", which the caller must refuse to act on (null ≠ empty). */
34
- export function deriveHlNav(state) {
35
- if (!state || typeof state !== 'object')
36
- return null;
37
- const accountValueRaw = state.marginSummary?.accountValue;
38
- if (accountValueRaw === undefined || accountValueRaw === null)
39
- return null;
40
- const equity = num(accountValueRaw);
41
- const totalUnrealizedPnl = (state.assetPositions ?? []).reduce((sum, ap) => sum + num(ap?.position?.unrealizedPnl), 0);
42
- return {
43
- equity,
44
- wallet: equity - totalUnrealizedPnl,
45
- totalUnrealizedPnl,
46
- available: num(state.withdrawable),
47
- };
48
- }
49
- /** CcxtBalance shape the rest of the plugin (KPI strip, sizing, LiveBalanceEnricher)
50
- * already consumes. USDC is HL's settlement asset. */
51
- export function toCcxtBalance(nav) {
52
- const free = { USDC: nav.available };
53
- const used = { USDC: Math.max(0, nav.wallet - nav.available) };
54
- const total = { USDC: nav.wallet };
55
- return {
56
- free,
57
- used,
58
- total,
59
- USDC: { free: nav.available, used: used.USDC, total: nav.wallet },
60
- };
61
- }
62
- /** Σ(closedPnl − fee − builderFee) + Σ funding, over rows at/after `sinceMs`.
63
- *
64
- * This is the exact analog of Binance's `netNonTransfer` (REALIZED_PNL +
65
- * COMMISSION + FUNDING_FEE), and — critically — it is NET of fees. The Binance
66
- * lesson (the ledger was systematically gross, causing a visible KPI gap) applies
67
- * verbatim: a gross anchor WILL disagree with the HL app. */
68
- export function computeNetNonTransfer(args) {
69
- let realizedPnlGross = 0;
70
- let fees = 0;
71
- for (const f of args.fills) {
72
- if (!Number.isFinite(f.time) || f.time < args.sinceMs)
73
- continue;
74
- realizedPnlGross += num(f.closedPnl);
75
- fees += num(f.fee) + num(f.builderFee);
76
- }
77
- let funding = 0;
78
- for (const f of args.fundings) {
79
- if (!Number.isFinite(f.time) || f.time < args.sinceMs)
80
- continue;
81
- funding += num(f.usdc ?? f.delta?.usdc);
82
- }
83
- return {
84
- netNonTransfer: realizedPnlGross - fees + funding,
85
- realizedPnlGross,
86
- fees,
87
- funding,
88
- };
89
- }
90
- /** UTC-midnight epoch ms for a given instant (the Day-P&L boundary). */
91
- export function utcMidnightMs(now = Date.now()) {
92
- const d = new Date(now);
93
- return Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate());
94
- }
95
- /** sessionStartNav = wallet_now − netNonTransfer_since_midnight.
96
- * dayPnl = NAV − sessionStartNav (computed by the caller each tick). */
97
- export function deriveSessionStartNav(args) {
98
- return args.walletNow - args.netNonTransfer;
99
- }
100
- /** A capital flow (deposit / withdraw / internal transfer) changes the wallet
101
- * WITHOUT being trading P&L — bump the anchor by the same signed amount so it
102
- * never shows up as Day-P&L (the DepositTracker rule).
103
- *
104
- * T-3 note: the `delta.type` enum is OPEN (docs incomplete; only
105
- * `internalTransfer` observed so far). We therefore treat any ledger row that
106
- * carries a usdc delta as a capital flow rather than switch on a closed set — an
107
- * UNKNOWN type must never be silently dropped, or the anchor drifts. */
108
- export function applyLedgerDelta(args) {
109
- let bump = 0;
110
- let applied = 0;
111
- for (const row of args.ledgerRows) {
112
- if (!Number.isFinite(row.time) || row.time < args.sinceMs)
113
- continue;
114
- const usdc = num(row.delta?.usdc);
115
- if (usdc === 0)
116
- continue;
117
- bump += usdc;
118
- applied += 1;
119
- }
120
- return { sessionStartNav: args.sessionStartNav + bump, applied };
121
- }
122
- /** ★ Close-bypass mapping (§5.9) — HL signals → journal close reasons.
123
- *
124
- * A position can leave our control without our close path running: a bracket
125
- * triggering, a LIQUIDATION, an ADL, or a delisting. Each must land in the
126
- * journal honestly (the KPI and the learning loop both read these), never as a
127
- * silent disappearance. */
128
- export function mapHlCloseReason(signal) {
129
- if (signal.liquidation) {
130
- // HL marks backstop (HLP vault) liquidations distinctly from market ones; ADL
131
- // arrives as a liquidation of the OPPOSITE side hitting us.
132
- const method = (signal.liquidation.method ?? '').toLowerCase();
133
- return method.includes('adl') ? 'adl' : 'liquidated';
134
- }
135
- const status = (signal.orderStatus ?? '').toLowerCase();
136
- if (status === 'liquidatedcanceled')
137
- return 'liquidated';
138
- if (status === 'delistedcanceled')
139
- return 'venue_delisted';
140
- if (signal.bracketRole === 'stop')
141
- return 'exchange_stop';
142
- if (signal.bracketRole === 'target')
143
- return 'exchange_target';
144
- return null;
145
- }
@@ -1,102 +0,0 @@
1
- import type { BracketId, BracketRole } from '../../live/bracket-types.js';
2
- import type { HlOrderRequest } from './hl-private.js';
3
- export type ProtectiveRole = Extract<BracketRole, 'stop' | 'target'>;
4
- export interface HlBracketLeg {
5
- role: ProtectiveRole;
6
- triggerPrice: number;
7
- /** HL legs are FIXED SIZE (T-2) — this is why resizing exists. */
8
- size: number;
9
- cloid: string;
10
- }
11
- export interface HlBracketPlan {
12
- bracketId: BracketId;
13
- symbol: string;
14
- /** Side of the CLOSING orders (opposite the position). */
15
- closeSide: 'buy' | 'sell';
16
- legs: HlBracketLeg[];
17
- }
18
- /** A leg as it currently exists ON the exchange (from `frontendOpenOrders`). */
19
- export interface LiveLeg {
20
- role: ProtectiveRole;
21
- cloid: string;
22
- size: number;
23
- triggerPrice: number;
24
- }
25
- /** Plan a fresh bracket for a filled entry. */
26
- export declare function planBracket(args: {
27
- bracketId: BracketId;
28
- symbol: string;
29
- positionSide: 'long' | 'short';
30
- positionSize: number;
31
- stopPrice?: number;
32
- targetPrice?: number;
33
- }): HlBracketPlan;
34
- /** Build the submit-requests for a plan.
35
- *
36
- * Both legs go out as ONE `createOrders` batch: one signed action, one nonce (a
37
- * same-ms nonce collision is a real HL failure mode), costing 1 IP weight unit
38
- * but 2 ADDRESS actions (the rate gate counts both).
39
- *
40
- * Legs are reduce-only trigger-market orders. HL triggers fire on MARK price only
41
- * — stop-distance validation upstream must therefore use mark, never last. */
42
- export declare function buildBracketOrders(plan: HlBracketPlan): HlOrderRequest[];
43
- export interface CoverageResult {
44
- covered: boolean;
45
- /** Un-protected contracts per role. > 0 ⇒ that much of the position is NAKED. */
46
- shortfall: Record<ProtectiveRole, number>;
47
- /** A role with NO live leg at all — a protection gap, not a sizing gap. */
48
- missing: ProtectiveRole[];
49
- }
50
- /** ★ THE T-2 INVARIANT — do the live legs cover the whole position?
51
- *
52
- * On HL a protective leg is a FIXED SIZE, so a scale-in silently leaves the added
53
- * contracts unprotected unless the legs are resized. A `covered:false` result is
54
- * a safety-floor breach (naked size), not cosmetic drift. */
55
- export declare function bracketCoversPosition(args: {
56
- positionSize: number;
57
- liveLegs: LiveLeg[];
58
- }): CoverageResult;
59
- export interface ResizePlan {
60
- /** Cloids to cancel (the stale, wrongly-sized legs). */
61
- cancelCloids: string[];
62
- /** Fresh legs to submit at the correct size. */
63
- submit: HlOrderRequest[];
64
- /** Empty when nothing needs doing — the caller must treat this as a no-op and
65
- * NOT churn the exchange (idempotent-tool contract). */
66
- noop: boolean;
67
- }
68
- /** ★ Resize protective legs after a scale-in (or any position-size change).
69
- *
70
- * HL gives us no in-place resize primitive we can trust (`modify` carries an
71
- * `always_place` footgun the plan forbids, and positionTpsl auto-sizing is
72
- * unreachable via ccxt — T-2). So the honest sequence is CANCEL + REPLACE, and
73
- * the order matters:
74
- *
75
- * Cancel-then-place opens a brief unprotected window; place-then-cancel would
76
- * double-protect (two reduce-only legs summing to 2× the position — the excess
77
- * is harmless because reduce-only can never flip a position, and HL cancels the
78
- * stragglers when flat). We therefore SUBMIT FIRST, then cancel the stale legs:
79
- * over-protection for a few hundred ms beats a naked window. The caller is
80
- * expected to execute `submit` before `cancelCloids`.
81
- *
82
- * Fresh cloids are generated for the new legs (a cloid is single-use), which is
83
- * also why the ledger keys on `bracketId`, not on a specific cloid. */
84
- export declare function planResize(args: {
85
- bracketId: BracketId;
86
- symbol: string;
87
- positionSide: 'long' | 'short';
88
- positionSize: number;
89
- liveLegs: LiveLeg[];
90
- }): ResizePlan;
91
- /** Is this exchange order one of OUR protective legs?
92
- *
93
- * The kill-switch's second layer (`OrderData.protective`) maps from this. It is
94
- * deliberately BROADER than "has one of our cloids": an externally-placed stop
95
- * must also survive a Kill. Mirrors the Binance rule (`reduceOnly || closePosition
96
- * || STOP/TAKE_PROFIT type`), translated to HL's fields. */
97
- export declare function isProtectiveHlOrder(order: {
98
- reduceOnly?: boolean;
99
- isTrigger?: boolean;
100
- isPositionTpsl?: boolean;
101
- orderType?: string;
102
- }): boolean;
@@ -1,172 +0,0 @@
1
- // Hyperliquid bracket mechanics (plan §5.7) — written against MEASURED behavior,
2
- // not assumptions. The testnet run of 2026-07-12 (docs/CLAUDE/hyperliquid.md
3
- // §"Testnet verification results") settled the two questions this file turns on:
4
- //
5
- // ★ T-1 — GOOD NEWS. Standalone (grouping `na`) reduce-only trigger legs
6
- // AUTO-CANCEL when the position goes flat (~2.7s, zero residuals), and when
7
- // ONE leg triggers the SIBLING SELF-CANCELS (OCO-like, ≤5.6s). HL cleans up
8
- // after itself like Binance's algo orders, so BracketManager needs NO bespoke
9
- // sibling-canceller. A defensive cancel stays harmless (idempotent) but is not
10
- // load-bearing.
11
- //
12
- // ★ T-2 — THE HAZARD. `grouping:'positionTpsl'` is NOT reachable through ccxt's
13
- // params passthrough (it silently produced an ordinary `isPositionTpsl:false`
14
- // leg), and leg sizes DO NOT follow a scale-in: after doubling a position the
15
- // stop stayed at the ORIGINAL size. Binance legs use `closePosition:true`
16
- // (inherently whole-position); HL legs are FIXED SIZE. Therefore:
17
- //
18
- // ⇒ EVERY scale-in MUST resize the protective legs, or the added size is
19
- // NAKED. `planResize()` is that requirement in code and
20
- // `bracketCoversPosition()` is the invariant the auditor enforces.
21
- //
22
- // Everything here is PURE — it computes plans (what to submit, what to cancel);
23
- // the adapter executes them. Safety logic stays unit-testable without a network.
24
- import { buildHlBracketCloid } from './hl-cloid.js';
25
- /** HL sizes are rounded to szDecimals, so an exact float compare would false-flag
26
- * a correctly-sized leg. Below this, a gap is rounding dust, not exposure. */
27
- const COVERAGE_EPSILON = 1e-8;
28
- /** Plan a fresh bracket for a filled entry. */
29
- export function planBracket(args) {
30
- const closeSide = args.positionSide === 'long' ? 'sell' : 'buy';
31
- const legs = [];
32
- if (args.stopPrice !== undefined) {
33
- legs.push({
34
- role: 'stop',
35
- triggerPrice: args.stopPrice,
36
- size: args.positionSize,
37
- cloid: buildHlBracketCloid(args.bracketId, 'stop'),
38
- });
39
- }
40
- if (args.targetPrice !== undefined) {
41
- legs.push({
42
- role: 'target',
43
- triggerPrice: args.targetPrice,
44
- size: args.positionSize,
45
- cloid: buildHlBracketCloid(args.bracketId, 'target'),
46
- });
47
- }
48
- return { bracketId: args.bracketId, symbol: args.symbol, closeSide, legs };
49
- }
50
- /** Build the submit-requests for a plan.
51
- *
52
- * Both legs go out as ONE `createOrders` batch: one signed action, one nonce (a
53
- * same-ms nonce collision is a real HL failure mode), costing 1 IP weight unit
54
- * but 2 ADDRESS actions (the rate gate counts both).
55
- *
56
- * Legs are reduce-only trigger-market orders. HL triggers fire on MARK price only
57
- * — stop-distance validation upstream must therefore use mark, never last. */
58
- export function buildBracketOrders(plan) {
59
- return plan.legs.map((leg) => ({
60
- symbol: plan.symbol,
61
- side: plan.closeSide,
62
- type: 'market',
63
- amount: leg.size,
64
- // A trigger-market leg still needs a price for ccxt's slippage bound; the
65
- // trigger price is the natural reference (the leg only executes there).
66
- price: leg.triggerPrice,
67
- reduceOnly: true,
68
- cloid: leg.cloid,
69
- trigger: {
70
- triggerPrice: leg.triggerPrice,
71
- tpsl: leg.role === 'stop' ? 'sl' : 'tp',
72
- },
73
- }));
74
- }
75
- /** ★ THE T-2 INVARIANT — do the live legs cover the whole position?
76
- *
77
- * On HL a protective leg is a FIXED SIZE, so a scale-in silently leaves the added
78
- * contracts unprotected unless the legs are resized. A `covered:false` result is
79
- * a safety-floor breach (naked size), not cosmetic drift. */
80
- export function bracketCoversPosition(args) {
81
- const shortfall = { stop: 0, target: 0 };
82
- const missing = [];
83
- for (const role of ['stop', 'target']) {
84
- const legs = args.liveLegs.filter((l) => l.role === role);
85
- if (legs.length === 0) {
86
- missing.push(role);
87
- continue;
88
- }
89
- const coveredSize = legs.reduce((sum, l) => sum + l.size, 0);
90
- const gap = args.positionSize - coveredSize;
91
- if (gap > COVERAGE_EPSILON)
92
- shortfall[role] = gap;
93
- }
94
- const covered = shortfall.stop <= COVERAGE_EPSILON &&
95
- shortfall.target <= COVERAGE_EPSILON &&
96
- // A missing STOP is never "covered" — that is the naked-position case. A
97
- // missing TARGET is a policy choice (requireTakeProfit can be off), so it is
98
- // reported in `missing` but does not by itself fail coverage.
99
- !missing.includes('stop');
100
- return { covered, shortfall, missing };
101
- }
102
- /** ★ Resize protective legs after a scale-in (or any position-size change).
103
- *
104
- * HL gives us no in-place resize primitive we can trust (`modify` carries an
105
- * `always_place` footgun the plan forbids, and positionTpsl auto-sizing is
106
- * unreachable via ccxt — T-2). So the honest sequence is CANCEL + REPLACE, and
107
- * the order matters:
108
- *
109
- * Cancel-then-place opens a brief unprotected window; place-then-cancel would
110
- * double-protect (two reduce-only legs summing to 2× the position — the excess
111
- * is harmless because reduce-only can never flip a position, and HL cancels the
112
- * stragglers when flat). We therefore SUBMIT FIRST, then cancel the stale legs:
113
- * over-protection for a few hundred ms beats a naked window. The caller is
114
- * expected to execute `submit` before `cancelCloids`.
115
- *
116
- * Fresh cloids are generated for the new legs (a cloid is single-use), which is
117
- * also why the ledger keys on `bracketId`, not on a specific cloid. */
118
- export function planResize(args) {
119
- const coverage = bracketCoversPosition({
120
- positionSize: args.positionSize,
121
- liveLegs: args.liveLegs,
122
- });
123
- // Nothing to do when every present leg already covers the position exactly.
124
- const oversized = args.liveLegs.some((l) => l.size - args.positionSize > COVERAGE_EPSILON);
125
- if (coverage.shortfall.stop <= COVERAGE_EPSILON &&
126
- coverage.shortfall.target <= COVERAGE_EPSILON &&
127
- !oversized) {
128
- return { cancelCloids: [], submit: [], noop: true };
129
- }
130
- // Rebuild every PRESENT role at the correct size, preserving its trigger price.
131
- const legs = [];
132
- const cancelCloids = [];
133
- for (const role of ['stop', 'target']) {
134
- const existing = args.liveLegs.filter((l) => l.role === role);
135
- if (existing.length === 0)
136
- continue; // absent leg = attach path's job, not resize's
137
- // Trigger price is preserved from the live leg (the agent's pinned plan) —
138
- // resizing must NEVER silently move a stop.
139
- const triggerPrice = existing[0].triggerPrice;
140
- legs.push({
141
- role,
142
- triggerPrice,
143
- size: args.positionSize,
144
- cloid: buildHlBracketCloid(args.bracketId, role),
145
- });
146
- cancelCloids.push(...existing.map((l) => l.cloid));
147
- }
148
- const closeSide = args.positionSide === 'long' ? 'sell' : 'buy';
149
- const submit = buildBracketOrders({
150
- bracketId: args.bracketId,
151
- symbol: args.symbol,
152
- closeSide,
153
- legs,
154
- });
155
- return { cancelCloids, submit, noop: submit.length === 0 };
156
- }
157
- /** Is this exchange order one of OUR protective legs?
158
- *
159
- * The kill-switch's second layer (`OrderData.protective`) maps from this. It is
160
- * deliberately BROADER than "has one of our cloids": an externally-placed stop
161
- * must also survive a Kill. Mirrors the Binance rule (`reduceOnly || closePosition
162
- * || STOP/TAKE_PROFIT type`), translated to HL's fields. */
163
- export function isProtectiveHlOrder(order) {
164
- if (order.reduceOnly === true)
165
- return true;
166
- if (order.isTrigger === true)
167
- return true;
168
- if (order.isPositionTpsl === true)
169
- return true;
170
- const t = (order.orderType ?? '').toLowerCase();
171
- return t.includes('stop') || t.includes('take profit') || t.includes('tp');
172
- }
@@ -1,22 +0,0 @@
1
- import type { BracketId, BracketRole } from '../../live/bracket-types.js';
2
- /** Build the HL cloid for a bracket leg. Reuses the venue-neutral 16-hex
3
- * bracketId (same value the Binance cid carries) so the BracketLedger,
4
- * reconciler and journal stay venue-agnostic. */
5
- export declare function buildHlBracketCloid(bracketId: BracketId, role: BracketRole): string;
6
- /** Parse an HL cloid. Returns null for any non-bracket cloid — this is called on
7
- * EVERY order HL returns during reconciliation, so a null result is normal and
8
- * must never throw. */
9
- export declare function parseHlBracketCloid(cloid: string): {
10
- bracketId: BracketId;
11
- role: BracketRole;
12
- } | null;
13
- /** Cheap type-guard: is this one of OUR bracket cloids? */
14
- export declare function isHlBracketCloid(cloid: string): boolean;
15
- /** Is this a syntactically valid HL cloid at all (128-bit hex)? Used to reject
16
- * a Binance-shaped cid before it reaches the wire (HL returns a cryptic error
17
- * for malformed cloids). */
18
- export declare function isValidHlCloid(cloid: string): boolean;
19
- /** Non-bracket cloid for a plain (entry/close) order — lets every HL order carry
20
- * an idempotency key, exactly like the Binance path's clientOrderId. Distinct
21
- * magic ("ord") so it never parses as a bracket leg. */
22
- export declare function buildHlOrderCloid(): string;
@@ -1,82 +0,0 @@
1
- // Hyperliquid bracket cloid scheme (plan §5.7).
2
- //
3
- // HL client order ids are **128-bit hex** (`0x` + exactly 32 hex chars) — NOT
4
- // free-form ASCII like Binance's `newClientOrderId`. So the Binance `bkt<16hex><role>`
5
- // scheme cannot be reused verbatim; it is RE-ENCODED into the 128-bit space:
6
- //
7
- // 0x bc7 <role> <16hex bracketId> <12hex random>
8
- // └┬┘ └┬┘ └──┬─┘ └──────┬────────┘ └─────┬──────┘
9
- // │ │ │ │ └── entropy (collision + opacity)
10
- // │ │ │ └── the SAME bracketId the Binance scheme uses, so the
11
- // │ │ │ ledger/reconciler stay venue-agnostic
12
- // │ │ └── role nibble: e=entry, 5=stop, 7=target (hex-legal; 's'/'t' are not)
13
- // │ └── magic "bc7" (bracket) — short on purpose, see below
14
- // └── 0x prefix
15
- //
16
- // 3 + 1 + 16 + 12 = 32 hex chars. Exactly a valid cloid.
17
- //
18
- // ★ WHY THE MAGIC IS SHORT AND THE ENTROPY IS LONG. On Binance an EXTERNAL actor
19
- // with API access pattern-matched our `rc-` cids and auto-cancelled every order
20
- // carrying them (docs/BRACKET_CANCEL_ROOT_CAUSE_2026-05-16.md). The lesson carries
21
- // to any venue: a long, guessable, human-obvious prefix is an attack surface. Keep
22
- // the recognizable part minimal (we still need to reassemble brackets from the
23
- // exchange after a restart, with zero reliance on local state) and let the rest be
24
- // random.
25
- //
26
- // ★ RECOGNITION STAYS CENTRALIZED. docs/CLAUDE/brackets.md forbids a second
27
- // bracket-cid regex anywhere else in the codebase. This module is the HL half of
28
- // that rule; `live/bracket-id.ts:parseBracketClientId(venue, cid)` dispatches here.
29
- // Never inline `/^0xbc7/` in a caller.
30
- import { randomBytes } from 'node:crypto';
31
- /** 0x + bc7 + role-nibble + 16-hex bracketId + 12-hex entropy = 34 chars total. */
32
- const HL_CLOID_REGEX = /^0xbc7([e57])([0-9a-f]{16})([0-9a-f]{12})$/;
33
- /** Any well-formed HL cloid (128-bit hex), bracket or not. */
34
- const HL_CLOID_SHAPE = /^0x[0-9a-f]{32}$/;
35
- const ROLE_TO_NIBBLE = {
36
- entry: 'e',
37
- stop: '5',
38
- target: '7',
39
- };
40
- const NIBBLE_TO_ROLE = {
41
- e: 'entry',
42
- '5': 'stop',
43
- '7': 'target',
44
- };
45
- /** Build the HL cloid for a bracket leg. Reuses the venue-neutral 16-hex
46
- * bracketId (same value the Binance cid carries) so the BracketLedger,
47
- * reconciler and journal stay venue-agnostic. */
48
- export function buildHlBracketCloid(bracketId, role) {
49
- if (!/^[0-9a-f]{16}$/.test(bracketId)) {
50
- throw new Error(`Invalid bracketId: ${bracketId} — expected 16 hex chars`);
51
- }
52
- const entropy = randomBytes(6).toString('hex'); // 12 hex chars
53
- return `0xbc7${ROLE_TO_NIBBLE[role]}${bracketId}${entropy}`;
54
- }
55
- /** Parse an HL cloid. Returns null for any non-bracket cloid — this is called on
56
- * EVERY order HL returns during reconciliation, so a null result is normal and
57
- * must never throw. */
58
- export function parseHlBracketCloid(cloid) {
59
- if (typeof cloid !== 'string')
60
- return null;
61
- const m = HL_CLOID_REGEX.exec(cloid.toLowerCase());
62
- if (!m)
63
- return null;
64
- return { bracketId: m[2], role: NIBBLE_TO_ROLE[m[1]] };
65
- }
66
- /** Cheap type-guard: is this one of OUR bracket cloids? */
67
- export function isHlBracketCloid(cloid) {
68
- return typeof cloid === 'string' && HL_CLOID_REGEX.test(cloid.toLowerCase());
69
- }
70
- /** Is this a syntactically valid HL cloid at all (128-bit hex)? Used to reject
71
- * a Binance-shaped cid before it reaches the wire (HL returns a cryptic error
72
- * for malformed cloids). */
73
- export function isValidHlCloid(cloid) {
74
- return typeof cloid === 'string' && HL_CLOID_SHAPE.test(cloid.toLowerCase());
75
- }
76
- /** Non-bracket cloid for a plain (entry/close) order — lets every HL order carry
77
- * an idempotency key, exactly like the Binance path's clientOrderId. Distinct
78
- * magic ("ord") so it never parses as a bracket leg. */
79
- export function buildHlOrderCloid() {
80
- // 0x + "0d" (order) + 30 hex random = 32 hex chars.
81
- return `0x0d${randomBytes(15).toString('hex')}`;
82
- }