@senpi/trading-recipe 1.0.70 → 1.0.71

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 (106) hide show
  1. package/README.md +1 -1
  2. package/dist/actions/close-position/close-position.action.js +4 -4
  3. package/dist/actions/close-position/close-position.action.js.map +1 -1
  4. package/dist/actions/open-position/open-position.action.d.ts.map +1 -1
  5. package/dist/actions/open-position/open-position.action.js +4 -5
  6. package/dist/actions/open-position/open-position.action.js.map +1 -1
  7. package/dist/actions/types.d.ts +1 -1
  8. package/dist/actions/types.d.ts.map +1 -1
  9. package/dist/cli/guide-commands.d.ts +1 -0
  10. package/dist/cli/guide-commands.d.ts.map +1 -1
  11. package/dist/cli/guide-commands.js +102 -12
  12. package/dist/cli/guide-commands.js.map +1 -1
  13. package/dist/cli/senpi-commands.d.ts.map +1 -1
  14. package/dist/cli/senpi-commands.js +27 -10
  15. package/dist/cli/senpi-commands.js.map +1 -1
  16. package/dist/dsl/plugin/index.d.ts.map +1 -1
  17. package/dist/dsl/plugin/index.js +3 -4
  18. package/dist/dsl/plugin/index.js.map +1 -1
  19. package/dist/index.d.ts +1 -1
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +72 -15
  22. package/dist/index.js.map +1 -1
  23. package/dist/runtime/build-action-scan-payload.d.ts +4 -4
  24. package/dist/runtime/build-action-scan-payload.d.ts.map +1 -1
  25. package/dist/runtime/build-action-scan-payload.js +15 -19
  26. package/dist/runtime/build-action-scan-payload.js.map +1 -1
  27. package/dist/runtime/create-action-context.d.ts +3 -3
  28. package/dist/runtime/create-action-context.d.ts.map +1 -1
  29. package/dist/runtime/create-action-context.js +5 -5
  30. package/dist/runtime/create-action-context.js.map +1 -1
  31. package/dist/runtime/create-actions.d.ts +1 -1
  32. package/dist/runtime/create-actions.d.ts.map +1 -1
  33. package/dist/runtime/create-actions.js +2 -3
  34. package/dist/runtime/create-actions.js.map +1 -1
  35. package/dist/runtime/create-runtime-context.d.ts +12 -12
  36. package/dist/runtime/create-runtime-context.d.ts.map +1 -1
  37. package/dist/runtime/create-runtime-context.js +15 -13
  38. package/dist/runtime/create-runtime-context.js.map +1 -1
  39. package/dist/runtime/create-scanner-module.d.ts +1 -1
  40. package/dist/runtime/create-scanner-module.js +4 -4
  41. package/dist/runtime/create-scanner-module.js.map +1 -1
  42. package/dist/runtime/index.d.ts +4 -4
  43. package/dist/runtime/index.d.ts.map +1 -1
  44. package/dist/runtime/index.js +3 -3
  45. package/dist/runtime/index.js.map +1 -1
  46. package/dist/runtime/load-trading-recipe.d.ts +2 -2
  47. package/dist/runtime/load-trading-recipe.d.ts.map +1 -1
  48. package/dist/runtime/load-trading-recipe.js +22 -10
  49. package/dist/runtime/load-trading-recipe.js.map +1 -1
  50. package/dist/runtime/map-strategies-registration.d.ts +6 -4
  51. package/dist/runtime/map-strategies-registration.d.ts.map +1 -1
  52. package/dist/runtime/map-strategies-registration.js +14 -22
  53. package/dist/runtime/map-strategies-registration.js.map +1 -1
  54. package/dist/runtime/map-strategies.d.ts +6 -4
  55. package/dist/runtime/map-strategies.d.ts.map +1 -1
  56. package/dist/runtime/map-strategies.js +42 -44
  57. package/dist/runtime/map-strategies.js.map +1 -1
  58. package/dist/runtime/recipe-version.d.ts +15 -0
  59. package/dist/runtime/recipe-version.d.ts.map +1 -0
  60. package/dist/runtime/recipe-version.js +25 -0
  61. package/dist/runtime/recipe-version.js.map +1 -0
  62. package/dist/runtime/reconcile-state.d.ts +1 -1
  63. package/dist/runtime/reconcile-state.js +1 -1
  64. package/dist/runtime/run.d.ts +2 -0
  65. package/dist/runtime/run.d.ts.map +1 -1
  66. package/dist/runtime/run.js +1 -0
  67. package/dist/runtime/run.js.map +1 -1
  68. package/dist/runtime/runtime.d.ts +3 -4
  69. package/dist/runtime/runtime.d.ts.map +1 -1
  70. package/dist/runtime/runtime.js +16 -38
  71. package/dist/runtime/runtime.js.map +1 -1
  72. package/dist/runtime/state-layout.d.ts +48 -0
  73. package/dist/runtime/state-layout.d.ts.map +1 -0
  74. package/dist/runtime/state-layout.js +87 -0
  75. package/dist/runtime/state-layout.js.map +1 -0
  76. package/dist/runtime/strategy-registry.d.ts +17 -0
  77. package/dist/runtime/strategy-registry.d.ts.map +1 -1
  78. package/dist/runtime/strategy-registry.js +32 -0
  79. package/dist/runtime/strategy-registry.js.map +1 -1
  80. package/dist/runtime/trading-recipe-schema.d.ts +16 -634
  81. package/dist/runtime/trading-recipe-schema.d.ts.map +1 -1
  82. package/dist/runtime/trading-recipe-schema.js +3 -9
  83. package/dist/runtime/trading-recipe-schema.js.map +1 -1
  84. package/dist/scanners/engine/engine.d.ts.map +1 -1
  85. package/dist/scanners/engine/engine.js +0 -7
  86. package/dist/scanners/engine/engine.js.map +1 -1
  87. package/dist/scanners/runtime-module.d.ts +5 -6
  88. package/dist/scanners/runtime-module.d.ts.map +1 -1
  89. package/dist/scanners/runtime-module.js +7 -10
  90. package/dist/scanners/runtime-module.js.map +1 -1
  91. package/dist/scripts/run-dsl-standalone-live.js +5 -7
  92. package/dist/scripts/run-dsl-standalone-live.js.map +1 -1
  93. package/dist/scripts/run-dsl-standalone-mock.js +3 -4
  94. package/dist/scripts/run-dsl-standalone-mock.js.map +1 -1
  95. package/dist/types/runtime.d.ts +1 -1
  96. package/dist/types/runtime.d.ts.map +1 -1
  97. package/examples/strategies/dsl-showcase.yaml +8 -3
  98. package/examples/strategies/dsl.yaml +4 -5
  99. package/examples/strategies/fox-minimal-loosened.yaml +8 -9
  100. package/examples/strategies/fox-minimal.yaml +8 -9
  101. package/examples/strategies/minimal.yaml +7 -8
  102. package/examples/strategies/viper.yaml +7 -8
  103. package/examples/strategies/wolf.yaml +7 -8
  104. package/examples/yamls/sample-with-dsl-and-emerging-movers.yaml +9 -10
  105. package/openclaw.plugin.json +1 -1
  106. package/package.json +1 -1
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Build RuntimeContext for actions: strategyStates with live StrategyStateImpl from SenpiClient.
2
+ * Build RuntimeContext for actions: strategyState with live StrategyStateImpl from SenpiClient.
3
3
  */
