@reefclaw/connect 0.1.12 → 0.1.14

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 (391) hide show
  1. package/assets/plugin/audit/mode-transition-audit.d.ts +11 -0
  2. package/assets/plugin/audit/mode-transition-audit.js +29 -0
  3. package/assets/plugin/balance-utils.d.ts +36 -0
  4. package/assets/plugin/balance-utils.js +98 -0
  5. package/assets/plugin/ccxt/binance-ban-gate.d.ts +47 -0
  6. package/assets/plugin/ccxt/binance-ban-gate.js +420 -0
  7. package/assets/plugin/ccxt/binance-private.d.ts +346 -0
  8. package/assets/plugin/ccxt/binance-private.js +1525 -0
  9. package/assets/plugin/ccxt/binance-public.d.ts +34 -0
  10. package/assets/plugin/ccxt/binance-public.js +180 -0
  11. package/assets/plugin/ccxt/intel-public.d.ts +25 -0
  12. package/assets/plugin/ccxt/intel-public.js +80 -0
  13. package/assets/plugin/ccxt/public-market-data-api.d.ts +26 -0
  14. package/assets/plugin/ccxt/public-market-data-api.js +23 -0
  15. package/assets/plugin/config/agent-config-client.d.ts +77 -0
  16. package/assets/plugin/config/agent-config-client.js +188 -0
  17. package/assets/plugin/config/agent-config-poller.d.ts +32 -0
  18. package/assets/plugin/config/agent-config-poller.js +101 -0
  19. package/assets/plugin/config/brackets-config.d.ts +22 -0
  20. package/assets/plugin/config/brackets-config.js +58 -0
  21. package/assets/plugin/config/entitlement-gate.d.ts +51 -0
  22. package/assets/plugin/config/entitlement-gate.js +137 -0
  23. package/assets/plugin/config/gate-store.d.ts +18 -0
  24. package/assets/plugin/config/gate-store.js +61 -0
  25. package/assets/plugin/config/plugin-config-io.d.ts +222 -0
  26. package/assets/plugin/config/plugin-config-io.js +126 -0
  27. package/assets/plugin/config/position-review-config.d.ts +35 -0
  28. package/assets/plugin/config/position-review-config.js +105 -0
  29. package/assets/plugin/config/tool-gate.d.ts +53 -0
  30. package/assets/plugin/config/tool-gate.js +128 -0
  31. package/assets/plugin/config/user-data-stream-config.d.ts +89 -0
  32. package/assets/plugin/config/user-data-stream-config.js +239 -0
  33. package/assets/plugin/connector-supervisor.d.ts +36 -0
  34. package/assets/plugin/connector-supervisor.js +149 -0
  35. package/assets/plugin/exchange-adapter.d.ts +65 -0
  36. package/assets/plugin/exchange-adapter.js +4 -0
  37. package/assets/plugin/index.d.ts +30 -0
  38. package/assets/plugin/index.js +2763 -0
  39. package/assets/plugin/ingest/pending-entry-metadata.d.ts +74 -0
  40. package/assets/plugin/ingest/pending-entry-metadata.js +236 -0
  41. package/assets/plugin/ingest/position-auto-capture.d.ts +171 -0
  42. package/assets/plugin/ingest/position-auto-capture.js +709 -0
  43. package/assets/plugin/ingest/position-decisions-client.d.ts +327 -0
  44. package/assets/plugin/ingest/position-decisions-client.js +306 -0
  45. package/assets/plugin/ingest/readiness-reporter.d.ts +42 -0
  46. package/assets/plugin/ingest/readiness-reporter.js +163 -0
  47. package/assets/plugin/ingest/reconcile-db-vs-exchange.d.ts +51 -0
  48. package/assets/plugin/ingest/reconcile-db-vs-exchange.js +170 -0
  49. package/assets/plugin/ingest/reconciler-cleanup.d.ts +37 -0
  50. package/assets/plugin/ingest/reconciler-cleanup.js +147 -0
  51. package/assets/plugin/ingest/rest-gap-filler.d.ts +191 -0
  52. package/assets/plugin/ingest/rest-gap-filler.js +565 -0
  53. package/assets/plugin/ingest/touched-symbols-store.d.ts +25 -0
  54. package/assets/plugin/ingest/touched-symbols-store.js +96 -0
  55. package/assets/plugin/ingest/trade-store-client.d.ts +40 -0
  56. package/assets/plugin/ingest/trade-store-client.js +125 -0
  57. package/assets/plugin/ingest/ws-ingest.d.ts +43 -0
  58. package/assets/plugin/ingest/ws-ingest.js +126 -0
  59. package/assets/plugin/learning/setup-family.d.ts +21 -0
  60. package/assets/plugin/learning/setup-family.js +103 -0
  61. package/assets/plugin/lifecycle/install-signal-handlers.d.ts +33 -0
  62. package/assets/plugin/lifecycle/install-signal-handlers.js +112 -0
  63. package/assets/plugin/lifecycle/shutdown-coordinator.d.ts +43 -0
  64. package/assets/plugin/lifecycle/shutdown-coordinator.js +131 -0
  65. package/assets/plugin/lifecycle/trading-operation-lock.d.ts +17 -0
  66. package/assets/plugin/lifecycle/trading-operation-lock.js +14 -0
  67. package/assets/plugin/live/bracket-id.d.ts +26 -0
  68. package/assets/plugin/live/bracket-id.js +112 -0
  69. package/assets/plugin/live/bracket-ledger.d.ts +54 -0
  70. package/assets/plugin/live/bracket-ledger.js +267 -0
  71. package/assets/plugin/live/bracket-manager.d.ts +82 -0
  72. package/assets/plugin/live/bracket-manager.js +478 -0
  73. package/assets/plugin/live/bracket-params.d.ts +22 -0
  74. package/assets/plugin/live/bracket-params.js +124 -0
  75. package/assets/plugin/live/bracket-reconciler.d.ts +95 -0
  76. package/assets/plugin/live/bracket-reconciler.js +573 -0
  77. package/assets/plugin/live/bracket-types.d.ts +102 -0
  78. package/assets/plugin/live/bracket-types.js +8 -0
  79. package/assets/plugin/live/deposit-tracker.d.ts +62 -0
  80. package/assets/plugin/live/deposit-tracker.js +97 -0
  81. package/assets/plugin/live/emergency-controls.d.ts +32 -0
  82. package/assets/plugin/live/emergency-controls.js +226 -0
  83. package/assets/plugin/live/exchange-errors.d.ts +12 -0
  84. package/assets/plugin/live/exchange-errors.js +130 -0
  85. package/assets/plugin/live/exchange-info-cache.d.ts +37 -0
  86. package/assets/plugin/live/exchange-info-cache.js +134 -0
  87. package/assets/plugin/live/fact-subscriber.d.ts +78 -0
  88. package/assets/plugin/live/fact-subscriber.js +182 -0
  89. package/assets/plugin/live/fill-price.d.ts +13 -0
  90. package/assets/plugin/live/fill-price.js +37 -0
  91. package/assets/plugin/live/intent-journal.d.ts +42 -0
  92. package/assets/plugin/live/intent-journal.js +122 -0
  93. package/assets/plugin/live/listen-key-manager.d.ts +70 -0
  94. package/assets/plugin/live/listen-key-manager.js +169 -0
  95. package/assets/plugin/live/live-adapter.d.ts +319 -0
  96. package/assets/plugin/live/live-adapter.js +1906 -0
  97. package/assets/plugin/live/live-balance-enricher.d.ts +32 -0
  98. package/assets/plugin/live/live-balance-enricher.js +104 -0
  99. package/assets/plugin/live/live-bracket-api.d.ts +13 -0
  100. package/assets/plugin/live/live-bracket-api.js +20 -0
  101. package/assets/plugin/live/live-state-store.d.ts +194 -0
  102. package/assets/plugin/live/live-state-store.js +450 -0
  103. package/assets/plugin/live/local-signal-service.d.ts +57 -0
  104. package/assets/plugin/live/local-signal-service.js +151 -0
  105. package/assets/plugin/live/local-strategy-evaluator.d.ts +62 -0
  106. package/assets/plugin/live/local-strategy-evaluator.js +131 -0
  107. package/assets/plugin/live/microstructure-assembler.d.ts +54 -0
  108. package/assets/plugin/live/microstructure-assembler.js +148 -0
  109. package/assets/plugin/live/order-poller.d.ts +29 -0
  110. package/assets/plugin/live/order-poller.js +125 -0
  111. package/assets/plugin/live/position-state-store.d.ts +87 -0
  112. package/assets/plugin/live/position-state-store.js +237 -0
  113. package/assets/plugin/live/proposal-decision-listener.d.ts +70 -0
  114. package/assets/plugin/live/proposal-decision-listener.js +292 -0
  115. package/assets/plugin/live/proposal-manager.d.ts +76 -0
  116. package/assets/plugin/live/proposal-manager.js +140 -0
  117. package/assets/plugin/live/rate-limiter.d.ts +47 -0
  118. package/assets/plugin/live/rate-limiter.js +159 -0
  119. package/assets/plugin/live/reconciler.d.ts +39 -0
  120. package/assets/plugin/live/reconciler.js +175 -0
  121. package/assets/plugin/live/setup-buckets.d.ts +7 -0
  122. package/assets/plugin/live/setup-buckets.js +33 -0
  123. package/assets/plugin/live/slippage-tracker.d.ts +45 -0
  124. package/assets/plugin/live/slippage-tracker.js +78 -0
  125. package/assets/plugin/live/stop-watcher.d.ts +67 -0
  126. package/assets/plugin/live/stop-watcher.js +218 -0
  127. package/assets/plugin/live/user-data-active-probe.d.ts +54 -0
  128. package/assets/plugin/live/user-data-active-probe.js +180 -0
  129. package/assets/plugin/live/user-data-stream-controller.d.ts +200 -0
  130. package/assets/plugin/live/user-data-stream-controller.js +579 -0
  131. package/assets/plugin/live/user-data-stream-ws.d.ts +22 -0
  132. package/assets/plugin/live/user-data-stream-ws.js +63 -0
  133. package/assets/plugin/live/user-data-stream.d.ts +243 -0
  134. package/assets/plugin/live/user-data-stream.js +704 -0
  135. package/assets/plugin/logger.d.ts +2 -0
  136. package/assets/plugin/logger.js +2 -0
  137. package/assets/plugin/mfe.d.ts +21 -0
  138. package/assets/plugin/mfe.js +68 -0
  139. package/assets/plugin/onboarding/mode-ladder.d.ts +1 -0
  140. package/assets/plugin/onboarding/mode-ladder.js +3 -0
  141. package/assets/plugin/onboarding/runtime.d.ts +102 -0
  142. package/assets/plugin/onboarding/runtime.js +215 -0
  143. package/assets/plugin/openclaw.plugin.json +92 -0
  144. package/assets/plugin/paper-adapter.d.ts +24 -0
  145. package/assets/plugin/paper-adapter.js +91 -0
  146. package/assets/plugin/persistence/state-manager.d.ts +66 -0
  147. package/assets/plugin/persistence/state-manager.js +222 -0
  148. package/assets/plugin/pinned-plan.d.ts +9 -0
  149. package/assets/plugin/pinned-plan.js +23 -0
  150. package/assets/plugin/portfolio/reentry-tracker.d.ts +36 -0
  151. package/assets/plugin/portfolio/reentry-tracker.js +127 -0
  152. package/assets/plugin/portfolio/wave9-admission.d.ts +67 -0
  153. package/assets/plugin/portfolio/wave9-admission.js +262 -0
  154. package/assets/plugin/portfolio/wave9-policy.d.ts +36 -0
  155. package/assets/plugin/portfolio/wave9-policy.js +183 -0
  156. package/assets/plugin/risk/pre-trade-check.d.ts +38 -0
  157. package/assets/plugin/risk/pre-trade-check.js +345 -0
  158. package/assets/plugin/risk/pre-trade-types.d.ts +60 -0
  159. package/assets/plugin/risk/pre-trade-types.js +3 -0
  160. package/assets/plugin/shadow/shadow-tracker.d.ts +36 -0
  161. package/assets/plugin/shadow/shadow-tracker.js +151 -0
  162. package/assets/plugin/shadow/types.d.ts +42 -0
  163. package/assets/plugin/shadow/types.js +20 -0
  164. package/assets/plugin/shared/indicators-extended.d.ts +52 -0
  165. package/assets/plugin/shared/indicators-extended.js +291 -0
  166. package/assets/plugin/shared/indicators.d.ts +15 -0
  167. package/assets/plugin/shared/indicators.js +114 -0
  168. package/assets/plugin/signals/conditions/registry.d.ts +16 -0
  169. package/assets/plugin/signals/conditions/registry.js +1333 -0
  170. package/assets/plugin/signals/conditions/types.d.ts +1 -0
  171. package/assets/plugin/signals/conditions/types.js +4 -0
  172. package/assets/plugin/signals/direction-rules.d.ts +3 -0
  173. package/assets/plugin/signals/direction-rules.js +24 -0
  174. package/assets/plugin/signals/entry-rules.d.ts +6 -0
  175. package/assets/plugin/signals/entry-rules.js +33 -0
  176. package/assets/plugin/signals/serialize-context.d.ts +4 -0
  177. package/assets/plugin/signals/serialize-context.js +39 -0
  178. package/assets/plugin/signals/stop-rules.d.ts +3 -0
  179. package/assets/plugin/signals/stop-rules.js +48 -0
  180. package/assets/plugin/signals/strategy-adapter.d.ts +47 -0
  181. package/assets/plugin/signals/strategy-adapter.js +209 -0
  182. package/assets/plugin/signals/types.d.ts +1 -0
  183. package/assets/plugin/signals/types.js +8 -0
  184. package/assets/plugin/simulator/exchange-simulator.d.ts +105 -0
  185. package/assets/plugin/simulator/exchange-simulator.js +759 -0
  186. package/assets/plugin/simulator/fill-engine.d.ts +53 -0
  187. package/assets/plugin/simulator/fill-engine.js +280 -0
  188. package/assets/plugin/simulator/paper-market-feed.d.ts +26 -0
  189. package/assets/plugin/simulator/paper-market-feed.js +104 -0
  190. package/assets/plugin/simulator/realistic-fills.d.ts +59 -0
  191. package/assets/plugin/simulator/realistic-fills.js +175 -0
  192. package/assets/plugin/simulator/types.d.ts +228 -0
  193. package/assets/plugin/simulator/types.js +43 -0
  194. package/assets/plugin/strategy/builtin-strategies.d.ts +2 -0
  195. package/assets/plugin/strategy/builtin-strategies.js +113 -0
  196. package/assets/plugin/strategy/condition-registry.d.ts +3 -0
  197. package/assets/plugin/strategy/condition-registry.js +153 -0
  198. package/assets/plugin/strategy/evaluator.d.ts +70 -0
  199. package/assets/plugin/strategy/evaluator.js +98 -0
  200. package/assets/plugin/tools/assessment-validation.d.ts +141 -0
  201. package/assets/plugin/tools/assessment-validation.js +473 -0
  202. package/assets/plugin/tools/attach-brackets.d.ts +39 -0
  203. package/assets/plugin/tools/attach-brackets.js +564 -0
  204. package/assets/plugin/tools/audit-bracket-protection.d.ts +49 -0
  205. package/assets/plugin/tools/audit-bracket-protection.js +683 -0
  206. package/assets/plugin/tools/bracket-control.d.ts +12 -0
  207. package/assets/plugin/tools/bracket-control.js +35 -0
  208. package/assets/plugin/tools/cancel-all-orders.d.ts +9 -0
  209. package/assets/plugin/tools/cancel-all-orders.js +8 -0
  210. package/assets/plugin/tools/cancel-order.d.ts +14 -0
  211. package/assets/plugin/tools/cancel-order.js +60 -0
  212. package/assets/plugin/tools/check-position-health.d.ts +46 -0
  213. package/assets/plugin/tools/check-position-health.js +194 -0
  214. package/assets/plugin/tools/clear-exchange-credentials.d.ts +24 -0
  215. package/assets/plugin/tools/clear-exchange-credentials.js +70 -0
  216. package/assets/plugin/tools/close-position.d.ts +45 -0
  217. package/assets/plugin/tools/close-position.js +722 -0
  218. package/assets/plugin/tools/create-order.d.ts +89 -0
  219. package/assets/plugin/tools/create-order.js +1555 -0
  220. package/assets/plugin/tools/exit-gate.d.ts +58 -0
  221. package/assets/plugin/tools/exit-gate.js +162 -0
  222. package/assets/plugin/tools/fetch-balance.d.ts +5 -0
  223. package/assets/plugin/tools/fetch-balance.js +4 -0
  224. package/assets/plugin/tools/fetch-ohlcv.d.ts +11 -0
  225. package/assets/plugin/tools/fetch-ohlcv.js +8 -0
  226. package/assets/plugin/tools/fetch-open-orders.d.ts +7 -0
  227. package/assets/plugin/tools/fetch-open-orders.js +4 -0
  228. package/assets/plugin/tools/fetch-positions.d.ts +7 -0
  229. package/assets/plugin/tools/fetch-positions.js +4 -0
  230. package/assets/plugin/tools/fetch-ticker.d.ts +11 -0
  231. package/assets/plugin/tools/fetch-ticker.js +5 -0
  232. package/assets/plugin/tools/get-agent-profile.d.ts +4 -0
  233. package/assets/plugin/tools/get-agent-profile.js +6 -0
  234. package/assets/plugin/tools/get-analytics.d.ts +6 -0
  235. package/assets/plugin/tools/get-analytics.js +7 -0
  236. package/assets/plugin/tools/get-backtest.d.ts +12 -0
  237. package/assets/plugin/tools/get-backtest.js +91 -0
  238. package/assets/plugin/tools/get-basis.d.ts +7 -0
  239. package/assets/plugin/tools/get-basis.js +7 -0
  240. package/assets/plugin/tools/get-bracket-config.d.ts +11 -0
  241. package/assets/plugin/tools/get-bracket-config.js +24 -0
  242. package/assets/plugin/tools/get-cascade-risk.d.ts +7 -0
  243. package/assets/plugin/tools/get-cascade-risk.js +8 -0
  244. package/assets/plugin/tools/get-crypto-metrics.d.ts +18 -0
  245. package/assets/plugin/tools/get-crypto-metrics.js +62 -0
  246. package/assets/plugin/tools/get-cvd.d.ts +6 -0
  247. package/assets/plugin/tools/get-cvd.js +6 -0
  248. package/assets/plugin/tools/get-divergences.d.ts +6 -0
  249. package/assets/plugin/tools/get-divergences.js +6 -0
  250. package/assets/plugin/tools/get-funding-context.d.ts +6 -0
  251. package/assets/plugin/tools/get-funding-context.js +16 -0
  252. package/assets/plugin/tools/get-liquidation-levels.d.ts +7 -0
  253. package/assets/plugin/tools/get-liquidation-levels.js +7 -0
  254. package/assets/plugin/tools/get-liquidation-pulse.d.ts +9 -0
  255. package/assets/plugin/tools/get-liquidation-pulse.js +22 -0
  256. package/assets/plugin/tools/get-market-breadth.d.ts +6 -0
  257. package/assets/plugin/tools/get-market-breadth.js +8 -0
  258. package/assets/plugin/tools/get-market-intel.d.ts +19 -0
  259. package/assets/plugin/tools/get-market-intel.js +116 -0
  260. package/assets/plugin/tools/get-market-structure.d.ts +47 -0
  261. package/assets/plugin/tools/get-market-structure.js +198 -0
  262. package/assets/plugin/tools/get-my-mined-patterns.d.ts +20 -0
  263. package/assets/plugin/tools/get-my-mined-patterns.js +61 -0
  264. package/assets/plugin/tools/get-my-proposed-learnings.d.ts +20 -0
  265. package/assets/plugin/tools/get-my-proposed-learnings.js +55 -0
  266. package/assets/plugin/tools/get-my-recent-reviews.d.ts +22 -0
  267. package/assets/plugin/tools/get-my-recent-reviews.js +66 -0
  268. package/assets/plugin/tools/get-orderbook.d.ts +21 -0
  269. package/assets/plugin/tools/get-orderbook.js +32 -0
  270. package/assets/plugin/tools/get-pattern-scan.d.ts +7 -0
  271. package/assets/plugin/tools/get-pattern-scan.js +8 -0
  272. package/assets/plugin/tools/get-regime.d.ts +6 -0
  273. package/assets/plugin/tools/get-regime.js +7 -0
  274. package/assets/plugin/tools/get-relevant-learnings.d.ts +21 -0
  275. package/assets/plugin/tools/get-relevant-learnings.js +65 -0
  276. package/assets/plugin/tools/get-resting-liquidity.d.ts +6 -0
  277. package/assets/plugin/tools/get-resting-liquidity.js +11 -0
  278. package/assets/plugin/tools/get-risk-scenario.d.ts +29 -0
  279. package/assets/plugin/tools/get-risk-scenario.js +47 -0
  280. package/assets/plugin/tools/get-risk-summary.d.ts +51 -0
  281. package/assets/plugin/tools/get-risk-summary.js +118 -0
  282. package/assets/plugin/tools/get-sentiment.d.ts +4 -0
  283. package/assets/plugin/tools/get-sentiment.js +6 -0
  284. package/assets/plugin/tools/get-session-review.d.ts +7 -0
  285. package/assets/plugin/tools/get-session-review.js +8 -0
  286. package/assets/plugin/tools/get-setup-detail.d.ts +7 -0
  287. package/assets/plugin/tools/get-setup-detail.js +322 -0
  288. package/assets/plugin/tools/get-signals.d.ts +15 -0
  289. package/assets/plugin/tools/get-signals.js +54 -0
  290. package/assets/plugin/tools/get-sizing.d.ts +6 -0
  291. package/assets/plugin/tools/get-sizing.js +6 -0
  292. package/assets/plugin/tools/get-trade-feedback.d.ts +7 -0
  293. package/assets/plugin/tools/get-trade-feedback.js +8 -0
  294. package/assets/plugin/tools/get-trade-flow.d.ts +7 -0
  295. package/assets/plugin/tools/get-trade-flow.js +7 -0
  296. package/assets/plugin/tools/get-volume-analysis.d.ts +21 -0
  297. package/assets/plugin/tools/get-volume-analysis.js +74 -0
  298. package/assets/plugin/tools/get-volume-profile.d.ts +7 -0
  299. package/assets/plugin/tools/get-volume-profile.js +7 -0
  300. package/assets/plugin/tools/get-wave9-status.d.ts +127 -0
  301. package/assets/plugin/tools/get-wave9-status.js +796 -0
  302. package/assets/plugin/tools/helpers.d.ts +26 -0
  303. package/assets/plugin/tools/helpers.js +39 -0
  304. package/assets/plugin/tools/intel-api.d.ts +34 -0
  305. package/assets/plugin/tools/intel-api.js +119 -0
  306. package/assets/plugin/tools/intel-cache.d.ts +25 -0
  307. package/assets/plugin/tools/intel-cache.js +148 -0
  308. package/assets/plugin/tools/list-strategies.d.ts +17 -0
  309. package/assets/plugin/tools/list-strategies.js +23 -0
  310. package/assets/plugin/tools/modify-stop.d.ts +21 -0
  311. package/assets/plugin/tools/modify-stop.js +120 -0
  312. package/assets/plugin/tools/modify-target.d.ts +21 -0
  313. package/assets/plugin/tools/modify-target.js +110 -0
  314. package/assets/plugin/tools/propose-learning.d.ts +22 -0
  315. package/assets/plugin/tools/propose-learning.js +65 -0
  316. package/assets/plugin/tools/query-review-outcomes.d.ts +30 -0
  317. package/assets/plugin/tools/query-review-outcomes.js +64 -0
  318. package/assets/plugin/tools/query-trades.d.ts +21 -0
  319. package/assets/plugin/tools/query-trades.js +37 -0
  320. package/assets/plugin/tools/record-position-reviews.d.ts +38 -0
  321. package/assets/plugin/tools/record-position-reviews.js +147 -0
  322. package/assets/plugin/tools/save-strategy.d.ts +16 -0
  323. package/assets/plugin/tools/save-strategy.js +46 -0
  324. package/assets/plugin/tools/scan-pairs.d.ts +22 -0
  325. package/assets/plugin/tools/scan-pairs.js +234 -0
  326. package/assets/plugin/tools/score-setup.d.ts +31 -0
  327. package/assets/plugin/tools/score-setup.js +268 -0
  328. package/assets/plugin/tools/set-bracket-requirement.d.ts +18 -0
  329. package/assets/plugin/tools/set-bracket-requirement.js +81 -0
  330. package/assets/plugin/tools/set-exchange-credentials.d.ts +25 -0
  331. package/assets/plugin/tools/set-exchange-credentials.js +80 -0
  332. package/assets/plugin/tools/set-trading-mode.d.ts +26 -0
  333. package/assets/plugin/tools/set-trading-mode.js +152 -0
  334. package/assets/plugin/tools/test-exchange-credentials.d.ts +16 -0
  335. package/assets/plugin/tools/test-exchange-credentials.js +100 -0
  336. package/assets/plugin/tools/toggle-strategy.d.ts +8 -0
  337. package/assets/plugin/tools/toggle-strategy.js +15 -0
  338. package/assets/plugin/trading-params-cache.d.ts +26 -0
  339. package/assets/plugin/trading-params-cache.js +52 -0
  340. package/assets/plugin/types.d.ts +134 -0
  341. package/assets/plugin/types.js +7 -0
  342. package/assets/plugin/util/plugin-paths.d.ts +3 -0
  343. package/assets/plugin/util/plugin-paths.js +15 -0
  344. package/assets/plugin/venues/hyperliquid/hl-balance.d.ts +116 -0
  345. package/assets/plugin/venues/hyperliquid/hl-balance.js +145 -0
  346. package/assets/plugin/venues/hyperliquid/hl-bracket-coordinator.d.ts +123 -0
  347. package/assets/plugin/venues/hyperliquid/hl-bracket-coordinator.js +533 -0
  348. package/assets/plugin/venues/hyperliquid/hl-brackets.d.ts +102 -0
  349. package/assets/plugin/venues/hyperliquid/hl-brackets.js +172 -0
  350. package/assets/plugin/venues/hyperliquid/hl-cloid.d.ts +22 -0
  351. package/assets/plugin/venues/hyperliquid/hl-cloid.js +82 -0
  352. package/assets/plugin/venues/hyperliquid/hl-info-cache.d.ts +46 -0
  353. package/assets/plugin/venues/hyperliquid/hl-info-cache.js +125 -0
  354. package/assets/plugin/venues/hyperliquid/hl-live-adapter.d.ts +146 -0
  355. package/assets/plugin/venues/hyperliquid/hl-live-adapter.js +728 -0
  356. package/assets/plugin/venues/hyperliquid/hl-precision.d.ts +61 -0
  357. package/assets/plugin/venues/hyperliquid/hl-precision.js +176 -0
  358. package/assets/plugin/venues/hyperliquid/hl-private.d.ts +88 -0
  359. package/assets/plugin/venues/hyperliquid/hl-private.js +357 -0
  360. package/assets/plugin/venues/hyperliquid/hl-public.d.ts +79 -0
  361. package/assets/plugin/venues/hyperliquid/hl-public.js +436 -0
  362. package/assets/plugin/venues/hyperliquid/hl-rate-gate.d.ts +57 -0
  363. package/assets/plugin/venues/hyperliquid/hl-rate-gate.js +220 -0
  364. package/assets/plugin/venues/hyperliquid/hl-user-stream.d.ts +90 -0
  365. package/assets/plugin/venues/hyperliquid/hl-user-stream.js +220 -0
  366. package/assets/plugin/venues/registry.d.ts +38 -0
  367. package/assets/plugin/venues/registry.js +46 -0
  368. package/assets/plugin/venues/symbols.d.ts +43 -0
  369. package/assets/plugin/venues/symbols.js +107 -0
  370. package/assets/plugin/wave9/live-account-capture.d.ts +67 -0
  371. package/assets/plugin/wave9/live-account-capture.js +435 -0
  372. package/assets/plugin/wave9/live-autonomous-protection.d.ts +39 -0
  373. package/assets/plugin/wave9/live-autonomous-protection.js +112 -0
  374. package/assets/plugin/wave9/live-durable-reconciliation-scheduler.d.ts +33 -0
  375. package/assets/plugin/wave9/live-durable-reconciliation-scheduler.js +115 -0
  376. package/assets/plugin/wave9/live-execution-ledger.d.ts +107 -0
  377. package/assets/plugin/wave9/live-execution-ledger.js +498 -0
  378. package/assets/plugin/wave9/live-position-confirmation.d.ts +18 -0
  379. package/assets/plugin/wave9/live-position-confirmation.js +111 -0
  380. package/assets/plugin/wave9/live-residual-protection.d.ts +18 -0
  381. package/assets/plugin/wave9/live-residual-protection.js +250 -0
  382. package/assets/plugin/wave9/live-startup-reconciliation.d.ts +38 -0
  383. package/assets/plugin/wave9/live-startup-reconciliation.js +454 -0
  384. package/assets/plugin/wave9/live-symbol-ownership.d.ts +20 -0
  385. package/assets/plugin/wave9/live-symbol-ownership.js +132 -0
  386. package/assets/plugin/wave9/paper-admission-guard.d.ts +199 -0
  387. package/assets/plugin/wave9/paper-admission-guard.js +650 -0
  388. package/assets/plugin/wave9/usdm-evidence-provider.d.ts +42 -0
  389. package/assets/plugin/wave9/usdm-evidence-provider.js +133 -0
  390. package/dist/plugin.js +24 -15
  391. package/package.json +1 -1
