@reefclaw/connect 0.1.12 → 0.1.13

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 (390) hide show
  1. package/assets/plugin/audit/mode-transition-audit.d.ts +11 -0
  2. package/assets/plugin/audit/mode-transition-audit.js +29 -0
  3. package/assets/plugin/balance-utils.d.ts +36 -0
  4. package/assets/plugin/balance-utils.js +98 -0
  5. package/assets/plugin/ccxt/binance-ban-gate.d.ts +47 -0
  6. package/assets/plugin/ccxt/binance-ban-gate.js +420 -0
  7. package/assets/plugin/ccxt/binance-private.d.ts +346 -0
  8. package/assets/plugin/ccxt/binance-private.js +1525 -0
  9. package/assets/plugin/ccxt/binance-public.d.ts +34 -0
  10. package/assets/plugin/ccxt/binance-public.js +180 -0
  11. package/assets/plugin/ccxt/intel-public.d.ts +25 -0
  12. package/assets/plugin/ccxt/intel-public.js +80 -0
  13. package/assets/plugin/ccxt/public-market-data-api.d.ts +26 -0
  14. package/assets/plugin/ccxt/public-market-data-api.js +23 -0
  15. package/assets/plugin/config/agent-config-client.d.ts +77 -0
  16. package/assets/plugin/config/agent-config-client.js +188 -0
  17. package/assets/plugin/config/agent-config-poller.d.ts +32 -0
  18. package/assets/plugin/config/agent-config-poller.js +101 -0
  19. package/assets/plugin/config/brackets-config.d.ts +22 -0
  20. package/assets/plugin/config/brackets-config.js +58 -0
  21. package/assets/plugin/config/entitlement-gate.d.ts +51 -0
  22. package/assets/plugin/config/entitlement-gate.js +137 -0
  23. package/assets/plugin/config/gate-store.d.ts +18 -0
  24. package/assets/plugin/config/gate-store.js +61 -0
  25. package/assets/plugin/config/plugin-config-io.d.ts +222 -0
  26. package/assets/plugin/config/plugin-config-io.js +126 -0
  27. package/assets/plugin/config/position-review-config.d.ts +35 -0
  28. package/assets/plugin/config/position-review-config.js +105 -0
  29. package/assets/plugin/config/tool-gate.d.ts +53 -0
  30. package/assets/plugin/config/tool-gate.js +128 -0
  31. package/assets/plugin/config/user-data-stream-config.d.ts +89 -0
  32. package/assets/plugin/config/user-data-stream-config.js +239 -0
  33. package/assets/plugin/connector-supervisor.d.ts +36 -0
  34. package/assets/plugin/connector-supervisor.js +149 -0
  35. package/assets/plugin/exchange-adapter.d.ts +65 -0
  36. package/assets/plugin/exchange-adapter.js +4 -0
  37. package/assets/plugin/index.d.ts +30 -0
  38. package/assets/plugin/index.js +2763 -0
  39. package/assets/plugin/ingest/pending-entry-metadata.d.ts +74 -0
  40. package/assets/plugin/ingest/pending-entry-metadata.js +236 -0
  41. package/assets/plugin/ingest/position-auto-capture.d.ts +171 -0
  42. package/assets/plugin/ingest/position-auto-capture.js +709 -0
  43. package/assets/plugin/ingest/position-decisions-client.d.ts +327 -0
  44. package/assets/plugin/ingest/position-decisions-client.js +306 -0
  45. package/assets/plugin/ingest/readiness-reporter.d.ts +42 -0
  46. package/assets/plugin/ingest/readiness-reporter.js +163 -0
  47. package/assets/plugin/ingest/reconcile-db-vs-exchange.d.ts +51 -0
  48. package/assets/plugin/ingest/reconcile-db-vs-exchange.js +170 -0
  49. package/assets/plugin/ingest/reconciler-cleanup.d.ts +37 -0
  50. package/assets/plugin/ingest/reconciler-cleanup.js +147 -0
  51. package/assets/plugin/ingest/rest-gap-filler.d.ts +191 -0
  52. package/assets/plugin/ingest/rest-gap-filler.js +565 -0
  53. package/assets/plugin/ingest/touched-symbols-store.d.ts +25 -0
  54. package/assets/plugin/ingest/touched-symbols-store.js +96 -0
  55. package/assets/plugin/ingest/trade-store-client.d.ts +40 -0
  56. package/assets/plugin/ingest/trade-store-client.js +125 -0
  57. package/assets/plugin/ingest/ws-ingest.d.ts +43 -0
  58. package/assets/plugin/ingest/ws-ingest.js +126 -0
  59. package/assets/plugin/learning/setup-family.d.ts +21 -0
  60. package/assets/plugin/learning/setup-family.js +103 -0
  61. package/assets/plugin/lifecycle/install-signal-handlers.d.ts +33 -0
  62. package/assets/plugin/lifecycle/install-signal-handlers.js +112 -0
  63. package/assets/plugin/lifecycle/shutdown-coordinator.d.ts +43 -0
  64. package/assets/plugin/lifecycle/shutdown-coordinator.js +131 -0
  65. package/assets/plugin/lifecycle/trading-operation-lock.d.ts +17 -0
  66. package/assets/plugin/lifecycle/trading-operation-lock.js +14 -0
  67. package/assets/plugin/live/bracket-id.d.ts +26 -0
  68. package/assets/plugin/live/bracket-id.js +112 -0
  69. package/assets/plugin/live/bracket-ledger.d.ts +54 -0
  70. package/assets/plugin/live/bracket-ledger.js +267 -0
  71. package/assets/plugin/live/bracket-manager.d.ts +82 -0
  72. package/assets/plugin/live/bracket-manager.js +478 -0
  73. package/assets/plugin/live/bracket-params.d.ts +22 -0
  74. package/assets/plugin/live/bracket-params.js +124 -0
  75. package/assets/plugin/live/bracket-reconciler.d.ts +95 -0
  76. package/assets/plugin/live/bracket-reconciler.js +573 -0
  77. package/assets/plugin/live/bracket-types.d.ts +102 -0
  78. package/assets/plugin/live/bracket-types.js +8 -0
  79. package/assets/plugin/live/deposit-tracker.d.ts +62 -0
  80. package/assets/plugin/live/deposit-tracker.js +97 -0
  81. package/assets/plugin/live/emergency-controls.d.ts +32 -0
  82. package/assets/plugin/live/emergency-controls.js +226 -0
  83. package/assets/plugin/live/exchange-errors.d.ts +12 -0
  84. package/assets/plugin/live/exchange-errors.js +130 -0
  85. package/assets/plugin/live/exchange-info-cache.d.ts +37 -0
  86. package/assets/plugin/live/exchange-info-cache.js +134 -0
  87. package/assets/plugin/live/fact-subscriber.d.ts +78 -0
  88. package/assets/plugin/live/fact-subscriber.js +182 -0
  89. package/assets/plugin/live/fill-price.d.ts +13 -0
  90. package/assets/plugin/live/fill-price.js +37 -0
  91. package/assets/plugin/live/intent-journal.d.ts +42 -0
  92. package/assets/plugin/live/intent-journal.js +122 -0
  93. package/assets/plugin/live/listen-key-manager.d.ts +70 -0
  94. package/assets/plugin/live/listen-key-manager.js +169 -0
  95. package/assets/plugin/live/live-adapter.d.ts +319 -0
  96. package/assets/plugin/live/live-adapter.js +1906 -0
  97. package/assets/plugin/live/live-balance-enricher.d.ts +32 -0
  98. package/assets/plugin/live/live-balance-enricher.js +104 -0
  99. package/assets/plugin/live/live-bracket-api.d.ts +13 -0
  100. package/assets/plugin/live/live-bracket-api.js +20 -0
  101. package/assets/plugin/live/live-state-store.d.ts +194 -0
  102. package/assets/plugin/live/live-state-store.js +450 -0
  103. package/assets/plugin/live/local-signal-service.d.ts +57 -0
  104. package/assets/plugin/live/local-signal-service.js +151 -0
  105. package/assets/plugin/live/local-strategy-evaluator.d.ts +62 -0
  106. package/assets/plugin/live/local-strategy-evaluator.js +131 -0
  107. package/assets/plugin/live/microstructure-assembler.d.ts +54 -0
  108. package/assets/plugin/live/microstructure-assembler.js +148 -0
  109. package/assets/plugin/live/order-poller.d.ts +29 -0
  110. package/assets/plugin/live/order-poller.js +125 -0
  111. package/assets/plugin/live/position-state-store.d.ts +87 -0
  112. package/assets/plugin/live/position-state-store.js +237 -0
  113. package/assets/plugin/live/proposal-decision-listener.d.ts +70 -0
  114. package/assets/plugin/live/proposal-decision-listener.js +292 -0
  115. package/assets/plugin/live/proposal-manager.d.ts +76 -0
  116. package/assets/plugin/live/proposal-manager.js +140 -0
  117. package/assets/plugin/live/rate-limiter.d.ts +47 -0
  118. package/assets/plugin/live/rate-limiter.js +159 -0
  119. package/assets/plugin/live/reconciler.d.ts +39 -0
  120. package/assets/plugin/live/reconciler.js +175 -0
  121. package/assets/plugin/live/setup-buckets.d.ts +7 -0
  122. package/assets/plugin/live/setup-buckets.js +33 -0
  123. package/assets/plugin/live/slippage-tracker.d.ts +45 -0
  124. package/assets/plugin/live/slippage-tracker.js +78 -0
  125. package/assets/plugin/live/stop-watcher.d.ts +67 -0
  126. package/assets/plugin/live/stop-watcher.js +218 -0
  127. package/assets/plugin/live/user-data-active-probe.d.ts +54 -0
  128. package/assets/plugin/live/user-data-active-probe.js +180 -0
  129. package/assets/plugin/live/user-data-stream-controller.d.ts +200 -0
  130. package/assets/plugin/live/user-data-stream-controller.js +579 -0
  131. package/assets/plugin/live/user-data-stream-ws.d.ts +22 -0
  132. package/assets/plugin/live/user-data-stream-ws.js +63 -0
  133. package/assets/plugin/live/user-data-stream.d.ts +243 -0
  134. package/assets/plugin/live/user-data-stream.js +704 -0
  135. package/assets/plugin/logger.d.ts +2 -0
  136. package/assets/plugin/logger.js +2 -0
  137. package/assets/plugin/mfe.d.ts +21 -0
  138. package/assets/plugin/mfe.js +68 -0
  139. package/assets/plugin/onboarding/mode-ladder.d.ts +1 -0
  140. package/assets/plugin/onboarding/mode-ladder.js +3 -0
  141. package/assets/plugin/onboarding/runtime.d.ts +102 -0
  142. package/assets/plugin/onboarding/runtime.js +215 -0
  143. package/assets/plugin/openclaw.plugin.json +92 -0
  144. package/assets/plugin/paper-adapter.d.ts +24 -0
  145. package/assets/plugin/paper-adapter.js +91 -0
  146. package/assets/plugin/persistence/state-manager.d.ts +66 -0
  147. package/assets/plugin/persistence/state-manager.js +222 -0
  148. package/assets/plugin/pinned-plan.d.ts +9 -0
  149. package/assets/plugin/pinned-plan.js +23 -0
  150. package/assets/plugin/portfolio/reentry-tracker.d.ts +36 -0
  151. package/assets/plugin/portfolio/reentry-tracker.js +127 -0
  152. package/assets/plugin/portfolio/wave9-admission.d.ts +67 -0
  153. package/assets/plugin/portfolio/wave9-admission.js +262 -0
  154. package/assets/plugin/portfolio/wave9-policy.d.ts +36 -0
  155. package/assets/plugin/portfolio/wave9-policy.js +183 -0
  156. package/assets/plugin/risk/pre-trade-check.d.ts +38 -0
  157. package/assets/plugin/risk/pre-trade-check.js +345 -0
  158. package/assets/plugin/risk/pre-trade-types.d.ts +60 -0
  159. package/assets/plugin/risk/pre-trade-types.js +3 -0
  160. package/assets/plugin/shadow/shadow-tracker.d.ts +36 -0
  161. package/assets/plugin/shadow/shadow-tracker.js +151 -0
  162. package/assets/plugin/shadow/types.d.ts +42 -0
  163. package/assets/plugin/shadow/types.js +20 -0
  164. package/assets/plugin/shared/indicators-extended.d.ts +52 -0
  165. package/assets/plugin/shared/indicators-extended.js +291 -0
  166. package/assets/plugin/shared/indicators.d.ts +15 -0
  167. package/assets/plugin/shared/indicators.js +114 -0
  168. package/assets/plugin/signals/conditions/registry.d.ts +16 -0
  169. package/assets/plugin/signals/conditions/registry.js +1333 -0
  170. package/assets/plugin/signals/conditions/types.d.ts +1 -0
  171. package/assets/plugin/signals/conditions/types.js +4 -0
  172. package/assets/plugin/signals/direction-rules.d.ts +3 -0
  173. package/assets/plugin/signals/direction-rules.js +24 -0
  174. package/assets/plugin/signals/entry-rules.d.ts +6 -0
  175. package/assets/plugin/signals/entry-rules.js +33 -0
  176. package/assets/plugin/signals/serialize-context.d.ts +4 -0
  177. package/assets/plugin/signals/serialize-context.js +39 -0
  178. package/assets/plugin/signals/stop-rules.d.ts +3 -0
  179. package/assets/plugin/signals/stop-rules.js +48 -0
  180. package/assets/plugin/signals/strategy-adapter.d.ts +47 -0
  181. package/assets/plugin/signals/strategy-adapter.js +209 -0
  182. package/assets/plugin/signals/types.d.ts +1 -0
  183. package/assets/plugin/signals/types.js +8 -0
  184. package/assets/plugin/simulator/exchange-simulator.d.ts +105 -0
  185. package/assets/plugin/simulator/exchange-simulator.js +759 -0
  186. package/assets/plugin/simulator/fill-engine.d.ts +53 -0
  187. package/assets/plugin/simulator/fill-engine.js +280 -0
  188. package/assets/plugin/simulator/paper-market-feed.d.ts +26 -0
  189. package/assets/plugin/simulator/paper-market-feed.js +104 -0
  190. package/assets/plugin/simulator/realistic-fills.d.ts +59 -0
  191. package/assets/plugin/simulator/realistic-fills.js +175 -0
  192. package/assets/plugin/simulator/types.d.ts +228 -0
  193. package/assets/plugin/simulator/types.js +43 -0
  194. package/assets/plugin/strategy/builtin-strategies.d.ts +2 -0
  195. package/assets/plugin/strategy/builtin-strategies.js +113 -0
  196. package/assets/plugin/strategy/condition-registry.d.ts +3 -0
  197. package/assets/plugin/strategy/condition-registry.js +153 -0
  198. package/assets/plugin/strategy/evaluator.d.ts +70 -0
  199. package/assets/plugin/strategy/evaluator.js +98 -0
  200. package/assets/plugin/tools/assessment-validation.d.ts +141 -0
  201. package/assets/plugin/tools/assessment-validation.js +473 -0
  202. package/assets/plugin/tools/attach-brackets.d.ts +39 -0
  203. package/assets/plugin/tools/attach-brackets.js +564 -0
  204. package/assets/plugin/tools/audit-bracket-protection.d.ts +49 -0
  205. package/assets/plugin/tools/audit-bracket-protection.js +683 -0
  206. package/assets/plugin/tools/bracket-control.d.ts +12 -0
  207. package/assets/plugin/tools/bracket-control.js +35 -0
  208. package/assets/plugin/tools/cancel-all-orders.d.ts +9 -0
  209. package/assets/plugin/tools/cancel-all-orders.js +8 -0
  210. package/assets/plugin/tools/cancel-order.d.ts +14 -0
  211. package/assets/plugin/tools/cancel-order.js +60 -0
  212. package/assets/plugin/tools/check-position-health.d.ts +46 -0
  213. package/assets/plugin/tools/check-position-health.js +194 -0
  214. package/assets/plugin/tools/clear-exchange-credentials.d.ts +24 -0
  215. package/assets/plugin/tools/clear-exchange-credentials.js +70 -0
  216. package/assets/plugin/tools/close-position.d.ts +45 -0
  217. package/assets/plugin/tools/close-position.js +722 -0
  218. package/assets/plugin/tools/create-order.d.ts +89 -0
  219. package/assets/plugin/tools/create-order.js +1555 -0
  220. package/assets/plugin/tools/exit-gate.d.ts +58 -0
  221. package/assets/plugin/tools/exit-gate.js +162 -0
  222. package/assets/plugin/tools/fetch-balance.d.ts +5 -0
  223. package/assets/plugin/tools/fetch-balance.js +4 -0
  224. package/assets/plugin/tools/fetch-ohlcv.d.ts +11 -0
  225. package/assets/plugin/tools/fetch-ohlcv.js +8 -0
  226. package/assets/plugin/tools/fetch-open-orders.d.ts +7 -0
  227. package/assets/plugin/tools/fetch-open-orders.js +4 -0
  228. package/assets/plugin/tools/fetch-positions.d.ts +7 -0
  229. package/assets/plugin/tools/fetch-positions.js +4 -0
  230. package/assets/plugin/tools/fetch-ticker.d.ts +11 -0
  231. package/assets/plugin/tools/fetch-ticker.js +5 -0
  232. package/assets/plugin/tools/get-agent-profile.d.ts +4 -0
  233. package/assets/plugin/tools/get-agent-profile.js +6 -0
  234. package/assets/plugin/tools/get-analytics.d.ts +6 -0
  235. package/assets/plugin/tools/get-analytics.js +7 -0
  236. package/assets/plugin/tools/get-backtest.d.ts +12 -0
  237. package/assets/plugin/tools/get-backtest.js +91 -0
  238. package/assets/plugin/tools/get-basis.d.ts +7 -0
  239. package/assets/plugin/tools/get-basis.js +7 -0
  240. package/assets/plugin/tools/get-bracket-config.d.ts +11 -0
  241. package/assets/plugin/tools/get-bracket-config.js +24 -0
  242. package/assets/plugin/tools/get-cascade-risk.d.ts +7 -0
  243. package/assets/plugin/tools/get-cascade-risk.js +8 -0
  244. package/assets/plugin/tools/get-crypto-metrics.d.ts +18 -0
  245. package/assets/plugin/tools/get-crypto-metrics.js +62 -0
  246. package/assets/plugin/tools/get-cvd.d.ts +6 -0
  247. package/assets/plugin/tools/get-cvd.js +6 -0
  248. package/assets/plugin/tools/get-divergences.d.ts +6 -0
  249. package/assets/plugin/tools/get-divergences.js +6 -0
  250. package/assets/plugin/tools/get-funding-context.d.ts +6 -0
  251. package/assets/plugin/tools/get-funding-context.js +16 -0
  252. package/assets/plugin/tools/get-liquidation-levels.d.ts +7 -0
  253. package/assets/plugin/tools/get-liquidation-levels.js +7 -0
  254. package/assets/plugin/tools/get-liquidation-pulse.d.ts +9 -0
  255. package/assets/plugin/tools/get-liquidation-pulse.js +22 -0
  256. package/assets/plugin/tools/get-market-breadth.d.ts +6 -0
  257. package/assets/plugin/tools/get-market-breadth.js +8 -0
  258. package/assets/plugin/tools/get-market-intel.d.ts +19 -0
  259. package/assets/plugin/tools/get-market-intel.js +116 -0
  260. package/assets/plugin/tools/get-market-structure.d.ts +47 -0
  261. package/assets/plugin/tools/get-market-structure.js +198 -0
  262. package/assets/plugin/tools/get-my-mined-patterns.d.ts +20 -0
  263. package/assets/plugin/tools/get-my-mined-patterns.js +61 -0
  264. package/assets/plugin/tools/get-my-proposed-learnings.d.ts +20 -0
  265. package/assets/plugin/tools/get-my-proposed-learnings.js +55 -0
  266. package/assets/plugin/tools/get-my-recent-reviews.d.ts +22 -0
  267. package/assets/plugin/tools/get-my-recent-reviews.js +66 -0
  268. package/assets/plugin/tools/get-orderbook.d.ts +21 -0
  269. package/assets/plugin/tools/get-orderbook.js +32 -0
  270. package/assets/plugin/tools/get-pattern-scan.d.ts +7 -0
  271. package/assets/plugin/tools/get-pattern-scan.js +8 -0
  272. package/assets/plugin/tools/get-regime.d.ts +6 -0
  273. package/assets/plugin/tools/get-regime.js +7 -0
  274. package/assets/plugin/tools/get-relevant-learnings.d.ts +21 -0
  275. package/assets/plugin/tools/get-relevant-learnings.js +65 -0
  276. package/assets/plugin/tools/get-resting-liquidity.d.ts +6 -0
  277. package/assets/plugin/tools/get-resting-liquidity.js +11 -0
  278. package/assets/plugin/tools/get-risk-scenario.d.ts +29 -0
  279. package/assets/plugin/tools/get-risk-scenario.js +47 -0
  280. package/assets/plugin/tools/get-risk-summary.d.ts +51 -0
  281. package/assets/plugin/tools/get-risk-summary.js +118 -0
  282. package/assets/plugin/tools/get-sentiment.d.ts +4 -0
  283. package/assets/plugin/tools/get-sentiment.js +6 -0
  284. package/assets/plugin/tools/get-session-review.d.ts +7 -0
  285. package/assets/plugin/tools/get-session-review.js +8 -0
  286. package/assets/plugin/tools/get-setup-detail.d.ts +7 -0
  287. package/assets/plugin/tools/get-setup-detail.js +322 -0
  288. package/assets/plugin/tools/get-signals.d.ts +15 -0
  289. package/assets/plugin/tools/get-signals.js +54 -0
  290. package/assets/plugin/tools/get-sizing.d.ts +6 -0
  291. package/assets/plugin/tools/get-sizing.js +6 -0
  292. package/assets/plugin/tools/get-trade-feedback.d.ts +7 -0
  293. package/assets/plugin/tools/get-trade-feedback.js +8 -0
  294. package/assets/plugin/tools/get-trade-flow.d.ts +7 -0
  295. package/assets/plugin/tools/get-trade-flow.js +7 -0
  296. package/assets/plugin/tools/get-volume-analysis.d.ts +21 -0
  297. package/assets/plugin/tools/get-volume-analysis.js +74 -0
  298. package/assets/plugin/tools/get-volume-profile.d.ts +7 -0
  299. package/assets/plugin/tools/get-volume-profile.js +7 -0
  300. package/assets/plugin/tools/get-wave9-status.d.ts +127 -0
  301. package/assets/plugin/tools/get-wave9-status.js +796 -0
  302. package/assets/plugin/tools/helpers.d.ts +26 -0
  303. package/assets/plugin/tools/helpers.js +39 -0
  304. package/assets/plugin/tools/intel-api.d.ts +34 -0
  305. package/assets/plugin/tools/intel-api.js +119 -0
  306. package/assets/plugin/tools/intel-cache.d.ts +25 -0
  307. package/assets/plugin/tools/intel-cache.js +148 -0
  308. package/assets/plugin/tools/list-strategies.d.ts +17 -0
  309. package/assets/plugin/tools/list-strategies.js +23 -0
  310. package/assets/plugin/tools/modify-stop.d.ts +21 -0
  311. package/assets/plugin/tools/modify-stop.js +120 -0
  312. package/assets/plugin/tools/modify-target.d.ts +21 -0
  313. package/assets/plugin/tools/modify-target.js +110 -0
  314. package/assets/plugin/tools/propose-learning.d.ts +22 -0
  315. package/assets/plugin/tools/propose-learning.js +65 -0
  316. package/assets/plugin/tools/query-review-outcomes.d.ts +30 -0
  317. package/assets/plugin/tools/query-review-outcomes.js +64 -0
  318. package/assets/plugin/tools/query-trades.d.ts +21 -0
  319. package/assets/plugin/tools/query-trades.js +37 -0
  320. package/assets/plugin/tools/record-position-reviews.d.ts +38 -0
  321. package/assets/plugin/tools/record-position-reviews.js +147 -0
  322. package/assets/plugin/tools/save-strategy.d.ts +16 -0
  323. package/assets/plugin/tools/save-strategy.js +46 -0
  324. package/assets/plugin/tools/scan-pairs.d.ts +22 -0
  325. package/assets/plugin/tools/scan-pairs.js +234 -0
  326. package/assets/plugin/tools/score-setup.d.ts +31 -0
  327. package/assets/plugin/tools/score-setup.js +268 -0
  328. package/assets/plugin/tools/set-bracket-requirement.d.ts +18 -0
  329. package/assets/plugin/tools/set-bracket-requirement.js +81 -0
  330. package/assets/plugin/tools/set-exchange-credentials.d.ts +25 -0
  331. package/assets/plugin/tools/set-exchange-credentials.js +80 -0
  332. package/assets/plugin/tools/set-trading-mode.d.ts +26 -0
  333. package/assets/plugin/tools/set-trading-mode.js +152 -0
  334. package/assets/plugin/tools/test-exchange-credentials.d.ts +16 -0
  335. package/assets/plugin/tools/test-exchange-credentials.js +100 -0
  336. package/assets/plugin/tools/toggle-strategy.d.ts +8 -0
  337. package/assets/plugin/tools/toggle-strategy.js +15 -0
  338. package/assets/plugin/trading-params-cache.d.ts +26 -0
  339. package/assets/plugin/trading-params-cache.js +52 -0
  340. package/assets/plugin/types.d.ts +134 -0
  341. package/assets/plugin/types.js +7 -0
  342. package/assets/plugin/util/plugin-paths.d.ts +3 -0
  343. package/assets/plugin/util/plugin-paths.js +15 -0
  344. package/assets/plugin/venues/hyperliquid/hl-balance.d.ts +116 -0
  345. package/assets/plugin/venues/hyperliquid/hl-balance.js +145 -0
  346. package/assets/plugin/venues/hyperliquid/hl-bracket-coordinator.d.ts +123 -0
  347. package/assets/plugin/venues/hyperliquid/hl-bracket-coordinator.js +533 -0
  348. package/assets/plugin/venues/hyperliquid/hl-brackets.d.ts +102 -0
  349. package/assets/plugin/venues/hyperliquid/hl-brackets.js +172 -0
  350. package/assets/plugin/venues/hyperliquid/hl-cloid.d.ts +22 -0
  351. package/assets/plugin/venues/hyperliquid/hl-cloid.js +82 -0
  352. package/assets/plugin/venues/hyperliquid/hl-info-cache.d.ts +46 -0
  353. package/assets/plugin/venues/hyperliquid/hl-info-cache.js +125 -0
  354. package/assets/plugin/venues/hyperliquid/hl-live-adapter.d.ts +146 -0
  355. package/assets/plugin/venues/hyperliquid/hl-live-adapter.js +728 -0
  356. package/assets/plugin/venues/hyperliquid/hl-precision.d.ts +61 -0
  357. package/assets/plugin/venues/hyperliquid/hl-precision.js +176 -0
  358. package/assets/plugin/venues/hyperliquid/hl-private.d.ts +88 -0
  359. package/assets/plugin/venues/hyperliquid/hl-private.js +357 -0
  360. package/assets/plugin/venues/hyperliquid/hl-public.d.ts +79 -0
  361. package/assets/plugin/venues/hyperliquid/hl-public.js +436 -0
  362. package/assets/plugin/venues/hyperliquid/hl-rate-gate.d.ts +57 -0
  363. package/assets/plugin/venues/hyperliquid/hl-rate-gate.js +220 -0
  364. package/assets/plugin/venues/hyperliquid/hl-user-stream.d.ts +90 -0
  365. package/assets/plugin/venues/hyperliquid/hl-user-stream.js +220 -0
  366. package/assets/plugin/venues/registry.d.ts +38 -0
  367. package/assets/plugin/venues/registry.js +46 -0
  368. package/assets/plugin/venues/symbols.d.ts +43 -0
  369. package/assets/plugin/venues/symbols.js +107 -0
  370. package/assets/plugin/wave9/live-account-capture.d.ts +67 -0
  371. package/assets/plugin/wave9/live-account-capture.js +435 -0
  372. package/assets/plugin/wave9/live-autonomous-protection.d.ts +39 -0
  373. package/assets/plugin/wave9/live-autonomous-protection.js +112 -0
  374. package/assets/plugin/wave9/live-durable-reconciliation-scheduler.d.ts +33 -0
  375. package/assets/plugin/wave9/live-durable-reconciliation-scheduler.js +115 -0
  376. package/assets/plugin/wave9/live-execution-ledger.d.ts +107 -0
  377. package/assets/plugin/wave9/live-execution-ledger.js +498 -0
  378. package/assets/plugin/wave9/live-position-confirmation.d.ts +18 -0
  379. package/assets/plugin/wave9/live-position-confirmation.js +111 -0
  380. package/assets/plugin/wave9/live-residual-protection.d.ts +18 -0
  381. package/assets/plugin/wave9/live-residual-protection.js +250 -0
  382. package/assets/plugin/wave9/live-startup-reconciliation.d.ts +38 -0
  383. package/assets/plugin/wave9/live-startup-reconciliation.js +454 -0
  384. package/assets/plugin/wave9/live-symbol-ownership.d.ts +20 -0
  385. package/assets/plugin/wave9/live-symbol-ownership.js +132 -0
  386. package/assets/plugin/wave9/paper-admission-guard.d.ts +199 -0
  387. package/assets/plugin/wave9/paper-admission-guard.js +650 -0
  388. package/assets/plugin/wave9/usdm-evidence-provider.d.ts +42 -0
  389. package/assets/plugin/wave9/usdm-evidence-provider.js +133 -0
  390. package/package.json +1 -1
