desic-okx-agent 0.2.0 → 0.3.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/README.en.md +353 -0
- package/README.md +194 -190
- package/dist/account/private-websocket.js +4 -4
- package/dist/account/private-websocket.js.map +1 -1
- package/dist/account/service.d.ts +12 -1
- package/dist/account/service.js +18 -0
- package/dist/account/service.js.map +1 -1
- package/dist/bars/rate-limiter.d.ts +18 -0
- package/dist/bars/rate-limiter.js +84 -0
- package/dist/bars/rate-limiter.js.map +1 -0
- package/dist/bars/schema.d.ts +36 -0
- package/dist/bars/schema.js +134 -0
- package/dist/bars/schema.js.map +1 -0
- package/dist/bars/service.d.ts +60 -0
- package/dist/bars/service.js +120 -0
- package/dist/bars/service.js.map +1 -0
- package/dist/bars/store.d.ts +105 -0
- package/dist/bars/store.js +415 -0
- package/dist/bars/store.js.map +1 -0
- package/dist/bars/timeframe.d.ts +40 -0
- package/dist/bars/timeframe.js +146 -0
- package/dist/bars/timeframe.js.map +1 -0
- package/dist/bars/types.d.ts +68 -0
- package/dist/bars/types.js +13 -0
- package/dist/bars/types.js.map +1 -0
- package/dist/cli/data-render.d.ts +37 -0
- package/dist/cli/data-render.js +143 -0
- package/dist/cli/data-render.js.map +1 -0
- package/dist/cli/doctor.js +7 -3
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.js +758 -27
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/live-render.d.ts +24 -0
- package/dist/cli/live-render.js +85 -0
- package/dist/cli/live-render.js.map +1 -0
- package/dist/cli/range.d.ts +28 -0
- package/dist/cli/range.js +63 -0
- package/dist/cli/range.js.map +1 -0
- package/dist/cli/render.js +3 -0
- package/dist/cli/render.js.map +1 -1
- package/dist/cli/strategy-render.d.ts +36 -0
- package/dist/cli/strategy-render.js +391 -0
- package/dist/cli/strategy-render.js.map +1 -0
- package/dist/cli/width.d.ts +18 -0
- package/dist/cli/width.js +71 -0
- package/dist/cli/width.js.map +1 -0
- package/dist/config/loader.js +1 -1
- package/dist/config/schema.d.ts +7 -0
- package/dist/config/schema.js +24 -0
- package/dist/config/schema.js.map +1 -1
- package/dist/core/okx-client.d.ts +9 -1
- package/dist/core/okx-client.js +14 -5
- package/dist/core/okx-client.js.map +1 -1
- package/dist/i18n/locale.d.ts +24 -0
- package/dist/i18n/locale.js +65 -0
- package/dist/i18n/locale.js.map +1 -0
- package/dist/i18n/messages.d.ts +333 -0
- package/dist/i18n/messages.js +660 -0
- package/dist/i18n/messages.js.map +1 -0
- package/dist/live/account-snapshot.d.ts +30 -0
- package/dist/live/account-snapshot.js +130 -0
- package/dist/live/account-snapshot.js.map +1 -0
- package/dist/live/cutoff-queue.d.ts +42 -0
- package/dist/live/cutoff-queue.js +69 -0
- package/dist/live/cutoff-queue.js.map +1 -0
- package/dist/live/execution-key.d.ts +23 -0
- package/dist/live/execution-key.js +31 -0
- package/dist/live/execution-key.js.map +1 -0
- package/dist/live/failures.d.ts +37 -0
- package/dist/live/failures.js +57 -0
- package/dist/live/failures.js.map +1 -0
- package/dist/live/gates.d.ts +65 -0
- package/dist/live/gates.js +136 -0
- package/dist/live/gates.js.map +1 -0
- package/dist/live/loop.d.ts +56 -0
- package/dist/live/loop.js +197 -0
- package/dist/live/loop.js.map +1 -0
- package/dist/live/preconditions.d.ts +48 -0
- package/dist/live/preconditions.js +69 -0
- package/dist/live/preconditions.js.map +1 -0
- package/dist/live/reconcile.d.ts +46 -0
- package/dist/live/reconcile.js +104 -0
- package/dist/live/reconcile.js.map +1 -0
- package/dist/live/runner.d.ts +57 -0
- package/dist/live/runner.js +160 -0
- package/dist/live/runner.js.map +1 -0
- package/dist/live/schema.d.ts +18 -0
- package/dist/live/schema.js +91 -0
- package/dist/live/schema.js.map +1 -0
- package/dist/live/service.d.ts +144 -0
- package/dist/live/service.js +303 -0
- package/dist/live/service.js.map +1 -0
- package/dist/live/session.d.ts +85 -0
- package/dist/live/session.js +234 -0
- package/dist/live/session.js.map +1 -0
- package/dist/live/sizing.d.ts +62 -0
- package/dist/live/sizing.js +79 -0
- package/dist/live/sizing.js.map +1 -0
- package/dist/live/store.d.ts +123 -0
- package/dist/live/store.js +350 -0
- package/dist/live/store.js.map +1 -0
- package/dist/live/types.d.ts +82 -0
- package/dist/live/types.js +2 -0
- package/dist/live/types.js.map +1 -0
- package/dist/market/websocket.d.ts +16 -1
- package/dist/market/websocket.js +60 -5
- package/dist/market/websocket.js.map +1 -1
- package/dist/mcp/server.d.ts +1 -0
- package/dist/mcp/server.js +15 -1
- package/dist/mcp/server.js.map +1 -1
- package/dist/network/connectivity.d.ts +9 -1
- package/dist/network/connectivity.js +28 -1
- package/dist/network/connectivity.js.map +1 -1
- package/dist/report/chart-script.d.ts +12 -0
- package/dist/report/chart-script.js +146 -0
- package/dist/report/chart-script.js.map +1 -0
- package/dist/report/compare-html.d.ts +8 -0
- package/dist/report/compare-html.js +254 -0
- package/dist/report/compare-html.js.map +1 -0
- package/dist/report/compare-script.d.ts +12 -0
- package/dist/report/compare-script.js +109 -0
- package/dist/report/compare-script.js.map +1 -0
- package/dist/report/compare.d.ts +61 -0
- package/dist/report/compare.js +205 -0
- package/dist/report/compare.js.map +1 -0
- package/dist/report/fetch.d.ts +20 -0
- package/dist/report/fetch.js +56 -0
- package/dist/report/fetch.js.map +1 -0
- package/dist/report/html.d.ts +54 -0
- package/dist/report/html.js +641 -0
- package/dist/report/html.js.map +1 -0
- package/dist/report/open.d.ts +42 -0
- package/dist/report/open.js +114 -0
- package/dist/report/open.js.map +1 -0
- package/dist/runtime/server.d.ts +16 -1
- package/dist/runtime/server.js +112 -9
- package/dist/runtime/server.js.map +1 -1
- package/dist/setup/installer.d.ts +1 -0
- package/dist/setup/installer.js +8 -0
- package/dist/setup/installer.js.map +1 -1
- package/dist/setup/wizard.d.ts +3 -0
- package/dist/setup/wizard.js +131 -6
- package/dist/setup/wizard.js.map +1 -1
- package/dist/strategy/constants.d.ts +23 -0
- package/dist/strategy/constants.js +24 -0
- package/dist/strategy/constants.js.map +1 -0
- package/dist/strategy/environment.d.ts +52 -0
- package/dist/strategy/environment.js +187 -0
- package/dist/strategy/environment.js.map +1 -0
- package/dist/strategy/instrument.d.ts +29 -0
- package/dist/strategy/instrument.js +39 -0
- package/dist/strategy/instrument.js.map +1 -0
- package/dist/strategy/optimize.d.ts +73 -0
- package/dist/strategy/optimize.js +113 -0
- package/dist/strategy/optimize.js.map +1 -0
- package/dist/strategy/parameter-space.d.ts +59 -0
- package/dist/strategy/parameter-space.js +221 -0
- package/dist/strategy/parameter-space.js.map +1 -0
- package/dist/strategy/python-bridge.d.ts +24 -0
- package/dist/strategy/python-bridge.js +114 -0
- package/dist/strategy/python-bridge.js.map +1 -0
- package/dist/strategy/schema.d.ts +9 -0
- package/dist/strategy/schema.js +91 -0
- package/dist/strategy/schema.js.map +1 -0
- package/dist/strategy/service.d.ts +138 -0
- package/dist/strategy/service.js +745 -0
- package/dist/strategy/service.js.map +1 -0
- package/dist/strategy/settings.d.ts +162 -0
- package/dist/strategy/settings.js +243 -0
- package/dist/strategy/settings.js.map +1 -0
- package/dist/strategy/store.d.ts +96 -0
- package/dist/strategy/store.js +367 -0
- package/dist/strategy/store.js.map +1 -0
- package/dist/strategy/templates.d.ts +11 -0
- package/dist/strategy/templates.js +134 -0
- package/dist/strategy/templates.js.map +1 -0
- package/dist/strategy/types.d.ts +111 -0
- package/dist/strategy/types.js +2 -0
- package/dist/strategy/types.js.map +1 -0
- package/dist/tools/catalog.d.ts +16 -0
- package/dist/tools/catalog.js +118 -17
- package/dist/tools/catalog.js.map +1 -1
- package/dist/trade/service.d.ts +12 -0
- package/dist/trade/service.js +24 -7
- package/dist/trade/service.js.map +1 -1
- package/dist/tui/app.d.ts +23 -0
- package/dist/tui/app.js +322 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/commands.d.ts +70 -0
- package/dist/tui/commands.js +313 -0
- package/dist/tui/commands.js.map +1 -0
- package/dist/tui/entries.d.ts +17 -0
- package/dist/tui/entries.js +24 -0
- package/dist/tui/entries.js.map +1 -0
- package/dist/tui/execute.d.ts +26 -0
- package/dist/tui/execute.js +664 -0
- package/dist/tui/execute.js.map +1 -0
- package/dist/tui/history.d.ts +17 -0
- package/dist/tui/history.js +48 -0
- package/dist/tui/history.js.map +1 -0
- package/dist/tui/index.d.ts +8 -0
- package/dist/tui/index.js +48 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/line-editor.d.ts +44 -0
- package/dist/tui/line-editor.js +98 -0
- package/dist/tui/line-editor.js.map +1 -0
- package/dist/tui/progress.d.ts +23 -0
- package/dist/tui/progress.js +46 -0
- package/dist/tui/progress.js.map +1 -0
- package/dist/tui/settings-editor.d.ts +18 -0
- package/dist/tui/settings-editor.js +115 -0
- package/dist/tui/settings-editor.js.map +1 -0
- package/docs/live-trading.md +455 -0
- package/docs/strategy-research.md +597 -0
- package/package.json +11 -1
- package/python/desic_strategy/__init__.py +34 -0
- package/python/desic_strategy/actions.py +158 -0
- package/python/desic_strategy/context.py +164 -0
- package/python/desic_strategy/engine.py +614 -0
- package/python/desic_strategy/indicators.py +159 -0
- package/python/desic_strategy/live.py +253 -0
- package/python/desic_strategy/policy.py +193 -0
- package/python/desic_strategy/portfolio.py +152 -0
- package/python/desic_strategy/report.py +319 -0
- package/python/desic_strategy/runner.py +574 -0
- package/python/desic_strategy/timeframe.py +150 -0
- package/python/main.py +18 -0
- package/skills/okx-live-trading/SKILL.md +117 -0
- package/skills/okx-live-trading/agents/openai.yaml +9 -0
- package/skills/okx-live-trading/references/lifecycle.md +128 -0
- package/skills/okx-strategy-research/SKILL.md +113 -0
- package/skills/okx-strategy-research/agents/openai.yaml +9 -0
- package/skills/okx-strategy-research/references/execution-semantics.md +107 -0
- package/skills/okx-strategy-research/references/field-traps.md +142 -0
- package/skills/okx-strategy-research/references/python-api.md +121 -0
- package/skills/okx-strategy-research/references/tools-and-data.md +192 -0
- package/skills/okx-trading/SKILL.md +11 -10
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
export type LiveEnvironment = "demo" | "live";
|
|
2
|
+
export type ProfileStatus = "stopped" | "starting" | "running" | "error";
|
|
3
|
+
/**
|
|
4
|
+
* A signal's outcome for one closed minute.
|
|
5
|
+
*
|
|
6
|
+
* `reserved` exists so the row can be written *before* anything is submitted: the
|
|
7
|
+
* unique constraint on `(profile_id, cutoff_at)` only prevents a duplicate if the
|
|
8
|
+
* claim happens first. A row left in `reserved` after a crash is therefore a minute
|
|
9
|
+
* whose fate is unknown, which is exactly what recovery needs to look for.
|
|
10
|
+
*/
|
|
11
|
+
export type SignalStatus = "reserved" | "no_action" | "submitted" | "blocked" | "error" | "ambiguous";
|
|
12
|
+
/** Risk gates, in the order they are checked. */
|
|
13
|
+
export type GateName = "disabled" | "generation" | "direction" | "entry_budget" | "side_budget" | "daily_loss" | "cooldown" | "minimum_size" | "precheck";
|
|
14
|
+
export interface LiveProfile {
|
|
15
|
+
id: string;
|
|
16
|
+
name: string;
|
|
17
|
+
strategyHash: string;
|
|
18
|
+
params: Record<string, unknown>;
|
|
19
|
+
instId: string;
|
|
20
|
+
account: string;
|
|
21
|
+
environment: LiveEnvironment;
|
|
22
|
+
enabled: boolean;
|
|
23
|
+
status: ProfileStatus;
|
|
24
|
+
generation: number;
|
|
25
|
+
leverage: number;
|
|
26
|
+
marginMode: "cross" | "isolated";
|
|
27
|
+
/** Ceiling on one entry, in USDT of margin committed. */
|
|
28
|
+
entryBudgetUsdt: number;
|
|
29
|
+
/** Ceiling on total margin committed in one direction. */
|
|
30
|
+
sideBudgetUsdt: number;
|
|
31
|
+
/** Realized loss for the UTC day at which new entries stop. Positive number. */
|
|
32
|
+
dailyLossLimitUsdt: number;
|
|
33
|
+
cooldownSeconds: number;
|
|
34
|
+
allowLong: boolean;
|
|
35
|
+
allowShort: boolean;
|
|
36
|
+
errorStreak: number;
|
|
37
|
+
lastError: string | null;
|
|
38
|
+
/** The backtest that justified enabling this profile. */
|
|
39
|
+
backtestRunId: string | null;
|
|
40
|
+
/** Whether a person or an agent created this profile. */
|
|
41
|
+
origin: "operator" | "agent";
|
|
42
|
+
/** Why these budgets and this instrument, as given at creation. */
|
|
43
|
+
rationale: string | null;
|
|
44
|
+
createdAt: number;
|
|
45
|
+
updatedAt: number;
|
|
46
|
+
}
|
|
47
|
+
export interface LiveSignal {
|
|
48
|
+
id: string;
|
|
49
|
+
profileId: string;
|
|
50
|
+
cutoffAt: number;
|
|
51
|
+
action: string;
|
|
52
|
+
reason: string;
|
|
53
|
+
status: SignalStatus;
|
|
54
|
+
/** Which gate refused, when status is `blocked`. */
|
|
55
|
+
blockedBy: GateName | null;
|
|
56
|
+
quantity: number | null;
|
|
57
|
+
orderId: string | null;
|
|
58
|
+
executionKey: string | null;
|
|
59
|
+
error: string | null;
|
|
60
|
+
details: Record<string, unknown>;
|
|
61
|
+
createdAt: number;
|
|
62
|
+
updatedAt: number;
|
|
63
|
+
}
|
|
64
|
+
export interface CreateProfileInput {
|
|
65
|
+
name: string;
|
|
66
|
+
source: string;
|
|
67
|
+
params?: Record<string, unknown>;
|
|
68
|
+
instId: string;
|
|
69
|
+
account: string;
|
|
70
|
+
environment: LiveEnvironment;
|
|
71
|
+
leverage: number;
|
|
72
|
+
entryBudgetUsdt: number;
|
|
73
|
+
sideBudgetUsdt: number;
|
|
74
|
+
dailyLossLimitUsdt: number;
|
|
75
|
+
cooldownSeconds?: number;
|
|
76
|
+
allowLong?: boolean;
|
|
77
|
+
allowShort?: boolean;
|
|
78
|
+
marginMode?: "cross" | "isolated";
|
|
79
|
+
origin?: "operator" | "agent";
|
|
80
|
+
/** Required when an agent creates the profile. */
|
|
81
|
+
rationale?: string;
|
|
82
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/live/types.ts"],"names":[],"mappings":""}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import type { RuntimeConfig } from "../config/schema.js";
|
|
2
2
|
import type { RuntimeDatabase } from "../storage/database.js";
|
|
3
3
|
import { MarketStore } from "./store.js";
|
|
4
|
+
import { type OkxEnvironment } from "../network/connectivity.js";
|
|
5
|
+
import type { BarStore } from "../bars/store.js";
|
|
4
6
|
export declare class MarketWebSocket {
|
|
5
7
|
private readonly config;
|
|
6
8
|
private readonly store;
|
|
7
9
|
private readonly database;
|
|
10
|
+
private readonly barStore?;
|
|
8
11
|
private readonly onBookInvalid?;
|
|
9
12
|
private socket?;
|
|
10
13
|
private businessSocket?;
|
|
@@ -17,7 +20,11 @@ export declare class MarketWebSocket {
|
|
|
17
20
|
private businessReconnectAttempt;
|
|
18
21
|
private stopping;
|
|
19
22
|
private readonly agent?;
|
|
20
|
-
|
|
23
|
+
/** Instruments with a book resubscribe already scheduled. */
|
|
24
|
+
private readonly bookResubscribes;
|
|
25
|
+
constructor(config: RuntimeConfig, store: MarketStore, database: RuntimeDatabase, barStore?: BarStore | undefined, onBookInvalid?: ((instId: string) => void) | undefined);
|
|
26
|
+
/** Which OKX feed this socket set is attached to. */
|
|
27
|
+
get environment(): OkxEnvironment;
|
|
21
28
|
start(): void;
|
|
22
29
|
stop(): void;
|
|
23
30
|
ensureSubscribed(instId: string): void;
|
|
@@ -31,4 +38,12 @@ export declare class MarketWebSocket {
|
|
|
31
38
|
private unsubscribe;
|
|
32
39
|
private releaseIdle;
|
|
33
40
|
private handleMessage;
|
|
41
|
+
/**
|
|
42
|
+
* Cycles one instrument's order book channel after a failed checksum.
|
|
43
|
+
*
|
|
44
|
+
* Rate limited per instrument: a book can fail continuously, and resubscribing on
|
|
45
|
+
* every message is what triggered the exchange's frequency limit — which then broke
|
|
46
|
+
* subscriptions that had nothing to do with the book.
|
|
47
|
+
*/
|
|
48
|
+
private resubscribeBook;
|
|
34
49
|
}
|
package/dist/market/websocket.js
CHANGED
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
import WebSocket from "ws";
|
|
2
2
|
import { HttpsProxyAgent } from "https-proxy-agent";
|
|
3
3
|
import { resolveProxy } from "../network/proxy.js";
|
|
4
|
+
import { businessWsUrl, publicWsUrl } from "../network/connectivity.js";
|
|
5
|
+
import { normalizeCandle } from "../bars/store.js";
|
|
6
|
+
/**
|
|
7
|
+
* How long to wait before cycling a failed order book subscription.
|
|
8
|
+
*
|
|
9
|
+
* Long enough that a book failing on consecutive messages produces one resubscribe
|
|
10
|
+
* rather than hundreds; short enough that a genuinely stale book recovers quickly.
|
|
11
|
+
*/
|
|
12
|
+
const BOOK_RESUBSCRIBE_DELAY_MS = 1_000;
|
|
4
13
|
export class MarketWebSocket {
|
|
5
14
|
config;
|
|
6
15
|
store;
|
|
7
16
|
database;
|
|
17
|
+
barStore;
|
|
8
18
|
onBookInvalid;
|
|
9
19
|
socket;
|
|
10
20
|
businessSocket;
|
|
@@ -17,14 +27,21 @@ export class MarketWebSocket {
|
|
|
17
27
|
businessReconnectAttempt = 0;
|
|
18
28
|
stopping = false;
|
|
19
29
|
agent;
|
|
20
|
-
|
|
30
|
+
/** Instruments with a book resubscribe already scheduled. */
|
|
31
|
+
bookResubscribes = new Set();
|
|
32
|
+
constructor(config, store, database, barStore, onBookInvalid) {
|
|
21
33
|
this.config = config;
|
|
22
34
|
this.store = store;
|
|
23
35
|
this.database = database;
|
|
36
|
+
this.barStore = barStore;
|
|
24
37
|
this.onBookInvalid = onBookInvalid;
|
|
25
38
|
const proxyUrl = resolveProxy(config.proxy.url).url;
|
|
26
39
|
this.agent = proxyUrl ? new HttpsProxyAgent(proxyUrl) : undefined;
|
|
27
40
|
}
|
|
41
|
+
/** Which OKX feed this socket set is attached to. */
|
|
42
|
+
get environment() {
|
|
43
|
+
return this.config.market.environment;
|
|
44
|
+
}
|
|
28
45
|
start() {
|
|
29
46
|
this.stopping = false;
|
|
30
47
|
for (const instId of this.config.market.prewarm)
|
|
@@ -67,7 +84,7 @@ export class MarketWebSocket {
|
|
|
67
84
|
connect() {
|
|
68
85
|
if (this.stopping)
|
|
69
86
|
return;
|
|
70
|
-
const socket = new WebSocket(
|
|
87
|
+
const socket = new WebSocket(publicWsUrl(this.environment), this.agent ? { agent: this.agent } : undefined);
|
|
71
88
|
this.socket = socket;
|
|
72
89
|
socket.on("open", () => {
|
|
73
90
|
this.reconnectAttempt = 0;
|
|
@@ -98,7 +115,7 @@ export class MarketWebSocket {
|
|
|
98
115
|
connectBusiness() {
|
|
99
116
|
if (this.stopping)
|
|
100
117
|
return;
|
|
101
|
-
const socket = new WebSocket(
|
|
118
|
+
const socket = new WebSocket(businessWsUrl(this.environment), this.agent ? { agent: this.agent } : undefined);
|
|
102
119
|
this.businessSocket = socket;
|
|
103
120
|
socket.on("open", () => {
|
|
104
121
|
this.businessReconnectAttempt = 0;
|
|
@@ -194,16 +211,54 @@ export class MarketWebSocket {
|
|
|
194
211
|
const closed = candles.filter((candle) => candle[8] === "1");
|
|
195
212
|
if (closed.length)
|
|
196
213
|
this.database.saveCandles(instId, bar, closed);
|
|
214
|
+
// Confirmed one-minute bars are the sole source for strategy research:
|
|
215
|
+
// every higher timeframe is derived from them, so only 1m is persisted
|
|
216
|
+
// here, and synchronously — a deferred write would let a live
|
|
217
|
+
// evaluation read a window missing the minute that triggered it.
|
|
218
|
+
if (bar === "1m" && this.barStore) {
|
|
219
|
+
for (const candle of closed) {
|
|
220
|
+
const parsed = normalizeCandle(candle);
|
|
221
|
+
if (parsed)
|
|
222
|
+
this.barStore.appendConfirmed(instId, parsed, "ws");
|
|
223
|
+
}
|
|
224
|
+
}
|
|
197
225
|
}
|
|
198
226
|
}
|
|
199
227
|
catch {
|
|
228
|
+
// An order book that fails its checksum has to be resubscribed to get a fresh
|
|
229
|
+
// snapshot. Only that one channel is cycled: dropping the instrument's whole
|
|
230
|
+
// subscription set took the candle channels with it and the retry below only
|
|
231
|
+
// restored the public ones, so every checksum failure permanently lost the
|
|
232
|
+
// one-minute feed. Measured on the demo venue, books failed 246 times in 90
|
|
233
|
+
// seconds, which unsubscribed 2,940 channels, drew `60014 Requests too
|
|
234
|
+
// frequent` from OKX, and left 2 candle messages where a plain socket saw 141.
|
|
200
235
|
if (channel === "books") {
|
|
201
236
|
this.onBookInvalid?.(instId);
|
|
202
|
-
this.
|
|
203
|
-
setTimeout(() => this.subscribe([instId]), 250).unref();
|
|
237
|
+
this.resubscribeBook(instId);
|
|
204
238
|
}
|
|
205
239
|
}
|
|
206
240
|
}
|
|
241
|
+
/**
|
|
242
|
+
* Cycles one instrument's order book channel after a failed checksum.
|
|
243
|
+
*
|
|
244
|
+
* Rate limited per instrument: a book can fail continuously, and resubscribing on
|
|
245
|
+
* every message is what triggered the exchange's frequency limit — which then broke
|
|
246
|
+
* subscriptions that had nothing to do with the book.
|
|
247
|
+
*/
|
|
248
|
+
resubscribeBook(instId) {
|
|
249
|
+
if (this.bookResubscribes.has(instId))
|
|
250
|
+
return;
|
|
251
|
+
this.bookResubscribes.add(instId);
|
|
252
|
+
const timer = setTimeout(() => {
|
|
253
|
+
this.bookResubscribes.delete(instId);
|
|
254
|
+
if (this.stopping || this.socket?.readyState !== WebSocket.OPEN)
|
|
255
|
+
return;
|
|
256
|
+
const args = [{ channel: "books", instId }];
|
|
257
|
+
this.socket.send(JSON.stringify({ op: "unsubscribe", args }));
|
|
258
|
+
this.socket.send(JSON.stringify({ op: "subscribe", args }));
|
|
259
|
+
}, BOOK_RESUBSCRIBE_DELAY_MS);
|
|
260
|
+
timer.unref();
|
|
261
|
+
}
|
|
207
262
|
}
|
|
208
263
|
function socketStatus(socket, reconnectAttempt) {
|
|
209
264
|
const states = ["connecting", "open", "closing", "closed"];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/market/websocket.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/market/websocket.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIpD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,WAAW,EAAuB,MAAM,4BAA4B,CAAC;AAE7F,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAEnD;;;;;GAKG;AACH,MAAM,yBAAyB,GAAG,KAAK,CAAC;AASxC,MAAM,OAAO,eAAe;IAgBP;IACA;IACA;IACA;IACA;IAnBX,MAAM,CAAa;IACnB,cAAc,CAAa;IAC3B,cAAc,CAAkB;IAChC,sBAAsB,CAAkB;IACxC,cAAc,CAAkB;IAChC,sBAAsB,CAAkB;IACxC,SAAS,CAAkB;IAC3B,gBAAgB,GAAG,CAAC,CAAC;IACrB,wBAAwB,GAAG,CAAC,CAAC;IAC7B,QAAQ,GAAG,KAAK,CAAC;IACR,KAAK,CAA2B;IACjD,6DAA6D;IAC5C,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;IAEtD,YACmB,MAAqB,EACrB,KAAkB,EAClB,QAAyB,EACzB,QAAmB,EACnB,aAAwC;QAJxC,WAAM,GAAN,MAAM,CAAe;QACrB,UAAK,GAAL,KAAK,CAAa;QAClB,aAAQ,GAAR,QAAQ,CAAiB;QACzB,aAAQ,GAAR,QAAQ,CAAW;QACnB,kBAAa,GAAb,aAAa,CAA2B;QAEzD,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;QACpD,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACpE,CAAC;IAED,qDAAqD;IACrD,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC;IACxC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO;YAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAChF,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,MAAM,CAAC,CAAC;QAC/D,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;IACzB,CAAC;IAED,IAAI;QACF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,IAAI,CAAC,cAAc;YAAE,YAAY,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,sBAAsB;YAAE,YAAY,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC3E,IAAI,IAAI,CAAC,cAAc;YAAE,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5D,IAAI,IAAI,CAAC,sBAAsB;YAAE,aAAa,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC5E,IAAI,IAAI,CAAC,SAAS;YAAE,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,cAAc,EAAE,KAAK,EAAE,CAAC;IAC/B,CAAC;IAED,gBAAgB,CAAC,MAAc;QAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI;gBAAE,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;YACzE,IAAI,IAAI,CAAC,cAAc,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI;gBAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3F,CAAC;IACH,CAAC;IAED,MAAM;QACJ,OAAO;YACL,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC;YACxD,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,wBAAwB,CAAC;SAC3E,CAAC;IACJ,CAAC;IAEO,OAAO;QACb,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC5G,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YACrB,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC;YAC1B,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACrD,IAAI,CAAC,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE;gBACrC,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI;oBAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChE,CAAC,EAAE,MAAM,CAAC,CAAC;YACX,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;QAC9B,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACxE,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACnD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3C,CAAC;IAEO,iBAAiB;QACvB,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,cAAc;YAAE,OAAO;QACjD,IAAI,IAAI,CAAC,cAAc;YAAE,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;QACnG,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,GAAG,EAAE;YACpC,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;YAChC,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC,EAAE,KAAK,CAAC,CAAC;QACV,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC;IAC9B,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC9G,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;QAC7B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;YACrB,IAAI,CAAC,wBAAwB,GAAG,CAAC,CAAC;YAClC,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAC7D,IAAI,CAAC,sBAAsB,GAAG,WAAW,CAAC,GAAG,EAAE;gBAC7C,IAAI,MAAM,CAAC,UAAU,KAAK,SAAS,CAAC,IAAI;oBAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAChE,CAAC,EAAE,MAAM,CAAC,CAAC;YACX,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,CAAC;QACtC,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACxE,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC,CAAC;QAC3D,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IAC3C,CAAC;IAEO,yBAAyB;QAC/B,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,sBAAsB;YAAE,OAAO;QACzD,IAAI,IAAI,CAAC,sBAAsB;YAAE,aAAa,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC5E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,IAAI,IAAI,CAAC,wBAAwB,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;QAC3G,IAAI,CAAC,wBAAwB,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,sBAAsB,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5C,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC;YACxC,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC,EAAE,KAAK,CAAC,CAAC;QACV,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,CAAC;IACtC,CAAC;IAEO,SAAS,CAAC,OAAiB;QACjC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;QACzE,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE,CAAC;YACxD,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IAEO,iBAAiB,CAAC,OAAiB;QACzC,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QACpG,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,IAAI,EAAE,EAAE,CAAC;YACxD,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACxG,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,MAAc;QAChC,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI;YAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,sBAAsB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9I,IAAI,IAAI,CAAC,cAAc,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI;YAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,wBAAwB,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3L,CAAC;IAEO,WAAW;QACjB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACzF,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,IAAY;QAChC,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO;QAC5B,IAAI,OAAqB,CAAC;QAC1B,IAAI,CAAC;YACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAiB,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;QACD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC;QACrC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC;QACnC,IAAI,CAAC,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;YAAE,OAAO;QAChE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAsB,CAAC;QAC5C,IAAI,CAAC;YACH,IAAI,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,CAAC,CAAC;gBAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;iBACvE,IAAI,OAAO,KAAK,QAAQ;gBAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;iBAChE,IAAI,OAAO,KAAK,cAAc,IAAI,IAAI,CAAC,CAAC,CAAC;gBAAE,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;iBACtF,IAAI,OAAO,KAAK,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC;gBAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;iBAClF,IAAI,OAAO,KAAK,eAAe,IAAI,IAAI,CAAC,CAAC,CAAC;gBAAE,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;iBACxF,IAAI,OAAO,KAAK,OAAO,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBACpB,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,QAAQ,EAAE;oBACvD,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAgB;oBACrC,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAgB;oBACrC,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;oBAChC,GAAG,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBACzE,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;oBAC9D,GAAG,CAAC,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACnD,CAAC,CAAC;YACjC,CAAC;iBAAM,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACxC,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;gBAC3C,MAAM,OAAO,GAAG,OAAO,CAAC,IAAmB,CAAC;gBAC5C,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;gBAC5C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;gBAC7D,IAAI,MAAM,CAAC,MAAM;oBAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;gBAClE,uEAAuE;gBACvE,uEAAuE;gBACvE,8DAA8D;gBAC9D,iEAAiE;gBACjE,IAAI,GAAG,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;oBAClC,KAAK,MAAM,MAAM,IAAI,MAAM,EAAE,CAAC;wBAC5B,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;wBACvC,IAAI,MAAM;4BAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;oBAClE,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,8EAA8E;YAC9E,6EAA6E;YAC7E,6EAA6E;YAC7E,2EAA2E;YAC3E,4EAA4E;YAC5E,uEAAuE;YACvE,+EAA+E;YAC/E,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;gBACxB,IAAI,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC;gBAC7B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACK,eAAe,CAAC,MAAc;QACpC,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO;QAC9C,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACrC,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI;gBAAE,OAAO;YACxE,MAAM,IAAI,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YAC9D,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC,EAAE,yBAAyB,CAAC,CAAC;QAC9B,KAAK,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;CACF;AAED,SAAS,YAAY,CAAC,MAA6B,EAAE,gBAAwB;IAC3E,MAAM,MAAM,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC3D,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,aAAa;QACtE,gBAAgB;KACjB,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,MAAc;IAC5C,OAAO;QACL,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE;QAC9B,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE;QAC5B,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE;QAC7B,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE;QACnC,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE;QACjC,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE;KACrC,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAAC,MAAc,EAAE,IAAc;IAC9D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;AAClE,CAAC"}
|
package/dist/mcp/server.d.ts
CHANGED
package/dist/mcp/server.js
CHANGED
|
@@ -4,10 +4,24 @@ import { publicError } from "../core/errors.js";
|
|
|
4
4
|
import { PACKAGE_VERSION } from "../core/version.js";
|
|
5
5
|
import { RuntimeClient } from "../runtime/client.js";
|
|
6
6
|
import { TOOL_CATALOG } from "../tools/catalog.js";
|
|
7
|
+
import { loadConfig } from "../config/loader.js";
|
|
8
|
+
export const MCP_INSTRUCTIONS = [
|
|
9
|
+
"Desic OKX Agent provides public market data, account inspection, intelligence, and trading tools.",
|
|
10
|
+
"All trade_* tools support OKX perpetual swap instruments whose instId ends with '-SWAP' only.",
|
|
11
|
+
"Never use trade_* tools for spot, dated futures, options, or any other instrument type.",
|
|
12
|
+
"Ask the operator before enabling a live profile whose environment is `live`; nothing in the system will stop you, so verify on demo first and hand that decision over."
|
|
13
|
+
].join(" ");
|
|
7
14
|
export async function runMcpServer() {
|
|
8
15
|
const runtime = await RuntimeClient.connect();
|
|
9
|
-
const server = new McpServer({ name: "desic-okx-agent", version: PACKAGE_VERSION });
|
|
16
|
+
const server = new McpServer({ name: "desic-okx-agent", version: PACKAGE_VERSION }, { instructions: MCP_INSTRUCTIONS });
|
|
17
|
+
// Creating and enabling a live profile are registered only when the operator turned agent
|
|
18
|
+
// access on. This is the surface an agent actually sees, so withholding them here is what
|
|
19
|
+
// makes the setting real — filtering the runtime's own listing would still leave the tools
|
|
20
|
+
// callable by name.
|
|
21
|
+
const agentAccess = loadConfig().live.agentAccess;
|
|
10
22
|
for (const definition of TOOL_CATALOG) {
|
|
23
|
+
if (definition.operatorOnly === true && !agentAccess)
|
|
24
|
+
continue;
|
|
11
25
|
server.registerTool(definition.name, { description: definition.description, inputSchema: definition.schema.shape }, async (input) => {
|
|
12
26
|
try {
|
|
13
27
|
const result = await runtime.call(definition.name, input);
|
package/dist/mcp/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,mGAAmG;IACnG,+FAA+F;IAC/F,yFAAyF;IACzF,wKAAwK;CACzK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEZ,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,CAAC;IAC9C,MAAM,MAAM,GAAG,IAAI,SAAS,CAC1B,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,eAAe,EAAE,EACrD,EAAE,YAAY,EAAE,gBAAgB,EAAE,CACnC,CAAC;IACF,0FAA0F;IAC1F,0FAA0F;IAC1F,2FAA2F;IAC3F,oBAAoB;IACpB,MAAM,WAAW,GAAG,UAAU,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC;IAClD,KAAK,MAAM,UAAU,IAAI,YAAY,EAAE,CAAC;QACtC,IAAI,UAAU,CAAC,YAAY,KAAK,IAAI,IAAI,CAAC,WAAW;YAAE,SAAS;QAC/D,MAAM,CAAC,YAAY,CACjB,UAAU,CAAC,IAAI,EACf,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE,WAAW,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,EAC7E,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAC1D,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;oBAClE,GAAG,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,MAAiC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACpI,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO;oBACL,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;iBAC1F,CAAC;YACJ,CAAC;QACH,CAAC,CACF,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;AACnD,CAAC"}
|
|
@@ -1,5 +1,13 @@
|
|
|
1
|
+
/** REST is one host for both environments; `x-simulated-trading` selects which. */
|
|
1
2
|
export declare const OKX_REST_BASE_URL = "https://openapi.okx.com";
|
|
2
|
-
export
|
|
3
|
+
export type OkxEnvironment = "demo" | "live";
|
|
4
|
+
export declare function publicWsUrl(environment: OkxEnvironment): string;
|
|
5
|
+
export declare function businessWsUrl(environment: OkxEnvironment): string;
|
|
6
|
+
export declare function privateWsUrl(environment: OkxEnvironment): string;
|
|
7
|
+
/** Header that routes a REST call to the demo environment, or nothing for live. */
|
|
8
|
+
export declare function environmentHeaders(environment: OkxEnvironment): Record<string, string>;
|
|
9
|
+
/** Kept for the connectivity check, which probes the live public feed. */
|
|
10
|
+
export declare const OKX_PUBLIC_WS_URL: string;
|
|
3
11
|
export interface ConnectivityStep {
|
|
4
12
|
ok: boolean;
|
|
5
13
|
latencyMs: number;
|
|
@@ -1,8 +1,35 @@
|
|
|
1
1
|
import { ProxyAgent } from "undici";
|
|
2
2
|
import WebSocket from "ws";
|
|
3
3
|
import { HttpsProxyAgent } from "https-proxy-agent";
|
|
4
|
+
/** REST is one host for both environments; `x-simulated-trading` selects which. */
|
|
4
5
|
export const OKX_REST_BASE_URL = "https://openapi.okx.com";
|
|
5
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Websocket host per environment.
|
|
8
|
+
*
|
|
9
|
+
* Demo is a separate matching environment with its own market data, not a separate
|
|
10
|
+
* account over the live feed — measured at one instant, demo and live reported
|
|
11
|
+
* different prices and a 5x difference in 24h volume for the same instrument. Every
|
|
12
|
+
* channel therefore has its own host, and mixing them would let a strategy decide on
|
|
13
|
+
* one environment's bars while its orders fill at another's prices.
|
|
14
|
+
*/
|
|
15
|
+
function wsHost(environment) {
|
|
16
|
+
return environment === "demo" ? "wss://wspap.okx.com:8443" : "wss://ws.okx.com:8443";
|
|
17
|
+
}
|
|
18
|
+
export function publicWsUrl(environment) {
|
|
19
|
+
return `${wsHost(environment)}/ws/v5/public`;
|
|
20
|
+
}
|
|
21
|
+
export function businessWsUrl(environment) {
|
|
22
|
+
return `${wsHost(environment)}/ws/v5/business`;
|
|
23
|
+
}
|
|
24
|
+
export function privateWsUrl(environment) {
|
|
25
|
+
return `${wsHost(environment)}/ws/v5/private`;
|
|
26
|
+
}
|
|
27
|
+
/** Header that routes a REST call to the demo environment, or nothing for live. */
|
|
28
|
+
export function environmentHeaders(environment) {
|
|
29
|
+
return environment === "demo" ? { "x-simulated-trading": "1" } : {};
|
|
30
|
+
}
|
|
31
|
+
/** Kept for the connectivity check, which probes the live public feed. */
|
|
32
|
+
export const OKX_PUBLIC_WS_URL = publicWsUrl("live");
|
|
6
33
|
export async function checkOkxConnectivity(proxyUrl, timeoutMs = 6_000, checks = {}) {
|
|
7
34
|
const attempts = Math.max(1, checks.attempts ?? 3);
|
|
8
35
|
const retryDelayMs = Math.max(0, checks.retryDelayMs ?? 300);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connectivity.js","sourceRoot":"","sources":["../../src/network/connectivity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,SAAS,MAAM,IAAI,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,CAAC,MAAM,iBAAiB,GAAG,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"connectivity.js","sourceRoot":"","sources":["../../src/network/connectivity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hover readout for the equity chart.
|
|
3
|
+
*
|
|
4
|
+
* Inlined into the report. It reads its data from a `data-series` attribute and
|
|
5
|
+
* touches nothing but the two chart elements: no network, no storage, no globals
|
|
6
|
+
* beyond one IIFE. That keeps the "opens offline, sends nothing" property of the
|
|
7
|
+
* report intact while making individual values readable.
|
|
8
|
+
*
|
|
9
|
+
* Written as a plain string rather than compiled TypeScript so the report stays a
|
|
10
|
+
* single self-contained file with no build step of its own.
|
|
11
|
+
*/
|
|
12
|
+
export declare const CHART_SCRIPT: string;
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hover readout for the equity chart.
|
|
3
|
+
*
|
|
4
|
+
* Inlined into the report. It reads its data from a `data-series` attribute and
|
|
5
|
+
* touches nothing but the two chart elements: no network, no storage, no globals
|
|
6
|
+
* beyond one IIFE. That keeps the "opens offline, sends nothing" property of the
|
|
7
|
+
* report intact while making individual values readable.
|
|
8
|
+
*
|
|
9
|
+
* Written as a plain string rather than compiled TypeScript so the report stays a
|
|
10
|
+
* single self-contained file with no build step of its own.
|
|
11
|
+
*/
|
|
12
|
+
export const CHART_SCRIPT = String.raw `
|
|
13
|
+
(function () {
|
|
14
|
+
var chart = document.getElementById("equity-chart");
|
|
15
|
+
var drawdownChart = document.getElementById("drawdown-chart");
|
|
16
|
+
if (!chart) return;
|
|
17
|
+
|
|
18
|
+
var series;
|
|
19
|
+
try {
|
|
20
|
+
series = JSON.parse(chart.getAttribute("data-series") || "");
|
|
21
|
+
} catch (error) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (!series || !series.t || series.t.length < 2) return;
|
|
25
|
+
|
|
26
|
+
var svg = chart.querySelector("svg");
|
|
27
|
+
var tooltip = chart.querySelector(".tooltip");
|
|
28
|
+
var crosshair = chart.querySelector(".crosshair");
|
|
29
|
+
var marker = chart.querySelector(".marker");
|
|
30
|
+
var ddCrosshair = drawdownChart ? drawdownChart.querySelector(".crosshair") : null;
|
|
31
|
+
if (!svg || !tooltip || !crosshair || !marker) return;
|
|
32
|
+
|
|
33
|
+
var count = series.t.length;
|
|
34
|
+
var viewWidth = 1000;
|
|
35
|
+
var equityHeight = 260;
|
|
36
|
+
var minimum = Infinity;
|
|
37
|
+
var maximum = -Infinity;
|
|
38
|
+
for (var i = 0; i < count; i += 1) {
|
|
39
|
+
if (series.e[i] < minimum) minimum = series.e[i];
|
|
40
|
+
if (series.e[i] > maximum) maximum = series.e[i];
|
|
41
|
+
}
|
|
42
|
+
var span = maximum - minimum || 1;
|
|
43
|
+
|
|
44
|
+
function fmt(value, digits) {
|
|
45
|
+
return value.toLocaleString("en-US", { minimumFractionDigits: digits, maximumFractionDigits: digits });
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function isoMinute(ms) {
|
|
49
|
+
return new Date(ms).toISOString().slice(0, 16).replace("T", " ");
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function show(index, clientX) {
|
|
53
|
+
var equity = series.e[index];
|
|
54
|
+
var drawdown = series.d[index];
|
|
55
|
+
var change = series.initial > 0 ? (equity / series.initial - 1) * 100 : 0;
|
|
56
|
+
|
|
57
|
+
// Position in the SVG's own coordinates so the line tracks the curve
|
|
58
|
+
// regardless of how the chart is scaled by CSS.
|
|
59
|
+
var vx = (index / (count - 1)) * viewWidth;
|
|
60
|
+
var vy = equityHeight - ((equity - minimum) / span) * equityHeight;
|
|
61
|
+
crosshair.setAttribute("x1", vx);
|
|
62
|
+
crosshair.setAttribute("x2", vx);
|
|
63
|
+
crosshair.removeAttribute("hidden");
|
|
64
|
+
marker.setAttribute("cx", vx);
|
|
65
|
+
marker.setAttribute("cy", vy);
|
|
66
|
+
marker.removeAttribute("hidden");
|
|
67
|
+
if (ddCrosshair) {
|
|
68
|
+
ddCrosshair.setAttribute("x1", vx);
|
|
69
|
+
ddCrosshair.setAttribute("x2", vx);
|
|
70
|
+
ddCrosshair.removeAttribute("hidden");
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
var sign = change > 0 ? "+" : "";
|
|
74
|
+
tooltip.innerHTML =
|
|
75
|
+
'<div class="row"><span>' + series.labels.time + '</span><b>' + isoMinute(series.t[index]) + "</b></div>" +
|
|
76
|
+
'<div class="row"><span>' + series.labels.equity + '</span><b>' + fmt(equity, 2) + "</b></div>" +
|
|
77
|
+
'<div class="row"><span>' + series.labels.change + '</span><b class="' + (change >= 0 ? "up" : "down") + '">' + sign + fmt(change, 2) + "%</b></div>" +
|
|
78
|
+
'<div class="row"><span>' + series.labels.drawdown + '</span><b class="' + (drawdown > 0 ? "down" : "") + '">-' + fmt(drawdown, 2) + "%</b></div>";
|
|
79
|
+
tooltip.removeAttribute("hidden");
|
|
80
|
+
|
|
81
|
+
// Keep the tooltip inside the chart, flipping side near the right edge.
|
|
82
|
+
var bounds = chart.getBoundingClientRect();
|
|
83
|
+
var offset = clientX - bounds.left;
|
|
84
|
+
var tipWidth = tooltip.offsetWidth || 190;
|
|
85
|
+
var left = offset + 14;
|
|
86
|
+
if (left + tipWidth > bounds.width) left = offset - tipWidth - 14;
|
|
87
|
+
tooltip.style.left = Math.max(4, left) + "px";
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function hide() {
|
|
91
|
+
tooltip.setAttribute("hidden", "");
|
|
92
|
+
crosshair.setAttribute("hidden", "");
|
|
93
|
+
marker.setAttribute("hidden", "");
|
|
94
|
+
if (ddCrosshair) ddCrosshair.setAttribute("hidden", "");
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function indexFromClientX(clientX) {
|
|
98
|
+
var bounds = svg.getBoundingClientRect();
|
|
99
|
+
if (bounds.width <= 0) return 0;
|
|
100
|
+
// Clamped against the plot area, so the padding and axis column at either
|
|
101
|
+
// side still resolve to the first and last point. Without this, hovering a
|
|
102
|
+
// few pixels inside the chart's own border sits outside the svg and reads
|
|
103
|
+
// the second-to-last value instead of the last.
|
|
104
|
+
var ratio = (clientX - bounds.left) / bounds.width;
|
|
105
|
+
var index = Math.round(Math.max(0, Math.min(1, ratio)) * (count - 1));
|
|
106
|
+
return Math.max(0, Math.min(count - 1, index));
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function track(event) {
|
|
110
|
+
var clientX = event.touches && event.touches.length ? event.touches[0].clientX : event.clientX;
|
|
111
|
+
show(indexFromClientX(clientX), clientX);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
chart.addEventListener("mousemove", track);
|
|
115
|
+
chart.addEventListener("mouseleave", hide);
|
|
116
|
+
if (drawdownChart) {
|
|
117
|
+
drawdownChart.addEventListener("mousemove", track);
|
|
118
|
+
drawdownChart.addEventListener("mouseleave", hide);
|
|
119
|
+
}
|
|
120
|
+
chart.addEventListener("touchstart", track, { passive: true });
|
|
121
|
+
chart.addEventListener("touchmove", track, { passive: true });
|
|
122
|
+
chart.addEventListener("touchend", hide);
|
|
123
|
+
|
|
124
|
+
// Keyboard access: the readout is the only way to get exact values, so it
|
|
125
|
+
// cannot depend on a pointer.
|
|
126
|
+
chart.setAttribute("tabindex", "0");
|
|
127
|
+
var cursor = -1;
|
|
128
|
+
chart.addEventListener("keydown", function (event) {
|
|
129
|
+
var step = event.shiftKey ? Math.max(1, Math.round(count / 20)) : 1;
|
|
130
|
+
if (event.key === "ArrowRight") cursor = Math.min(count - 1, (cursor < 0 ? -1 : cursor) + step);
|
|
131
|
+
else if (event.key === "ArrowLeft") cursor = Math.max(0, (cursor < 0 ? count : cursor) - step);
|
|
132
|
+
else if (event.key === "Home") cursor = 0;
|
|
133
|
+
else if (event.key === "End") cursor = count - 1;
|
|
134
|
+
else if (event.key === "Escape") {
|
|
135
|
+
cursor = -1;
|
|
136
|
+
hide();
|
|
137
|
+
return;
|
|
138
|
+
} else return;
|
|
139
|
+
event.preventDefault();
|
|
140
|
+
var bounds = chart.getBoundingClientRect();
|
|
141
|
+
show(cursor, bounds.left + (cursor / (count - 1)) * bounds.width);
|
|
142
|
+
});
|
|
143
|
+
chart.addEventListener("blur", hide);
|
|
144
|
+
})();
|
|
145
|
+
`;
|
|
146
|
+
//# sourceMappingURL=chart-script.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chart-script.js","sourceRoot":"","sources":["../../src/report/chart-script.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqIrC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ComparisonReport } from "./compare.js";
|
|
2
|
+
/**
|
|
3
|
+
* Renders a self-contained comparison of two or more runs.
|
|
4
|
+
*
|
|
5
|
+
* Same constraints as a single report: everything inlined, nothing fetched at view
|
|
6
|
+
* time, so it opens offline and never sends a strategy anywhere.
|
|
7
|
+
*/
|
|
8
|
+
export declare function renderComparisonHtml(report: ComparisonReport): string;
|