@tradejs/node 3.1.29-beta.289 → 3.1.29-beta.291

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/dist/ai.js CHANGED
@@ -50,6 +50,28 @@ module.exports = __toCommonJS(ai_exports);
50
50
  var import_aiLanguages2 = require("@tradejs/core/aiLanguages");
51
51
  var import_redis = require("@tradejs/infra/redis");
52
52
 
53
+ // src/strategyAdapters/ai.ts
54
+ var import_indicators2 = require("@tradejs/core/indicators");
55
+
56
+ // src/tradejsConfig.ts
57
+ var import_path = __toESM(require("path"));
58
+ var import_config = require("@tradejs/core/config");
59
+ var import_logger = require("@tradejs/infra/logger");
60
+ var getTradejsProjectCwd = (cwd) => {
61
+ const explicit = String(cwd ?? "").trim();
62
+ if (explicit) {
63
+ return import_path.default.resolve(explicit);
64
+ }
65
+ const fromEnv = String(process.env.PROJECT_CWD || "").trim();
66
+ if (fromEnv) {
67
+ return import_path.default.resolve(fromEnv);
68
+ }
69
+ return process.cwd();
70
+ };
71
+
72
+ // src/strategyAdapters/ai.ts
73
+ var import_aiFeatures = require("@tradejs/core/aiFeatures");
74
+
53
75
  // src/aiShared.ts
54
76
  var MAX_AI_SERIES_POINTS = 5;
55
77
  var COMPACT_INDICATORS_SNAPSHOT_SYMBOL = /* @__PURE__ */ Symbol.for(
@@ -273,37 +295,44 @@ var buildMarketBreadthsContextFromSignal = (signal) => {
273
295
  top100: build("top100")
274
296
  };
275
297
  };
298
+ var buildTargetVsReference = (signal, asset) => {
299
+ const base = toRecord(signal.additionalIndicators?.baseContext);
300
+ const relative = toRecord(base?.relative);
301
+ const target = toRecord(relative?.[`targetVs${asset}`]);
302
+ return {
303
+ source: target ? String(target.source ?? "") : null,
304
+ available: Boolean(target),
305
+ ratioReturn1h: toFiniteNumber(target?.ratioReturn1h),
306
+ ratioReturn4h: toFiniteNumber(target?.ratioReturn4h),
307
+ ratioReturn24h: toFiniteNumber(target?.ratioReturn24h),
308
+ alpha1h: toFiniteNumber(target?.[`alphaVs${asset}1h`]),
309
+ alpha4h: toFiniteNumber(target?.[`alphaVs${asset}4h`]),
310
+ alpha24h: toFiniteNumber(target?.[`alphaVs${asset}24h`]),
311
+ beta: toFiniteNumber(target?.[`betaTo${asset}20`]),
312
+ correlation: toFiniteNumber(target?.[`correlationTo${asset}20`]),
313
+ ratioTrend: typeof target?.ratioTrend === "string" ? target.ratioTrend : null
314
+ };
315
+ };
276
316
  var buildTargetVsBtcContextFromSignal = (signal) => {
277
- const baseContext = toRecord(signal.additionalIndicators?.baseContext);
278
- const relative = toRecord(baseContext?.relative);
279
- const targetVsBtc = toRecord(relative?.targetVsBtc);
280
- if (!targetVsBtc) {
281
- return {
282
- source: null,
283
- available: false,
284
- ratioReturn1h: null,
285
- ratioReturn4h: null,
286
- ratioReturn24h: null,
287
- alphaVsBtc1h: null,
288
- alphaVsBtc4h: null,
289
- alphaVsBtc24h: null,
290
- betaToBtc20: null,
291
- correlationToBtc20: null,
292
- ratioTrend: null
293
- };
294
- }
317
+ const { alpha1h, alpha4h, alpha24h, beta, correlation, ...shared } = buildTargetVsReference(signal, "Btc");
295
318
  return {
296
- source: String(targetVsBtc.source ?? ""),
297
- available: true,
298
- ratioReturn1h: toFiniteNumber(targetVsBtc.ratioReturn1h),
299
- ratioReturn4h: toFiniteNumber(targetVsBtc.ratioReturn4h),
300
- ratioReturn24h: toFiniteNumber(targetVsBtc.ratioReturn24h),
301
- alphaVsBtc1h: toFiniteNumber(targetVsBtc.alphaVsBtc1h),
302
- alphaVsBtc4h: toFiniteNumber(targetVsBtc.alphaVsBtc4h),
303
- alphaVsBtc24h: toFiniteNumber(targetVsBtc.alphaVsBtc24h),
304
- betaToBtc20: toFiniteNumber(targetVsBtc.betaToBtc20),
305
- correlationToBtc20: toFiniteNumber(targetVsBtc.correlationToBtc20),
306
- ratioTrend: typeof targetVsBtc.ratioTrend === "string" ? targetVsBtc.ratioTrend : null
319
+ ...shared,
320
+ alphaVsBtc1h: alpha1h,
321
+ alphaVsBtc4h: alpha4h,
322
+ alphaVsBtc24h: alpha24h,
323
+ betaToBtc20: beta,
324
+ correlationToBtc20: correlation
325
+ };
326
+ };
327
+ var buildTargetVsEthContextFromSignal = (signal) => {
328
+ const { alpha1h, alpha4h, alpha24h, beta, correlation, ...shared } = buildTargetVsReference(signal, "Eth");
329
+ return {
330
+ ...shared,
331
+ alphaVsEth1h: alpha1h,
332
+ alphaVsEth4h: alpha4h,
333
+ alphaVsEth24h: alpha24h,
334
+ betaToEth20: beta,
335
+ correlationToEth20: correlation
307
336
  };
308
337
  };