@@ -0,0 +1,2 @@
1
+ export type { LogLevel } from '@reefclaw/shared';
2
+ export { logger, setLogLevel, formatError } from '@reefclaw/shared';
@@ -0,0 +1,2 @@
1
+ // Re-export from @reefclaw/shared (canonical source of truth).
2
+ export { logger, setLogLevel, formatError } from '@reefclaw/shared';
@@ -0,0 +1,21 @@
1
+ export interface MfeInputs {
2
+ side: 'long' | 'short';
3
+ entryPrice: number;
4
+ /** Stop at fill, frozen. If undefined, MFE-in-R is undefined. */
5
+ originalStopPrice?: number;
6
+ /** Latest mark observation. */
7
+ markPrice: number;
8
+ /** Prior peak from the last update (undefined on first call). */
9
+ priorPeakPrice?: number;
10
+ }
11
+ export interface MfeOutputs {
12
+ /** New peak price after observing this mark. */
13
+ mfePeakPrice: number;
14
+ /** Peak in R-multiples. Undefined if originalStopPrice missing. */
15
+ mfeR?: number;
16
+ /** Give-back ratio in [0, 1+]. Undefined if peak is not favourable yet. */
17
+ giveBackRatio?: number;
18
+ }
19
+ /** One-shot update: given current state + new mark, return the new peak,
20
+ * R-multiple, and give-back. Pure function — caller persists the result. */
21
+ export declare function updateMfe(input: MfeInputs): MfeOutputs;
@@ -0,0 +1,68 @@
1
+ // MFE (Max Favourable Excursion) tracking — pure math, no I/O.
2
+ //
3
+ // Component C of POSITION_MANAGEMENT_PLAN.md. The agent today has no felt
4
+ // sense of "I am leaking edge" because the heartbeat snapshot doesn't carry
5
+ // MFE or give-back. These helpers compute both from the entry-time stop and
6
+ // the running peak, and are wired into the paper simulator's mark-tick path
7
+ // and the live adapter's getPositions decoration.
8
+ //
9
+ // Conventions (confirmed with operator 2026-04-27):
10
+ // - 1R is denominated against the ORIGINAL stop at fill, frozen for the life
11
+ // of the position. Ratcheting the live stopPrice does not change R.
12
+ // - Without an originalStopPrice (e.g. paper position opened without a stop),
13
+ // `mfeR` and `giveBackRatio` are reported as `undefined` rather than
14
+ // fabricated from a default risk unit.
15
+ // - Sign is always favourable: long positions track the highest mark seen,
16
+ // short positions track the lowest. `mfeR` is non-negative.
17
+ //
18
+ // Edge cases handled:
19
+ // - Pre-entry tick (entry price not yet observed): caller should not invoke.
20
+ // - Adverse-only excursion (MFE never positive): `giveBackRatio` is left
21
+ // `undefined` because the ratio is meaningless when peak <= 0.
22
+ // - Tied peak (mark equals prior peak): treated as the peak; give-back stays 0.
23
+ /** Compute the favourable distance (always >= 0) between mark and entry. */
24
+ function favourableDelta(side, entry, mark) {
25
+ return side === 'long' ? mark - entry : entry - mark;
26
+ }
27
+ /** True if `candidate` is at least as favourable as `incumbent` for this side. */
28
+ function atLeastAsFavourable(side, candidate, incumbent) {
29
+ return side === 'long' ? candidate >= incumbent : candidate <= incumbent;
30
+ }
31
+ /** One-shot update: given current state + new mark, return the new peak,
32
+ * R-multiple, and give-back. Pure function — caller persists the result. */
33
+ export function updateMfe(input) {
34
+ const { side, entryPrice, originalStopPrice, markPrice, priorPeakPrice } = input;
35
+ if (!Number.isFinite(markPrice) || !Number.isFinite(entryPrice)) {
36
+ // Caller error — return prior peak unchanged.
37
+ return {
38
+ mfePeakPrice: priorPeakPrice ?? entryPrice,
39
+ mfeR: undefined,
40
+ giveBackRatio: undefined,
41
+ };
42
+ }
43
+ // Seed peak to entry on first observation, then ratchet only in the
44
+ // favourable direction.
45
+ const seedPeak = priorPeakPrice ?? entryPrice;
46
+ const newPeak = atLeastAsFavourable(side, markPrice, seedPeak) ? markPrice : seedPeak;
47
+ // Compute R if we have an original stop. R denominator is the at-fill
48
+ // distance from entry to stop; undefined or non-positive denominator means
49
+ // we can't report R.
50
+ const rDenominator = originalStopPrice !== undefined && Number.isFinite(originalStopPrice)
51
+ ? Math.abs(entryPrice - originalStopPrice)
52
+ : 0;
53
+ if (rDenominator <= 0) {
54
+ return { mfePeakPrice: newPeak, mfeR: undefined, giveBackRatio: undefined };
55
+ }
56
+ const peakFavourableDelta = favourableDelta(side, entryPrice, newPeak);
57
+ const currentFavourableDelta = favourableDelta(side, entryPrice, markPrice);
58
+ // mfeR is always non-negative — clamp adverse-only positions to 0.
59
+ const mfeR = Math.max(0, peakFavourableDelta / rDenominator);
60
+ // Give-back is only meaningful once peak has actually moved into profit.
61
+ // Negative peak (price went the wrong way and never recovered) → undefined.
62
+ let giveBackRatio;
63
+ if (peakFavourableDelta > 0) {
64
+ const givenBack = peakFavourableDelta - currentFavourableDelta;
65
+ giveBackRatio = Math.max(0, givenBack / peakFavourableDelta);
66
+ }
67
+ return { mfePeakPrice: newPeak, mfeR, giveBackRatio };
68
+ }
@@ -0,0 +1 @@
1
+ export { validateModeTransition, modeRequiresCredentials, type ModeTransitionResult, } from '@reefclaw/shared';
@@ -0,0 +1,3 @@
1
+ // Mode ladder — re-exported from @reefclaw/shared so plugin + skill + webapp
2
+ // all use the same source of truth. See shared/src/trading-mode.ts.
3
+ export { validateModeTransition, modeRequiresCredentials, } from '@reefclaw/shared';
@@ -0,0 +1,102 @@
1
+ import type { IExchangeAdapter } from '../exchange-adapter.js';
2
+ import type { ExchangeConfig, TradingMode } from '../types.js';
3
+ import type { ExchangeSimulator } from '../simulator/exchange-simulator.js';
4
+ import type { PaperMarketFeed } from '../simulator/paper-market-feed.js';
5
+ import { LiveAdapter } from '../live/live-adapter.js';
6
+ import type { HlCredentials } from '../venues/hyperliquid/hl-private.js';
7
+ import { type VenueId } from '../venues/registry.js';
8
+ import { PositionWatcher } from '../live/stop-watcher.js';
9
+ import type { TradingOperationLock } from '../lifecycle/trading-operation-lock.js';
10
+ export interface MicroLiveConfig {
11
+ sizeCapPercent?: number;
12
+ maxPositionUSDT?: number;
13
+ }
14
+ export interface BuildAdapterInput {
15
+ mode: TradingMode;
16
+ exchange: ExchangeConfig | null;
17
+ microLive?: MicroLiveConfig;
18
+ simulator: ExchangeSimulator;
19
+ /** Venue seam for the RUNTIME transition path (issue #217). Absent →
20
+ * 'binance' (every pre-venue caller byte-identical). The BOOT path got
21
+ * this seam in Phase 3 (createLiveAdapter in index.ts); the runtime flip
22
+ * — set_trading_mode, the product's go-live moment — missed it and
23
+ * constructed a Binance LiveAdapter unconditionally. */
24
+ venue?: VenueId;
25
+ /** Required for a live-mode build on the hyperliquid venue. */
26
+ hlCredentials?: HlCredentials | null;
27
+ }
28
+ /** Wave 9 safety wiring is created only after its durable ledger is loaded.
29
+ * Runtime reapplies these hooks to both the bootstrap objects and every
30
+ * adapter/watcher built by a reconnect. */
31
+ export interface Wave9LiveLifecycleHooks {
32
+ configureLiveAdapter?(adapter: LiveAdapter): void;
33
+ configurePositionWatcher?(watcher: PositionWatcher, adapter: IExchangeAdapter): void;
34
+ }
35
+ /** Pure-ish factory: builds an adapter for the requested mode.
36
+ * Falls back to PaperAdapter if a live mode is requested without credentials —
37
+ * callers should pre-validate via `modeRequiresCredentials`, but this
38
+ * defense-in-depth prevents a crash if validation is bypassed. */
39
+ export declare function buildAdapter(input: BuildAdapterInput): IExchangeAdapter;
40
+ /**
41
+ * Mutable runtime holder. Held once per plugin registration.
42
+ *
43
+ * `adapterBox.adapter` is the indirection point: tool closures read it at
44
+ * execute time so a swap is visible without re-registering tools.
45
+ */
46
+ export declare class PluginRuntime {
47
+ /** Box object so existing `const adapterDeps = { adapter }` patterns still
48
+ * work via `adapterDeps.adapter = runtime.adapterBox.adapter`. In practice
49
+ * we pass the runtime itself and read `runtime.adapter` at call sites. */
50
+ private _adapter;
51
+ private _mode;
52
+ private _stopWatcher;
53
+ private readonly simulator;
54
+ /** Paper-only background market-data feed (refreshes simulator marks so
55
+ * stops fire and NAV/uPnL stay live for non-dashboard symbols). Lives for
56
+ * the runtime's lifetime; started in paper, stopped in live. */
57
+ private readonly _marketFeed;
58
+ private readonly operationLock?;
59
+ private wave9LiveLifecycleHooks?;
60
+ /** Observer applied to EVERY stop-watcher this runtime creates (reconnects
61
+ * included). index.ts uses it to attach the journal auto-capture listener
62
+ * for watcher closes (issue #199) — without it, a live<->paper reconnect
63
+ * would silently shed the capture wiring. */
64
+ private readonly onWatcherCreated?;
65
+ /** Reconnect is serialized — a second caller waits for the first to finish
66
+ * so we never tear down an adapter that's mid-rebuild. */
67
+ private reconnectInFlight;
68
+ constructor(initial: {
69
+ adapter: IExchangeAdapter;
70
+ mode: TradingMode;
71
+ simulator: ExchangeSimulator;
72
+ stopWatcher?: PositionWatcher | null;
73
+ marketFeed?: PaperMarketFeed | null;
74
+ operationLock?: TradingOperationLock;
75
+ onWatcherCreated?: (watcher: PositionWatcher) => void;
76
+ });
77
+ get adapter(): IExchangeAdapter;
78
+ get mode(): TradingMode;
79
+ get stopWatcher(): PositionWatcher | null;
80
+ get marketFeed(): PaperMarketFeed | null;
81
+ setWave9LiveLifecycleHooks(hooks?: Wave9LiveLifecycleHooks): void;
82
+ /**
83
+ * Swap the current adapter for a new one built from `next`. The old
84
+ * adapter's background loops are stopped before the new one is wired in.
85
+ *
86
+ * `deps.adapterDeps` is the tool-dependency object used by trading tools —
87
+ * its `.adapter` reference is updated in place so tools see the new adapter
88
+ * without needing re-registration.
89
+ */
90
+ reconnect(next: {
91
+ mode: TradingMode;
92
+ exchange: ExchangeConfig | null;
93
+ microLive?: MicroLiveConfig;
94
+ venue?: VenueId;
95
+ hlCredentials?: HlCredentials | null;
96
+ }, deps: {
97
+ adapterDeps: {
98
+ adapter: IExchangeAdapter;
99
+ };
100
+ }): Promise<void>;
101
+ private doReconnect;
102
+ }
@@ -0,0 +1,215 @@
1
+ // Plugin runtime holder — the mutable state that survives across a
2
+ // credential/mode swap. The rest of index.ts closes over this object
3
+ // instead of over `let` bindings, so a reconnect can atomically:
4
+ //
5
+ // 1. Stop the live adapter's background loops (order poller + reconciler)
6
+ // 2. Stop the stop-watcher
7
+ // 3. Build a new adapter from updated config
8
+ // 4. Swap `runtime.adapter` in place (closures see the new value)
9
+ // 5. Start a new stop-watcher pointed at the new adapter
10
+ //
11
+ // Doing this without dropping tool registrations or rebuilding the whole
12
+ // plugin is what makes the dashboard "Reconnect Exchange" button feel
13
+ // instant — no gateway restart required.
14
+ import { PaperAdapter } from '../paper-adapter.js';
15
+ import { LiveAdapter } from '../live/live-adapter.js';
16
+ import { HyperliquidLiveAdapter } from '../venues/hyperliquid/hl-live-adapter.js';
17
+ import { createLiveAdapter } from '../venues/registry.js';
18
+ import { PositionWatcher } from '../live/stop-watcher.js';
19
+ import { loadBracketMode } from '../config/brackets-config.js';
20
+ import { loadStopWatcherIntervalMs, readPluginConfig } from '../config/plugin-config-io.js';
21
+ import { logger, formatError } from '../logger.js';
22
+ const TAG = 'plugin-runtime';
23
+ /** Pure-ish factory: builds an adapter for the requested mode.
24
+ * Falls back to PaperAdapter if a live mode is requested without credentials —
25
+ * callers should pre-validate via `modeRequiresCredentials`, but this
26
+ * defense-in-depth prevents a crash if validation is bypassed. */
27
+ export function buildAdapter(input) {
28
+ const { mode, exchange, microLive, simulator } = input;
29
+ if (mode === 'PAPER' || mode === 'SHADOW') {
30
+ // Shadow mode uses a paper adapter for execution; the separate
31
+ // ShadowTracker wraps a BinancePrivateApi for real-balance comparison.
32
+ return new PaperAdapter(simulator);
33
+ }
34
+ // Hyperliquid live (issue #217): mirror the boot path's construction —
35
+ // per-venue credential shape, the SAME factory (createLiveAdapter), and
36
+ // the same fall-back-to-paper defense when credentials are absent.
37
+ if (input.venue === 'hyperliquid') {
38
+ if (!input.hlCredentials) {
39
+ logger.warn(TAG, `${mode} on hyperliquid requested without walletAddress+agentPrivateKey — falling back to PAPER`);
40
+ return new PaperAdapter(simulator);
41
+ }
42
+ return createLiveAdapter({
43
+ venue: 'hyperliquid',
44
+ args: {
45
+ credentials: input.hlCredentials,
46
+ mode: mode,
47
+ marketSlippagePct: readPluginConfig().hl?.marketSlippagePct,
48
+ },
49
+ });
50
+ }
51
+ if (!exchange) {
52
+ logger.warn(TAG, `${mode} requested without credentials — falling back to PAPER`);
53
+ return new PaperAdapter(simulator);
54
+ }
55
+ // Read bracket-mode from plugin-config at adapter build time so a config
56
+ // flip + "Reconnect Exchange" pattern picks up the new mode on the next swap.
57
+ const bracketMode = loadBracketMode();
58
+ return new LiveAdapter(exchange, mode, microLive, bracketMode);
59
+ }
60
+ /**
61
+ * Mutable runtime holder. Held once per plugin registration.
62
+ *
63
+ * `adapterBox.adapter` is the indirection point: tool closures read it at
64
+ * execute time so a swap is visible without re-registering tools.
65
+ */
66
+ export class PluginRuntime {
67
+ /** Box object so existing `const adapterDeps = { adapter }` patterns still
68
+ * work via `adapterDeps.adapter = runtime.adapterBox.adapter`. In practice
69
+ * we pass the runtime itself and read `runtime.adapter` at call sites. */
70
+ _adapter;
71
+ _mode;
72
+ _stopWatcher = null;
73
+ simulator;
74
+ /** Paper-only background market-data feed (refreshes simulator marks so
75
+ * stops fire and NAV/uPnL stay live for non-dashboard symbols). Lives for
76
+ * the runtime's lifetime; started in paper, stopped in live. */
77
+ _marketFeed;
78
+ operationLock;
79
+ wave9LiveLifecycleHooks;
80
+ /** Observer applied to EVERY stop-watcher this runtime creates (reconnects
81
+ * included). index.ts uses it to attach the journal auto-capture listener
82
+ * for watcher closes (issue #199) — without it, a live<->paper reconnect
83
+ * would silently shed the capture wiring. */
84
+ onWatcherCreated;
85
+ /** Reconnect is serialized — a second caller waits for the first to finish
86
+ * so we never tear down an adapter that's mid-rebuild. */
87
+ reconnectInFlight = null;
88
+ constructor(initial) {
89
+ this._adapter = initial.adapter;
90
+ this._mode = initial.mode;
91
+ this.simulator = initial.simulator;
92
+ this._stopWatcher = initial.stopWatcher ?? null;
93
+ this._marketFeed = initial.marketFeed ?? null;
94
+ this.operationLock = initial.operationLock;
95
+ this.onWatcherCreated = initial.onWatcherCreated;
96
+ }
97
+ get adapter() { return this._adapter; }
98
+ get mode() { return this._mode; }
99
+ get stopWatcher() { return this._stopWatcher; }
100
+ get marketFeed() { return this._marketFeed; }
101
+ setWave9LiveLifecycleHooks(hooks) {
102
+ this.wave9LiveLifecycleHooks = hooks;
103
+ if (this._adapter instanceof LiveAdapter) {
104
+ hooks?.configureLiveAdapter?.(this._adapter);
105
+ }
106
+ if (this._stopWatcher) {
107
+ hooks?.configurePositionWatcher?.(this._stopWatcher, this._adapter);
108
+ }
109
+ }
110
+ /**
111
+ * Swap the current adapter for a new one built from `next`. The old
112
+ * adapter's background loops are stopped before the new one is wired in.
113
+ *
114
+ * `deps.adapterDeps` is the tool-dependency object used by trading tools —
115
+ * its `.adapter` reference is updated in place so tools see the new adapter
116
+ * without needing re-registration.
117
+ */
118
+ async reconnect(next, deps) {
119
+ // Serialize concurrent reconnects.
120
+ if (this.reconnectInFlight) {
121
+ await this.reconnectInFlight;
122
+ }
123
+ const run = this.operationLock
124
+ ? this.operationLock.withAccountLock('runtime-reconnect', () => this.doReconnect(next, deps))
125
+ : this.doReconnect(next, deps);
126
+ this.reconnectInFlight = run.finally(() => {
127
+ this.reconnectInFlight = null;
128
+ });
129
+ await run;
130
+ }
131
+ async doReconnect(next, deps) {
132
+ logger.info(TAG, `Reconnect: ${this._mode} → ${next.mode}`);
133
+ // 1. Stop old stop-watcher.
134
+ if (this._stopWatcher) {
135
+ try {
136
+ this._stopWatcher.stop();
137
+ }
138
+ catch (err) {
139
+ logger.warn(TAG, `stopWatcher.stop failed: ${formatError(err)}`);
140
+ }
141
+ this._stopWatcher = null;
142
+ }
143
+ // 2. Tear down old live adapter background loops.
144
+ const old = this._adapter;
145
+ if (old instanceof LiveAdapter) {
146
+ try {
147
+ old.shutdown();
148
+ }
149
+ catch (err) {
150
+ logger.warn(TAG, `old adapter shutdown failed: ${formatError(err)}`);
151
+ }
152
+ }
153
+ else if (old instanceof HyperliquidLiveAdapter) {
154
+ // Stops the HL user stream + the 60s REST truth-check timer — without
155
+ // this, a flip AWAY from HL live leaks both (issue #217).
156
+ try {
157
+ old.stop();
158
+ }
159
+ catch (err) {
160
+ logger.warn(TAG, `old HL adapter stop failed: ${formatError(err)}`);
161
+ }
162
+ }
163
+ // 3. Build the new adapter.
164
+ const fresh = buildAdapter({
165
+ mode: next.mode,
166
+ exchange: next.exchange,
167
+ microLive: next.microLive,
168
+ simulator: this.simulator,
169
+ venue: next.venue,
170
+ hlCredentials: next.hlCredentials,
171
+ });
172
+ // Install autonomous protection callbacks before initialization can emit
173
+ // user-data or bracket-reconciler events.
174
+ if (fresh instanceof LiveAdapter) {
175
+ this.wave9LiveLifecycleHooks?.configureLiveAdapter?.(fresh);
176
+ }
177
+ // 4. Fire async init for live adapters (non-blocking — readiness flips
178
+ // INIT_PENDING → READY/DEGRADED/BLOCKED on its own).
179
+ if (fresh instanceof LiveAdapter || fresh instanceof HyperliquidLiveAdapter) {
180
+ fresh.initialize().catch(err => {
181
+ logger.error(TAG, `New adapter init failed: ${formatError(err)}`);
182
+ });
183
+ }
184
+ // 5. Atomically publish the new adapter.
185
+ // Note: `next.mode` is the operator's intent (e.g. SHADOW), which is
186
+ // not always the same as `fresh.mode` — PaperAdapter is used for both
187
+ // PAPER and SHADOW execution, and reports its mode as 'PAPER'. The
188
+ // runtime tracks the user-facing mode separately so tools that branch
189
+ // on SHADOW (e.g. risk summary) keep working.
190
+ this._adapter = fresh;
191
+ this._mode = next.mode;
192
+ deps.adapterDeps.adapter = fresh;
193
+ // 6. Start a new stop-watcher bound to the new adapter. Re-read the
194
+ // operator's cadence override — building with `undefined` here
195
+ // silently reverted plugin-config `stopWatcher.intervalMs` to the
196
+ // default on every reconnect.
197
+ const watcher = new PositionWatcher(fresh, loadStopWatcherIntervalMs(), this.operationLock);
198
+ this.wave9LiveLifecycleHooks?.configurePositionWatcher?.(watcher, fresh);
199
+ this.onWatcherCreated?.(watcher);
200
+ watcher.start();
201
+ this._stopWatcher = watcher;
202
+ // 7. Paper market feed follows the mode: run it when the new adapter is
203
+ // paper (so marks/stops/NAV stay live), stop it in live (the live
204
+ // adapter sources marks from Binance directly). Idempotent both ways.
205
+ if (this._marketFeed) {
206
+ if (fresh.isLive) {
207
+ this._marketFeed.stop();
208
+ }
209
+ else {
210
+ this._marketFeed.start();
211
+ }
212
+ }
213
+ logger.info(TAG, `Reconnect complete: now in ${this._mode} mode (readiness=${fresh.readiness})`);
214
+ }
215
+ }
@@ -0,0 +1,92 @@
1
+ {
2
+ "id": "reefclaw-paper-trading",
3
+ "name": "ReefClaw Trading",
4
+ "version": "0.1.9",
5
+ "description": "Supervised trading plugin for the ReefClaw dashboard: paper trading with real market data (no API keys required), and optional live trading on Binance or Hyperliquid behind explicit operator opt-in, exchange API credentials, and always-on protective stop brackets. Includes the dashboard connector bridge, heartbeat automation, and remote SKILL.md instruction updates from the ReefClaw webapp.",
6
+ "author": "ReefClaw",
7
+ "activation": {
8
+ "onStartup": true
9
+ },
10
+ "contracts": {
11
+ "tools": [
12
+ "fetch_ticker",
13
+ "fetch_ohlcv",
14
+ "fetch_balance",
15
+ "fetch_positions",
16
+ "fetch_open_orders",
17
+ "create_order",
18
+ "cancel_order",
19
+ "cancel_all_orders",
20
+ "close_position",
21
+ "modify_stop",
22
+ "modify_target",
23
+ "attach_brackets",
24
+ "audit_bracket_protection",
25
+ "record_position_reviews",
26
+ "get_my_recent_reviews",
27
+ "get_relevant_learnings",
28
+ "get_my_mined_patterns",
29
+ "get_my_proposed_learnings",
30
+ "propose_learning",
31
+ "query_review_outcomes",
32
+ "get_market_structure",
33
+ "get_crypto_metrics",
34
+ "get_volume_analysis",
35
+ "get_risk_summary",
36
+ "get_market_intel",
37
+ "get_regime",
38
+ "get_signals",
39
+ "get_wave9_status",
40
+ "get_analytics",
41
+ "get_orderbook",
42
+ "get_volume_profile",
43
+ "get_liquidation_levels",
44
+ "get_trade_feedback",
45
+ "get_trade_flow",
46
+ "score_setup",
47
+ "get_sizing",
48
+ "check_position_health",
49
+ "get_risk_scenario",
50
+ "get_session_review",
51
+ "get_backtest",
52
+ "get_pattern_scan",
53
+ "save_strategy",
54
+ "list_strategies",
55
+ "toggle_strategy",
56
+ "scan_pairs",
57
+ "get_setup_detail",
58
+ "query_trades",
59
+ "get_agent_profile",
60
+ "get_cvd",
61
+ "get_market_breadth",
62
+ "get_basis",
63
+ "get_cascade_risk",
64
+ "get_sentiment",
65
+ "get_divergences",
66
+ "get_liquidation_pulse",
67
+ "get_resting_liquidity",
68
+ "get_funding_context",
69
+ "set_exchange_credentials",
70
+ "set_trading_mode",
71
+ "test_exchange_credentials",
72
+ "clear_exchange_credentials",
73
+ "get_bracket_config",
74
+ "set_bracket_requirement"
75
+ ]
76
+ },
77
+ "configSchema": {
78
+ "type": "object",
79
+ "properties": {
80
+ "startingBalance": {
81
+ "type": "number",
82
+ "default": 10000,
83
+ "description": "Starting USDT balance for paper trading"
84
+ },
85
+ "symbol": {
86
+ "type": "string",
87
+ "default": "BTC/USDT",
88
+ "description": "Default trading symbol"
89
+ }
90
+ }
91
+ }
92
+ }
@@ -0,0 +1,24 @@
1
+ import type { IExchangeAdapter, AdapterReadiness, OrderOptions } from './exchange-adapter.js';
2
+ import type { ExchangeSimulator } from './simulator/exchange-simulator.js';
3
+ import type { CcxtOrder, CcxtBalance, CcxtPosition } from './types.js';
4
+ import type { PositionMetadata, CloseReason } from './simulator/types.js';
5
+ export declare class PaperAdapter implements IExchangeAdapter {
6
+ private simulator;
7
+ readonly mode: "PAPER";
8
+ readonly isLive = false;
9
+ readonly readiness: AdapterReadiness;
10
+ constructor(simulator: ExchangeSimulator);
11
+ /** Get the underlying simulator (for paper-only operations like ATR, orderbook, state). */
12
+ getSimulator(): ExchangeSimulator;
13
+ createOrder(symbol: string, side: 'buy' | 'sell', type: 'market' | 'limit', amount: number, price?: number, metadata?: PositionMetadata, _options?: OrderOptions): Promise<CcxtOrder>;
14
+ cancelOrder(orderId: string, _symbol?: string): Promise<CcxtOrder>;
15
+ cancelAllOrders(symbol?: string): Promise<CcxtOrder[]>;
16
+ closePosition(symbol: string, closeReason?: CloseReason): Promise<CcxtOrder>;
17
+ getBalance(): Promise<CcxtBalance>;
18
+ getPositions(symbol?: string): Promise<CcxtPosition[]>;
19
+ /** Paper has no exchange fetch to fail — position state is always known. */
20
+ getPositionsOrNull(symbol?: string): Promise<CcxtPosition[] | null>;
21
+ getOpenOrders(symbol?: string): Promise<CcxtOrder[]>;
22
+ fetchOrder(orderId: string, _symbol?: string): Promise<CcxtOrder | null>;
23
+ getLastPrice(symbol: string): Promise<number | null>;
24
+ }
@@ -0,0 +1,91 @@
1
+ // PaperAdapter — wraps ExchangeSimulator to implement IExchangeAdapter.
2
+ // No behavioral changes — just a thin async wrapper for uniform interface.
3
+ export class PaperAdapter {
4
+ simulator;
5
+ mode = 'PAPER';
6
+ isLive = false;
7
+ readiness = 'READY'; // Paper is always ready
8
+ constructor(simulator) {
9
+ this.simulator = simulator;
10
+ }
11
+ /** Get the underlying simulator (for paper-only operations like ATR, orderbook, state). */
12
+ getSimulator() {
13
+ return this.simulator;
14
+ }
15
+ async createOrder(symbol, side, type, amount, price, metadata, _options) {
16
+ // Paper mode ignores OrderOptions (clientOrderId, reduceOnly, positionSide)
17
+ return this.simulator.createOrder(symbol, side, type, amount, price, metadata);
18
+ }
19
+ async cancelOrder(orderId, _symbol) {
20
+ return this.simulator.cancelOrder(orderId);
21
+ }
22
+ async cancelAllOrders(symbol) {
23
+ return this.simulator.cancelAllOrders(symbol);
24
+ }
25
+ async closePosition(symbol, closeReason) {
26
+ return this.simulator.closePosition(symbol, closeReason);
27
+ }
28
+ async getBalance() {
29
+ return this.simulator.getBalance();
30
+ }
31
+ async getPositions(symbol) {
32
+ return this.simulator.getPositions(symbol);
33
+ }
34
+ /** Paper has no exchange fetch to fail — position state is always known. */
35
+ async getPositionsOrNull(symbol) {
36
+ return this.simulator.getPositions(symbol);
37
+ }
38
+ async getOpenOrders(symbol) {
39
+ return this.simulator.getOpenOrders(symbol);
40
+ }
41
+ async fetchOrder(orderId, _symbol) {
42
+ // Search open orders, then trade history for filled/canceled orders
43
+ const state = this.simulator.getState();
44
+ const openOrder = state.openOrders.find(o => o.id === orderId);
45
+ if (openOrder) {
46
+ return {
47
+ id: openOrder.id,
48
+ symbol: openOrder.symbol,
49
+ side: openOrder.side,
50
+ type: openOrder.type,
51
+ status: openOrder.status,
52
+ amount: openOrder.amount,
53
+ filled: openOrder.filled,
54
+ remaining: openOrder.amount - openOrder.filled,
55
+ average: openOrder.average,
56
+ price: openOrder.price,
57
+ cost: openOrder.cost,
58
+ fee: openOrder.fee,
59
+ timestamp: new Date(openOrder.createdAt).getTime(),
60
+ datetime: openOrder.createdAt,
61
+ timeInForce: 'GTC',
62
+ };
63
+ }
64
+ // Check trade history for filled orders
65
+ const trade = state.tradeHistory.find(t => t.orderId === orderId);
66
+ if (trade) {
67
+ return {
68
+ id: trade.orderId,
69
+ symbol: trade.symbol,
70
+ side: trade.side,
71
+ type: 'market', // Trades don't store order type; market is the common close path
72
+ status: 'closed',
73
+ amount: trade.quantity,
74
+ filled: trade.quantity,
75
+ remaining: 0,
76
+ average: trade.exitPrice,
77
+ price: trade.exitPrice,
78
+ cost: trade.exitPrice * trade.quantity,
79
+ fee: { cost: trade.fee, currency: 'USDT' },
80
+ timestamp: new Date(trade.closedAt).getTime(),
81
+ datetime: trade.closedAt,
82
+ timeInForce: 'GTC',
83
+ };
84
+ }
85
+ return null;
86
+ }
87
+ async getLastPrice(symbol) {
88
+ const ticker = this.simulator.getLastTicker(symbol);
89
+ return ticker?.last ?? null;
90
+ }
91
+ }