hedgequantx 2.6.160 → 2.6.162
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/package.json +1 -1
- package/src/menus/ai-agent-connect.js +181 -0
- package/src/menus/ai-agent-models.js +219 -0
- package/src/menus/ai-agent-oauth.js +292 -0
- package/src/menus/ai-agent-ui.js +141 -0
- package/src/menus/ai-agent.js +88 -1489
- package/src/pages/algo/copy-engine.js +449 -0
- package/src/pages/algo/copy-trading.js +11 -543
- package/src/pages/algo/smart-logs-data.js +218 -0
- package/src/pages/algo/smart-logs.js +9 -214
- package/src/pages/algo/ui-constants.js +144 -0
- package/src/pages/algo/ui-summary.js +184 -0
- package/src/pages/algo/ui.js +42 -526
- package/src/pages/stats-calculations.js +191 -0
- package/src/pages/stats-ui.js +381 -0
- package/src/pages/stats.js +14 -507
- package/src/services/ai/client-analysis.js +194 -0
- package/src/services/ai/client-models.js +333 -0
- package/src/services/ai/client.js +6 -489
- package/src/services/ai/index.js +2 -257
- package/src/services/ai/proxy-install.js +249 -0
- package/src/services/ai/proxy-manager.js +29 -411
- package/src/services/ai/proxy-remote.js +161 -0
- package/src/services/ai/strategy-supervisor.js +10 -765
- package/src/services/ai/supervisor-data.js +195 -0
- package/src/services/ai/supervisor-optimize.js +215 -0
- package/src/services/ai/supervisor-sync.js +178 -0
- package/src/services/ai/supervisor-utils.js +158 -0
- package/src/services/ai/supervisor.js +50 -515
- package/src/services/ai/validation.js +250 -0
- package/src/services/hqx-server-events.js +110 -0
- package/src/services/hqx-server-handlers.js +217 -0
- package/src/services/hqx-server-latency.js +136 -0
- package/src/services/hqx-server.js +51 -403
- package/src/services/position-constants.js +28 -0
- package/src/services/position-manager.js +105 -554
- package/src/services/position-momentum.js +206 -0
- package/src/services/projectx/accounts.js +142 -0
- package/src/services/projectx/index.js +40 -289
- package/src/services/projectx/trading.js +180 -0
- package/src/services/rithmic/handlers.js +2 -208
- package/src/services/rithmic/index.js +32 -542
- package/src/services/rithmic/latency-tracker.js +182 -0
- package/src/services/rithmic/specs.js +146 -0
- package/src/services/rithmic/trade-history.js +254 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Remote OAuth for CLIProxyAPI
|
|
3
|
+
*
|
|
4
|
+
* For VPS/Server users without browser access
|
|
5
|
+
* Uses cli.hedgequantx.com as OAuth relay
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const https = require('https');
|
|
9
|
+
|
|
10
|
+
const REMOTE_OAUTH_URL = 'https://cli.hedgequantx.com';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Make HTTPS request
|
|
14
|
+
*/
|
|
15
|
+
const httpsRequest = (url, options, body = null) => {
|
|
16
|
+
return new Promise((resolve, reject) => {
|
|
17
|
+
const parsedUrl = new URL(url);
|
|
18
|
+
const req = https.request({
|
|
19
|
+
hostname: parsedUrl.hostname,
|
|
20
|
+
port: 443,
|
|
21
|
+
path: parsedUrl.pathname + parsedUrl.search,
|
|
22
|
+
method: options.method || 'GET',
|
|
23
|
+
headers: options.headers || {}
|
|
24
|
+
}, (res) => {
|
|
25
|
+
let data = '';
|
|
26
|
+
res.on('data', chunk => data += chunk);
|
|
27
|
+
res.on('end', () => {
|
|
28
|
+
try {
|
|
29
|
+
resolve(JSON.parse(data));
|
|
30
|
+
} catch (e) {
|
|
31
|
+
resolve(data);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
req.on('error', reject);
|
|
37
|
+
req.on('timeout', () => {
|
|
38
|
+
req.destroy();
|
|
39
|
+
reject(new Error('Request timeout'));
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
if (body) {
|
|
43
|
+
req.write(typeof body === 'string' ? body : JSON.stringify(body));
|
|
44
|
+
}
|
|
45
|
+
req.end();
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Create Remote OAuth session
|
|
51
|
+
* @param {string} provider - Provider ID (anthropic, openai, gemini)
|
|
52
|
+
* @returns {Promise<{sessionId: string, authUrl: string}>}
|
|
53
|
+
*/
|
|
54
|
+
const createRemoteSession = async (provider) => {
|
|
55
|
+
const response = await httpsRequest(
|
|
56
|
+
`${REMOTE_OAUTH_URL}/oauth/session/create`,
|
|
57
|
+
{
|
|
58
|
+
method: 'POST',
|
|
59
|
+
headers: { 'Content-Type': 'application/json' }
|
|
60
|
+
},
|
|
61
|
+
JSON.stringify({ provider })
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
if (response.error) {
|
|
65
|
+
throw new Error(response.error);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
return {
|
|
69
|
+
sessionId: response.sessionId,
|
|
70
|
+
authUrl: response.authUrl
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Poll Remote OAuth session status
|
|
76
|
+
* @param {string} sessionId - Session ID from createRemoteSession
|
|
77
|
+
* @returns {Promise<{status: string, error?: string}>}
|
|
78
|
+
*/
|
|
79
|
+
const pollRemoteSession = async (sessionId) => {
|
|
80
|
+
const response = await httpsRequest(
|
|
81
|
+
`${REMOTE_OAUTH_URL}/oauth/session/${sessionId}/status`,
|
|
82
|
+
{ method: 'GET' }
|
|
83
|
+
);
|
|
84
|
+
return response;
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Get tokens from Remote OAuth session
|
|
89
|
+
* @param {string} sessionId - Session ID
|
|
90
|
+
* @returns {Promise<{provider: string, tokens: Object}>}
|
|
91
|
+
*/
|
|
92
|
+
const getRemoteTokens = async (sessionId) => {
|
|
93
|
+
const response = await httpsRequest(
|
|
94
|
+
`${REMOTE_OAUTH_URL}/oauth/session/${sessionId}/tokens`,
|
|
95
|
+
{ method: 'GET' }
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
if (response.error) {
|
|
99
|
+
throw new Error(response.error);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
return response;
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Wait for Remote OAuth to complete
|
|
107
|
+
* @param {string} sessionId - Session ID
|
|
108
|
+
* @param {number} timeoutMs - Timeout in milliseconds
|
|
109
|
+
* @param {Function} onStatus - Status callback
|
|
110
|
+
* @returns {Promise<{provider: string, tokens: Object}>}
|
|
111
|
+
*/
|
|
112
|
+
const waitForRemoteAuth = async (sessionId, timeoutMs = 300000, onStatus = () => {}) => {
|
|
113
|
+
const startTime = Date.now();
|
|
114
|
+
|
|
115
|
+
while (Date.now() - startTime < timeoutMs) {
|
|
116
|
+
const status = await pollRemoteSession(sessionId);
|
|
117
|
+
|
|
118
|
+
if (status.status === 'success') {
|
|
119
|
+
return await getRemoteTokens(sessionId);
|
|
120
|
+
} else if (status.status === 'error') {
|
|
121
|
+
throw new Error(status.error || 'Authentication failed');
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
onStatus('Waiting for authorization...');
|
|
125
|
+
await new Promise(resolve => setTimeout(resolve, 2000));
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
throw new Error('Authentication timeout');
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Detect if we're running on a server (no display/browser)
|
|
133
|
+
* @returns {boolean}
|
|
134
|
+
*/
|
|
135
|
+
const isServerEnvironment = () => {
|
|
136
|
+
if (process.env.SSH_CONNECTION || process.env.SSH_CLIENT) return true;
|
|
137
|
+
if (process.env.DISPLAY === undefined && process.platform === 'linux') return true;
|
|
138
|
+
if (process.env.TERM === 'dumb') return true;
|
|
139
|
+
if (process.env.HQX_REMOTE_OAUTH === '1') return true;
|
|
140
|
+
return false;
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Detect if browser can be opened
|
|
145
|
+
* @returns {boolean}
|
|
146
|
+
*/
|
|
147
|
+
const canOpenBrowser = () => {
|
|
148
|
+
if (process.platform === 'darwin' || process.platform === 'win32') return true;
|
|
149
|
+
if (process.env.DISPLAY) return true;
|
|
150
|
+
return false;
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
module.exports = {
|
|
154
|
+
createRemoteSession,
|
|
155
|
+
pollRemoteSession,
|
|
156
|
+
getRemoteTokens,
|
|
157
|
+
waitForRemoteAuth,
|
|
158
|
+
isServerEnvironment,
|
|
159
|
+
canOpenBrowser,
|
|
160
|
+
REMOTE_OAUTH_URL
|
|
161
|
+
};
|