@tradejs/node 3.0.1 → 3.1.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.
- package/README.md +4 -0
- package/dist/ai.d.mts +26 -4
- package/dist/ai.d.ts +26 -4
- package/dist/ai.js +162 -165
- package/dist/ai.mjs +4 -1
- package/dist/backtest.js +515 -188
- package/dist/backtest.mjs +6 -4
- package/dist/chunk-3TWULKHV.mjs +595 -0
- package/dist/chunk-FB5NUEOQ.mjs +295 -0
- package/dist/chunk-LAJ7NA3Q.mjs +377 -0
- package/dist/{chunk-VRXU4E4O.mjs → chunk-SEQJ6V6B.mjs} +165 -446
- package/dist/{chunk-OGAWBO3Z.mjs → chunk-W26Y6IRP.mjs} +22 -3
- package/dist/chunk-XN7BC7XK.mjs +295 -0
- package/dist/cli.js +152 -161
- package/dist/cli.mjs +4 -2
- package/dist/connectors.d.mts +5 -2
- package/dist/connectors.d.ts +5 -2
- package/dist/connectors.js +329 -8
- package/dist/connectors.mjs +5 -1
- package/dist/registry-DHTLjQcr.d.mts +17 -0
- package/dist/registry-DHTLjQcr.d.ts +17 -0
- package/dist/registry.d.mts +2 -15
- package/dist/registry.d.ts +2 -15
- package/dist/registry.js +176 -161
- package/dist/registry.mjs +5 -2
- package/dist/runtimeDashboard.d.mts +12 -0
- package/dist/runtimeDashboard.d.ts +12 -0
- package/dist/runtimeDashboard.js +8502 -0
- package/dist/runtimeDashboard.mjs +1000 -0
- package/dist/runtimeStrategies.d.mts +38 -0
- package/dist/runtimeStrategies.d.ts +38 -0
- package/dist/runtimeStrategies.js +798 -0
- package/dist/runtimeStrategies.mjs +264 -0
- package/dist/runtimeTrades.d.mts +31 -0
- package/dist/runtimeTrades.d.ts +31 -0
- package/dist/runtimeTrades.js +321 -0
- package/dist/runtimeTrades.mjs +11 -0
- package/dist/strategies.d.mts +2 -2
- package/dist/strategies.d.ts +2 -2
- package/dist/strategies.js +194 -165
- package/dist/strategies.mjs +24 -379
- package/package.json +27 -6
- package/dist/chunk-V3YMKE4I.mjs +0 -271
package/dist/registry.js
CHANGED
|
@@ -36,6 +36,7 @@ __export(registry_exports, {
|
|
|
36
36
|
getRegisteredManifests: () => getRegisteredManifests,
|
|
37
37
|
getRegisteredStrategies: () => getRegisteredStrategies,
|
|
38
38
|
getStrategyCreator: () => getStrategyCreator,
|
|
39
|
+
getStrategyDefaults: () => getStrategyDefaults,
|
|
39
40
|
getStrategyManifest: () => getStrategyManifest,
|
|
40
41
|
isKnownStrategy: () => isKnownStrategy,
|
|
41
42
|
registerStrategyEntries: () => registerStrategyEntries,
|
|
@@ -55,11 +56,8 @@ var import_constants3 = require("@tradejs/core/constants");
|
|
|
55
56
|
var import_ml2 = require("@tradejs/infra/ml");
|
|
56
57
|
|
|
57
58
|
// src/ai.ts
|
|
58
|
-
var
|
|
59
|
-
var import_aiEndpoints = require("@tradejs/core/aiEndpoints");
|
|
60
|
-
var import_aiModels = require("@tradejs/core/aiModels");
|
|
59
|
+
var import_aiLanguages2 = require("@tradejs/core/aiLanguages");
|
|
61
60
|
var import_redis = require("@tradejs/infra/redis");
|
|
62
|
-
var import_userSettings = require("@tradejs/infra/userSettings");
|
|
63
61
|
|
|
64
62
|
// src/aiShared.ts
|
|
65
63
|
var MAX_AI_SERIES_POINTS = 5;
|
|
@@ -932,6 +930,7 @@ var createStrategyRegistryState = () => ({
|
|
|
932
930
|
strategyCreators: /* @__PURE__ */ new Map(),
|
|
933
931
|
strategyManifestsMap: /* @__PURE__ */ new Map(),
|
|
934
932
|
strategyEntriesMap: /* @__PURE__ */ new Map(),
|
|
933
|
+
strategySourcesMap: /* @__PURE__ */ new Map(),
|
|
935
934
|
pluginsLoadPromise: null
|
|
936
935
|
});
|
|
937
936
|
var registryStateByProjectRoot = sharedStrategyRegistry.registryStateByProjectRoot;
|
|
@@ -1002,6 +1001,7 @@ var registerEntries = (entries, source, state) => {
|
|
|
1002
1001
|
}
|
|
1003
1002
|
state.strategyManifestsMap.set(strategyName, entry.manifest);
|
|
1004
1003
|
state.strategyEntriesMap.set(strategyName, entry);
|
|
1004
|
+
state.strategySourcesMap.set(strategyName, source);
|
|
1005
1005
|
materializeStrategyCreator(strategyName, state);
|
|
1006
1006
|
}
|
|
1007
1007
|
};
|
|
@@ -1119,6 +1119,11 @@ var getStrategyCreator = async (name, cwd = getTradejsProjectCwd()) => {
|
|
|
1119
1119
|
const { state } = getStrategyRegistryState(cwd);
|
|
1120
1120
|
return state.strategyCreators.get(name);
|
|
1121
1121
|
};
|
|
1122
|
+
var getStrategyDefaults = async (name, cwd = getTradejsProjectCwd()) => {
|
|
1123
|
+
await ensureStrategyPluginsLoaded(cwd);
|
|
1124
|
+
const { state } = getStrategyRegistryState(cwd);
|
|
1125
|
+
return state.strategyEntriesMap.get(name)?.defaults;
|
|
1126
|
+
};
|
|
1122
1127
|
var getAvailableStrategyNames = async (cwd = getTradejsProjectCwd()) => {
|
|
1123
1128
|
await ensureStrategyPluginsLoaded(cwd);
|
|
1124
1129
|
const { state } = getStrategyRegistryState(cwd);
|
|
@@ -1301,6 +1306,139 @@ var postProcessLocalAiAnalysisByStrategy = (signal, analysis, payload = buildAiP
|
|
|
1301
1306
|
}) ?? strategyAnalysis;
|
|
1302
1307
|
};
|
|
1303
1308
|
|
|
1309
|
+
// src/aiProvider.ts
|
|
1310
|
+
var import_aiEndpoints = require("@tradejs/core/aiEndpoints");
|
|
1311
|
+
var import_aiModels = require("@tradejs/core/aiModels");
|
|
1312
|
+
var import_aiLanguages = require("@tradejs/core/aiLanguages");
|
|
1313
|
+
var import_userSettings = require("@tradejs/infra/userSettings");
|
|
1314
|
+
var DEFAULT_AI_MODEL = "openai/gpt-5-mini";
|
|
1315
|
+
var userSettingsCache = /* @__PURE__ */ new Map();
|
|
1316
|
+
var aiModelCache = /* @__PURE__ */ new Map();
|
|
1317
|
+
var normalizeResponseContent = (content) => {
|
|
1318
|
+
if (typeof content === "string") return content;
|
|
1319
|
+
if (content && typeof content === "object" && !Array.isArray(content)) {
|
|
1320
|
+
return content;
|
|
1321
|
+
}
|
|
1322
|
+
if (Array.isArray(content)) {
|
|
1323
|
+
return content.map(
|
|
1324
|
+
(part) => typeof part?.text === "string" ? part.text : ""
|
|
1325
|
+
).join("\n").trim();
|
|
1326
|
+
}
|
|
1327
|
+
return String(content ?? "");
|
|
1328
|
+
};
|
|
1329
|
+
var getAiInvocationError = (error) => {
|
|
1330
|
+
const details = error instanceof Error && error.message.trim() ? error.message.trim() : String(error);
|
|
1331
|
+
const isEmptyCompletion = error instanceof TypeError && /Cannot read properties of undefined \(reading ['"]message['"]\)/.test(
|
|
1332
|
+
details
|
|
1333
|
+
);
|
|
1334
|
+
const wrapped = new Error(
|
|
1335
|
+
isEmptyCompletion ? "AI provider returned an empty chat completion" : `AI model invocation failed: ${details}`
|
|
1336
|
+
);
|
|
1337
|
+
wrapped.cause = error;
|
|
1338
|
+
return wrapped;
|
|
1339
|
+
};
|
|
1340
|
+
var isEmptyResponseContent = (content) => typeof content === "string" ? content.trim().length === 0 : Object.keys(content).length === 0;
|
|
1341
|
+
var getAiModelCacheKey = (userName, modelName, temperature) => `${userName}::${modelName}::${temperature}`;
|
|
1342
|
+
var resolveAiModelName = (settings, requestedModelName) => {
|
|
1343
|
+
const explicitModelName = requestedModelName?.trim() ?? "";
|
|
1344
|
+
if (explicitModelName) return explicitModelName;
|
|
1345
|
+
return settings.AI_MODEL?.trim() || DEFAULT_AI_MODEL;
|
|
1346
|
+
};
|
|
1347
|
+
var getOpenRouterModelKwargs = (apiEndpoint) => {
|
|
1348
|
+
const endpoint = String(apiEndpoint ?? "").trim();
|
|
1349
|
+
if (!endpoint) return {};
|
|
1350
|
+
let hostname = "";
|
|
1351
|
+
try {
|
|
1352
|
+
hostname = new URL(endpoint).hostname;
|
|
1353
|
+
} catch {
|
|
1354
|
+
hostname = endpoint;
|
|
1355
|
+
}
|
|
1356
|
+
return hostname.toLowerCase().includes("openrouter") ? { provider: { ignore: ["azure"] } } : {};
|
|
1357
|
+
};
|
|
1358
|
+
var getAiUserSettings = async (userName = "root") => {
|
|
1359
|
+
let settingsPromise = userSettingsCache.get(userName);
|
|
1360
|
+
if (!settingsPromise) {
|
|
1361
|
+
settingsPromise = (0, import_userSettings.getUserSettings)(userName).then((settings2) => {
|
|
1362
|
+
const endpoint = (0, import_aiEndpoints.normalizeAiEndpoint)(settings2.AI_API_ENDPOINT);
|
|
1363
|
+
return {
|
|
1364
|
+
...settings2,
|
|
1365
|
+
AI_API_ENDPOINT: endpoint,
|
|
1366
|
+
AI_MODEL: (0, import_aiModels.normalizeAiModel)(settings2.AI_MODEL, endpoint),
|
|
1367
|
+
AI_RESPONSE_LANGUAGE: (0, import_aiLanguages.normalizeAiResponseLanguage)(
|
|
1368
|
+
settings2.AI_RESPONSE_LANGUAGE
|
|
1369
|
+
)
|
|
1370
|
+
};
|
|
1371
|
+
});
|
|
1372
|
+
settingsPromise.catch(() => userSettingsCache.delete(userName));
|
|
1373
|
+
userSettingsCache.set(userName, settingsPromise);
|
|
1374
|
+
}
|
|
1375
|
+
const settings = await settingsPromise;
|
|
1376
|
+
if (!settings.AI_API_KEY || !settings.AI_API_ENDPOINT) {
|
|
1377
|
+
throw new Error(`AI settings are incomplete for user ${userName}`);
|
|
1378
|
+
}
|
|
1379
|
+
return settings;
|
|
1380
|
+
};
|
|
1381
|
+
var getAiModel = async (userName = "root", requestedModelName, temperature = 0.2) => {
|
|
1382
|
+
const settings = await getAiUserSettings(userName);
|
|
1383
|
+
const modelName = resolveAiModelName(settings, requestedModelName);
|
|
1384
|
+
const cacheKey = getAiModelCacheKey(userName, modelName, temperature);
|
|
1385
|
+
let modelPromise = aiModelCache.get(cacheKey);
|
|
1386
|
+
if (!modelPromise) {
|
|
1387
|
+
modelPromise = import("@langchain/openai").then(({ ChatOpenAI }) => {
|
|
1388
|
+
const modelKwargs = getOpenRouterModelKwargs(settings.AI_API_ENDPOINT);
|
|
1389
|
+
return new ChatOpenAI({
|
|
1390
|
+
temperature,
|
|
1391
|
+
modelName,
|
|
1392
|
+
apiKey: settings.AI_API_KEY,
|
|
1393
|
+
...Object.keys(modelKwargs).length ? { modelKwargs } : {},
|
|
1394
|
+
configuration: {
|
|
1395
|
+
baseURL: settings.AI_API_ENDPOINT,
|
|
1396
|
+
defaultHeaders: {
|
|
1397
|
+
"HTTP-Referer": "https://tradejs.dev",
|
|
1398
|
+
"X-Title": "Inv"
|
|
1399
|
+
}
|
|
1400
|
+
}
|
|
1401
|
+
});
|
|
1402
|
+
});
|
|
1403
|
+
modelPromise.catch(() => aiModelCache.delete(cacheKey));
|
|
1404
|
+
aiModelCache.set(cacheKey, modelPromise);
|
|
1405
|
+
}
|
|
1406
|
+
try {
|
|
1407
|
+
return await modelPromise;
|
|
1408
|
+
} catch (error) {
|
|
1409
|
+
aiModelCache.delete(cacheKey);
|
|
1410
|
+
userSettingsCache.delete(userName);
|
|
1411
|
+
throw error;
|
|
1412
|
+
}
|
|
1413
|
+
};
|
|
1414
|
+
var invokeAiChatWithUserMessageEncoding = async ({
|
|
1415
|
+
messages,
|
|
1416
|
+
userName = "root",
|
|
1417
|
+
model,
|
|
1418
|
+
temperature = 0.2
|
|
1419
|
+
}, resolveUserMessageEncoding) => {
|
|
1420
|
+
const [{ HumanMessage, SystemMessage }, aiModel] = await Promise.all([
|
|
1421
|
+
import("@langchain/core/messages"),
|
|
1422
|
+
getAiModel(userName, model, temperature)
|
|
1423
|
+
]);
|
|
1424
|
+
const providerMessages = messages.map(
|
|
1425
|
+
(message) => message.role === "system" ? new SystemMessage(message.content) : new HumanMessage(
|
|
1426
|
+
resolveUserMessageEncoding(message) === "text-block" ? { content: [{ type: "text", text: message.content }] } : message.content
|
|
1427
|
+
)
|
|
1428
|
+
);
|
|
1429
|
+
try {
|
|
1430
|
+
const response = await aiModel.invoke(providerMessages);
|
|
1431
|
+
const content = normalizeResponseContent(response?.content);
|
|
1432
|
+
if (isEmptyResponseContent(content)) {
|
|
1433
|
+
throw new Error("AI provider returned an empty chat completion");
|
|
1434
|
+
}
|
|
1435
|
+
return { content };
|
|
1436
|
+
} catch (error) {
|
|
1437
|
+
throw getAiInvocationError(error);
|
|
1438
|
+
}
|
|
1439
|
+
};
|
|
1440
|
+
var invokeAiPromptChat = (options) => invokeAiChatWithUserMessageEncoding(options, () => "text-block");
|
|
1441
|
+
|
|
1304
1442
|
// src/ai.ts
|
|
1305
1443
|
var parseAIResponse = (input) => {
|
|
1306
1444
|
try {
|
|
@@ -1314,18 +1452,6 @@ var parseAIResponse = (input) => {
|
|
|
1314
1452
|
return {};
|
|
1315
1453
|
}
|
|
1316
1454
|
};
|
|
1317
|
-
var normalizeResponseContent = (content) => {
|
|
1318
|
-
if (typeof content === "string" || content && typeof content === "object") {
|
|
1319
|
-
if (typeof content !== "object" || !Array.isArray(content)) {
|
|
1320
|
-
return content;
|
|
1321
|
-
}
|
|
1322
|
-
}
|
|
1323
|
-
if (Array.isArray(content)) {
|
|
1324
|
-
const text = content.map((part) => typeof part?.text === "string" ? part.text : "").join("\n").trim();
|
|
1325
|
-
return text;
|
|
1326
|
-
}
|
|
1327
|
-
return String(content ?? "");
|
|
1328
|
-
};
|
|
1329
1455
|
var normalizeAnalysis = (raw) => {
|
|
1330
1456
|
const direction = raw?.direction === "LONG" || raw?.direction === "SHORT" ? raw.direction : null;
|
|
1331
1457
|
const qualityNum = typeof raw?.quality === "number" ? Math.max(1, Math.min(5, Math.round(raw.quality))) : void 0;
|
|
@@ -1559,153 +1685,24 @@ Trade payload:
|
|
|
1559
1685
|
${JSON.stringify(payload)}
|
|
1560
1686
|
${buildAiHumanPromptAddonByStrategy(signal, payload)}
|
|
1561
1687
|
`;
|
|
1562
|
-
var getAiInvocationError = (error) => {
|
|
1563
|
-
const details = error instanceof Error && error.message.trim() ? error.message.trim() : String(error);
|
|
1564
|
-
const isEmptyCompletion = error instanceof TypeError && /Cannot read properties of undefined \(reading ['"]message['"]\)/.test(
|
|
1565
|
-
details
|
|
1566
|
-
);
|
|
1567
|
-
const wrapped = new Error(
|
|
1568
|
-
isEmptyCompletion ? "AI provider returned an empty chat completion" : `AI model invocation failed: ${details}`
|
|
1569
|
-
);
|
|
1570
|
-
wrapped.cause = error;
|
|
1571
|
-
return wrapped;
|
|
1572
|
-
};
|
|
1573
|
-
var isEmptyResponseContent = (content) => typeof content === "string" ? content.trim().length === 0 : Object.keys(content).length === 0;
|
|
1574
|
-
var DEFAULT_AI_MODEL = "openai/gpt-5-mini";
|
|
1575
|
-
var userSettingsCache = /* @__PURE__ */ new Map();
|
|
1576
|
-
var aiModelCache = /* @__PURE__ */ new Map();
|
|
1577
|
-
var getAiModelCacheKey = (userName, modelName) => `${userName}::${modelName}`;
|
|
1578
|
-
var resolveAiModelName = (settings, requestedModelName) => {
|
|
1579
|
-
const explicitModelName = typeof requestedModelName === "string" ? requestedModelName.trim() : "";
|
|
1580
|
-
if (explicitModelName) {
|
|
1581
|
-
return explicitModelName;
|
|
1582
|
-
}
|
|
1583
|
-
const settingsModelName = typeof settings.AI_MODEL === "string" ? settings.AI_MODEL.trim() : "";
|
|
1584
|
-
return settingsModelName || DEFAULT_AI_MODEL;
|
|
1585
|
-
};
|
|
1586
|
-
var getOpenRouterModelKwargs = (apiEndpoint) => {
|
|
1587
|
-
const endpoint = String(apiEndpoint ?? "").trim();
|
|
1588
|
-
if (!endpoint) {
|
|
1589
|
-
return {};
|
|
1590
|
-
}
|
|
1591
|
-
let hostname = "";
|
|
1592
|
-
try {
|
|
1593
|
-
hostname = new URL(endpoint).hostname;
|
|
1594
|
-
} catch {
|
|
1595
|
-
hostname = endpoint;
|
|
1596
|
-
}
|
|
1597
|
-
if (!hostname.toLowerCase().includes("openrouter")) {
|
|
1598
|
-
return {};
|
|
1599
|
-
}
|
|
1600
|
-
return {
|
|
1601
|
-
provider: {
|
|
1602
|
-
ignore: ["azure"]
|
|
1603
|
-
}
|
|
1604
|
-
};
|
|
1605
|
-
};
|
|
1606
|
-
var getAiSettings = async (userName = "root") => {
|
|
1607
|
-
let settingsPromise = userSettingsCache.get(userName);
|
|
1608
|
-
if (!settingsPromise) {
|
|
1609
|
-
settingsPromise = (0, import_userSettings.getUserSettings)(userName).then((settings2) => {
|
|
1610
|
-
const endpoint = (0, import_aiEndpoints.normalizeAiEndpoint)(settings2.AI_API_ENDPOINT);
|
|
1611
|
-
return {
|
|
1612
|
-
...settings2,
|
|
1613
|
-
AI_API_ENDPOINT: endpoint,
|
|
1614
|
-
AI_MODEL: (0, import_aiModels.normalizeAiModel)(settings2.AI_MODEL, endpoint),
|
|
1615
|
-
AI_RESPONSE_LANGUAGE: (0, import_aiLanguages.normalizeAiResponseLanguage)(
|
|
1616
|
-
settings2.AI_RESPONSE_LANGUAGE
|
|
1617
|
-
)
|
|
1618
|
-
};
|
|
1619
|
-
});
|
|
1620
|
-
settingsPromise.catch(() => {
|
|
1621
|
-
userSettingsCache.delete(userName);
|
|
1622
|
-
});
|
|
1623
|
-
userSettingsCache.set(userName, settingsPromise);
|
|
1624
|
-
}
|
|
1625
|
-
const settings = await settingsPromise;
|
|
1626
|
-
if (!settings.AI_API_KEY || !settings.AI_API_ENDPOINT) {
|
|
1627
|
-
throw new Error(`AI settings are incomplete for user ${userName}`);
|
|
1628
|
-
}
|
|
1629
|
-
return settings;
|
|
1630
|
-
};
|
|
1631
|
-
var createAiModel = async (userName = "root", requestedModelName) => {
|
|
1632
|
-
const settings = await getAiSettings(userName);
|
|
1633
|
-
const modelName = resolveAiModelName(settings, requestedModelName);
|
|
1634
|
-
const cacheKey = getAiModelCacheKey(userName, modelName);
|
|
1635
|
-
let modelPromise = aiModelCache.get(cacheKey);
|
|
1636
|
-
if (!modelPromise) {
|
|
1637
|
-
modelPromise = (async () => {
|
|
1638
|
-
const { ChatOpenAI } = await import("@langchain/openai");
|
|
1639
|
-
const modelKwargs = getOpenRouterModelKwargs(settings.AI_API_ENDPOINT);
|
|
1640
|
-
return new ChatOpenAI({
|
|
1641
|
-
temperature: 0.2,
|
|
1642
|
-
modelName,
|
|
1643
|
-
apiKey: settings.AI_API_KEY,
|
|
1644
|
-
...Object.keys(modelKwargs).length ? { modelKwargs } : {},
|
|
1645
|
-
configuration: {
|
|
1646
|
-
baseURL: settings.AI_API_ENDPOINT,
|
|
1647
|
-
defaultHeaders: {
|
|
1648
|
-
"HTTP-Referer": "https://tradejs.dev",
|
|
1649
|
-
"X-Title": "Inv"
|
|
1650
|
-
}
|
|
1651
|
-
}
|
|
1652
|
-
});
|
|
1653
|
-
})();
|
|
1654
|
-
modelPromise.catch(() => {
|
|
1655
|
-
aiModelCache.delete(cacheKey);
|
|
1656
|
-
});
|
|
1657
|
-
aiModelCache.set(cacheKey, modelPromise);
|
|
1658
|
-
}
|
|
1659
|
-
return modelPromise;
|
|
1660
|
-
};
|
|
1661
|
-
var getAiModel = async (userName = "root", requestedModelName) => {
|
|
1662
|
-
const settings = await getAiSettings(userName);
|
|
1663
|
-
const resolvedModelName = resolveAiModelName(settings, requestedModelName);
|
|
1664
|
-
try {
|
|
1665
|
-
return await createAiModel(userName, resolvedModelName);
|
|
1666
|
-
} catch (error) {
|
|
1667
|
-
aiModelCache.delete(getAiModelCacheKey(userName, resolvedModelName));
|
|
1668
|
-
userSettingsCache.delete(userName);
|
|
1669
|
-
throw error;
|
|
1670
|
-
}
|
|
1671
|
-
};
|
|
1672
1688
|
var runAiPrompt = async ({ systemPrompt, humanPrompt }, options = {}) => {
|
|
1673
|
-
const
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
getAiSettings(options.userName)
|
|
1677
|
-
]);
|
|
1678
|
-
const messages = [];
|
|
1679
|
-
const responseLanguage = (0, import_aiLanguages.getAiResponseLanguagePromptName)(
|
|
1680
|
-
settings.AI_RESPONSE_LANGUAGE || import_aiLanguages.DEFAULT_AI_RESPONSE_LANGUAGE
|
|
1689
|
+
const settings = await getAiUserSettings(options.userName);
|
|
1690
|
+
const responseLanguage = (0, import_aiLanguages2.getAiResponseLanguagePromptName)(
|
|
1691
|
+
settings.AI_RESPONSE_LANGUAGE || import_aiLanguages2.DEFAULT_AI_RESPONSE_LANGUAGE
|
|
1681
1692
|
);
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1686
|
-
|
|
1687
|
-
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
-
|
|
1691
|
-
|
|
1692
|
-
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
]
|
|
1696
|
-
})
|
|
1697
|
-
);
|
|
1698
|
-
let response;
|
|
1699
|
-
try {
|
|
1700
|
-
response = await model.invoke(messages);
|
|
1701
|
-
} catch (error) {
|
|
1702
|
-
throw getAiInvocationError(error);
|
|
1703
|
-
}
|
|
1704
|
-
const responseContent = normalizeResponseContent(response?.content);
|
|
1705
|
-
if (isEmptyResponseContent(responseContent)) {
|
|
1706
|
-
throw new Error("AI provider returned an empty chat completion");
|
|
1707
|
-
}
|
|
1708
|
-
const parsed = parseAIResponse(responseContent);
|
|
1693
|
+
const response = await invokeAiPromptChat({
|
|
1694
|
+
userName: options.userName,
|
|
1695
|
+
model: options.model,
|
|
1696
|
+
messages: [
|
|
1697
|
+
{ role: "system", content: systemPrompt },
|
|
1698
|
+
{
|
|
1699
|
+
role: "system",
|
|
1700
|
+
content: `Write all user-visible text fields in ${responseLanguage}. Keep field names and JSON syntax unchanged.`
|
|
1701
|
+
},
|
|
1702
|
+
{ role: "user", content: humanPrompt }
|
|
1703
|
+
]
|
|
1704
|
+
});
|
|
1705
|
+
const parsed = parseAIResponse(response.content);
|
|
1709
1706
|
const normalized = normalizeAnalysis(parsed);
|
|
1710
1707
|
if (!options.signal) {
|
|
1711
1708
|
return normalized;
|
|
@@ -4463,6 +4460,7 @@ var executeEntryOrder = async ({
|
|
|
4463
4460
|
deploymentId: signal.deploymentId,
|
|
4464
4461
|
policyProfileId: signal.policyProfileId,
|
|
4465
4462
|
runtimeConfigId: signal.runtimeConfigId,
|
|
4463
|
+
runtimeReleaseVersion: signal.runtimeReleaseVersion,
|
|
4466
4464
|
runtimeLineage: signal.runtimeLineage,
|
|
4467
4465
|
...signal.aiAnalysis ? { aiAnalysis: signal.aiAnalysis } : {}
|
|
4468
4466
|
});
|
|
@@ -5387,6 +5385,9 @@ var createStrategyRuntime = ({
|
|
|
5387
5385
|
deploymentId: requestedDeploymentId,
|
|
5388
5386
|
policyProfileId,
|
|
5389
5387
|
runtimeConfigId,
|
|
5388
|
+
runtimeReleaseVersion,
|
|
5389
|
+
entriesPaused = false,
|
|
5390
|
+
runtimeLineage,
|
|
5390
5391
|
runtimeConfigSnapshot,
|
|
5391
5392
|
data,
|
|
5392
5393
|
btcData,
|
|
@@ -6045,6 +6046,7 @@ var createStrategyRuntime = ({
|
|
|
6045
6046
|
});
|
|
6046
6047
|
const signal = decision.signal;
|
|
6047
6048
|
if (signal) {
|
|
6049
|
+
if (runtimeLineage) signal.runtimeLineage = runtimeLineage;
|
|
6048
6050
|
if (universe) signal.universe = universe;
|
|
6049
6051
|
if (assetClass) signal.assetClass = assetClass;
|
|
6050
6052
|
if (accountId) signal.accountId = accountId;
|
|
@@ -6055,6 +6057,9 @@ var createStrategyRuntime = ({
|
|
|
6055
6057
|
signal.signalId = `${signal.signalId}:${runtimeConfigId}`;
|
|
6056
6058
|
}
|
|
6057
6059
|
}
|
|
6060
|
+
if (runtimeReleaseVersion) {
|
|
6061
|
+
signal.runtimeReleaseVersion = runtimeReleaseVersion;
|
|
6062
|
+
}
|
|
6058
6063
|
if (decisionHookCtx.policyProfileId) {
|
|
6059
6064
|
signal.policyProfileId = decisionHookCtx.policyProfileId;
|
|
6060
6065
|
}
|
|
@@ -6161,6 +6166,15 @@ var createStrategyRuntime = ({
|
|
|
6161
6166
|
quality,
|
|
6162
6167
|
minAiQuality
|
|
6163
6168
|
});
|
|
6169
|
+
if (entriesPaused) {
|
|
6170
|
+
const skipReason = "RUNTIME_ENTRIES_PAUSED";
|
|
6171
|
+
if (signal) {
|
|
6172
|
+
signal.orderStatus = "skipped";
|
|
6173
|
+
signal.orderSkipReason = skipReason;
|
|
6174
|
+
signal.runtimeReleaseVersion = runtimeReleaseVersion;
|
|
6175
|
+
}
|
|
6176
|
+
return signal ?? skipReason;
|
|
6177
|
+
}
|
|
6164
6178
|
if (!shouldMakeOrder) {
|
|
6165
6179
|
if (signal) {
|
|
6166
6180
|
signal.orderStatus = "skipped";
|
|
@@ -6275,6 +6289,7 @@ setStrategyRuntimeFactory(createStrategyRuntime);
|
|
|
6275
6289
|
getRegisteredManifests,
|
|
6276
6290
|
getRegisteredStrategies,
|
|
6277
6291
|
getStrategyCreator,
|
|
6292
|
+
getStrategyDefaults,
|
|
6278
6293
|
getStrategyManifest,
|
|
6279
6294
|
isKnownStrategy,
|
|
6280
6295
|
registerStrategyEntries,
|
package/dist/registry.mjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import "./chunk-
|
|
1
|
+
import "./chunk-W26Y6IRP.mjs";
|
|
2
|
+
import "./chunk-SEQJ6V6B.mjs";
|
|
2
3
|
import {
|
|
3
4
|
ensureIndicatorPluginsLoaded,
|
|
4
5
|
ensureStrategyPluginsLoaded,
|
|
@@ -6,12 +7,13 @@ import {
|
|
|
6
7
|
getRegisteredManifests,
|
|
7
8
|
getRegisteredStrategies,
|
|
8
9
|
getStrategyCreator,
|
|
10
|
+
getStrategyDefaults,
|
|
9
11
|
getStrategyManifest,
|
|
10
12
|
isKnownStrategy,
|
|
11
13
|
registerStrategyEntries,
|
|
12
14
|
resetStrategyRegistryCache,
|
|
13
15
|
strategies
|
|
14
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-XN7BC7XK.mjs";
|
|
15
17
|
import "./chunk-WS5DYEVZ.mjs";
|
|
16
18
|
import "./chunk-Y6FXYEAI.mjs";
|
|
17
19
|
export {
|
|
@@ -21,6 +23,7 @@ export {
|
|
|
21
23
|
getRegisteredManifests,
|
|
22
24
|
getRegisteredStrategies,
|
|
23
25
|
getStrategyCreator,
|
|
26
|
+
getStrategyDefaults,
|
|
24
27
|
getStrategyManifest,
|
|
25
28
|
isKnownStrategy,
|
|
26
29
|
registerStrategyEntries,
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { RuntimeStrategiesResponse } from '@tradejs/types';
|
|
2
|
+
|
|
3
|
+
interface RuntimeDashboardQuery {
|
|
4
|
+
userName: string;
|
|
5
|
+
provider?: string | null;
|
|
6
|
+
hours?: string | number | null;
|
|
7
|
+
now?: number;
|
|
8
|
+
projectRoot?: string;
|
|
9
|
+
}
|
|
10
|
+
declare const loadRuntimeDashboard: ({ userName, provider: requestedProvider, hours: requestedHours, now, projectRoot: requestedProjectRoot, }: RuntimeDashboardQuery) => Promise<RuntimeStrategiesResponse>;
|
|
11
|
+
|
|
12
|
+
export { type RuntimeDashboardQuery, loadRuntimeDashboard };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { RuntimeStrategiesResponse } from '@tradejs/types';
|
|
2
|
+
|
|
3
|
+
interface RuntimeDashboardQuery {
|
|
4
|
+
userName: string;
|
|
5
|
+
provider?: string | null;
|
|
6
|
+
hours?: string | number | null;
|
|
7
|
+
now?: number;
|
|
8
|
+
projectRoot?: string;
|
|
9
|
+
}
|
|
10
|
+
declare const loadRuntimeDashboard: ({ userName, provider: requestedProvider, hours: requestedHours, now, projectRoot: requestedProjectRoot, }: RuntimeDashboardQuery) => Promise<RuntimeStrategiesResponse>;
|
|
11
|
+
|
|
12
|
+
export { type RuntimeDashboardQuery, loadRuntimeDashboard };
|