@reefclaw/openclaw-plugin 0.1.0

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 (371) hide show
  1. package/.gitignore +8 -0
  2. package/audit/mode-transition-audit.d.ts +11 -0
  3. package/audit/mode-transition-audit.js +29 -0
  4. package/balance-utils.d.ts +36 -0
  5. package/balance-utils.js +98 -0
  6. package/bridge/bridge.d.ts +109 -0
  7. package/bridge/bridge.js +1036 -0
  8. package/bridge/config.d.ts +43 -0
  9. package/bridge/config.js +176 -0
  10. package/bridge/connector.d.ts +52 -0
  11. package/bridge/connector.js +293 -0
  12. package/bridge/event-replay-buffer.d.ts +43 -0
  13. package/bridge/event-replay-buffer.js +109 -0
  14. package/bridge/gateway/event-parser.d.ts +209 -0
  15. package/bridge/gateway/event-parser.js +793 -0
  16. package/bridge/gateway/gateway-config.d.ts +39 -0
  17. package/bridge/gateway/gateway-config.js +86 -0
  18. package/bridge/gateway/gateway-http-client.d.ts +50 -0
  19. package/bridge/gateway/gateway-http-client.js +165 -0
  20. package/bridge/gateway/gateway-ws-client.d.ts +116 -0
  21. package/bridge/gateway/gateway-ws-client.js +417 -0
  22. package/bridge/gateway/poller.d.ts +146 -0
  23. package/bridge/gateway/poller.js +505 -0
  24. package/bridge/gateway/tool-discovery.d.ts +25 -0
  25. package/bridge/gateway/tool-discovery.js +198 -0
  26. package/bridge/index.d.ts +2 -0
  27. package/bridge/index.js +253 -0
  28. package/bridge/logger.d.ts +2 -0
  29. package/bridge/logger.js +2 -0
  30. package/bridge/provider.d.ts +156 -0
  31. package/bridge/provider.js +2 -0
  32. package/bridge/providers/emergency-commands.d.ts +54 -0
  33. package/bridge/providers/emergency-commands.js +235 -0
  34. package/bridge/providers/gateway.d.ts +322 -0
  35. package/bridge/providers/gateway.js +2302 -0
  36. package/bridge/providers/mock.d.ts +37 -0
  37. package/bridge/providers/mock.js +385 -0
  38. package/bridge/providers/onboarding-commands.d.ts +83 -0
  39. package/bridge/providers/onboarding-commands.js +213 -0
  40. package/bridge/providers/risk-calculator.d.ts +96 -0
  41. package/bridge/providers/risk-calculator.js +369 -0
  42. package/bridge/setup.d.ts +32 -0
  43. package/bridge/setup.js +226 -0
  44. package/bridge/types.d.ts +584 -0
  45. package/bridge/types.js +50 -0
  46. package/bridge/utils/reconnect.d.ts +6 -0
  47. package/bridge/utils/reconnect.js +6 -0
  48. package/bridge/utils/skill-signing.d.ts +51 -0
  49. package/bridge/utils/skill-signing.js +138 -0
  50. package/bridge/utils/skill-version.d.ts +17 -0
  51. package/bridge/utils/skill-version.js +74 -0
  52. package/ccxt/binance-ban-gate.d.ts +47 -0
  53. package/ccxt/binance-ban-gate.js +409 -0
  54. package/ccxt/binance-private.d.ts +325 -0
  55. package/ccxt/binance-private.js +1415 -0
  56. package/ccxt/binance-public.d.ts +18 -0
  57. package/ccxt/binance-public.js +147 -0
  58. package/config/agent-config-client.d.ts +55 -0
  59. package/config/agent-config-client.js +145 -0
  60. package/config/agent-config-poller.d.ts +25 -0
  61. package/config/agent-config-poller.js +100 -0
  62. package/config/brackets-config.d.ts +22 -0
  63. package/config/brackets-config.js +58 -0
  64. package/config/gate-store.d.ts +18 -0
  65. package/config/gate-store.js +61 -0
  66. package/config/plugin-config-io.d.ts +181 -0
  67. package/config/plugin-config-io.js +84 -0
  68. package/config/position-review-config.d.ts +35 -0
  69. package/config/position-review-config.js +105 -0
  70. package/config/tool-gate.d.ts +53 -0
  71. package/config/tool-gate.js +125 -0
  72. package/config/user-data-stream-config.d.ts +85 -0
  73. package/config/user-data-stream-config.js +224 -0
  74. package/connector-supervisor.d.ts +36 -0
  75. package/connector-supervisor.js +149 -0
  76. package/exchange-adapter.d.ts +49 -0
  77. package/exchange-adapter.js +4 -0
  78. package/index.d.ts +30 -0
  79. package/index.js +2030 -0
  80. package/ingest/pending-entry-metadata.d.ts +52 -0
  81. package/ingest/pending-entry-metadata.js +182 -0
  82. package/ingest/position-auto-capture.d.ts +98 -0
  83. package/ingest/position-auto-capture.js +394 -0
  84. package/ingest/position-decisions-client.d.ts +318 -0
  85. package/ingest/position-decisions-client.js +296 -0
  86. package/ingest/reconcile-db-vs-exchange.d.ts +13 -0
  87. package/ingest/reconcile-db-vs-exchange.js +114 -0
  88. package/ingest/reconciler-cleanup.d.ts +37 -0
  89. package/ingest/reconciler-cleanup.js +147 -0
  90. package/ingest/rest-gap-filler.d.ts +191 -0
  91. package/ingest/rest-gap-filler.js +565 -0
  92. package/ingest/touched-symbols-store.d.ts +25 -0
  93. package/ingest/touched-symbols-store.js +96 -0
  94. package/ingest/trade-store-client.d.ts +40 -0
  95. package/ingest/trade-store-client.js +125 -0
  96. package/ingest/ws-ingest.d.ts +43 -0
  97. package/ingest/ws-ingest.js +126 -0
  98. package/learning/setup-family.d.ts +21 -0
  99. package/learning/setup-family.js +103 -0
  100. package/lifecycle/install-signal-handlers.d.ts +33 -0
  101. package/lifecycle/install-signal-handlers.js +112 -0
  102. package/lifecycle/shutdown-coordinator.d.ts +43 -0
  103. package/lifecycle/shutdown-coordinator.js +131 -0
  104. package/live/bracket-id.d.ts +18 -0
  105. package/live/bracket-id.js +81 -0
  106. package/live/bracket-ledger.d.ts +54 -0
  107. package/live/bracket-ledger.js +267 -0
  108. package/live/bracket-manager.d.ts +82 -0
  109. package/live/bracket-manager.js +478 -0
  110. package/live/bracket-params.d.ts +22 -0
  111. package/live/bracket-params.js +124 -0
  112. package/live/bracket-reconciler.d.ts +95 -0
  113. package/live/bracket-reconciler.js +573 -0
  114. package/live/bracket-types.d.ts +102 -0
  115. package/live/bracket-types.js +8 -0
  116. package/live/deposit-tracker.d.ts +62 -0
  117. package/live/deposit-tracker.js +97 -0
  118. package/live/emergency-controls.d.ts +32 -0
  119. package/live/emergency-controls.js +226 -0
  120. package/live/exchange-errors.d.ts +12 -0
  121. package/live/exchange-errors.js +130 -0
  122. package/live/exchange-info-cache.d.ts +35 -0
  123. package/live/exchange-info-cache.js +119 -0
  124. package/live/fact-subscriber.d.ts +78 -0
  125. package/live/fact-subscriber.js +182 -0
  126. package/live/intent-journal.d.ts +42 -0
  127. package/live/intent-journal.js +122 -0
  128. package/live/listen-key-manager.d.ts +70 -0
  129. package/live/listen-key-manager.js +169 -0
  130. package/live/live-adapter.d.ts +264 -0
  131. package/live/live-adapter.js +1665 -0
  132. package/live/live-balance-enricher.d.ts +32 -0
  133. package/live/live-balance-enricher.js +104 -0
  134. package/live/live-bracket-api.d.ts +13 -0
  135. package/live/live-bracket-api.js +20 -0
  136. package/live/live-state-store.d.ts +194 -0
  137. package/live/live-state-store.js +450 -0
  138. package/live/local-signal-service.d.ts +57 -0
  139. package/live/local-signal-service.js +146 -0
  140. package/live/local-strategy-evaluator.d.ts +62 -0
  141. package/live/local-strategy-evaluator.js +127 -0
  142. package/live/microstructure-assembler.d.ts +54 -0
  143. package/live/microstructure-assembler.js +148 -0
  144. package/live/order-poller.d.ts +29 -0
  145. package/live/order-poller.js +125 -0
  146. package/live/position-state-store.d.ts +83 -0
  147. package/live/position-state-store.js +237 -0
  148. package/live/proposal-decision-listener.d.ts +64 -0
  149. package/live/proposal-decision-listener.js +288 -0
  150. package/live/proposal-manager.d.ts +76 -0
  151. package/live/proposal-manager.js +140 -0
  152. package/live/rate-limiter.d.ts +47 -0
  153. package/live/rate-limiter.js +159 -0
  154. package/live/reconciler.d.ts +39 -0
  155. package/live/reconciler.js +175 -0
  156. package/live/setup-buckets.d.ts +7 -0
  157. package/live/setup-buckets.js +33 -0
  158. package/live/slippage-tracker.d.ts +45 -0
  159. package/live/slippage-tracker.js +78 -0
  160. package/live/stop-watcher.d.ts +34 -0
  161. package/live/stop-watcher.js +158 -0
  162. package/live/user-data-active-probe.d.ts +54 -0
  163. package/live/user-data-active-probe.js +180 -0
  164. package/live/user-data-stream-controller.d.ts +200 -0
  165. package/live/user-data-stream-controller.js +579 -0
  166. package/live/user-data-stream-ws.d.ts +22 -0
  167. package/live/user-data-stream-ws.js +63 -0
  168. package/live/user-data-stream.d.ts +243 -0
  169. package/live/user-data-stream.js +704 -0
  170. package/logger.d.ts +2 -0
  171. package/logger.js +2 -0
  172. package/mfe.d.ts +21 -0
  173. package/mfe.js +68 -0
  174. package/onboarding/mode-ladder.d.ts +1 -0
  175. package/onboarding/mode-ladder.js +3 -0
  176. package/onboarding/runtime.d.ts +71 -0
  177. package/onboarding/runtime.js +153 -0
  178. package/openclaw.plugin.json +94 -0
  179. package/package.json +27 -0
  180. package/paper-adapter.d.ts +24 -0
  181. package/paper-adapter.js +91 -0
  182. package/persistence/state-manager.d.ts +42 -0
  183. package/persistence/state-manager.js +164 -0
  184. package/pinned-plan.d.ts +9 -0
  185. package/pinned-plan.js +23 -0
  186. package/risk/pre-trade-check.d.ts +38 -0
  187. package/risk/pre-trade-check.js +345 -0
  188. package/risk/pre-trade-types.d.ts +60 -0
  189. package/risk/pre-trade-types.js +3 -0
  190. package/scripts/assemble.mjs +114 -0
  191. package/shadow/shadow-tracker.d.ts +36 -0
  192. package/shadow/shadow-tracker.js +151 -0
  193. package/shadow/types.d.ts +42 -0
  194. package/shadow/types.js +20 -0
  195. package/shared/indicators-extended.d.ts +52 -0
  196. package/shared/indicators-extended.js +291 -0
  197. package/shared/indicators.d.ts +15 -0
  198. package/shared/indicators.js +114 -0
  199. package/signals/conditions/registry.d.ts +16 -0
  200. package/signals/conditions/registry.js +1274 -0
  201. package/signals/conditions/types.d.ts +1 -0
  202. package/signals/conditions/types.js +4 -0
  203. package/signals/direction-rules.d.ts +3 -0
  204. package/signals/direction-rules.js +24 -0
  205. package/signals/entry-rules.d.ts +6 -0
  206. package/signals/entry-rules.js +33 -0
  207. package/signals/serialize-context.d.ts +4 -0
  208. package/signals/serialize-context.js +39 -0
  209. package/signals/stop-rules.d.ts +3 -0
  210. package/signals/stop-rules.js +48 -0
  211. package/signals/strategy-adapter.d.ts +14 -0
  212. package/signals/strategy-adapter.js +122 -0
  213. package/signals/types.d.ts +1 -0
  214. package/signals/types.js +8 -0
  215. package/simulator/exchange-simulator.d.ts +93 -0
  216. package/simulator/exchange-simulator.js +684 -0
  217. package/simulator/fill-engine.d.ts +53 -0
  218. package/simulator/fill-engine.js +276 -0
  219. package/simulator/paper-market-feed.d.ts +26 -0
  220. package/simulator/paper-market-feed.js +104 -0
  221. package/simulator/realistic-fills.d.ts +59 -0
  222. package/simulator/realistic-fills.js +175 -0
  223. package/simulator/types.d.ts +219 -0
  224. package/simulator/types.js +43 -0
  225. package/skills/reefclaw/SKILL.md +97 -0
  226. package/strategy/builtin-strategies.d.ts +2 -0
  227. package/strategy/builtin-strategies.js +109 -0
  228. package/strategy/condition-registry.d.ts +3 -0
  229. package/strategy/condition-registry.js +153 -0
  230. package/strategy/evaluator.d.ts +67 -0
  231. package/strategy/evaluator.js +93 -0
  232. package/tools/assessment-validation.d.ts +118 -0
  233. package/tools/assessment-validation.js +415 -0
  234. package/tools/attach-brackets.d.ts +34 -0
  235. package/tools/attach-brackets.js +363 -0
  236. package/tools/audit-bracket-protection.d.ts +49 -0
  237. package/tools/audit-bracket-protection.js +527 -0
  238. package/tools/cancel-all-orders.d.ts +7 -0
  239. package/tools/cancel-all-orders.js +5 -0
  240. package/tools/cancel-order.d.ts +10 -0
  241. package/tools/cancel-order.js +14 -0
  242. package/tools/check-position-health.d.ts +46 -0
  243. package/tools/check-position-health.js +194 -0
  244. package/tools/clear-exchange-credentials.d.ts +24 -0
  245. package/tools/clear-exchange-credentials.js +70 -0
  246. package/tools/close-position.d.ts +22 -0
  247. package/tools/close-position.js +449 -0
  248. package/tools/create-order.d.ts +54 -0
  249. package/tools/create-order.js +338 -0
  250. package/tools/exit-gate.d.ts +58 -0
  251. package/tools/exit-gate.js +162 -0
  252. package/tools/fetch-balance.d.ts +5 -0
  253. package/tools/fetch-balance.js +4 -0
  254. package/tools/fetch-ohlcv.d.ts +11 -0
  255. package/tools/fetch-ohlcv.js +8 -0
  256. package/tools/fetch-open-orders.d.ts +7 -0
  257. package/tools/fetch-open-orders.js +4 -0
  258. package/tools/fetch-positions.d.ts +7 -0
  259. package/tools/fetch-positions.js +4 -0
  260. package/tools/fetch-ticker.d.ts +11 -0
  261. package/tools/fetch-ticker.js +5 -0
  262. package/tools/get-agent-profile.d.ts +4 -0
  263. package/tools/get-agent-profile.js +6 -0
  264. package/tools/get-analytics.d.ts +6 -0
  265. package/tools/get-analytics.js +7 -0
  266. package/tools/get-backtest.d.ts +12 -0
  267. package/tools/get-backtest.js +91 -0
  268. package/tools/get-basis.d.ts +7 -0
  269. package/tools/get-basis.js +7 -0
  270. package/tools/get-bracket-config.d.ts +11 -0
  271. package/tools/get-bracket-config.js +24 -0
  272. package/tools/get-cascade-risk.d.ts +7 -0
  273. package/tools/get-cascade-risk.js +8 -0
  274. package/tools/get-crypto-metrics.d.ts +18 -0
  275. package/tools/get-crypto-metrics.js +45 -0
  276. package/tools/get-cvd.d.ts +6 -0
  277. package/tools/get-cvd.js +6 -0
  278. package/tools/get-divergences.d.ts +6 -0
  279. package/tools/get-divergences.js +6 -0
  280. package/tools/get-funding-context.d.ts +6 -0
  281. package/tools/get-funding-context.js +16 -0
  282. package/tools/get-liquidation-levels.d.ts +7 -0
  283. package/tools/get-liquidation-levels.js +7 -0
  284. package/tools/get-liquidation-pulse.d.ts +9 -0
  285. package/tools/get-liquidation-pulse.js +22 -0
  286. package/tools/get-market-breadth.d.ts +6 -0
  287. package/tools/get-market-breadth.js +8 -0
  288. package/tools/get-market-intel.d.ts +19 -0
  289. package/tools/get-market-intel.js +116 -0
  290. package/tools/get-market-structure.d.ts +47 -0
  291. package/tools/get-market-structure.js +198 -0
  292. package/tools/get-my-mined-patterns.d.ts +20 -0
  293. package/tools/get-my-mined-patterns.js +61 -0
  294. package/tools/get-my-proposed-learnings.d.ts +20 -0
  295. package/tools/get-my-proposed-learnings.js +55 -0
  296. package/tools/get-my-recent-reviews.d.ts +22 -0
  297. package/tools/get-my-recent-reviews.js +66 -0
  298. package/tools/get-orderbook.d.ts +21 -0
  299. package/tools/get-orderbook.js +32 -0
  300. package/tools/get-pattern-scan.d.ts +7 -0
  301. package/tools/get-pattern-scan.js +8 -0
  302. package/tools/get-regime.d.ts +6 -0
  303. package/tools/get-regime.js +7 -0
  304. package/tools/get-relevant-learnings.d.ts +21 -0
  305. package/tools/get-relevant-learnings.js +65 -0
  306. package/tools/get-resting-liquidity.d.ts +6 -0
  307. package/tools/get-resting-liquidity.js +11 -0
  308. package/tools/get-risk-scenario.d.ts +29 -0
  309. package/tools/get-risk-scenario.js +47 -0
  310. package/tools/get-risk-summary.d.ts +51 -0
  311. package/tools/get-risk-summary.js +118 -0
  312. package/tools/get-sentiment.d.ts +4 -0
  313. package/tools/get-sentiment.js +6 -0
  314. package/tools/get-session-review.d.ts +7 -0
  315. package/tools/get-session-review.js +8 -0
  316. package/tools/get-setup-detail.d.ts +7 -0
  317. package/tools/get-setup-detail.js +303 -0
  318. package/tools/get-signals.d.ts +15 -0
  319. package/tools/get-signals.js +54 -0
  320. package/tools/get-sizing.d.ts +6 -0
  321. package/tools/get-sizing.js +6 -0
  322. package/tools/get-trade-feedback.d.ts +7 -0
  323. package/tools/get-trade-feedback.js +8 -0
  324. package/tools/get-trade-flow.d.ts +7 -0
  325. package/tools/get-trade-flow.js +7 -0
  326. package/tools/get-volume-analysis.d.ts +21 -0
  327. package/tools/get-volume-analysis.js +74 -0
  328. package/tools/get-volume-profile.d.ts +7 -0
  329. package/tools/get-volume-profile.js +7 -0
  330. package/tools/helpers.d.ts +25 -0
  331. package/tools/helpers.js +38 -0
  332. package/tools/intel-api.d.ts +14 -0
  333. package/tools/intel-api.js +52 -0
  334. package/tools/intel-cache.d.ts +25 -0
  335. package/tools/intel-cache.js +133 -0
  336. package/tools/list-strategies.d.ts +7 -0
  337. package/tools/list-strategies.js +6 -0
  338. package/tools/modify-stop.d.ts +17 -0
  339. package/tools/modify-stop.js +81 -0
  340. package/tools/modify-target.d.ts +17 -0
  341. package/tools/modify-target.js +71 -0
  342. package/tools/propose-learning.d.ts +22 -0
  343. package/tools/propose-learning.js +65 -0
  344. package/tools/query-review-outcomes.d.ts +30 -0
  345. package/tools/query-review-outcomes.js +64 -0
  346. package/tools/query-trades.d.ts +21 -0
  347. package/tools/query-trades.js +37 -0
  348. package/tools/record-position-reviews.d.ts +38 -0
  349. package/tools/record-position-reviews.js +147 -0
  350. package/tools/save-strategy.d.ts +16 -0
  351. package/tools/save-strategy.js +46 -0
  352. package/tools/scan-pairs.d.ts +18 -0
  353. package/tools/scan-pairs.js +220 -0
  354. package/tools/score-setup.d.ts +31 -0
  355. package/tools/score-setup.js +268 -0
  356. package/tools/set-bracket-requirement.d.ts +18 -0
  357. package/tools/set-bracket-requirement.js +81 -0
  358. package/tools/set-exchange-credentials.d.ts +25 -0
  359. package/tools/set-exchange-credentials.js +80 -0
  360. package/tools/set-trading-mode.d.ts +26 -0
  361. package/tools/set-trading-mode.js +135 -0
  362. package/tools/test-exchange-credentials.d.ts +16 -0
  363. package/tools/test-exchange-credentials.js +100 -0
  364. package/tools/toggle-strategy.d.ts +8 -0
  365. package/tools/toggle-strategy.js +8 -0
  366. package/trading-params-cache.d.ts +26 -0
  367. package/trading-params-cache.js +52 -0
  368. package/types.d.ts +110 -0
  369. package/types.js +7 -0
  370. package/util/plugin-paths.d.ts +3 -0
  371. package/util/plugin-paths.js +15 -0