4
4
  import type { StrategyConfig, StrategyState } from "../types/strategy.js";
5
5
  import type { RuntimeContext } from "../types/runtime.js";
@@ -9,14 +9,6 @@ import type { ContextBuilder } from "../context/types.js";
9
9
  import type { NotificationService } from "../types/notification.js";
10
10
  import type { ScannerRuntimeModule } from "../scanners/runtime-module.js";
11
11
  import type { MaxLeverageCache } from "../leverage/max-leverage-cache.js";
12
- export interface GetUsedSlotsByStrategy {
13
- getUsedSlotsByStrategy(addresses: string[]): Promise<Record<string, number>>;
14
- }
15
- /**
16
- * Build a Map of address → StrategyState for RuntimeContext.
17
- * Each entry is a live StrategyStateImpl backed by SenpiClient.
18
- */
19
- export declare function createStrategyStatesMap(strategiesMap: Map<string, StrategyConfig>, stateManager: GetUsedSlotsByStrategy, senpi: SenpiClient): Map<string, StrategyState>;
20
12
  export interface CreateRuntimeContextDeps {
21
13
  senpi: SenpiClient;
22
14
  hookSystem: HookSystem;
@@ -24,12 +16,20 @@ export interface CreateRuntimeContextDeps {
24
16
  contextBuilder: ContextBuilder;
25
17
  riskGuard: RiskGuard;
26
18
  notifications: NotificationService;
27
- stateManager: GetUsedSlotsByStrategy;
28
19
  scannerModule?: ScannerRuntimeModule;
29
20
  maxLeverageCache: MaxLeverageCache;
30
21
  }
31
22
  /**
32
- * Build RuntimeContext from strategies map and deps. Used by createActions to pass into action factories.
23
+ * Build a live StrategyState from a StrategyConfig and SenpiClient.
24
+ */
25
+ export declare function createStrategyState(strategyConfig: StrategyConfig, senpi: SenpiClient): StrategyState;
26
+ /**
27
+ * Build a single-entry Map<address, StrategyState> from a StrategyConfig.
28
+ * Used by DSL plugin and standalone scripts that need a Map interface.
29
+ */
30
+ export declare function createStrategyStatesMap(strategyConfig: StrategyConfig, senpi: SenpiClient): Map<string, StrategyState>;
31
+ /**
32
+ * Build RuntimeContext from strategy config and deps. Used by createActions to pass into action factories.
33
33
  */
34
- export declare function createRuntimeContext(strategiesMap: Map<string, StrategyConfig>, deps: CreateRuntimeContextDeps): RuntimeContext;
34
+ export declare function createRuntimeContext(strategyConfig: StrategyConfig, deps: CreateRuntimeContextDeps): RuntimeContext;
35
35
  //# sourceMappingURL=create-runtime-context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"create-runtime-context.d.ts","sourceRoot":"","sources":["../../src/runtime/create-runtime-context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAG1E,MAAM,WAAW,sBAAsB;IACrC,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC9E;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,EAC1C,YAAY,EAAE,sBAAsB,EACpC,KAAK,EAAE,WAAW,GACjB,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAM5B;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,WAAW,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,EAAE,SAAS,CAAC;IACrB,aAAa,EAAE,mBAAmB,CAAC;IACnC,YAAY,EAAE,sBAAsB,CAAC;IACrC,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,EAC1C,IAAI,EAAE,wBAAwB,GAC7B,cAAc,CAahB"}
1
+ {"version":3,"file":"create-runtime-context.d.ts","sourceRoot":"","sources":["../../src/runtime/create-runtime-context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC9E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mCAAmC,CAAC;AAG1E,MAAM,WAAW,wBAAwB;IACvC,KAAK,EAAE,WAAW,CAAC;IACnB,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,WAAW,CAAC;IACzB,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,EAAE,SAAS,CAAC;IACrB,aAAa,EAAE,mBAAmB,CAAC;IACnC,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,cAAc,EAAE,cAAc,EAC9B,KAAK,EAAE,WAAW,GACjB,aAAa,CAEf;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,cAAc,EAC9B,KAAK,EAAE,WAAW,GACjB,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAE5B;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,cAAc,EAAE,cAAc,EAC9B,IAAI,EAAE,wBAAwB,GAC7B,cAAc,CAahB"}
@@ -1,23 +1,25 @@
1
1
  /**
2
- * Build RuntimeContext for actions: strategyStates with live StrategyStateImpl from SenpiClient.
2
+ * Build RuntimeContext for actions: strategyState with live StrategyStateImpl from SenpiClient.
3
3
  */
4
4
  import { StrategyStateImpl } from "../strategy/strategy-state.js";
5
5
  /**
6
- * Build a Map of address StrategyState for RuntimeContext.
7
- * Each entry is a live StrategyStateImpl backed by SenpiClient.
6
+ * Build a live StrategyState from a StrategyConfig and SenpiClient.
8
7
  */
9
- export function createStrategyStatesMap(strategiesMap, stateManager, senpi) {
10
- const out = new Map();
11
- for (const [key, config] of strategiesMap) {
12
- out.set(key, new StrategyStateImpl(config, senpi));
13
- }
14
- return out;
8
+ export function createStrategyState(strategyConfig, senpi) {
9
+ return new StrategyStateImpl(strategyConfig, senpi);
15
10
  }
16
11
  /**
17
- * Build RuntimeContext from strategies map and deps. Used by createActions to pass into action factories.
12
+ * Build a single-entry Map<address, StrategyState> from a StrategyConfig.
13
+ * Used by DSL plugin and standalone scripts that need a Map interface.
18
14
  */
19
- export function createRuntimeContext(strategiesMap, deps) {
20
- const strategyStates = createStrategyStatesMap(strategiesMap, deps.stateManager, deps.senpi);
15
+ export function createStrategyStatesMap(strategyConfig, senpi) {
16
+ return new Map([[strategyConfig.address, createStrategyState(strategyConfig, senpi)]]);
17
+ }
18
+ /**
19
+ * Build RuntimeContext from strategy config and deps. Used by createActions to pass into action factories.
20
+ */
21
+ export function createRuntimeContext(strategyConfig, deps) {
22
+ const strategyState = createStrategyState(strategyConfig, deps.senpi);
21
23
  return {
22
24
  senpi: deps.senpi,
23
25
  hookSystem: deps.hookSystem,
@@ -25,7 +27,7 @@ export function createRuntimeContext(strategiesMap, deps) {
25
27
  contextBuilder: deps.contextBuilder,
26
28
  riskGuard: deps.riskGuard,
27
29
  notifications: deps.notifications,
28
- strategyStates,
30
+ strategyState,
29
31
  scannerModule: deps.scannerModule,
30
32
  maxLeverageCache: deps.maxLeverageCache,
31
33
  };
@@ -1 +1 @@
1
- {"version":3,"file":"create-runtime-context.js","sourceRoot":"","sources":["../../src/runtime/create-runtime-context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAMlE;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,aAA0C,EAC1C,YAAoC,EACpC,KAAkB;IAElB,MAAM,GAAG,GAAG,IAAI,GAAG,EAAyB,CAAC;IAC7C,KAAK,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC1C,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,iBAAiB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAcD;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,aAA0C,EAC1C,IAA8B;IAE9B,MAAM,cAAc,GAAG,uBAAuB,CAAC,aAAa,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7F,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,cAAc;QACd,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;KACxC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"create-runtime-context.js","sourceRoot":"","sources":["../../src/runtime/create-runtime-context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAalE;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,cAA8B,EAC9B,KAAkB;IAElB,OAAO,IAAI,iBAAiB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC;AACtD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,cAA8B,EAC9B,KAAkB;IAElB,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,EAAE,mBAAmB,CAAC,cAAc,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AACzF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAClC,cAA8B,EAC9B,IAA8B;IAE9B,MAAM,aAAa,GAAG,mBAAmB,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACtE,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,cAAc,EAAE,IAAI,CAAC,cAAc;QACnC,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,aAAa;QACb,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;KACxC,CAAC;AACJ,CAAC"}
@@ -8,7 +8,7 @@ import type { TradingRecipeConfig } from "./trading-recipe-config.js";
8
8
  /**
9
9
  * Builds the standalone scanner runtime module from parsed trading recipe config.
10
10
  * Scanner registrations are normalized into factories so YAML-level ids and
11
- * optional config overrides become per-strategy scanner instances.
11
+ * optional config overrides become strategy-scoped scanner instances.
12
12
  */
13
13
  export declare function createScannerModuleFromTradingRecipe(config: TradingRecipeConfig, stateDir: string, providers?: ScannerDataProviders, logger?: ScannerLogger): ReturnType<typeof createScannerRuntimeModule>;
14
14
  //# sourceMappingURL=create-scanner-module.d.ts.map
@@ -3,16 +3,16 @@
3
3
  */
4
4
  import { createScannerRuntimeModule } from "../scanners/runtime-module.js";
5
5
  import { prepareScannerInputs } from "../scanners/prepare-scanner-inputs.js";
6
- import { mapStrategiesToScannerRegistration } from "./map-strategies-registration.js";
6
+ import { resolveStrategyRegistration } from "./map-strategies-registration.js";
7
7
  import { ScannerRegistry } from "./scanner-registry.js";
8
8
  import { buildScannerComposition } from "./scanner-composition.js";
9
9
  /**
10
10
  * Builds the standalone scanner runtime module from parsed trading recipe config.
11
11
  * Scanner registrations are normalized into factories so YAML-level ids and
12
- * optional config overrides become per-strategy scanner instances.
12
+ * optional config overrides become strategy-scoped scanner instances.
13
13
  */
14
14
  export function createScannerModuleFromTradingRecipe(config, stateDir, providers, logger) {
15
- const strategies = mapStrategiesToScannerRegistration(config);
15
+ const strategy = resolveStrategyRegistration(config);
16
16
  const scanners = [];
17
17
  for (const sc of config.scanners ?? []) {
18
18
  scanners.push(ScannerRegistry.createScanner(sc.type, sc.name, sc.config, sc.depends_on));
@@ -21,7 +21,7 @@ export function createScannerModuleFromTradingRecipe(config, stateDir, providers
21
21
  const composition = buildScannerComposition(config, preparedScanners.map((scanner) => scanner.definition), logger);
22
22
  return createScannerRuntimeModule({
23
23
  stateDir,
24
- strategies,
24
+ strategy,
25
25
  scanners: preparedScanners.map((scanner) => scanner.factory),
26
26
  composition,
27
27
  providers,
@@ -1 +1 @@
1
- {"version":3,"file":"create-scanner-module.js","sourceRoot":"","sources":["../../src/runtime/create-scanner-module.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAE3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAE7E,OAAO,EAAE,kCAAkC,EAAE,MAAM,kCAAkC,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAEnE;;;;GAIG;AACH,MAAM,UAAU,oCAAoC,CAClD,MAA2B,EAC3B,QAAgB,EAChB,SAAgC,EAChC,MAAsB;IAEtB,MAAM,UAAU,GAAG,kCAAkC,CAAC,MAAM,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;QACvC,QAAQ,CAAC,IAAI,CACX,eAAe,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,CAC1E,CAAC;IACJ,CAAC;IACD,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,uBAAuB,CACzC,MAAM,EACN,gBAAgB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,EACrD,MAAM,CACP,CAAC;IACF,OAAO,0BAA0B,CAAC;QAChC,QAAQ;QACR,UAAU;QACV,QAAQ,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;QAC5D,WAAW;QACX,SAAS;QACT,MAAM;KACP,CAAC,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"create-scanner-module.js","sourceRoot":"","sources":["../../src/runtime/create-scanner-module.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAE3E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAE7E,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;AAEnE;;;;GAIG;AACH,MAAM,UAAU,oCAAoC,CAClD,MAA2B,EAC3B,QAAgB,EAChB,SAAgC,EAChC,MAAsB;IAEtB,MAAM,QAAQ,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,KAAK,MAAM,EAAE,IAAI,MAAM,CAAC,QAAQ,IAAI,EAAE,EAAE,CAAC;QACvC,QAAQ,CAAC,IAAI,CACX,eAAe,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC,CAC1E,CAAC;IACJ,CAAC;IACD,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,uBAAuB,CACzC,MAAM,EACN,gBAAgB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,EACrD,MAAM,CACP,CAAC;IACF,OAAO,0BAA0B,CAAC;QAChC,QAAQ;QACR,QAAQ;QACR,QAAQ,EAAE,gBAAgB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC;QAC5D,WAAW;QACX,SAAS;QACT,MAAM;KACP,CAAC,CAAC;AACL,CAAC"}
@@ -13,8 +13,8 @@ export type { TradingRecipeConfig, TradingRecipeStrategy, TradingRecipeScanner,
13
13
  export { tradingRecipeConfigSchema } from "./trading-recipe-config.js";
14
14
  export { resolveEnvInString, resolveEnvInObject } from "./env-resolve.js";
15
15
  export { parseInterval } from "./parse-interval.js";
16
- export { mapStrategiesToConfig } from "./map-strategies.js";
17
- export { mapStrategiesToScannerRegistration } from "./map-strategies-registration.js";
16
+ export { resolveStrategyConfig, mapStrategiesToConfig } from "./map-strategies.js";
17
+ export { resolveStrategyRegistration, mapStrategiesToScannerRegistration } from "./map-strategies-registration.js";
18
18
  export { mapTradingRecipeExitToDslConfig } from "./map-exit-config.js";
19
19
  export { ScannerRegistry } from "./scanner-registry.js";
20
20
  export { ActionRegistry } from "./action-registry.js";
@@ -30,8 +30,8 @@ export type { NotificationServiceOptions } from "./notifications.js";
30
30
  export { createScannerModuleFromTradingRecipe } from "./create-scanner-module.js";
31
31
  export { createActionContext } from "./create-action-context.js";
32
32
  export type { CreateActionContextDeps } from "./create-action-context.js";
33
- export { createRuntimeContext, createStrategyStatesMap } from "./create-runtime-context.js";
34
- export type { CreateRuntimeContextDeps, GetUsedSlotsByStrategy } from "./create-runtime-context.js";
33
+ export { createRuntimeContext, createStrategyState } from "./create-runtime-context.js";
34
+ export type { CreateRuntimeContextDeps } from "./create-runtime-context.js";
35
35
  export { createActions } from "./create-actions.js";
36
36
  export type { CreateActionsOptions, CreateActionsResult, ActionWithMeta } from "./create-actions.js";
37
37
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,YAAY,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AACrF,YAAY,EAAE,mCAAmC,EAAE,MAAM,uCAAuC,CAAC;AACjG,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,YAAY,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC3J,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,kCAAkC,EAAE,MAAM,kCAAkC,CAAC;AACtF,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,YAAY,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACvI,YAAY,EAAE,YAAY,EAAE,sBAAsB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACjH,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,YAAY,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,oCAAoC,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,YAAY,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAC5F,YAAY,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACpG,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAC7D,YAAY,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACzE,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AACrF,YAAY,EAAE,mCAAmC,EAAE,MAAM,uCAAuC,CAAC;AACjG,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,YAAY,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,YAAY,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC3J,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,2BAA2B,EAAE,kCAAkC,EAAE,MAAM,kCAAkC,CAAC;AACnH,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,YAAY,EAAE,6BAA6B,EAAE,MAAM,gCAAgC,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACvI,YAAY,EAAE,YAAY,EAAE,sBAAsB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACjH,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,YAAY,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,oCAAoC,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,YAAY,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAC1E,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACxF,YAAY,EAAE,wBAAwB,EAAE,MAAM,6BAA6B,CAAC;AAC5E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
@@ -8,8 +8,8 @@ export { Runtime } from "./runtime.js";
8
8
  export { tradingRecipeConfigSchema } from "./trading-recipe-config.js";
9
9
  export { resolveEnvInString, resolveEnvInObject } from "./env-resolve.js";
10
10
  export { parseInterval } from "./parse-interval.js";
11
- export { mapStrategiesToConfig } from "./map-strategies.js";
12
- export { mapStrategiesToScannerRegistration } from "./map-strategies-registration.js";
11
+ export { resolveStrategyConfig, mapStrategiesToConfig } from "./map-strategies.js";
12
+ export { resolveStrategyRegistration, mapStrategiesToScannerRegistration } from "./map-strategies-registration.js";
13
13
  export { mapTradingRecipeExitToDslConfig } from "./map-exit-config.js";
14
14
  export { ScannerRegistry } from "./scanner-registry.js";
15
15
  export { ActionRegistry } from "./action-registry.js";
@@ -21,6 +21,6 @@ export { createRiskGuard } from "./risk-guard.js";
21
21
  export { createNotificationService } from "./notifications.js";
22
22
  export { createScannerModuleFromTradingRecipe } from "./create-scanner-module.js";
23
23
  export { createActionContext } from "./create-action-context.js";
24
- export { createRuntimeContext, createStrategyStatesMap } from "./create-runtime-context.js";
24
+ export { createRuntimeContext, createStrategyState } from "./create-runtime-context.js";
25
25
  export { createActions } from "./create-actions.js";
26
26
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AAErF,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,kCAAkC,EAAE,MAAM,kCAAkC,CAAC;AACtF,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAExE,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEvI,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAE/D,OAAO,EAAE,oCAAoC,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,EAAE,oBAAoB,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAE5F,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,OAAO,EAAE,4BAA4B,EAAE,MAAM,uCAAuC,CAAC;AAErF,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AACnF,OAAO,EAAE,2BAA2B,EAAE,kCAAkC,EAAE,MAAM,kCAAkC,CAAC;AACnH,OAAO,EAAE,+BAA+B,EAAE,MAAM,sBAAsB,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAExE,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEvI,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAE/D,OAAO,EAAE,oCAAoC,EAAE,MAAM,4BAA4B,CAAC;AAClF,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAExF,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
@@ -9,9 +9,9 @@ export interface LoadTradingRecipeOptions {
9
9
  }
10
10
  /**
11
11
  * Minimal valid YAML structure shown in validation errors so users can fix their file.
12
- * Keep this in sync with tradingRecipeConfigSchema (name + non-empty strategies with wallet).
12
+ * Keep this in sync with tradingRecipeConfigSchema (name + strategy with wallet).
13
13
  */
14
- export declare const MINIMAL_RECIPE_YAML_SAMPLE = "# Required: name and at least one strategy with a wallet\nname: my-recipe\nstrategies:\n my-first-strategy:\n wallet: \"your-wallet-address\"\n # optional: budget, slots, enabled, etc.\n\n# Optional: scanners, actions, exit. Run: openclaw senpi guide examples\n";
14
+ export declare const MINIMAL_RECIPE_YAML_SAMPLE = "# Required: name and a strategy with a wallet\nname: my-recipe\n# version: 1 # optional; defaults to current (1). Supports integer or semver string.\nstrategy:\n wallet: \"your-wallet-address\"\n # optional: budget, slots, enabled, etc.\n\n# Optional: scanners, actions, exit. Run: openclaw senpi guide examples\n";
15
15
  /**
16
16
  * Load trading recipe from a file path or YAML string.
17
17
  * - If fromPath is true, pathOrContent is a file path.
@@ -1 +1 @@
1
- {"version":3,"file":"load-trading-recipe.d.ts","sourceRoot":"","sources":["../../src/runtime/load-trading-recipe.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAA6B,KAAK,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAIjG,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,eAAO,MAAM,0BAA0B,iRAQtC,CAAC;AAwFF;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,mBAAmB,CAAC,CA6D9B"}
1
+ {"version":3,"file":"load-trading-recipe.d.ts","sourceRoot":"","sources":["../../src/runtime/load-trading-recipe.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAA6B,KAAK,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAKjG,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;GAGG;AACH,eAAO,MAAM,0BAA0B,iUAQtC,CAAC;AAwFF;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,aAAa,EAAE,MAAM,EACrB,OAAO,CAAC,EAAE,wBAAwB,GACjC,OAAO,CAAC,mBAAmB,CAAC,CA4E9B"}
@@ -10,16 +10,17 @@ import { DslConfigValidationError, parseDslPluginConfig } from "../dsl/config/in
10
10
  import { tradingRecipeConfigSchema } from "./trading-recipe-schema.js";
11
11
  import { resolveEnvInObject } from "./env-resolve.js";
12
12
  import { mapTradingRecipeExitToDslConfig } from "./map-exit-config.js";
13
+ import { CURRENT_RECIPE_VERSION, SUPPORTED_RECIPE_VERSIONS, extractMajorVersion } from "./recipe-version.js";
13
14
  /**
14
15
  * Minimal valid YAML structure shown in validation errors so users can fix their file.
15
- * Keep this in sync with tradingRecipeConfigSchema (name + non-empty strategies with wallet).
16
+ * Keep this in sync with tradingRecipeConfigSchema (name + strategy with wallet).
16
17
  */
17
- export const MINIMAL_RECIPE_YAML_SAMPLE = `# Required: name and at least one strategy with a wallet
18
+ export const MINIMAL_RECIPE_YAML_SAMPLE = `# Required: name and a strategy with a wallet
18
19
  name: my-recipe
19
- strategies:
20
- my-first-strategy:
21
- wallet: "your-wallet-address"
22
- # optional: budget, slots, enabled, etc.
20
+ # version: 1 # optional; defaults to current (1). Supports integer or semver string.
21
+ strategy:
22
+ wallet: "your-wallet-address"
23
+ # optional: budget, slots, enabled, etc.
23
24
 
24
25
  # Optional: scanners, actions, exit. Run: openclaw senpi guide examples
25
26
  `;
@@ -30,9 +31,9 @@ const HINTS = [
30
31
  hint: "Each context entry must match one supported shape. Supported built-in types are signal, context, strategy, and asset-trend. Scanner-derived entries use scanner: '...' and must reference a scanner name from your scanners block; strategy and asset-trend entries use value: '...'.",
31
32
  },
32
33
  {
33
- pathMatch: /^strategies\.\w+\.wallet$|\.strategies\.\w+\.wallet$/,
34
+ pathMatch: /^strategy\.wallet$|\.strategy\.wallet$/,
34
35
  messageMatch: /Expected string|Required|min/,
35
- hint: "Each strategy must have wallet as a string (e.g. wallet: \"0x...\" or wallet: \"your-address\").",
36
+ hint: "strategy must have wallet as a string (e.g. wallet: \"0x...\" or wallet: \"your-address\").",
36
37
  },
37
38
  {
38
39
  pathMatch: /\.scanners(\.\d+)?(\.|$)/,
@@ -98,7 +99,7 @@ function formatZodError(message, issues) {
98
99
  const msg = clarifyMessage(i);
99
100
  return ` • ${pathLabel}: ${msg}`;
100
101
  });
101
- const pathTip = "Tip: Paths use dot notation; a number is the 0-based index (e.g. strategies.alpha = strategy id 'alpha', actions.0 = first action).";
102
+ const pathTip = "Tip: Paths use dot notation; a number is the 0-based index (e.g. strategy.wallet = wallet address, actions.0 = first action).";
102
103
  return `${message}\n${lines.join("\n")}\n\n${pathTip}\n\nExample of required structure:\n${MINIMAL_RECIPE_YAML_SAMPLE}`;
103
104
  }
104
105
  /**
@@ -125,13 +126,24 @@ export async function loadTradingRecipe(pathOrContent, options) {
125
126
  throw new Error(`Invalid YAML syntax. Please check indentation, colons, and quotes.\nDetails: ${detail}\n\nExample of valid structure:\n${MINIMAL_RECIPE_YAML_SAMPLE}`);
126
127
  }
127
128
  if (raw === null || raw === undefined || typeof raw !== "object") {
128
- throw new Error("The YAML file must define an object (e.g. name and strategies at the top level).\n\nExample of required structure:\n" +
129
+ throw new Error("The YAML file must define an object (e.g. name and strategy at the top level).\n\nExample of required structure:\n" +
129
130
  MINIMAL_RECIPE_YAML_SAMPLE);
130
131
  }
131
132
  const resolved = resolveEnvInObject(raw);
133
+ if ("strategies" in resolved) {
134
+ throw new Error("'strategies' (plural) is no longer supported. Use 'strategy' (singular) with a single wallet.\n" +
135
+ "See: openclaw senpi guide schema\n\n" +
136
+ "Example of required structure:\n" +
137
+ MINIMAL_RECIPE_YAML_SAMPLE);
138
+ }
132
139
  const result = tradingRecipeConfigSchema.safeParse(resolved);
133
140
  if (result.success) {
134
141
  const cfg = result.data;
142
+ const major = extractMajorVersion(cfg.version);
143
+ if (!SUPPORTED_RECIPE_VERSIONS.includes(major)) {
144
+ throw new Error(`Unsupported version: ${cfg.version ?? "(none)"} (major: ${major}). Supported major versions: ${SUPPORTED_RECIPE_VERSIONS.join(", ")}.\n` +
145
+ `Omit version to use the current default (${CURRENT_RECIPE_VERSION}).`);
146
+ }
135
147
  const exit = cfg.exit;
136
148
  if (exit && typeof exit === "object") {
137
149
  const dslPreset = exit.dsl_preset;
@@ -1 +1 @@
1
- {"version":3,"file":"load-trading-recipe.js","sourceRoot":"","sources":["../../src/runtime/load-trading-recipe.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"load-trading-recipe.js","sourceRoot":"","sources":["../../src/runtime/load-trading-recipe.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,14 @@
1
1
  /**
2
- * Map skills.strategies to StrategyRegistration[] with scannerOverrides (interval, config).
3
- * One registration per strategy; id = wallet, name = strategy key.
2
+ * Resolve recipe `strategy` to a single StrategyRegistration for the scanner module.
4
3
  */
5
4
  import type { StrategyRegistration } from "../scanners/types.js";
6
5
  import type { TradingRecipeConfig } from "./trading-recipe-schema.js";
7
6
  /**
8
- * Convert skills.strategies to StrategyRegistration[] for the scanner runtime module.
9
- * One entry per strategy; id is resolved wallet, name is strategy key (e.g. aggressive-momentum).
7
+ * Resolve config.strategy to a single StrategyRegistration for the scanner runtime module.
8
+ * id is resolved wallet; name is the recipe name (config.name).
9
+ * Throws if wallet is missing.
10
10
  */
11
+ export declare function resolveStrategyRegistration(config: TradingRecipeConfig): StrategyRegistration;
12
+ /** @deprecated Use resolveStrategyRegistration instead. */
11
13
  export declare function mapStrategiesToScannerRegistration(config: TradingRecipeConfig): StrategyRegistration[];
12
14
  //# sourceMappingURL=map-strategies-registration.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"map-strategies-registration.d.ts","sourceRoot":"","sources":["../../src/runtime/map-strategies-registration.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAyBtE;;;GAGG;AACH,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,mBAAmB,GAAG,oBAAoB,EAAE,CAiBtG"}
1
+ {"version":3,"file":"map-strategies-registration.d.ts","sourceRoot":"","sources":["../../src/runtime/map-strategies-registration.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAyBtE;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,mBAAmB,GAAG,oBAAoB,CAM7F;AAED,2DAA2D;AAC3D,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,mBAAmB,GAAG,oBAAoB,EAAE,CAEtG"}
@@ -1,6 +1,5 @@
1
1
  /**
2
- * Map skills.strategies to StrategyRegistration[] with scannerOverrides (interval, config).
3
- * One registration per strategy; id = wallet, name = strategy key.
2
+ * Resolve recipe `strategy` to a single StrategyRegistration for the scanner module.
4
3
  */
5
4
  import { parseInterval } from "./parse-interval.js";
6
5
  function buildScannerOverrides(config) {
@@ -26,27 +25,20 @@ function buildScannerOverrides(config) {
26
25
  return Object.keys(overrides).length > 0 ? overrides : undefined;
27
26
  }
28
27
  /**
29
- * Convert skills.strategies to StrategyRegistration[] for the scanner runtime module.
30
- * One entry per strategy; id is resolved wallet, name is strategy key (e.g. aggressive-momentum).
28
+ * Resolve config.strategy to a single StrategyRegistration for the scanner runtime module.
29
+ * id is resolved wallet; name is the recipe name (config.name).
30
+ * Throws if wallet is missing.
31
31
  */
32
- export function mapStrategiesToScannerRegistration(config) {
33
- const strategies = config.strategies;
34
- const registrations = [];
35
- if (!strategies || typeof strategies !== "object")
36
- return registrations;
32
+ export function resolveStrategyRegistration(config) {
33
+ const entry = config.strategy;
34
+ const id = typeof entry.wallet === "string" ? entry.wallet.trim() : "";
35
+ if (!id)
36
+ throw new Error("strategy.wallet is required");
37
37
  const scannerOverrides = buildScannerOverrides(config);
38
- for (const [strategyName, entry] of Object.entries(strategies)) {
39
- if (!entry || typeof entry !== "object")
40
- continue;
41
- const id = typeof entry.wallet === "string" ? entry.wallet.trim() : "";
42
- if (!id)
43
- continue;
44
- registrations.push({
45
- id,
46
- name: strategyName,
47
- scannerOverrides,
48
- });
49
- }
50
- return registrations;
38
+ return { id, name: config.name, scannerOverrides };
39
+ }
40
+ /** @deprecated Use resolveStrategyRegistration instead. */
41
+ export function mapStrategiesToScannerRegistration(config) {
42
+ return [resolveStrategyRegistration(config)];
51
43
  }
52
44
  //# sourceMappingURL=map-strategies-registration.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"map-strategies-registration.js","sourceRoot":"","sources":["../../src/runtime/map-strategies-registration.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,SAAS,qBAAqB,CAAC,MAA2B;IACxD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;IACvC,MAAM,SAAS,GAAmE,EAAE,CAAC;IACrF,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAmD,EAAE,CAAC;QACjE,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;YAChB,IAAI,CAAC;gBACH,KAAK,CAAC,eAAe,GAAG,aAAa,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;YACrD,CAAC;YAAC,MAAM,CAAC;gBACP,6BAA6B;YAC/B,CAAC;QACH,CAAC;QACD,IAAI,EAAE,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC5B,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;QAC3B,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kCAAkC,CAAC,MAA2B;IAC5E,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IACrC,MAAM,aAAa,GAA2B,EAAE,CAAC;IACjD,IAAI,CAAC,UAAU,IAAI,OAAO,UAAU,KAAK,QAAQ;QAAE,OAAO,aAAa,CAAC;IAExE,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACvD,KAAK,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/D,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAClD,MAAM,EAAE,GAAG,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,IAAI,CAAC,EAAE;YAAE,SAAS;QAClB,aAAa,CAAC,IAAI,CAAC;YACjB,EAAE;YACF,IAAI,EAAE,YAAY;YAClB,gBAAgB;SACjB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC"}
1
+ {"version":3,"file":"map-strategies-registration.js","sourceRoot":"","sources":["../../src/runtime/map-strategies-registration.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,SAAS,qBAAqB,CAAC,MAA2B;IACxD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;IACvC,MAAM,SAAS,GAAmE,EAAE,CAAC;IACrF,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,KAAK,GAAmD,EAAE,CAAC;QACjE,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;YAChB,IAAI,CAAC;gBACH,KAAK,CAAC,eAAe,GAAG,aAAa,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;YACrD,CAAC;YAAC,MAAM,CAAC;gBACP,6BAA6B;YAC/B,CAAC;QACH,CAAC;QACD,IAAI,EAAE,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC5B,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;QAC3B,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACnE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CAAC,MAA2B;IACrE,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC;IAC9B,MAAM,EAAE,GAAG,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,IAAI,CAAC,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACxD,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACvD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,gBAAgB,EAAE,CAAC;AACrD,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,kCAAkC,CAAC,MAA2B;IAC5E,OAAO,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAC,CAAC;AAC/C,CAAC"}
@@ -1,12 +1,14 @@
1
1
  /**
2
- * Map skills strategies (keyed record) to Map<address, StrategyConfig>.
2
+ * Resolve recipe `strategy` to a single StrategyConfig.
3
3
  * Address = wallet (env-resolved). Coerces budget and numeric fields from strings.
4
4
  */
5
5
  import type { StrategyConfig } from "../types/strategy.js";
6
6
  import type { TradingRecipeConfig } from "./trading-recipe-schema.js";
7
7
  /**
8
- * Convert skills.strategies to a Map of address (wallet) → StrategyConfig.
9
- * One entry per strategy; key is resolved wallet so runtime/state stay per-wallet.
8
+ * Resolve config.strategy to a single StrategyConfig.
9
+ * Throws if wallet is missing (schema already enforces this, but guards against runtime misuse).
10
10
  */
11
- export declare function mapStrategiesToConfig(config: TradingRecipeConfig): Map<string, StrategyConfig>;
11
+ export declare function resolveStrategyConfig(recipeConfig: TradingRecipeConfig): StrategyConfig;
12
+ /** @deprecated Use resolveStrategyConfig instead. */
13
+ export declare function mapStrategiesToConfig(recipeConfig: TradingRecipeConfig): Map<string, StrategyConfig>;
12
14
  //# sourceMappingURL=map-strategies.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"map-strategies.d.ts","sourceRoot":"","sources":["../../src/runtime/map-strategies.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,sBAAsB,CAAC;AACxE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAatE;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,mBAAmB,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CA0C9F"}
1
+ {"version":3,"file":"map-strategies.d.ts","sourceRoot":"","sources":["../../src/runtime/map-strategies.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAe,MAAM,sBAAsB,CAAC;AACxE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAatE;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,mBAAmB,GAAG,cAAc,CAsCvF;AAED,qDAAqD;AACrD,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,mBAAmB,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAGpG"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Map skills strategies (keyed record) to Map<address, StrategyConfig>.
2
+ * Resolve recipe `strategy` to a single StrategyConfig.
3
3
  * Address = wallet (env-resolved). Coerces budget and numeric fields from strings.
4
4
  */
5
5
  const VALID_TRADING_RISKS = ['conservative', 'moderate', 'aggressive'];
@@ -14,53 +14,51 @@ function coerceNumber(v) {
14
14
  return 0;
15
15
  }
16
16
  /**
17
- * Convert skills.strategies to a Map of address (wallet) → StrategyConfig.
18
- * One entry per strategy; key is resolved wallet so runtime/state stay per-wallet.
17
+ * Resolve config.strategy to a single StrategyConfig.
18
+ * Throws if wallet is missing (schema already enforces this, but guards against runtime misuse).
19
19
  */
20
- export function mapStrategiesToConfig(config) {
21
- const map = new Map();
22
- const strategies = config.strategies;
23
- if (!strategies || typeof strategies !== "object")
24
- return map;
25
- for (const [_name, entry] of Object.entries(strategies)) {
26
- if (!entry || typeof entry !== "object")
27
- continue;
28
- const address = typeof entry.wallet === "string" ? entry.wallet.trim() : "";
29
- if (!address)
30
- continue;
31
- const rawRisk = typeof entry.trading_risk === "string" ? entry.trading_risk : "";
32
- const tradingRisk = VALID_TRADING_RISKS.includes(rawRisk)
33
- ? rawRisk
34
- : 'moderate';
35
- const config = {
36
- address,
37
- budget: coerceNumber(entry.budget),
38
- slots: coerceNumber(entry.slots) || 1,
39
- tradingRisk,
40
- };
41
- if (typeof entry.margin_per_slot === "number" || (typeof entry.margin_per_slot === "string" && entry.margin_per_slot !== "")) {
42
- config.marginPerSlot = coerceNumber(entry.margin_per_slot);
43
- }
44
- if (typeof entry.default_leverage === "number") {
45
- config.defaultLeverage = entry.default_leverage;
46
- }
47
- if (entry.leverage_multipliers != null && typeof entry.leverage_multipliers === "object") {
48
- const lm = entry.leverage_multipliers;
49
- const multipliers = {};
50
- for (const key of VALID_TRADING_RISKS) {
51
- if (typeof lm[key] === "number") {
52
- multipliers[key] = lm[key];
53
- }
54
- }
55
- if (Object.keys(multipliers).length > 0) {
56
- config.leverageMultipliers = multipliers;
20
+ export function resolveStrategyConfig(recipeConfig) {
21
+ const entry = recipeConfig.strategy;
22
+ const address = typeof entry.wallet === "string" ? entry.wallet.trim() : "";
23
+ if (!address) {
24
+ throw new Error("strategy.wallet is required");
25
+ }
26
+ const rawRisk = typeof entry.trading_risk === "string" ? entry.trading_risk : "";
27
+ const tradingRisk = VALID_TRADING_RISKS.includes(rawRisk)
28
+ ? rawRisk
29
+ : 'moderate';
30
+ const strategyConfig = {
31
+ address,
32
+ budget: coerceNumber(entry.budget),
33
+ slots: coerceNumber(entry.slots) || 1,
34
+ tradingRisk,
35
+ };
36
+ if (typeof entry.margin_per_slot === "number" || (typeof entry.margin_per_slot === "string" && entry.margin_per_slot !== "")) {
37
+ strategyConfig.marginPerSlot = coerceNumber(entry.margin_per_slot);
38
+ }
39
+ if (typeof entry.default_leverage === "number") {
40
+ strategyConfig.defaultLeverage = entry.default_leverage;
41
+ }
42
+ if (entry.leverage_multipliers != null && typeof entry.leverage_multipliers === "object") {
43
+ const lm = entry.leverage_multipliers;
44
+ const multipliers = {};
45
+ for (const key of VALID_TRADING_RISKS) {
46
+ if (typeof lm[key] === "number") {
47
+ multipliers[key] = lm[key];
57
48
  }
58
49
  }
59
- if (typeof entry.enabled === "boolean") {
60
- config.enabled = entry.enabled;
50
+ if (Object.keys(multipliers).length > 0) {
51
+ strategyConfig.leverageMultipliers = multipliers;
61
52
  }
62
- map.set(address, config);
63
53
  }
64
- return map;
54
+ if (typeof entry.enabled === "boolean") {
55
+ strategyConfig.enabled = entry.enabled;
56
+ }
57
+ return strategyConfig;
58
+ }
59
+ /** @deprecated Use resolveStrategyConfig instead. */
60
+ export function mapStrategiesToConfig(recipeConfig) {
61
+ const config = resolveStrategyConfig(recipeConfig);
62
+ return new Map([[config.address, config]]);
65
63
  }
66
64
  //# sourceMappingURL=map-strategies.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"map-strategies.js","sourceRoot":"","sources":["../../src/runtime/map-strategies.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"map-strategies.js","sourceRoot":"","sources":["../../src/runtime/map-strategies.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,mBAAmB,GAAkB,CAAC,cAAc,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC;AAEtF,SAAS,YAAY,CAAC,CAAU;IAC9B,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1D,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,YAAiC;IACrE,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,CAAC;IACpC,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5E,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACjD,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,KAAK,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IACjF,MAAM,WAAW,GAAgB,mBAAmB,CAAC,QAAQ,CAAC,OAAsB,CAAC;QACnF,CAAC,CAAE,OAAuB;QAC1B,CAAC,CAAC,UAAU,CAAC;IACf,MAAM,cAAc,GAAmB;QACrC,OAAO;QACP,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC;QAClC,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC;QACrC,WAAW;KACZ,CAAC;IACF,IAAI,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ,IAAI,CAAC,OAAO,KAAK,CAAC,eAAe,KAAK,QAAQ,IAAI,KAAK,CAAC,eAAe,KAAK,EAAE,CAAC,EAAE,CAAC;QAC7H,cAAc,CAAC,aAAa,GAAG,YAAY,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACrE,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,gBAAgB,KAAK,QAAQ,EAAE,CAAC;QAC/C,cAAc,CAAC,eAAe,GAAG,KAAK,CAAC,gBAAgB,CAAC;IAC1D,CAAC;IACD,IAAI,KAAK,CAAC,oBAAoB,IAAI,IAAI,IAAI,OAAO,KAAK,CAAC,oBAAoB,KAAK,QAAQ,EAAE,CAAC;QACzF,MAAM,EAAE,GAAG,KAAK,CAAC,oBAA+C,CAAC;QACjE,MAAM,WAAW,GAAyC,EAAE,CAAC;QAC7D,KAAK,MAAM,GAAG,IAAI,mBAAmB,EAAE,CAAC;YACtC,IAAI,OAAO,EAAE,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE,CAAC;gBAChC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAW,CAAC;YACvC,CAAC;QACH,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxC,cAAc,CAAC,mBAAmB,GAAG,WAAW,CAAC;QACnD,CAAC;IACH,CAAC;IACD,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACvC,cAAc,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IACzC,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,qDAAqD;AACrD,MAAM,UAAU,qBAAqB,CAAC,YAAiC;IACrE,MAAM,MAAM,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;IACnD,OAAO,IAAI,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * YAML recipe version constants.
3
+ * The `version` field in a trading recipe YAML controls which structural shape is accepted.
4
+ * Increment CURRENT_RECIPE_VERSION when a breaking structural change is introduced
5
+ * and add the new version to SUPPORTED_RECIPE_VERSIONS.
6
+ */
7
+ export declare const CURRENT_RECIPE_VERSION = 1;
8
+ export declare const SUPPORTED_RECIPE_VERSIONS: readonly number[];
9
+ /**
10
+ * Extract the major (structural) version from the YAML `version` field.
11
+ * Accepts an integer (e.g. `1`), a semver-like string (e.g. `"1.6.0"` → `1`),
12
+ * or undefined/null (defaults to CURRENT_RECIPE_VERSION).
13
+ */
14
+ export declare function extractMajorVersion(version: string | number | undefined | null): number;
15
+ //# sourceMappingURL=recipe-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipe-version.d.ts","sourceRoot":"","sources":["../../src/runtime/recipe-version.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,sBAAsB,IAAI,CAAC;AACxC,eAAO,MAAM,yBAAyB,EAAE,SAAS,MAAM,EAAQ,CAAC;AAEhE;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,GAAG,MAAM,CAUvF"}