@tradejs/cli 3.1.29-beta.261 → 3.1.29-beta.263

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 (32) hide show
  1. package/README.md +47 -8
  2. package/dist/cli.js +990 -1448
  3. package/dist/lib/aiPocketSearch.js +16 -0
  4. package/dist/lib/aiPocketSearchCli.js +3 -3
  5. package/dist/lib/jevMicroReferences.js +73 -0
  6. package/dist/lib/jevResearch.js +11 -0
  7. package/dist/lib/runtimeEvidenceArtifacts.js +3 -416
  8. package/dist/lib/runtimeEvidenceCompositionSnapshots.js +42 -211
  9. package/dist/lib/runtimeEvidenceCompositions.js +33 -310
  10. package/dist/lib/runtimeEvidenceDeployment.js +3 -315
  11. package/dist/lib/runtimeEvidenceProducer.js +3 -77
  12. package/dist/lib/runtimeEvidenceSync.js +32 -299
  13. package/dist/lib/runtimeFeedbackArtifacts.js +3 -545
  14. package/dist/lib/runtimeFeedbackNotification.js +7 -195
  15. package/dist/lib/runtimeFeedbackReplay.js +26 -525
  16. package/dist/lib/runtimeFeedbackSync.js +26 -219
  17. package/dist/lib/runtimeScorecard.js +5 -163
  18. package/dist/scripts/aiPocketSearch.js +101 -23
  19. package/dist/scripts/backtest.js +10 -1
  20. package/dist/scripts/jev.js +11 -0
  21. package/dist/scripts/mcpWorker.js +273 -0
  22. package/dist/scripts/replay.js +14 -250
  23. package/dist/scripts/replayRunner.js +14 -250
  24. package/dist/scripts/runtimeEvidence.js +47 -597
  25. package/dist/scripts/runtimeEvidenceSync.js +29 -296
  26. package/dist/scripts/runtimeFeedbackNotify.js +10 -188
  27. package/dist/scripts/runtimeFeedbackReplay.js +29 -528
  28. package/dist/scripts/runtimeFeedbackSync.js +28 -221
  29. package/dist/scripts/runtimeScorecard.js +88 -503
  30. package/dist/scripts/signals.js +55 -224
  31. package/dist/scripts/signalsDaemon.js +55 -224
  32. package/package.json +9 -8
@@ -17,6 +17,7 @@ var __copyProps = (to, from, except, desc) => {
17
17
  }
18
18
  return to;
19
19
  };
20
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
20
21
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
22
  // If the importer is in node compatibility mode or this is not an ESM
22
23
  // file that has been converted to a CommonJS file using a Babel-
@@ -41,7 +42,7 @@ var import_data4 = require("@tradejs/core/data");
41
42
  var import_time7 = require("@tradejs/core/time");
42
43
  var import_redis6 = require("@tradejs/infra/redis");
43
44
  var import_candles = require("@tradejs/infra/timescale/candles");
44
- var import_runtimeStrategies4 = require("@tradejs/node/runtimeStrategies");
45
+ var import_runtimeStrategies3 = require("@tradejs/node/runtimeStrategies");
45
46
  var import_strategies5 = require("@tradejs/node/strategies");
46
47
 
47
48
  // src/lib/runFormatting.ts
@@ -4447,245 +4448,8 @@ var runtimeLineagesMatch = (left, right) => left != null && right != null && run
4447
4448
  var runtimeLineagesComparable = (left, right) => runtimeLineagesMatch(left, right) && typeof left?.maxLossValue === "number" && Number.isFinite(left.maxLossValue) && typeof right?.maxLossValue === "number" && Number.isFinite(right.maxLossValue) && left.maxLossValue === right.maxLossValue;
4448
4449
 
4449
4450
  // src/lib/runtimeEvidenceDeployment.ts