@@ -0,0 +1,109 @@
1
+ // Bounded per-channel ring buffer of events emitted to the relay. On a
2
+ // reconcile request the bridge replays everything with `seq > lastSeq` per
3
+ // channel so the browser can fill the gap left by a brief disconnect.
4
+ //
5
+ // Why this lives at the skill layer (not the relay)
6
+ // --------------------------------------------------
7
+ // The relay is intentionally stateless (PartyKit Durable Object with a 128 KB
8
+ // value ceiling — see memory/feedback_skillmd_ota_size_limit.md). The skill
9
+ // is a long-running Node process on the user's VPS, where ~250 KB of in-memory
10
+ // ring storage is free. Sequence numbers are also generated skill-side
11
+ // (bridge.ts: `seq: this.seqs[channel]++`), so the skill is the only layer
12
+ // with the canonical seq-per-channel knowledge required to populate gapFill.
13
+ //
14
+ // What this protects against
15
+ // --------------------------
16
+ // Browser-side disconnect windows up to `maxAgeMs` (default 5 min). For longer
17
+ // absences the in-memory ring is too short anyway — DB-backed hydration is the
18
+ // proper recovery path (Layer 2, separate PR). Streaming chat chunks, real-time
19
+ // signal pulses, and regime-update flickers have NO DB persistence, so the
20
+ // ring buffer is their only replay mechanism.
21
+ const VALID_CHANNELS = [
22
+ 'market_data',
23
+ 'trade_events',
24
+ 'agent_state',
25
+ 'chat',
26
+ ];
27
+ /** Defaults — see top-of-file rationale.
28
+ *
29
+ * At ~50 chat chunks/sec peak (worst case during a streaming reply) and
30
+ * ~150 byte payloads, 500 events × 4 channels × 200 bytes ≈ 400 KB working
31
+ * set. 5 min covers the dominant class of disconnect (network blip, tab
32
+ * sleep, brief refresh). */
33
+ const DEFAULT_PER_CHANNEL_CAPACITY = 500;
34
+ const DEFAULT_MAX_AGE_MS = 5 * 60_000;
35
+ export class EventReplayBuffer {
36
+ perChannelCapacity;
37
+ maxAgeMs;
38
+ now;
39
+ buffers = {
40
+ market_data: [],
41
+ trade_events: [],
42
+ agent_state: [],
43
+ chat: [],
44
+ };
45
+ constructor(opts = {}) {
46
+ this.perChannelCapacity = opts.perChannelCapacity ?? DEFAULT_PER_CHANNEL_CAPACITY;
47
+ this.maxAgeMs = opts.maxAgeMs ?? DEFAULT_MAX_AGE_MS;
48
+ this.now = opts.now ?? (() => Date.now());
49
+ }
50
+ /** Append a frame that was just sent to the relay. The seq must be the
51
+ * same value placed on the wire so the browser's seq tracker matches. */
52
+ record(channel, event, payload, seq) {
53
+ const buf = this.buffers[channel];
54
+ buf.push({ channel, event, payload, seq, timestamp: this.now() });
55
+ this.evictExpired(channel);
56
+ while (buf.length > this.perChannelCapacity) {
57
+ buf.shift();
58
+ }
59
+ }
60
+ /** Return all buffered events on `channel` with seq > lastSeq, in seq order.
61
+ * Lazy age-eviction keeps the buffer trim even when nothing has been
62
+ * appended for a while. */
63
+ since(channel, lastSeq) {
64
+ this.evictExpired(channel);
65
+ return this.buffers[channel].filter((e) => e.seq > lastSeq);
66
+ }
67
+ /** Return all buffered events newer than the per-channel `lastSeq`, sorted
68
+ * by timestamp so the browser replays them in roughly the order they
69
+ * were originally emitted. Within a channel, seq is monotonic so the
70
+ * timestamp sort still preserves per-channel ordering — frames emitted
71
+ * in the same millisecond fall back to (channel, seq) for determinism. */
72
+ sinceMany(lastSequences) {
73
+ const out = [];
74
+ for (const ch of VALID_CHANNELS) {
75
+ const lastSeq = lastSequences[ch] ?? -1;
76
+ out.push(...this.since(ch, lastSeq));
77
+ }
78
+ out.sort((a, b) => {
79
+ if (a.timestamp !== b.timestamp)
80
+ return a.timestamp - b.timestamp;
81
+ if (a.channel !== b.channel)
82
+ return a.channel < b.channel ? -1 : 1;
83
+ return a.seq - b.seq;
84
+ });
85
+ return out;
86
+ }
87
+ /** Drop the buffer (e.g. on bridge shutdown). */
88
+ clear() {
89
+ for (const ch of VALID_CHANNELS) {
90
+ this.buffers[ch].length = 0;
91
+ }
92
+ }
93
+ /** Diagnostic — total events held across all channels. */
94
+ size() {
95
+ let n = 0;
96
+ for (const ch of VALID_CHANNELS)
97
+ n += this.buffers[ch].length;
98
+ return n;
99
+ }
100
+ evictExpired(channel) {
101
+ const buf = this.buffers[channel];
102
+ if (buf.length === 0)
103
+ return;
104
+ const cutoff = this.now() - this.maxAgeMs;
105
+ while (buf.length > 0 && buf[0].timestamp < cutoff) {
106
+ buf.shift();
107
+ }
108
+ }
109
+ }
@@ -0,0 +1,209 @@
1
+ import type { TickerData, OrderData, FillData, OrderUpdatePayload } from '../types.js';
2
+ import type { ProviderEventName, ProviderEvents } from '../provider.js';
3
+ /** CCXT order object — raw shape from fetch_open_orders / create_order results */
4
+ export interface CcxtOrder {
5
+ id: string;
6
+ symbol: string;
7
+ side: 'buy' | 'sell';
8
+ type: 'market' | 'limit' | string;
9
+ status: 'open' | 'closed' | 'canceled' | string;
10
+ amount: number;
11
+ filled: number;
12
+ remaining?: number;
13
+ average?: number | null;
14
+ price?: number | null;
15
+ cost?: number;
16
+ fee?: {
17
+ cost: number;
18
+ currency: string;
19
+ rate?: number;
20
+ };
21
+ timestamp?: number;
22
+ datetime?: string;
23
+ timeInForce?: string;
24
+ [key: string]: unknown;
25
+ }
26
+ /** CCXT ticker object — raw shape from fetch_ticker */
27
+ export interface CcxtTicker {
28
+ symbol: string;
29
+ last: number | null;
30
+ bid: number | null;
31
+ ask: number | null;
32
+ baseVolume: number | null;
33
+ quoteVolume?: number | null;
34
+ change: number | null;
35
+ percentage: number | null;
36
+ timestamp?: number;
37
+ datetime?: string;
38
+ [key: string]: unknown;
39
+ }
40
+ /** CCXT balance object — raw shape from fetch_balance */
41
+ export interface CcxtBalance {
42
+ [currency: string]: {
43
+ free: number;
44
+ used: number;
45
+ total: number;
46
+ } | unknown;
47
+ free?: Record<string, number>;
48
+ used?: Record<string, number>;
49
+ total?: Record<string, number>;
50
+ }
51
+ export declare function mapCcxtStatus(ccxtStatus: string): string;
52
+ export declare function mapCcxtSide(ccxtSide: string): 'BUY' | 'SELL';
53
+ export declare function mapCcxtType(ccxtType: string): 'MARKET' | 'LIMIT';
54
+ /**
55
+ * Map a CCXT order to a ReefClaw OrderData.
56
+ * Returns null if the order has missing critical fields.
57
+ */
58
+ /**
59
+ * True when a CCXT order can only REDUCE/CLOSE a position (a protective bracket),
60
+ * never open/add. Detects ALL forms a Binance Futures stop/TP can take:
61
+ * - `reduceOnly` (unified or raw info)
62
+ * - `closePosition` (the position-bound form ReefClaw brackets actually use —
63
+ * see plugin bracket-params.ts; a `reduceOnly`-only check would MISS these
64
+ * and the kill switch would cancel them, leaving a naked position)
65
+ * - a STOP / TAKE_PROFIT order type (protective by nature)
66
+ * The kill switch uses this to preserve protection. Errs toward `true` only on
67
+ * real protective signals; a plain LIMIT/MARKET entry has none → false.
68
+ */
69
+ export declare function isProtectiveOrder(ccxt: CcxtOrder): boolean;
70
+ export declare function mapCcxtOrder(ccxt: CcxtOrder): OrderData | null;
71
+ /**
72
+ * Build a FillData from a CCXT order (when the order has fills).
73
+ * expectedPrice is the limit price (or average if market order).
74
+ */
75
+ export declare function buildFillFromCcxtOrder(ccxt: CcxtOrder, expectedPrice?: number): FillData | null;
76
+ /**
77
+ * Map a CCXT order into a full OrderUpdatePayload.
78
+ * Returns null if the order has invalid critical fields.
79
+ */
80
+ export declare function mapCcxtOrderToUpdate(ccxt: CcxtOrder, expectedPrice?: number): OrderUpdatePayload | null;
81
+ /**
82
+ * Map a CCXT ticker to a ReefClaw TickerData.
83
+ * Returns null if the ticker has no valid price data.
84
+ */
85
+ export declare function mapCcxtTicker(ccxt: CcxtTicker): TickerData | null;
86
+ /**
87
+ * Map a CCXT balance response to ReefClaw balance shape.
88
+ * Extracts the balance for a given currency (default: USDT).
89
+ *
90
+ * On Binance Futures, prefer `info.assets[]` over CCXT's per-asset
91
+ * `free`/`used` fields. Two reasons:
92
+ *
93
+ * 1. Under cross-margin, per-asset `used` from CCXT is structurally 0 —
94
+ * margin is shared across the account, not booked against any one asset.
95
+ * The plugin backfills `free=total` when `used==0`, which sets
96
+ * `available` to the full wallet and hides the actual locked margin.
97
+ *
98
+ * 2. Multi-asset accounts settle realized PnL into a separate `BNFCR` line —
99
+ * negative when net-loss, positive when net-gain. It's independent of the
100
+ * funded stablecoin (USDT/USDC) and must be folded into both wallet and
101
+ * available reads so the dashboard's `Available + Locked = NAV`-style
102
+ * invariant holds rather than the figures reading off the USDC line alone.
103
+ *
104
+ * `info.assets[i].availableBalance` is Binance's authoritative
105
+ * available-after-margin number; `walletBalance` is the wallet-only line
106
+ * (excludes uPnl). We sum these across {funded stablecoin, BNFCR}; the
107
+ * gateway derives `Locked = NAV − Available` so the invariant holds.
108
+ *
109
+ * Falls back to the legacy per-currency / top-level shape when `info.assets`
110
+ * is absent (paper, non-Binance exchanges, mocks).
111
+ */
112
+ export declare function mapCcxtBalance(ccxt: CcxtBalance, currency?: string): {
113
+ currency: string;
114
+ total: number;
115
+ available: number;
116
+ locked: number;
117
+ };
118
+ /**
119
+ * Extract liquidation-risk fields from a CCXT position. Reads the CCXT
120
+ * unified shape first (`position.liquidationPrice`, `position.leverage`,
121
+ * `position.maintenanceMargin`, `position.marginRatio`) and falls back to
122
+ * Binance's raw `info.*` shape — `info.liquidationPrice`, `info.leverage`,
123
+ * `info.maintMargin`, `info.marginRatio` — which arrives as stringy decimals
124
+ * on the futures REST endpoint. Returns an object of optional numbers so
125
+ * callers can spread it directly into the outgoing position payload.
126
+ *
127
+ * Verified against:
128
+ * - CCXT unified position fields (ccxt docs → "position structure")
129
+ * - Binance Futures `/fapi/v2/positionRisk` response
130
+ * (developers.binance.com → derivatives → positionRisk)
131
+ */
132
+ export declare function extractLiquidationFields(pos: {
133
+ [key: string]: unknown;
134
+ }): {
135
+ liquidationPrice?: number;
136
+ leverage?: number;
137
+ maintenanceMargin?: number;
138
+ marginRatio?: number;
139
+ };
140
+ /**
141
+ * Narrow plugin-side `pos.bracket` at the skill/snapshot boundary.
142
+ * The plugin attaches it via LiveAdapter.decoratePositionsWithMetadata when
143
+ * BracketLedger has an active/partial/attaching row for the symbol. The
144
+ * CcxtPosition index signature is `unknown`, so we re-validate shape here
145
+ * before forwarding into ReconciliationSnapshot.
146
+ *
147
+ * Returns undefined when the field is absent (paper mode, no bracket attached,
148
+ * terminal-state bracket) or malformed. The webapp hides bracket lines when
149
+ * the field is undefined.
150
+ */
151
+ export declare function extractBracketField(pos: {
152
+ [key: string]: unknown;
153
+ }): {
154
+ slPrice?: number;
155
+ tpPrice?: number;
156
+ state: string;
157
+ } | undefined;
158
+ /** The payload shape received from GatewayWsClient 'agent' event */
159
+ export interface AgentEventPayload {
160
+ runId: string;
161
+ stream: 'lifecycle' | 'assistant' | 'tool' | string;
162
+ data: unknown;
163
+ seq?: number;
164
+ }
165
+ /** A single parsed event ready to be fired by GatewayProvider */
166
+ export interface ParsedEvent<E extends ProviderEventName = ProviderEventName> {
167
+ event: E;
168
+ data: Parameters<ProviderEvents[E]>[0];
169
+ }
170
+ export declare class EventParser {
171
+ /** Buffered assistant text per runId, with timestamps for expiry */
172
+ private assistantBuffers;
173
+ /** Last decision timestamp (set on lifecycle 'start') */
174
+ private lastDecisionTs;
175
+ /** Error timestamps within the rolling window */
176
+ private errorTimestamps;
177
+ /** Symbol for balance currency extraction */
178
+ private readonly quoteCurrency;
179
+ /** Callback to emit events from inactivity timer (outside parseAgentEvent flow) */
180
+ private readonly onAsyncEvents;
181
+ constructor(quoteCurrency?: string, onAsyncEvents?: (events: ParsedEvent[]) => void);
182
+ /**
183
+ * Parse a raw agent event into zero or more ProviderEvents.
184
+ * GatewayProvider calls this on every 'agent' event from the WS client.
185
+ */
186
+ parseAgentEvent(payload: AgentEventPayload): ParsedEvent[];
187
+ /** Get the last decision timestamp */
188
+ getLastDecision(): string | null;
189
+ /** Get the rolling error rate (errors per hour) */
190
+ getErrorRate(): number;
191
+ private handleLifecycle;
192
+ private handleAssistant;
193
+ private handleTool;
194
+ private parseOrderResult;
195
+ private parseSingleOrder;
196
+ private parseTickerResult;
197
+ private parseBalanceResult;
198
+ /**
199
+ * Called when a tool ends — resume inactivity timers on all active buffers.
200
+ * If more assistant text follows the tool call, the timer will be cleared
201
+ * again by handleAssistant. If not, the buffer flushes after BUFFER_INACTIVITY_MS.
202
+ */
203
+ private resumeBuffersAfterTool;
204
+ private flushAssistantBuffer;
205
+ /** Prune buffers older than BUFFER_EXPIRY_MS to prevent memory leaks from abandoned runs */
206
+ private pruneExpiredBuffers;
207
+ /** In-place prune of error timestamps outside the rolling window */
208
+ private pruneErrorTimestamps;
209
+ }