@reefclaw/connect 0.1.11 → 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 (397) hide show
  1. package/assets/bridge/gateway/heartbeat-cron.d.ts +27 -0
  2. package/assets/bridge/gateway/heartbeat-cron.js +85 -0
  3. package/assets/bridge/providers/gateway.d.ts +2 -0
  4. package/assets/bridge/providers/gateway.js +57 -16
  5. package/assets/bridge/setup.js +6 -51
  6. package/dist/deps.js +2 -2
  7. package/dist/plugin.js +35 -7
  8. package/package.json +1 -1
  9. package/assets/plugin/audit/mode-transition-audit.d.ts +0 -11
  10. package/assets/plugin/audit/mode-transition-audit.js +0 -29
  11. package/assets/plugin/balance-utils.d.ts +0 -36
  12. package/assets/plugin/balance-utils.js +0 -98
  13. package/assets/plugin/ccxt/binance-ban-gate.d.ts +0 -47
  14. package/assets/plugin/ccxt/binance-ban-gate.js +0 -420
  15. package/assets/plugin/ccxt/binance-private.d.ts +0 -346
  16. package/assets/plugin/ccxt/binance-private.js +0 -1525
  17. package/assets/plugin/ccxt/binance-public.d.ts +0 -34
  18. package/assets/plugin/ccxt/binance-public.js +0 -180
  19. package/assets/plugin/ccxt/intel-public.d.ts +0 -25
  20. package/assets/plugin/ccxt/intel-public.js +0 -80
  21. package/assets/plugin/ccxt/public-market-data-api.d.ts +0 -26
  22. package/assets/plugin/ccxt/public-market-data-api.js +0 -23
  23. package/assets/plugin/config/agent-config-client.d.ts +0 -77
  24. package/assets/plugin/config/agent-config-client.js +0 -188
  25. package/assets/plugin/config/agent-config-poller.d.ts +0 -32
  26. package/assets/plugin/config/agent-config-poller.js +0 -101
  27. package/assets/plugin/config/brackets-config.d.ts +0 -22
  28. package/assets/plugin/config/brackets-config.js +0 -58
  29. package/assets/plugin/config/entitlement-gate.d.ts +0 -51
  30. package/assets/plugin/config/entitlement-gate.js +0 -137
  31. package/assets/plugin/config/gate-store.d.ts +0 -18
  32. package/assets/plugin/config/gate-store.js +0 -61
  33. package/assets/plugin/config/plugin-config-io.d.ts +0 -222
  34. package/assets/plugin/config/plugin-config-io.js +0 -126
  35. package/assets/plugin/config/position-review-config.d.ts +0 -35
  36. package/assets/plugin/config/position-review-config.js +0 -105
  37. package/assets/plugin/config/tool-gate.d.ts +0 -53
  38. package/assets/plugin/config/tool-gate.js +0 -128
  39. package/assets/plugin/config/user-data-stream-config.d.ts +0 -89
  40. package/assets/plugin/config/user-data-stream-config.js +0 -239
  41. package/assets/plugin/connector-supervisor.d.ts +0 -36
  42. package/assets/plugin/connector-supervisor.js +0 -149
  43. package/assets/plugin/exchange-adapter.d.ts +0 -65
  44. package/assets/plugin/exchange-adapter.js +0 -4
  45. package/assets/plugin/index.d.ts +0 -30
  46. package/assets/plugin/index.js +0 -2756
  47. package/assets/plugin/ingest/pending-entry-metadata.d.ts +0 -74
  48. package/assets/plugin/ingest/pending-entry-metadata.js +0 -236
  49. package/assets/plugin/ingest/position-auto-capture.d.ts +0 -171
  50. package/assets/plugin/ingest/position-auto-capture.js +0 -709
  51. package/assets/plugin/ingest/position-decisions-client.d.ts +0 -327
  52. package/assets/plugin/ingest/position-decisions-client.js +0 -306
  53. package/assets/plugin/ingest/readiness-reporter.d.ts +0 -42
  54. package/assets/plugin/ingest/readiness-reporter.js +0 -163
  55. package/assets/plugin/ingest/reconcile-db-vs-exchange.d.ts +0 -51
  56. package/assets/plugin/ingest/reconcile-db-vs-exchange.js +0 -170
  57. package/assets/plugin/ingest/reconciler-cleanup.d.ts +0 -37
  58. package/assets/plugin/ingest/reconciler-cleanup.js +0 -147
  59. package/assets/plugin/ingest/rest-gap-filler.d.ts +0 -191
  60. package/assets/plugin/ingest/rest-gap-filler.js +0 -565
  61. package/assets/plugin/ingest/touched-symbols-store.d.ts +0 -25
  62. package/assets/plugin/ingest/touched-symbols-store.js +0 -96
  63. package/assets/plugin/ingest/trade-store-client.d.ts +0 -40
  64. package/assets/plugin/ingest/trade-store-client.js +0 -125
  65. package/assets/plugin/ingest/ws-ingest.d.ts +0 -43
  66. package/assets/plugin/ingest/ws-ingest.js +0 -126
  67. package/assets/plugin/learning/setup-family.d.ts +0 -21
  68. package/assets/plugin/learning/setup-family.js +0 -103
  69. package/assets/plugin/lifecycle/install-signal-handlers.d.ts +0 -33
  70. package/assets/plugin/lifecycle/install-signal-handlers.js +0 -112
  71. package/assets/plugin/lifecycle/shutdown-coordinator.d.ts +0 -43
  72. package/assets/plugin/lifecycle/shutdown-coordinator.js +0 -131
  73. package/assets/plugin/lifecycle/trading-operation-lock.d.ts +0 -17
  74. package/assets/plugin/lifecycle/trading-operation-lock.js +0 -14
  75. package/assets/plugin/live/bracket-id.d.ts +0 -26
  76. package/assets/plugin/live/bracket-id.js +0 -112
  77. package/assets/plugin/live/bracket-ledger.d.ts +0 -54
  78. package/assets/plugin/live/bracket-ledger.js +0 -267
  79. package/assets/plugin/live/bracket-manager.d.ts +0 -82
  80. package/assets/plugin/live/bracket-manager.js +0 -478
  81. package/assets/plugin/live/bracket-params.d.ts +0 -22
  82. package/assets/plugin/live/bracket-params.js +0 -124
  83. package/assets/plugin/live/bracket-reconciler.d.ts +0 -95
  84. package/assets/plugin/live/bracket-reconciler.js +0 -573
  85. package/assets/plugin/live/bracket-types.d.ts +0 -102
  86. package/assets/plugin/live/bracket-types.js +0 -8
  87. package/assets/plugin/live/deposit-tracker.d.ts +0 -62
  88. package/assets/plugin/live/deposit-tracker.js +0 -97
  89. package/assets/plugin/live/emergency-controls.d.ts +0 -32
  90. package/assets/plugin/live/emergency-controls.js +0 -226
  91. package/assets/plugin/live/exchange-errors.d.ts +0 -12
  92. package/assets/plugin/live/exchange-errors.js +0 -130
  93. package/assets/plugin/live/exchange-info-cache.d.ts +0 -37
  94. package/assets/plugin/live/exchange-info-cache.js +0 -134
  95. package/assets/plugin/live/fact-subscriber.d.ts +0 -78
  96. package/assets/plugin/live/fact-subscriber.js +0 -182
  97. package/assets/plugin/live/fill-price.d.ts +0 -13
  98. package/assets/plugin/live/fill-price.js +0 -37
  99. package/assets/plugin/live/intent-journal.d.ts +0 -42
  100. package/assets/plugin/live/intent-journal.js +0 -122
  101. package/assets/plugin/live/listen-key-manager.d.ts +0 -70
  102. package/assets/plugin/live/listen-key-manager.js +0 -169
  103. package/assets/plugin/live/live-adapter.d.ts +0 -319
  104. package/assets/plugin/live/live-adapter.js +0 -1906
  105. package/assets/plugin/live/live-balance-enricher.d.ts +0 -32
  106. package/assets/plugin/live/live-balance-enricher.js +0 -104
  107. package/assets/plugin/live/live-bracket-api.d.ts +0 -13
  108. package/assets/plugin/live/live-bracket-api.js +0 -20
  109. package/assets/plugin/live/live-state-store.d.ts +0 -194
  110. package/assets/plugin/live/live-state-store.js +0 -450
  111. package/assets/plugin/live/local-signal-service.d.ts +0 -57
  112. package/assets/plugin/live/local-signal-service.js +0 -151
  113. package/assets/plugin/live/local-strategy-evaluator.d.ts +0 -62
  114. package/assets/plugin/live/local-strategy-evaluator.js +0 -131
  115. package/assets/plugin/live/microstructure-assembler.d.ts +0 -54
  116. package/assets/plugin/live/microstructure-assembler.js +0 -148
  117. package/assets/plugin/live/order-poller.d.ts +0 -29
  118. package/assets/plugin/live/order-poller.js +0 -125
  119. package/assets/plugin/live/position-state-store.d.ts +0 -87
  120. package/assets/plugin/live/position-state-store.js +0 -237
  121. package/assets/plugin/live/proposal-decision-listener.d.ts +0 -70
  122. package/assets/plugin/live/proposal-decision-listener.js +0 -292
  123. package/assets/plugin/live/proposal-manager.d.ts +0 -76
  124. package/assets/plugin/live/proposal-manager.js +0 -140
  125. package/assets/plugin/live/rate-limiter.d.ts +0 -47
  126. package/assets/plugin/live/rate-limiter.js +0 -159
  127. package/assets/plugin/live/reconciler.d.ts +0 -39
  128. package/assets/plugin/live/reconciler.js +0 -175
  129. package/assets/plugin/live/setup-buckets.d.ts +0 -7
  130. package/assets/plugin/live/setup-buckets.js +0 -33
  131. package/assets/plugin/live/slippage-tracker.d.ts +0 -45
  132. package/assets/plugin/live/slippage-tracker.js +0 -78
  133. package/assets/plugin/live/stop-watcher.d.ts +0 -67
  134. package/assets/plugin/live/stop-watcher.js +0 -218
  135. package/assets/plugin/live/user-data-active-probe.d.ts +0 -54
  136. package/assets/plugin/live/user-data-active-probe.js +0 -180
  137. package/assets/plugin/live/user-data-stream-controller.d.ts +0 -200
  138. package/assets/plugin/live/user-data-stream-controller.js +0 -579
  139. package/assets/plugin/live/user-data-stream-ws.d.ts +0 -22
  140. package/assets/plugin/live/user-data-stream-ws.js +0 -63
  141. package/assets/plugin/live/user-data-stream.d.ts +0 -243
  142. package/assets/plugin/live/user-data-stream.js +0 -704
  143. package/assets/plugin/logger.d.ts +0 -2
  144. package/assets/plugin/logger.js +0 -2
  145. package/assets/plugin/mfe.d.ts +0 -21
  146. package/assets/plugin/mfe.js +0 -68
  147. package/assets/plugin/onboarding/mode-ladder.d.ts +0 -1
  148. package/assets/plugin/onboarding/mode-ladder.js +0 -3
  149. package/assets/plugin/onboarding/runtime.d.ts +0 -90
  150. package/assets/plugin/onboarding/runtime.js +0 -184
  151. package/assets/plugin/openclaw.plugin.json +0 -92
  152. package/assets/plugin/paper-adapter.d.ts +0 -24
  153. package/assets/plugin/paper-adapter.js +0 -91
  154. package/assets/plugin/persistence/state-manager.d.ts +0 -66
  155. package/assets/plugin/persistence/state-manager.js +0 -222
  156. package/assets/plugin/pinned-plan.d.ts +0 -9
  157. package/assets/plugin/pinned-plan.js +0 -23
  158. package/assets/plugin/portfolio/reentry-tracker.d.ts +0 -36
  159. package/assets/plugin/portfolio/reentry-tracker.js +0 -127
  160. package/assets/plugin/portfolio/wave9-admission.d.ts +0 -67
  161. package/assets/plugin/portfolio/wave9-admission.js +0 -262
  162. package/assets/plugin/portfolio/wave9-policy.d.ts +0 -36
  163. package/assets/plugin/portfolio/wave9-policy.js +0 -183
  164. package/assets/plugin/risk/pre-trade-check.d.ts +0 -38
  165. package/assets/plugin/risk/pre-trade-check.js +0 -345
  166. package/assets/plugin/risk/pre-trade-types.d.ts +0 -60
  167. package/assets/plugin/risk/pre-trade-types.js +0 -3
  168. package/assets/plugin/shadow/shadow-tracker.d.ts +0 -36
  169. package/assets/plugin/shadow/shadow-tracker.js +0 -151
  170. package/assets/plugin/shadow/types.d.ts +0 -42
  171. package/assets/plugin/shadow/types.js +0 -20
  172. package/assets/plugin/shared/indicators-extended.d.ts +0 -52
  173. package/assets/plugin/shared/indicators-extended.js +0 -291
  174. package/assets/plugin/shared/indicators.d.ts +0 -15
  175. package/assets/plugin/shared/indicators.js +0 -114
  176. package/assets/plugin/signals/conditions/registry.d.ts +0 -16
  177. package/assets/plugin/signals/conditions/registry.js +0 -1333
  178. package/assets/plugin/signals/conditions/types.d.ts +0 -1
  179. package/assets/plugin/signals/conditions/types.js +0 -4
  180. package/assets/plugin/signals/direction-rules.d.ts +0 -3
  181. package/assets/plugin/signals/direction-rules.js +0 -24
  182. package/assets/plugin/signals/entry-rules.d.ts +0 -6
  183. package/assets/plugin/signals/entry-rules.js +0 -33
  184. package/assets/plugin/signals/serialize-context.d.ts +0 -4
  185. package/assets/plugin/signals/serialize-context.js +0 -39
  186. package/assets/plugin/signals/stop-rules.d.ts +0 -3
  187. package/assets/plugin/signals/stop-rules.js +0 -48
  188. package/assets/plugin/signals/strategy-adapter.d.ts +0 -47
  189. package/assets/plugin/signals/strategy-adapter.js +0 -209
  190. package/assets/plugin/signals/types.d.ts +0 -1
  191. package/assets/plugin/signals/types.js +0 -8
  192. package/assets/plugin/simulator/exchange-simulator.d.ts +0 -105
  193. package/assets/plugin/simulator/exchange-simulator.js +0 -759
  194. package/assets/plugin/simulator/fill-engine.d.ts +0 -53
  195. package/assets/plugin/simulator/fill-engine.js +0 -280
  196. package/assets/plugin/simulator/paper-market-feed.d.ts +0 -26
  197. package/assets/plugin/simulator/paper-market-feed.js +0 -104
  198. package/assets/plugin/simulator/realistic-fills.d.ts +0 -59
  199. package/assets/plugin/simulator/realistic-fills.js +0 -175
  200. package/assets/plugin/simulator/types.d.ts +0 -228
  201. package/assets/plugin/simulator/types.js +0 -43
  202. package/assets/plugin/strategy/builtin-strategies.d.ts +0 -2
  203. package/assets/plugin/strategy/builtin-strategies.js +0 -113
  204. package/assets/plugin/strategy/condition-registry.d.ts +0 -3
  205. package/assets/plugin/strategy/condition-registry.js +0 -153
  206. package/assets/plugin/strategy/evaluator.d.ts +0 -70
  207. package/assets/plugin/strategy/evaluator.js +0 -98
  208. package/assets/plugin/tools/assessment-validation.d.ts +0 -141
  209. package/assets/plugin/tools/assessment-validation.js +0 -473
  210. package/assets/plugin/tools/attach-brackets.d.ts +0 -39
  211. package/assets/plugin/tools/attach-brackets.js +0 -564
  212. package/assets/plugin/tools/audit-bracket-protection.d.ts +0 -49
  213. package/assets/plugin/tools/audit-bracket-protection.js +0 -683
  214. package/assets/plugin/tools/bracket-control.d.ts +0 -12
  215. package/assets/plugin/tools/bracket-control.js +0 -35
  216. package/assets/plugin/tools/cancel-all-orders.d.ts +0 -9
  217. package/assets/plugin/tools/cancel-all-orders.js +0 -8
  218. package/assets/plugin/tools/cancel-order.d.ts +0 -14
  219. package/assets/plugin/tools/cancel-order.js +0 -60
  220. package/assets/plugin/tools/check-position-health.d.ts +0 -46
  221. package/assets/plugin/tools/check-position-health.js +0 -194
  222. package/assets/plugin/tools/clear-exchange-credentials.d.ts +0 -24
  223. package/assets/plugin/tools/clear-exchange-credentials.js +0 -70
  224. package/assets/plugin/tools/close-position.d.ts +0 -45
  225. package/assets/plugin/tools/close-position.js +0 -722
  226. package/assets/plugin/tools/create-order.d.ts +0 -82
  227. package/assets/plugin/tools/create-order.js +0 -1544
  228. package/assets/plugin/tools/exit-gate.d.ts +0 -58
  229. package/assets/plugin/tools/exit-gate.js +0 -162
  230. package/assets/plugin/tools/fetch-balance.d.ts +0 -5
  231. package/assets/plugin/tools/fetch-balance.js +0 -4
  232. package/assets/plugin/tools/fetch-ohlcv.d.ts +0 -11
  233. package/assets/plugin/tools/fetch-ohlcv.js +0 -8
  234. package/assets/plugin/tools/fetch-open-orders.d.ts +0 -7
  235. package/assets/plugin/tools/fetch-open-orders.js +0 -4
  236. package/assets/plugin/tools/fetch-positions.d.ts +0 -7
  237. package/assets/plugin/tools/fetch-positions.js +0 -4
  238. package/assets/plugin/tools/fetch-ticker.d.ts +0 -11
  239. package/assets/plugin/tools/fetch-ticker.js +0 -5
  240. package/assets/plugin/tools/get-agent-profile.d.ts +0 -4
  241. package/assets/plugin/tools/get-agent-profile.js +0 -6
  242. package/assets/plugin/tools/get-analytics.d.ts +0 -6
  243. package/assets/plugin/tools/get-analytics.js +0 -7
  244. package/assets/plugin/tools/get-backtest.d.ts +0 -12
  245. package/assets/plugin/tools/get-backtest.js +0 -91
  246. package/assets/plugin/tools/get-basis.d.ts +0 -7
  247. package/assets/plugin/tools/get-basis.js +0 -7
  248. package/assets/plugin/tools/get-bracket-config.d.ts +0 -11
  249. package/assets/plugin/tools/get-bracket-config.js +0 -24
  250. package/assets/plugin/tools/get-cascade-risk.d.ts +0 -7
  251. package/assets/plugin/tools/get-cascade-risk.js +0 -8
  252. package/assets/plugin/tools/get-crypto-metrics.d.ts +0 -18
  253. package/assets/plugin/tools/get-crypto-metrics.js +0 -62
  254. package/assets/plugin/tools/get-cvd.d.ts +0 -6
  255. package/assets/plugin/tools/get-cvd.js +0 -6
  256. package/assets/plugin/tools/get-divergences.d.ts +0 -6
  257. package/assets/plugin/tools/get-divergences.js +0 -6
  258. package/assets/plugin/tools/get-funding-context.d.ts +0 -6
  259. package/assets/plugin/tools/get-funding-context.js +0 -16
  260. package/assets/plugin/tools/get-liquidation-levels.d.ts +0 -7
  261. package/assets/plugin/tools/get-liquidation-levels.js +0 -7
  262. package/assets/plugin/tools/get-liquidation-pulse.d.ts +0 -9
  263. package/assets/plugin/tools/get-liquidation-pulse.js +0 -22
  264. package/assets/plugin/tools/get-market-breadth.d.ts +0 -6
  265. package/assets/plugin/tools/get-market-breadth.js +0 -8
  266. package/assets/plugin/tools/get-market-intel.d.ts +0 -19
  267. package/assets/plugin/tools/get-market-intel.js +0 -116
  268. package/assets/plugin/tools/get-market-structure.d.ts +0 -47
  269. package/assets/plugin/tools/get-market-structure.js +0 -198
  270. package/assets/plugin/tools/get-my-mined-patterns.d.ts +0 -20
  271. package/assets/plugin/tools/get-my-mined-patterns.js +0 -61
  272. package/assets/plugin/tools/get-my-proposed-learnings.d.ts +0 -20
  273. package/assets/plugin/tools/get-my-proposed-learnings.js +0 -55
  274. package/assets/plugin/tools/get-my-recent-reviews.d.ts +0 -22
  275. package/assets/plugin/tools/get-my-recent-reviews.js +0 -66
  276. package/assets/plugin/tools/get-orderbook.d.ts +0 -21
  277. package/assets/plugin/tools/get-orderbook.js +0 -32
  278. package/assets/plugin/tools/get-pattern-scan.d.ts +0 -7
  279. package/assets/plugin/tools/get-pattern-scan.js +0 -8
  280. package/assets/plugin/tools/get-regime.d.ts +0 -6
  281. package/assets/plugin/tools/get-regime.js +0 -7
  282. package/assets/plugin/tools/get-relevant-learnings.d.ts +0 -21
  283. package/assets/plugin/tools/get-relevant-learnings.js +0 -65
  284. package/assets/plugin/tools/get-resting-liquidity.d.ts +0 -6
  285. package/assets/plugin/tools/get-resting-liquidity.js +0 -11
  286. package/assets/plugin/tools/get-risk-scenario.d.ts +0 -29
  287. package/assets/plugin/tools/get-risk-scenario.js +0 -47
  288. package/assets/plugin/tools/get-risk-summary.d.ts +0 -51
  289. package/assets/plugin/tools/get-risk-summary.js +0 -118
  290. package/assets/plugin/tools/get-sentiment.d.ts +0 -4
  291. package/assets/plugin/tools/get-sentiment.js +0 -6
  292. package/assets/plugin/tools/get-session-review.d.ts +0 -7
  293. package/assets/plugin/tools/get-session-review.js +0 -8
  294. package/assets/plugin/tools/get-setup-detail.d.ts +0 -7
  295. package/assets/plugin/tools/get-setup-detail.js +0 -322
  296. package/assets/plugin/tools/get-signals.d.ts +0 -15
  297. package/assets/plugin/tools/get-signals.js +0 -54
  298. package/assets/plugin/tools/get-sizing.d.ts +0 -6
  299. package/assets/plugin/tools/get-sizing.js +0 -6
  300. package/assets/plugin/tools/get-trade-feedback.d.ts +0 -7
  301. package/assets/plugin/tools/get-trade-feedback.js +0 -8
  302. package/assets/plugin/tools/get-trade-flow.d.ts +0 -7
  303. package/assets/plugin/tools/get-trade-flow.js +0 -7
  304. package/assets/plugin/tools/get-volume-analysis.d.ts +0 -21
  305. package/assets/plugin/tools/get-volume-analysis.js +0 -74
  306. package/assets/plugin/tools/get-volume-profile.d.ts +0 -7
  307. package/assets/plugin/tools/get-volume-profile.js +0 -7
  308. package/assets/plugin/tools/get-wave9-status.d.ts +0 -127
  309. package/assets/plugin/tools/get-wave9-status.js +0 -796
  310. package/assets/plugin/tools/helpers.d.ts +0 -26
  311. package/assets/plugin/tools/helpers.js +0 -39
  312. package/assets/plugin/tools/intel-api.d.ts +0 -34
  313. package/assets/plugin/tools/intel-api.js +0 -119
  314. package/assets/plugin/tools/intel-cache.d.ts +0 -25
  315. package/assets/plugin/tools/intel-cache.js +0 -148
  316. package/assets/plugin/tools/list-strategies.d.ts +0 -17
  317. package/assets/plugin/tools/list-strategies.js +0 -23
  318. package/assets/plugin/tools/modify-stop.d.ts +0 -21
  319. package/assets/plugin/tools/modify-stop.js +0 -120
  320. package/assets/plugin/tools/modify-target.d.ts +0 -21
  321. package/assets/plugin/tools/modify-target.js +0 -110
  322. package/assets/plugin/tools/propose-learning.d.ts +0 -22
  323. package/assets/plugin/tools/propose-learning.js +0 -65
  324. package/assets/plugin/tools/query-review-outcomes.d.ts +0 -30
  325. package/assets/plugin/tools/query-review-outcomes.js +0 -64
  326. package/assets/plugin/tools/query-trades.d.ts +0 -21
  327. package/assets/plugin/tools/query-trades.js +0 -37
  328. package/assets/plugin/tools/record-position-reviews.d.ts +0 -38
  329. package/assets/plugin/tools/record-position-reviews.js +0 -147
  330. package/assets/plugin/tools/save-strategy.d.ts +0 -16
  331. package/assets/plugin/tools/save-strategy.js +0 -46
  332. package/assets/plugin/tools/scan-pairs.d.ts +0 -22
  333. package/assets/plugin/tools/scan-pairs.js +0 -234
  334. package/assets/plugin/tools/score-setup.d.ts +0 -31
  335. package/assets/plugin/tools/score-setup.js +0 -268
  336. package/assets/plugin/tools/set-bracket-requirement.d.ts +0 -18
  337. package/assets/plugin/tools/set-bracket-requirement.js +0 -81
  338. package/assets/plugin/tools/set-exchange-credentials.d.ts +0 -25
  339. package/assets/plugin/tools/set-exchange-credentials.js +0 -80
  340. package/assets/plugin/tools/set-trading-mode.d.ts +0 -26
  341. package/assets/plugin/tools/set-trading-mode.js +0 -135
  342. package/assets/plugin/tools/test-exchange-credentials.d.ts +0 -16
  343. package/assets/plugin/tools/test-exchange-credentials.js +0 -100
  344. package/assets/plugin/tools/toggle-strategy.d.ts +0 -8
  345. package/assets/plugin/tools/toggle-strategy.js +0 -15
  346. package/assets/plugin/trading-params-cache.d.ts +0 -26
  347. package/assets/plugin/trading-params-cache.js +0 -52
  348. package/assets/plugin/types.d.ts +0 -134
  349. package/assets/plugin/types.js +0 -7
  350. package/assets/plugin/util/plugin-paths.d.ts +0 -3
  351. package/assets/plugin/util/plugin-paths.js +0 -15
  352. package/assets/plugin/venues/hyperliquid/hl-balance.d.ts +0 -116
  353. package/assets/plugin/venues/hyperliquid/hl-balance.js +0 -145
  354. package/assets/plugin/venues/hyperliquid/hl-bracket-coordinator.d.ts +0 -123
  355. package/assets/plugin/venues/hyperliquid/hl-bracket-coordinator.js +0 -533
  356. package/assets/plugin/venues/hyperliquid/hl-brackets.d.ts +0 -102
  357. package/assets/plugin/venues/hyperliquid/hl-brackets.js +0 -172
  358. package/assets/plugin/venues/hyperliquid/hl-cloid.d.ts +0 -22
  359. package/assets/plugin/venues/hyperliquid/hl-cloid.js +0 -82
  360. package/assets/plugin/venues/hyperliquid/hl-info-cache.d.ts +0 -46
  361. package/assets/plugin/venues/hyperliquid/hl-info-cache.js +0 -125
  362. package/assets/plugin/venues/hyperliquid/hl-live-adapter.d.ts +0 -146
  363. package/assets/plugin/venues/hyperliquid/hl-live-adapter.js +0 -728
  364. package/assets/plugin/venues/hyperliquid/hl-precision.d.ts +0 -61
  365. package/assets/plugin/venues/hyperliquid/hl-precision.js +0 -176
  366. package/assets/plugin/venues/hyperliquid/hl-private.d.ts +0 -88
  367. package/assets/plugin/venues/hyperliquid/hl-private.js +0 -357
  368. package/assets/plugin/venues/hyperliquid/hl-public.d.ts +0 -79
  369. package/assets/plugin/venues/hyperliquid/hl-public.js +0 -436
  370. package/assets/plugin/venues/hyperliquid/hl-rate-gate.d.ts +0 -57
  371. package/assets/plugin/venues/hyperliquid/hl-rate-gate.js +0 -220
  372. package/assets/plugin/venues/hyperliquid/hl-user-stream.d.ts +0 -90
  373. package/assets/plugin/venues/hyperliquid/hl-user-stream.js +0 -220
  374. package/assets/plugin/venues/registry.d.ts +0 -38
  375. package/assets/plugin/venues/registry.js +0 -46
  376. package/assets/plugin/venues/symbols.d.ts +0 -43
  377. package/assets/plugin/venues/symbols.js +0 -107
  378. package/assets/plugin/wave9/live-account-capture.d.ts +0 -67
  379. package/assets/plugin/wave9/live-account-capture.js +0 -435
  380. package/assets/plugin/wave9/live-autonomous-protection.d.ts +0 -39
  381. package/assets/plugin/wave9/live-autonomous-protection.js +0 -112
  382. package/assets/plugin/wave9/live-durable-reconciliation-scheduler.d.ts +0 -33
  383. package/assets/plugin/wave9/live-durable-reconciliation-scheduler.js +0 -115
  384. package/assets/plugin/wave9/live-execution-ledger.d.ts +0 -107
  385. package/assets/plugin/wave9/live-execution-ledger.js +0 -498
  386. package/assets/plugin/wave9/live-position-confirmation.d.ts +0 -18
  387. package/assets/plugin/wave9/live-position-confirmation.js +0 -111
  388. package/assets/plugin/wave9/live-residual-protection.d.ts +0 -18
  389. package/assets/plugin/wave9/live-residual-protection.js +0 -250
  390. package/assets/plugin/wave9/live-startup-reconciliation.d.ts +0 -38
  391. package/assets/plugin/wave9/live-startup-reconciliation.js +0 -454
  392. package/assets/plugin/wave9/live-symbol-ownership.d.ts +0 -20
  393. package/assets/plugin/wave9/live-symbol-ownership.js +0 -132
  394. package/assets/plugin/wave9/paper-admission-guard.d.ts +0 -199
  395. package/assets/plugin/wave9/paper-admission-guard.js +0 -650
  396. package/assets/plugin/wave9/usdm-evidence-provider.d.ts +0 -42
  397. package/assets/plugin/wave9/usdm-evidence-provider.js +0 -133