@@ -0,0 +1,74 @@
1
+ import type { PositionMetadata } from '../simulator/types.js';
2
+ export interface PendingEntry {
3
+ /** Primary lookup key. Initially the client order id (the stash happens
4
+ * BEFORE submission, when no exchange orderId exists yet); promote()
5
+ * re-keys it to the exchange-issued orderId once the REST ack returns. */
6
+ orderId: string;
7
+ /** Client order id (idempotency key) — secondary lookup key. The WS
8
+ * ORDER_TRADE_UPDATE carries it (`o.c`), so a fill that arrives BEFORE
9
+ * the REST response (routine for market orders) still finds the stash. */
10
+ clientOrderId?: string;
11
+ /** Canonical (un-suffixed) symbol. */
12
+ symbol: string;
13
+ /** Side the agent intended at create_order time. */
14
+ side: 'buy' | 'sell';
15
+ metadata: PositionMetadata;
16
+ createdAt: number;
17
+ /** Epoch ms after which this entry is dropped. */
18
+ expiresAt: number;
19
+ }
20
+ export type NowFn = () => number;
21
+ export interface PendingEntryStoreOptions {
22
+ pluginId?: string;
23
+ basePath?: string;
24
+ now?: NowFn;
25
+ ttlMs?: number;
26
+ }
27
+ export declare class PendingEntryStore {
28
+ private readonly filePath;
29
+ private readonly dir;
30
+ private readonly now;
31
+ private readonly ttlMs;
32
+ private entries;
33
+ /** clientOrderId → primary key in `entries`. Lets WS fills that beat the
34
+ * REST ack (no exchange orderId known yet) find the stash by cid. */
35
+ private cidIndex;
36
+ constructor(opts?: PendingEntryStoreOptions);
37
+ /** Stash metadata until the WS fill for this order arrives. Keyed by
38
+ * `orderId`; when `clientOrderId` is provided the entry is also findable
39
+ * by it (pre-submission stashes pass the cid as BOTH — see create_order). */
40
+ put(input: {
41
+ orderId: string;
42
+ clientOrderId?: string;
43
+ symbol: string;
44
+ side: 'buy' | 'sell';
45
+ metadata: PositionMetadata;
46
+ }): void;
47
+ /** Re-key a pre-submission stash (keyed by clientOrderId) to the
48
+ * exchange-issued orderId once the REST ack returns. The cid alias keeps
49
+ * working. No-op when the entry is gone (already consumed by a WS fill
50
+ * that beat the REST response, or expired). */
51
+ promote(fromKey: string, exchangeOrderId: string): void;
52
+ /** Retrieve metadata stashed for an orderId (or clientOrderId alias).
53
+ * Does NOT remove the entry — callers should call `consume(orderId)` to
54
+ * remove on first match, since multiple partial fills on the same limit
55
+ * order all share one orderId and the FIRST fill is the entry; subsequent
56
+ * are scale-ins of an already-registered position (state-store branch
57
+ * handles those). */
58
+ get(orderId: string): PendingEntry | undefined;
59
+ /** Atomic get + remove (accepts orderId or clientOrderId). Use this when
60
+ * you've already consumed the metadata to post an entry row and don't
61
+ * want it picked up again. */
62
+ consume(orderId: string): PendingEntry | undefined;
63
+ /** Remove an entry without retrieval (e.g. on cancel). */
64
+ drop(orderId: string): boolean;
65
+ /** Resolve a lookup key that may be an orderId or a clientOrderId alias. */
66
+ private resolveKey;
67
+ private deleteEntry;
68
+ size(): number;
69
+ getFilePath(): string;
70
+ private pruneExpired;
71
+ private loadOrInit;
72
+ private persist;
73
+ private validateFile;
74
+ }
@@ -0,0 +1,236 @@
1
+ // Pending-entry metadata cache.
2
+ //
3
+ // When the agent calls create_order with v2.10.0 metadata (thesis, setup_type,
4
+ // regime, scorecard_verdict, confluence_score, etc.) for a LIMIT order that
5
+ // doesn't fill immediately, the metadata is stashed here keyed by the
6
+ // exchange's orderId. When the WS-driven fill arrives later (could be seconds
7
+ // or hours), `onWsFillObserved` looks up the metadata and posts the entry /
8
+ // scale-in decision row with the original rationale intact.
9
+ //
10
+ // Without this cache, limit-order entries land in `position_entries` with
11
+ // thesis='(no thesis recorded)' / setupType='unknown' — useless for Phase 2
12
+ // outcome attribution and Phase 3 mining.
13
+ //
14
+ // Persistence: same atomic-rename pattern as bracket-ledger / position-state-
15
+ // store. File at ~/.openclaw/plugins/<pluginId>/pending-entry-metadata.json.
16
+ //
17
+ // TTL: entries auto-expire 24 hours after creation (limit orders rarely live
18
+ // longer; expired entries are pruned on every load + every write to keep the
19
+ // file bounded).
20
+ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
21
+ import { join } from 'node:path';
22
+ import { resolvePluginsBaseDir } from '../util/plugin-paths.js';
23
+ import { logger, formatError } from '../logger.js';
24
+ const TAG = 'pending-entry-metadata';
25
+ const DEFAULT_PLUGIN_ID = 'reefclaw-paper-trading';
26
+ const STATE_FILENAME = 'pending-entry-metadata.json';
27
+ const SCHEMA_VERSION = 1;
28
+ const DEFAULT_TTL_MS = 24 * 60 * 60 * 1000;
29
+ const defaultNow = () => Date.now();
30
+ export class PendingEntryStore {
31
+ filePath;
32
+ dir;
33
+ now;
34
+ ttlMs;
35
+ entries = new Map();
36
+ /** clientOrderId → primary key in `entries`. Lets WS fills that beat the
37
+ * REST ack (no exchange orderId known yet) find the stash by cid. */
38
+ cidIndex = new Map();
39
+ constructor(opts) {
40
+ const base = resolvePluginsBaseDir(opts?.basePath);
41
+ this.dir = join(base, opts?.pluginId ?? DEFAULT_PLUGIN_ID);
42
+ this.filePath = join(this.dir, STATE_FILENAME);
43
+ this.now = opts?.now ?? defaultNow;
44
+ this.ttlMs = opts?.ttlMs ?? DEFAULT_TTL_MS;
45
+ if (!existsSync(this.dir))
46
+ mkdirSync(this.dir, { recursive: true });
47
+ this.loadOrInit();
48
+ }
49
+ /** Stash metadata until the WS fill for this order arrives. Keyed by
50
+ * `orderId`; when `clientOrderId` is provided the entry is also findable
51
+ * by it (pre-submission stashes pass the cid as BOTH — see create_order). */
52
+ put(input) {
53
+ const ts = this.now();
54
+ this.entries.set(input.orderId, {
55
+ orderId: input.orderId,
56
+ ...(input.clientOrderId ? { clientOrderId: input.clientOrderId } : {}),
57
+ symbol: input.symbol,
58
+ side: input.side,
59
+ metadata: input.metadata,
60
+ createdAt: ts,
61
+ expiresAt: ts + this.ttlMs,
62
+ });
63
+ if (input.clientOrderId)
64
+ this.cidIndex.set(input.clientOrderId, input.orderId);
65
+ this.persist();
66
+ }
67
+ /** Re-key a pre-submission stash (keyed by clientOrderId) to the
68
+ * exchange-issued orderId once the REST ack returns. The cid alias keeps
69
+ * working. No-op when the entry is gone (already consumed by a WS fill
70
+ * that beat the REST response, or expired). */
71
+ promote(fromKey, exchangeOrderId) {
72
+ const key = this.resolveKey(fromKey);
73
+ if (key === undefined || key === exchangeOrderId)
74
+ return;
75
+ const entry = this.entries.get(key);
76
+ if (!entry)
77
+ return;
78
+ this.entries.delete(key);
79
+ entry.orderId = exchangeOrderId;
80
+ this.entries.set(exchangeOrderId, entry);
81
+ if (entry.clientOrderId)
82
+ this.cidIndex.set(entry.clientOrderId, exchangeOrderId);
83
+ this.persist();
84
+ }
85
+ /** Retrieve metadata stashed for an orderId (or clientOrderId alias).
86
+ * Does NOT remove the entry — callers should call `consume(orderId)` to
87
+ * remove on first match, since multiple partial fills on the same limit
88
+ * order all share one orderId and the FIRST fill is the entry; subsequent
89
+ * are scale-ins of an already-registered position (state-store branch
90
+ * handles those). */
91
+ get(orderId) {
92
+ this.pruneExpired();
93
+ const key = this.resolveKey(orderId);
94
+ return key === undefined ? undefined : this.entries.get(key);
95
+ }
96
+ /** Atomic get + remove (accepts orderId or clientOrderId). Use this when
97
+ * you've already consumed the metadata to post an entry row and don't
98
+ * want it picked up again. */
99
+ consume(orderId) {
100
+ this.pruneExpired();
101
+ const key = this.resolveKey(orderId);
102
+ if (key === undefined)
103
+ return undefined;
104
+ const entry = this.entries.get(key);
105
+ if (!entry)
106
+ return undefined;
107
+ this.deleteEntry(key, entry);
108
+ this.persist();
109
+ return entry;
110
+ }
111
+ /** Remove an entry without retrieval (e.g. on cancel). */
112
+ drop(orderId) {
113
+ const key = this.resolveKey(orderId);
114
+ if (key === undefined)
115
+ return false;
116
+ const entry = this.entries.get(key);
117
+ if (!entry)
118
+ return false;
119
+ this.deleteEntry(key, entry);
120
+ this.persist();
121
+ return true;
122
+ }
123
+ /** Resolve a lookup key that may be an orderId or a clientOrderId alias. */
124
+ resolveKey(k) {
125
+ if (this.entries.has(k))
126
+ return k;
127
+ const viaCid = this.cidIndex.get(k);
128
+ return viaCid !== undefined && this.entries.has(viaCid) ? viaCid : undefined;
129
+ }
130
+ deleteEntry(key, entry) {
131
+ this.entries.delete(key);
132
+ if (entry.clientOrderId)
133
+ this.cidIndex.delete(entry.clientOrderId);
134
+ }
135
+ size() {
136
+ return this.entries.size;
137
+ }
138
+ getFilePath() {
139
+ return this.filePath;
140
+ }
141
+ // ---- Internals ----
142
+ pruneExpired() {
143
+ const ts = this.now();
144
+ let pruned = false;
145
+ for (const [orderId, entry] of this.entries) {
146
+ if (entry.expiresAt <= ts) {
147
+ this.deleteEntry(orderId, entry);
148
+ pruned = true;
149
+ }
150
+ }
151
+ if (pruned)
152
+ this.persist();
153
+ }
154
+ loadOrInit() {
155
+ if (!existsSync(this.filePath)) {
156
+ logger.info(TAG, `No state file at ${this.filePath}; starting empty`);
157
+ return;
158
+ }
159
+ let raw;
160
+ try {
161
+ raw = readFileSync(this.filePath, 'utf8');
162
+ }
163
+ catch (err) {
164
+ throw new Error(`pending-entry-metadata: failed to read ${this.filePath}: ${formatError(err)}`);
165
+ }
166
+ let parsed;
167
+ try {
168
+ parsed = JSON.parse(raw);
169
+ }
170
+ catch (err) {
171
+ throw new Error(`pending-entry-metadata: ${this.filePath} is not valid JSON: ${formatError(err)}`);
172
+ }
173
+ const file = this.validateFile(parsed);
174
+ const ts = this.now();
175
+ let kept = 0;
176
+ let dropped = 0;
177
+ for (const entry of file.entries) {
178
+ if (entry.expiresAt > ts) {
179
+ this.entries.set(entry.orderId, entry);
180
+ if (entry.clientOrderId)
181
+ this.cidIndex.set(entry.clientOrderId, entry.orderId);
182
+ kept++;
183
+ }
184
+ else {
185
+ dropped++;
186
+ }
187
+ }
188
+ logger.info(TAG, `Loaded ${kept} pending entries from ${this.filePath}` +
189
+ (dropped > 0 ? ` (pruned ${dropped} expired)` : ''));
190
+ if (dropped > 0)
191
+ this.persist();
192
+ }
193
+ persist() {
194
+ const file = {
195
+ schemaVersion: SCHEMA_VERSION,
196
+ entries: Array.from(this.entries.values()),
197
+ };
198
+ const tempPath = `${this.filePath}.tmp`;
199
+ writeFileSync(tempPath, JSON.stringify(file, null, 2));
200
+ renameSync(tempPath, this.filePath);
201
+ }
202
+ validateFile(raw) {
203
+ if (!isRecord(raw))
204
+ throw new Error('pending-entry-metadata: file root is not an object');
205
+ if (raw.schemaVersion !== SCHEMA_VERSION) {
206
+ throw new Error(`pending-entry-metadata: unsupported schemaVersion ${String(raw.schemaVersion)} (expected ${SCHEMA_VERSION})`);
207
+ }
208
+ if (!Array.isArray(raw.entries))
209
+ throw new Error('pending-entry-metadata: entries is not an array');
210
+ const entries = [];
211
+ for (const e of raw.entries) {
212
+ if (!isRecord(e))
213
+ throw new Error('pending-entry-metadata: entry is not an object');
214
+ if (typeof e.orderId !== 'string' || e.orderId.length === 0) {
215
+ throw new Error('pending-entry-metadata: entry missing orderId');
216
+ }
217
+ if (e.clientOrderId !== undefined && (typeof e.clientOrderId !== 'string' || e.clientOrderId.length === 0)) {
218
+ throw new Error('pending-entry-metadata: invalid clientOrderId');
219
+ }
220
+ if (typeof e.symbol !== 'string' || e.symbol.length === 0) {
221
+ throw new Error('pending-entry-metadata: entry missing symbol');
222
+ }
223
+ if (e.side !== 'buy' && e.side !== 'sell') {
224
+ throw new Error(`pending-entry-metadata: bad side ${String(e.side)}`);
225
+ }
226
+ if (typeof e.expiresAt !== 'number' || !Number.isFinite(e.expiresAt)) {
227
+ throw new Error('pending-entry-metadata: missing/invalid expiresAt');
228
+ }
229
+ entries.push(e);
230
+ }
231
+ return { schemaVersion: SCHEMA_VERSION, entries };
232
+ }
233
+ }
234
+ function isRecord(v) {
235
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
236
+ }
@@ -0,0 +1,171 @@
1
+ import type { PositionDecisionsClient } from './position-decisions-client.js';
2
+ import type { PositionStateStore } from '../live/position-state-store.js';
3
+ import type { CcxtOrder } from '../types.js';
4
+ import type { IExchangeAdapter } from '../exchange-adapter.js';
5
+ import type { PositionMetadata } from '../simulator/types.js';
6
+ import type { PendingEntryStore } from './pending-entry-metadata.js';
7
+ import type { ReentryTracker } from '../portfolio/reentry-tracker.js';
8
+ export interface AutoCaptureContext {
9
+ decisionsClient?: PositionDecisionsClient;
10
+ stateStore?: PositionStateStore;
11
+ /** Stash for create_order metadata that arrives BEFORE the fill (limit
12
+ * orders that don't fill immediately). Looked up by exchangeOrderId when
13
+ * the WS fill arrives via `onWsFillObserved`. */
14
+ pendingEntries?: PendingEntryStore;
15
+ userId?: string;
16
+ /** When true, a reduce-only fill that takes a journaled position flat is
17
+ * auto-captured as an exact close (bracket SL/TP fill or other close that
18
+ * bypassed close_position). Default behaviour when unset is the legacy
19
+ * no-op (reduce-only fills ignored). Env kill-switch: RC_JOURNAL_CLOSE_ON_FILL
20
+ * (set 'off' to disable). See docs/CLAUDE/position-journal.md (close-bypass). */
21
+ closeOnReduceOnlyFill?: boolean;
22
+ /** Resolve the active trading book ('paper' | 'live') at capture time, read
23
+ * from the current adapter (so it follows a runtime reconnect). Tags the
24
+ * journal position row so paper and live entries can be segregated. */
25
+ resolveMode?: () => 'paper' | 'live';
26
+ /** Venue this gateway trades ('binance' | 'hyperliquid'). Static per process
27
+ * — changing venue requires a config edit + restart (plan §5.2), so unlike
28
+ * `resolveMode` this is a plain value, not a resolver. Tags journal rows
29
+ * (positions.exchange, migration 0058). */
30
+ venue?: 'binance' | 'hyperliquid';
31
+ /** Resolve the ACTIVE adapter at capture time (follows a runtime reconnect,
32
+ * same deferred-closure pattern as resolveMode). Used by the stale-state
33
+ * defense in onCreateOrderFilled: when the state-store claims an open
34
+ * position but the exchange position is exactly the just-filled quantity,
35
+ * the prior exposure was closed outside the journal (watcher/manual) and
36
+ * the mapping is STALE — stitching onto it fabricates P&L (issue #199). */
37
+ resolveAdapter?: () => IExchangeAdapter | undefined;
38
+ /** Re-entry tracker (issue #204) — every close path records the exit so
39
+ * scan_pairs can flag setups already traded within the current signal bar. */
40
+ reentryTracker?: ReentryTracker;
41
+ }
42
+ /** Engine-exact paper fill economics attached by the simulator to close-order
43
+ * results (`order.info.paperTrade`, issue #201). All numbers are quote-ccy. */
44
+ export interface PaperTradeInfo {
45
+ grossRealizedPnl: number;
46
+ netRealizedPnl: number;
47
+ openFee: number;
48
+ closeFee: number;
49
+ setupType?: string;
50
+ }
51
+ /** Extract the simulator's engine-exact trade economics from a close order,
52
+ * with strict numeric guards (absent on live orders → undefined). */
53
+ export declare function extractPaperTrade(order: CcxtOrder | undefined): PaperTradeInfo | undefined;
54
+ export interface CreateOrderInputs {
55
+ symbol: string;
56
+ side: 'buy' | 'sell';
57
+ metadata?: PositionMetadata;
58
+ }
59
+ /** Called after a successful adapter.createOrder().
60
+ *
61
+ * For PR 1, we treat any non-zero `filled` quantity as an entry event and
62
+ * upsert the parent position + post the entry decision row. Limit orders that
63
+ * haven't filled yet are skipped (caller can call us again from the WS-ingest
64
+ * pipeline once they fill — that wiring is the follow-up).
65
+ *
66
+ * Always-fail-open: webapp errors are logged but never thrown.
67
+ */
68
+ export declare function onCreateOrderFilled(ctx: AutoCaptureContext, inputs: CreateOrderInputs, order: CcxtOrder): Promise<void>;
69
+ export interface ClosePositionInputs {
70
+ symbol: string;
71
+ closeReason: string;
72
+ closeAssessment: Record<string, unknown>;
73
+ /** Optional v2.10.0 inputs the agent may have passed alongside reason+assessment. */
74
+ scorecardVerdict?: string;
75
+ confluenceScore?: number;
76
+ regime?: string;
77
+ regimeConfidence?: number;
78
+ }
79
+ /** Called after a successful adapter.closePosition() with the v2.10.0 reason +
80
+ * assessment from close_position.ts. Looks up the cached position UUID, posts
81
+ * the close decision row, and drops the local state entry. */
82
+ export declare function onClosePositionFilled(ctx: AutoCaptureContext, inputs: ClosePositionInputs, order: CcxtOrder): Promise<void>;
83
+ export interface AutoFlattenCloseInputs {
84
+ symbol: string;
85
+ /** Actual average fill price of the flatten close (resolved, never a limit). */
86
+ fillPrice: number;
87
+ fillSize: number;
88
+ exchangeTradeId?: string;
89
+ observedAtMs?: number;
90
+ }
91
+ /** Journal the close produced by an adapter-internal auto-flatten
92
+ * (`bracket_attach_failed`). Those flattens call `adapter.closePosition`
93
+ * directly, bypassing the close_position tool, so `onClosePositionFilled`
94
+ * never runs and the position row orphaned as status='open' (issue #196:
95
+ * LTC 2026-07-14, TAO 2026-07-15 — both showed 1 exchange position vs 2 in the
96
+ * journal). Polls briefly for the entry journal's webappPositionId (the
97
+ * entry's WS fill can arrive just after the flatten), then posts an idempotent
98
+ * close row (UNIQUE on position_id) and drops the state-store entry. Fail-open;
99
+ * the boot DB reconcile sweep is the backstop if the entry never journals. */
100
+ export declare function onAutoFlattenClose(ctx: AutoCaptureContext, inputs: AutoFlattenCloseInputs, lookup?: {
101
+ attempts: number;
102
+ intervalMs: number;
103
+ }): Promise<void>;
104
+ export interface StopWatcherCloseInputs {
105
+ symbol: string;
106
+ stopPrice: number;
107
+ markPrice: number;
108
+ /** The executed close order from adapter.closePosition (may be absent if the
109
+ * close resolved through a path that didn't surface it). */
110
+ order?: CcxtOrder;
111
+ }
112
+ /** Journal a stop-watcher auto-close (issue #199).
113
+ *
114
+ * The watcher calls `adapter.closePosition(symbol, 'stop_watcher')` directly —
115
+ * it never goes through the close_position tool, and paper has no WS fill
116
+ * stream, so before this hook every watcher close left the journal position
117
+ * (and the state-store mapping) alive: the next trade on the symbol was then
118
+ * silently dropped or stitched onto the stale position, fabricating P&L
119
+ * (measured 14/69 corrupted closes on the 2026-07 HL soak; worst single
120
+ * fabrication −$117.86 vs a real −$10.63).
121
+ *
122
+ * Contract: the engine exposure is DEFINITIVELY gone when this runs (the
123
+ * watcher's close resolved), so the state-store entry is always dropped —
124
+ * even when we can't post a close row (the periodic DB sweep then heals the
125
+ * orphaned DB row instead of a later close being mis-stitched). Fail-open. */
126
+ export declare function onStopWatcherClose(ctx: AutoCaptureContext, inputs: StopWatcherCloseInputs): Promise<void>;
127
+ /** WS-driven fill observed. Resolves the PR1 deferral that limit-order fills
128
+ * + scale-ins were silently dropped. Branches on three cases:
129
+ *
130
+ * - reduceOnly fill → ignored here (close path runs from close_position
131
+ * tool with v2.10.0 reason+assessment; bracket SL/TP
132
+ * fills also reduce-only and the legacy bracket
133
+ * handler covers those).
134
+ * - new-symbol entry → no state-store row → register the position +
135
+ * post entry decision row (uses pending metadata
136
+ * from the cache, or '(no thesis recorded)' fallback).
137
+ * - same-side fill on → state-store row exists with same side → SCALE-IN.
138
+ * existing position Posts a position_entries row with is_scale_in=true.
139
+ * Does NOT create a new positions row (single parent
140
+ * per open exposure).
141
+ * - opposite-side fill → state-store has same symbol but opposite side.
142
+ * on existing position Treated as a manual flatten that bypassed the
143
+ * close_position tool — skip (cleaner to require
144
+ * close_position for proper rationale capture).
145
+ *
146
+ * Dedup: when create_order's market-order path already captured an entry
147
+ * synchronously, the state-store entry's `openedFromExchangeTradeId` matches
148
+ * this fill's orderId. We detect that and skip to avoid double-posting. */
149
+ export interface WsFillInputs {
150
+ symbol: string;
151
+ side: 'buy' | 'sell';
152
+ exchangeOrderId: string;
153
+ exchangeTradeId: string;
154
+ fillPrice: number;
155
+ fillSize: number;
156
+ reduceOnly: boolean;
157
+ /** Binance-exact realised PnL on this specific fill (`o.rp`). Used to sum the
158
+ * position's realised PnL when a reduce-only fill takes it flat. */
159
+ realizedPnl?: number;
160
+ /** Client order id of the fill. Lets the reduce-only close handler tag a
161
+ * bracket SL/TP fill (cid is a bracket cid) vs an external reduce-only close. */
162
+ clientOrderId?: string;
163
+ /** Timestamp from the exchange. Falls back to Date.now() if not provided. */
164
+ exchangeTimeMs?: number;
165
+ }
166
+ export declare function onWsFillObserved(ctx: AutoCaptureContext, fill: WsFillInputs): Promise<void>;
167
+ /** Pinned-plan subset persisted to position_entries.metadata (free-form JSONB).
168
+ * Keys are snake_case per the canonical-JSONB-key rule (CLAUDE.md learning-loop:
169
+ * a camelCase mismatch previously broke learning matching). Returns undefined
170
+ * when neither field is present so we never write an empty object. */
171
+ export declare function buildEntryPlanMetadata(md: PositionMetadata | undefined): Record<string, unknown> | undefined;