desic-okx-agent 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/LICENSE +21 -0
- package/README.md +242 -0
- package/dist/account/private-websocket.d.ts +13 -0
- package/dist/account/private-websocket.js +102 -0
- package/dist/account/private-websocket.js.map +1 -0
- package/dist/account/service.d.ts +22 -0
- package/dist/account/service.js +118 -0
- package/dist/account/service.js.map +1 -0
- package/dist/account/store.d.ts +12 -0
- package/dist/account/store.js +48 -0
- package/dist/account/store.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +122 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/prompts.d.ts +2 -0
- package/dist/cli/prompts.js +52 -0
- package/dist/cli/prompts.js.map +1 -0
- package/dist/config/loader.d.ts +9 -0
- package/dist/config/loader.js +87 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/paths.d.ts +7 -0
- package/dist/config/paths.js +11 -0
- package/dist/config/paths.js.map +1 -0
- package/dist/config/schema.d.ts +42 -0
- package/dist/config/schema.js +30 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/core/attribution.d.ts +2 -0
- package/dist/core/attribution.js +29 -0
- package/dist/core/attribution.js.map +1 -0
- package/dist/core/errors.d.ts +9 -0
- package/dist/core/errors.js +33 -0
- package/dist/core/errors.js.map +1 -0
- package/dist/core/okx-client.d.ts +13 -0
- package/dist/core/okx-client.js +102 -0
- package/dist/core/okx-client.js.map +1 -0
- package/dist/core/sanitize.d.ts +2 -0
- package/dist/core/sanitize.js +19 -0
- package/dist/core/sanitize.js.map +1 -0
- package/dist/core/types.d.ts +38 -0
- package/dist/core/types.js +18 -0
- package/dist/core/types.js.map +1 -0
- package/dist/derivatives/service.d.ts +28 -0
- package/dist/derivatives/service.js +144 -0
- package/dist/derivatives/service.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/intelligence/service.d.ts +38 -0
- package/dist/intelligence/service.js +324 -0
- package/dist/intelligence/service.js.map +1 -0
- package/dist/market/indicators.d.ts +2 -0
- package/dist/market/indicators.js +74 -0
- package/dist/market/indicators.js.map +1 -0
- package/dist/market/service.d.ts +28 -0
- package/dist/market/service.js +232 -0
- package/dist/market/service.js.map +1 -0
- package/dist/market/store.d.ts +46 -0
- package/dist/market/store.js +158 -0
- package/dist/market/store.js.map +1 -0
- package/dist/market/websocket.d.ts +33 -0
- package/dist/market/websocket.js +213 -0
- package/dist/market/websocket.js.map +1 -0
- package/dist/mcp/server.d.ts +1 -0
- package/dist/mcp/server.js +28 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/runtime/client.d.ts +15 -0
- package/dist/runtime/client.js +106 -0
- package/dist/runtime/client.js.map +1 -0
- package/dist/runtime/server.d.ts +28 -0
- package/dist/runtime/server.js +140 -0
- package/dist/runtime/server.js.map +1 -0
- package/dist/runtime/state.d.ts +14 -0
- package/dist/runtime/state.js +98 -0
- package/dist/runtime/state.js.map +1 -0
- package/dist/storage/database.d.ts +23 -0
- package/dist/storage/database.js +106 -0
- package/dist/storage/database.js.map +1 -0
- package/dist/tools/catalog.d.ts +21 -0
- package/dist/tools/catalog.js +236 -0
- package/dist/tools/catalog.js.map +1 -0
- package/dist/trade/service.d.ts +128 -0
- package/dist/trade/service.js +470 -0
- package/dist/trade/service.js.map +1 -0
- package/examples/claude-code/mcp.json +8 -0
- package/examples/codex/config.toml +3 -0
- package/examples/config.example.json +18 -0
- package/package.json +71 -0
- package/skills/okx-account-analysis/SKILL.md +14 -0
- package/skills/okx-account-analysis/agents/openai.yaml +9 -0
- package/skills/okx-derivatives-analysis/SKILL.md +14 -0
- package/skills/okx-derivatives-analysis/agents/openai.yaml +9 -0
- package/skills/okx-market-analysis/SKILL.md +14 -0
- package/skills/okx-market-analysis/agents/openai.yaml +9 -0
- package/skills/okx-news-intelligence/SKILL.md +14 -0
- package/skills/okx-news-intelligence/agents/openai.yaml +9 -0
- package/skills/okx-smart-money-analysis/SKILL.md +15 -0
- package/skills/okx-smart-money-analysis/agents/openai.yaml +9 -0
- package/skills/okx-trading/SKILL.md +16 -0
- package/skills/okx-trading/agents/openai.yaml +9 -0
- package/skills/trading-philosophy/SKILL.md +14 -0
- package/skills/trading-philosophy/agents/openai.yaml +4 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { RuntimeConfig } from "../config/schema.js";
|
|
2
|
+
import type { RuntimeDatabase } from "../storage/database.js";
|
|
3
|
+
import { MarketStore } from "./store.js";
|
|
4
|
+
export declare class MarketWebSocket {
|
|
5
|
+
private readonly config;
|
|
6
|
+
private readonly store;
|
|
7
|
+
private readonly database;
|
|
8
|
+
private readonly onBookInvalid?;
|
|
9
|
+
private socket?;
|
|
10
|
+
private businessSocket?;
|
|
11
|
+
private reconnectTimer?;
|
|
12
|
+
private businessReconnectTimer?;
|
|
13
|
+
private heartbeatTimer?;
|
|
14
|
+
private businessHeartbeatTimer?;
|
|
15
|
+
private idleTimer?;
|
|
16
|
+
private reconnectAttempt;
|
|
17
|
+
private businessReconnectAttempt;
|
|
18
|
+
private stopping;
|
|
19
|
+
private readonly agent?;
|
|
20
|
+
constructor(config: RuntimeConfig, store: MarketStore, database: RuntimeDatabase, onBookInvalid?: ((instId: string) => void) | undefined);
|
|
21
|
+
start(): void;
|
|
22
|
+
stop(): void;
|
|
23
|
+
ensureSubscribed(instId: string): void;
|
|
24
|
+
private connect;
|
|
25
|
+
private scheduleReconnect;
|
|
26
|
+
private connectBusiness;
|
|
27
|
+
private scheduleBusinessReconnect;
|
|
28
|
+
private subscribe;
|
|
29
|
+
private subscribeBusiness;
|
|
30
|
+
private unsubscribe;
|
|
31
|
+
private releaseIdle;
|
|
32
|
+
private handleMessage;
|
|
33
|
+
}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
import WebSocket from "ws";
|
|
2
|
+
import { HttpsProxyAgent } from "https-proxy-agent";
|
|
3
|
+
export class MarketWebSocket {
|
|
4
|
+
config;
|
|
5
|
+
store;
|
|
6
|
+
database;
|
|
7
|
+
onBookInvalid;
|
|
8
|
+
socket;
|
|
9
|
+
businessSocket;
|
|
10
|
+
reconnectTimer;
|
|
11
|
+
businessReconnectTimer;
|
|
12
|
+
heartbeatTimer;
|
|
13
|
+
businessHeartbeatTimer;
|
|
14
|
+
idleTimer;
|
|
15
|
+
reconnectAttempt = 0;
|
|
16
|
+
businessReconnectAttempt = 0;
|
|
17
|
+
stopping = false;
|
|
18
|
+
agent;
|
|
19
|
+
constructor(config, store, database, onBookInvalid) {
|
|
20
|
+
this.config = config;
|
|
21
|
+
this.store = store;
|
|
22
|
+
this.database = database;
|
|
23
|
+
this.onBookInvalid = onBookInvalid;
|
|
24
|
+
this.agent = config.proxy.url ? new HttpsProxyAgent(config.proxy.url) : undefined;
|
|
25
|
+
}
|
|
26
|
+
start() {
|
|
27
|
+
this.stopping = false;
|
|
28
|
+
for (const instId of this.config.market.prewarm)
|
|
29
|
+
this.store.touch(instId, true);
|
|
30
|
+
this.connect();
|
|
31
|
+
this.connectBusiness();
|
|
32
|
+
this.idleTimer = setInterval(() => this.releaseIdle(), 60_000);
|
|
33
|
+
this.idleTimer.unref();
|
|
34
|
+
}
|
|
35
|
+
stop() {
|
|
36
|
+
this.stopping = true;
|
|
37
|
+
if (this.reconnectTimer)
|
|
38
|
+
clearTimeout(this.reconnectTimer);
|
|
39
|
+
if (this.businessReconnectTimer)
|
|
40
|
+
clearTimeout(this.businessReconnectTimer);
|
|
41
|
+
if (this.heartbeatTimer)
|
|
42
|
+
clearInterval(this.heartbeatTimer);
|
|
43
|
+
if (this.businessHeartbeatTimer)
|
|
44
|
+
clearInterval(this.businessHeartbeatTimer);
|
|
45
|
+
if (this.idleTimer)
|
|
46
|
+
clearInterval(this.idleTimer);
|
|
47
|
+
this.socket?.close();
|
|
48
|
+
this.businessSocket?.close();
|
|
49
|
+
}
|
|
50
|
+
ensureSubscribed(instId) {
|
|
51
|
+
const isNew = this.store.touch(instId);
|
|
52
|
+
if (isNew) {
|
|
53
|
+
if (this.socket?.readyState === WebSocket.OPEN)
|
|
54
|
+
this.subscribe([instId]);
|
|
55
|
+
if (this.businessSocket?.readyState === WebSocket.OPEN)
|
|
56
|
+
this.subscribeBusiness([instId]);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
connect() {
|
|
60
|
+
if (this.stopping)
|
|
61
|
+
return;
|
|
62
|
+
const socket = new WebSocket("wss://ws.okx.com:8443/ws/v5/public", this.agent ? { agent: this.agent } : undefined);
|
|
63
|
+
this.socket = socket;
|
|
64
|
+
socket.on("open", () => {
|
|
65
|
+
this.reconnectAttempt = 0;
|
|
66
|
+
this.subscribe([...this.store.subscriptions.keys()]);
|
|
67
|
+
this.heartbeatTimer = setInterval(() => {
|
|
68
|
+
if (socket.readyState === WebSocket.OPEN)
|
|
69
|
+
socket.send("ping");
|
|
70
|
+
}, 20_000);
|
|
71
|
+
this.heartbeatTimer.unref();
|
|
72
|
+
});
|
|
73
|
+
socket.on("message", (buffer) => this.handleMessage(buffer.toString()));
|
|
74
|
+
socket.on("close", () => this.scheduleReconnect());
|
|
75
|
+
socket.on("error", () => socket.close());
|
|
76
|
+
}
|
|
77
|
+
scheduleReconnect() {
|
|
78
|
+
if (this.stopping || this.reconnectTimer)
|
|
79
|
+
return;
|
|
80
|
+
if (this.heartbeatTimer)
|
|
81
|
+
clearInterval(this.heartbeatTimer);
|
|
82
|
+
const delay = Math.min(30_000, 500 * 2 ** this.reconnectAttempt) + Math.floor(Math.random() * 500);
|
|
83
|
+
this.reconnectAttempt += 1;
|
|
84
|
+
this.reconnectTimer = setTimeout(() => {
|
|
85
|
+
this.reconnectTimer = undefined;
|
|
86
|
+
this.connect();
|
|
87
|
+
}, delay);
|
|
88
|
+
this.reconnectTimer.unref();
|
|
89
|
+
}
|
|
90
|
+
connectBusiness() {
|
|
91
|
+
if (this.stopping)
|
|
92
|
+
return;
|
|
93
|
+
const socket = new WebSocket("wss://ws.okx.com:8443/ws/v5/business", this.agent ? { agent: this.agent } : undefined);
|
|
94
|
+
this.businessSocket = socket;
|
|
95
|
+
socket.on("open", () => {
|
|
96
|
+
this.businessReconnectAttempt = 0;
|
|
97
|
+
this.subscribeBusiness([...this.store.subscriptions.keys()]);
|
|
98
|
+
this.businessHeartbeatTimer = setInterval(() => {
|
|
99
|
+
if (socket.readyState === WebSocket.OPEN)
|
|
100
|
+
socket.send("ping");
|
|
101
|
+
}, 20_000);
|
|
102
|
+
this.businessHeartbeatTimer.unref();
|
|
103
|
+
});
|
|
104
|
+
socket.on("message", (buffer) => this.handleMessage(buffer.toString()));
|
|
105
|
+
socket.on("close", () => this.scheduleBusinessReconnect());
|
|
106
|
+
socket.on("error", () => socket.close());
|
|
107
|
+
}
|
|
108
|
+
scheduleBusinessReconnect() {
|
|
109
|
+
if (this.stopping || this.businessReconnectTimer)
|
|
110
|
+
return;
|
|
111
|
+
if (this.businessHeartbeatTimer)
|
|
112
|
+
clearInterval(this.businessHeartbeatTimer);
|
|
113
|
+
const delay = Math.min(30_000, 500 * 2 ** this.businessReconnectAttempt) + Math.floor(Math.random() * 500);
|
|
114
|
+
this.businessReconnectAttempt += 1;
|
|
115
|
+
this.businessReconnectTimer = setTimeout(() => {
|
|
116
|
+
this.businessReconnectTimer = undefined;
|
|
117
|
+
this.connectBusiness();
|
|
118
|
+
}, delay);
|
|
119
|
+
this.businessReconnectTimer.unref();
|
|
120
|
+
}
|
|
121
|
+
subscribe(instIds) {
|
|
122
|
+
const args = instIds.flatMap((instId) => publicSubscriptionArgs(instId));
|
|
123
|
+
for (let offset = 0; offset < args.length; offset += 50) {
|
|
124
|
+
this.socket?.send(JSON.stringify({ op: "subscribe", args: args.slice(offset, offset + 50) }));
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
subscribeBusiness(instIds) {
|
|
128
|
+
const args = instIds.flatMap((instId) => businessSubscriptionArgs(instId, this.config.market.bars));
|
|
129
|
+
for (let offset = 0; offset < args.length; offset += 50) {
|
|
130
|
+
this.businessSocket?.send(JSON.stringify({ op: "subscribe", args: args.slice(offset, offset + 50) }));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
unsubscribe(instId) {
|
|
134
|
+
if (this.socket?.readyState === WebSocket.OPEN)
|
|
135
|
+
this.socket.send(JSON.stringify({ op: "unsubscribe", args: publicSubscriptionArgs(instId) }));
|
|
136
|
+
if (this.businessSocket?.readyState === WebSocket.OPEN)
|
|
137
|
+
this.businessSocket.send(JSON.stringify({ op: "unsubscribe", args: businessSubscriptionArgs(instId, this.config.market.bars) }));
|
|
138
|
+
}
|
|
139
|
+
releaseIdle() {
|
|
140
|
+
for (const instId of this.store.idleSubscriptions(this.config.market.idleSubscriptionMs)) {
|
|
141
|
+
this.unsubscribe(instId);
|
|
142
|
+
this.store.removeSubscription(instId);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
handleMessage(text) {
|
|
146
|
+
if (text === "pong")
|
|
147
|
+
return;
|
|
148
|
+
let message;
|
|
149
|
+
try {
|
|
150
|
+
message = JSON.parse(text);
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const channel = message.arg?.channel;
|
|
156
|
+
const instId = message.arg?.instId;
|
|
157
|
+
if (!channel || !instId || !Array.isArray(message.data))
|
|
158
|
+
return;
|
|
159
|
+
const rows = message.data;
|
|
160
|
+
try {
|
|
161
|
+
if (channel === "tickers" && rows[0])
|
|
162
|
+
this.store.setTicker(instId, rows[0]);
|
|
163
|
+
else if (channel === "trades")
|
|
164
|
+
this.store.appendTrades(instId, rows);
|
|
165
|
+
else if (channel === "funding-rate" && rows[0])
|
|
166
|
+
this.store.setFundingRate(instId, rows[0]);
|
|
167
|
+
else if (channel === "mark-price" && rows[0])
|
|
168
|
+
this.store.setMarkPrice(instId, rows[0]);
|
|
169
|
+
else if (channel === "open-interest" && rows[0])
|
|
170
|
+
this.store.setOpenInterest(instId, rows[0]);
|
|
171
|
+
else if (channel === "books" && rows[0]) {
|
|
172
|
+
const row = rows[0];
|
|
173
|
+
this.store.applyBook(instId, message.action ?? "update", {
|
|
174
|
+
bids: (row.bids ?? []),
|
|
175
|
+
asks: (row.asks ?? []),
|
|
176
|
+
ts: String(row.ts ?? Date.now()),
|
|
177
|
+
...(row.checksum !== undefined ? { checksum: Number(row.checksum) } : {}),
|
|
178
|
+
...(row.seqId !== undefined ? { seqId: Number(row.seqId) } : {}),
|
|
179
|
+
...(row.prevSeqId !== undefined ? { prevSeqId: Number(row.prevSeqId) } : {})
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
else if (channel.startsWith("candle")) {
|
|
183
|
+
const bar = channel.slice("candle".length);
|
|
184
|
+
const candles = message.data;
|
|
185
|
+
this.store.setCandles(instId, bar, candles);
|
|
186
|
+
const closed = candles.filter((candle) => candle[8] === "1");
|
|
187
|
+
if (closed.length)
|
|
188
|
+
this.database.saveCandles(instId, bar, closed);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
catch {
|
|
192
|
+
if (channel === "books") {
|
|
193
|
+
this.onBookInvalid?.(instId);
|
|
194
|
+
this.unsubscribe(instId);
|
|
195
|
+
setTimeout(() => this.subscribe([instId]), 250).unref();
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
function publicSubscriptionArgs(instId) {
|
|
201
|
+
return [
|
|
202
|
+
{ channel: "tickers", instId },
|
|
203
|
+
{ channel: "books", instId },
|
|
204
|
+
{ channel: "trades", instId },
|
|
205
|
+
{ channel: "funding-rate", instId },
|
|
206
|
+
{ channel: "mark-price", instId },
|
|
207
|
+
{ channel: "open-interest", instId }
|
|
208
|
+
];
|
|
209
|
+
}
|
|
210
|
+
function businessSubscriptionArgs(instId, bars) {
|
|
211
|
+
return bars.map((bar) => ({ channel: `candle${bar}`, instId }));
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=websocket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../src/market/websocket.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runMcpServer(): Promise<void>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
3
|
+
import { publicError } from "../core/errors.js";
|
|
4
|
+
import { RuntimeClient } from "../runtime/client.js";
|
|
5
|
+
import { TOOL_CATALOG } from "../tools/catalog.js";
|
|
6
|
+
export async function runMcpServer() {
|
|
7
|
+
const runtime = await RuntimeClient.connect();
|
|
8
|
+
const server = new McpServer({ name: "desic-okx-agent", version: "0.1.0" });
|
|
9
|
+
for (const definition of TOOL_CATALOG) {
|
|
10
|
+
server.registerTool(definition.name, { description: definition.description, inputSchema: definition.schema.shape }, async (input) => {
|
|
11
|
+
try {
|
|
12
|
+
const result = await runtime.call(definition.name, input);
|
|
13
|
+
return {
|
|
14
|
+
content: [{ type: "text", text: JSON.stringify(result) }],
|
|
15
|
+
...(result && typeof result === "object" && !Array.isArray(result) ? { structuredContent: result } : {})
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
return {
|
|
20
|
+
isError: true,
|
|
21
|
+
content: [{ type: "text", text: JSON.stringify({ error: publicError(error) }) }]
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
await server.connect(new StdioServerTransport());
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +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,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,CAAC;IAC9C,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IAC5E,KAAK,MAAM,UAAU,IAAI,YAAY,EAAE,CAAC;QACtC,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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export declare class RuntimeClient {
|
|
2
|
+
private readonly state;
|
|
3
|
+
private constructor();
|
|
4
|
+
static connect(options?: {
|
|
5
|
+
start?: boolean;
|
|
6
|
+
}): Promise<RuntimeClient>;
|
|
7
|
+
health(): Promise<Record<string, unknown>>;
|
|
8
|
+
tools(): Promise<Array<{
|
|
9
|
+
name: string;
|
|
10
|
+
description: string;
|
|
11
|
+
}>>;
|
|
12
|
+
call(name: string, input?: unknown): Promise<unknown>;
|
|
13
|
+
stop(): Promise<void>;
|
|
14
|
+
private request;
|
|
15
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { RuntimeError } from "../core/errors.js";
|
|
5
|
+
import { RUNTIME_LOCK_PATH, RUNTIME_STATE_PATH } from "../config/paths.js";
|
|
6
|
+
import { isProcessRunning, readRuntimeState } from "./state.js";
|
|
7
|
+
export class RuntimeClient {
|
|
8
|
+
state;
|
|
9
|
+
constructor(state) {
|
|
10
|
+
this.state = state;
|
|
11
|
+
}
|
|
12
|
+
static async connect(options = { start: true }) {
|
|
13
|
+
let state = readRuntimeState();
|
|
14
|
+
if (state && await healthy(state))
|
|
15
|
+
return new RuntimeClient(state);
|
|
16
|
+
clearDeadRuntimeFiles(state);
|
|
17
|
+
if (options.start === false)
|
|
18
|
+
throw new RuntimeError("NOT_FOUND", "OKX runtime is not running");
|
|
19
|
+
startDetachedRuntime();
|
|
20
|
+
const deadline = Date.now() + 15_000;
|
|
21
|
+
while (Date.now() < deadline) {
|
|
22
|
+
await delay(100);
|
|
23
|
+
state = readRuntimeState();
|
|
24
|
+
if (state && await healthy(state))
|
|
25
|
+
return new RuntimeClient(state);
|
|
26
|
+
}
|
|
27
|
+
throw new RuntimeError("NETWORK", "OKX runtime did not become ready within 15 seconds");
|
|
28
|
+
}
|
|
29
|
+
async health() {
|
|
30
|
+
return this.request("GET", "/health");
|
|
31
|
+
}
|
|
32
|
+
async tools() {
|
|
33
|
+
const response = await this.request("GET", "/v1/tools");
|
|
34
|
+
return response.tools;
|
|
35
|
+
}
|
|
36
|
+
async call(name, input = {}) {
|
|
37
|
+
const response = await this.request("POST", "/v1/call", { name, input });
|
|
38
|
+
return response.result;
|
|
39
|
+
}
|
|
40
|
+
async stop() {
|
|
41
|
+
await this.request("POST", "/stop", {});
|
|
42
|
+
}
|
|
43
|
+
async request(method, path, body) {
|
|
44
|
+
try {
|
|
45
|
+
const response = await fetch(`http://127.0.0.1:${this.state.port}${path}`, {
|
|
46
|
+
method,
|
|
47
|
+
headers: { authorization: `Bearer ${this.state.token}`, "content-type": "application/json" },
|
|
48
|
+
...(body === undefined ? {} : { body: JSON.stringify(body) }),
|
|
49
|
+
signal: AbortSignal.timeout(30_000)
|
|
50
|
+
});
|
|
51
|
+
const value = await response.json();
|
|
52
|
+
if (!response.ok || value.error) {
|
|
53
|
+
const error = value.error ?? {};
|
|
54
|
+
throw new RuntimeError(error.code ?? "INTERNAL", error.message ?? `Runtime HTTP ${response.status}`, error.retryable ?? false, error.details);
|
|
55
|
+
}
|
|
56
|
+
return value;
|
|
57
|
+
}
|
|
58
|
+
catch (error) {
|
|
59
|
+
if (error instanceof RuntimeError)
|
|
60
|
+
throw error;
|
|
61
|
+
throw new RuntimeError("NETWORK", error instanceof Error ? error.message : "Runtime request failed", true);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async function healthy(state) {
|
|
66
|
+
try {
|
|
67
|
+
const response = await fetch(`http://127.0.0.1:${state.port}/health`, {
|
|
68
|
+
headers: { authorization: `Bearer ${state.token}` },
|
|
69
|
+
signal: AbortSignal.timeout(800)
|
|
70
|
+
});
|
|
71
|
+
return response.ok;
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function startDetachedRuntime() {
|
|
78
|
+
const compiledCli = fileURLToPath(new URL("../cli/index.js", import.meta.url));
|
|
79
|
+
const entry = fs.existsSync(compiledCli) ? compiledCli : process.argv[1];
|
|
80
|
+
if (!entry)
|
|
81
|
+
throw new RuntimeError("INTERNAL", "Cannot locate the OKX runtime CLI entry point");
|
|
82
|
+
const child = spawn(process.execPath, [entry, "daemon"], {
|
|
83
|
+
detached: true,
|
|
84
|
+
stdio: "ignore",
|
|
85
|
+
env: process.env
|
|
86
|
+
});
|
|
87
|
+
child.unref();
|
|
88
|
+
}
|
|
89
|
+
function delay(ms) {
|
|
90
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
91
|
+
}
|
|
92
|
+
function clearDeadRuntimeFiles(state) {
|
|
93
|
+
if (state && !isProcessRunning(state.pid)) {
|
|
94
|
+
try {
|
|
95
|
+
fs.unlinkSync(RUNTIME_STATE_PATH);
|
|
96
|
+
}
|
|
97
|
+
catch { }
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
const lockPid = Number(fs.readFileSync(RUNTIME_LOCK_PATH, "utf8"));
|
|
101
|
+
if (!Number.isInteger(lockPid) || !isProcessRunning(lockPid))
|
|
102
|
+
fs.unlinkSync(RUNTIME_LOCK_PATH);
|
|
103
|
+
}
|
|
104
|
+
catch { }
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/runtime/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { type RuntimeState } from "./state.js";
|
|
2
|
+
export declare class RuntimeServer {
|
|
3
|
+
private readonly config;
|
|
4
|
+
private readonly database;
|
|
5
|
+
private readonly client;
|
|
6
|
+
private readonly store;
|
|
7
|
+
private readonly market;
|
|
8
|
+
private readonly websocket;
|
|
9
|
+
private readonly accountStore;
|
|
10
|
+
private readonly privateWebSockets;
|
|
11
|
+
private readonly account;
|
|
12
|
+
private readonly derivatives;
|
|
13
|
+
private readonly intelligence;
|
|
14
|
+
private readonly trade;
|
|
15
|
+
private readonly context;
|
|
16
|
+
private readonly token;
|
|
17
|
+
private readonly instanceId;
|
|
18
|
+
private readonly lockDescriptor;
|
|
19
|
+
private server?;
|
|
20
|
+
private state?;
|
|
21
|
+
private closing;
|
|
22
|
+
start(): Promise<RuntimeState>;
|
|
23
|
+
stop(reason?: string): Promise<void>;
|
|
24
|
+
private route;
|
|
25
|
+
private authorized;
|
|
26
|
+
private send;
|
|
27
|
+
}
|
|
28
|
+
export declare function runRuntimeServer(): Promise<void>;
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
import http from "node:http";
|
|
3
|
+
import { loadConfig } from "../config/loader.js";
|
|
4
|
+
import { AccountService } from "../account/service.js";
|
|
5
|
+
import { AccountStore } from "../account/store.js";
|
|
6
|
+
import { PrivateAccountWebSockets } from "../account/private-websocket.js";
|
|
7
|
+
import { OkxClient } from "../core/okx-client.js";
|
|
8
|
+
import { publicError } from "../core/errors.js";
|
|
9
|
+
import { sanitizeValue } from "../core/sanitize.js";
|
|
10
|
+
import { DerivativesService } from "../derivatives/service.js";
|
|
11
|
+
import { IntelligenceService } from "../intelligence/service.js";
|
|
12
|
+
import { MarketService } from "../market/service.js";
|
|
13
|
+
import { MarketStore } from "../market/store.js";
|
|
14
|
+
import { MarketWebSocket } from "../market/websocket.js";
|
|
15
|
+
import { RuntimeDatabase } from "../storage/database.js";
|
|
16
|
+
import { TOOL_CATALOG, toolByName } from "../tools/catalog.js";
|
|
17
|
+
import { TradeService } from "../trade/service.js";
|
|
18
|
+
import { acquireRuntimeLock, appendRuntimeLifecycle, releaseRuntimeFiles, writeRuntimeState } from "./state.js";
|
|
19
|
+
export class RuntimeServer {
|
|
20
|
+
config = loadConfig();
|
|
21
|
+
database = new RuntimeDatabase();
|
|
22
|
+
client = new OkxClient("https://www.okx.com", this.config.proxy.url);
|
|
23
|
+
store = new MarketStore(this.config.market.recentTradeLimit, this.config.market.orderBookDepth);
|
|
24
|
+
market = new MarketService(this.config, this.store, this.client, this.database);
|
|
25
|
+
websocket = new MarketWebSocket(this.config, this.store, this.database);
|
|
26
|
+
accountStore = new AccountStore();
|
|
27
|
+
privateWebSockets = new PrivateAccountWebSockets(this.config, this.accountStore);
|
|
28
|
+
account = new AccountService(this.config, this.client, this.accountStore);
|
|
29
|
+
derivatives = new DerivativesService(this.client, this.database);
|
|
30
|
+
intelligence = new IntelligenceService(this.config, this.client, this.account, this.database, this.market, this.derivatives);
|
|
31
|
+
trade = new TradeService(this.client, this.account, this.market, this.database);
|
|
32
|
+
context = { market: this.market, account: this.account, derivatives: this.derivatives, intelligence: this.intelligence, trade: this.trade };
|
|
33
|
+
token = crypto.randomBytes(32).toString("base64url");
|
|
34
|
+
instanceId = crypto.randomUUID();
|
|
35
|
+
lockDescriptor = acquireRuntimeLock();
|
|
36
|
+
server;
|
|
37
|
+
state;
|
|
38
|
+
closing = false;
|
|
39
|
+
async start() {
|
|
40
|
+
appendRuntimeLifecycle("server-starting", { instanceId: this.instanceId });
|
|
41
|
+
this.database.retainIntelligence(this.config.intelligence.retentionDays);
|
|
42
|
+
this.market.attachWebSocket(this.websocket);
|
|
43
|
+
this.market.restorePersisted();
|
|
44
|
+
this.websocket.start();
|
|
45
|
+
this.privateWebSockets.start();
|
|
46
|
+
this.intelligence.start();
|
|
47
|
+
this.server = http.createServer((request, response) => void this.route(request, response));
|
|
48
|
+
await new Promise((resolve, reject) => {
|
|
49
|
+
this.server.once("error", reject);
|
|
50
|
+
this.server.listen(0, "127.0.0.1", () => resolve());
|
|
51
|
+
});
|
|
52
|
+
const address = this.server.address();
|
|
53
|
+
if (!address || typeof address === "string")
|
|
54
|
+
throw new Error("Runtime did not bind a TCP port");
|
|
55
|
+
this.state = {
|
|
56
|
+
instanceId: this.instanceId,
|
|
57
|
+
pid: process.pid,
|
|
58
|
+
port: address.port,
|
|
59
|
+
token: this.token,
|
|
60
|
+
startedAt: Date.now(),
|
|
61
|
+
version: "0.1.0"
|
|
62
|
+
};
|
|
63
|
+
writeRuntimeState(this.state);
|
|
64
|
+
return this.state;
|
|
65
|
+
}
|
|
66
|
+
async stop(reason = "requested") {
|
|
67
|
+
if (this.closing)
|
|
68
|
+
return;
|
|
69
|
+
this.closing = true;
|
|
70
|
+
appendRuntimeLifecycle("server-stopping", { instanceId: this.instanceId, reason });
|
|
71
|
+
this.websocket.stop();
|
|
72
|
+
this.privateWebSockets.stop();
|
|
73
|
+
this.intelligence.stop();
|
|
74
|
+
await new Promise((resolve) => this.server?.close(() => resolve()) ?? resolve());
|
|
75
|
+
this.database.close();
|
|
76
|
+
releaseRuntimeFiles(this.lockDescriptor, this.instanceId);
|
|
77
|
+
appendRuntimeLifecycle("server-stopped", { instanceId: this.instanceId, reason });
|
|
78
|
+
}
|
|
79
|
+
async route(request, response) {
|
|
80
|
+
response.setHeader("content-type", "application/json; charset=utf-8");
|
|
81
|
+
if (!this.authorized(request))
|
|
82
|
+
return this.send(response, 401, { error: { code: "AUTH", message: "Invalid runtime token" } });
|
|
83
|
+
try {
|
|
84
|
+
if (request.method === "GET" && request.url === "/health") {
|
|
85
|
+
return this.send(response, 200, { ok: true, pid: process.pid, instanceId: this.instanceId, startedAt: this.state?.startedAt, subscriptions: this.store.subscriptions.size });
|
|
86
|
+
}
|
|
87
|
+
if (request.method === "GET" && request.url === "/v1/tools") {
|
|
88
|
+
return this.send(response, 200, { tools: TOOL_CATALOG.map(({ name, description }) => ({ name, description })) });
|
|
89
|
+
}
|
|
90
|
+
if (request.method === "POST" && request.url === "/v1/call") {
|
|
91
|
+
const body = await readJson(request);
|
|
92
|
+
const definition = toolByName(String(body.name ?? ""));
|
|
93
|
+
if (!definition)
|
|
94
|
+
return this.send(response, 404, { error: { code: "NOT_FOUND", message: `Unknown tool '${String(body.name ?? "")}'` } });
|
|
95
|
+
const input = definition.schema.parse(body.input ?? {});
|
|
96
|
+
const result = await definition.execute(this.context, input);
|
|
97
|
+
const accounts = Object.entries(this.config.accounts).map(([name, account]) => ({ name, ...account }));
|
|
98
|
+
return this.send(response, 200, sanitizeValue({ result }, accounts));
|
|
99
|
+
}
|
|
100
|
+
if (request.method === "POST" && request.url === "/stop") {
|
|
101
|
+
this.send(response, 200, { stopped: true });
|
|
102
|
+
setImmediate(() => void this.stop("rpc-stop").then(() => process.exit(0)));
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
this.send(response, 404, { error: { code: "NOT_FOUND", message: "Runtime endpoint not found" } });
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
const accounts = Object.entries(this.config.accounts).map(([name, account]) => ({ name, ...account }));
|
|
109
|
+
this.send(response, 400, sanitizeValue({ error: publicError(error) }, accounts));
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
authorized(request) {
|
|
113
|
+
return request.headers.authorization === `Bearer ${this.token}`;
|
|
114
|
+
}
|
|
115
|
+
send(response, status, value) {
|
|
116
|
+
if (response.writableEnded)
|
|
117
|
+
return;
|
|
118
|
+
response.statusCode = status;
|
|
119
|
+
response.end(JSON.stringify(value));
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
async function readJson(request) {
|
|
123
|
+
const chunks = [];
|
|
124
|
+
let length = 0;
|
|
125
|
+
for await (const chunk of request) {
|
|
126
|
+
const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
|
|
127
|
+
length += buffer.length;
|
|
128
|
+
if (length > 1_000_000)
|
|
129
|
+
throw new Error("Request body is too large");
|
|
130
|
+
chunks.push(buffer);
|
|
131
|
+
}
|
|
132
|
+
return chunks.length ? JSON.parse(Buffer.concat(chunks).toString("utf8")) : {};
|
|
133
|
+
}
|
|
134
|
+
export async function runRuntimeServer() {
|
|
135
|
+
const server = new RuntimeServer();
|
|
136
|
+
await server.start();
|
|
137
|
+
process.once("SIGINT", () => { void server.stop("SIGINT").finally(() => process.exit(0)); });
|
|
138
|
+
process.once("SIGTERM", () => { void server.stop("SIGTERM").finally(() => process.exit(0)); });
|
|
139
|
+
}
|
|
140
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/runtime/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface RuntimeState {
|
|
2
|
+
instanceId: string;
|
|
3
|
+
pid: number;
|
|
4
|
+
port: number;
|
|
5
|
+
token: string;
|
|
6
|
+
startedAt: number;
|
|
7
|
+
version: string;
|
|
8
|
+
}
|
|
9
|
+
export declare function readRuntimeState(): RuntimeState | undefined;
|
|
10
|
+
export declare function writeRuntimeState(state: RuntimeState): void;
|
|
11
|
+
export declare function acquireRuntimeLock(): number;
|
|
12
|
+
export declare function releaseRuntimeFiles(lockDescriptor: number, instanceId: string): void;
|
|
13
|
+
export declare function appendRuntimeLifecycle(event: string, details?: Record<string, unknown>): void;
|
|
14
|
+
export declare function isProcessRunning(pid: number): boolean;
|