309
338
  var buildBtcAltRegimeContextFromSignal = (signal) => {
@@ -612,6 +641,7 @@ var buildAiMarketContext = (signal) => ({
612
641
  marketBreadth: buildMarketBreadthContextFromSignal(signal),
613
642
  marketBreadths: buildMarketBreadthsContextFromSignal(signal),
614
643
  targetVsBtc: buildTargetVsBtcContextFromSignal(signal),
644
+ targetVsEth: buildTargetVsEthContextFromSignal(signal),
615
645
  btcAltRegime: buildBtcAltRegimeContextFromSignal(signal),
616
646
  cmcGlobal: buildCmcGlobalContextFromSignal(signal),
617
647
  cmcReferenceAssets: buildCmcReferenceAssetsContextFromSignal(signal),
@@ -624,24 +654,6 @@ var buildAiMarketContext = (signal) => ({
624
654
 
625
655
  // src/strategy/manifests.ts
626
656
  var import_indicators = require("@tradejs/core/indicators");
627
-
628
- // src/tradejsConfig.ts
629
- var import_path = __toESM(require("path"));
630
- var import_config = require("@tradejs/core/config");
631
- var import_logger = require("@tradejs/infra/logger");
632
- var getTradejsProjectCwd = (cwd) => {
633
- const explicit = String(cwd ?? "").trim();
634
- if (explicit) {
635
- return import_path.default.resolve(explicit);
636
- }
637
- const fromEnv = String(process.env.PROJECT_CWD || "").trim();
638
- if (fromEnv) {
639
- return import_path.default.resolve(fromEnv);
640
- }
641
- return process.cwd();
642
- };
643
-
644
- // src/strategy/manifests.ts
645
657
  var SHARED_STRATEGY_REGISTRY_KEY = "__tradejsNodeSharedStrategyRegistryV1__";
646
658
  var sharedRegistryScope = globalThis;
647
659
  var sharedStrategyRegistry = sharedRegistryScope[SHARED_STRATEGY_REGISTRY_KEY] ?? (sharedRegistryScope[SHARED_STRATEGY_REGISTRY_KEY] = {
@@ -732,12 +744,61 @@ var buildBaseAiPayload = (signal) => {
732
744
  };
733
745
  };
734
746
  var defaultAiAdapter = {};
747
+ var tickerProfileFeatureIds = new Set(
748
+ import_aiFeatures.TICKER_PROFILE_AI_FEATURES.map(({ id }) => id)
749
+ );
735
750
  var getStrategyAiAdapter = (strategy, profileId) => getStrategyProfileAiAdapter(getStrategyManifest(strategy), profileId) ?? defaultAiAdapter;
736
751
  var getSignalAiAdapter = (signal) => getStrategyAiAdapter(signal.strategy, signal.policyProfileId);
737
752
  var buildAiPayloadByStrategy = (signal) => {
738
753
  const basePayload = buildBaseAiPayload(signal);
739
754
  const adapter = getSignalAiAdapter(signal);
740
- return adapter.buildPayload?.({ signal, basePayload }) ?? basePayload;
755
+ const payload = adapter.buildPayload?.({ signal, basePayload }) ?? basePayload;
756
+ const custom = getStrategyManifest(signal.strategy)?.aiFeatures ?? [];
757
+ const frozen = signal.aiFeatureReplay?.snapshot;
758
+ if (frozen) (0, import_aiFeatures.validateAiFeatureSnapshot)(frozen);
759
+ const tickerProfile = signal.additionalIndicators?.tickerProfile ?? signal.additionalIndicators?.baseContext?.tickerProfile;
760
+ const hasProfile = Boolean(
761
+ tickerProfile || frozen?.definitions.some(({ id }) => tickerProfileFeatureIds.has(id))
762
+ );
763
+ const indicatorFeatures = (0, import_indicators2.getRegisteredIndicatorEntries)(
764
+ getTradejsProjectCwd()
765
+ ).flatMap((entry) => entry.indicator.enabled ? entry.aiFeatures ?? [] : []);
766
+ const hasPortfolio = Boolean(
767
+ signal.additionalIndicators?.portfolioContext || frozen?.definitions.some(
768
+ ({ id }) => import_aiFeatures.PORTFOLIO_AI_FEATURES.some((d) => d.id === id)
769
+ )
770
+ );
771
+ const definitions = [
772
+ ...hasPortfolio ? import_aiFeatures.PORTFOLIO_AI_FEATURES : [],
773
+ ...hasProfile ? import_aiFeatures.TICKER_PROFILE_AI_FEATURES : [],
774
+ ...indicatorFeatures,
775
+ ...custom
776
+ ];
777
+ if (!definitions.length && !signal.aiFeatureReplay?.snapshot) return payload;
778
+ (0, import_aiFeatures.validateAiFeatureDefinitions)(definitions);
779
+ if (signal.aiFeatureReplay && !frozen) {
780
+ throw new Error(
781
+ "Dataset has no frozen AI features; regenerate the decision-time export"
782
+ );
783
+ }
784
+ if (frozen && JSON.stringify(frozen.definitions) !== JSON.stringify(definitions)) {
785
+ throw new Error(
786
+ "AI feature definition changed; regenerate the decision-time export"
787
+ );
788
+ }
789
+ return {
790
+ ...payload,
791
+ featureSnapshot: frozen ?? (0, import_aiFeatures.projectAiFeatures)(definitions, {
792
+ signal: tickerProfile ? {
793
+ ...signal,
794
+ additionalIndicators: {
795
+ ...signal.additionalIndicators,
796
+ tickerProfile
797
+ }
798
+ } : signal,
799
+ payload
800
+ })
801
+ };
741
802
  };
742
803
  var buildAiSystemPromptAddonByStrategy = (signal) => getSignalAiAdapter(signal).buildSystemPromptAddon?.({ signal }) ?? "";
743
804
  var buildAiHumanPromptAddonByStrategy = (signal, payload) => getSignalAiAdapter(signal).buildHumanPromptAddon?.({
package/dist/ai.mjs CHANGED
@@ -14,7 +14,7 @@ import {
14
14
  runAiPrompt,
15
15
  runAiPromptLocal,
16
16
  trimSeriesDeep
17
- } from "./chunk-UL5Z46JL.mjs";
17
+ } from "./chunk-PYJWXAYR.mjs";
18
18
  import "./chunk-LZDXRXIU.mjs";
19
19
  import "./chunk-Y6FXYEAI.mjs";
20
20
  export {