@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,222 +0,0 @@
1
- // State persistence manager for the paper trading simulator.
2
- // Saves/loads state to ~/.openclaw/plugins/reefclaw-paper-trading/state.json
3
- // Uses atomic writes (temp file + rename) to prevent corruption.
4
- import { readFile, writeFile, rename, mkdir, unlink } from 'node:fs/promises';
5
- import { existsSync, readFileSync, writeFileSync, mkdirSync, renameSync } from 'node:fs';
6
- import { homedir } from 'node:os';
7
- import { join, dirname } from 'node:path';
8
- import { randomUUID } from 'node:crypto';
9
- import { logger } from '../logger.js';
10
- import { createDefaultState } from '../simulator/types.js';
11
- const TAG = 'state-manager';
12
- export class StateManager {
13
- statePath;
14
- saveTimer = null;
15
- pendingState = null;
16
- constructor(pluginId, baseDir) {
17
- const base = baseDir ?? join(homedir(), '.openclaw', 'plugins', pluginId);
18
- this.statePath = join(base, 'state.json');
19
- }
20
- getStatePath() {
21
- return this.statePath;
22
- }
23
- /** Quarantine a state file that exists but won't parse, instead of letting
24
- * the caller silently overwrite it with a fresh default (which would wipe
25
- * the positions/orders/realized-PnL ledger). The corrupt bytes are renamed
26
- * to `<state>.corrupt-<ts>` so an operator can recover them. Returns true if
27
- * a corrupt file was quarantined. */
28
- quarantineCorruptSync() {
29
- if (!existsSync(this.statePath))
30
- return false;
31
- const dest = `${this.statePath}.corrupt-${Date.now()}`;
32
- try {
33
- renameSync(this.statePath, dest);
34
- logger.error(TAG, `State file at ${this.statePath} is unreadable/corrupt — quarantined to ${dest}. NOT resetting silently; a fresh default will be used. Investigate before trading.`);
35
- }
36
- catch (err) {
37
- logger.error(TAG, `State file at ${this.statePath} is corrupt AND could not be quarantined: ${err instanceof Error ? err.message : String(err)}`);
38
- }
39
- return true;
40
- }
41
- /** Load state from disk. Returns null when the file is MISSING (fresh start)
42
- * OR when it exists-but-is-unreadable (in which case the corrupt bytes are
43
- * quarantined first — never silently discarded). The two cases are
44
- * distinguished in the log; both yield null so the caller seeds a default,
45
- * but a corrupt file is preserved as `<state>.corrupt-<ts>`. */
46
- async load() {
47
- if (!existsSync(this.statePath)) {
48
- logger.info(TAG, `No state file found at ${this.statePath}`);
49
- return null;
50
- }
51
- try {
52
- const raw = await readFile(this.statePath, 'utf-8');
53
- const state = JSON.parse(raw);
54
- logger.info(TAG, `Loaded state: ${state.positions.length} positions, ${state.openOrders.length} orders, ${state.tradeHistory.length} trades`);
55
- return state;
56
- }
57
- catch {
58
- // Exists but unreadable/corrupt — preserve, don't silently reset.
59
- this.quarantineCorruptSync();
60
- return null;
61
- }
62
- }
63
- /** Save state atomically (write to a UNIQUE temp, rename to final). A unique
64
- * temp name (pid + uuid) is essential under the two-process model: both the
65
- * agent and gateway processes wire stateChanged→save, and a shared
66
- * `<state>.tmp` let their concurrent writes interleave into a torn file that
67
- * then parses as garbage on next boot. With a per-write temp, the worst case
68
- * degrades to a harmless last-writer-wins rename of two COMPLETE files. */
69
- async save(state) {
70
- const tmpPath = `${this.statePath}.${process.pid}.${randomUUID()}.tmp`;
71
- try {
72
- const dir = dirname(this.statePath);
73
- if (!existsSync(dir)) {
74
- await mkdir(dir, { recursive: true });
75
- }
76
- await writeFile(tmpPath, JSON.stringify(state, null, 2), 'utf-8');
77
- await rename(tmpPath, this.statePath);
78
- logger.debug(TAG, 'State saved');
79
- }
80
- catch (err) {
81
- logger.error(TAG, `Failed to save state: ${err instanceof Error ? err.message : String(err)}`);
82
- // Best-effort cleanup of the orphaned temp so they don't accumulate.
83
- await unlink(tmpPath).catch(() => { });
84
- }
85
- }
86
- /**
87
- * Debounced save — coalesces rapid mutations into one write per second.
88
- * Call this on every state change; it will save at most once per second.
89
- */
90
- debouncedSave(state) {
91
- this.pendingState = state;
92
- if (this.saveTimer)
93
- return; // Already scheduled
94
- this.saveTimer = setTimeout(() => {
95
- this.saveTimer = null;
96
- if (this.pendingState) {
97
- const s = this.pendingState;
98
- this.pendingState = null;
99
- this.save(s).catch(() => { });
100
- }
101
- }, 1000);
102
- }
103
- /** Flush any pending debounced save immediately. */
104
- async flush() {
105
- if (this.saveTimer) {
106
- clearTimeout(this.saveTimer);
107
- this.saveTimer = null;
108
- }
109
- if (this.pendingState) {
110
- const s = this.pendingState;
111
- this.pendingState = null;
112
- await this.save(s);
113
- }
114
- }
115
- /** Load state or create default if not found. */
116
- async loadOrDefault(startingBalance, quoteCurrency) {
117
- const loaded = await this.load();
118
- if (loaded)
119
- return loaded;
120
- const state = createDefaultState(startingBalance, quoteCurrency);
121
- logger.info(TAG, `Initialized default state: ${startingBalance} ${quoteCurrency}`);
122
- await this.save(state);
123
- return state;
124
- }
125
- /** Synchronous load — for use in synchronous plugin register(). Same
126
- * missing-vs-corrupt distinction as load(): a corrupt file is quarantined
127
- * (preserved), never silently overwritten by the default the caller seeds. */
128
- loadSync() {
129
- if (!existsSync(this.statePath)) {
130
- logger.info(TAG, `No state file found at ${this.statePath}`);
131
- return null;
132
- }
133
- try {
134
- const raw = readFileSync(this.statePath, 'utf-8');
135
- const state = JSON.parse(raw);
136
- logger.info(TAG, `Loaded state: ${state.positions.length} positions, ${state.openOrders.length} orders, ${state.tradeHistory.length} trades`);
137
- return state;
138
- }
139
- catch {
140
- this.quarantineCorruptSync();
141
- return null;
142
- }
143
- }
144
- /** Synchronous load-or-create-default — for use in synchronous plugin register(). */
145
- loadOrDefaultSync(startingBalance, quoteCurrency) {
146
- const loaded = this.loadSync();
147
- if (loaded) {
148
- // Venue switch heal (issue #174): a persisted wallet quoted in the OLD
149
- // venue's currency reads as $0 equity on the new venue. Migrate 1:1
150
- // (USDT↔USDC), preserving total equity exactly.
151
- const mig = migratePaperQuoteCurrency(loaded, quoteCurrency);
152
- if (mig.migrated) {
153
- logger.info(TAG, `Paper wallet quote migrated ${mig.fromQuote} → ${quoteCurrency} (venue switch): ` +
154
- `released ${mig.releasedPositions} open position(s) at entry price, ` +
155
- `dropped ${mig.droppedOrders} unfilled order(s), balances carried 1:1`);
156
- this.saveSyncSafe(mig.state, 'migrated');
157
- }
158
- return mig.state;
159
- }
160
- const state = createDefaultState(startingBalance, quoteCurrency);
161
- logger.info(TAG, `Initialized default state: ${startingBalance} ${quoteCurrency}`);
162
- // Save synchronously so state persists immediately
163
- this.saveSyncSafe(state, 'initial');
164
- return state;
165
- }
166
- saveSyncSafe(state, label) {
167
- try {
168
- const dir = dirname(this.statePath);
169
- if (!existsSync(dir)) {
170
- mkdirSync(dir, { recursive: true });
171
- }
172
- writeFileSync(this.statePath, JSON.stringify(state, null, 2), 'utf-8');
173
- }
174
- catch (err) {
175
- logger.error(TAG, `Failed to save ${label} state: ${err instanceof Error ? err.message : String(err)}`);
176
- }
177
- }
178
- }
179
- /** Migrate a persisted paper state whose quote currency no longer matches the
180
- * configured venue's (issue #174 — e.g. a USDT wallet after switching to the
181
- * USDC-quoted hyperliquid venue). Pure; returns the input untouched when the
182
- * quotes already match.
183
- *
184
- * Semantics (equity-preserving):
185
- * - Open positions are released at their entry price: opening deducted the
186
- * full entry notional from the wallet (spot-collateral model), so that
187
- * notional is credited back before the position rows — which reference the
188
- * OLD venue's symbols and are unpriceable on the new one — are dropped.
189
- * - Unfilled open orders never debited the wallet (fills do) — just dropped.
190
- * - Balances carry 1:1 (USDT↔USDC are both dollar stables; paper precision),
191
- * merging into any existing balance under the new quote.
192
- * - Trade history is kept (display-only). savedAt is bumped so the other
193
- * process's replaceState() staleness guard accepts the migrated snapshot. */
194
- export function migratePaperQuoteCurrency(state, expectedQuote) {
195
- const fromQuote = state.config?.quoteCurrency ?? 'USDT';
196
- if (fromQuote === expectedQuote) {
197
- return { state, migrated: false, fromQuote, releasedPositions: 0, droppedOrders: 0 };
198
- }
199
- const next = JSON.parse(JSON.stringify(state));
200
- next.config = { ...next.config, quoteCurrency: expectedQuote };
201
- const old = next.wallet[fromQuote] ?? { total: 0, available: 0, locked: 0 };
202
- let releasedPositions = 0;
203
- for (const pos of next.positions ?? []) {
204
- const notional = pos.entryPrice * pos.quantity;
205
- if (Number.isFinite(notional) && notional > 0) {
206
- old.total += notional;
207
- old.available += notional;
208
- }
209
- releasedPositions++;
210
- }
211
- const droppedOrders = (next.openOrders ?? []).length;
212
- next.positions = [];
213
- next.openOrders = [];
214
- const target = next.wallet[expectedQuote] ?? { total: 0, available: 0, locked: 0 };
215
- target.total += old.total;
216
- target.available += old.available;
217
- target.locked += old.locked;
218
- next.wallet[expectedQuote] = target;
219
- delete next.wallet[fromQuote];
220
- next.savedAt = Date.now();
221
- return { state: next, migrated: true, fromQuote, releasedPositions, droppedOrders };
222
- }
@@ -1,9 +0,0 @@
1
- /** Has the agent's pinned invalidation price been reached at the current mark?
2
- *
3
- * Long: invalidated when mark <= invalidationPrice.
4
- * Short: invalidated when mark >= invalidationPrice.
5
- *
6
- * Returns undefined when there is nothing to check — no pinned invalidation,
7
- * or no usable mark — so a missing plan reads as "unknown", never a false
8
- * "not hit". Pure. */
9
- export declare function computeInvalidationHit(side: 'long' | 'short', markPrice: number | undefined, invalidationPrice: number | undefined): boolean | undefined;
@@ -1,23 +0,0 @@
1
- // Pinned trade plan — derived indication helpers (Slice 1, Task 5).
2
- //
3
- // Pure functions surfaced to the agent at heartbeat (via fetch_positions →
4
- // CcxtPosition) so it can hold to its OWN plan instead of re-litigating the
5
- // entry every cycle. Indication only — nothing here enforces anything; the
6
- // only forced thing on the position is that a protective stop exists.
7
- /** Has the agent's pinned invalidation price been reached at the current mark?
8
- *
9
- * Long: invalidated when mark <= invalidationPrice.
10
- * Short: invalidated when mark >= invalidationPrice.
11
- *
12
- * Returns undefined when there is nothing to check — no pinned invalidation,
13
- * or no usable mark — so a missing plan reads as "unknown", never a false
14
- * "not hit". Pure. */
15
- export function computeInvalidationHit(side, markPrice, invalidationPrice) {
16
- if (invalidationPrice == null ||
17
- !Number.isFinite(invalidationPrice) ||
18
- markPrice == null ||
19
- !Number.isFinite(markPrice)) {
20
- return undefined;
21
- }
22
- return side === 'long' ? markPrice <= invalidationPrice : markPrice >= invalidationPrice;
23
- }
@@ -1,67 +0,0 @@
1
- import type { Direction } from '../signals/types.js';
2
- import { type Wave9StrategyName } from './wave9-policy.js';
3
- export interface Wave9AdmissionPolicy {
4
- riskPct: number;
5
- maxPositions: number;
6
- maxOpenRiskPct: number;
7
- maxGrossExposureMultiple: number;
8
- maxPositionUsd: number;
9
- feeBps: number;
10
- slippageBps: number;
11
- capEnforcement: 'admission_only_no_forced_deleveraging';
12
- riskMeasure: 'fixed_initial_stop_risk_usd';
13
- }
14
- export declare const WAVE9_ADMISSION_POLICY: Readonly<Wave9AdmissionPolicy>;
15
- export interface Wave9AdmissionPosition {
16
- candidateId: string;
17
- symbol: string;
18
- strategy: Wave9StrategyName;
19
- direction: Direction;
20
- entryPrice: number;
21
- quantity: number;
22
- markPrice: number;
23
- initialStop: number;
24
- dollarRiskUsd: number;
25
- accruedFundingUsd: number;
26
- }
27
- export interface Wave9AdmissionState {
28
- cashEquityUsd: number;
29
- positions: Wave9AdmissionPosition[];
30
- }
31
- export interface Wave9AdmissionCandidate {
32
- id: string;
33
- eventTime: string;
34
- symbol: string;
35
- strategy: Wave9StrategyName;
36
- direction: Direction;
37
- referencePrice: number;
38
- stopPrice: number;
39
- }
40
- export type Wave9AdmissionReason = 'accepted' | 'invalidGeometry' | 'symbolAlreadyOpen' | 'maxPositions' | 'maxGrossExposure' | 'maxOpenRisk' | 'invalidSizing';
41
- export interface Wave9AdmissionLedgerRow extends Wave9AdmissionPosition {
42
- estimatedExitCostUsd: number;
43
- }
44
- export interface Wave9AdmissionDecision extends Wave9AdmissionCandidate {
45
- accepted: boolean;
46
- reason: Wave9AdmissionReason;
47
- entryPrice?: number;
48
- quantity?: number;
49
- notionalUsd?: number;
50
- riskUsd?: number;
51
- projectedCashEquityUsd?: number;
52
- projectedLiquidationEquityUsd?: number;
53
- projectedGrossExposureUsd?: number;
54
- projectedOpenRiskUsd?: number;
55
- projectedOpenPositions?: number;
56
- projectedPositionLedger?: Wave9AdmissionLedgerRow[];
57
- }
58
- export interface Wave9AdmissionBatchResult {
59
- decisions: Wave9AdmissionDecision[];
60
- state: Wave9AdmissionState;
61
- }
62
- /**
63
- * Apply a same-event candidate batch in the exact frozen priority. The caller
64
- * must release stops and completed-daily reversals before invoking this
65
- * function, just as the chronological research engine does.
66
- */
67
- export declare function applyWave9AdmissionBatch(inputState: Wave9AdmissionState, rawCandidates: readonly Wave9AdmissionCandidate[], policy?: Readonly<Wave9AdmissionPolicy>): Wave9AdmissionBatchResult;
@@ -1,262 +0,0 @@
1
- // ⚠️ GENERATED FILE — DO NOT EDIT.
2
- // Canonical source of truth: shared/src/portfolio/wave9-admission.ts
3
- // Regenerate: node scripts/sync-shared-code.mjs (enforced by shared-code-sync.test.ts)
4
- //
5
- // This copy exists because this package builds with tsc and deploys as a
6
- // self-contained tree that strips workspace deps, so it cannot import
7
- // @reefclaw/shared runtime code across the deploy boundary.
8
- import { WAVE9_LONG_STRATEGY, WAVE9_STRATEGY_PRIORITY, WAVE9_SYMBOL_PRIORITY, } from './wave9-policy.js';
9
- export const WAVE9_ADMISSION_POLICY = Object.freeze({
10
- riskPct: 0.5,
11
- maxPositions: 4,
12
- maxOpenRiskPct: 2,
13
- maxGrossExposureMultiple: 1.5,
14
- maxPositionUsd: 10_000,
15
- feeBps: 5,
16
- slippageBps: 10,
17
- capEnforcement: 'admission_only_no_forced_deleveraging',
18
- riskMeasure: 'fixed_initial_stop_risk_usd',
19
- });
20
- function finitePositive(value) {
21
- return Number.isFinite(value) && value > 0;
22
- }
23
- function nearlyEqual(left, right) {
24
- return Math.abs(left - right) <= 1e-9 * Math.max(1, Math.abs(left), Math.abs(right));
25
- }
26
- function validatePolicy(policy) {
27
- for (const [label, value] of Object.entries({
28
- riskPct: policy.riskPct,
29
- maxOpenRiskPct: policy.maxOpenRiskPct,
30
- maxGrossExposureMultiple: policy.maxGrossExposureMultiple,
31
- maxPositionUsd: policy.maxPositionUsd,
32
- })) {
33
- if (!finitePositive(value))
34
- throw new Error(`${label} must be positive and finite`);
35
- }
36
- if (!Number.isInteger(policy.maxPositions) || policy.maxPositions <= 0) {
37
- throw new Error('maxPositions must be a positive integer');
38
- }
39
- for (const [label, value] of Object.entries({
40
- feeBps: policy.feeBps,
41
- slippageBps: policy.slippageBps,
42
- })) {
43
- if (!Number.isFinite(value) || value < 0) {
44
- throw new Error(`${label} must be finite and non-negative`);
45
- }
46
- }
47
- if (policy.capEnforcement !== 'admission_only_no_forced_deleveraging'
48
- || policy.riskMeasure !== 'fixed_initial_stop_risk_usd') {
49
- throw new Error('unsupported Wave 9 admission policy semantics');
50
- }
51
- }
52
- function rank(value, values, label) {
53
- const result = values.indexOf(value);
54
- if (result < 0)
55
- throw new Error(`${label} is not in the frozen Wave 9 priority`);
56
- return result;
57
- }
58
- function validateCandidateIdentity(id, eventTime, symbol, strategy, direction) {
59
- const eventMs = Date.parse(eventTime);
60
- if (!Number.isFinite(eventMs) || new Date(eventMs).toISOString() !== eventTime) {
61
- throw new Error('candidate eventTime must be a canonical ISO timestamp');
62
- }
63
- const expectedId = `${eventTime}|${symbol}|${strategy}|${direction}`;
64
- if (id !== expectedId) {
65
- throw new Error(`candidate ID does not match its frozen identity: ${id}`);
66
- }
67
- }
68
- function copyPosition(position) {
69
- return { ...position };
70
- }
71
- function ledgerFor(positions, policy) {
72
- const exitCostRate = (policy.feeBps + policy.slippageBps) / 10_000;
73
- return positions.map((position) => ({
74
- ...copyPosition(position),
75
- estimatedExitCostUsd: position.markPrice * position.quantity * exitCostRate,
76
- }));
77
- }
78
- function summarize(cashEquityUsd, ledger) {
79
- let unrealized = 0;
80
- let funding = 0;
81
- let exitCosts = 0;
82
- let gross = 0;
83
- let risk = 0;
84
- for (const row of ledger) {
85
- unrealized += row.direction === 'LONG'
86
- ? (row.markPrice - row.entryPrice) * row.quantity
87
- : (row.entryPrice - row.markPrice) * row.quantity;
88
- funding += row.accruedFundingUsd;
89
- exitCosts += row.estimatedExitCostUsd;
90
- gross += Math.abs(row.markPrice * row.quantity);
91
- risk += row.dollarRiskUsd;
92
- }
93
- return { equity: cashEquityUsd + unrealized - funding - exitCosts, gross, risk };
94
- }
95
- /**
96
- * Apply a same-event candidate batch in the exact frozen priority. The caller
97
- * must release stops and completed-daily reversals before invoking this
98
- * function, just as the chronological research engine does.
99
- */
100
- export function applyWave9AdmissionBatch(inputState, rawCandidates, policy = WAVE9_ADMISSION_POLICY) {
101
- validatePolicy(policy);
102
- if (!Number.isFinite(inputState.cashEquityUsd)) {
103
- throw new Error('cashEquityUsd must be finite');
104
- }
105
- const positions = inputState.positions.map(copyPosition);
106
- const ids = new Set();
107
- for (const position of positions) {
108
- if (ids.has(position.candidateId))
109
- throw new Error('open candidate IDs must be unique');
110
- ids.add(position.candidateId);
111
- rank(position.symbol, WAVE9_SYMBOL_PRIORITY, 'open-position symbol');
112
- rank(position.strategy, WAVE9_STRATEGY_PRIORITY, 'open-position strategy');
113
- const identity = position.candidateId.split('|');
114
- if (identity.length !== 4) {
115
- throw new Error(`open-position candidate ID is malformed: ${position.candidateId}`);
116
- }
117
- validateCandidateIdentity(position.candidateId, identity[0], position.symbol, position.strategy, position.direction);
118
- if (!finitePositive(position.entryPrice)
119
- || !finitePositive(position.quantity)
120
- || !finitePositive(position.markPrice)
121
- || !finitePositive(position.initialStop)
122
- || !Number.isFinite(position.dollarRiskUsd)
123
- || position.dollarRiskUsd < 0
124
- || !Number.isFinite(position.accruedFundingUsd)) {
125
- throw new Error(`invalid open position ${position.candidateId}`);
126
- }
127
- const expectedDirection = position.strategy === WAVE9_LONG_STRATEGY ? 'LONG' : 'SHORT';
128
- const geometryValid = position.direction === expectedDirection
129
- && (position.direction === 'LONG'
130
- ? position.initialStop < position.entryPrice
131
- : position.initialStop > position.entryPrice);
132
- if (!geometryValid) {
133
- throw new Error(`invalid open-position geometry ${position.candidateId}`);
134
- }
135
- const expectedRisk = Math.abs(position.entryPrice - position.initialStop)
136
- * position.quantity;
137
- if (!nearlyEqual(position.dollarRiskUsd, expectedRisk)) {
138
- throw new Error(`open-position risk mismatch ${position.candidateId}`);
139
- }
140
- }
141
- if (new Set(positions.map((position) => position.symbol)).size !== positions.length) {
142
- throw new Error('Wave 9 allows at most one open position per symbol');
143
- }
144
- const candidates = rawCandidates.map((candidate) => ({ ...candidate }));
145
- const candidateIds = new Set();
146
- let batchEventTime;
147
- for (const candidate of candidates) {
148
- if (candidateIds.has(candidate.id))
149
- throw new Error('candidate IDs must be unique');
150
- candidateIds.add(candidate.id);
151
- validateCandidateIdentity(candidate.id, candidate.eventTime, candidate.symbol, candidate.strategy, candidate.direction);
152
- if (batchEventTime === undefined)
153
- batchEventTime = candidate.eventTime;
154
- if (candidate.eventTime !== batchEventTime) {
155
- throw new Error('a Wave 9 admission batch must contain exactly one eventTime');
156
- }
157
- rank(candidate.symbol, WAVE9_SYMBOL_PRIORITY, 'candidate symbol');
158
- rank(candidate.strategy, WAVE9_STRATEGY_PRIORITY, 'candidate strategy');
159
- }
160
- candidates.sort((left, right) => rank(left.symbol, WAVE9_SYMBOL_PRIORITY, 'candidate symbol')
161
- - rank(right.symbol, WAVE9_SYMBOL_PRIORITY, 'candidate symbol')
162
- || rank(left.strategy, WAVE9_STRATEGY_PRIORITY, 'candidate strategy')
163
- - rank(right.strategy, WAVE9_STRATEGY_PRIORITY, 'candidate strategy')
164
- || left.id.localeCompare(right.id));
165
- let cashEquityUsd = inputState.cashEquityUsd;
166
- const decisions = [];
167
- const feeRate = policy.feeBps / 10_000;
168
- const slippageRate = policy.slippageBps / 10_000;
169
- for (const candidate of candidates) {
170
- const decision = {
171
- ...candidate,
172
- accepted: false,
173
- reason: 'invalidSizing',
174
- };
175
- const expectedDirection = candidate.strategy === WAVE9_LONG_STRATEGY ? 'LONG' : 'SHORT';
176
- if (candidate.direction !== expectedDirection
177
- || !finitePositive(candidate.referencePrice)
178
- || !finitePositive(candidate.stopPrice)) {
179
- decision.reason = 'invalidGeometry';
180
- decisions.push(decision);
181
- continue;
182
- }
183
- const entryPrice = candidate.direction === 'LONG'
184
- ? candidate.referencePrice * (1 + slippageRate)
185
- : candidate.referencePrice * (1 - slippageRate);
186
- decision.entryPrice = entryPrice;
187
- if ((candidate.direction === 'LONG' && candidate.stopPrice >= entryPrice)
188
- || (candidate.direction === 'SHORT' && candidate.stopPrice <= entryPrice)) {
189
- decision.reason = 'invalidGeometry';
190
- decisions.push(decision);
191
- continue;
192
- }
193
- if (positions.some((position) => position.symbol === candidate.symbol)) {
194
- decision.reason = 'symbolAlreadyOpen';
195
- decisions.push(decision);
196
- continue;
197
- }
198
- if (positions.length >= policy.maxPositions) {
199
- decision.reason = 'maxPositions';
200
- decisions.push(decision);
201
- continue;
202
- }
203
- const current = summarize(cashEquityUsd, ledgerFor(positions, policy));
204
- const riskPerUnit = Math.abs(entryPrice - candidate.stopPrice);
205
- const riskBudget = current.equity * policy.riskPct / 100;
206
- const quantity = Math.min(riskBudget / riskPerUnit, policy.maxPositionUsd / entryPrice);
207
- const notionalUsd = quantity * entryPrice;
208
- const riskUsd = quantity * riskPerUnit;
209
- Object.assign(decision, { quantity, notionalUsd, riskUsd });
210
- if (!finitePositive(quantity) || current.equity <= 0) {
211
- decision.reason = 'invalidSizing';
212
- decisions.push(decision);
213
- continue;
214
- }
215
- const position = {
216
- candidateId: candidate.id,
217
- symbol: candidate.symbol,
218
- strategy: candidate.strategy,
219
- direction: candidate.direction,
220
- entryPrice,
221
- quantity,
222
- markPrice: candidate.referencePrice,
223
- initialStop: candidate.stopPrice,
224
- dollarRiskUsd: riskUsd,
225
- accruedFundingUsd: 0,
226
- };
227
- const projectedPositions = [...positions, position];
228
- const projectedCash = cashEquityUsd - notionalUsd * feeRate;
229
- const projectedLedger = ledgerFor(projectedPositions, policy);
230
- const projected = summarize(projectedCash, projectedLedger);
231
- Object.assign(decision, {
232
- projectedCashEquityUsd: projectedCash,
233
- projectedLiquidationEquityUsd: projected.equity,
234
- projectedGrossExposureUsd: projected.gross,
235
- projectedOpenRiskUsd: projected.risk,
236
- projectedOpenPositions: projectedPositions.length,
237
- projectedPositionLedger: projectedLedger,
238
- });
239
- if (projected.equity <= 0) {
240
- decision.reason = 'invalidSizing';
241
- }
242
- else if (projected.gross
243
- > projected.equity * policy.maxGrossExposureMultiple + 1e-9) {
244
- decision.reason = 'maxGrossExposure';
245
- }
246
- else if (projected.risk
247
- > projected.equity * policy.maxOpenRiskPct / 100 + 1e-9) {
248
- decision.reason = 'maxOpenRisk';
249
- }
250
- else {
251
- decision.accepted = true;
252
- decision.reason = 'accepted';
253
- cashEquityUsd = projectedCash;
254
- positions.push(position);
255
- }
256
- decisions.push(decision);
257
- }
258
- return {
259
- decisions,
260
- state: { cashEquityUsd, positions: positions.map(copyPosition) },
261
- };
262
- }
@@ -1,36 +0,0 @@
1
- import type { Direction, OhlcvBar } from '../signals/types.js';
2
- export declare const DAY_MS: number;
3
- export declare const WAVE9_LOOKBACK_DAYS = 28;
4
- export declare const WAVE9_ATR_PERIOD = 14;
5
- export declare const WAVE9_ATR_MULTIPLE = 3;
6
- export declare const WAVE9_CONTEXT_BARS = 250;
7
- export declare const WAVE9_LONG_STRATEGY = "tsmom_28d_long_flat_reversal_1d";
8
- export declare const WAVE9_SHORT_STRATEGY = "tsmom_28d_short_flat_reversal_1d";
9
- export type Wave9StrategyName = typeof WAVE9_LONG_STRATEGY | typeof WAVE9_SHORT_STRATEGY;
10
- export declare const WAVE9_SYMBOL_PRIORITY: readonly ["BTCUSDT", "ETHUSDT", "SOLUSDT", "BNBUSDT", "XRPUSDT", "DOGEUSDT", "ADAUSDT", "LINKUSDT"];
11
- export declare const WAVE9_STRATEGY_PRIORITY: readonly ["tsmom_28d_long_flat_reversal_1d", "tsmom_28d_short_flat_reversal_1d"];
12
- export interface Wave9EntrySignal {
13
- strategy: Wave9StrategyName;
14
- direction: Direction;
15
- stopPrice: number;
16
- }
17
- export interface Wave9DailyDecision {
18
- eventTime: string;
19
- completedDailyOpen: string;
20
- currentReturn: number;
21
- previousReturn: number;
22
- atr14: number;
23
- referencePrice: number;
24
- entries: Wave9EntrySignal[];
25
- exitLong: boolean;
26
- exitShort: boolean;
27
- sourceBarCount: number;
28
- }
29
- /**
30
- * Return the exact completed-daily context visible at a UTC daily boundary.
31
- * The function is intentionally fail-closed: unordered, duplicated, gapped,
32
- * non-UTC, or stale candles are rejected rather than silently repaired.
33
- */
34
- export declare function completedDailyContext(rawBars: readonly OhlcvBar[], eventTime: Date): OhlcvBar[];
35
- /** Evaluate the exact Wave 9 entry-transition and signal-reversal semantics. */
36
- export declare function evaluateWave9Daily(rawBars: readonly OhlcvBar[], eventTime: Date): Wave9DailyDecision;