@reefclaw/connect 0.1.10 → 0.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (396) hide show
  1. package/assets/bridge/gateway/event-parser.d.ts +6 -1
  2. package/assets/bridge/gateway/event-parser.js +19 -2
  3. package/assets/bridge/gateway/heartbeat-cron.d.ts +27 -0
  4. package/assets/bridge/gateway/heartbeat-cron.js +85 -0
  5. package/assets/bridge/gateway/poller.d.ts +1 -0
  6. package/assets/bridge/gateway/poller.js +14 -2
  7. package/assets/bridge/providers/gateway.d.ts +24 -2
  8. package/assets/bridge/providers/gateway.js +124 -25
  9. package/assets/bridge/setup.js +6 -51
  10. package/assets/shared/signals/conditions/registry.js +11 -2
  11. package/assets/shared/signals/strategy-adapter.js +17 -7
  12. package/assets/skill/SKILL.md +2 -0
  13. package/dist/deps.js +2 -2
  14. package/dist/plugin.js +35 -7
  15. package/package.json +1 -1
  16. package/assets/plugin/audit/mode-transition-audit.d.ts +0 -11
  17. package/assets/plugin/audit/mode-transition-audit.js +0 -29
  18. package/assets/plugin/balance-utils.d.ts +0 -36
  19. package/assets/plugin/balance-utils.js +0 -98
  20. package/assets/plugin/ccxt/binance-ban-gate.d.ts +0 -47
  21. package/assets/plugin/ccxt/binance-ban-gate.js +0 -420
  22. package/assets/plugin/ccxt/binance-private.d.ts +0 -346
  23. package/assets/plugin/ccxt/binance-private.js +0 -1525
  24. package/assets/plugin/ccxt/binance-public.d.ts +0 -34
  25. package/assets/plugin/ccxt/binance-public.js +0 -180
  26. package/assets/plugin/ccxt/intel-public.d.ts +0 -25
  27. package/assets/plugin/ccxt/intel-public.js +0 -80
  28. package/assets/plugin/ccxt/public-market-data-api.d.ts +0 -12
  29. package/assets/plugin/ccxt/public-market-data-api.js +0 -9
  30. package/assets/plugin/config/agent-config-client.d.ts +0 -77
  31. package/assets/plugin/config/agent-config-client.js +0 -188
  32. package/assets/plugin/config/agent-config-poller.d.ts +0 -32
  33. package/assets/plugin/config/agent-config-poller.js +0 -101
  34. package/assets/plugin/config/brackets-config.d.ts +0 -22
  35. package/assets/plugin/config/brackets-config.js +0 -58
  36. package/assets/plugin/config/entitlement-gate.d.ts +0 -51
  37. package/assets/plugin/config/entitlement-gate.js +0 -137
  38. package/assets/plugin/config/gate-store.d.ts +0 -18
  39. package/assets/plugin/config/gate-store.js +0 -61
  40. package/assets/plugin/config/plugin-config-io.d.ts +0 -215
  41. package/assets/plugin/config/plugin-config-io.js +0 -111
  42. package/assets/plugin/config/position-review-config.d.ts +0 -35
  43. package/assets/plugin/config/position-review-config.js +0 -105
  44. package/assets/plugin/config/tool-gate.d.ts +0 -53
  45. package/assets/plugin/config/tool-gate.js +0 -128
  46. package/assets/plugin/config/user-data-stream-config.d.ts +0 -89
  47. package/assets/plugin/config/user-data-stream-config.js +0 -239
  48. package/assets/plugin/connector-supervisor.d.ts +0 -36
  49. package/assets/plugin/connector-supervisor.js +0 -149
  50. package/assets/plugin/exchange-adapter.d.ts +0 -65
  51. package/assets/plugin/exchange-adapter.js +0 -4
  52. package/assets/plugin/index.d.ts +0 -30
  53. package/assets/plugin/index.js +0 -2678
  54. package/assets/plugin/ingest/pending-entry-metadata.d.ts +0 -74
  55. package/assets/plugin/ingest/pending-entry-metadata.js +0 -236
  56. package/assets/plugin/ingest/position-auto-capture.d.ts +0 -103
  57. package/assets/plugin/ingest/position-auto-capture.js +0 -411
  58. package/assets/plugin/ingest/position-decisions-client.d.ts +0 -322
  59. package/assets/plugin/ingest/position-decisions-client.js +0 -296
  60. package/assets/plugin/ingest/readiness-reporter.d.ts +0 -42
  61. package/assets/plugin/ingest/readiness-reporter.js +0 -163
  62. package/assets/plugin/ingest/reconcile-db-vs-exchange.d.ts +0 -13
  63. package/assets/plugin/ingest/reconcile-db-vs-exchange.js +0 -114
  64. package/assets/plugin/ingest/reconciler-cleanup.d.ts +0 -37
  65. package/assets/plugin/ingest/reconciler-cleanup.js +0 -147
  66. package/assets/plugin/ingest/rest-gap-filler.d.ts +0 -191
  67. package/assets/plugin/ingest/rest-gap-filler.js +0 -565
  68. package/assets/plugin/ingest/touched-symbols-store.d.ts +0 -25
  69. package/assets/plugin/ingest/touched-symbols-store.js +0 -96
  70. package/assets/plugin/ingest/trade-store-client.d.ts +0 -40
  71. package/assets/plugin/ingest/trade-store-client.js +0 -125
  72. package/assets/plugin/ingest/ws-ingest.d.ts +0 -43
  73. package/assets/plugin/ingest/ws-ingest.js +0 -126
  74. package/assets/plugin/learning/setup-family.d.ts +0 -21
  75. package/assets/plugin/learning/setup-family.js +0 -103
  76. package/assets/plugin/lifecycle/install-signal-handlers.d.ts +0 -33
  77. package/assets/plugin/lifecycle/install-signal-handlers.js +0 -112
  78. package/assets/plugin/lifecycle/shutdown-coordinator.d.ts +0 -43
  79. package/assets/plugin/lifecycle/shutdown-coordinator.js +0 -131
  80. package/assets/plugin/lifecycle/trading-operation-lock.d.ts +0 -17
  81. package/assets/plugin/lifecycle/trading-operation-lock.js +0 -14
  82. package/assets/plugin/live/bracket-id.d.ts +0 -26
  83. package/assets/plugin/live/bracket-id.js +0 -112
  84. package/assets/plugin/live/bracket-ledger.d.ts +0 -54
  85. package/assets/plugin/live/bracket-ledger.js +0 -267
  86. package/assets/plugin/live/bracket-manager.d.ts +0 -82
  87. package/assets/plugin/live/bracket-manager.js +0 -478
  88. package/assets/plugin/live/bracket-params.d.ts +0 -22
  89. package/assets/plugin/live/bracket-params.js +0 -124
  90. package/assets/plugin/live/bracket-reconciler.d.ts +0 -95
  91. package/assets/plugin/live/bracket-reconciler.js +0 -573
  92. package/assets/plugin/live/bracket-types.d.ts +0 -102
  93. package/assets/plugin/live/bracket-types.js +0 -8
  94. package/assets/plugin/live/deposit-tracker.d.ts +0 -62
  95. package/assets/plugin/live/deposit-tracker.js +0 -97
  96. package/assets/plugin/live/emergency-controls.d.ts +0 -32
  97. package/assets/plugin/live/emergency-controls.js +0 -226
  98. package/assets/plugin/live/exchange-errors.d.ts +0 -12
  99. package/assets/plugin/live/exchange-errors.js +0 -130
  100. package/assets/plugin/live/exchange-info-cache.d.ts +0 -37
  101. package/assets/plugin/live/exchange-info-cache.js +0 -134
  102. package/assets/plugin/live/fact-subscriber.d.ts +0 -78
  103. package/assets/plugin/live/fact-subscriber.js +0 -182
  104. package/assets/plugin/live/intent-journal.d.ts +0 -42
  105. package/assets/plugin/live/intent-journal.js +0 -122
  106. package/assets/plugin/live/listen-key-manager.d.ts +0 -70
  107. package/assets/plugin/live/listen-key-manager.js +0 -169
  108. package/assets/plugin/live/live-adapter.d.ts +0 -287
  109. package/assets/plugin/live/live-adapter.js +0 -1777
  110. package/assets/plugin/live/live-balance-enricher.d.ts +0 -32
  111. package/assets/plugin/live/live-balance-enricher.js +0 -104
  112. package/assets/plugin/live/live-bracket-api.d.ts +0 -13
  113. package/assets/plugin/live/live-bracket-api.js +0 -20
  114. package/assets/plugin/live/live-state-store.d.ts +0 -194
  115. package/assets/plugin/live/live-state-store.js +0 -450
  116. package/assets/plugin/live/local-signal-service.d.ts +0 -57
  117. package/assets/plugin/live/local-signal-service.js +0 -151
  118. package/assets/plugin/live/local-strategy-evaluator.d.ts +0 -62
  119. package/assets/plugin/live/local-strategy-evaluator.js +0 -131
  120. package/assets/plugin/live/microstructure-assembler.d.ts +0 -54
  121. package/assets/plugin/live/microstructure-assembler.js +0 -148
  122. package/assets/plugin/live/order-poller.d.ts +0 -29
  123. package/assets/plugin/live/order-poller.js +0 -125
  124. package/assets/plugin/live/position-state-store.d.ts +0 -83
  125. package/assets/plugin/live/position-state-store.js +0 -237
  126. package/assets/plugin/live/proposal-decision-listener.d.ts +0 -70
  127. package/assets/plugin/live/proposal-decision-listener.js +0 -292
  128. package/assets/plugin/live/proposal-manager.d.ts +0 -76
  129. package/assets/plugin/live/proposal-manager.js +0 -140
  130. package/assets/plugin/live/rate-limiter.d.ts +0 -47
  131. package/assets/plugin/live/rate-limiter.js +0 -159
  132. package/assets/plugin/live/reconciler.d.ts +0 -39
  133. package/assets/plugin/live/reconciler.js +0 -175
  134. package/assets/plugin/live/setup-buckets.d.ts +0 -7
  135. package/assets/plugin/live/setup-buckets.js +0 -33
  136. package/assets/plugin/live/slippage-tracker.d.ts +0 -45
  137. package/assets/plugin/live/slippage-tracker.js +0 -78
  138. package/assets/plugin/live/stop-watcher.d.ts +0 -60
  139. package/assets/plugin/live/stop-watcher.js +0 -215
  140. package/assets/plugin/live/user-data-active-probe.d.ts +0 -54
  141. package/assets/plugin/live/user-data-active-probe.js +0 -180
  142. package/assets/plugin/live/user-data-stream-controller.d.ts +0 -200
  143. package/assets/plugin/live/user-data-stream-controller.js +0 -579
  144. package/assets/plugin/live/user-data-stream-ws.d.ts +0 -22
  145. package/assets/plugin/live/user-data-stream-ws.js +0 -63
  146. package/assets/plugin/live/user-data-stream.d.ts +0 -243
  147. package/assets/plugin/live/user-data-stream.js +0 -704
  148. package/assets/plugin/logger.d.ts +0 -2
  149. package/assets/plugin/logger.js +0 -2
  150. package/assets/plugin/mfe.d.ts +0 -21
  151. package/assets/plugin/mfe.js +0 -68
  152. package/assets/plugin/onboarding/mode-ladder.d.ts +0 -1
  153. package/assets/plugin/onboarding/mode-ladder.js +0 -3
  154. package/assets/plugin/onboarding/runtime.d.ts +0 -84
  155. package/assets/plugin/onboarding/runtime.js +0 -173
  156. package/assets/plugin/openclaw.plugin.json +0 -92
  157. package/assets/plugin/paper-adapter.d.ts +0 -24
  158. package/assets/plugin/paper-adapter.js +0 -91
  159. package/assets/plugin/persistence/state-manager.d.ts +0 -66
  160. package/assets/plugin/persistence/state-manager.js +0 -222
  161. package/assets/plugin/pinned-plan.d.ts +0 -9
  162. package/assets/plugin/pinned-plan.js +0 -23
  163. package/assets/plugin/portfolio/wave9-admission.d.ts +0 -67
  164. package/assets/plugin/portfolio/wave9-admission.js +0 -262
  165. package/assets/plugin/portfolio/wave9-policy.d.ts +0 -36
  166. package/assets/plugin/portfolio/wave9-policy.js +0 -183
  167. package/assets/plugin/risk/pre-trade-check.d.ts +0 -38
  168. package/assets/plugin/risk/pre-trade-check.js +0 -345
  169. package/assets/plugin/risk/pre-trade-types.d.ts +0 -60
  170. package/assets/plugin/risk/pre-trade-types.js +0 -3
  171. package/assets/plugin/shadow/shadow-tracker.d.ts +0 -36
  172. package/assets/plugin/shadow/shadow-tracker.js +0 -151
  173. package/assets/plugin/shadow/types.d.ts +0 -42
  174. package/assets/plugin/shadow/types.js +0 -20
  175. package/assets/plugin/shared/indicators-extended.d.ts +0 -52
  176. package/assets/plugin/shared/indicators-extended.js +0 -291
  177. package/assets/plugin/shared/indicators.d.ts +0 -15
  178. package/assets/plugin/shared/indicators.js +0 -114
  179. package/assets/plugin/signals/conditions/registry.d.ts +0 -16
  180. package/assets/plugin/signals/conditions/registry.js +0 -1324
  181. package/assets/plugin/signals/conditions/types.d.ts +0 -1
  182. package/assets/plugin/signals/conditions/types.js +0 -4
  183. package/assets/plugin/signals/direction-rules.d.ts +0 -3
  184. package/assets/plugin/signals/direction-rules.js +0 -24
  185. package/assets/plugin/signals/entry-rules.d.ts +0 -6
  186. package/assets/plugin/signals/entry-rules.js +0 -33
  187. package/assets/plugin/signals/serialize-context.d.ts +0 -4
  188. package/assets/plugin/signals/serialize-context.js +0 -39
  189. package/assets/plugin/signals/stop-rules.d.ts +0 -3
  190. package/assets/plugin/signals/stop-rules.js +0 -48
  191. package/assets/plugin/signals/strategy-adapter.d.ts +0 -47
  192. package/assets/plugin/signals/strategy-adapter.js +0 -199
  193. package/assets/plugin/signals/types.d.ts +0 -1
  194. package/assets/plugin/signals/types.js +0 -8
  195. package/assets/plugin/simulator/exchange-simulator.d.ts +0 -93
  196. package/assets/plugin/simulator/exchange-simulator.js +0 -689
  197. package/assets/plugin/simulator/fill-engine.d.ts +0 -53
  198. package/assets/plugin/simulator/fill-engine.js +0 -280
  199. package/assets/plugin/simulator/paper-market-feed.d.ts +0 -26
  200. package/assets/plugin/simulator/paper-market-feed.js +0 -104
  201. package/assets/plugin/simulator/realistic-fills.d.ts +0 -59
  202. package/assets/plugin/simulator/realistic-fills.js +0 -175
  203. package/assets/plugin/simulator/types.d.ts +0 -224
  204. package/assets/plugin/simulator/types.js +0 -43
  205. package/assets/plugin/strategy/builtin-strategies.d.ts +0 -2
  206. package/assets/plugin/strategy/builtin-strategies.js +0 -113
  207. package/assets/plugin/strategy/condition-registry.d.ts +0 -3
  208. package/assets/plugin/strategy/condition-registry.js +0 -153
  209. package/assets/plugin/strategy/evaluator.d.ts +0 -70
  210. package/assets/plugin/strategy/evaluator.js +0 -98
  211. package/assets/plugin/tools/assessment-validation.d.ts +0 -120
  212. package/assets/plugin/tools/assessment-validation.js +0 -415
  213. package/assets/plugin/tools/attach-brackets.d.ts +0 -39
  214. package/assets/plugin/tools/attach-brackets.js +0 -399
  215. package/assets/plugin/tools/audit-bracket-protection.d.ts +0 -49
  216. package/assets/plugin/tools/audit-bracket-protection.js +0 -527
  217. package/assets/plugin/tools/cancel-all-orders.d.ts +0 -9
  218. package/assets/plugin/tools/cancel-all-orders.js +0 -8
  219. package/assets/plugin/tools/cancel-order.d.ts +0 -14
  220. package/assets/plugin/tools/cancel-order.js +0 -60
  221. package/assets/plugin/tools/check-position-health.d.ts +0 -46
  222. package/assets/plugin/tools/check-position-health.js +0 -194
  223. package/assets/plugin/tools/clear-exchange-credentials.d.ts +0 -24
  224. package/assets/plugin/tools/clear-exchange-credentials.js +0 -70
  225. package/assets/plugin/tools/close-position.d.ts +0 -45
  226. package/assets/plugin/tools/close-position.js +0 -722
  227. package/assets/plugin/tools/create-order.d.ts +0 -82
  228. package/assets/plugin/tools/create-order.js +0 -1516
  229. package/assets/plugin/tools/exit-gate.d.ts +0 -58
  230. package/assets/plugin/tools/exit-gate.js +0 -162
  231. package/assets/plugin/tools/fetch-balance.d.ts +0 -5
  232. package/assets/plugin/tools/fetch-balance.js +0 -4
  233. package/assets/plugin/tools/fetch-ohlcv.d.ts +0 -11
  234. package/assets/plugin/tools/fetch-ohlcv.js +0 -8
  235. package/assets/plugin/tools/fetch-open-orders.d.ts +0 -7
  236. package/assets/plugin/tools/fetch-open-orders.js +0 -4
  237. package/assets/plugin/tools/fetch-positions.d.ts +0 -7
  238. package/assets/plugin/tools/fetch-positions.js +0 -4
  239. package/assets/plugin/tools/fetch-ticker.d.ts +0 -11
  240. package/assets/plugin/tools/fetch-ticker.js +0 -5
  241. package/assets/plugin/tools/get-agent-profile.d.ts +0 -4
  242. package/assets/plugin/tools/get-agent-profile.js +0 -6
  243. package/assets/plugin/tools/get-analytics.d.ts +0 -6
  244. package/assets/plugin/tools/get-analytics.js +0 -7
  245. package/assets/plugin/tools/get-backtest.d.ts +0 -12
  246. package/assets/plugin/tools/get-backtest.js +0 -91
  247. package/assets/plugin/tools/get-basis.d.ts +0 -7
  248. package/assets/plugin/tools/get-basis.js +0 -7
  249. package/assets/plugin/tools/get-bracket-config.d.ts +0 -11
  250. package/assets/plugin/tools/get-bracket-config.js +0 -24
  251. package/assets/plugin/tools/get-cascade-risk.d.ts +0 -7
  252. package/assets/plugin/tools/get-cascade-risk.js +0 -8
  253. package/assets/plugin/tools/get-crypto-metrics.d.ts +0 -18
  254. package/assets/plugin/tools/get-crypto-metrics.js +0 -62
  255. package/assets/plugin/tools/get-cvd.d.ts +0 -6
  256. package/assets/plugin/tools/get-cvd.js +0 -6
  257. package/assets/plugin/tools/get-divergences.d.ts +0 -6
  258. package/assets/plugin/tools/get-divergences.js +0 -6
  259. package/assets/plugin/tools/get-funding-context.d.ts +0 -6
  260. package/assets/plugin/tools/get-funding-context.js +0 -16
  261. package/assets/plugin/tools/get-liquidation-levels.d.ts +0 -7
  262. package/assets/plugin/tools/get-liquidation-levels.js +0 -7
  263. package/assets/plugin/tools/get-liquidation-pulse.d.ts +0 -9
  264. package/assets/plugin/tools/get-liquidation-pulse.js +0 -22
  265. package/assets/plugin/tools/get-market-breadth.d.ts +0 -6
  266. package/assets/plugin/tools/get-market-breadth.js +0 -8
  267. package/assets/plugin/tools/get-market-intel.d.ts +0 -19
  268. package/assets/plugin/tools/get-market-intel.js +0 -116
  269. package/assets/plugin/tools/get-market-structure.d.ts +0 -47
  270. package/assets/plugin/tools/get-market-structure.js +0 -198
  271. package/assets/plugin/tools/get-my-mined-patterns.d.ts +0 -20
  272. package/assets/plugin/tools/get-my-mined-patterns.js +0 -61
  273. package/assets/plugin/tools/get-my-proposed-learnings.d.ts +0 -20
  274. package/assets/plugin/tools/get-my-proposed-learnings.js +0 -55
  275. package/assets/plugin/tools/get-my-recent-reviews.d.ts +0 -22
  276. package/assets/plugin/tools/get-my-recent-reviews.js +0 -66
  277. package/assets/plugin/tools/get-orderbook.d.ts +0 -21
  278. package/assets/plugin/tools/get-orderbook.js +0 -32
  279. package/assets/plugin/tools/get-pattern-scan.d.ts +0 -7
  280. package/assets/plugin/tools/get-pattern-scan.js +0 -8
  281. package/assets/plugin/tools/get-regime.d.ts +0 -6
  282. package/assets/plugin/tools/get-regime.js +0 -7
  283. package/assets/plugin/tools/get-relevant-learnings.d.ts +0 -21
  284. package/assets/plugin/tools/get-relevant-learnings.js +0 -65
  285. package/assets/plugin/tools/get-resting-liquidity.d.ts +0 -6
  286. package/assets/plugin/tools/get-resting-liquidity.js +0 -11
  287. package/assets/plugin/tools/get-risk-scenario.d.ts +0 -29
  288. package/assets/plugin/tools/get-risk-scenario.js +0 -47
  289. package/assets/plugin/tools/get-risk-summary.d.ts +0 -51
  290. package/assets/plugin/tools/get-risk-summary.js +0 -118
  291. package/assets/plugin/tools/get-sentiment.d.ts +0 -4
  292. package/assets/plugin/tools/get-sentiment.js +0 -6
  293. package/assets/plugin/tools/get-session-review.d.ts +0 -7
  294. package/assets/plugin/tools/get-session-review.js +0 -8
  295. package/assets/plugin/tools/get-setup-detail.d.ts +0 -7
  296. package/assets/plugin/tools/get-setup-detail.js +0 -311
  297. package/assets/plugin/tools/get-signals.d.ts +0 -15
  298. package/assets/plugin/tools/get-signals.js +0 -54
  299. package/assets/plugin/tools/get-sizing.d.ts +0 -6
  300. package/assets/plugin/tools/get-sizing.js +0 -6
  301. package/assets/plugin/tools/get-trade-feedback.d.ts +0 -7
  302. package/assets/plugin/tools/get-trade-feedback.js +0 -8
  303. package/assets/plugin/tools/get-trade-flow.d.ts +0 -7
  304. package/assets/plugin/tools/get-trade-flow.js +0 -7
  305. package/assets/plugin/tools/get-volume-analysis.d.ts +0 -21
  306. package/assets/plugin/tools/get-volume-analysis.js +0 -74
  307. package/assets/plugin/tools/get-volume-profile.d.ts +0 -7
  308. package/assets/plugin/tools/get-volume-profile.js +0 -7
  309. package/assets/plugin/tools/get-wave9-status.d.ts +0 -127
  310. package/assets/plugin/tools/get-wave9-status.js +0 -796
  311. package/assets/plugin/tools/helpers.d.ts +0 -26
  312. package/assets/plugin/tools/helpers.js +0 -39
  313. package/assets/plugin/tools/intel-api.d.ts +0 -34
  314. package/assets/plugin/tools/intel-api.js +0 -119
  315. package/assets/plugin/tools/intel-cache.d.ts +0 -25
  316. package/assets/plugin/tools/intel-cache.js +0 -148
  317. package/assets/plugin/tools/list-strategies.d.ts +0 -17
  318. package/assets/plugin/tools/list-strategies.js +0 -23
  319. package/assets/plugin/tools/modify-stop.d.ts +0 -21
  320. package/assets/plugin/tools/modify-stop.js +0 -120
  321. package/assets/plugin/tools/modify-target.d.ts +0 -21
  322. package/assets/plugin/tools/modify-target.js +0 -110
  323. package/assets/plugin/tools/propose-learning.d.ts +0 -22
  324. package/assets/plugin/tools/propose-learning.js +0 -65
  325. package/assets/plugin/tools/query-review-outcomes.d.ts +0 -30
  326. package/assets/plugin/tools/query-review-outcomes.js +0 -64
  327. package/assets/plugin/tools/query-trades.d.ts +0 -21
  328. package/assets/plugin/tools/query-trades.js +0 -37
  329. package/assets/plugin/tools/record-position-reviews.d.ts +0 -38
  330. package/assets/plugin/tools/record-position-reviews.js +0 -147
  331. package/assets/plugin/tools/save-strategy.d.ts +0 -16
  332. package/assets/plugin/tools/save-strategy.js +0 -46
  333. package/assets/plugin/tools/scan-pairs.d.ts +0 -18
  334. package/assets/plugin/tools/scan-pairs.js +0 -231
  335. package/assets/plugin/tools/score-setup.d.ts +0 -31
  336. package/assets/plugin/tools/score-setup.js +0 -268
  337. package/assets/plugin/tools/set-bracket-requirement.d.ts +0 -18
  338. package/assets/plugin/tools/set-bracket-requirement.js +0 -81
  339. package/assets/plugin/tools/set-exchange-credentials.d.ts +0 -25
  340. package/assets/plugin/tools/set-exchange-credentials.js +0 -80
  341. package/assets/plugin/tools/set-trading-mode.d.ts +0 -26
  342. package/assets/plugin/tools/set-trading-mode.js +0 -135
  343. package/assets/plugin/tools/test-exchange-credentials.d.ts +0 -16
  344. package/assets/plugin/tools/test-exchange-credentials.js +0 -100
  345. package/assets/plugin/tools/toggle-strategy.d.ts +0 -8
  346. package/assets/plugin/tools/toggle-strategy.js +0 -15
  347. package/assets/plugin/trading-params-cache.d.ts +0 -26
  348. package/assets/plugin/trading-params-cache.js +0 -52
  349. package/assets/plugin/types.d.ts +0 -134
  350. package/assets/plugin/types.js +0 -7
  351. package/assets/plugin/util/plugin-paths.d.ts +0 -3
  352. package/assets/plugin/util/plugin-paths.js +0 -15
  353. package/assets/plugin/venues/hyperliquid/hl-balance.d.ts +0 -116
  354. package/assets/plugin/venues/hyperliquid/hl-balance.js +0 -145
  355. package/assets/plugin/venues/hyperliquid/hl-brackets.d.ts +0 -102
  356. package/assets/plugin/venues/hyperliquid/hl-brackets.js +0 -172
  357. package/assets/plugin/venues/hyperliquid/hl-cloid.d.ts +0 -22
  358. package/assets/plugin/venues/hyperliquid/hl-cloid.js +0 -82
  359. package/assets/plugin/venues/hyperliquid/hl-info-cache.d.ts +0 -46
  360. package/assets/plugin/venues/hyperliquid/hl-info-cache.js +0 -125
  361. package/assets/plugin/venues/hyperliquid/hl-live-adapter.d.ts +0 -88
  362. package/assets/plugin/venues/hyperliquid/hl-live-adapter.js +0 -353
  363. package/assets/plugin/venues/hyperliquid/hl-precision.d.ts +0 -61
  364. package/assets/plugin/venues/hyperliquid/hl-precision.js +0 -176
  365. package/assets/plugin/venues/hyperliquid/hl-private.d.ts +0 -88
  366. package/assets/plugin/venues/hyperliquid/hl-private.js +0 -357
  367. package/assets/plugin/venues/hyperliquid/hl-public.d.ts +0 -79
  368. package/assets/plugin/venues/hyperliquid/hl-public.js +0 -429
  369. package/assets/plugin/venues/hyperliquid/hl-rate-gate.d.ts +0 -57
  370. package/assets/plugin/venues/hyperliquid/hl-rate-gate.js +0 -220
  371. package/assets/plugin/venues/hyperliquid/hl-user-stream.d.ts +0 -90
  372. package/assets/plugin/venues/hyperliquid/hl-user-stream.js +0 -220
  373. package/assets/plugin/venues/registry.d.ts +0 -38
  374. package/assets/plugin/venues/registry.js +0 -46
  375. package/assets/plugin/venues/symbols.d.ts +0 -43
  376. package/assets/plugin/venues/symbols.js +0 -107
  377. package/assets/plugin/wave9/live-account-capture.d.ts +0 -67
  378. package/assets/plugin/wave9/live-account-capture.js +0 -435
  379. package/assets/plugin/wave9/live-autonomous-protection.d.ts +0 -39
  380. package/assets/plugin/wave9/live-autonomous-protection.js +0 -112
  381. package/assets/plugin/wave9/live-durable-reconciliation-scheduler.d.ts +0 -33
  382. package/assets/plugin/wave9/live-durable-reconciliation-scheduler.js +0 -115
  383. package/assets/plugin/wave9/live-execution-ledger.d.ts +0 -107
  384. package/assets/plugin/wave9/live-execution-ledger.js +0 -498
  385. package/assets/plugin/wave9/live-position-confirmation.d.ts +0 -18
  386. package/assets/plugin/wave9/live-position-confirmation.js +0 -111
  387. package/assets/plugin/wave9/live-residual-protection.d.ts +0 -18
  388. package/assets/plugin/wave9/live-residual-protection.js +0 -250
  389. package/assets/plugin/wave9/live-startup-reconciliation.d.ts +0 -38
  390. package/assets/plugin/wave9/live-startup-reconciliation.js +0 -454
  391. package/assets/plugin/wave9/live-symbol-ownership.d.ts +0 -20
  392. package/assets/plugin/wave9/live-symbol-ownership.js +0 -132
  393. package/assets/plugin/wave9/paper-admission-guard.d.ts +0 -199
  394. package/assets/plugin/wave9/paper-admission-guard.js +0 -650
  395. package/assets/plugin/wave9/usdm-evidence-provider.d.ts +0 -42
  396. package/assets/plugin/wave9/usdm-evidence-provider.js +0 -133
