@reefclaw/openclaw-plugin 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (371) hide show
  1. package/.gitignore +8 -0
  2. package/audit/mode-transition-audit.d.ts +11 -0
  3. package/audit/mode-transition-audit.js +29 -0
  4. package/balance-utils.d.ts +36 -0
  5. package/balance-utils.js +98 -0
  6. package/bridge/bridge.d.ts +109 -0
  7. package/bridge/bridge.js +1036 -0
  8. package/bridge/config.d.ts +43 -0
  9. package/bridge/config.js +176 -0
  10. package/bridge/connector.d.ts +52 -0
  11. package/bridge/connector.js +293 -0
  12. package/bridge/event-replay-buffer.d.ts +43 -0
  13. package/bridge/event-replay-buffer.js +109 -0
  14. package/bridge/gateway/event-parser.d.ts +209 -0
  15. package/bridge/gateway/event-parser.js +793 -0
  16. package/bridge/gateway/gateway-config.d.ts +39 -0
  17. package/bridge/gateway/gateway-config.js +86 -0
  18. package/bridge/gateway/gateway-http-client.d.ts +50 -0
  19. package/bridge/gateway/gateway-http-client.js +165 -0
  20. package/bridge/gateway/gateway-ws-client.d.ts +116 -0
  21. package/bridge/gateway/gateway-ws-client.js +417 -0
  22. package/bridge/gateway/poller.d.ts +146 -0
  23. package/bridge/gateway/poller.js +505 -0
  24. package/bridge/gateway/tool-discovery.d.ts +25 -0
  25. package/bridge/gateway/tool-discovery.js +198 -0
  26. package/bridge/index.d.ts +2 -0
  27. package/bridge/index.js +253 -0
  28. package/bridge/logger.d.ts +2 -0
  29. package/bridge/logger.js +2 -0
  30. package/bridge/provider.d.ts +156 -0
  31. package/bridge/provider.js +2 -0
  32. package/bridge/providers/emergency-commands.d.ts +54 -0
  33. package/bridge/providers/emergency-commands.js +235 -0
  34. package/bridge/providers/gateway.d.ts +322 -0
  35. package/bridge/providers/gateway.js +2302 -0
  36. package/bridge/providers/mock.d.ts +37 -0
  37. package/bridge/providers/mock.js +385 -0
  38. package/bridge/providers/onboarding-commands.d.ts +83 -0
  39. package/bridge/providers/onboarding-commands.js +213 -0
  40. package/bridge/providers/risk-calculator.d.ts +96 -0
  41. package/bridge/providers/risk-calculator.js +369 -0
  42. package/bridge/setup.d.ts +32 -0
  43. package/bridge/setup.js +226 -0
  44. package/bridge/types.d.ts +584 -0
  45. package/bridge/types.js +50 -0
  46. package/bridge/utils/reconnect.d.ts +6 -0
  47. package/bridge/utils/reconnect.js +6 -0
  48. package/bridge/utils/skill-signing.d.ts +51 -0
  49. package/bridge/utils/skill-signing.js +138 -0
  50. package/bridge/utils/skill-version.d.ts +17 -0
  51. package/bridge/utils/skill-version.js +74 -0
  52. package/ccxt/binance-ban-gate.d.ts +47 -0
  53. package/ccxt/binance-ban-gate.js +409 -0
  54. package/ccxt/binance-private.d.ts +325 -0
  55. package/ccxt/binance-private.js +1415 -0
  56. package/ccxt/binance-public.d.ts +18 -0
  57. package/ccxt/binance-public.js +147 -0
  58. package/config/agent-config-client.d.ts +55 -0
  59. package/config/agent-config-client.js +145 -0
  60. package/config/agent-config-poller.d.ts +25 -0
  61. package/config/agent-config-poller.js +100 -0
  62. package/config/brackets-config.d.ts +22 -0
  63. package/config/brackets-config.js +58 -0
  64. package/config/gate-store.d.ts +18 -0
  65. package/config/gate-store.js +61 -0
  66. package/config/plugin-config-io.d.ts +181 -0
  67. package/config/plugin-config-io.js +84 -0
  68. package/config/position-review-config.d.ts +35 -0
  69. package/config/position-review-config.js +105 -0
  70. package/config/tool-gate.d.ts +53 -0
  71. package/config/tool-gate.js +125 -0
  72. package/config/user-data-stream-config.d.ts +85 -0
  73. package/config/user-data-stream-config.js +224 -0
  74. package/connector-supervisor.d.ts +36 -0
  75. package/connector-supervisor.js +149 -0
  76. package/exchange-adapter.d.ts +49 -0
  77. package/exchange-adapter.js +4 -0
  78. package/index.d.ts +30 -0
  79. package/index.js +2030 -0
  80. package/ingest/pending-entry-metadata.d.ts +52 -0
  81. package/ingest/pending-entry-metadata.js +182 -0
  82. package/ingest/position-auto-capture.d.ts +98 -0
  83. package/ingest/position-auto-capture.js +394 -0
  84. package/ingest/position-decisions-client.d.ts +318 -0
  85. package/ingest/position-decisions-client.js +296 -0
  86. package/ingest/reconcile-db-vs-exchange.d.ts +13 -0
  87. package/ingest/reconcile-db-vs-exchange.js +114 -0
  88. package/ingest/reconciler-cleanup.d.ts +37 -0
  89. package/ingest/reconciler-cleanup.js +147 -0
  90. package/ingest/rest-gap-filler.d.ts +191 -0
  91. package/ingest/rest-gap-filler.js +565 -0
  92. package/ingest/touched-symbols-store.d.ts +25 -0
  93. package/ingest/touched-symbols-store.js +96 -0
  94. package/ingest/trade-store-client.d.ts +40 -0
  95. package/ingest/trade-store-client.js +125 -0
  96. package/ingest/ws-ingest.d.ts +43 -0
  97. package/ingest/ws-ingest.js +126 -0
  98. package/learning/setup-family.d.ts +21 -0
  99. package/learning/setup-family.js +103 -0
  100. package/lifecycle/install-signal-handlers.d.ts +33 -0
  101. package/lifecycle/install-signal-handlers.js +112 -0
  102. package/lifecycle/shutdown-coordinator.d.ts +43 -0
  103. package/lifecycle/shutdown-coordinator.js +131 -0
  104. package/live/bracket-id.d.ts +18 -0
  105. package/live/bracket-id.js +81 -0
  106. package/live/bracket-ledger.d.ts +54 -0
  107. package/live/bracket-ledger.js +267 -0
  108. package/live/bracket-manager.d.ts +82 -0
  109. package/live/bracket-manager.js +478 -0
  110. package/live/bracket-params.d.ts +22 -0
  111. package/live/bracket-params.js +124 -0
  112. package/live/bracket-reconciler.d.ts +95 -0
  113. package/live/bracket-reconciler.js +573 -0
  114. package/live/bracket-types.d.ts +102 -0
  115. package/live/bracket-types.js +8 -0
  116. package/live/deposit-tracker.d.ts +62 -0
  117. package/live/deposit-tracker.js +97 -0
  118. package/live/emergency-controls.d.ts +32 -0
  119. package/live/emergency-controls.js +226 -0
  120. package/live/exchange-errors.d.ts +12 -0
  121. package/live/exchange-errors.js +130 -0
  122. package/live/exchange-info-cache.d.ts +35 -0
  123. package/live/exchange-info-cache.js +119 -0
  124. package/live/fact-subscriber.d.ts +78 -0
  125. package/live/fact-subscriber.js +182 -0
  126. package/live/intent-journal.d.ts +42 -0
  127. package/live/intent-journal.js +122 -0
  128. package/live/listen-key-manager.d.ts +70 -0
  129. package/live/listen-key-manager.js +169 -0
  130. package/live/live-adapter.d.ts +264 -0
  131. package/live/live-adapter.js +1665 -0
  132. package/live/live-balance-enricher.d.ts +32 -0
  133. package/live/live-balance-enricher.js +104 -0
  134. package/live/live-bracket-api.d.ts +13 -0
  135. package/live/live-bracket-api.js +20 -0
  136. package/live/live-state-store.d.ts +194 -0
  137. package/live/live-state-store.js +450 -0
  138. package/live/local-signal-service.d.ts +57 -0
  139. package/live/local-signal-service.js +146 -0
  140. package/live/local-strategy-evaluator.d.ts +62 -0
  141. package/live/local-strategy-evaluator.js +127 -0
  142. package/live/microstructure-assembler.d.ts +54 -0
  143. package/live/microstructure-assembler.js +148 -0
  144. package/live/order-poller.d.ts +29 -0
  145. package/live/order-poller.js +125 -0
  146. package/live/position-state-store.d.ts +83 -0
  147. package/live/position-state-store.js +237 -0
  148. package/live/proposal-decision-listener.d.ts +64 -0
  149. package/live/proposal-decision-listener.js +288 -0
  150. package/live/proposal-manager.d.ts +76 -0
  151. package/live/proposal-manager.js +140 -0
  152. package/live/rate-limiter.d.ts +47 -0
  153. package/live/rate-limiter.js +159 -0
  154. package/live/reconciler.d.ts +39 -0
  155. package/live/reconciler.js +175 -0
  156. package/live/setup-buckets.d.ts +7 -0
  157. package/live/setup-buckets.js +33 -0
  158. package/live/slippage-tracker.d.ts +45 -0
  159. package/live/slippage-tracker.js +78 -0
  160. package/live/stop-watcher.d.ts +34 -0
  161. package/live/stop-watcher.js +158 -0
  162. package/live/user-data-active-probe.d.ts +54 -0
  163. package/live/user-data-active-probe.js +180 -0
  164. package/live/user-data-stream-controller.d.ts +200 -0
  165. package/live/user-data-stream-controller.js +579 -0
  166. package/live/user-data-stream-ws.d.ts +22 -0
  167. package/live/user-data-stream-ws.js +63 -0
  168. package/live/user-data-stream.d.ts +243 -0
  169. package/live/user-data-stream.js +704 -0
  170. package/logger.d.ts +2 -0
  171. package/logger.js +2 -0
  172. package/mfe.d.ts +21 -0
  173. package/mfe.js +68 -0
  174. package/onboarding/mode-ladder.d.ts +1 -0
  175. package/onboarding/mode-ladder.js +3 -0
  176. package/onboarding/runtime.d.ts +71 -0
  177. package/onboarding/runtime.js +153 -0
  178. package/openclaw.plugin.json +94 -0
  179. package/package.json +27 -0
  180. package/paper-adapter.d.ts +24 -0
  181. package/paper-adapter.js +91 -0
  182. package/persistence/state-manager.d.ts +42 -0
  183. package/persistence/state-manager.js +164 -0
  184. package/pinned-plan.d.ts +9 -0
  185. package/pinned-plan.js +23 -0
  186. package/risk/pre-trade-check.d.ts +38 -0
  187. package/risk/pre-trade-check.js +345 -0
  188. package/risk/pre-trade-types.d.ts +60 -0
  189. package/risk/pre-trade-types.js +3 -0
  190. package/scripts/assemble.mjs +114 -0
  191. package/shadow/shadow-tracker.d.ts +36 -0
  192. package/shadow/shadow-tracker.js +151 -0
  193. package/shadow/types.d.ts +42 -0
  194. package/shadow/types.js +20 -0
  195. package/shared/indicators-extended.d.ts +52 -0
  196. package/shared/indicators-extended.js +291 -0
  197. package/shared/indicators.d.ts +15 -0
  198. package/shared/indicators.js +114 -0
  199. package/signals/conditions/registry.d.ts +16 -0
  200. package/signals/conditions/registry.js +1274 -0
  201. package/signals/conditions/types.d.ts +1 -0
  202. package/signals/conditions/types.js +4 -0
  203. package/signals/direction-rules.d.ts +3 -0
  204. package/signals/direction-rules.js +24 -0
  205. package/signals/entry-rules.d.ts +6 -0
  206. package/signals/entry-rules.js +33 -0
  207. package/signals/serialize-context.d.ts +4 -0
  208. package/signals/serialize-context.js +39 -0
  209. package/signals/stop-rules.d.ts +3 -0
  210. package/signals/stop-rules.js +48 -0
  211. package/signals/strategy-adapter.d.ts +14 -0
  212. package/signals/strategy-adapter.js +122 -0
  213. package/signals/types.d.ts +1 -0
  214. package/signals/types.js +8 -0
  215. package/simulator/exchange-simulator.d.ts +93 -0
  216. package/simulator/exchange-simulator.js +684 -0
  217. package/simulator/fill-engine.d.ts +53 -0
  218. package/simulator/fill-engine.js +276 -0
  219. package/simulator/paper-market-feed.d.ts +26 -0
  220. package/simulator/paper-market-feed.js +104 -0
  221. package/simulator/realistic-fills.d.ts +59 -0
  222. package/simulator/realistic-fills.js +175 -0
  223. package/simulator/types.d.ts +219 -0
  224. package/simulator/types.js +43 -0
  225. package/skills/reefclaw/SKILL.md +97 -0
  226. package/strategy/builtin-strategies.d.ts +2 -0
  227. package/strategy/builtin-strategies.js +109 -0
  228. package/strategy/condition-registry.d.ts +3 -0
  229. package/strategy/condition-registry.js +153 -0
  230. package/strategy/evaluator.d.ts +67 -0
  231. package/strategy/evaluator.js +93 -0
  232. package/tools/assessment-validation.d.ts +118 -0
  233. package/tools/assessment-validation.js +415 -0
  234. package/tools/attach-brackets.d.ts +34 -0
  235. package/tools/attach-brackets.js +363 -0
  236. package/tools/audit-bracket-protection.d.ts +49 -0
  237. package/tools/audit-bracket-protection.js +527 -0
  238. package/tools/cancel-all-orders.d.ts +7 -0
  239. package/tools/cancel-all-orders.js +5 -0
  240. package/tools/cancel-order.d.ts +10 -0
  241. package/tools/cancel-order.js +14 -0
  242. package/tools/check-position-health.d.ts +46 -0
  243. package/tools/check-position-health.js +194 -0
  244. package/tools/clear-exchange-credentials.d.ts +24 -0
  245. package/tools/clear-exchange-credentials.js +70 -0
  246. package/tools/close-position.d.ts +22 -0
  247. package/tools/close-position.js +449 -0
  248. package/tools/create-order.d.ts +54 -0
  249. package/tools/create-order.js +338 -0
  250. package/tools/exit-gate.d.ts +58 -0
  251. package/tools/exit-gate.js +162 -0
  252. package/tools/fetch-balance.d.ts +5 -0
  253. package/tools/fetch-balance.js +4 -0
  254. package/tools/fetch-ohlcv.d.ts +11 -0
  255. package/tools/fetch-ohlcv.js +8 -0
  256. package/tools/fetch-open-orders.d.ts +7 -0
  257. package/tools/fetch-open-orders.js +4 -0
  258. package/tools/fetch-positions.d.ts +7 -0
  259. package/tools/fetch-positions.js +4 -0
  260. package/tools/fetch-ticker.d.ts +11 -0
  261. package/tools/fetch-ticker.js +5 -0
  262. package/tools/get-agent-profile.d.ts +4 -0
  263. package/tools/get-agent-profile.js +6 -0
  264. package/tools/get-analytics.d.ts +6 -0
  265. package/tools/get-analytics.js +7 -0
  266. package/tools/get-backtest.d.ts +12 -0
  267. package/tools/get-backtest.js +91 -0
  268. package/tools/get-basis.d.ts +7 -0
  269. package/tools/get-basis.js +7 -0
  270. package/tools/get-bracket-config.d.ts +11 -0
  271. package/tools/get-bracket-config.js +24 -0
  272. package/tools/get-cascade-risk.d.ts +7 -0
  273. package/tools/get-cascade-risk.js +8 -0
  274. package/tools/get-crypto-metrics.d.ts +18 -0
  275. package/tools/get-crypto-metrics.js +45 -0
  276. package/tools/get-cvd.d.ts +6 -0
  277. package/tools/get-cvd.js +6 -0
  278. package/tools/get-divergences.d.ts +6 -0
  279. package/tools/get-divergences.js +6 -0
  280. package/tools/get-funding-context.d.ts +6 -0
  281. package/tools/get-funding-context.js +16 -0
  282. package/tools/get-liquidation-levels.d.ts +7 -0
  283. package/tools/get-liquidation-levels.js +7 -0
  284. package/tools/get-liquidation-pulse.d.ts +9 -0
  285. package/tools/get-liquidation-pulse.js +22 -0
  286. package/tools/get-market-breadth.d.ts +6 -0
  287. package/tools/get-market-breadth.js +8 -0
  288. package/tools/get-market-intel.d.ts +19 -0
  289. package/tools/get-market-intel.js +116 -0
  290. package/tools/get-market-structure.d.ts +47 -0
  291. package/tools/get-market-structure.js +198 -0
  292. package/tools/get-my-mined-patterns.d.ts +20 -0
  293. package/tools/get-my-mined-patterns.js +61 -0
  294. package/tools/get-my-proposed-learnings.d.ts +20 -0
  295. package/tools/get-my-proposed-learnings.js +55 -0
  296. package/tools/get-my-recent-reviews.d.ts +22 -0
  297. package/tools/get-my-recent-reviews.js +66 -0
  298. package/tools/get-orderbook.d.ts +21 -0
  299. package/tools/get-orderbook.js +32 -0
  300. package/tools/get-pattern-scan.d.ts +7 -0
  301. package/tools/get-pattern-scan.js +8 -0
  302. package/tools/get-regime.d.ts +6 -0
  303. package/tools/get-regime.js +7 -0
  304. package/tools/get-relevant-learnings.d.ts +21 -0
  305. package/tools/get-relevant-learnings.js +65 -0
  306. package/tools/get-resting-liquidity.d.ts +6 -0
  307. package/tools/get-resting-liquidity.js +11 -0
  308. package/tools/get-risk-scenario.d.ts +29 -0
  309. package/tools/get-risk-scenario.js +47 -0
  310. package/tools/get-risk-summary.d.ts +51 -0
  311. package/tools/get-risk-summary.js +118 -0
  312. package/tools/get-sentiment.d.ts +4 -0
  313. package/tools/get-sentiment.js +6 -0
  314. package/tools/get-session-review.d.ts +7 -0
  315. package/tools/get-session-review.js +8 -0
  316. package/tools/get-setup-detail.d.ts +7 -0
  317. package/tools/get-setup-detail.js +303 -0
  318. package/tools/get-signals.d.ts +15 -0
  319. package/tools/get-signals.js +54 -0
  320. package/tools/get-sizing.d.ts +6 -0
  321. package/tools/get-sizing.js +6 -0
  322. package/tools/get-trade-feedback.d.ts +7 -0
  323. package/tools/get-trade-feedback.js +8 -0
  324. package/tools/get-trade-flow.d.ts +7 -0
  325. package/tools/get-trade-flow.js +7 -0
  326. package/tools/get-volume-analysis.d.ts +21 -0
  327. package/tools/get-volume-analysis.js +74 -0
  328. package/tools/get-volume-profile.d.ts +7 -0
  329. package/tools/get-volume-profile.js +7 -0
  330. package/tools/helpers.d.ts +25 -0
  331. package/tools/helpers.js +38 -0
  332. package/tools/intel-api.d.ts +14 -0
  333. package/tools/intel-api.js +52 -0
  334. package/tools/intel-cache.d.ts +25 -0
  335. package/tools/intel-cache.js +133 -0
  336. package/tools/list-strategies.d.ts +7 -0
  337. package/tools/list-strategies.js +6 -0
  338. package/tools/modify-stop.d.ts +17 -0
  339. package/tools/modify-stop.js +81 -0
  340. package/tools/modify-target.d.ts +17 -0
  341. package/tools/modify-target.js +71 -0
  342. package/tools/propose-learning.d.ts +22 -0
  343. package/tools/propose-learning.js +65 -0
  344. package/tools/query-review-outcomes.d.ts +30 -0
  345. package/tools/query-review-outcomes.js +64 -0
  346. package/tools/query-trades.d.ts +21 -0
  347. package/tools/query-trades.js +37 -0
  348. package/tools/record-position-reviews.d.ts +38 -0
  349. package/tools/record-position-reviews.js +147 -0
  350. package/tools/save-strategy.d.ts +16 -0
  351. package/tools/save-strategy.js +46 -0
  352. package/tools/scan-pairs.d.ts +18 -0
  353. package/tools/scan-pairs.js +220 -0
  354. package/tools/score-setup.d.ts +31 -0
  355. package/tools/score-setup.js +268 -0
  356. package/tools/set-bracket-requirement.d.ts +18 -0
  357. package/tools/set-bracket-requirement.js +81 -0
  358. package/tools/set-exchange-credentials.d.ts +25 -0
  359. package/tools/set-exchange-credentials.js +80 -0
  360. package/tools/set-trading-mode.d.ts +26 -0
  361. package/tools/set-trading-mode.js +135 -0
  362. package/tools/test-exchange-credentials.d.ts +16 -0
  363. package/tools/test-exchange-credentials.js +100 -0
  364. package/tools/toggle-strategy.d.ts +8 -0
  365. package/tools/toggle-strategy.js +8 -0
  366. package/trading-params-cache.d.ts +26 -0
  367. package/trading-params-cache.js +52 -0
  368. package/types.d.ts +110 -0
  369. package/types.js +7 -0
  370. package/util/plugin-paths.d.ts +3 -0
  371. package/util/plugin-paths.js +15 -0