4450
- var import_runtimeStrategies2 = require("@tradejs/node/runtimeStrategies");
4451
- var isRecord = (value) => value != null && typeof value === "object" && !Array.isArray(value);
4452
- var isNonEmptyString = (value) => typeof value === "string" && value.trim().length > 0;
4453
- var isPackageVersionMap = (value) => isRecord(value) && Object.keys(value).length > 0 && Object.entries(value).every(
4454
- ([name, version]) => name.startsWith("@tradejs/") && isNonEmptyString(version)
4455
- );
4456
- var INTERVALS = /* @__PURE__ */ new Set([
4457
- "1",
4458
- "3",
4459
- "5",
4460
- "15",
4461
- "30",
4462
- "60",
4463
- "120",
4464
- "240",
4465
- "360",
4466
- "720",
4467
- "D",
4468
- "W",
4469
- "M"
4470
- ]);
4471
- var UNIVERSES = /* @__PURE__ */ new Set(["crypto", "tradfi"]);
4472
- var isRuntimeStrategySelection = (value) => value === void 0 || isRecord(value) && Object.keys(value).length === 1 && Object.keys(value).every((key) => key === "tickers") && Array.isArray(value.tickers) && value.tickers.length > 0 && value.tickers.every((ticker) => isNonEmptyString(ticker));
4473
- var samePackageVersions = (left, right) => {
4474
- if (!left || !right) return false;
4475
- const leftEntries = Object.entries(left).sort(
4476
- ([a], [b]) => a.localeCompare(b)
4477
- );
4478
- const rightEntries = Object.entries(right).sort(
4479
- ([a], [b]) => a.localeCompare(b)
4480
- );
4481
- return JSON.stringify(leftEntries) === JSON.stringify(rightEntries);
4482
- };
4483
- var runtimeLineageMatchesStrategySnapshot = ({
4484
- lineage,
4485
- deployment,
4486
- strategy
4487
- }) => lineage?.schemaVersion === 3 && lineage.strategyRevision === strategy.strategyRevision && lineage.deploymentCompositionId === deployment.deploymentCompositionId && lineage.strategyPackageVersion === strategy.strategyPackageVersion && lineage.runtimePackageVersion === strategy.runtimePackageVersion && samePackageVersions(
4488
- lineage.strategyDependencyVersions,
4489
- strategy.strategyDependencyVersions
4490
- );
4491
- var parseRuntimeEvidenceDeploymentSnapshot = (value) => {
4492
- if (!isRecord(value) || value.schemaVersion !== 2 || !isNonEmptyString(value.id) || !isNonEmptyString(value.deploymentCompositionId) || !/^dc1:[a-f0-9]{16}$/.test(value.deploymentCompositionId) || !isNonEmptyString(value.label) || !isNonEmptyString(value.connectorName) || !isNonEmptyString(value.provider) || !isNonEmptyString(value.accountId) || typeof value.enabled !== "boolean" || !Array.isArray(value.strategies)) {
4493
- throw new Error(
4494
- "Runtime evidence deployment snapshot is missing or invalid"
4495
- );
4496
- }
4497
- const strategies = value.strategies.map((candidate) => {
4498
- if (!isRecord(candidate) || !isNonEmptyString(candidate.strategyName) || !isNonEmptyString(candidate.strategyRevision) || !/^sr1:[a-f0-9]{16}$/.test(candidate.strategyRevision) || typeof candidate.enabled !== "boolean" || !["active", "entries_paused"].includes(String(candidate.controlState)) || !INTERVALS.has(String(candidate.interval)) || !UNIVERSES.has(String(candidate.universe)) || !isNonEmptyString(candidate.strategyPackage) || !isNonEmptyString(candidate.strategyPackageVersion) || !isPackageVersionMap(candidate.strategyDependencyVersions) || !isNonEmptyString(candidate.runtimePackageVersion) || !isRecord(candidate.strategyConfig) || !isRuntimeStrategySelection(candidate.selection)) {
4499
- throw new Error(
4500
- "Runtime evidence deployment strategy snapshot is invalid"
4501
- );
4502
- }
4503
- if (String(candidate.strategyConfig.INTERVAL) !== String(candidate.interval) || String(candidate.strategyConfig.UNIVERSE) !== String(candidate.universe)) {
4504
- throw new Error(
4505
- `Runtime evidence strategy config does not match its scope: ${candidate.strategyName}`
4506
- );
4507
- }
4508
- if (candidate.accountId != null && (!isNonEmptyString(candidate.accountId) || candidate.accountId !== value.accountId)) {
4509
- throw new Error(
4510
- `Runtime evidence strategy account does not match deployment: ${candidate.strategyName}`
4511
- );
4512
- }
4513
- return candidate;
4514
- });
4515
- const identities = /* @__PURE__ */ new Set();
4516
- for (const strategy of strategies) {
4517
- if (identities.has(strategy.strategyName)) {
4518
- throw new Error(
4519
- `Duplicate runtime evidence strategy: ${strategy.strategyName}`
4520
- );
4521
- }
4522
- identities.add(strategy.strategyName);
4523
- }
4524
- return {
4525
- ...value,
4526
- strategies
4527
- };
4528
- };
4529
- var activeRuntimeEvidenceStrategies = (deployment) => deployment.enabled ? deployment.strategies.filter((strategy) => strategy.enabled) : [];
4530
- var unwrapRuntimeEvidenceRows = (value, field) => (Array.isArray(value) ? value : []).map((candidate) => {
4531
- const record = isRecord(candidate) ? candidate : null;
4532
- const nested = record && isRecord(record[field]) ? record[field] : null;
4533
- return nested ?? record;
4534
- }).filter((record) => record != null);
4535
- var assertCurrentRuntimeEvidenceArtifact = (artifact) => {
4536
- if (!isRecord(artifact) || artifact.reportType !== "runtime-evidence") {
4537
- throw new Error("Invalid runtime evidence artifact");
4538
- }
4539
- const deployment = parseRuntimeEvidenceDeploymentSnapshot(
4540
- artifact.deployment
4541
- );
4542
- const activeStrategies = activeRuntimeEvidenceStrategies(deployment);
4543
- if (activeStrategies.length === 0) {
4544
- throw new Error("Runtime evidence deployment has no enabled strategies");
4545
- }
4546
- const runtime = isRecord(artifact.runtime) ? artifact.runtime : null;
4547
- if (!runtime) {
4548
- throw new Error("Runtime evidence payload is missing");
4549
- }
4550
- if ("strategyConfigs" in runtime) {
4551
- throw new Error(
4552
- "Runtime evidence payload contains removed strategyConfigs data"
4553
- );
4554
- }
4555
- if ("evaluationStatsBuckets" in runtime) {
4556
- throw new Error(
4557
- "Runtime evidence payload contains removed lineage-less evaluationStatsBuckets data"
4558
- );
4559
- }
4560
- const rowFields = [
4561
- "trades",
4562
- "signals",
4563
- "evaluations",
4564
- "lineageScopes"
4565
- ];
4566
- for (const field of rowFields) {
4567
- if (!Array.isArray(runtime[field])) {
4568
- throw new Error(`Runtime evidence payload ${field} must be an array`);
4569
- }
4570
- }
4571
- const snapshots = new Map(
4572
- activeStrategies.map((strategy) => [strategy.strategyName, strategy])
4573
- );
4574
- const assertRows = (label, rows, lineageField) => {
4575
- for (const row of rows) {
4576
- const strategyName = String(row.strategy ?? "").trim();
4577
- const strategy = snapshots.get(strategyName);
4578
- if (!strategy || row.deploymentId !== deployment.id || row.accountId !== deployment.accountId || !runtimeLineageMatchesStrategySnapshot({
4579
- lineage: isRecord(row[lineageField]) ? row[lineageField] : void 0,
4580
- deployment,
4581
- strategy
4582
- })) {
4583
- throw new Error(
4584
- `Runtime evidence ${label} row is outside the current embedded deployment lineage`
4585
- );
4586
- }
4587
- }
4588
- };
4589
- assertRows(
4590
- "trade",
4591
- unwrapRuntimeEvidenceRows(runtime.trades, "trade"),
4592
- "runtimeLineage"
4593
- );
4594
- assertRows(
4595
- "signal",
4596
- unwrapRuntimeEvidenceRows(runtime.signals, "signal"),
4597
- "runtimeLineage"
4598
- );
4599
- assertRows(
4600
- "evaluation",
4601
- unwrapRuntimeEvidenceRows(runtime.evaluations, "evaluation"),
4602
- "runtimeLineage"
4603
- );
4604
- assertRows(
4605
- "lineage scope",
4606
- unwrapRuntimeEvidenceRows(runtime.lineageScopes, "lineageScope"),
4607
- "lineage"
4608
- );
4609
- return deployment;
4610
- };
4611
- var resolveRuntimeEvidenceTickerUniverse = ({
4612
- deployment,
4613
- lineageScopes,
4614
- fallbackTickers
4615
- }) => {
4616
- const declaredTickers = deployment.tickers?.filter(isNonEmptyString) ?? [];
4617
- if (declaredTickers.length > 0) {
4618
- return {
4619
- ...deployment,
4620
- tickers: [
4621
- ...new Set(declaredTickers.map((ticker) => ticker.trim()))
4622
- ].sort()
4623
- };
4624
- }
4625
- const activeStrategies = activeRuntimeEvidenceStrategies(deployment);
4626
- if (activeStrategies.length > 0 && activeStrategies.every((strategy) => strategy.selection?.tickers?.length)) {
4627
- return {
4628
- ...deployment,
4629
- tickers: [
4630
- ...new Set(
4631
- activeStrategies.flatMap(
4632
- (strategy) => strategy.selection?.tickers ?? []
4633
- )
4634
- )
4635
- ].sort()
4636
- };
4637
- }
4638
- const strategiesByName = new Map(
4639
- activeStrategies.map((strategy) => [strategy.strategyName, strategy])
4640
- );
4641
- const tickers = /* @__PURE__ */ new Set();
4642
- for (const scope of lineageScopes) {
4643
- const strategy = strategiesByName.get(scope.strategy);
4644
- if (!strategy || scope.deploymentId !== deployment.id || scope.accountId !== deployment.accountId || !isNonEmptyString(scope.symbol) || !runtimeLineageMatchesStrategySnapshot({
4645
- lineage: scope.lineage,
4646
- deployment,
4647
- strategy
4648
- })) {
4649
- continue;
4650
- }
4651
- tickers.add(scope.symbol.trim());
4652
- }
4653
- if (tickers.size === 0) {
4654
- const verifiedFallbackTickers = fallbackTickers?.filter(isNonEmptyString) ?? [];
4655
- if (verifiedFallbackTickers.length > 0) {
4656
- return {
4657
- ...deployment,
4658
- tickers: [
4659
- ...new Set(verifiedFallbackTickers.map((ticker) => ticker.trim()))
4660
- ].sort()
4661
- };
4662
- }
4663
- throw new Error(
4664
- "Runtime evidence has no immutable ticker universe for the embedded deployment composition"
4665
- );
4666
- }
4667
- return { ...deployment, tickers: [...tickers].sort() };
4668
- };
4669
- var runtimeDeploymentFromEvidence = (deployment) => ({
4670
- id: deployment.id,
4671
- deploymentCompositionId: deployment.deploymentCompositionId,
4672
- label: deployment.label,
4673
- connectorName: deployment.connectorName,
4674
- provider: deployment.provider,
4675
- accountId: deployment.accountId,
4676
- enabled: deployment.enabled,
4677
- strategies: deployment.strategies.map(
4678
- ({ strategyName, strategyRevision, enabled, controlState, selection }) => ({
4679
- strategyName,
4680
- strategyRevision,
4681
- enabled,
4682
- controlState,
4683
- ...selection ? { selection } : {}
4684
- })
4685
- ),
4686
- ...deployment.assetClasses ? { assetClasses: [...deployment.assetClasses] } : {},
4687
- ...deployment.tickers ? { tickers: [...deployment.tickers] } : {}
4688
- });
4451
+ var runtimeEvidenceDeployment_exports = {};
4452
+ __reExport(runtimeEvidenceDeployment_exports, require("@tradejs/node/diagnostics"));
4689
4453
 