@@ -1,411 +0,0 @@
1
- // Auto-capture helper for the Position Decision Journal.
2
- //
3
- // Wires create_order / close_position / fill events into the webapp ingest:
4
- //
5
- // ENTRY — onCreateOrderFilled() upserts the parent positions row, gets back
6
- // the UUID, persists it locally for restart-survival, then posts the
7
- // entry decision row.
8
- // CLOSE — onClosePositionFilled() looks up the cached position UUID and posts
9
- // the close decision row. Local position-state is dropped after the
10
- // dispatch so the symbol can re-enter cleanly.
11
- //
12
- // Auto-capture is mode-agnostic — it runs whenever the decisions client is
13
- // configured (env vars present), regardless of trading mode (PAPER vs LIVE) or
14
- // positionReview.mode. Fail-open: a network blip on a webapp POST does not
15
- // block the trading hot path.
16
- //
17
- // PR 1 scope: market orders (immediate fill detection from CcxtOrder.filled).
18
- // Limit-order fill capture and scale-in detection are deferred to a follow-up
19
- // that hooks into the WS-ingest pipeline (see POSITION_DECISION_JOURNAL_PLAN
20
- // §5.1 for the longer-term design).
21
- import { logger } from '../logger.js';
22
- import { isBracketCid } from '../live/bracket-id.js';
23
- const TAG = 'position-auto-capture';
24
- /** Flatness tolerance for remaining-contracts tracking. Reduce-only fills sum
25
- * exactly to the position size on Binance, so any residual below this is noise
26
- * / float rounding and means the position is flat. */
27
- const FLAT_EPSILON = 1e-6;
28
- /** Called after a successful adapter.createOrder().
29
- *
30
- * For PR 1, we treat any non-zero `filled` quantity as an entry event and
31
- * upsert the parent position + post the entry decision row. Limit orders that
32
- * haven't filled yet are skipped (caller can call us again from the WS-ingest
33
- * pipeline once they fill — that wiring is the follow-up).
34
- *
35
- * Always-fail-open: webapp errors are logged but never thrown.
36
- */
37
- export async function onCreateOrderFilled(ctx, inputs, order) {
38
- if (!ctx.decisionsClient || !ctx.userId || !ctx.stateStore)
39
- return;
40
- const filledQty = typeof order.filled === 'number' && Number.isFinite(order.filled)
41
- ? order.filled
42
- : 0;
43
- if (filledQty <= 0) {
44
- // Limit order not yet filled — nothing to capture yet.
45
- return;
46
- }
47
- const fillPrice = typeof order.average === 'number' && Number.isFinite(order.average) && order.average > 0
48
- ? order.average
49
- : typeof order.price === 'number' && Number.isFinite(order.price) && order.price > 0
50
- ? order.price
51
- : null;
52
- if (fillPrice === null) {
53
- logger.warn(TAG, `onCreateOrderFilled ${inputs.symbol}: missing fill price; skipping capture`);
54
- return;
55
- }
56
- // Need v2.10.0 metadata to build a meaningful entry row. In paper mode the
57
- // agent may omit them; we still capture an entry but mark missing fields.
58
- const md = inputs.metadata;
59
- if (!md) {
60
- logger.info(TAG, `onCreateOrderFilled ${inputs.symbol}: no metadata; skipping (paper without rationale)`);
61
- return;
62
- }
63
- const positionSide = inputs.side === 'buy' ? 'long' : 'short';
64
- const openedAtMs = Date.now();
65
- // Skip if state-store already knows about this position (scale-in / partial
66
- // fill of an existing entry). PR 1 deferral: don't record additional entries.
67
- // The follow-up that hooks WS-ingest will detect scale-ins explicitly.
68
- const existing = ctx.stateStore.get(inputs.symbol);
69
- if (existing) {
70
- logger.info(TAG, `onCreateOrderFilled ${inputs.symbol}: existing position in state-store (openedAt=${existing.openedAt}); treating as scale-in (auto-capture deferred to v2)`);
71
- return;
72
- }
73
- // Local state-store first — ensures restart-survival even if the webapp POST
74
- // fails on the first attempt.
75
- ctx.stateStore.upsert({
76
- symbol: inputs.symbol,
77
- openedAt: openedAtMs,
78
- side: positionSide,
79
- openedFromExchangeTradeId: typeof order.id === 'string' ? order.id : undefined,
80
- });
81
- const upsert = {
82
- symbol: inputs.symbol,
83
- positionOpenAt: openedAtMs,
84
- side: positionSide,
85
- currentSize: filledQty,
86
- avgEntryPrice: fillPrice,
87
- mode: ctx.resolveMode?.(),
88
- exchange: ctx.venue,
89
- };
90
- // postPosition is awaited — we need the UUID before posting the entry row.
91
- const positionId = await ctx.decisionsClient.postPosition(ctx.userId, upsert);
92
- if (!positionId) {
93
- logger.warn(TAG, `onCreateOrderFilled ${inputs.symbol}: webapp position upsert returned no id; entry row will not be posted (will retry on next observation)`);
94
- return;
95
- }
96
- ctx.stateStore.setWebappId(inputs.symbol, positionId);
97
- // Track size so a later reduce-only/bracket exit fill can detect flat + close.
98
- ctx.stateStore.addOpenContracts(inputs.symbol, filledQty);
99
- // Build entry decision payload from the v2.10.0 metadata.
100
- // regime_confidence stored 0-100 in PositionMetadata (per validator), but the
101
- // webapp schema expects 0-1. Normalize.
102
- const regimeConfNormalized = typeof md.regimeConfidence === 'number'
103
- ? Math.max(0, Math.min(1, md.regimeConfidence / 100))
104
- : 0.5;
105
- const entry = {
106
- positionId,
107
- entryAt: openedAtMs,
108
- isScaleIn: false,
109
- thesis: md.thesis ?? '(no thesis recorded)',
110
- setupType: md.setupType ?? 'unknown',
111
- regime: md.regime ?? 'unknown',
112
- regimeConfidence: regimeConfNormalized,
113
- scorecardVerdict: md.scorecardVerdict ?? 'GO',
114
- confluenceScore: typeof md.confluenceScore === 'number' ? md.confluenceScore : 0,
115
- fillPrice,
116
- fillSize: filledQty,
117
- exchangeTradeId: typeof order.id === 'string' ? order.id : undefined,
118
- metadata: buildEntryPlanMetadata(md),
119
- };
120
- ctx.decisionsClient.postEntry(ctx.userId, entry);
121
- logger.info(TAG, `entry captured ${inputs.symbol} ${positionSide} ${filledQty} @ ${fillPrice} (positionId=${positionId.slice(0, 8)}…)`);
122
- }
123
- /** Called after a successful adapter.closePosition() with the v2.10.0 reason +
124
- * assessment from close_position.ts. Looks up the cached position UUID, posts
125
- * the close decision row, and drops the local state entry. */
126
- export async function onClosePositionFilled(ctx, inputs, order) {
127
- if (!ctx.decisionsClient || !ctx.userId || !ctx.stateStore)
128
- return;
129
- const stateEntry = ctx.stateStore.get(inputs.symbol);
130
- if (!stateEntry || !stateEntry.webappPositionId) {
131
- logger.warn(TAG, `onClosePositionFilled ${inputs.symbol}: no cached webappPositionId; close row will not be posted (entry was not captured)`);
132
- return;
133
- }
134
- const filledQty = typeof order.filled === 'number' && Number.isFinite(order.filled)
135
- ? order.filled
136
- : 0;
137
- const fillPrice = typeof order.average === 'number' && Number.isFinite(order.average) && order.average > 0
138
- ? order.average
139
- : typeof order.price === 'number' && Number.isFinite(order.price) && order.price > 0
140
- ? order.price
141
- : null;
142
- if (filledQty <= 0 || fillPrice === null) {
143
- logger.warn(TAG, `onClosePositionFilled ${inputs.symbol}: missing fill quantity or price; skipping capture`);
144
- return;
145
- }
146
- const closeAtMs = Date.now();
147
- // Realized PnL + R-multiple require entry-side state we don't have here for
148
- // PR 1. The skill-side computation already produces these for the webapp;
149
- // this auto-capture just records what the close tool input told us. Default
150
- // numeric fields to 0 — webapp accepts and the operator will see the close
151
- // card with zeros until the v2 ws-ingest hook fills them properly.
152
- const regimeConfNormalized = typeof inputs.regimeConfidence === 'number'
153
- ? Math.max(0, Math.min(1, inputs.regimeConfidence / 100))
154
- : 0.5;
155
- const close = {
156
- positionId: stateEntry.webappPositionId,
157
- closeAt: closeAtMs,
158
- closeReason: inputs.closeReason,
159
- closeAssessment: inputs.closeAssessment,
160
- scorecardVerdict: inputs.scorecardVerdict ?? 'NO_GO',
161
- confluenceScore: typeof inputs.confluenceScore === 'number' ? inputs.confluenceScore : 0,
162
- regime: inputs.regime ?? 'unknown',
163
- regimeConfidence: regimeConfNormalized,
164
- fillPrice,
165
- fillSize: filledQty,
166
- realizedPnl: 0, // populated by v2 ws-ingest hook
167
- realizedR: 0,
168
- mfeRAtClose: 0,
169
- giveBackPctAtClose: 0,
170
- exchangeTradeId: typeof order.id === 'string' ? order.id : undefined,
171
- };
172
- ctx.decisionsClient.postClose(ctx.userId, close);
173
- // Drop local state — symbol can re-enter as a new position.
174
- ctx.stateStore.remove(inputs.symbol);
175
- logger.info(TAG, `close captured ${inputs.symbol} reason=${inputs.closeReason} (positionId=${stateEntry.webappPositionId.slice(0, 8)}…)`);
176
- }
177
- /** Look up the metadata create_order stashed for this fill. Primary key is
178
- * the exchange orderId (post-REST-ack `promote()`); the clientOrderId
179
- * fallback covers the routine market-order race where the WS fill arrives
180
- * BEFORE the REST response, i.e. before the promote — the pre-submission
181
- * stash is keyed by the cid, which the WS event carries (`o.c`). */
182
- function consumePendingEntry(ctx, fill) {
183
- if (!ctx.pendingEntries)
184
- return undefined;
185
- return (ctx.pendingEntries.consume(fill.exchangeOrderId) ??
186
- (fill.clientOrderId ? ctx.pendingEntries.consume(fill.clientOrderId) : undefined));
187
- }
188
- export async function onWsFillObserved(ctx, fill) {
189
- if (!ctx.decisionsClient || !ctx.userId || !ctx.stateStore)
190
- return;
191
- if (fill.fillPrice <= 0 || fill.fillSize <= 0)
192
- return;
193
- // Reduce-only fills are exit-side. close_position tool exits are journaled by
194
- // onClosePositionFilled; bracket SL/TP fills and other reduce-only closes
195
- // bypass that path entirely and used to leave the journal position open
196
- // forever (close-bypass class). When closeOnReduceOnlyFill is enabled, detect
197
- // the position going flat from the fill(s) and journal an exact close.
198
- if (fill.reduceOnly) {
199
- await handleReduceOnlyExit(ctx, fill);
200
- return;
201
- }
202
- const stateEntry = ctx.stateStore.get(fill.symbol);
203
- const fillSide = fill.side === 'buy' ? 'long' : 'short';
204
- const ts = fill.exchangeTimeMs ?? Date.now();
205
- if (stateEntry) {
206
- // Dedup: if the synchronous create_order path already captured this
207
- // exact order (orderId match), the WS event is the same fill — skip.
208
- if (stateEntry.openedFromExchangeTradeId === fill.exchangeOrderId) {
209
- return;
210
- }
211
- if (stateEntry.side !== fillSide) {
212
- // Opposite-side fill on an existing position. Almost certainly a manual
213
- // flatten that bypassed close_position. Don't journal here — the
214
- // operator should use close_position with reason+assessment instead.
215
- logger.warn(TAG, `onWsFillObserved ${fill.symbol}: opposite-side fill on existing ${stateEntry.side} position; skipping (use close_position for rationale capture)`);
216
- return;
217
- }
218
- // SCALE-IN: same symbol, same side, fresh fill.
219
- if (!stateEntry.webappPositionId) {
220
- logger.warn(TAG, `onWsFillObserved ${fill.symbol}: scale-in observed but no webappPositionId yet — skipping (parent upsert may have failed; will retry next fill)`);
221
- return;
222
- }
223
- const pending = consumePendingEntry(ctx, fill);
224
- const entry = buildEntryPayload({
225
- positionId: stateEntry.webappPositionId,
226
- isScaleIn: true,
227
- ts,
228
- fillPrice: fill.fillPrice,
229
- fillSize: fill.fillSize,
230
- exchangeTradeId: fill.exchangeTradeId,
231
- metadata: pending?.metadata,
232
- });
233
- ctx.decisionsClient.postEntry(ctx.userId, entry);
234
- // Grow tracked size so a later reduce-only exit detects flat correctly.
235
- ctx.stateStore.addOpenContracts(fill.symbol, fill.fillSize);
236
- logger.info(TAG, `scale-in captured ${fill.symbol} ${fillSide} ${fill.fillSize} @ ${fill.fillPrice} ` +
237
- `(positionId=${stateEntry.webappPositionId.slice(0, 8)}…)`);
238
- return;
239
- }
240
- // No state-store entry → NEW position via WS-driven fill. Replicates the
241
- // synchronous-market-order path but pulls metadata from the pending cache
242
- // (which create_order populated BEFORE submitting the order).
243
- const pending = consumePendingEntry(ctx, fill);
244
- ctx.stateStore.upsert({
245
- symbol: fill.symbol,
246
- openedAt: ts,
247
- side: fillSide,
248
- openedFromExchangeTradeId: fill.exchangeOrderId,
249
- });
250
- const upsert = {
251
- symbol: fill.symbol,
252
- positionOpenAt: ts,
253
- side: fillSide,
254
- currentSize: fill.fillSize,
255
- avgEntryPrice: fill.fillPrice,
256
- mode: ctx.resolveMode?.(),
257
- exchange: ctx.venue,
258
- };
259
- const positionId = await ctx.decisionsClient.postPosition(ctx.userId, upsert);
260
- if (!positionId) {
261
- logger.warn(TAG, `onWsFillObserved ${fill.symbol}: webapp position upsert returned no id; entry row will not be posted`);
262
- return;
263
- }
264
- ctx.stateStore.setWebappId(fill.symbol, positionId);
265
- // Track size so a later reduce-only/bracket exit fill can detect flat + close.
266
- ctx.stateStore.addOpenContracts(fill.symbol, fill.fillSize);
267
- const entry = buildEntryPayload({
268
- positionId,
269
- isScaleIn: false,
270
- ts,
271
- fillPrice: fill.fillPrice,
272
- fillSize: fill.fillSize,
273
- exchangeTradeId: fill.exchangeTradeId,
274
- metadata: pending?.metadata,
275
- });
276
- ctx.decisionsClient.postEntry(ctx.userId, entry);
277
- logger.info(TAG, `entry captured (ws) ${fill.symbol} ${fillSide} ${fill.fillSize} @ ${fill.fillPrice} ` +
278
- `(positionId=${positionId.slice(0, 8)}…, metadata=${pending ? 'cached' : 'none'})`);
279
- }
280
- /** Reduce-only exit fill handler — the close-bypass fix. When enabled, sums the
281
- * fill's realised PnL into the tracked position and, once remaining size hits
282
- * flat, posts an exact close decision row (Binance-exact realised PnL, real
283
- * exit price) and drops the local state entry. Idempotent at the webapp
284
- * (position_closes UNIQUE on position_id); fail-open. */
285
- async function handleReduceOnlyExit(ctx, fill) {
286
- if (!ctx.decisionsClient || !ctx.userId || !ctx.stateStore)
287
- return;
288
- // Gated: when off, preserve the legacy behaviour (reduce-only fills ignored).
289
- if (!ctx.closeOnReduceOnlyFill)
290
- return;
291
- const stateEntry = ctx.stateStore.get(fill.symbol);
292
- // No tracked entry (already cleaned, or never journaled) → nothing to close.
293
- if (!stateEntry || !stateEntry.webappPositionId)
294
- return;
295
- const updated = ctx.stateStore.applyExitContracts(fill.symbol, fill.fillSize, fill.realizedPnl ?? 0);
296
- if (!updated) {
297
- // Size unknown for this entry (opened before tracking existed and not yet
298
- // seeded). Can't decide flatness from fills — leave the reconciler/ALGO
299
- // close-bypass path as the backstop.
300
- logger.info(TAG, `reduce-only fill ${fill.symbol}: size untracked; deferring close to reconciler/ALGO backstop`);
301
- return;
302
- }
303
- const remaining = updated.remainingContracts ?? 0;
304
- if (remaining > FLAT_EPSILON) {
305
- logger.info(TAG, `partial exit ${fill.symbol}: ${fill.fillSize} reduce-only fill, ${remaining} contracts remaining`);
306
- return; // not flat yet — keep accumulating
307
- }
308
- // FLAT. Auto-journal an exact close ONLY for exchange-native bracket fills
309
- // (the cid is one of our bracket legs). Non-bracket reduce-only flats are
310
- // either close_position's own order (its WS fill can race ahead of
311
- // onClosePositionFilled) or a manual/external close — both are handled by
312
- // their own paths (close_position's rich reason+assessment, or the reconciler
313
- // backstop). Closing here would clobber the agent's close reasoning, so defer.
314
- const isBracket = fill.clientOrderId ? isBracketCid(fill.clientOrderId) : false;
315
- if (!isBracket) {
316
- logger.info(TAG, `${fill.symbol} flat via non-bracket reduce-only fill (cid=${fill.clientOrderId ?? 'none'}) — ` +
317
- `deferring close to close_position / reconciler backstop (no clobber)`);
318
- return; // do NOT remove — onClosePositionFilled / backstop owns this close
319
- }
320
- const realizedPnl = updated.realizedPnlAccum ?? 0;
321
- const close = {
322
- positionId: stateEntry.webappPositionId,
323
- closeAt: fill.exchangeTimeMs ?? Date.now(),
324
- closeReason: 'bracket_fill',
325
- closeAssessment: {
326
- note: 'Position closed by an exchange-native bracket SL/TP fill (reduce-only). ' +
327
- 'Auto-journaled from the WS fill — no close_position call (close-bypass path).',
328
- observedFrom: 'ws_reduce_only_fill',
329
- clientOrderId: fill.clientOrderId,
330
- },
331
- scorecardVerdict: 'NO_GO',
332
- confluenceScore: 0,
333
- regime: 'unknown',
334
- regimeConfidence: 0.5,
335
- fillPrice: fill.fillPrice,
336
- fillSize: Math.abs(fill.fillSize),
337
- // realizedPnl is Binance-exact (summed across exit fills); the zeros below
338
- // are filled in PER-METRIC by the webapp close route (price-based R from
339
- // the pinned invalidation_price, mfe/give-back from the last review — see
340
- // webapp lib/api/close-metrics.ts). The route's old all-four-zero gate
341
- // meant this non-zero PnL used to suppress that fill-in entirely, persisting
342
- // realized_r=0 on every bracket_fill close (the 2026-07-11 zero-hole).
343
- realizedPnl,
344
- realizedR: 0,
345
- mfeRAtClose: 0,
346
- giveBackPctAtClose: 0,
347
- exchangeTradeId: fill.exchangeTradeId,
348
- };
349
- ctx.decisionsClient.postClose(ctx.userId, close);
350
- ctx.stateStore.remove(fill.symbol);
351
- logger.info(TAG, `close captured (ws bracket fill) ${fill.symbol} pnl=${realizedPnl.toFixed(4)} ` +
352
- `(positionId=${stateEntry.webappPositionId.slice(0, 8)}…)`);
353
- }
354
- /** Internal helper — builds the PositionEntryPayload from a fill, applying the
355
- * same regimeConfidence normalisation (0-100 → 0-1) as the synchronous path. */
356
- function buildEntryPayload(args) {
357
- const md = args.metadata;
358
- const regimeConfNormalized = typeof md?.regimeConfidence === 'number'
359
- ? Math.max(0, Math.min(1, md.regimeConfidence / 100))
360
- : 0.5;
361
- return {
362
- positionId: args.positionId,
363
- entryAt: args.ts,
364
- isScaleIn: args.isScaleIn,
365
- thesis: md?.thesis ?? '(no thesis recorded)',
366
- setupType: md?.setupType ?? 'unknown',
367
- regime: md?.regime ?? 'unknown',
368
- regimeConfidence: regimeConfNormalized,
369
- scorecardVerdict: md?.scorecardVerdict ?? 'GO',
370
- confluenceScore: typeof md?.confluenceScore === 'number' ? md.confluenceScore : 0,
371
- fillPrice: args.fillPrice,
372
- fillSize: args.fillSize,
373
- exchangeTradeId: args.exchangeTradeId,
374
- metadata: buildEntryPlanMetadata(md),
375
- };
376
- }
377
- /** Pinned-plan subset persisted to position_entries.metadata (free-form JSONB).
378
- * Keys are snake_case per the canonical-JSONB-key rule (CLAUDE.md learning-loop:
379
- * a camelCase mismatch previously broke learning matching). Returns undefined
380
- * when neither field is present so we never write an empty object. */
381
- export function buildEntryPlanMetadata(md) {
382
- if (!md)
383
- return undefined;
384
- const out = {};
385
- if (typeof md.invalidationPrice === 'number' && Number.isFinite(md.invalidationPrice)) {
386
- out.invalidation_price = md.invalidationPrice;
387
- }
388
- // Pin the planned profit target too — it's the agent's stated target (and the
389
- // bracket TP in live), surfaced on the dashboard pinned-plan view. Distinct
390
- // from realization_rule (which is mostly omitted); without this the target is
391
- // blank on the journal/Trade-card pinned-plan surfaces in the common case.
392
- if (typeof md.targetPrice === 'number' && Number.isFinite(md.targetPrice)) {
393
- out.target_price = md.targetPrice;
394
- }
395
- const rr = md.realizationRule;
396
- if (rr) {
397
- const j = { type: rr.type };
398
- if (rr.targetPrice != null)
399
- j.target_price = rr.targetPrice;
400
- if (rr.trailAfterR != null)
401
- j.trail_after_r = rr.trailAfterR;
402
- if (rr.trailDistanceR != null)
403
- j.trail_distance_r = rr.trailDistanceR;
404
- if (rr.scale)
405
- j.scale = rr.scale.map((s) => ({ at_r: s.atR, fraction: s.fraction }));
406
- if (rr.note)
407
- j.note = rr.note;
408
- out.realization_rule = j;
409
- }
410
- return Object.keys(out).length > 0 ? out : undefined;
411
- }