@tradejs/infra 2.0.21 → 3.0.1

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 (55) hide show
  1. package/dist/{chunk-YVIHTUV5.mjs → chunk-OLB6NQRG.mjs} +1 -1
  2. package/dist/{chunk-I2J6YDBD.mjs → chunk-ZXU7OYFU.mjs} +65 -38
  3. package/dist/internal-BuHqoCCV.d.mts +9 -0
  4. package/dist/internal-q48Torp4.d.ts +9 -0
  5. package/dist/ml.mjs +3 -3
  6. package/dist/query-tkHVD4Xo.d.mts +12 -0
  7. package/dist/query-tkHVD4Xo.d.ts +12 -0
  8. package/dist/timescale/candles.js +6 -4
  9. package/dist/timescale/candles.mjs +2 -2
  10. package/dist/timescale/client.d.mts +3 -2
  11. package/dist/timescale/client.d.ts +3 -2
  12. package/dist/timescale/client.js +40 -15
  13. package/dist/timescale/client.mjs +2 -2
  14. package/dist/timescale/derivatives.d.mts +4 -2
  15. package/dist/timescale/derivatives.d.ts +4 -2
  16. package/dist/timescale/derivatives.js +20 -12
  17. package/dist/timescale/derivatives.mjs +479 -13
  18. package/dist/timescale/hyperliquidWhales.d.mts +29 -25
  19. package/dist/timescale/hyperliquidWhales.d.ts +29 -25
  20. package/dist/timescale/hyperliquidWhales.js +84 -71
  21. package/dist/timescale/hyperliquidWhales.mjs +1103 -14
  22. package/dist/timescale/marketContext.d.mts +15 -11
  23. package/dist/timescale/marketContext.d.ts +15 -11
  24. package/dist/timescale/marketContext.js +67 -57
  25. package/dist/timescale/marketContext.mjs +1259 -28
  26. package/dist/timescale/spread.js +6 -4
  27. package/dist/timescale/spread.mjs +105 -5
  28. package/dist/userSettings.js +3 -316
  29. package/dist/userSettings.mjs +3 -21
  30. package/package.json +2 -22
  31. package/dist/aiEndpoints.d.mts +0 -10
  32. package/dist/aiEndpoints.d.ts +0 -10
  33. package/dist/aiEndpoints.js +0 -159
  34. package/dist/aiEndpoints.mjs +0 -12
  35. package/dist/aiLanguages.d.mts +0 -11
  36. package/dist/aiLanguages.d.ts +0 -11
  37. package/dist/aiLanguages.js +0 -71
  38. package/dist/aiLanguages.mjs +0 -12
  39. package/dist/aiModels.d.mts +0 -12
  40. package/dist/aiModels.d.ts +0 -12
  41. package/dist/aiModels.js +0 -272
  42. package/dist/aiModels.mjs +0 -17
  43. package/dist/chunk-2CZREG43.mjs +0 -112
  44. package/dist/chunk-CCC7DX2T.mjs +0 -44
  45. package/dist/chunk-DFMKDB2R.mjs +0 -1285
  46. package/dist/chunk-DTCLZIBM.mjs +0 -163
  47. package/dist/chunk-NWXFWTWU.mjs +0 -1114
  48. package/dist/chunk-SZQB7ER5.mjs +0 -492
  49. package/dist/chunk-XQ3YBULV.mjs +0 -132
  50. package/dist/internal-2coHaaos.d.mts +0 -26
  51. package/dist/internal-2coHaaos.d.ts +0 -26
  52. package/dist/timescale.d.mts +0 -9
  53. package/dist/timescale.d.ts +0 -9
  54. package/dist/timescale.js +0 -4228
  55. package/dist/timescale.mjs +0 -138
@@ -48,10 +48,7 @@ var getPool = () => {
48
48
  return global.__pgPool__;
49
49
  };
50
50
 
51
- // src/timescale/internal.ts
52
- var spreadSchemaReady = false;
53
- var spreadSchemaReadyPromise = null;
54
- var SPREAD_SCHEMA_LOCK_KEY = 610002;
51
+ // src/timescale/schema/lifecycle.ts
55
52
  var withSchemaLock = async (lockKey, work) => {
56
53
  const pool = getPool();
57
54
  await pool.query("SELECT pg_advisory_lock($1)", [lockKey]);
@@ -61,6 +58,11 @@ var withSchemaLock = async (lockKey, work) => {
61
58
  await pool.query("SELECT pg_advisory_unlock($1)", [lockKey]);
62
59
  }
63
60
  };
