@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,473 +0,0 @@
1
- // Assessment-schema validators for agent tool calls (SKILL.md v2.10.0).
2
- //
3
- // The LLM's value is context-sensitive reasoning. We don't want to gate
4
- // trading tools behind time floors (a thesis CAN legitimately invalidate
5
- // in 60 seconds). We want to gate them behind PROOF that the reasoning
6
- // happened — a structured assessment the agent has to fill from real
7
- // scorecard data. If it filled the fields, the reasoning happened. If
8
- // it didn't, we reject.
9
- //
10
- // Used by:
11
- // - close-position.ts — requires `reason` + `assessment` on every call.
12
- // - create-order.ts — requires thesis + regime + confluence_score in
13
- // live mode.
14
- // Tested in: assessment-validation.test.ts.
15
- import { normalizeBracketSymbol } from '../live/bracket-ledger.js';
16
- // ---- protective geometry (create_order, issue #200) ----
17
- /** Minimum pre-entry stop distance in basis points (the SKILL v2.10.0
18
- * discipline floor's fixed component; the ATR component is enforced by the
19
- * live bracket path where ATR is authoritative). */
20
- export const MIN_STOP_DISTANCE_BPS = 30;
21
- /** Validate stop / invalidation / target geometry against the entry side.
22
- *
23
- * Before this existed the wrong-side check ran ONLY on the wave9 path
24
- * (create-order.ts) — a generic short entered with its stop BELOW entry
25
- * passed validation and was closed by the stop-watcher seconds later
26
- * (7 sub-5-minute kills on the 2026-07 HL soak, issue #200). Returns an
27
- * error string, or null when the geometry is sound. Fields left undefined
28
- * are not judged (stop-required policy stays with the caller). */
29
- export function validateProtectiveGeometry(args) {
30
- const { side, refPrice } = args;
31
- if (!Number.isFinite(refPrice) || refPrice <= 0)
32
- return null; // no reference — cannot judge
33
- const dirWord = side === 'buy' ? 'long' : 'short';
34
- if (args.stopPrice !== undefined) {
35
- const stop = args.stopPrice;
36
- if (!Number.isFinite(stop) || stop <= 0) {
37
- return 'stopPrice must be a positive finite number.';
38
- }
39
- if ((side === 'buy' && stop >= refPrice) || (side === 'sell' && stop <= refPrice)) {
40
- return (`stopPrice ${stop} is on the WRONG SIDE of entry ${refPrice} for a ${dirWord}: a ${dirWord}'s ` +
41
- `protective stop must be ${side === 'buy' ? 'below' : 'above'} entry. A wrong-side stop is ` +
42
- `instantly "breached" and the stop-watcher closes the position seconds after entry.`);
43
- }
44
- const distanceBps = (Math.abs(refPrice - stop) / refPrice) * 10_000;
45
- if (distanceBps < MIN_STOP_DISTANCE_BPS) {
46
- return (`stopPrice ${stop} is only ${distanceBps.toFixed(1)}bps from entry ${refPrice} — below the ` +
47
- `${MIN_STOP_DISTANCE_BPS}bps discipline floor. Place the stop at a structural level ` +
48
- `(≥ max(0.3×ATR, ${MIN_STOP_DISTANCE_BPS}bps) from entry).`);
49
- }
50
- }
51
- if (args.invalidationPrice !== undefined) {
52
- const inv = args.invalidationPrice;
53
- if (!Number.isFinite(inv) || inv <= 0) {
54
- return 'invalidation_price must be a positive finite number.';
55
- }
56
- if ((side === 'buy' && inv >= refPrice) || (side === 'sell' && inv <= refPrice)) {
57
- return (`invalidation_price ${inv} is on the WRONG SIDE of entry ${refPrice} for a ${dirWord}: ` +
58
- `invalidation must be ${side === 'buy' ? 'below' : 'above'} entry (it marks where the thesis ` +
59
- `is WRONG, not where it profits). Fix the pinned plan before entering.`);
60
- }
61
- }
62
- if (args.targetPrice !== undefined) {
63
- const target = args.targetPrice;
64
- if (!Number.isFinite(target) || target <= 0) {
65
- return 'target_price must be a positive finite number.';
66
- }
67
- if ((side === 'buy' && target <= refPrice) || (side === 'sell' && target >= refPrice)) {
68
- return (`target_price ${target} is on the WRONG SIDE of entry ${refPrice} for a ${dirWord}: ` +
69
- `the profit target must be ${side === 'buy' ? 'above' : 'below'} entry.`);
70
- }
71
- }
72
- return null;
73
- }
74
- // ---- close_position ----
75
- /** The five legitimate reasons to manually close an otherwise-bracketed
76
- * position (see SKILL.md v2.10.0 Position Management Discipline). Any other
77
- * value is rejected. */
78
- export const CLOSE_REASONS = [
79
- 'regime_flip',
80
- // 'scorecard_reversal' — DEPRECATED 2026-06-16 (exit-discipline #2): a lower re-scored
81
- // confluence is anti-predictive of outcome and is NOT a valid exit trigger. Removed from
82
- // the menu; validateClosePosition rejects it early with a redirect to objective reasons.
83
- 'risk_limit',
84
- 'bracket_integrity',
85
- 'operator_command',
86
- ];
87
- function nonEmptyString(v) {
88
- return typeof v === 'string' && v.trim().length > 0;
89
- }
90
- function isScore(v) {
91
- return typeof v === 'number' && Number.isFinite(v) && v >= 0 && v <= 10;
92
- }
93
- /** Validate a `close_position` call against the SKILL.md v2.10.0 contract.
94
- * Returns {ok:true} to proceed or {ok:false, error} to reject the tool call.
95
- *
96
- * Philosophy: force the agent to submit structured proof that a real
97
- * reassessment happened. No time gate — a 60-second close is legal if the
98
- * assessment holds up. But blank or inconsistent fields mean no reasoning,
99
- * so we refuse.
100
- */
101
- export function validateClosePosition(args) {
102
- if (!nonEmptyString(args.symbol)) {
103
- return { ok: false, error: 'Symbol is required.' };
104
- }
105
- // `reason` is required. Enum check first.
106
- if (!args.reason) {
107
- return {
108
- ok: false,
109
- error: `close_position requires a 'reason' param (one of: ${CLOSE_REASONS.join(', ')}). ` +
110
- 'See SKILL.md v2.10.0 Position Management Discipline.',
111
- };
112
- }
113
- // scorecard_reversal DEPRECATED 2026-06-16 (exit-discipline #2). The entry scorecard is
114
- // anti-predictive of MFE, so re-scoring an open position and exiting on a lower score cut
115
- // undeveloped trades for no edge (108 such closes, 82% never developed). The exit gate
116
- // already blocks premature exits by MFE/current_r regardless of reason; this closes the
117
- // agent-facing menu. See docs/EXIT_DISCIPLINE_BUILD_PLAN.md Step 1 (#2).
118
- if (args.reason === 'scorecard_reversal') {
119
- return {
120
- ok: false,
121
- error: "close reason 'scorecard_reversal' is deprecated — a lower re-scored confluence is not a valid " +
122
- 'exit trigger (the entry score is anti-predictive of outcome). Exit on an objective trigger instead: ' +
123
- "'regime_flip' (name the regime change + contradicting_metric), 'risk_limit', a pinned-invalidation hit, " +
124
- "or 'operator_command'. If the thesis genuinely broke, use 'regime_flip' and name the signal that flipped.",
125
- };
126
- }
127
- if (!CLOSE_REASONS.includes(args.reason)) {
128
- return {
129
- ok: false,
130
- error: `Invalid close reason: '${args.reason}'. Must be one of: ${CLOSE_REASONS.join(', ')}.`,
131
- };
132
- }
133
- const reason = args.reason;
134
- // Operator commands bypass the assessment requirement — operator typing
135
- // "close ADA now" via chat doesn't need structured justification.
136
- if (reason === 'operator_command') {
137
- return { ok: true };
138
- }
139
- // All other reasons need an assessment object.
140
- const a = args.assessment;
141
- if (!a || typeof a !== 'object') {
142
- return {
143
- ok: false,
144
- error: `close_position with reason='${reason}' requires an 'assessment' object. ` +
145
- 'Include entry_score, current_score, entry_regime, current_regime, and contradicting_metric.',
146
- };
147
- }
148
- // Reason-specific consistency checks.
149
- switch (reason) {
150
- // scorecard_reversal handled earlier by the deprecation reject — no case here.
151
- case 'regime_flip': {
152
- if (!nonEmptyString(a.entry_regime)) {
153
- return { ok: false, error: 'regime_flip requires assessment.entry_regime.' };
154
- }
155
- if (!nonEmptyString(a.current_regime)) {
156
- return { ok: false, error: 'regime_flip requires assessment.current_regime.' };
157
- }
158
- if (a.entry_regime === a.current_regime) {
159
- return {
160
- ok: false,
161
- error: `regime_flip requires current_regime to differ from entry_regime. ` +
162
- `Got entry_regime=current_regime='${a.entry_regime}'. ` +
163
- 'If regime is unchanged but you still want to close, this is probably "HOLD" per the decision matrix.',
164
- };
165
- }
166
- if (!nonEmptyString(a.contradicting_metric)) {
167
- return {
168
- ok: false,
169
- error: 'regime_flip requires assessment.contradicting_metric describing what changed ' +
170
- '(e.g., "multi-TF alignment flipped from RANGE_WIDE to TREND_DOWN with 4h MACD cross").',
171
- };
172
- }
173
- return { ok: true };
174
- }
175
- case 'risk_limit': {
176
- // Risk-limit triggers are time-sensitive; require a terse justification
177
- // but not the full scorecard.
178
- if (!nonEmptyString(a.contradicting_metric)) {
179
- return {
180
- ok: false,
181
- error: 'risk_limit requires assessment.contradicting_metric naming the metric at threshold ' +
182
- '(e.g., "drawdown utilisation 82% — AMBER zone", "gross exposure 1.9x NAV").',
183
- };
184
- }
185
- return { ok: true };
186
- }
187
- case 'bracket_integrity': {
188
- // Bracket reconciliation edge cases — expect the operator to describe the
189
- // condition (e.g., ledger_terminal_no_order + attach_brackets failed).
190
- if (!nonEmptyString(a.contradicting_metric)) {
191
- return {
192
- ok: false,
193
- error: 'bracket_integrity requires assessment.contradicting_metric with the audit output ' +
194
- '(e.g., "audit_bracket_protection has_stop=false + attach_brackets returned ledger_terminal_no_order after 3 retries").',
195
- };
196
- }
197
- return { ok: true };
198
- }
199
- }
200
- return { ok: true };
201
- }
202
- /** Validate a `create_order` call against the SKILL.md v2.10.0 contract.
203
- * Only enforced in LIVE mode — paper mode is for exploration and allows
204
- * missing metadata so the agent can probe without full reasoning. Live
205
- * mode = real money = must show your work.
206
- */
207
- export function validateCreateOrder(args, isLive) {
208
- if (!isLive)
209
- return { ok: true };
210
- if (!nonEmptyString(args.thesis) || args.thesis.length < 20) {
211
- return {
212
- ok: false,
213
- error: 'create_order in live mode requires a thesis of at least 20 characters. ' +
214
- 'Briefly describe setup, regime, and the signal driving the entry.',
215
- };
216
- }
217
- if (!nonEmptyString(args.setup_type)) {
218
- return {
219
- ok: false,
220
- error: "create_order in live mode requires setup_type (e.g., 'pullback_to_ema', 'vwap_reversion', 'breakout'). " +
221
- 'The SKILL.md decision matrix expects it at heartbeat reassessment time.',
222
- };
223
- }
224
- if (!nonEmptyString(args.regime)) {
225
- return {
226
- ok: false,
227
- error: 'create_order in live mode requires regime (e.g., RANGE_WIDE, TREND_UP). ' +
228
- 'Heartbeat reassessment needs this to detect regime flips.',
229
- };
230
- }
231
- if (typeof args.regime_confidence !== 'number' ||
232
- !Number.isFinite(args.regime_confidence) ||
233
- args.regime_confidence < 0 ||
234
- args.regime_confidence > 100) {
235
- return {
236
- ok: false,
237
- error: 'create_order in live mode requires regime_confidence as a number in [0, 100].',
238
- };
239
- }
240
- if (!isScore(args.confluence_score)) {
241
- return {
242
- ok: false,
243
- error: 'create_order in live mode requires confluence_score as a number in [0, 10]. ' +
244
- 'Heartbeat reassessment needs this to detect scorecard reversal.',
245
- };
246
- }
247
- const validVerdicts = new Set(['STRONG_GO', 'GO', 'MARGINAL', 'NO_GO']);
248
- if (!nonEmptyString(args.scorecard_verdict) || !validVerdicts.has(args.scorecard_verdict)) {
249
- return {
250
- ok: false,
251
- error: `create_order in live mode requires scorecard_verdict in ${[...validVerdicts].join('/')}. ` +
252
- "If you don't have a clear verdict, you don't have the setup — skip the trade.",
253
- };
254
- }
255
- // Pinned plan — validate-if-present only (NOT required yet; we add the
256
- // capability + indication first, per the 2026-06-05 governing principle).
257
- if (args.invalidation_price != null &&
258
- (typeof args.invalidation_price !== 'number' ||
259
- !Number.isFinite(args.invalidation_price) ||
260
- args.invalidation_price <= 0)) {
261
- return {
262
- ok: false,
263
- error: 'create_order: invalidation_price, if provided, must be a positive number — ' +
264
- 'the price at which the entry thesis is wrong (your pinned "I am wrong here" level).',
265
- };
266
- }
267
- return { ok: true };
268
- }
269
- const REALIZATION_RULE_TYPES = new Set(['fixed_target', 'trail', 'scale', 'manual']);
270
- /** Coerce the agent-supplied `realization_rule` (snake_case from the tool
271
- * schema) into a clean RealizationRule, dropping garbage. Permissive by
272
- * design — this is the agent's stated PLAN (indication), not an enforced
273
- * mechanic, so we keep whatever is well-formed and default an unknown `type`
274
- * to 'manual' rather than rejecting. Returns undefined for non-objects. */
275
- export function sanitizeRealizationRule(raw) {
276
- if (!raw || typeof raw !== 'object')
277
- return undefined;
278
- const r = raw;
279
- const fin = (v) => typeof v === 'number' && Number.isFinite(v) ? v : undefined;
280
- const type = typeof r.type === 'string' && REALIZATION_RULE_TYPES.has(r.type)
281
- ? r.type
282
- : 'manual';
283
- const out = { type };
284
- const tp = fin(r.target_price);
285
- if (tp != null && tp > 0)
286
- out.targetPrice = tp;
287
- const ta = fin(r.trail_after_r);
288
- if (ta != null)
289
- out.trailAfterR = ta;
290
- const td = fin(r.trail_distance_r);
291
- if (td != null && td > 0)
292
- out.trailDistanceR = td;
293
- if (Array.isArray(r.scale)) {
294
- const rungs = [];
295
- for (const s of r.scale) {
296
- if (!s || typeof s !== 'object')
297
- continue;
298
- const o = s;
299
- const atR = fin(o.at_r);
300
- const fraction = fin(o.fraction);
301
- if (atR == null || fraction == null || fraction <= 0 || fraction > 1)
302
- continue;
303
- rungs.push({ atR, fraction });
304
- if (rungs.length >= 6)
305
- break;
306
- }
307
- if (rungs.length > 0)
308
- out.scale = rungs;
309
- }
310
- if (typeof r.note === 'string' && r.note.trim().length > 0) {
311
- out.note = r.note.slice(0, 200);
312
- }
313
- return out;
314
- }
315
- // ---- record_position_reviews (Position Decision Journal) ----
316
- /** Verdicts the agent can file at heartbeat for an open position. `trim` is
317
- * intentionally absent until `partial_close` exists as a real action — see
318
- * POSITION_DECISION_JOURNAL_PLAN.md §3 redirect #4. */
319
- export const REVIEW_VERDICTS = ['hold', 'add_on', 'close_recommended'];
320
- export const THESIS_STATUSES = ['intact', 'weakening', 'invalidated', 'evolving'];
321
- /** Validate a `record_position_reviews` call. Per-review rules from
322
- * POSITION_REVIEW_PLAN.md §7.2 plus a top-level superset rule when the caller
323
- * passes the open-positions snapshot.
324
- *
325
- * Returns either {ok:true} (proceed) or {ok:false, error} (reject the whole
326
- * call — partial-success would corrupt the audit trail).
327
- */
328
- export function validatePositionReviews(args, ctx) {
329
- if (!Array.isArray(args.reviews)) {
330
- return { ok: false, error: 'reviews must be an array' };
331
- }
332
- if (args.reviews.length === 0) {
333
- return { ok: false, error: 'reviews must contain at least one entry' };
334
- }
335
- const seen = new Set();
336
- for (let i = 0; i < args.reviews.length; i++) {
337
- const r = args.reviews[i];
338
- const where = `reviews[${i}]`;
339
- if (!nonEmptyString(r.symbol)) {
340
- return { ok: false, error: `${where}: symbol required` };
341
- }
342
- const symbol = r.symbol;
343
- if (seen.has(symbol)) {
344
- return { ok: false, error: `${where}: duplicate symbol '${symbol}' — one review per position per call` };
345
- }
346
- seen.add(symbol);
347
- if (typeof r.position_open_at !== 'number' || !Number.isFinite(r.position_open_at) || r.position_open_at <= 0) {
348
- return { ok: false, error: `${where}: position_open_at required (positive epoch ms)` };
349
- }
350
- if (!REVIEW_VERDICTS.includes(r.verdict)) {
351
- return {
352
- ok: false,
353
- error: `${where}: verdict must be one of: ${REVIEW_VERDICTS.join(', ')}`,
354
- };
355
- }
356
- const verdict = r.verdict;
357
- if (!THESIS_STATUSES.includes(r.thesis_status)) {
358
- return {
359
- ok: false,
360
- error: `${where}: thesis_status must be one of: ${THESIS_STATUSES.join(', ')}`,
361
- };
362
- }
363
- const thesisStatus = r.thesis_status;
364
- // Rule 1 — verdict='hold' AND thesis_status='invalidated' is a logical contradiction.
365
- if (verdict === 'hold' && thesisStatus === 'invalidated') {
366
- return {
367
- ok: false,
368
- error: `${where}: verdict='hold' contradicts thesis_status='invalidated'. If thesis is invalidated, file verdict='close_recommended' or call close_position.`,
369
- };
370
- }
371
- // Numeric required fields.
372
- if (!isFiniteNumber(r.entry_score))
373
- return { ok: false, error: `${where}: entry_score required (number)` };
374
- if (!isFiniteNumber(r.current_score))
375
- return { ok: false, error: `${where}: current_score required (number)` };
376
- if (!isFiniteNumber(r.score_delta))
377
- return { ok: false, error: `${where}: score_delta required (number)` };
378
- // Rule 3 — internal consistency between scores and delta (float tolerance).
379
- const computedDelta = r.current_score - r.entry_score;
380
- if (Math.abs(computedDelta - r.score_delta) > 0.01) {
381
- return {
382
- ok: false,
383
- error: `${where}: score_delta=${r.score_delta} inconsistent with current_score=${r.current_score} - entry_score=${r.entry_score} = ${computedDelta.toFixed(3)}`,
384
- };
385
- }
386
- if (!isFiniteNumber(r.regime_confidence) || r.regime_confidence < 0 || r.regime_confidence > 1) {
387
- return { ok: false, error: `${where}: regime_confidence required in [0, 1]` };
388
- }
389
- if (!isFiniteNumber(r.r_multiple))
390
- return { ok: false, error: `${where}: r_multiple required` };
391
- if (!isFiniteNumber(r.distance_to_stop_bps))
392
- return { ok: false, error: `${where}: distance_to_stop_bps required` };
393
- if (!isFiniteNumber(r.time_in_position_minutes) || r.time_in_position_minutes < 0) {
394
- return { ok: false, error: `${where}: time_in_position_minutes required (non-negative)` };
395
- }
396
- if (!isFiniteNumber(r.mfe_r))
397
- return { ok: false, error: `${where}: mfe_r required` };
398
- if (!isFiniteNumber(r.give_back_pct))
399
- return { ok: false, error: `${where}: give_back_pct required` };
400
- // Rule 5 — r_multiple cannot exceed mfe_r (mfe_r is by definition the max
401
- // favourable R seen since entry).
402
- if (r.r_multiple > r.mfe_r + 0.01) {
403
- return {
404
- ok: false,
405
- error: `${where}: r_multiple=${r.r_multiple} > mfe_r=${r.mfe_r} is impossible (MFE is the running max).`,
406
- };
407
- }
408
- if (!nonEmptyString(r.regime_entry))
409
- return { ok: false, error: `${where}: regime_entry required` };
410
- if (!nonEmptyString(r.regime_current))
411
- return { ok: false, error: `${where}: regime_current required` };
412
- if (!r.confluence_components || typeof r.confluence_components !== 'object' || Array.isArray(r.confluence_components)) {
413
- return {
414
- ok: false,
415
- error: `${where}: confluence_components required (named-boolean object). ` +
416
- `Example: {regime: true, structure: true, momentum: false, flow: true}. ` +
417
- `One key per scorecard gate firing or not firing NOW.`,
418
- };
419
- }
420
- // Rule 4 — what_changed minimum length. Fuzzy-match-against-prior-reviews
421
- // is a server-side concern (the validator doesn't have history); enforce
422
- // length only here.
423
- if (!nonEmptyString(r.what_changed) || r.what_changed.length < 20) {
424
- return { ok: false, error: `${where}: what_changed required (≥20 chars describing what shifted since last review)` };
425
- }
426
- if (!nonEmptyString(r.invalidation_trigger)) {
427
- return { ok: false, error: `${where}: invalidation_trigger required (the price/event/time that flips this to CLOSE)` };
428
- }
429
- // Rule 2 — verdict='add_on' requires +0.5R AND +1.5 score delta vs entry.
430
- // Already-prose rule from SKILL.md v2.9; now mechanical.
431
- if (verdict === 'add_on') {
432
- const r1 = r.r_multiple;
433
- const dScore = r.current_score - r.entry_score;
434
- if (r1 < 0.5 || dScore < 1.5) {
435
- return {
436
- ok: false,
437
- error: `${where}: verdict='add_on' requires r_multiple ≥ +0.5 AND score_delta ≥ +1.5. Got r_multiple=${r1.toFixed(2)}, score_delta=${dScore.toFixed(2)}. Either HOLD this position or wait for confirmation.`,
438
- };
439
- }
440
- }
441
- }
442
- // Top-level superset rule — every open position must have a review when
443
- // gate-mode is 'enforce'. Soft warning at lower modes happens at the call
444
- // site, not here.
445
- //
446
- // Symbol form caveat: Binance live `getPositions()` returns settle-suffixed
447
- // unified symbols ('SOL/USDT:USDT'), while the state-store + agent-side
448
- // reviews use the canonical 'SOL/USDT'. Normalize BOTH sides — the call site
449
- // normalizes openSymbols defensively too, but doing it here as well makes
450
- // the validator robust against any caller that forwards raw forms.
451
- if (ctx?.openSymbols && ctx.gateMode === 'enforce') {
452
- const reviewedSymbols = new Set();
453
- for (const r of args.reviews) {
454
- if (typeof r.symbol === 'string')
455
- reviewedSymbols.add(normalizeBracketSymbol(r.symbol));
456
- }
457
- const missing = [];
458
- for (const s of ctx.openSymbols) {
459
- if (!reviewedSymbols.has(normalizeBracketSymbol(s)))
460
- missing.push(s);
461
- }
462
- if (missing.length > 0) {
463
- return {
464
- ok: false,
465
- error: `record_position_reviews missing reviews for open positions: ${missing.join(', ')}. Pass one entry per open position.`,
466
- };
467
- }
468
- }
469
- return { ok: true };
470
- }
471
- function isFiniteNumber(v) {
472
- return typeof v === 'number' && Number.isFinite(v);
473
- }
@@ -1,39 +0,0 @@
1
- import type { IExchangeAdapter } from '../exchange-adapter.js';
2
- import type { TradingOperationLock } from '../lifecycle/trading-operation-lock.js';
3
- import type { Wave9LiveSymbolOwnershipCheck } from '../wave9/live-symbol-ownership.js';
4
- interface AttachBracketsArgs {
5
- symbol: string;
6
- stop_price?: number;
7
- target_price?: number;
8
- }
9
- interface AttachBracketsSuccess {
10
- ok: true;
11
- symbol: string;
12
- bracket_id: string;
13
- entry_side: 'buy' | 'sell';
14
- stop_price?: number;
15
- target_price?: number;
16
- sl_cid?: string;
17
- tp_cid?: string;
18
- attach_latency_ms: number;
19
- cancelled_stale_bracket_orders: number;
20
- cleared_stale_ledger_row: boolean;
21
- attempts: number;
22
- /** True when the call short-circuited because the requested protection
23
- * is already live on the exchange with matching prices — no new orders
24
- * were placed. Set by the 2026-05-15 idempotency change so the agent's
25
- * defensive re-attach loop doesn't tear down and reattach a working
26
- * bracket pair, which is what produced the audit→reattach spiral.
27
- */
28
- idempotent_no_op?: boolean;
29
- note?: string;
30
- }
31
- interface AttachBracketsDeps {
32
- adapter: IExchangeAdapter;
33
- operationLock?: TradingOperationLock;
34
- checkWave9LiveSymbolOwnership?: Wave9LiveSymbolOwnershipCheck;
35
- }
36
- export declare function attachBracketsTool(args: AttachBracketsArgs, deps: AttachBracketsDeps): Promise<AttachBracketsSuccess | {
37
- error: string;
38
- }>;
39
- export {};