@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,420 +0,0 @@
1
- // Process-wide Binance rate-limit / IP-ban gate.
2
- //
3
- // Why this exists (2026-05-15 incident): the plugin runs ~6 independent
4
- // Binance pollers (LiveBalanceEnricher, position reconciler, bracket
5
- // reconciler, user-data active probe, deposit tracker, public ticker/OHLCV)
6
- // plus agent-driven tool calls. NONE of them shared any ban awareness. When
7
- // Binance returned a 418 (IP ban), every poller kept firing on its own
8
- // cadence, and since Binance EXTENDS an IP ban on every request received
9
- // DURING the ban, the system never recovered on its own — a
10
- // self-perpetuating lockout that zeroed the dashboard and blinded the agent
11
- // for the whole window (REST dead; only the user-data WS kept working,
12
- // which is exactly what Binance's error message tells you to use).
13
- //
14
- // This module is a SINGLETON (module-level state) deliberately: the ban is
15
- // per-IP, not per-adapter-instance, so the gate must be shared across every
16
- // BinancePrivateApi / BinancePublicApi instance in the process. The
17
- // per-instance BinanceRateLimiter (rate-limiter.ts) tracks weight windows
18
- // but has no ban model and is not consulted before every call — this gate
19
- // is the hard stop that complements it.
20
- //
21
- // Binance taxonomy (USD-M Futures, General Info docs):
22
- // - 429 / -1003 "Too many requests": soft rate-limit violation, no ban yet.
23
- // - 418: auto-ban for CONTINUING to send after a 429. Message carries an
24
- // explicit `banned until <epoch-ms>` we must respect — guessing a
25
- // shorter window just re-bans and extends it.
26
- //
27
- // Integration contract (see binance-private.ts / binance-public.ts):
28
- // - `assertNotBanned(ctx)` is called as the FIRST line inside each
29
- // fetch/order method's existing try-block. While banned it throws a
30
- // `BinanceBannedError`, which the method's EXISTING catch absorbs into
31
- // its existing contract (return null / [] / rethrow) — so callers see
32
- // the same shape they'd see for any failed fetch, but ZERO network
33
- // traffic is generated during the ban. That's what lets the ban expire.
34
- // - `noteBinanceError(err)` is called in each catch to arm/extend the gate.
35
- // - `noteSuccess()` is called after a clean call to relax the soft-429
36
- // backoff ladder.
37
- import { logger } from '../logger.js';
38
- const TAG = 'binance-ban-gate';
39
- /** Soft-429 exponential backoff schedule (ms). Advance one step per
40
- * consecutive 429; a clean call resets to step -1 (→ step 0 on next hit).
41
- * Capped so we still probe ~every 2 min — enough to notice the limit
42
- * clearing without climbing back toward a 418. Mirrors the skill-side
43
- * poller circuit-breaker for behavioural consistency. */
44
- const RATE_LIMIT_BACKOFF_MS = [5_000, 15_000, 45_000, 90_000, 120_000];
45
- /** Slack added on top of Binance's stated `banned until` before we resume —
46
- * clock skew + margin so the first post-ban call doesn't land on the
47
- * boundary and immediately re-ban. */
48
- const BAN_RESUME_SLACK_MS = 8_000;
49
- // ---------------------------------------------------------------------------
50
- // Proactive weight-budget pacer (prevention half — 2026-05-15).
51
- //
52
- // The reactive 418/429 backoff above only engages AFTER Binance has already
53
- // rate-limited us. The recurring incident driver is the agent heartbeat
54
- // SCAN burst: scan_pairs across the configured symbol set + per-candidate
55
- // drill-downs fire dozens of fetchTicker/fetchOrderBook/fetchOHLCV calls within seconds,
56
- // spiking the 1-min IP weight from baseline to 2000-2400 (Binance cap 2400)
57
- // and tripping 418 at the window edge — every heartbeat.
58
- //
59
- // This is a per-IP, process-wide budget (every BinancePrivateApi /
60
- // BinancePublicApi call already funnels through assertNotBanned), so the
61
- // pacer lives here. It self-limits at a SOFT ceiling well below Binance's
62
- // hard 2400 cap: once the rolling 1-min estimate would cross the ceiling,
63
- // non-order reads fast-fail (same proven absorbed-by-existing-catch contract
64
- // as the ban error) until the 1-min window rolls. Result: the burst is
65
- // shed BEFORE it can reach 418 territory — the ban becomes structurally
66
- // unreachable in normal operation instead of merely recovered-from.
67
- //
68
- // Local estimation (incremented on every allowed call) leads the headers,
69
- // which lag by in-flight concurrency; noteResponseWeight() reconciles the
70
- // estimate up to Binance truth when a response header is available.
71
- // ---------------------------------------------------------------------------
72
- const WEIGHT_WINDOW_MS = 60_000;
73
- /** Binance USD-M Futures hard IP cap is 2400 weight / 1-min. We self-limit
74
- * under it with ~400 weight of headroom (absorbs in-flight concurrency +
75
- * header-vs-local lag; reactive 418/429 gate is the hard backstop).
76
- *
77
- * 2026-05-15 calibration (evidence-based, NOT a guess): after the measured
78
- * efficiency pass — audit no longer sweeps unscoped when flat, algoRefresh
79
- * 15s→60s, skill ticker/ohlcv/market-structure cadence cuts, all verified
80
- * via the per-context + skill poll-window instrumentation — the residual
81
- * flat-state IP weight is ~1650-1750/min of IRREDUCIBLE legitimate live-
82
- * trading polling (positions, balance, open-orders, OHLCV, income,
83
- * transfers, the 60s safety reconcilers). 1600 was below that floor, so
84
- * the pacer shed legitimate heartbeat reads indefinitely and blinded the
85
- * agent. Measured Binance x-mbx-used-weight-1m peaks ~1750-1900 << 2400,
86
- * so 2000 stops the false shedding while keeping ~400 real headroom.
87
- * Env-overridable for emergency tuning without a code change. */
88
- const WEIGHT_SOFT_CEILING = (() => {
89
- const raw = Number(process.env.RC_BINANCE_WEIGHT_CEILING);
90
- return Number.isFinite(raw) && raw >= 200 && raw <= 2400 ? raw : 2000;
91
- })();
92
- // ---------------------------------------------------------------------------
93
- // Safety-reserve priority tiering (2026-05-16).
94
- //
95
- // The pacer above sheds ALL non-order reads uniformly at the soft ceiling.
96
- // That let the recurring real-money failure persist: a heartbeat SCAN burst
97
- // (fetchTicker/fetchOHLCV/fetchOrderBook across the symbol set) pins the 1-min IP
98
- // weight at the ceiling, so the bracket audit's getOpenOrders /
99
- // queryAlgoOrder / fetchPositions were shed every heartbeat and the agent
100
- // went blind on live-position protection for HOURS (2026-05-14 ATOM →
101
- // 2026-05-16 INJ 04:29→05:54 straight). Absolute weight cuts (Option A
102
- // income poll; 983cef0 reconciler/deposit) lower the floor; this makes the
103
- // starvation STRUCTURALLY impossible regardless of future polling creep.
104
- //
105
- // Mechanism: low-priority cosmetic/market-data contexts (SHED_FIRST) are
106
- // paced against COSMETIC_SOFT_CEILING; the reserve band
107
- // [COSMETIC_SOFT_CEILING, WEIGHT_SOFT_CEILING] is reachable ONLY by
108
- // safety-critical reads. This is strictly additive — nothing is made more
109
- // lenient than today; only SHED_FIRST contexts shed earlier, so a safety
110
- // read can never be newly starved by this change.
111
- // ---------------------------------------------------------------------------
112
- /** Weight reserved exclusively for safety-critical reads. Env-overridable;
113
- * clamp 0–1000 (0 disables tiering → exact pre-2026-05-16 behaviour). */
114
- const SAFETY_RESERVE = (() => {
115
- const raw = Number(process.env.RC_BINANCE_SAFETY_RESERVE);
116
- return Number.isFinite(raw) && raw >= 0 && raw <= 1000 ? raw : 400;
117
- })();
118
- /** Effective ceiling for SHED_FIRST contexts. Floored at 200 so a large
119
- * reserve can't drive it to zero and shed cosmetic reads forever. */
120
- const COSMETIC_SOFT_CEILING = Math.max(200, WEIGHT_SOFT_CEILING - SAFETY_RESERVE);
121
- /** Approx Binance request weight per call context (the string passed to
122
- * assertNotBanned). Conservative — over-estimating paces slightly early,
123
- * which is the safe direction. Unknown contexts default to 5. */
124
- const CONTEXT_WEIGHT = {
125
- fetchTicker: 2,
126
- fetchTickerRaw: 2,
127
- fetchOrderBook: 5,
128
- fetchOHLCV: 2,
129
- fetchFundingRate: 1,
130
- fetchOpenInterest: 1,
131
- // Readiness gate's host→Binance reachability probe (fapiPublicGetTime, wt 1).
132
- reachabilityProbe: 1,
133
- // ExchangeInfoCache boot load — ccxt loadMarkets() → GET /fapi/v1/exchangeInfo,
134
- // IP weight 1 (doc-verified developers.binance.com 2026-07-10). Was the
135
- // known "ungated_ip" ccxt-internal call named in the window-summary comment.
136
- loadMarkets: 1,
137
- fetchBalance: 5,
138
- fetchPositions: 5,
139
- // BinancePrivateApi.fetchOpenOrders merges TWO REST calls (regular
140
- // /fapi/v1/openOrders + algo /fapi/v1/openAlgoOrders), each 1 scoped /
141
- // 40 unscoped (doc-verified developers.binance.com 2026-05-15). The call
142
- // site passes the scoped/unscoped context so this is exact, not a guess.
143
- fetchOpenOrders: 2, // 1 regular + 1 algo (symbol given)
144
- fetchOpenOrdersAll: 80, // 40 regular + 40 algo (symbol omitted)
145
- fetchMyTrades: 5,
146
- fetchOrder: 1, // GET /fapi/v1/order (also used for by-clientId)
147
- // GET /fapi/v1/algoOrder — single conditional-order status by clientAlgoId.
148
- // Weight 1, doc-verified developers.binance.com/.../Query-Algo-Order
149
- // (2026-05-15). The per-order bracket-spiral disambiguator: a successful
150
- // empty /fapi/v1/openAlgoOrders is NOT proof a leg is gone; this asks
151
- // about ONE exact order id. Same weight as the scoped snapshot, but it
152
- // answers the actual question instead of inferring from absence.
153
- queryAlgoOrder: 1,
154
- fetchPositionMode: 30, // GET /fapi/v1/positionSide/dual (doc-verified)
155
- fetchTransfers: 30,
156
- fetchTodayIncomeBreakdown: 30,
157
- // Same /fapi/v1/income call (weight 30) but the never-paced variant the
158
- // boot + UTC-day-rollover KPI anchor uses. Still counted so the estimate
159
- // stays honest; just not shed (see NEVER_PACE doc).
160
- fetchTodayIncomeBreakdownForced: 30,
161
- fetchRecentTradedSymbols: 30,
162
- createListenKey: 1,
163
- keepAliveListenKey: 1,
164
- closeListenKey: 1,
165
- };
166
- /** Contexts that consume weight but must NEVER be blocked by the pacer:
167
- * order/cancel paths (must always reach the exchange — same invariant as
168
- * the ban gate), listenKey lifecycle (a paced-out keep-alive could let the
169
- * user-data WS key expire; weight is trivial = 1), and the FORCED KPI
170
- * income anchor. The latter (`fetchTodayIncomeBreakdownForced`) is the
171
- * /fapi/v1/income call made only at boot and at UTC-day rollover — it
172
- * establishes `sessionStartNav = wallet_at_midnight`, the single value the
173
- * ENTIRE Day-P&L / Realized KPI chain is derived from. It runs at most
174
- * ~twice a day, so pacing it buys ~0 weight relief but, if shed, the
175
- * failed fetch used to corrupt the anchor to wallet_now and zero Day P&L
176
- * (2026-05-16 KPI incident). Routine same-day income refreshes stay
177
- * SHED_FIRST/cosmetic (the anchor is invariant within a UTC day, so a
178
- * paced miss there is a harmless no-op). All NEVER_PACE contexts still
179
- * COUNT toward the window so the estimate stays honest. */
180
- const NEVER_PACE = new Set([
181
- 'createOrder', 'cancelOrder', 'cancelAllOrders', 'cancelOrderByClientId',
182
- 'createBracketOrder', 'createListenKey', 'keepAliveListenKey', 'closeListenKey',
183
- 'fetchTodayIncomeBreakdownForced',
184
- // ExchangeInfoCache boot load: runs once per adapter init and a failure
185
- // BLOCKS the adapter (no retry until restart), so a paced-out load would
186
- // trade ~1 weight of relief for a dead adapter. Ban-gated + counted like
187
- // the listenKey contexts, never shed.
188
- 'loadMarkets',
189
- ]);
190
- /** Low-priority contexts that shed FIRST under weight pressure (paced
191
- * against COSMETIC_SOFT_CEILING, not the full ceiling). Two safe-to-shed
192
- * groups: dashboard/KPI anchors that explicitly tolerate minute-scale
193
- * staleness (income / transfers / recent-symbols) and public market-data
194
- * scan reads that have a WS alternative and are re-fetched next heartbeat.
195
- *
196
- * DELIBERATELY EXCLUDES the bracket/position safety reads —
197
- * fetchOpenOrders, fetchOpenOrdersAll, fetchPositions, queryAlgoOrder,
198
- * fetchOrder, fetchMyTrades, fetchBalance, fetchPositionMode — which keep
199
- * the full WEIGHT_SOFT_CEILING (today's behaviour, never made stricter
200
- * here). fetchBalance/fetchMyTrades stay protected because they feed
201
- * risk/sizing + fill reconciliation, not just display. */
202
- const SHED_FIRST = new Set([
203
- 'fetchTodayIncomeBreakdown', 'fetchTransfers', 'fetchRecentTradedSymbols',
204
- 'fetchTicker', 'fetchTickerRaw', 'fetchOHLCV', 'fetchOrderBook',
205
- 'fetchFundingRate', 'fetchOpenInterest', 'reachabilityProbe',
206
- ]);
207
- let weightWindowStart = 0;
208
- let weightUsed = 0;
209
- /** Throttle the "weight pacer engaged" log to once per window. */
210
- let pacerLogged = false;
211
- /** Per-context attribution for the current window (observability only —
212
- * NOT consulted by any decision). Lets prod prove WHICH callers drive the
213
- * weight so durable cadence cuts target the real consumer instead of a
214
- * guess. `allowed` = weight let through; `shed` = paced-out call count. */
215
- const weightByContext = new Map();
216
- const shedByContext = new Map();
217
- function rollWeightWindowIfDue(now) {
218
- if (now - weightWindowStart >= WEIGHT_WINDOW_MS) {
219
- if (weightUsed > 0 || shedByContext.size > 0) {
220
- const fmt = (m, n) => [...m.entries()].sort((a, b) => b[1] - a[1]).slice(0, n)
221
- .map(([k, v]) => `${k}=${v}`).join(' ');
222
- // `weightUsed` (=total) is reconciled UP to Binance's IP-wide
223
- // x-mbx-used-weight-1m header (noteResponseWeight); `weightByContext`
224
- // only sees calls that passed through THIS gate (plugin reads). The
225
- // difference is weight Binance charged this IP that the gate never
226
- // saw — the skill process's own REST polls, ccxt-internal calls
227
- // (loadMarkets/fetchTime), or anything else sharing the IP/key.
228
- // Naming it explicitly is the whole point of the 2026-05-18
229
- // "instrument, don't guess" pass: the per-context map summed to
230
- // ~275 while total was ~1900 and the ~1600 gap was invisible,
231
- // folded silently into `total`. Print ALL contexts (no top-N
232
- // truncation) so no real consumer can hide either.
233
- const gatedSum = [...weightByContext.values()].reduce((s, v) => s + v, 0);
234
- const ungatedIp = Math.max(0, weightUsed - gatedSum);
235
- logger.info(TAG, `weight window summary: total=${weightUsed}/${WEIGHT_SOFT_CEILING} ` +
236
- `gated=${gatedSum} ungated_ip=${ungatedIp} ` +
237
- `allowed[${fmt(weightByContext, 100)}] shed[${fmt(shedByContext, 100)}]`);
238
- }
239
- weightWindowStart = now;
240
- weightUsed = 0;
241
- pacerLogged = false;
242
- weightByContext.clear();
243
- shedByContext.clear();
244
- }
245
- }
246
- function contextWeight(ctx) {
247
- return CONTEXT_WEIGHT[ctx] ?? 5;
248
- }
249
- /** Thrown by `assertNotBanned` while the gate is closed. Carries the
250
- * remaining cooldown so callers/telemetry can reason about it. Methods
251
- * catch this in their existing catch block — it is NOT meant to escape
252
- * the API layer with special handling; it degrades to the method's normal
253
- * failure contract. */
254
- export class BinanceBannedError extends Error {
255
- retryAfterMs;
256
- constructor(retryAfterMs, context) {
257
- super(`Binance rate-limit/IP-ban gate is OPEN (retry in ~${Math.ceil(retryAfterMs / 1000)}s) — skipping ${context} to let the ban expire instead of extending it`);
258
- this.retryAfterMs = retryAfterMs;
259
- this.name = 'BinanceBannedError';
260
- }
261
- }
262
- /** Thrown by the proactive weight pacer. Subclass of BinanceBannedError so
263
- * every `instanceof BinanceBannedError` check and every method's existing
264
- * catch keep working unchanged — it degrades to the same null/[]/throw
265
- * contract (treated exactly like a transient fetch failure). The distinct
266
- * name lets journal/telemetry tell prevention apart from a real IP ban. */
267
- export class BinanceWeightPacedError extends BinanceBannedError {
268
- constructor(retryAfterMs, context) {
269
- super(retryAfterMs, context);
270
- this.name = 'BinanceWeightPacedError';
271
- this.message =
272
- `Binance weight pacer engaged (1-min window reached the ~${WEIGHT_SOFT_CEILING}/2400 ` +
273
- `soft ceiling, retry in ~${Math.ceil(retryAfterMs / 1000)}s) — shedding ${context} ` +
274
- `to stay below the 418 threshold instead of bursting into an IP ban`;
275
- }
276
- }
277
- let banUntilMs = 0;
278
- let rateLimitStep = -1;
279
- /** Throttles the "gate open, skipping" log to once per cooldown window so a
280
- * multi-minute ban doesn't emit hundreds of identical lines. */
281
- let cooldownLogged = false;
282
- /** Fast pre-flight check. Call as the first line inside a Binance call's
283
- * try-block. Throws `BinanceBannedError` (no network) while the gate is
284
- * open. */
285
- export function assertNotBanned(context) {
286
- const now = Date.now();
287
- if (now < banUntilMs) {
288
- const remaining = banUntilMs - now;
289
- if (!cooldownLogged) {
290
- logger.warn(TAG, `gate OPEN — pausing ALL Binance calls for ~${Math.ceil(remaining / 1000)}s (418/429 backoff). First skipped: ${context}`);
291
- cooldownLogged = true;
292
- }
293
- throw new BinanceBannedError(remaining, context);
294
- }
295
- if (cooldownLogged) {
296
- logger.info(TAG, 'gate CLOSED — Binance calls resuming');
297
- cooldownLogged = false;
298
- }
299
- // --- Proactive weight pacing (prevention; runs only when not banned) ---
300
- rollWeightWindowIfDue(now);
301
- const w = contextWeight(context);
302
- if (!NEVER_PACE.has(context)) {
303
- // Priority tiering: cosmetic/market-data reads (SHED_FIRST) pace against
304
- // the lower COSMETIC_SOFT_CEILING so the reserve band up to the full
305
- // ceiling stays exclusively available to safety-critical reads. Anything
306
- // not in SHED_FIRST keeps the full ceiling — identical to pre-2026-05-16
307
- // behaviour, never more lenient.
308
- const isCosmetic = SHED_FIRST.has(context);
309
- const effectiveCeiling = isCosmetic ? COSMETIC_SOFT_CEILING : WEIGHT_SOFT_CEILING;
310
- if (weightUsed + w > effectiveCeiling) {
311
- const retryAfterMs = Math.max(0, weightWindowStart + WEIGHT_WINDOW_MS - now);
312
- if (!pacerLogged) {
313
- logger.warn(TAG, `weight pacer ENGAGED — 1-min IP weight ~${weightUsed}/${WEIGHT_SOFT_CEILING} ` +
314
- `(cosmetic ceiling ${COSMETIC_SOFT_CEILING}, hard cap 2400); shedding ` +
315
- `${isCosmetic ? 'cosmetic' : 'non-order'} reads ~${Math.ceil(retryAfterMs / 1000)}s until the window rolls. First shed: ${context}`);
316
- pacerLogged = true;
317
- }
318
- shedByContext.set(context, (shedByContext.get(context) ?? 0) + 1);
319
- throw new BinanceWeightPacedError(retryAfterMs, context);
320
- }
321
- }
322
- // Allowed (or NEVER_PACE) → the request will go out; count its weight
323
- // immediately so the estimate leads (not lags) the in-flight burst.
324
- weightUsed += w;
325
- weightByContext.set(context, (weightByContext.get(context) ?? 0) + w);
326
- }
327
- /** Inspect a failed call's error and arm/extend the gate on a Binance
328
- * rate-limit signal. Non-rate-limit errors are ignored (normal transient
329
- * handling stays in the caller). Safe to call with any error shape. */
330
- export function noteBinanceError(err) {
331
- // A BinanceBannedError means the gate was already open and we short-
332
- // circuited — nothing to arm.
333
- if (err instanceof BinanceBannedError)
334
- return;
335
- const msg = err instanceof Error ? err.message : typeof err === 'string' ? err : String(err);
336
- // 418 — hard IP ban with an explicit expiry Binance gives us.
337
- if (msg.includes('418') || /banned until/i.test(msg)) {
338
- const m = /banned until (\d{10,})/i.exec(msg);
339
- const stated = m ? Number(m[1]) : 0;
340
- const base = Number.isFinite(stated) && stated > Date.now()
341
- ? stated
342
- : Date.now() + RATE_LIMIT_BACKOFF_MS[RATE_LIMIT_BACKOFF_MS.length - 1];
343
- const target = base + BAN_RESUME_SLACK_MS;
344
- if (target > banUntilMs) {
345
- banUntilMs = target;
346
- cooldownLogged = false; // force a fresh "gate OPEN ~Ns" line
347
- logger.error(TAG, `Binance 418 IP BAN — gate engaged, ALL Binance calls paused ~${Math.ceil((target - Date.now()) / 1000)}s (Binance-stated expiry +slack)`);
348
- }
349
- return;
350
- }
351
- // 429 / -1003 — soft rate-limit, no ban yet. Exponential backoff so we
352
- // stop climbing toward a 418.
353
- if (msg.includes('429') ||
354
- msg.includes('-1003') ||
355
- /too many requests/i.test(msg)) {
356
- rateLimitStep = Math.min(rateLimitStep + 1, RATE_LIMIT_BACKOFF_MS.length - 1);
357
- const window = RATE_LIMIT_BACKOFF_MS[rateLimitStep];
358
- const target = Date.now() + window;
359
- if (target > banUntilMs) {
360
- banUntilMs = target;
361
- cooldownLogged = false;
362
- logger.warn(TAG, `Binance 429 — gate backoff step ${rateLimitStep}, ALL Binance calls paused ${window / 1000}s`);
363
- }
364
- }
365
- }
366
- /** Relax the soft-429 ladder after a clean call. (A hard 418 window is NOT
367
- * shortened by this — only Binance's stated expiry clears it.) */
368
- export function noteSuccess() {
369
- if (rateLimitStep !== -1)
370
- rateLimitStep = -1;
371
- }
372
- /** Reconcile the local weight estimate against Binance truth from a response
373
- * header (`x-mbx-used-weight-1m`). Best-effort: callers pass whatever header
374
- * bag they have; absent/garbage values are ignored. The local estimate
375
- * leads (counts in-flight calls Binance hasn't tallied yet), so we take the
376
- * MAX within the window — never let a lagging header lower our guard. A
377
- * header far BELOW the estimate means Binance's minute rolled; re-anchor the
378
- * window to Binance's clock so we don't shed for a stale local total. */
379
- export function noteResponseWeight(headers) {
380
- if (!headers)
381
- return;
382
- const raw = headers['x-mbx-used-weight-1m'] ?? headers['X-MBX-USED-WEIGHT-1M'];
383
- if (raw == null)
384
- return;
385
- const actual = parseInt(String(raw), 10);
386
- if (!Number.isFinite(actual) || actual < 0)
387
- return;
388
- const now = Date.now();
389
- rollWeightWindowIfDue(now);
390
- if (actual + 50 < weightUsed) {
391
- // Binance reports much less than our local tally → its 1-min counter
392
- // reset on the exchange side. Re-anchor to Binance truth.
393
- weightWindowStart = now;
394
- weightUsed = actual;
395
- pacerLogged = false;
396
- return;
397
- }
398
- if (actual > weightUsed)
399
- weightUsed = actual;
400
- }
401
- /** Test/diagnostic helper — current gate state. */
402
- export function getBanGateState() {
403
- return {
404
- banUntilMs,
405
- remainingMs: Math.max(0, banUntilMs - Date.now()),
406
- rateLimitStep,
407
- weightUsed,
408
- weightCeiling: WEIGHT_SOFT_CEILING,
409
- cosmeticCeiling: COSMETIC_SOFT_CEILING,
410
- };
411
- }
412
- /** Test-only reset. Not used in production code paths. */
413
- export function __resetBanGateForTests() {
414
- banUntilMs = 0;
415
- rateLimitStep = -1;
416
- cooldownLogged = false;
417
- weightWindowStart = 0;
418
- weightUsed = 0;
419
- pacerLogged = false;
420
- }