@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,62 +0,0 @@
1
- import type { MarketContext, StrategyConfig, SignalCondition, Direction, SignalEvent, StrategyState } from '@reefclaw/shared';
2
- /** A locally-evaluated signal — the same shape the agent gets from the central engine. */
3
- export interface LocalSignal {
4
- symbol: string;
5
- strategy: string;
6
- direction: Direction;
7
- regime: string;
8
- regimeConfidence: number;
9
- /** Fraction of conditions met, 0..1. */
10
- confluenceScore: number;
11
- conditions: SignalCondition[];
12
- entryZone: {
13
- low: number;
14
- high: number;
15
- };
16
- stopLevel: number;
17
- targets: number[];
18
- /** ms epoch the signal fired. */
19
- firedAt: number;
20
- }
21
- export interface EvaluatorParams {
22
- /** Min fraction of conditions met to fire (intel default 1.0). */
23
- confluenceThreshold: number;
24
- /** Floor applied to each strategy's minConfidence (intel: per-user trading param). */
25
- regimeConfidenceFloor: number;
26
- /** Min ms between identical (strategy, symbol, direction) signals. */
27
- cooldownMs: number;
28
- }
29
- export declare const DEFAULT_EVALUATOR_PARAMS: EvaluatorParams;
30
- /**
31
- * Evaluates the user's strategies locally against incoming fact-contexts.
32
- *
33
- * Single-tenant (one plugin == one user), so cooldown state is keyed
34
- * `strategy:symbol:direction` — there is no user dimension, unlike the central
35
- * engine. Higher-timeframe tick gating lives inside the shared strategy-adapter
36
- * (module-level), so a strategy only re-evaluates once per closed primary-tf bar.
37
- */
38
- export declare class LocalStrategyEvaluator {
39
- /** `strategy:symbol:direction` → last fired ms. */
40
- private readonly cooldowns;
41
- /**
42
- * Full per-symbol snapshot — every strategy's state (whether or not it fired)
43
- * plus the signals that fired this evaluation. A faithful mirror of
44
- * intelligence/src/signals/engine.ts:evaluateSymbol (regime gate → state;
45
- * evaluate → confluence → state; confluence + cooldown → SignalEvent), minus
46
- * the intel-only side effects (DB persist, mission create, degradation gate).
47
- *
48
- * `now` is injected for determinism/testability — pass `Date.now()` live.
49
- */
50
- evaluateSnapshot(ctx: MarketContext, strategies: StrategyConfig[], now: number, params?: EvaluatorParams): Promise<{
51
- states: StrategyState[];
52
- signals: SignalEvent[];
53
- }>;
54
- /**
55
- * Convenience wrapper that returns only the fired signals as LocalSignal[].
56
- * Thin layer over evaluateSnapshot so there is a single source of evaluation
57
- * logic.
58
- */
59
- evaluate(ctx: MarketContext, strategies: StrategyConfig[], now: number, params?: EvaluatorParams): Promise<LocalSignal[]>;
60
- /** Clear cooldown state (e.g. when the strategy set changes). */
61
- reset(): void;
62
- }
@@ -1,131 +0,0 @@
1
- // Plugin-side strategy evaluator — facts-out (docs/FACTS_OUT_ARCHITECTURE.md) step 3b.
2
- //
3
- // Runs strategy evaluation LOCALLY in the plugin instead of calling the central
4
- // intel signal engine. It runs the SAME shared evaluation core (adaptStrategy →
5
- // conditions + direction/entry/stop rules; PRs #42–44) that intel runs, then
6
- // applies the engine's thin orchestration — regime gate → confluence → cooldown
7
- // — to produce the same signal shape the agent receives today. This is a
8
- // faithful mirror of intelligence/src/signals/engine.ts:evaluateSymbol, minus
9
- // the intel-only concerns (DB persistence, mission creation, per-user passes,
10
- // degradation gate).
11
- //
12
- // NOT wired into the heartbeat yet — the SSE fact stream (step 4) feeds it.
13
- // Built + tested standalone; rollout will be shadow (compare vs the central
14
- // engine) → enforce.
15
- import { adaptStrategy } from '../signals/strategy-adapter.js';
16
- export const DEFAULT_EVALUATOR_PARAMS = {
17
- confluenceThreshold: 1.0,
18
- regimeConfidenceFloor: 0,
19
- cooldownMs: 300_000,
20
- };
21
- /**
22
- * Evaluates the user's strategies locally against incoming fact-contexts.
23
- *
24
- * Single-tenant (one plugin == one user), so cooldown state is keyed
25
- * `strategy:symbol:direction` — there is no user dimension, unlike the central
26
- * engine. Higher-timeframe tick gating lives inside the shared strategy-adapter
27
- * (module-level), so a strategy only re-evaluates once per closed primary-tf bar.
28
- */
29
- export class LocalStrategyEvaluator {
30
- /** `strategy:symbol:direction` → last fired ms. */
31
- cooldowns = new Map();
32
- /**
33
- * Full per-symbol snapshot — every strategy's state (whether or not it fired)
34
- * plus the signals that fired this evaluation. A faithful mirror of
35
- * intelligence/src/signals/engine.ts:evaluateSymbol (regime gate → state;
36
- * evaluate → confluence → state; confluence + cooldown → SignalEvent), minus
37
- * the intel-only side effects (DB persist, mission create, degradation gate).
38
- *
39
- * `now` is injected for determinism/testability — pass `Date.now()` live.
40
- */
41
- async evaluateSnapshot(ctx, strategies, now, params = DEFAULT_EVALUATOR_PARAMS) {
42
- const states = [];
43
- const signals = [];
44
- for (const config of strategies) {
45
- const executionModel = config.executionModel;
46
- if (executionModel !== undefined && executionModel !== 'declarative') {
47
- continue;
48
- }
49
- const def = adaptStrategy(config);
50
- // Regime gate (engine.ts): effective floor is the LOWER of the strategy's
51
- // own minConfidence and the user's regimeConfidenceFloor.
52
- const effectiveMinConf = Math.min(def.minConfidence, params.regimeConfidenceFloor || def.minConfidence);
53
- if (!def.regimeWhitelist.includes(ctx.regime) || ctx.regimeConfidence < effectiveMinConf) {
54
- states.push({
55
- strategy: config.name,
56
- direction: null,
57
- regimeGated: true,
58
- regimeRequired: def.regimeWhitelist,
59
- currentRegime: ctx.regime,
60
- regimeConfidence: ctx.regimeConfidence,
61
- confluenceScore: 0,
62
- conditions: [],
63
- });
64
- continue;
65
- }
66
- const evaluation = await def.evaluate(ctx);
67
- const metCount = evaluation.conditions.filter((c) => c.met).length;
68
- const confluenceScore = evaluation.conditions.length > 0
69
- ? metCount / evaluation.conditions.length
70
- : 0;
71
- states.push({
72
- strategy: config.name,
73
- direction: evaluation.direction,
74
- regimeGated: false,
75
- regimeRequired: def.regimeWhitelist,
76
- currentRegime: ctx.regime,
77
- regimeConfidence: ctx.regimeConfidence,
78
- confluenceScore,
79
- conditions: evaluation.conditions,
80
- });
81
- // Confluence gate (engine.ts:339) + cooldown (engine.ts:342-346).
82
- if (confluenceScore >= params.confluenceThreshold && evaluation.direction && evaluation.trade) {
83
- const cooldownKey = `${config.name}:${ctx.symbol}:${evaluation.direction}`;
84
- const lastFired = this.cooldowns.get(cooldownKey) ?? 0;
85
- if (now - lastFired > params.cooldownMs) {
86
- this.cooldowns.set(cooldownKey, now);
87
- signals.push({
88
- signalId: `local-${ctx.symbol}-${config.name}-${now}`,
89
- timestamp: new Date(now).toISOString(),
90
- symbol: ctx.symbol,
91
- strategy: config.name,
92
- direction: evaluation.direction,
93
- regime: ctx.regime,
94
- regimeConfidence: ctx.regimeConfidence,
95
- confluenceScore,
96
- conditions: evaluation.conditions,
97
- entryZone: evaluation.trade.entryZone,
98
- stopLevel: evaluation.trade.stopLevel,
99
- targets: evaluation.trade.targets,
100
- });
101
- }
102
- }
103
- }
104
- return { states, signals };
105
- }
106
- /**
107
- * Convenience wrapper that returns only the fired signals as LocalSignal[].
108
- * Thin layer over evaluateSnapshot so there is a single source of evaluation
109
- * logic.
110
- */
111
- async evaluate(ctx, strategies, now, params = DEFAULT_EVALUATOR_PARAMS) {
112
- const { signals } = await this.evaluateSnapshot(ctx, strategies, now, params);
113
- return signals.map((s) => ({
114
- symbol: s.symbol,
115
- strategy: s.strategy,
116
- direction: s.direction,
117
- regime: s.regime,
118
- regimeConfidence: s.regimeConfidence,
119
- confluenceScore: s.confluenceScore,
120
- conditions: s.conditions,
121
- entryZone: s.entryZone,
122
- stopLevel: s.stopLevel,
123
- targets: s.targets,
124
- firedAt: now,
125
- }));
126
- }
127
- /** Clear cooldown state (e.g. when the strategy set changes). */
128
- reset() {
129
- this.cooldowns.clear();
130
- }
131
- }
@@ -1,54 +0,0 @@
1
- import { type IntelApiDeps } from '../tools/intel-api.js';
2
- export interface MicrostructureBlock {
3
- symbol: string;
4
- /** Smoothed (not yet — placeholder for v2) band imbalance at ±0.5 %.
5
- * Computed as bid_usd / (bid_usd + ask_usd) ∈ [0, 1]. 0.5 = balanced;
6
- * > 0.5 leans bid (more support); < 0.5 leans ask (more resistance). */
7
- restingBandImbalance05?: number;
8
- /** Reserved for v2 — true when imbalance held its sign for ≥ 3 samples.
9
- * Always false until the EMA layer lands. */
10
- persisted?: boolean;
11
- /** Rolling-60 s cross-symbol cascade classification. */
12
- cascadePulse60s?: 'quiet' | 'elevated' | 'active_cascade';
13
- /** Coverage in basis-points-of-percent ×100 (e.g. 150 = 1.5 %).
14
- * The webapp persists `coveragePctAtReview` as percent units, so the
15
- * ingest layer divides this by 100. */
16
- coverageBpc?: number;
17
- /** Net dominant-side reading from the pulse stream. */
18
- dominantSide?: 'long' | 'short' | 'balanced';
19
- /** Epoch ms of the source intel reading. */
20
- updatedAt?: number;
21
- }
22
- export interface MicrostructureAssembler {
23
- /** Returns null when the heartbeatPush flag is off or both upstream calls
24
- * failed. Partial results (one endpoint succeeded) yield a partial block. */
25
- forSymbol(symbol: string): Promise<MicrostructureBlock | null>;
26
- /** Returns a Map<symbol, block> for a set of symbols. Null entries are
27
- * omitted from the map. */
28
- forSymbols(symbols: string[]): Promise<Map<string, MicrostructureBlock>>;
29
- }
30
- /** No-op fallback used when no intel deps are wired. Kept for tests + as a
31
- * safety net during the activation ladder. */
32
- export declare class StubMicrostructureAssembler implements MicrostructureAssembler {
33
- forSymbol(_symbol: string): Promise<MicrostructureBlock | null>;
34
- forSymbols(_symbols: string[]): Promise<Map<string, MicrostructureBlock>>;
35
- }
36
- export interface IntelMicrostructureAssemblerOptions {
37
- intelDeps: IntelApiDeps;
38
- /** Override the cache TTL — tests use 0 to disable. */
39
- cacheTtlMs?: number;
40
- /** Test seam — the heartbeatPush flag reader. Defaults to the live config. */
41
- flagReader?: () => 'off' | 'on';
42
- /** Test seam — Date.now(). */
43
- now?: () => number;
44
- }
45
- export declare class IntelMicrostructureAssembler implements MicrostructureAssembler {
46
- private readonly intelDeps;
47
- private readonly cacheTtlMs;
48
- private readonly flagReader;
49
- private readonly now;
50
- private readonly cache;
51
- constructor(options: IntelMicrostructureAssemblerOptions);
52
- forSymbol(symbol: string): Promise<MicrostructureBlock | null>;
53
- forSymbols(symbols: string[]): Promise<Map<string, MicrostructureBlock>>;
54
- }
@@ -1,148 +0,0 @@
1
- // Microstructure heartbeat-push assembler.
2
- //
3
- // Builds a per-symbol microstructure context block (resting band imbalance,
4
- // cascade pulse, banded coverage) that the `record_position_reviews` tool
5
- // auto-attaches to each review row when `microstructure.heartbeatPush='on'`.
6
- // Without this, the agent must explicitly pass the orderbook fields (or the
7
- // review row's restingBandImbalance05 / cascadePulseAtReview / coveragePctAtReview
8
- // columns stay NULL).
9
- //
10
- // Sources both feeds from the intelligence VPS in parallel:
11
- // - GET /api/resting-liquidity/<symbol> → bands + coverage_pct
12
- // - GET /api/liquidation-pulse?symbol=<sym> → classification + dominant side
13
- //
14
- // Returns `null` for a symbol when:
15
- // - the heartbeatPush flag is off (legacy behaviour)
16
- // - intel responds with `enabled: false` on BOTH endpoints (no upstream data)
17
- // - both fetches fail (network error / timeout)
18
- // A partial result (one endpoint succeeded) yields a partial block — fields
19
- // from the failed call stay `undefined` rather than dropping the whole entry.
20
- //
21
- // Caching: per-symbol 30 s TTL. Heartbeats fire ~30 min apart, so the cache
22
- // almost never serves a hit during normal operation; its purpose is to dedupe
23
- // within-heartbeat repeat calls (e.g. an operator triggering a manual review
24
- // while a scheduled heartbeat is mid-flight).
25
- //
26
- // See docs/MARKET_MICROSTRUCTURE_STREAMS.md (intel-side) and
27
- // docs/POSITION_DECISION_JOURNAL_PLAN.md §11 (PR1 deferral #3).
28
- import { logger, formatError } from '../logger.js';
29
- import { loadMicrostructureHeartbeatPush } from '../config/position-review-config.js';
30
- import { fetchIntelApi, enc } from '../tools/intel-api.js';
31
- const TAG = 'microstructure-assembler';
32
- const DEFAULT_CACHE_TTL_MS = 30_000;
33
- /** Per-symbol concurrency cap to keep heartbeat round-trips bounded even on
34
- * many-symbol portfolios. 8 in-flight at once is well under the intel HTTP
35
- * pool budget; remaining symbols queue. */
36
- const MAX_PARALLEL = 8;
37
- /** No-op fallback used when no intel deps are wired. Kept for tests + as a
38
- * safety net during the activation ladder. */
39
- export class StubMicrostructureAssembler {
40
- async forSymbol(_symbol) {
41
- return null;
42
- }
43
- async forSymbols(_symbols) {
44
- return new Map();
45
- }
46
- }
47
- export class IntelMicrostructureAssembler {
48
- intelDeps;
49
- cacheTtlMs;
50
- flagReader;
51
- now;
52
- cache = new Map();
53
- constructor(options) {
54
- this.intelDeps = options.intelDeps;
55
- this.cacheTtlMs = options.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;
56
- this.flagReader = options.flagReader ?? loadMicrostructureHeartbeatPush;
57
- this.now = options.now ?? (() => Date.now());
58
- }
59
- async forSymbol(symbol) {
60
- if (this.flagReader() === 'off')
61
- return null;
62
- const ts = this.now();
63
- const canonical = canonicalSymbol(symbol);
64
- const cached = this.cache.get(canonical);
65
- if (cached && cached.expiresAt > ts)
66
- return cached.block;
67
- // Map canonical "BTC/USDT" → intel "BTCUSDT".
68
- const intelSymbol = canonical.replace('/', '');
69
- const [restingResult, pulseResult] = await Promise.allSettled([
70
- fetchIntelApi(`/api/resting-liquidity/${enc(intelSymbol)}`, this.intelDeps),
71
- fetchIntelApi(`/api/liquidation-pulse?symbol=${enc(intelSymbol)}&window_seconds=60`, this.intelDeps),
72
- ]);
73
- const block = { symbol: canonical, updatedAt: ts };
74
- let anySignal = false;
75
- if (restingResult.status === 'fulfilled') {
76
- const r = restingResult.value;
77
- if (!isErr(r) && r.enabled === true) {
78
- const bands = r.bands;
79
- const band05 = bands?.['0.5'];
80
- if (band05) {
81
- const total = (Number(band05.bid_usd) || 0) + (Number(band05.ask_usd) || 0);
82
- if (total > 0) {
83
- block.restingBandImbalance05 = (Number(band05.bid_usd) || 0) / total;
84
- anySignal = true;
85
- }
86
- }
87
- if (typeof r.coverage_pct === 'number' && Number.isFinite(r.coverage_pct)) {
88
- // Intel returns percent units (e.g. 1.5 for 1.5 %); we store as
89
- // basis-points-of-percent ×100 to preserve the assembler convention.
90
- block.coverageBpc = r.coverage_pct * 100;
91
- anySignal = true;
92
- }
93
- }
94
- }
95
- else {
96
- logger.warn(TAG, `resting-liquidity fetch failed for ${canonical}: ${formatError(restingResult.reason)}`);
97
- }
98
- if (pulseResult.status === 'fulfilled') {
99
- const p = pulseResult.value;
100
- if (!isErr(p) && p.enabled === true) {
101
- const cls = p.classification;
102
- if (cls === 'quiet' || cls === 'elevated' || cls === 'active_cascade') {
103
- block.cascadePulse60s = cls;
104
- anySignal = true;
105
- }
106
- const dom = p.dominantSide;
107
- if (dom === 'long' || dom === 'short' || dom === 'balanced') {
108
- block.dominantSide = dom;
109
- anySignal = true;
110
- }
111
- }
112
- }
113
- else {
114
- logger.warn(TAG, `liquidation-pulse fetch failed for ${canonical}: ${formatError(pulseResult.reason)}`);
115
- }
116
- block.persisted = false;
117
- if (!anySignal)
118
- return null;
119
- if (this.cacheTtlMs > 0) {
120
- this.cache.set(canonical, { block, expiresAt: ts + this.cacheTtlMs });
121
- }
122
- return block;
123
- }
124
- async forSymbols(symbols) {
125
- if (this.flagReader() === 'off' || symbols.length === 0) {
126
- return new Map();
127
- }
128
- const out = new Map();
129
- // Bounded parallelism — chunked Promise.all with cap MAX_PARALLEL.
130
- for (let i = 0; i < symbols.length; i += MAX_PARALLEL) {
131
- const chunk = symbols.slice(i, i + MAX_PARALLEL);
132
- const results = await Promise.all(chunk.map((s) => this.forSymbol(s)));
133
- for (let j = 0; j < chunk.length; j++) {
134
- const block = results[j];
135
- if (block)
136
- out.set(canonicalSymbol(chunk[j]), block);
137
- }
138
- }
139
- return out;
140
- }
141
- }
142
- function canonicalSymbol(s) {
143
- // Strip the Binance settle suffix (`BTC/USDT:USDT` → `BTC/USDT`).
144
- return s.replace(/:[A-Z]+$/, '');
145
- }
146
- function isErr(v) {
147
- return typeof v.error === 'string';
148
- }
@@ -1,29 +0,0 @@
1
- import { EventEmitter } from 'node:events';
2
- import type { IExchangeAdapter } from '../exchange-adapter.js';
3
- import type { CcxtOrder } from '../types.js';
4
- export interface OrderPollEvent {
5
- orderId: string;
6
- symbol: string;
7
- type: 'filled' | 'partial_fill' | 'canceled' | 'expired';
8
- order: CcxtOrder;
9
- previousFilled?: number;
10
- }
11
- export declare class OrderPoller extends EventEmitter {
12
- private polling;
13
- private safetyTimeouts;
14
- private adapter;
15
- private pollIntervalMs;
16
- private lastKnownFilled;
17
- constructor(adapter: IExchangeAdapter, pollIntervalMs?: number);
18
- /** Start polling for an order. */
19
- startPolling(orderId: string, symbol: string): void;
20
- /** Stop polling for an order. */
21
- stopPolling(orderId: string): void;
22
- /** Stop all polling. */
23
- stopAll(): void;
24
- /** Get all actively polled order IDs. */
25
- getPollingOrders(): string[];
26
- /** Number of orders being polled. */
27
- get activeCount(): number;
28
- private processOrderUpdate;
29
- }
@@ -1,125 +0,0 @@
1
- // Order poller — polls exchange for order status on live limit orders.
2
- // Detects fills, partial fills, and cancellations.
3
- import { EventEmitter } from 'node:events';
4
- import { logger, formatError } from '../logger.js';
5
- const TAG = 'order-poller';
6
- const DEFAULT_POLL_INTERVAL_MS = 5_000; // 5 seconds
7
- const MAX_POLL_DURATION_MS = 24 * 60 * 60 * 1000; // 24 hours safety timeout
8
- export class OrderPoller extends EventEmitter {
9
- polling = new Map();
10
- safetyTimeouts = new Map();
11
- adapter;
12
- pollIntervalMs;
13
- // Track previous fill amounts for partial fill detection
14
- lastKnownFilled = new Map();
15
- constructor(adapter, pollIntervalMs = DEFAULT_POLL_INTERVAL_MS) {
16
- super();
17
- this.adapter = adapter;
18
- this.pollIntervalMs = pollIntervalMs;
19
- }
20
- /** Start polling for an order. */
21
- startPolling(orderId, symbol) {
22
- if (this.polling.has(orderId)) {
23
- logger.warn(TAG, `Already polling order ${orderId}`);
24
- return;
25
- }
26
- logger.info(TAG, `Start polling order ${orderId} (${symbol})`);
27
- this.lastKnownFilled.set(orderId, 0);
28
- const interval = setInterval(async () => {
29
- try {
30
- const order = await this.adapter.fetchOrder(orderId, symbol);
31
- if (!order)
32
- return; // API error — skip this cycle
33
- this.processOrderUpdate(orderId, order);
34
- }
35
- catch (err) {
36
- logger.warn(TAG, `Poll error for ${orderId}: ${formatError(err)}`);
37
- }
38
- }, this.pollIntervalMs);
39
- this.polling.set(orderId, interval);
40
- // Safety timeout: stop polling after 24h
41
- const safetyTimeout = setTimeout(() => {
42
- logger.warn(TAG, `Safety timeout reached for order ${orderId} — stopping poll`);
43
- this.stopPolling(orderId);
44
- }, MAX_POLL_DURATION_MS);
45
- this.safetyTimeouts.set(orderId, safetyTimeout);
46
- }
47
- /** Stop polling for an order. */
48
- stopPolling(orderId) {
49
- const interval = this.polling.get(orderId);
50
- if (interval) {
51
- clearInterval(interval);
52
- this.polling.delete(orderId);
53
- }
54
- const timeout = this.safetyTimeouts.get(orderId);
55
- if (timeout) {
56
- clearTimeout(timeout);
57
- this.safetyTimeouts.delete(orderId);
58
- }
59
- this.lastKnownFilled.delete(orderId);
60
- }
61
- /** Stop all polling. */
62
- stopAll() {
63
- for (const orderId of this.polling.keys()) {
64
- this.stopPolling(orderId);
65
- }
66
- }
67
- /** Get all actively polled order IDs. */
68
- getPollingOrders() {
69
- return Array.from(this.polling.keys());
70
- }
71
- /** Number of orders being polled. */
72
- get activeCount() {
73
- return this.polling.size;
74
- }
75
- // ---- Internal ----
76
- processOrderUpdate(orderId, order) {
77
- const previousFilled = this.lastKnownFilled.get(orderId) ?? 0;
78
- // CCXT's runtime status set is wider than CcxtOrder's compile-time union:
79
- // Binance EXPIRED / EXPIRED_IN_MATCH surface as 'expired' (and 'rejected'
80
- // exists on other venues). Compare on the runtime string so an unmodelled
81
- // terminal status can never leave the poller running for the full 24h
82
- // safety timeout with no terminal event ever emitted.
83
- const status = String(order.status);
84
- if (status === 'closed') {
85
- // Fully filled
86
- this.emit('order_event', {
87
- orderId,
88
- symbol: order.symbol,
89
- type: 'filled',
90
- order,
91
- previousFilled,
92
- });
93
- this.stopPolling(orderId);
94
- logger.info(TAG, `Order ${orderId} FILLED: ${order.filled} @ ${order.average}`);
95
- }
96
- else if (status !== 'open') {
97
- // canceled / expired / rejected / any future non-open status — the
98
- // order can never fill further; emit the matching terminal event and
99
- // stop. Only a literal 'open' keeps the poll alive.
100
- const type = status === 'expired' ? 'expired' : 'canceled';
101
- this.emit('order_event', {
102
- orderId,
103
- symbol: order.symbol,
104
- type,
105
- order,
106
- previousFilled,
107
- });
108
- this.stopPolling(orderId);
109
- logger.info(TAG, `Order ${orderId} ${status.toUpperCase()} (filled: ${order.filled})`);
110
- }
111
- else if (order.filled > previousFilled) {
112
- // Partial fill — still open but more filled
113
- this.lastKnownFilled.set(orderId, order.filled);
114
- this.emit('order_event', {
115
- orderId,
116
- symbol: order.symbol,
117
- type: 'partial_fill',
118
- order,
119
- previousFilled,
120
- });
121
- logger.info(TAG, `Order ${orderId} PARTIAL FILL: ${previousFilled} → ${order.filled}`);
122
- }
123
- // else: no change, keep polling
124
- }
125
- }
@@ -1,83 +0,0 @@
1
- export interface PositionStateEntry {
2
- /** Canonical symbol form (no settle suffix). */
3
- symbol: string;
4
- /** Authoritative position-open timestamp (epoch ms). Used as the webapp's
5
- * natural-key column alongside (userId, symbol). */
6
- openedAt: number;
7
- side: 'long' | 'short';
8
- /** UUID returned from POST /api/internal/positions. May be undefined briefly
9
- * between local detection and the first successful upsert. */
10
- webappPositionId?: string;
11
- /** exchangeTradeId of the opening fill (audit trail). */
12
- openedFromExchangeTradeId?: string;
13
- /** Last record_position_reviews call timestamp (epoch ms). Drives stale-gate. */
14
- lastReviewAt?: number;
15
- lastVerdict?: 'hold' | 'add_on' | 'close_recommended';
16
- /** Last thesis_status from the most recent review. Drives the exit-gate's
17
- * review-override check (see docs/EXIT_GATE_DESIGN.md §3). */
18
- lastThesisStatus?: 'intact' | 'weakening' | 'invalidated' | 'evolving';
19
- /** Remaining open contracts, tracked from opening fills (+) and reduce-only
20
- * exit fills (−). Lets the auto-capture pipeline detect when a position goes
21
- * flat via a bracket SL/TP or other reduce-only fill — the close-bypass path
22
- * that otherwise never reaches close_position — and journal an exact close.
23
- * Optional: entries opened before this field existed (or before a restart)
24
- * are seeded from exchange truth at boot (seedRemainingContracts). When
25
- * undefined we can't decide flatness from fills alone and defer to the
26
- * reconciler/ALGO close-bypass backstop. */
27
- remainingContracts?: number;
28
- /** Cumulative Binance-exact realised PnL summed across the reduce-only exit
29
- * fills since open, so the auto-journaled close carries the real PnL rather
30
- * than a server-side estimate. */
31
- realizedPnlAccum?: number;
32
- createdAt: number;
33
- updatedAt: number;
34
- }
35
- /** Test seam — lets tests override the clock for deterministic timestamps. */
36
- export type NowFn = () => number;
37
- export declare class PositionStateStore {
38
- private readonly filePath;
39
- private readonly dir;
40
- private readonly now;
41
- private entries;
42
- constructor(pluginId?: string, opts?: {
43
- now?: NowFn;
44
- basePath?: string;
45
- });
46
- /** Insert or update a position. Caller is responsible for deciding when
47
- * to call this — typically on first observation of a new position. */
48
- upsert(entry: Omit<PositionStateEntry, 'createdAt' | 'updatedAt'> & {
49
- createdAt?: number;
50
- updatedAt?: number;
51
- }): PositionStateEntry;
52
- /** Set the webapp positionId after the upsert returns. Idempotent. */
53
- setWebappId(symbol: string, webappPositionId: string): void;
54
- /** Update review tracking after a successful record_position_reviews call.
55
- * thesisStatus is optional for backwards compatibility — older callers that
56
- * predate the exit-gate work pass only verdict; the gate falls back to
57
- * PASS('inputs_unavailable_thesis_status') when the field isn't cached. */
58
- recordReview(symbol: string, verdict: 'hold' | 'add_on' | 'close_recommended', reviewAt?: number, thesisStatus?: 'intact' | 'weakening' | 'invalidated' | 'evolving'): void;
59
- /** Add opening contracts to the running size (first opening fill or a
60
- * scale-in). Initialises the realised-PnL accumulator on first open. No-op
61
- * if the entry doesn't exist yet (caller upserts the entry first). */
62
- addOpenContracts(symbol: string, qty: number): void;
63
- /** Seed remaining contracts from exchange truth at startup. Only sets when
64
- * the size is currently unknown — never clobbers live fill-tracked state. */
65
- seedRemainingContracts(symbol: string, qty: number): void;
66
- /** Apply a reduce-only exit fill: decrement remaining contracts and sum the
67
- * fill's realised PnL. Returns the updated entry so the caller can journal a
68
- * close when the position is flat, or null when there's no tracked entry or
69
- * the size is unknown (can't decide flatness — defer to the backstop). */
70
- applyExitContracts(symbol: string, qty: number, realizedPnl: number): PositionStateEntry | null;
71
- get(symbol: string): PositionStateEntry | undefined;
72
- /** Returns all entries — used by the stale-gate to enumerate open positions. */
73
- getAll(): PositionStateEntry[];
74
- /** Drop an entry — called when the auto-capture pipeline observes the
75
- * position has closed (size dropped to zero on the exchange). */
76
- remove(symbol: string): boolean;
77
- size(): number;
78
- getFilePath(): string;
79
- private loadOrInit;
80
- private persist;
81
- private validateFile;
82
- private validateEntry;
83
- }