@@ -0,0 +1,243 @@
1
+ import { EventEmitter } from 'node:events';
2
+ import type { BinancePrivateApi } from '../ccxt/binance-private.js';
3
+ import { ListenKeyManager } from './listen-key-manager.js';
4
+ import type { ListenKeyManagerOptions } from './listen-key-manager.js';
5
+ import type { ParsedAccountUpdate, ParsedOrderUpdate } from './live-state-store.js';
6
+ /** Minimal WebSocket shape we depend on — matches both the `ws` library and
7
+ * the browser WebSocket. Tests implement this directly. */
8
+ export interface StreamWebSocket {
9
+ on(event: 'open', cb: () => void): void;
10
+ on(event: 'close', cb: (code?: number, reason?: Buffer | string) => void): void;
11
+ on(event: 'error', cb: (err: Error) => void): void;
12
+ on(event: 'message', cb: (data: Buffer | string) => void): void;
13
+ on(event: 'ping', cb: (data: Buffer) => void): void;
14
+ on(event: 'pong', cb: (data: Buffer) => void): void;
15
+ /** Close the connection gracefully. Safe to call if already closed. */
16
+ close(code?: number, reason?: string): void;
17
+ /** Called to reply to server pings. Most WS clients auto-pong; we expose
18
+ * this for tests + for when the client library doesn't. */
19
+ pong?(data?: Buffer): void;
20
+ /** Force-terminate (no TCP FIN). Fallback for stuck sockets. */
21
+ terminate?(): void;
22
+ }
23
+ export type WebSocketFactory = (url: string) => StreamWebSocket;
24
+ export interface StreamTimerDeps {
25
+ setTimeout: (fn: () => void, ms: number) => ReturnType<typeof setTimeout>;
26
+ clearTimeout: (handle: ReturnType<typeof setTimeout>) => void;
27
+ setInterval: (fn: () => void, ms: number) => ReturnType<typeof setInterval>;
28
+ clearInterval: (handle: ReturnType<typeof setInterval>) => void;
29
+ now: () => number;
30
+ /** Used for jittered backoff. Tests override with a deterministic RNG. */
31
+ random: () => number;
32
+ }
33
+ export interface UserDataStreamOptions {
34
+ /** Mainnet: 'wss://fstream.binance.com/private/ws'. Testnet: 'wss://stream.binancefuture.com/ws'.
35
+ * The listenKey is appended at connect time. Do NOT include trailing slash. */
36
+ wsBaseUrl: string;
37
+ /** Injection — produces a StreamWebSocket given the full URL. */
38
+ webSocketFactory: WebSocketFactory;
39
+ /** ListenKeyManager-compat options passed through. */
40
+ listenKey?: ListenKeyManagerOptions;
41
+ /** Reconnect backoff base. Default 1000 ms. */
42
+ reconnectBaseMs?: number;
43
+ /** Reconnect backoff cap. Default 60000 ms. */
44
+ reconnectCapMs?: number;
45
+ /** Fractional jitter applied to each reconnect delay. Default 0.2 (±20%). */
46
+ reconnectJitterPct?: number;
47
+ /** Dead-socket watchdog. Compares the configured threshold against the
48
+ * most recent INCOMING FRAME of any kind — `message`, `ping`, or `pong`
49
+ * (tracked as `lastFrameAt`), NOT just data-bearing message frames. Binance
50
+ * documents server pings every 3 min on the user-data stream
51
+ * (developers.binance.com → futures websocket-market-streams); counting
52
+ * them as liveness signals means a calm account (no fills, stable balance)
53
+ * doesn't trip the watchdog.
54
+ *
55
+ * Default 6 min — comfortably above the 180 s ping interval, comfortably
56
+ * below Binance's own 10-min no-pong cutoff. The watchdog is the
57
+ * "TCP-is-actually-dead" safety net; the active REST probe (60 s tick,
58
+ * see UserDataActiveProbe) is the canonical "events stopped arriving"
59
+ * detector for missed fills on open positions. */
60
+ staleEventWatchdogMs?: number;
61
+ /** Alert thresholds on consecutive reconnect attempts. */
62
+ warnThreshold?: number;
63
+ errorThreshold?: number;
64
+ fatalThreshold?: number;
65
+ /** Injection — timers + RNG. Defaults to real. */
66
+ timers?: Partial<StreamTimerDeps>;
67
+ /** Injection — testability. Tests supply a fake ListenKeyManager. */
68
+ listenKeyManagerFactory?: (api: BinancePrivateApi, opts: ListenKeyManagerOptions | undefined) => ListenKeyManager;
69
+ /** Translate Binance raw market IDs (`BTCUSDT`) back to unified CCXT
70
+ * symbols (`BTC/USDT`) before emitting. Defaults to `api.symbolFromMarketId`
71
+ * which uses CCXT's market cache. Identity function for unit tests that
72
+ * don't care about symbol shape. */
73
+ symbolTranslator?: (marketId: string) => string;
74
+ }
75
+ export type StreamStatus = 'stopped' | 'connecting' | 'open' | 'reconnecting';
76
+ export interface StreamHealth {
77
+ status: StreamStatus;
78
+ currentListenKey: string | null;
79
+ /** Last `message` frame timestamp (data event from Binance). Drives the
80
+ * active REST probe's freshness check. Null until first frame after
81
+ * (re)connect. */
82
+ lastEventAt: number | null;
83
+ /** Last frame of ANY kind — message, ping, or pong. Drives the dead-socket
84
+ * watchdog. Distinct from `lastEventAt` because Binance pings every 3 min
85
+ * on the user-data stream regardless of account activity, and those pings
86
+ * are the only liveness signal an idle account ever gets. */
87
+ lastFrameAt: number | null;
88
+ lastConnectedAt: number | null;
89
+ consecutiveReconnectAttempts: number;
90
+ totalReconnects: number;
91
+ }
92
+ export type UserDataStreamEvents = {
93
+ /** WS opened successfully. Parent should run a REST snapshot and seed the store. */
94
+ connected: () => void;
95
+ /** WS closed. `willReconnect` is false only for a manual stop(). */
96
+ disconnected: (reason: string, willReconnect: boolean) => void;
97
+ /** Emitted every time we're about to attempt a reconnect. Useful for metrics. */
98
+ reconnecting: (attempt: number, delayMs: number) => void;
99
+ /** ACCOUNT_UPDATE event — positions + balance deltas. */
100
+ accountUpdate: (ev: ParsedAccountUpdate) => void;
101
+ /** ORDER_TRADE_UPDATE event — single order state transition. */
102
+ orderUpdate: (ev: ParsedOrderUpdate) => void;
103
+ /** ALGO_UPDATE event — single algo/conditional order state transition
104
+ * (STOP_MARKET / TAKE_PROFIT_MARKET / TRAILING_STOP_MARKET). Binance does
105
+ * NOT route these through ORDER_TRADE_UPDATE — they have their own event
106
+ * type that we previously swallowed at the `default` branch. Downstream
107
+ * listeners use this to detect bracket-leg cancellation by the exchange. */
108
+ algoUpdate: (ev: ParsedAlgoUpdate) => void;
109
+ /** MARGIN_CALL event — pre-liquidation warning. Advisory. */
110
+ marginCall: (ev: ParsedMarginCall) => void;
111
+ /** ACCOUNT_CONFIG_UPDATE event — leverage/margin-mode changes. Operator-visible. */
112
+ accountConfigUpdate: (ev: ParsedAccountConfigUpdate) => void;
113
+ /** Server-sent listenKey expiry notice. We re-mint + reconnect automatically. */
114
+ listenKeyExpired: () => void;
115
+ /** Forced reconnect due to staleness watchdog (no events for too long). */
116
+ staleForcedReconnect: (idleMs: number) => void;
117
+ /** Parent should run a REST snapshot + re-seed the store. Emitted on every
118
+ * successful (re)connect AFTER 'connected' — gives a distinct hook for
119
+ * resync logic that doesn't also fire on first connect (which uses the
120
+ * 'connected' hook). */
121
+ resyncRequired: (cause: 'reconnect' | 'listen_key_rotation') => void;
122
+ };
123
+ export interface ParsedMarginCall {
124
+ eventTime: number;
125
+ crossWallet: number;
126
+ positions: Array<{
127
+ symbol: string;
128
+ positionSide: 'LONG' | 'SHORT' | 'BOTH';
129
+ positionAmt: number;
130
+ marginType: 'cross' | 'isolated';
131
+ isolatedWallet: number;
132
+ markPrice: number;
133
+ unrealizedPnl: number;
134
+ maintMargin: number;
135
+ }>;
136
+ }
137
+ export interface ParsedAccountConfigUpdate {
138
+ eventTime: number;
139
+ /** Which section changed. Binance sends either `ac` (leverage) or `ai`
140
+ * (account-level multi-asset mode). We surface both under one type. */
141
+ kind: 'leverage' | 'multi_asset_mode' | 'other';
142
+ symbol?: string;
143
+ leverage?: number;
144
+ multiAssetMode?: boolean;
145
+ }
146
+ /** Parsed ALGO_UPDATE event. Mirrors Binance Futures' conditional-order
147
+ * user-data frame for STOP_MARKET / TAKE_PROFIT_MARKET / TRAILING_STOP_MARKET.
148
+ * Field shape VERIFIED 2026-05-15 against the authoritative doc
149
+ * (developers.binance.com → USD-M Futures → User Data Streams → Event Algo
150
+ * Order Update) + a raw prod capture. Binance wraps the algo-order detail
151
+ * under the **`o`** key (NOT `ao`/`a` — the original guess was wrong and
152
+ * parsed nothing). Status `X` semantics that matter downstream:
153
+ * CANCELED = manual cancel (our explicit cancelOrder); EXPIRED = system
154
+ * cancel (e.g. position closed → Binance auto-cancels the sibling).
155
+ *
156
+ * The 2026-05-15 ATOM/SOL/LINK bracket-spiral incident traced to this event
157
+ * being silently swallowed at the `default` case in `handleFrame`. Listeners
158
+ * should still treat `status` defensively (Binance has added new states
159
+ * without notice — e.g. 2024's `EXPIRED_IN_MATCH`). The original raw payload is
160
+ * preserved under `raw` so post-hoc analysis can recover missing fields. */
161
+ export interface ParsedAlgoUpdate {
162
+ eventTime: number;
163
+ transactionTime: number;
164
+ symbol: string;
165
+ algoId: string;
166
+ clientAlgoId: string | null;
167
+ side: 'buy' | 'sell';
168
+ /** Binance's documented enum: STOP_MARKET, TAKE_PROFIT_MARKET,
169
+ * TRAILING_STOP_MARKET. Forwarded verbatim, uppercased. */
170
+ orderType: string;
171
+ /** Binance's documented enum: NEW, WORKING, TRIGGERED, FINISHED,
172
+ * CANCELED, EXPIRED, REJECTED. Forwarded verbatim, uppercased. */
173
+ status: string;
174
+ triggerPrice: number | null;
175
+ quantity: number;
176
+ reduceOnly: boolean;
177
+ /** Binance's optional `r` field — string reason on terminal states like
178
+ * `CANCELED_BY_EXCHANGE`, `MARGIN_CHECK_FAILED`, etc. Undefined when
179
+ * Binance doesn't supply one. Useful for diagnosing auto-cancel. */
180
+ reason?: string;
181
+ /** Full raw event for first-N debug logging and for fields we don't model
182
+ * yet. Don't read this in production code — add a typed accessor instead. */
183
+ raw: Record<string, unknown>;
184
+ }
185
+ export declare class UserDataStream extends EventEmitter {
186
+ private readonly api;
187
+ private readonly opts;
188
+ private readonly webSocketFactory;
189
+ private readonly timers;
190
+ private readonly listenKeyManager;
191
+ private readonly translateSymbol;
192
+ private ws;
193
+ private status;
194
+ private reconnectTimer;
195
+ private watchdogInterval;
196
+ private lastEventAt;
197
+ private lastFrameAt;
198
+ private lastConnectedAt;
199
+ private consecutiveReconnects;
200
+ private totalReconnects;
201
+ private stopRequested;
202
+ private firstConnect;
203
+ /** First-N raw ALGO_UPDATE payloads logged at INFO so operators can verify
204
+ * the parser against real Binance traffic without scraping the WS at
205
+ * TRACE. Capped to avoid log volume; resets per process restart. */
206
+ private algoUpdateRawLogged;
207
+ private static readonly ALGO_UPDATE_RAW_LOG_CAP;
208
+ constructor(api: BinancePrivateApi, options: UserDataStreamOptions);
209
+ /** Start the stream. Idempotent — returns immediately if already running. */
210
+ start(): Promise<void>;
211
+ /** Graceful stop. Closes WS + stops listenKey. Idempotent. */
212
+ stop(): Promise<void>;
213
+ /** Current health snapshot for observability. */
214
+ getHealth(): StreamHealth;
215
+ /** Whether the stream is currently open. Convenience for tests + callers. */
216
+ isConnected(): boolean;
217
+ private openConnection;
218
+ private attachWsHandlers;
219
+ private handleFrame;
220
+ private scheduleReconnect;
221
+ private computeBackoffMs;
222
+ private clearReconnectTimer;
223
+ /** Force a reconnect now — used when the server tells us the key expired
224
+ * or when the listenKey keep-alive loop gives up.
225
+ *
226
+ * Invariant: the close handler is responsible for clearing `this.ws`,
227
+ * stopping the listenKey loop, and scheduling the reconnect. We only
228
+ * trigger close() here and let the handler run. If there's no socket to
229
+ * close (manager dropped out-of-band), we schedule directly. */
230
+ private forceReconnect;
231
+ private startWatchdog;
232
+ /** External trigger for a reconnect — used by the active REST probe when
233
+ * it detects a fill that the WS missed. Same plumbing as the watchdog
234
+ * path; the close handler runs the reconnect schedule. */
235
+ requestReconnect(reason: string): void;
236
+ private stopWatchdog;
237
+ private setStatus;
238
+ }
239
+ export declare function parseAccountUpdate(obj: Record<string, unknown>, translateSymbol?: (id: string) => string): ParsedAccountUpdate | null;
240
+ export declare function parseOrderUpdate(obj: Record<string, unknown>, translateSymbol?: (id: string) => string): ParsedOrderUpdate | null;
241
+ export declare function parseMarginCall(obj: Record<string, unknown>, translateSymbol?: (id: string) => string): ParsedMarginCall | null;
242
+ export declare function parseAlgoUpdate(obj: Record<string, unknown>, translateSymbol?: (id: string) => string): ParsedAlgoUpdate | null;
243
+ export declare function parseAccountConfigUpdate(obj: Record<string, unknown>, translateSymbol?: (id: string) => string): ParsedAccountConfigUpdate | null;