@@ -1,796 +0,0 @@
1
- import { createHash } from 'node:crypto';
2
- import { applyWave9AdmissionBatch, } from '../portfolio/wave9-admission.js';
3
- import { DAY_MS, evaluateWave9Daily, WAVE9_LONG_STRATEGY, WAVE9_SHORT_STRATEGY, WAVE9_SYMBOL_PRIORITY, } from '../portfolio/wave9-policy.js';
4
- import { FOUR_HOURS_MS, createWave9UsdmEvidenceProvider, } from '../wave9/usdm-evidence-provider.js';
5
- import { isWave9ManagedPosition } from '../wave9/paper-admission-guard.js';
6
- import { fetchIntelApi } from './intel-api.js';
7
- export const WAVE9_BUNDLE_NAME = 'wave9_28d_momentum_reversal';
8
- export const WAVE9_EXECUTION_KERNEL = 'wave9_shared_v1';
9
- export const WAVE9_PAPER_ENTRY_WINDOW_MS = 10 * 60_000;
10
- export class IntelWave9ActivationClient {
11
- deps;
12
- constructor(deps) {
13
- this.deps = deps;
14
- }
15
- async getActivation() {
16
- const result = await fetchIntelApi('/api/wave9/activation', this.deps);
17
- if ('error' in result) {
18
- return {
19
- available: false,
20
- name: WAVE9_BUNDLE_NAME,
21
- executionModel: WAVE9_EXECUTION_KERNEL,
22
- active: false,
23
- error: String(result.error),
24
- };
25
- }
26
- const bundle = result.bundle;
27
- if (!bundle || typeof bundle !== 'object' || Array.isArray(bundle)) {
28
- return invalidActivation('response did not contain a bundle object');
29
- }
30
- const row = bundle;
31
- if (row.name !== WAVE9_BUNDLE_NAME
32
- || row.executionModel !== WAVE9_EXECUTION_KERNEL
33
- || typeof row.active !== 'boolean'
34
- || (row.source !== undefined
35
- && row.source !== 'tenant_override'
36
- && row.source !== 'global_default')) {
37
- return invalidActivation('response bundle failed strict validation');
38
- }
39
- return {
40
- available: true,
41
- name: WAVE9_BUNDLE_NAME,
42
- executionModel: WAVE9_EXECUTION_KERNEL,
43
- active: row.active,
44
- ...(row.source ? { source: row.source } : {}),
45
- };
46
- }
47
- }
48
- function invalidActivation(reason) {
49
- return {
50
- available: false,
51
- name: WAVE9_BUNDLE_NAME,
52
- executionModel: WAVE9_EXECUTION_KERNEL,
53
- active: false,
54
- error: `Invalid Wave 9 activation response: ${reason}`,
55
- };
56
- }
57
- function isExecutableMode(mode) {
58
- return mode === 'PAPER' || mode === 'LIVE';
59
- }
60
- function canonicalSymbol(symbol) {
61
- return symbol.toUpperCase().replace(/[^A-Z0-9]/g, '').replace(/USDTUSDT$/, 'USDT');
62
- }
63
- function executionSymbol(symbol) {
64
- const canonical = canonicalSymbol(symbol);
65
- if (!canonical.endsWith('USDT'))
66
- throw new Error(`unsupported Wave 9 execution symbol ${symbol}`);
67
- return `${canonical.slice(0, -4)}/USDT:USDT`;
68
- }
69
- function isWave9Position(position) {
70
- return isWave9ManagedPosition(position);
71
- }
72
- export function wave9MissionId(candidateId) {
73
- return `wave9_${createHash('sha256').update(candidateId).digest('hex').slice(0, 32)}`;
74
- }
75
- function nearlyEqual(left, right) {
76
- return Math.abs(left - right) <= 1e-9 * Math.max(1, Math.abs(left), Math.abs(right));
77
- }
78
- function requireBatch(batch, eventMs) {
79
- if (batch.venue !== 'binance_usdm'
80
- || batch.marketType !== 'future'
81
- || batch.eventTime.getTime() !== eventMs
82
- || batch.symbols.length !== WAVE9_SYMBOL_PRIORITY.length) {
83
- throw new Error('Wave 9 atomic evidence identity mismatch');
84
- }
85
- for (const [index, row] of batch.symbols.entries()) {
86
- if (row.symbol !== WAVE9_SYMBOL_PRIORITY[index]) {
87
- throw new Error('Wave 9 atomic evidence universe/order mismatch');
88
- }
89
- const opening = row.fourHourBars.find((bar) => bar.time.getTime() === eventMs);
90
- const completed = row.fourHourBars.find((bar) => bar.time.getTime() === eventMs - FOUR_HOURS_MS);
91
- if (!opening || !completed) {
92
- throw new Error(`Wave 9 4h boundary evidence missing for ${row.symbol}`);
93
- }
94
- }
95
- }
96
- function controlState(activation, snapshot, wave9Positions) {
97
- if (activation.available && activation.active) {
98
- return { state: 'active', reason: 'tenant_bundle_active' };
99
- }
100
- if (wave9Positions.length > 0) {
101
- return { state: 'exit_only', reason: 'bundle_inactive_with_open_wave9_position' };
102
- }
103
- if (!activation.available || !snapshot.positionsAvailable) {
104
- return {
105
- state: 'exit_only',
106
- reason: !activation.available
107
- ? 'activation_unavailable_fail_closed'
108
- : 'positions_unavailable_fail_closed',
109
- };
110
- }
111
- return { state: 'inactive', reason: 'tenant_bundle_inactive_and_flat' };
112
- }
113
- function canonicalAdmissionBook(snapshot) {
114
- const reasons = [];
115
- const limitations = [
116
- 'failed_attempt_event_latch_is_process_local_and_resets_on_restart',
117
- ];
118
- if (snapshot.tradingMode === 'PAPER') {
119
- limitations.push('market_mark_fingerprint_drift_requires_immediate_status_recall', 'paper_funding_not_booked', 'process_local_unlocked_simulator', 'cross_process_lease_absent_duplicate_concurrent_admission_not_ruled_out');
120
- }
121
- else {
122
- limitations.push('live_candidate_identity_uses_local_durable_execution_ledger', 'non_wave9_positions_are_enforced_by_the_generic_live_pretrade_gate', 'live_funding_is_not_attributed_per_wave9_position');
123
- }
124
- if (!isExecutableMode(snapshot.tradingMode)) {
125
- reasons.push('Wave 9 execution supports PAPER and LIVE only');
126
- }
127
- if (snapshot.tradingMode === 'LIVE'
128
- && snapshot.nativeStopProtectionAvailable !== true) {
129
- reasons.push('native stop protection is unavailable for LIVE Wave 9 execution');
130
- }
131
- if (!snapshot.positionsAvailable || !snapshot.positions) {
132
- reasons.push('locally complete account positions are unavailable');
133
- }
134
- if (!snapshot.openOrdersAvailable || snapshot.openOrderCount === undefined) {
135
- reasons.push('locally complete open-order state is unavailable');
136
- }
137
- else if (!Number.isInteger(snapshot.openOrderCount) || snapshot.openOrderCount < 0) {
138
- reasons.push('open-order count is invalid');
139
- }
140
- else if (snapshot.openOrderCount > 0) {
141
- reasons.push('pending exposure-increasing orders make admission geometry ambiguous');
142
- }
143
- if (!snapshot.cashEquityAvailable
144
- || snapshot.cashEquityUsd === undefined
145
- || !Number.isFinite(snapshot.cashEquityUsd)
146
- || snapshot.cashEquityUsd <= 0) {
147
- reasons.push('locally complete positive wallet cash is unavailable');
148
- }
149
- if (!snapshot.accountFingerprint
150
- || !/^[a-f0-9]{64}$/.test(snapshot.accountFingerprint)) {
151
- reasons.push('valid account fingerprint is unavailable');
152
- }
153
- const observed = snapshot.positions ?? [];
154
- const nonWave9 = observed.filter((position) => !isWave9Position(position));
155
- if (snapshot.tradingMode === 'PAPER' && nonWave9.length > 0) {
156
- reasons.push('non-Wave 9 positions make isolated-book projection ambiguous');
157
- }
158
- const positions = [];
159
- for (const position of observed.filter(isWave9Position)) {
160
- const symbol = canonicalSymbol(position.symbol);
161
- const direction = position.side === 'long' ? 'LONG' : 'SHORT';
162
- const expectedStrategy = direction === 'LONG' ? WAVE9_LONG_STRATEGY : WAVE9_SHORT_STRATEGY;
163
- if (snapshot.tradingMode === 'LIVE' && position.nativeStop?.verified !== true) {
164
- reasons.push(`verified exchange-native stop unavailable for ${position.missionId ?? symbol}`
165
- + `:${position.nativeStop?.reason ?? 'native_stop_missing'}`);
166
- continue;
167
- }
168
- if (!position.candidateId
169
- || !position.missionId
170
- || position.missionId !== wave9MissionId(position.candidateId)
171
- || position.strategy !== expectedStrategy
172
- || !WAVE9_SYMBOL_PRIORITY.includes(symbol)
173
- || position.stopPrice === undefined
174
- || !Number.isFinite(position.stopPrice)
175
- || (position.accruedFundingUsd !== undefined
176
- && !Number.isFinite(position.accruedFundingUsd))
177
- || !Number.isFinite(position.quantity)
178
- || position.quantity <= 0
179
- || !Number.isFinite(position.entryPrice)
180
- || position.entryPrice <= 0
181
- || !Number.isFinite(position.markPrice)
182
- || position.markPrice <= 0) {
183
- reasons.push(`incomplete durable Wave 9 geometry for ${position.missionId ?? symbol}`);
184
- continue;
185
- }
186
- positions.push({
187
- candidateId: position.candidateId,
188
- symbol,
189
- strategy: position.strategy,
190
- direction,
191
- entryPrice: position.entryPrice,
192
- quantity: position.quantity,
193
- markPrice: position.markPrice,
194
- initialStop: position.stopPrice,
195
- dollarRiskUsd: Math.abs(position.entryPrice - position.stopPrice) * position.quantity,
196
- // PAPER does not book per-position funding and the LIVE execution
197
- // ledger does not yet attribute it, so both capture paths expose zero.
198
- accruedFundingUsd: position.accruedFundingUsd ?? 0,
199
- });
200
- }
201
- if (positions.length !== observed.filter(isWave9Position).length) {
202
- reasons.push('not every observed Wave 9 position has complete local admission geometry');
203
- }
204
- return {
205
- available: reasons.length === 0,
206
- ...(snapshot.cashEquityUsd !== undefined ? { cashEquityUsd: snapshot.cashEquityUsd } : {}),
207
- positions,
208
- reasons: [...new Set(reasons)],
209
- limitations: [...new Set([...(snapshot.reasons ?? []), ...limitations])],
210
- };
211
- }
212
- function candidateFor(symbol, eventTime, openingPrice, entry) {
213
- return {
214
- id: `${eventTime}|${symbol}|${entry.strategy}|${entry.direction}`,
215
- eventTime,
216
- symbol,
217
- strategy: entry.strategy,
218
- direction: entry.direction,
219
- referencePrice: openingPrice,
220
- stopPrice: entry.stopPrice,
221
- };
222
- }
223
- function decisionSummary(decision) {
224
- return {
225
- candidateId: decision.id,
226
- missionId: wave9MissionId(decision.id),
227
- accepted: decision.accepted,
228
- reason: decision.reason,
229
- direction: decision.direction,
230
- referenceOpen: decision.referencePrice,
231
- modeledEntryPrice: decision.entryPrice ?? null,
232
- quantity: decision.quantity ?? null,
233
- stopPrice: decision.stopPrice,
234
- targets: [],
235
- targetPolicy: 'none_completed_daily_signal_reversal',
236
- projectedOpenPositions: decision.projectedOpenPositions ?? null,
237
- projectedGrossExposureUsd: decision.projectedGrossExposureUsd ?? null,
238
- projectedOpenRiskUsd: decision.projectedOpenRiskUsd ?? null,
239
- projectedLiquidationEquityUsd: decision.projectedLiquidationEquityUsd ?? null,
240
- };
241
- }
242
- function batchId(eventTime, decisions, accountFingerprint, tradingMode) {
243
- const identity = decisions.map((decision) => decision.id).join('\n');
244
- return `wave9_batch_${createHash('sha256')
245
- .update(`${eventTime}\n${tradingMode}\n${accountFingerprint}\n${identity}`)
246
- .digest('hex').slice(0, 24)}`;
247
- }
248
- function authorizationAbsenceMeaning(state, modeSupported, venueSupported) {
249
- if (!venueSupported)
250
- return 'strategy_unavailable_on_current_venue';
251
- if (!modeSupported)
252
- return 'strategy_unavailable_in_current_mode';
253
- if (state === 'inactive')
254
- return 'strategy_disabled_by_operator_toggle';
255
- if (state === 'exit_only')
256
- return 'no_new_entries_exit_management_only';
257
- return 'wait_strategy_remains_enabled';
258
- }
259
- function baseStatus(activation, snapshot, state, observedAt, executionVenue, clockValid) {
260
- const modeSupported = isExecutableMode(snapshot.tradingMode);
261
- const venueSupported = executionVenue === 'binance';
262
- const runtimeReadinessFailures = [];
263
- if (!clockValid)
264
- runtimeReadinessFailures.push('status_clock_invalid');
265
- if (!venueSupported)
266
- runtimeReadinessFailures.push('unsupported_execution_venue');
267
- if (!modeSupported)
268
- runtimeReadinessFailures.push('unsupported_trading_mode');
269
- if (state.state === 'inactive') {
270
- runtimeReadinessFailures.push('strategy_disabled_by_operator_toggle');
271
- }
272
- else if (state.state === 'exit_only') {
273
- runtimeReadinessFailures.push(`control_state_exit_only:${state.reason}`);
274
- }
275
- if (!snapshot.positionsAvailable)
276
- runtimeReadinessFailures.push('account_positions_unavailable');
277
- if (!snapshot.openOrdersAvailable)
278
- runtimeReadinessFailures.push('account_open_orders_unavailable');
279
- if (!snapshot.cashEquityAvailable)
280
- runtimeReadinessFailures.push('account_cash_equity_unavailable');
281
- if (snapshot.tradingMode === 'LIVE') {
282
- if (snapshot.adapterReadiness !== 'READY') {
283
- runtimeReadinessFailures.push(`live_adapter_not_ready:${snapshot.adapterReadiness ?? 'unknown'}`);
284
- }
285
- if (snapshot.nativeStopProtectionAvailable !== true) {
286
- runtimeReadinessFailures.push('live_native_stop_protection_unavailable');
287
- }
288
- }
289
- const runtimeReadyForNewEntryAuthorization = runtimeReadinessFailures.length === 0;
290
- const runtimeReadinessReasons = runtimeReadyForNewEntryAuthorization
291
- ? [snapshot.tradingMode === 'LIVE'
292
- ? 'live_adapter_account_and_native_stops_ready'
293
- : 'paper_account_snapshot_ready']
294
- : [...new Set(runtimeReadinessFailures)];
295
- const strategyEnabled = activation.available && activation.active;
296
- const liveCapabilityEnabled = strategyEnabled
297
- && state.state === 'active'
298
- && venueSupported
299
- && snapshot.tradingMode === 'LIVE';
300
- const effectiveStatus = !venueSupported
301
- ? 'unsupported_venue'
302
- : !modeSupported
303
- ? 'unsupported_mode'
304
- : state.state === 'inactive'
305
- ? 'disabled_by_operator_toggle'
306
- : state.state === 'exit_only'
307
- ? 'exit_only'
308
- : snapshot.tradingMode === 'LIVE'
309
- ? 'live_enabled'
310
- : 'paper_enabled';
311
- const missingCurrentAuthorizationMeans = authorizationAbsenceMeaning(state.state, modeSupported, venueSupported);
312
- return {
313
- kind: 'wave9_agent_status',
314
- statusContractVersion: 2,
315
- bundle: activation,
316
- controlState: state.state,
317
- controlStateReason: state.reason,
318
- executionKernel: WAVE9_EXECUTION_KERNEL,
319
- tradeability: {
320
- effectiveStatus,
321
- strategyEnabled,
322
- operatorToggleActive: strategyEnabled,
323
- venue: executionVenue,
324
- venueSupported,
325
- currentMode: snapshot.tradingMode,
326
- supportedModes: ['PAPER', 'LIVE'],
327
- currentModeSupported: modeSupported,
328
- adapterReadiness: snapshot.adapterReadiness ?? null,
329
- wave9PositionCount: snapshot.positionsAvailable
330
- ? (snapshot.positions ?? []).filter(isWave9Position).length
331
- : null,
332
- liveCapabilityEnabled,
333
- usesRealFunds: snapshot.tradingMode === 'LIVE' || snapshot.tradingMode === 'MICRO_LIVE',
334
- runtimeReadyForNewEntryAuthorization,
335
- runtimeReadinessReasons,
336
- authorizationModel: 'short_lived_exact_token',
337
- missingCurrentAuthorizationMeans,
338
- },
339
- currentActionAuthorization: {
340
- entry: 'none',
341
- exit: 'none',
342
- entryCount: 0,
343
- exitCount: 0,
344
- entryReason: 'not_evaluated',
345
- exitReason: 'not_evaluated',
346
- noneMeaning: missingCurrentAuthorizationMeans,
347
- },
348
- statusCall: {
349
- mutatesOrders: false,
350
- returnedAuthorizationsMayAuthorizeOrders: true,
351
- },
352
- observedAt,
353
- accountProvenance: {
354
- source: snapshot.source,
355
- provenance: snapshot.provenance,
356
- authoritative: snapshot.authoritative,
357
- accountFingerprint: snapshot.accountFingerprint ?? null,
358
- },
359
- };
360
- }
361
- function currentActionAuthorization(entryCount, exitCount, entryReason, exitReason, noneMeaning) {
362
- return {
363
- entry: entryCount > 0 ? 'authorized' : 'none',
364
- exit: exitCount > 0 ? 'authorized' : 'none',
365
- entryCount,
366
- exitCount,
367
- entryReason,
368
- exitReason,
369
- noneMeaning,
370
- };
371
- }
372
- function requiredOperatorReport(base, action) {
373
- const tradeability = base.tradeability;
374
- const currentMode = String(tradeability.currentMode ?? 'UNKNOWN');
375
- const effectiveStatus = String(tradeability.effectiveStatus ?? 'unknown');
376
- const liveCapabilityEnabled = tradeability.liveCapabilityEnabled === true;
377
- const usesRealFunds = tradeability.usesRealFunds === true;
378
- const runtimeReady = tradeability.runtimeReadyForNewEntryAuthorization === true;
379
- const runtimeReadinessReasons = Array.isArray(tradeability.runtimeReadinessReasons)
380
- ? tradeability.runtimeReadinessReasons.map(String)
381
- : ['runtime_readiness_reason_unavailable'];
382
- const entryCount = Number(action.entryCount ?? 0);
383
- const exitCount = Number(action.exitCount ?? 0);
384
- const entryReason = String(action.entryReason ?? 'unknown');
385
- const exitReason = String(action.exitReason ?? 'unknown');
386
- const liveCapabilityLine = currentMode === 'LIVE' && liveCapabilityEnabled
387
- ? 'Wave 9 is enabled for LIVE trading.'
388
- : `Wave 9 LIVE capability: ${liveCapabilityEnabled ? 'enabled' : 'not enabled'} (effective status: ${effectiveStatus}; current mode: ${currentMode}).`;
389
- return {
390
- contractVersion: 1,
391
- instruction: 'Reproduce every line below in the operator reply. Do not omit, merge, or paraphrase away the labels, counts, or reasons.',
392
- lines: [
393
- liveCapabilityLine,
394
- `Current mode: ${currentMode}; real funds: ${usesRealFunds ? 'yes' : 'no'}.`,
395
- `Runtime readiness for new entry authorization: ${runtimeReady ? 'READY' : 'NOT READY'} (${runtimeReady}; reasons: ${runtimeReadinessReasons.join(', ')}).`,
396
- `Current entry authorizations: ${entryCount} (reason: ${entryReason}).`,
397
- `Current exit authorizations: ${exitCount} (reason: ${exitReason}).`,
398
- ],
399
- readOnlyBoundary: 'Reporting status alone does not authorize placing or closing an order or toggling a strategy.',
400
- };
401
- }
402
- function statusWithCurrentAction(base, action) {
403
- return {
404
- ...base,
405
- currentActionAuthorization: action,
406
- requiredOperatorReport: requiredOperatorReport(base, action),
407
- };
408
- }
409
- export async function getWave9StatusTool(deps) {
410
- const now = (deps.now ?? (() => new Date()))();
411
- const nowMs = now.getTime();
412
- const clockValid = Number.isFinite(nowMs);
413
- const activation = await deps.activationClient.getActivation();
414
- const preflightSnapshot = await deps.operationLock.withAccountLock('wave9-status-preflight', () => deps.getAccountSnapshot());
415
- const observedPositions = preflightSnapshot.positionsAvailable
416
- ? (preflightSnapshot.positions ?? [])
417
- : [];
418
- const wave9Positions = observedPositions.filter(isWave9Position);
419
- const state = controlState(activation, preflightSnapshot, wave9Positions);
420
- const base = baseStatus(activation, preflightSnapshot, state, clockValid ? now.toISOString() : null, deps.executionVenue, clockValid);
421
- if (!clockValid) {
422
- return {
423
- ...statusWithCurrentAction(base, currentActionAuthorization(0, 0, 'invalid_status_clock', 'invalid_status_clock', authorizationAbsenceMeaning(state.state, isExecutableMode(preflightSnapshot.tradingMode), deps.executionVenue === 'binance'))),
424
- error: 'Wave 9 status clock is invalid',
425
- evidenceAvailable: false,
426
- evaluationSkipped: 'invalid_status_clock',
427
- decisions: [],
428
- authorizations: { entries: [], exits: [] },
429
- };
430
- }
431
- if (deps.executionVenue !== 'binance') {
432
- return {
433
- ...statusWithCurrentAction(base, currentActionAuthorization(0, 0, 'unsupported_execution_venue', 'unsupported_execution_venue', 'strategy_unavailable_on_current_venue')),
434
- evidenceAvailable: false,
435
- evaluationSkipped: 'unsupported_execution_venue',
436
- venue: deps.executionVenue,
437
- reason: 'Wave 9 is pinned to Binance USD-M futures and is unavailable on this execution venue.',
438
- decisions: [],
439
- authorizations: { entries: [], exits: [] },
440
- };
441
- }
442
- if (!isExecutableMode(preflightSnapshot.tradingMode)) {
443
- return {
444
- ...statusWithCurrentAction(base, currentActionAuthorization(0, 0, 'unsupported_trading_mode', 'unsupported_trading_mode', 'strategy_unavailable_in_current_mode')),
445
- evidenceAvailable: false,
446
- evaluationSkipped: 'unsupported_trading_mode',
447
- reason: 'Wave 9 authorizes exact PAPER or LIVE execution only; SHADOW and MICRO_LIVE are unsupported.',
448
- accountAdmission: canonicalAdmissionBook(preflightSnapshot),
449
- decisions: [],
450
- authorizations: { entries: [], exits: [] },
451
- };
452
- }
453
- // Inactive + authoritatively flat is a true no-market-construction path.
454
- if (state.state === 'inactive') {
455
- return {
456
- ...statusWithCurrentAction(base, currentActionAuthorization(0, 0, 'disabled_by_operator_toggle', 'no_managed_position', 'strategy_disabled_by_operator_toggle')),
457
- evidenceAvailable: false,
458
- evaluationSkipped: 'bundle_inactive_and_flat',
459
- decisions: [],
460
- authorizations: { entries: [], exits: [] },
461
- };
462
- }
463
- const eventMs = Math.floor(nowMs / DAY_MS) * DAY_MS;
464
- const eventTime = new Date(eventMs).toISOString();
465
- const entryDeadlineMs = eventMs + WAVE9_PAPER_ENTRY_WINDOW_MS;
466
- const entryWindowStatus = nowMs < entryDeadlineMs ? 'open' : 'missed_open';
467
- let batch;
468
- try {
469
- const provider = (deps.createEvidenceProvider ?? createWave9UsdmEvidenceProvider)();
470
- batch = await provider.fetchAtomicBatch(new Date(eventMs));
471
- requireBatch(batch, eventMs);
472
- }
473
- catch (error) {
474
- return {
475
- ...statusWithCurrentAction(base, currentActionAuthorization(0, 0, 'evidence_unavailable', 'evidence_unavailable', authorizationAbsenceMeaning(state.state, true, true))),
476
- eventTime,
477
- evidenceAvailable: false,
478
- evidenceError: error instanceof Error ? error.message : String(error),
479
- entryWindow: {
480
- status: entryWindowStatus,
481
- opensAt: eventTime,
482
- closesAt: new Date(entryDeadlineMs).toISOString(),
483
- observedDelayMs: nowMs - eventMs,
484
- },
485
- decisions: [],
486
- authorizations: { entries: [], exits: [] },
487
- };
488
- }
489
- const evaluate = deps.evaluateDaily ?? evaluateWave9Daily;
490
- const dailyBySymbol = new Map();
491
- const candidates = [];
492
- try {
493
- for (const row of batch.symbols) {
494
- const daily = evaluate(row.dailyBars, new Date(eventMs));
495
- const completed = row.fourHourBars.find((bar) => bar.time.getTime() === eventMs - FOUR_HOURS_MS);
496
- if (!nearlyEqual(daily.referencePrice, completed.close)) {
497
- throw new Error(`${row.symbol} completed-daily close does not match final completed 4h close`);
498
- }
499
- const opening = row.fourHourBars.find((bar) => bar.time.getTime() === eventMs).open;
500
- dailyBySymbol.set(row.symbol, daily);
501
- for (const entry of daily.entries) {
502
- candidates.push(candidateFor(row.symbol, eventTime, opening, entry));
503
- }
504
- }
505
- }
506
- catch (error) {
507
- return {
508
- ...statusWithCurrentAction(base, currentActionAuthorization(0, 0, 'evaluation_failed', 'evaluation_failed', authorizationAbsenceMeaning(state.state, true, true))),
509
- eventTime,
510
- evidenceAvailable: false,
511
- evidenceError: error instanceof Error ? error.message : String(error),
512
- decisions: [],
513
- authorizations: { entries: [], exits: [] },
514
- };
515
- }
516
- // Market I/O stays outside the trading lock. Re-capture the account
517
- // and issue all short-lived authorizations inside one serialized section so
518
- // a watcher/tool mutation cannot race snapshot-to-token binding.
519
- return deps.operationLock.withAccountLock('wave9-status-snapshot-and-authorize', async () => {
520
- const snapshot = await deps.getAccountSnapshot();
521
- const lockedObservedPositions = snapshot.positionsAvailable ? (snapshot.positions ?? []) : [];
522
- const lockedWave9Positions = lockedObservedPositions.filter(isWave9Position);
523
- const lockedState = controlState(activation, snapshot, lockedWave9Positions);
524
- const lockedBase = baseStatus(activation, snapshot, lockedState, now.toISOString(), deps.executionVenue, true);
525
- const book = canonicalAdmissionBook(snapshot);
526
- const alreadyExecutedThisEvent = new Set((snapshot.executedCandidateIds ?? []).filter((candidateId) => typeof candidateId === 'string' && candidateId.startsWith(`${eventTime}|`)));
527
- const occupiedNonWave9Symbols = new Set(lockedObservedPositions
528
- .filter((position) => !isWave9Position(position))
529
- .map((position) => canonicalSymbol(position.symbol)));
530
- const admissionCandidates = candidates.filter((candidate) => !alreadyExecutedThisEvent.has(candidate.id)
531
- && !occupiedNonWave9Symbols.has(candidate.symbol));
532
- // Reversal release is chronologically before same-event admission. When a
533
- // held position must exit, issue only the exit capability and require the
534
- // agent to re-call status after the close; never compute/authorize entries
535
- // against a position that is logically released but still actually held.
536
- const reversalDuePositions = lockedWave9Positions.filter((position) => {
537
- const daily = dailyBySymbol.get(canonicalSymbol(position.symbol));
538
- return daily
539
- ? (position.side === 'long' ? daily.exitLong : daily.exitShort)
540
- : false;
541
- });
542
- const exitInputs = [];
543
- if (isExecutableMode(snapshot.tradingMode)
544
- && deps.authorizationIssuer) {
545
- for (const position of lockedWave9Positions) {
546
- const symbol = canonicalSymbol(position.symbol);
547
- const daily = dailyBySymbol.get(symbol);
548
- if (!daily
549
- || !position.missionId
550
- || !position.candidateId
551
- || !position.positionFingerprint
552
- || !/^[a-f0-9]{64}$/.test(position.positionFingerprint))
553
- continue;
554
- const reversalDue = position.side === 'long' ? daily.exitLong : daily.exitShort;
555
- if (!reversalDue)
556
- continue;
557
- exitInputs.push({
558
- candidateId: position.candidateId,
559
- missionId: position.missionId,
560
- symbol,
561
- positionSide: position.side,
562
- reason: 'signal_reversal',
563
- notBeforeMs: eventMs,
564
- deadlineMs: eventMs + DAY_MS,
565
- positionFingerprint: position.positionFingerprint,
566
- tradingMode: snapshot.tradingMode,
567
- });
568
- }
569
- }
570
- let issuedExits = [];
571
- if (exitInputs.length > 0) {
572
- try {
573
- issuedExits = [...deps.authorizationIssuer.issueExitBatch(exitInputs)];
574
- }
575
- catch {
576
- // A malformed or stale recognized position must suppress admission, not
577
- // crash the heartbeat/status path or expose an unusable authorization.
578
- book.reasons.push('Wave 9 reversal authorization issuance failed closed');
579
- }
580
- }
581
- const exitAuthorizationByMission = new Map(issuedExits.map((authorization) => [authorization.missionId, authorization]));
582
- const pendingReversalRelease = reversalDuePositions.length > 0;
583
- let admissionDecisions = [];
584
- if (pendingReversalRelease) {
585
- book.reasons.push('execute authorized signal-reversal exits, then re-call status before admission');
586
- if (exitInputs.length !== reversalDuePositions.length
587
- || issuedExits.length !== exitInputs.length) {
588
- book.reasons.push('reversal_authorization_unavailable_for_one_or_more_due_positions');
589
- }
590
- }
591
- else if (book.available && lockedState.state === 'active') {
592
- try {
593
- admissionDecisions = applyWave9AdmissionBatch({
594
- cashEquityUsd: book.cashEquityUsd,
595
- positions: book.positions,
596
- }, admissionCandidates).decisions;
597
- }
598
- catch (error) {
599
- book.available = false;
600
- book.reasons.push(`shared admission kernel rejected account snapshot: ${error instanceof Error ? error.message : String(error)}`);
601
- }
602
- }
603
- else if (lockedState.state !== 'active') {
604
- book.reasons.push('new admissions disabled while bundle is inactive or exit-only');
605
- }
606
- const admissionById = new Map(admissionDecisions.map((decision) => [decision.id, decision]));
607
- const entryInputs = [];
608
- if (lockedState.state === 'active'
609
- && isExecutableMode(snapshot.tradingMode)
610
- && entryWindowStatus === 'open'
611
- && book.available
612
- && !pendingReversalRelease
613
- && snapshot.accountFingerprint
614
- && deps.authorizationIssuer) {
615
- // Authorize exactly one mutation. Its real fill/fee changes both the
616
- // fingerprint and the next candidate's sizing/caps, so later accepted
617
- // modeled decisions require a fresh status call against the actual book.
618
- const authorizationTradingMode = snapshot.tradingMode;
619
- const accepted = admissionDecisions.filter((decision) => decision.accepted).slice(0, 1);
620
- const id = batchId(eventTime, admissionDecisions, snapshot.accountFingerprint, authorizationTradingMode);
621
- accepted.forEach((decision, sequence) => {
622
- entryInputs.push({
623
- batchId: id,
624
- candidateId: decision.id,
625
- missionId: wave9MissionId(decision.id),
626
- symbol: decision.symbol,
627
- side: decision.direction === 'LONG' ? 'BUY' : 'SELL',
628
- quantity: String(decision.quantity),
629
- stopPrice: String(decision.stopPrice),
630
- sequence,
631
- notBeforeMs: eventMs,
632
- deadlineMs: entryDeadlineMs,
633
- accountFingerprint: snapshot.accountFingerprint,
634
- tradingMode: authorizationTradingMode,
635
- });
636
- });
637
- }
638
- const issuedEntries = entryInputs.length > 0
639
- ? [...deps.authorizationIssuer.issueBatch(entryInputs)]
640
- : [];
641
- const entryAuthorizationByCandidate = new Map(issuedEntries.map((authorization) => [authorization.candidateId, authorization]));
642
- const decisions = WAVE9_SYMBOL_PRIORITY.map((symbol) => {
643
- const daily = dailyBySymbol.get(symbol);
644
- const position = lockedWave9Positions.find((candidate) => canonicalSymbol(candidate.symbol) === symbol);
645
- const rowCandidates = candidates.filter((candidate) => candidate.symbol === symbol);
646
- const entries = rowCandidates.map((candidate) => {
647
- const admission = admissionById.get(candidate.id);
648
- const firstAuthorizedCandidateId = issuedEntries[0]?.candidateId;
649
- const alreadyExecuted = alreadyExecutedThisEvent.has(candidate.id);
650
- const occupiedByNonWave9Position = occupiedNonWave9Symbols.has(candidate.symbol);
651
- const authorization = entryAuthorizationByCandidate.get(candidate.id);
652
- return {
653
- candidateId: candidate.id,
654
- missionId: wave9MissionId(candidate.id),
655
- executionSymbol: executionSymbol(candidate.symbol),
656
- strategy: candidate.strategy,
657
- direction: candidate.direction,
658
- referenceOpen: candidate.referencePrice,
659
- stopPrice: candidate.stopPrice,
660
- targets: [],
661
- targetPolicy: 'none_completed_daily_signal_reversal',
662
- capDecision: occupiedByNonWave9Position
663
- ? {
664
- status: 'symbol_occupied_by_non_wave9_position',
665
- reasons: ['the symbol already has a non-Wave 9 live position'],
666
- }
667
- : admission
668
- ? {
669
- ...decisionSummary(admission),
670
- authorizationStage: !admission.accepted
671
- ? 'rejected'
672
- : admission.id === firstAuthorizedCandidateId
673
- ? 'authorized_now'
674
- : entryWindowStatus === 'missed_open'
675
- ? 'missed_open_no_authorization'
676
- : issuedEntries.length > 0
677
- ? 'modeled_only_recall_after_prior_fill'
678
- : 'authorization_unavailable',
679
- }
680
- : {
681
- status: alreadyExecuted
682
- ? 'already_executed_this_event'
683
- : pendingReversalRelease
684
- ? 'pending_reversal_release'
685
- : book.available ? 'not_evaluated' : 'unavailable',
686
- reasons: alreadyExecuted
687
- ? ['already_executed_this_event', 'already_executed_durable_history']
688
- : book.reasons,
689
- },
690
- authorization: authorization
691
- ? { ...authorization, executionSymbol: executionSymbol(candidate.symbol) }
692
- : null,
693
- };
694
- });
695
- const reversalDue = position
696
- ? (position.side === 'long' ? daily.exitLong : daily.exitShort)
697
- : false;
698
- return {
699
- symbol,
700
- currentReturn: daily.currentReturn,
701
- previousReturn: daily.previousReturn,
702
- atr14: daily.atr14,
703
- completedDailyReferenceClose: daily.referencePrice,
704
- entryTransition: entries.length > 0,
705
- capDecision: entries.length > 0
706
- ? 'see_entries'
707
- : { status: 'not_candidate', reason: 'no_completed_daily_zero_cross' },
708
- entries,
709
- reversal: {
710
- exitLong: daily.exitLong,
711
- exitShort: daily.exitShort,
712
- observedPositionMissionId: position?.missionId ?? null,
713
- observedPositionSide: position?.side ?? null,
714
- due: reversalDue,
715
- timing: reversalDue && entryWindowStatus === 'missed_open'
716
- ? 'missed_open_late_exit'
717
- : reversalDue ? 'at_open_window' : 'not_due',
718
- executionSymbol: position ? executionSymbol(symbol) : null,
719
- authorization: position?.missionId && exitAuthorizationByMission.has(position.missionId)
720
- ? {
721
- ...exitAuthorizationByMission.get(position.missionId),
722
- executionSymbol: executionSymbol(symbol),
723
- }
724
- : null,
725
- },
726
- };
727
- });
728
- const allCandidatesAlreadyExecuted = candidates.length > 0
729
- && candidates.every((candidate) => alreadyExecutedThisEvent.has(candidate.id));
730
- const allCandidateSymbolsOccupied = candidates.length > 0
731
- && candidates.every((candidate) => occupiedNonWave9Symbols.has(candidate.symbol));
732
- const entryAuthorizationReason = issuedEntries.length > 0
733
- ? 'authorized'
734
- : lockedState.state !== 'active'
735
- ? 'strategy_not_active_for_entries'
736
- : pendingReversalRelease
737
- ? 'execute_reversal_then_recall_status'
738
- : entryWindowStatus === 'missed_open'
739
- ? 'entry_window_closed'
740
- : !book.available
741
- ? 'account_admission_unavailable'
742
- : candidates.length === 0
743
- ? 'no_entry_signal'
744
- : admissionCandidates.length === 0
745
- ? allCandidatesAlreadyExecuted
746
- ? 'all_entry_signals_already_executed'
747
- : allCandidateSymbolsOccupied
748
- ? 'all_entry_signal_symbols_occupied_by_non_wave9_positions'
749
- : 'entry_signals_not_eligible_for_admission'
750
- : admissionDecisions.some((decision) => decision.accepted)
751
- ? 'authorization_unavailable'
752
- : 'no_candidate_passed_admission';
753
- const exitAuthorizationReason = issuedExits.length > 0
754
- ? 'authorized'
755
- : lockedWave9Positions.length === 0
756
- ? 'no_managed_position'
757
- : reversalDuePositions.length === 0
758
- ? 'no_reversal_signal'
759
- : 'reversal_authorization_unavailable';
760
- return {
761
- ...statusWithCurrentAction(lockedBase, currentActionAuthorization(issuedEntries.length, issuedExits.length, entryAuthorizationReason, exitAuthorizationReason, authorizationAbsenceMeaning(lockedState.state, isExecutableMode(snapshot.tradingMode), deps.executionVenue === 'binance'))),
762
- eventTime,
763
- evidenceAvailable: true,
764
- evidence: {
765
- venue: batch.venue,
766
- marketType: batch.marketType,
767
- atomicUniverse: true,
768
- symbolOrder: [...WAVE9_SYMBOL_PRIORITY],
769
- },
770
- entryWindow: {
771
- status: entryWindowStatus,
772
- opensAt: eventTime,
773
- closesAt: new Date(entryDeadlineMs).toISOString(),
774
- halfOpen: true,
775
- observedDelayMs: nowMs - eventMs,
776
- lateEntryPolicy: 'do_not_chase',
777
- },
778
- accountAdmission: {
779
- available: book.available
780
- && lockedState.state === 'active'
781
- && !pendingReversalRelease,
782
- source: snapshot.source,
783
- cashEquityUsd: snapshot.cashEquityUsd ?? null,
784
- reasons: book.reasons,
785
- limitations: book.limitations,
786
- },
787
- decisions,
788
- authorizations: {
789
- entries: issuedEntries,
790
- exits: issuedExits,
791
- supportedModes: ['PAPER', 'LIVE'],
792
- orderMutationPerformed: false,
793
- },
794
- };
795
- });
796
- }