4690
4454
  // src/lib/replay/runtimeEvidenceSource.ts
4691
4455
  var asRecord = (value) => value && typeof value === "object" && !Array.isArray(value) ? value : null;
@@ -4700,7 +4464,7 @@ var assertRuntimeRowsMatchDeployment = ({
4700
4464
  deployment
4701
4465
  }) => {
4702
4466
  const activeStrategies = new Set(
4703
- activeRuntimeEvidenceStrategies(deployment).map(
4467
+ (0, runtimeEvidenceDeployment_exports.activeRuntimeEvidenceStrategies)(deployment).map(
4704
4468
  ({ strategyName }) => strategyName
4705
4469
  )
4706
4470
  );
@@ -4724,7 +4488,7 @@ var readRuntimeEvidenceArtifact = async ({
4724
4488
  if (!root || !runtime) {
4725
4489
  throw new Error(`Invalid runtime evidence JSON: ${resolvedPath}`);
4726
4490
  }
4727
- assertCurrentRuntimeEvidenceArtifact(root);
4491
+ (0, runtimeEvidenceDeployment_exports.assertCurrentRuntimeEvidenceArtifact)(root);
4728
4492
  const rootWindow = asRecord(root.window);
4729
4493
  const runtimeWindow = asRecord(runtime.window);
4730
4494
  return {
@@ -4734,8 +4498,8 @@ var readRuntimeEvidenceArtifact = async ({
4734
4498
  userName: String(root.userName ?? runtime.userName ?? "").trim(),
4735
4499
  startTime: asFiniteNumber(rootWindow?.startTime) ?? asFiniteNumber(runtimeWindow?.startTime),
4736
4500
  endTime: asFiniteNumber(rootWindow?.endTime) ?? asFiniteNumber(runtimeWindow?.endTime),
4737
- deployment: resolveRuntimeEvidenceTickerUniverse({
4738
- deployment: parseRuntimeEvidenceDeploymentSnapshot(root.deployment),
4501
+ deployment: (0, runtimeEvidenceDeployment_exports.resolveRuntimeEvidenceTickerUniverse)({
4502
+ deployment: (0, runtimeEvidenceDeployment_exports.parseRuntimeEvidenceDeploymentSnapshot)(root.deployment),
4739
4503
  lineageScopes: unwrapRows(
4740
4504
  runtime.lineageScopes,
4741
4505
  "lineageScope"
@@ -4996,7 +4760,7 @@ var import_redis3 = require("@tradejs/infra/redis");
4996
4760
  var import_connectors6 = require("@tradejs/node/connectors");
4997
4761
  var import_cli4 = require("@tradejs/node/cli");
4998
4762
  var import_strategies4 = require("@tradejs/node/strategies");
4999
- var import_runtimeStrategies3 = require("@tradejs/node/runtimeStrategies");
4763
+ var import_runtimeStrategies2 = require("@tradejs/node/runtimeStrategies");
5000
4764
 
5001
4765
  // src/lib/replay/portfolioReplayConnector.ts
5002
4766
  var import_constants3 = require("@tradejs/core/constants");
@@ -5987,7 +5751,7 @@ var loadRuntimeStrategies = async (runtimeStrategies) => {
5987
5751
  if (!strategyCreator) {
5988
5752
  throw new Error(`Unknown strategy: ${strategyName}`);
5989
5753
  }
5990
- const installed = await (0, import_runtimeStrategies3.getRuntimeStrategyPackageMetadata)({
5754
+ const installed = await (0, import_runtimeStrategies2.getRuntimeStrategyPackageMetadata)({
5991
5755
  strategyName,
5992
5756
  projectRoot: replayProjectRoot,
5993
5757
  strategyModule
@@ -9906,8 +9670,8 @@ var replayBacktest = async () => {
9906
9670
  );
9907
9671
  }
9908
9672
  const replayComposition = evidenceMetadata ? {
9909
- deployment: runtimeDeploymentFromEvidence(evidenceMetadata.deployment),
9910
- strategies: activeRuntimeEvidenceStrategies(
9673
+ deployment: (0, runtimeEvidenceDeployment_exports.runtimeDeploymentFromEvidence)(evidenceMetadata.deployment),
9674
+ strategies: (0, runtimeEvidenceDeployment_exports.activeRuntimeEvidenceStrategies)(
9911
9675
  evidenceMetadata.deployment
9912
9676
  ).map(
9913
9677
  ({
@@ -9959,7 +9723,7 @@ var replayBacktest = async () => {
9959
9723
  return {
9960
9724
  ...strategy,
9961
9725
  strategyConfig,
9962
- strategyRevision: (0, import_runtimeStrategies4.computeStrategyRevision)({
9726
+ strategyRevision: (0, import_runtimeStrategies3.computeStrategyRevision)({
9963
9727
  strategyName: strategy.strategyName,
9964
9728
  strategyPackage: strategy.strategyPackage,
9965
9729
  strategyPackageVersion: strategy.strategyPackageVersion,
@@ -9969,7 +9733,7 @@ var replayBacktest = async () => {
9969
9733
  })
9970
9734
  };
9971
9735
  });
9972
- const researchDeploymentCompositionId = (0, import_runtimeStrategies4.computeDeploymentCompositionId)({
9736
+ const researchDeploymentCompositionId = (0, import_runtimeStrategies3.computeDeploymentCompositionId)({
9973
9737
  deploymentId: deployment.id,
9974
9738
  connectorName: deployment.connectorName,
9975
9739
  provider: deployment.provider,
@@ -17,6 +17,7 @@ var __copyProps = (to, from, except, desc) => {
17
17
  }
18
18
  return to;
19
19
  };
20
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
20
21
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
22
  // If the importer is in node compatibility mode or this is not an ESM
22
23
  // file that has been converted to a CommonJS file using a Babel-
@@ -44,7 +45,7 @@ var import_data4 = require("@tradejs/core/data");
44
45
  var import_time7 = require("@tradejs/core/time");
45
46
  var import_redis6 = require("@tradejs/infra/redis");
46
47
  var import_candles = require("@tradejs/infra/timescale/candles");
47
- var import_runtimeStrategies4 = require("@tradejs/node/runtimeStrategies");
48
+ var import_runtimeStrategies3 = require("@tradejs/node/runtimeStrategies");
48
49
  var import_strategies5 = require("@tradejs/node/strategies");
49
50
 
50
51
  // src/lib/runFormatting.ts
@@ -4450,245 +4451,8 @@ var runtimeLineagesMatch = (left, right) => left != null && right != null && run
4450
4451
  var runtimeLineagesComparable = (left, right) => runtimeLineagesMatch(left, right) && typeof left?.maxLossValue === "number" && Number.isFinite(left.maxLossValue) && typeof right?.maxLossValue === "number" && Number.isFinite(right.maxLossValue) && left.maxLossValue === right.maxLossValue;
4451
4452
 
4452
4453
  // src/lib/runtimeEvidenceDeployment.ts
4453
- var import_runtimeStrategies2 = require("@tradejs/node/runtimeStrategies");
4454
- var isRecord = (value) => value != null && typeof value === "object" && !Array.isArray(value);
4455
- var isNonEmptyString = (value) => typeof value === "string" && value.trim().length > 0;
4456
- var isPackageVersionMap = (value) => isRecord(value) && Object.keys(value).length > 0 && Object.entries(value).every(
4457
- ([name, version]) => name.startsWith("@tradejs/") && isNonEmptyString(version)
4458
- );
4459
- var INTERVALS = /* @__PURE__ */ new Set([
4460
- "1",
4461
- "3",
4462
- "5",
4463
- "15",
4464
- "30",
4465
- "60",
4466
- "120",
4467
- "240",
4468
- "360",
4469
- "720",
4470
- "D",
4471
- "W",
4472
- "M"
4473
- ]);
4474
- var UNIVERSES = /* @__PURE__ */ new Set(["crypto", "tradfi"]);
4475
- var isRuntimeStrategySelection = (value) => value === void 0 || isRecord(value) && Object.keys(value).length === 1 && Object.keys(value).every((key) => key === "tickers") && Array.isArray(value.tickers) && value.tickers.length > 0 && value.tickers.every((ticker) => isNonEmptyString(ticker));
4476
- var samePackageVersions = (left, right) => {
4477
- if (!left || !right) return false;
4478
- const leftEntries = Object.entries(left).sort(
4479
- ([a], [b]) => a.localeCompare(b)
4480
- );
4481
- const rightEntries = Object.entries(right).sort(
4482
- ([a], [b]) => a.localeCompare(b)
4483
- );
4484
- return JSON.stringify(leftEntries) === JSON.stringify(rightEntries);
4485
- };
4486
- var runtimeLineageMatchesStrategySnapshot = ({
4487
- lineage,
4488
- deployment,
4489
- strategy
4490
- }) => lineage?.schemaVersion === 3 && lineage.strategyRevision === strategy.strategyRevision && lineage.deploymentCompositionId === deployment.deploymentCompositionId && lineage.strategyPackageVersion === strategy.strategyPackageVersion && lineage.runtimePackageVersion === strategy.runtimePackageVersion && samePackageVersions(
4491
- lineage.strategyDependencyVersions,
4492
- strategy.strategyDependencyVersions
4493
- );
4494
- var parseRuntimeEvidenceDeploymentSnapshot = (value) => {
4495
- if (!isRecord(value) || value.schemaVersion !== 2 || !isNonEmptyString(value.id) || !isNonEmptyString(value.deploymentCompositionId) || !/^dc1:[a-f0-9]{16}$/.test(value.deploymentCompositionId) || !isNonEmptyString(value.label) || !isNonEmptyString(value.connectorName) || !isNonEmptyString(value.provider) || !isNonEmptyString(value.accountId) || typeof value.enabled !== "boolean" || !Array.isArray(value.strategies)) {
4496
- throw new Error(
4497
- "Runtime evidence deployment snapshot is missing or invalid"
4498
- );
4499
- }
4500
- const strategies = value.strategies.map((candidate) => {
4501
- if (!isRecord(candidate) || !isNonEmptyString(candidate.strategyName) || !isNonEmptyString(candidate.strategyRevision) || !/^sr1:[a-f0-9]{16}$/.test(candidate.strategyRevision) || typeof candidate.enabled !== "boolean" || !["active", "entries_paused"].includes(String(candidate.controlState)) || !INTERVALS.has(String(candidate.interval)) || !UNIVERSES.has(String(candidate.universe)) || !isNonEmptyString(candidate.strategyPackage) || !isNonEmptyString(candidate.strategyPackageVersion) || !isPackageVersionMap(candidate.strategyDependencyVersions) || !isNonEmptyString(candidate.runtimePackageVersion) || !isRecord(candidate.strategyConfig) || !isRuntimeStrategySelection(candidate.selection)) {
4502
- throw new Error(
4503
- "Runtime evidence deployment strategy snapshot is invalid"
4504
- );
4505
- }
4506
- if (String(candidate.strategyConfig.INTERVAL) !== String(candidate.interval) || String(candidate.strategyConfig.UNIVERSE) !== String(candidate.universe)) {
4507
- throw new Error(
4508
- `Runtime evidence strategy config does not match its scope: ${candidate.strategyName}`
4509
- );
4510
- }
4511
- if (candidate.accountId != null && (!isNonEmptyString(candidate.accountId) || candidate.accountId !== value.accountId)) {
4512
- throw new Error(
4513
- `Runtime evidence strategy account does not match deployment: ${candidate.strategyName}`
4514
- );
4515
- }
4516
- return candidate;
4517
- });
4518
- const identities = /* @__PURE__ */ new Set();
4519
- for (const strategy of strategies) {
4520
- if (identities.has(strategy.strategyName)) {
4521
- throw new Error(
4522
- `Duplicate runtime evidence strategy: ${strategy.strategyName}`
4523
- );
4524
- }
4525
- identities.add(strategy.strategyName);
4526
- }
4527
- return {
4528
- ...value,
4529
- strategies
4530
- };
4531
- };
4532
- var activeRuntimeEvidenceStrategies = (deployment) => deployment.enabled ? deployment.strategies.filter((strategy) => strategy.enabled) : [];
4533
- var unwrapRuntimeEvidenceRows = (value, field) => (Array.isArray(value) ? value : []).map((candidate) => {
4534
- const record = isRecord(candidate) ? candidate : null;
4535
- const nested = record && isRecord(record[field]) ? record[field] : null;
4536
- return nested ?? record;
4537
- }).filter((record) => record != null);
4538
- var assertCurrentRuntimeEvidenceArtifact = (artifact) => {
4539
- if (!isRecord(artifact) || artifact.reportType !== "runtime-evidence") {
4540
- throw new Error("Invalid runtime evidence artifact");
4541
- }
4542
- const deployment = parseRuntimeEvidenceDeploymentSnapshot(
4543
- artifact.deployment
4544
- );
4545
- const activeStrategies = activeRuntimeEvidenceStrategies(deployment);
4546
- if (activeStrategies.length === 0) {
4547
- throw new Error("Runtime evidence deployment has no enabled strategies");
4548
- }
4549
- const runtime = isRecord(artifact.runtime) ? artifact.runtime : null;
4550
- if (!runtime) {
4551
- throw new Error("Runtime evidence payload is missing");
4552
- }
4553
- if ("strategyConfigs" in runtime) {
4554
- throw new Error(
4555
- "Runtime evidence payload contains removed strategyConfigs data"
4556
- );
4557
- }
4558
- if ("evaluationStatsBuckets" in runtime) {
4559
- throw new Error(
4560
- "Runtime evidence payload contains removed lineage-less evaluationStatsBuckets data"
4561
- );
4562
- }
4563
- const rowFields = [
4564
- "trades",
4565
- "signals",
4566
- "evaluations",
4567
- "lineageScopes"
4568
- ];
4569
- for (const field of rowFields) {
4570
- if (!Array.isArray(runtime[field])) {
4571
- throw new Error(`Runtime evidence payload ${field} must be an array`);
4572
- }
4573
- }
4574
- const snapshots = new Map(
4575
- activeStrategies.map((strategy) => [strategy.strategyName, strategy])
4576
- );
4577
- const assertRows = (label, rows, lineageField) => {
4578
- for (const row of rows) {
4579
- const strategyName = String(row.strategy ?? "").trim();
4580
- const strategy = snapshots.get(strategyName);
4581
- if (!strategy || row.deploymentId !== deployment.id || row.accountId !== deployment.accountId || !runtimeLineageMatchesStrategySnapshot({
4582
- lineage: isRecord(row[lineageField]) ? row[lineageField] : void 0,
4583
- deployment,
4584
- strategy
4585
- })) {
4586
- throw new Error(
4587
- `Runtime evidence ${label} row is outside the current embedded deployment lineage`
4588
- );
4589
- }
4590
- }
4591
- };
4592
- assertRows(
4593
- "trade",
4594
- unwrapRuntimeEvidenceRows(runtime.trades, "trade"),
4595
- "runtimeLineage"
4596
- );
4597
- assertRows(
4598
- "signal",
4599
- unwrapRuntimeEvidenceRows(runtime.signals, "signal"),
4600
- "runtimeLineage"
4601
- );
4602
- assertRows(
4603
- "evaluation",
4604
- unwrapRuntimeEvidenceRows(runtime.evaluations, "evaluation"),
4605
- "runtimeLineage"
4606
- );
4607
- assertRows(
4608
- "lineage scope",
4609
- unwrapRuntimeEvidenceRows(runtime.lineageScopes, "lineageScope"),
4610
- "lineage"
4611
- );
4612
- return deployment;
4613
- };
4614
- var resolveRuntimeEvidenceTickerUniverse = ({
4615
- deployment,
4616
- lineageScopes,
4617
- fallbackTickers
4618
- }) => {
4619
- const declaredTickers = deployment.tickers?.filter(isNonEmptyString) ?? [];
4620
- if (declaredTickers.length > 0) {
4621
- return {
4622
- ...deployment,
4623
- tickers: [
4624
- ...new Set(declaredTickers.map((ticker) => ticker.trim()))
4625
- ].sort()
4626
- };
4627
- }
4628
- const activeStrategies = activeRuntimeEvidenceStrategies(deployment);
4629
- if (activeStrategies.length > 0 && activeStrategies.every((strategy) => strategy.selection?.tickers?.length)) {
4630
- return {
4631
- ...deployment,
4632
- tickers: [
4633
- ...new Set(
4634
- activeStrategies.flatMap(
4635
- (strategy) => strategy.selection?.tickers ?? []
4636
- )
4637
- )
4638
- ].sort()
4639
- };
4640
- }
4641
- const strategiesByName = new Map(
4642
- activeStrategies.map((strategy) => [strategy.strategyName, strategy])
4643
- );
4644
- const tickers = /* @__PURE__ */ new Set();
4645
- for (const scope of lineageScopes) {
4646
- const strategy = strategiesByName.get(scope.strategy);
4647
- if (!strategy || scope.deploymentId !== deployment.id || scope.accountId !== deployment.accountId || !isNonEmptyString(scope.symbol) || !runtimeLineageMatchesStrategySnapshot({
4648
- lineage: scope.lineage,
4649
- deployment,
4650
- strategy
4651
- })) {
4652
- continue;
4653
- }
4654
- tickers.add(scope.symbol.trim());
4655
- }
4656
- if (tickers.size === 0) {
4657
- const verifiedFallbackTickers = fallbackTickers?.filter(isNonEmptyString) ?? [];
4658
- if (verifiedFallbackTickers.length > 0) {
4659
- return {
4660
- ...deployment,
4661
- tickers: [
4662
- ...new Set(verifiedFallbackTickers.map((ticker) => ticker.trim()))
4663
- ].sort()
4664
- };
4665
- }
4666
- throw new Error(
4667
- "Runtime evidence has no immutable ticker universe for the embedded deployment composition"
4668
- );
4669
- }
4670
- return { ...deployment, tickers: [...tickers].sort() };
4671
- };
4672
- var runtimeDeploymentFromEvidence = (deployment) => ({
4673
- id: deployment.id,
4674
- deploymentCompositionId: deployment.deploymentCompositionId,
4675
- label: deployment.label,
4676
- connectorName: deployment.connectorName,
4677
- provider: deployment.provider,
4678
- accountId: deployment.accountId,
4679
- enabled: deployment.enabled,
4680
- strategies: deployment.strategies.map(
4681
- ({ strategyName, strategyRevision, enabled, controlState, selection }) => ({
4682
- strategyName,
4683
- strategyRevision,
4684
- enabled,
4685
- controlState,
4686
- ...selection ? { selection } : {}
4687
- })
4688
- ),
4689
- ...deployment.assetClasses ? { assetClasses: [...deployment.assetClasses] } : {},
4690
- ...deployment.tickers ? { tickers: [...deployment.tickers] } : {}
4691
- });
4454
+ var runtimeEvidenceDeployment_exports = {};
4455
+ __reExport(runtimeEvidenceDeployment_exports, require("@tradejs/node/diagnostics"));
4692
4456
 
4693
4457
  // src/lib/replay/runtimeEvidenceSource.ts
4694
4458
  var asRecord = (value) => value && typeof value === "object" && !Array.isArray(value) ? value : null;
@@ -4703,7 +4467,7 @@ var assertRuntimeRowsMatchDeployment = ({
4703
4467
  deployment
4704
4468
  }) => {
4705
4469
  const activeStrategies = new Set(
4706
- activeRuntimeEvidenceStrategies(deployment).map(
4470
+ (0, runtimeEvidenceDeployment_exports.activeRuntimeEvidenceStrategies)(deployment).map(
4707
4471
  ({ strategyName }) => strategyName
4708
4472
  )
4709
4473
  );
@@ -4727,7 +4491,7 @@ var readRuntimeEvidenceArtifact = async ({
4727
4491
  if (!root || !runtime) {
4728
4492
  throw new Error(`Invalid runtime evidence JSON: ${resolvedPath}`);
4729
4493
  }
4730
- assertCurrentRuntimeEvidenceArtifact(root);
4494
+ (0, runtimeEvidenceDeployment_exports.assertCurrentRuntimeEvidenceArtifact)(root);
4731
4495
  const rootWindow = asRecord(root.window);
4732
4496
  const runtimeWindow = asRecord(runtime.window);
4733
4497
  return {
@@ -4737,8 +4501,8 @@ var readRuntimeEvidenceArtifact = async ({
4737
4501
  userName: String(root.userName ?? runtime.userName ?? "").trim(),
4738
4502
  startTime: asFiniteNumber(rootWindow?.startTime) ?? asFiniteNumber(runtimeWindow?.startTime),
4739
4503
  endTime: asFiniteNumber(rootWindow?.endTime) ?? asFiniteNumber(runtimeWindow?.endTime),
4740
- deployment: resolveRuntimeEvidenceTickerUniverse({
4741
- deployment: parseRuntimeEvidenceDeploymentSnapshot(root.deployment),
4504
+ deployment: (0, runtimeEvidenceDeployment_exports.resolveRuntimeEvidenceTickerUniverse)({
4505
+ deployment: (0, runtimeEvidenceDeployment_exports.parseRuntimeEvidenceDeploymentSnapshot)(root.deployment),
4742
4506
  lineageScopes: unwrapRows(
4743
4507
  runtime.lineageScopes,
4744
4508
  "lineageScope"
@@ -4999,7 +4763,7 @@ var import_redis3 = require("@tradejs/infra/redis");
4999
4763
  var import_connectors6 = require("@tradejs/node/connectors");
5000
4764
  var import_cli4 = require("@tradejs/node/cli");
5001
4765
  var import_strategies4 = require("@tradejs/node/strategies");
5002
- var import_runtimeStrategies3 = require("@tradejs/node/runtimeStrategies");
4766
+ var import_runtimeStrategies2 = require("@tradejs/node/runtimeStrategies");
5003
4767
 
5004
4768
  // src/lib/replay/portfolioReplayConnector.ts
5005
4769
  var import_constants3 = require("@tradejs/core/constants");
@@ -5990,7 +5754,7 @@ var loadRuntimeStrategies = async (runtimeStrategies) => {
5990
5754
  if (!strategyCreator) {
5991
5755
  throw new Error(`Unknown strategy: ${strategyName}`);
5992
5756
  }
5993
- const installed = await (0, import_runtimeStrategies3.getRuntimeStrategyPackageMetadata)({
5757
+ const installed = await (0, import_runtimeStrategies2.getRuntimeStrategyPackageMetadata)({
5994
5758
  strategyName,
5995
5759
  projectRoot: replayProjectRoot,
5996
5760
  strategyModule
@@ -9909,8 +9673,8 @@ var replayBacktest = async () => {
9909
9673
  );
9910
9674
  }
9911
9675
  const replayComposition = evidenceMetadata ? {
9912
- deployment: runtimeDeploymentFromEvidence(evidenceMetadata.deployment),
9913
- strategies: activeRuntimeEvidenceStrategies(
9676
+ deployment: (0, runtimeEvidenceDeployment_exports.runtimeDeploymentFromEvidence)(evidenceMetadata.deployment),
9677
+ strategies: (0, runtimeEvidenceDeployment_exports.activeRuntimeEvidenceStrategies)(
9914
9678
  evidenceMetadata.deployment
9915
9679
  ).map(
9916
9680
  ({
@@ -9962,7 +9726,7 @@ var replayBacktest = async () => {
9962
9726
  return {
9963
9727
  ...strategy,
9964
9728
  strategyConfig,
9965
- strategyRevision: (0, import_runtimeStrategies4.computeStrategyRevision)({
9729
+ strategyRevision: (0, import_runtimeStrategies3.computeStrategyRevision)({
9966
9730
  strategyName: strategy.strategyName,
9967
9731
  strategyPackage: strategy.strategyPackage,
9968
9732
  strategyPackageVersion: strategy.strategyPackageVersion,
@@ -9972,7 +9736,7 @@ var replayBacktest = async () => {
9972
9736
  })
9973
9737
  };
9974
9738
  });
9975
- const researchDeploymentCompositionId = (0, import_runtimeStrategies4.computeDeploymentCompositionId)({
9739
+ const researchDeploymentCompositionId = (0, import_runtimeStrategies3.computeDeploymentCompositionId)({
9976
9740
  deploymentId: deployment.id,
9977
9741
  connectorName: deployment.connectorName,
9978
9742
  provider: deployment.provider,