@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.
- package/.gitignore +8 -0
- package/audit/mode-transition-audit.d.ts +11 -0
- package/audit/mode-transition-audit.js +29 -0
- package/balance-utils.d.ts +36 -0
- package/balance-utils.js +98 -0
- package/bridge/bridge.d.ts +109 -0
- package/bridge/bridge.js +1036 -0
- package/bridge/config.d.ts +43 -0
- package/bridge/config.js +176 -0
- package/bridge/connector.d.ts +52 -0
- package/bridge/connector.js +293 -0
- package/bridge/event-replay-buffer.d.ts +43 -0
- package/bridge/event-replay-buffer.js +109 -0
- package/bridge/gateway/event-parser.d.ts +209 -0
- package/bridge/gateway/event-parser.js +793 -0
- package/bridge/gateway/gateway-config.d.ts +39 -0
- package/bridge/gateway/gateway-config.js +86 -0
- package/bridge/gateway/gateway-http-client.d.ts +50 -0
- package/bridge/gateway/gateway-http-client.js +165 -0
- package/bridge/gateway/gateway-ws-client.d.ts +116 -0
- package/bridge/gateway/gateway-ws-client.js +417 -0
- package/bridge/gateway/poller.d.ts +146 -0
- package/bridge/gateway/poller.js +505 -0
- package/bridge/gateway/tool-discovery.d.ts +25 -0
- package/bridge/gateway/tool-discovery.js +198 -0
- package/bridge/index.d.ts +2 -0
- package/bridge/index.js +253 -0
- package/bridge/logger.d.ts +2 -0
- package/bridge/logger.js +2 -0
- package/bridge/provider.d.ts +156 -0
- package/bridge/provider.js +2 -0
- package/bridge/providers/emergency-commands.d.ts +54 -0
- package/bridge/providers/emergency-commands.js +235 -0
- package/bridge/providers/gateway.d.ts +322 -0
- package/bridge/providers/gateway.js +2302 -0
- package/bridge/providers/mock.d.ts +37 -0
- package/bridge/providers/mock.js +385 -0
- package/bridge/providers/onboarding-commands.d.ts +83 -0
- package/bridge/providers/onboarding-commands.js +213 -0
- package/bridge/providers/risk-calculator.d.ts +96 -0
- package/bridge/providers/risk-calculator.js +369 -0
- package/bridge/setup.d.ts +32 -0
- package/bridge/setup.js +226 -0
- package/bridge/types.d.ts +584 -0
- package/bridge/types.js +50 -0
- package/bridge/utils/reconnect.d.ts +6 -0
- package/bridge/utils/reconnect.js +6 -0
- package/bridge/utils/skill-signing.d.ts +51 -0
- package/bridge/utils/skill-signing.js +138 -0
- package/bridge/utils/skill-version.d.ts +17 -0
- package/bridge/utils/skill-version.js +74 -0
- package/ccxt/binance-ban-gate.d.ts +47 -0
- package/ccxt/binance-ban-gate.js +409 -0
- package/ccxt/binance-private.d.ts +325 -0
- package/ccxt/binance-private.js +1415 -0
- package/ccxt/binance-public.d.ts +18 -0
- package/ccxt/binance-public.js +147 -0
- package/config/agent-config-client.d.ts +55 -0
- package/config/agent-config-client.js +145 -0
- package/config/agent-config-poller.d.ts +25 -0
- package/config/agent-config-poller.js +100 -0
- package/config/brackets-config.d.ts +22 -0
- package/config/brackets-config.js +58 -0
- package/config/gate-store.d.ts +18 -0
- package/config/gate-store.js +61 -0
- package/config/plugin-config-io.d.ts +181 -0
- package/config/plugin-config-io.js +84 -0
- package/config/position-review-config.d.ts +35 -0
- package/config/position-review-config.js +105 -0
- package/config/tool-gate.d.ts +53 -0
- package/config/tool-gate.js +125 -0
- package/config/user-data-stream-config.d.ts +85 -0
- package/config/user-data-stream-config.js +224 -0
- package/connector-supervisor.d.ts +36 -0
- package/connector-supervisor.js +149 -0
- package/exchange-adapter.d.ts +49 -0
- package/exchange-adapter.js +4 -0
- package/index.d.ts +30 -0
- package/index.js +2030 -0
- package/ingest/pending-entry-metadata.d.ts +52 -0
- package/ingest/pending-entry-metadata.js +182 -0
- package/ingest/position-auto-capture.d.ts +98 -0
- package/ingest/position-auto-capture.js +394 -0
- package/ingest/position-decisions-client.d.ts +318 -0
- package/ingest/position-decisions-client.js +296 -0
- package/ingest/reconcile-db-vs-exchange.d.ts +13 -0
- package/ingest/reconcile-db-vs-exchange.js +114 -0
- package/ingest/reconciler-cleanup.d.ts +37 -0
- package/ingest/reconciler-cleanup.js +147 -0
- package/ingest/rest-gap-filler.d.ts +191 -0
- package/ingest/rest-gap-filler.js +565 -0
- package/ingest/touched-symbols-store.d.ts +25 -0
- package/ingest/touched-symbols-store.js +96 -0
- package/ingest/trade-store-client.d.ts +40 -0
- package/ingest/trade-store-client.js +125 -0
- package/ingest/ws-ingest.d.ts +43 -0
- package/ingest/ws-ingest.js +126 -0
- package/learning/setup-family.d.ts +21 -0
- package/learning/setup-family.js +103 -0
- package/lifecycle/install-signal-handlers.d.ts +33 -0
- package/lifecycle/install-signal-handlers.js +112 -0
- package/lifecycle/shutdown-coordinator.d.ts +43 -0
- package/lifecycle/shutdown-coordinator.js +131 -0
- package/live/bracket-id.d.ts +18 -0
- package/live/bracket-id.js +81 -0
- package/live/bracket-ledger.d.ts +54 -0
- package/live/bracket-ledger.js +267 -0
- package/live/bracket-manager.d.ts +82 -0
- package/live/bracket-manager.js +478 -0
- package/live/bracket-params.d.ts +22 -0
- package/live/bracket-params.js +124 -0
- package/live/bracket-reconciler.d.ts +95 -0
- package/live/bracket-reconciler.js +573 -0
- package/live/bracket-types.d.ts +102 -0
- package/live/bracket-types.js +8 -0
- package/live/deposit-tracker.d.ts +62 -0
- package/live/deposit-tracker.js +97 -0
- package/live/emergency-controls.d.ts +32 -0
- package/live/emergency-controls.js +226 -0
- package/live/exchange-errors.d.ts +12 -0
- package/live/exchange-errors.js +130 -0
- package/live/exchange-info-cache.d.ts +35 -0
- package/live/exchange-info-cache.js +119 -0
- package/live/fact-subscriber.d.ts +78 -0
- package/live/fact-subscriber.js +182 -0
- package/live/intent-journal.d.ts +42 -0
- package/live/intent-journal.js +122 -0
- package/live/listen-key-manager.d.ts +70 -0
- package/live/listen-key-manager.js +169 -0
- package/live/live-adapter.d.ts +264 -0
- package/live/live-adapter.js +1665 -0
- package/live/live-balance-enricher.d.ts +32 -0
- package/live/live-balance-enricher.js +104 -0
- package/live/live-bracket-api.d.ts +13 -0
- package/live/live-bracket-api.js +20 -0
- package/live/live-state-store.d.ts +194 -0
- package/live/live-state-store.js +450 -0
- package/live/local-signal-service.d.ts +57 -0
- package/live/local-signal-service.js +146 -0
- package/live/local-strategy-evaluator.d.ts +62 -0
- package/live/local-strategy-evaluator.js +127 -0
- package/live/microstructure-assembler.d.ts +54 -0
- package/live/microstructure-assembler.js +148 -0
- package/live/order-poller.d.ts +29 -0
- package/live/order-poller.js +125 -0
- package/live/position-state-store.d.ts +83 -0
- package/live/position-state-store.js +237 -0
- package/live/proposal-decision-listener.d.ts +64 -0
- package/live/proposal-decision-listener.js +288 -0
- package/live/proposal-manager.d.ts +76 -0
- package/live/proposal-manager.js +140 -0
- package/live/rate-limiter.d.ts +47 -0
- package/live/rate-limiter.js +159 -0
- package/live/reconciler.d.ts +39 -0
- package/live/reconciler.js +175 -0
- package/live/setup-buckets.d.ts +7 -0
- package/live/setup-buckets.js +33 -0
- package/live/slippage-tracker.d.ts +45 -0
- package/live/slippage-tracker.js +78 -0
- package/live/stop-watcher.d.ts +34 -0
- package/live/stop-watcher.js +158 -0
- package/live/user-data-active-probe.d.ts +54 -0
- package/live/user-data-active-probe.js +180 -0
- package/live/user-data-stream-controller.d.ts +200 -0
- package/live/user-data-stream-controller.js +579 -0
- package/live/user-data-stream-ws.d.ts +22 -0
- package/live/user-data-stream-ws.js +63 -0
- package/live/user-data-stream.d.ts +243 -0
- package/live/user-data-stream.js +704 -0
- package/logger.d.ts +2 -0
- package/logger.js +2 -0
- package/mfe.d.ts +21 -0
- package/mfe.js +68 -0
- package/onboarding/mode-ladder.d.ts +1 -0
- package/onboarding/mode-ladder.js +3 -0
- package/onboarding/runtime.d.ts +71 -0
- package/onboarding/runtime.js +153 -0
- package/openclaw.plugin.json +94 -0
- package/package.json +27 -0
- package/paper-adapter.d.ts +24 -0
- package/paper-adapter.js +91 -0
- package/persistence/state-manager.d.ts +42 -0
- package/persistence/state-manager.js +164 -0
- package/pinned-plan.d.ts +9 -0
- package/pinned-plan.js +23 -0
- package/risk/pre-trade-check.d.ts +38 -0
- package/risk/pre-trade-check.js +345 -0
- package/risk/pre-trade-types.d.ts +60 -0
- package/risk/pre-trade-types.js +3 -0
- package/scripts/assemble.mjs +114 -0
- package/shadow/shadow-tracker.d.ts +36 -0
- package/shadow/shadow-tracker.js +151 -0
- package/shadow/types.d.ts +42 -0
- package/shadow/types.js +20 -0
- package/shared/indicators-extended.d.ts +52 -0
- package/shared/indicators-extended.js +291 -0
- package/shared/indicators.d.ts +15 -0
- package/shared/indicators.js +114 -0
- package/signals/conditions/registry.d.ts +16 -0
- package/signals/conditions/registry.js +1274 -0
- package/signals/conditions/types.d.ts +1 -0
- package/signals/conditions/types.js +4 -0
- package/signals/direction-rules.d.ts +3 -0
- package/signals/direction-rules.js +24 -0
- package/signals/entry-rules.d.ts +6 -0
- package/signals/entry-rules.js +33 -0
- package/signals/serialize-context.d.ts +4 -0
- package/signals/serialize-context.js +39 -0
- package/signals/stop-rules.d.ts +3 -0
- package/signals/stop-rules.js +48 -0
- package/signals/strategy-adapter.d.ts +14 -0
- package/signals/strategy-adapter.js +122 -0
- package/signals/types.d.ts +1 -0
- package/signals/types.js +8 -0
- package/simulator/exchange-simulator.d.ts +93 -0
- package/simulator/exchange-simulator.js +684 -0
- package/simulator/fill-engine.d.ts +53 -0
- package/simulator/fill-engine.js +276 -0
- package/simulator/paper-market-feed.d.ts +26 -0
- package/simulator/paper-market-feed.js +104 -0
- package/simulator/realistic-fills.d.ts +59 -0
- package/simulator/realistic-fills.js +175 -0
- package/simulator/types.d.ts +219 -0
- package/simulator/types.js +43 -0
- package/skills/reefclaw/SKILL.md +97 -0
- package/strategy/builtin-strategies.d.ts +2 -0
- package/strategy/builtin-strategies.js +109 -0
- package/strategy/condition-registry.d.ts +3 -0
- package/strategy/condition-registry.js +153 -0
- package/strategy/evaluator.d.ts +67 -0
- package/strategy/evaluator.js +93 -0
- package/tools/assessment-validation.d.ts +118 -0
- package/tools/assessment-validation.js +415 -0
- package/tools/attach-brackets.d.ts +34 -0
- package/tools/attach-brackets.js +363 -0
- package/tools/audit-bracket-protection.d.ts +49 -0
- package/tools/audit-bracket-protection.js +527 -0
- package/tools/cancel-all-orders.d.ts +7 -0
- package/tools/cancel-all-orders.js +5 -0
- package/tools/cancel-order.d.ts +10 -0
- package/tools/cancel-order.js +14 -0
- package/tools/check-position-health.d.ts +46 -0
- package/tools/check-position-health.js +194 -0
- package/tools/clear-exchange-credentials.d.ts +24 -0
- package/tools/clear-exchange-credentials.js +70 -0
- package/tools/close-position.d.ts +22 -0
- package/tools/close-position.js +449 -0
- package/tools/create-order.d.ts +54 -0
- package/tools/create-order.js +338 -0
- package/tools/exit-gate.d.ts +58 -0
- package/tools/exit-gate.js +162 -0
- package/tools/fetch-balance.d.ts +5 -0
- package/tools/fetch-balance.js +4 -0
- package/tools/fetch-ohlcv.d.ts +11 -0
- package/tools/fetch-ohlcv.js +8 -0
- package/tools/fetch-open-orders.d.ts +7 -0
- package/tools/fetch-open-orders.js +4 -0
- package/tools/fetch-positions.d.ts +7 -0
- package/tools/fetch-positions.js +4 -0
- package/tools/fetch-ticker.d.ts +11 -0
- package/tools/fetch-ticker.js +5 -0
- package/tools/get-agent-profile.d.ts +4 -0
- package/tools/get-agent-profile.js +6 -0
- package/tools/get-analytics.d.ts +6 -0
- package/tools/get-analytics.js +7 -0
- package/tools/get-backtest.d.ts +12 -0
- package/tools/get-backtest.js +91 -0
- package/tools/get-basis.d.ts +7 -0
- package/tools/get-basis.js +7 -0
- package/tools/get-bracket-config.d.ts +11 -0
- package/tools/get-bracket-config.js +24 -0
- package/tools/get-cascade-risk.d.ts +7 -0
- package/tools/get-cascade-risk.js +8 -0
- package/tools/get-crypto-metrics.d.ts +18 -0
- package/tools/get-crypto-metrics.js +45 -0
- package/tools/get-cvd.d.ts +6 -0
- package/tools/get-cvd.js +6 -0
- package/tools/get-divergences.d.ts +6 -0
- package/tools/get-divergences.js +6 -0
- package/tools/get-funding-context.d.ts +6 -0
- package/tools/get-funding-context.js +16 -0
- package/tools/get-liquidation-levels.d.ts +7 -0
- package/tools/get-liquidation-levels.js +7 -0
- package/tools/get-liquidation-pulse.d.ts +9 -0
- package/tools/get-liquidation-pulse.js +22 -0
- package/tools/get-market-breadth.d.ts +6 -0
- package/tools/get-market-breadth.js +8 -0
- package/tools/get-market-intel.d.ts +19 -0
- package/tools/get-market-intel.js +116 -0
- package/tools/get-market-structure.d.ts +47 -0
- package/tools/get-market-structure.js +198 -0
- package/tools/get-my-mined-patterns.d.ts +20 -0
- package/tools/get-my-mined-patterns.js +61 -0
- package/tools/get-my-proposed-learnings.d.ts +20 -0
- package/tools/get-my-proposed-learnings.js +55 -0
- package/tools/get-my-recent-reviews.d.ts +22 -0
- package/tools/get-my-recent-reviews.js +66 -0
- package/tools/get-orderbook.d.ts +21 -0
- package/tools/get-orderbook.js +32 -0
- package/tools/get-pattern-scan.d.ts +7 -0
- package/tools/get-pattern-scan.js +8 -0
- package/tools/get-regime.d.ts +6 -0
- package/tools/get-regime.js +7 -0
- package/tools/get-relevant-learnings.d.ts +21 -0
- package/tools/get-relevant-learnings.js +65 -0
- package/tools/get-resting-liquidity.d.ts +6 -0
- package/tools/get-resting-liquidity.js +11 -0
- package/tools/get-risk-scenario.d.ts +29 -0
- package/tools/get-risk-scenario.js +47 -0
- package/tools/get-risk-summary.d.ts +51 -0
- package/tools/get-risk-summary.js +118 -0
- package/tools/get-sentiment.d.ts +4 -0
- package/tools/get-sentiment.js +6 -0
- package/tools/get-session-review.d.ts +7 -0
- package/tools/get-session-review.js +8 -0
- package/tools/get-setup-detail.d.ts +7 -0
- package/tools/get-setup-detail.js +303 -0
- package/tools/get-signals.d.ts +15 -0
- package/tools/get-signals.js +54 -0
- package/tools/get-sizing.d.ts +6 -0
- package/tools/get-sizing.js +6 -0
- package/tools/get-trade-feedback.d.ts +7 -0
- package/tools/get-trade-feedback.js +8 -0
- package/tools/get-trade-flow.d.ts +7 -0
- package/tools/get-trade-flow.js +7 -0
- package/tools/get-volume-analysis.d.ts +21 -0
- package/tools/get-volume-analysis.js +74 -0
- package/tools/get-volume-profile.d.ts +7 -0
- package/tools/get-volume-profile.js +7 -0
- package/tools/helpers.d.ts +25 -0
- package/tools/helpers.js +38 -0
- package/tools/intel-api.d.ts +14 -0
- package/tools/intel-api.js +52 -0
- package/tools/intel-cache.d.ts +25 -0
- package/tools/intel-cache.js +133 -0
- package/tools/list-strategies.d.ts +7 -0
- package/tools/list-strategies.js +6 -0
- package/tools/modify-stop.d.ts +17 -0
- package/tools/modify-stop.js +81 -0
- package/tools/modify-target.d.ts +17 -0
- package/tools/modify-target.js +71 -0
- package/tools/propose-learning.d.ts +22 -0
- package/tools/propose-learning.js +65 -0
- package/tools/query-review-outcomes.d.ts +30 -0
- package/tools/query-review-outcomes.js +64 -0
- package/tools/query-trades.d.ts +21 -0
- package/tools/query-trades.js +37 -0
- package/tools/record-position-reviews.d.ts +38 -0
- package/tools/record-position-reviews.js +147 -0
- package/tools/save-strategy.d.ts +16 -0
- package/tools/save-strategy.js +46 -0
- package/tools/scan-pairs.d.ts +18 -0
- package/tools/scan-pairs.js +220 -0
- package/tools/score-setup.d.ts +31 -0
- package/tools/score-setup.js +268 -0
- package/tools/set-bracket-requirement.d.ts +18 -0
- package/tools/set-bracket-requirement.js +81 -0
- package/tools/set-exchange-credentials.d.ts +25 -0
- package/tools/set-exchange-credentials.js +80 -0
- package/tools/set-trading-mode.d.ts +26 -0
- package/tools/set-trading-mode.js +135 -0
- package/tools/test-exchange-credentials.d.ts +16 -0
- package/tools/test-exchange-credentials.js +100 -0
- package/tools/toggle-strategy.d.ts +8 -0
- package/tools/toggle-strategy.js +8 -0
- package/trading-params-cache.d.ts +26 -0
- package/trading-params-cache.js +52 -0
- package/types.d.ts +110 -0
- package/types.js +7 -0
- package/util/plugin-paths.d.ts +3 -0
- 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
|
+
}
|