61
+
62
+ // src/timescale/schema/spread.ts
63
+ var spreadSchemaReady = false;
64
+ var spreadSchemaReadyPromise = null;
65
+ var SPREAD_SCHEMA_LOCK_KEY = 610002;
64
66
  var ensureSpreadSchema = async () => {
65
67
  if (spreadSchemaReady) return;
66
68
  if (spreadSchemaReadyPromise) {
@@ -1,9 +1,109 @@
1
1
  import {
2
- getSpreadRangeForSymbols,
3
- getSpreadSummary,
4
- upsertSpreadRows
5
- } from "../chunk-2CZREG43.mjs";
6
- import "../chunk-I2J6YDBD.mjs";
2
+ ensureSpreadSchema,
3
+ getPool
4
+ } from "../chunk-ZXU7OYFU.mjs";
5
+
6
+ // src/timescale/spread.ts
7
+ async function upsertSpreadRows(rows) {
8
+ if (!rows.length) return;
9
+ await ensureSpreadSchema();
10
+ const pool = getPool();
11
+ const cols = [
12
+ "symbol",
13
+ "interval",
14
+ "ts",
15
+ "binance_price",
16
+ "coinbase_price",
17
+ "spread",
18
+ "source"
19
+ ];
20
+ const maxRows = Math.floor(65535 / cols.length);
21
+ if (rows.length > maxRows) {
22
+ for (let i = 0; i < rows.length; i += maxRows) {
23
+ await upsertSpreadRows(rows.slice(i, i + maxRows));
24
+ }
25
+ return;
26
+ }
27
+ const valuesSql = rows.map(
28
+ (_, i) => `(${cols.map((__, j) => `$${i * cols.length + j + 1}`).join(",")})`
29
+ ).join(",");
30
+ const flat = rows.flatMap((row) => [
31
+ row.symbol,
32
+ row.interval,
33
+ row.ts,
34
+ row.binancePrice ?? null,
35
+ row.coinbasePrice ?? null,
36
+ row.spread ?? null,
37
+ row.source ?? null
38
+ ]);
39
+ const sql = `
40
+ INSERT INTO market_spread (${cols.join(",")})
41
+ VALUES ${valuesSql}
42
+ ON CONFLICT (symbol, interval, ts) DO UPDATE SET
43
+ binance_price = COALESCE(EXCLUDED.binance_price, market_spread.binance_price),
44
+ coinbase_price = COALESCE(EXCLUDED.coinbase_price, market_spread.coinbase_price),
45
+ spread = COALESCE(EXCLUDED.spread, market_spread.spread),
46
+ source = COALESCE(EXCLUDED.source, market_spread.source),
47
+ ingested_at = now()
48
+ `;
49
+ await pool.query(sql, flat);
50
+ }
51
+ async function getSpreadRangeForSymbols(symbols, interval, startMs, endMs) {
52
+ if (!symbols.length) {
53
+ return [];
54
+ }
55
+ await ensureSpreadSchema();
56
+ const pool = getPool();
57
+ const sql = `
58
+ SELECT symbol, interval, ts, binance_price, coinbase_price, spread
59
+ FROM market_spread
60
+ WHERE symbol = ANY($1)
61
+ AND interval = $2
62
+ AND ts >= to_timestamp($3/1000.0)
63
+ AND ts <= to_timestamp($4/1000.0)
64
+ ORDER BY symbol ASC, ts ASC
65
+ `;
66
+ const res = await pool.query(sql, [symbols, interval, startMs, endMs]);
67
+ return res.rows;
68
+ }
69
+ async function getSpreadSummary(hours = 24, limit = 500) {
70
+ await ensureSpreadSchema();
71
+ const pool = getPool();
72
+ const cappedHours = Math.max(1, Math.min(24 * 30, hours));
73
+ const cappedLimit = Math.max(50, Math.min(5e3, limit));
74
+ const rowsQ = await pool.query(
75
+ `
76
+ SELECT symbol, interval, ts, binance_price, coinbase_price, spread
77
+ FROM market_spread
78
+ WHERE ts >= now() - ($1 || ' hours')::interval
79
+ ORDER BY ts DESC
80
+ LIMIT $2
81
+ `,
82
+ [String(cappedHours), cappedLimit]
83
+ );
84
+ const aggQ = await pool.query(
85
+ `
86
+ SELECT
87
+ symbol,
88
+ interval,
89
+ COUNT(*)::int AS points,
90
+ MAX(ts) AS last_ts,
91
+ AVG(spread) AS avg_spread,
92
+ STDDEV_POP(spread) AS std_spread
93
+ FROM market_spread
94
+ WHERE ts >= now() - ($1 || ' hours')::interval
95
+ GROUP BY symbol, interval
96
+ ORDER BY points DESC, symbol ASC
97
+ LIMIT 500
98
+ `,
99
+ [String(cappedHours)]
100
+ );
101
+ return {
102
+ rows: rowsQ.rows,
103
+ aggregates: aggQ.rows,
104
+ hours: cappedHours
105
+ };
106
+ }
7
107
  export {
8
108
  getSpreadRangeForSymbols,
9
109
  getSpreadSummary,
@@ -36,311 +36,6 @@ __export(userSettings_exports, {
36
36
  });
37
37
  module.exports = __toCommonJS(userSettings_exports);
38
38
 
39
- // src/aiLanguages.ts
40
- var AI_RESPONSE_LANGUAGE_OPTIONS = [
41
- { label: "English", value: "en", promptName: "English" },
42
- { label: "Chinese", value: "zh", promptName: "Chinese" },
43
- { label: "Hindi", value: "hi", promptName: "Hindi" },
44
- { label: "Spanish", value: "es", promptName: "Spanish" },
45
- { label: "French", value: "fr", promptName: "French" },
46
- { label: "Arabic", value: "ar", promptName: "Arabic" },
47
- { label: "Bengali", value: "bn", promptName: "Bengali" },
48
- { label: "Portuguese", value: "pt", promptName: "Portuguese" },
49
- { label: "Russian", value: "ru", promptName: "Russian" },
50
- { label: "Urdu", value: "ur", promptName: "Urdu" },
51
- { label: "Indonesian", value: "id", promptName: "Indonesian" },
52
- { label: "German", value: "de", promptName: "German" },
53
- { label: "Japanese", value: "ja", promptName: "Japanese" },
54
- { label: "Swahili", value: "sw", promptName: "Swahili" },
55
- { label: "Marathi", value: "mr", promptName: "Marathi" },
56
- { label: "Telugu", value: "te", promptName: "Telugu" },
57
- { label: "Turkish", value: "tr", promptName: "Turkish" },
58
- { label: "Tamil", value: "ta", promptName: "Tamil" },
59
- { label: "Vietnamese", value: "vi", promptName: "Vietnamese" },
60
- { label: "Korean", value: "ko", promptName: "Korean" }
61
- ];
62
- var KNOWN_AI_RESPONSE_LANGUAGES = new Set(
63
- AI_RESPONSE_LANGUAGE_OPTIONS.map((option) => option.value)
64
- );
65
- var DEFAULT_AI_RESPONSE_LANGUAGE = AI_RESPONSE_LANGUAGE_OPTIONS[0].value;
66
- var normalizeAiResponseLanguage = (value) => {
67
- if (typeof value !== "string") {
68
- return DEFAULT_AI_RESPONSE_LANGUAGE;
69
- }
70
- const trimmed = value.trim().toLowerCase();
71
- return KNOWN_AI_RESPONSE_LANGUAGES.has(trimmed) ? trimmed : DEFAULT_AI_RESPONSE_LANGUAGE;
72
- };
73
-
74
- // src/aiEndpoints.ts
75
- var AI_CUSTOM_ENDPOINT_VALUE = "__custom__";
76
- var AI_ENDPOINT_OPTIONS = [
77
- {
78
- label: "OpenAI",
79
- value: "https://api.openai.com/v1"
80
- },
81
- {
82
- label: "Claude",
83
- value: "https://api.anthropic.com/v1"
84
- },
85
- {
86
- label: "OpenRouter",
87
- value: "https://openrouter.ai/api/v1"
88
- },
89
- {
90
- label: "Gemini",
91
- value: "https://generativelanguage.googleapis.com/v1beta/openai"
92
- },
93
- {
94
- label: "Together AI",
95
- value: "https://api.together.xyz/v1"
96
- },
97
- {
98
- label: "Groq",
99
- value: "https://api.groq.com/openai/v1"
100
- },
101
- {
102
- label: "DeepInfra",
103
- value: "https://api.deepinfra.com/v1/openai"
104
- },
105
- {
106
- label: "xAI",
107
- value: "https://api.x.ai/v1"
108
- },
109
- {
110
- label: "Qwen (DashScope Intl)",
111
- value: "https://dashscope-intl.aliyuncs.com/compatible-mode/v1"
112
- },
113
- {
114
- label: "Qwen (DashScope CN)",
115
- value: "https://dashscope.aliyuncs.com/compatible-mode/v1"
116
- },
117
- {
118
- label: "Qwen (DashScope US)",
119
- value: "https://dashscope-us.aliyuncs.com/compatible-mode/v1"
120
- },
121
- {
122
- label: "Perplexity",
123
- value: "https://api.perplexity.ai"
124
- },
125
- {
126
- label: "Fireworks",
127
- value: "https://api.fireworks.ai/inference/v1"
128
- },
129
- {
130
- label: "SambaNova",
131
- value: "https://api.sambanova.ai/v1"
132
- },
133
- {
134
- label: "Hyperbolic",
135
- value: "https://api.hyperbolic.xyz/v1"
136
- },
137
- {
138
- label: "Kimi",
139
- value: "https://api.moonshot.ai/v1"
140
- },
141
- {
142
- label: "ProxyAPI",
143
- value: "https://openai.api.proxyapi.ru/v1"
144
- },
145
- {
146
- label: "Custom",
147
- value: AI_CUSTOM_ENDPOINT_VALUE
148
- }
149
- ];
150
- var KNOWN_AI_ENDPOINTS = new Set(
151
- AI_ENDPOINT_OPTIONS.map((option) => option.value).filter(
152
- (value) => value !== AI_CUSTOM_ENDPOINT_VALUE
153
- )
154
- );
155
- var normalizeUrl = (value) => value.replace(/\/+$/, "");
156
- var isIpv4Address = (value) => /^(?:\d{1,3}\.){3}\d{1,3}$/.test(value.trim());
157
- var parseIpv4Address = (value) => value.trim().split(".").map((part) => Number(part));
158
- var isPrivateIpv4Address = (value) => {
159
- if (!isIpv4Address(value)) {
160
- return false;
161
- }
162
- const [a, b, c, d] = parseIpv4Address(value);
163
- if ([a, b, c, d].some(
164
- (part) => !Number.isInteger(part) || part < 0 || part > 255
165
- )) {
166
- return false;
167
- }
168
- return a === 10 || a === 127 || a === 0 || a === 169 && b === 254 || a === 172 && b >= 16 && b <= 31 || a === 192 && b === 168;
169
- };
170
- var isPrivateHostname = (hostname) => {
171
- const normalized = hostname.trim().toLowerCase();
172
- if (!normalized) {
173
- return true;
174
- }
175
- return normalized === "localhost" || normalized.endsWith(".localhost") || normalized.endsWith(".local") || normalized.endsWith(".internal") || normalized.endsWith(".lan") || normalized === "::1" || normalized === "[::1]" || isPrivateIpv4Address(normalized);
176
- };
177
- var isValidAiEndpointUrl = (value) => {
178
- try {
179
- const url = new URL(value);
180
- return url.protocol === "https:" && !isPrivateHostname(url.hostname);
181
- } catch {
182
- return false;
183
- }
184
- };
185
- var normalizeAiEndpoint = (value) => {
186
- if (typeof value !== "string") {
187
- return "";
188
- }
189
- const trimmed = normalizeUrl(value.trim());
190
- if (!trimmed) {
191
- return "";
192
- }
193
- if (KNOWN_AI_ENDPOINTS.has(trimmed)) {
194
- return trimmed;
195
- }
196
- return isValidAiEndpointUrl(trimmed) ? trimmed : "";
197
- };
198
-
199
- // src/aiModels.ts
200
- var OPENAI_ENDPOINT = "https://api.openai.com/v1";
201
- var ANTHROPIC_ENDPOINT = "https://api.anthropic.com/v1";
202
- var OPENROUTER_ENDPOINT = "https://openrouter.ai/api/v1";
203
- var GEMINI_ENDPOINT = "https://generativelanguage.googleapis.com/v1beta/openai";
204
- var TOGETHER_ENDPOINT = "https://api.together.xyz/v1";
205
- var GROQ_ENDPOINT = "https://api.groq.com/openai/v1";
206
- var XAI_ENDPOINT = "https://api.x.ai/v1";
207
- var QWEN_INTL_ENDPOINT = "https://dashscope-intl.aliyuncs.com/compatible-mode/v1";
208
- var QWEN_CN_ENDPOINT = "https://dashscope.aliyuncs.com/compatible-mode/v1";
209
- var QWEN_US_ENDPOINT = "https://dashscope-us.aliyuncs.com/compatible-mode/v1";
210
- var PERPLEXITY_ENDPOINT = "https://api.perplexity.ai";
211
- var KIMI_ENDPOINT = "https://api.moonshot.ai/v1";
212
- var PROXY_API_ENDPOINT = "https://openai.api.proxyapi.ru/v1";
213
- var AI_MODEL_OPTIONS_BY_ENDPOINT = {
214
- [OPENAI_ENDPOINT]: [
215
- { label: "GPT-5 mini", value: "gpt-5-mini" },
216
- { label: "GPT-5", value: "gpt-5" },
217
- { label: "GPT-5.2", value: "gpt-5.2" },
218
- { label: "GPT-4.1", value: "gpt-4.1" },
219
- { label: "GPT-4o", value: "gpt-4o" }
220
- ],
221
- [ANTHROPIC_ENDPOINT]: [
222
- { label: "Claude Sonnet 4", value: "claude-sonnet-4-20250514" },
223
- { label: "Claude Opus 4.1", value: "claude-opus-4-1-20250805" },
224
- { label: "Claude Opus 4", value: "claude-opus-4-20250514" },
225
- { label: "Claude 3.7 Sonnet", value: "claude-3-7-sonnet-20250219" },
226
- { label: "Claude 3.5 Haiku", value: "claude-3-5-haiku-20241022" }
227
- ],
228
- [OPENROUTER_ENDPOINT]: [
229
- { label: "OpenAI GPT-5", value: "openai/gpt-5" },
230
- { label: "Anthropic Claude Sonnet 4", value: "anthropic/claude-sonnet-4" },
231
- { label: "Google Gemini 2.5 Pro", value: "google/gemini-2.5-pro" },
232
- { label: "OpenAI GPT-5 mini", value: "openai/gpt-5-mini" },
233
- {
234
- label: "DeepSeek V3.1",
235
- value: "deepseek/deepseek-chat-v3.1"
236
- }
237
- ],
238
- [GEMINI_ENDPOINT]: [
239
- { label: "Gemini 2.5 Pro", value: "gemini-2.5-pro" },
240
- { label: "Gemini 2.5 Flash", value: "gemini-2.5-flash" },
241
- { label: "Gemini 2.5 Flash-Lite", value: "gemini-2.5-flash-lite" },
242
- { label: "Gemini 2.0 Flash", value: "gemini-2.0-flash" },
243
- { label: "Gemini 2.0 Flash-Lite", value: "gemini-2.0-flash-lite" }
244
- ],
245
- [TOGETHER_ENDPOINT]: [
246
- { label: "DeepSeek V3.1", value: "deepseek-ai/DeepSeek-V3.1" },
247
- {
248
- label: "Qwen3 Coder 480B",
249
- value: "Qwen/Qwen3-Coder-480B-A35B-Instruct-FP8"
250
- },
251
- {
252
- label: "Llama 4 Maverick",
253
- value: "meta-llama/Llama-4-Maverick-17B-128E-Instruct-FP8"
254
- },
255
- { label: "DeepSeek V3", value: "deepseek-ai/DeepSeek-V3" },
256
- {
257
- label: "Llama 3.3 70B Turbo",
258
- value: "meta-llama/Llama-3.3-70B-Instruct-Turbo"
259
- }
260
- ],
261
- [GROQ_ENDPOINT]: [
262
- { label: "GPT-OSS 120B", value: "openai/gpt-oss-120b" },
263
- {
264
- label: "Llama 4 Scout",
265
- value: "meta-llama/llama-4-scout-17b-16e-instruct"
266
- },
267
- { label: "Qwen3 32B", value: "qwen/qwen3-32b" },
268
- { label: "Llama 3.3 70B", value: "llama-3.3-70b-versatile" },
269
- { label: "Llama 3.1 8B Instant", value: "llama-3.1-8b-instant" }
270
- ],
271
- [XAI_ENDPOINT]: [
272
- { label: "Grok 4 Fast Reasoning", value: "grok-4-fast-reasoning" },
273
- { label: "Grok 4 Fast Non-Reasoning", value: "grok-4-fast-non-reasoning" },
274
- { label: "Grok Code Fast 1", value: "grok-code-fast-1" },
275
- { label: "Grok 4", value: "grok-4-0709" },
276
- { label: "Grok 3 Mini", value: "grok-3-mini" }
277
- ],
278
- [QWEN_INTL_ENDPOINT]: [
279
- { label: "Qwen Plus Latest", value: "qwen-plus-latest" },
280
- { label: "Qwen Turbo Latest", value: "qwen-turbo-latest" },
281
- { label: "Qwen Max Latest", value: "qwen-max-latest" },
282
- { label: "Qwen3 Coder Plus", value: "qwen3-coder-plus" },
283
- { label: "Qwen3 Coder Next", value: "qwen3-coder-next" }
284
- ],
285
- [QWEN_CN_ENDPOINT]: [
286
- { label: "Qwen Plus Latest", value: "qwen-plus-latest" },
287
- { label: "Qwen Turbo Latest", value: "qwen-turbo-latest" },
288
- { label: "Qwen Max Latest", value: "qwen-max-latest" },
289
- { label: "Qwen3 Coder Plus", value: "qwen3-coder-plus" },
290
- { label: "Qwen3 Coder Next", value: "qwen3-coder-next" }
291
- ],
292
- [QWEN_US_ENDPOINT]: [
293
- { label: "Qwen Plus Latest", value: "qwen-plus-latest" },
294
- { label: "Qwen Turbo Latest", value: "qwen-turbo-latest" },
295
- { label: "Qwen Max Latest", value: "qwen-max-latest" },
296
- { label: "Qwen3 Coder Plus", value: "qwen3-coder-plus" },
297
- { label: "Qwen3 Coder Next", value: "qwen3-coder-next" }
298
- ],
299
- [PERPLEXITY_ENDPOINT]: [
300
- { label: "Sonar Pro", value: "sonar-pro" },
301
- { label: "Sonar", value: "sonar" },
302
- { label: "Sonar Reasoning Pro", value: "sonar-reasoning-pro" },
303
- { label: "Sonar Deep Research", value: "sonar-deep-research" }
304
- ],
305
- [KIMI_ENDPOINT]: [
306
- { label: "Kimi K2.5", value: "kimi-k2.5" },
307
- { label: "Kimi K2 Thinking", value: "kimi-k2-thinking" },
308
- { label: "Kimi K2 Turbo Preview", value: "kimi-k2-turbo-preview" },
309
- { label: "Kimi K2 0905 Preview", value: "kimi-k2-0905-preview" },
310
- { label: "Kimi K2", value: "kimi-k2" }
311
- ],
312
- [PROXY_API_ENDPOINT]: [
313
- {
314
- label: "Anthropic Claude Sonnet 4",
315
- value: "anthropic/claude-sonnet-4-20250514"
316
- },
317
- { label: "Gemini 2.5 Flash", value: "gemini/gemini-2.5-flash" },
318
- { label: "OpenAI GPT-5 mini", value: "openai/gpt-5-mini" },
319
- { label: "OpenAI GPT-4o", value: "openai/gpt-4o" },
320
- {
321
- label: "OpenRouter DeepSeek Chat V3.1",
322
- value: "openrouter/deepseek/deepseek-chat-v3.1"
323
- }
324
- ]
325
- };
326
- var DEFAULT_AI_MODEL_BY_ENDPOINT = Object.fromEntries(
327
- Object.entries(AI_MODEL_OPTIONS_BY_ENDPOINT).map(([endpoint, options]) => [
328
- endpoint,
329
- options[0]?.value ?? ""
330
- ])
331
- );
332
- var normalizeModel = (value) => value.trim();
333
- var getDefaultAiModelForEndpoint = (endpoint) => DEFAULT_AI_MODEL_BY_ENDPOINT[endpoint] ?? "";
334
- var normalizeAiModel = (value, endpoint) => {
335
- if (typeof value === "string") {
336
- const trimmed = normalizeModel(value);
337
- if (trimmed) {
338
- return trimmed;
339
- }
340
- }
341
- return getDefaultAiModelForEndpoint(endpoint);
342
- };
343
-
344
39
  // src/redis.ts
345
40
  var import_ioredis = __toESM(require("ioredis"));
346
41
  var TTL_1D = 86400;
@@ -620,9 +315,6 @@ var getUserRecord = async (userName) => {
620
315
  };
621
316
  var getUserSettings = async (userName) => {
622
317
  const record = await getUserRecord(userName);
623
- const aiApiEndpoint = normalizeAiEndpoint(
624
- readUserString(record, "AI_API_ENDPOINT")
625
- );
626
318
  return {
627
319
  userName,
628
320
  BYBIT_API_KEY: readUserString(record, "BYBIT_API_KEY"),
@@ -630,14 +322,9 @@ var getUserSettings = async (userName) => {
630
322
  COINALYZE_API_KEY: readUserString(record, "COINALYZE_API_KEY"),
631
323
  COINMARKETCAP_API_KEY: readUserString(record, "COINMARKETCAP_API_KEY"),
632
324
  AI_API_KEY: readUserString(record, "AI_API_KEY"),
633
- AI_API_ENDPOINT: aiApiEndpoint,
634
- AI_MODEL: normalizeAiModel(
635
- readUserString(record, "AI_MODEL"),
636
- aiApiEndpoint
637
- ),
638
- AI_RESPONSE_LANGUAGE: normalizeAiResponseLanguage(
639
- readUserString(record, "AI_RESPONSE_LANGUAGE")
640
- ) || DEFAULT_AI_RESPONSE_LANGUAGE,
325
+ AI_API_ENDPOINT: readUserString(record, "AI_API_ENDPOINT"),
326
+ AI_MODEL: readUserString(record, "AI_MODEL"),
327
+ AI_RESPONSE_LANGUAGE: readUserString(record, "AI_RESPONSE_LANGUAGE"),
641
328
  TG_BOT_TOKEN: readUserString(record, "TG_BOT_TOKEN"),
642
329
  TG_CHAT_ID: readUserString(record, "TG_CHAT_ID")
643
330
  };
@@ -3,16 +3,6 @@ import {
3
3
  redisKeys,
4
4
  setData
5
5
  } from "./chunk-6ZKAUA4Q.mjs";
6
- import {
7
- DEFAULT_AI_RESPONSE_LANGUAGE,
8
- normalizeAiResponseLanguage
9
- } from "./chunk-CCC7DX2T.mjs";
10
- import {
11
- normalizeAiModel
12
- } from "./chunk-DTCLZIBM.mjs";
13
- import {
14
- normalizeAiEndpoint
15
- } from "./chunk-XQ3YBULV.mjs";
16
6
 
17
7
  // src/userSettings.ts
18
8
  var readString = (value) => typeof value === "string" ? value.trim() : "";
@@ -26,9 +16,6 @@ var getUserRecord = async (userName) => {
26
16
  };
27
17
  var getUserSettings = async (userName) => {
28
18
  const record = await getUserRecord(userName);
29
- const aiApiEndpoint = normalizeAiEndpoint(
30
- readUserString(record, "AI_API_ENDPOINT")
31
- );
32
19
  return {
33
20
  userName,
34
21
  BYBIT_API_KEY: readUserString(record, "BYBIT_API_KEY"),
@@ -36,14 +23,9 @@ var getUserSettings = async (userName) => {
36
23
  COINALYZE_API_KEY: readUserString(record, "COINALYZE_API_KEY"),
37
24
  COINMARKETCAP_API_KEY: readUserString(record, "COINMARKETCAP_API_KEY"),
38
25
  AI_API_KEY: readUserString(record, "AI_API_KEY"),
39
- AI_API_ENDPOINT: aiApiEndpoint,
40
- AI_MODEL: normalizeAiModel(
41
- readUserString(record, "AI_MODEL"),
42
- aiApiEndpoint
43
- ),
44
- AI_RESPONSE_LANGUAGE: normalizeAiResponseLanguage(
45
- readUserString(record, "AI_RESPONSE_LANGUAGE")
46
- ) || DEFAULT_AI_RESPONSE_LANGUAGE,
26
+ AI_API_ENDPOINT: readUserString(record, "AI_API_ENDPOINT"),
27
+ AI_MODEL: readUserString(record, "AI_MODEL"),
28
+ AI_RESPONSE_LANGUAGE: readUserString(record, "AI_RESPONSE_LANGUAGE"),
47
29
  TG_BOT_TOKEN: readUserString(record, "TG_BOT_TOKEN"),
48
30
  TG_CHAT_ID: readUserString(record, "TG_CHAT_ID")
49
31
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tradejs/infra",
3
- "version": "2.0.21",
3
+ "version": "3.0.1",
4
4
  "description": "MIT-licensed server infrastructure adapters for TradeJS: Redis, Timescale, ML, logging, and IO.",
5
5
  "keywords": [
6
6
  "tradejs",
@@ -29,21 +29,6 @@
29
29
  "import": "./dist/ai.mjs",
30
30
  "require": "./dist/ai.js"
31
31
  },
32
- "./aiEndpoints": {
33
- "types": "./dist/aiEndpoints.d.ts",
34
- "import": "./dist/aiEndpoints.mjs",
35
- "require": "./dist/aiEndpoints.js"
36
- },
37
- "./aiLanguages": {
38
- "types": "./dist/aiLanguages.d.ts",
39
- "import": "./dist/aiLanguages.mjs",
40
- "require": "./dist/aiLanguages.js"
41
- },
42
- "./aiModels": {
43
- "types": "./dist/aiModels.d.ts",
44
- "import": "./dist/aiModels.mjs",
45
- "require": "./dist/aiModels.js"
46
- },
47
32
  "./backtestArtifacts": {
48
33
  "types": "./dist/backtestArtifacts.d.ts",
49
34
  "import": "./dist/backtestArtifacts.mjs",
@@ -99,11 +84,6 @@
99
84
  "import": "./dist/userSettings.mjs",
100
85
  "require": "./dist/userSettings.js"
101
86
  },
102
- "./timescale": {
103
- "types": "./dist/timescale.d.ts",
104
- "import": "./dist/timescale.mjs",
105
- "require": "./dist/timescale.js"
106
- },
107
87
  "./timescale/client": {
108
88
  "types": "./dist/timescale/client.d.ts",
109
89
  "import": "./dist/timescale/client.mjs",
@@ -143,7 +123,7 @@
143
123
  "dependencies": {
144
124
  "@grpc/grpc-js": "^1.14.4",
145
125
  "@grpc/proto-loader": "^0.8.1",
146
- "@tradejs/types": "^2.0.21",
126
+ "@tradejs/types": "^3.0.1",
147
127
  "chalk": "4.1.2",
148
128
  "date-fns": "^3.6.0",
149
129
  "ioredis": "5.11.1",
@@ -1,10 +0,0 @@
1
- type AiEndpointOption = {
2
- label: string;
3
- value: string;
4
- };
5
- declare const AI_CUSTOM_ENDPOINT_VALUE = "__custom__";
6
- declare const AI_ENDPOINT_OPTIONS: AiEndpointOption[];
7
- declare const normalizeAiEndpoint: (value: unknown) => string;
8
- declare const isKnownAiEndpoint: (value: unknown) => value is string;
9
-
10
- export { AI_CUSTOM_ENDPOINT_VALUE, AI_ENDPOINT_OPTIONS, type AiEndpointOption, isKnownAiEndpoint, normalizeAiEndpoint };
@@ -1,10 +0,0 @@
1
- type AiEndpointOption = {
2
- label: string;
3
- value: string;
4
- };
5
- declare const AI_CUSTOM_ENDPOINT_VALUE = "__custom__";
6
- declare const AI_ENDPOINT_OPTIONS: AiEndpointOption[];
7
- declare const normalizeAiEndpoint: (value: unknown) => string;
8
- declare const isKnownAiEndpoint: (value: unknown) => value is string;
9
-
10
- export { AI_CUSTOM_ENDPOINT_VALUE, AI_ENDPOINT_OPTIONS, type AiEndpointOption, isKnownAiEndpoint, normalizeAiEndpoint };