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.
Files changed (101) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +242 -0
  3. package/dist/account/private-websocket.d.ts +13 -0
  4. package/dist/account/private-websocket.js +102 -0
  5. package/dist/account/private-websocket.js.map +1 -0
  6. package/dist/account/service.d.ts +22 -0
  7. package/dist/account/service.js +118 -0
  8. package/dist/account/service.js.map +1 -0
  9. package/dist/account/store.d.ts +12 -0
  10. package/dist/account/store.js +48 -0
  11. package/dist/account/store.js.map +1 -0
  12. package/dist/cli/index.d.ts +2 -0
  13. package/dist/cli/index.js +122 -0
  14. package/dist/cli/index.js.map +1 -0
  15. package/dist/cli/prompts.d.ts +2 -0
  16. package/dist/cli/prompts.js +52 -0
  17. package/dist/cli/prompts.js.map +1 -0
  18. package/dist/config/loader.d.ts +9 -0
  19. package/dist/config/loader.js +87 -0
  20. package/dist/config/loader.js.map +1 -0
  21. package/dist/config/paths.d.ts +7 -0
  22. package/dist/config/paths.js +11 -0
  23. package/dist/config/paths.js.map +1 -0
  24. package/dist/config/schema.d.ts +42 -0
  25. package/dist/config/schema.js +30 -0
  26. package/dist/config/schema.js.map +1 -0
  27. package/dist/core/attribution.d.ts +2 -0
  28. package/dist/core/attribution.js +29 -0
  29. package/dist/core/attribution.js.map +1 -0
  30. package/dist/core/errors.d.ts +9 -0
  31. package/dist/core/errors.js +33 -0
  32. package/dist/core/errors.js.map +1 -0
  33. package/dist/core/okx-client.d.ts +13 -0
  34. package/dist/core/okx-client.js +102 -0
  35. package/dist/core/okx-client.js.map +1 -0
  36. package/dist/core/sanitize.d.ts +2 -0
  37. package/dist/core/sanitize.js +19 -0
  38. package/dist/core/sanitize.js.map +1 -0
  39. package/dist/core/types.d.ts +38 -0
  40. package/dist/core/types.js +18 -0
  41. package/dist/core/types.js.map +1 -0
  42. package/dist/derivatives/service.d.ts +28 -0
  43. package/dist/derivatives/service.js +144 -0
  44. package/dist/derivatives/service.js.map +1 -0
  45. package/dist/index.d.ts +4 -0
  46. package/dist/index.js +5 -0
  47. package/dist/index.js.map +1 -0
  48. package/dist/intelligence/service.d.ts +38 -0
  49. package/dist/intelligence/service.js +324 -0
  50. package/dist/intelligence/service.js.map +1 -0
  51. package/dist/market/indicators.d.ts +2 -0
  52. package/dist/market/indicators.js +74 -0
  53. package/dist/market/indicators.js.map +1 -0
  54. package/dist/market/service.d.ts +28 -0
  55. package/dist/market/service.js +232 -0
  56. package/dist/market/service.js.map +1 -0
  57. package/dist/market/store.d.ts +46 -0
  58. package/dist/market/store.js +158 -0
  59. package/dist/market/store.js.map +1 -0
  60. package/dist/market/websocket.d.ts +33 -0
  61. package/dist/market/websocket.js +213 -0
  62. package/dist/market/websocket.js.map +1 -0
  63. package/dist/mcp/server.d.ts +1 -0
  64. package/dist/mcp/server.js +28 -0
  65. package/dist/mcp/server.js.map +1 -0
  66. package/dist/runtime/client.d.ts +15 -0
  67. package/dist/runtime/client.js +106 -0
  68. package/dist/runtime/client.js.map +1 -0
  69. package/dist/runtime/server.d.ts +28 -0
  70. package/dist/runtime/server.js +140 -0
  71. package/dist/runtime/server.js.map +1 -0
  72. package/dist/runtime/state.d.ts +14 -0
  73. package/dist/runtime/state.js +98 -0
  74. package/dist/runtime/state.js.map +1 -0
  75. package/dist/storage/database.d.ts +23 -0
  76. package/dist/storage/database.js +106 -0
  77. package/dist/storage/database.js.map +1 -0
  78. package/dist/tools/catalog.d.ts +21 -0
  79. package/dist/tools/catalog.js +236 -0
  80. package/dist/tools/catalog.js.map +1 -0
  81. package/dist/trade/service.d.ts +128 -0
  82. package/dist/trade/service.js +470 -0
  83. package/dist/trade/service.js.map +1 -0
  84. package/examples/claude-code/mcp.json +8 -0
  85. package/examples/codex/config.toml +3 -0
  86. package/examples/config.example.json +18 -0
  87. package/package.json +71 -0
  88. package/skills/okx-account-analysis/SKILL.md +14 -0
  89. package/skills/okx-account-analysis/agents/openai.yaml +9 -0
  90. package/skills/okx-derivatives-analysis/SKILL.md +14 -0
  91. package/skills/okx-derivatives-analysis/agents/openai.yaml +9 -0
  92. package/skills/okx-market-analysis/SKILL.md +14 -0
  93. package/skills/okx-market-analysis/agents/openai.yaml +9 -0
  94. package/skills/okx-news-intelligence/SKILL.md +14 -0
  95. package/skills/okx-news-intelligence/agents/openai.yaml +9 -0
  96. package/skills/okx-smart-money-analysis/SKILL.md +15 -0
  97. package/skills/okx-smart-money-analysis/agents/openai.yaml +9 -0
  98. package/skills/okx-trading/SKILL.md +16 -0
  99. package/skills/okx-trading/agents/openai.yaml +9 -0
  100. package/skills/trading-philosophy/SKILL.md +14 -0
  101. 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;